Index: linux/include/net/ieee80211softmac.h =================================================================== --- linux.orig/include/net/ieee80211softmac.h +++ linux/include/net/ieee80211softmac.h @@ -172,6 +172,10 @@ struct ieee80211softmac_device { void (*set_bssid_filter)(struct net_device *dev, const u8 *bssid); void (*set_channel)(struct net_device *dev, u8 channel); + /* implement this if you need to configure hardware encryption + * when the user changes security settings */ + void (*set_security)(struct net_device *dev); + /* assign if you need it, informational only */ void (*link_change)(struct net_device *dev); Index: linux/net/ieee80211/softmac/ieee80211softmac_module.c =================================================================== --- linux.orig/net/ieee80211/softmac/ieee80211softmac_module.c +++ linux/net/ieee80211/softmac/ieee80211softmac_module.c @@ -27,6 +27,51 @@ #include "ieee80211softmac_priv.h" #include #include +#include + +static void set_security(struct net_device *dev, + struct ieee80211_security *sec) +{ + struct ieee80211softmac_device *mac = ieee80211_priv(dev); + struct ieee80211_device *ieee = mac->ieee; + struct ieee80211_security *secinfo = &ieee->sec; + int keyidx; + + dprintk(KERN_NOTICE PFX "set_security:\n"); + secinfo->flags = sec->flags; + + for (keyidx = 0; keyidx < WEP_KEYS; keyidx++) + if (sec->flags & (1 << keyidx)) { + secinfo->encode_alg[keyidx] = sec->encode_alg[keyidx]; + secinfo->key_sizes[keyidx] = sec->key_sizes[keyidx]; + memcpy(secinfo->keys[keyidx], sec->keys[keyidx], + SCM_KEY_LEN); + } + + if (sec->flags & SEC_ACTIVE_KEY) { + secinfo->active_key = sec->active_key; + dprintk(" .active_key = %d\n", sec->active_key); + } + if (sec->flags & SEC_UNICAST_GROUP) { + secinfo->unicast_uses_group = sec->unicast_uses_group; + dprintk(" .unicast_uses_group = %d\n", sec->unicast_uses_group); + } + if (sec->flags & SEC_LEVEL) { + secinfo->level = sec->level; + dprintk(" .level = %d\n", sec->level); + } + if (sec->flags & SEC_ENABLED) { + secinfo->enabled = sec->enabled; + dprintk(" .enabled = %d\n", sec->enabled); + } + if (sec->flags & SEC_ENCRYPT) { + secinfo->encrypt = sec->encrypt; + dprintk(" .encrypt = %d\n", sec->encrypt); + } + + if (mac->set_security) + mac->set_security(dev); +} struct net_device *alloc_ieee80211softmac(int sizeof_priv) { @@ -44,6 +89,7 @@ struct net_device *alloc_ieee80211softma softmac->ieee->handle_assoc_response = ieee80211softmac_handle_assoc_response; softmac->ieee->handle_reassoc_request = ieee80211softmac_handle_reassoc_req; softmac->ieee->handle_disassoc = ieee80211softmac_handle_disassoc; + softmac->ieee->set_security = set_security; softmac->scaninfo = NULL; softmac->associnfo.scan_retry = IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT;