socsvn commit: r257290 - in soc2013/ccqin/head/sys: dev/ath net80211

ccqin at FreeBSD.org ccqin at FreeBSD.org
Sat Sep 14 03:39:03 UTC 2013


Author: ccqin
Date: Sat Sep 14 03:39:02 2013
New Revision: 257290
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257290

Log:
  Add aggregation support and export ratectl statistics api.
  * add IEEE80211_RATECTL_INFO_AGGR to indicate aggregation scenario.
  * add iri_maxaggrsize to enable ratectl algo return max aggregation size to
    aggregation code.
  * modify ath to use the aggregation support.
  * add ieee80211_ratectl_stats() to net80211 ratectl api to print per-vap
    ratectl stats.
  * export per-vap ratectl statistics api through sysctl. when
    ieee80211_ratectl_init() is called, the api is attached.
  * export per-device ratectl statistics when the ath attach sysctl stuffs.
  * add some debug options.
  
  

Modified:
  soc2013/ccqin/head/sys/dev/ath/if_ath.c
  soc2013/ccqin/head/sys/dev/ath/if_ath_sysctl.c
  soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c
  soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c
  soc2013/ccqin/head/sys/net80211/ieee80211_freebsd.c
  soc2013/ccqin/head/sys/net80211/ieee80211_node.c
  soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c
  soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h

Modified: soc2013/ccqin/head/sys/dev/ath/if_ath.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/ath/if_ath.c	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/dev/ath/if_ath.c	Sat Sep 14 03:39:02 2013	(r257290)
@@ -4110,6 +4110,7 @@
 					bf->bf_state.bfs_pktlen,
 					ts->ts_shortretry, ts->ts_longretry,
 					ts->ts_finaltsi, ts->ts_rate);
+			rc_info->iri_flags &= ~IEEE80211_RATECTL_INFO_AGGR;	
 			ieee80211_ratectl_tx_complete(ni->ni_vap, ni, rc_info);
 		}
 		ath_tx_default_comp(sc, bf, 0);

Modified: soc2013/ccqin/head/sys/dev/ath/if_ath_sysctl.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/ath/if_ath_sysctl.c	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/dev/ath/if_ath_sysctl.c	Sat Sep 14 03:39:02 2013	(r257290)
@@ -71,6 +71,7 @@
 
 #include <net80211/ieee80211_var.h>
 #include <net80211/ieee80211_regdomain.h>
+#include <net80211/ieee80211_ratectl.h>
 #ifdef IEEE80211_SUPPORT_SUPERG
 #include <net80211/ieee80211_superg.h>
 #endif
@@ -602,6 +603,28 @@
 }
 #endif /* ATH_DEBUG_ALQ */
 
+static int
+ath_sysctl_ratectl_stats(SYSCTL_HANDLER_ARGS)
+{
+	struct ath_softc *sc = arg1;
+	struct ieee80211com *ic = sc->sc_ifp->if_l2com; 
+	struct ieee80211vap *vap;
+	int error, v;
+
+	v = 0;
+	error = sysctl_handle_int(oidp, &v, 0, req);
+	if (error || !req->newptr)
+		return error;
+
+	printf("\n[%s]: per-device net80211 ratectl statistics\n", 
+			ic->ic_ifp->if_xname);
+	TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
+		ieee80211_ratectl_stats(vap);
+	}
+		
+	return 0;
+}
+
 void
 ath_sysctlattach(struct ath_softc *sc)
 {
@@ -792,6 +815,10 @@
 #ifdef	ATH_DEBUG_ALQ
 	ath_sysctl_alq_attach(sc);
 #endif
+	
+	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+		"ratectl_stats", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
+		ath_sysctl_ratectl_stats, "I", "per-device net80211 ratectl statistics");
 }
 
 static int

Modified: soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c	Sat Sep 14 03:39:02 2013	(r257290)
@@ -1437,8 +1437,13 @@
 	rc = rc_info->iri_rc;
 	
 	bzero(rc_info, sizeof(rc_info));
+
 	if (bf->bf_state.bfs_shpream)
 		rc_info->iri_flags |= IEEE80211_RATECTL_INFO_SP;
+	if (bf->bf_state.bfs_aggr)
+		rc_info->iri_flags |= IEEE80211_RATECTL_INFO_AGGR;
+
+	rc_info->iri_framelen = bf->bf_state.bfs_pktlen;
 
 	ieee80211_ratectl_rates(ni, rc_info);
 
