socsvn commit: r255101 - soc2013/ccqin/head/sys/net80211
ccqin at FreeBSD.org
ccqin at FreeBSD.org
Wed Jul 24 09:48:57 UTC 2013
Author: ccqin
Date: Wed Jul 24 09:48:56 2013
New Revision: 255101
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=255101
Log:
Change of naming conversion and field max_4ms_framelen.
* change "IEEE80211_RATECTL_OPT_*" to "IEEE80211_RATECTL_CAP_*". change field
"options" of ieee80211_ratectl to "ir_capabilities". update the references.
* fix error on initialization of ir_capabilities.
* re-add max4msframelen to ieee80211_rc_series. port max_4ms_framelen[4][32]
to ieee80211_ratectl. also add setup of max4msframelen to
ieee80211_ratectl_complete_rcflags().
* move ieee80211_ratectl_complete_rcflags() to ieee80211_ratectl.c, also put
max_4ms_framelen[4][32] there.
* add pre-compile declaration to ieee80211_ratectl.h. (strange it not appeared)
Modified:
soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c
soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h
Modified: soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c
==============================================================================
--- soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c Wed Jul 24 09:35:44 2013 (r255100)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.c Wed Jul 24 09:48:56 2013 (r255101)
@@ -50,6 +50,33 @@
MALLOC_DEFINE(M_80211_RATECTL, "80211ratectl", "802.11 rate control");
+int max_4ms_framelen[4][32] = {
+ [MCS_HT20] = {
+ 3212, 6432, 9648, 12864, 19300, 25736, 28952, 32172,
+ 6424, 12852, 19280, 25708, 38568, 51424, 57852, 64280,
+ 9628, 19260, 28896, 38528, 57792, 65532, 65532, 65532,
+ 12828, 25656, 38488, 51320, 65532, 65532, 65532, 65532,
+ },
+ [MCS_HT20_SGI] = {
+ 3572, 7144, 10720, 14296, 21444, 28596, 32172, 35744,
+ 7140, 14284, 21428, 28568, 42856, 57144, 64288, 65532,
+ 10700, 21408, 32112, 42816, 64228, 65532, 65532, 65532,
+ 14256, 28516, 42780, 57040, 65532, 65532, 65532, 65532,
+ },
+ [MCS_HT40] = {
+ 6680, 13360, 20044, 26724, 40092, 53456, 60140, 65532,
+ 13348, 26700, 40052, 53400, 65532, 65532, 65532, 65532,
+ 20004, 40008, 60016, 65532, 65532, 65532, 65532, 65532,
+ 26644, 53292, 65532, 65532, 65532, 65532, 65532, 65532,
+ },
+ [MCS_HT40_SGI] = {
+ 7420, 14844, 22272, 29696, 44544, 59396, 65532, 65532,
+ 14832, 29668, 44504, 59340, 65532, 65532, 65532, 65532,
+ 22232, 44464, 65532, 65532, 65532, 65532, 65532, 65532,
+ 29616, 59232, 65532, 65532, 65532, 65532, 65532, 65532,
+ }
+};
+
void
ieee80211_ratectl_register(int type, const struct ieee80211_ratectl *ratectl)
{
@@ -67,11 +94,11 @@
}
void
-ieee80211_ratectl_init(struct ieee80211vap *vap, uint32_t options)
+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.options = options;
+ vap->iv_rate.ir_capabilities = capabilities;
vap->iv_rate->ir_init(vap);
}
@@ -92,3 +119,95 @@
}
vap->iv_rate = ratectls[type];
}
+
+void
+ieee80211_ratectl_complete_rcflags(const struct ieee80211_node *ni,
+ struct ieee80211_rc_series *rc, int shortPreamble)
+{
+ const struct ieee80211com *ic = ni->ni_ic;
+ const struct ieee80211vap *vap = ni->ni_vap;
+ const struct ieee80211_rate_table * rt = ic->ic_rt;
+ uint8_t rate;
+ int i;
+
+ /* 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
+ */
+
+ if (! (vap->iv_rate->ir_capabilities & IEEE80211_RATECTL_CAP_MRRPROT))
+ {
+ for (i = 1; i < IEEE80211_RATECTL_NUM; i++)
+ {
+ if (rc[0].flags & IEEE80211_RATECTL_RTSCTS_FLAG)
+ rc[i].tries = 0;
+ rc[i].flags &= ~IEEE80211_RATECTL_RTSCTS_FLAG;
+ }
+ }
+
+ for (i = 0; i < IEEE80211_RATECTL_NUM; i++) {
+
+ if (rc[i].tries == 0)
+ continue;
+
+ rate = rt->info[rc[i].rix].rateCode;
+
+ /*
+ * Only enable short preamble for legacy rates
+ */
+ if ((! IS_HT_RATE(rate)) && shortPreamble)
+ rate |= rt->info[rc[i].rix].shortPreamble;
+
+ /*
+ * 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_HT_FLAG;
+
+ /*
+ * XXX TODO: LDPC
+ */
+
+ /*
+ * Dual / Triple stream rate?
+ */
+ if (HT_RC_2_STREAMS(rate) == 2)
+ rc[i].flags |= IEEE80211_RATECTL_DS_FLAG;
+ else if (HT_RC_2_STREAMS(rate) == 3)
+ rc[i].flags |= IEEE80211_RATECTL_TS_FLAG;
+ }
+
+ /*
+ * Calculate the maximum TX power cap for the current
+ * node.
+ * Rate control algo can't control TX power by now.
+ */
+ 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_HT_FLAG) &&
+ (HT_RC_2_MCS(rate) < 32)) {
+ int j;
+ if (rc[i].flags & IEEE80211_RATECTL_CW40_FLAG) {
+ if (rc[i].flags & IEEE80211_RATECTL_SGI_FLAG)
+ j = MCS_HT40_SGI;
+ else
+ j = MCS_HT40;
+ } else {
+ if (rc[i].flags & IEEE80211_RATECTL_SGI_FLAG)
+ 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 Wed Jul 24 09:35:44 2013 (r255100)
+++ soc2013/ccqin/head/sys/net80211/ieee80211_ratectl.h Wed Jul 24 09:48:56 2013 (r255101)
@@ -25,6 +25,8 @@
*
* $FreeBSD$
*/
+#ifndef _NET80211_IEEE80211_RATECTL_H_
+#define _NET80211_IEEE80211_RATECTL_H_
enum ieee80211_ratealgs {
IEEE80211_RATECTL_AMRR = 0,
@@ -35,6 +37,13 @@
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
@@ -51,10 +60,10 @@
#define IEEE80211_RATECTL_STBC_FLAG 0x20 /* enable STBC */
#define IEEE80211_RATECTL_TS_FLAG 0x40 /* triple-stream rate */
-/* Hardware options chip offered to rate control code */
-#define IEEE80211_RATECTL_OPT_MRR 0x01 /* support MRR */
-#define IEEE80211_RATECTL_OPT_MRRPROT 0x02 /* support MRR + protect */
-#define IEEE80211_RATECTL_OPT_MULTXCHAIN 0x04 /* has more than 1 txchain */
+/* Hardware CAPs chip offered to rate control code */
+#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 IS_VAP_HT(vap) ((vap)->iv_htcaps & IEEE80211_HTC_HT)
@@ -62,17 +71,22 @@
#define HT_RC_2_MCS(_rc) ((_rc) & 0x7f)
#define HT_RC_2_STREAMS(_rc) ((((_rc) & 0x78) >> 3) + 1)
+
+extern int max_4ms_framelen[4][32];
+
struct ieee80211_rc_series {
uint8_t rix; /* ratetable index, not rate code */
uint8_t ratecode; /* hardware rate code */
uint8_t tries;
uint8_t tx_power_cap;
uint16_t flags;
+ uint16_t max4msframelen;
};
struct ieee80211_ratectl {
const char *ir_name;
- uint32_t options; /* IEEE80211_RATECTL_OPTs */
+ uint32_t ir_capabilities; /* hardware capabilities offered to rc */
+
int (*ir_attach)(const struct ieee80211vap *);
void (*ir_detach)(const struct ieee80211vap *);
void (*ir_init)(struct ieee80211vap *);
@@ -80,7 +94,8 @@
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_series *, int, size_t);
+ void (*ir_rates)(struct ieee80211_node *, struct ieee80211_rc_series *,
+ int, size_t);
void (*ir_tx_complete)(const struct ieee80211vap *,
const struct ieee80211_node *, int,
void *, void *);
@@ -94,6 +109,8 @@
void ieee80211_ratectl_unregister(int);
void ieee80211_ratectl_init(struct ieee80211vap *, uint32_t);
void ieee80211_ratectl_set(struct ieee80211vap *, int);
+void ieee80211_ratectl_complete_rcflags(const struct ieee80211_node *,
+ struct ieee80211_rc_series *, int)
MALLOC_DECLARE(M_80211_RATECTL);
@@ -104,11 +121,11 @@
}
static void __inline
-ieee80211_ratectl_node_init(struct ieee80211_node *ni, uint32_t options)
+ieee80211_ratectl_node_init(struct ieee80211_node *ni)
{
const struct ieee80211vap *vap = ni->ni_vap;
- vap->iv_rate->ir_node_init(ni, options);
+ vap->iv_rate->ir_node_init(ni);
}
static void __inline
@@ -194,73 +211,7 @@
{
return IS_VAP_HT(vap) && (vap->iv_htcaps & IEEE80211_HTCAP_TXSTBC) &&
(ni->ni_htcap & IEEE80211_HTCAP_RXSTBC_1STREAM) &&
- (vap->iv_rate->options & IEEE80211_RATECTL_OPT_MULTXCHAIN);
+ (vap->iv_rate->ir_capabilities & IEEE80211_RATECTL_CAP_MULTXCHAIN);
}
-static void
-ieee80211_ratectl_complete_rcflags(struct ieee80211_node *ni,
- struct ieee80211_rc_series *rc, int shortPreamble)
-{
- struct ieee80211com *ic = ni->ni_ic;
- const struct ieee80211_rate_table * rt = ic->ic_rt;
- uint8_t rate0, rate;
- int i;
-
- rate0 = rt->info[rc[0].rix].rateCode;
-
- /* 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
- */
-
- if (! IS_HT_RATE(rate0))
- {
- if (rc[0].flags & IEEE80211_RATECTL_RTSCTS_FLAG)
- rc[1].tries = rc[2].tries = rc[3].tries = 0;
- rc[1].flags &= ~IEEE80211_RATECTL_RTSCTS_FLAG;
- rc[2].flags &= ~IEEE80211_RATECTL_RTSCTS_FLAG;
- rc[3].flags &= ~IEEE80211_RATECTL_RTSCTS_FLAG;
- }
-
- for (i = 0; i < IEEE80211_RATECTL_NUM; i++) {
-
- if (rc[i].tries == 0)
- continue;
-
- rate = rt->info[rc[i].rix].rateCode;
-
- /*
- * Only enable short preamble for legacy rates
- */
- if ((! IS_HT_RATE(rate)) && shortPreamble)
- rate |= rt->info[rc[i].rix].shortPreamble;
-
- /*
- * 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_HT_FLAG;
-
- /*
- * XXX TODO: LDPC
- */
-
- /*
- * Dual / Triple stream rate?
- */
- if (HT_RC_2_STREAMS(rate) == 2)
- rc[i].flags |= IEEE80211_RATECTL_DS_FLAG;
- else if (HT_RC_2_STREAMS(rate) == 3)
- rc[i].flags |= IEEE80211_RATECTL_TS_FLAG;
- }
-
- /*
- * Calculate the maximum TX power cap for the current
- * node.
- * Rate control algo can't control TX power by now.
- */
- rc[i].tx_power_cap = ieee80211_get_node_txpower(ni);
- }
-}
+#endif
More information about the svn-soc-all
mailing list