From owner-svn-soc-all@FreeBSD.ORG Thu Aug 15 09:07:05 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 AFDC665E for ; Thu, 15 Aug 2013 09:07:05 +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 9C2A8212D for ; Thu, 15 Aug 2013 09:07:05 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7F975eL007991 for ; Thu, 15 Aug 2013 09:07:05 GMT (envelope-from ccqin@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.7/8.14.6/Submit) id r7F975tk007967 for svn-soc-all@FreeBSD.org; Thu, 15 Aug 2013 09:07:05 GMT (envelope-from ccqin@FreeBSD.org) Date: Thu, 15 Aug 2013 09:07:05 GMT Message-Id: <201308150907.r7F975tk007967@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: r255969 - soc2013/ccqin/head/sys/net80211 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: Thu, 15 Aug 2013 09:07:05 -0000 Author: ccqin Date: Thu Aug 15 09:07:05 2013 New Revision: 255969 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255969 Log: Some error fixed and come functions added. * fix the error refering rateCode of ieee80211_rate_table. * add ieee80211_ratectl_[node_is11n|get_rateset] to the ratectl api. rc algos all need these functions. * change the naming conversion of IEEE80211_RATECTL_FLAG_*. Modified: 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/net80211/ieee80211_rc_sample.c Modified: soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c Thu Aug 15 08:21:00 2013 (r255968) +++ soc2013/ccqin/head/sys/net80211/ieee80211_amrr.c Thu Aug 15 09:07:05 2013 (r255969) @@ -130,7 +130,7 @@ } static int -amrr_node_is_11n(struct ieee80211_node *ni) +ieee80211_ratectl_node_is11n(struct ieee80211_node *ni) { if (ni->ni_chan == NULL) @@ -169,23 +169,13 @@ amn->amn_txcnt = amn->amn_retrycnt = 0; amn->amn_success_threshold = amrr->amrr_min_success_threshold; - /* 11n or not? Pick the right rateset */ - if (amrr_node_is_11n(ni)) { - /* XXX ew */ - IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, - "%s: 11n node", __func__); - rs = (struct ieee80211_rateset *) &ni->ni_htrates; - } else { - IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, - "%s: non-11n node", __func__); - rs = &ni->ni_rates; - } + rs = ieee80211_ratectl_get_rateset(ni); /* Initial rate - lowest */ rate = rs->rs_rates[0]; /* XXX clear the basic rate flag if it's not 11n */ - if (! amrr_node_is_11n(ni)) + if (! ieee80211_ratectl_node_is11n(ni)) rate &= IEEE80211_RATE_VAL; /* pick initial rate from the rateset - HT or otherwise */ @@ -193,7 +183,7 @@ amn->amn_rix--) { /* legacy - anything < 36mbit, stop searching */ /* 11n - stop at MCS4 / MCS12 / MCS28 */ - if (amrr_node_is_11n(ni) && + if (ieee80211_ratectl_node_is11n(ni) && (rs->rs_rates[amn->amn_rix] & 0x7) < 4) break; else if ((rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL) <= 72) @@ -202,7 +192,7 @@ } /* if the rate is an 11n rate, ensure the MCS bit is set */ - if (amrr_node_is_11n(ni)) + if (ieee80211_ratectl_node_is11n(ni)) rate |= IEEE80211_RATE_MCS; /* Assign initial rate from the rateset */ @@ -230,13 +220,8 @@ KASSERT(is_enough(amn), ("txcnt %d", amn->amn_txcnt)); - /* 11n or not? Pick the right rateset */ - if (amrr_node_is_11n(ni)) { - /* XXX ew */ - rs = (struct ieee80211_rateset *) &ni->ni_htrates; - } else { - rs = &ni->ni_rates; - } + rs = ieee80211_ratectl_get_rateset(ni); + IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, "AMRR: current rate %d, txcnt=%d, retrycnt=%d", @@ -308,13 +293,7 @@ const struct ieee80211_rateset *rs = NULL; int rix; - /* 11n or not? Pick the right rateset */ - if (amrr_node_is_11n(ni)) { - /* XXX ew */ - rs = (struct ieee80211_rateset *) &ni->ni_htrates; - } else { - rs = &ni->ni_rates; - } + rs = ieee80211_ratectl_get_rateset(ni); if (is_enough(amn) && (ticks - amn->amn_ticks) > amrr->amrr_interval) { rix = amrr_update(amrr, amn, ni); @@ -322,7 +301,7 @@ /* update public rate */ ni->ni_txrate = rs->rs_rates[rix]; /* XXX strip basic rate flag from txrate, if non-11n */ - if (amrr_node_is_11n(ni)) + if (ieee80211_ratectl_node_is11n(ni)) ni->ni_txrate |= IEEE80211_RATE_MCS; else ni->ni_txrate &= IEEE80211_RATE_VAL; Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c Thu Aug 15 08:21:00 2013 (r255968) +++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c Thu Aug 15 09:07:05 2013 (r255969) @@ -123,13 +123,15 @@ ieee80211_ratectl_complete_rcflags(struct ieee80211_node *ni, struct ieee80211_rc_info *rc_info) { + const struct ieee80211_rate_table * rt = NULL; const struct ieee80211com *ic = ni->ni_ic; - const struct ieee80211_rate_table * rt = ic->ic_rt; struct ieee80211_rc_series *rc = rc_info->ri_rc; int shortPreamble = rc_info->ri_shortPreamble; uint8_t rate; int i; + rt = ieee80211_get_ratetable(ni->ni_ic->ic_curchan); + /* Make sure that rate control code doesn't mess it up. * If enable rts/cts and is pre-802.11n, blank tries 1, 2, 3 */ @@ -138,9 +140,9 @@ { for (i = 1; i < IEEE80211_RATECTL_NUM; i++) { - if (rc[0].flags & IEEE80211_RATECTL_RTSCTS_FLAG) + if (rc[0].flags & IEEE80211_RATECTL_FLAG_RTSCTS) rc[i].tries = 0; - rc[i].flags &= ~IEEE80211_RATECTL_RTSCTS_FLAG; + rc[i].flags &= ~IEEE80211_RATECTL_FLAG_RTSCTS; } } @@ -149,13 +151,18 @@ if (rc[i].tries == 0) continue; - rate = rt->info[rc[i].rix].rateCode; + 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 /* * Save this, used by the TX and completion code @@ -164,7 +171,7 @@ /* Only enable shortgi, 2040, dual-stream if HT is set */ if (IS_HT_RATE(rate)) { - rc[i].flags |= IEEE80211_RATECTL_HT_FLAG; + rc[i].flags |= IEEE80211_RATECTL_FLAG_HT; /* * XXX TODO: LDPC @@ -174,9 +181,9 @@ * Dual / Triple stream rate? */ if (HT_RC_2_STREAMS(rate) == 2) - rc[i].flags |= IEEE80211_RATECTL_DS_FLAG; + rc[i].flags |= IEEE80211_RATECTL_FLAG_DS; else if (HT_RC_2_STREAMS(rate) == 3) - rc[i].flags |= IEEE80211_RATECTL_TS_FLAG; + rc[i].flags |= IEEE80211_RATECTL_FLAG_TS; } /* @@ -190,16 +197,16 @@ * Calculate the maximum 4ms frame length based * on the MCS rate, SGI and channel width flags. */ - if ((rc[i].flags & IEEE80211_RATECTL_HT_FLAG) && + if ((rc[i].flags & IEEE80211_RATECTL_FLAG_HT) && (HT_RC_2_MCS(rate) < 32)) { int j; - if (rc[i].flags & IEEE80211_RATECTL_CW40_FLAG) { - if (rc[i].flags & IEEE80211_RATECTL_SGI_FLAG) + 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_SGI_FLAG) + if (rc[i].flags & IEEE80211_RATECTL_FLAG_SGI) j = MCS_HT20_SGI; else j = MCS_HT20; Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h Thu Aug 15 08:21:00 2013 (r255968) +++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h Thu Aug 15 09:07:05 2013 (r255969) @@ -37,13 +37,6 @@ IEEE80211_RATECTL_MAX }; -enum { - MCS_HT20, - MCS_HT20_SGI, - MCS_HT40, - MCS_HT40_SGI, -}; - #define IEEE80211_RATECTL_TX_SUCCESS 1 #define IEEE80211_RATECTL_TX_FAILURE 0 @@ -52,35 +45,30 @@ #define IEEE80211_RATECTL_NUM 4 -#define IEEE80211_RATECTL_DS_FLAG 0x01 /* dual-stream rate */ -#define IEEE80211_RATECTL_CW40_FLAG 0x02 /* use HT40 */ -#define IEEE80211_RATECTL_SGI_FLAG 0x04 /* use short-GI */ -#define IEEE80211_RATECTL_HT_FLAG 0x08 /* use HT */ -#define IEEE80211_RATECTL_RTSCTS_FLAG 0x10 /* enable RTS/CTS protection */ -#define IEEE80211_RATECTL_STBC_FLAG 0x20 /* enable STBC */ -#define IEEE80211_RATECTL_TS_FLAG 0x40 /* triple-stream rate */ +#define IEEE80211_RATECTL_FLAG_DS 0x01 /* dual-stream rate */ +#define IEEE80211_RATECTL_FLAG_CW40 0x02 /* use HT40 */ +#define IEEE80211_RATECTL_FLAG_SGI 0x04 /* use short-GI */ +#define IEEE80211_RATECTL_FLAG_HT 0x08 /* use HT */ +#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 */ /* Hardware CAPs offered to rate control algo */ #define IEEE80211_RATECTL_CAP_MRR 0x01 /* support MRR */ #define IEEE80211_RATECTL_CAP_MRRPROT 0x02 /* support MRR + protect */ #define IEEE80211_RATECTL_CAP_MULTXCHAIN 0x04 /* has more than 1 txchain */ -#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) - #define IS_VAP_HT(vap) ((vap)->iv_htcaps & IEEE80211_HTC_HT) - #define IS_HT_RATE(_rate) ((_rate) & 0x80) #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]; @@ -135,6 +123,16 @@ 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 *); @@ -243,4 +241,22 @@ IEEE80211_RATECTL_HASCAP_MULTXCHAIN(ni); } +static int __inline +ieee80211_ratectl_node_is11n(const struct ieee80211_node *ni) +{ + if (ni->ni_chan == NULL) + return (0); + if (ni->ni_chan == IEEE80211_CHAN_ANYC) + return (0); + return (IEEE80211_IS_CHAN_HT(ni->ni_chan)); +} + +static const struct ieee80211_rateset * __inline +ieee80211_ratectl_get_rateset(const struct ieee80211_node *ni) +{ + return ieee80211_ratectl_node_is11n(ni) ? + (struct ieee80211_rateset *) &ni->ni_htrates : + &ni->ni_rates; +} + #endif Modified: soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c ============================================================================== --- soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c Thu Aug 15 08:21:00 2013 (r255968) +++ soc2013/ccqin/head/sys/net80211/ieee80211_rc_sample.c Thu Aug 15 09:07:05 2013 (r255969) @@ -111,18 +111,6 @@ free(vap->iv_rs, M_80211_RATECTL); } -// XXX should be shared by ratectl algos -static int -sample_node_is_11n(struct ieee80211_node *ni) -{ - - if (ni->ni_chan == NULL) - return (0); - if (ni->ni_chan == IEEE80211_CHAN_ANYC) - return (0); - return (IEEE80211_IS_CHAN_HT(ni->ni_chan)); -} - static const struct txschedule *mrr_schedules[IEEE80211_MODE_MAX+2] = { NULL, /* IEEE80211_MODE_AUTO */ series_11a, /* IEEE80211_MODE_11A */ @@ -591,24 +579,6 @@ #undef MCS } -static const struct ieee80211_rateset * -sample_get_rateset(const struct ieee80211_node *ni) -{ - const struct ieee80211_rateset *rs = NULL; - /* 11n or not? Pick the right rateset */ - if (sample_node_is_11n(ni)) { - /* XXX ew */ - IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, - "%s: 11n node", __func__); - rs = (struct ieee80211_rateset *) &ni->ni_htrates; - } else { - IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, - "%s: non-11n node", __func__); - rs = &ni->ni_rates; - } - return rs; -} - static int sample_rate(struct ieee80211_node *ni, void *arg __unused, uint32_t iarg __unused) {