|
@@ -0,0 +1,103 @@
|
|
|
|
+/*
|
|
|
|
+ * 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 "includes.h"
|
|
|
|
+
|
|
|
|
+#include "hostapd.h"
|
|
|
|
+#include "ieee802_1x.h"
|
|
|
|
+#include "wpa.h"
|
|
|
|
+#include "ieee802_11.h"
|
|
|
|
+#include "sta_info.h"
|
|
|
|
+#include "wps_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;
|
|
|
|
+
|
|
|
|
+ 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);
|
|
|
|
+}
|