mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
net80211 / LinuxKPI 802.11: use enum ieee80211_sta_rx_bw for ni_chw
net80211 node ni_chw currently encodes the channel width as Mhz number. LinuxKPI 802.11 uses enum ieee80211_sta_rx_bw for the same. Rather than keeping the "20" and "40" throughout the code (eventually expanded to 80/160/320) switch them over to use the enum throughout. Once we get to 320Mhz channel widths we would otherwise also need to extend the uint8_t in struct ieee80211_node; making enum ieee80211_sta_rx_bw __packed allows us for lots more channel widths without breaking the KBI. Sponsored by: The FreeBSD Foundation Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D47891 (cherry picked from commit ca389486a9599768e0ba69dca13c208020623083) (cherry picked from commit 2c8b0d6205f6f98855773e3a82640b50abb2f2f6)
This commit is contained in:
parent
36ace2a923
commit
c5978cd3e4
9 changed files with 58 additions and 31 deletions
|
|
@ -387,14 +387,6 @@ enum ieee80211_sta_state {
|
|||
IEEE80211_STA_AUTHORIZED = 4, /* 802.1x */
|
||||
};
|
||||
|
||||
enum ieee80211_sta_rx_bw {
|
||||
IEEE80211_STA_RX_BW_20,
|
||||
IEEE80211_STA_RX_BW_40,
|
||||
IEEE80211_STA_RX_BW_80,
|
||||
IEEE80211_STA_RX_BW_160,
|
||||
IEEE80211_STA_RX_BW_320,
|
||||
};
|
||||
|
||||
enum ieee80211_tx_info_flags {
|
||||
/* XXX TODO .. right shift numbers - not sure where that came from? */
|
||||
IEEE80211_TX_CTL_AMPDU = BIT(0),
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ ath_rate_sample_find_min_pktlength(struct ath_softc *sc,
|
|||
const struct txschedule *sched = &sn->sched[rix0];
|
||||
int max_pkt_length = 65530; // ATH_AGGR_MAXSIZE
|
||||
// Note: this may not be true in all cases; need to check?
|
||||
int is_ht40 = (an->an_node.ni_chw == 40);
|
||||
int is_ht40 = (an->an_node.ni_chw == IEEE80211_STA_RX_BW_40);
|
||||
// Note: not great, but good enough..
|
||||
int idx = is_ht40 ? MCS_HT40 : MCS_HT20;
|
||||
|
||||
|
|
@ -973,7 +973,7 @@ update_stats(struct ath_softc *sc, struct ath_node *an,
|
|||
const int size_bin = size_to_bin(frame_size);
|
||||
const int size = bin_to_size(size_bin);
|
||||
int tt;
|
||||
int is_ht40 = (an->an_node.ni_chw == 40);
|
||||
int is_ht40 = (an->an_node.ni_chw == IEEE80211_STA_RX_BW_40);
|
||||
int pct;
|
||||
|
||||
if (!IS_RATE_DEFINED(sn, rix0))
|
||||
|
|
@ -1359,7 +1359,7 @@ ath_rate_ctl_reset(struct ath_softc *sc, struct ieee80211_node *ni)
|
|||
continue;
|
||||
printf(" %d %s/%d", dot11rate(rt, rix), dot11rate_label(rt, rix),
|
||||
calc_usecs_unicast_packet(sc, 1600, rix, 0,0,
|
||||
(ni->ni_chw == 40)));
|
||||
(ni->ni_chw == IEEE80211_STA_RX_BW_40)));
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
|
@ -1390,7 +1390,7 @@ ath_rate_ctl_reset(struct ath_softc *sc, struct ieee80211_node *ni)
|
|||
|
||||
sn->stats[y][rix].perfect_tx_time =
|
||||
calc_usecs_unicast_packet(sc, size, rix, 0, 0,
|
||||
(ni->ni_chw == 40));
|
||||
(ni->ni_chw == IEEE80211_STA_RX_BW_40));
|
||||
sn->stats[y][rix].average_tx_time =
|
||||
sn->stats[y][rix].perfect_tx_time;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -284,7 +284,7 @@ ath_tx_rate_fill_rcflags(struct ath_softc *sc, struct ath_buf *bf)
|
|||
if (IS_HT_RATE(rate)) {
|
||||
rc[i].flags |= ATH_RC_HT_FLAG;
|
||||
|
||||
if (ni->ni_chw == 40)
|
||||
if (ni->ni_chw == IEEE80211_STA_RX_BW_40)
|
||||
rc[i].flags |= ATH_RC_CW40_FLAG;
|
||||
|
||||
/*
|
||||
|
|
@ -296,7 +296,7 @@ ath_tx_rate_fill_rcflags(struct ath_softc *sc, struct ath_buf *bf)
|
|||
* and doesn't return the fractional part, so
|
||||
* we are always "out" by some amount.
|
||||
*/
|
||||
if (ni->ni_chw == 40 &&
|
||||
if (ni->ni_chw == IEEE80211_STA_RX_BW_40 &&
|
||||
ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI40 &&
|
||||
ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40 &&
|
||||
vap->iv_flags_ht & IEEE80211_FHT_SHORTGI40 &&
|
||||
|
|
@ -304,7 +304,7 @@ ath_tx_rate_fill_rcflags(struct ath_softc *sc, struct ath_buf *bf)
|
|||
rc[i].flags |= ATH_RC_SGI_FLAG;
|
||||
}
|
||||
|
||||
if (ni->ni_chw == 20 &&
|
||||
if (ni->ni_chw == IEEE80211_STA_RX_BW_20 &&
|
||||
ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI20 &&
|
||||
ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20 &&
|
||||
vap->iv_flags_ht & IEEE80211_FHT_SHORTGI20 &&
|
||||
|
|
|
|||
|
|
@ -4021,7 +4021,7 @@ mkpeerinfo(MWL_HAL_PEERINFO *pi, const struct ieee80211_node *ni)
|
|||
pi->HTCapabilitiesInfo &= ~IEEE80211_HTCAP_SHORTGI40;
|
||||
if ((vap->iv_flags_ht & IEEE80211_FHT_SHORTGI20) == 0)
|
||||
pi->HTCapabilitiesInfo &= ~IEEE80211_HTCAP_SHORTGI20;
|
||||
if (ni->ni_chw != 40)
|
||||
if (ni->ni_chw != IEEE80211_STA_RX_BW_40)
|
||||
pi->HTCapabilitiesInfo &= ~IEEE80211_HTCAP_CHWIDTH40;
|
||||
}
|
||||
return pi;
|
||||
|
|
|
|||
|
|
@ -294,8 +294,9 @@ _db_show_sta(const struct ieee80211_node *ni)
|
|||
db_printf("\thtcap %b htparam 0x%x htctlchan %u ht2ndchan %u\n",
|
||||
ni->ni_htcap, IEEE80211_HTCAP_BITS,
|
||||
ni->ni_htparam, ni->ni_htctlchan, ni->ni_ht2ndchan);
|
||||
db_printf("\thtopmode 0x%x htstbc 0x%x chw %u\n",
|
||||
ni->ni_htopmode, ni->ni_htstbc, ni->ni_chw);
|
||||
db_printf("\thtopmode 0x%x htstbc 0x%x chw %d (%s)\n",
|
||||
ni->ni_htopmode, ni->ni_htstbc,
|
||||
ni->ni_chw, ieee80211_ni_chw_to_str(ni->ni_chw));
|
||||
|
||||
/* XXX ampdu state */
|
||||
for (i = 0; i < WME_NUM_TID; i++)
|
||||
|
|
|
|||
|
|
@ -1477,7 +1477,7 @@ ieee80211_ht_wds_init(struct ieee80211_node *ni)
|
|||
ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI20;
|
||||
if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {
|
||||
ni->ni_htcap |= IEEE80211_HTCAP_CHWIDTH40;
|
||||
ni->ni_chw = 40;
|
||||
ni->ni_chw = IEEE80211_STA_RX_BW_40;
|
||||
if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan))
|
||||
ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_ABOVE;
|
||||
else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))
|
||||
|
|
@ -1485,7 +1485,7 @@ ieee80211_ht_wds_init(struct ieee80211_node *ni)
|
|||
if (vap->iv_flags_ht & IEEE80211_FHT_SHORTGI40)
|
||||
ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI40;
|
||||
} else {
|
||||
ni->ni_chw = 20;
|
||||
ni->ni_chw = IEEE80211_STA_RX_BW_20;
|
||||
ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_NONE;
|
||||
}
|
||||
ni->ni_htctlchan = ni->ni_chan->ic_ieee;
|
||||
|
|
@ -1581,7 +1581,7 @@ ieee80211_ht_node_join(struct ieee80211_node *ni)
|
|||
|
||||
if (ni->ni_flags & IEEE80211_NODE_HT) {
|
||||
vap->iv_ht_sta_assoc++;
|
||||
if (ni->ni_chw == 40)
|
||||
if (ni->ni_chw == IEEE80211_STA_RX_BW_40)
|
||||
vap->iv_ht40_sta_assoc++;
|
||||
}
|
||||
htinfo_update(vap);
|
||||
|
|
@ -1599,7 +1599,7 @@ ieee80211_ht_node_leave(struct ieee80211_node *ni)
|
|||
|
||||
if (ni->ni_flags & IEEE80211_NODE_HT) {
|
||||
vap->iv_ht_sta_assoc--;
|
||||
if (ni->ni_chw == 40)
|
||||
if (ni->ni_chw == IEEE80211_STA_RX_BW_40)
|
||||
vap->iv_ht40_sta_assoc--;
|
||||
}
|
||||
htinfo_update(vap);
|
||||
|
|
@ -1827,7 +1827,8 @@ htinfo_update_chw(struct ieee80211_node *ni, int htflags, int vhtflags)
|
|||
|
||||
done:
|
||||
/* update node's (11n) tx channel width */
|
||||
ni->ni_chw = IEEE80211_IS_CHAN_HT40(ni->ni_chan)? 40 : 20;
|
||||
ni->ni_chw = IEEE80211_IS_CHAN_HT40(ni->ni_chan) ?
|
||||
IEEE80211_STA_RX_BW_40 : IEEE80211_STA_RX_BW_20;
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
|
@ -2603,11 +2604,12 @@ ht_recv_action_ht_txchwidth(struct ieee80211_node *ni,
|
|||
{
|
||||
int chw;
|
||||
|
||||
chw = (frm[2] == IEEE80211_A_HT_TXCHWIDTH_2040) ? 40 : 20;
|
||||
chw = (frm[2] == IEEE80211_A_HT_TXCHWIDTH_2040) ?
|
||||
IEEE80211_STA_RX_BW_40 : IEEE80211_STA_RX_BW_20;
|
||||
|
||||
IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
|
||||
"%s: HT txchwidth, width %d%s",
|
||||
__func__, chw, ni->ni_chw != chw ? "*" : "");
|
||||
"%s: HT txchwidth, width %d%s (%s)", __func__,
|
||||
chw, ni->ni_chw != chw ? "*" : "", ieee80211_ni_chw_to_str(chw));
|
||||
if (chw != ni->ni_chw) {
|
||||
/* XXX does this need to change the ht40 station count? */
|
||||
ni->ni_chw = chw;
|
||||
|
|
|
|||
|
|
@ -2672,8 +2672,9 @@ ieee80211_dump_node(struct ieee80211_node_table *nt __unused,
|
|||
printf("\thtcap %x htparam %x htctlchan %u ht2ndchan %u\n",
|
||||
ni->ni_htcap, ni->ni_htparam,
|
||||
ni->ni_htctlchan, ni->ni_ht2ndchan);
|
||||
printf("\thtopmode %x htstbc %x htchw %u\n",
|
||||
ni->ni_htopmode, ni->ni_htstbc, ni->ni_chw);
|
||||
printf("\thtopmode %x htstbc %x htchw %d (%s)\n",
|
||||
ni->ni_htopmode, ni->ni_htstbc,
|
||||
ni->ni_chw, ieee80211_ni_chw_to_str(ni->ni_chw));
|
||||
printf("\tvhtcap %x freq1 %d freq2 %d vhtbasicmcs %x\n",
|
||||
ni->ni_vhtcap, (int) ni->ni_vht_chan1, (int) ni->ni_vht_chan2,
|
||||
(int) ni->ni_vht_basicmcs);
|
||||
|
|
@ -2831,7 +2832,7 @@ ieee80211_node_join(struct ieee80211_node *ni, int resp)
|
|||
ni->ni_flags & IEEE80211_NODE_QOS ? ", QoS" : "",
|
||||
/* XXX update for VHT string */
|
||||
ni->ni_flags & IEEE80211_NODE_HT ?
|
||||
(ni->ni_chw == 40 ? ", HT40" : ", HT20") : "",
|
||||
(ni->ni_chw == IEEE80211_STA_RX_BW_40 ? ", HT40" : ", HT20") : "",
|
||||
ni->ni_flags & IEEE80211_NODE_AMPDU ? " (+AMPDU)" : "",
|
||||
ni->ni_flags & IEEE80211_NODE_AMSDU ? " (+AMSDU)" : "",
|
||||
ni->ni_flags & IEEE80211_NODE_MIMO_RTS ? " (+SMPS-DYN)" :
|
||||
|
|
|
|||
|
|
@ -108,6 +108,37 @@ enum ieee80211_mesh_mlstate {
|
|||
#define IEEE80211_MESH_MLSTATE_BITS \
|
||||
"\20\1IDLE\2OPENSNT\2OPENRCV\3CONFIRMRCV\4ESTABLISHED\5HOLDING"
|
||||
|
||||
/*
|
||||
* This structure is shared with LinuxKPI 802.11 code describing up-to
|
||||
* which channel width the station can receive.
|
||||
* Rather than using hardcoded MHz values for the channel width use an enum with
|
||||
* flags. This allows us to keep the uint8_t slot for ni_chw in
|
||||
* struct ieee80211_node and means we do not have to sync to the value for
|
||||
* LinuxKPI.
|
||||
*
|
||||
* NB: BW_20 needs to 0 and values need to be sorted! Cannot make it
|
||||
* bitfield-alike for use with %b.
|
||||
*/
|
||||
enum ieee80211_sta_rx_bw {
|
||||
IEEE80211_STA_RX_BW_20 = 0x00,
|
||||
IEEE80211_STA_RX_BW_40,
|
||||
IEEE80211_STA_RX_BW_80,
|
||||
IEEE80211_STA_RX_BW_160,
|
||||
IEEE80211_STA_RX_BW_320,
|
||||
} __packed;
|
||||
|
||||
static inline const char *
|
||||
ieee80211_ni_chw_to_str(enum ieee80211_sta_rx_bw bw)
|
||||
{
|
||||
switch (bw) {
|
||||
case IEEE80211_STA_RX_BW_20: return ("BW_20");
|
||||
case IEEE80211_STA_RX_BW_40: return ("BW_40");
|
||||
case IEEE80211_STA_RX_BW_80: return ("BW_80");
|
||||
case IEEE80211_STA_RX_BW_160: return ("BW_160");
|
||||
case IEEE80211_STA_RX_BW_320: return ("BW_320");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Node specific information. Note that drivers are expected
|
||||
* to derive from this structure to add device-specific per-node
|
||||
|
|
@ -222,7 +253,7 @@ struct ieee80211_node {
|
|||
uint8_t ni_ht2ndchan; /* HT 2nd channel */
|
||||
uint8_t ni_htopmode; /* HT operating mode */
|
||||
uint8_t ni_htstbc; /* HT */
|
||||
uint8_t ni_chw; /* negotiated channel width */
|
||||
enum ieee80211_sta_rx_bw ni_chw; /* negotiated channel width */
|
||||
struct ieee80211_htrateset ni_htrates; /* negotiated ht rate set */
|
||||
struct ieee80211_tx_ampdu ni_tx_ampdu[WME_NUM_TID];
|
||||
struct ieee80211_rx_ampdu ni_rx_ampdu[WME_NUM_TID];
|
||||
|
|
|
|||
|
|
@ -1942,7 +1942,7 @@ sta_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, int subtype,
|
|||
vap->iv_flags&IEEE80211_F_USEPROT ? ", protection" : "",
|
||||
ni->ni_flags & IEEE80211_NODE_QOS ? ", QoS" : "",
|
||||
ni->ni_flags & IEEE80211_NODE_HT ?
|
||||
(ni->ni_chw == 40 ? ", HT40" : ", HT20") : "",
|
||||
(ni->ni_chw == IEEE80211_STA_RX_BW_40 ? ", HT40" : ", HT20") : "",
|
||||
ni->ni_flags & IEEE80211_NODE_AMPDU ? " (+AMPDU)" : "",
|
||||
ni->ni_flags & IEEE80211_NODE_AMSDU ? " (+AMSDU)" : "",
|
||||
ni->ni_flags & IEEE80211_NODE_MIMO_RTS ? " (+SMPS-DYN)" :
|
||||
|
|
|
|||
Loading…
Reference in a new issue