wpa_supplicant AP mode: Add function for enabling MAC address filtering
authorJouni Malinen <jouni.malinen@atheros.com>
Sun, 11 Apr 2010 17:08:00 +0000 (20:08 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 11 Apr 2010 17:08:00 +0000 (20:08 +0300)
This can be used to allow only a specific station to associate.

wpa_supplicant/ap.c
wpa_supplicant/ap.h

index 7621512..5d79503 100644 (file)
@@ -414,3 +414,44 @@ int ap_ctrl_iface_wpa_get_status(struct wpa_supplicant *wpa_s, char *buf,
 }
 
 #endif /* CONFIG_CTRL_IFACE */
+
+
+int wpa_supplicant_ap_mac_addr_filter(struct wpa_supplicant *wpa_s,
+                                     const u8 *addr)
+{
+       struct hostapd_data *hapd;
+       struct hostapd_bss_config *conf;
+
+       if (!wpa_s->ap_iface)
+               return -1;
+
+       if (addr)
+               wpa_printf(MSG_DEBUG, "AP: Set MAC address filter: " MACSTR,
+                          MAC2STR(addr));
+       else
+               wpa_printf(MSG_DEBUG, "AP: Clear MAC address filter");
+
+       hapd = wpa_s->ap_iface->bss[0];
+       conf = hapd->conf;
+
+       os_free(conf->accept_mac);
+       conf->accept_mac = NULL;
+       conf->num_accept_mac = 0;
+       os_free(conf->deny_mac);
+       conf->deny_mac = NULL;
+       conf->num_deny_mac = 0;
+
+       if (addr == NULL) {
+               conf->macaddr_acl = ACCEPT_UNLESS_DENIED;
+               return 0;
+       }
+
+       conf->macaddr_acl = DENY_UNLESS_ACCEPTED;
+       conf->accept_mac = os_zalloc(sizeof(struct mac_acl_entry));
+       if (conf->accept_mac == NULL)
+               return -1;
+       os_memcpy(conf->accept_mac[0].addr, addr, ETH_ALEN);
+       conf->num_accept_mac = 1;
+
+       return 0;
+}
index f398db7..381a432 100644 (file)
@@ -37,5 +37,7 @@ void ap_tx_status(void *ctx, const u8 *addr,
 void ap_rx_from_unknown_sta(void *ctx, const u8 *frame, size_t len);
 void ap_mgmt_rx(void *ctx, struct rx_mgmt *rx_mgmt);
 void ap_mgmt_tx_cb(void *ctx, const u8 *buf, size_t len, u16 stype, int ok);
+int wpa_supplicant_ap_mac_addr_filter(struct wpa_supplicant *wpa_s,
+                                     const u8 *addr);
 
 #endif /* AP_H */