Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Jan 2008 04:41:24 GMT
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 133223 for review
Message-ID:  <200801140441.m0E4fO4R020776@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=133223

Change 133223 by sephe@sephe_zealot:sam_wifi on 2008/01/14 04:40:41

	- Compute durations for nonfrag data frames
	- Rename controlRate to ctlRateIndex
	- Indentation
	- Adjust comments a little bit
	- Don't map for short preamble rates, this kind of mapping does not
	  work (0x04 overlap some rate codes) and it is never used
	- Rename ieee80211_compute_txtime to ieee80211_compute_duration,
	  since the result returned by this function includes SIFS

Affected files ...

.. //depot/projects/wifi/sys/net80211/ieee80211_phy.c#3 edit

Differences ...

==== //depot/projects/wifi/sys/net80211/ieee80211_phy.c#3 (text+ko) ====

@@ -89,7 +89,7 @@
 						 * preamble in CCK rate code */
 		uint8_t		dot11Rate;	/* value for supported rates
 						 * info element of MLME */
-		uint8_t		controlRate;	/* index of next lower basic
+		uint8_t		ctlRateIndex;	/* index of next lower basic
 						 * rate; used for dur. calcs */
 		uint16_t	lpAckDuration;	/* long preamble ACK dur. */
 		uint16_t	spAckDuration;	/* short preamble ACK dur. */
@@ -102,8 +102,6 @@
 		    const struct ieee80211_rate_table *, uint8_t rate);
 uint8_t		ieee80211_ack_rate(const struct ieee80211_rate_table *,
 		    uint8_t rate);
-uint16_t	ieee80211_compute_txtime(const struct ieee80211_rate_table *,
-		    uint32_t frameLen, uint16_t rate, int flags);
 #endif	/* notyet */
 
 /* shorthands to compact tables for readability */
