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