socsvn commit: r256474 - in soc2013/ccqin/head/sys: dev/bwi dev/bwn dev/iwn dev/ral dev/usb/wlan dev/wpi net80211

ccqin at FreeBSD.org ccqin at FreeBSD.org
Sun Aug 25 09:37:16 UTC 2013


Author: ccqin
Date: Sun Aug 25 09:37:15 2013
New Revision: 256474
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=256474

Log:
  Add per vap ratectl statistics api and put capabilities into it.
  * add struct ieee80211_rc_stat to track per vap ratectl statistics.
  * change the interface of __init__ and __node_init__. update the callers.
  * add ieee80211_ratectl_update_stat() to update the per vap rc statistics.
    it called by __complete__ of rc algo.
  * drop struct ieee80211_ratectl_node and port irn_capabilities to
    irs_capabilities in struct ieee80211_rc_stat. update the rc api and rc
    algorithms (amrr and sample), update micros that check cap using the
    capabilies field.
  

Modified:
  soc2013/ccqin/head/sys/dev/bwi/if_bwi.c
  soc2013/ccqin/head/sys/dev/bwn/if_bwn.c
  soc2013/ccqin/head/sys/dev/iwn/if_iwn.c
  soc2013/ccqin/head/sys/dev/ral/rt2560.c
  soc2013/ccqin/head/sys/dev/ral/rt2661.c
  soc2013/ccqin/head/sys/dev/ral/rt2860.c
  soc2013/ccqin/head/sys/dev/usb/wlan/if_rum.c
  soc2013/ccqin/head/sys/dev/usb/wlan/if_run.c
  soc2013/ccqin/head/sys/dev/usb/wlan/if_ural.c
  soc2013/ccqin/head/sys/dev/usb/wlan/if_zyd.c
  soc2013/ccqin/head/sys/dev/wpi/if_wpi.c
  soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c
  soc2013/ccqin/head/sys/net80211/ieee80211_amrr.h
  soc2013/ccqin/head/sys/net80211/ieee80211_node.c
  soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c
  soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h
  soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c
  soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h
  soc2013/ccqin/head/sys/net80211/ieee80211_sta.c

Modified: soc2013/ccqin/head/sys/dev/bwi/if_bwi.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/bwi/if_bwi.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/bwi/if_bwi.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -617,7 +617,8 @@
 #if 0
 	vap->iv_update_beacon = bwi_beacon_update;
 #endif
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 
 	/* complete setup */
 	ieee80211_vap_attach(vap, bwi_media_change, ieee80211_media_status);

Modified: soc2013/ccqin/head/sys/dev/bwn/if_bwn.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/bwn/if_bwn.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/bwn/if_bwn.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -2970,7 +2970,8 @@
 	/* override max aid so sta's cannot assoc when we're out of sta id's */
 	vap->iv_max_aid = BWN_STAID_MAX;
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change,

Modified: soc2013/ccqin/head/sys/dev/iwn/if_iwn.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/iwn/if_iwn.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/iwn/if_iwn.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -876,7 +876,8 @@
 	ivp->iv_newstate = vap->iv_newstate;
 	vap->iv_newstate = iwn_newstate;
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	/* Complete setup. */
 	ieee80211_vap_attach(vap, iwn_media_change, ieee80211_media_status);
 	ic->ic_opmode = opmode;

Modified: soc2013/ccqin/head/sys/dev/ral/rt2560.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/ral/rt2560.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/ral/rt2560.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -426,7 +426,8 @@
 	vap->iv_newstate = rt2560_newstate;
 	vap->iv_update_beacon = rt2560_beacon_update;
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
 	if (TAILQ_FIRST(&ic->ic_vaps) == vap)

Modified: soc2013/ccqin/head/sys/dev/ral/rt2661.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/ral/rt2661.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/ral/rt2661.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -423,7 +423,8 @@
 	vap->iv_update_beacon = rt2661_beacon_update;
 #endif
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
 	if (TAILQ_FIRST(&ic->ic_vaps) == vap)

Modified: soc2013/ccqin/head/sys/dev/ral/rt2860.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/ral/rt2860.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/ral/rt2860.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -484,7 +484,8 @@
 	/* HW supports up to 255 STAs (0-254) in HostAP and IBSS modes */
 	vap->iv_max_aid = min(IEEE80211_AID_MAX, RT2860_WCID_MAX);
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
 	if (TAILQ_FIRST(&ic->ic_vaps) == vap)

