# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
---
name: netdev

doc:
  netdev configuration over generic netlink.

definitions:
  -
    type: flags
    name: xdp-act
    render-max: true
    entries:
      -
        name: basic
        doc:
          XDP features set supported by all drivers
          (XDP_ABORTED, XDP_DROP, XDP_PASS, XDP_TX)
      -
        name: redirect
        doc:
          The netdev supports XDP_REDIRECT
      -
        name: ndo-xmit
        doc:
          This feature informs if netdev implements ndo_xdp_xmit callback.
      -
        name: xsk-zerocopy
        doc:
          This feature informs if netdev supports AF_XDP in zero copy mode.
      -
        name: hw-offload
        doc:
          This feature informs if netdev supports XDP hw offloading.
      -
        name: rx-sg
        doc:
          This feature informs if netdev implements non-linear XDP buffer
          support in the driver napi callback.
      -
        name: ndo-xmit-sg
        doc:
          This feature informs if netdev implements non-linear XDP buffer
          support in ndo_xdp_xmit callback.
  -
    type: flags
    name: xdp-rx-metadata
    entries:
      -
        name: timestamp
        doc: |
          Device is capable of exposing receive HW timestamp via
          bpf_xdp_metadata_rx_timestamp().
      -
        name: hash
        doc: |
          Device is capable of exposing receive packet hash via
          bpf_xdp_metadata_rx_hash().
      -
        name: vlan-tag
        doc: |
          Device is capable of exposing receive packet VLAN tag via
          bpf_xdp_metadata_rx_vlan_tag().
  -
    type: flags
    name: xsk-flags
    entries:
      -
        name: tx-timestamp
        doc:
          HW timestamping egress packets is supported by the driver.
      -
        name: tx-checksum
        doc:
          L3 checksum HW offload is supported by the driver.
      -
        name: tx-launch-time-fifo
        doc:
          Launch time HW offload is supported by the driver.
  -
    name: queue-type
    type: enum
    entries: [rx, tx]
  -
    name: qstats-scope
    type: flags
    entries: [queue]
  -
    name: napi-threaded
    type: enum
    entries: [disabled, enabled]

