Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F111916789
D48615.id150013.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D48615.id150013.diff
View Options
diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -1949,6 +1949,7 @@
enum ieee80211_phymode mode;
const struct ieee80211_rateset *rs;
struct ieee80211_rateset allrates;
+ struct ieee80211_node_txrate tn;
/*
* Fill in media characteristics.
@@ -1968,7 +1969,8 @@
rs = &ic->ic_sup_rates[mode];
for (i = 0; i < rs->rs_nrates; i++) {
rate = rs->rs_rates[i];
- mword = ieee80211_rate2media(ic, rate, mode);
+ tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(rate);
+ mword = ieee80211_rate2media(ic, &tn, mode);
if (mword == 0)
continue;
addmedia(media, caps, addsta, mode, mword);
@@ -1990,8 +1992,8 @@
}
}
for (i = 0; i < allrates.rs_nrates; i++) {
- mword = ieee80211_rate2media(ic, allrates.rs_rates[i],
- IEEE80211_MODE_AUTO);
+ tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(allrates.rs_rates[i]);
+ mword = ieee80211_rate2media(ic, &tn, IEEE80211_MODE_AUTO);
if (mword == 0)
continue;
/* NB: remove media options from mword */
@@ -2071,6 +2073,7 @@
int i, rate, mword;
enum ieee80211_phymode mode;
const struct ieee80211_rateset *rs;
+ struct ieee80211_node_txrate tn;
/* NB: skip AUTO since it has no rates */
for (mode = IEEE80211_MODE_AUTO+1; mode < IEEE80211_MODE_11NA; mode++) {
@@ -2079,7 +2082,8 @@
ic_printf(ic, "%s rates: ", ieee80211_phymode_name[mode]);
rs = &ic->ic_sup_rates[mode];
for (i = 0; i < rs->rs_nrates; i++) {
- mword = ieee80211_rate2media(ic, rs->rs_rates[i], mode);
+ tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(rs->rs_rates[i]);
+ mword = ieee80211_rate2media(ic, &tn, mode);
if (mword == 0)
continue;
rate = ieee80211_media2rate(mword);
@@ -2278,6 +2282,7 @@
struct ieee80211vap *vap = ifp->if_softc;
struct ieee80211com *ic = vap->iv_ic;
enum ieee80211_phymode mode;
+ struct ieee80211_node_txrate tn;
imr->ifm_status = IFM_AVALID;
/*
@@ -2299,14 +2304,15 @@
/*
* A fixed rate is set, report that.
*/
- imr->ifm_active |= ieee80211_rate2media(ic,
- vap->iv_txparms[mode].ucastrate, mode);
+ tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(
+ vap->iv_txparms[mode].ucastrate);
+ imr->ifm_active |= ieee80211_rate2media(ic, &tn, mode);
} else if (vap->iv_opmode == IEEE80211_M_STA) {
/*
* In station mode report the current transmit rate.
*/
- imr->ifm_active |= ieee80211_rate2media(ic,
- ieee80211_node_get_txrate_dot11rate(vap->iv_bss), mode);
+ ieee80211_node_get_txrate(vap->iv_bss, &tn);
+ imr->ifm_active |= ieee80211_rate2media(ic, &tn, mode);
} else
imr->ifm_active |= IFM_AUTO;
if (imr->ifm_status & IFM_ACTIVE)
@@ -2399,7 +2405,8 @@
* or an MCS index.
*/
int
-ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode mode)
+ieee80211_rate2media(struct ieee80211com *ic,
+ const struct ieee80211_node_txrate *tr, enum ieee80211_phymode mode)
{
static const struct ratemedia rates[] = {
{ 2 | IFM_IEEE80211_FH, IFM_IEEE80211_FH1 },
@@ -2536,29 +2543,39 @@
* Check 11ac/11n rates first for match as an MCS.
*/
if (mode == IEEE80211_MODE_VHT_5GHZ) {
- if (rate & IFM_IEEE80211_VHT) {
- rate &= ~IFM_IEEE80211_VHT;
- m = findmedia(vhtrates, nitems(vhtrates), rate);
+ if (tr->type == IEEE80211_NODE_TXRATE_VHT) {
+ m = findmedia(vhtrates, nitems(vhtrates), tr->mcs);
if (m != IFM_AUTO)
return (m | IFM_IEEE80211_VHT);
}
} else if (mode == IEEE80211_MODE_11NA) {
- if (rate & IEEE80211_RATE_MCS) {
- rate &= ~IEEE80211_RATE_MCS;
- m = findmedia(htrates, nitems(htrates), rate);
+ /* NB: 12 is ambiguous, it will be treated as an MCS */
+ if ((tr->type == IEEE80211_NODE_TXRATE_LEGACY) &&
+ (tr->dot11rate & IEEE80211_RATE_MCS)) {
+ m = findmedia(htrates, nitems(htrates),
+ tr->dot11rate & ~IEEE80211_RATE_MCS);
if (m != IFM_AUTO)
return m | IFM_IEEE80211_11NA;
}
} else if (mode == IEEE80211_MODE_11NG) {
/* NB: 12 is ambiguous, it will be treated as an MCS */
- if (rate & IEEE80211_RATE_MCS) {
- rate &= ~IEEE80211_RATE_MCS;
- m = findmedia(htrates, nitems(htrates), rate);
+ if ((tr->type == IEEE80211_NODE_TXRATE_LEGACY) &&
+ (tr->dot11rate & IEEE80211_RATE_MCS)) {
+ m = findmedia(htrates, nitems(htrates),
+ tr->dot11rate & ~IEEE80211_RATE_MCS);
if (m != IFM_AUTO)
return m | IFM_IEEE80211_11NG;
}
}
- rate &= IEEE80211_RATE_VAL;
+
+ /*
+ * At this point it needs to be a dot11rate (legacy) for the
+ * rest of the logic to work.
+ */
+ if (tr->type != IEEE80211_NODE_TXRATE_LEGACY)
+ return (IFM_AUTO);
+ int rate = tr->dot11rate & IEEE80211_RATE_VAL;
+
switch (mode) {
case IEEE80211_MODE_11A:
case IEEE80211_MODE_HALF: /* XXX good 'nuf */
@@ -2716,3 +2733,4 @@
*/
return (!ieee80211_is_key_global(vap, key));
}
+
diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -317,9 +317,12 @@
ht_getrate(struct ieee80211com *ic, int index, enum ieee80211_phymode mode,
int ratetype)
{
+ struct ieee80211_node_txrate tr;
int mword, rate;
- mword = ieee80211_rate2media(ic, index | IEEE80211_RATE_MCS, mode);
+ tr = IEEE80211_NODE_TXRATE_INIT_HT(index);
+
+ mword = ieee80211_rate2media(ic, &tr, mode);
if (IFM_SUBTYPE(mword) != IFM_IEEE80211_MCS)
return (0);
switch (ratetype) {
diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h
--- a/sys/net80211/ieee80211_var.h
+++ b/sys/net80211/ieee80211_var.h
@@ -790,7 +790,8 @@
int ieee80211_media_change(struct ifnet *);
void ieee80211_media_status(struct ifnet *, struct ifmediareq *);
int ieee80211_ioctl(struct ifnet *, u_long, caddr_t);
-int ieee80211_rate2media(struct ieee80211com *, int,
+int ieee80211_rate2media(struct ieee80211com *,
+ const struct ieee80211_node_txrate *,
enum ieee80211_phymode);
int ieee80211_media2rate(int);
int ieee80211_mhz2ieee(u_int, u_int);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Mar 11, 5:52 AM (19 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17095636
Default Alt Text
D48615.id150013.diff (5 KB)
Attached To
Mode
D48615: net80211: migrate ieee80211_rate2media() to use ieee80211_node_txrate
Attached
Detach File
Event Timeline
Log In to Comment