From owner-svn-soc-all@FreeBSD.ORG Mon Sep 2 07:43:31 2013 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 889B7E94 for ; Mon, 2 Sep 2013 07:43:31 +0000 (UTC) (envelope-from ccqin@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 73A9824AD for ; Mon, 2 Sep 2013 07:43:31 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.7/8.14.7) with ESMTP id r827hVWB052137 for ; Mon, 2 Sep 2013 07:43:31 GMT (envelope-from ccqin@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.7/8.14.6/Submit) id r827hVKi052129 for svn-soc-all@FreeBSD.org; Mon, 2 Sep 2013 07:43:31 GMT (envelope-from ccqin@FreeBSD.org) Date: Mon, 2 Sep 2013 07:43:31 GMT Message-Id: <201309020743.r827hVKi052129@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to ccqin@FreeBSD.org using -f From: ccqin@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r256824 - in soc2013/ccqin/head/sys: dev/ath net80211 sys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Sep 2013 07:43:31 -0000 Author: ccqin Date: Mon Sep 2 07:43:31 2013 New Revision: 256824 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=256824 Log: teach ieee80211_amrr to return multiple rates and modify ath to use net80211_ratectl. * add amrr_rates to teach ieee80211_amrr of multiple rate. * change ieee80211_ratectl_complete(), drop stats, arg1, arg2, add ieee80211_rc_info *. adapt amrr_tx_complete correspondingly. * update ieee80211_ratectl_hascap_* functions to make it more reasonable. * modify ieee80211_ratectl_complete_rcflags() to let it work properly. we just care about rc flags here. ratecode is left for drivers to fill. * add a 48 bytes buf to mbuf(m_hdr) to record rc state. * modify ath to make it use net80211_ratectl api. Modified: soc2013/ccqin/head/sys/dev/ath/if_ath.c soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c soc2013/ccqin/head/sys/dev/ath/if_ath_tx_ht.c soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h soc2013/ccqin/head/sys/sys/mbuf.h Modified: soc2013/ccqin/head/sys/dev/ath/if_ath.c ============================================================================== --- soc2013/ccqin/head/sys/dev/ath/if_ath.c Mon Sep 2 06:41:54 2013 (r256823) +++ soc2013/ccqin/head/sys/dev/ath/if_ath.c Mon Sep 2 07:43:31 2013 (r256824) @@ -1380,6 +1380,15 @@ } ATH_UNLOCK(sc); + uint32_t caps = 0; + if (sc->sc_mrretry) + caps |= IEEE80211_RATECTL_CAP_MRR; + if (sc->sc_mrrprot) + caps |= IEEE80211_RATECTL_CAP_MRRPROT; + if (sc->sc_txchainmask > 1) + caps |= IEEE80211_RATECTL_CAP_MULTXCHAIN; + + ieee80211_ratectl_init(vap, caps); /* complete setup */ ieee80211_vap_attach(vap, ath_media_change, ieee80211_media_status); return vap; @@ -1414,6 +1423,7 @@ ath_stoprecv(sc, 1); /* stop recv side */ } + ieee80211_ratectl_deinit(vap); ieee80211_vap_detach(vap); /* @@ -4072,6 +4082,13 @@ bf->bf_state.bfs_rc, ts, bf->bf_state.bfs_pktlen, 1, (ts->ts_status == 0 ? 0 : 1)); + + struct ieee80211_rc_info *rc_info = IEEE80211_RATECTL_INFO(bf->bf_m); + ieee80211_ratectl_rc_info_set(rc_info, + 1, (ts->ts_status == 0 ? 0 : 1), bf->bf_state.bfs_pktlen, + ts->ts_shortretry, ts->ts_longretry, + ts->ts_finaltsi, ts->ts_rate); + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, rc_info); } ath_tx_default_comp(sc, bf, 0); } else Modified: soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c ============================================================================== --- soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c Mon Sep 2 06:41:54 2013 (r256823) +++ soc2013/ccqin/head/sys/dev/ath/if_ath_tx.c Mon Sep 2 07:43:31 2013 (r256824) @@ -1395,7 +1395,7 @@ /* Get rid of any previous state */ bzero(bf->bf_state.bfs_rc, sizeof(bf->bf_state.bfs_rc)); - +#if 0 ATH_NODE_LOCK(ATH_NODE(bf->bf_node)); ath_rate_findrate(sc, ATH_NODE(bf->bf_node), bf->bf_state.bfs_shpream, bf->bf_state.bfs_pktlen, &rix, &try0, &rate); @@ -1409,6 +1409,20 @@ ath_rate_getxtxrates(sc, ATH_NODE(bf->bf_node), rix, bf->bf_state.bfs_rc); ATH_NODE_UNLOCK(ATH_NODE(bf->bf_node)); +#endif + /* net80211 ratectl */ + struct ieee80211_rc_info *rc_info = IEEE80211_RATECTL_INFO(bf->bf_m); + struct ieee80211_rc_series *rc = rc_info->iri_rc; + struct ieee80211_node *ni = bf->bf_node; + bzero(rc_info, sizeof(rc_info)); + if (bf->bf_state.bfs_shpream) + rc_info->iri_flags |= IEEE80211_RATECTL_INFO_SP; + + ieee80211_ratectl_rates(ni, rc_info); + + rix = rc[0].rix; + try0 = rc[0].tries; + rate = ni->ni_txrate; sc->sc_txrix = rix; /* for LED blinking */ sc->sc_lastdatarix = rix; /* for fast frames */ @@ -4108,10 +4122,19 @@ * during a hw queue drain and the frame wanted an ACK. */ if (fail == 0 && ((bf->bf_state.bfs_txflags & HAL_TXDESC_NOACK) == 0)) + { ath_tx_update_ratectrl(sc, ni, bf->bf_state.bfs_rc, ts, bf->bf_state.bfs_pktlen, 1, (ts->ts_status == 0) ? 0 : 1); + struct ieee80211_rc_info *rc_info = IEEE80211_RATECTL_INFO(bf->bf_m); + ieee80211_ratectl_rc_info_set(rc_info, + 1, (ts->ts_status == 0 ? 0 : 1), bf->bf_state.bfs_pktlen, + ts->ts_shortretry, ts->ts_longretry, + ts->ts_finaltsi, ts->ts_rate); + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, rc_info); + } + ath_tx_default_comp(sc, bf, fail); } @@ -4490,6 +4513,13 @@ bf_first->bf_state.bfs_pktlen, bf_first->bf_state.bfs_nframes, bf_first->bf_state.bfs_nframes); + struct ieee80211_rc_info *rc_info = IEEE80211_RATECTL_INFO(bf->bf_m); + ieee80211_ratectl_rc_info_set(rc_info, + bf_first->bf_state.bfs_nframes, bf_first->bf_state.bfs_nframes, + bf->bf_state.bfs_pktlen, + ts->ts_shortretry, ts->ts_longretry, + ts->ts_finaltsi, ts->ts_rate); + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, rc_info); ATH_TX_LOCK(sc); tap = ath_tx_get_tx_tid(an, tid->tid); sc->sc_stats.ast_tx_aggr_failall++; @@ -4873,9 +4903,18 @@ * control code. */ if (fail == 0) + { ath_tx_update_ratectrl(sc, ni, rc, &ts, pktlen, nframes, nbad); + struct ieee80211_rc_info *rc_info = IEEE80211_RATECTL_INFO(bf->bf_m); + ieee80211_ratectl_rc_info_set(rc_info, + nframes, nbad, pktlen, + ts->ts_shortretry, ts->ts_longretry, + ts->ts_finaltsi, ts->ts_rate); + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, rc_info); + } + /* * send bar if we dropped any frames */ @@ -4962,11 +5001,19 @@ * Do it outside of the TXQ lock. */ if (fail == 0 && ((bf->bf_state.bfs_txflags & HAL_TXDESC_NOACK) == 0)) + { ath_tx_update_ratectrl(sc, ni, bf->bf_state.bfs_rc, &bf->bf_status.ds_txstat, bf->bf_state.bfs_pktlen, 1, (ts.ts_status == 0) ? 0 : 1); + struct ieee80211_rc_info *rc_info = IEEE80211_RATECTL_INFO(bf->bf_m); + ieee80211_ratectl_rc_info_set(rc_info, + 1, (ts->ts_status == 0 ? 0 : 1), bf->bf_state.bfs_pktlen, + ts->ts_shortretry, ts->ts_longretry, + ts->ts_finaltsi, ts->ts_rate); + ieee80211_ratectl_tx_complete(ni->ni_vap, ni, rc_info); + } /* * This is called early so atid->hwq_depth can be tracked. * This unfortunately means that it's released and regrabbed Modified: soc2013/ccqin/head/sys/dev/ath/if_ath_tx_ht.c ============================================================================== --- soc2013/ccqin/head/sys/dev/ath/if_ath_tx_ht.c Mon Sep 2 06:41:54 2013 (r256823) +++ soc2013/ccqin/head/sys/dev/ath/if_ath_tx_ht.c Mon Sep 2 07:43:31 2013 (r256824) @@ -221,13 +221,34 @@ void ath_tx_rate_fill_rcflags(struct ath_softc *sc, struct ath_buf *bf) { - struct ieee80211_node *ni = bf->bf_node; - struct ieee80211com *ic = ni->ni_ic; + // struct ieee80211_node *ni = bf->bf_node; + // struct ieee80211com *ic = ni->ni_ic; const HAL_RATE_TABLE *rt = sc->sc_currates; - struct ath_rc_series *rc = bf->bf_state.bfs_rc; + struct ath_rc_series *ath_rc = bf->bf_state.bfs_rc; + struct ieee80211_rc_info *rc_info = IEEE80211_RATECTL_INFO(bf->bf_m); + struct ieee80211_rc_series *rc = rc_info->iri_rc; uint8_t rate; int i; + for (i = 0; i < IEEE80211_RATECTL_NUM; i++) { + if (rc[i].tries == 0) + continue; + + rate = rt->info[rc[i].rix].rateCode; + if (rc[i].flags & IEEE80211_RATECTL_FLAG_SP) + rate |= rt->info[rc[i].rix].shortPreamble; + + rc[i].ratecode = rate; + + ath_rc[i].rix = rc[i].rix; + ath_rc[i].tries = rc[i].tries; + ath_rc[i].flags = rc[i].flags; + ath_rc[i].ratecode = rc[i].ratecode; + ath_rc[i].tx_power_cap = rc[i].tx_power_cap; + ath_rc[i].max4msframelen = rc[i].max4msframelen; + } + +#if 0 for (i = 0; i < ATH_RC_NUM; i++) { rc[i].flags = 0; if (rc[i].tries == 0) @@ -325,6 +346,7 @@ "%s: i=%d, rate=0x%x, flags=0x%x, max4ms=%d\n", __func__, i, rate, rc[i].flags, rc[i].max4msframelen); } +#endif } /* Modified: soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c Mon Sep 2 06:41:54 2013 (r256823) +++ soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c Mon Sep 2 07:43:31 2013 (r256824) @@ -65,9 +65,9 @@ static int amrr_update(struct ieee80211_amrr *, struct ieee80211_amrr_node *, struct ieee80211_node *); static int amrr_rate(struct ieee80211_node *, void *, uint32_t); +static int amrr_rates(struct ieee80211_node *, struct ieee80211_rc_info *); static void amrr_tx_complete(const struct ieee80211vap *, - const struct ieee80211_node *, int, - void *, void *); + const struct ieee80211_node *, struct ieee80211_rc_info *); static void amrr_tx_update(const struct ieee80211vap *vap, const struct ieee80211_node *, void *, void *, void *); static void amrr_sysctlattach(struct ieee80211vap *, @@ -85,6 +85,7 @@ .ir_node_init = amrr_node_init, .ir_node_deinit = amrr_node_deinit, .ir_rate = amrr_rate, + .ir_rates = amrr_rates, .ir_tx_complete = amrr_tx_complete, .ir_tx_update = amrr_tx_update, .ir_setinterval = amrr_setinterval, @@ -303,6 +304,69 @@ return rix; } +static void +amrr_rates(struct ieee80211_node *ni, struct ieee80211_rc_info *rc_info) +{ +#define RATE(_ix) (rs->rs_rates[(_ix)] & IEEE80211_RATE_VAL) +#define MCS(_ix) (rs->rs_rates[(_ix)] | IEEE80211_RATE_MCS) + + struct ieee80211_amrr_node *amn = ni->ni_rctls; + struct ieee80211_amrr *amrr = amn->amn_amrr; + struct ieee80211_rc_series *rc = rc_info->iri_rc; + const struct ieee80211_rateset *rs = NULL; + const struct ieee80211_rate_table *rt = NULL; + int rix, code; + + rs = ieee80211_ratectl_get_rateset(ni); + rt = ieee80211_get_ratetable(ni->ni_ic->ic_curchan); + + rix = amrr_rate(ni, NULL, 0); + + rc[0].flags = rc[1].flags = rc[2].flags = rc[3].flags = 0; + + if (rs->rs_nrates > 0) { + code = ieee80211_ratectl_node_is11n(ni)? MCS(rix) : RATE(rix); + rc[0].rix = rt->rateCodeToIndex[code]; + + if (IEEE80211_RATECTL_HASCAP_MRR(ni->ni_vap)) { + rc[0].tries = 1; + rc[1].tries = 1; + rc[2].tries = 1; + rc[3].tries = 1; + if (--rix >= 0) { + code = ieee80211_ratectl_node_is11n(ni)? MCS(rix) : RATE(rix); + rc[1].rix = rt->rateCodeToIndex[code]; + } else { + rc[1].rix = 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; + } + 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; + } + } else { + rc[0].tries = IEEE80211_RATECTL_TXMAXTRY; + + rc[1].tries = 0; + rc[2].tries = 0; + rc[3].tries = 0; + rc[1].rix = 0; + rc[2].rix = 0; + rc[3].rix = 0; + } + } +#undef RATE +#undef MCS +} + /* * Update statistics with tx complete status. Ok is non-zero * if the packet is known to be ACK'd. Retries has the number @@ -310,22 +374,16 @@ */ static void amrr_tx_complete(const struct ieee80211vap *vap, - const struct ieee80211_node *ni, int ok, - void *arg1, void *arg2) + const struct ieee80211_node *ni, struct ieee80211_rc_info *rc_info) { 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++; - amn->amn_retrycnt += retries; + amn->amn_txcnt += rc_info->iri_txcnt; + amn->amn_success += (rc_info->iri_txcnt - rc_info->failcnt); + amn->amn_retrycnt += rc_info->retrycnt; } /* Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c Mon Sep 2 06:41:54 2013 (r256823) +++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c Mon Sep 2 07:43:31 2013 (r256824) @@ -131,9 +131,8 @@ 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->iri_rc; - /* int shortPreamble = rc_info->ri_shortPreamble; */ + const struct ieee80211_rate_table * rt = NULL; uint8_t rate; int i; @@ -160,30 +159,27 @@ rate = rt->info[rc[i].rix].dot11Rate; - /* - * Only enable short preamble for legacy rates - */ - - /* XXX how we get the non_ht ratecode here? */ - - #if 0 - if ((! IS_HT_RATE(rate)) && shortPreamble) - rate |= rt->info[rc[i].rix].shortPreamble; - #endif + /* Only enable dual-stream, shortgi, 2040 if HT is set */ - /* - * Save this, used by the TX and completion code - */ - rc[i].ratecode = rate; - - /* Only enable shortgi, 2040, dual-stream if HT is set */ if (IS_HT_RATE(rate)) { rc[i].flags |= IEEE80211_RATECTL_FLAG_HT; + if (ieee80211_ratectl_hascap_cw40(vap, ni)) + rc[i].flags |= IEEE80211_RATECTL_FLAG_CW40; + + if (ieee80211_ratectl_hascap_shortgi(vap, ni)) + rc[i].flags |= IEEE80211_RATECTL_FLAG_SGI; /* - * XXX TODO: LDPC + * If we have STBC TX enabled and the receiver + * can receive (at least) 1 stream STBC, AND it's + * MCS 0-7, AND we have at least two chains enabled, + * enable STBC. */ - + if (ieee80211_ratectl_hascap_stbc(vap, ni) && + (rate & IEEE80211_RATE_VAL) < 8 && + HT_RC_2_STREAMS(rate) == 1) + rc[i].flags |= IEEE80211_RATECTL_FLAG_STBC; + /* * Dual / Triple stream rate? */ @@ -191,6 +187,35 @@ rc[i].flags |= IEEE80211_RATECTL_FLAG_DS; else if (HT_RC_2_STREAMS(rate) == 3) rc[i].flags |= IEEE80211_RATECTL_FLAG_TS; + + /* + * Calculate the maximum 4ms frame length based + * on the MCS rate, SGI and channel width flags. + */ + if (HT_RC_2_MCS(rate) < 32) { + int j; + if (rc[i].flags & IEEE80211_RATECTL_FLAG_CW40) { + if (rc[i].flags & IEEE80211_RATECTL_FLAG_SGI) + j = MCS_HT40_SGI; + else + j = MCS_HT40; + } else { + if (rc[i].flags & IEEE80211_RATECTL_FLAG_SGI) + j = MCS_HT20_SGI; + else + j = MCS_HT20; + } + rc[i].max4msframelen = + max_4ms_framelen[j][HT_RC_2_MCS(rate)]; + } + } else { + rc[i].max4msframelen = 0; + + /* + * Only enable short preamble for legacy rates + */ + if (rc_info->iri_flags & IEEE80211_RATECTL_INFO_SP) + rc[i].flags |= IEEE80211_RATECTL_FLAG_SP; } /* @@ -200,28 +225,6 @@ */ rc[i].tx_power_cap = ieee80211_get_node_txpower(ni); - /* - * Calculate the maximum 4ms frame length based - * on the MCS rate, SGI and channel width flags. - */ - if ((rc[i].flags & IEEE80211_RATECTL_FLAG_HT) && - (HT_RC_2_MCS(rate) < 32)) { - int j; - if (rc[i].flags & IEEE80211_RATECTL_FLAG_CW40) { - if (rc[i].flags & IEEE80211_RATECTL_FLAG_SGI) - j = MCS_HT40_SGI; - else - j = MCS_HT40; - } else { - if (rc[i].flags & IEEE80211_RATECTL_FLAG_SGI) - j = MCS_HT20_SGI; - else - j = MCS_HT20; - } - rc[i].max4msframelen = - max_4ms_framelen[j][HT_RC_2_MCS(rate)]; - } else - rc[i].max4msframelen = 0; } } Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h Mon Sep 2 06:41:54 2013 (r256823) +++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h Mon Sep 2 07:43:31 2013 (r256824) @@ -44,6 +44,7 @@ #define IEEE80211_RATECTL_FALSE 0 #define IEEE80211_RATECTL_NUM 4 +#define IEEE80211_RATECTL_TXMAXTRY 11 #define IEEE80211_RATECTL_FLAG_DS 0x01 /* dual-stream rate */ #define IEEE80211_RATECTL_FLAG_CW40 0x02 /* use HT40 */ @@ -52,6 +53,7 @@ #define IEEE80211_RATECTL_FLAG_RTSCTS 0x10 /* enable RTS/CTS protection */ #define IEEE80211_RATECTL_FLAG_STBC 0x20 /* enable STBC */ #define IEEE80211_RATECTL_FLAG_TS 0x40 /* triple-stream rate */ +#define IEEE80211_RATECTL_FLAG_SP 0x80 /* short preamble */ /* Hardware CAPs offered to rate control algo */ #define IEEE80211_RATECTL_CAP_MRR 0x01 /* support MRR */ @@ -76,23 +78,28 @@ struct ieee80211_rc_info { struct ieee80211_rc_series iri_rc[IEEE80211_RATECTL_NUM]; - int iri_framelen; - int iri_shortPreamble; + uint32_t iri_framelen; + uint16_t iri_flags; /* for now, just records short preamble */ /* TX info */ - 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 */ + 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_shortretry; + uint8_t iri_longretry; + uint8_t iri_finaltsi; + uint8_t iri_txrate; /* hw tx rate */ }; -/* net80211 ratectl statistics. - * per vap ratectl seeting must start with this common state +/* ieee80211_rc_info flags */ +#define IEEE80211_RATECTL_INFO_SP 0x01 /* short preamble */ + +#define IEEE80211_RATECTL_INFO(_m) ((struct ieee80211_rc_info *)(_m)->m_ccb) + +/* + * 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 */ @@ -126,8 +133,7 @@ int (*ir_rate)(struct ieee80211_node *, void *, uint32_t); void (*ir_rates)(struct ieee80211_node *, struct ieee80211_rc_info *); void (*ir_tx_complete)(const struct ieee80211vap *, - const struct ieee80211_node *, int, - void *, void *); + const struct ieee80211_node *, struct ieee80211_rc_info *); void (*ir_tx_update)(const struct ieee80211vap *, const struct ieee80211_node *, void *, void *, void *); @@ -184,9 +190,9 @@ static void __inline ieee80211_ratectl_tx_complete(const struct ieee80211vap *vap, - const struct ieee80211_node *ni, int status, void *arg1, void *arg2) + const struct ieee80211_node *ni, struct ieee80211_rc_info *rc_info) { - vap->iv_rate->ir_tx_complete(vap, ni, status, arg1, arg2); + vap->iv_rate->ir_tx_complete(vap, ni, rc_info); } static void __inline @@ -207,39 +213,40 @@ } static int __inline -ieee80211_ratectl_hascap_cw40(const struct ieee80211vap *vap, - const struct ieee80211_node *ni) +ieee80211_ratectl_hascap_cw40(const struct ieee80211_node *ni) { - return IS_VAP_HT(vap) && (ni->ni_chw == 40); + return ni->ni_chw == 40; } static int __inline -ieee80211_ratectl_hascap_shortgi(const struct ieee80211vap *vap, - const struct ieee80211_node *ni) +ieee80211_ratectl_hascap_shortgi(const struct ieee80211_node *ni) { - if (IS_VAP_HT(vap)) - { - if (ni->ni_chw == 40 && - vap->iv_htcaps & IEEE80211_HTCAP_SHORTGI40 && - ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40) - return IEEE80211_RATECTL_TRUE; - - if (ni->ni_chw == 20 && - vap->iv_htcaps & IEEE80211_HTCAP_SHORTGI20 && - ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) - return IEEE80211_RATECTL_TRUE; - } + struct ieee80211com *ic = ni->ni_ic; + + if (ni->ni_chw == 40 && + ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI40 && + ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40) + return IEEE80211_RATECTL_TRUE; + + if (ni->ni_chw == 20 && + ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI20 && + ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) + return IEEE80211_RATECTL_TRUE; + return IEEE80211_RATECTL_FALSE; } - static int __inline -ieee80211_ratectl_hascap_stbc(const struct ieee80211vap *vap, - const struct ieee80211_node *ni) +ieee80211_ratectl_hascap_stbc(const struct ieee80211_node *ni) { - return IS_VAP_HT(vap) && (vap->iv_htcaps & IEEE80211_HTCAP_TXSTBC) && - (ni->ni_htcap & IEEE80211_HTCAP_RXSTBC_1STREAM) && - IEEE80211_RATECTL_HASCAP_MULTXCHAIN(vap); + struct ieee80211com *ic = ni->ni_ic; + + if (ic->ic_htcaps & IEEE80211_HTCAP_TXSTBC && + ni->ni_htcap & IEEE80211_HTCAP_RXSTBC_1STREAM && + IEEE80211_RATECTL_HASCAP_MULTXCHAIN(ni->ni_vap)) + return IEEE80211_RATECTL_TRUE; + + return IEEE80211_RATECTL_FALSE; } static int __inline @@ -272,4 +279,21 @@ irs->irs_longretry += rc_info->iri_longretry; } +static void __inline +ieee80211_ratectl_rc_info_set(struct ieee80211_rc_info *rc_info, + uint8_t txcnt, uint8_t failcnt, uint32_t framelen, + uint8_t shortretry, uint8_t longretry, + uint8_t finaltsi, uint8_t txrate) +{ + rc_info->iri_txcnt = txcnt; + rc_info->iri_failcnt = failcnt; + rc_info->iri_okcnt = txcnt - failcnt; + rc_info->iri_framelen = framelen; + rc_info->iri_shortretry = shortretry; + rc_info->iri_longretry = longretry; + rc_info->iri_retrycnt = shortretry + longretry; + rc_info->iri_finaltsi = finaltsi; + rc_info->iri_txrate = txrate; +} + #endif Modified: soc2013/ccqin/head/sys/sys/mbuf.h ============================================================================== --- soc2013/ccqin/head/sys/sys/mbuf.h Mon Sep 2 06:41:54 2013 (r256823) +++ soc2013/ccqin/head/sys/sys/mbuf.h Mon Sep 2 07:43:31 2013 (r256824) @@ -95,6 +95,7 @@ caddr_t mh_data; /* location of data */ int mh_len; /* amount of data in this mbuf */ int mh_flags; /* flags; see below */ + uint8_t mh_ccb[48]; /* common control block */ short mh_type; /* type of data in this mbuf */ uint8_t pad[M_HDR_PAD];/* word align */ }; @@ -173,6 +174,7 @@ #define m_type m_hdr.mh_type #define m_flags m_hdr.mh_flags #define m_nextpkt m_hdr.mh_nextpkt +#define m_ccb m_hdr.mh_ccb #define m_act m_nextpkt #define m_pkthdr M_dat.MH.MH_pkthdr #define m_ext M_dat.MH.MH_dat.MH_ext