Date: Fri, 19 Nov 2004 22:07:51 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 65471 for review Message-ID: <200411192207.iAJM7pXW085230@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=65471 Change 65471 by sam@sam_ebb on 2004/11/19 22:07:33 tx power support Affected files ... .. //depot/projects/wifi/sys/net80211/ieee80211.c#9 edit .. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#16 edit .. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#10 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.c#17 edit .. //depot/projects/wifi/sys/net80211/ieee80211_var.h#12 edit Differences ... ==== //depot/projects/wifi/sys/net80211/ieee80211.c#9 (text+ko) ==== @@ -130,6 +130,7 @@ if (ic->ic_lintval == 0) ic->ic_lintval = 100; /* default sleep */ ic->ic_bmisstimeout = 7*ic->ic_lintval; /* default 7 beacons */ + ic->ic_txpowlimit = IEEE80211_TXPOWER_MAX; ieee80211_node_attach(ic); ieee80211_proto_attach(ic); ==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#16 (text+ko) ==== @@ -1114,6 +1114,29 @@ } static int +ieee80211_ioctl_getstatxpow(struct ieee80211com *ic, struct ieee80211req *ireq) +{ + struct ieee80211_node *ni; + struct ieee80211req_sta_txpow txpow; + int error; + + if (ireq->i_len != sizeof(txpow)) + return EINVAL; + error = copyin(ireq->i_data, &txpow, sizeof(txpow)); + if (error != 0) + return error; + if (ic->ic_sta == NULL) + return EINVAL; + ni = ieee80211_find_node(ic->ic_sta, txpow.it_macaddr); + if (ni == NULL) + return EINVAL; /* XXX */ + txpow.it_txpow = ni->ni_txpower; + error = copyout(&txpow, ireq->i_data, sizeof(txpow)); + ieee80211_free_node(ni); + return error; +} + +static int ieee80211_ioctl_get80211(struct ieee80211com *ic, u_long cmd, struct ieee80211req *ireq) { const struct ieee80211_rsnparms *rsn = &ic->ic_bss->ni_rsn; @@ -1196,7 +1219,7 @@ case IEEE80211_IOC_TXPOWER: if ((ic->ic_caps & IEEE80211_C_TXPMGT) == 0) return EINVAL; - ireq->i_val = ic->ic_bss->ni_txpower; + ireq->i_val = ic->ic_txpowlimit; break; case IEEE80211_IOC_MCASTCIPHER: ireq->i_val = rsn->rsn_mcastcipher; @@ -1294,6 +1317,12 @@ case IEEE80211_IOC_STA_STATS: error = ieee80211_ioctl_getstastats(ic, ireq); break; + case IEEE80211_IOC_TXPOWMAX: + ireq->i_val = ic->ic_bss->ni_txpower; + break; + case IEEE80211_IOC_STA_TXPOW: + error = ieee80211_ioctl_getstatxpow(ic, ireq); + break; case IEEE80211_IOC_STA_INFO: error = ieee80211_ioctl_getstainfo(ic, ireq); break; @@ -1599,6 +1628,28 @@ } static int +ieee80211_ioctl_setstatxpow(struct ieee80211com *ic, struct ieee80211req *ireq) +{ + struct ieee80211_node *ni; + struct ieee80211req_sta_txpow txpow; + int error; + + if (ireq->i_len != sizeof(txpow)) + return EINVAL; + error = copyin(ireq->i_data, &txpow, sizeof(txpow)); + if (error != 0) + return error; + if (ic->ic_sta == NULL) + return EINVAL; + ni = ieee80211_find_node(ic->ic_sta, txpow.it_macaddr); + if (ni == NULL) + return EINVAL; /* XXX */ + ni->ni_txpower = txpow.it_txpow; + ieee80211_free_node(ni); + return error; +} + +static int cipher2cap(int cipher) { switch (cipher) { @@ -1810,7 +1861,7 @@ if (!(IEEE80211_TXPOWER_MIN < ireq->i_val && ireq->i_val < IEEE80211_TXPOWER_MAX)) return EINVAL; - ic->ic_bss->ni_txpower = ireq->i_val; + ic->ic_txpowlimit = ireq->i_val; error = IS_UP(ic) ? ic->ic_reset(ic->ic_ifp) : 0; break; case IEEE80211_IOC_ROAMING: @@ -1979,6 +2030,9 @@ case IEEE80211_IOC_MACCMD: error = ieee80211_ioctl_maccmd(ic, ireq); break; + case IEEE80211_IOC_STA_TXPOW: + error = ieee80211_ioctl_setstatxpow(ic, ireq); + break; default: error = EINVAL; break; ==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#10 (text+ko) ==== @@ -321,6 +321,14 @@ struct ieee80211req_sta_info info[1]; /* variable length */ }; +/* + * Get/set per-station tx power cap. + */ +struct ieee80211req_sta_txpow { + u_int8_t it_macaddr[IEEE80211_ADDR_LEN]; + u_int8_t it_txpow; +}; + #ifdef __FreeBSD__ /* * FreeBSD-style ioctls. @@ -362,7 +370,7 @@ #define IEEE80211_PROTMODE_OFF 0 #define IEEE80211_PROTMODE_CTS 1 #define IEEE80211_PROTMODE_RTSCTS 2 -#define IEEE80211_IOC_TXPOWER 14 +#define IEEE80211_IOC_TXPOWER 14 /* global tx power limit */ #define IEEE80211_IOC_BSSID 15 #define IEEE80211_IOC_ROAMING 16 /* roaming mode */ #define IEEE80211_IOC_PRIVACY 17 /* privacy invoked */ @@ -391,7 +399,8 @@ #define IEEE80211_IOC_STA_STATS 40 /* per-station statistics */ #define IEEE80211_IOC_MACCMD 41 /* MAC ACL operation */ #define IEEE80211_IOC_CHANINFO 42 /* channel info list */ -/* 43-44 available */ +#define IEEE80211_IOC_TXPOWMAX 43 /* max tx power for channel */ +#define IEEE80211_IOC_STA_TXPOW 44 /* per-station tx power limit */ #define IEEE80211_IOC_STA_INFO 45 /* station/neighbor info */ /* ==== //depot/projects/wifi/sys/net80211/ieee80211_node.c#17 (text+ko) ==== @@ -162,10 +162,6 @@ rsn->rsn_keymgmtset = WPA_ASE_8021X_UNSPEC | WPA_ASE_8021X_PSK; rsn->rsn_keymgmt = WPA_ASE_8021X_PSK; - ni->ni_chan = IEEE80211_CHAN_ANYC; - ni->ni_authmode = IEEE80211_AUTH_OPEN; - ni->ni_txpower = IEEE80211_TXPOWER_MAX; - ieee80211_crypto_resetkey(ic, &ni->ni_ucastkey, IEEE80211_KEYIX_NONE); ic->ic_bss = ni; ieee80211_ref_node(ic->ic_bss); /* hold reference */ ic->ic_auth = ieee80211_authenticator_get(ni->ni_authmode); @@ -886,6 +882,9 @@ IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr); hash = IEEE80211_NODE_HASH(macaddr); ieee80211_node_initref(ni); /* mark referenced */ + ni->ni_chan = IEEE80211_CHAN_ANYC; + ni->ni_authmode = IEEE80211_AUTH_OPEN; + ni->ni_txpower = ic->ic_txpowlimit; /* max power */ ieee80211_crypto_resetkey(ic, &ni->ni_ucastkey, IEEE80211_KEYIX_NONE); ni->ni_inact = nt->nt_inact_init; ==== //depot/projects/wifi/sys/net80211/ieee80211_var.h#12 (text+ko) ==== @@ -128,6 +128,7 @@ u_int16_t ic_txmin; /* min tx retry count */ u_int16_t ic_txmax; /* max tx retry count */ u_int16_t ic_txlifetime; /* tx lifetime */ + u_int16_t ic_txpowlimit; /* global tx power limit */ u_int16_t ic_bmisstimeout;/* beacon miss threshold (ms) */ u_int16_t ic_nonerpsta; /* # non-ERP stations */ u_int16_t ic_longslotsta; /* # long slot time stations */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200411192207.iAJM7pXW085230>