From 94bd9656423cab7dfce73dc824f75b59ef25668d Mon Sep 17 00:00:00 2001 From: Stanislav Fomichev Date: Thu, 26 Mar 2026 09:40:34 -0700 Subject: [PATCH] sync to upstream net-next as of v7.0-rc3 Manually hacked: - $(call get_hdr_inc,LINUX_TYPELIMITS_H,typelimits.h) for ethtool - need to send upstream - same for dev_energymodel.h - added .* to sed in update-from-kernel.sh (to swallow trailing /) - skip wireguard: struct nlattr *array; declaration is missing from wireguard_set_device (not sure why codegen doesn't add it) Signed-off-by: Stanislav Fomichev --- Documentation/netlink/genetlink-c.yaml | 2 +- Documentation/netlink/genetlink.yaml | 4 +- Documentation/netlink/netlink-raw.yaml | 13 +- Documentation/netlink/specs/conntrack.yaml | 2 +- .../netlink/specs/dev-energymodel.yaml | 175 +++++ Documentation/netlink/specs/devlink.yaml | 69 ++ Documentation/netlink/specs/dpll.yaml | 12 + Documentation/netlink/specs/ethtool.yaml | 27 +- Documentation/netlink/specs/fou.yaml | 2 + Documentation/netlink/specs/index.rst | 13 + Documentation/netlink/specs/mptcp_pm.yaml | 1 + Documentation/netlink/specs/netdev.yaml | 29 +- Documentation/netlink/specs/nfsd.yaml | 9 +- Documentation/netlink/specs/nftables.yaml | 691 ++++++++++++++++-- Documentation/netlink/specs/ovpn.yaml | 23 +- Documentation/netlink/specs/psp.yaml | 95 +++ Documentation/netlink/specs/rt-addr.yaml | 7 +- Documentation/netlink/specs/rt-link.yaml | 53 +- Documentation/netlink/specs/rt-neigh.yaml | 2 +- Documentation/netlink/specs/rt-route.yaml | 8 +- Documentation/netlink/specs/rt-rule.yaml | 6 +- Documentation/netlink/specs/tc.yaml | 3 + Documentation/netlink/specs/wireguard.yaml | 298 ++++++++ Makefile.deps | 2 + generated/Makefile | 5 +- generated/dev-energymodel-user.cpp | 411 +++++++++++ generated/dev-energymodel-user.hpp | 112 +++ generated/devlink-user.cpp | 357 ++++++++- generated/devlink-user.hpp | 98 +++ generated/dpll-user.cpp | 10 + generated/dpll-user.hpp | 2 + generated/ethtool-user.cpp | 30 + generated/ethtool-user.hpp | 5 + generated/netdev-user.cpp | 115 +++ generated/netdev-user.hpp | 27 +- generated/nfsd-user.cpp | 10 + generated/nfsd-user.hpp | 6 +- generated/ovpn-user.cpp | 23 +- generated/ovpn-user.hpp | 1 + generated/psp-user.cpp | 125 +++- generated/psp-user.hpp | 26 + generated/rt-addr-user.cpp | 2 +- generated/rt-link-user.cpp | 206 +++++- generated/rt-link-user.hpp | 17 +- generated/rt-rule-user.cpp | 4 +- generated/wireguard-user.cpp | 539 ++++++++++++++ generated/wireguard-user.hpp | 122 ++++ linux/dev_energymodel.h | 82 +++ linux/devlink.h | 8 + linux/dpll.h | 2 + linux/ethtool.h | 35 +- linux/ethtool_netlink_generated.h | 4 + linux/handshake.h | 1 + linux/if_link.h | 3 + linux/lockd_netlink.h | 1 + linux/mptcp_pm.h | 3 +- linux/net_shaper.h | 1 + linux/netdev.h | 1 + linux/nfsd_netlink.h | 2 + linux/nl80211.h | 152 +++- linux/openvswitch.h | 76 +- linux/ovpn.h | 3 + linux/pkt_sched.h | 1 + linux/psp.h | 19 + linux/typelimits.h | 8 + linux/wireguard.h | 80 ++ samples/psp | Bin 0 -> 164320 bytes update-from-kernel.sh | 2 +- 68 files changed, 4123 insertions(+), 160 deletions(-) create mode 100644 Documentation/netlink/specs/dev-energymodel.yaml create mode 100644 Documentation/netlink/specs/index.rst create mode 100644 Documentation/netlink/specs/wireguard.yaml create mode 100644 generated/dev-energymodel-user.cpp create mode 100644 generated/dev-energymodel-user.hpp create mode 100644 generated/wireguard-user.cpp create mode 100644 generated/wireguard-user.hpp create mode 100644 linux/dev_energymodel.h create mode 100644 linux/typelimits.h create mode 100644 linux/wireguard.h create mode 100755 samples/psp diff --git a/Documentation/netlink/genetlink-c.yaml b/Documentation/netlink/genetlink-c.yaml index 5a234e9..57f59fe 100644 --- a/Documentation/netlink/genetlink-c.yaml +++ b/Documentation/netlink/genetlink-c.yaml @@ -227,7 +227,7 @@ properties: Optional format indicator that is intended only for choosing the right formatting mechanism when displaying values of this type. - enum: [ hex, mac, fddi, ipv4, ipv6, uuid ] + enum: [ hex, mac, fddi, ipv4, ipv6, ipv4-or-v6, uuid ] # Start genetlink-c name-prefix: type: string diff --git a/Documentation/netlink/genetlink.yaml b/Documentation/netlink/genetlink.yaml index 7b1ec15..a1194d5 100644 --- a/Documentation/netlink/genetlink.yaml +++ b/Documentation/netlink/genetlink.yaml @@ -185,7 +185,7 @@ properties: Optional format indicator that is intended only for choosing the right formatting mechanism when displaying values of this type. - enum: [ hex, mac, fddi, ipv4, ipv6, uuid ] + enum: [ hex, mac, fddi, ipv4, ipv6, ipv4-or-v6, uuid ] # Make sure name-prefix does not appear in subsets (subsets inherit naming) dependencies: @@ -262,7 +262,7 @@ properties: description: Command flags. type: array items: - enum: [ admin-perm ] + enum: [ admin-perm, uns-admin-perm ] dont-validate: description: Kernel attribute validation flags. type: array diff --git a/Documentation/netlink/netlink-raw.yaml b/Documentation/netlink/netlink-raw.yaml index 246fa07..dd98dda 100644 --- a/Documentation/netlink/netlink-raw.yaml +++ b/Documentation/netlink/netlink-raw.yaml @@ -19,6 +19,12 @@ $defs: type: [ string, integer ] pattern: ^[0-9A-Za-z_-]+( - 1)?$ minimum: 0 + len-or-limit: + # literal int, const name, or limit based on fixed-width type + # e.g. u8-min, u16-max, etc. + type: [ string, integer ] + pattern: ^[0-9A-Za-z_-]+$ + minimum: 0 # Schema for specs title: Protocol @@ -157,7 +163,7 @@ properties: Optional format indicator that is intended only for choosing the right formatting mechanism when displaying values of this type. - enum: [ hex, mac, fddi, ipv4, ipv6, uuid ] + enum: [ hex, mac, fddi, ipv4, ipv6, ipv4-or-v6, uuid ] struct: description: Name of the nested struct type. type: string @@ -270,7 +276,10 @@ properties: type: string min: description: Min value for an integer attribute. - type: integer + $ref: '#/$defs/len-or-limit' + max: + description: Max value for an integer attribute. + $ref: '#/$defs/len-or-limit' min-len: description: Min length for a binary attribute. $ref: '#/$defs/len-or-define' diff --git a/Documentation/netlink/specs/conntrack.yaml b/Documentation/netlink/specs/conntrack.yaml index bef5286..db7cddc 100644 --- a/Documentation/netlink/specs/conntrack.yaml +++ b/Documentation/netlink/specs/conntrack.yaml @@ -457,7 +457,7 @@ attribute-sets: name: labels type: binary - - name: labels mask + name: labels-mask type: binary - name: synproxy diff --git a/Documentation/netlink/specs/dev-energymodel.yaml b/Documentation/netlink/specs/dev-energymodel.yaml new file mode 100644 index 0000000..11faabf --- /dev/null +++ b/Documentation/netlink/specs/dev-energymodel.yaml @@ -0,0 +1,175 @@ +# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +# +# Copyright (c) 2025 Valve Corporation. +# +--- +name: dev-energymodel + +doc: | + Energy model netlink interface to notify its changes. + +protocol: genetlink + +uapi-header: linux/dev_energymodel.h + +definitions: + - + type: flags + name: perf-state-flags + entries: + - + name: perf-state-inefficient + doc: >- + The performance state is inefficient. There is in this perf-domain, + another performance state with a higher frequency but a lower or + equal power cost. + - + type: flags + name: perf-domain-flags + entries: + - + name: perf-domain-microwatts + doc: >- + The power values are in micro-Watts or some other scale. + - + name: perf-domain-skip-inefficiencies + doc: >- + Skip inefficient states when estimating energy consumption. + - + name: perf-domain-artificial + doc: >- + The power values are artificial and might be created by platform + missing real power information. + +attribute-sets: + - + name: perf-domain + doc: >- + Information on a single performance domains. + attributes: + - + name: pad + type: pad + - + name: perf-domain-id + type: u32 + doc: >- + A unique ID number for each performance domain. + - + name: flags + type: u64 + doc: >- + Bitmask of performance domain flags. + enum: perf-domain-flags + - + name: cpus + type: u64 + multi-attr: true + doc: >- + CPUs that belong to this performance domain. + - + name: perf-table + doc: >- + Performance states table. + attributes: + - + name: perf-domain-id + type: u32 + doc: >- + A unique ID number for each performance domain. + - + name: perf-state + type: nest + nested-attributes: perf-state + multi-attr: true + - + name: perf-state + doc: >- + Performance state of a performance domain. + attributes: + - + name: pad + type: pad + - + name: performance + type: u64 + doc: >- + CPU performance (capacity) at a given frequency. + - + name: frequency + type: u64 + doc: >- + The frequency in KHz, for consistency with CPUFreq. + - + name: power + type: u64 + doc: >- + The power consumed at this level (by 1 CPU or by a registered + device). It can be a total power: static and dynamic. + - + name: cost + type: u64 + doc: >- + The cost coefficient associated with this level, used during energy + calculation. Equal to: power * max_frequency / frequency. + - + name: flags + type: u64 + doc: >- + Bitmask of performance state flags. + enum: perf-state-flags + +operations: + list: + - + name: get-perf-domains + attribute-set: perf-domain + doc: Get the list of information for all performance domains. + do: + request: + attributes: + - perf-domain-id + reply: + attributes: &perf-domain-attrs + - pad + - perf-domain-id + - flags + - cpus + dump: + reply: + attributes: *perf-domain-attrs + - + name: get-perf-table + attribute-set: perf-table + doc: Get the energy model table of a performance domain. + do: + request: + attributes: + - perf-domain-id + reply: + attributes: + - perf-domain-id + - perf-state + - + name: perf-domain-created + doc: A performance domain is created. + notify: get-perf-table + mcgrp: event + - + name: perf-domain-updated + doc: A performance domain is updated. + notify: get-perf-table + mcgrp: event + - + name: perf-domain-deleted + doc: A performance domain is deleted. + attribute-set: perf-table + event: + attributes: + - perf-domain-id + mcgrp: event + +mcast-groups: + list: + - + name: event diff --git a/Documentation/netlink/specs/devlink.yaml b/Documentation/netlink/specs/devlink.yaml index 3db59c9..b495d56 100644 --- a/Documentation/netlink/specs/devlink.yaml +++ b/Documentation/netlink/specs/devlink.yaml @@ -99,6 +99,8 @@ definitions: name: legacy - name: switchdev + - + name: switchdev-inactive - type: enum name: eswitch-inline-mode @@ -857,6 +859,20 @@ attribute-sets: name: health-reporter-burst-period type: u64 doc: Time (in msec) for recoveries before starting the grace period. + + # TODO: fill in the attributes in between + + - + name: param-reset-default + type: flag + doc: Request restoring parameter to its default value. + value: 183 + - + name: index + type: uint + doc: Unique devlink instance index. + checks: + max: u32-max - name: dl-dev-stats subset-of: devlink @@ -1296,11 +1312,13 @@ operations: attributes: &dev-id-attrs - bus-name - dev-name + - index reply: &get-reply value: 3 attributes: - bus-name - dev-name + - index - reload-failed - dev-stats dump: @@ -1319,6 +1337,7 @@ operations: attributes: &port-id-attrs - bus-name - dev-name + - index - port-index reply: value: 7 @@ -1343,6 +1362,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - port-type - port-function @@ -1360,6 +1380,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - port-flavour - port-pci-pf-number @@ -1394,6 +1415,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - port-split-count @@ -1422,6 +1444,7 @@ operations: attributes: &sb-id-attrs - bus-name - dev-name + - index - sb-index reply: &sb-get-reply value: 13 @@ -1444,6 +1467,7 @@ operations: attributes: &sb-pool-id-attrs - bus-name - dev-name + - index - sb-index - sb-pool-index reply: &sb-pool-get-reply @@ -1467,6 +1491,7 @@ operations: attributes: - bus-name - dev-name + - index - sb-index - sb-pool-index - sb-pool-threshold-type @@ -1485,6 +1510,7 @@ operations: attributes: &sb-port-pool-id-attrs - bus-name - dev-name + - index - port-index - sb-index - sb-pool-index @@ -1509,6 +1535,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - sb-index - sb-pool-index @@ -1527,6 +1554,7 @@ operations: attributes: &sb-tc-pool-bind-id-attrs - bus-name - dev-name + - index - port-index - sb-index - sb-pool-type @@ -1552,6 +1580,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - sb-index - sb-pool-index @@ -1573,6 +1602,7 @@ operations: attributes: - bus-name - dev-name + - index - sb-index - @@ -1588,6 +1618,7 @@ operations: attributes: - bus-name - dev-name + - index - sb-index - @@ -1606,6 +1637,7 @@ operations: attributes: &eswitch-attrs - bus-name - dev-name + - index - eswitch-mode - eswitch-inline-mode - eswitch-encap-mode @@ -1634,12 +1666,14 @@ operations: attributes: - bus-name - dev-name + - index - dpipe-table-name reply: value: 31 attributes: - bus-name - dev-name + - index - dpipe-tables - @@ -1654,11 +1688,13 @@ operations: attributes: - bus-name - dev-name + - index - dpipe-table-name reply: attributes: - bus-name - dev-name + - index - dpipe-entries - @@ -1673,10 +1709,12 @@ operations: attributes: - bus-name - dev-name + - index reply: attributes: - bus-name - dev-name + - index - dpipe-headers - @@ -1692,6 +1730,7 @@ operations: attributes: - bus-name - dev-name + - index - dpipe-table-name - dpipe-table-counters-enabled @@ -1708,6 +1747,7 @@ operations: attributes: - bus-name - dev-name + - index - resource-id - resource-size @@ -1723,11 +1763,13 @@ operations: attributes: - bus-name - dev-name + - index reply: value: 36 attributes: - bus-name - dev-name + - index - resource-list - @@ -1743,6 +1785,7 @@ operations: attributes: - bus-name - dev-name + - index - reload-action - reload-limits - netns-pid @@ -1752,6 +1795,7 @@ operations: attributes: - bus-name - dev-name + - index - reload-actions-performed - @@ -1766,6 +1810,7 @@ operations: attributes: ¶m-id-attrs - bus-name - dev-name + - index - param-name reply: ¶m-get-reply attributes: *param-id-attrs @@ -1787,10 +1832,12 @@ operations: attributes: - bus-name - dev-name + - index - param-name - param-type # param-value-data is missing here as the type is variable - param-value-cmode + - param-reset-default - name: region-get @@ -1805,6 +1852,7 @@ operations: attributes: ®ion-id-attrs - bus-name - dev-name + - index - port-index - region-name reply: ®ion-get-reply @@ -1829,6 +1877,7 @@ operations: attributes: ®ion-snapshot-id-attrs - bus-name - dev-name + - index - port-index - region-name - region-snapshot-id @@ -1859,6 +1908,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - region-name - region-snapshot-id @@ -1870,6 +1920,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - region-name @@ -1919,6 +1970,7 @@ operations: attributes: - bus-name - dev-name + - index - info-driver-name - info-serial-number - info-version-fixed @@ -1940,6 +1992,7 @@ operations: attributes: &health-reporter-id-attrs - bus-name - dev-name + - index - port-index - health-reporter-name reply: &health-reporter-get-reply @@ -1962,6 +2015,7 @@ operations: attributes: - bus-name - dev-name + - index - port-index - health-reporter-name - health-reporter-graceful-period @@ -2032,6 +2086,7 @@ operations: attributes: - bus-name - dev-name + - index - flash-update-file-name - flash-update-component - flash-update-overwrite-mask @@ -2049,6 +2104,7 @@ operations: attributes: &trap-id-attrs - bus-name - dev-name + - index - trap-name reply: &trap-get-reply value: 63 @@ -2071,6 +2127,7 @@ operations: attributes: - bus-name - dev-name + - index - trap-name - trap-action @@ -2087,6 +2144,7 @@ operations: attributes: &trap-group-id-attrs - bus-name - dev-name + - index - trap-group-name reply: &trap-group-get-reply value: 67 @@ -2109,6 +2167,7 @@ operations: attributes: - bus-name - dev-name + - index - trap-group-name - trap-action - trap-policer-id @@ -2126,6 +2185,7 @@ operations: attributes: &trap-policer-id-attrs - bus-name - dev-name + - index - trap-policer-id reply: &trap-policer-get-reply value: 71 @@ -2148,6 +2208,7 @@ operations: attributes: - bus-name - dev-name + - index - trap-policer-id - trap-policer-rate - trap-policer-burst @@ -2178,6 +2239,7 @@ operations: attributes: &rate-id-attrs - bus-name - dev-name + - index - port-index - rate-node-name reply: &rate-get-reply @@ -2201,6 +2263,7 @@ operations: attributes: - bus-name - dev-name + - index - rate-node-name - rate-tx-share - rate-tx-max @@ -2222,6 +2285,7 @@ operations: attributes: - bus-name - dev-name + - index - rate-node-name - rate-tx-share - rate-tx-max @@ -2243,6 +2307,7 @@ operations: attributes: - bus-name - dev-name + - index - rate-node-name - @@ -2258,6 +2323,7 @@ operations: attributes: &linecard-id-attrs - bus-name - dev-name + - index - linecard-index reply: &linecard-get-reply value: 80 @@ -2280,6 +2346,7 @@ operations: attributes: - bus-name - dev-name + - index - linecard-index - linecard-type @@ -2313,6 +2380,7 @@ operations: attributes: - bus-name - dev-name + - index - selftests - @@ -2324,4 +2392,5 @@ operations: attributes: - bus-name - dev-name + - index - port-index diff --git a/Documentation/netlink/specs/dpll.yaml b/Documentation/netlink/specs/dpll.yaml index 78d0724..3dd48a3 100644 --- a/Documentation/netlink/specs/dpll.yaml +++ b/Documentation/netlink/specs/dpll.yaml @@ -446,6 +446,16 @@ attribute-sets: doc: | Granularity of phase adjustment, in picoseconds. The value of phase adjustment must be a multiple of this granularity. + - + name: fractional-frequency-offset-ppt + type: sint + doc: | + The FFO (Fractional Frequency Offset) of the pin with respect to + the nominal frequency. + Value = (frequency_measured - frequency_nominal) / frequency_nominal + Value is in PPT (parts per trillion, 10^-12). + Note: This attribute provides higher resolution than the standard + fractional-frequency-offset (which is in PPM). - name: pin-parent-device @@ -550,6 +560,7 @@ operations: request: attributes: - id + - mode - phase-offset-monitor - phase-offset-avg-factor - @@ -627,6 +638,7 @@ operations: - phase-adjust-max - phase-adjust - fractional-frequency-offset + - fractional-frequency-offset-ppt - esync-frequency - esync-frequency-supported - esync-pulse diff --git a/Documentation/netlink/specs/ethtool.yaml b/Documentation/netlink/specs/ethtool.yaml index 05d2b65..5dd4d1b 100644 --- a/Documentation/netlink/specs/ethtool.yaml +++ b/Documentation/netlink/specs/ethtool.yaml @@ -306,10 +306,6 @@ attribute-sets: name: strings attr-cnt-name: __ethtool-a-strings-cnt attributes: - - - name: unspec - type: unused - value: 0 - name: unspec type: unused @@ -861,6 +857,12 @@ attribute-sets: name: tx-profile type: nest nested-attributes: profile + - + name: rx-cqe-frames + type: u32 + - + name: rx-cqe-nsecs + type: u32 - name: pause-stat @@ -879,6 +881,19 @@ attribute-sets: - name: rx-frames type: u64 + - + name: tx-pause-storm-events + type: u64 + doc: >- + TX pause storm event count. Increments each time device + detects that its pause assertion condition has been true + for too long for normal operation. As a result, the device + has temporarily disabled its own Pause TX function to + protect the network from itself. + This counter should never increment under normal overload + conditions; it indicates catastrophic failure like an OS + crash. The rate of incrementing is implementation specific. + - name: pause attr-cnt-name: __ethtool-a-pause-cnt @@ -1269,7 +1284,7 @@ attribute-sets: - name: hist type: nest - multi-attr: True + multi-attr: true nested-attributes: fec-hist - name: fec @@ -2244,6 +2259,8 @@ operations: - tx-aggr-time-usecs - rx-profile - tx-profile + - rx-cqe-frames + - rx-cqe-nsecs dump: *coalesce-get-op - name: coalesce-set diff --git a/Documentation/netlink/specs/fou.yaml b/Documentation/netlink/specs/fou.yaml index 8e7974e..331f1b3 100644 --- a/Documentation/netlink/specs/fou.yaml +++ b/Documentation/netlink/specs/fou.yaml @@ -39,6 +39,8 @@ attribute-sets: - name: ipproto type: u8 + checks: + min: 1 - name: type type: u8 diff --git a/Documentation/netlink/specs/index.rst b/Documentation/netlink/specs/index.rst new file mode 100644 index 0000000..7f7cf4a --- /dev/null +++ b/Documentation/netlink/specs/index.rst @@ -0,0 +1,13 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. _specs: + +============================= +Netlink Family Specifications +============================= + +.. toctree:: + :maxdepth: 1 + :glob: + + * diff --git a/Documentation/netlink/specs/mptcp_pm.yaml b/Documentation/netlink/specs/mptcp_pm.yaml index ba30a40..39f3fac 100644 --- a/Documentation/netlink/specs/mptcp_pm.yaml +++ b/Documentation/netlink/specs/mptcp_pm.yaml @@ -15,6 +15,7 @@ definitions: type: enum name: event-type enum-name: mptcp-event-type + doc: Netlink MPTCP event types name-prefix: mptcp-event- entries: - diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml index 10c412b..596c306 100644 --- a/Documentation/netlink/specs/netdev.yaml +++ b/Documentation/netlink/specs/netdev.yaml @@ -142,7 +142,7 @@ attribute-sets: name: ifindex doc: | ifindex of the netdev to which the pool belongs. - May be reported as 0 if the page pool was allocated for a netdev + May not be reported if the page pool was allocated for a netdev which got destroyed already (page pools may outlast their netdevs because they wait for all memory to be returned). type: u32 @@ -601,7 +601,9 @@ operations: name: page-pool-get doc: | Get / dump information about Page Pools. - (Only Page Pools associated with a net_device can be listed.) + Only Page Pools associated by the driver with a net_device + can be listed. ifindex will not be reported if the net_device + no longer exists. attribute-set: page-pool do: request: @@ -733,6 +735,29 @@ operations: - rx-bytes - tx-packets - tx-bytes + - rx-alloc-fail + - rx-hw-drops + - rx-hw-drop-overruns + - rx-csum-complete + - rx-csum-unnecessary + - rx-csum-none + - rx-csum-bad + - rx-hw-gro-packets + - rx-hw-gro-bytes + - rx-hw-gro-wire-packets + - rx-hw-gro-wire-bytes + - rx-hw-drop-ratelimits + - tx-hw-drops + - tx-hw-drop-errors + - tx-csum-none + - tx-needs-csum + - tx-hw-gso-packets + - tx-hw-gso-bytes + - tx-hw-gso-wire-packets + - tx-hw-gso-wire-bytes + - tx-hw-drop-ratelimits + - tx-stop + - tx-wake - name: bind-rx doc: Bind dmabuf to netdev diff --git a/Documentation/netlink/specs/nfsd.yaml b/Documentation/netlink/specs/nfsd.yaml index 1003630..f87b5a0 100644 --- a/Documentation/netlink/specs/nfsd.yaml +++ b/Documentation/netlink/specs/nfsd.yaml @@ -78,6 +78,9 @@ attribute-sets: - name: scope type: string + - + name: min-threads + type: u32 - name: version attributes: @@ -149,7 +152,7 @@ operations: - compound-ops - name: threads-set - doc: set the number of running threads + doc: set the maximum number of running threads attribute-set: server flags: [admin-perm] do: @@ -159,9 +162,10 @@ operations: - gracetime - leasetime - scope + - min-threads - name: threads-get - doc: get the number of running threads + doc: get the maximum number of running threads attribute-set: server do: reply: @@ -170,6 +174,7 @@ operations: - gracetime - leasetime - scope + - min-threads - name: version-set doc: set nfs enabled versions diff --git a/Documentation/netlink/specs/nftables.yaml b/Documentation/netlink/specs/nftables.yaml index cce8881..21edf3d 100644 --- a/Documentation/netlink/specs/nftables.yaml +++ b/Documentation/netlink/specs/nftables.yaml @@ -66,9 +66,21 @@ definitions: name: bitwise-ops type: enum entries: - - bool - - lshift - - rshift + - + name: mask-xor # aka bool (old name) + doc: >- + mask-and-xor operation used to implement NOT, AND, OR and XOR boolean + operations + - + name: lshift + - + name: rshift + - + name: and + - + name: or + - + name: xor - name: cmp-ops type: enum @@ -132,6 +144,12 @@ definitions: - object - concat - expr + - + name: set-elem-flags + type: flags + entries: + - interval-end + - catchall - name: lookup-flags type: flags @@ -225,19 +243,244 @@ definitions: - icmp-unreach - tcp-rst - icmpx-unreach + - + name: reject-inet-code + doc: These codes are mapped to real ICMP and ICMPv6 codes. + type: enum + entries: + - icmpx-no-route + - icmpx-port-unreach + - icmpx-host-unreach + - icmpx-admin-prohibited + - + name: payload-base + type: enum + entries: + - link-layer-header + - network-header + - transport-header + - inner-header + - tun-header + - + name: range-ops + doc: Range operator + type: enum + entries: + - eq + - neq + - + name: registers + doc: | + nf_tables registers. + nf_tables used to have five registers: a verdict register and four data + registers of size 16. The data registers have been changed to 16 registers + of size 4. For compatibility reasons, the NFT_REG_[1-4] registers still + map to areas of size 16, the 4 byte registers are addressed using + NFT_REG32_00 - NFT_REG32_15. + type: enum + entries: + - + name: reg-verdict + - + name: reg-1 + - + name: reg-2 + - + name: reg-3 + - + name: reg-4 + - + name: reg32-00 + value: 8 + - + name: reg32-01 + - + name: reg32-02 + - + name: reg32-03 + - + name: reg32-04 + - + name: reg32-05 + - + name: reg32-06 + - + name: reg32-07 + - + name: reg32-08 + - + name: reg32-09 + - + name: reg32-10 + - + name: reg32-11 + - + name: reg32-12 + - + name: reg32-13 + - + name: reg32-14 + - + name: reg32-15 + - + name: numgen-types + type: enum + entries: + - incremental + - random + - + name: log-level + doc: nf_tables log levels + type: enum + entries: + - + name: emerg + doc: system is unusable + - + name: alert + doc: action must be taken immediately + - + name: crit + doc: critical conditions + - + name: err + doc: error conditions + - + name: warning + doc: warning conditions + - + name: notice + doc: normal but significant condition + - + name: info + doc: informational + - + name: debug + doc: debug-level messages + - + name: audit + doc: enabling audit logging + - + name: log-flags + doc: nf_tables log flags + header: linux/netfilter/nf_log.h + type: flags + entries: + - + name: tcpseq + doc: Log TCP sequence numbers + - + name: tcpopt + doc: Log TCP options + - + name: ipopt + doc: Log IP options + - + name: uid + doc: Log UID owning local socket + - + name: nflog + doc: Unsupported, don't reuse + - + name: macdecode + doc: Decode MAC header attribute-sets: - - name: empty-attrs + name: log-attrs + doc: log expression netlink attributes attributes: + # Mentioned in nft_log_init() - - name: name + name: group + doc: netlink group to send messages to + type: u16 + byte-order: big-endian + - + name: prefix + doc: prefix to prepend to log messages type: string + - + name: snaplen + doc: length of payload to include in netlink message + type: u32 + byte-order: big-endian + - + name: qthreshold + doc: queue threshold + type: u16 + byte-order: big-endian + - + name: level + doc: log level + type: u32 + enum: log-level + byte-order: big-endian + - + name: flags + doc: logging flags + type: u32 + enum: log-flags + byte-order: big-endian + - + name: numgen-attrs + doc: nf_tables number generator expression netlink attributes + attributes: + - + name: dreg + doc: destination register + type: u32 + enum: registers + - + name: modulus + doc: maximum counter value + type: u32 + byte-order: big-endian + - + name: type + doc: operation type + type: u32 + byte-order: big-endian + enum: numgen-types + - + name: offset + doc: offset to be added to the counter + type: u32 + byte-order: big-endian + - + name: range-attrs + attributes: + # Mentioned in net/netfilter/nft_range.c + - + name: sreg + doc: source register of data to compare + type: u32 + byte-order: big-endian + enum: registers + - + name: op + doc: cmp operation + type: u32 + byte-order: big-endian + enum: range-ops + checks: + max: 255 + - + name: from-data + doc: data range from + type: nest + nested-attributes: data-attrs + - + name: to-data + doc: data range to + type: nest + nested-attributes: data-attrs - name: batch-attrs attributes: - name: genid + doc: generation ID for this changeset type: u32 byte-order: big-endian - @@ -264,10 +507,18 @@ attribute-sets: type: u64 byte-order: big-endian doc: numeric handle of the table + - + name: pad + type: pad - name: userdata type: binary doc: user data + - + name: owner + type: u32 + byte-order: big-endian + doc: owner of this table through netlink portID - name: chain-attrs attributes: @@ -371,9 +622,11 @@ attribute-sets: - name: bytes type: u64 + byte-order: big-endian - name: packets type: u64 + byte-order: big-endian - name: rule-attrs attributes: @@ -443,15 +696,18 @@ attribute-sets: selector: name doc: type specific data - + # Mentioned in nft_parse_compat() in net/netfilter/nft_compat.c name: rule-compat-attrs attributes: - name: proto - type: binary + type: u32 + byte-order: big-endian doc: numeric value of the handled protocol - name: flags - type: binary + type: u32 + byte-order: big-endian doc: bitmask of flags - name: set-attrs @@ -540,6 +796,15 @@ attribute-sets: type: nest nested-attributes: set-list-attrs doc: list of expressions + - + name: type + type: string + doc: set backend type + - + name: count + type: u32 + byte-order: big-endian + doc: number of set elements - name: set-desc-attrs attributes: @@ -767,6 +1032,22 @@ attribute-sets: nested-attributes: hook-dev-attrs - name: expr-bitwise-attrs + doc: | + The bitwise expression supports boolean and shift operations. It + implements the boolean operations by performing the following + operation:: + + dreg = (sreg & mask) ^ xor + + with these mask and xor values: + + op mask xor + ---- ---- --- + NOT: 1 1 + OR: ~x x + XOR: 1 x + AND: x 0 + attributes: - name: sreg @@ -793,6 +1074,8 @@ attribute-sets: type: u32 byte-order: big-endian enum: bitwise-ops + checks: + max: 255 - name: data type: nest @@ -829,25 +1112,31 @@ attribute-sets: attributes: - name: code + doc: nf_tables verdict type: u32 byte-order: big-endian enum: verdict-code - name: chain + doc: jump target chain name type: string - name: chain-id + doc: jump target chain ID type: u32 + byte-order: big-endian - name: expr-counter-attrs attributes: - name: bytes type: u64 + byte-order: big-endian doc: Number of bytes - name: packets type: u64 + byte-order: big-endian doc: Number of packets - name: pad @@ -915,7 +1204,7 @@ attribute-sets: type: string doc: Name of set to use - - name: set id + name: set-id type: u32 byte-order: big-endian doc: ID of set to use @@ -932,6 +1221,25 @@ attribute-sets: type: u32 byte-order: big-endian enum: lookup-flags + - + name: expr-masq-attrs + attributes: + - + name: flags + type: u32 + byte-order: big-endian + enum: nat-range-flags + enum-as-flags: true + - + name: reg-proto-min + type: u32 + byte-order: big-endian + enum: registers + - + name: reg-proto-max + type: u32 + byte-order: big-endian + enum: registers - name: expr-meta-attrs attributes: @@ -983,37 +1291,49 @@ attribute-sets: enum-as-flags: true - name: expr-payload-attrs + doc: nf_tables payload expression netlink attributes attributes: - name: dreg + doc: destination register to load data into type: u32 byte-order: big-endian + enum: registers - name: base + doc: payload base type: u32 + enum: payload-base byte-order: big-endian - name: offset + doc: payload offset relative to base type: u32 byte-order: big-endian - name: len + doc: payload length type: u32 byte-order: big-endian - name: sreg + doc: source register to load data from type: u32 byte-order: big-endian + enum: registers - name: csum-type + doc: checksum type type: u32 byte-order: big-endian - name: csum-offset + doc: checksum offset relative to base type: u32 byte-order: big-endian - name: csum-flags + doc: checksum flags type: u32 byte-order: big-endian - @@ -1079,6 +1399,61 @@ attribute-sets: type: u32 byte-order: big-endian doc: id of object map + - + name: compat-target-attrs + header: linux/netfilter/nf_tables_compat.h + attributes: + - + name: name + type: string + checks: + max-len: 32 + - + name: rev + type: u32 + byte-order: big-endian + checks: + max: 255 + - + name: info + type: binary + - + name: compat-match-attrs + header: linux/netfilter/nf_tables_compat.h + attributes: + - + name: name + type: string + checks: + max-len: 32 + - + name: rev + type: u32 + byte-order: big-endian + checks: + max: 255 + - + name: info + type: binary + - + name: compat-attrs + header: linux/netfilter/nf_tables_compat.h + attributes: + - + name: name + type: string + checks: + max-len: 32 + - + name: rev + type: u32 + byte-order: big-endian + checks: + max: 255 + - + name: type + type: u32 + byte-order: big-endian sub-messages: - @@ -1105,15 +1480,24 @@ sub-messages: - value: immediate attribute-set: expr-immediate-attrs + - + value: log + attribute-set: log-attrs - value: lookup attribute-set: expr-lookup-attrs + - + value: match + attribute-set: compat-match-attrs - value: meta attribute-set: expr-meta-attrs - value: nat attribute-set: expr-nat-attrs + - + value: numgen + attribute-set: numgen-attrs - value: objref attribute-set: expr-objref-attrs @@ -1123,6 +1507,9 @@ sub-messages: - value: quota attribute-set: quota-attrs + - + value: range + attribute-set: range-attrs - value: reject attribute-set: expr-reject-attrs @@ -1132,6 +1519,9 @@ sub-messages: - value: tproxy attribute-set: expr-tproxy-attrs + # There're more sub-messages to go: + # grep -A10 nft_expr_type + # and look for .name\s*=\s*"..." - name: obj-data formats: @@ -1178,7 +1568,10 @@ operations: request: value: 0xa00 attributes: + # Mentioned in nf_tables_newtable() - name + - flags + - userdata - name: gettable doc: Get / dump tables. @@ -1188,11 +1581,21 @@ operations: request: value: 0xa01 attributes: + # Mentioned in nf_tables_gettable() - name reply: value: 0xa00 - attributes: + attributes: &get-table + # Mentioned in nf_tables_fill_table_info() - name + - use + - handle + - flags + - owner + - userdata + dump: + reply: + attributes: *get-table - name: deltable doc: Delete an existing table. @@ -1201,8 +1604,10 @@ operations: do: request: value: 0xa02 - attributes: + attributes: &del-table + # Mentioned in nf_tables_deltable() - name + - handle - name: destroytable doc: | @@ -1213,8 +1618,7 @@ operations: do: request: value: 0xa1a - attributes: - - name + attributes: *del-table - name: newchain doc: Create a new chain. @@ -1224,7 +1628,19 @@ operations: request: value: 0xa03 attributes: + # Mentioned in nf_tables_newchain() + - table + - handle + - policy + - flags + # Mentioned in nf_tables_updchain() + - hook - name + - counters + # Mentioned in nf_tables_addchain() + - userdata + # Mentioned in nft_chain_parse_hook() + - type - name: getchain doc: Get / dump chains. @@ -1234,11 +1650,27 @@ operations: request: value: 0xa04 attributes: + # Mentioned in nf_tables_getchain() + - table - name reply: value: 0xa03 - attributes: + attributes: &get-chain + # Mentioned in nf_tables_fill_chain_info() + - table - name + - handle + - hook + - policy + - type + - flags + - counters + - id + - use + - userdata + dump: + reply: + attributes: *get-chain - name: delchain doc: Delete an existing chain. @@ -1247,8 +1679,12 @@ operations: do: request: value: 0xa05 - attributes: + attributes: &del-chain + # Mentioned in nf_tables_delchain() + - table + - handle - name + - hook - name: destroychain doc: | @@ -1259,8 +1695,7 @@ operations: do: request: value: 0xa1b - attributes: - - name + attributes: *del-chain - name: newrule doc: Create a new rule. @@ -1270,7 +1705,16 @@ operations: request: value: 0xa06 attributes: - - name + # Mentioned in nf_tables_newrule() + - table + - chain + - chain-id + - handle + - position + - position-id + - expressions + - userdata + - compat - name: getrule doc: Get / dump rules. @@ -1279,12 +1723,30 @@ operations: do: request: value: 0xa07 - attributes: - - name + attributes: &get-rule-request + # Mentioned in nf_tables_getrule_single() + - table + - chain + - handle reply: value: 0xa06 + attributes: &get-rule + # Mentioned in nf_tables_fill_rule_info() + - table + - chain + - handle + - position + - expressions + - userdata + dump: + request: attributes: - - name + # Mentioned in nf_tables_dump_rules_start() + - table + - chain + reply: + attributes: *get-rule + - name: getrule-reset doc: Get / dump rules and reset stateful expressions. @@ -1293,12 +1755,15 @@ operations: do: request: value: 0xa19 - attributes: - - name + attributes: *get-rule-request reply: value: 0xa06 - attributes: - - name + attributes: *get-rule + dump: + request: + attributes: *get-rule-request + reply: + attributes: *get-rule - name: delrule doc: Delete an existing rule. @@ -1307,8 +1772,11 @@ operations: do: request: value: 0xa08 - attributes: - - name + attributes: &del-rule + - table + - chain + - handle + - id - name: destroyrule doc: | @@ -1318,8 +1786,7 @@ operations: do: request: value: 0xa1c - attributes: - - name + attributes: *del-rule - name: newset doc: Create a new set. @@ -1329,7 +1796,21 @@ operations: request: value: 0xa09 attributes: + # Mentioned in nf_tables_newset() + - table - name + - key-len + - id + - key-type + - flags + - data-type + - data-len + - obj-type + - timeout + - gc-interval + - policy + - desc + - userdata - name: getset doc: Get / dump sets. @@ -1339,11 +1820,35 @@ operations: request: value: 0xa0a attributes: + # Mentioned in nf_tables_getset() + - table - name reply: value: 0xa09 - attributes: + attributes: &get-set + # Mentioned in nf_tables_fill_set() + - table - name + - handle + - flags + - key-len + - key-type + - data-type + - data-len + - obj-type + - gc-interval + - policy + - userdata + - desc + - expr + - expressions + dump: + request: + attributes: + # Mentioned in nf_tables_getset() + - table + reply: + attributes: *get-set - name: delset doc: Delete an existing set. @@ -1352,7 +1857,10 @@ operations: do: request: value: 0xa0b - attributes: + attributes: &del-set + # Mentioned in nf_tables_delset() + - table + - handle - name - name: destroyset @@ -1363,8 +1871,7 @@ operations: do: request: value: 0xa1d - attributes: - - name + attributes: *del-set - name: newsetelem doc: Create a new set element. @@ -1374,7 +1881,11 @@ operations: request: value: 0xa0c attributes: - - name + # Mentioned in nf_tables_newsetelem() + - table + - set + - set-id + - elements - name: getsetelem doc: Get / dump set elements. @@ -1384,11 +1895,27 @@ operations: request: value: 0xa0d attributes: - - name + # Mentioned in nf_tables_getsetelem() + - table + - set + - elements reply: value: 0xa0c attributes: - - name + # Mentioned in nf_tables_fill_setelem_info() + - elements + dump: + request: + attributes: &dump-set-request + # Mentioned in nft_set_dump_ctx_init() + - table + - set + reply: + attributes: &dump-set + # Mentioned in nf_tables_dump_set() + - table + - set + - elements - name: getsetelem-reset doc: Get / dump set elements and reset stateful expressions. @@ -1398,11 +1925,20 @@ operations: request: value: 0xa21 attributes: - - name + # Mentioned in nf_tables_getsetelem_reset() + - elements reply: value: 0xa0c attributes: - - name + # Mentioned in nf_tables_dumpreset_set() + - table + - set + - elements + dump: + request: + attributes: *dump-set-request + reply: + attributes: *dump-set - name: delsetelem doc: Delete an existing set element. @@ -1411,8 +1947,11 @@ operations: do: request: value: 0xa0e - attributes: - - name + attributes: &del-setelem + # Mentioned in nf_tables_delsetelem() + - table + - set + - elements - name: destroysetelem doc: Delete an existing set element with destroy semantics. @@ -1421,8 +1960,7 @@ operations: do: request: value: 0xa1e - attributes: - - name + attributes: *del-setelem - name: getgen doc: Get / dump rule-set generation. @@ -1431,12 +1969,16 @@ operations: do: request: value: 0xa10 - attributes: - - name reply: value: 0xa0f - attributes: - - name + attributes: &get-gen + # Mentioned in nf_tables_fill_gen_info() + - id + - proc-pid + - proc-name + dump: + reply: + attributes: *get-gen - name: newobj doc: Create a new stateful object. @@ -1446,7 +1988,12 @@ operations: request: value: 0xa12 attributes: + # Mentioned in nf_tables_newobj() + - type - name + - data + - table + - userdata - name: getobj doc: Get / dump stateful objects. @@ -1456,11 +2003,29 @@ operations: request: value: 0xa13 attributes: + # Mentioned in nf_tables_getobj_single() - name + - type + - table reply: value: 0xa12 - attributes: + attributes: &obj-info + # Mentioned in nf_tables_fill_obj_info() + - table - name + - type + - handle + - use + - data + - userdata + dump: + request: + attributes: + # Mentioned in nf_tables_dump_obj_start() + - table + - type + reply: + attributes: *obj-info - name: delobj doc: Delete an existing stateful object. @@ -1470,7 +2035,11 @@ operations: request: value: 0xa14 attributes: + # Mentioned in nf_tables_delobj() + - table - name + - type + - handle - name: destroyobj doc: Delete an existing stateful object with destroy semantics. @@ -1480,7 +2049,11 @@ operations: request: value: 0xa1f attributes: + # Mentioned in nf_tables_delobj() + - table - name + - type + - handle - name: newflowtable doc: Create a new flow table. @@ -1490,7 +2063,11 @@ operations: request: value: 0xa16 attributes: + # Mentioned in nf_tables_newflowtable() + - table - name + - hook + - flags - name: getflowtable doc: Get / dump flow tables. @@ -1500,11 +2077,22 @@ operations: request: value: 0xa17 attributes: + # Mentioned in nf_tables_getflowtable() - name + - table reply: value: 0xa16 - attributes: + attributes: &flowtable-info + # Mentioned in nf_tables_fill_flowtable_info() + - table - name + - handle + - use + - flags + - hook + dump: + reply: + attributes: *flowtable-info - name: delflowtable doc: Delete an existing flow table. @@ -1513,8 +2101,12 @@ operations: do: request: value: 0xa18 - attributes: + attributes: &del-flowtable + # Mentioned in nf_tables_delflowtable() + - table - name + - handle + - hook - name: destroyflowtable doc: Delete an existing flow table with destroy semantics. @@ -1523,8 +2115,7 @@ operations: do: request: value: 0xa20 - attributes: - - name + attributes: *del-flowtable mcast-groups: list: diff --git a/Documentation/netlink/specs/ovpn.yaml b/Documentation/netlink/specs/ovpn.yaml index 1b91045..b0c782e 100644 --- a/Documentation/netlink/specs/ovpn.yaml +++ b/Documentation/netlink/specs/ovpn.yaml @@ -43,7 +43,8 @@ attribute-sets: type: u32 doc: >- The unique ID of the peer in the device context. To be used to - identify peers during operations for a specific device + identify peers during operations for a specific device. + Also used to match packets received from this peer. checks: max: 0xFFFFFF - @@ -160,6 +161,16 @@ attribute-sets: name: link-tx-packets type: uint doc: Number of packets transmitted at the transport level + - + name: tx-id + type: u32 + doc: >- + The ID value used when transmitting packets to this peer. This + way outgoing packets can have a different ID than incoming ones. + Useful in multipeer-to-multipeer connections, where each peer + will advertise the tx-id to be used on the link. + checks: + max: 0xFFFFFF - name: peer-new-input subset-of: peer @@ -188,6 +199,8 @@ attribute-sets: name: keepalive-interval - name: keepalive-timeout + - + name: tx-id - name: peer-set-input subset-of: peer @@ -214,6 +227,8 @@ attribute-sets: name: keepalive-interval - name: keepalive-timeout + - + name: tx-id - name: peer-del-input subset-of: peer @@ -502,6 +517,12 @@ operations: - ifindex - keyconf + - + name: peer-float-ntf + doc: Notification about a peer floating (changing its remote UDP endpoint) + notify: peer-get + mcgrp: peers + mcast-groups: list: - diff --git a/Documentation/netlink/specs/psp.yaml b/Documentation/netlink/specs/psp.yaml index 944429e..f3a5778 100644 --- a/Documentation/netlink/specs/psp.yaml +++ b/Documentation/netlink/specs/psp.yaml @@ -76,6 +76,83 @@ attribute-sets: name: spi doc: Security Parameters Index (SPI) of the association. type: u32 + - + name: stats + attributes: + - + name: dev-id + doc: PSP device ID. + type: u32 + checks: + min: 1 + - + name: key-rotations + type: uint + doc: | + Number of key rotations during the lifetime of the device. + Kernel statistic. + - + name: stale-events + type: uint + doc: | + Number of times a socket's Rx got shut down due to using + a key which went stale (fully rotated out). + Kernel statistic. + - + name: rx-packets + type: uint + doc: | + Number of successfully processed and authenticated PSP packets. + Device statistic (from the PSP spec). + - + name: rx-bytes + type: uint + doc: | + Number of successfully authenticated PSP bytes received, counting from + the first byte after the IV through the last byte of payload. + The fixed initial portion of the PSP header (16 bytes) + and the PSP trailer/ICV (16 bytes) are not included in this count. + Device statistic (from the PSP spec). + - + name: rx-auth-fail + type: uint + doc: | + Number of received PSP packets with unsuccessful authentication. + Device statistic (from the PSP spec). + - + name: rx-error + type: uint + doc: | + Number of received PSP packets with length/framing errors. + Device statistic (from the PSP spec). + - + name: rx-bad + type: uint + doc: | + Number of received PSP packets with miscellaneous errors + (invalid master key indicated by SPI, unsupported version, etc.) + Device statistic (from the PSP spec). + - + name: tx-packets + type: uint + doc: | + Number of successfully processed PSP packets for transmission. + Device statistic (from the PSP spec). + - + name: tx-bytes + type: uint + doc: | + Number of successfully processed PSP bytes for transmit, counting from + the first byte after the IV through the last byte of payload. + The fixed initial portion of the PSP header (16 bytes) + and the PSP trailer/ICV (16 bytes) are not included in this count. + Device statistic (from the PSP spec). + - + name: tx-error + type: uint + doc: | + Number of PSP packets for transmission with errors. + Device statistic (from the PSP spec). operations: list: @@ -177,6 +254,24 @@ operations: pre: psp-assoc-device-get-locked post: psp-device-unlock + - + name: get-stats + doc: Get device statistics. + attribute-set: stats + do: + request: + attributes: + - dev-id + reply: &stats-all + attributes: + - dev-id + - key-rotations + - stale-events + pre: psp-device-get-locked + post: psp-device-unlock + dump: + reply: *stats-all + mcast-groups: list: - diff --git a/Documentation/netlink/specs/rt-addr.yaml b/Documentation/netlink/specs/rt-addr.yaml index 3a582ea..163a106 100644 --- a/Documentation/netlink/specs/rt-addr.yaml +++ b/Documentation/netlink/specs/rt-addr.yaml @@ -86,17 +86,18 @@ attribute-sets: - name: address type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: local type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: label type: string - name: broadcast - type: binary + type: u32 + byte-order: big-endian display-hint: ipv4 - name: anycast diff --git a/Documentation/netlink/specs/rt-link.yaml b/Documentation/netlink/specs/rt-link.yaml index 2a23e96..df4b56b 100644 --- a/Documentation/netlink/specs/rt-link.yaml +++ b/Documentation/netlink/specs/rt-link.yaml @@ -1707,11 +1707,11 @@ attribute-sets: - name: local type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: remote type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: ttl type: u8 @@ -1833,11 +1833,11 @@ attribute-sets: - name: local type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: remote type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: fwmark type: u32 @@ -1868,7 +1868,8 @@ attribute-sets: type: u32 - name: remote - type: binary + type: u32 + byte-order: big-endian display-hint: ipv4 - name: ttl @@ -1913,6 +1914,38 @@ attribute-sets: name: port-range type: binary struct: ifla-geneve-port-range + - + name: gro-hint + type: flag + - + name: linkinfo-hsr-attrs + name-prefix: ifla-hsr- + attributes: + - + name: slave1 + type: u32 + - + name: slave2 + type: u32 + - + name: multicast-spec + type: u8 + - + name: supervision-addr + type: binary + display-hint: mac + - + name: seq-nr + type: u16 + - + name: version + type: u8 + - + name: protocol + type: u8 + - + name: interlink + type: u32 - name: linkinfo-iptun-attrs name-prefix: ifla-iptun- @@ -1923,11 +1956,11 @@ attribute-sets: - name: local type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: remote type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: ttl type: u8 @@ -1957,7 +1990,8 @@ attribute-sets: display-hint: ipv6 - name: 6rd-relay-prefix - type: binary + type: u32 + byte-order: big-endian display-hint: ipv4 - name: 6rd-prefixlen @@ -2299,6 +2333,9 @@ sub-messages: - value: geneve attribute-set: linkinfo-geneve-attrs + - + value: hsr + attribute-set: linkinfo-hsr-attrs - value: ipip attribute-set: linkinfo-iptun-attrs diff --git a/Documentation/netlink/specs/rt-neigh.yaml b/Documentation/netlink/specs/rt-neigh.yaml index 2f568a6..0f46ef3 100644 --- a/Documentation/netlink/specs/rt-neigh.yaml +++ b/Documentation/netlink/specs/rt-neigh.yaml @@ -194,7 +194,7 @@ attribute-sets: - name: dst type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: lladdr type: binary diff --git a/Documentation/netlink/specs/rt-route.yaml b/Documentation/netlink/specs/rt-route.yaml index 1ecb3fa..33195db 100644 --- a/Documentation/netlink/specs/rt-route.yaml +++ b/Documentation/netlink/specs/rt-route.yaml @@ -87,11 +87,11 @@ attribute-sets: - name: dst type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: src type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: iif type: u32 @@ -101,14 +101,14 @@ attribute-sets: - name: gateway type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: priority type: u32 - name: prefsrc type: binary - display-hint: ipv4 + display-hint: ipv4-or-v6 - name: metrics type: nest diff --git a/Documentation/netlink/specs/rt-rule.yaml b/Documentation/netlink/specs/rt-rule.yaml index bebee45..7f03a44 100644 --- a/Documentation/netlink/specs/rt-rule.yaml +++ b/Documentation/netlink/specs/rt-rule.yaml @@ -96,10 +96,12 @@ attribute-sets: attributes: - name: dst - type: u32 + type: binary + display-hint: ipv4-or-v6 - name: src - type: u32 + type: binary + display-hint: ipv4-or-v6 - name: iifname type: string diff --git a/Documentation/netlink/specs/tc.yaml b/Documentation/netlink/specs/tc.yaml index b398f7a..2e66333 100644 --- a/Documentation/netlink/specs/tc.yaml +++ b/Documentation/netlink/specs/tc.yaml @@ -2207,6 +2207,9 @@ attribute-sets: - name: blue-timer-us type: s32 + - + name: active-queues + type: u32 - name: cake-tin-stats-attrs name-prefix: tca-cake-tin-stats- diff --git a/Documentation/netlink/specs/wireguard.yaml b/Documentation/netlink/specs/wireguard.yaml new file mode 100644 index 0000000..30479fc --- /dev/null +++ b/Documentation/netlink/specs/wireguard.yaml @@ -0,0 +1,298 @@ +# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +--- +name: wireguard +protocol: genetlink-legacy + +doc: | + **Netlink protocol to control WireGuard network devices.** + + The below enums and macros are for interfacing with WireGuard, using generic + netlink, with family ``WG_GENL_NAME`` and version ``WG_GENL_VERSION``. It + defines two commands: get and set. Note that while they share many common + attributes, these two commands actually accept a slightly different set of + inputs and outputs. These differences are noted under the individual + attributes. +c-family-name: wg-genl-name +c-version-name: wg-genl-version +max-by-define: true + +definitions: + - + name-prefix: wg- + name: key-len + type: const + value: 32 + - + name: --kernel-timespec + type: struct + header: linux/time_types.h + members: + - + name: sec + type: u64 + doc: Number of seconds, since UNIX epoch. + - + name: nsec + type: u64 + doc: Number of nanoseconds, after the second began. + - + name: wgdevice-flags + name-prefix: wgdevice-f- + enum-name: wgdevice-flag + type: flags + entries: + - replace-peers + - + name: wgpeer-flags + name-prefix: wgpeer-f- + enum-name: wgpeer-flag + type: flags + entries: + - remove-me + - replace-allowedips + - update-only + - + name: wgallowedip-flags + name-prefix: wgallowedip-f- + enum-name: wgallowedip-flag + type: flags + entries: + - remove-me + +attribute-sets: + - + name: wgdevice + enum-name: wgdevice-attribute + name-prefix: wgdevice-a- + attr-cnt-name: --wgdevice-a-last + attributes: + - + name: unspec + type: unused + value: 0 + - + name: ifindex + type: u32 + - + name: ifname + type: string + checks: + max-len: 15 + - + name: private-key + type: binary + doc: Set to all zeros to remove. + display-hint: hex + checks: + exact-len: wg-key-len + - + name: public-key + type: binary + display-hint: hex + checks: + exact-len: wg-key-len + - + name: flags + type: u32 + doc: | + ``0`` or ``WGDEVICE_F_REPLACE_PEERS`` if all current peers should be + removed prior to adding the list below. + enum: wgdevice-flags + - + name: listen-port + type: u16 + doc: Set as ``0`` to choose randomly. + - + name: fwmark + type: u32 + doc: Set as ``0`` to disable. + - + name: peers + type: indexed-array + sub-type: nest + nested-attributes: wgpeer + doc: | + The index/type parameter is unused on ``SET_DEVICE`` operations and is + zero on ``GET_DEVICE`` operations. + - + name: wgpeer + enum-name: wgpeer-attribute + name-prefix: wgpeer-a- + attr-cnt-name: --wgpeer-a-last + attributes: + - + name: unspec + type: unused + value: 0 + - + name: public-key + type: binary + display-hint: hex + checks: + exact-len: wg-key-len + - + name: preshared-key + type: binary + doc: Set as all zeros to remove. + display-hint: hex + checks: + exact-len: wg-key-len + - + name: flags + type: u32 + doc: | + ``0`` and/or ``WGPEER_F_REMOVE_ME`` if the specified peer should not + exist at the end of the operation, rather than added/updated and/or + ``WGPEER_F_REPLACE_ALLOWEDIPS`` if all current allowed IPs of this + peer should be removed prior to adding the list below and/or + ``WGPEER_F_UPDATE_ONLY`` if the peer should only be set if it already + exists. + enum: wgpeer-flags + - + name: endpoint + type: binary + doc: struct sockaddr_in or struct sockaddr_in6 + checks: + min-len: 16 + - + name: persistent-keepalive-interval + type: u16 + doc: Set as ``0`` to disable. + - + name: last-handshake-time + type: binary + struct: --kernel-timespec + checks: + exact-len: 16 + - + name: rx-bytes + type: u64 + - + name: tx-bytes + type: u64 + - + name: allowedips + type: indexed-array + sub-type: nest + nested-attributes: wgallowedip + doc: | + The index/type parameter is unused on ``SET_DEVICE`` operations and is + zero on ``GET_DEVICE`` operations. + - + name: protocol-version + type: u32 + doc: | + Should not be set or used at all by most users of this API, as the + most recent protocol will be used when this is unset. Otherwise, + must be set to ``1``. + - + name: wgallowedip + enum-name: wgallowedip-attribute + name-prefix: wgallowedip-a- + attr-cnt-name: --wgallowedip-a-last + attributes: + - + name: unspec + type: unused + value: 0 + - + name: family + type: u16 + doc: IP family, either ``AF_INET`` or ``AF_INET6``. + - + name: ipaddr + type: binary + doc: Either ``struct in_addr`` or ``struct in6_addr``. + display-hint: ipv4-or-v6 + checks: + min-len: 4 + - + name: cidr-mask + type: u8 + - + name: flags + type: u32 + doc: | + ``WGALLOWEDIP_F_REMOVE_ME`` if the specified IP should be removed; + otherwise, this IP will be added if it is not already present. + enum: wgallowedip-flags + +operations: + enum-name: wg-cmd + name-prefix: wg-cmd- + list: + - + name: get-device + value: 0 + doc: | + Retrieve WireGuard device + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + The command should be called with one but not both of: + + - ``WGDEVICE_A_IFINDEX`` + - ``WGDEVICE_A_IFNAME`` + + The kernel will then return several messages (``NLM_F_MULTI``). It is + possible that all of the allowed IPs of a single peer will not fit + within a single netlink message. In that case, the same peer will be + written in the following message, except it will only contain + ``WGPEER_A_PUBLIC_KEY`` and ``WGPEER_A_ALLOWEDIPS``. This may occur + several times in a row for the same peer. It is then up to the receiver + to coalesce adjacent peers. Likewise, it is possible that all peers will + not fit within a single message. So, subsequent peers will be sent in + following messages, except those will only contain ``WGDEVICE_A_IFNAME`` + and ``WGDEVICE_A_PEERS``. It is then up to the receiver to coalesce + these messages to form the complete list of peers. + + Since this is an ``NLA_F_DUMP`` command, the final message will always + be ``NLMSG_DONE``, even if an error occurs. However, this ``NLMSG_DONE`` + message contains an integer error code. It is either zero or a negative + error code corresponding to the errno. + attribute-set: wgdevice + flags: [uns-admin-perm] + + dump: + pre: wg-get-device-start + post: wg-get-device-done + request: + attributes: + - ifindex + - ifname + reply: &all-attrs + attributes: + - ifindex + - ifname + - private-key + - public-key + - flags + - listen-port + - fwmark + - peers + - + name: set-device + value: 1 + doc: | + Set WireGuard device + ~~~~~~~~~~~~~~~~~~~~ + + This command should be called with a wgdevice set, containing one but + not both of ``WGDEVICE_A_IFINDEX`` and ``WGDEVICE_A_IFNAME``. + + It is possible that the amount of configuration data exceeds that of the + maximum message length accepted by the kernel. In that case, several + messages should be sent one after another, with each successive one + filling in information not contained in the prior. Note that if + ``WGDEVICE_F_REPLACE_PEERS`` is specified in the first message, it + probably should not be specified in fragments that come after, so that + the list of peers is only cleared the first time but appended after. + Likewise for peers, if ``WGPEER_F_REPLACE_ALLOWEDIPS`` is specified in + the first message of a peer, it likely should not be specified in + subsequent fragments. + + If an error occurs, ``NLMSG_ERROR`` will reply containing an errno. + attribute-set: wgdevice + flags: [uns-admin-perm] + + do: + request: *all-attrs diff --git a/Makefile.deps b/Makefile.deps index 9ba56c6..8f73fb4 100644 --- a/Makefile.deps +++ b/Makefile.deps @@ -13,6 +13,7 @@ UAPI_PATH:=../ # need the explicit -D matching what's in /usr, to avoid multiple definitions. get_hdr_inc=-D$(1) -include $(UAPI_PATH)/linux/$(2) +get_hdr_inc2=-D$(1) -D$(2) -include $(UAPI_PATH)/linux/$(3) CFLAGS_devlink:=$(call get_hdr_inc,_LINUX_DEVLINK_H_,devlink.h) CFLAGS_dpll:=$(call get_hdr_inc,_LINUX_DPLL_H,dpll.h) @@ -48,3 +49,4 @@ CFLAGS_tc:= $(call get_hdr_inc,__LINUX_RTNETLINK_H,rtnetlink.h) \ $(call get_hdr_inc,_TC_SKBEDIT_H,tc_act/tc_skbedit.h) \ $(call get_hdr_inc,_TC_TUNNEL_KEY_H,tc_act/tc_tunnel_key.h) CFLAGS_tcp_metrics:=$(call get_hdr_inc,_LINUX_TCP_METRICS_H,tcp_metrics.h) +CFLAGS_wireguard:=$(call get_hdr_inc2,_LINUX_WIREGUARD_H,_WG_UAPI_WIREGUARD_H,wireguard.h) diff --git a/generated/Makefile b/generated/Makefile index c6bd18a..1e5d834 100644 --- a/generated/Makefile +++ b/generated/Makefile @@ -14,10 +14,11 @@ include ../Makefile.deps TOOL:=../ynl-gen-cpp.py GENS_PATHS=$(shell grep -nrI --files-without-match \ - 'protocol: netlink' ../Documentation/netlink/specs/) + 'protocol: netlink' ../Documentation/netlink/specs/*.yaml) GENS_PATHS+=$(wildcard ../Documentation/netlink/specs/rt-*.yaml) GENS_ALL=$(patsubst ../Documentation/netlink/specs/%.yaml,%,${GENS_PATHS}) -GENS=$(filter-out ,${GENS_ALL}) +GENS_SKIP=wireguard +GENS=$(filter-out $(GENS_SKIP),${GENS_ALL}) SRCS=$(patsubst %,%-user.cpp,${GENS}) HDRS=$(patsubst %,%-user.hpp,${GENS}) OBJS=$(patsubst %,%-user.cpp.o,${GENS}) diff --git a/generated/dev-energymodel-user.cpp b/generated/dev-energymodel-user.cpp new file mode 100644 index 0000000..ee1c2bc --- /dev/null +++ b/generated/dev-energymodel-user.cpp @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user source */ + +#include "dev-energymodel-user.hpp" + +#include + +#include + +#include + +namespace ynl_cpp { + +/* Enums */ +static constexpr std::array dev_energymodel_op_strmap = []() { + std::array arr{}; + arr[DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS] = "get-perf-domains"; + arr[DEV_ENERGYMODEL_CMD_GET_PERF_TABLE] = "get-perf-table"; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_CREATED] = "perf-domain-created"; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_UPDATED] = "perf-domain-updated"; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED] = "perf-domain-deleted"; + return arr; +} (); + +std::string_view dev_energymodel_op_str(int op) +{ + if (op < 0 || op >= (int)(dev_energymodel_op_strmap.size())) { + return ""; + } + return dev_energymodel_op_strmap[op]; +} + +static constexpr std::array dev_energymodel_perf_state_flags_strmap = []() { + std::array arr{}; + arr[0] = "perf-state-inefficient"; + return arr; +} (); + +std::string_view +dev_energymodel_perf_state_flags_str(dev_energymodel_perf_state_flags value) +{ + value = (dev_energymodel_perf_state_flags)(ffs(value) - 1); + if (value < 0 || value >= (int)(dev_energymodel_perf_state_flags_strmap.size())) { + return ""; + } + return dev_energymodel_perf_state_flags_strmap[value]; +} + +static constexpr std::array dev_energymodel_perf_domain_flags_strmap = []() { + std::array arr{}; + arr[0] = "perf-domain-microwatts"; + arr[1] = "perf-domain-skip-inefficiencies"; + arr[2] = "perf-domain-artificial"; + return arr; +} (); + +std::string_view +dev_energymodel_perf_domain_flags_str(dev_energymodel_perf_domain_flags value) +{ + value = (dev_energymodel_perf_domain_flags)(ffs(value) - 1); + if (value < 0 || value >= (int)(dev_energymodel_perf_domain_flags_strmap.size())) { + return ""; + } + return dev_energymodel_perf_domain_flags_strmap[value]; +} + +/* Policies */ +static std::array dev_energymodel_perf_state_policy = []() { + std::array arr{}; + arr[DEV_ENERGYMODEL_A_PERF_STATE_PAD].name = "pad"; + arr[DEV_ENERGYMODEL_A_PERF_STATE_PAD].type = YNL_PT_IGNORE; + arr[DEV_ENERGYMODEL_A_PERF_STATE_PERFORMANCE].name = "performance"; + arr[DEV_ENERGYMODEL_A_PERF_STATE_PERFORMANCE].type = YNL_PT_U64; + arr[DEV_ENERGYMODEL_A_PERF_STATE_FREQUENCY].name = "frequency"; + arr[DEV_ENERGYMODEL_A_PERF_STATE_FREQUENCY].type = YNL_PT_U64; + arr[DEV_ENERGYMODEL_A_PERF_STATE_POWER].name = "power"; + arr[DEV_ENERGYMODEL_A_PERF_STATE_POWER].type = YNL_PT_U64; + arr[DEV_ENERGYMODEL_A_PERF_STATE_COST].name = "cost"; + arr[DEV_ENERGYMODEL_A_PERF_STATE_COST].type = YNL_PT_U64; + arr[DEV_ENERGYMODEL_A_PERF_STATE_FLAGS].name = "flags"; + arr[DEV_ENERGYMODEL_A_PERF_STATE_FLAGS].type = YNL_PT_U64; + return arr; +} (); + +struct ynl_policy_nest dev_energymodel_perf_state_nest = { + .max_attr = static_cast(DEV_ENERGYMODEL_A_PERF_STATE_MAX), + .table = dev_energymodel_perf_state_policy.data(), +}; + +static std::array dev_energymodel_perf_domain_policy = []() { + std::array arr{}; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD].name = "pad"; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD].type = YNL_PT_IGNORE; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID].name = "perf-domain-id"; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID].type = YNL_PT_U32; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_FLAGS].name = "flags"; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_FLAGS].type = YNL_PT_U64; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS].name = "cpus"; + arr[DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS].type = YNL_PT_U64; + return arr; +} (); + +struct ynl_policy_nest dev_energymodel_perf_domain_nest = { + .max_attr = static_cast(DEV_ENERGYMODEL_A_PERF_DOMAIN_MAX), + .table = dev_energymodel_perf_domain_policy.data(), +}; + +static std::array dev_energymodel_perf_table_policy = []() { + std::array arr{}; + arr[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID].name = "perf-domain-id"; + arr[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID].type = YNL_PT_U32; + arr[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_STATE].name = "perf-state"; + arr[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_STATE].type = YNL_PT_NEST; + arr[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_STATE].nest = &dev_energymodel_perf_state_nest; + return arr; +} (); + +struct ynl_policy_nest dev_energymodel_perf_table_nest = { + .max_attr = static_cast(DEV_ENERGYMODEL_A_PERF_TABLE_MAX), + .table = dev_energymodel_perf_table_policy.data(), +}; + +/* Common nested types */ +int dev_energymodel_perf_state_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + dev_energymodel_perf_state *dst = (dev_energymodel_perf_state *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == DEV_ENERGYMODEL_A_PERF_STATE_PERFORMANCE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->performance = (__u64)ynl_attr_get_u64(attr); + } else if (type == DEV_ENERGYMODEL_A_PERF_STATE_FREQUENCY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->frequency = (__u64)ynl_attr_get_u64(attr); + } else if (type == DEV_ENERGYMODEL_A_PERF_STATE_POWER) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->power = (__u64)ynl_attr_get_u64(attr); + } else if (type == DEV_ENERGYMODEL_A_PERF_STATE_COST) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->cost = (__u64)ynl_attr_get_u64(attr); + } else if (type == DEV_ENERGYMODEL_A_PERF_STATE_FLAGS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->flags = (__u64)ynl_attr_get_u64(attr); + } + } + + return 0; +} + +/* ============== DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS ============== */ +/* DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS - do */ +int dev_energymodel_get_perf_domains_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + dev_energymodel_get_perf_domains_rsp *dst; + const struct nlattr *attr; + unsigned int n_cpus = 0; + int i; + + dst = (dev_energymodel_get_perf_domains_rsp*)yarg->data; + + if (dst->cpus.size() > 0) { + return ynl_error_parse(yarg, "attribute already present (perf-domain.cpus)"); + } + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->perf_domain_id = (__u32)ynl_attr_get_u32(attr); + } else if (type == DEV_ENERGYMODEL_A_PERF_DOMAIN_FLAGS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->flags = (__u64)ynl_attr_get_u64(attr); + } else if (type == DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS) { + n_cpus++; + } + } + + if (n_cpus) { + dst->cpus.resize(n_cpus); + i = 0; + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + if (ynl_attr_type(attr) == DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS) { + dst->cpus[i] = ynl_attr_get_u64(attr); + i++; + } + } + } + + return YNL_PARSE_CB_OK; +} + +std::unique_ptr +dev_energymodel_get_perf_domains(ynl_cpp::ynl_socket& ys, + dev_energymodel_get_perf_domains_req& req) +{ + std::unique_ptr rsp; + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS, 1); + ((struct ynl_sock*)ys)->req_policy = &dev_energymodel_perf_domain_nest; + yrs.yarg.rsp_policy = &dev_energymodel_perf_domain_nest; + + if (req.perf_domain_id.has_value()) { + ynl_attr_put_u32(nlh, DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID, req.perf_domain_id.value()); + } + + rsp.reset(new dev_energymodel_get_perf_domains_rsp()); + yrs.yarg.data = rsp.get(); + yrs.cb = dev_energymodel_get_perf_domains_rsp_parse; + yrs.rsp_cmd = DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return nullptr; + } + + return rsp; +} + +/* DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS - dump */ +std::unique_ptr +dev_energymodel_get_perf_domains_dump(ynl_cpp::ynl_socket& ys) +{ + struct ynl_dump_no_alloc_state yds = {}; + struct nlmsghdr *nlh; + int err; + + auto ret = std::make_unique(); + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &dev_energymodel_perf_domain_nest; + yds.yarg.data = ret.get(); + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; + yds.cb = dev_energymodel_get_perf_domains_rsp_parse; + yds.rsp_cmd = DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS; + + nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS, 1); + + err = ynl_exec_dump_no_alloc(ys, nlh, &yds); + if (err < 0) { + return nullptr; + } + + return ret; +} + +/* ============== DEV_ENERGYMODEL_CMD_GET_PERF_TABLE ============== */ +/* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - do */ +int dev_energymodel_get_perf_table_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + dev_energymodel_get_perf_table_rsp *dst; + unsigned int n_perf_state = 0; + const struct nlattr *attr; + struct ynl_parse_arg parg; + int i; + + dst = (dev_energymodel_get_perf_table_rsp*)yarg->data; + parg.ys = yarg->ys; + + if (dst->perf_state.size() > 0) { + return ynl_error_parse(yarg, "attribute already present (perf-table.perf-state)"); + } + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->perf_domain_id = (__u32)ynl_attr_get_u32(attr); + } else if (type == DEV_ENERGYMODEL_A_PERF_TABLE_PERF_STATE) { + n_perf_state++; + } + } + + if (n_perf_state) { + dst->perf_state.resize(n_perf_state); + i = 0; + parg.rsp_policy = &dev_energymodel_perf_state_nest; + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + if (ynl_attr_type(attr) == DEV_ENERGYMODEL_A_PERF_TABLE_PERF_STATE) { + parg.data = &dst->perf_state[i]; + if (dev_energymodel_perf_state_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + i++; + } + } + } + + return YNL_PARSE_CB_OK; +} + +std::unique_ptr +dev_energymodel_get_perf_table(ynl_cpp::ynl_socket& ys, + dev_energymodel_get_perf_table_req& req) +{ + std::unique_ptr rsp; + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEV_ENERGYMODEL_CMD_GET_PERF_TABLE, 1); + ((struct ynl_sock*)ys)->req_policy = &dev_energymodel_perf_table_nest; + yrs.yarg.rsp_policy = &dev_energymodel_perf_table_nest; + + if (req.perf_domain_id.has_value()) { + ynl_attr_put_u32(nlh, DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID, req.perf_domain_id.value()); + } + + rsp.reset(new dev_energymodel_get_perf_table_rsp()); + yrs.yarg.data = rsp.get(); + yrs.cb = dev_energymodel_get_perf_table_rsp_parse; + yrs.rsp_cmd = DEV_ENERGYMODEL_CMD_GET_PERF_TABLE; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return nullptr; + } + + return rsp; +} + +/* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - notify */ +static void dev_energymodel_get_perf_table_ntf_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~dev_energymodel_get_perf_table_rsp(); + free(ntf); +} + +/* DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED - event */ +int dev_energymodel_perf_domain_deleted_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + dev_energymodel_perf_domain_deleted_rsp *dst; + const struct nlattr *attr; + + dst = (dev_energymodel_perf_domain_deleted_rsp*)yarg->data; + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->perf_domain_id = (__u32)ynl_attr_get_u32(attr); + } + } + + return YNL_PARSE_CB_OK; +} + +static void dev_energymodel_perf_domain_deleted_free(struct ynl_ntf_base_type* ntf) { + auto* typed_ntf = reinterpret_cast(ntf); + typed_ntf->obj.~dev_energymodel_perf_domain_deleted_rsp(); + free(ntf); +} + +static constexpr std::array dev_energymodel_ntf_info = []() { + std::array arr{}; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_CREATED].policy = &dev_energymodel_perf_table_nest; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_CREATED].cb = dev_energymodel_get_perf_table_rsp_parse; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_CREATED].alloc_sz = sizeof(dev_energymodel_get_perf_table_ntf); + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_CREATED].free = dev_energymodel_get_perf_table_ntf_free; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_UPDATED].policy = &dev_energymodel_perf_table_nest; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_UPDATED].cb = dev_energymodel_get_perf_table_rsp_parse; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_UPDATED].alloc_sz = sizeof(dev_energymodel_get_perf_table_ntf); + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_UPDATED].free = dev_energymodel_get_perf_table_ntf_free; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED].policy = &dev_energymodel_perf_table_nest; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED].cb = dev_energymodel_perf_domain_deleted_rsp_parse; + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED].alloc_sz = sizeof(dev_energymodel_perf_domain_deleted); + arr[DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED].free = dev_energymodel_perf_domain_deleted_free; + return arr; +} (); + +const struct ynl_family ynl_dev_energymodel_family = { + .name = "dev_energymodel", + .hdr_len = sizeof(struct genlmsghdr), + .ntf_info = dev_energymodel_ntf_info.data(), + .ntf_info_size = dev_energymodel_ntf_info.size(), +}; +const struct ynl_family& get_ynl_dev_energymodel_family() { + return ynl_dev_energymodel_family; +}; +} //namespace ynl_cpp diff --git a/generated/dev-energymodel-user.hpp b/generated/dev-energymodel-user.hpp new file mode 100644 index 0000000..d3c3389 --- /dev/null +++ b/generated/dev-energymodel-user.hpp @@ -0,0 +1,112 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user header */ + +#ifndef _LINUX_DEV_ENERGYMODEL_GEN_H +#define _LINUX_DEV_ENERGYMODEL_GEN_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ynl.hpp" + +#include + +namespace ynl_cpp { +const struct ynl_family& get_ynl_dev_energymodel_family(); + +/* Enums */ +std::string_view dev_energymodel_op_str(int op); +std::string_view +dev_energymodel_perf_state_flags_str(dev_energymodel_perf_state_flags value); +std::string_view +dev_energymodel_perf_domain_flags_str(dev_energymodel_perf_domain_flags value); + +/* Common nested types */ +struct dev_energymodel_perf_state { + std::optional<__u64> performance; + std::optional<__u64> frequency; + std::optional<__u64> power; + std::optional<__u64> cost; + std::optional<__u64> flags; +}; + +/* ============== DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS ============== */ +/* DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS - do */ +struct dev_energymodel_get_perf_domains_req { + std::optional<__u32> perf_domain_id; +}; + +struct dev_energymodel_get_perf_domains_rsp { + std::optional<__u32> perf_domain_id; + std::optional<__u64> flags; + std::vector<__u64> cpus; +}; + +/* + * Get the list of information for all performance domains. + */ +std::unique_ptr +dev_energymodel_get_perf_domains(ynl_cpp::ynl_socket& ys, + dev_energymodel_get_perf_domains_req& req); + +/* DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS - dump */ +struct dev_energymodel_get_perf_domains_list { + std::list objs; +}; + +std::unique_ptr +dev_energymodel_get_perf_domains_dump(ynl_cpp::ynl_socket& ys); + +/* ============== DEV_ENERGYMODEL_CMD_GET_PERF_TABLE ============== */ +/* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - do */ +struct dev_energymodel_get_perf_table_req { + std::optional<__u32> perf_domain_id; +}; + +struct dev_energymodel_get_perf_table_rsp { + std::optional<__u32> perf_domain_id; + std::vector perf_state; +}; + +/* + * Get the energy model table of a performance domain. + */ +std::unique_ptr +dev_energymodel_get_perf_table(ynl_cpp::ynl_socket& ys, + dev_energymodel_get_perf_table_req& req); + +/* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - notify */ +struct dev_energymodel_get_perf_table_ntf { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + dev_energymodel_get_perf_table_rsp obj __attribute__((aligned(8))); +}; + +/* DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED - event */ +struct dev_energymodel_perf_domain_deleted_rsp { + std::optional<__u32> perf_domain_id; +}; + +struct dev_energymodel_perf_domain_deleted { + __u16 family; + __u8 cmd; + struct ynl_ntf_base_type* next; + void (*free)(struct ynl_ntf_base_type* ntf); + dev_energymodel_perf_domain_deleted_rsp obj __attribute__((aligned(8))); +}; + +} //namespace ynl_cpp +#endif /* _LINUX_DEV_ENERGYMODEL_GEN_H */ diff --git a/generated/devlink-user.cpp b/generated/devlink-user.cpp index 7bb260a..5a59ae3 100644 --- a/generated/devlink-user.cpp +++ b/generated/devlink-user.cpp @@ -183,10 +183,11 @@ std::string_view devlink_sb_threshold_type_str(devlink_sb_threshold_type value) return devlink_sb_threshold_type_strmap[value]; } -static constexpr std::array devlink_eswitch_mode_strmap = []() { - std::array arr{}; +static constexpr std::array devlink_eswitch_mode_strmap = []() { + std::array arr{}; arr[0] = "legacy"; arr[1] = "switchdev"; + arr[2] = "switchdev-inactive"; return arr; } (); @@ -1397,6 +1398,10 @@ static std::array devlink_policy = []() { arr[DEVLINK_ATTR_RATE_TC_BWS].nest = &devlink_dl_rate_tc_bws_nest; arr[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD].name = "health-reporter-burst-period"; arr[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD].type = YNL_PT_U64; + arr[DEVLINK_ATTR_PARAM_RESET_DEFAULT].name = "param-reset-default"; + arr[DEVLINK_ATTR_PARAM_RESET_DEFAULT].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_INDEX].name = "index"; + arr[DEVLINK_ATTR_INDEX].type = YNL_PT_UINT; return arr; } (); @@ -2560,6 +2565,11 @@ int devlink_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_RELOAD_FAILED) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -2599,6 +2609,9 @@ devlink_get(ynl_cpp::ynl_socket& ys, devlink_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } rsp.reset(new devlink_get_rsp()); yrs.yarg.data = rsp.get(); @@ -2661,6 +2674,11 @@ int devlink_port_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -2690,6 +2708,9 @@ devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -2729,6 +2750,11 @@ int devlink_port_get_rsp_dump_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -2764,6 +2790,9 @@ devlink_port_get_dump(ynl_cpp::ynl_socket& ys, devlink_port_get_req_dump& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -2790,6 +2819,9 @@ int devlink_port_set(ynl_cpp::ynl_socket& ys, devlink_port_set_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -2831,6 +2863,11 @@ int devlink_port_new_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -2860,6 +2897,9 @@ devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -2906,6 +2946,9 @@ int devlink_port_del(ynl_cpp::ynl_socket& ys, devlink_port_del_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -2935,6 +2978,9 @@ int devlink_port_split(ynl_cpp::ynl_socket& ys, devlink_port_split_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -2968,6 +3014,9 @@ int devlink_port_unsplit(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -3003,6 +3052,11 @@ int devlink_sb_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_SB_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3032,6 +3086,9 @@ devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); } @@ -3074,6 +3131,9 @@ devlink_sb_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_get_req_dump& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -3106,6 +3166,11 @@ int devlink_sb_pool_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_SB_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3140,6 +3205,9 @@ devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); } @@ -3186,6 +3254,9 @@ devlink_sb_pool_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -3212,6 +3283,9 @@ int devlink_sb_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_pool_set_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); } @@ -3256,6 +3330,11 @@ int devlink_sb_port_pool_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3296,6 +3375,9 @@ devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -3345,6 +3427,9 @@ devlink_sb_port_pool_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -3372,6 +3457,9 @@ int devlink_sb_port_pool_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -3416,6 +3504,11 @@ int devlink_sb_tc_pool_bind_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3461,6 +3554,9 @@ devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -3513,6 +3609,9 @@ devlink_sb_tc_pool_bind_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -3540,6 +3639,9 @@ int devlink_sb_tc_pool_bind_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -3585,6 +3687,9 @@ int devlink_sb_occ_snapshot(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); } @@ -3615,6 +3720,9 @@ int devlink_sb_occ_max_clear(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); } @@ -3650,6 +3758,11 @@ int devlink_eswitch_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_ESWITCH_MODE) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3689,6 +3802,9 @@ devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } rsp.reset(new devlink_eswitch_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3720,6 +3836,9 @@ int devlink_eswitch_set(ynl_cpp::ynl_socket& ys, devlink_eswitch_set_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.eswitch_mode.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_ESWITCH_MODE, req.eswitch_mode.value()); } @@ -3763,6 +3882,11 @@ int devlink_dpipe_table_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_DPIPE_TABLES) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3798,6 +3922,9 @@ devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.dpipe_table_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req.dpipe_table_name.data()); } @@ -3840,6 +3967,11 @@ int devlink_dpipe_entries_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_DPIPE_ENTRIES) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3875,6 +4007,9 @@ devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.dpipe_table_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req.dpipe_table_name.data()); } @@ -3917,6 +4052,11 @@ int devlink_dpipe_headers_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADERS) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3952,6 +4092,9 @@ devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } rsp.reset(new devlink_dpipe_headers_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3984,6 +4127,9 @@ int devlink_dpipe_table_counters_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.dpipe_table_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req.dpipe_table_name.data()); } @@ -4017,6 +4163,9 @@ int devlink_resource_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.resource_id.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_ID, req.resource_id.value()); } @@ -4057,6 +4206,11 @@ int devlink_resource_dump_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_RESOURCE_LIST) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4091,6 +4245,9 @@ devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } rsp.reset(new devlink_resource_dump_rsp()); yrs.yarg.data = rsp.get(); @@ -4128,6 +4285,11 @@ int devlink_reload_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4157,6 +4319,9 @@ devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.reload_action.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_RELOAD_ACTION, req.reload_action.value()); } @@ -4209,6 +4374,11 @@ int devlink_param_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PARAM_NAME) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4238,6 +4408,9 @@ devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.param_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_PARAM_NAME, req.param_name.data()); } @@ -4281,6 +4454,9 @@ devlink_param_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -4307,6 +4483,9 @@ int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.param_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_PARAM_NAME, req.param_name.data()); } @@ -4316,6 +4495,9 @@ int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req) if (req.param_value_cmode.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_CMODE, req.param_value_cmode.value()); } + if (req.param_reset_default) { + ynl_attr_put(nlh, DEVLINK_ATTR_PARAM_RESET_DEFAULT, NULL, 0); + } err = ynl_exec(ys, nlh, &yrs); if (err < 0) { @@ -4348,6 +4530,11 @@ int devlink_region_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4382,6 +4569,9 @@ devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -4428,6 +4618,9 @@ devlink_region_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -4460,6 +4653,11 @@ int devlink_region_new_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4499,6 +4697,9 @@ devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -4539,6 +4740,9 @@ int devlink_region_del(ynl_cpp::ynl_socket& ys, devlink_region_del_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -4580,6 +4784,11 @@ int devlink_region_read_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4620,6 +4829,9 @@ devlink_region_read_dump(ynl_cpp::ynl_socket& ys, devlink_region_read_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -4670,6 +4882,11 @@ int devlink_port_param_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4700,6 +4917,9 @@ devlink_port_param_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -4761,6 +4981,9 @@ int devlink_port_param_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -4812,6 +5035,11 @@ int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_INFO_DRIVER_NAME) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4900,6 +5128,9 @@ devlink_info_get(ynl_cpp::ynl_socket& ys, devlink_info_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } rsp.reset(new devlink_info_get_rsp()); yrs.yarg.data = rsp.get(); @@ -4963,6 +5194,11 @@ int devlink_health_reporter_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -4998,6 +5234,9 @@ devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5044,6 +5283,9 @@ devlink_health_reporter_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5074,6 +5316,9 @@ int devlink_health_reporter_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5119,6 +5364,9 @@ int devlink_health_reporter_recover(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5152,6 +5400,9 @@ int devlink_health_reporter_diagnose(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5223,6 +5474,9 @@ devlink_health_reporter_dump_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5256,6 +5510,9 @@ int devlink_health_reporter_dump_clear(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5289,6 +5546,9 @@ int devlink_flash_update(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.flash_update_file_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME, req.flash_update_file_name.data()); } @@ -5330,6 +5590,11 @@ int devlink_trap_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_TRAP_NAME) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -5359,6 +5624,9 @@ devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.trap_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_NAME, req.trap_name.data()); } @@ -5401,6 +5669,9 @@ devlink_trap_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_get_req_dump& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -5427,6 +5698,9 @@ int devlink_trap_set(ynl_cpp::ynl_socket& ys, devlink_trap_set_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.trap_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_NAME, req.trap_name.data()); } @@ -5465,6 +5739,11 @@ int devlink_trap_group_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_TRAP_GROUP_NAME) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -5495,6 +5774,9 @@ devlink_trap_group_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.trap_group_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req.trap_group_name.data()); } @@ -5538,6 +5820,9 @@ devlink_trap_group_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -5565,6 +5850,9 @@ int devlink_trap_group_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.trap_group_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req.trap_group_name.data()); } @@ -5606,6 +5894,11 @@ int devlink_trap_policer_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_TRAP_POLICER_ID) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -5636,6 +5929,9 @@ devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.trap_policer_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req.trap_policer_id.value()); } @@ -5679,6 +5975,9 @@ devlink_trap_policer_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -5706,6 +6005,9 @@ int devlink_trap_policer_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.trap_policer_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req.trap_policer_id.value()); } @@ -5742,6 +6044,9 @@ int devlink_health_reporter_test(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5780,6 +6085,11 @@ int devlink_rate_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_PORT_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -5814,6 +6124,9 @@ devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } @@ -5859,6 +6172,9 @@ devlink_rate_get_dump(ynl_cpp::ynl_socket& ys, devlink_rate_get_req_dump& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -5885,6 +6201,9 @@ int devlink_rate_set(ynl_cpp::ynl_socket& ys, devlink_rate_set_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.rate_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req.rate_node_name.data()); } @@ -5932,6 +6251,9 @@ int devlink_rate_new(ynl_cpp::ynl_socket& ys, devlink_rate_new_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.rate_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req.rate_node_name.data()); } @@ -5979,6 +6301,9 @@ int devlink_rate_del(ynl_cpp::ynl_socket& ys, devlink_rate_del_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.rate_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req.rate_node_name.data()); } @@ -6014,6 +6339,11 @@ int devlink_linecard_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } else if (type == DEVLINK_ATTR_LINECARD_INDEX) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -6043,6 +6373,9 @@ devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.linecard_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req.linecard_index.value()); } @@ -6086,6 +6419,9 @@ devlink_linecard_get_dump(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); if (err < 0) { @@ -6113,6 +6449,9 @@ int devlink_linecard_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.linecard_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req.linecard_index.value()); } @@ -6151,6 +6490,11 @@ int devlink_selftests_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->dev_name.assign(ynl_attr_get_str(attr)); + } else if (type == DEVLINK_ATTR_INDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->index = (__u64)ynl_attr_get_uint(attr); } } @@ -6175,6 +6519,9 @@ devlink_selftests_get(ynl_cpp::ynl_socket& ys, devlink_selftests_get_req& req) if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } rsp.reset(new devlink_selftests_get_rsp()); yrs.yarg.data = rsp.get(); @@ -6233,6 +6580,9 @@ int devlink_selftests_run(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.selftests.has_value()) { devlink_dl_selftest_id_put(nlh, DEVLINK_ATTR_SELFTESTS, req.selftests.value()); } @@ -6263,6 +6613,9 @@ int devlink_notify_filter_set(ynl_cpp::ynl_socket& ys, if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); } + if (req.index.has_value()) { + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req.index.value()); + } if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); } diff --git a/generated/devlink-user.hpp b/generated/devlink-user.hpp index 51b275e..6dfa507 100644 --- a/generated/devlink-user.hpp +++ b/generated/devlink-user.hpp @@ -275,11 +275,13 @@ struct devlink_dl_dev_stats { struct devlink_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u8> reload_failed; std::optional dev_stats; }; @@ -302,12 +304,14 @@ std::unique_ptr devlink_get_dump(ynl_cpp::ynl_socket& ys); struct devlink_port_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; struct devlink_port_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -321,11 +325,13 @@ devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req); struct devlink_port_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_port_get_rsp_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -341,6 +347,7 @@ devlink_port_get_dump(ynl_cpp::ynl_socket& ys, devlink_port_get_req_dump& req); struct devlink_port_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional port_type; std::optional port_function; @@ -356,6 +363,7 @@ int devlink_port_set(ynl_cpp::ynl_socket& ys, devlink_port_set_req& req); struct devlink_port_new_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional port_flavour; std::optional<__u16> port_pci_pf_number; @@ -366,6 +374,7 @@ struct devlink_port_new_req { struct devlink_port_new_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -380,6 +389,7 @@ devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req); struct devlink_port_del_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -393,6 +403,7 @@ int devlink_port_del(ynl_cpp::ynl_socket& ys, devlink_port_del_req& req); struct devlink_port_split_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional<__u32> port_split_count; }; @@ -407,6 +418,7 @@ int devlink_port_split(ynl_cpp::ynl_socket& ys, devlink_port_split_req& req); struct devlink_port_unsplit_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -421,12 +433,14 @@ int devlink_port_unsplit(ynl_cpp::ynl_socket& ys, struct devlink_sb_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> sb_index; }; struct devlink_sb_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> sb_index; }; @@ -440,6 +454,7 @@ devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req); struct devlink_sb_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_sb_get_list { @@ -454,6 +469,7 @@ devlink_sb_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_get_req_dump& req); struct devlink_sb_pool_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; }; @@ -461,6 +477,7 @@ struct devlink_sb_pool_get_req { struct devlink_sb_pool_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; }; @@ -475,6 +492,7 @@ devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req); struct devlink_sb_pool_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_sb_pool_get_list { @@ -490,6 +508,7 @@ devlink_sb_pool_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_sb_pool_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; std::optional sb_pool_threshold_type; @@ -506,6 +525,7 @@ int devlink_sb_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_pool_set_req& req); struct devlink_sb_port_pool_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; @@ -514,6 +534,7 @@ struct devlink_sb_port_pool_get_req { struct devlink_sb_port_pool_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; @@ -530,6 +551,7 @@ devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, struct devlink_sb_port_pool_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_sb_port_pool_get_list { @@ -545,6 +567,7 @@ devlink_sb_port_pool_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_sb_port_pool_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; @@ -562,6 +585,7 @@ int devlink_sb_port_pool_set(ynl_cpp::ynl_socket& ys, struct devlink_sb_tc_pool_bind_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional<__u32> sb_index; std::optional sb_pool_type; @@ -571,6 +595,7 @@ struct devlink_sb_tc_pool_bind_get_req { struct devlink_sb_tc_pool_bind_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional<__u32> sb_index; std::optional sb_pool_type; @@ -588,6 +613,7 @@ devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, struct devlink_sb_tc_pool_bind_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_sb_tc_pool_bind_get_list { @@ -603,6 +629,7 @@ devlink_sb_tc_pool_bind_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_sb_tc_pool_bind_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; @@ -622,6 +649,7 @@ int devlink_sb_tc_pool_bind_set(ynl_cpp::ynl_socket& ys, struct devlink_sb_occ_snapshot_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> sb_index; }; @@ -636,6 +664,7 @@ int devlink_sb_occ_snapshot(ynl_cpp::ynl_socket& ys, struct devlink_sb_occ_max_clear_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> sb_index; }; @@ -650,11 +679,13 @@ int devlink_sb_occ_max_clear(ynl_cpp::ynl_socket& ys, struct devlink_eswitch_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_eswitch_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional eswitch_mode; std::optional eswitch_inline_mode; std::optional eswitch_encap_mode; @@ -671,6 +702,7 @@ devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req); struct devlink_eswitch_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional eswitch_mode; std::optional eswitch_inline_mode; std::optional eswitch_encap_mode; @@ -686,12 +718,14 @@ int devlink_eswitch_set(ynl_cpp::ynl_socket& ys, devlink_eswitch_set_req& req); struct devlink_dpipe_table_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string dpipe_table_name; }; struct devlink_dpipe_table_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional dpipe_tables; }; @@ -707,12 +741,14 @@ devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, struct devlink_dpipe_entries_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string dpipe_table_name; }; struct devlink_dpipe_entries_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional dpipe_entries; }; @@ -728,11 +764,13 @@ devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, struct devlink_dpipe_headers_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_dpipe_headers_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional dpipe_headers; }; @@ -748,6 +786,7 @@ devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, struct devlink_dpipe_table_counters_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string dpipe_table_name; std::optional<__u8> dpipe_table_counters_enabled; }; @@ -763,6 +802,7 @@ int devlink_dpipe_table_counters_set(ynl_cpp::ynl_socket& ys, struct devlink_resource_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u64> resource_id; std::optional<__u64> resource_size; }; @@ -778,11 +818,13 @@ int devlink_resource_set(ynl_cpp::ynl_socket& ys, struct devlink_resource_dump_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_resource_dump_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional resource_list; }; @@ -797,6 +839,7 @@ devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req); struct devlink_reload_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional reload_action; std::optional reload_limits; std::optional<__u32> netns_pid; @@ -807,6 +850,7 @@ struct devlink_reload_req { struct devlink_reload_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional reload_actions_performed; }; @@ -821,12 +865,14 @@ devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req); struct devlink_param_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string param_name; }; struct devlink_param_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string param_name; }; @@ -840,6 +886,7 @@ devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req); struct devlink_param_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_param_get_list { @@ -855,9 +902,11 @@ devlink_param_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_param_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string param_name; std::optional param_type; std::optional param_value_cmode; + bool param_reset_default{}; }; /* @@ -870,6 +919,7 @@ int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req); struct devlink_region_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string region_name; }; @@ -877,6 +927,7 @@ struct devlink_region_get_req { struct devlink_region_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string region_name; }; @@ -891,6 +942,7 @@ devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req); struct devlink_region_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_region_get_list { @@ -906,6 +958,7 @@ devlink_region_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_region_new_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string region_name; std::optional<__u32> region_snapshot_id; @@ -914,6 +967,7 @@ struct devlink_region_new_req { struct devlink_region_new_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string region_name; std::optional<__u32> region_snapshot_id; @@ -930,6 +984,7 @@ devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req); struct devlink_region_del_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string region_name; std::optional<__u32> region_snapshot_id; @@ -945,6 +1000,7 @@ int devlink_region_del(ynl_cpp::ynl_socket& ys, devlink_region_del_req& req); struct devlink_region_read_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string region_name; std::optional<__u32> region_snapshot_id; @@ -956,6 +1012,7 @@ struct devlink_region_read_req { struct devlink_region_read_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string region_name; }; @@ -972,12 +1029,14 @@ devlink_region_read_dump(ynl_cpp::ynl_socket& ys, devlink_region_read_req& req); struct devlink_port_param_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; struct devlink_port_param_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -1001,6 +1060,7 @@ devlink_port_param_get_dump(ynl_cpp::ynl_socket& ys); struct devlink_port_param_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -1015,11 +1075,13 @@ int devlink_port_param_set(ynl_cpp::ynl_socket& ys, struct devlink_info_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_info_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string info_driver_name; std::string info_serial_number; std::vector info_version_fixed; @@ -1049,6 +1111,7 @@ devlink_info_get_dump(ynl_cpp::ynl_socket& ys); struct devlink_health_reporter_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; }; @@ -1056,6 +1119,7 @@ struct devlink_health_reporter_get_req { struct devlink_health_reporter_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; }; @@ -1071,6 +1135,7 @@ devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, struct devlink_health_reporter_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; @@ -1087,6 +1152,7 @@ devlink_health_reporter_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_health_reporter_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; std::optional<__u64> health_reporter_graceful_period; @@ -1106,6 +1172,7 @@ int devlink_health_reporter_set(ynl_cpp::ynl_socket& ys, struct devlink_health_reporter_recover_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; }; @@ -1121,6 +1188,7 @@ int devlink_health_reporter_recover(ynl_cpp::ynl_socket& ys, struct devlink_health_reporter_diagnose_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; }; @@ -1136,6 +1204,7 @@ int devlink_health_reporter_diagnose(ynl_cpp::ynl_socket& ys, struct devlink_health_reporter_dump_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; }; @@ -1157,6 +1226,7 @@ devlink_health_reporter_dump_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_health_reporter_dump_clear_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; }; @@ -1172,6 +1242,7 @@ int devlink_health_reporter_dump_clear(ynl_cpp::ynl_socket& ys, struct devlink_flash_update_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string flash_update_file_name; std::string flash_update_component; std::optional flash_update_overwrite_mask; @@ -1188,12 +1259,14 @@ int devlink_flash_update(ynl_cpp::ynl_socket& ys, struct devlink_trap_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string trap_name; }; struct devlink_trap_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string trap_name; }; @@ -1207,6 +1280,7 @@ devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req); struct devlink_trap_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_trap_get_list { @@ -1221,6 +1295,7 @@ devlink_trap_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_get_req_dump& req); struct devlink_trap_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string trap_name; std::optional trap_action; }; @@ -1235,12 +1310,14 @@ int devlink_trap_set(ynl_cpp::ynl_socket& ys, devlink_trap_set_req& req); struct devlink_trap_group_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string trap_group_name; }; struct devlink_trap_group_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string trap_group_name; }; @@ -1255,6 +1332,7 @@ devlink_trap_group_get(ynl_cpp::ynl_socket& ys, struct devlink_trap_group_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_trap_group_get_list { @@ -1270,6 +1348,7 @@ devlink_trap_group_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_trap_group_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string trap_group_name; std::optional trap_action; std::optional<__u32> trap_policer_id; @@ -1286,12 +1365,14 @@ int devlink_trap_group_set(ynl_cpp::ynl_socket& ys, struct devlink_trap_policer_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> trap_policer_id; }; struct devlink_trap_policer_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> trap_policer_id; }; @@ -1306,6 +1387,7 @@ devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, struct devlink_trap_policer_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_trap_policer_get_list { @@ -1321,6 +1403,7 @@ devlink_trap_policer_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_trap_policer_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> trap_policer_id; std::optional<__u64> trap_policer_rate; std::optional<__u64> trap_policer_burst; @@ -1337,6 +1420,7 @@ int devlink_trap_policer_set(ynl_cpp::ynl_socket& ys, struct devlink_health_reporter_test_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string health_reporter_name; }; @@ -1352,6 +1436,7 @@ int devlink_health_reporter_test(ynl_cpp::ynl_socket& ys, struct devlink_rate_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string rate_node_name; }; @@ -1359,6 +1444,7 @@ struct devlink_rate_get_req { struct devlink_rate_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; std::string rate_node_name; }; @@ -1373,6 +1459,7 @@ devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req); struct devlink_rate_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_rate_get_list { @@ -1387,6 +1474,7 @@ devlink_rate_get_dump(ynl_cpp::ynl_socket& ys, devlink_rate_get_req_dump& req); struct devlink_rate_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string rate_node_name; std::optional<__u64> rate_tx_share; std::optional<__u64> rate_tx_max; @@ -1406,6 +1494,7 @@ int devlink_rate_set(ynl_cpp::ynl_socket& ys, devlink_rate_set_req& req); struct devlink_rate_new_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string rate_node_name; std::optional<__u64> rate_tx_share; std::optional<__u64> rate_tx_max; @@ -1425,6 +1514,7 @@ int devlink_rate_new(ynl_cpp::ynl_socket& ys, devlink_rate_new_req& req); struct devlink_rate_del_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::string rate_node_name; }; @@ -1438,12 +1528,14 @@ int devlink_rate_del(ynl_cpp::ynl_socket& ys, devlink_rate_del_req& req); struct devlink_linecard_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> linecard_index; }; struct devlink_linecard_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> linecard_index; }; @@ -1457,6 +1549,7 @@ devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req); struct devlink_linecard_get_req_dump { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_linecard_get_list { @@ -1472,6 +1565,7 @@ devlink_linecard_get_dump(ynl_cpp::ynl_socket& ys, struct devlink_linecard_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> linecard_index; std::string linecard_type; }; @@ -1487,11 +1581,13 @@ int devlink_linecard_set(ynl_cpp::ynl_socket& ys, struct devlink_selftests_get_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; struct devlink_selftests_get_rsp { std::string bus_name; std::string dev_name; + std::optional<__u64> index; }; /* @@ -1513,6 +1609,7 @@ devlink_selftests_get_dump(ynl_cpp::ynl_socket& ys); struct devlink_selftests_run_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional selftests; }; @@ -1527,6 +1624,7 @@ int devlink_selftests_run(ynl_cpp::ynl_socket& ys, struct devlink_notify_filter_set_req { std::string bus_name; std::string dev_name; + std::optional<__u64> index; std::optional<__u32> port_index; }; diff --git a/generated/dpll-user.cpp b/generated/dpll-user.cpp index adb590d..458fdc0 100644 --- a/generated/dpll-user.cpp +++ b/generated/dpll-user.cpp @@ -369,6 +369,8 @@ static std::array dpll_pin_policy = []() { arr[DPLL_A_PIN_REFERENCE_SYNC].nest = &dpll_reference_sync_nest; arr[DPLL_A_PIN_PHASE_ADJUST_GRAN].name = "phase-adjust-gran"; arr[DPLL_A_PIN_PHASE_ADJUST_GRAN].type = YNL_PT_U32; + arr[DPLL_A_PIN_FRACTIONAL_FREQUENCY_OFFSET_PPT].name = "fractional-frequency-offset-ppt"; + arr[DPLL_A_PIN_FRACTIONAL_FREQUENCY_OFFSET_PPT].type = YNL_PT_UINT; return arr; } (); @@ -776,6 +778,9 @@ int dpll_device_set(ynl_cpp::ynl_socket& ys, dpll_device_set_req& req) if (req.id.has_value()) { ynl_attr_put_u32(nlh, DPLL_A_ID, req.id.value()); } + if (req.mode.has_value()) { + ynl_attr_put_u32(nlh, DPLL_A_MODE, req.mode.value()); + } if (req.phase_offset_monitor.has_value()) { ynl_attr_put_u32(nlh, DPLL_A_PHASE_OFFSET_MONITOR, req.phase_offset_monitor.value()); } @@ -972,6 +977,11 @@ int dpll_pin_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->fractional_frequency_offset = (__s64)ynl_attr_get_sint(attr); + } else if (type == DPLL_A_PIN_FRACTIONAL_FREQUENCY_OFFSET_PPT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->fractional_frequency_offset_ppt = (__s64)ynl_attr_get_sint(attr); } else if (type == DPLL_A_PIN_ESYNC_FREQUENCY) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; diff --git a/generated/dpll-user.hpp b/generated/dpll-user.hpp index b558a47..8027ea5 100644 --- a/generated/dpll-user.hpp +++ b/generated/dpll-user.hpp @@ -129,6 +129,7 @@ struct dpll_device_get_ntf { /* DPLL_CMD_DEVICE_SET - do */ struct dpll_device_set_req { std::optional<__u32> id; + std::optional mode; std::optional phase_offset_monitor; std::optional<__u32> phase_offset_avg_factor; }; @@ -184,6 +185,7 @@ struct dpll_pin_get_rsp { std::optional<__s32> phase_adjust_max; std::optional<__s32> phase_adjust; std::optional<__s64> fractional_frequency_offset; + std::optional<__s64> fractional_frequency_offset_ppt; std::optional<__u64> esync_frequency; std::vector esync_frequency_supported; std::optional<__u32> esync_pulse; diff --git a/generated/ethtool-user.cpp b/generated/ethtool-user.cpp index 149ac59..eab6139 100644 --- a/generated/ethtool-user.cpp +++ b/generated/ethtool-user.cpp @@ -306,6 +306,8 @@ static std::array ethtool_pause_st arr[ETHTOOL_A_PAUSE_STAT_TX_FRAMES].type = YNL_PT_U64; arr[ETHTOOL_A_PAUSE_STAT_RX_FRAMES].name = "rx-frames"; arr[ETHTOOL_A_PAUSE_STAT_RX_FRAMES].type = YNL_PT_U64; + arr[ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS].name = "tx-pause-storm-events"; + arr[ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS].type = YNL_PT_U64; return arr; } (); @@ -1197,6 +1199,10 @@ static std::array ethtool_coalesce_p arr[ETHTOOL_A_COALESCE_TX_PROFILE].name = "tx-profile"; arr[ETHTOOL_A_COALESCE_TX_PROFILE].type = YNL_PT_NEST; arr[ETHTOOL_A_COALESCE_TX_PROFILE].nest = ðtool_profile_nest; + arr[ETHTOOL_A_COALESCE_RX_CQE_FRAMES].name = "rx-cqe-frames"; + arr[ETHTOOL_A_COALESCE_RX_CQE_FRAMES].type = YNL_PT_U32; + arr[ETHTOOL_A_COALESCE_RX_CQE_NSECS].name = "rx-cqe-nsecs"; + arr[ETHTOOL_A_COALESCE_RX_CQE_NSECS].type = YNL_PT_U32; return arr; } (); @@ -1848,6 +1854,9 @@ int ethtool_pause_stat_put(struct nlmsghdr *nlh, unsigned int attr_type, if (obj.rx_frames.has_value()) { ynl_attr_put_u64(nlh, ETHTOOL_A_PAUSE_STAT_RX_FRAMES, obj.rx_frames.value()); } + if (obj.tx_pause_storm_events.has_value()) { + ynl_attr_put_u64(nlh, ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS, obj.tx_pause_storm_events.value()); + } ynl_attr_nest_end(nlh, nest); return 0; @@ -1872,6 +1881,11 @@ int ethtool_pause_stat_parse(struct ynl_parse_arg *yarg, return YNL_PARSE_CB_ERROR; } dst->rx_frames = (__u64)ynl_attr_get_u64(attr); + } else if (type == ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_pause_storm_events = (__u64)ynl_attr_get_u64(attr); } } @@ -5186,6 +5200,16 @@ int ethtool_coalesce_get_rsp_parse(const struct nlmsghdr *nlh, if (ethtool_profile_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; } + } else if (type == ETHTOOL_A_COALESCE_RX_CQE_FRAMES) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_cqe_frames = (__u32)ynl_attr_get_u32(attr); + } else if (type == ETHTOOL_A_COALESCE_RX_CQE_NSECS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_cqe_nsecs = (__u32)ynl_attr_get_u32(attr); } } @@ -5362,6 +5386,12 @@ int ethtool_coalesce_set(ynl_cpp::ynl_socket& ys, if (req.tx_profile.has_value()) { ethtool_profile_put(nlh, ETHTOOL_A_COALESCE_TX_PROFILE, req.tx_profile.value()); } + if (req.rx_cqe_frames.has_value()) { + ynl_attr_put_u32(nlh, ETHTOOL_A_COALESCE_RX_CQE_FRAMES, req.rx_cqe_frames.value()); + } + if (req.rx_cqe_nsecs.has_value()) { + ynl_attr_put_u32(nlh, ETHTOOL_A_COALESCE_RX_CQE_NSECS, req.rx_cqe_nsecs.value()); + } err = ynl_exec(ys, nlh, &yrs); if (err < 0) { diff --git a/generated/ethtool-user.hpp b/generated/ethtool-user.hpp index 8e4b251..765f0c6 100644 --- a/generated/ethtool-user.hpp +++ b/generated/ethtool-user.hpp @@ -53,6 +53,7 @@ struct ethtool_header { struct ethtool_pause_stat { std::optional<__u64> tx_frames; std::optional<__u64> rx_frames; + std::optional<__u64> tx_pause_storm_events; }; struct ethtool_ts_stat { @@ -845,6 +846,8 @@ struct ethtool_coalesce_get_rsp { std::optional<__u32> tx_aggr_time_usecs; std::optional rx_profile; std::optional tx_profile; + std::optional<__u32> rx_cqe_frames; + std::optional<__u32> rx_cqe_nsecs; }; /* @@ -908,6 +911,8 @@ struct ethtool_coalesce_set_req { std::optional<__u32> tx_aggr_time_usecs; std::optional rx_profile; std::optional tx_profile; + std::optional<__u32> rx_cqe_frames; + std::optional<__u32> rx_cqe_nsecs; }; /* diff --git a/generated/netdev-user.cpp b/generated/netdev-user.cpp index 6f71716..462344e 100644 --- a/generated/netdev-user.cpp +++ b/generated/netdev-user.cpp @@ -1180,6 +1180,121 @@ int netdev_qstats_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->tx_bytes = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_ALLOC_FAIL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_alloc_fail = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_HW_DROPS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_hw_drops = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_HW_DROP_OVERRUNS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_hw_drop_overruns = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_CSUM_COMPLETE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_csum_complete = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_CSUM_UNNECESSARY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_csum_unnecessary = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_CSUM_NONE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_csum_none = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_CSUM_BAD) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_csum_bad = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_HW_GRO_PACKETS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_hw_gro_packets = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_HW_GRO_BYTES) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_hw_gro_bytes = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_HW_GRO_WIRE_PACKETS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_hw_gro_wire_packets = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_HW_GRO_WIRE_BYTES) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_hw_gro_wire_bytes = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_RX_HW_DROP_RATELIMITS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_hw_drop_ratelimits = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_HW_DROPS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_hw_drops = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_HW_DROP_ERRORS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_hw_drop_errors = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_CSUM_NONE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_csum_none = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_NEEDS_CSUM) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_needs_csum = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_HW_GSO_PACKETS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_hw_gso_packets = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_HW_GSO_BYTES) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_hw_gso_bytes = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_HW_GSO_WIRE_PACKETS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_hw_gso_wire_packets = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_HW_GSO_WIRE_BYTES) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_hw_gso_wire_bytes = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_HW_DROP_RATELIMITS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_hw_drop_ratelimits = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_STOP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_stop = (__u64)ynl_attr_get_uint(attr); + } else if (type == NETDEV_A_QSTATS_TX_WAKE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_wake = (__u64)ynl_attr_get_uint(attr); } } diff --git a/generated/netdev-user.hpp b/generated/netdev-user.hpp index 2e93aef..81cc774 100644 --- a/generated/netdev-user.hpp +++ b/generated/netdev-user.hpp @@ -107,7 +107,9 @@ struct netdev_page_pool_get_rsp { /* * Get / dump information about Page Pools. -(Only Page Pools associated with a net_device can be listed.) +Only Page Pools associated by the driver with a net_device +can be listed. ifindex will not be reported if the net_device +no longer exists. */ std::unique_ptr @@ -252,6 +254,29 @@ struct netdev_qstats_get_rsp { std::optional<__u64> rx_bytes; std::optional<__u64> tx_packets; std::optional<__u64> tx_bytes; + std::optional<__u64> rx_alloc_fail; + std::optional<__u64> rx_hw_drops; + std::optional<__u64> rx_hw_drop_overruns; + std::optional<__u64> rx_csum_complete; + std::optional<__u64> rx_csum_unnecessary; + std::optional<__u64> rx_csum_none; + std::optional<__u64> rx_csum_bad; + std::optional<__u64> rx_hw_gro_packets; + std::optional<__u64> rx_hw_gro_bytes; + std::optional<__u64> rx_hw_gro_wire_packets; + std::optional<__u64> rx_hw_gro_wire_bytes; + std::optional<__u64> rx_hw_drop_ratelimits; + std::optional<__u64> tx_hw_drops; + std::optional<__u64> tx_hw_drop_errors; + std::optional<__u64> tx_csum_none; + std::optional<__u64> tx_needs_csum; + std::optional<__u64> tx_hw_gso_packets; + std::optional<__u64> tx_hw_gso_bytes; + std::optional<__u64> tx_hw_gso_wire_packets; + std::optional<__u64> tx_hw_gso_wire_bytes; + std::optional<__u64> tx_hw_drop_ratelimits; + std::optional<__u64> tx_stop; + std::optional<__u64> tx_wake; }; struct netdev_qstats_get_list { diff --git a/generated/nfsd-user.cpp b/generated/nfsd-user.cpp index b3875a9..04a477f 100644 --- a/generated/nfsd-user.cpp +++ b/generated/nfsd-user.cpp @@ -115,6 +115,8 @@ static std::array nfsd_server_policy = [] arr[NFSD_A_SERVER_LEASETIME].type = YNL_PT_U32; arr[NFSD_A_SERVER_SCOPE].name = "scope"; arr[NFSD_A_SERVER_SCOPE].type = YNL_PT_NUL_STR; + arr[NFSD_A_SERVER_MIN_THREADS].name = "min-threads"; + arr[NFSD_A_SERVER_MIN_THREADS].type = YNL_PT_U32; return arr; } (); @@ -405,6 +407,9 @@ int nfsd_threads_set(ynl_cpp::ynl_socket& ys, nfsd_threads_set_req& req) if (req.scope.size() > 0) { ynl_attr_put_str(nlh, NFSD_A_SERVER_SCOPE, req.scope.data()); } + if (req.min_threads.has_value()) { + ynl_attr_put_u32(nlh, NFSD_A_SERVER_MIN_THREADS, req.min_threads.value()); + } err = ynl_exec(ys, nlh, &yrs); if (err < 0) { @@ -450,6 +455,11 @@ int nfsd_threads_get_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; } dst->scope.assign(ynl_attr_get_str(attr)); + } else if (type == NFSD_A_SERVER_MIN_THREADS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->min_threads = (__u32)ynl_attr_get_u32(attr); } } diff --git a/generated/nfsd-user.hpp b/generated/nfsd-user.hpp index 6cef51a..83192aa 100644 --- a/generated/nfsd-user.hpp +++ b/generated/nfsd-user.hpp @@ -72,10 +72,11 @@ struct nfsd_threads_set_req { std::optional<__u32> gracetime; std::optional<__u32> leasetime; std::string scope; + std::optional<__u32> min_threads; }; /* - * set the number of running threads + * set the maximum number of running threads */ int nfsd_threads_set(ynl_cpp::ynl_socket& ys, nfsd_threads_set_req& req); @@ -87,10 +88,11 @@ struct nfsd_threads_get_rsp { std::optional<__u32> gracetime; std::optional<__u32> leasetime; std::string scope; + std::optional<__u32> min_threads; }; /* - * get the number of running threads + * get the maximum number of running threads */ std::unique_ptr nfsd_threads_get(ynl_cpp::ynl_socket& ys); diff --git a/generated/ovpn-user.cpp b/generated/ovpn-user.cpp index b65ba27..dba6388 100644 --- a/generated/ovpn-user.cpp +++ b/generated/ovpn-user.cpp @@ -14,8 +14,8 @@ namespace ynl_cpp { /* Enums */ -static constexpr std::array ovpn_op_strmap = []() { - std::array arr{}; +static constexpr std::array ovpn_op_strmap = []() { + std::array arr{}; arr[OVPN_CMD_PEER_NEW] = "peer-new"; arr[OVPN_CMD_PEER_SET] = "peer-set"; arr[OVPN_CMD_PEER_GET] = "peer-get"; @@ -26,6 +26,7 @@ static constexpr std::array ovpn_op_strm arr[OVPN_CMD_KEY_SWAP] = "key-swap"; arr[OVPN_CMD_KEY_SWAP_NTF] = "key-swap-ntf"; arr[OVPN_CMD_KEY_DEL] = "key-del"; + arr[OVPN_CMD_PEER_FLOAT_NTF] = "peer-float-ntf"; return arr; } (); @@ -135,6 +136,8 @@ static std::array ovpn_peer_policy = []() { arr[OVPN_A_PEER_LINK_RX_PACKETS].type = YNL_PT_UINT; arr[OVPN_A_PEER_LINK_TX_PACKETS].name = "link-tx-packets"; arr[OVPN_A_PEER_LINK_TX_PACKETS].type = YNL_PT_UINT; + arr[OVPN_A_PEER_TX_ID].name = "tx-id"; + arr[OVPN_A_PEER_TX_ID].type = YNL_PT_U32; return arr; } (); @@ -365,6 +368,9 @@ int ovpn_peer_put(struct nlmsghdr *nlh, unsigned int attr_type, if (obj.link_tx_packets.has_value()) { ynl_attr_put_uint(nlh, OVPN_A_PEER_LINK_TX_PACKETS, obj.link_tx_packets.value()); } + if (obj.tx_id.has_value()) { + ynl_attr_put_u32(nlh, OVPN_A_PEER_TX_ID, obj.tx_id.value()); + } ynl_attr_nest_end(nlh, nest); return 0; @@ -499,6 +505,11 @@ int ovpn_peer_parse(struct ynl_parse_arg *yarg, const struct nlattr *nested) return YNL_PARSE_CB_ERROR; } dst->link_tx_packets = (__u64)ynl_attr_get_uint(attr); + } else if (type == OVPN_A_PEER_TX_ID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_id = (__u32)ynl_attr_get_u32(attr); } } @@ -963,8 +974,8 @@ int ovpn_key_del(ynl_cpp::ynl_socket& ys, ovpn_key_del_req& req) return 0; } -static constexpr std::array ovpn_ntf_info = []() { - std::array arr{}; +static constexpr std::array ovpn_ntf_info = []() { + std::array arr{}; arr[OVPN_CMD_PEER_DEL_NTF].policy = &ovpn_nest; arr[OVPN_CMD_PEER_DEL_NTF].cb = ovpn_peer_get_rsp_parse; arr[OVPN_CMD_PEER_DEL_NTF].alloc_sz = sizeof(ovpn_peer_get_ntf); @@ -973,6 +984,10 @@ static constexpr std::array ovpn_ntf_in arr[OVPN_CMD_KEY_SWAP_NTF].cb = ovpn_key_get_rsp_parse; arr[OVPN_CMD_KEY_SWAP_NTF].alloc_sz = sizeof(ovpn_key_get_ntf); arr[OVPN_CMD_KEY_SWAP_NTF].free = ovpn_key_get_ntf_free; + arr[OVPN_CMD_PEER_FLOAT_NTF].policy = &ovpn_nest; + arr[OVPN_CMD_PEER_FLOAT_NTF].cb = ovpn_peer_get_rsp_parse; + arr[OVPN_CMD_PEER_FLOAT_NTF].alloc_sz = sizeof(ovpn_peer_get_ntf); + arr[OVPN_CMD_PEER_FLOAT_NTF].free = ovpn_peer_get_ntf_free; return arr; } (); diff --git a/generated/ovpn-user.hpp b/generated/ovpn-user.hpp index 1a80865..d115a73 100644 --- a/generated/ovpn-user.hpp +++ b/generated/ovpn-user.hpp @@ -56,6 +56,7 @@ struct ovpn_peer { std::optional<__u64> link_tx_bytes; std::optional<__u64> link_rx_packets; std::optional<__u64> link_tx_packets; + std::optional<__u32> tx_id; }; struct ovpn_keydir { diff --git a/generated/psp-user.cpp b/generated/psp-user.cpp index 786f1ef..41df71e 100644 --- a/generated/psp-user.cpp +++ b/generated/psp-user.cpp @@ -14,8 +14,8 @@ namespace ynl_cpp { /* Enums */ -static constexpr std::array psp_op_strmap = []() { - std::array arr{}; +static constexpr std::array psp_op_strmap = []() { + std::array arr{}; arr[PSP_CMD_DEV_GET] = "dev-get"; arr[PSP_CMD_DEV_ADD_NTF] = "dev-add-ntf"; arr[PSP_CMD_DEV_DEL_NTF] = "dev-del-ntf"; @@ -25,6 +25,7 @@ static constexpr std::array psp_op_strma arr[PSP_CMD_KEY_ROTATE_NTF] = "key-rotate-ntf"; arr[PSP_CMD_RX_ASSOC] = "rx-assoc"; arr[PSP_CMD_TX_ASSOC] = "tx-assoc"; + arr[PSP_CMD_GET_STATS] = "get-stats"; return arr; } (); @@ -108,6 +109,38 @@ struct ynl_policy_nest psp_assoc_nest = { .table = psp_assoc_policy.data(), }; +static std::array psp_stats_policy = []() { + std::array arr{}; + arr[PSP_A_STATS_DEV_ID].name = "dev-id"; + arr[PSP_A_STATS_DEV_ID].type = YNL_PT_U32; + arr[PSP_A_STATS_KEY_ROTATIONS].name = "key-rotations"; + arr[PSP_A_STATS_KEY_ROTATIONS].type = YNL_PT_UINT; + arr[PSP_A_STATS_STALE_EVENTS].name = "stale-events"; + arr[PSP_A_STATS_STALE_EVENTS].type = YNL_PT_UINT; + arr[PSP_A_STATS_RX_PACKETS].name = "rx-packets"; + arr[PSP_A_STATS_RX_PACKETS].type = YNL_PT_UINT; + arr[PSP_A_STATS_RX_BYTES].name = "rx-bytes"; + arr[PSP_A_STATS_RX_BYTES].type = YNL_PT_UINT; + arr[PSP_A_STATS_RX_AUTH_FAIL].name = "rx-auth-fail"; + arr[PSP_A_STATS_RX_AUTH_FAIL].type = YNL_PT_UINT; + arr[PSP_A_STATS_RX_ERROR].name = "rx-error"; + arr[PSP_A_STATS_RX_ERROR].type = YNL_PT_UINT; + arr[PSP_A_STATS_RX_BAD].name = "rx-bad"; + arr[PSP_A_STATS_RX_BAD].type = YNL_PT_UINT; + arr[PSP_A_STATS_TX_PACKETS].name = "tx-packets"; + arr[PSP_A_STATS_TX_PACKETS].type = YNL_PT_UINT; + arr[PSP_A_STATS_TX_BYTES].name = "tx-bytes"; + arr[PSP_A_STATS_TX_BYTES].type = YNL_PT_UINT; + arr[PSP_A_STATS_TX_ERROR].name = "tx-error"; + arr[PSP_A_STATS_TX_ERROR].type = YNL_PT_UINT; + return arr; +} (); + +struct ynl_policy_nest psp_stats_nest = { + .max_attr = static_cast(PSP_A_STATS_MAX), + .table = psp_stats_policy.data(), +}; + /* Common nested types */ int psp_keys_put(struct nlmsghdr *nlh, unsigned int attr_type, const psp_keys& obj) @@ -469,6 +502,94 @@ psp_tx_assoc(ynl_cpp::ynl_socket& ys, psp_tx_assoc_req& req) return rsp; } +/* ============== PSP_CMD_GET_STATS ============== */ +/* PSP_CMD_GET_STATS - do */ +int psp_get_stats_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + const struct nlattr *attr; + psp_get_stats_rsp *dst; + + dst = (psp_get_stats_rsp*)yarg->data; + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == PSP_A_STATS_DEV_ID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->dev_id = (__u32)ynl_attr_get_u32(attr); + } else if (type == PSP_A_STATS_KEY_ROTATIONS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->key_rotations = (__u64)ynl_attr_get_uint(attr); + } else if (type == PSP_A_STATS_STALE_EVENTS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->stale_events = (__u64)ynl_attr_get_uint(attr); + } + } + + return YNL_PARSE_CB_OK; +} + +std::unique_ptr +psp_get_stats(ynl_cpp::ynl_socket& ys, psp_get_stats_req& req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + std::unique_ptr rsp; + struct nlmsghdr *nlh; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, PSP_CMD_GET_STATS, 1); + ((struct ynl_sock*)ys)->req_policy = &psp_stats_nest; + yrs.yarg.rsp_policy = &psp_stats_nest; + + if (req.dev_id.has_value()) { + ynl_attr_put_u32(nlh, PSP_A_STATS_DEV_ID, req.dev_id.value()); + } + + rsp.reset(new psp_get_stats_rsp()); + yrs.yarg.data = rsp.get(); + yrs.cb = psp_get_stats_rsp_parse; + yrs.rsp_cmd = PSP_CMD_GET_STATS; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return nullptr; + } + + return rsp; +} + +/* PSP_CMD_GET_STATS - dump */ +std::unique_ptr psp_get_stats_dump(ynl_cpp::ynl_socket& ys) +{ + struct ynl_dump_no_alloc_state yds = {}; + struct nlmsghdr *nlh; + int err; + + auto ret = std::make_unique(); + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &psp_stats_nest; + yds.yarg.data = ret.get(); + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; + yds.cb = psp_get_stats_rsp_parse; + yds.rsp_cmd = PSP_CMD_GET_STATS; + + nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, PSP_CMD_GET_STATS, 1); + + err = ynl_exec_dump_no_alloc(ys, nlh, &yds); + if (err < 0) { + return nullptr; + } + + return ret; +} + static constexpr std::array psp_ntf_info = []() { std::array arr{}; arr[PSP_CMD_DEV_ADD_NTF].policy = &psp_dev_nest; diff --git a/generated/psp-user.hpp b/generated/psp-user.hpp index 1ed67c4..df24263 100644 --- a/generated/psp-user.hpp +++ b/generated/psp-user.hpp @@ -148,5 +148,31 @@ struct psp_tx_assoc_rsp { std::unique_ptr psp_tx_assoc(ynl_cpp::ynl_socket& ys, psp_tx_assoc_req& req); +/* ============== PSP_CMD_GET_STATS ============== */ +/* PSP_CMD_GET_STATS - do */ +struct psp_get_stats_req { + std::optional<__u32> dev_id; +}; + +struct psp_get_stats_rsp { + std::optional<__u32> dev_id; + std::optional<__u64> key_rotations; + std::optional<__u64> stale_events; +}; + +/* + * Get device statistics. + */ +std::unique_ptr +psp_get_stats(ynl_cpp::ynl_socket& ys, psp_get_stats_req& req); + +/* PSP_CMD_GET_STATS - dump */ +struct psp_get_stats_list { + std::list objs; +}; + +std::unique_ptr +psp_get_stats_dump(ynl_cpp::ynl_socket& ys); + } //namespace ynl_cpp #endif /* _LINUX_PSP_GEN_H */ diff --git a/generated/rt-addr-user.cpp b/generated/rt-addr-user.cpp index ff392cd..2f15998 100644 --- a/generated/rt-addr-user.cpp +++ b/generated/rt-addr-user.cpp @@ -65,7 +65,7 @@ static std::array rt_addr_addr_attrs_policy = []() arr[IFA_LABEL].name = "label"; arr[IFA_LABEL].type = YNL_PT_NUL_STR; arr[IFA_BROADCAST].name = "broadcast"; - arr[IFA_BROADCAST].type = YNL_PT_BINARY; + arr[IFA_BROADCAST].type = YNL_PT_U32; arr[IFA_ANYCAST].name = "anycast"; arr[IFA_ANYCAST].type = YNL_PT_BINARY; arr[IFA_CACHEINFO].name = "cacheinfo"; diff --git a/generated/rt-link-user.cpp b/generated/rt-link-user.cpp index aecf5e7..30050bd 100644 --- a/generated/rt-link-user.cpp +++ b/generated/rt-link-user.cpp @@ -747,7 +747,7 @@ static std::array rt_link_linkinfo_geneve_a arr[IFLA_GENEVE_ID].name = "id"; arr[IFLA_GENEVE_ID].type = YNL_PT_U32; arr[IFLA_GENEVE_REMOTE].name = "remote"; - arr[IFLA_GENEVE_REMOTE].type = YNL_PT_BINARY; + arr[IFLA_GENEVE_REMOTE].type = YNL_PT_U32; arr[IFLA_GENEVE_TTL].name = "ttl"; arr[IFLA_GENEVE_TTL].type = YNL_PT_U8; arr[IFLA_GENEVE_TOS].name = "tos"; @@ -774,6 +774,8 @@ static std::array rt_link_linkinfo_geneve_a arr[IFLA_GENEVE_INNER_PROTO_INHERIT].type = YNL_PT_FLAG; arr[IFLA_GENEVE_PORT_RANGE].name = "port-range"; arr[IFLA_GENEVE_PORT_RANGE].type = YNL_PT_BINARY; + arr[IFLA_GENEVE_GRO_HINT].name = "gro-hint"; + arr[IFLA_GENEVE_GRO_HINT].type = YNL_PT_FLAG; return arr; } (); @@ -782,6 +784,32 @@ struct ynl_policy_nest rt_link_linkinfo_geneve_attrs_nest = { .table = rt_link_linkinfo_geneve_attrs_policy.data(), }; +static std::array rt_link_linkinfo_hsr_attrs_policy = []() { + std::array arr{}; + arr[IFLA_HSR_SLAVE1].name = "slave1"; + arr[IFLA_HSR_SLAVE1].type = YNL_PT_U32; + arr[IFLA_HSR_SLAVE2].name = "slave2"; + arr[IFLA_HSR_SLAVE2].type = YNL_PT_U32; + arr[IFLA_HSR_MULTICAST_SPEC].name = "multicast-spec"; + arr[IFLA_HSR_MULTICAST_SPEC].type = YNL_PT_U8; + arr[IFLA_HSR_SUPERVISION_ADDR].name = "supervision-addr"; + arr[IFLA_HSR_SUPERVISION_ADDR].type = YNL_PT_BINARY; + arr[IFLA_HSR_SEQ_NR].name = "seq-nr"; + arr[IFLA_HSR_SEQ_NR].type = YNL_PT_U16; + arr[IFLA_HSR_VERSION].name = "version"; + arr[IFLA_HSR_VERSION].type = YNL_PT_U8; + arr[IFLA_HSR_PROTOCOL].name = "protocol"; + arr[IFLA_HSR_PROTOCOL].type = YNL_PT_U8; + arr[IFLA_HSR_INTERLINK].name = "interlink"; + arr[IFLA_HSR_INTERLINK].type = YNL_PT_U32; + return arr; +} (); + +struct ynl_policy_nest rt_link_linkinfo_hsr_attrs_nest = { + .max_attr = static_cast(IFLA_HSR_MAX), + .table = rt_link_linkinfo_hsr_attrs_policy.data(), +}; + static std::array rt_link_linkinfo_iptun_attrs_policy = []() { std::array arr{}; arr[IFLA_IPTUN_LINK].name = "link"; @@ -807,7 +835,7 @@ static std::array rt_link_linkinfo_iptun_att arr[IFLA_IPTUN_6RD_PREFIX].name = "6rd-prefix"; arr[IFLA_IPTUN_6RD_PREFIX].type = YNL_PT_BINARY; arr[IFLA_IPTUN_6RD_RELAY_PREFIX].name = "6rd-relay-prefix"; - arr[IFLA_IPTUN_6RD_RELAY_PREFIX].type = YNL_PT_BINARY; + arr[IFLA_IPTUN_6RD_RELAY_PREFIX].type = YNL_PT_U32; arr[IFLA_IPTUN_6RD_PREFIXLEN].name = "6rd-prefixlen"; arr[IFLA_IPTUN_6RD_PREFIXLEN].type = YNL_PT_U16; arr[IFLA_IPTUN_6RD_RELAY_PREFIXLEN].name = "6rd-relay-prefixlen"; @@ -1393,8 +1421,8 @@ struct ynl_policy_nest rt_link_vfinfo_list_attrs_nest = { .table = rt_link_vfinfo_list_attrs_policy.data(), }; -static std::array rt_link_linkinfo_data_msg_policy = []() { - std::array arr{}; +static std::array rt_link_linkinfo_data_msg_policy = []() { + std::array arr{}; arr[0].type = YNL_PT_SUBMSG; arr[0].name = "bond"; arr[0].nest = &rt_link_linkinfo_bond_attrs_nest; @@ -1417,40 +1445,43 @@ static std::array rt_link_linkinfo_data_msg_policy = []() { arr[6].name = "geneve"; arr[6].nest = &rt_link_linkinfo_geneve_attrs_nest; arr[7].type = YNL_PT_SUBMSG; - arr[7].name = "ipip"; - arr[7].nest = &rt_link_linkinfo_iptun_attrs_nest; + arr[7].name = "hsr"; + arr[7].nest = &rt_link_linkinfo_hsr_attrs_nest; arr[8].type = YNL_PT_SUBMSG; - arr[8].name = "ip6tnl"; - arr[8].nest = &rt_link_linkinfo_ip6tnl_attrs_nest; + arr[8].name = "ipip"; + arr[8].nest = &rt_link_linkinfo_iptun_attrs_nest; arr[9].type = YNL_PT_SUBMSG; - arr[9].name = "sit"; - arr[9].nest = &rt_link_linkinfo_iptun_attrs_nest; + arr[9].name = "ip6tnl"; + arr[9].nest = &rt_link_linkinfo_ip6tnl_attrs_nest; arr[10].type = YNL_PT_SUBMSG; - arr[10].name = "tun"; - arr[10].nest = &rt_link_linkinfo_tun_attrs_nest; + arr[10].name = "sit"; + arr[10].nest = &rt_link_linkinfo_iptun_attrs_nest; arr[11].type = YNL_PT_SUBMSG; - arr[11].name = "vlan"; - arr[11].nest = &rt_link_linkinfo_vlan_attrs_nest; + arr[11].name = "tun"; + arr[11].nest = &rt_link_linkinfo_tun_attrs_nest; arr[12].type = YNL_PT_SUBMSG; - arr[12].name = "vrf"; - arr[12].nest = &rt_link_linkinfo_vrf_attrs_nest; + arr[12].name = "vlan"; + arr[12].nest = &rt_link_linkinfo_vlan_attrs_nest; arr[13].type = YNL_PT_SUBMSG; - arr[13].name = "vti"; - arr[13].nest = &rt_link_linkinfo_vti_attrs_nest; + arr[13].name = "vrf"; + arr[13].nest = &rt_link_linkinfo_vrf_attrs_nest; arr[14].type = YNL_PT_SUBMSG; - arr[14].name = "vti6"; - arr[14].nest = &rt_link_linkinfo_vti6_attrs_nest; + arr[14].name = "vti"; + arr[14].nest = &rt_link_linkinfo_vti_attrs_nest; arr[15].type = YNL_PT_SUBMSG; - arr[15].name = "netkit"; - arr[15].nest = &rt_link_linkinfo_netkit_attrs_nest; + arr[15].name = "vti6"; + arr[15].nest = &rt_link_linkinfo_vti6_attrs_nest; arr[16].type = YNL_PT_SUBMSG; - arr[16].name = "ovpn"; - arr[16].nest = &rt_link_linkinfo_ovpn_attrs_nest; + arr[16].name = "netkit"; + arr[16].nest = &rt_link_linkinfo_netkit_attrs_nest; + arr[17].type = YNL_PT_SUBMSG; + arr[17].name = "ovpn"; + arr[17].nest = &rt_link_linkinfo_ovpn_attrs_nest; return arr; } (); struct ynl_policy_nest rt_link_linkinfo_data_msg_nest = { - .max_attr = 17, + .max_attr = 18, .table = rt_link_linkinfo_data_msg_policy.data(), }; @@ -2903,8 +2934,8 @@ int rt_link_linkinfo_geneve_attrs_put(struct nlmsghdr *nlh, if (obj.id.has_value()) { ynl_attr_put_u32(nlh, IFLA_GENEVE_ID, obj.id.value()); } - if (obj.remote.size() > 0) { - ynl_attr_put(nlh, IFLA_GENEVE_REMOTE, obj.remote.data(), obj.remote.size()); + if (obj.remote.has_value()) { + ynl_attr_put_u32(nlh, IFLA_GENEVE_REMOTE, obj.remote.value()); } if (obj.ttl.has_value()) { ynl_attr_put_u8(nlh, IFLA_GENEVE_TTL, obj.ttl.value()); @@ -2945,6 +2976,9 @@ int rt_link_linkinfo_geneve_attrs_put(struct nlmsghdr *nlh, if (obj.port_range) { ynl_attr_put(nlh, IFLA_GENEVE_PORT_RANGE, &*obj.port_range, sizeof(struct ifla_geneve_port_range)); } + if (obj.gro_hint) { + ynl_attr_put(nlh, IFLA_GENEVE_GRO_HINT, NULL, 0); + } ynl_attr_nest_end(nlh, nest); return 0; @@ -2968,9 +3002,7 @@ int rt_link_linkinfo_geneve_attrs_parse(struct ynl_parse_arg *yarg, if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; } - unsigned int len = ynl_attr_data_len(attr); - __u8 *data = (__u8*)ynl_attr_data(attr); - dst->remote.assign(data, data + len); + dst->remote = (__u32)ynl_attr_get_u32(attr); } else if (type == IFLA_GENEVE_TTL) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -3039,6 +3071,103 @@ int rt_link_linkinfo_geneve_attrs_parse(struct ynl_parse_arg *yarg, unsigned int struct_sz = sizeof(struct ifla_geneve_port_range); dst->port_range.emplace(); memcpy(&*dst->port_range, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == IFLA_GENEVE_GRO_HINT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +int rt_link_linkinfo_hsr_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + const rt_link_linkinfo_hsr_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.slave1.has_value()) { + ynl_attr_put_u32(nlh, IFLA_HSR_SLAVE1, obj.slave1.value()); + } + if (obj.slave2.has_value()) { + ynl_attr_put_u32(nlh, IFLA_HSR_SLAVE2, obj.slave2.value()); + } + if (obj.multicast_spec.has_value()) { + ynl_attr_put_u8(nlh, IFLA_HSR_MULTICAST_SPEC, obj.multicast_spec.value()); + } + if (obj.supervision_addr.size() > 0) { + ynl_attr_put(nlh, IFLA_HSR_SUPERVISION_ADDR, obj.supervision_addr.data(), obj.supervision_addr.size()); + } + if (obj.seq_nr.has_value()) { + ynl_attr_put_u16(nlh, IFLA_HSR_SEQ_NR, obj.seq_nr.value()); + } + if (obj.version.has_value()) { + ynl_attr_put_u8(nlh, IFLA_HSR_VERSION, obj.version.value()); + } + if (obj.protocol.has_value()) { + ynl_attr_put_u8(nlh, IFLA_HSR_PROTOCOL, obj.protocol.value()); + } + if (obj.interlink.has_value()) { + ynl_attr_put_u32(nlh, IFLA_HSR_INTERLINK, obj.interlink.value()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int rt_link_linkinfo_hsr_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + rt_link_linkinfo_hsr_attrs *dst = (rt_link_linkinfo_hsr_attrs *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == IFLA_HSR_SLAVE1) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->slave1 = (__u32)ynl_attr_get_u32(attr); + } else if (type == IFLA_HSR_SLAVE2) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->slave2 = (__u32)ynl_attr_get_u32(attr); + } else if (type == IFLA_HSR_MULTICAST_SPEC) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->multicast_spec = (__u8)ynl_attr_get_u8(attr); + } else if (type == IFLA_HSR_SUPERVISION_ADDR) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->supervision_addr.assign(data, data + len); + } else if (type == IFLA_HSR_SEQ_NR) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->seq_nr = (__u16)ynl_attr_get_u16(attr); + } else if (type == IFLA_HSR_VERSION) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->version = (__u8)ynl_attr_get_u8(attr); + } else if (type == IFLA_HSR_PROTOCOL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->protocol = (__u8)ynl_attr_get_u8(attr); + } else if (type == IFLA_HSR_INTERLINK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->interlink = (__u32)ynl_attr_get_u32(attr); } } @@ -3085,8 +3214,8 @@ int rt_link_linkinfo_iptun_attrs_put(struct nlmsghdr *nlh, if (obj._6rd_prefix.size() > 0) { ynl_attr_put(nlh, IFLA_IPTUN_6RD_PREFIX, obj._6rd_prefix.data(), obj._6rd_prefix.size()); } - if (obj._6rd_relay_prefix.size() > 0) { - ynl_attr_put(nlh, IFLA_IPTUN_6RD_RELAY_PREFIX, obj._6rd_relay_prefix.data(), obj._6rd_relay_prefix.size()); + if (obj._6rd_relay_prefix.has_value()) { + ynl_attr_put_u32(nlh, IFLA_IPTUN_6RD_RELAY_PREFIX, obj._6rd_relay_prefix.value()); } if (obj._6rd_prefixlen.has_value()) { ynl_attr_put_u16(nlh, IFLA_IPTUN_6RD_PREFIXLEN, obj._6rd_prefixlen.value()); @@ -3191,9 +3320,7 @@ int rt_link_linkinfo_iptun_attrs_parse(struct ynl_parse_arg *yarg, if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; } - unsigned int len = ynl_attr_data_len(attr); - __u8 *data = (__u8*)ynl_attr_data(attr); - dst->_6rd_relay_prefix.assign(data, data + len); + dst->_6rd_relay_prefix = (__u32)ynl_attr_get_u32(attr); } else if (type == IFLA_IPTUN_6RD_PREFIXLEN) { if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; @@ -5356,6 +5483,9 @@ int rt_link_linkinfo_data_msg_put(struct nlmsghdr *nlh, unsigned int attr_type, if (obj.geneve.has_value()) { rt_link_linkinfo_geneve_attrs_put(nlh, IFLA_INFO_DATA, obj.geneve.value()); } + if (obj.hsr.has_value()) { + rt_link_linkinfo_hsr_attrs_put(nlh, IFLA_INFO_DATA, obj.hsr.value()); + } if (obj.ipip.has_value()) { rt_link_linkinfo_iptun_attrs_put(nlh, IFLA_INFO_DATA, obj.ipip.value()); } @@ -5442,6 +5572,12 @@ int rt_link_linkinfo_data_msg_parse(struct ynl_parse_arg *yarg, if (rt_link_linkinfo_geneve_attrs_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; } + } else if (sel == "hsr") { + parg.rsp_policy = &rt_link_linkinfo_hsr_attrs_nest; + parg.data = &dst->hsr.emplace(); + if (rt_link_linkinfo_hsr_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } } else if (sel == "ipip") { parg.rsp_policy = &rt_link_linkinfo_iptun_attrs_nest; parg.data = &dst->ipip.emplace(); diff --git a/generated/rt-link-user.hpp b/generated/rt-link-user.hpp index ab76052..7b24e46 100644 --- a/generated/rt-link-user.hpp +++ b/generated/rt-link-user.hpp @@ -202,7 +202,7 @@ struct rt_link_linkinfo_gre6_attrs { struct rt_link_linkinfo_geneve_attrs { std::optional<__u32> id; - std::vector<__u8> remote; + std::optional<__u32> remote /* big-endian */; std::optional<__u8> ttl; std::optional<__u8> tos; std::optional<__u16> port /* big-endian */; @@ -216,6 +216,18 @@ struct rt_link_linkinfo_geneve_attrs { std::optional<__u8> df; bool inner_proto_inherit{}; std::optional port_range; + bool gro_hint{}; +}; + +struct rt_link_linkinfo_hsr_attrs { + std::optional<__u32> slave1; + std::optional<__u32> slave2; + std::optional<__u8> multicast_spec; + std::vector<__u8> supervision_addr; + std::optional<__u16> seq_nr; + std::optional<__u8> version; + std::optional<__u8> protocol; + std::optional<__u32> interlink; }; struct rt_link_linkinfo_iptun_attrs { @@ -230,7 +242,7 @@ struct rt_link_linkinfo_iptun_attrs { std::optional<__u8> proto; std::optional<__u8> pmtudisc; std::vector<__u8> _6rd_prefix; - std::vector<__u8> _6rd_relay_prefix; + std::optional<__u32> _6rd_relay_prefix /* big-endian */; std::optional<__u16> _6rd_prefixlen; std::optional<__u16> _6rd_relay_prefixlen; std::optional<__u16> encap_type; @@ -481,6 +493,7 @@ struct rt_link_linkinfo_data_msg { std::optional gretap; std::optional ip6gre; std::optional geneve; + std::optional hsr; std::optional ipip; std::optional ip6tnl; std::optional sit; diff --git a/generated/rt-rule-user.cpp b/generated/rt-rule-user.cpp index 182a9d2..7714b2d 100644 --- a/generated/rt-rule-user.cpp +++ b/generated/rt-rule-user.cpp @@ -55,9 +55,9 @@ std::string_view rt_rule_fr_act_str(int value) static std::array rt_rule_fib_rule_attrs_policy = []() { std::array arr{}; arr[FRA_DST].name = "dst"; - arr[FRA_DST].type = YNL_PT_U32; + arr[FRA_DST].type = YNL_PT_BINARY; arr[FRA_SRC].name = "src"; - arr[FRA_SRC].type = YNL_PT_U32; + arr[FRA_SRC].type = YNL_PT_BINARY; arr[FRA_IIFNAME].name = "iifname"; arr[FRA_IIFNAME].type = YNL_PT_NUL_STR; arr[FRA_GOTO].name = "goto"; diff --git a/generated/wireguard-user.cpp b/generated/wireguard-user.cpp new file mode 100644 index 0000000..b88e9b2 --- /dev/null +++ b/generated/wireguard-user.cpp @@ -0,0 +1,539 @@ +// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user source */ + +#include "wireguard-user.hpp" + +#include + +#include +#include + +#include + +namespace ynl_cpp { + +/* Enums */ +static constexpr std::array wireguard_op_strmap = []() { + std::array arr{}; + arr[WG_CMD_SET_DEVICE] = "set-device"; + return arr; +} (); + +std::string_view wireguard_op_str(int op) +{ + if (op < 0 || op >= (int)(wireguard_op_strmap.size())) { + return ""; + } + return wireguard_op_strmap[op]; +} + +static constexpr std::array wireguard_wgdevice_flags_strmap = []() { + std::array arr{}; + arr[0] = "replace-peers"; + return arr; +} (); + +std::string_view wireguard_wgdevice_flags_str(wgdevice_flag value) +{ + value = (wgdevice_flag)(ffs(value) - 1); + if (value < 0 || value >= (int)(wireguard_wgdevice_flags_strmap.size())) { + return ""; + } + return wireguard_wgdevice_flags_strmap[value]; +} + +static constexpr std::array wireguard_wgpeer_flags_strmap = []() { + std::array arr{}; + arr[0] = "remove-me"; + arr[1] = "replace-allowedips"; + arr[2] = "update-only"; + return arr; +} (); + +std::string_view wireguard_wgpeer_flags_str(wgpeer_flag value) +{ + value = (wgpeer_flag)(ffs(value) - 1); + if (value < 0 || value >= (int)(wireguard_wgpeer_flags_strmap.size())) { + return ""; + } + return wireguard_wgpeer_flags_strmap[value]; +} + +static constexpr std::array wireguard_wgallowedip_flags_strmap = []() { + std::array arr{}; + arr[0] = "remove-me"; + return arr; +} (); + +std::string_view wireguard_wgallowedip_flags_str(wgallowedip_flag value) +{ + value = (wgallowedip_flag)(ffs(value) - 1); + if (value < 0 || value >= (int)(wireguard_wgallowedip_flags_strmap.size())) { + return ""; + } + return wireguard_wgallowedip_flags_strmap[value]; +} + +/* Policies */ +static std::array wireguard_wgallowedip_policy = []() { + std::array arr{}; + arr[WGALLOWEDIP_A_UNSPEC].name = "unspec"; + arr[WGALLOWEDIP_A_UNSPEC].type = YNL_PT_REJECT; + arr[WGALLOWEDIP_A_FAMILY].name = "family"; + arr[WGALLOWEDIP_A_FAMILY].type = YNL_PT_U16; + arr[WGALLOWEDIP_A_IPADDR].name = "ipaddr"; + arr[WGALLOWEDIP_A_IPADDR].type = YNL_PT_BINARY; + arr[WGALLOWEDIP_A_CIDR_MASK].name = "cidr-mask"; + arr[WGALLOWEDIP_A_CIDR_MASK].type = YNL_PT_U8; + arr[WGALLOWEDIP_A_FLAGS].name = "flags"; + arr[WGALLOWEDIP_A_FLAGS].type = YNL_PT_U32; + return arr; +} (); + +struct ynl_policy_nest wireguard_wgallowedip_nest = { + .max_attr = static_cast(WGALLOWEDIP_A_MAX), + .table = wireguard_wgallowedip_policy.data(), +}; + +static std::array wireguard_wgpeer_policy = []() { + std::array arr{}; + arr[WGPEER_A_UNSPEC].name = "unspec"; + arr[WGPEER_A_UNSPEC].type = YNL_PT_REJECT; + arr[WGPEER_A_PUBLIC_KEY].name = "public-key"; + arr[WGPEER_A_PUBLIC_KEY].type = YNL_PT_BINARY; + arr[WGPEER_A_PRESHARED_KEY].name = "preshared-key"; + arr[WGPEER_A_PRESHARED_KEY].type = YNL_PT_BINARY; + arr[WGPEER_A_FLAGS].name = "flags"; + arr[WGPEER_A_FLAGS].type = YNL_PT_U32; + arr[WGPEER_A_ENDPOINT].name = "endpoint"; + arr[WGPEER_A_ENDPOINT].type = YNL_PT_BINARY; + arr[WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL].name = "persistent-keepalive-interval"; + arr[WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL].type = YNL_PT_U16; + arr[WGPEER_A_LAST_HANDSHAKE_TIME].name = "last-handshake-time"; + arr[WGPEER_A_LAST_HANDSHAKE_TIME].type = YNL_PT_BINARY; + arr[WGPEER_A_RX_BYTES].name = "rx-bytes"; + arr[WGPEER_A_RX_BYTES].type = YNL_PT_U64; + arr[WGPEER_A_TX_BYTES].name = "tx-bytes"; + arr[WGPEER_A_TX_BYTES].type = YNL_PT_U64; + arr[WGPEER_A_ALLOWEDIPS].name = "allowedips"; + arr[WGPEER_A_ALLOWEDIPS].type = YNL_PT_NEST; + arr[WGPEER_A_ALLOWEDIPS].nest = &wireguard_wgallowedip_nest; + arr[WGPEER_A_PROTOCOL_VERSION].name = "protocol-version"; + arr[WGPEER_A_PROTOCOL_VERSION].type = YNL_PT_U32; + return arr; +} (); + +struct ynl_policy_nest wireguard_wgpeer_nest = { + .max_attr = static_cast(WGPEER_A_MAX), + .table = wireguard_wgpeer_policy.data(), +}; + +static std::array wireguard_wgdevice_policy = []() { + std::array arr{}; + arr[WGDEVICE_A_UNSPEC].name = "unspec"; + arr[WGDEVICE_A_UNSPEC].type = YNL_PT_REJECT; + arr[WGDEVICE_A_IFINDEX].name = "ifindex"; + arr[WGDEVICE_A_IFINDEX].type = YNL_PT_U32; + arr[WGDEVICE_A_IFNAME].name = "ifname"; + arr[WGDEVICE_A_IFNAME].type = YNL_PT_NUL_STR; + arr[WGDEVICE_A_PRIVATE_KEY].name = "private-key"; + arr[WGDEVICE_A_PRIVATE_KEY].type = YNL_PT_BINARY; + arr[WGDEVICE_A_PUBLIC_KEY].name = "public-key"; + arr[WGDEVICE_A_PUBLIC_KEY].type = YNL_PT_BINARY; + arr[WGDEVICE_A_FLAGS].name = "flags"; + arr[WGDEVICE_A_FLAGS].type = YNL_PT_U32; + arr[WGDEVICE_A_LISTEN_PORT].name = "listen-port"; + arr[WGDEVICE_A_LISTEN_PORT].type = YNL_PT_U16; + arr[WGDEVICE_A_FWMARK].name = "fwmark"; + arr[WGDEVICE_A_FWMARK].type = YNL_PT_U32; + arr[WGDEVICE_A_PEERS].name = "peers"; + arr[WGDEVICE_A_PEERS].type = YNL_PT_NEST; + arr[WGDEVICE_A_PEERS].nest = &wireguard_wgpeer_nest; + return arr; +} (); + +struct ynl_policy_nest wireguard_wgdevice_nest = { + .max_attr = static_cast(WGDEVICE_A_MAX), + .table = wireguard_wgdevice_policy.data(), +}; + +/* Common nested types */ +int wireguard_wgallowedip_put(struct nlmsghdr *nlh, unsigned int attr_type, + const wireguard_wgallowedip& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.family.has_value()) { + ynl_attr_put_u16(nlh, WGALLOWEDIP_A_FAMILY, obj.family.value()); + } + if (obj.ipaddr.size() > 0) { + ynl_attr_put(nlh, WGALLOWEDIP_A_IPADDR, obj.ipaddr.data(), obj.ipaddr.size()); + } + if (obj.cidr_mask.has_value()) { + ynl_attr_put_u8(nlh, WGALLOWEDIP_A_CIDR_MASK, obj.cidr_mask.value()); + } + if (obj.flags.has_value()) { + ynl_attr_put_u32(nlh, WGALLOWEDIP_A_FLAGS, obj.flags.value()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int wireguard_wgallowedip_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested, __u32 idx) +{ + wireguard_wgallowedip *dst = (wireguard_wgallowedip *)yarg->data; + const struct nlattr *attr; + + dst->idx = idx; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == WGALLOWEDIP_A_FAMILY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->family = (__u16)ynl_attr_get_u16(attr); + } else if (type == WGALLOWEDIP_A_IPADDR) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ipaddr.assign(data, data + len); + } else if (type == WGALLOWEDIP_A_CIDR_MASK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->cidr_mask = (__u8)ynl_attr_get_u8(attr); + } else if (type == WGALLOWEDIP_A_FLAGS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->flags = (__u32)ynl_attr_get_u32(attr); + } + } + + return 0; +} + +int wireguard_wgpeer_put(struct nlmsghdr *nlh, unsigned int attr_type, + const wireguard_wgpeer& obj) +{ + struct nlattr *array; + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.public_key.size() > 0) { + ynl_attr_put(nlh, WGPEER_A_PUBLIC_KEY, obj.public_key.data(), obj.public_key.size()); + } + if (obj.preshared_key.size() > 0) { + ynl_attr_put(nlh, WGPEER_A_PRESHARED_KEY, obj.preshared_key.data(), obj.preshared_key.size()); + } + if (obj.flags.has_value()) { + ynl_attr_put_u32(nlh, WGPEER_A_FLAGS, obj.flags.value()); + } + if (obj.endpoint.size() > 0) { + ynl_attr_put(nlh, WGPEER_A_ENDPOINT, obj.endpoint.data(), obj.endpoint.size()); + } + if (obj.persistent_keepalive_interval.has_value()) { + ynl_attr_put_u16(nlh, WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL, obj.persistent_keepalive_interval.value()); + } + if (obj.last_handshake_time) { + ynl_attr_put(nlh, WGPEER_A_LAST_HANDSHAKE_TIME, &*obj.last_handshake_time, sizeof(struct __kernel_timespec)); + } + if (obj.rx_bytes.has_value()) { + ynl_attr_put_u64(nlh, WGPEER_A_RX_BYTES, obj.rx_bytes.value()); + } + if (obj.tx_bytes.has_value()) { + ynl_attr_put_u64(nlh, WGPEER_A_TX_BYTES, obj.tx_bytes.value()); + } + array = ynl_attr_nest_start(nlh, WGPEER_A_ALLOWEDIPS); + for (unsigned int i = 0; i < obj.allowedips.size(); i++) { + wireguard_wgallowedip_put(nlh, i, obj.allowedips[i]); + } + ynl_attr_nest_end(nlh, array); + if (obj.protocol_version.has_value()) { + ynl_attr_put_u32(nlh, WGPEER_A_PROTOCOL_VERSION, obj.protocol_version.value()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int wireguard_wgpeer_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested, __u32 idx) +{ + wireguard_wgpeer *dst = (wireguard_wgpeer *)yarg->data; + const struct nlattr *attr_allowedips; + unsigned int n_allowedips = 0; + const struct nlattr *attr; + struct ynl_parse_arg parg; + int i; + + parg.ys = yarg->ys; + + dst->idx = idx; + if (dst->allowedips.size() > 0) { + return ynl_error_parse(yarg, "attribute already present (wgpeer.allowedips)"); + } + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == WGPEER_A_PUBLIC_KEY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->public_key.assign(data, data + len); + } else if (type == WGPEER_A_PRESHARED_KEY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->preshared_key.assign(data, data + len); + } else if (type == WGPEER_A_FLAGS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->flags = (__u32)ynl_attr_get_u32(attr); + } else if (type == WGPEER_A_ENDPOINT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->endpoint.assign(data, data + len); + } else if (type == WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->persistent_keepalive_interval = (__u16)ynl_attr_get_u16(attr); + } else if (type == WGPEER_A_LAST_HANDSHAKE_TIME) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct __kernel_timespec); + dst->last_handshake_time.emplace(); + memcpy(&*dst->last_handshake_time, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == WGPEER_A_RX_BYTES) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->rx_bytes = (__u64)ynl_attr_get_u64(attr); + } else if (type == WGPEER_A_TX_BYTES) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tx_bytes = (__u64)ynl_attr_get_u64(attr); + } else if (type == WGPEER_A_ALLOWEDIPS) { + const struct nlattr *attr2; + + attr_allowedips = attr; + } else if (type == WGPEER_A_PROTOCOL_VERSION) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->protocol_version = (__u32)ynl_attr_get_u32(attr); + } + } + + if (n_allowedips) { + dst->allowedips.resize(n_allowedips); + i = 0; + parg.rsp_policy = &wireguard_wgallowedip_nest; + ynl_attr_for_each_nested(attr, attr_allowedips) { + parg.data = &dst->allowedips[i]; + if (wireguard_wgallowedip_parse(&parg, attr, ynl_attr_type(attr))) { + return YNL_PARSE_CB_ERROR; + } + i++; + } + } + + return 0; +} + +/* ============== WG_CMD_GET_DEVICE ============== */ +/* WG_CMD_GET_DEVICE - dump */ +int wireguard_get_device_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + const struct nlattr *attr_peers; + wireguard_get_device_rsp *dst; + const struct nlattr *attr; + struct ynl_parse_arg parg; + unsigned int n_peers = 0; + int i; + + dst = (wireguard_get_device_rsp*)yarg->data; + parg.ys = yarg->ys; + + if (dst->peers.size() > 0) { + return ynl_error_parse(yarg, "attribute already present (wgdevice.peers)"); + } + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == WGDEVICE_A_IFINDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ifindex = (__u32)ynl_attr_get_u32(attr); + } else if (type == WGDEVICE_A_IFNAME) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ifname.assign(ynl_attr_get_str(attr)); + } else if (type == WGDEVICE_A_PRIVATE_KEY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->private_key.assign(data, data + len); + } else if (type == WGDEVICE_A_PUBLIC_KEY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->public_key.assign(data, data + len); + } else if (type == WGDEVICE_A_FLAGS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->flags = (__u32)ynl_attr_get_u32(attr); + } else if (type == WGDEVICE_A_LISTEN_PORT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->listen_port = (__u16)ynl_attr_get_u16(attr); + } else if (type == WGDEVICE_A_FWMARK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->fwmark = (__u32)ynl_attr_get_u32(attr); + } else if (type == WGDEVICE_A_PEERS) { + const struct nlattr *attr2; + + attr_peers = attr; + } + } + + if (n_peers) { + dst->peers.resize(n_peers); + i = 0; + parg.rsp_policy = &wireguard_wgpeer_nest; + ynl_attr_for_each_nested(attr, attr_peers) { + parg.data = &dst->peers[i]; + if (wireguard_wgpeer_parse(&parg, attr, ynl_attr_type(attr))) { + return YNL_PARSE_CB_ERROR; + } + i++; + } + } + + return YNL_PARSE_CB_OK; +} + +std::unique_ptr +wireguard_get_device_dump(ynl_cpp::ynl_socket& ys, + wireguard_get_device_req& req) +{ + struct ynl_dump_no_alloc_state yds = {}; + struct nlmsghdr *nlh; + int err; + + auto ret = std::make_unique(); + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &wireguard_wgdevice_nest; + yds.yarg.data = ret.get(); + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; + yds.cb = wireguard_get_device_rsp_parse; + yds.rsp_cmd = WG_CMD_GET_DEVICE; + + nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, WG_CMD_GET_DEVICE, 1); + ((struct ynl_sock*)ys)->req_policy = &wireguard_wgdevice_nest; + + if (req.ifindex.has_value()) { + ynl_attr_put_u32(nlh, WGDEVICE_A_IFINDEX, req.ifindex.value()); + } + if (req.ifname.size() > 0) { + ynl_attr_put_str(nlh, WGDEVICE_A_IFNAME, req.ifname.data()); + } + + err = ynl_exec_dump_no_alloc(ys, nlh, &yds); + if (err < 0) { + return nullptr; + } + + return ret; +} + +/* ============== WG_CMD_SET_DEVICE ============== */ +/* WG_CMD_SET_DEVICE - do */ +int wireguard_set_device(ynl_cpp::ynl_socket& ys, + wireguard_set_device_req& req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + struct nlattr *array; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, WG_CMD_SET_DEVICE, 1); + ((struct ynl_sock*)ys)->req_policy = &wireguard_wgdevice_nest; + + if (req.ifindex.has_value()) { + ynl_attr_put_u32(nlh, WGDEVICE_A_IFINDEX, req.ifindex.value()); + } + if (req.ifname.size() > 0) { + ynl_attr_put_str(nlh, WGDEVICE_A_IFNAME, req.ifname.data()); + } + if (req.private_key.size() > 0) { + ynl_attr_put(nlh, WGDEVICE_A_PRIVATE_KEY, req.private_key.data(), req.private_key.size()); + } + if (req.public_key.size() > 0) { + ynl_attr_put(nlh, WGDEVICE_A_PUBLIC_KEY, req.public_key.data(), req.public_key.size()); + } + if (req.flags.has_value()) { + ynl_attr_put_u32(nlh, WGDEVICE_A_FLAGS, req.flags.value()); + } + if (req.listen_port.has_value()) { + ynl_attr_put_u16(nlh, WGDEVICE_A_LISTEN_PORT, req.listen_port.value()); + } + if (req.fwmark.has_value()) { + ynl_attr_put_u32(nlh, WGDEVICE_A_FWMARK, req.fwmark.value()); + } + array = ynl_attr_nest_start(nlh, WGDEVICE_A_PEERS); + for (unsigned int i = 0; i < req.peers.size(); i++) { + wireguard_wgpeer_put(nlh, i, req.peers[i]); + } + ynl_attr_nest_end(nlh, array); + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return -1; + } + + return 0; +} + +const struct ynl_family ynl_wireguard_family = { + .name = "wireguard", + .hdr_len = sizeof(struct genlmsghdr), +}; +const struct ynl_family& get_ynl_wireguard_family() { + return ynl_wireguard_family; +}; +} //namespace ynl_cpp diff --git a/generated/wireguard-user.hpp b/generated/wireguard-user.hpp new file mode 100644 index 0000000..5d2d6a3 --- /dev/null +++ b/generated/wireguard-user.hpp @@ -0,0 +1,122 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user header */ + +#ifndef _LINUX_WIREGUARD_GEN_H +#define _LINUX_WIREGUARD_GEN_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ynl.hpp" + +#include +#include + +namespace ynl_cpp { +const struct ynl_family& get_ynl_wireguard_family(); + +/* Enums */ +std::string_view wireguard_op_str(int op); +std::string_view wireguard_wgdevice_flags_str(wgdevice_flag value); +std::string_view wireguard_wgpeer_flags_str(wgpeer_flag value); +std::string_view wireguard_wgallowedip_flags_str(wgallowedip_flag value); + +/* Common nested types */ +struct wireguard_wgallowedip { + std::optional<__u32> idx; + std::optional<__u16> family; + std::vector<__u8> ipaddr; + std::optional<__u8> cidr_mask; + std::optional<__u32> flags; +}; + +struct wireguard_wgpeer { + std::optional<__u32> idx; + std::vector<__u8> public_key; + std::vector<__u8> preshared_key; + std::optional<__u32> flags; + std::vector<__u8> endpoint; + std::optional<__u16> persistent_keepalive_interval; + std::optional last_handshake_time; + std::optional<__u64> rx_bytes; + std::optional<__u64> tx_bytes; + std::vector allowedips; + std::optional<__u32> protocol_version; +}; + +/* ============== WG_CMD_GET_DEVICE ============== */ +/* WG_CMD_GET_DEVICE - dump */ +struct wireguard_get_device_req { + std::optional<__u32> ifindex; + std::string ifname; +}; + +struct wireguard_get_device_rsp { + std::optional<__u32> ifindex; + std::string ifname; + std::vector<__u8> private_key; + std::vector<__u8> public_key; + std::optional<__u32> flags; + std::optional<__u16> listen_port; + std::optional<__u32> fwmark; + std::vector peers; +}; + +struct wireguard_get_device_list { + std::list objs; +}; + +std::unique_ptr +wireguard_get_device_dump(ynl_cpp::ynl_socket& ys, + wireguard_get_device_req& req); + +/* ============== WG_CMD_SET_DEVICE ============== */ +/* WG_CMD_SET_DEVICE - do */ +struct wireguard_set_device_req { + std::optional<__u32> ifindex; + std::string ifname; + std::vector<__u8> private_key; + std::vector<__u8> public_key; + std::optional<__u32> flags; + std::optional<__u16> listen_port; + std::optional<__u32> fwmark; + std::vector peers; +}; + +/* + * Set WireGuard device +~~~~~~~~~~~~~~~~~~~~ + +This command should be called with a wgdevice set, containing one but +not both of ``WGDEVICE_A_IFINDEX`` and ``WGDEVICE_A_IFNAME``. + +It is possible that the amount of configuration data exceeds that of the +maximum message length accepted by the kernel. In that case, several +messages should be sent one after another, with each successive one +filling in information not contained in the prior. Note that if +``WGDEVICE_F_REPLACE_PEERS`` is specified in the first message, it +probably should not be specified in fragments that come after, so that +the list of peers is only cleared the first time but appended after. +Likewise for peers, if ``WGPEER_F_REPLACE_ALLOWEDIPS`` is specified in +the first message of a peer, it likely should not be specified in +subsequent fragments. + +If an error occurs, ``NLMSG_ERROR`` will reply containing an errno. + + */ +int wireguard_set_device(ynl_cpp::ynl_socket& ys, + wireguard_set_device_req& req); + +} //namespace ynl_cpp +#endif /* _LINUX_WIREGUARD_GEN_H */ diff --git a/linux/dev_energymodel.h b/linux/dev_energymodel.h new file mode 100644 index 0000000..355d888 --- /dev/null +++ b/linux/dev_energymodel.h @@ -0,0 +1,82 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/dev-energymodel.yaml */ +/* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ + +#ifndef _UAPI_LINUX_DEV_ENERGYMODEL_H +#define _UAPI_LINUX_DEV_ENERGYMODEL_H + +#define DEV_ENERGYMODEL_FAMILY_NAME "dev-energymodel" +#define DEV_ENERGYMODEL_FAMILY_VERSION 1 + +/** + * enum dev_energymodel_perf_state_flags + * @DEV_ENERGYMODEL_PERF_STATE_FLAGS_PERF_STATE_INEFFICIENT: The performance + * state is inefficient. There is in this perf-domain, another performance + * state with a higher frequency but a lower or equal power cost. + */ +enum dev_energymodel_perf_state_flags { + DEV_ENERGYMODEL_PERF_STATE_FLAGS_PERF_STATE_INEFFICIENT = 1, +}; + +/** + * enum dev_energymodel_perf_domain_flags + * @DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_MICROWATTS: The power values + * are in micro-Watts or some other scale. + * @DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_SKIP_INEFFICIENCIES: Skip + * inefficient states when estimating energy consumption. + * @DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_ARTIFICIAL: The power values + * are artificial and might be created by platform missing real power + * information. + */ +enum dev_energymodel_perf_domain_flags { + DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_MICROWATTS = 1, + DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_SKIP_INEFFICIENCIES = 2, + DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_ARTIFICIAL = 4, +}; + +enum { + DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD = 1, + DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID, + DEV_ENERGYMODEL_A_PERF_DOMAIN_FLAGS, + DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS, + + __DEV_ENERGYMODEL_A_PERF_DOMAIN_MAX, + DEV_ENERGYMODEL_A_PERF_DOMAIN_MAX = (__DEV_ENERGYMODEL_A_PERF_DOMAIN_MAX - 1) +}; + +enum { + DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID = 1, + DEV_ENERGYMODEL_A_PERF_TABLE_PERF_STATE, + + __DEV_ENERGYMODEL_A_PERF_TABLE_MAX, + DEV_ENERGYMODEL_A_PERF_TABLE_MAX = (__DEV_ENERGYMODEL_A_PERF_TABLE_MAX - 1) +}; + +enum { + DEV_ENERGYMODEL_A_PERF_STATE_PAD = 1, + DEV_ENERGYMODEL_A_PERF_STATE_PERFORMANCE, + DEV_ENERGYMODEL_A_PERF_STATE_FREQUENCY, + DEV_ENERGYMODEL_A_PERF_STATE_POWER, + DEV_ENERGYMODEL_A_PERF_STATE_COST, + DEV_ENERGYMODEL_A_PERF_STATE_FLAGS, + + __DEV_ENERGYMODEL_A_PERF_STATE_MAX, + DEV_ENERGYMODEL_A_PERF_STATE_MAX = (__DEV_ENERGYMODEL_A_PERF_STATE_MAX - 1) +}; + +enum { + DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS = 1, + DEV_ENERGYMODEL_CMD_GET_PERF_TABLE, + DEV_ENERGYMODEL_CMD_PERF_DOMAIN_CREATED, + DEV_ENERGYMODEL_CMD_PERF_DOMAIN_UPDATED, + DEV_ENERGYMODEL_CMD_PERF_DOMAIN_DELETED, + + __DEV_ENERGYMODEL_CMD_MAX, + DEV_ENERGYMODEL_CMD_MAX = (__DEV_ENERGYMODEL_CMD_MAX - 1) +}; + +#define DEV_ENERGYMODEL_MCGRP_EVENT "event" + +#endif /* _UAPI_LINUX_DEV_ENERGYMODEL_H */ diff --git a/linux/devlink.h b/linux/devlink.h index bcad11a..7de2d8c 100644 --- a/linux/devlink.h +++ b/linux/devlink.h @@ -19,6 +19,8 @@ #define DEVLINK_GENL_VERSION 0x1 #define DEVLINK_GENL_MCGRP_CONFIG_NAME "config" +#define DEVLINK_INDEX_BUS_NAME "devlink_index" + enum devlink_command { /* don't change the order or add anything between, this is ABI! */ DEVLINK_CMD_UNSPEC, @@ -181,6 +183,7 @@ enum devlink_sb_threshold_type { enum devlink_eswitch_mode { DEVLINK_ESWITCH_MODE_LEGACY, DEVLINK_ESWITCH_MODE_SWITCHDEV, + DEVLINK_ESWITCH_MODE_SWITCHDEV_INACTIVE, }; enum devlink_eswitch_inline_mode { @@ -638,6 +641,11 @@ enum devlink_attr { DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD, /* u64 */ + DEVLINK_ATTR_PARAM_VALUE_DEFAULT, /* dynamic */ + DEVLINK_ATTR_PARAM_RESET_DEFAULT, /* flag */ + + DEVLINK_ATTR_INDEX, /* uint */ + /* Add new attributes above here, update the spec in * Documentation/netlink/specs/devlink.yaml and re-generate * net/devlink/netlink_gen.c. diff --git a/linux/dpll.h b/linux/dpll.h index 69d3557..de0005f 100644 --- a/linux/dpll.h +++ b/linux/dpll.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/dpll.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_DPLL_H #define _UAPI_LINUX_DPLL_H @@ -252,6 +253,7 @@ enum dpll_a_pin { DPLL_A_PIN_ESYNC_PULSE, DPLL_A_PIN_REFERENCE_SYNC, DPLL_A_PIN_PHASE_ADJUST_GRAN, + DPLL_A_PIN_FRACTIONAL_FREQUENCY_OFFSET_PPT, __DPLL_A_PIN_MAX, DPLL_A_PIN_MAX = (__DPLL_A_PIN_MAX - 1) diff --git a/linux/ethtool.h b/linux/ethtool.h index 8bd5ea5..1cdfb83 100644 --- a/linux/ethtool.h +++ b/linux/ethtool.h @@ -15,13 +15,10 @@ #define _UAPI_LINUX_ETHTOOL_H #include +#include #include #include -#ifndef __KERNEL__ -#include /* for INT_MAX */ -#endif - /* All structures exposed to userland should be defined such that they * have the same layout for 32-bit and 64-bit userland. */ @@ -228,7 +225,7 @@ enum tunable_id { ETHTOOL_ID_UNSPEC, ETHTOOL_RX_COPYBREAK, ETHTOOL_TX_COPYBREAK, - ETHTOOL_PFC_PREVENTION_TOUT, /* timeout in msecs */ + ETHTOOL_PFC_PREVENTION_TOUT, /* both pause and pfc, see man ethtool */ ETHTOOL_TX_COPYBREAK_BUF_SIZE, /* * Add your fresh new tunable attribute above and remember to update @@ -603,6 +600,8 @@ enum ethtool_link_ext_state { ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED, ETHTOOL_LINK_EXT_STATE_OVERHEAT, ETHTOOL_LINK_EXT_STATE_MODULE, + ETHTOOL_LINK_EXT_STATE_OTP_SPEED_VIOLATION, + ETHTOOL_LINK_EXT_STATE_BMC_REQUEST_DOWN, }; /* More information in addition to ETHTOOL_LINK_EXT_STATE_AUTONEG. */ @@ -1094,13 +1093,20 @@ enum ethtool_module_fw_flash_status { * struct ethtool_gstrings - string set for data tagging * @cmd: Command number = %ETHTOOL_GSTRINGS * @string_set: String set ID; one of &enum ethtool_stringset - * @len: On return, the number of strings in the string set + * @len: Number of strings in the string set * @data: Buffer for strings. Each string is null-padded to a size of * %ETH_GSTRING_LEN. * * Users must use %ETHTOOL_GSSET_INFO to find the number of strings in * the string set. They must allocate a buffer of the appropriate * size immediately following this structure. + * + * Setting @len on input is optional (though preferred), but must be zeroed + * otherwise. + * When set, @len will return the requested count if it matches the actual + * count; otherwise, it will be zero. + * This prevents issues when the number of strings is different than the + * userspace allocation. */ struct ethtool_gstrings { __u32 cmd; @@ -1177,13 +1183,20 @@ struct ethtool_test { /** * struct ethtool_stats - device-specific statistics * @cmd: Command number = %ETHTOOL_GSTATS - * @n_stats: On return, the number of statistics + * @n_stats: Number of statistics * @data: Array of statistics * * Users must use %ETHTOOL_GSSET_INFO or %ETHTOOL_GDRVINFO to find the * number of statistics that will be returned. They must allocate a * buffer of the appropriate size (8 * number of statistics) * immediately following this structure. + * + * Setting @n_stats on input is optional (though preferred), but must be zeroed + * otherwise. + * When set, @n_stats will return the requested count if it matches the actual + * count; otherwise, it will be zero. + * This prevents issues when the number of stats is different than the + * userspace allocation. */ struct ethtool_stats { __u32 cmd; @@ -2077,6 +2090,10 @@ enum ethtool_link_mode_bit_indices { ETHTOOL_LINK_MODE_800000baseDR4_2_Full_BIT = 118, ETHTOOL_LINK_MODE_800000baseSR4_Full_BIT = 119, ETHTOOL_LINK_MODE_800000baseVR4_Full_BIT = 120, + ETHTOOL_LINK_MODE_1600000baseCR8_Full_BIT = 121, + ETHTOOL_LINK_MODE_1600000baseKR8_Full_BIT = 122, + ETHTOOL_LINK_MODE_1600000baseDR8_Full_BIT = 123, + ETHTOOL_LINK_MODE_1600000baseDR8_2_Full_BIT = 124, /* must be last entry */ __ETHTOOL_LINK_MODE_MASK_NBITS @@ -2186,16 +2203,18 @@ enum ethtool_link_mode_bit_indices { #define SPEED_40000 40000 #define SPEED_50000 50000 #define SPEED_56000 56000 +#define SPEED_80000 80000 #define SPEED_100000 100000 #define SPEED_200000 200000 #define SPEED_400000 400000 #define SPEED_800000 800000 +#define SPEED_1600000 1600000 #define SPEED_UNKNOWN -1 static inline int ethtool_validate_speed(__u32 speed) { - return speed <= INT_MAX || speed == (__u32)SPEED_UNKNOWN; + return speed <= __KERNEL_INT_MAX || speed == (__u32)SPEED_UNKNOWN; } /* Duplex, half or full. */ diff --git a/linux/ethtool_netlink_generated.h b/linux/ethtool_netlink_generated.h index b71b175..8134baf 100644 --- a/linux/ethtool_netlink_generated.h +++ b/linux/ethtool_netlink_generated.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/ethtool.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_ETHTOOL_NETLINK_GENERATED_H #define _UAPI_LINUX_ETHTOOL_NETLINK_GENERATED_H @@ -370,6 +371,8 @@ enum { ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS, ETHTOOL_A_COALESCE_RX_PROFILE, ETHTOOL_A_COALESCE_TX_PROFILE, + ETHTOOL_A_COALESCE_RX_CQE_FRAMES, + ETHTOOL_A_COALESCE_RX_CQE_NSECS, __ETHTOOL_A_COALESCE_CNT, ETHTOOL_A_COALESCE_MAX = (__ETHTOOL_A_COALESCE_CNT - 1) @@ -380,6 +383,7 @@ enum { ETHTOOL_A_PAUSE_STAT_PAD, ETHTOOL_A_PAUSE_STAT_TX_FRAMES, ETHTOOL_A_PAUSE_STAT_RX_FRAMES, + ETHTOOL_A_PAUSE_STAT_TX_PAUSE_STORM_EVENTS, __ETHTOOL_A_PAUSE_STAT_CNT, ETHTOOL_A_PAUSE_STAT_MAX = (__ETHTOOL_A_PAUSE_STAT_CNT - 1) diff --git a/linux/handshake.h b/linux/handshake.h index 662e7de..d7e40f5 100644 --- a/linux/handshake.h +++ b/linux/handshake.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/handshake.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_HANDSHAKE_H #define _UAPI_LINUX_HANDSHAKE_H diff --git a/linux/if_link.h b/linux/if_link.h index 3b491d9..83a96c5 100644 --- a/linux/if_link.h +++ b/linux/if_link.h @@ -1443,6 +1443,7 @@ enum { IFLA_GENEVE_DF, IFLA_GENEVE_INNER_PROTO_INHERIT, IFLA_GENEVE_PORT_RANGE, + IFLA_GENEVE_GRO_HINT, __IFLA_GENEVE_MAX }; #define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) @@ -1567,6 +1568,8 @@ enum { IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, IFLA_BOND_SLAVE_PRIO, IFLA_BOND_SLAVE_ACTOR_PORT_PRIO, + IFLA_BOND_SLAVE_AD_CHURN_ACTOR_STATE, + IFLA_BOND_SLAVE_AD_CHURN_PARTNER_STATE, __IFLA_BOND_SLAVE_MAX, }; diff --git a/linux/lockd_netlink.h b/linux/lockd_netlink.h index 21c65ae..2d766a0 100644 --- a/linux/lockd_netlink.h +++ b/linux/lockd_netlink.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/lockd.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_LOCKD_NETLINK_H #define _UAPI_LINUX_LOCKD_NETLINK_H diff --git a/linux/mptcp_pm.h b/linux/mptcp_pm.h index bf44a5c..fe9863d 100644 --- a/linux/mptcp_pm.h +++ b/linux/mptcp_pm.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/mptcp_pm.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_MPTCP_PM_H #define _UAPI_LINUX_MPTCP_PM_H @@ -10,7 +11,7 @@ #define MPTCP_PM_VER 1 /** - * enum mptcp_event_type + * enum mptcp_event_type - Netlink MPTCP event types * @MPTCP_EVENT_UNSPEC: unused event * @MPTCP_EVENT_CREATED: A new MPTCP connection has been created. It is the * good time to allocate memory and send ADD_ADDR if needed. Depending on the diff --git a/linux/net_shaper.h b/linux/net_shaper.h index d8834b5..3dd22c2 100644 --- a/linux/net_shaper.h +++ b/linux/net_shaper.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/net_shaper.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_NET_SHAPER_H #define _UAPI_LINUX_NET_SHAPER_H diff --git a/linux/netdev.h b/linux/netdev.h index 048c8de..e0b579a 100644 --- a/linux/netdev.h +++ b/linux/netdev.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/netdev.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_NETDEV_H #define _UAPI_LINUX_NETDEV_H diff --git a/linux/nfsd_netlink.h b/linux/nfsd_netlink.h index 887cbd1..e9efbc9 100644 --- a/linux/nfsd_netlink.h +++ b/linux/nfsd_netlink.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/nfsd.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_NFSD_NETLINK_H #define _UAPI_LINUX_NFSD_NETLINK_H @@ -34,6 +35,7 @@ enum { NFSD_A_SERVER_GRACETIME, NFSD_A_SERVER_LEASETIME, NFSD_A_SERVER_SCOPE, + NFSD_A_SERVER_MIN_THREADS, __NFSD_A_SERVER_MAX, NFSD_A_SERVER_MAX = (__NFSD_A_SERVER_MAX - 1) diff --git a/linux/nl80211.h b/linux/nl80211.h index 8134f10..67d7640 100644 --- a/linux/nl80211.h +++ b/linux/nl80211.h @@ -11,7 +11,7 @@ * Copyright 2008 Jouni Malinen * Copyright 2008 Colin McCabe * Copyright 2015-2017 Intel Deutschland GmbH - * Copyright (C) 2018-2025 Intel Corporation + * Copyright (C) 2018-2026 Intel Corporation * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -1361,6 +1361,12 @@ * user space that the NAN new cluster has been joined. The cluster ID is * indicated by %NL80211_ATTR_MAC. * + * @NL80211_CMD_INCUMBENT_SIGNAL_DETECT: Once any incumbent signal is detected + * on the operating channel in 6 GHz band, userspace is notified with the + * signal interference bitmap using + * %NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP. The current channel + * definition is also sent. + * * @NL80211_CMD_MAX: highest used command number * @__NL80211_CMD_AFTER_LAST: internal use */ @@ -1624,6 +1630,8 @@ enum nl80211_commands { NL80211_CMD_NAN_NEXT_DW_NOTIFICATION, NL80211_CMD_NAN_CLUSTER_JOINED, + NL80211_CMD_INCUMBENT_SIGNAL_DETECT, + /* add new commands above here */ /* used to define NL80211_CMD_MAX below */ @@ -2880,8 +2888,9 @@ enum nl80211_commands { * index. If the userspace includes more RNR elements than number of * MBSSID elements then these will be added in every EMA beacon. * - * @NL80211_ATTR_MLO_LINK_DISABLED: Flag attribute indicating that the link is - * disabled. + * @NL80211_ATTR_MLO_LINK_DISABLED: Unused. It was used to indicate that a link + * is disabled during association. However, the AP will send the + * information by including a TTLM in the association response. * * @NL80211_ATTR_BSS_DUMP_INCLUDE_USE_DATA: Include BSS usage data, i.e. * include BSSes that can only be used in restricted scenarios and/or @@ -2973,6 +2982,29 @@ enum nl80211_commands { * primary channel is 2 MHz wide, and the control channel designates * the 1 MHz primary subchannel within that 2 MHz primary. * + * @NL80211_ATTR_EPP_PEER: A flag attribute to indicate if the peer is an EPP + * STA. Used with %NL80211_CMD_NEW_STA and %NL80211_CMD_ADD_LINK_STA + * + * @NL80211_ATTR_UHR_CAPABILITY: UHR Capability information element (from + * association request when used with NL80211_CMD_NEW_STATION). Can be set + * only if HE/EHT are also available. + * @NL80211_ATTR_DISABLE_UHR: Force UHR capable interfaces to disable + * this feature during association. This is a flag attribute. + * Currently only supported in mac80211 drivers. + * + * @NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP: u32 attribute specifying + * the signal interference bitmap detected on the operating bandwidth for + * %NL80211_CMD_INCUMBENT_SIGNAL_DETECT. Each bit represents a 20 MHz + * segment, lowest bit corresponds to the lowest 20 MHz segment, in the + * operating bandwidth where the interference is detected. Punctured + * sub-channels are included in the bitmap structure; however, since + * interference detection is not performed on these sub-channels, their + * corresponding bits are consistently set to zero. + * + * @NL80211_ATTR_UHR_OPERATION: Full UHR Operation element, as it appears in + * association response etc., since it's abridged in the beacon. Used + * for START_AP etc. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -3541,6 +3573,15 @@ enum nl80211_attrs { NL80211_ATTR_S1G_PRIMARY_2MHZ, + NL80211_ATTR_EPP_PEER, + + NL80211_ATTR_UHR_CAPABILITY, + NL80211_ATTR_DISABLE_UHR, + + NL80211_ATTR_INCUMBENT_SIGNAL_INTERFERENCE_BITMAP, + + NL80211_ATTR_UHR_OPERATION, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, @@ -3893,6 +3934,12 @@ enum nl80211_eht_ru_alloc { * @NL80211_RATE_INFO_4_MHZ_WIDTH: 4 MHz S1G rate * @NL80211_RATE_INFO_8_MHZ_WIDTH: 8 MHz S1G rate * @NL80211_RATE_INFO_16_MHZ_WIDTH: 16 MHz S1G rate + * @NL80211_RATE_INFO_UHR_MCS: UHR MCS index (u8, 0-15, 17, 19, 20, 23) + * Note that the other EHT attributes (such as @NL80211_RATE_INFO_EHT_NSS) + * are used in conjunction with this where applicable + * @NL80211_RATE_INFO_UHR_ELR: UHR ELR flag, which restricts NSS to 1, + * MCS to 0 or 1, and GI to %NL80211_RATE_INFO_EHT_GI_1_6. + * @NL80211_RATE_INFO_UHR_IM: UHR Interference Mitigation flag * @__NL80211_RATE_INFO_AFTER_LAST: internal use */ enum nl80211_rate_info { @@ -3926,6 +3973,9 @@ enum nl80211_rate_info { NL80211_RATE_INFO_4_MHZ_WIDTH, NL80211_RATE_INFO_8_MHZ_WIDTH, NL80211_RATE_INFO_16_MHZ_WIDTH, + NL80211_RATE_INFO_UHR_MCS, + NL80211_RATE_INFO_UHR_ELR, + NL80211_RATE_INFO_UHR_IM, /* keep last */ __NL80211_RATE_INFO_AFTER_LAST, @@ -4248,6 +4298,10 @@ enum nl80211_mpath_info { * capabilities element * @NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE: EHT PPE thresholds information as * defined in EHT capabilities element + * @NL80211_BAND_IFTYPE_ATTR_UHR_CAP_MAC: UHR MAC capabilities as in UHR + * capabilities element + * @NL80211_BAND_IFTYPE_ATTR_UHR_CAP_PHY: UHR PHY capabilities as in UHR + * capabilities element * @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use * @NL80211_BAND_IFTYPE_ATTR_MAX: highest band attribute currently defined */ @@ -4265,6 +4319,8 @@ enum nl80211_band_iftype_attr { NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PHY, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_MCS_SET, NL80211_BAND_IFTYPE_ATTR_EHT_CAP_PPE, + NL80211_BAND_IFTYPE_ATTR_UHR_CAP_MAC, + NL80211_BAND_IFTYPE_ATTR_UHR_CAP_PHY, /* keep last */ __NL80211_BAND_IFTYPE_ATTR_AFTER_LAST, @@ -4444,6 +4500,15 @@ enum nl80211_wmm_rule { * channel in current regulatory domain. * @NL80211_FREQUENCY_ATTR_NO_16MHZ: 16 MHz operation is not allowed on this * channel in current regulatory domain. + * @NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY: Channel is not permitted for use + * as a primary channel. Does not prevent the channel from existing + * as a non-primary subchannel. Only applicable to S1G channels. + * @NL80211_FREQUENCY_ATTR_NO_UHR: UHR operation is not allowed on this channel + * in current regulatory domain. + * @NL80211_FREQUENCY_ATTR_CAC_START_TIME: Channel Availability Check (CAC) + * start time (CLOCK_BOOTTIME, nanoseconds). Only present when CAC is + * currently in progress on this channel. + * @NL80211_FREQUENCY_ATTR_PAD: attribute used for padding for 64-bit alignment * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number * currently defined * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use @@ -4492,6 +4557,10 @@ enum nl80211_frequency_attr { NL80211_FREQUENCY_ATTR_NO_4MHZ, NL80211_FREQUENCY_ATTR_NO_8MHZ, NL80211_FREQUENCY_ATTR_NO_16MHZ, + NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY, + NL80211_FREQUENCY_ATTR_NO_UHR, + NL80211_FREQUENCY_ATTR_CAC_START_TIME, + NL80211_FREQUENCY_ATTR_PAD, /* keep last */ __NL80211_FREQUENCY_ATTR_AFTER_LAST, @@ -4705,6 +4774,7 @@ enum nl80211_sched_scan_match_attr { * despite NO_IR configuration. * @NL80211_RRF_ALLOW_20MHZ_ACTIVITY: Allow activity in 20 MHz bandwidth, * despite NO_IR configuration. + * @NL80211_RRF_NO_UHR: UHR operation not allowed */ enum nl80211_reg_rule_flags { NL80211_RRF_NO_OFDM = 1 << 0, @@ -4731,6 +4801,7 @@ enum nl80211_reg_rule_flags { NL80211_RRF_NO_6GHZ_AFC_CLIENT = 1 << 23, NL80211_RRF_ALLOW_6GHZ_VLP_AP = 1 << 24, NL80211_RRF_ALLOW_20MHZ_ACTIVITY = 1 << 25, + NL80211_RRF_NO_UHR = 1 << 26, }; #define NL80211_RRF_PASSIVE_SCAN NL80211_RRF_NO_IR @@ -5425,6 +5496,9 @@ enum nl80211_bss_status { * @NL80211_AUTHTYPE_FILS_SK: Fast Initial Link Setup shared key * @NL80211_AUTHTYPE_FILS_SK_PFS: Fast Initial Link Setup shared key with PFS * @NL80211_AUTHTYPE_FILS_PK: Fast Initial Link Setup public key + * @NL80211_AUTHTYPE_EPPKE: Enhanced Privacy Protection Key Exchange + * @NL80211_AUTHTYPE_IEEE8021X: IEEE 802.1X authentication utilizing + * Authentication frames * @__NL80211_AUTHTYPE_NUM: internal * @NL80211_AUTHTYPE_MAX: maximum valid auth algorithm * @NL80211_AUTHTYPE_AUTOMATIC: determine automatically (if necessary by @@ -5440,6 +5514,8 @@ enum nl80211_auth_type { NL80211_AUTHTYPE_FILS_SK, NL80211_AUTHTYPE_FILS_SK_PFS, NL80211_AUTHTYPE_FILS_PK, + NL80211_AUTHTYPE_EPPKE, + NL80211_AUTHTYPE_IEEE8021X, /* keep last */ __NL80211_AUTHTYPE_NUM, @@ -6744,6 +6820,20 @@ enum nl80211_feature_flags { * @NL80211_EXT_FEATURE_BEACON_RATE_EHT: Driver supports beacon rate * configuration (AP/mesh) with EHT rates. * + * @NL80211_EXT_FEATURE_EPPKE: Driver supports Enhanced Privacy Protection + * Key Exchange (EPPKE) with user space SME (NL80211_CMD_AUTHENTICATE) + * in non-AP STA mode. + * + * @NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION: This specifies that the + * driver supports encryption of (Re)Association Request and Response + * frames in both non‑AP STA and AP mode as specified in + * "IEEE P802.11bi/D3.0, 12.16.6". + * + * @NL80211_EXT_FEATURE_IEEE8021X_AUTH: Driver supports IEEE 802.1X + * authentication utilizing Authentication frames with user space SME + * (NL80211_CMD_AUTHENTICATE) in non-AP STA mode, as specified in + * "IEEE P802.11bi/D4.0, 12.16.5". + * * @NUM_NL80211_EXT_FEATURES: number of extended features. * @MAX_NL80211_EXT_FEATURES: highest extended feature index. */ @@ -6820,6 +6910,9 @@ enum nl80211_ext_feature_index { NL80211_EXT_FEATURE_DFS_CONCURRENT, NL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT, NL80211_EXT_FEATURE_BEACON_RATE_EHT, + NL80211_EXT_FEATURE_EPPKE, + NL80211_EXT_FEATURE_ASSOC_FRAME_ENCRYPTION, + NL80211_EXT_FEATURE_IEEE8021X_AUTH, /* add new features before the definition below */ NUM_NL80211_EXT_FEATURES, @@ -7432,6 +7525,8 @@ enum nl80211_nan_band_conf_attributes { * address that can take values from 50-6F-9A-01-00-00 to * 50-6F-9A-01-FF-FF. This attribute is optional. If not present, * a random Cluster ID will be chosen. + * This attribute will be ignored in NL80211_CMD_CHANGE_NAN_CONFIG + * since after NAN was started, the cluster ID can no longer change. * @NL80211_NAN_CONF_EXTRA_ATTRS: Additional NAN attributes to be * published in the beacons. This is an optional byte array. * @NL80211_NAN_CONF_VENDOR_ELEMS: Vendor-specific elements that will @@ -7766,6 +7861,30 @@ enum nl80211_peer_measurement_attrs { * trigger based ranging measurement is supported * @NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED: flag attribute indicating * if non-trigger-based ranging measurement is supported + * @NL80211_PMSR_FTM_CAPA_ATTR_6GHZ_SUPPORT: flag attribute indicating if + * ranging on the 6 GHz band is supported + * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_LTF_REP: u32 attribute indicating + * the maximum number of LTF repetitions the device can transmit in the + * preamble of the ranging NDP (zero means only one LTF, no repetitions) + * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_LTF_REP: u32 attribute indicating + * the maximum number of LTF repetitions the device can receive in the + * preamble of the ranging NDP (zero means only one LTF, no repetitions) + * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_STS: u32 attribute indicating + * the maximum number of space-time streams supported for ranging NDP TX + * (zero-based) + * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_STS: u32 attribute indicating + * the maximum number of space-time streams supported for ranging NDP RX + * (zero-based) + * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_TX: u32 attribute indicating the + * maximum total number of LTFs the device can transmit. The total number + * of LTFs is (number of LTF repetitions) * (number of space-time streams). + * This limits the allowed combinations of LTF repetitions and STS. + * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_RX: u32 attribute indicating the + * maximum total number of LTFs the device can receive. The total number + * of LTFs is (number of LTF repetitions) * (number of space-time streams). + * This limits the allowed combinations of LTF repetitions and STS. + * @NL80211_PMSR_FTM_CAPA_ATTR_RSTA_SUPPORT: flag attribute indicating the + * device supports operating as the RSTA in PMSR FTM request * * @NUM_NL80211_PMSR_FTM_CAPA_ATTR: internal * @NL80211_PMSR_FTM_CAPA_ATTR_MAX: highest attribute number @@ -7783,6 +7902,14 @@ enum nl80211_peer_measurement_ftm_capa { NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST, NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED, NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED, + NL80211_PMSR_FTM_CAPA_ATTR_6GHZ_SUPPORT, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_LTF_REP, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_LTF_REP, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_TX_STS, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_RX_STS, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_TX, + NL80211_PMSR_FTM_CAPA_ATTR_MAX_TOTAL_LTF_RX, + NL80211_PMSR_FTM_CAPA_ATTR_RSTA_SUPPORT, /* keep last */ NUM_NL80211_PMSR_FTM_CAPA_ATTR, @@ -7798,12 +7925,15 @@ enum nl80211_peer_measurement_ftm_capa { * &enum nl80211_preamble), optional for DMG (u32) * @NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP: number of bursts exponent as in * 802.11-2016 9.4.2.168 "Fine Timing Measurement Parameters element" - * (u8, 0-15, optional with default 15 i.e. "no preference") + * (u8, 0-15, optional with default 15 i.e. "no preference". No limit for + * non-EDCA ranging) * @NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD: interval between bursts in units * of 100ms (u16, optional with default 0) * @NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION: burst duration, as in 802.11-2016 * Table 9-257 "Burst Duration field encoding" (u8, 0-15, optional with - * default 15 i.e. "no preference") + * default 15 i.e. "no preference"). For non-EDCA ranging, this is the + * burst duration in milliseconds (optional with default 0, i.e. let the + * device decide). * @NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST: number of successful FTM frames * requested per burst * (u8, 0-31, optional with default 0 i.e. "no preference") @@ -7832,6 +7962,14 @@ enum nl80211_peer_measurement_ftm_capa { * @NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR: optional. The BSS color of the * responder. Only valid if %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED * or %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED is set. + * @NL80211_PMSR_FTM_REQ_ATTR_RSTA: optional. Request to perform the measurement + * as the RSTA (flag). When set, the device is expected to dwell on the + * channel specified in %NL80211_PMSR_PEER_ATTR_CHAN until it receives the + * FTM request from the peer or the timeout specified by + * %NL80211_ATTR_TIMEOUT has expired. + * Only valid if %NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK is set (so the + * RSTA will have the measurement results to report back in the FTM + * response). * * @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal * @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number @@ -7852,6 +7990,7 @@ enum nl80211_peer_measurement_ftm_req { NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED, NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK, NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR, + NL80211_PMSR_FTM_REQ_ATTR_RSTA, /* keep last */ NUM_NL80211_PMSR_FTM_REQ_ATTR, @@ -7936,6 +8075,8 @@ enum nl80211_peer_measurement_ftm_failure_reasons { * 9.4.2.22.1) starting with the Measurement Token, with Measurement * Type 11. * @NL80211_PMSR_FTM_RESP_ATTR_PAD: ignore, for u64/s64 padding only + * @NL80211_PMSR_FTM_RESP_ATTR_BURST_PERIOD: actual burst period used by + * the responder (similar to request, u16) * * @NUM_NL80211_PMSR_FTM_RESP_ATTR: internal * @NL80211_PMSR_FTM_RESP_ATTR_MAX: highest attribute number @@ -7964,6 +8105,7 @@ enum nl80211_peer_measurement_ftm_resp { NL80211_PMSR_FTM_RESP_ATTR_LCI, NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC, NL80211_PMSR_FTM_RESP_ATTR_PAD, + NL80211_PMSR_FTM_RESP_ATTR_BURST_PERIOD, /* keep last */ NUM_NL80211_PMSR_FTM_RESP_ATTR, diff --git a/linux/openvswitch.h b/linux/openvswitch.h index 3092c2c..aa2acdb 100644 --- a/linux/openvswitch.h +++ b/linux/openvswitch.h @@ -70,12 +70,15 @@ enum ovs_datapath_cmd { * set on the datapath port (for OVS_ACTION_ATTR_MISS). Only valid on * %OVS_DP_CMD_NEW requests. A value of zero indicates that upcalls should * not be sent. + * @OVS_DP_ATTR_MASKS_CACHE_SIZE: Number of the entries in the flow table + * masks cache. * @OVS_DP_ATTR_PER_CPU_PIDS: Per-cpu array of PIDs for upcalls when * OVS_DP_F_DISPATCH_UPCALL_PER_CPU feature is set. * @OVS_DP_ATTR_STATS: Statistics about packets that have passed through the * datapath. Always present in notifications. * @OVS_DP_ATTR_MEGAFLOW_STATS: Statistics about mega flow masks usage for the * datapath. Always present in notifications. + * @OVS_DP_ATTR_USER_FEATURES: OVS_DP_F_* flags. * @OVS_DP_ATTR_IFINDEX: Interface index for a new datapath netdev. Only * valid for %OVS_DP_CMD_NEW requests. * @@ -83,18 +86,23 @@ enum ovs_datapath_cmd { * payload for %OVS_DP_* commands. */ enum ovs_datapath_attr { + /* private: */ OVS_DP_ATTR_UNSPEC, + /* public: */ OVS_DP_ATTR_NAME, /* name of dp_ifindex netdev */ OVS_DP_ATTR_UPCALL_PID, /* Netlink PID to receive upcalls */ OVS_DP_ATTR_STATS, /* struct ovs_dp_stats */ OVS_DP_ATTR_MEGAFLOW_STATS, /* struct ovs_dp_megaflow_stats */ OVS_DP_ATTR_USER_FEATURES, /* OVS_DP_F_* */ + /* private: */ OVS_DP_ATTR_PAD, + /* public: */ OVS_DP_ATTR_MASKS_CACHE_SIZE, OVS_DP_ATTR_PER_CPU_PIDS, /* Netlink PIDS to receive upcalls in * per-cpu dispatch mode */ OVS_DP_ATTR_IFINDEX, + /* private: */ __OVS_DP_ATTR_MAX }; @@ -181,6 +189,7 @@ enum ovs_packet_cmd { * %OVS_USERSPACE_ATTR_EGRESS_TUN_PORT attribute, which is sent only if the * output port is actually a tunnel port. Contains the output tunnel key * extracted from the packet as nested %OVS_TUNNEL_KEY_ATTR_* attributes. + * @OVS_PACKET_ATTR_PROBE: Packet operation is a feature probe. * @OVS_PACKET_ATTR_MRU: Present for an %OVS_PACKET_CMD_ACTION and * @OVS_PACKET_ATTR_LEN: Packet size before truncation. * %OVS_PACKET_ATTR_USERSPACE action specify the Maximum received fragment @@ -196,21 +205,26 @@ enum ovs_packet_cmd { * payload for %OVS_PACKET_* commands. */ enum ovs_packet_attr { + /* private: */ OVS_PACKET_ATTR_UNSPEC, + /* public: */ OVS_PACKET_ATTR_PACKET, /* Packet data. */ OVS_PACKET_ATTR_KEY, /* Nested OVS_KEY_ATTR_* attributes. */ OVS_PACKET_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ OVS_PACKET_ATTR_USERDATA, /* OVS_ACTION_ATTR_USERSPACE arg. */ OVS_PACKET_ATTR_EGRESS_TUN_KEY, /* Nested OVS_TUNNEL_KEY_ATTR_* attributes. */ + /* private: */ OVS_PACKET_ATTR_UNUSED1, OVS_PACKET_ATTR_UNUSED2, + /* public: */ OVS_PACKET_ATTR_PROBE, /* Packet operation is a feature probe, error logging should be suppressed. */ OVS_PACKET_ATTR_MRU, /* Maximum received IP fragment size. */ OVS_PACKET_ATTR_LEN, /* Packet size before truncation. */ OVS_PACKET_ATTR_HASH, /* Packet hash. */ OVS_PACKET_ATTR_UPCALL_PID, /* u32 Netlink PID. */ + /* private: */ __OVS_PACKET_ATTR_MAX }; @@ -257,6 +271,11 @@ enum ovs_vport_type { * upcalls should not be sent. * @OVS_VPORT_ATTR_STATS: A &struct ovs_vport_stats giving statistics for * packets sent or received through the vport. + * @OVS_VPORT_ATTR_IFINDEX: Provides the ifindex of a vport, or sets the desired + * ifindex while creating a new vport with type %OVS_VPORT_TYPE_INTERNAL. + * @OVS_VPORT_ATTR_NETNSID: Provides the netns id of the vport if it's not local. + * @OVS_VPORT_ATTR_UPCALL_STATS: Provides upcall statistics for a vport. + * Contains nested %OVS_VPORT_UPCALL_ATTR_* attributes. * * These attributes follow the &struct ovs_header within the Generic Netlink * payload for %OVS_VPORT_* commands. @@ -272,7 +291,9 @@ enum ovs_vport_type { * ovs_header plus %OVS_VPORT_ATTR_PORT_NO determine the vport. */ enum ovs_vport_attr { + /* private: */ OVS_VPORT_ATTR_UNSPEC, + /* public: */ OVS_VPORT_ATTR_PORT_NO, /* u32 port number within datapath */ OVS_VPORT_ATTR_TYPE, /* u32 OVS_VPORT_TYPE_* constant. */ OVS_VPORT_ATTR_NAME, /* string name, up to IFNAMSIZ bytes long */ @@ -280,23 +301,27 @@ enum ovs_vport_attr { OVS_VPORT_ATTR_UPCALL_PID, /* array of u32 Netlink socket PIDs for */ /* receiving upcalls */ OVS_VPORT_ATTR_STATS, /* struct ovs_vport_stats */ + /* private: */ OVS_VPORT_ATTR_PAD, + /* public: */ OVS_VPORT_ATTR_IFINDEX, OVS_VPORT_ATTR_NETNSID, OVS_VPORT_ATTR_UPCALL_STATS, + /* private: */ __OVS_VPORT_ATTR_MAX }; #define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) /** - * enum ovs_vport_upcall_attr - attributes for %OVS_VPORT_UPCALL* commands - * @OVS_VPORT_UPCALL_SUCCESS: 64-bit upcall success packets. - * @OVS_VPORT_UPCALL_FAIL: 64-bit upcall fail packets. + * enum ovs_vport_upcall_attr - attributes for %OVS_VPORT_ATTR_UPCALL_STATS + * @OVS_VPORT_UPCALL_ATTR_SUCCESS: 64-bit upcall success packets. + * @OVS_VPORT_UPCALL_ATTR_FAIL: 64-bit upcall fail packets. */ enum ovs_vport_upcall_attr { OVS_VPORT_UPCALL_ATTR_SUCCESS, OVS_VPORT_UPCALL_ATTR_FAIL, + /* private: */ __OVS_VPORT_UPCALL_ATTR_MAX }; @@ -431,6 +456,7 @@ enum ovs_frag_type { OVS_FRAG_TYPE_NONE, OVS_FRAG_TYPE_FIRST, OVS_FRAG_TYPE_LATER, + /* private: */ __OVS_FRAG_TYPE_MAX }; @@ -604,6 +630,8 @@ struct ovs_nsh_key_md1 { * a wildcarded match. Omitting attribute is treated as wildcarding all * corresponding fields. Optional for all requests. If not present, * all flow key bits are exact match bits. + * @OVS_FLOW_ATTR_PROBE: Flow operation is a feature probe, error logging + * should be suppressed. * @OVS_FLOW_ATTR_UFID: A value between 1-16 octets specifying a unique * identifier for the flow. Causes the flow to be indexed by this value rather * than the value of the %OVS_FLOW_ATTR_KEY attribute. Optional for all @@ -617,7 +645,9 @@ struct ovs_nsh_key_md1 { * payload for %OVS_FLOW_* commands. */ enum ovs_flow_attr { + /* private: */ OVS_FLOW_ATTR_UNSPEC, + /* public: */ OVS_FLOW_ATTR_KEY, /* Sequence of OVS_KEY_ATTR_* attributes. */ OVS_FLOW_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ OVS_FLOW_ATTR_STATS, /* struct ovs_flow_stats. */ @@ -629,13 +659,14 @@ enum ovs_flow_attr { * logging should be suppressed. */ OVS_FLOW_ATTR_UFID, /* Variable length unique flow identifier. */ OVS_FLOW_ATTR_UFID_FLAGS,/* u32 of OVS_UFID_F_*. */ + /* private: */ OVS_FLOW_ATTR_PAD, __OVS_FLOW_ATTR_MAX }; #define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1) -/** +/* * Omit attributes for notifications. * * If a datapath request contains an %OVS_UFID_F_OMIT_* flag, then the datapath @@ -653,17 +684,23 @@ enum ovs_flow_attr { * fractions of packets. * @OVS_SAMPLE_ATTR_ACTIONS: Set of actions to execute in sampling event. * Actions are passed as nested attributes. + * @OVS_SAMPLE_ATTR_ARG: For in-kernel use, passing &struct sample_arg + * derived from other attributes. * * Executes the specified actions with the given probability on a per-packet * basis. Nested actions will be able to access the probability value of the * parent @OVS_ACTION_ATTR_SAMPLE. */ enum ovs_sample_attr { + /* private: */ OVS_SAMPLE_ATTR_UNSPEC, + /* public: */ OVS_SAMPLE_ATTR_PROBABILITY, /* u32 number */ OVS_SAMPLE_ATTR_ACTIONS, /* Nested OVS_ACTION_ATTR_* attributes. */ + /* private: */ __OVS_SAMPLE_ATTR_MAX, + /* public: */ #ifdef __KERNEL__ OVS_SAMPLE_ATTR_ARG /* struct sample_arg */ #endif @@ -693,12 +730,15 @@ struct sample_arg { * @OVS_USERSPACE_ATTR_ACTIONS: If present, send actions with upcall. */ enum ovs_userspace_attr { + /* private: */ OVS_USERSPACE_ATTR_UNSPEC, + /* public: */ OVS_USERSPACE_ATTR_PID, /* u32 Netlink PID to receive upcalls. */ OVS_USERSPACE_ATTR_USERDATA, /* Optional user-specified cookie. */ OVS_USERSPACE_ATTR_EGRESS_TUN_PORT, /* Optional, u32 output port * to get tunnel info. */ OVS_USERSPACE_ATTR_ACTIONS, /* Optional flag to get actions. */ + /* private: */ __OVS_USERSPACE_ATTR_MAX }; @@ -819,7 +859,9 @@ struct ovs_action_hash { * @OVS_CT_ATTR_TIMEOUT: Variable length string defining conntrack timeout. */ enum ovs_ct_attr { + /* private: */ OVS_CT_ATTR_UNSPEC, + /* public: */ OVS_CT_ATTR_COMMIT, /* No argument, commits connection. */ OVS_CT_ATTR_ZONE, /* u16 zone id. */ OVS_CT_ATTR_MARK, /* mark to associate with this connection. */ @@ -831,6 +873,7 @@ enum ovs_ct_attr { OVS_CT_ATTR_EVENTMASK, /* u32 mask of IPCT_* events. */ OVS_CT_ATTR_TIMEOUT, /* Associate timeout with this connection for * fine-grain timeout tuning. */ + /* private: */ __OVS_CT_ATTR_MAX }; @@ -859,7 +902,9 @@ enum ovs_ct_attr { * @OVS_NAT_ATTR_PROTO_RANDOM: Flag for fully randomized L4 port mapping */ enum ovs_nat_attr { + /* private: */ OVS_NAT_ATTR_UNSPEC, + /* public: */ OVS_NAT_ATTR_SRC, OVS_NAT_ATTR_DST, OVS_NAT_ATTR_IP_MIN, @@ -869,38 +914,44 @@ enum ovs_nat_attr { OVS_NAT_ATTR_PERSISTENT, OVS_NAT_ATTR_PROTO_HASH, OVS_NAT_ATTR_PROTO_RANDOM, + /* private: */ __OVS_NAT_ATTR_MAX, }; #define OVS_NAT_ATTR_MAX (__OVS_NAT_ATTR_MAX - 1) -/* +/** * struct ovs_action_push_eth - %OVS_ACTION_ATTR_PUSH_ETH action argument. * @addresses: Source and destination MAC addresses. - * @eth_type: Ethernet type */ struct ovs_action_push_eth { struct ovs_key_ethernet addresses; }; -/* +/** * enum ovs_check_pkt_len_attr - Attributes for %OVS_ACTION_ATTR_CHECK_PKT_LEN. * * @OVS_CHECK_PKT_LEN_ATTR_PKT_LEN: u16 Packet length to check for. * @OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER: Nested OVS_ACTION_ATTR_* * actions to apply if the packer length is greater than the specified * length in the attr - OVS_CHECK_PKT_LEN_ATTR_PKT_LEN. - * @OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL - Nested OVS_ACTION_ATTR_* + * @OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL: Nested OVS_ACTION_ATTR_* * actions to apply if the packer length is lesser or equal to the specified * length in the attr - OVS_CHECK_PKT_LEN_ATTR_PKT_LEN. + * @OVS_CHECK_PKT_LEN_ATTR_ARG: For in-kernel use, passing &struct + * check_pkt_len_arg derived from other attributes. */ enum ovs_check_pkt_len_attr { + /* private: */ OVS_CHECK_PKT_LEN_ATTR_UNSPEC, + /* public: */ OVS_CHECK_PKT_LEN_ATTR_PKT_LEN, OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER, OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL, + /* private: */ __OVS_CHECK_PKT_LEN_ATTR_MAX, + /* public: */ #ifdef __KERNEL__ OVS_CHECK_PKT_LEN_ATTR_ARG /* struct check_pkt_len_arg */ #endif @@ -968,6 +1019,9 @@ enum ovs_psample_attr { * from the packet. * @OVS_ACTION_ATTR_SAMPLE: Probabilitically executes actions, as specified in * the nested %OVS_SAMPLE_ATTR_* attributes. + * @OVS_ACTION_ATTR_RECIRC: Recirculate the clone of the packet through the + * datapath with the new id (u32 recirc_id). + * @OVS_ACTION_ATTR_HASH: Compute the packet hash, using &struct ovs_action_hash. * @OVS_ACTION_ATTR_PUSH_MPLS: Push a new MPLS label stack entry onto the * top of the packets MPLS label stack. Set the ethertype of the * encapsulating frame to either %ETH_P_MPLS_UC or %ETH_P_MPLS_MC to @@ -997,6 +1051,8 @@ enum ovs_psample_attr { * start of the packet or at the start of the l3 header depending on the value * of l3 tunnel flag in the tun_flags field of OVS_ACTION_ATTR_ADD_MPLS * argument. + * @OVS_ACTION_ATTR_DEC_TTL: Decrement TTL or hop limit of the packet. Execute + * nested %OVS_DEC_TTL_ATTR_* actions if the value is less or equal to 1. * @OVS_ACTION_ATTR_DROP: Explicit drop action. * @OVS_ACTION_ATTR_PSAMPLE: Send a sample of the packet to external observers * via psample. @@ -1010,7 +1066,9 @@ enum ovs_psample_attr { */ enum ovs_action_attr { + /* private: */ OVS_ACTION_ATTR_UNSPEC, + /* public: */ OVS_ACTION_ATTR_OUTPUT, /* u32 port number. */ OVS_ACTION_ATTR_USERSPACE, /* Nested OVS_USERSPACE_ATTR_*. */ OVS_ACTION_ATTR_SET, /* One nested OVS_KEY_ATTR_*. */ @@ -1040,9 +1098,11 @@ enum ovs_action_attr { OVS_ACTION_ATTR_DROP, /* u32 error code. */ OVS_ACTION_ATTR_PSAMPLE, /* Nested OVS_PSAMPLE_ATTR_*. */ + /* private: */ __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted * from userspace. */ + /* public: */ #ifdef __KERNEL__ OVS_ACTION_ATTR_SET_TO_MASKED, /* Kernel module internal masked * set action converted from diff --git a/linux/ovpn.h b/linux/ovpn.h index 680d152..0669009 100644 --- a/linux/ovpn.h +++ b/linux/ovpn.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/ovpn.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_OVPN_H #define _UAPI_LINUX_OVPN_H @@ -54,6 +55,7 @@ enum { OVPN_A_PEER_LINK_TX_BYTES, OVPN_A_PEER_LINK_RX_PACKETS, OVPN_A_PEER_LINK_TX_PACKETS, + OVPN_A_PEER_TX_ID, __OVPN_A_PEER_MAX, OVPN_A_PEER_MAX = (__OVPN_A_PEER_MAX - 1) @@ -99,6 +101,7 @@ enum { OVPN_CMD_KEY_SWAP, OVPN_CMD_KEY_SWAP_NTF, OVPN_CMD_KEY_DEL, + OVPN_CMD_PEER_FLOAT_NTF, __OVPN_CMD_MAX, OVPN_CMD_MAX = (__OVPN_CMD_MAX - 1) diff --git a/linux/pkt_sched.h b/linux/pkt_sched.h index c2da76e..66e8072 100644 --- a/linux/pkt_sched.h +++ b/linux/pkt_sched.h @@ -1036,6 +1036,7 @@ enum { TCA_CAKE_STATS_DROP_NEXT_US, TCA_CAKE_STATS_P_DROP, TCA_CAKE_STATS_BLUE_TIMER_US, + TCA_CAKE_STATS_ACTIVE_QUEUES, __TCA_CAKE_STATS_MAX }; #define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1) diff --git a/linux/psp.h b/linux/psp.h index 607c42c..a3a3364 100644 --- a/linux/psp.h +++ b/linux/psp.h @@ -2,6 +2,7 @@ /* Do not edit directly, auto-generated from: */ /* Documentation/netlink/specs/psp.yaml */ /* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ #ifndef _UAPI_LINUX_PSP_H #define _UAPI_LINUX_PSP_H @@ -45,6 +46,23 @@ enum { PSP_A_KEYS_MAX = (__PSP_A_KEYS_MAX - 1) }; +enum { + PSP_A_STATS_DEV_ID = 1, + PSP_A_STATS_KEY_ROTATIONS, + PSP_A_STATS_STALE_EVENTS, + PSP_A_STATS_RX_PACKETS, + PSP_A_STATS_RX_BYTES, + PSP_A_STATS_RX_AUTH_FAIL, + PSP_A_STATS_RX_ERROR, + PSP_A_STATS_RX_BAD, + PSP_A_STATS_TX_PACKETS, + PSP_A_STATS_TX_BYTES, + PSP_A_STATS_TX_ERROR, + + __PSP_A_STATS_MAX, + PSP_A_STATS_MAX = (__PSP_A_STATS_MAX - 1) +}; + enum { PSP_CMD_DEV_GET = 1, PSP_CMD_DEV_ADD_NTF, @@ -55,6 +73,7 @@ enum { PSP_CMD_KEY_ROTATE_NTF, PSP_CMD_RX_ASSOC, PSP_CMD_TX_ASSOC, + PSP_CMD_GET_STATS, __PSP_CMD_MAX, PSP_CMD_MAX = (__PSP_CMD_MAX - 1) diff --git a/linux/typelimits.h b/linux/typelimits.h new file mode 100644 index 0000000..8166c63 --- /dev/null +++ b/linux/typelimits.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _UAPI_LINUX_TYPELIMITS_H +#define _UAPI_LINUX_TYPELIMITS_H + +#define __KERNEL_INT_MAX ((int)(~0U >> 1)) +#define __KERNEL_INT_MIN (-__KERNEL_INT_MAX - 1) + +#endif /* _UAPI_LINUX_TYPELIMITS_H */ diff --git a/linux/wireguard.h b/linux/wireguard.h new file mode 100644 index 0000000..a100b97 --- /dev/null +++ b/linux/wireguard.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* Documentation/netlink/specs/wireguard.yaml */ +/* YNL-GEN uapi header */ +/* To regenerate run: tools/net/ynl/ynl-regen.sh */ + +#ifndef _UAPI_LINUX_WIREGUARD_H +#define _UAPI_LINUX_WIREGUARD_H + +#define WG_GENL_NAME "wireguard" +#define WG_GENL_VERSION 1 + +#define WG_KEY_LEN 32 + +enum wgdevice_flag { + WGDEVICE_F_REPLACE_PEERS = 1, +}; + +enum wgpeer_flag { + WGPEER_F_REMOVE_ME = 1, + WGPEER_F_REPLACE_ALLOWEDIPS = 2, + WGPEER_F_UPDATE_ONLY = 4, +}; + +enum wgallowedip_flag { + WGALLOWEDIP_F_REMOVE_ME = 1, +}; + +enum wgdevice_attribute { + WGDEVICE_A_UNSPEC, + WGDEVICE_A_IFINDEX, + WGDEVICE_A_IFNAME, + WGDEVICE_A_PRIVATE_KEY, + WGDEVICE_A_PUBLIC_KEY, + WGDEVICE_A_FLAGS, + WGDEVICE_A_LISTEN_PORT, + WGDEVICE_A_FWMARK, + WGDEVICE_A_PEERS, + + __WGDEVICE_A_LAST +}; +#define WGDEVICE_A_MAX (__WGDEVICE_A_LAST - 1) + +enum wgpeer_attribute { + WGPEER_A_UNSPEC, + WGPEER_A_PUBLIC_KEY, + WGPEER_A_PRESHARED_KEY, + WGPEER_A_FLAGS, + WGPEER_A_ENDPOINT, + WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL, + WGPEER_A_LAST_HANDSHAKE_TIME, + WGPEER_A_RX_BYTES, + WGPEER_A_TX_BYTES, + WGPEER_A_ALLOWEDIPS, + WGPEER_A_PROTOCOL_VERSION, + + __WGPEER_A_LAST +}; +#define WGPEER_A_MAX (__WGPEER_A_LAST - 1) + +enum wgallowedip_attribute { + WGALLOWEDIP_A_UNSPEC, + WGALLOWEDIP_A_FAMILY, + WGALLOWEDIP_A_IPADDR, + WGALLOWEDIP_A_CIDR_MASK, + WGALLOWEDIP_A_FLAGS, + + __WGALLOWEDIP_A_LAST +}; +#define WGALLOWEDIP_A_MAX (__WGALLOWEDIP_A_LAST - 1) + +enum wg_cmd { + WG_CMD_GET_DEVICE, + WG_CMD_SET_DEVICE, + + __WG_CMD_MAX +}; +#define WG_CMD_MAX (__WG_CMD_MAX - 1) + +#endif /* _UAPI_LINUX_WIREGUARD_H */ diff --git a/samples/psp b/samples/psp new file mode 100755 index 0000000000000000000000000000000000000000..e716f1333c2f201b2cf76646f3ad32b3eac8aea4 GIT binary patch literal 164320 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 Ms!7%Z*3aPo0cbw$%m4rY literal 0 HcmV?d00001 diff --git a/update-from-kernel.sh b/update-from-kernel.sh index 2b4c7a8..44179dc 100755 --- a/update-from-kernel.sh +++ b/update-from-kernel.sh @@ -15,7 +15,7 @@ cp -v ${KSRC}/tools/net/ynl/Makefile.deps ./ sed -i 's@^UAPI_PATH:=.*@UAPI_PATH:=../@' Makefile.deps mkdir -p include/linux/ -for hdr in $(cat Makefile.deps | sed -n 's/.*,\([^,]*\.h\))/\1/p'); do +for hdr in $(cat Makefile.deps | sed -n 's/.*,\([^,]*\.h\)).*/\1/p'); do cp -v ${KSRC}/include/uapi/linux/$hdr ./linux/ done