@@ -113,7 +111,7 @@
 #define	PBCC	(IEEE80211_T_HT+1)		/* XXX */
 
 static struct ieee80211_rate_table ieee80211_11b_table = {
-	4,  /* number of rates */
+	4,  /* number of rates, XXX no PBCC */
 	{ 0 },
 	{
 /*                               short            ctrl  */
@@ -238,6 +236,8 @@
 #undef	XR
 
 static void	ieee80211_setup_ratetable(struct ieee80211_rate_table *);
+static uint16_t	ieee80211_compute_duration(const struct ieee80211_rate_table *,
+		    uint32_t frameLen, uint16_t rate, int flags);
 
 /* Setup all rate tables */
 void
@@ -278,41 +278,38 @@
 ieee80211_setup_ratetable(struct ieee80211_rate_table *rt)
 {
 #define	N(a)	(sizeof(a)/sizeof(a[0]))
-#define	WLAN_CTRL_FRAME_SIZE	(2+2+6+4)	/* ACK+FCS */
+#define	WLAN_CTRL_FRAME_SIZE \
+	(sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
+
 	int i;
 
 	for (i = 0; i < N(rt->rateCodeToIndex); i++)
 		rt->rateCodeToIndex[i] = (uint8_t) -1;
 	for (i = 0; i < rt->rateCount; i++) {
 		uint8_t code = rt->info[i].dot11Rate;
-#ifdef notyet
-		uint8_t cix = rt->info[i].controlRate;
-#endif
+		uint8_t cix = rt->info[i].ctlRateIndex;
 
 		rt->rateCodeToIndex[code] = i;
-		rt->rateCodeToIndex[code | rt->info[i].shortPreamble] = i;
 		if (code & IEEE80211_RATE_BASIC) {
 			/*
 			 * Map w/o basic rate bit too.
 			 */
 			code &= IEEE80211_RATE_VAL;
 			rt->rateCodeToIndex[code] = i;
-			rt->rateCodeToIndex[code | rt->info[i].shortPreamble] = i;
 		}
 
-#ifdef notyet
 		/*
 		 * XXX for 11g the control rate to use for 5.5 and 11 Mb/s
 		 *     depends on whether they are marked as basic rates;
 		 *     the static tables are setup with an 11b-compatible
 		 *     2Mb/s rate which will work but is suboptimal
 		 */
-		rt->info[i].lpAckDuration = ieee80211_compute_txtime(rt,
+		rt->info[i].lpAckDuration = ieee80211_compute_duration(rt,
 			WLAN_CTRL_FRAME_SIZE, cix, 0);
-		rt->info[i].spAckDuration = ieee80211_compute_txtime(rt,
-			WLAN_CTRL_FRAME_SIZE, cix, 1);
-#endif	/* notyet */
+		rt->info[i].spAckDuration = ieee80211_compute_duration(rt,
+			WLAN_CTRL_FRAME_SIZE, cix, IEEE80211_F_SHPREAMBLE);
 	}
+
 #undef WLAN_CTRL_FRAME_SIZE
 #undef N
 }
@@ -401,16 +398,19 @@
 uint8_t
 ieee80211_ack_rate(const struct ieee80211_rate_table *rt, uint8_t rate)
 {
-	uint8_t cix = rt->info[rt->rateCodeToIndex[rate]].controlRate;
+	uint8_t cix = rt->info[rt->rateCodeToIndex[rate]].ctlRateIndex;
 	return rt->info[cix].dot11Rate;
 }
 
+#endif	/* notyet */
+
 /*
  * Compute the time to transmit a frame of length frameLen bytes
  * using the specified rate, phy, and short preamble setting.
+ * SIFS is included.
  */
-uint16_t
-ieee80211_compute_txtime(const struct ieee80211_rate_table *rt,
+static uint16_t
+ieee80211_compute_duration(const struct ieee80211_rate_table *rt,
 	uint32_t frameLen, uint16_t rate, int flags)
 {
 	uint8_t rix = rt->rateCodeToIndex[rate];
@@ -424,9 +424,9 @@
 
 	switch (rt->info[rix].phy) {
 	case IEEE80211_T_CCK:
-#define CCK_SIFS_TIME        10
-#define CCK_PREAMBLE_BITS   144
-#define CCK_PLCP_BITS        48
+#define CCK_SIFS_TIME		10
+#define CCK_PREAMBLE_BITS	144
+#define CCK_PLCP_BITS		48
 		phyTime		= CCK_PREAMBLE_BITS + CCK_PLCP_BITS;
 		if ((flags & IEEE80211_F_SHPREAMBLE) &&
 		    rt->info[rix].shortPreamble)
@@ -440,10 +440,10 @@
 #undef CCK_PLCP_BITS
 
 	case IEEE80211_T_OFDM:
-#define OFDM_SIFS_TIME        16
-#define OFDM_PREAMBLE_TIME    20
-#define OFDM_PLCP_BITS        22
-#define OFDM_SYMBOL_TIME       4
+#define OFDM_SIFS_TIME		16
+#define OFDM_PREAMBLE_TIME	20
+#define OFDM_PLCP_BITS		22
+#define OFDM_SYMBOL_TIME	4
 
 #define OFDM_SIFS_TIME_HALF	32
 #define OFDM_PREAMBLE_TIME_HALF	40
@@ -461,7 +461,7 @@
 			numBits		= OFDM_PLCP_BITS + (frameLen << 3);
 			numSymbols	= howmany(numBits, bitsPerSymbol);
 			txTime		= OFDM_SIFS_TIME_QUARTER 
-						+ OFDM_PREAMBLE_TIME_QUARTER
+					+ OFDM_PREAMBLE_TIME_QUARTER
 					+ (numSymbols * OFDM_SYMBOL_TIME_QUARTER);
 		} else if (rt == &ieee80211_quarter_table) {
 			bitsPerSymbol	= (kbps * OFDM_SYMBOL_TIME_HALF) / 1000;
@@ -469,8 +469,8 @@
 
 			numBits		= OFDM_PLCP_BITS + (frameLen << 3);
 			numSymbols	= howmany(numBits, bitsPerSymbol);
-			txTime		= OFDM_SIFS_TIME_HALF + 
-						OFDM_PREAMBLE_TIME_HALF
+			txTime		= OFDM_SIFS_TIME_HALF
+					+ OFDM_PREAMBLE_TIME_HALF
 					+ (numSymbols * OFDM_SYMBOL_TIME_HALF);
 		} else { /* full rate channel */
 			bitsPerSymbol	= (kbps * OFDM_SYMBOL_TIME) / 1000;
@@ -478,7 +478,8 @@
 
 			numBits		= OFDM_PLCP_BITS + (frameLen << 3);
 			numSymbols	= howmany(numBits, bitsPerSymbol);
-			txTime		= OFDM_SIFS_TIME + OFDM_PREAMBLE_TIME
+			txTime		= OFDM_SIFS_TIME
+					+ OFDM_PREAMBLE_TIME
 					+ (numSymbols * OFDM_SYMBOL_TIME);
 		}
 		break;
@@ -489,10 +490,10 @@
 #undef OFDM_SYMBOL_TIME
 
 	case IEEE80211_T_TURBO:
-#define TURBO_SIFS_TIME         8
-#define TURBO_PREAMBLE_TIME    14
-#define TURBO_PLCP_BITS        22
-#define TURBO_SYMBOL_TIME       4
+#define TURBO_SIFS_TIME		8
+#define TURBO_PREAMBLE_TIME	14
+#define TURBO_PLCP_BITS		22
+#define TURBO_SYMBOL_TIME	4
 		/* we still save OFDM rates in kbps - so double them */
 		bitsPerSymbol = ((kbps << 1) * TURBO_SYMBOL_TIME) / 1000;
 		KASSERT(bitsPerSymbol != 0, ("turbo bps"));
@@ -508,12 +509,9 @@
 #undef TURBO_SYMBOL_TIME
 
 	default:
-		printf("%s: unknown phy %u (rate %u)\n",
-		    __func__, rt->info[rix].phy, rate);
-		txTime = 0;
+		panic("%s: unknown phy %u (rate %u)\n", __func__,
+		      rt->info[rix].phy, rate);
 		break;
 	}
 	return txTime;
 }
-
-#endif	/* notyet */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801140441.m0E4fO4R020776>