Added support for setting VLAN ID for STAs based on local MAC ACL
[wpasupplicant] / hostapd / config.c
index 7ec3594..eb247a3 100644 (file)
@@ -270,14 +270,23 @@ int hostapd_mac_comp_empty(const void *a)
 }
 
 
-static int hostapd_config_read_maclist(const char *fname, macaddr **acl,
-                                      int *num)
+static 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));
+}
+
+
+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];
-       macaddr *newacl;
+       struct mac_acl_entry *newacl;
+       int vlan_id;
 
        if (!fname)
                return 0;
@@ -311,7 +320,16 @@ static int hostapd_config_read_maclist(const char *fname, macaddr **acl,
                        return -1;
                }
 
-               newacl = os_realloc(*acl, (*num + 1) * ETH_ALEN);
+               vlan_id = 0;
+               pos = buf;
+               while (*pos != '\0' && *pos != ' ' && *pos != '\t')
+                       pos++;
+               while (*pos == ' ' || *pos == '\t')
+                       pos++;
+               if (*pos != '\0')
+                       vlan_id = atoi(pos);
+
+               newacl = os_realloc(*acl, (*num + 1) * sizeof(**acl));
                if (newacl == NULL) {
                        printf("MAC list reallocation failed\n");
                        fclose(f);
@@ -319,13 +337,14 @@ static int hostapd_config_read_maclist(const char *fname, macaddr **acl,
                }
 
                *acl = newacl;
-               os_memcpy((*acl)[*num], addr, ETH_ALEN);
+               os_memcpy((*acl)[*num].addr, addr, ETH_ALEN);
+               (*acl)[*num].vlan_id = vlan_id;
                (*num)++;
        }
 
        fclose(f);
 
-       qsort(*acl, *num, sizeof(macaddr), hostapd_mac_comp);
+       qsort(*acl, *num, sizeof(**acl), hostapd_acl_comp);
 
        return 0;
 }
@@ -2167,7 +2186,8 @@ void hostapd_config_free(struct hostapd_config *conf)
 
 /* Perform a binary search for given MAC address from a pre-sorted list.
  * Returns 1 if address is in the list or 0 if not. */
-int hostapd_maclist_found(macaddr *list, int num_entries, const u8 *addr)
+int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries,
+                         const u8 *addr, int *vlan_id)
 {
        int start, end, middle, res;
 
@@ -2176,9 +2196,12 @@ int hostapd_maclist_found(macaddr *list, int num_entries, const u8 *addr)
 
        while (start <= end) {
                middle = (start + end) / 2;
-               res = os_memcmp(list[middle], addr, ETH_ALEN);
-               if (res == 0)
+               res = os_memcmp(list[middle].addr, addr, ETH_ALEN);
+               if (res == 0) {
+                       if (vlan_id)
+                               *vlan_id = list[middle].vlan_id;
                        return 1;
+               }
                if (res < 0)
                        start = middle + 1;
                else