attribute-sets:
  -
    name: dev
    attributes:
      -
        name: ifindex
        doc: netdev ifindex
        type: u32
        checks:
          min: 1
      -
        name: pad
        type: pad
      -
        name: xdp-features
        doc: Bitmask of enabled xdp-features.
        type: u64
        enum: xdp-act
      -
        name: xdp-zc-max-segs
        doc: max fragment count supported by ZC driver
        type: u32
        checks:
          min: 1
      -
        name: xdp-rx-metadata-features
        doc: Bitmask of supported XDP receive metadata features.
             See Documentation/networking/xdp-rx-metadata.rst for more details.
        type: u64
        enum: xdp-rx-metadata
      -
        name: xsk-features
        doc: Bitmask of enabled AF_XDP features.
        type: u64
        enum: xsk-flags
  -
    name: io-uring-provider-info
    attributes: []
  -
    name: page-pool
    attributes:
      -
        name: id
        doc: Unique ID of a Page Pool instance.
        type: uint
        checks:
          min: 1
          max: u32-max
      -
        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
          which got destroyed already (page pools may outlast their netdevs
          because they wait for all memory to be returned).
        type: u32
        checks:
          min: 1
          max: s32-max
      -
        name: napi-id
        doc: Id of NAPI using this Page Pool instance.
        type: uint
        checks:
          min: 1
          max: u32-max
      -
        name: inflight
        type: uint
        doc: |
          Number of outstanding references to this page pool (allocated
          but yet to be freed pages). Allocated pages may be held in
          socket receive queues, driver receive ring, page pool recycling
          ring, the page pool cache, etc.
      -
        name: inflight-mem
        type: uint
        doc: |
          Amount of memory held by inflight pages.
      -
        name: detach-time
        type: uint
        doc: |
          Seconds in CLOCK_BOOTTIME of when Page Pool was detached by
          the driver. Once detached Page Pool can no longer be used to
          allocate memory.
          Page Pools wait for all the memory allocated from them to be freed
          before truly disappearing. "Detached" Page Pools cannot be
          "re-attached", they are just waiting to disappear.
          Attribute is absent if Page Pool has not been detached, and
          can still be used to allocate new memory.
      -
        name: dmabuf
        doc: ID of the dmabuf this page-pool is attached to.
        type: u32
      -
        name: io-uring
        doc: io-uring memory provider information.
        type: nest
        nested-attributes: io-uring-provider-info
  -
    name: page-pool-info
    subset-of: page-pool
    attributes:
      -
        name: id
      -
        name: ifindex
  -
    name: page-pool-stats
    doc: |
      Page pool statistics, see docs for struct page_pool_stats
      for information about individual statistics.
    attributes:
      -
        name: info
        doc: Page pool identifying information.
        type: nest
        nested-attributes: page-pool-info
      -
        name: alloc-fast
        type: uint
        value: 8  # reserve some attr ids in case we need more metadata later
      -
        name: alloc-slow
        type: uint
      -
        name: alloc-slow-high-order
        type: uint
      -
        name: alloc-empty
        type: uint
      -
        name: alloc-refill
        type: uint
      -
        name: alloc-waive
        type: uint
      -
        name: recycle-cached
        type: uint
      -
        name: recycle-cache-full
        type: uint
      -
        name: recycle-ring
        type: uint
      -
        name: recycle-ring-full
        type: uint
      -
        name: recycle-released-refcnt
        type: uint

  -
    name: napi
    attributes:
      -
        name: ifindex
        doc: ifindex of the netdevice to which NAPI instance belongs.
        type: u32
        checks:
          min: 1
      -
        name: id
        doc: ID of the NAPI instance.
        type: u32
      -
        name: irq
        doc: The associated interrupt vector number for the napi
        type: u32
      -
        name: pid
        doc: PID of the napi thread, if NAPI is configured to operate in
             threaded mode. If NAPI is not in threaded mode (i.e. uses normal
             softirq context), the attribute will be absent.
        type: u32
      -
        name: defer-hard-irqs
        doc: The number of consecutive empty polls before IRQ deferral ends
             and hardware IRQs are re-enabled.
        type: u32
        checks:
          max: s32-max
      -
        name: gro-flush-timeout
        doc: The timeout, in nanoseconds, of when to trigger the NAPI watchdog
             timer which schedules NAPI processing. Additionally, a non-zero
             value will also prevent GRO from flushing recent super-frames at
             the end of a NAPI cycle. This may add receive latency in exchange
             for reducing the number of frames processed by the network stack.
        type: uint
      -
        name: irq-suspend-timeout
        doc: The timeout, in nanoseconds, of how long to suspend irq
             processing, if event polling finds events
        type: uint
      -
        name: threaded
        doc: Whether the NAPI is configured to operate in threaded polling
             mode. If this is set to enabled then the NAPI context operates
             in threaded polling mode.
        type: u32
        enum: napi-threaded
  -
    name: xsk-info
    attributes: []
  -
    name: queue
    attributes:
      -
        name: id
        doc: Queue index; most queue types are indexed like a C array, with
             indexes starting at 0 and ending at queue count - 1. Queue indexes
             are scoped to an interface and queue type.
        type: u32
      -
        name: ifindex
        doc: ifindex of the netdevice to which the queue belongs.
        type: u32
        checks:
          min: 1
      -
        name: type
        doc: Queue type as rx, tx. Each queue type defines a separate ID space.
             XDP TX queues allocated in the kernel are not linked to NAPIs and
             thus not listed. AF_XDP queues will have more information set in
             the xsk attribute.
        type: u32
        enum: queue-type
      -
        name: napi-id
        doc: ID of the NAPI instance which services this queue.
        type: u32
      -
        name: dmabuf
        doc: ID of the dmabuf attached to this queue, if any.
        type: u32
      -
        name: io-uring
        doc: io_uring memory provider information.
        type: nest
        nested-attributes: io-uring-provider-info
      -
        name: xsk
        doc: XSK information for this queue, if any.
        type: nest
        nested-attributes: xsk-info
  -
    name: qstats
    doc: |
      Get device statistics, scoped to a device or a queue.
      These statistics extend (and partially duplicate) statistics available
      in struct rtnl_link_stats64.
      Value of the `scope` attribute determines how statistics are
      aggregated. When aggregated for the entire device the statistics
      represent the total number of events since last explicit reset of
      the device (i.e. not a reconfiguration like changing queue count).
      When reported per-queue, however, the statistics may not add
      up to the total number of events, will only be reported for currently
      active objects, and will likely report the number of events since last
      reconfiguration.
    attributes:
      -
        name: ifindex
        doc: ifindex of the netdevice to which stats belong.
        type: u32
        checks:
          min: 1
      -
        name: queue-type
        doc: Queue type as rx, tx, for queue-id.
        type: u32
        enum: queue-type
      -
        name: queue-id
        doc: Queue ID, if stats are scoped to a single queue instance.
        type: u32
      -
        name: scope
        doc: |
          What object type should be used to iterate over the stats.
        type: uint
        enum: qstats-scope
      -
        name: rx-packets
        doc: |
          Number of wire packets successfully received and passed to the stack.
          For drivers supporting XDP, XDP is considered the first layer
          of the stack, so packets consumed by XDP are still counted here.
        type: uint
        value: 8  # reserve some attr ids in case we need more metadata later
      -
        name: rx-bytes
        doc: Successfully received bytes, see `rx-packets`.
        type: uint
      -
        name: tx-packets
        doc: |
          Number of wire packets successfully sent. Packet is considered to be
          successfully sent once it is in device memory (usually this means
          the device has issued a DMA completion for the packet).
        type: uint
      -
        name: tx-bytes
        doc: Successfully sent bytes, see `tx-packets`.
        type: uint
      -
        name: rx-alloc-fail
        doc: |
          Number of times skb or buffer allocation failed on the Rx datapath.
          Allocation failure may, or may not result in a packet drop, depending
          on driver implementation and whether system recovers quickly.
        type: uint
      -
        name: rx-hw-drops
        doc: |
          Number of all packets which entered the device, but never left it,
          including but not limited to: packets dropped due to lack of buffer
          space, processing errors, explicit or implicit policies and packet
          filters.
        type: uint
      -
        name: rx-hw-drop-overruns
        doc: |
          Number of packets dropped due to transient lack of resources, such as
          buffer space, host descriptors etc.
        type: uint
      -
        name: rx-csum-complete
        doc: Number of packets that were marked as CHECKSUM_COMPLETE.
        type: uint
      -
        name: rx-csum-unnecessary
        doc: Number of packets that were marked as CHECKSUM_UNNECESSARY.
        type: uint
      -
        name: rx-csum-none
        doc: Number of packets that were not checksummed by device.
        type: uint
      -
        name: rx-csum-bad
        doc: |
          Number of packets with bad checksum. The packets are not discarded,
          but still delivered to the stack.
        type: uint
      -
        name: rx-hw-gro-packets
        doc: |
          Number of packets that were coalesced from smaller packets by the
          device. Counts only packets coalesced with the HW-GRO netdevice
          feature, LRO-coalesced packets are not counted.
        type: uint
      -
        name: rx-hw-gro-bytes
        doc: See `rx-hw-gro-packets`.
        type: uint
      -
        name: rx-hw-gro-wire-packets
        doc: |
          Number of packets that were coalesced to bigger packetss with the
          HW-GRO netdevice feature. LRO-coalesced packets are not counted.
        type: uint
      -
        name: rx-hw-gro-wire-bytes
        doc: See `rx-hw-gro-wire-packets`.
        type: uint
      -
        name: rx-hw-drop-ratelimits
        doc: |
          Number of the packets dropped by the device due to the received
          packets bitrate exceeding the device rate limit.
        type: uint
      -
        name: tx-hw-drops
        doc: |
          Number of packets that arrived at the device but never left it,
          encompassing packets dropped for reasons such as processing errors, as
          well as those affected by explicitly defined policies and packet
          filtering criteria.
        type: uint
      -
        name: tx-hw-drop-errors
        doc: Number of packets dropped because they were invalid or malformed.
        type: uint
      -
        name: tx-csum-none
        doc: |
          Number of packets that did not require the device to calculate the
          checksum.
        type: uint
      -
        name: tx-needs-csum
        doc: |
          Number of packets that required the device to calculate the checksum.
          This counter includes the number of GSO wire packets for which device
          calculated the L4 checksum.
        type: uint
      -
        name: tx-hw-gso-packets
        doc: |
          Number of packets that necessitated segmentation into smaller packets
          by the device.
        type: uint
      -
        name: tx-hw-gso-bytes
        doc: See `tx-hw-gso-packets`.
        type: uint
      -
        name: tx-hw-gso-wire-packets
        doc: |
          Number of wire-sized packets generated by processing
          `tx-hw-gso-packets`
        type: uint
      -
        name: tx-hw-gso-wire-bytes
        doc: See `tx-hw-gso-wire-packets`.
        type: uint
      -
        name: tx-hw-drop-ratelimits
        doc: |
          Number of the packets dropped by the device due to the transmit
          packets bitrate exceeding the device rate limit.
        type: uint
      -
        name: tx-stop
        doc: |
          Number of times driver paused accepting new tx packets
          from the stack to this queue, because the queue was full.
          Note that if BQL is supported and enabled on the device
          the networking stack will avoid queuing a lot of data at once.
        type: uint
      -
        name: tx-wake
        doc: |
          Number of times driver re-started accepting send
          requests to this queue from the stack.
        type: uint
  -
    name: queue-id
    subset-of: queue
    attributes:
      -
        name: id
      -
        name: type
  -
    name: dmabuf
    attributes:
      -
        name: ifindex
        doc: netdev ifindex to bind the dmabuf to.
        type: u32
        checks:
          min: 1
      -
        name: queues
        doc: receive queues to bind the dmabuf to.
        type: nest
        nested-attributes: queue-id
        multi-attr: true
      -
        name: fd
        doc: dmabuf file descriptor to bind.
        type: u32
      -
        name: id
        doc: id of the dmabuf binding
        type: u32
        checks:
          min: 1

