Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes and additions to NL80211 interface #1168

Merged
merged 7 commits into from
Feb 7, 2024
137 changes: 94 additions & 43 deletions pyroute2/netlink/nl80211/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,13 +217,13 @@
'NL80211_SCAN_FLAG_', globals()
)

NL80211_STA_FLAG_AUTHORIZED = 1
NL80211_STA_FLAG_SHORT_PREAMBLE = 2
NL80211_STA_FLAG_WME = 3
NL80211_STA_FLAG_MFP = 4
NL80211_STA_FLAG_AUTHENTICATED = 5
NL80211_STA_FLAG_TDLS_PEER = 6
NL80211_STA_FLAG_ASSOCIATED = 7
NL80211_STA_FLAG_AUTHORIZED = 1 << 1
NL80211_STA_FLAG_SHORT_PREAMBLE = 1 << 2
NL80211_STA_FLAG_WME = 1 << 3
NL80211_STA_FLAG_MFP = 1 << 4
NL80211_STA_FLAG_AUTHENTICATED = 1 << 5
NL80211_STA_FLAG_TDLS_PEER = 1 << 6
NL80211_STA_FLAG_ASSOCIATED = 1 << 7
(STA_FLAG_NAMES, STA_FLAG_VALUES) = map_namespace(
'NL80211_STA_FLAG_', globals()
)
Expand Down Expand Up @@ -1216,44 +1216,95 @@ def decode(self):
self.value["TDLS_PEER"] = False
self.value["ASSOCIATED"] = False

init = offset = self.offset + 4
while (offset - init) < (self.length - 4):
(msg_type, length) = struct.unpack_from(
'BB', self.data, offset
)
mask, set_ = struct.unpack_from(
'II', self.data, offset + 2
)
offset = self.offset + 4
mask, set_ = struct.unpack_from('II', self.data, offset)

if mask & NL80211_STA_FLAG_AUTHORIZED:
if set_ & NL80211_STA_FLAG_AUTHORIZED:
self.value["AUTHORIZED"] = True
if mask & NL80211_STA_FLAG_AUTHORIZED:
if set_ & NL80211_STA_FLAG_AUTHORIZED:
self.value["AUTHORIZED"] = True

if mask & NL80211_STA_FLAG_SHORT_PREAMBLE:
if set_ & NL80211_STA_FLAG_SHORT_PREAMBLE:
self.value["SHORT_PREAMBLE"] = True
if mask & NL80211_STA_FLAG_SHORT_PREAMBLE:
if set_ & NL80211_STA_FLAG_SHORT_PREAMBLE:
self.value["SHORT_PREAMBLE"] = True

if mask & NL80211_STA_FLAG_WME:
if set_ & NL80211_STA_FLAG_WME:
self.value["WME"] = True
if mask & NL80211_STA_FLAG_WME:
if set_ & NL80211_STA_FLAG_WME:
self.value["WME"] = True

if mask & NL80211_STA_FLAG_MFP:
if set_ & NL80211_STA_FLAG_MFP:
self.value["MFP"] = True
if mask & NL80211_STA_FLAG_MFP:
if set_ & NL80211_STA_FLAG_MFP:
self.value["MFP"] = True

if mask & NL80211_STA_FLAG_AUTHENTICATED:
if set_ & NL80211_STA_FLAG_AUTHENTICATED:
self.value["AUTHENTICATED"] = True
if mask & NL80211_STA_FLAG_AUTHENTICATED:
if set_ & NL80211_STA_FLAG_AUTHENTICATED:
self.value["AUTHENTICATED"] = True

if mask & NL80211_STA_FLAG_TDLS_PEER:
if set_ & NL80211_STA_FLAG_TDLS_PEER:
self.value["TDLS_PEER"] = True
if mask & NL80211_STA_FLAG_TDLS_PEER:
if set_ & NL80211_STA_FLAG_TDLS_PEER:
self.value["TDLS_PEER"] = True

if mask & NL80211_STA_FLAG_ASSOCIATED:
if set_ & NL80211_STA_FLAG_ASSOCIATED:
self.value["ASSOCIATED"] = True
if mask & NL80211_STA_FLAG_ASSOCIATED:
if set_ & NL80211_STA_FLAG_ASSOCIATED:
self.value["ASSOCIATED"] = True

offset += length + 2
class rate_info(nla):
'''
Decode the data rate information
See nl80211.h: enum nl80211_sta_info,
NL80211_STA_INFO_TX_BITRATE
NL80211_STA_INFO_RX_BITRATE
'''

