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