Because any number of interfaces may be added, bss_devs and sta_devs arrays
cannot be fixed-size arrays. We can make them linked lists, but they are
needed for optimalization only (and even that is questionable with
subsequent patches). Let's remove them; we will probably want something
similar later to speed up packet receiving, but let's not bother ourselves
now.

Also, ieee80211_addr_inc is removed. Choosing of MAC address of a new STA
should be matter of userspace. It's responsibility of the stack not to allow
two STAs with the same MAC address to be up - this feature is introduced in
one of subsequent patches.

Signed-off-by: Jiri Benc <[EMAIL PROTECTED]>

---

 include/net/d80211.h         |    3 -
 net/d80211/hostapd_ioctl.h   |    1 
 net/d80211/ieee80211.c       |  164 ++++--------------------------------------
 net/d80211/ieee80211_i.h     |    9 --
 net/d80211/ieee80211_ioctl.c |   70 ------------------
 net/d80211/ieee80211_proc.c  |   12 ---
 net/d80211/ieee80211_sysfs.c |   29 -------
 7 files changed, 16 insertions(+), 272 deletions(-)

3180a84e9351200900e932690feb613d1f799068
diff --git a/include/net/d80211.h b/include/net/d80211.h
index 44417fc..5dff49a 100644
--- a/include/net/d80211.h
+++ b/include/net/d80211.h
@@ -277,9 +277,6 @@ struct ieee80211_conf {
         int antenna_def;
         int antenna_mode;
 
-       u8 bssid_mask[ETH_ALEN];        /* ff:ff:ff:ff:ff:ff = 1 BSSID */
-       int bss_count;
-
        int atheros_super_ag_compression;
        int atheros_super_ag_fast_frame;
        int atheros_super_ag_burst;
diff --git a/net/d80211/hostapd_ioctl.h b/net/d80211/hostapd_ioctl.h
index 42c2bc5..028caf1 100644
--- a/net/d80211/hostapd_ioctl.h
+++ b/net/d80211/hostapd_ioctl.h
@@ -129,7 +129,6 @@ enum {
        PRISM2_HOSTAPD_SET_CHANNEL_FLAG = 1012,
        PRISM2_HOSTAPD_SET_REGULATORY_DOMAIN = 1013,
        PRISM2_HOSTAPD_SET_TX_QUEUE_PARAMS = 1014,
-       PRISM2_HOSTAPD_SET_BSS = 1015,
        PRISM2_HOSTAPD_GET_TX_STATS = 1016,
        PRISM2_HOSTAPD_UPDATE_IF = 1017,
        PRISM2_HOSTAPD_SCAN_REQ = 1019,
diff --git a/net/d80211/ieee80211.c b/net/d80211/ieee80211.c
index 271c4d9..e3e155e 100644
--- a/net/d80211/ieee80211.c
+++ b/net/d80211/ieee80211.c
@@ -1569,17 +1569,14 @@ struct sk_buff * ieee80211_beacon_get(st
        u8 *b_head, *b_tail;
        int bh_len, bt_len;
 
-       spin_lock_bh(&local->sub_if_lock);
-       if (bss_idx < 0 || bss_idx >= local->bss_dev_count)
-               bdev = NULL;
-       else {
-               bdev = local->bss_devs[bss_idx];
+       bdev = dev_get_by_index(bss_idx);
+       if (bdev) {
                sdata = IEEE80211_DEV_TO_SUB_IF(bdev);
                ap = &sdata->u.ap;
+               dev_put(bdev);
        }
-       spin_unlock_bh(&local->sub_if_lock);
 
-       if (bdev == NULL || ap == NULL || ap->beacon_head == NULL) {
+       if (ap == NULL || ap->beacon_head == NULL) {
 #ifdef CONFIG_D80211_VERBOSE_DEBUG
                if (net_ratelimit())
                        printk(KERN_DEBUG "no beacon data avail for idx=%d "
@@ -1646,19 +1643,15 @@ ieee80211_get_buffered_bc(struct net_dev
        ieee80211_txrx_result res = TXRX_DROP;
        struct net_device *bdev;
        struct ieee80211_sub_if_data *sdata;
-       struct ieee80211_if_ap *bss;
+       struct ieee80211_if_ap *bss = NULL;
 
-       spin_lock_bh(&local->sub_if_lock);
-       if (bss_idx < 0 || bss_idx >= local->bss_dev_count) {
-               bdev = NULL;
-               bss = NULL;
-       } else {
-               bdev = local->bss_devs[bss_idx];
+       bdev = dev_get_by_index(bss_idx);
+       if (bdev) {
                sdata = IEEE80211_DEV_TO_SUB_IF(bdev);
                bss = &sdata->u.ap;
+               dev_put(bdev);
        }
-       spin_unlock_bh(&local->sub_if_lock);
-       if (bdev == NULL || bss == NULL || bss->beacon_head == NULL)
+       if (bss == NULL || bss->beacon_head == NULL)
                return NULL;
 
        if (bss->dtim_count != 0)
@@ -1911,14 +1904,14 @@ ieee80211_get_wds_dev(struct ieee80211_l
 static struct net_device * ieee80211_own_bssid(struct ieee80211_local *local,
                                               u8 *addr)
 {
-       int i;
        struct net_device *dev = NULL;
+       struct ieee80211_sub_if_data *sdata;
 
        spin_lock_bh(&local->sub_if_lock);
-       for (i = 0; i < local->bss_dev_count; i++) {
-               if ((memcmp(local->bss_devs[i]->dev_addr, addr, ETH_ALEN) == 0)
-               ) {
-                       dev = local->bss_devs[i];
+       list_for_each_entry(sdata, &local->sub_if_list, list) {
+               if (sdata->type == IEEE80211_IF_TYPE_AP &&
+                   memcmp(addr, sdata->dev->dev_addr, ETH_ALEN) == 0) {
+                       dev = sdata->dev;
                        break;
                }
        }
@@ -1934,31 +1927,9 @@ static struct net_device * ieee80211_sta
 {
        struct list_head *ptr;
        int multicast;
-       u8 *own_addr = local->mdev->dev_addr;
 
        multicast = a1[0] & 0x01;
 
-       /* Try O(1) lookup for a common case of only one AP being used. */
-       if (own_addr[0] == a1[0] && own_addr[1] == a1[1] &&
-           own_addr[2] == a1[2]) {
-               int index = (((int) a1[3] << 16) | ((int) a1[4] << 8) | a1[5])
-                       - (((int) own_addr[3] << 16) |
-                          ((int) own_addr[4] << 8) | own_addr[5]);
-               if (index >= 0 && index < local->conf.bss_count &&
-                   local->sta_devs[index]) {
-                       struct net_device *dev = local->sta_devs[index];
-                       struct ieee80211_sub_if_data *sdata;
-                       sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-                       if (memcmp(addr, sdata->u.sta.bssid, ETH_ALEN) == 0) {
-                               *sta_multicast = multicast;
-                               return dev;
-                       }
-               }
-       }
-
-       if (!multicast)
-               return NULL;
-
        /* Could not find station interface, resort to O(n) lookup. */
        list_for_each(ptr, &local->sub_if_list) {
                struct ieee80211_sub_if_data *sdata =
@@ -1982,27 +1953,6 @@ static struct net_device * ieee80211_sta
 }
 
 
-static int ieee80211_own_addr(struct net_device *dev, u8 *addr)
-{
-       struct ieee80211_local *local = dev->priv;
-       u8 *own = dev->dev_addr;
-       int index;
-
-       /* Optimization: assume that BSSID mask does not change for first
-        * three octets. */
-       if (own[0] != addr[0] || own[1] != addr[1] || own[2] != addr[2])
-               return 0;
-
-       index = (((int) addr[3] << 16) | ((int) addr[4] << 8) | addr[5]) -
-               (((int) own[3] << 16) | ((int) own[4] << 8) | own[5]);
-       if (index >= 0 && index < local->conf.bss_count &&
-           local->sta_devs[index])
-               return 1;
-
-       return 0;
-}
-
-
 static ieee80211_txrx_result
 ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
 {
@@ -2719,7 +2669,7 @@ ieee80211_rx_h_check(struct ieee80211_tx
         * FIX: Filter out multicast to foreign BSSID. */
        if (rx->sdata->type == IEEE80211_IF_TYPE_STA &&
            !MULTICAST_ADDR(hdr->addr1) &&
-           !ieee80211_own_addr(rx->dev, hdr->addr1))
+           memcmp(rx->dev->dev_addr, hdr->addr1, ETH_ALEN) != 0)
                return TXRX_DROP;
 
        /* Drop disallowed frame classes based on STA auth/assoc state;
@@ -4023,13 +3973,9 @@ static void ieee80211_if_ap_init(struct 
 int ieee80211_if_add_ap(struct net_device *dev, const char *name, u8 *bssid,
                          int locked)
 {
-        struct ieee80211_local *local = dev->priv;
        struct net_device *ap_dev = NULL;
         struct ieee80211_sub_if_data *sdata = NULL;
 
-       if (local->bss_dev_count >= local->conf.bss_count)
-               return -ENOBUFS;
-
         if (strlen(name) != 0) {
                ap_dev = dev_get_by_name(name);
                if (ap_dev) {
@@ -4046,37 +3992,16 @@ int ieee80211_if_add_ap(struct net_devic
        sdata = IEEE80211_DEV_TO_SUB_IF(ap_dev);
        ieee80211_if_ap_init(sdata);
        ieee80211_proc_init_virtual(ap_dev);
-       spin_lock_bh(&local->sub_if_lock);
-       local->bss_devs[local->bss_dev_count] = ap_dev;
-       local->bss_dev_count++;
-       spin_unlock_bh(&local->sub_if_lock);
 
         return 0;
 }
 
 
-static void ieee80211_addr_inc(u8 *addr)
-{
-       int pos = 5;
-       while (pos >= 0) {
-               addr[pos]++;
-               if (addr[pos] != 0)
-                       break;
-               pos--;
-       }
-}
-
-
 int ieee80211_if_add_sta(struct net_device *dev, const char *name, int locked)
 {
-       struct ieee80211_local *local = dev->priv;
        struct net_device *sta_dev;
        struct ieee80211_sub_if_data *sdata;
        struct ieee80211_if_sta *ifsta;
-       int i;
-
-       if (local->sta_dev_count >= local->conf.bss_count)
-               return -ENOBUFS;
 
        if (strlen(name) != 0) {
                sta_dev = dev_get_by_name(name);
@@ -4095,24 +4020,6 @@ int ieee80211_if_add_sta(struct net_devi
        sdata->type = IEEE80211_IF_TYPE_STA;
        ieee80211_proc_init_virtual(sta_dev);
 
-       spin_lock_bh(&local->sub_if_lock);
-       for (i = 0; i < local->conf.bss_count; i++) {
-               if (local->sta_devs[i] == NULL) {
-                       local->sta_devs[i] = sta_dev;
-                       local->sta_dev_count++;
-                       printk(KERN_DEBUG "%s: using STA entry %d\n",
-                              sta_dev->name, i);
-                       while (i > 0) {
-                               ieee80211_addr_inc(sta_dev->dev_addr);
-                               i--;
-                       }
-                       printk(KERN_DEBUG "%s: MAC address " MACSTR "\n",
-                              sta_dev->name, MAC2STR(sta_dev->dev_addr));
-                       break;
-               }
-       }
-       spin_unlock_bh(&local->sub_if_lock);
-
        init_timer(&ifsta->timer);
        ifsta->timer.data = (unsigned long) sta_dev;
        ifsta->timer.function = ieee80211_sta_timer;
@@ -4132,7 +4039,7 @@ static void ieee80211_if_del(struct ieee
 {
         struct sta_info *sta;
        u8 addr[ETH_ALEN];
-       int i, j;
+       int i;
         struct list_head *ptr, *n;
 
        memset(addr, 0xff, ETH_ALEN);
@@ -4170,23 +4077,6 @@ #endif
 
                kfree(sdata->u.ap.beacon_head);
                kfree(sdata->u.ap.beacon_tail);
-               spin_lock_bh(&local->sub_if_lock);
-               for (j = 0; j < local->bss_dev_count; j++) {
-                       if (sdata->dev == local->bss_devs[j]) {
-                               if (j + 1 < local->bss_dev_count) {
-                                       memcpy(&local->bss_devs[j],
-                                              &local->bss_devs[j + 1],
-                                              (local->bss_dev_count - j - 1) *
-                                              sizeof(local->bss_devs[0]));
-                                       local->bss_devs[local->bss_dev_count -
-                                                       1] = NULL;
-                               } else
-                                       local->bss_devs[j] = NULL;
-                               local->bss_dev_count--;
-                               break;
-                       }
-               }
-               spin_unlock_bh(&local->sub_if_lock);
 
                if (sdata->dev != local->mdev) {
                        struct sk_buff *skb;
@@ -4223,13 +4113,6 @@ #endif /* CONFIG_D80211_VERBOSE_DEBUG */
                        dev_kfree_skb(sdata->u.sta.probe_resp);
                        sdata->u.sta.probe_resp = NULL;
                }
-               for (i = 0; i < local->conf.bss_count; i++) {
-                       if (local->sta_devs[i] == sdata->dev) {
-                               local->sta_devs[i] = NULL;
-                               local->sta_dev_count--;
-                               break;
-                       }
-               }
 
                break;
        }
@@ -4428,17 +4311,6 @@ struct net_device *ieee80211_alloc_hw(si
        local->conf.calib_int = 60;
        local->rate_ctrl_num_up = RATE_CONTROL_NUM_UP;
        local->rate_ctrl_num_down = RATE_CONTROL_NUM_DOWN;
-       local->conf.bss_count = 1;
-       memset(local->conf.bssid_mask, 0xff, ETH_ALEN);
-       local->bss_devs = kmalloc(sizeof(struct net_device *), GFP_KERNEL);
-       if (local->bss_devs == NULL)
-               goto fail;
-       local->bss_devs[0] = local->wdev;
-       local->bss_dev_count = 1;
-       local->sta_devs = kmalloc(sizeof(struct net_device *), GFP_KERNEL);
-       if (local->sta_devs == NULL)
-               goto fail;
-       local->sta_devs[0] = NULL;
 
         local->scan.in_scan = 0;
        local->hw_modes = (unsigned int) -1;
@@ -4694,10 +4566,6 @@ void ieee80211_unregister_hw(struct net_
 
 void ieee80211_free_hw(struct net_device *dev)
 {
-       struct ieee80211_local *local = dev->priv;
-
-       kfree(local->sta_devs);
-       kfree(local->bss_devs);
        kfree(dev);
 }
 
diff --git a/net/d80211/ieee80211_i.h b/net/d80211/ieee80211_i.h
index d42b6fe..3766232 100644
--- a/net/d80211/ieee80211_i.h
+++ b/net/d80211/ieee80211_i.h
@@ -372,13 +372,6 @@ #define IEEE80211_IRQSAFE_QUEUE_LIMIT 12
 
         spinlock_t sub_if_lock; /* mutex for STA data structures */
         struct list_head sub_if_list;
-       struct net_device **bss_devs; /* pointer to IF_TYPE_AP devices for
-                                      * quick access to BSS data */
-       int bss_dev_count; /* number of used entries in bss_devs; note: the
-                           * total size of bss_devs array is stored in
-                           * conf.bss_count */
-       struct net_device **sta_devs; /* pointer to IF_TYPE_STA devices */
-       int sta_dev_count; /* number of used entries in sta_devs */
        int sta_scanning;
        int scan_hw_mode_idx;
        int scan_channel_idx;
@@ -553,8 +546,6 @@ int ieee80211_if_remove_sta(struct net_d
 /* ieee80211_ioctl.c */
 int ieee80211_set_compression(struct ieee80211_local *local,
                              struct net_device *dev, struct sta_info *sta);
-int ieee80211_set_bss_count(struct net_device *dev, int new_count,
-                           u8 *bssid_mask);
 /* ieee80211_sta.c */
 void ieee80211_sta_timer(unsigned long ptr);
 void ieee80211_sta_rx_mgmt(struct net_device *dev, struct sk_buff *skb,
diff --git a/net/d80211/ieee80211_ioctl.c b/net/d80211/ieee80211_ioctl.c
index 2fd910d..461e2d9 100644
--- a/net/d80211/ieee80211_ioctl.c
+++ b/net/d80211/ieee80211_ioctl.c
@@ -1223,73 +1223,6 @@ static int ieee80211_ioctl_get_tx_stats(
 }
 
 
-int ieee80211_set_bss_count(struct net_device *dev, int new_count,
-                           u8 *bssid_mask)
-{
-       struct ieee80211_local *local = dev->priv;
-       struct ieee80211_conf *conf = ieee80211_get_hw_conf(dev);
-       int i, bss_count;
-       struct net_device **bss_devs, **prev;
-       struct net_device **sta_devs, **prev_sta_devs;
-
-       bss_count = 0;
-       for (i = 0; i < conf->bss_count; i++) {
-               if (local->bss_devs[i])
-                       bss_count++;
-       }
-
-       if (new_count < bss_count) {
-               printk(KERN_DEBUG "%s: invalid BSS count %d (in use: %d)\n",
-                      dev->name, new_count, bss_count);
-               return -EINVAL;
-       }
-
-       bss_devs = kmalloc(new_count * sizeof(struct net_device *),
-                          GFP_KERNEL);
-       if (bss_devs == NULL)
-               return -ENOMEM;
-       sta_devs = kmalloc(new_count * sizeof(struct net_device *),
-                          GFP_KERNEL);
-       if (sta_devs == NULL) {
-               kfree(bss_devs);
-               return -ENOMEM;
-       }
-
-       spin_lock_bh(&local->sub_if_lock);
-       memcpy(bss_devs, local->bss_devs,
-              bss_count * sizeof(struct net_device *));
-       memset(&bss_devs[bss_count], 0,
-              (new_count - bss_count) * sizeof(struct net_device *));
-
-       if (bssid_mask)
-               memcpy(conf->bssid_mask, bssid_mask, ETH_ALEN);
-
-       prev = local->bss_devs;
-       local->bss_devs = bss_devs;
-       conf->bss_count = new_count;
-
-       memcpy(sta_devs, local->sta_devs,
-              bss_count * sizeof(struct net_device *));
-       memset(&sta_devs[bss_count], 0,
-              (new_count - bss_count) * sizeof(struct net_device *));
-       prev_sta_devs = local->sta_devs;
-       local->sta_devs = sta_devs;
-
-       spin_unlock_bh(&local->sub_if_lock);
-       kfree(prev);
-       kfree(prev_sta_devs);
-
-       return ieee80211_hw_config(dev);
-}
-
-static int ieee80211_ioctl_set_bss(struct net_device *dev,
-                                  struct prism2_hostapd_param *param)
-{
-       return ieee80211_set_bss_count(dev, param->u.set_bss.bss_count,
-                                      param->u.set_bss.bssid_mask);
-}
-
-
 static int ieee80211_ioctl_set_channel_flag(struct net_device *dev,
                                            struct prism2_hostapd_param *param)
 {
@@ -1441,9 +1374,6 @@ #endif /* CONFIG_HOSTAPD_WPA_TESTING */
        case PRISM2_HOSTAPD_SET_TX_QUEUE_PARAMS:
                ret = ieee80211_ioctl_set_tx_queue_params(dev, param);
                break;
-       case PRISM2_HOSTAPD_SET_BSS:
-               ret = ieee80211_ioctl_set_bss(dev, param);
-               break;
        case PRISM2_HOSTAPD_GET_TX_STATS:
                ret = ieee80211_ioctl_get_tx_stats(dev, param);
                break;
diff --git a/net/d80211/ieee80211_proc.c b/net/d80211/ieee80211_proc.c
index 098599a..a886280 100644
--- a/net/d80211/ieee80211_proc.c
+++ b/net/d80211/ieee80211_proc.c
@@ -374,7 +374,6 @@ static int ieee80211_proc_debug_read(cha
 {
        char *p = page;
        struct ieee80211_local *local = (struct ieee80211_local *) data;
-       int i;
 
        if (off != 0) {
                *eof = 1;
@@ -439,17 +438,6 @@ #endif /* CONFIG_D80211_DEBUG_COUNTERS *
 
        p += sprintf(p, "num_scans=%u\n", local->scan.num_scans);
 
-       p += sprintf(p,
-                    "conf.bss_count=%d\n"
-                    "bss_dev_count=%u\n",
-                    local->conf.bss_count, local->bss_dev_count);
-       for (i = 0; i < local->conf.bss_count; i++) {
-               p += sprintf(p, "bss_dev[%d]=%p (%s)\n",
-                            i, local->bss_devs[i],
-                            (i < local->bss_dev_count && local->bss_devs[i]) ?
-                            local->bss_devs[i]->name : "N/A");
-       }
-
        return (p - page);
 }
 
diff --git a/net/d80211/ieee80211_sysfs.c b/net/d80211/ieee80211_sysfs.c
index 32fb380..082404f 100644
--- a/net/d80211/ieee80211_sysfs.c
+++ b/net/d80211/ieee80211_sysfs.c
@@ -51,33 +51,6 @@ static ssize_t store_remove_iface(struct
        return res < 0 ? res : len;
 }
 
-static ssize_t show_max_iface_count(struct class_device *dev,
-                                   char *buf)
-{
-       struct ieee80211_local *local = to_ieee80211_local(dev);
-
-       return sprintf(buf, "%d\n", local->conf.bss_count);
-}
-
-static ssize_t store_max_iface_count(struct class_device *dev,
-                                    const char *buf, size_t len)
-{
-       struct ieee80211_local *local = to_ieee80211_local(dev);
-       unsigned long new_count;
-       char *endp;
-       int res;
-
-       if (!capable(CAP_NET_ADMIN))
-               return -EPERM;
-       new_count = simple_strtoul(buf, &endp, 0);
-       if (endp == buf)
-               return -EINVAL;
-       rtnl_lock();
-       res = ieee80211_set_bss_count(local->mdev, new_count, NULL);
-       rtnl_unlock();
-       return res < 0 ? res : len;
-}
-
 #ifdef CONFIG_HOTPLUG
 static int ieee80211_uevent(struct class_device *cd, char **envp,
                            int num_envp, char *buf, int size)
@@ -98,8 +71,6 @@ #endif
 static struct class_device_attribute ieee80211_class_dev_attrs[] = {
        __ATTR(add_iface, S_IWUSR, NULL, store_add_iface),
        __ATTR(remove_iface, S_IWUSR, NULL, store_remove_iface),
-       __ATTR(max_iface_count, S_IRUGO | S_IWUSR,
-              show_max_iface_count, store_max_iface_count),
        {}
 };
 
-- 
1.3.0

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to