hostapd: Add ctrl_iface STATUS command
authorJouni Malinen <j@w1.fi>
Sun, 3 Nov 2013 16:13:14 +0000 (18:13 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 3 Nov 2013 17:51:06 +0000 (19:51 +0200)
This can be used to fetch runtime information about hostapd interfaces.

Signed-hostap: Jouni Malinen <j@w1.fi>

hostapd/ctrl_iface.c
hostapd/hostapd_cli.c
src/ap/ctrl_iface_ap.c
src/ap/ctrl_iface_ap.h
src/ap/hostapd.c
src/ap/hostapd.h

index 3bc7379..cea96eb 100644 (file)
@@ -1151,6 +1151,9 @@ static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
        } else if (os_strncmp(buf, "RELOG", 5) == 0) {
                if (wpa_debug_reopen_file() < 0)
                        reply_len = -1;
+       } else if (os_strcmp(buf, "STATUS") == 0) {
+               reply_len = hostapd_ctrl_iface_status(hapd, reply,
+                                                     reply_size);
        } else if (os_strcmp(buf, "MIB") == 0) {
                reply_len = ieee802_11_get_mib(hapd, reply, reply_size);
                if (reply_len >= 0) {
index 932ae0e..466ec0d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * hostapd - command line interface for hostapd daemon
- * Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -211,6 +211,12 @@ static int hostapd_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
 }
 
 
+static int hostapd_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
+{
+       return wpa_ctrl_command(ctrl, "STATUS");
+}
+
+
 static int hostapd_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
 {
        return wpa_ctrl_command(ctrl, "MIB");
@@ -844,6 +850,7 @@ static struct hostapd_cli_cmd hostapd_cli_commands[] = {
        { "ping", hostapd_cli_cmd_ping },
        { "mib", hostapd_cli_cmd_mib },
        { "relog", hostapd_cli_cmd_relog },
+       { "status", hostapd_cli_cmd_status },
        { "sta", hostapd_cli_cmd_sta },
        { "all_sta", hostapd_cli_cmd_all_sta },
        { "new_sta", hostapd_cli_cmd_new_sta },
index 1cb7e73..5d99566 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Control interface for shared AP commands
- * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -303,3 +303,80 @@ int hostapd_ctrl_iface_disassociate(struct hostapd_data *hapd,
 
        return 0;
 }
+
+
+int hostapd_ctrl_iface_status(struct hostapd_data *hapd, char *buf,
+                             size_t buflen)
+{
+       struct hostapd_iface *iface = hapd->iface;
+       int len = 0, ret;
+       size_t i;
+
+       ret = os_snprintf(buf + len, buflen - len,
+                         "state=%s\n"
+                         "phy=%s\n"
+                         "freq=%d\n"
+                         "num_sta_non_erp=%d\n"
+                         "num_sta_no_short_slot_time=%d\n"
+                         "num_sta_no_short_preamble=%d\n"
+                         "olbc=%d\n"
+                         "num_sta_ht_no_gf=%d\n"
+                         "num_sta_no_ht=%d\n"
+                         "num_sta_ht_20_mhz=%d\n"
+                         "olbc_ht=%d\n"
+                         "ht_op_mode=0x%x\n",
+                         hostapd_state_text(iface->state),
+                         iface->phy,
+                         iface->freq,
+                         iface->num_sta_non_erp,
+                         iface->num_sta_no_short_slot_time,
+                         iface->num_sta_no_short_preamble,
+                         iface->olbc,
+                         iface->num_sta_ht_no_gf,
+                         iface->num_sta_no_ht,
+                         iface->num_sta_ht_20mhz,
+                         iface->olbc_ht,
+                         iface->ht_op_mode);
+       if (ret < 0 || (size_t) ret >= buflen - len)
+               return len;
+       len += ret;
+
+       ret = os_snprintf(buf + len, buflen - len,
+                         "channel=%u\n"
+                         "secondary_channel=%d\n"
+                         "ieee80211n=%d\n"
+                         "ieee80211ac=%d\n"
+                         "vht_oper_chwidth=%d\n"
+                         "vht_oper_centr_freq_seg0_idx=%d\n"
+                         "vht_oper_centr_freq_seg1_idx=%d\n",
+                         iface->conf->channel,
+                         iface->conf->secondary_channel,
+                         iface->conf->ieee80211n,
+                         iface->conf->ieee80211ac,
+                         iface->conf->vht_oper_chwidth,
+                         iface->conf->vht_oper_centr_freq_seg0_idx,
+                         iface->conf->vht_oper_centr_freq_seg1_idx);
+       if (ret < 0 || (size_t) ret >= buflen - len)
+               return len;
+       len += ret;
+
+       for (i = 0; i < iface->num_bss; i++) {
+               struct hostapd_data *bss = iface->bss[i];
+               ret = os_snprintf(buf + len, buflen - len,
+                                 "bss[%d]=%s\n"
+                                 "bssid[%d]=" MACSTR "\n"
+                                 "ssid[%d]=%s\n"
+                                 "num_sta[%d]=%d\n",
+                                 (int) i, bss->conf->iface,
+                                 (int) i, MAC2STR(bss->own_addr),
+                                 (int) i,
+                                 wpa_ssid_txt(bss->conf->ssid.ssid,
+                                              bss->conf->ssid.ssid_len),
+                                 (int) i, bss->num_sta);
+               if (ret < 0 || (size_t) ret >= buflen - len)
+                       return len;
+               len += ret;
+       }
+
+       return len;
+}
index e83f894..a22a2a7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Control interface for shared AP commands
- * Copyright (c) 2004-2009, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -19,5 +19,7 @@ int hostapd_ctrl_iface_deauthenticate(struct hostapd_data *hapd,
                                      const char *txtaddr);
 int hostapd_ctrl_iface_disassociate(struct hostapd_data *hapd,
                                    const char *txtaddr);
+int hostapd_ctrl_iface_status(struct hostapd_data *hapd, char *buf,
+                             size_t buflen);
 
 #endif /* CTRL_IFACE_AP_H */
index 07dd608..3483b64 100644 (file)
@@ -1899,7 +1899,7 @@ void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
 }
 
 
-static const char * hostapd_state_text(enum hostapd_iface_state s)
+const char * hostapd_state_text(enum hostapd_iface_state s)
 {
        switch (s) {
        case HAPD_IFACE_UNINITIALIZED:
index 02f45af..d5a99bd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * hostapd / Initialization and configuration
- * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi>
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -375,6 +375,7 @@ int hostapd_add_iface(struct hapd_interfaces *ifaces, char *buf);
 int hostapd_remove_iface(struct hapd_interfaces *ifaces, char *buf);
 void hostapd_channel_list_updated(struct hostapd_iface *iface);
 void hostapd_set_state(struct hostapd_iface *iface, enum hostapd_iface_state s);
+const char * hostapd_state_text(enum hostapd_iface_state s);
 
 /* utils.c */
 int hostapd_register_probereq_cb(struct hostapd_data *hapd,