Modified: soc2013/ccqin/head/sys/dev/usb/wlan/if_rum.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/usb/wlan/if_rum.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/usb/wlan/if_rum.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -613,7 +613,8 @@
 
 	usb_callout_init_mtx(&rvp->ratectl_ch, &sc->sc_mtx, 0);
 	TASK_INIT(&rvp->ratectl_task, 0, rum_ratectl_task, rvp);
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	ieee80211_ratectl_setinterval(vap, 1000 /* 1 sec */);
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);

Modified: soc2013/ccqin/head/sys/dev/usb/wlan/if_run.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/usb/wlan/if_run.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/usb/wlan/if_run.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -820,7 +820,8 @@
 	rvp->newstate = vap->iv_newstate;
 	vap->iv_newstate = run_newstate;
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	ieee80211_ratectl_setinterval(vap, 1000 /* 1 sec */);
 
 	/* complete setup */

Modified: soc2013/ccqin/head/sys/dev/usb/wlan/if_ural.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/usb/wlan/if_ural.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/usb/wlan/if_ural.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -598,7 +598,8 @@
 
 	usb_callout_init_mtx(&uvp->ratectl_ch, &sc->sc_mtx, 0);
 	TASK_INIT(&uvp->ratectl_task, 0, ural_ratectl_task, uvp);
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	ieee80211_ratectl_setinterval(vap, 1000 /* 1 sec */);
 
 	/* complete setup */

Modified: soc2013/ccqin/head/sys/dev/usb/wlan/if_zyd.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/usb/wlan/if_zyd.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/usb/wlan/if_zyd.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -496,7 +496,8 @@
 	zvp->newstate = vap->iv_newstate;
 	vap->iv_newstate = zyd_newstate;
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	ieee80211_ratectl_setinterval(vap, 1000 /* 1 sec */);
 
 	/* complete setup */

Modified: soc2013/ccqin/head/sys/dev/wpi/if_wpi.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/wpi/if_wpi.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/dev/wpi/if_wpi.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -782,7 +782,8 @@
 	wvp->newstate = vap->iv_newstate;
 	vap->iv_newstate = wpi_newstate;
 
-	ieee80211_ratectl_init(vap);
+	/* XXX TODO fill the cap */
+	ieee80211_ratectl_init(vap, 0);
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
 	ic->ic_opmode = opmode;

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -58,9 +58,9 @@
 	((amn)->amn_txcnt > 10)
 
 static void	amrr_setinterval(const struct ieee80211vap *, int);
-static void	amrr_init(struct ieee80211vap *);
+static void	amrr_init(struct ieee80211vap *, uint32_t);
 static void	amrr_deinit(struct ieee80211vap *);
-static void	amrr_node_init(struct ieee80211_node *, uint32_t);
+static void	amrr_node_init(struct ieee80211_node *);
 static void	amrr_node_deinit(struct ieee80211_node *);
 static int	amrr_update(struct ieee80211_amrr *,
     			struct ieee80211_amrr_node *, struct ieee80211_node *);
@@ -105,7 +105,7 @@
 }
 
 static void
-amrr_init(struct ieee80211vap *vap)
+amrr_init(struct ieee80211vap *vap, uint32_t capabilities)
 {
 	struct ieee80211_amrr *amrr;
 
@@ -117,6 +117,10 @@
 		if_printf(vap->iv_ifp, "couldn't alloc ratectl structure\n");
 		return;
 	}
+
+	struct ieee80211_rc_stat * irs = IEEE80211_RATECTL_STAT(vap);
+	irs->irs_capabilities = capabilities;
+
 	amrr->amrr_min_success_threshold = IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD;
 	amrr->amrr_max_success_threshold = IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD;
 	amrr_setinterval(vap, 500 /* ms */);
@@ -130,7 +134,7 @@
 }
 
 static void
-amrr_node_init(struct ieee80211_node *ni, uint32_t capabilities)
+amrr_node_init(struct ieee80211_node *ni)
 {
 	const struct ieee80211_rateset *rs = NULL;
 	struct ieee80211vap *vap = ni->ni_vap;
@@ -149,9 +153,6 @@
 	} else
 		amn = ni->ni_rctls;
 
