Add deauthenticate/disassociate ctrl_iface commands
authorJouni Malinen <jouni.malinen@atheros.com>
Mon, 29 Mar 2010 18:14:57 +0000 (11:14 -0700)
committerJouni Malinen <j@w1.fi>
Mon, 29 Mar 2010 18:14:57 +0000 (11:14 -0700)
hostapd/ctrl_iface.c
hostapd/hostapd_cli.c

index 4001bb5..fe32282 100644 (file)
@@ -155,6 +155,48 @@ static int hostapd_ctrl_iface_new_sta(struct hostapd_data *hapd,
 }
 
 
+static int hostapd_ctrl_iface_deauthenticate(struct hostapd_data *hapd,
+                                            const char *txtaddr)
+{
+       u8 addr[ETH_ALEN];
+       struct sta_info *sta;
+
+       wpa_printf(MSG_DEBUG, "CTRL_IFACE DEAUTHENTICATE %s", txtaddr);
+
+       if (hwaddr_aton(txtaddr, addr))
+               return -1;
+
+       hapd->drv.sta_deauth(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
+       sta = ap_get_sta(hapd, addr);
+       if (sta)
+               ap_sta_deauthenticate(hapd, sta,
+                                     WLAN_REASON_PREV_AUTH_NOT_VALID);
+
+       return 0;
+}
+
+
+static int hostapd_ctrl_iface_disassociate(struct hostapd_data *hapd,
+                                          const char *txtaddr)
+{
+       u8 addr[ETH_ALEN];
+       struct sta_info *sta;
+
+       wpa_printf(MSG_DEBUG, "CTRL_IFACE DISASSOCIATE %s", txtaddr);
+
+       if (hwaddr_aton(txtaddr, addr))
+               return -1;
+
+       hapd->drv.sta_disassoc(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
+       sta = ap_get_sta(hapd, addr);
+       if (sta)
+               ap_sta_disassociate(hapd, sta,
+                                   WLAN_REASON_PREV_AUTH_NOT_VALID);
+
+       return 0;
+}
+
+
 #ifdef CONFIG_IEEE80211W
 #ifdef NEED_AP_MLME
 static int hostapd_ctrl_iface_sa_query(struct hostapd_data *hapd,
@@ -309,6 +351,12 @@ static void hostapd_ctrl_iface_receive(int sock, void *eloop_ctx,
        } else if (os_strncmp(buf, "NEW_STA ", 8) == 0) {
                if (hostapd_ctrl_iface_new_sta(hapd, buf + 8))
                        reply_len = -1;
+       } else if (os_strncmp(buf, "DEAUTHENTICATE ", 15) == 0) {
+               if (hostapd_ctrl_iface_deauthenticate(hapd, buf + 15))
+                       reply_len = -1;
+       } else if (os_strncmp(buf, "DISASSOCIATE ", 13) == 0) {
+               if (hostapd_ctrl_iface_disassociate(hapd, buf + 13))
+                       reply_len = -1;
 #ifdef CONFIG_IEEE80211W
 #ifdef NEED_AP_MLME
        } else if (os_strncmp(buf, "SA_QUERY ", 9) == 0) {
index 2cfaf58..4548924 100644 (file)
@@ -242,6 +242,34 @@ static int hostapd_cli_cmd_new_sta(struct wpa_ctrl *ctrl, int argc,
 }
 
 
+static int hostapd_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
+                                         char *argv[])
+{
+       char buf[64];
+       if (argc != 1) {
+               printf("Invalid 'deauthenticate' command - exactly one "
+                      "argument, STA address, is required.\n");
+               return -1;
+       }
+       snprintf(buf, sizeof(buf), "DEAUTHENTICATE %s", argv[0]);
+       return wpa_ctrl_command(ctrl, buf);
+}
+
+
+static int hostapd_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
+                                       char *argv[])
+{
+       char buf[64];
+       if (argc != 1) {
+               printf("Invalid 'disassociate' command - exactly one "
+                      "argument, STA address, is required.\n");
+               return -1;
+       }
+       snprintf(buf, sizeof(buf), "DISASSOCIATE %s", argv[0]);
+       return wpa_ctrl_command(ctrl, buf);
+}
+
+
 #ifdef CONFIG_IEEE80211W
 static int hostapd_cli_cmd_sa_query(struct wpa_ctrl *ctrl, int argc,
                                    char *argv[])
@@ -467,6 +495,8 @@ static struct hostapd_cli_cmd hostapd_cli_commands[] = {
        { "sta", hostapd_cli_cmd_sta },
        { "all_sta", hostapd_cli_cmd_all_sta },
        { "new_sta", hostapd_cli_cmd_new_sta },
+       { "deauthenticate", hostapd_cli_cmd_deauthenticate },
+       { "disassociate", hostapd_cli_cmd_disassociate },
 #ifdef CONFIG_IEEE80211W
        { "sa_query", hostapd_cli_cmd_sa_query },
 #endif /* CONFIG_IEEE80211W */