PERFORCE change 117517 for review

Sam Leffler sam at FreeBSD.org
Fri Apr 6 16:41:57 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=117517

Change 117517 by sam at sam_ebb on 2007/04/06 16:41:15

	Media-related cleanups in preparation for 11n support:
	o factor out code to add media entries to a new addmedia routine
	o when announcing tx rates, cvt media word back to a rate to print
	o factor out rate lookup logic used in mapping rate -> media word
	
	Also avoid call to ieee80211_chan2mode unless result is needed.

Affected files ...

.. //depot/projects/wifi/sys/net80211/ieee80211.c#46 edit

Differences ...

==== //depot/projects/wifi/sys/net80211/ieee80211.c#46 (text+ko) ====

@@ -423,6 +423,36 @@
 	return NULL;
 }
 
+static void
+addmedia(struct ieee80211com *ic, int mode, int mword)
+{
+#define	ADD(_ic, _s, _o) \
+	ifmedia_add(&(_ic)->ic_media, \
+		IFM_MAKEWORD(IFM_IEEE80211, (_s), (_o), 0), 0, NULL)
+	static const u_int mopts[IEEE80211_MODE_MAX] = { 
+		IFM_AUTO,
+		IFM_IEEE80211_11A,
+		IFM_IEEE80211_11B,
+		IFM_IEEE80211_11G,
+		IFM_IEEE80211_FH,
+		IFM_IEEE80211_11A | IFM_IEEE80211_TURBO,
+		IFM_IEEE80211_11G | IFM_IEEE80211_TURBO,
+	};
+	u_int mopt;
+
+	mopt = mopts[mode];
+	ADD(ic, mword, mopt);	/* e.g. 11a auto */
+	if (ic->ic_caps & IEEE80211_C_IBSS)
+		ADD(ic, mword, mopt | IFM_IEEE80211_ADHOC);
+	if (ic->ic_caps & IEEE80211_C_HOSTAP)
+		ADD(ic, mword, mopt | IFM_IEEE80211_HOSTAP);
+	if (ic->ic_caps & IEEE80211_C_AHDEMO)
+		ADD(ic, mword, mopt | IFM_IEEE80211_ADHOC | IFM_FLAG0);
+	if (ic->ic_caps & IEEE80211_C_MONITOR)
+		ADD(ic, mword, mopt | IFM_IEEE80211_MONITOR);
+#undef ADD
+}
+
 /*
  * Setup the media data structures according to the channel and
  * rate tables.  This must be called by the driver after
@@ -432,12 +462,9 @@
 ieee80211_media_init(struct ieee80211com *ic,
 	ifm_change_cb_t media_change, ifm_stat_cb_t media_stat)
 {
-#define	ADD(_ic, _s, _o) \
-	ifmedia_add(&(_ic)->ic_media, \
-		IFM_MAKEWORD(IFM_IEEE80211, (_s), (_o), 0), 0, NULL)
 	struct ifnet *ifp = ic->ic_ifp;
-	int i, j, mode, rate, maxrate, mword, mopt, r;
-	struct ieee80211_rateset *rs;
+	int i, j, mode, rate, maxrate, mword, r;
+	const struct ieee80211_rateset *rs;
 	struct ieee80211_rateset allrates;
 
 	/* NB: this works because the structure is initialized to zero */
@@ -463,29 +490,14 @@
 	 */
 	ifmedia_init(&ic->ic_media, 0, media_change, media_stat);
 	maxrate = 0;