-	struct ieee80211_ratectl_node *irn = IEEE80211_RATECTL_NODE(ni);
-	irn->irn_capabilities = capabilities;
-	
 	amn->amn_amrr = amrr;
 	amn->amn_success = 0;
 	amn->amn_recovery = 0;
@@ -310,11 +311,17 @@
 static void
 amrr_tx_complete(const struct ieee80211vap *vap,
     const struct ieee80211_node *ni, int ok,
-    void *arg1, void *arg2 __unused)
+    void *arg1, void *arg2)
 {
 	struct ieee80211_amrr_node *amn = ni->ni_rctls;
 	int retries = *(int *)arg1;
 
+	/* XXX need to change arg2 to pointer of ieee80211_rc_info */
+	struct ieee80211_rc_info *rc_info = (struct ieee80211_rc_info*)arg2;
+
+	/* update per vap statistics */
+	ieee80211_ratectl_update_stat(vap, rc_info);
+
 	amn->amn_txcnt++;
 	if (ok)
 		amn->amn_success++;

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_amrr.h
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_amrr.h	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_amrr.h	Sun Aug 25 09:37:15 2013	(r256474)
@@ -36,6 +36,7 @@
 struct ieee80211vap;
 
 struct ieee80211_amrr {
+	struct ieee80211_rc_stat amrr_stat;
 	u_int	amrr_min_success_threshold;
 	u_int	amrr_max_success_threshold;
 	int	amrr_interval;		/* update interval (ticks) */
@@ -48,7 +49,6 @@
  * Rate control state for a given node.
  */
 struct ieee80211_amrr_node {
-	struct ieee80211_ratectl_node amn_node;
 	struct ieee80211_amrr *amn_amrr;/* backpointer */
 	int	amn_rix;		/* current rate index */
 	int	amn_ticks;		/* time of last update */

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_node.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_node.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_node.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -846,8 +846,7 @@
 	/* XXX QoS? Difficult given that WME config is specific to a master */
 
 	ieee80211_node_setuptxparms(ni);
-	/* XXX TODO fill the cap field */
-	ieee80211_ratectl_node_init(ni, 0);
+	ieee80211_ratectl_node_init(ni);
 
 	return ieee80211_sta_join1(ieee80211_ref_node(ni));
 }
@@ -1189,8 +1188,7 @@
 	IEEE80211_NOTE(vap, IEEE80211_MSG_INACT, ni,
 	    "%s: inact_reload %u", __func__, ni->ni_inact_reload);
 
-	/* XXX TODO fill the cap field */
-	ieee80211_ratectl_node_init(ni, 0);
+	ieee80211_ratectl_node_init(ni);
 
 	return ni;
 }
@@ -1230,8 +1228,7 @@
 		/* XXX optimize away */
 		ieee80211_psq_init(&ni->ni_psq, "unknown");
 
-		/* XXX TODO fill the cap field */
-		ieee80211_ratectl_node_init(ni, 0);
+		ieee80211_ratectl_node_init(ni);
 	} else {
 		/* XXX msg */
 		vap->iv_stats.is_rx_nodealloc++;
@@ -1460,8 +1457,7 @@
 #endif
 		}
 		ieee80211_node_setuptxparms(ni);
-		/* XXX TODO fill the cap field */
-		ieee80211_ratectl_node_init(ni, 0);
+		ieee80211_ratectl_node_init(ni);
 		if (ic->ic_newassoc != NULL)
 			ic->ic_newassoc(ni, 1);
 		/* XXX not right for 802.1x/WPA */
@@ -1535,8 +1531,7 @@
 		ieee80211_setup_basic_htrates(ni,
 		    ni->ni_ies.htinfo_ie);
 		ieee80211_node_setuptxparms(ni);
-		/* XXX TODO fill the cap field */
-		ieee80211_ratectl_node_init(ni, 0);
+		ieee80211_ratectl_node_init(ni);
 	}
 }
 
@@ -1563,8 +1558,7 @@
 		if (ieee80211_iserp_rateset(&ni->ni_rates))
 			ni->ni_flags |= IEEE80211_NODE_ERP;
 		ieee80211_node_setuptxparms(ni);