prefix = "NL80211_RATE_INFO_"
nla_map = (
('__NL80211_RATE_INFO_INVALID', 'hex'),
('NL80211_RATE_INFO_BITRATE', 'uint16'),
('NL80211_RATE_INFO_MCS', 'uint8'),
('NL80211_RATE_INFO_40_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_SHORT_GI', 'flag'),
('NL80211_RATE_INFO_BITRATE32', 'uint32'),
('NL80211_RATE_INFO_VHT_MCS', 'uint8'),
('NL80211_RATE_INFO_VHT_NSS', 'uint8'),
('NL80211_RATE_INFO_80_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_80P80_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_160_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_10_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_5_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_HE_MCS', 'uint8'),
('NL80211_RATE_INFO_HE_NSS', 'uint8'),
('NL80211_RATE_INFO_HE_GI', 'uint8'),
('NL80211_RATE_INFO_HE_DCM', 'uint8'),
('NL80211_RATE_INFO_HE_RU_ALLOC', 'uint8'),
('NL80211_RATE_INFO_320_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_EHT_MCS', 'uint8'),
('NL80211_RATE_INFO_EHT_NSS', 'uint8'),
('NL80211_RATE_INFO_EHT_GI', 'uint8'),
('NL80211_RATE_INFO_EHT_RU_ALLOC', 'uint8'),
('NL80211_RATE_INFO_S1G_MCS', 'uint8'),
('NL80211_RATE_INFO_S1G_NSS', 'uint8'),
('NL80211_RATE_INFO_1_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_2_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_4_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_8_MHZ_WIDTH', 'flag'),
('NL80211_RATE_INFO_16_MHZ_WIDTH', 'flag'),
)

class bss_param(nla):
'''
Decode the BSS information
See nl80211.h: enum nl80211_sta_bss_param,
NL80211_STA_INFO_BSS_PARAM
'''

prefix = "NL80211_STA_BSS_PARAM_"
nla_map = (
('__NL80211_STA_BSS_PARAM_INVALID', 'hex'),
('NL80211_STA_BSS_PARAM_CTS_PROT', 'flag'),
('NL80211_STA_BSS_PARAM_SHORT_PREAMBLE', 'flag'),
('NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME', 'flag'),
('NL80211_STA_BSS_PARAM_DTIM_PERIOD', 'uint8'),
('NL80211_STA_BSS_PARAM_BEACON_INTERVAL', 'uint16'),
)

prefix = 'NL80211_STA_INFO_'
nla_map = (
Expand All @@ -1265,14 +1316,14 @@ def decode(self):
('NL80211_STA_INFO_PLID', 'uint16'),
('NL80211_STA_INFO_PLINK_STATE', 'uint8'),
('NL80211_STA_INFO_SIGNAL', 'int8'),
('NL80211_STA_INFO_TX_BITRATE', 'hex'),
('NL80211_STA_INFO_TX_BITRATE', 'rate_info'),
('NL80211_STA_INFO_RX_PACKETS', 'uint32'),
('NL80211_STA_INFO_TX_PACKETS', 'uint32'),
('NL80211_STA_INFO_TX_RETRIES', 'uint32'),
('NL80211_STA_INFO_TX_FAILED', 'uint32'),
('NL80211_STA_INFO_SIGNAL_AVG', 'int8'),
('NL80211_STA_INFO_RX_BITRATE', 'hex'),
('NL80211_STA_INFO_BSS_PARAM', 'hex'),
('NL80211_STA_INFO_RX_BITRATE', 'rate_info'),
('NL80211_STA_INFO_BSS_PARAM', 'bss_param'),
('NL80211_STA_INFO_CONNECTED_TIME', 'uint32'),
('NL80211_STA_INFO_STA_FLAGS', 'STAFlags'),
('NL80211_STA_INFO_BEACON_LOSS', 'uint32'),
Expand All @@ -1282,12 +1333,12 @@ def decode(self):
('NL80211_STA_INFO_NONPEER_PM', 'hex'),
('NL80211_STA_INFO_RX_BYTES64', 'uint64'),
('NL80211_STA_INFO_TX_BYTES64', 'uint64'),
('NL80211_STA_INFO_CHAIN_SIGNAL', 'string'),
('NL80211_STA_INFO_CHAIN_SIGNAL_AVG', 'string'),
('NL80211_STA_INFO_CHAIN_SIGNAL', '*int8'),
('NL80211_STA_INFO_CHAIN_SIGNAL_AVG', '*int8'),
('NL80211_STA_INFO_EXPECTED_THROUGHPUT', 'uint32'),
('NL80211_STA_INFO_RX_DROP_MISC', 'uint32'),
('NL80211_STA_INFO_BEACON_RX', 'uint64'),
('NL80211_STA_INFO_BEACON_SIGNAL_AVG', 'uint8'),
('NL80211_STA_INFO_BEACON_SIGNAL_AVG', 'int8'),
('NL80211_STA_INFO_TID_STATS', 'hex'),
('NL80211_STA_INFO_RX_DURATION', 'uint64'),
('NL80211_STA_INFO_PAD', 'hex'),
Expand Down