+	/*
+	 * Add media for legacy operating modes.
+	 */
 	memset(&allrates, 0, sizeof(allrates));
 	for (mode = IEEE80211_MODE_AUTO; mode < IEEE80211_MODE_MAX; mode++) {
-		static const u_int mopts[] = { 
-			IFM_AUTO,
-			IFM_IEEE80211_11A,
-			IFM_IEEE80211_11B,
-			IFM_IEEE80211_11G,
-			IFM_IEEE80211_FH,
-			IFM_IEEE80211_11A | IFM_IEEE80211_TURBO,
-			IFM_IEEE80211_11G | IFM_IEEE80211_TURBO,
-		};
 		if (isclr(ic->ic_modecaps, mode))
 			continue;
-		mopt = mopts[mode];
-		ADD(ic, IFM_AUTO, mopt);	/* e.g. 11a auto */
-		if (ic->ic_caps & IEEE80211_C_IBSS)
-			ADD(ic, IFM_AUTO, mopt | IFM_IEEE80211_ADHOC);
-		if (ic->ic_caps & IEEE80211_C_HOSTAP)
-			ADD(ic, IFM_AUTO, mopt | IFM_IEEE80211_HOSTAP);
-		if (ic->ic_caps & IEEE80211_C_AHDEMO)
-			ADD(ic, IFM_AUTO, mopt | IFM_IEEE80211_ADHOC | IFM_FLAG0);
-		if (ic->ic_caps & IEEE80211_C_MONITOR)
-			ADD(ic, IFM_AUTO, mopt | IFM_IEEE80211_MONITOR);
+		addmedia(ic, mode, IFM_AUTO);
 		if (mode == IEEE80211_MODE_AUTO)
 			continue;
 		rs = &ic->ic_sup_rates[mode];
@@ -494,17 +506,9 @@
 			mword = ieee80211_rate2media(ic, rate, mode);
 			if (mword == 0)
 				continue;
-			ADD(ic, mword, mopt);
-			if (ic->ic_caps & IEEE80211_C_IBSS)
-				ADD(ic, mword, mopt | IFM_IEEE80211_ADHOC);
-			if (ic->ic_caps & IEEE80211_C_HOSTAP)
-				ADD(ic, mword, mopt | IFM_IEEE80211_HOSTAP);
-			if (ic->ic_caps & IEEE80211_C_AHDEMO)
-				ADD(ic, mword, mopt | IFM_IEEE80211_ADHOC | IFM_FLAG0);
-			if (ic->ic_caps & IEEE80211_C_MONITOR)
-				ADD(ic, mword, mopt | IFM_IEEE80211_MONITOR);
+			addmedia(ic, mode, mword);
 			/*
-			 * Add rate to the collection of all rates.
+			 * Add legacy rate to the collection of all rates.
 			 */
 			r = rate & IEEE80211_RATE_VAL;
 			for (j = 0; j < allrates.rs_nrates; j++)
@@ -525,16 +529,8 @@
 				IEEE80211_MODE_AUTO);
 		if (mword == 0)
 			continue;
-		mword = IFM_SUBTYPE(mword);	/* remove media options */
-		ADD(ic, mword, 0);
-		if (ic->ic_caps & IEEE80211_C_IBSS)
-			ADD(ic, mword, IFM_IEEE80211_ADHOC);
-		if (ic->ic_caps & IEEE80211_C_HOSTAP)
-			ADD(ic, mword, IFM_IEEE80211_HOSTAP);
-		if (ic->ic_caps & IEEE80211_C_AHDEMO)
-			ADD(ic, mword, IFM_IEEE80211_ADHOC | IFM_FLAG0);
-		if (ic->ic_caps & IEEE80211_C_MONITOR)
-			ADD(ic, mword, IFM_IEEE80211_MONITOR);
+		/* NB: remove media options from mword */
+		addmedia(ic, IEEE80211_MODE_AUTO, IFM_SUBTYPE(mword));
 	}
 	/* NB: strip explicit mode; we're actually in autoselect */
 	ifmedia_set(&ic->ic_media,
@@ -542,19 +538,16 @@
 
 	if (maxrate)
 		ifp->if_baudrate = IF_Mbps(maxrate);
-#undef ADD
 }
 
 const struct ieee80211_rateset *
 ieee80211_get_suprates(struct ieee80211com *ic, const struct ieee80211_channel *c)
 {
-	enum ieee80211_phymode mode = ieee80211_chan2mode(c);
-
 	if (IEEE80211_IS_CHAN_HALF(c))
 		return &ieee80211_rateset_half;
 	if (IEEE80211_IS_CHAN_QUARTER(c))
 		return &ieee80211_rateset_quarter;
-	return &ic->ic_sup_rates[mode];
+	return &ic->ic_sup_rates[ieee80211_chan2mode(c)];
 }
 
 void