-		/* XXX TODO fill the cap field */
-		ieee80211_ratectl_node_init(ni, 0);
+		ieee80211_ratectl_node_init(ni);
 		if (ic->ic_newassoc != NULL)
 			ic->ic_newassoc(ni, 1);
 		/* XXX not right for 802.1x/WPA */
@@ -2534,8 +2528,7 @@
 	);
 
 	ieee80211_node_setuptxparms(ni);
-	/* XXX TODO fill the cap field */
-	ieee80211_ratectl_node_init(ni, 0);
+	ieee80211_ratectl_node_init(ni);
 	/* give driver a chance to setup state like ni_txrate */
 	if (ic->ic_newassoc != NULL)
 		ic->ic_newassoc(ni, newassoc);

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -50,6 +50,13 @@
 
 MALLOC_DEFINE(M_80211_RATECTL, "80211ratectl", "802.11 rate control");
 
+enum {
+	MCS_HT20,
+	MCS_HT20_SGI,
+	MCS_HT40,
+	MCS_HT40_SGI,
+};
+
 int max_4ms_framelen[4][32] = {
 	[MCS_HT20] = {
 		3212,  6432,  9648,  12864,  19300,  25736,  28952,  32172,
@@ -94,11 +101,11 @@
 }
 
 void
-ieee80211_ratectl_init(struct ieee80211vap *vap)
+ieee80211_ratectl_init(struct ieee80211vap *vap, uint32_t capabilities)
 {
 	if (vap->iv_rate == ratectls[IEEE80211_RATECTL_NONE])
 		ieee80211_ratectl_set(vap, IEEE80211_RATECTL_AMRR);
-	vap->iv_rate->ir_init(vap);
+	vap->iv_rate->ir_init(vap, capabilities);
 }
 
 void
@@ -123,8 +130,9 @@
 ieee80211_ratectl_complete_rcflags(struct ieee80211_node *ni,
 		struct ieee80211_rc_info *rc_info)
 {
+	struct ieee80211vap *vap = ni->ni_vap;
 	const struct ieee80211_rate_table * rt = NULL;
-	struct ieee80211_rc_series *rc = rc_info->ri_rc;
+	struct ieee80211_rc_series *rc = rc_info->iri_rc;
 	/* int shortPreamble = rc_info->ri_shortPreamble; */
 	uint8_t rate;
 	int i;
@@ -135,7 +143,7 @@
 	 * If enable rts/cts and is pre-802.11n, blank tries 1, 2, 3 
 	 */
 
-	if (! IEEE80211_RATECTL_HASCAP_MRRPROT(ni))
+	if (! IEEE80211_RATECTL_HASCAP_MRRPROT(vap))
 	{
 		for (i = 1; i < IEEE80211_RATECTL_NUM; i++)
 		{

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h	Sun Aug 25 09:37:15 2013	(r256474)
@@ -63,13 +63,6 @@
 #define HT_RC_2_MCS(_rc)    ((_rc) & 0x7f)
 #define HT_RC_2_STREAMS(_rc)    ((((_rc) & 0x78) >> 3) + 1)
 
-enum {
-	MCS_HT20,
-	MCS_HT20_SGI,
-	MCS_HT40,
-	MCS_HT40_SGI,
-};
-
 extern int max_4ms_framelen[4][32];
 
 struct ieee80211_rc_series {
@@ -81,31 +74,54 @@
 	uint16_t max4msframelen;
 };
 
-/* net80211 rate control infomation */
 struct ieee80211_rc_info {
-	struct ieee80211_rc_series ri_rc[IEEE80211_RATECTL_NUM];
-	int ri_framelen;
-	int ri_shortPreamble;
+	struct ieee80211_rc_series iri_rc[IEEE80211_RATECTL_NUM];
+	int iri_framelen;
+	int iri_shortPreamble;
 
 	/* TX info */
-	int ri_success;		/* TX success or not */
-	int ri_okcnt;		/* TX ok with or without retry */
-	int ri_failcnt;		/* TX retry-fail count */
-	int ri_txcnt;		/* TX count */
-	int ri_retrycnt;	/* TX retry count */
-	int ri_shortretry;
-	int ri_longretry;
-	int ri_finaltsi;
-	int ri_txrate;		/* hw tx rate */
+	int iri_success;	/* TX success or not */
+	int iri_okcnt;		/* TX ok with or without retry */
+	int iri_failcnt;	/* TX retry-fail count */
+	int iri_txcnt;		/* TX count */
+	int iri_retrycnt;	/* TX retry count */
+	int iri_shortretry;
+	int iri_longretry;
+	int iri_finaltsi;
+	int iri_txrate;		/* hw tx rate */
+};
+
+/* net80211 ratectl statistics. 
+ * per vap ratectl seeting must start with this common state
+ */
+struct ieee80211_rc_stat {
+	uint32_t irs_capabilities;		/* hardware capabilities offered to rc */
+
+	/* ratectl statistics */
+	uint32_t irs_txcnt;
+	uint32_t irs_failcnt
+	uint32_t irs_retrycnt;
+	uint32_t irs_shortretry;
+	uint32_t irs_longretry;
 };
 
+#define IEEE80211_RATECTL_STAT(_vap) \
+	((struct ieee80211_rc_stat *)((_vap)->iv_rs))
+
+#define	IEEE80211_RATECTL_HASCAP_MRR(_vap) \
+	(IEEE80211_RATECTL_STAT(_vap)->irs_capabilities & IEEE80211_RATECTL_CAP_MRR)
+#define	IEEE80211_RATECTL_HASCAP_MRRPROT(_vap) \
+	(IEEE80211_RATECTL_STAT(_vap)->irs_capabilities & IEEE80211_RATECTL_CAP_MRRPROT)
+#define	IEEE80211_RATECTL_HASCAP_MULTXCHAIN(_vap) \
+	(IEEE80211_RATECTL_STAT(_vap)->irs_capabilities & IEEE80211_RATECTL_CAP_MULTXCHAIN)
+
 struct ieee80211_ratectl {
 	const char *ir_name;
 	int	(*ir_attach)(const struct ieee80211vap *);
 	void	(*ir_detach)(const struct ieee80211vap *);
-	void	(*ir_init)(struct ieee80211vap *);
+	void	(*ir_init)(struct ieee80211vap *, uint32_t);
 	void	(*ir_deinit)(struct ieee80211vap *);
-	void	(*ir_node_init)(struct ieee80211_node *, uint32_t);
+	void	(*ir_node_init)(struct ieee80211_node *);
 	void	(*ir_node_deinit)(struct ieee80211_node *);
 	int	(*ir_rate)(struct ieee80211_node *, void *, uint32_t);
 	void	(*ir_rates)(struct ieee80211_node *, struct ieee80211_rc_info *);
@@ -118,27 +134,12 @@
 	void	(*ir_setinterval)(const struct ieee80211vap *, int);
 };
 
-/* per ratectl node must start with this common state */
-struct ieee80211_ratectl_node {
-	uint32_t irn_capabilities;		/* hardware capabilities offered to rc */
-};
-
-#define IEEE80211_RATECTL_NODE(_ni) \
-	((struct ieee80211_ratectl_node *)((_ni)->ni_rctls))
-
-#define	IEEE80211_RATECTL_HASCAP_MRR(_ni) \
-	(IEEE80211_RATECTL_NODE(_ni)->irn_capabilities & IEEE80211_RATECTL_CAP_MRR)
-#define	IEEE80211_RATECTL_HASCAP_MRRPROT(_ni) \
-	(IEEE80211_RATECTL_NODE(_ni)->irn_capabilities & IEEE80211_RATECTL_CAP_MRRPROT)
-#define	IEEE80211_RATECTL_HASCAP_MULTXCHAIN(_ni) \
-	(IEEE80211_RATECTL_NODE(_ni)->irn_capabilities & IEEE80211_RATECTL_CAP_MULTXCHAIN)
-
 void	ieee80211_ratectl_register(int, const struct ieee80211_ratectl *);
 void	ieee80211_ratectl_unregister(int);
-void	ieee80211_ratectl_init(struct ieee80211vap *);
+void	ieee80211_ratectl_init(struct ieee80211vap *, uint32_t);
 void	ieee80211_ratectl_set(struct ieee80211vap *, int);
 void	ieee80211_ratectl_complete_rcflags(struct ieee80211_node *, 
-		struct ieee80211_rc_info*);
+						struct ieee80211_rc_info*);
 
 MALLOC_DECLARE(M_80211_RATECTL);
 
@@ -149,11 +150,11 @@
 }
 
 static void __inline
-ieee80211_ratectl_node_init(struct ieee80211_node *ni, uint32_t capabilities)
+ieee80211_ratectl_node_init(struct ieee80211_node *ni)
 {
 	const struct ieee80211vap *vap = ni->ni_vap;
 
-	vap->iv_rate->ir_node_init(ni, capabilities);
+	vap->iv_rate->ir_node_init(ni);
 }
 
 static void __inline
@@ -238,7 +239,7 @@
 {
    return IS_VAP_HT(vap) && (vap->iv_htcaps & IEEE80211_HTCAP_TXSTBC) &&
 			    (ni->ni_htcap & IEEE80211_HTCAP_RXSTBC_1STREAM) &&
-			    IEEE80211_RATECTL_HASCAP_MULTXCHAIN(ni);
+			    IEEE80211_RATECTL_HASCAP_MULTXCHAIN(vap);
 }
 
 static int __inline
@@ -259,4 +260,16 @@
 				&ni->ni_rates;
 }
 
+static void __inline
+ieee80211_ratectl_update_stat(struct ieee80211vap *vap,
+		const struct ieee80211_rc_info *rc_info)
+{
+	struct ieee80211_rc_stat * irs = IEEE80211_RATECTL_STAT(vap);
+	irs->irs_txcnt += rc_info->iri_txcnt;
+	irs->irs_failcnt += rc_info->iri_failcnt;
+	irs->irs_retrycnt += rc_info->iri_retrycnt;
+	irs->irs_shortretry += rc_info->iri_shortretry;
+	irs->irs_longretry += rc_info->iri_longretry;
+}
+
 #endif

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -50,7 +50,7 @@
 #include <net80211/ieee80211_rc_sample.h>
 #include <net80211/ieee80211_rc_sample_txsched.h>
 
-static void	sample_init(struct ieee80211vap *);
+static void	sample_init(struct ieee80211vap *, uint32_t);
 static void	sample_deinit(struct ieee80211vap *);
 static void	sample_node_init(struct ieee80211_node *);
 static void	sample_node_deinit(struct ieee80211_node *);
@@ -83,7 +83,7 @@
 IEEE80211_RATECTL_ALG(sample, IEEE80211_RATECTL_SAMPLE, sample);
 
 static void
-sample_init(struct ieee80211vap *vap)
+sample_init(struct ieee80211vap *vap, uint32_t capabilities)
 {
 	struct ieee80211_sample *sample;
 
@@ -95,6 +95,10 @@
 		if_printf(vap->iv_ifp, "couldn't alloc ratectl structure\n");
 		return;
 	}
+
+	struct ieee80211_rc_stat * irs = IEEE80211_RATECTL_STAT(vap);
+	irs->irs_capabilities = capabilities;
+
 	sample->sample_smoothing_rate = 75;		/* ewma percentage ([0..99]) */
 	sample->sample_smoothing_minpackets = 100 / (100 - sample->sample_smoothing_rate);
 	sample->sample_rate = 10;			/* %time to try diff tx rates */
@@ -127,7 +131,7 @@
 };
 
 static void