operations:
  list:
    -
      name: dev-get
      doc: Get / dump information about a netdev.
      attribute-set: dev
      do:
        request:
          attributes:
            - ifindex
        reply: &dev-all
          attributes:
            - ifindex
            - xdp-features
            - xdp-zc-max-segs
            - xdp-rx-metadata-features
            - xsk-features
      dump:
        reply: *dev-all
    -
      name: dev-add-ntf
      doc: Notification about device appearing.
      notify: dev-get
      mcgrp: mgmt
    -
      name: dev-del-ntf
      doc: Notification about device disappearing.
      notify: dev-get
      mcgrp: mgmt
    -
      name: dev-change-ntf
      doc: Notification about device configuration being changed.
      notify: dev-get
      mcgrp: mgmt
    -
      name: page-pool-get
      doc: |
        Get / dump information about Page Pools.
        (Only Page Pools associated with a net_device can be listed.)
      attribute-set: page-pool
      do:
        request:
          attributes:
            - id
        reply: &pp-reply
          attributes:
            - id
            - ifindex
            - napi-id
            - inflight
            - inflight-mem
            - detach-time
            - dmabuf
            - io-uring
      dump:
        reply: *pp-reply
      config-cond: page-pool
    -
      name: page-pool-add-ntf
      doc: Notification about page pool appearing.
      notify: page-pool-get
      mcgrp: page-pool
      config-cond: page-pool
    -
      name: page-pool-del-ntf
      doc: Notification about page pool disappearing.
      notify: page-pool-get
      mcgrp: page-pool
      config-cond: page-pool
    -
      name: page-pool-change-ntf
      doc: Notification about page pool configuration being changed.
      notify: page-pool-get
      mcgrp: page-pool
      config-cond: page-pool
    -
      name: page-pool-stats-get
      doc: Get page pool statistics.
      attribute-set: page-pool-stats
      do:
        request:
          attributes:
            - info
        reply: &pp-stats-reply
          attributes:
            - info
            - alloc-fast
            - alloc-slow
            - alloc-slow-high-order
            - alloc-empty
            - alloc-refill
            - alloc-waive
            - recycle-cached
            - recycle-cache-full
            - recycle-ring
            - recycle-ring-full
            - recycle-released-refcnt
      dump:
        reply: *pp-stats-reply
      config-cond: page-pool-stats
    -
      name: queue-get
      doc: Get queue information from the kernel.
           Only configured queues will be reported (as opposed to all available
           hardware queues).
      attribute-set: queue
      do:
        request:
          attributes:
            - ifindex
            - type
            - id
        reply: &queue-get-op
          attributes:
            - id
            - type
            - napi-id
            - ifindex
            - dmabuf
            - io-uring
            - xsk
      dump:
        request:
          attributes:
            - ifindex
        reply: *queue-get-op
    -
      name: napi-get
      doc: Get information about NAPI instances configured on the system.
      attribute-set: napi
      do:
        request:
          attributes:
            - id
        reply: &napi-get-op
          attributes:
            - id
            - ifindex
            - irq
            - pid
            - defer-hard-irqs
            - gro-flush-timeout
            - irq-suspend-timeout
            - threaded
      dump:
        request:
          attributes:
            - ifindex
        reply: *napi-get-op
    -
      name: qstats-get
      doc: |
        Get / dump fine grained statistics. Which statistics are reported
        depends on the device and the driver, and whether the driver stores
        software counters per-queue.
      attribute-set: qstats
      dump:
        request:
          attributes:
            - ifindex
            - scope
        reply:
          attributes:
            - ifindex
            - queue-type
            - queue-id
            - rx-packets
            - rx-bytes
            - tx-packets
            - tx-bytes
    -
      name: bind-rx
      doc: Bind dmabuf to netdev
      attribute-set: dmabuf
      flags: [admin-perm]
      do:
        request:
          attributes:
            - ifindex
            - fd
            - queues
        reply:
          attributes:
            - id
    -
      name: napi-set
      doc: Set configurable NAPI instance settings.
      attribute-set: napi
      flags: [admin-perm]
      do:
        request:
          attributes:
            - id
            - defer-hard-irqs
            - gro-flush-timeout
            - irq-suspend-timeout
            - threaded
    -
      name: bind-tx
      doc: Bind dmabuf to netdev for TX
      attribute-set: dmabuf
      do:
        request:
          attributes:
            - ifindex
            - fd
        reply:
          attributes:
            - id

kernel-family:
  headers: ["net/netdev_netlink.h"]
  sock-priv: struct netdev_nl_sock

mcast-groups:
  list:
    -
      name: mgmt
    -
      name: page-pool