@@ -562,7 +555,7 @@
 {
 	struct ifnet *ifp = ic->ic_ifp;
 	int i, mode, rate, mword;
-	struct ieee80211_rateset *rs;
+	const struct ieee80211_rateset *rs;
 
 	for (mode = IEEE80211_MODE_11A; mode < IEEE80211_MODE_MAX; mode++) {
 		if (isclr(ic->ic_modecaps, mode))
@@ -574,9 +567,9 @@
 			mword = ieee80211_rate2media(ic, rate, mode);
 			if (mword == 0)
 				continue;
+			rate = ieee80211_media2rate(mword);
 			printf("%s%d%sMbps", (i != 0 ? " " : ""),
-			    (rate & IEEE80211_RATE_VAL) / 2,
-			    ((rate & 0x1) != 0 ? ".5" : ""));
+			    rate / 2, ((rate & 0x1) != 0 ? ".5" : ""));
 		}
 		printf("\n");
 	}
@@ -986,18 +979,31 @@
 	return IEEE80211_MODE_11B;
 }
 
+struct ratemedia {
+	u_int	match;	/* rate + mode */
+	u_int	media;	/* if_media rate */
+};
+
+static int
+findmedia(const struct ratemedia rates[], int n, u_int match)
+{
+	int i;
+
+	for (i = 0; i < n; i++)
+		if (rates[i].match == match)
+			return rates[i].media;
+	return IFM_AUTO;
+}
+
 /*
- * convert IEEE80211 rate value to ifmedia subtype.
- * ieee80211 rate is in unit of 0.5Mbps.
+ * Convert IEEE80211 rate value to ifmedia subtype.
+ * Rate is a legacy rate in units of 0.5Mbps.
  */
 int
 ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode mode)
 {
 #define	N(a)	(sizeof(a) / sizeof(a[0]))
-	static const struct {
-		u_int	m;	/* rate + mode */
-		u_int	r;	/* if_media rate */
-	} rates[] = {
+	static const struct ratemedia rates[] = {
 		{   2 | IFM_IEEE80211_FH, IFM_IEEE80211_FH1 },
 		{   4 | IFM_IEEE80211_FH, IFM_IEEE80211_FH2 },
 		{   2 | IFM_IEEE80211_11B, IFM_IEEE80211_DS1 },
@@ -1030,37 +1036,28 @@
 		{  54 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM27 },
 		/* NB: OFDM72 doesn't realy exist so we don't handle it */
 	};
-	u_int mask, i;
 
-	mask = rate & IEEE80211_RATE_VAL;
+	rate &= IEEE80211_RATE_VAL;
 	switch (mode) {
 	case IEEE80211_MODE_11A:
 	case IEEE80211_MODE_TURBO_A:
 	case IEEE80211_MODE_STURBO_A:
-		mask |= IFM_IEEE80211_11A;
-		break;
+		return findmedia(rates, N(rates), rate | IFM_IEEE80211_11A);
 	case IEEE80211_MODE_11B:
-		mask |= IFM_IEEE80211_11B;
-		break;
+		return findmedia(rates, N(rates), rate | IFM_IEEE80211_11B);
 	case IEEE80211_MODE_FH:
-		mask |= IFM_IEEE80211_FH;
-		break;
+		return findmedia(rates, N(rates), rate | IFM_IEEE80211_FH);
 	case IEEE80211_MODE_AUTO:
 		/* NB: ic may be NULL for some drivers */
-		if (ic && ic->ic_phytype == IEEE80211_T_FH) {
-			mask |= IFM_IEEE80211_FH;
-			break;
-		}
+		if (ic && ic->ic_phytype == IEEE80211_T_FH)
+			return findmedia(rates, N(rates),
+			    rate | IFM_IEEE80211_FH);
 		/* NB: hack, 11g matches both 11b+11a rates */
 		/* fall thru... */
 	case IEEE80211_MODE_11G:
 	case IEEE80211_MODE_TURBO_G:
-		mask |= IFM_IEEE80211_11G;
-		break;
+		return findmedia(rates, N(rates), rate | IFM_IEEE80211_11G);
 	}
-	for (i = 0; i < N(rates); i++)
-		if (rates[i].m == mask)
-			return rates[i].r;
 	return IFM_AUTO;
 #undef N
 }


More information about the p4-projects mailing list