# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
---
name: rt-neigh
protocol: netlink-raw
uapi-header: linux/rtnetlink.h
protonum: 0

doc:
  IP neighbour management over rtnetlink.

definitions:
  -
    name: ndmsg
    type: struct
    members:
      -
        name: ndm-family
        type: u8
      -
        name: ndm-pad
        type: pad
        len: 3
      -
        name: ndm-ifindex
        type: s32
      -
        name: ndm-state
        type: u16
        enum: nud-state
      -
        name: ndm-flags
        type: u8
        enum: ntf-flags
      -
        name: ndm-type
        type: u8
        enum: rtm-type
  -
    name: ndtmsg
    type: struct
    members:
      -
        name: family
        type: u8
      -
        name: pad
        type: pad
        len: 3
  -
    name: nud-state
    type: flags
    enum-name:
    entries:
      - incomplete
      - reachable
      - stale
      - delay
      - probe
      - failed
      - noarp
      - permanent
  -
    name: ntf-flags
    type: flags
    enum-name:
    entries:
      - use
      - self
      - master
      - proxy
      - ext-learned
      - offloaded
      - sticky
      - router
  -
    name: ntf-ext-flags
    type: flags
    enum-name:
    entries:
      - managed
      - locked
      - ext-validated
  -
    name: rtm-type
    type: enum
    enum-name:
    entries:
      - unspec
      - unicast
      - local
      - broadcast
      - anycast
      - multicast
      - blackhole
      - unreachable
      - prohibit
      - throw
      - nat
      - xresolve
  -
    name: nda-cacheinfo
    type: struct
    members:
      -
        name: confirmed
        type: u32
      -
        name: used
        type: u32
      -
        name: updated
        type: u32
      -
        name: refcnt
        type: u32
  -
    name: ndt-config
    type: struct
    members:
      -
        name: key-len
        type: u16
      -
        name: entry-size
        type: u16
      -
        name: entries
        type: u32
      -
        name: last-flush
        type: u32
      -
        name: last-rand
        type: u32
      -
        name: hash-rnd
        type: u32
      -
        name: hash-mask
        type: u32
      -
        name: hash-chain-gc
        type: u32
      -
        name: proxy-qlen
        type: u32
  -
    name: ndt-stats
    type: struct
    members:
      -
        name: allocs
        type: u64
      -
        name: destroys
        type: u64
      -
        name: hash-grows
        type: u64
      -
        name: res-failed
        type: u64
      -
        name: lookups
        type: u64
      -
        name: hits
        type: u64
      -
        name: rcv-probes-mcast
        type: u64
      -
        name: rcv-probes-ucast
        type: u64
      -
        name: periodic-gc-runs
        type: u64
      -
        name: forced-gc-runs
        type: u64
      -
        name: table-fulls
        type: u64

attribute-sets:
  -
    name: neighbour-attrs
    name-prefix: nda-
    attributes:
      -
        name: unspec
        type: binary
        value: 0
      -
        name: dst
        type: binary
        display-hint: ipv4
      -
        name: lladdr
        type: binary
        display-hint: mac
      -
        name: cacheinfo
        type: binary
        struct: nda-cacheinfo
      -
        name: probes
        type: u32
      -
        name: vlan
        type: u16
      -
        name: port
        type: u16
      -
        name: vni
        type: u32
      -
        name: ifindex
        type: u32
      -
        name: master
        type: u32
      -
        name: link-netnsid
        type: s32
      -
        name: src-vni
        type: u32
      -
        name: protocol
        type: u8
      -
        name: nh-id
        type: u32
      -
        name: fdb-ext-attrs
        type: binary
      -
        name: flags-ext
        type: u32
        enum: ntf-ext-flags
      -
        name: ndm-state-mask
        type: u16
      -
        name: ndm-flags-mask
        type: u8
  -
    name: ndt-attrs
    name-prefix: ndta-
    attributes:
      -
        name: name
        type: string
      -
        name: thresh1
        type: u32
      -
        name: thresh2
        type: u32
      -
        name: thresh3
        type: u32
      -
        name: config
        type: binary
        struct: ndt-config
      -
        name: parms
        type: nest
        nested-attributes: ndtpa-attrs
      -
        name: stats
        type: binary
        struct: ndt-stats
      -
        name: gc-interval
        type: u64
      -
        name: pad
        type: pad
  -
    name: ndtpa-attrs
    name-prefix: ndtpa-
    attributes:
      -
        name: ifindex
        type: u32
      -
        name: refcnt
        type: u32
      -
        name: reachable-time
        type: u64
      -
        name: base-reachable-time
        type: u64
      -
        name: retrans-time
        type: u64
      -
        name: gc-staletime
        type: u64
      -
        name: delay-probe-time
        type: u64
      -
        name: queue-len
        type: u32
      -
        name: app-probes
        type: u32
      -
        name: ucast-probes
        type: u32
      -
        name: mcast-probes
        type: u32
      -
        name: anycast-delay
        type: u64
      -
        name: proxy-delay
        type: u64
      -
        name: proxy-qlen
        type: u32
      -
        name: locktime
        type: u64
      -
        name: queue-lenbytes
        type: u32
      -
        name: mcast-reprobes
        type: u32
      -
        name: pad
        type: pad
      -
        name: interval-probe-time-ms
        type: u64

operations:
  enum-model: directional
  name-prefix: rtm-
  list:
    -
      name: newneigh
      doc: Add new neighbour entry
      fixed-header: ndmsg
      attribute-set: neighbour-attrs
      do:
        request:
          value: 28
          attributes: &neighbour-all
            - dst
            - lladdr
            - probes
            - vlan
            - port
            - vni
            - ifindex
            - master
            - protocol
            - nh-id
            - flags-ext
            - fdb-ext-attrs
    -
      name: delneigh
      doc: Remove an existing neighbour entry
      fixed-header: ndmsg
      attribute-set: neighbour-attrs
      do:
        request:
          value: 29
          attributes:
            - dst
            - ifindex
    -
      name: delneigh-ntf
      doc: Notify a neighbour deletion
      value: 29
      notify: getneigh
      fixed-header: ndmsg
    -
      name: getneigh
      doc: Get or dump neighbour entries
      fixed-header: ndmsg
      attribute-set: neighbour-attrs
      do:
        request:
          value: 30
          attributes:
            - dst
        reply:
          value: 28
          attributes: *neighbour-all
      dump:
        request:
          attributes:
            - ifindex
            - master
        reply:
          value: 28
          attributes: *neighbour-all
    -
      name: newneigh-ntf
      doc: Notify a neighbour creation
      value: 28
      notify: getneigh
      fixed-header: ndmsg
    -
      name: getneightbl
      doc: Get or dump neighbour tables
      fixed-header: ndtmsg
      attribute-set: ndt-attrs
      dump:
        request:
          value: 66
        reply:
          value: 64
          attributes:
            - name
            - thresh1
            - thresh2
            - thresh3
            - config
            - parms
            - stats
            - gc-interval
    -
      name: setneightbl
      doc: Set neighbour tables
      fixed-header: ndtmsg
      attribute-set: ndt-attrs
      do:
        request:
          value: 67
          attributes:
            - name
            - thresh1
            - thresh2
            - thresh3
            - parms
            - gc-interval

mcast-groups:
  list:
    -
      name: rtnlgrp-neigh
      value: 3
