mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-30 01:52:51 +00:00
604 lines
14 KiB
Diff
604 lines
14 KiB
Diff
From 171c96df407c45e94d1fe8afd44ca6cc3a191157 Mon Sep 17 00:00:00 2001
|
|
From: Nishant Pandey <nishpand@codeaurora.org>
|
|
Date: Tue, 22 Sep 2020 14:15:36 +0530
|
|
Subject: [PATCH] hostap: Move ACL configuration callback to generic
|
|
|
|
Move ACL configuration support callbacks to generic
|
|
place so that it can be utilized for mesh functionality.
|
|
No functional change as such made in this patch
|
|
|
|
Signed-off-by: Nishant Pandey <nishpand@codeaurora.org>
|
|
---
|
|
hostapd/config_file.c | 119 +-----------------------------------
|
|
hostapd/config_file.h | 5 --
|
|
hostapd/ctrl_iface.c | 111 ----------------------------------
|
|
src/ap/ctrl_iface_ap.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++++
|
|
src/ap/ctrl_iface_ap.h | 10 ++++
|
|
src/ap/ieee802_11.c | 81 +++++++++++++++++++++++++
|
|
src/ap/ieee802_11.h | 9 +++
|
|
7 files changed, 260 insertions(+), 234 deletions(-)
|
|
|
|
--- a/hostapd/config_file.c
|
|
+++ b/hostapd/config_file.c
|
|
@@ -23,6 +23,7 @@
|
|
#include "radius/radius_client.h"
|
|
#include "ap/wpa_auth.h"
|
|
#include "ap/ap_config.h"
|
|
+#include "ap/ieee802_11.h"
|
|
#include "config_file.h"
|
|
|
|
|
|
@@ -118,124 +119,6 @@ static int hostapd_config_read_vlan_file
|
|
#endif /* CONFIG_NO_VLAN */
|
|
|
|
|
|
-int hostapd_acl_comp(const void *a, const void *b)
|
|
-{
|
|
- const struct mac_acl_entry *aa = a;
|
|
- const struct mac_acl_entry *bb = b;
|
|
- return os_memcmp(aa->addr, bb->addr, sizeof(macaddr));
|
|
-}
|
|
-
|
|
-
|
|
-int hostapd_add_acl_maclist(struct mac_acl_entry **acl, int *num,
|
|
- int vlan_id, const u8 *addr)
|
|
-{
|
|
- struct mac_acl_entry *newacl;
|
|
-
|
|
- newacl = os_realloc_array(*acl, *num + 1, sizeof(**acl));
|
|
- if (!newacl) {
|
|
- wpa_printf(MSG_ERROR, "MAC list reallocation failed");
|
|
- return -1;
|
|
- }
|
|
-
|
|
- *acl = newacl;
|
|
- os_memcpy((*acl)[*num].addr, addr, ETH_ALEN);
|
|
- os_memset(&(*acl)[*num].vlan_id, 0, sizeof((*acl)[*num].vlan_id));
|
|
- (*acl)[*num].vlan_id.untagged = vlan_id;
|
|
- (*acl)[*num].vlan_id.notempty = !!vlan_id;
|
|
- (*num)++;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-
|
|
-void hostapd_remove_acl_mac(struct mac_acl_entry **acl, int *num,
|
|
- const u8 *addr)
|
|
-{
|
|
- int i = 0;
|
|
-
|
|
- while (i < *num) {
|
|
- if (os_memcmp((*acl)[i].addr, addr, ETH_ALEN) == 0) {
|
|
- os_remove_in_array(*acl, *num, sizeof(**acl), i);
|
|
- (*num)--;
|
|
- } else {
|
|
- i++;
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-
|
|
-static int hostapd_config_read_maclist(const char *fname,
|
|
- struct mac_acl_entry **acl, int *num)
|
|
-{
|
|
- FILE *f;
|
|
- char buf[128], *pos;
|
|
- int line = 0;
|
|
- u8 addr[ETH_ALEN];
|
|
- int vlan_id;
|
|
-
|
|
- f = fopen(fname, "r");
|
|
- if (!f) {
|
|
- wpa_printf(MSG_ERROR, "MAC list file '%s' not found.", fname);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- while (fgets(buf, sizeof(buf), f)) {
|
|
- int rem = 0;
|
|
-
|
|
- line++;
|
|
-
|
|
- if (buf[0] == '#')
|
|
- continue;
|
|
- pos = buf;
|
|
- while (*pos != '\0') {
|
|
- if (*pos == '\n') {
|
|
- *pos = '\0';
|
|
- break;
|
|
- }
|
|
- pos++;
|
|
- }
|
|
- if (buf[0] == '\0')
|
|
- continue;
|
|
- pos = buf;
|
|
- if (buf[0] == '-') {
|
|
- rem = 1;
|
|
- pos++;
|
|
- }
|
|
-
|
|
- if (hwaddr_aton(pos, addr)) {
|
|
- wpa_printf(MSG_ERROR, "Invalid MAC address '%s' at "
|
|
- "line %d in '%s'", pos, line, fname);
|
|
- fclose(f);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- if (rem) {
|
|
- hostapd_remove_acl_mac(acl, num, addr);
|
|
- continue;
|
|
- }
|
|
- vlan_id = 0;
|
|
- pos = buf;
|
|
- while (*pos != '\0' && *pos != ' ' && *pos != '\t')
|
|
- pos++;
|
|
- while (*pos == ' ' || *pos == '\t')
|
|
- pos++;
|
|
- if (*pos != '\0')
|
|
- vlan_id = atoi(pos);
|
|
-
|
|
- if (hostapd_add_acl_maclist(acl, num, vlan_id, addr) < 0) {
|
|
- fclose(f);
|
|
- return -1;
|
|
- }
|
|
- }
|
|
-
|
|
- fclose(f);
|
|
-
|
|
- if (*acl)
|
|
- qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
|
|
#ifdef EAP_SERVER
|
|
|
|
--- a/hostapd/config_file.h
|
|
+++ b/hostapd/config_file.h
|
|
@@ -13,10 +13,5 @@ struct hostapd_config * hostapd_config_r
|
|
int hostapd_set_iface(struct hostapd_config *conf,
|
|
struct hostapd_bss_config *bss, const char *field,
|
|
char *value);
|
|
-int hostapd_acl_comp(const void *a, const void *b);
|
|
-int hostapd_add_acl_maclist(struct mac_acl_entry **acl, int *num,
|
|
- int vlan_id, const u8 *addr);
|
|
-void hostapd_remove_acl_mac(struct mac_acl_entry **acl, int *num,
|
|
- const u8 *addr);
|
|
|
|
#endif /* CONFIG_FILE_H */
|
|
--- a/hostapd/ctrl_iface.c
|
|
+++ b/hostapd/ctrl_iface.c
|
|
@@ -1310,42 +1310,6 @@ static int hostapd_ctrl_iface_get_config
|
|
}
|
|
|
|
|
|
-static void hostapd_disassoc_accept_mac(struct hostapd_data *hapd)
|
|
-{
|
|
- struct sta_info *sta;
|
|
- struct vlan_description vlan_id;
|
|
-
|
|
- if (hapd->conf->macaddr_acl != DENY_UNLESS_ACCEPTED)
|
|
- return;
|
|
-
|
|
- for (sta = hapd->sta_list; sta; sta = sta->next) {
|
|
- if (!hostapd_maclist_found(hapd->conf->accept_mac,
|
|
- hapd->conf->num_accept_mac,
|
|
- sta->addr, &vlan_id) ||
|
|
- (vlan_id.notempty &&
|
|
- vlan_compare(&vlan_id, sta->vlan_desc)))
|
|
- ap_sta_disconnect(hapd, sta, sta->addr,
|
|
- WLAN_REASON_UNSPECIFIED);
|
|
- }
|
|
-}
|
|
-
|
|
-
|
|
-static void hostapd_disassoc_deny_mac(struct hostapd_data *hapd)
|
|
-{
|
|
- struct sta_info *sta;
|
|
- struct vlan_description vlan_id;
|
|
-
|
|
- for (sta = hapd->sta_list; sta; sta = sta->next) {
|
|
- if (hostapd_maclist_found(hapd->conf->deny_mac,
|
|
- hapd->conf->num_deny_mac, sta->addr,
|
|
- &vlan_id) &&
|
|
- (!vlan_id.notempty ||
|
|
- !vlan_compare(&vlan_id, sta->vlan_desc)))
|
|
- ap_sta_disconnect(hapd, sta, sta->addr,
|
|
- WLAN_REASON_UNSPECIFIED);
|
|
- }
|
|
-}
|
|
-
|
|
|
|
static int hostapd_ctrl_iface_set_band(struct hostapd_data *hapd,
|
|
const char *band)
|
|
@@ -3301,81 +3265,6 @@ static int hostapd_ctrl_driver_flags2(st
|
|
return pos - buf;
|
|
}
|
|
|
|
-
|
|
-static int hostapd_ctrl_iface_acl_del_mac(struct mac_acl_entry **acl, int *num,
|
|
- const char *txtaddr)
|
|
-{
|
|
- u8 addr[ETH_ALEN];
|
|
- struct vlan_description vlan_id;
|
|
-
|
|
- if (!(*num))
|
|
- return 0;
|
|
-
|
|
- if (hwaddr_aton(txtaddr, addr))
|
|
- return -1;
|
|
-
|
|
- if (hostapd_maclist_found(*acl, *num, addr, &vlan_id))
|
|
- hostapd_remove_acl_mac(acl, num, addr);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-
|
|
-static void hostapd_ctrl_iface_acl_clear_list(struct mac_acl_entry **acl,
|
|
- int *num)
|
|
-{
|
|
- while (*num)
|
|
- hostapd_remove_acl_mac(acl, num, (*acl)[0].addr);
|
|
-}
|
|
-
|
|
-
|
|
-static int hostapd_ctrl_iface_acl_show_mac(struct mac_acl_entry *acl, int num,
|
|
- char *buf, size_t buflen)
|
|
-{
|
|
- int i = 0, len = 0, ret = 0;
|
|
-
|
|
- if (!acl)
|
|
- return 0;
|
|
-
|
|
- while (i < num) {
|
|
- ret = os_snprintf(buf + len, buflen - len,
|
|
- MACSTR " VLAN_ID=%d\n",
|
|
- MAC2STR(acl[i].addr),
|
|
- acl[i].vlan_id.untagged);
|
|
- if (ret < 0 || (size_t) ret >= buflen - len)
|
|
- return len;
|
|
- i++;
|
|
- len += ret;
|
|
- }
|
|
- return len;
|
|
-}
|
|
-
|
|
-
|
|
-static int hostapd_ctrl_iface_acl_add_mac(struct mac_acl_entry **acl, int *num,
|
|
- const char *cmd)
|
|
-{
|
|
- u8 addr[ETH_ALEN];
|
|
- struct vlan_description vlan_id;
|
|
- int ret = 0, vlanid = 0;
|
|
- const char *pos;
|
|
-
|
|
- if (hwaddr_aton(cmd, addr))
|
|
- return -1;
|
|
-
|
|
- pos = os_strstr(cmd, "VLAN_ID=");
|
|
- if (pos)
|
|
- vlanid = atoi(pos + 8);
|
|
-
|
|
- if (!hostapd_maclist_found(*acl, *num, addr, &vlan_id)) {
|
|
- ret = hostapd_add_acl_maclist(acl, num, vlanid, addr);
|
|
- if (ret != -1 && *acl)
|
|
- qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp);
|
|
- }
|
|
-
|
|
- return ret < 0 ? -1 : 0;
|
|
-}
|
|
-
|
|
-
|
|
static int hostapd_ctrl_iface_get_capability(struct hostapd_data *hapd,
|
|
const char *field, char *buf,
|
|
size_t buflen)
|
|
--- a/src/ap/ctrl_iface_ap.c
|
|
+++ b/src/ap/ctrl_iface_ap.c
|
|
@@ -24,6 +24,7 @@
|
|
#include "ap_drv_ops.h"
|
|
#include "mbo_ap.h"
|
|
#include "taxonomy.h"
|
|
+#include "ap/vlan.h"
|
|
|
|
#ifdef CONFIG_CTRL_IFACE_MIB
|
|
|
|
@@ -637,6 +638,164 @@ static int p2p_manager_disconnect(struct
|
|
#endif /* CONFIG_P2P_MANAGER */
|
|
|
|
|
|
+int hostapd_add_acl_maclist(struct mac_acl_entry **acl, int *num,
|
|
+ int vlan_id, const u8 *addr)
|
|
+{
|
|
+ struct mac_acl_entry *newacl;
|
|
+
|
|
+ newacl = os_realloc_array(*acl, *num + 1, sizeof(**acl));
|
|
+ if (!newacl) {
|
|
+ wpa_printf(MSG_ERROR, "MAC list reallocation failed");
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ *acl = newacl;
|
|
+ os_memcpy((*acl)[*num].addr, addr, ETH_ALEN);
|
|
+ os_memset(&(*acl)[*num].vlan_id, 0, sizeof((*acl)[*num].vlan_id));
|
|
+ (*acl)[*num].vlan_id.untagged = vlan_id;
|
|
+ (*acl)[*num].vlan_id.notempty = !!vlan_id;
|
|
+ (*num)++;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
+void hostapd_remove_acl_mac(struct mac_acl_entry **acl, int *num,
|
|
+ const u8 *addr)
|
|
+{
|
|
+ int i = 0;
|
|
+
|
|
+ while (i < *num) {
|
|
+ if (os_memcmp((*acl)[i].addr, addr, ETH_ALEN) == 0) {
|
|
+ os_remove_in_array(*acl, *num, sizeof(**acl), i);
|
|
+ (*num)--;
|
|
+ } else {
|
|
+ i++;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+int hostapd_disassoc_accept_mac(struct hostapd_data *hapd)
|
|
+{
|
|
+ struct sta_info *sta;
|
|
+ struct vlan_description vlan_id;
|
|
+
|
|
+ if (hapd->conf->macaddr_acl != DENY_UNLESS_ACCEPTED)
|
|
+ return 0;
|
|
+
|
|
+ for (sta = hapd->sta_list; sta; sta = sta->next) {
|
|
+ if (!hostapd_maclist_found(hapd->conf->accept_mac,
|
|
+ hapd->conf->num_accept_mac,
|
|
+ sta->addr, &vlan_id) ||
|
|
+ (vlan_id.notempty &&
|
|
+ vlan_compare(&vlan_id, sta->vlan_desc))) {
|
|
+#ifdef CONFIG_MESH
|
|
+ if (hapd->iface->mconf)
|
|
+ return 1;
|
|
+#endif /* CONFIG_MESH */
|
|
+ ap_sta_disconnect(hapd, sta, sta->addr,
|
|
+ WLAN_REASON_UNSPECIFIED);
|
|
+ }
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int hostapd_disassoc_deny_mac(struct hostapd_data *hapd)
|
|
+{
|
|
+ struct sta_info *sta;
|
|
+ struct vlan_description vlan_id;
|
|
+
|
|
+ for (sta = hapd->sta_list; sta; sta = sta->next) {
|
|
+ if (hostapd_maclist_found(hapd->conf->deny_mac,
|
|
+ hapd->conf->num_deny_mac, sta->addr,
|
|
+ &vlan_id) &&
|
|
+ (!vlan_id.notempty ||
|
|
+ !vlan_compare(&vlan_id, sta->vlan_desc))) {
|
|
+#ifdef CONFIG_MESH
|
|
+ if (hapd->iface->mconf)
|
|
+ return 1;
|
|
+#endif /* CONFIG_MESH */
|
|
+ ap_sta_disconnect(hapd, sta, sta->addr,
|
|
+ WLAN_REASON_UNSPECIFIED);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int hostapd_ctrl_iface_acl_del_mac(struct mac_acl_entry **acl, int *num,
|
|
+ const char *txtaddr)
|
|
+{
|
|
+ u8 addr[ETH_ALEN];
|
|
+ struct vlan_description vlan_id;
|
|
+
|
|
+ if (!(*num))
|
|
+ return 0;
|
|
+
|
|
+ if (hwaddr_aton(txtaddr, addr))
|
|
+ return -1;
|
|
+
|
|
+ if (hostapd_maclist_found(*acl, *num, addr, &vlan_id))
|
|
+ hostapd_remove_acl_mac(acl, num, addr);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
+void hostapd_ctrl_iface_acl_clear_list(struct mac_acl_entry **acl,
|
|
+ int *num)
|
|
+{
|
|
+ while (*num)
|
|
+ hostapd_remove_acl_mac(acl, num, (*acl)[0].addr);
|
|
+}
|
|
+
|
|
+
|
|
+int hostapd_ctrl_iface_acl_show_mac(struct mac_acl_entry *acl, int num,
|
|
+ char *buf, size_t buflen)
|
|
+{
|
|
+ int i = 0, len = 0, ret = 0;
|
|
+
|
|
+ if (!acl)
|
|
+ return 0;
|
|
+
|
|
+ while (i < num) {
|
|
+ ret = os_snprintf(buf + len, buflen - len,
|
|
+ MACSTR " VLAN_ID=%d\n",
|
|
+ MAC2STR(acl[i].addr),
|
|
+ acl[i].vlan_id.untagged);
|
|
+ if (ret < 0 || (size_t) ret >= buflen - len)
|
|
+ return len;
|
|
+ i++;
|
|
+ len += ret;
|
|
+ }
|
|
+ return len;
|
|
+}
|
|
+
|
|
+
|
|
+int hostapd_ctrl_iface_acl_add_mac(struct mac_acl_entry **acl, int *num,
|
|
+ const char *cmd)
|
|
+{
|
|
+ u8 addr[ETH_ALEN];
|
|
+ struct vlan_description vlan_id;
|
|
+ int ret = 0, vlanid = 0;
|
|
+ const char *pos;
|
|
+
|
|
+ if (hwaddr_aton(cmd, addr))
|
|
+ return -1;
|
|
+
|
|
+ pos = os_strstr(cmd, "VLAN_ID=");
|
|
+ if (pos)
|
|
+ vlanid = atoi(pos + 8);
|
|
+
|
|
+ if (!hostapd_maclist_found(*acl, *num, addr, &vlan_id)) {
|
|
+ ret = hostapd_add_acl_maclist(acl, num, vlanid, addr);
|
|
+ if (ret != -1 && *acl)
|
|
+ qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp);
|
|
+ }
|
|
+
|
|
+ return ret < 0 ? -1 : 0;
|
|
+}
|
|
+
|
|
int hostapd_ctrl_iface_deauthenticate(struct hostapd_data *hapd,
|
|
const char *txtaddr)
|
|
{
|
|
--- a/src/ap/ctrl_iface_ap.h
|
|
+++ b/src/ap/ctrl_iface_ap.h
|
|
@@ -36,5 +36,15 @@ int hostapd_ctrl_iface_pmksa_add(struct
|
|
int hostapd_ctrl_iface_pmksa_list_mesh(struct hostapd_data *hapd,
|
|
const u8 *addr, char *buf, size_t len);
|
|
void * hostapd_ctrl_iface_pmksa_create_entry(const u8 *aa, char *cmd);
|
|
+int hostapd_ctrl_iface_acl_add_mac(struct mac_acl_entry **acl, int *num,
|
|
+ const char *cmd);
|
|
+int hostapd_ctrl_iface_acl_show_mac(struct mac_acl_entry *acl, int num,
|
|
+ char *buf, size_t buflen);
|
|
+void hostapd_ctrl_iface_acl_clear_list(struct mac_acl_entry **acl,
|
|
+ int *num);
|
|
+int hostapd_ctrl_iface_acl_del_mac(struct mac_acl_entry **acl, int *num,
|
|
+ const char *txtaddr);
|
|
+int hostapd_disassoc_accept_mac(struct hostapd_data *hapd);
|
|
+int hostapd_disassoc_deny_mac(struct hostapd_data *hapd);
|
|
|
|
#endif /* CTRL_IFACE_AP_H */
|
|
--- a/src/ap/ieee802_11.c
|
|
+++ b/src/ap/ieee802_11.c
|
|
@@ -5672,6 +5672,87 @@ u8 * hostapd_eid_wb_chsw_wrapper(struct
|
|
}
|
|
|
|
|
|
+int hostapd_acl_comp(const void *a, const void *b)
|
|
+{
|
|
+ const struct mac_acl_entry *aa = a;
|
|
+ const struct mac_acl_entry *bb = b;
|
|
+
|
|
+ return os_memcmp(aa->addr, bb->addr, sizeof(macaddr));
|
|
+}
|
|
+
|
|
+int hostapd_config_read_maclist(const char *fname,
|
|
+ struct mac_acl_entry **acl, int *num)
|
|
+{
|
|
+ FILE *f;
|
|
+ char buf[128], *pos;
|
|
+ int line = 0;
|
|
+ u8 addr[ETH_ALEN];
|
|
+ int vlan_id;
|
|
+
|
|
+ f = fopen(fname, "r");
|
|
+ if (!f) {
|
|
+ wpa_printf(MSG_ERROR, "MAC list file '%s' not found.", fname);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ while (fgets(buf, sizeof(buf), f)) {
|
|
+ int rem = 0;
|
|
+
|
|
+ line++;
|
|
+
|
|
+ if (buf[0] == '#')
|
|
+ continue;
|
|
+ pos = buf;
|
|
+ while (*pos != '\0') {
|
|
+ if (*pos == '\n') {
|
|
+ *pos = '\0';
|
|
+ break;
|
|
+ }
|
|
+ pos++;
|
|
+ }
|
|
+ if (buf[0] == '\0')
|
|
+ continue;
|
|
+ pos = buf;
|
|
+ if (buf[0] == '-') {
|
|
+ rem = 1;
|
|
+ pos++;
|
|
+ }
|
|
+
|
|
+ if (hwaddr_aton(pos, addr)) {
|
|
+ wpa_printf(MSG_ERROR, "Invalid MAC address '%s' at "
|
|
+ "line %d in '%s'", pos, line, fname);
|
|
+ fclose(f);
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ if (rem) {
|
|
+ hostapd_remove_acl_mac(acl, num, addr);
|
|
+ continue;
|
|
+ }
|
|
+ vlan_id = 0;
|
|
+ pos = buf;
|
|
+ while (*pos != '\0' && *pos != ' ' && *pos != '\t')
|
|
+ pos++;
|
|
+ while (*pos == ' ' || *pos == '\t')
|
|
+ pos++;
|
|
+ if (*pos != '\0')
|
|
+ vlan_id = atoi(pos);
|
|
+
|
|
+ if (hostapd_add_acl_maclist(acl, num, vlan_id, addr) < 0) {
|
|
+ fclose(f);
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ fclose(f);
|
|
+
|
|
+ if (*acl)
|
|
+ qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
static int hostapd_eid_multiple_bssid_chunk_len(struct hostapd_data *hapd,
|
|
struct hostapd_data *hidden,
|
|
int *count,
|
|
--- a/src/ap/ieee802_11.h
|
|
+++ b/src/ap/ieee802_11.h
|
|
@@ -18,6 +18,7 @@ struct ieee80211_vht_capabilities;
|
|
struct ieee80211_mgmt;
|
|
struct radius_sta;
|
|
enum ieee80211_op_mode;
|
|
+struct mac_acl_entry;
|
|
|
|
int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
|
|
struct hostapd_frame_info *fi);
|
|
@@ -25,6 +26,14 @@ void ieee802_11_mgmt_cb(struct hostapd_d
|
|
u16 stype, int ok);
|
|
void hostapd_2040_coex_action(struct hostapd_data *hapd,
|
|
const struct ieee80211_mgmt *mgmt, size_t len);
|
|
+
|
|
+int hostapd_config_read_maclist(const char *fname,
|
|
+ struct mac_acl_entry **acl, int *num);
|
|
+int hostapd_acl_comp(const void *a, const void *b);
|
|
+int hostapd_add_acl_maclist(struct mac_acl_entry **acl, int *num,
|
|
+ int vlan_id, const u8 *addr);
|
|
+void hostapd_remove_acl_mac(struct mac_acl_entry **acl, int *num,
|
|
+ const u8 *addr);
|
|
#ifdef NEED_AP_MLME
|
|
int ieee802_11_get_mib(struct hostapd_data *hapd, char *buf, size_t buflen);
|
|
int ieee802_11_get_mib_sta(struct hostapd_data *hapd, struct sta_info *sta,
|