-sample_node_init(struct ieee80211_node *ni, uint32_t capabilities)
+sample_node_init(struct ieee80211_node *ni)
 {
 #define	RATE(_ix)	(ni->ni_rates.rs_rates[(_ix)] & IEEE80211_RATE_VAL)
 #define	DOT11RATE(_ix)	(rt->info[(_ix)].dot11Rate & IEEE80211_RATE_VAL)
@@ -149,9 +153,6 @@
 		}
 	} else
 		san = ni->ni_rctls;
-
-	struct ieee80211_ratectl_node *irn = IEEE80211_RATECTL_NODE(ni);
-	irn->irn_capabilities = capabilities;
 	
 	san->san_sample = sample;
 
@@ -603,9 +604,9 @@
 		goto done;
 	}
 
-	if (IEEE80211_RATECTL_HASCAP_MRR(ni))
+	if (IEEE80211_RATECTL_HASCAP_MRR(vap))
 		mrr = 1;
-	if (! IEEE80211_RATECTL_HASCAP_MRRPROT(ni))
+	if (! IEEE80211_RATECTL_HASCAP_MRRPROT(vap))
 		mrr = 0;
 
 	best_rix = pick_best_rate(ni, rt, size_bin, !mrr);
@@ -758,7 +759,7 @@
 	struct ieee80211_sample_node *san = ni->ni_rctls;
 	uint8_t rix0 = sample_rate(ni, NULL, 0);
 	const struct txschedule *sched = &san->sched[rix0];
