PERFORCE change 65471 for review
Sam Leffler
sam at FreeBSD.org
Fri Nov 19 14:07:52 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=65471
Change 65471 by sam at 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 */
More information about the p4-projects
mailing list