aboutsummaryrefslogtreecommitdiff
path: root/sys/net80211
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2025-04-10 20:27:14 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2025-05-03 15:38:51 +0000
commit44ec60a4290b1b4dd4842889038c399a7bed17bd (patch)
treeb12e85005f7de127d3bfeae0a0420bbaa8510801 /sys/net80211
parent363846a7e31b013dc7ebccd8017578fe79ee5103 (diff)
Diffstat (limited to 'sys/net80211')
-rw-r--r--sys/net80211/ieee80211_superg.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/sys/net80211/ieee80211_superg.c b/sys/net80211/ieee80211_superg.c
index ee3b70d5ed9f..fcf0c614b0a0 100644
--- a/sys/net80211/ieee80211_superg.c
+++ b/sys/net80211/ieee80211_superg.c
@@ -721,6 +721,7 @@ static uint32_t
ff_approx_txtime(struct ieee80211_node *ni,
const struct mbuf *m1, const struct mbuf *m2)
{
+ struct ieee80211_node_txrate txr;
struct ieee80211com *ic = ni->ni_ic;
struct ieee80211vap *vap = ni->ni_vap;
uint32_t framelen;
@@ -743,20 +744,33 @@ ff_approx_txtime(struct ieee80211_node *ni,
if (m2 != NULL)
framelen += m2->m_pkthdr.len;
- /*
- * For now, we assume non-shortgi, 20MHz, just because I want to
- * at least test 802.11n.
- */
- dot11rate = ieee80211_node_get_txrate_dot11rate(ni);
- if (dot11rate & IEEE80211_RATE_MCS)
+ ieee80211_node_get_txrate(ni, &txr);
+
+ switch (txr.type) {
+ case IEEE80211_NODE_TXRATE_LEGACY:
+ dot11rate = ieee80211_node_get_txrate_dot11rate(ni);
+ frame_time = ieee80211_compute_duration(ic->ic_rt, framelen,
+ dot11rate, 0);
+ break;
+ case IEEE80211_NODE_TXRATE_HT:
+ /* TODO: check ht40/shortgi */
+ dot11rate = ieee80211_node_get_txrate_dot11rate(ni);
frame_time = ieee80211_compute_duration_ht(framelen,
dot11rate,
IEEE80211_HT_RC_2_STREAMS(dot11rate),
0, /* isht40 */
0); /* isshortgi */
- else
- frame_time = ieee80211_compute_duration(ic->ic_rt, framelen,
- dot11rate, 0);
+ break;
+ case IEEE80211_NODE_TXRATE_VHT:
+ /* TODO: there's no VHT frame length calculation just yet */
+ frame_time = 1000; /* 1ms */
+ break;
+ case IEEE80211_NODE_TXRATE_UNDEFINED:
+ /* TODO: proper error handling */
+ frame_time = 4000; /* 4ms */
+ break;
+ }
+
return (frame_time);
}