-	struct ieee80211_rc_series *rc = rc_info->ri_rc;
+	struct ieee80211_rc_series *rc = rc_info->iri_rc;
 
 	KASSERT(rix0 == sched->r0, ("rix0 (%x) != sched->r0 (%x)!\n",
 	    rix0, sched->r0));
@@ -895,15 +896,18 @@
 	int nframes, nbad;
 	int frame_size, mrr;
 
-	final_rix = rt->rateCodeToIndex[rc_info->ri_txrate];
-	short_tries = rc_info->ri_shortretry;
+	/* update per vap statistics */
+	ieee80211_ratectl_update_stat(vap, rc_info);
+
+	final_rix = rt->rateCodeToIndex[rc_info->iri_txrate];
+	short_tries = rc_info->iri_shortretry;
 	/* XXX why plus 1 here? */
-	long_tries = rc_info->ri_longretry + 1;
+	long_tries = rc_info->iri_longretry + 1;
 
-	nframes = rc_info->ri_txcnt;
-	nbad = rc_info->ri_failcnt;
+	nframes = rc_info->iri_txcnt;
+	nbad = rc_info->iri_failcnt;
 
-	frame_size = rc_info->ri_framelen;
+	frame_size = rc_info->iri_framelen;
 	mrr = 0;
 
 	if (nframes == 0) {
@@ -917,13 +921,13 @@
 		return;
 	}
 	
