| /* |
| * Control interface for shared AP commands |
| * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * Alternatively, this software may be distributed under the terms of BSD |
| * license. |
| * |
| * See README and COPYING for more details. |
| */ |
| |
| #include "utils/includes.h" |
| |
| #include "utils/common.h" |
| #include "hostapd.h" |
| #include "ieee802_1x.h" |
| #include "wpa_auth.h" |
| #include "ieee802_11.h" |
| #include "sta_info.h" |
| #include "wps_hostapd.h" |
| #include "p2p_hostapd.h" |
| #include "ctrl_iface_ap.h" |
| |
| |
| static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd, |
| struct sta_info *sta, |
| char *buf, size_t buflen) |
| { |
| int len, res, ret; |
| |
| if (sta == NULL) { |
| ret = os_snprintf(buf, buflen, "FAIL\n"); |
| if (ret < 0 || (size_t) ret >= buflen) |
| return 0; |
| return ret; |
| } |
| |
| len = 0; |
| ret = os_snprintf(buf + len, buflen - len, MACSTR "\n", |
| MAC2STR(sta->addr)); |
| if (ret < 0 || (size_t) ret >= buflen - len) |
| return len; |
| len += ret; |
| |
| res = ieee802_11_get_mib_sta(hapd, sta, buf + len, buflen - len); |
| if (res >= 0) |
| len += res; |
| res = wpa_get_mib_sta(sta->wpa_sm, buf + len, buflen - len); |
| if (res >= 0) |
| len += res; |
| res = ieee802_1x_get_mib_sta(hapd, sta, buf + len, buflen - len); |
| if (res >= 0) |
| len += res; |
| res = hostapd_wps_get_mib_sta(hapd, sta->addr, buf + len, |
| buflen - len); |
| if (res >= 0) |
| len += res; |
| res = hostapd_p2p_get_mib_sta(hapd, sta, buf + len, buflen - len); |
| if (res >= 0) |
| len += res; |
| |
| return len; |
| } |
| |
| |
| int hostapd_ctrl_iface_sta_first(struct hostapd_data *hapd, |
| char *buf, size_t buflen) |
| { |
| return hostapd_ctrl_iface_sta_mib(hapd, hapd->sta_list, buf, buflen); |
| } |
| |
| |
| int hostapd_ctrl_iface_sta(struct hostapd_data *hapd, const char *txtaddr, |
| char *buf, size_t buflen) |
| { |
| u8 addr[ETH_ALEN]; |
| int ret; |
| |
| if (hwaddr_aton(txtaddr, addr)) { |
| ret = os_snprintf(buf, buflen, "FAIL\n"); |
| if (ret < 0 || (size_t) ret >= buflen) |
| return 0; |
| return ret; |
| } |
| return hostapd_ctrl_iface_sta_mib(hapd, ap_get_sta(hapd, addr), |
| buf, buflen); |
| } |
| |
| |
| int hostapd_ctrl_iface_sta_next(struct hostapd_data *hapd, const char *txtaddr, |
| char *buf, size_t buflen) |
| { |
| u8 addr[ETH_ALEN]; |
| struct sta_info *sta; |
| int ret; |
| |
| if (hwaddr_aton(txtaddr, addr) || |
| (sta = ap_get_sta(hapd, addr)) == NULL) { |
| ret = os_snprintf(buf, buflen, "FAIL\n"); |
| if (ret < 0 || (size_t) ret >= buflen) |
| return 0; |
| return ret; |
| } |
| return hostapd_ctrl_iface_sta_mib(hapd, sta->next, buf, buflen); |
| } |