CFT: ndis, iwi, ipw users
Sam Leffler
sam at errno.com
Wed Aug 10 15:13:24 GMT 2005
Michal Mertl wrote:
> Michal Mertl wrote:
>
>>Sam Leffler wrote:
>>
>>>http://people.freebsd.org/~sam/curchan.patch
>>>
>>>has changes to resolve an issue with not recognizing when an ap moves to
>>>a different channel. It eliminates the use of ic->ic_bss->ni_chan to
>>>identify the current channel while scanning. It's been reviewed and
>>>tested ok on ath, wi, ral, and ural devices. I need folks to verify it
>>>does not break ndis, iwi, and ipw devices (there are changes for awi but
>>>so far as I know noone uses awi).
>>>
>>>I want to get this committed to HEAD soon so quick feedback on those
>>>devices would be appreciated. Thanks.
>>>
>>> Sam
>>
>>
>>My notebook with ipw still works. I have set up hostap on ath on channel
>>1 and associated the notebook to it. I then changed the channel on the
>>AP and the notebook immediately switched too.
>
>
> I've just noticed that the channel reported by ifconfig on the ipw
> station is wrong.
>
> genius1# ifconfig ipw0
> ipw0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
> inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
> ether 00:0c:f1:3e:8b:07
> media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps)
> status: associated
> ssid testap channel 1 bssid 00:0b:6b:35:dc:f0
> authmode OPEN privacy OFF txpowmax 100 bintval 100
> genius1# ifconfig ipw0 list scan
> SSID BSSID CHAN RATE S:N INT CAPS
> testap 00:0b:6b:35:dc:f0 9 11M 62:0 100 E
> genius1# ping 192.168.0.1
> PING 192.168.0.1 (192.168.0.1): 56 data bytes
> 64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=8.801 ms
> ^C
> --- 192.168.0.1 ping statistics ---
> 1 packets transmitted, 1 packets received, 0% packet loss
> round-trip min/avg/max/stddev = 8.801/8.801/8.801/0.000 ms
> genius1#
>
>
> Is this expected? I've never really checked it before.
I missed that change; thanks. IEEE80211_IOC_CHANNEL should return
ic->ic_curchan instead of using the getcurchan routine. Attached is an
updated patch for just ieee80211_ioctl.c.
Sam
-------------- next part --------------
Index: ieee80211_ioctl.c
===================================================================
RCS file: /home/ncvs/src/sys/net80211/ieee80211_ioctl.c,v
retrieving revision 1.32
diff -u -r1.32 ieee80211_ioctl.c
--- ieee80211_ioctl.c 9 Aug 2005 10:19:59 -0000 1.32
+++ ieee80211_ioctl.c 10 Aug 2005 15:12:58 -0000
@@ -252,7 +252,7 @@
break;
case WI_RID_CURRENT_CHAN:
wreq.wi_val[0] = htole16(
- ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan));
+ ieee80211_chan2ieee(ic, ic->ic_curchan));
wreq.wi_len = 1;
break;
case WI_RID_COMMS_QUALITY:
@@ -448,7 +448,6 @@
static int
ieee80211_setupscan(struct ieee80211com *ic, const u_int8_t chanlist[])
{
- int i;
/*
* XXX don't permit a scan to be started unless we
@@ -460,20 +459,6 @@
*/
if (!IS_UP(ic))
return EINVAL;
- if (ic->ic_ibss_chan == NULL ||
- isclr(chanlist, ieee80211_chan2ieee(ic, ic->ic_ibss_chan))) {
- for (i = 0; i <= IEEE80211_CHAN_MAX; i++)
- if (isset(chanlist, i)) {
- ic->ic_ibss_chan = &ic->ic_channels[i];
- goto found;
- }
- return EINVAL; /* no active channels */
-found:
- ;
- }
- if (ic->ic_bss->ni_chan == IEEE80211_CHAN_ANYC ||
- isclr(chanlist, ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan)))
- ic->ic_bss->ni_chan = ic->ic_ibss_chan;
memcpy(ic->ic_chan_active, chanlist, sizeof(ic->ic_chan_active));
/*
* We force the state to INIT before calling ieee80211_new_state
@@ -827,18 +812,6 @@
return error;
}
-static struct ieee80211_channel *
-getcurchan(struct ieee80211com *ic)
-{
- switch (ic->ic_state) {
- case IEEE80211_S_INIT:
- case IEEE80211_S_SCAN:
- return ic->ic_des_chan;
- default:
- return ic->ic_ibss_chan;
- }
-}
-
static int
cap2cipher(int flag)
{
@@ -1351,7 +1324,7 @@
ireq->i_val = ic->ic_bss->ni_authmode;
break;
case IEEE80211_IOC_CHANNEL:
- ireq->i_val = ieee80211_chan2ieee(ic, getcurchan(ic));
+ ireq->i_val = ieee80211_chan2ieee(ic, ic->ic_curchan);
break;
case IEEE80211_IOC_POWERSAVE:
if (ic->ic_flags & IEEE80211_F_PMGTON)
@@ -1841,9 +1814,6 @@
;
}
memcpy(ic->ic_chan_active, chanlist, sizeof(ic->ic_chan_active));
- if (ic->ic_bss->ni_chan == IEEE80211_CHAN_ANYC ||
- isclr(chanlist, ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan)))
- ic->ic_bss->ni_chan = ic->ic_ibss_chan;
return IS_UP_AUTO(ic) ? ENETRESET : 0;
}
More information about the freebsd-current
mailing list