Since I solved the problem with the license by defining SOFTMAC_DIR, my system has been well behaved, and I can use iwlist wlan0 scan to see the beacons of my AP and those of my neighbor. No more crashes and/or freezes.

Attached is a patch to implement the set/get essid IOCTLs. To preserve white space, the patch file is also attached.

Index: bcm430x_wx.c
===================================================================
--- bcm430x_wx.c        (revision 751)
+++ bcm430x_wx.c        (working copy)
@@ -50,6 +50,7 @@

 #define MAX_WX_STRING          80

+void bcm430x_associate(struct bcm430x_private *bcm, const u8 *mac);

 static int bcm430x_wx_get_name(struct net_device *net_dev,
                                struct iw_request_info *info,
@@ -360,9 +361,49 @@
                                union iwreq_data *data,
                                char *extra)
 {
+       struct bcm430x_private * bcm = bcm430x_priv(net_dev);
+       unsigned long flags;
+       int length = 0;
+       char *essid = "";
+       const char *mac = (const char*)(bcm->net_dev->dev_addr);
+
        wx_enter();
-       /*TODO*/
-       return 0;
+       spin_lock_irqsave(&bcm->lock, flags);
+       if (data->essid.flags && data->essid.length) {
+               length = data->essid.length - 1;
+               essid = extra;
+       }
+       if (length == 0) {
+ printk_wx(KERN_INFO PFX "WX handler called: %s: Setting ESSID to ANY\n", __FUNCTION__);
+               if (!bcm->associated) {
+ printk_wx(KERN_INFO PFX "WX handler called: %s: Attempting to associate with new"
+                                " parameters.\n", __FUNCTION__);
+                       bcm430x_associate(bcm, mac);
+               }
+               spin_unlock_irqrestore(&bcm->lock, flags);
+               return 0;
+       }
+       length = min(length, IW_ESSID_MAX_SIZE);
+ if (bcm->essid_len == length && !memcmp(bcm->essid, extra, length)) { + printk_wx(KERN_INFO PFX "WX handler called: %s: ESSID unchanged.\n", __FUNCTION__);
+               spin_unlock_irqrestore(&bcm->lock, flags);
+               return 0;
+       }
+ printk_wx(KERN_INFO PFX "WX handler called: %s: Setting ESSID: '%s' (%d)\n", __FUNCTION__,
+               escape_essid(essid, length), length);
+       bcm->essid_len = length;
+       memcpy(bcm->essid, essid, bcm->essid_len);
+/*
+ * If we are currently associated, or trying to associate, then see if this is a new ESSID,
+ * , which would cause us to disassociate
+ */
+       if (bcm->associated ) {
+               bcm430x_disassociate(bcm);
+       } else {
+               bcm430x_associate(bcm, mac);
+       }
+       spin_unlock_irqrestore(&bcm->lock, flags);
+       return 0;
 }

 static int bcm430x_wx_get_essid(struct net_device *net_dev,
@@ -370,10 +411,31 @@
                                union iwreq_data *data,
                                char *extra)
 {
+       struct bcm430x_private * bcm = bcm430x_priv(net_dev);
+       unsigned long flags;
+
        wx_enter();
-       /*TODO*/
-       return 0;
+       spin_lock_irqsave(&bcm->lock, flags);
+
+       /* If we are associated, trying to associate, or have a statically
+        * configured ESSID then return that; otherwise return ANY */
+       if (bcm->associated) {
+ printk_wx(KERN_INFO PFX "WX handler called: %s:", __FUNCTION__);
+               printk_wx(" Getting essid: '%s'\n",
+                         escape_essid(bcm->essid, bcm->essid_len));
+               memcpy(extra, bcm->essid, bcm->essid_len);
+               data->essid.length = bcm->essid_len;
+               data->essid.flags = 1;   /* active */
+       } else {
+ printk_wx(KERN_INFO PFX "WX handler called: %s:", __FUNCTION__);
+               printk_wx(" Getting essid: ANY\n");
+               data->essid.length = 0;
+               data->essid.flags = 0;
+       }
+       spin_unlock_irqrestore(&bcm->lock, flags);
+       return 0;
 }
+

 static int bcm430x_wx_set_nick(struct net_device *net_dev,
                               struct iw_request_info *info,
@@ -934,8 +996,8 @@
        WX(SIOCSIWSCAN)         = ieee80211softmac_wx_trigger_scan,
        WX(SIOCGIWSCAN)         = bcm430x_wx_get_scanresults,
        /* 802.11 specific support */
-//TODO WX(SIOCSIWESSID)        = bcm430x_wx_set_essid,
-//TODO WX(SIOCGIWESSID)        = bcm430x_wx_get_essid,
+       WX(SIOCSIWESSID)        = bcm430x_wx_set_essid,
+       WX(SIOCGIWESSID)        = bcm430x_wx_get_essid,
        WX(SIOCSIWNICKN)        = bcm430x_wx_set_nick,
        WX(SIOCGIWNICKN)        = bcm430x_wx_get_nick,
        /* Other parameters */
Index: bcm430x_main.c
===================================================================
--- bcm430x_main.c      (revision 751)
+++ bcm430x_main.c      (working copy)
@@ -675,7 +675,7 @@
        bcm430x_mac_enable(bcm);
 }

-static void bcm430x_associate(struct bcm430x_private *bcm,
+void bcm430x_associate(struct bcm430x_private *bcm,
                              const u8 *mac)
 {
        if (bcm->associated)
Index: bcm430x.h
===================================================================
--- bcm430x.h   (revision 751)
+++ bcm430x.h   (working copy)
@@ -659,6 +659,8 @@

        /* Informational stuff. */
        char nick[IW_ESSID_MAX_SIZE + 1];
+       char essid[IW_ESSID_MAX_SIZE + 1];
+       char essid_len;

        /* Debugging stuff follows. */
 #ifdef BCM430x_DEBUG
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
http://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to