Commit 509afc74 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'tools-net-ynl-add-sub-message-support-to-ynl'

Donald Hunter says:

====================
tools/net/ynl: Add 'sub-message' support to ynl

This patchset adds a 'sub-message' attribute type to the netlink-raw
schema and implements it in ynl. This provides support for kind-specific
options attributes as used in rt_link and tc raw netlink families.

A description of the new 'sub-message' attribute type and the
corresponding sub-message definitions is provided in patch 3.

The patchset includes updates to the rt_link spec and a new tc spec that
make use of the new 'sub-message' attribute type.

As mentioned in patch 4, encode support is not yet implemented in ynl
and support for sub-message selectors at a different nest level from the
key attribute is not yet supported. I plan to work on these in follow-up
patches.

Patches 1 is code cleanup in ynl
Patches 2-4 add sub-message support to the schema and ynl with
documentation updates.
Patch 5 adds binary and pad support to structs in netlink-raw.
Patches 6-8 contain specs that use the sub-message attribute type.
Patches 9-13 update ynl-gen-rst and its make target
====================

Link: https://lore.kernel.org/r/20231215093720.18774-1-donald.hunter@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 610a689d 9b0aa224
......@@ -106,10 +106,10 @@ YNL_RST_FILES_TMP := $(patsubst %.yaml,%.rst,$(wildcard $(YNL_YAML_DIR)/*.yaml))
YNL_RST_FILES := $(patsubst $(YNL_YAML_DIR)%,$(YNL_RST_DIR)%, $(YNL_RST_FILES_TMP))
$(YNL_INDEX): $(YNL_RST_FILES)
@$(YNL_TOOL) -o $@ -x
$(Q)$(YNL_TOOL) -o $@ -x
$(YNL_RST_DIR)/%.rst: $(YNL_YAML_DIR)/%.yaml
@$(YNL_TOOL) -i $< -o $@
$(YNL_RST_DIR)/%.rst: $(YNL_YAML_DIR)/%.yaml $(YNL_TOOL)
$(Q)$(YNL_TOOL) -i $< -o $@
htmldocs: $(YNL_INDEX)
@$(srctree)/scripts/sphinx-pre-install --version-check
......
......@@ -126,8 +126,10 @@ properties:
name:
type: string
type:
description: The netlink attribute type
enum: [ u8, u16, u32, u64, s8, s16, s32, s64, string, binary ]
description: |
The netlink attribute type. Members of type 'binary' or 'pad'
must also have the 'len' property set.
enum: [ u8, u16, u32, u64, s8, s16, s32, s64, string, binary, pad ]
len:
$ref: '#/$defs/len-or-define'
byte-order:
......@@ -150,6 +152,14 @@ properties:
the right formatting mechanism when displaying values of this
type.
enum: [ hex, mac, fddi, ipv4, ipv6, uuid ]
if:
properties:
type:
oneOf:
- const: binary
- const: pad
then:
required: [ len ]
# End genetlink-legacy
attribute-sets:
......@@ -202,7 +212,8 @@ properties:
description: The netlink attribute type
enum: [ unused, pad, flag, binary, bitfield32,
u8, u16, u32, u64, s8, s16, s32, s64,
string, nest, array-nest, nest-type-value ]
string, nest, array-nest, nest-type-value,
sub-message ]
doc:
description: Documentation of the attribute.
type: string
......@@ -261,6 +272,17 @@ properties:
description: Name of the struct type used for the attribute.
type: string
# End genetlink-legacy
# Start netlink-raw
sub-message:
description: |
Name of the sub-message definition to use for the attribute.
type: string
selector:
description: |
Name of the attribute to use for dynamic selection of sub-message
format specifier.
type: string
# End netlink-raw
# Make sure name-prefix does not appear in subsets (subsets inherit naming)
dependencies:
......@@ -283,6 +305,43 @@ properties:
items:
required: [ type ]
# Start netlink-raw
sub-messages:
description: Definition of sub message attributes
type: array
items:
type: object
additionalProperties: False
required: [ name, formats ]
properties:
name:
description: Name of the sub-message definition
type: string
formats:
description: Dynamically selected format specifiers
type: array
items:
type: object
additionalProperties: False
required: [ value ]
properties:
value:
description: |
Value to match for dynamic selection of sub-message format
specifier.
type: string
fixed-header:
description: |
Name of the struct definition to use as the fixed header
for the sub message.
type: string
attribute-set:
description: |
Name of the attribute space from which to resolve attributes
in the sub message.
type: string
# End netlink-raw
operations:
description: Operations supported by the protocol.
type: object
......
......@@ -66,8 +66,9 @@ definitions:
name: ifi-family
type: u8
-
name: padding
type: u8
name: pad
type: pad
len: 1
-
name: ifi-type
type: u16
......@@ -82,6 +83,18 @@ definitions:
-
name: ifi-change
type: u32
-
name: ifla-bridge-id
type: struct
members:
-
name: prio
type: u16
-
name: addr
type: binary
len: 6
display-hint: mac
-
name: ifla-cacheinfo
type: struct
......@@ -707,11 +720,9 @@ definitions:
name: family
type: u8
-
name: pad1
type: u8
-
name: pad2
type: u16
name: pad
type: pad
len: 3
-
name: ifindex
type: u32
......@@ -966,8 +977,9 @@ attribute-sets:
type: string
-
name: data
type: binary
# kind specific nest, e.g. linkinfo-bridge-attrs
type: sub-message
sub-message: linkinfo-data-msg
selector: kind
-
name: xstats
type: binary
......@@ -976,10 +988,12 @@ attribute-sets:
type: string
-
name: slave-data
type: binary
# kind specific nest
type: sub-message
sub-message: linkinfo-member-data-msg
selector: slave-kind
-
name: linkinfo-bridge-attrs
name-prefix: ifla-br-
attributes:
-
name: forward-delay
......@@ -1011,9 +1025,11 @@ attribute-sets:
-
name: root-id
type: binary
struct: ifla-bridge-id
-
name: bridge-id
type: binary
struct: ifla-bridge-id
-
name: root-port
type: u16
......@@ -1041,6 +1057,7 @@ attribute-sets:
-
name: group-addr
type: binary
display-hint: mac
-
name: fdb-flush
type: binary
......@@ -1123,6 +1140,376 @@ attribute-sets:
-
name: mcast-querier-state
type: binary
-
name: linkinfo-brport-attrs
name-prefix: ifla-brport-
attributes:
-
name: state
type: u8
-
name: priority
type: u16
-
name: cost
type: u32
-
name: mode
type: flag
-
name: guard
type: flag
-
name: protect
type: flag
-
name: fast-leave
type: flag
-
name: learning
type: flag
-
name: unicast-flood
type: flag
-
name: proxyarp
type: flag
-
name: learning-sync
type: flag
-
name: proxyarp-wifi
type: flag
-
name: root-id
type: binary
struct: ifla-bridge-id
-
name: bridge-id
type: binary
struct: ifla-bridge-id
-
name: designated-port
type: u16
-
name: designated-cost
type: u16
-
name: id
type: u16
-
name: "no"
type: u16
-
name: topology-change-ack
type: u8
-
name: config-pending
type: u8
-
name: message-age-timer
type: u64
-
name: forward-delay-timer
type: u64
-
name: hold-timer
type: u64
-
name: flush
type: flag
-
name: multicast-router
type: u8
-
name: pad
type: pad
-
name: mcast-flood
type: flag
-
name: mcast-to-ucast
type: flag
-
name: vlan-tunnel
type: flag
-
name: bcast-flood
type: flag
-
name: group-fwd-mask
type: u16
-
name: neigh-suppress
type: flag
-
name: isolated
type: flag
-
name: backup-port
type: u32
-
name: mrp-ring-open
type: flag
-
name: mrp-in-open
type: flag
-
name: mcast-eht-hosts-limit
type: u32
-
name: mcast-eht-hosts-cnt
type: u32
-
name: locked
type: flag
-
name: mab
type: flag
-
name: mcast-n-groups
type: u32
-
name: mcast-max-groups
type: u32
-
name: neigh-vlan-suppress
type: flag
-
name: backup-nhid
type: u32
-
name: linkinfo-gre-attrs
name-prefix: ifla-gre-
attributes:
-
name: link
type: u32
-
name: iflags
type: u16
-
name: oflags
type: u16
-
name: ikey
type: u32
-
name: okey
type: u32
-
name: local
type: binary
display-hint: ipv4
-
name: remote
type: binary
display-hint: ipv4
-
name: ttl
type: u8
-
name: tos
type: u8
-
name: pmtudisc
type: u8
-
name: encap-limit
type: u32
-
name: flowinfo
type: u32
-
name: flags
type: u32
-
name: encap-type
type: u16
-
name: encap-flags
type: u16
-
name: encap-sport
type: u16
-
name: encap-dport
type: u16
-
name: collect-metadata
type: flag
-
name: ignore-df
type: u8
-
name: fwmark
type: u32
-
name: erspan-index
type: u32
-
name: erspan-ver
type: u8
-
name: erspan-dir
type: u8
-
name: erspan-hwid
type: u16
-
name: linkinfo-geneve-attrs
name-prefix: ifla-geneve-
attributes:
-
name: id
type: u32
-
name: remote
type: binary
display-hint: ipv4
-
name: ttl
type: u8
-
name: tos
type: u8
-
name: port
type: u16
-
name: collect-metadata
type: flag
-
name: remote6
type: binary
display-hint: ipv6
-
name: udp-csum
type: u8
-
name: udp-zero-csum6-tx
type: u8
-
name: udp-zero-csum6-rx
type: u8
-
name: label
type: u32
-
name: ttl-inherit
type: u8
-
name: df
type: u8
-
name: inner-proto-inherit
type: flag
-
name: linkinfo-iptun-attrs
name-prefix: ifla-iptun-
attributes:
-
name: link
type: u32
-
name: local
type: binary
display-hint: ipv4
-
name: remote
type: binary
display-hint: ipv4
-
name: ttl
type: u8
-
name: tos
type: u8
-
name: encap-limit
type: u8
-
name: flowinfo
type: u32
-
name: flags
type: u16
-
name: proto
type: u8
-
name: pmtudisc
type: u8
-
name: 6rd-prefix
type: binary
display-hint: ipv6
-
name: 6rd-relay-prefix
type: binary
display-hint: ipv4
-
name: 6rd-prefixlen
type: u16
-
name: 6rd-relay-prefixlen
type: u16
-
name: encap-type
type: u16
-
name: encap-flags
type: u16
-
name: encap-sport
type: u16
-
name: encap-dport
type: u16
-
name: collect-metadata
type: flag
-
name: fwmark
type: u32
-
name: linkinfo-tun-attrs
name-prefix: ifla-tun-
attributes:
-
name: owner
type: u32
-
name: group
type: u32
-
name: type
type: u8
-
name: pi
type: u8
-
name: vnet-hdr
type: u8
-
name: persist
type: u8
-
name: multi-queue
type: u8
-
name: num-queues
type: u32
-
name: num-disabled-queues
type: u32
-
name: linkinfo-vrf-attrs
name-prefix: ifla-vrf-
attributes:
-
name: table
type: u32
-
name: xdp-attrs
attributes:
......@@ -1241,6 +1628,46 @@ attribute-sets:
name: used
type: u8
sub-messages:
-
name: linkinfo-data-msg
formats:
-
value: bridge
attribute-set: linkinfo-bridge-attrs
-
value: erspan
attribute-set: linkinfo-gre-attrs
-
value: gre
attribute-set: linkinfo-gre-attrs
-
value: gretap
attribute-set: linkinfo-gre-attrs
-
value: geneve
attribute-set: linkinfo-geneve-attrs
-
value: ipip
attribute-set: linkinfo-iptun-attrs
-
value: sit
attribute-set: linkinfo-iptun-attrs
-
value: tun
attribute-set: linkinfo-tun-attrs
-
value: vrf
attribute-set: linkinfo-vrf-attrs
-
name: linkinfo-member-data-msg
formats:
-
value: bridge
attribute-set: linkinfo-brport-attrs
-
value: bond
operations:
enum-model: directional
list:
......
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
name: tc
protocol: netlink-raw
protonum: 0
doc:
Netlink raw family for tc qdisc, chain, class and filter configuration
over rtnetlink.
definitions:
-
name: tcmsg
type: struct
members:
-
name: family
type: u8
-
name: pad
type: pad
len: 3
-
name: ifindex
type: s32
-
name: handle
type: u32
-
name: parent
type: u32
-
name: info
type: u32
-
name: tc-cls-flags
type: flags
entries:
- skip-hw
- skip-sw
- in-hw
- not-in-nw
- verbose
-
name: tc-stats
type: struct
members:
-
name: bytes
type: u64
-
name: packets
type: u32
-
name: drops
type: u32
-
name: overlimits
type: u32
-
name: bps
type: u32
-
name: pps
type: u32
-
name: qlen
type: u32
-
name: backlog
type: u32
-
name: tc-cbs-qopt
type: struct
members:
-
name: offload
type: u8
-
name: pad
type: pad
len: 3
-
name: hicredit
type: s32
-
name: locredit
type: s32
-
name: idleslope
type: s32
-
name: sendslope
type: s32
-
name: tc-etf-qopt
type: struct
members:
-
name: delta
type: s32
-
name: clockid
type: s32
-
name: flags
type: s32
-
name: tc-fifo-qopt
type: struct
members:
-
name: limit
type: u32
-
name: tc-htb-opt
type: struct
members:
-
name: rate
type: binary
len: 12
-
name: ceil
type: binary
len: 12
-
name: buffer
type: u32
-
name: cbuffer
type: u32
-
name: quantum
type: u32
-
name: level
type: u32
-
name: prio
type: u32
-
name: tc-htb-glob
type: struct
members:
-
name: version
type: u32
-
name: rate2quantum
type: u32
-
name: defcls
type: u32
-
name: debug
type: u32
-
name: direct-pkts
type: u32
-
name: tc-gred-qopt
type: struct
members:
-
name: limit
type: u32
-
name: qth-min
type: u32
-
name: qth-max
type: u32
-
name: DP
type: u32
-
name: backlog
type: u32
-
name: qave
type: u32
-
name: forced
type: u32
-
name: early
type: u32
-
name: other
type: u32
-
name: pdrop
type: u32
-
name: Wlog
type: u8
-
name: Plog
type: u8
-
name: Scell_log
type: u8
-
name: prio
type: u8
-
name: packets
type: u32
-
name: bytesin
type: u32
-
name: tc-gred-sopt
type: struct
members:
-
name: DPs
type: u32
-
name: def_DP
type: u32
-
name: grio
type: u8
-
name: flags
type: u8
-
name: pad
type: pad
len: 2
-
name: tc-hfsc-qopt
type: struct
members:
-
name: defcls
type: u16
-
name: tc-mqprio-qopt
type: struct
members:
-
name: num-tc
type: u8
-
name: prio-tc-map
type: binary
len: 16
-
name: hw
type: u8
-
name: count
type: binary
len: 32
-
name: offset
type: binary
len: 32
-
name: tc-multiq-qopt
type: struct
members:
-
name: bands
type: u16
-
name: max-bands
type: u16
-
name: tc-netem-qopt
type: struct
members:
-
name: latency
type: u32
-
name: limit
type: u32
-
name: loss
type: u32
-
name: gap
type: u32
-
name: duplicate
type: u32
-
name: jitter
type: u32
-
name: tc-plug-qopt
type: struct
members:
-
name: action
type: s32
-
name: limit
type: u32
-
name: tc-prio-qopt
type: struct
members:
-
name: bands
type: u16
-
name: priomap
type: binary
len: 16
-
name: tc-red-qopt
type: struct
members:
-
name: limit
type: u32
-
name: qth-min
type: u32
-
name: qth-max
type: u32
-
name: Wlog
type: u8
-
name: Plog
type: u8
-
name: Scell-log
type: u8
-
name: flags
type: u8
-
name: tc-sfb-qopt
type: struct
members:
-
name: rehash-interval
type: u32
-
name: warmup-time
type: u32
-
name: max
type: u32
-
name: bin-size
type: u32
-
name: increment
type: u32
-
name: decrement
type: u32
-
name: limit
type: u32
-
name: penalty-rate
type: u32
-
name: penalty-burst
type: u32
-
name: tc-sfq-qopt-v1 # TODO nested structs
type: struct
members:
-
name: quantum
type: u32
-
name: perturb-period
type: s32
-
name: limit
type: u32
-
name: divisor
type: u32
-
name: flows
type: u32
-
name: depth
type: u32
-
name: headdrop
type: u32
-
name: limit
type: u32
-
name: qth-min
type: u32
-
name: qth-mac
type: u32
-
name: Wlog
type: u8
-
name: Plog
type: u8
-
name: Scell-log
type: u8
-
name: flags
type: u8
-
name: max-P
type: u32
-
name: prob-drop
type: u32
-
name: forced-drop
type: u32
-
name: prob-mark
type: u32
-
name: forced-mark
type: u32
-
name: prob-mark-head
type: u32
-
name: forced-mark-head
type: u32
-
name: tc-tbf-qopt
type: struct
members:
-
name: rate
type: binary # TODO nested struct tc_ratespec
len: 12
-
name: peakrate
type: binary # TODO nested struct tc_ratespec
len: 12
-
name: limit
type: u32
-
name: buffer
type: u32
-
name: mtu
type: u32
-
name: tc-sizespec
type: struct
members:
-
name: cell-log
type: u8
-
name: size-log
type: u8
-
name: cell-align
type: s16
-
name: overhead
type: s32
-
name: linklayer
type: u32
-
name: mpu
type: u32
-
name: mtu
type: u32
-
name: tsize
type: u32
-
name: gnet-estimator
type: struct
members:
-
name: interval
type: s8
-
name: ewma-log
type: u8
attribute-sets:
-
name: tc-attrs
attributes:
-
name: kind
type: string
-
name: options
type: sub-message
sub-message: tc-options-msg
selector: kind
-
name: stats
type: binary
struct: tc-stats
-
name: xstats
type: binary
-
name: rate
type: binary
struct: gnet-estimator
-
name: fcnt
type: u32
-
name: stats2
type: nest
nested-attributes: tca-stats-attrs
-
name: stab
type: nest
nested-attributes: tca-stab-attrs
-
name: pad
type: pad
-
name: dump-invisible
type: flag
-
name: chain
type: u32
-
name: hw-offload
type: u8
-
name: ingress-block
type: u32
-
name: egress-block
type: u32
-
name: dump-flags
type: bitfield32
-
name: ext-warn-msg
type: string
-
name: tc-cake-attrs
attributes:
-
name: pad
type: pad
-
name: base-rate64
type: u64
-
name: diffserv-mode
type: u32
-
name: atm
type: u32
-
name: flow-mode
type: u32
-
name: overhead
type: u32
-
name: rtt
type: u32
-
name: target
type: u32
-
name: autorate
type: u32
-
name: memory
type: u32
-
name: nat
type: u32
-
name: raw
type: u32
-
name: wash
type: u32
-
name: mpu
type: u32
-
name: ingress
type: u32
-
name: ack-filter
type: u32
-
name: split-gso
type: u32
-
name: fwmark
type: u32
-
name: tc-cake-stats-attrs
attributes:
-
name: pad
type: pad
-
name: capacity-estimate64
type: u64
-
name: memory-limit
type: u32
-
name: memory-used
type: u32
-
name: avg-netoff
type: u32
-
name: min-netlen
type: u32
-
name: max-netlen
type: u32
-
name: min-adjlen
type: u32
-
name: max-adjlen
type: u32
-
name: tin-stats
type: binary
-
name: deficit
type: s32
-
name: cobalt-count
type: u32
-
name: dropping
type: u32
-
name: drop-next-us
type: s32
-
name: p-drop
type: u32
-
name: blue-timer-us
type: s32
-
name: tc-cbs-attrs
attributes:
-
name: parms
type: binary
struct: tc-cbs-qopt
-
name: tc-choke-attrs
attributes:
-
name: parms
type: binary
struct: tc-red-qopt
-
name: stab
type: binary
-
name: max-p
type: u32
-
name: tc-codel-attrs
attributes:
-
name: target
type: u32
-
name: limit
type: u32
-
name: interval
type: u32
-
name: ecn
type: u32
-
name: ce-threshold
type: u32
-
name: tc-drr-attrs
attributes:
-
name: quantum
type: u32
-
name: tc-flower-attrs
attributes:
-
name: classid
type: u32
-
name: indev
type: string
-
name: act
type: array-nest
nested-attributes: tc-act-attrs
-
name: key-eth-dst
type: binary
display-hint: mac
-
name: key-eth-dst-mask
type: binary
display-hint: mac
-
name: key-eth-src
type: binary
display-hint: mac
-
name: key-eth-src-mask
type: binary
display-hint: mac
-
name: key-eth-type
type: u16
byte-order: big-endian
-
name: key-ip-proto
type: u8
-
name: key-ipv4-src
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-ipv4-src-mask
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-ipv4-dst
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-ipv4-dst-mask
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-ipv6-src
type: binary
display-hint: ipv6
-
name: key-ipv6-src-mask
type: binary
display-hint: ipv6
-
name: key-ipv6-dst
type: binary
display-hint: ipv6
-
name: key-ipv6-dst-mask
type: binary
display-hint: ipv6
-
name: key-tcp-src
type: u16
byte-order: big-endian
-
name: key-tcp-dst
type: u16
byte-order: big-endian
-
name: key-udp-src
type: u16
byte-order: big-endian
-
name: key-udp-dst
type: u16
byte-order: big-endian
-
name: flags
type: u32
enum: tc-cls-flags
enum-as-flags: true
-
name: key-vlan-id
type: u16
byte-order: big-endian
-
name: key-vlan-prio
type: u8
-
name: key-vlan-eth-type
type: u16
byte-order: big-endian
-
name: key-enc-key-id
type: u32
byte-order: big-endian
-
name: key-enc-ipv4-src
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-enc-ipv4-src-mask
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-enc-ipv4-dst
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-enc-ipv4-dst-mask
type: u32
byte-order: big-endian
display-hint: ipv4
-
name: key-enc-ipv6-src
type: binary
display-hint: ipv6
-
name: key-enc-ipv6-src-mask
type: binary
display-hint: ipv6
-
name: key-enc-ipv6-dst
type: binary
display-hint: ipv6
-
name: key-enc-ipv6-dst-mask
type: binary
display-hint: ipv6
-
name: key-tcp-src-mask
type: u16
byte-order: big-endian
-
name: key-tcp-dst-mask
type: u16
byte-order: big-endian
-
name: key-udp-src-mask
type: u16
byte-order: big-endian
-
name: key-udp-dst-mask
type: u16
byte-order: big-endian
-
name: key-sctp-src-mask
type: u16
byte-order: big-endian
-
name: key-sctp-dst-mask
type: u16
byte-order: big-endian
-
name: key-sctp-src
type: u16
byte-order: big-endian
-
name: key-sctp-dst
type: u16
byte-order: big-endian
-
name: key-enc-udp-src-port
type: u16
byte-order: big-endian
-
name: key-enc-udp-src-port-mask
type: u16
byte-order: big-endian
-
name: key-enc-udp-dst-port
type: u16
byte-order: big-endian
-
name: key-enc-udp-dst-port-mask
type: u16
byte-order: big-endian
-
name: key-flags
type: u32
byte-order: big-endian
-
name: key-flags-mask
type: u32
byte-order: big-endian
-
name: key-icmpv4-code
type: u8
-
name: key-icmpv4-code-mask
type: u8
-
name: key-icmpv4-type
type: u8
-
name: key-icmpv4-type-mask
type: u8
-
name: key-icmpv6-code
type: u8
-
name: key-icmpv6-code-mask
type: u8
-
name: key-icmpv6-type
type: u8
-
name: key-icmpv6-type-mask
type: u8
-
name: key-arp-sip
type: u32
byte-order: big-endian
-
name: key-arp-sip-mask
type: u32
byte-order: big-endian
-
name: key-arp-tip
type: u32
byte-order: big-endian
-
name: key-arp-tip-mask
type: u32
byte-order: big-endian
-
name: key-arp-op
type: u8
-
name: key-arp-op-mask
type: u8
-
name: key-arp-sha
type: binary
-
name: key-arp-sha-mask
type: binary
-
name: key-arp-tha
type: binary
-
name: key-arp-tha-mask
type: binary
-
name: key-mpls-ttl
type: u8
-
name: key-mpls-bos
type: u8
-
name: key-mpls-tc
type: u8
-
name: key-mpls-label
type: u32
byte-order: big-endian
-
name: key-tcp-flags
type: u16
byte-order: big-endian
-
name: key-tcp-flags-mask
type: u16
byte-order: big-endian
-
name: key-ip-tos
type: u8
-
name: key-ip-tos-mask
type: u8
-
name: key-ip-ttl
type: u8
-
name: key-ip-ttl-mask
type: u8
-
name: key-cvlan-id
type: u16
byte-order: big-endian
-
name: key-cvlan-prio
type: u8
-
name: key-cvlan-eth-type
type: u16
byte-order: big-endian
-
name: key-enc-ip-tos
type: u8
-
name: key-enc-ip-tos-mask
type: u8
-
name: key-enc-ip-ttl
type: u8
-
name: key-enc-ip-ttl-mask
type: u8
-
name: key-enc-opts
type: binary
-
name: key-enc-opts-mask
type: binary
-
name: in-hw-count
type: u32
-
name: key-port-src-min
type: u16
byte-order: big-endian
-
name: key-port-src-max
type: u16
byte-order: big-endian
-
name: key-port-dst-min
type: u16
byte-order: big-endian
-
name: key-port-dst-max
type: u16
byte-order: big-endian
-
name: key-ct-state
type: u16
-
name: key-ct-state-mask
type: u16
-
name: key-ct-zone
type: u16
-
name: key-ct-zone-mask
type: u16
-
name: key-ct-mark
type: u32
-
name: key-ct-mark-mask
type: u32
-
name: key-ct-labels
type: binary
-
name: key-ct-labels-mask
type: binary
-
name: key-mpls-opts
type: binary
-
name: key-hash
type: u32
-
name: key-hash-mask
type: u32
-
name: key-num-of-vlans
type: u8
-
name: key-pppoe-sid
type: u16
byte-order: big-endian
-
name: key-ppp-proto
type: u16
byte-order: big-endian
-
name: key-l2-tpv3-sid
type: u32
byte-order: big-endian
-
name: tc-gred-attrs
attributes:
-
name: parms
type: binary # array of struct: tc-gred-qopt
-
name: stab
type: binary
sub-type: u8
-
name: dps
type: binary
struct: tc-gred-sopt
-
name: max-p
type: binary
sub-type: u32
-
name: limit
type: u32
-
name: vq-list
type: nest
nested-attributes: tca-gred-vq-list-attrs
-
name: tca-gred-vq-list-attrs
attributes:
-
name: entry
type: nest
nested-attributes: tca-gred-vq-entry-attrs
multi-attr: true
-
name: tca-gred-vq-entry-attrs
attributes:
-
name: pad
type: pad
-
name: dp
type: u32
-
name: stat-bytes
type: u32
-
name: stat-packets
type: u32
-
name: stat-backlog
type: u32
-
name: stat-prob-drop
type: u32
-
name: stat-prob-mark
type: u32
-
name: stat-forced-drop
type: u32
-
name: stat-forced-mark
type: u32
-
name: stat-pdrop
type: u32
-
name: stat-other
type: u32
-
name: flags
type: u32
-
name: tc-hfsc-attrs
attributes:
-
name: rsc
type: binary
-
name: fsc
type: binary
-
name: usc
type: binary
-
name: tc-hhf-attrs
attributes:
-
name: backlog-limit
type: u32
-
name: quantum
type: u32
-
name: hh-flows-limit
type: u32
-
name: reset-timeout
type: u32
-
name: admit-bytes
type: u32
-
name: evict-timeout
type: u32
-
name: non-hh-weight
type: u32
-
name: tc-htb-attrs
attributes:
-
name: parms
type: binary
struct: tc-htb-opt
-
name: init
type: binary
struct: tc-htb-glob
-
name: ctab
type: binary
-
name: rtab
type: binary
-
name: direct-qlen
type: u32
-
name: rate64
type: u64
-
name: ceil64
type: u64
-
name: pad
type: pad
-
name: offload
type: flag
-
name: tc-act-attrs
attributes:
-
name: kind
type: string
-
name: options
type: sub-message
sub-message: tc-act-options-msg
selector: kind
-
name: index
type: u32
-
name: stats
type: binary
-
name: pad
type: pad
-
name: cookie
type: binary
-
name: flags
type: bitfield32
-
name: hw-stats
type: bitfield32
-
name: used-hw-stats
type: bitfield32
-
name: in-hw-count
type: u32
-
name: tc-etf-attrs
attributes:
-
name: parms
type: binary
struct: tc-etf-qopt
-
name: tc-ets-attrs
attributes:
-
name: nbands
type: u8
-
name: nstrict
type: u8
-
name: quanta
type: nest
nested-attributes: tc-ets-attrs
-
name: quanta-band
type: u32
multi-attr: true
-
name: priomap
type: nest
nested-attributes: tc-ets-attrs
-
name: priomap-band
type: u8
multi-attr: true
-
name: tc-fq-attrs
attributes:
-
name: plimit
type: u32
-
name: flow-plimit
type: u32
-
name: quantum
type: u32
-
name: initial-quantum
type: u32
-
name: rate-enable
type: u32
-
name: flow-default-rate
type: u32
-
name: flow-max-rate
type: u32
-
name: buckets-log
type: u32
-
name: flow-refill-delay
type: u32
-
name: orphan-mask
type: u32
-
name: low-rate-threshold
type: u32
-
name: ce-threshold
type: u32
-
name: timer-slack
type: u32
-
name: horizon
type: u32
-
name: horizon-drop
type: u8
-
name: tc-fq-codel-attrs
attributes:
-
name: target
type: u32
-
name: limit
type: u32
-
name: interval
type: u32
-
name: ecn
type: u32
-
name: flows
type: u32
-
name: quantum
type: u32
-
name: ce-threshold
type: u32
-
name: drop-batch-size
type: u32
-
name: memory-limit
type: u32
-
name: ce-threshold-selector
type: u8
-
name: ce-threshold-mask
type: u8
-
name: tc-fq-pie-attrs
attributes:
-
name: limit
type: u32
-
name: flows
type: u32
-
name: target
type: u32
-
name: tupdate
type: u32
-
name: alpha
type: u32
-
name: beta
type: u32
-
name: quantum
type: u32
-
name: memory-limit
type: u32
-
name: ecn-prob
type: u32
-
name: ecn
type: u32
-
name: bytemode
type: u32
-
name: dq-rate-estimator
type: u32
-
name: tc-netem-attrs
attributes:
-
name: corr
type: binary
-
name: delay-dist
type: binary
sub-type: s16
-
name: reorder
type: binary
-
name: corrupt
type: binary
-
name: loss
type: binary
-
name: rate
type: binary
-
name: ecn
type: u32
-
name: rate64
type: u64
-
name: pad
type: u32
-
name: latency64
type: s64
-
name: jitter64
type: s64
-
name: slot
type: binary
-
name: slot-dist
type: binary
sub-type: s16
-
name: tc-pie-attrs
attributes:
-
name: target
type: u32
-
name: limit
type: u32
-
name: tupdate
type: u32
-
name: alpha
type: u32
-
name: beta
type: u32
-
name: ecn
type: u32
-
name: bytemode
type: u32
-
name: dq-rate-estimator
type: u32
-
name: tc-qfq-attrs
attributes:
-
name: weight
type: u32
-
name: lmax
type: u32
-
name: tc-red-attrs
attributes:
-
name: parms
type: binary
struct: tc-red-qopt
-
name: stab
type: binary
-
name: max-p
type: u32
-
name: flags
type: binary
-
name: early-drop-block
type: u32
-
name: mark-block
type: u32
-
name: tc-taprio-attrs
attributes:
-
name: priomap
type: binary
struct: tc-mqprio-qopt
-
name: sched-entry-list
type: nest
nested-attributes: tc-taprio-sched-entry-list
-
name: sched-base-time
type: s64
-
name: sched-single-entry
type: nest
nested-attributes: tc-taprio-sched-entry
-
name: sched-clockid
type: s32
-
name: pad
type: pad
-
name: admin-sched
type: binary
-
name: sched-cycle-time
type: s64
-
name: sched-cycle-time-extension
type: s64
-
name: flags
type: u32
-
name: txtime-delay
type: u32
-
name: tc-entry
type: nest
nested-attributes: tc-taprio-tc-entry-attrs
-
name: tc-taprio-sched-entry-list
attributes:
-
name: entry
type: nest
nested-attributes: tc-taprio-sched-entry
-
name: tc-taprio-sched-entry
attributes:
-
name: index
type: u32
-
name: cmd
type: u8
-
name: gate-mask
type: u32
-
name: interval
type: u32
-
name: tc-taprio-tc-entry-attrs
attributes:
-
name: index
type: u32
-
name: max-sdu
type: u32
-
name: fp
type: u32
-
name: tc-tbf-attrs
attributes:
-
name: parms
type: binary
struct: tc-tbf-qopt
-
name: rtab
type: binary
-
name: ptab
type: binary
-
name: rate64
type: u64
-
name: prate4
type: u64
-
name: burst
type: u32
-
name: pburst
type: u32
-
name: pad
type: pad
-
name: tca-gact-attrs
attributes:
-
name: tm
type: binary
-
name: parms
type: binary
-
name: prob
type: binary
-
name: pad
type: pad
-
name: tca-stab-attrs
attributes:
-
name: base
type: binary
struct: tc-sizespec
-
name: data
type: binary
-
name: tca-stats-attrs
attributes:
-
name: basic
type: binary
-
name: rate-est
type: binary
-
name: queue
type: binary
-
name: app
type: binary # TODO sub-message needs 2+ level deep lookup
sub-message: tca-stats-app-msg
selector: kind
-
name: rate-est64
type: binary
-
name: pad
type: pad
-
name: basic-hw
type: binary
-
name: pkt64
type: binary
sub-messages:
-
name: tc-options-msg
formats:
-
value: bfifo
fixed-header: tc-fifo-qopt
-
value: cake
attribute-set: tc-cake-attrs
-
value: cbs
attribute-set: tc-cbs-attrs
-
value: choke
attribute-set: tc-choke-attrs
-
value: clsact # no content
-
value: codel
attribute-set: tc-codel-attrs
-
value: drr
attribute-set: tc-drr-attrs
-
value: etf
attribute-set: tc-etf-attrs
-
value: ets
attribute-set: tc-ets-attrs
-
value: fq
attribute-set: tc-fq-attrs
-
value: fq_codel
attribute-set: tc-fq-codel-attrs
-
value: fq_pie
attribute-set: tc-fq-pie-attrs
-
value: flower
attribute-set: tc-flower-attrs
-
value: gred
attribute-set: tc-gred-attrs
-
value: hfsc
fixed-header: tc-hfsc-qopt
-
value: hhf
attribute-set: tc-hhf-attrs
-
value: htb
attribute-set: tc-htb-attrs
-
value: ingress # no content
-
value: mq # no content
-
value: mqprio
fixed-header: tc-mqprio-qopt
-
value: multiq
fixed-header: tc-multiq-qopt
-
value: netem
fixed-header: tc-netem-qopt
attribute-set: tc-netem-attrs
-
value: pfifo
fixed-header: tc-fifo-qopt
-
value: pfifo_fast
fixed-header: tc-prio-qopt
-
value: pfifo_head_drop
fixed-header: tc-fifo-qopt
-
value: pie
attribute-set: tc-pie-attrs
-
value: plug
fixed-header: tc-plug-qopt
-
value: prio
fixed-header: tc-prio-qopt
-
value: qfq
attribute-set: tc-qfq-attrs
-
value: red
attribute-set: tc-red-attrs
-
value: sfb
fixed-header: tc-sfb-qopt
-
value: sfq
fixed-header: tc-sfq-qopt-v1
-
value: taprio
attribute-set: tc-taprio-attrs
-
value: tbf
attribute-set: tc-tbf-attrs
-
name: tc-act-options-msg
formats:
-
value: gact
attribute-set: tca-gact-attrs
-
name: tca-stats-app-msg
formats:
-
value: bfifo
-
value: blackhole
-
value: cake
attribute-set: tc-cake-stats-attrs
-
value: cbs
-
value: choke
-
value: clsact
-
value: codel
-
value: drr
-
value: etf
-
value: ets
-
value: fq
-
value: fq_codel
-
value: fq_pie
-
value: flower
-
value: gred
-
value: hfsc
-
value: hhf
-
value: htb
-
value: ingress
-
value: mq
-
value: mqprio
-
value: multiq
-
value: netem
-
value: noqueue
-
value: pfifo
-
value: pfifo_fast
-
value: pfifo_head_drop
-
value: pie
-
value: plug
-
value: prio
-
value: qfq
-
value: red
-
value: sfb
-
value: sfq
-
value: taprio
-
value: tbf
operations:
enum-model: directional
list:
-
name: newqdisc
doc: Create new tc qdisc.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 36
attributes: &create-params
- kind
- options
- rate
- chain
- ingress-block
- egress-block
-
name: delqdisc
doc: Delete existing tc qdisc.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 37
-
name: getqdisc
doc: Get / dump tc qdisc information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 38
attributes:
- dump-invisible
reply:
value: 36
attributes: &tc-all
- kind
- options
- stats
- xstats
- rate
- fcnt
- stats2
- stab
- chain
- ingress-block
- egress-block
-
name: newtclass
doc: Get / dump tc traffic class information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 40
attributes: *create-params
-
name: deltclass
doc: Get / dump tc traffic class information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 41
-
name: gettclass
doc: Get / dump tc traffic class information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 42
reply:
value: 40
attributes: *tc-all
-
name: newtfilter
doc: Get / dump tc filter information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 44
attributes: *create-params
-
name: deltfilter
doc: Get / dump tc filter information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 45
attributes:
- chain
- kind
-
name: gettfilter
doc: Get / dump tc filter information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 46
attributes:
- chain
- kind
reply:
value: 44
attributes: *tc-all
dump:
request:
value: 46
attributes:
- chain
- dump-flags
reply:
value: 44
attributes: *tc-all
-
name: newchain
doc: Get / dump tc chain information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 100
attributes: *create-params
-
name: delchain
doc: Get / dump tc chain information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 101
attributes:
- chain
-
name: getchain
doc: Get / dump tc chain information.
attribute-set: tc-attrs
fixed-header: tcmsg
do:
request:
value: 102
attributes:
- chain
reply:
value: 100
attributes: *tc-all
mcast-groups:
list:
-
name: rtnlgrp-tc
value: 4
......@@ -14,7 +14,8 @@ Specification
The netlink-raw schema extends the :doc:`genetlink-legacy <genetlink-legacy>`
schema with properties that are needed to specify the protocol numbers and
multicast IDs used by raw netlink families. See :ref:`classic_netlink` for more
information.
information. The raw netlink families also make use of type-specific
sub-messages.
Globals
-------
......@@ -56,3 +57,96 @@ group registration.
-
name: rtnlgrp-mctp-ifaddr
value: 34
Sub-messages
------------
Several raw netlink families such as
:doc:`rt_link<../../networking/netlink_spec/rt_link>` and
:doc:`tc<../../networking/netlink_spec/tc>` use attribute nesting as an
abstraction to carry module specific information.
Conceptually it looks as follows::
[OUTER NEST OR MESSAGE LEVEL]
[GENERIC ATTR 1]
[GENERIC ATTR 2]
[GENERIC ATTR 3]
[GENERIC ATTR - wrapper]
[MODULE SPECIFIC ATTR 1]
[MODULE SPECIFIC ATTR 2]
The ``GENERIC ATTRs`` at the outer level are defined in the core (or rt_link or
core TC), while specific drivers, TC classifiers, qdiscs etc. can carry their
own information wrapped in the ``GENERIC ATTR - wrapper``. Even though the
example above shows attributes nesting inside the wrapper, the modules generally
have full freedom to define the format of the nest. In practice the payload of
the wrapper attr has very similar characteristics to a netlink message. It may
contain a fixed header / structure, netlink attributes, or both. Because of
those shared characteristics we refer to the payload of the wrapper attribute as
a sub-message.
A sub-message attribute uses the value of another attribute as a selector key to
choose the right sub-message format. For example if the following attribute has
already been decoded:
.. code-block:: json
{ "kind": "gre" }
and we encounter the following attribute spec:
.. code-block:: yaml
-
name: data
type: sub-message
sub-message: linkinfo-data-msg
selector: kind
Then we look for a sub-message definition called ``linkinfo-data-msg`` and use
the value of the ``kind`` attribute i.e. ``gre`` as the key to choose the
correct format for the sub-message:
.. code-block:: yaml
sub-messages:
name: linkinfo-data-msg
formats:
-
value: bridge
attribute-set: linkinfo-bridge-attrs
-
value: gre
attribute-set: linkinfo-gre-attrs
-
value: geneve
attribute-set: linkinfo-geneve-attrs
This would decode the attribute value as a sub-message with the attribute-set
called ``linkinfo-gre-attrs`` as the attribute space.
A sub-message can have an optional ``fixed-header`` followed by zero or more
attributes from an ``attribute-set``. For example the following
``tc-options-msg`` sub-message defines message formats that use a mixture of
``fixed-header``, ``attribute-set`` or both together:
.. code-block:: yaml
sub-messages:
-
name: tc-options-msg
formats:
-
value: bfifo
fixed-header: tc-fifo-qopt
-
value: cake
attribute-set: tc-cake-attrs
-
value: netem
fixed-header: tc-netem-qopt
attribute-set: tc-netem-attrs
Note that a selector attribute must appear in a netlink message before any
sub-message attributes that depend on it.
......@@ -158,6 +158,9 @@ class SpecAttr(SpecElement):
len integer, optional byte length of binary types
display_hint string, hint to help choose format specifier
when displaying the value
sub_message string, name of sub message type
selector string, name of attribute used to select
sub-message type
is_auto_scalar bool, attr is a variable-size scalar
"""
......@@ -173,6 +176,8 @@ class SpecAttr(SpecElement):
self.byte_order = yaml.get('byte-order')
self.len = yaml.get('len')
self.display_hint = yaml.get('display-hint')
self.sub_message = yaml.get('sub-message')
self.selector = yaml.get('selector')
self.is_auto_scalar = self.type == "sint" or self.type == "uint"
......@@ -278,6 +283,47 @@ class SpecStruct(SpecElement):
return self.members.items()
class SpecSubMessage(SpecElement):
""" Netlink sub-message definition
Represents a set of sub-message formats for polymorphic nlattrs
that contain type-specific sub messages.
Attributes:
name string, name of sub-message definition
formats dict of sub-message formats indexed by match value
"""
def __init__(self, family, yaml):
super().__init__(family, yaml)
self.formats = collections.OrderedDict()
for elem in self.yaml['formats']:
format = self.new_format(family, elem)
self.formats[format.value] = format
def new_format(self, family, format):
return SpecSubMessageFormat(family, format)
class SpecSubMessageFormat(SpecElement):
""" Netlink sub-message definition
Represents a set of sub-message formats for polymorphic nlattrs
that contain type-specific sub messages.
Attributes:
value attribute value to match against type selector
fixed_header string, name of fixed header, or None
attr_set string, name of attribute set, or None
"""
def __init__(self, family, yaml):
super().__init__(family, yaml)
self.value = yaml.get('value')
self.fixed_header = yaml.get('fixed-header')
self.attr_set = yaml.get('attribute-set')
class SpecOperation(SpecElement):
"""Netlink Operation
......@@ -365,6 +411,7 @@ class SpecFamily(SpecElement):
attr_sets dict of attribute sets
msgs dict of all messages (index by name)
sub_msgs dict of all sub messages (index by name)
ops dict of all valid requests / responses
ntfs dict of all async events
consts dict of all constants/enums
......@@ -405,6 +452,7 @@ class SpecFamily(SpecElement):
jsonschema.validate(self.yaml, schema)
self.attr_sets = collections.OrderedDict()
self.sub_msgs = collections.OrderedDict()
self.msgs = collections.OrderedDict()
self.req_by_value = collections.OrderedDict()
self.rsp_by_value = collections.OrderedDict()
......@@ -441,6 +489,9 @@ class SpecFamily(SpecElement):
def new_struct(self, elem):
return SpecStruct(self, elem)
def new_sub_message(self, elem):
return SpecSubMessage(self, elem);
def new_operation(self, elem, req_val, rsp_val):
return SpecOperation(self, elem, req_val, rsp_val)
......@@ -529,6 +580,10 @@ class SpecFamily(SpecElement):
attr_set = self.new_attr_set(elem)
self.attr_sets[elem['name']] = attr_set
for elem in self.yaml.get('sub-messages', []):
sub_message = self.new_sub_message(elem)
self.sub_msgs[sub_message.name] = sub_message
if self.msg_id_model == 'unified':
self._dictify_ops_unified()
elif self.msg_id_model == 'directional':
......
......@@ -98,12 +98,12 @@ class NlAttr:
}
def __init__(self, raw, offset):
self._len, self._type = struct.unpack("HH", raw[offset:offset + 4])
self._len, self._type = struct.unpack("HH", raw[offset : offset + 4])
self.type = self._type & ~Netlink.NLA_TYPE_MASK
self.is_nest = self._type & Netlink.NLA_F_NESTED
self.payload_len = self._len
self.full_len = (self.payload_len + 3) & ~3
self.raw = raw[offset + 4:offset + self.payload_len]
self.raw = raw[offset + 4 : offset + self.payload_len]
@classmethod
def get_format(cls, attr_type, byte_order=None):
......@@ -154,7 +154,7 @@ class NlAttr:
for m in members:
# TODO: handle non-scalar members
if m.type == 'binary':
decoded = self.raw[offset:offset+m['len']]
decoded = self.raw[offset : offset + m['len']]
offset += m['len']
elif m.type in NlAttr.type_formats:
format = self.get_format(m.type, m.byte_order)
......@@ -170,10 +170,9 @@ class NlAttr:
class NlAttrs:
def __init__(self, msg):
def __init__(self, msg, offset=0):
self.attrs = []
offset = 0
while offset < len(msg):
attr = NlAttr(msg, offset)
offset += attr.full_len
......@@ -193,12 +192,12 @@ class NlAttrs:
class NlMsg:
def __init__(self, msg, offset, attr_space=None):
self.hdr = msg[offset:offset + 16]
self.hdr = msg[offset : offset + 16]
self.nl_len, self.nl_type, self.nl_flags, self.nl_seq, self.nl_portid = \
struct.unpack("IHHII", self.hdr)
self.raw = msg[offset + 16:offset + self.nl_len]
self.raw = msg[offset + 16 : offset + self.nl_len]
self.error = 0
self.done = 0
......@@ -371,8 +370,8 @@ class NetlinkProtocol:
fixed_header_size = 0
if ynl:
op = ynl.rsp_by_value[msg.cmd()]
fixed_header_size = ynl._fixed_header_size(op)
msg.raw_attrs = NlAttrs(msg.raw[fixed_header_size:])
fixed_header_size = ynl._fixed_header_size(op.fixed_header)
msg.raw_attrs = NlAttrs(msg.raw, fixed_header_size)
return msg
def get_mcast_id(self, mcast_name, mcast_groups):
......@@ -549,6 +548,37 @@ class YnlFamily(SpecFamily):
else:
rsp[name] = [decoded]
def _resolve_selector(self, attr_spec, vals):
sub_msg = attr_spec.sub_message
if sub_msg not in self.sub_msgs:
raise Exception(f"No sub-message spec named {sub_msg} for {attr_spec.name}")
sub_msg_spec = self.sub_msgs[sub_msg]
selector = attr_spec.selector
if selector not in vals:
raise Exception(f"There is no value for {selector} to resolve '{attr_spec.name}'")
value = vals[selector]
if value not in sub_msg_spec.formats:
raise Exception(f"No message format for '{value}' in sub-message spec '{sub_msg}'")
spec = sub_msg_spec.formats[value]
return spec
def _decode_sub_msg(self, attr, attr_spec, rsp):
msg_format = self._resolve_selector(attr_spec, rsp)
decoded = {}
offset = 0
if msg_format.fixed_header:
decoded.update(self._decode_fixed_header(attr, msg_format.fixed_header));
offset = self._fixed_header_size(msg_format.fixed_header)
if msg_format.attr_set:
if msg_format.attr_set in self.attr_sets:
subdict = self._decode(NlAttrs(attr.raw, offset), msg_format.attr_set)
decoded.update(subdict)
else:
raise Exception(f"Unknown attribute-set '{attr_space}' when decoding '{attr_spec.name}'")
return decoded
def _decode(self, attrs, space):
if space:
attr_space = self.attr_sets[space]
......@@ -586,6 +616,8 @@ class YnlFamily(SpecFamily):
value = self._decode_enum(value, attr_spec)
selector = self._decode_enum(selector, attr_spec)
decoded = {"value": value, "selector": selector}
elif attr_spec["type"] == 'sub-message':
decoded = self._decode_sub_msg(attr, attr_spec, rsp)
else:
if not self.process_unknown:
raise Exception(f'Unknown {attr_spec["type"]} with name {attr_spec["name"]}')
......@@ -626,20 +658,23 @@ class YnlFamily(SpecFamily):
return
msg = self.nlproto.decode(self, NlMsg(request, 0, op.attr_set))
offset = 20 + self._fixed_header_size(op)
offset = 20 + self._fixed_header_size(op.fixed_header)
path = self._decode_extack_path(msg.raw_attrs, op.attr_set, offset,
extack['bad-attr-offs'])
if path:
del extack['bad-attr-offs']
extack['bad-attr'] = path
def _fixed_header_size(self, op):
if op.fixed_header:
fixed_header_members = self.consts[op.fixed_header].members
def _fixed_header_size(self, name):
if name:
fixed_header_members = self.consts[name].members
size = 0
for m in fixed_header_members:
format = NlAttr.get_format(m.type, m.byte_order)
size += format.size
if m.type in ['pad', 'binary']:
size += m.len
else:
format = NlAttr.get_format(m.type, m.byte_order)
size += format.size
return size
else:
return 0
......@@ -649,12 +684,20 @@ class YnlFamily(SpecFamily):
fixed_header_attrs = dict()
offset = 0
for m in fixed_header_members:
format = NlAttr.get_format(m.type, m.byte_order)
[ value ] = format.unpack_from(msg.raw, offset)
offset += format.size
if m.enum:
value = self._decode_enum(value, m)
fixed_header_attrs[m.name] = value
value = None
if m.type == 'pad':
offset += m.len
elif m.type == 'binary':
value = msg.raw[offset : offset + m.len]
offset += m.len
else:
format = NlAttr.get_format(m.type, m.byte_order)
[ value ] = format.unpack_from(msg.raw, offset)
offset += format.size
if value is not None:
if m.enum:
value = self._decode_enum(value, m)
fixed_header_attrs[m.name] = value
return fixed_header_attrs
def handle_ntf(self, decoded):
......@@ -721,8 +764,13 @@ class YnlFamily(SpecFamily):
fixed_header_members = self.consts[op.fixed_header].members
for m in fixed_header_members:
value = vals.pop(m.name) if m.name in vals else 0
format = NlAttr.get_format(m.type, m.byte_order)
msg += format.pack(value)
if m.type == 'pad':
msg += bytearray(m.len)
elif m.type == 'binary':
msg += bytes.fromhex(value)
else:
format = NlAttr.get_format(m.type, m.byte_order)
msg += format.pack(value)
for name, value in vals.items():
msg += self._add_attr(op.attr_set.name, name, value)
msg = _genl_msg_finalize(msg)
......
......@@ -69,7 +69,7 @@ def rst_paragraph(paragraph: str, level: int = 0) -> str:
def rst_bullet(item: str, level: int = 0) -> str:
"""Return a formatted a bullet"""
return headroom(level) + f" - {item}"
return headroom(level) + f"- {item}"
def rst_subsection(title: str) -> str:
......@@ -240,7 +240,7 @@ def parse_attr_sets(entries: List[Dict[str, Any]]) -> str:
lines.append(rst_section(entry["name"]))
for attr in entry["attributes"]:
type_ = attr.get("type")
attr_line = bold(attr["name"])
attr_line = attr["name"]
if type_:
# Add the attribute type in the same line
attr_line += f" ({inline(type_)})"
......@@ -250,7 +250,25 @@ def parse_attr_sets(entries: List[Dict[str, Any]]) -> str:
for k in attr.keys():
if k in preprocessed + ignored:
continue
lines.append(rst_fields(k, sanitize(attr[k]), 2))
lines.append(rst_fields(k, sanitize(attr[k]), 0))
lines.append("\n")
return "\n".join(lines)
def parse_sub_messages(entries: List[Dict[str, Any]]) -> str:
"""Parse sub-message definitions"""
lines = []
for entry in entries:
lines.append(rst_section(entry["name"]))
for fmt in entry["formats"]:
value = fmt["value"]
lines.append(rst_bullet(bold(value)))
for attr in ['fixed-header', 'attribute-set']:
if attr in fmt:
lines.append(rst_fields(attr, fmt[attr], 1))
lines.append("\n")
return "\n".join(lines)
......@@ -292,6 +310,11 @@ def parse_yaml(obj: Dict[str, Any]) -> str:
lines.append(rst_subtitle("Attribute sets"))
lines.append(parse_attr_sets(obj["attribute-sets"]))
# Sub-messages
if "sub-messages" in obj:
lines.append(rst_subtitle("Sub-messages"))
lines.append(parse_sub_messages(obj["sub-messages"]))
return "\n".join(lines)
......@@ -360,7 +383,7 @@ def generate_main_index_rst(output: str) -> None:
index_dir = os.path.dirname(output)
logging.debug("Looking for .rst files in %s", index_dir)
for filename in os.listdir(index_dir):
for filename in sorted(os.listdir(index_dir)):
if not filename.endswith(".rst") or filename == "index.rst":
continue
lines.append(f" {filename.replace('.rst', '')}\n")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment