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

name: rt-route
protocol: netlink-raw
protonum: 0

doc:
  Route configuration over rtnetlink.

definitions:
  -
    name: rtm-type
    name-prefix: rtn-
    type: enum
    entries:
      - unspec
      - unicast
      - local
      - broadcast
      - anycast
      - multicast
      - blackhole
      - unreachable
      - prohibit
      - throw
      - nat
      - xresolve
  -
    name: rtmsg
    type: struct
    members:
      -
        name: rtm-family
        type: u8
      -
        name: rtm-dst-len
        type: u8
      -
        name: rtm-src-len
        type: u8
      -
        name: rtm-tos
        type: u8
      -
        name: rtm-table
        type: u8
      -
        name: rtm-protocol
        type: u8
      -
        name: rtm-scope
        type: u8
      -
        name: rtm-type
        type: u8
        enum: rtm-type
      -
        name: rtm-flags
        type: u32
  -
    name: rta-cacheinfo
    type: struct
    members:
      -
        name: rta-clntref
        type: u32
      -
        name: rta-lastuse
        type: u32
      -
        name: rta-expires
        type: u32
      -
        name: rta-error
        type: u32
      -
        name: rta-used
        type: u32

attribute-sets:
  -
    name: route-attrs
    attributes:
      -
        name: rta-dst
        type: binary
        display-hint: ipv4
      -
        name: rta-src
        type: binary
        display-hint: ipv4
      -
        name: rta-iif
        type: u32
      -
        name: rta-oif
        type: u32
      -
        name: rta-gateway
        type: binary
        display-hint: ipv4
      -
        name: rta-priority
        type: u32
      -
        name: rta-prefsrc
        type: binary
        display-hint: ipv4
      -
        name: rta-metrics
        type: nest
        nested-attributes: rta-metrics
      -
        name: rta-multipath
        type: binary
      -
        name: rta-protoinfo # not used
        type: binary
      -
        name: rta-flow
        type: u32
      -
        name: rta-cacheinfo
        type: binary
        struct: rta-cacheinfo
      -
        name: rta-session # not used
        type: binary
      -
        name: rta-mp-algo # not used
        type: binary
      -
        name: rta-table
        type: u32
      -
        name: rta-mark
        type: u32
      -
        name: rta-mfc-stats
        type: binary
      -
        name: rta-via
        type: binary
      -
        name: rta-newdst
        type: binary
      -
        name: rta-pref
        type: u8
      -
        name: rta-encap-type
        type: u16
      -
        name: rta-encap
        type: binary # tunnel specific nest
      -
        name: rta-expires
        type: u32
      -
        name: rta-pad
        type: binary
      -
        name: rta-uid
        type: u32
      -
        name: rta-ttl-propagate
        type: u8
      -
        name: rta-ip-proto
        type: u8
      -
        name: rta-sport
        type: u16
      -
        name: rta-dport
        type: u16
      -
        name: rta-nh-id
        type: u32
  -
    name: rta-metrics
    attributes:
      -
        name: rtax-unspec
        type: unused
        value: 0
      -
        name: rtax-lock
        type: u32
      -
        name: rtax-mtu
        type: u32
      -
        name: rtax-window
        type: u32
      -
        name: rtax-rtt
        type: u32
      -
        name: rtax-rttvar
        type: u32
      -
        name: rtax-ssthresh
        type: u32
      -
        name: rtax-cwnd
        type: u32
      -
        name: rtax-advmss
        type: u32
      -
        name: rtax-reordering
        type: u32
      -
        name: rtax-hoplimit
        type: u32
      -
        name: rtax-initcwnd
        type: u32
      -
        name: rtax-features
        type: u32
      -
        name: rtax-rto-min
        type: u32
      -
        name: rtax-initrwnd
        type: u32
      -
        name: rtax-quickack
        type: u32
      -
        name: rtax-cc-algo
        type: string
      -
        name: rtax-fastopen-no-cookie
        type: u32

operations:
  enum-model: directional
  list:
    -
      name: getroute
      doc: Dump route information.
      attribute-set: route-attrs
      fixed-header: rtmsg
      do:
        request:
          value: 26
          attributes:
            - rtm-family
            - rta-src
            - rtm-src-len
            - rta-dst
            - rtm-dst-len
            - rta-iif
            - rta-oif
            - rta-ip-proto
            - rta-sport
            - rta-dport
            - rta-mark
            - rta-uid
        reply:
          value: 24
          attributes: &all-route-attrs
            - rtm-family
            - rtm-dst-len
            - rtm-src-len
            - rtm-tos
            - rtm-table
            - rtm-protocol
            - rtm-scope
            - rtm-type
            - rtm-flags
            - rta-dst
            - rta-src
            - rta-iif
            - rta-oif
            - rta-gateway
            - rta-priority
            - rta-prefsrc
            - rta-metrics
            - rta-multipath
            - rta-flow
            - rta-cacheinfo
            - rta-table
            - rta-mark
            - rta-mfc-stats
            - rta-via
            - rta-newdst
            - rta-pref
            - rta-encap-type
            - rta-encap
            - rta-expires
            - rta-pad
            - rta-uid
            - rta-ttl-propagate
            - rta-ip-proto
            - rta-sport
            - rta-dport
            - rta-nh-id
      dump:
        request:
          value: 26
          attributes:
            - rtm-family
        reply:
          value: 24
          attributes: *all-route-attrs
    -
      name: newroute
      doc: Create a new route
      attribute-set: route-attrs
      fixed-header: rtmsg
      do:
        request:
          value: 24
          attributes: *all-route-attrs
    -
      name: delroute
      doc: Delete an existing route
      attribute-set: route-attrs
      fixed-header: rtmsg
      do:
        request:
          value: 25
          attributes: *all-route-attrs