@@ -1568,7 +1573,8 @@
 	 * frames that must go out - eg management/raw frames.
 	 */
 	bf->bf_state.bfs_txflags |= HAL_TXDESC_CLRDMASK;
-
+	
+	bf->bf_state.bfs_aggr = 0;
 	/* Setup the descriptor before handoff */
 	ath_tx_do_ratelookup(sc, bf);
 	ath_tx_calc_duration(sc, bf);
@@ -4169,7 +4175,7 @@
 					"%s: found ratectl mbuf tag.\n", __func__);
 			rc_info = (struct ieee80211_rc_info*)(mtag + 1);
 		}
-		
+		rc_info->iri_flags &= ~IEEE80211_RATECTL_INFO_AGGR;	
 		ieee80211_ratectl_rc_info_set(rc_info,
 				1, (ts->ts_status == 0 ? 0 : 1), 
 				bf->bf_state.bfs_pktlen,
@@ -4581,6 +4587,7 @@
 			bf_first->bf_state.bfs_pktlen,
 			ts.ts_shortretry, ts.ts_longretry,
 			ts.ts_finaltsi, ts.ts_rate);
+	rc_info->iri_flags |= IEEE80211_RATECTL_INFO_AGGR;
 	ieee80211_ratectl_tx_complete(ni->ni_vap, ni, rc_info);
 
 	ATH_TX_LOCK(sc);
@@ -4995,6 +5002,7 @@
 			rc_info = (struct ieee80211_rc_info*)(mtag + 1);
 		}
 
+		rc_info->iri_flags |= IEEE80211_RATECTL_INFO_AGGR;
 		ieee80211_ratectl_rc_info_set(rc_info,
 					nframes, nbad, pktlen,
 					ts.ts_shortretry, ts.ts_longretry,
@@ -5112,6 +5120,7 @@
 			rc_info = (struct ieee80211_rc_info*)(mtag + 1);
 		}
 
+		rc_info->iri_flags &= ~IEEE80211_RATECTL_INFO_AGGR;
 		ieee80211_ratectl_rc_info_set(rc_info,
 				1, (ts.ts_status == 0 ? 0 : 1), 
 				bf->bf_state.bfs_pktlen,
@@ -5335,6 +5344,15 @@
 		}
 
 		/*
+		 * If non-aggregate scenario appears, this will be 
+		 * turned off.
+		 *
+		 * This flag is used by ath_tx_do_ratelookup() to 
+		 * distinguish aggr/non-aggr scenario.  
+		 */
+		bf->bf_state.bfs_aggr = 1;
+
+		/*
 		 * If the packet doesn't fall within the BAW (eg a NULL
 		 * data frame), schedule it directly; continue.
 		 */
@@ -5577,6 +5595,7 @@
 		/* Update CLRDMASK just before this frame is queued */
 		ath_tx_update_clrdmask(sc, tid, bf);
 
+		bf->bf_state.bfs_aggr = 0; 
 		/* Program descriptors + rate control */
 		ath_tx_do_ratelookup(sc, bf);
 		ath_tx_calc_duration(sc, bf);

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c	Sat Sep 14 03:39:02 2013	(r257290)
@@ -68,8 +68,9 @@
 static void	amrr_rates(struct ieee80211_node *, struct ieee80211_rc_info *);
 static void	amrr_tx_complete(const struct ieee80211vap *,
     			const struct ieee80211_node *, struct ieee80211_rc_info *);
-static void	amrr_tx_update(const struct ieee80211vap *vap,
+static void	amrr_tx_update(const struct ieee80211vap *,
 			const struct ieee80211_node *, void *, void *, void *);
+static void	amrr_stats(const struct ieee80211vap *);
 static void	amrr_sysctlattach(struct ieee80211vap *,
 			struct sysctl_ctx_list *, struct sysctl_oid *);
 
@@ -89,6 +90,7 @@
 	.ir_tx_complete	= amrr_tx_complete,
 	.ir_tx_update	= amrr_tx_update,
 	.ir_setinterval	= amrr_setinterval,
+	.ir_stats	= amrr_stats,
 };
 IEEE80211_RATECTL_MODULE(amrr, 1);
 IEEE80211_RATECTL_ALG(amrr, IEEE80211_RATECTL_AMRR, amrr);
