Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6

This commit is contained in:
David S. Miller 2008-05-01 02:06:32 -07:00
commit c2a3b23345
8 changed files with 49 additions and 38 deletions

View File

@ -4326,6 +4326,14 @@ static int b43_wireless_core_attach(struct b43_wldev *dev)
err = -EOPNOTSUPP; err = -EOPNOTSUPP;
goto err_powerdown; goto err_powerdown;
} }
if (1 /* disable A-PHY */) {
/* FIXME: For now we disable the A-PHY on multi-PHY devices. */
if (dev->phy.type != B43_PHYTYPE_N) {
have_2ghz_phy = 1;
have_5ghz_phy = 0;
}
}
dev->phy.gmode = have_2ghz_phy; dev->phy.gmode = have_2ghz_phy;
tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0; tmp = dev->phy.gmode ? B43_TMSLOW_GMODE : 0;
b43_wireless_core_reset(dev, tmp); b43_wireless_core_reset(dev, tmp);

View File

@ -298,7 +298,8 @@ static int lbs_do_scan(struct lbs_private *priv, uint8_t bsstype,
uint8_t *tlv; /* pointer into our current, growing TLV storage area */ uint8_t *tlv; /* pointer into our current, growing TLV storage area */
lbs_deb_enter_args(LBS_DEB_SCAN, "bsstype %d, chanlist[].chan %d, chan_count %d", lbs_deb_enter_args(LBS_DEB_SCAN, "bsstype %d, chanlist[].chan %d, chan_count %d",
bsstype, chan_list[0].channumber, chan_count); bsstype, chan_list ? chan_list[0].channumber : -1,
chan_count);
/* create the fixed part for scan command */ /* create the fixed part for scan command */
scan_cmd = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL); scan_cmd = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL);

View File

