kern/132342: incorrect number used in for loop; fix TXPMGT reporting
Paul
onemda at gmail.com
Thu Mar 5 11:50:02 PST 2009
>Number: 132342
>Category: kern
>Synopsis: incorrect number used in for loop; fix TXPMGT reporting
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Mar 05 19:50:01 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: Paul
>Release: 8.0 CURRENT
>Organization:
>Environment:
FreeBSD 8.0-CURRENT FreeBSD 8.0-CURRENT #11 r189300: Tue Mar 3 11:47:21 UTC 2009 root at dhcppc1:/usr/obj/usr/src/sys/kernel i386
>Description:
Correct size calculation for dBm2mW conversion table in for loop.
Do not claim ndis miniport driver support TXPMGT if it doesnt(available via
OID_802_11_TX_POWER_LEVEL).
>How-To-Repeat:
>Fix:
--- /usr/src/sys/dev/if_ndis/if_ndis.c 2009-02-24 03:59:51.000000000 +0000
+++ if_ndis.c 2009-03-05 19:24:58.000000000 +0000
@@ -750,7 +750,7 @@
ic->ic_ifp = ifp;
ic->ic_opmode = IEEE80211_M_STA;
ic->ic_phytype = IEEE80211_T_DS;
- ic->ic_caps = IEEE80211_C_STA | IEEE80211_C_IBSS | IEEE80211_C_TXPMGT;
+ ic->ic_caps = IEEE80211_C_STA | IEEE80211_C_IBSS;
setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO);
len = 0;
r = ndis_get_info(sc, OID_802_11_NETWORK_TYPES_SUPPORTED,
@@ -929,6 +929,9 @@
r = ndis_get_info(sc, OID_802_11_POWER_MODE, &arg, &i);
if (r == 0)
ic->ic_caps |= IEEE80211_C_PMGT;
+ r = ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &i);
+ if (r == 0)
+ ic->ic_caps |= IEEE80211_C_TXPMGT;
bcopy(eaddr, &ic->ic_myaddr, sizeof(eaddr));
ieee80211_ifattach(ic);
ic->ic_raw_xmit = ndis_raw_xmit;
@@ -2324,7 +2327,8 @@
ndis_set_info(sc, OID_802_11_POWER_MODE, &arg, &len);
/* Set TX power */
- if (ic->ic_txpowlimit < sizeof(dBm2mW)) {
+ if ((ic->ic_caps & IEEE80211_C_TXPMGT) &&
+ (ic->ic_txpowlimit < sizeof(dBm2mW)/sizeof(dBm2mW[0]))) {
len = sizeof(arg);
arg = dBm2mW[ic->ic_txpowlimit];
ndis_set_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
@@ -2797,11 +2801,10 @@
}
/* Get TX power */
- len = sizeof(arg);
- rval = ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
-
- if (!rval) {
- for (i = 0; i < sizeof(dBm2mW); i++)
+ if (ic->ic_caps & IEEE80211_C_TXPMGT) {
+ len = sizeof(arg);
+ ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
+ for (i = 0; i < sizeof(dBm2mW)/sizeof(dBm2mW[0]); i++)
if (dBm2mW[i] >= arg)
break;
ic->ic_txpowlimit = i;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list