Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144500079
D48607.1775025992.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D48607.1775025992.diff
View Options
diff --git a/sys/net80211/ieee80211_ddb.c b/sys/net80211/ieee80211_ddb.c
--- a/sys/net80211/ieee80211_ddb.c
+++ b/sys/net80211/ieee80211_ddb.c
@@ -317,9 +317,9 @@
#endif
/* VHT state */
- db_printf("\tvhtcap %b vht_basicmcs %#06x vht_pad2 %#06x\n",
+ db_printf("\tvhtcap %b vht_basicmcs %#06x vht_tx_map %#06x\n",
ni->ni_vhtcap, IEEE80211_VHTCAP_BITS,
- ni->ni_vht_basicmcs, ni->ni_vht_pad2);
+ ni->ni_vht_basicmcs, ni->ni_vht_tx_map);
db_printf("\tvht_mcsinfo: { rx_mcs_map %#06x rx_highest %#06x "
"tx_mcs_map %#06x tx_highest %#06x }\n",
ni->ni_vht_mcsinfo.rx_mcs_map, ni->ni_vht_mcsinfo.rx_highest,
diff --git a/sys/net80211/ieee80211_node.h b/sys/net80211/ieee80211_node.h
--- a/sys/net80211/ieee80211_node.h
+++ b/sys/net80211/ieee80211_node.h
@@ -274,8 +274,8 @@
/* VHT state */
uint32_t ni_vhtcap;
- uint16_t ni_vht_basicmcs;
- uint16_t ni_vht_pad2;
+ uint16_t ni_vht_basicmcs; /* Basic VHT MCS bitmap from IE */
+ uint16_t ni_vht_tx_map; /* Negotiated MCS TX map with peer */
struct ieee80211_vht_mcs_info ni_vht_mcsinfo;
uint8_t ni_vht_chan1; /* 20/40/80/160 - VHT chan1 */
uint8_t ni_vht_chan2; /* 80+80 - VHT chan2 */
diff --git a/sys/net80211/ieee80211_node.c b/sys/net80211/ieee80211_node.c
--- a/sys/net80211/ieee80211_node.c
+++ b/sys/net80211/ieee80211_node.c
@@ -1044,8 +1044,7 @@
ieee80211_vht_updateparams(ni,
ni->ni_ies.vhtcap_ie,
ni->ni_ies.vhtopmode_ie);
- ieee80211_setup_vht_rates(ni, ni->ni_ies.vhtcap_ie,
- ni->ni_ies.vhtopmode_ie);
+ ieee80211_setup_vht_rates(ni);
do_ht = 1;
}
}
@@ -1874,9 +1873,7 @@
ieee80211_vht_updateparams(ni,
ni->ni_ies.vhtcap_ie,
ni->ni_ies.vhtopmode_ie);
- ieee80211_setup_vht_rates(ni,
- ni->ni_ies.vhtcap_ie,
- ni->ni_ies.vhtopmode_ie);
+ ieee80211_setup_vht_rates(ni);
}
}
diff --git a/sys/net80211/ieee80211_sta.c b/sys/net80211/ieee80211_sta.c
--- a/sys/net80211/ieee80211_sta.c
+++ b/sys/net80211/ieee80211_sta.c
@@ -1875,7 +1875,7 @@
} else {
ieee80211_vht_node_init(ni);
ieee80211_vht_updateparams(ni, vhtcap, vhtopmode);
- ieee80211_setup_vht_rates(ni, vhtcap, vhtopmode);
+ ieee80211_setup_vht_rates(ni);
}
}
diff --git a/sys/net80211/ieee80211_vht.h b/sys/net80211/ieee80211_vht.h
--- a/sys/net80211/ieee80211_vht.h
+++ b/sys/net80211/ieee80211_vht.h
@@ -40,8 +40,7 @@
int ieee80211_vht_updateparams(struct ieee80211_node *,
const uint8_t *, const uint8_t *);
-void ieee80211_setup_vht_rates(struct ieee80211_node *,
- const uint8_t *, const uint8_t *);
+void ieee80211_setup_vht_rates(struct ieee80211_node *);
void ieee80211_vht_timeout(struct ieee80211vap *vap);
diff --git a/sys/net80211/ieee80211_vht.c b/sys/net80211/ieee80211_vht.c
--- a/sys/net80211/ieee80211_vht.c
+++ b/sys/net80211/ieee80211_vht.c
@@ -284,14 +284,65 @@
return (0);
}
+/**
+ * @brief calculate the supported MCS rates for this node
+ *
+ * This is called once a node has finished association /
+ * joined a BSS. The vhtcap / vhtop IEs are from the
+ * peer. The transmit rate tables need to be combined
+ * together to setup the list of available rates.
+ *
+ * This must be called after the ieee80211_node VHT fields
+ * have been parsed / populated by either ieee80211_vht_updateparams() or
+ * ieee80211_parse_vhtcap(),
+ *
+ * This does not take into account the channel bandwidth,
+ * which (a) may change during operation, and (b) depends
+ * upon packet to packet rate transmission selection.
+ * There are various rate combinations which are not
+ * available in various channel widths and those will
+ * need to be masked off separately.
+ *
+ * (See 802.11-2020 21.5 Parameters for VHT-MCSs for the
+ * tables and supported rates.)
+ *
+ * ALSO: i need to do some filtering based on the HT set too.
+ * (That should be done here too, and in the negotiation, sigh.)
+ * (See 802.11-2016 10.7.12.3 Additional rate selection constraints
+ * for VHT PPDUs)
+ *
+ * @param ni struct ieee80211_node to configure
+ */
void
-ieee80211_setup_vht_rates(struct ieee80211_node *ni,
- const uint8_t *vhtcap_ie,
- const uint8_t *vhtop_ie)
+ieee80211_setup_vht_rates(struct ieee80211_node *ni)
{
+ struct ieee80211vap *vap = ni->ni_vap;
+ uint32_t val, val1, val2;
+ uint16_t tx_mcs_map = 0;
+ int i;
- //printf("%s: called\n", __func__);
- /* XXX TODO */
+ /*
+ * Merge our tx_mcs_map with the peer rx_mcs_map to determine what
+ * can be actually transmitted to the peer.
+ */
+
+ for (i = 0; i < 8; i++) {
+ /*
+ * Merge the two together; remember that 0..2 is in order
+ * of increasing MCS support, but 3 equals
+ * IEEE80211_VHT_MCS_NOT_SUPPORTED so must "win".
+ */
+ val1 = (vap->iv_vht_cap.supp_mcs.tx_mcs_map >> (i*2)) & 0x3;
+ val2 = (ni->ni_vht_mcsinfo.rx_mcs_map >> (i*2)) & 0x3;
+ val = MIN(val1, val2);
+ if (val1 == IEEE80211_VHT_MCS_NOT_SUPPORTED ||
+ val2 == IEEE80211_VHT_MCS_NOT_SUPPORTED)
+ val = IEEE80211_VHT_MCS_NOT_SUPPORTED;
+ tx_mcs_map |= (val << (i*2));
+ }
+
+ /* Store the TX MCS map somewhere in the node that can be used */
+ ni->ni_vht_tx_map = tx_mcs_map;
}
void
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Apr 1, 6:46 AM (4 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28237871
Default Alt Text
D48607.1775025992.diff (5 KB)
Attached To
Mode
D48607: net80211: Implement ieee80211_setup_vht_rates()
Attached
Detach File
Event Timeline
Log In to Comment