# 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: queue-type
    type: enum
    entries: [ rx, tx ]

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: 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: 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: 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.
        type: u32
        enum: queue-type
      -
        name: napi-id
        doc: ID of the NAPI instance which services this queue.
        type: u32

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
      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
      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
      dump:
        request:
          attributes:
            - ifindex
        reply: *napi-get-op

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