@ -113,7 +113,7 @@ struct ieee80211_hdr {
struct ieee80211s_hdr { struct ieee80211s_hdr {
u8 flags; u8 flags;
u8 ttl; u8 ttl;
u8 seqnum[3]; __le32 seqnum;
u8 eaddr1[6]; u8 eaddr1[6];
u8 eaddr2[6]; u8 eaddr2[6];
u8 eaddr3[6]; u8 eaddr3[6];

View File

@ -354,7 +354,7 @@ struct ieee80211_if_sta {
int preq_queue_len; int preq_queue_len;
struct mesh_stats mshstats; struct mesh_stats mshstats;
struct mesh_config mshcfg; struct mesh_config mshcfg;
u8 mesh_seqnum[3]; u32 mesh_seqnum;
bool accepting_plinks; bool accepting_plinks;
#endif #endif
u16 aid; u16 aid;

View File

@ -255,22 +255,8 @@ static int ieee80211_open(struct net_device *dev)
switch (sdata->vif.type) { switch (sdata->vif.type) {
case IEEE80211_IF_TYPE_WDS: case IEEE80211_IF_TYPE_WDS:
if (is_zero_ether_addr(sdata->u.wds.remote_addr)) if (!is_valid_ether_addr(sdata->u.wds.remote_addr))
return -ENOLINK; return -ENOLINK;
/* Create STA entry for the WDS peer */
sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
GFP_KERNEL);
if (!sta)
return -ENOMEM;
sta->flags |= WLAN_STA_AUTHORIZED;
res = sta_info_insert(sta);
if (res) {
/* STA has been freed */
return res;
}
break; break;
case IEEE80211_IF_TYPE_VLAN: case IEEE80211_IF_TYPE_VLAN:
if (!sdata->u.vlan.ap) if (!sdata->u.vlan.ap)
@ -337,10 +323,8 @@ static int ieee80211_open(struct net_device *dev)
conf.type = sdata->vif.type; conf.type = sdata->vif.type;
conf.mac_addr = dev->dev_addr; conf.mac_addr = dev->dev_addr;
res = local->ops->add_interface(local_to_hw(local), &conf); res = local->ops->add_interface(local_to_hw(local), &conf);
if (res && !local->open_count && local->ops->stop)
local->ops->stop(local_to_hw(local));
if (res) if (res)
return res; goto err_stop;
ieee80211_if_config(dev); ieee80211_if_config(dev);
ieee80211_reset_erp_info(dev); ieee80211_reset_erp_info(dev);
@ -353,9 +337,29 @@ static int ieee80211_open(struct net_device *dev)
netif_carrier_on(dev); netif_carrier_on(dev);
} }
if (sdata->vif.type == IEEE80211_IF_TYPE_WDS) {
/* Create STA entry for the WDS peer */
sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
GFP_KERNEL);
if (!sta) {
res = -ENOMEM;
goto err_del_interface;
}
sta->flags |= WLAN_STA_AUTHORIZED;
res = sta_info_insert(sta);
if (res) {
/* STA has been freed */
goto err_del_interface;
}
}
if (local->open_count == 0) { if (local->open_count == 0) {
res = dev_open(local->mdev); res = dev_open(local->mdev);
WARN_ON(res); WARN_ON(res);
if (res)
goto err_del_interface;
tasklet_enable(&local->tx_pending_tasklet); tasklet_enable(&local->tx_pending_tasklet);
tasklet_enable(&local->tasklet); tasklet_enable(&local->tasklet);
} }
@ -390,6 +394,12 @@ static int ieee80211_open(struct net_device *dev)
netif_start_queue(dev); netif_start_queue(dev);
return 0; return 0;
err_del_interface:
local->ops->remove_interface(local_to_hw(local), &conf);
err_stop:
if (!local->open_count && local->ops->stop)
local->ops->stop(local_to_hw(local));
return res;
} }
static int ieee80211_stop(struct net_device *dev) static int ieee80211_stop(struct net_device *dev)
@ -975,6 +985,7 @@ static int __ieee80211_if_config(struct net_device *dev,
conf.ssid_len = sdata->u.sta.ssid_len; conf.ssid_len = sdata->u.sta.ssid_len;
} else if (ieee80211_vif_is_mesh(&sdata->vif)) { } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
conf.beacon = beacon; conf.beacon = beacon;
conf.beacon_control = control;
ieee80211_start_mesh(dev); ieee80211_start_mesh(dev);
} else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) { } else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) {
conf.ssid = sdata->u.ap.ssid; conf.ssid = sdata->u.ap.ssid;

View File

@ -8,6 +8,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <asm/unaligned.h>
#include "ieee80211_i.h" #include "ieee80211_i.h"
#include "mesh.h" #include "mesh.h"
@ -167,8 +168,8 @@ int mesh_rmc_check(u8 *sa, struct ieee80211s_hdr *mesh_hdr,
struct rmc_entry *p, *n; struct rmc_entry *p, *n;
/* Don't care about endianness since only match matters */ /* Don't care about endianness since only match matters */
memcpy(&seqnum, mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum)); memcpy(&seqnum, &mesh_hdr->seqnum, sizeof(mesh_hdr->seqnum));
idx = mesh_hdr->seqnum[0] & rmc->idx_mask; idx = le32_to_cpu(mesh_hdr->seqnum) & rmc->idx_mask;
list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) { list_for_each_entry_safe(p, n, &rmc->bucket[idx].list, list) {
++entries; ++entries;
if (time_after(jiffies, p->exp_time) || if (time_after(jiffies, p->exp_time) ||
@ -393,16 +394,8 @@ int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr,
{ {
meshhdr->flags = 0; meshhdr->flags = 0;
meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL; meshhdr->ttl = sdata->u.sta.mshcfg.dot11MeshTTL;
put_unaligned(cpu_to_le32(sdata->u.sta.mesh_seqnum), &meshhdr->seqnum);
meshhdr->seqnum[0] = sdata->u.sta.mesh_seqnum[0]++; sdata->u.sta.mesh_seqnum++;
meshhdr->seqnum[1] = sdata->u.sta.mesh_seqnum[1];
meshhdr->seqnum[2] = sdata->u.sta.mesh_seqnum[2];
if (sdata->u.sta.mesh_seqnum[0] == 0) {
sdata->u.sta.mesh_seqnum[1]++;
if (sdata->u.sta.mesh_seqnum[1] == 0)
sdata->u.sta.mesh_seqnum[2]++;
}
return 5; return 5;
} }

View File

@ -140,7 +140,7 @@ struct rmc_entry {
struct mesh_rmc { struct mesh_rmc {
struct rmc_entry bucket[RMC_BUCKETS]; struct rmc_entry bucket[RMC_BUCKETS];
u8 idx_mask; u32 idx_mask;
}; };

View File

@ -230,10 +230,8 @@ void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
iv16 = data[hdr_len] << 8; iv16 = data[hdr_len] << 8;
iv16 += data[hdr_len + 2]; iv16 += data[hdr_len + 2];
iv32 = data[hdr_len + 4] + iv32 = data[hdr_len + 4] | (data[hdr_len + 5] << 8) |
(data[hdr_len + 5] >> 8) + (data[hdr_len + 6] << 16) | (data[hdr_len + 7] << 24);
(data[hdr_len + 6] >> 16) +
(data[hdr_len + 7] >> 24);
#ifdef CONFIG_TKIP_DEBUG #ifdef CONFIG_TKIP_DEBUG
printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n", printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n",