@@ -336,20 +338,20 @@
 				code = ieee80211_ratectl_node_is11n(ni)? MCS(rix) : RATE(rix);
 				rc[1].rix = rt->rateCodeToIndex[code];
 			} else {
-				rc[1].rix = 0;
+				rc[1].rix = rt->rateCodeToIndex[0];
 			}
 			if (--rix >= 0) {
 				code = ieee80211_ratectl_node_is11n(ni)? MCS(rix) : RATE(rix);
 				rc[2].rix = rt->rateCodeToIndex[code];
 			} else {
-				rc[2].rix = 0;
+				rc[2].rix = rt->rateCodeToIndex[0];
 			}
-			if (rix > 0) {
+			if (rix >= 0) {
 				/* NB: only do this if we didn't already do it above */
 				code = ieee80211_ratectl_node_is11n(ni)? MCS(0) : RATE(0);
 				rc[3].rix = rt->rateCodeToIndex[code];
 			} else {
-				rc[3].rix = 0;
+				rc[3].rix = rt->rateCodeToIndex[0];
 			}
 		} else {
 			rc[0].tries = IEEE80211_RATECTL_TXMAXTRY;
@@ -357,9 +359,9 @@
 			rc[1].tries = 0;
 			rc[2].tries = 0;
 			rc[3].tries = 0;
-			rc[1].rix = 0;
-			rc[2].rix = 0;
-			rc[3].rix = 0;
+			rc[1].rix = rt->rateCodeToIndex[0];
+			rc[2].rix = rt->rateCodeToIndex[0];
+			rc[3].rix = rt->rateCodeToIndex[0];
 		}
 	}
 	IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
@@ -418,6 +420,16 @@
 	    __func__, txcnt, success, retrycnt);
 }
 
+static void
+amrr_stats(const struct ieee80211vap *vap)
+{
+	struct ieee80211_rc_stat * irs = IEEE80211_RATECTL_STAT(vap);
+	printf("tx count: %d (ok count: %d, fail count: %d)\n"
+			"retry count: %d (short retry: %d, long retry: %d)\n",
+			irs->irs_txcnt, irs->irs_txcnt - irs->irs_failcnt, irs->irs_failcnt,
+			irs->irs_retrycnt, irs->irs_shortretry, irs->irs_longretry);
+}
+
 static int
 amrr_sysctl_interval(SYSCTL_HANDLER_ARGS)
 {

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_freebsd.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_freebsd.c	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_freebsd.c	Sat Sep 14 03:39:02 2013	(r257290)
@@ -262,7 +262,7 @@
 		"driver_caps", CTLFLAG_RW, &vap->iv_caps, 0,
 		"driver capabilities");
 #ifdef IEEE80211_DEBUG
-	ieee80211_debug |= IEEE80211_MSG_RATECTL;
+	ieee80211_debug |= (IEEE80211_MSG_RATECTL|IEEE80211_MSG_NODE|IEEE80211_MSG_SCAN);
 	vap->iv_debug = ieee80211_debug;
 	if_printf(ifp, "%s: iv_debug=0x%08x\n", __func__, vap->iv_debug);
 	SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO,

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_node.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_node.c	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_node.c	Sat Sep 14 03:39:02 2013	(r257290)
@@ -1074,6 +1074,8 @@
 	ieee80211_ies_cleanup(&ni->ni_ies);
 	ieee80211_psq_cleanup(&ni->ni_psq);
 	free(ni, M_80211_NODE);
+	IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_RATECTL,
+			"%s: after free(ni, M_80211_NODE).\n", __func__);
 }
 
 static void
@@ -1733,7 +1735,7 @@
 	 * to use ni_ic below to reclaim resources.
 	 */
 #if 0
-	IEEE80211_DPRINTF(vap, IEEE80211_MSG_NODE,
+	IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
 		"%s %p<%s> in %s table\n", __func__, ni,
 		ether_sprintf(ni->ni_macaddr),
 		nt != NULL ? nt->nt_name : "<gone>");

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c	Sat Sep 14 03:39:02 2013	(r257290)
@@ -100,12 +100,33 @@
 	ratectls[type] = NULL;
 }
 
+static int
+ratectl_sysctl_stats(SYSCTL_HANDLER_ARGS)
+{
+	struct ieee80211vap *vap = arg1;
+	int error, v;
+
+	v = 0;
+	error = sysctl_handle_int(oidp, &v, 0, req);
+	if (error || !req->newptr)
+		return error;
+
+	ieee80211_ratectl_stats(vap);
+	return 0;
+}
+
 void
 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, capabilities);
