* [PATCH 0/2] wifi: nl80211: Document sta-info nested attribute
@ 2026-08-21 7:47 Hilal Rahmatullah
2026-08-21 7:47 ` [PATCH 1/2] wifi: nl80211: add " Hilal Rahmatullah
2026-08-21 7:47 ` [PATCH 2/2] net: ynl: allow u8 sub-type for indexed array Hilal Rahmatullah
0 siblings, 2 replies; 5+ messages in thread
From: Hilal Rahmatullah @ 2026-08-21 7:47 UTC (permalink / raw)
To: Donald Hunter, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Hilal Rahmatullah
There are many undocumented attribute in nl80211 specification
documentation, this patch series aims to document
NL80211_ATTR_STA_INFO nested attribute from the previous
binary type.
This patch merges/supersedes 2 related patches.
Link: https://lore.kernel.org/netdev/20260820110904.28645-1-hilalrahmatullah11@gmail.com
Link: https://lore.kernel.org/netdev/20260820072141.15779-1-hilalrahmatullah11@gmail.com
Signed-off-by: Hilal Rahmatullah <hilalrahmatullah11@gmail.com>
---
Hilal Rahmatullah (2):
wifi: nl80211: add sta-info nested attribute
net: ynl: allow u8 sub-type for indexed array
Documentation/netlink/specs/nl80211.yaml | 368 ++++++++++++++++++++++++++++++-
tools/net/ynl/pyynl/ynl_gen_c.py | 2 +-
2 files changed, 368 insertions(+), 2 deletions(-)
---
base-commit: 3d6d817622b0a9721e3cc404df3469171582be13
change-id: 20260821-work-b9d257341ca7
Best regards,
--
Hilal Rahmatullah <hilalrahmatullah11@gmail.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] wifi: nl80211: add sta-info nested attribute
2026-08-21 7:47 [PATCH 0/2] wifi: nl80211: Document sta-info nested attribute Hilal Rahmatullah
@ 2026-08-21 7:47 ` Hilal Rahmatullah
2026-08-25 1:36 ` Jakub Kicinski
2026-08-21 7:47 ` [PATCH 2/2] net: ynl: allow u8 sub-type for indexed array Hilal Rahmatullah
1 sibling, 1 reply; 5+ messages in thread
From: Hilal Rahmatullah @ 2026-08-21 7:47 UTC (permalink / raw)
To: Donald Hunter, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Hilal Rahmatullah
Add NL80211_ATTR_STA_INFO nested attribute definition, along with
its related attributes and enum.
Signed-off-by: Hilal Rahmatullah <hilalrahmatullah11@gmail.com>
---
Documentation/netlink/specs/nl80211.yaml | 368 ++++++++++++++++++++++++++++++-
1 file changed, 367 insertions(+), 1 deletion(-)
diff --git a/Documentation/netlink/specs/nl80211.yaml b/Documentation/netlink/specs/nl80211.yaml
index 802097128bda..cc5ef34f8dec 100644
--- a/Documentation/netlink/specs/nl80211.yaml
+++ b/Documentation/netlink/specs/nl80211.yaml
@@ -211,6 +211,76 @@ definitions:
- ht20
- ht40minus
- ht40plus
+ -
+ name: eht-gi
+ type: enum
+ name-prefix: nl80211-rate-info-eht-gi-
+ entries:
+ - 0-8
+ - 1-6
+ - 3-2
+ -
+ name: eht-ru-alloc
+ type: enum
+ name-prefix: nl80211-rate-info-he-ru-alloc-
+ entries:
+ - "26"
+ - "52"
+ - 52p26
+ - "106"
+ - 106p26
+ - "242"
+ - "484"
+ - 484p242
+ - "996"
+ - 996p484
+ - 996p484p242
+ - 2x996
+ - 2x996p484
+ - 3x996
+ - 3x996p484
+ - 4x996
+ -
+ name: he-gi
+ type: enum
+ name-prefix: nl80211-rate-info-he-gi-
+ entries:
+ - 0-8
+ - 1-6
+ - 3-2
+ -
+ name: he-ru-alloc
+ type: enum
+ name-prefix: nl80211-rate-info-he-ru-alloc-
+ entries:
+ - "26"
+ - "52"
+ - "106"
+ - "242"
+ - "484"
+ - "996"
+ - 2x996
+ -
+ name: mesh-power-mode
+ type: enum
+ name-prefix: nl80211-mesh-power-
+ entries:
+ - unknown
+ - active
+ - light-sleep
+ - deep-sleep
+ -
+ name: plink-state
+ type: enum
+ name-prefix: nl80211-plink-
+ entries:
+ - listen
+ - opn-snt
+ - opn-rcvd
+ - cnf-rcvd
+ - estab
+ - holding
+ - blocked
-
name: sta-flag-update
type: struct
@@ -297,7 +367,8 @@ attribute-sets:
type: u32
-
name: sta-info
- type: binary # TODO: nest
+ type: nest
+ nested-attributes: sta-info-attrs
-
name: wiphy-bands
type: nest
@@ -1601,6 +1672,111 @@ attribute-sets:
name: nan
type: nest
nested-attributes: frame-type-attrs
+ -
+ name: rate-info-attrs
+ enum-name: nl80211-rate-info
+ name-prefix: nl80211-rate-info-
+ attributes:
+ -
+ name: bitrate
+ type: u16
+ -
+ name: mcs
+ type: u8
+ -
+ name: 40-mhz-width
+ type: flag
+ -
+ name: short-gi
+ type: flag
+ -
+ name: bitrate32
+ type: u32
+ -
+ name: vht-mcs
+ type: u8
+ -
+ name: vht-nss
+ type: u8
+ -
+ name: 80-mhz-width
+ type: flag
+ -
+ name: 80p80-mhz-width
+ type: unused
+ -
+ name: 160-mhz-width
+ type: flag
+ -
+ name: 10-mhz-width
+ type: flag
+ -
+ name: 5-mhz-width
+ type: flag
+ -
+ name: he-mcs
+ type: u8
+ -
+ name: he-nss
+ type: u8
+ -
+ name: he-gi
+ type: u8
+ enum: he-gi
+ -
+ name: he-dcm
+ type: u8
+ -
+ name: he-ru-alloc
+ type: u8
+ enum: he-ru-alloc
+ -
+ name: 320-mhz-width
+ type: flag
+ -
+ name: eht-mcs
+ type: u8
+ -
+ name: eht-nss
+ type: u8
+ -
+ name: eht-gi
+ type: u8
+ enum: eht-gi
+ -
+ name: eht-ru-alloc
+ type: u8
+ enum: eht-ru-alloc
+ -
+ name: s1g-mcs
+ type: u8
+ -
+ name: s1g-nss
+ type: u8
+ -
+ name: 1-mhz-width
+ type: flag
+ -
+ name: 2-mhz-width
+ type: flag
+ -
+ name: 4-mhz-width
+ type: flag
+ -
+ name: 8-mhz-width
+ type: flag
+ -
+ name: 16-mhz-width
+ type: flag
+ -
+ name: uhr-mcs
+ type: u8
+ -
+ name: uhr-elr
+ type: flag
+ -
+ name: uhr-im
+ type: flag
-
name: sar-attributes
enum-name: nl80211-sar-attrs
@@ -1631,6 +1807,172 @@ attribute-sets:
-
name: end-freq
type: u32
+ -
+ name: sta-bss-param-attrs
+ enum-name: nl80211-sta-bss-param
+ name-prefix: nl80211-sta-bss-param-
+ attributes:
+ -
+ name: cts-prot
+ type: flag
+ -
+ name: short-preamble
+ type: flag
+ -
+ name: short-slot-time
+ type: flag
+ -
+ name: dtim-period
+ type: u8
+ -
+ name: beacon-interval
+ type: u16
+ -
+ name: sta-info-attrs
+ enum-name: nl80211-sta-info
+ name-prefix: nl80211-sta-info-
+ attributes:
+ -
+ name: inactive-time
+ type: u32
+ -
+ name: rx-bytes
+ type: u32
+ -
+ name: tx-bytes
+ type: u32
+ -
+ name: llid
+ type: u16
+ -
+ name: plid
+ type: u16
+ -
+ name: plink-state
+ type: u8
+ enum: plink-state
+ -
+ name: signal
+ type: u8
+ -
+ name: tx-bitrate
+ type: nest
+ nested-attributes: rate-info-attrs
+ -
+ name: rx-packets
+ type: u32
+ -
+ name: tx-packets
+ type: u32
+ -
+ name: tx-retries
+ type: u32
+ -
+ name: tx-failed
+ type: u32
+ -
+ name: signal-avg
+ type: u8
+ -
+ name: rx-bitrate
+ type: nest
+ nested-attributes: rate-info-attrs
+ -
+ name: bss-param
+ type: nest
+ nested-attributes: sta-bss-param-attrs
+ -
+ name: connected-time
+ type: u32
+ -
+ name: sta-flags
+ type: binary
+ struct: sta-flag-update
+ -
+ name: beacon-loss
+ type: u32
+ -
+ name: t-offset
+ type: s64
+ -
+ name: local-pm
+ type: u32
+ enum: mesh-power-mode
+ -
+ name: peer-pm
+ type: u32
+ enum: mesh-power-mode
+ -
+ name: nonpeer-pm
+ type: u32
+ enum: mesh-power-mode
+ -
+ name: rx-bytes64
+ type: u64
+ -
+ name: tx-bytes64
+ type: u64
+ -
+ name: chain-signal
+ type: indexed-array
+ sub-type: u8
+ -
+ name: chain-signal-avg
+ type: indexed-array
+ sub-type: u8
+ -
+ name: expected-throughput
+ type: u32
+ -
+ name: rx-drop-misc
+ type: u64
+ -
+ name: beacon-rx
+ type: u64
+ -
+ name: beacon-signal-avg
+ type: u8
+ -
+ name: tid-stats
+ type: indexed-array
+ sub-type: nest
+ nested-attributes: tid-stats-attrs
+ -
+ name: rx-duration
+ type: u64
+ -
+ name: pad
+ type: binary
+ -
+ name: ack-signal
+ type: u8
+ -
+ name: ack-signal-avg
+ type: s8
+ -
+ name: rx-mpdus
+ type: u32
+ -
+ name: fcs-error-count
+ type: u32
+ -
+ name: connected-to-gate
+ type: u8
+ -
+ name: tx-duration
+ type: u64
+ -
+ name: airtime-weight
+ type: u16
+ -
+ name: airtime-link-metric
+ type: u32
+ -
+ name: assoc-at-boottime
+ type: u64
+ -
+ name: connected-to-as
+ type: u8
-
name: supported-iftypes
enum-name: nl80211-iftype
@@ -1672,6 +2014,30 @@ attribute-sets:
-
name: nan
type: flag
+ -
+ name: tid-stats-attrs
+ enum-name: nl80211-tid-stats
+ name-prefix: nl80211-tid-stats-
+ attributes:
+ -
+ name: rx-msdu
+ type: u64
+ -
+ name: tx-msdu
+ type: u64
+ -
+ name: tx-msdu-retries
+ type: u64
+ -
+ name: tx-msdu-failed
+ type: u64
+ -
+ name: pad
+ type: binary
+ -
+ name: txq-stats
+ type: nest
+ nested-attributes: txq-stats-attrs
-
name: txq-stats-attrs
name-prefix: nl80211-txq-stats-
--
2.53.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] net: ynl: allow u8 sub-type for indexed array
2026-08-21 7:47 [PATCH 0/2] wifi: nl80211: Document sta-info nested attribute Hilal Rahmatullah
2026-08-21 7:47 ` [PATCH 1/2] wifi: nl80211: add " Hilal Rahmatullah
@ 2026-08-21 7:47 ` Hilal Rahmatullah
2026-08-25 1:36 ` Jakub Kicinski
1 sibling, 1 reply; 5+ messages in thread
From: Hilal Rahmatullah @ 2026-08-21 7:47 UTC (permalink / raw)
To: Donald Hunter, Jakub Kicinski, David S. Miller, Eric Dumazet,
Paolo Abeni, Simon Horman
Cc: netdev, linux-kernel, Hilal Rahmatullah
add u8 to the supported sub-type for indexed array,
it is needed for NL80211_STA_INFO_CHAIN_SIGNAL serialization.
Signed-off-by: Hilal Rahmatullah <hilalrahmatullah11@gmail.com>
---
tools/net/ynl/pyynl/ynl_gen_c.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
index cdc3646f2642..7373a48d5516 100755
--- a/tools/net/ynl/pyynl/ynl_gen_c.py
+++ b/tools/net/ynl/pyynl/ynl_gen_c.py
@@ -1158,7 +1158,7 @@ class AttrSet(SpecAttrSet):
elif elem['type'] == 'nest':
t = TypeNest(self.family, self, elem, value)
elif elem['type'] == 'indexed-array' and 'sub-type' in elem:
- if elem["sub-type"] in ['binary', 'nest', 'u32']:
+ if elem["sub-type"] in ['binary', 'nest', 'u32', 'u8']:
t = TypeIndexedArray(self.family, self, elem, value)
else:
raise Exception(f'new_attr: unsupported sub-type {elem["sub-type"]}')
--
2.53.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] wifi: nl80211: add sta-info nested attribute
2026-08-21 7:47 ` [PATCH 1/2] wifi: nl80211: add " Hilal Rahmatullah
@ 2026-08-25 1:36 ` Jakub Kicinski
0 siblings, 0 replies; 5+ messages in thread
From: Jakub Kicinski @ 2026-08-25 1:36 UTC (permalink / raw)
To: hilalrahmatullah11
Cc: Jakub Kicinski, donald.hunter, davem, edumazet, pabeni, horms,
netdev, linux-kernel
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
---
wifi: nl80211: add sta-info nested attribute
This converts NL80211_ATTR_STA_INFO in the nl80211 YAML spec from an
opaque binary blob into a proper nest, and adds the sta-info-attrs,
rate-info-attrs, sta-bss-param-attrs and tid-stats-attrs attribute sets
plus the enum definitions they reference.
A few questions about the new definitions below.
> diff --git a/Documentation/netlink/specs/nl80211.yaml b/Documentation/netlink/specs/nl80211.yaml
> index 802097128bdae..cc5ef34f8decc 100644
> --- a/Documentation/netlink/specs/nl80211.yaml
> +++ b/Documentation/netlink/specs/nl80211.yaml
> @@ -211,6 +211,76 @@ definitions:
> - ht20
> - ht40minus
> - ht40plus
[ ... ]
> + -
> + name: eht-ru-alloc
> + type: enum
> + name-prefix: nl80211-rate-info-he-ru-alloc-
^^^^
[Severity: Medium]
Is the he- prefix here a copy/paste slip? The sixteen entries below match
enum nl80211_eht_ru_alloc in include/uapi/linux/nl80211.h exactly in order
(26, 52, 52p26, 106, 106p26, 242, 484, 484p242, 996, 996p484, 996p484p242,
2x996, 2x996p484, 3x996, 3x996p484, 4x996), and those constants are spelled
NL80211_RATE_INFO_EHT_RU_ALLOC_*, so the prefix would need to be
nl80211-rate-info-eht-ru-alloc- to describe the uAPI.
As written, this definition and the he-ru-alloc definition a few lines
further down carry the same name-prefix but assign different values to the
same suffixes. The HE enum has value 2 == 106, while this list has
value 2 == 52p26.
Since the generator builds constant names from name-prefix:
tools/net/ynl/pyynl/ynl_gen_c.py:EnumSet.__init__() {
...
self.value_pfx = yaml.get('name-prefix', f"{family.ident_name}-{yaml['name']}-")
...
}
wouldn't a --mode uapi render emit two conflicting definitions of
NL80211_RATE_INFO_HE_RU_ALLOC_26/52/106/242/484/996/2X996? The spec is
installed for user space via make install-specs, so the wrong names are
directly consumable. I checked the tip of the series and the he- prefix is
still there, so it does not look like a later patch corrects it.
> + entries:
> + - "26"
> + - "52"
> + - 52p26
> + - "106"
> + - 106p26
> + - "242"
> + - "484"
> + - 484p242
> + - "996"
> + - 996p484
> + - 996p484p242
> + - 2x996
> + - 2x996p484
> + - 3x996
> + - 3x996p484
> + - 4x996
[ ... ]
> + -
> + name: he-ru-alloc
> + type: enum
> + name-prefix: nl80211-rate-info-he-ru-alloc-
> + entries:
> + - "26"
> + - "52"
> + - "106"
> + - "242"
> + - "484"
> + - "996"
> + - 2x996
[ ... ]
> @@ -1601,6 +1672,111 @@ attribute-sets:
> name: nan
> type: nest
> nested-attributes: frame-type-attrs
> + -
> + name: rate-info-attrs
> + enum-name: nl80211-rate-info
> + name-prefix: nl80211-rate-info-
> + attributes:
[ ... ]
> + -
> + name: eht-ru-alloc
> + type: u8
> + enum: eht-ru-alloc
This is the attribute that picks up the mis-prefixed definition above, so
the spec currently describes EHT RU-allocation values under HE constant
names.
[ ... ]
> @@ -1631,6 +1807,172 @@ attribute-sets:
> -
> name: end-freq
> type: u32
[ ... ]
> + -
> + name: sta-info-attrs
> + enum-name: nl80211-sta-info
> + name-prefix: nl80211-sta-info-
> + attributes:
[ ... ]
> + -
> + name: chain-signal
> + type: indexed-array
> + sub-type: u8
> + -
> + name: chain-signal-avg
> + type: indexed-array
> + sub-type: u8
[Severity: Low]
Does a ynl build still work at this commit? AttrSet.new_attr() only accepts
three sub-types for indexed arrays and raises otherwise:
tools/net/ynl/pyynl/ynl_gen_c.py:AttrSet.new_attr() {
...
elif elem['type'] == 'indexed-array' and 'sub-type' in elem:
if elem["sub-type"] in ['binary', 'nest', 'u32']:
t = TypeIndexedArray(self.family, self, elem, value)
else:
raise Exception(f'new_attr: unsupported sub-type {elem["sub-type"]}')
...
}
tools/net/ynl/generated/Makefile generates for every spec except conntrack
and nftables, so nl80211.yaml is processed and make -C tools/net/ynl would
abort here.
The following patch in the series, "net: ynl: allow u8 sub-type for indexed
array", adds 'u8' to that whitelist, and at the series tip the list reads
['binary', 'nest', 'u32', 'u8'], so only the intermediate commits are
affected. Would swapping the order of the two patches keep the tree
bisectable?
[ ... ]
> + -
> + name: tid-stats
> + type: indexed-array
> + sub-type: nest
> + nested-attributes: tid-stats-attrs
[Severity: Medium]
Should the TID index offset be recorded somewhere here? The plain
indexed-array model says the entry nests have the index of the entry as
their type, but the kernel does not use a 0-based index:
net/wireless/nl80211.c:nl80211_send_station() {
...
for (tid = 0; tid < IEEE80211_NUM_TIDS + 1; tid++) {
struct cfg80211_tid_stats *tidstats = &sinfo->pertid[tid];
if (!tidstats->filled)
continue;
tidattr = nla_nest_start_noflag(msg, tid + 1);
...
}
and include/uapi/linux/nl80211.h documents it as "the inner attribute
number is the TID+1 and the special TID 16 (i.e. value 17) is used for
non-QoS frames".
Because unfilled TIDs are skipped, the array is also sparse, and the C
generator throws the entry type away:
tools/net/ynl/pyynl/ynl_gen_c.py:TypeIndexedArray._attr_get() {
...
get_lines = [f'attr_{self.c_name} = attr;',
'ynl_attr_for_each_nested(attr2, attr) {',
'\tif (__ynl_attr_validate(yarg, attr2, type))',
'\t\treturn YNL_PARSE_CB_ERROR;',
f'\tn_{self.c_name}++;',
'}']
...
}
so a generated C consumer fills a dense array in encounter order and reports
per-TID counters against the wrong TID. The Python library keeps the raw
index as a dict key, so there the offset is only undocumented.
Note the same construct two attributes earlier is genuinely 0-based:
net/wireless/nl80211.c:nl80211_put_signal() {
...
for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
...
if (nla_put_u8(msg, i, signal[i]))
...
}
Can the two different index semantics be distinguished from this spec as it
stands?
[ ... ]
Cross-instance finding from sashiko-gemini (68565e9f44913e1546bdedfd69f80fe6b57cbeb2edfb4bc54f79467c320b20e1):
[Severity: Medium]
The `pad` attributes in `sta-info-attrs` and `tid-stats-attrs` violate the netlink YAML policy by using type `binary` instead of `pad`.
--
pw-bot: cr
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] net: ynl: allow u8 sub-type for indexed array
2026-08-21 7:47 ` [PATCH 2/2] net: ynl: allow u8 sub-type for indexed array Hilal Rahmatullah
@ 2026-08-25 1:36 ` Jakub Kicinski
0 siblings, 0 replies; 5+ messages in thread
From: Jakub Kicinski @ 2026-08-25 1:36 UTC (permalink / raw)
To: hilalrahmatullah11
Cc: Jakub Kicinski, donald.hunter, davem, edumazet, pabeni, horms,
netdev, linux-kernel
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
---
net: ynl: allow u8 sub-type for indexed array
This adds u8 to the list of sub-types accepted by AttrSet.new_attr() for
indexed-array attributes in tools/net/ynl/pyynl/ynl_gen_c.py, so that the
nl80211 chain-signal attributes can be described in the YAML spec. Without
it the generator rejects the sub-type outright.
> diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py
> index cdc3646f2642c..7373a48d5516a 100755
> --- a/tools/net/ynl/pyynl/ynl_gen_c.py
> +++ b/tools/net/ynl/pyynl/ynl_gen_c.py
> @@ -1158,7 +1158,7 @@ class AttrSet(SpecAttrSet):
> elif elem['type'] == 'nest':
> t = TypeNest(self.family, self, elem, value)
> elif elem['type'] == 'indexed-array' and 'sub-type' in elem:
> - if elem["sub-type"] in ['binary', 'nest', 'u32']:
> + if elem["sub-type"] in ['binary', 'nest', 'u32', 'u8']:
[Severity: Medium]
Should this patch come before the spec change in the series?
The preceding commit cb06a9dc93de ("wifi: nl80211: add sta-info nested
attribute") already adds chain-signal and chain-signal-avg to
Documentation/netlink/specs/nl80211.yaml:
-
name: chain-signal
type: indexed-array
sub-type: u8
SpecAttrSet.__init__() in tools/net/ynl/pyynl/lib/nlspec.py calls
new_attr() for every attribute of every attribute set at spec parse time,
regardless of which ops or generation mode are requested:
for elem in self.yaml['attributes']:
...
attr = self.new_attr(elem, val)
so at the intermediate commit AttrSet.new_attr() takes the else branch and
raises 'new_attr: unsupported sub-type u8'.
nl80211 is part of GENS in tools/net/ynl/generated/Makefile, which globs all
specs and only filters out conntrack and nftables:
SPECS_PATHS=$(wildcard $(SPECS_DIR)/*.yaml)
GENS_UNSUP=conntrack nftables
GENS=$(filter-out ${GENS_UNSUP},$(patsubst $(SPECS_DIR)/%.yaml,%,${SPECS_PATHS}))
Does that mean make -C tools/net/ynl and ynl-regen.sh fail for anyone who
lands on or bisects to cb06a9dc93de? Reordering so the generator support
lands first, or squashing the two, would avoid that.
[Severity: Medium]
Does the scalar indexed-array path lose the entry index that
NL80211_STA_INFO_CHAIN_SIGNAL relies on?
Documentation/userspace-api/netlink/genetlink-legacy.rst describes the entry
attribute type as the index:
The ``ENTRY`` nests are special and have the index of the entry as
their type instead of normal attribute type.
nl80211_put_signal() keys each u8 on the chain number and skips chains that
are not in the mask, so the emitted index sequence can be sparse:
for (i = 0; i < IEEE80211_MAX_CHAINS; i++) {
if (!(mask & BIT(i)))
continue;
if (nla_put_u8(msg, i, signal[i]))
Sparse masks do occur in practice, for example ath10k_htt_rx_h_signal()
sets each bit of status->chains independently based on per-chain RSSI
validity.
The generated parser for scalar sub-types in _multi_parse() stores entries
densely and drops ynl_attr_type(attr):
elif aspec.sub_type in scalars:
ri.cw.p(f"dst->{aspec.c_name}[i] = ynl_attr_get_{aspec.sub_type}(attr);")
ri.cw.p('i++;')
So a message carrying chains 0 and 2 is reported as _count.chain_signal = 2
with the chain-2 value sitting at index 1, and TypeIndexedArray.attr_put()
would then re-serialize it as index 1:
for (i = 0; i < {var}->_count.{c_name}; i++)
ynl_attr_put_u8(nlh, i, {var}->{c_name}[i]);
YnlFamily._decode_array_attr() in tools/net/ynl/pyynl/lib/ynl.py has the
same loss since it appends item.as_scalar() to a plain list without
recording item.type.
The lossy path predates this patch, since only u32 indexed arrays were
allowed and the in-tree u32 user arp-ip-target is dense. Is it worth
carrying the index alongside the value before routing nl80211 chain-signal
through this path, so per-chain values are not attributed to the wrong
chain?
> else:
> raise Exception(f'new_attr: unsupported sub-type {elem["sub-type"]}')
[Severity: Medium]
One more thing on the spec added by the preceding commit of this series, in
Documentation/netlink/specs/nl80211.yaml. The new eht-ru-alloc enum
declares the HE name prefix:
name: eht-ru-alloc
type: enum
name-prefix: nl80211-rate-info-he-ru-alloc-
while include/uapi/linux/nl80211.h names these values with the EHT prefix:
enum nl80211_eht_ru_alloc {
NL80211_RATE_INFO_EHT_RU_ALLOC_26,
NL80211_RATE_INFO_EHT_RU_ALLOC_52,
NL80211_RATE_INFO_EHT_RU_ALLOC_52P26,
The same patch adds he-ru-alloc with that identical prefix:
name: he-ru-alloc
type: enum
name-prefix: nl80211-rate-info-he-ru-alloc-
The generator builds the C enumerators straight from that prefix:
self.value_pfx = yaml.get('name-prefix', f"{family.ident_name}-{yaml['name']}-")
self.c_name = c_upper(self.enum_set.value_pfx + self.name)
cw.p(entry.c_name + suffix) /* render_uapi() */
so uapi generation from this spec emits
NL80211_RATE_INFO_HE_RU_ALLOC_26/52/106/242/484/2x996 twice, and the
EHT-only entries (52p26, 106p26, 484p242, 996p484, 996p484p242, 2x996p484,
3x996, 3x996p484, 4x996) come out under NL80211_RATE_INFO_HE_RU_ALLOC_*
names that do not exist in the UAPI header. No in-tree build runs
--mode uapi for nl80211 today, so nothing breaks right now.
Should the eht-ru-alloc prefix be nl80211-rate-info-eht-ru-alloc- instead?
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-25 1:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-21 7:47 [PATCH 0/2] wifi: nl80211: Document sta-info nested attribute Hilal Rahmatullah
2026-08-21 7:47 ` [PATCH 1/2] wifi: nl80211: add " Hilal Rahmatullah
2026-08-25 1:36 ` Jakub Kicinski
2026-08-21 7:47 ` [PATCH 2/2] net: ynl: allow u8 sub-type for indexed array Hilal Rahmatullah
2026-08-25 1:36 ` Jakub Kicinski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).