Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=09703f5e79a64c744721b9c27502075232ba0ea2
Commit:     09703f5e79a64c744721b9c27502075232ba0ea2
Parent:     f74347d7ac0aa175b2bbd85eb58a13fbe80a3785
Author:     Daniel Drake <[EMAIL PROTECTED]>
AuthorDate: Wed Sep 26 21:45:24 2007 +0100
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Oct 10 16:54:09 2007 -0700

    [HOSTAP]: set netdev type before registering AP interface
    
    As detailed at https://bugs.gentoo.org/159646 hostap with hostapd confuses
    udev by presenting 2 interfaces with the same MAC address. Also, at the time
    of detection, the 'type' attribute is 1, identical to other hostap 
interfaces.
    
    The AP interface is supposed to have type ARPHRD_IEEE80211 (801), but this 
is
    not set until after registration.
    
    Setting it before register_netdev() is called allows us to avoid this
    confusion. We can do this by propogating the HOSTAP_INTERFACE type through
    to hostap_setup_dev().
    
    Signed-off-by: Daniel Drake <[EMAIL PROTECTED]>
    Signed-off-by: John W. Linville <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 drivers/net/wireless/hostap/hostap.h      |    2 +-
 drivers/net/wireless/hostap/hostap_hw.c   |    2 +-
 drivers/net/wireless/hostap/hostap_main.c |   19 +++++++++++--------
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/hostap/hostap.h 
b/drivers/net/wireless/hostap/hostap.h
index 951df83..547ba84 100644
--- a/drivers/net/wireless/hostap/hostap.h
+++ b/drivers/net/wireless/hostap/hostap.h
@@ -34,7 +34,7 @@ extern const struct header_ops hostap_80211_ops;
 int hostap_80211_get_hdrlen(u16 fc);
 struct net_device_stats *hostap_get_stats(struct net_device *dev);
 void hostap_setup_dev(struct net_device *dev, local_info_t *local,
-                     int main_dev);
+                     int type);
 void hostap_set_multicast_list_queue(struct work_struct *work);
 int hostap_set_hostapd(local_info_t *local, int val, int rtnl_locked);
 int hostap_set_hostapd_sta(local_info_t *local, int val, int rtnl_locked);
diff --git a/drivers/net/wireless/hostap/hostap_hw.c 
b/drivers/net/wireless/hostap/hostap_hw.c
index b20bb01..c592641 100644
--- a/drivers/net/wireless/hostap/hostap_hw.c
+++ b/drivers/net/wireless/hostap/hostap_hw.c
@@ -3257,7 +3257,7 @@ while (0)
 
        INIT_LIST_HEAD(&local->bss_list);
 
-       hostap_setup_dev(dev, local, 1);
+       hostap_setup_dev(dev, local, HOSTAP_INTERFACE_MASTER);
 
        dev->hard_start_xmit = hostap_master_start_xmit;
        dev->type = ARPHRD_IEEE80211;
diff --git a/drivers/net/wireless/hostap/hostap_main.c 
b/drivers/net/wireless/hostap/hostap_main.c
index b75cf92..17c58e9 100644
--- a/drivers/net/wireless/hostap/hostap_main.c
+++ b/drivers/net/wireless/hostap/hostap_main.c
@@ -73,7 +73,7 @@ struct net_device * hostap_add_interface(struct local_info 
*local,
        dev->mem_start = mdev->mem_start;
        dev->mem_end = mdev->mem_end;
 
-       hostap_setup_dev(dev, local, 0);
+       hostap_setup_dev(dev, local, type);
        dev->destructor = free_netdev;
 
        sprintf(dev->name, "%s%s", prefix, name);
@@ -857,7 +857,7 @@ const struct header_ops hostap_80211_ops = {
 EXPORT_SYMBOL(hostap_80211_ops);
 
 void hostap_setup_dev(struct net_device *dev, local_info_t *local,
-                     int main_dev)
+                     int type)
 {
        struct hostap_interface *iface;
 
@@ -877,15 +877,22 @@ void hostap_setup_dev(struct net_device *dev, 
local_info_t *local,
        dev->do_ioctl = hostap_ioctl;
        dev->open = prism2_open;
        dev->stop = prism2_close;
-       dev->hard_start_xmit = hostap_data_start_xmit;
        dev->set_mac_address = prism2_set_mac_address;
        dev->set_multicast_list = hostap_set_multicast_list;
        dev->change_mtu = prism2_change_mtu;
        dev->tx_timeout = prism2_tx_timeout;
        dev->watchdog_timeo = TX_TIMEOUT;
 
+       if (type == HOSTAP_INTERFACE_AP) {
+               dev->hard_start_xmit = hostap_mgmt_start_xmit;
+               dev->type = ARPHRD_IEEE80211;
+               dev->header_ops = &hostap_80211_ops;
+       } else {
+               dev->hard_start_xmit = hostap_data_start_xmit;
+       }
+
        dev->mtu = local->mtu;
-       if (!main_dev) {
+       if (type != HOSTAP_INTERFACE_MASTER) {
                /* use main radio device queue */
                dev->tx_queue_len = 0;
        }
@@ -910,10 +917,6 @@ static int hostap_enable_hostapd(local_info_t *local, int 
rtnl_locked)
        if (local->apdev == NULL)
                return -ENOMEM;
 
-       local->apdev->hard_start_xmit = hostap_mgmt_start_xmit;
-       local->apdev->type = ARPHRD_IEEE80211;
-       local->apdev->header_ops = &hostap_80211_ops;
-
        return 0;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to