+
+	SYSCTL_ADD_PROC(vap->iv_sysctl, SYSCTL_CHILDREN(vap->iv_oid), 
+			OID_AUTO, "ratectl_stats", CTLTYPE_INT | CTLFLAG_RW, 
+			vap, 0, ratectl_sysctl_stats, "I", 
+			"per-vap net80211 ratectl statistics");
+
 	IEEE80211_DPRINTF(vap, IEEE80211_MSG_RATECTL,
 	    "%s: ratectl initialized. caps=0x%08x\n",
 	    __func__, capabilities);

Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h	Fri Sep 13 23:10:53 2013	(r257289)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h	Sat Sep 14 03:39:02 2013	(r257290)
@@ -79,21 +79,23 @@
 struct ieee80211_rc_info {
 	struct ieee80211_rc_series iri_rc[IEEE80211_RATECTL_NUM];
 	uint32_t iri_framelen;
-	uint16_t iri_flags;		/* for now, just records short preamble */
+	uint16_t iri_flags;			/* See below */
+	uint16_t iri_maxaggrsize;	/* Maximum aggregate size */
 
 	/* TX info */
-	uint8_t iri_txcnt;		/* TX count */
-	uint8_t iri_okcnt;		/* TX ok with or without retry */
-	uint8_t iri_failcnt;	/* TX retry-fail count */
-	uint8_t iri_retrycnt;	/* TX retry count */
+	uint8_t iri_txcnt;			/* TX count */
+	uint8_t iri_failcnt;		/* TX retry-fail count */
+	uint8_t iri_okcnt;			/* TX ok with or without retry */
+	uint8_t iri_retrycnt;		/* TX retry count */
 	uint8_t iri_shortretry;
 	uint8_t iri_longretry;
 	uint8_t iri_finaltsi;
-	uint8_t iri_txrate;		/* hw tx rate */
+	uint8_t iri_txrate;			/* HW tx rate */
 };
 
 /* ieee80211_rc_info flags */
 #define	IEEE80211_RATECTL_INFO_SP		0x01	/* short preamble */
+#define	IEEE80211_RATECTL_INFO_AGGR		0x02	/* aggregation scenario */
 
 #define NET80211_TAG_RATECTL   1   /* net80211 ratectl state */
 
@@ -138,6 +140,7 @@
 	    			const struct ieee80211_node *,
 	    			void *, void *, void *);
 	void	(*ir_setinterval)(const struct ieee80211vap *, int);
+	void	(*ir_stats)(const struct ieee80211vap *);
 };
 
 void	ieee80211_ratectl_register(int, const struct ieee80211_ratectl *);
@@ -161,7 +164,7 @@
 	const struct ieee80211vap *vap = ni->ni_vap;
 
 	vap->iv_rate->ir_node_init(ni);
-	IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_RATECTL,
+	IEEE80211_DPRINTF(vap, IEEE80211_MSG_RATECTL,
 			"%s: net80211 ratectl node inited.\n", __func__);
 }
 
@@ -171,6 +174,8 @@
 	const struct ieee80211vap *vap = ni->ni_vap;
 
 	vap->iv_rate->ir_node_deinit(ni);
+	IEEE80211_DPRINTF(vap, IEEE80211_MSG_RATECTL,
+			"%s: net80211 ratectl node deinited.\n", __func__);
 }
 
 static int __inline
@@ -186,6 +191,13 @@
 {
 	const struct ieee80211vap *vap = ni->ni_vap;
 
+	if (rc_info->iri_flags & IEEE80211_RATECTL_INFO_AGGR) 
+		rc_info->iri_framelen = 0;
+
+	IEEE80211_DPRINTF(vap, IEEE80211_MSG_RATECTL,
+			"%s: find rate sets for %saggregation scenario.\n", __func__, 
+			(rc_info->iri_flags & IEEE80211_RATECTL_INFO_AGGR)? "" : "non-");
+
 	vap->iv_rate->ir_rates(ni, rc_info);
 	ieee80211_ratectl_complete_rcflags(ni, rc_info);
 }
@@ -214,6 +226,16 @@
 	vap->iv_rate->ir_setinterval(vap, msecs);
 }
 
+static void __inline
+ieee80211_ratectl_stats(const struct ieee80211vap *vap)
+{
+	printf("\n[%s]: net80211 ratectl statistics (%s)\n", 
+			vap->iv_ifp->if_xname, vap->iv_rate->ir_name);
+	if (vap->iv_rate->ir_stats == NULL)
+		return;
+	vap->iv_rate->ir_stats(vap);
+}
+
 static int __inline
 ieee80211_ratectl_hascap_cw40(const struct ieee80211_node *ni)
 {


More information about the svn-soc-all mailing list