-	if (IEEE80211_RATECTL_HASCAP_MRR(ni))
+	if (IEEE80211_RATECTL_HASCAP_MRR(vap))
 		mrr = 1;
 	/* XXX check HT protmode too */
-	if (mrr && !IEEE80211_RATECTL_HASCAP_MRRPROT(ni))
+	if (mrr && !IEEE80211_RATECTL_HASCAP_MRRPROT(vap))
 		mrr = 0;
 	
-	if (!mrr || rc_info->ri_finaltsi == 0) {
+	if (!mrr || rc_info->iri_finaltsi == 0) {
 		if (!IS_RATE_DEFINED(san, final_rix)) {
 			return;
 		}
@@ -939,7 +943,7 @@
 			     nframes, nbad);
 
 	} else {
-		int finalTSIdx = rc_info->ri_finaltsi;
+		int finalTSIdx = rc_info->iri_finaltsi;
 		int i;
 
 		/*

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.h	Sun Aug 25 09:37:15 2013	(r256474)
@@ -53,6 +53,7 @@
  * Rate control settings.
  */
 struct ieee80211_sample {
+	struct ieee80211_rc_stat sample_stat;
 	int	sample_smoothing_rate;			/* ewma percentage [0..99] */
 	int	sample_smoothing_minpackets;
 	int	sample_rate;			/* %time to try different tx rates */
@@ -85,7 +86,6 @@
  */
 /* XXX change naming conversion? */
 struct ieee80211_sample_node {
-	struct ieee80211_ratectl_node san_node;	/* common state */
 	struct ieee80211_sample *san_sample;/* backpointer */
 	int static_rix;			/* rate index of fixed tx rate */
 	uint64_t ratemask;		/* bit mask of valid rate indices */

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_sta.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_sta.c	Sun Aug 25 08:56:09 2013	(r256473)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_sta.c	Sun Aug 25 09:37:15 2013	(r256474)
@@ -1636,8 +1636,7 @@
 			     IEEE80211_F_JOIN | IEEE80211_F_DOBRS);
 			ieee80211_setup_basic_htrates(ni, htinfo);
 			ieee80211_node_setuptxparms(ni);
-			/* XXX TODO fill the cap field */
-			ieee80211_ratectl_node_init(ni, 0);
+			ieee80211_ratectl_node_init(ni);
 		} else {
 #ifdef IEEE80211_SUPPORT_SUPERG
 			if (IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_ATH))


More information about the svn-soc-all mailing list