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

doc:
  FIB rule management over rtnetlink.

definitions:
  -
    name: rtgenmsg
    type: struct
    members:
      -
        name: family
        type: u8
      -
        name: pad
        type: pad
        len: 3
  -
    name: fib-rule-hdr
    type: struct
    members:
      -
        name: family
        type: u8
      -
        name: dst-len
        type: u8
      -
        name: src-len
        type: u8
      -
        name: tos
        type: u8
      -
        name: table
        type: u8
      -
        name: res1
        type: pad
        len: 1
      -
        name: res2
        type: pad
        len: 1
      -
        name: action
        type: u8
        enum: fr-act
      -
        name: flags
        type: u32
  -
    name: fr-act
    type: enum
    enum-name:
    entries:
      - unspec
      - to-tbl
      - goto
      - nop
      - res3
      - res4
      - blackhole
      - unreachable
      - prohibit
  -
    name: fib-rule-port-range
    type: struct
    members:
      -
        name: start
        type: u16
      -
        name: end
        type: u16
  -
    name: fib-rule-uid-range
    type: struct
    members:
      -
        name: start
        type: u32
      -
        name: end
        type: u32

attribute-sets:
  -
    name: fib-rule-attrs
    name-prefix: fra-
    attributes:
      -
        name: dst
        type: u32
      -
        name: src
        type: u32
      -
        name: iifname
        type: string
      -
        name: goto
        type: u32
      -
        name: unused2
        type: pad
      -
        name: priority
        type: u32
      -
        name: unused3
        type: pad
      -
        name: unused4
        type: pad
      -
        name: unused5
        type: pad
      -
        name: fwmark
        type: u32
        display-hint: hex
      -
        name: flow
        type: u32
      -
        name: tun-id
        type: u64
      -
        name: suppress-ifgroup
        type: u32
      -
        name: suppress-prefixlen
        type: u32
        display-hint: hex
      -
        name: table
        type: u32
      -
        name: fwmask
        type: u32
        display-hint: hex
      -
        name: oifname
        type: string
      -
        name: pad
        type: pad
      -
        name: l3mdev
        type: u8
      -
        name: uid-range
        type: binary
        struct: fib-rule-uid-range
      -
        name: protocol
        type: u8
      -
        name: ip-proto
        type: u8
      -
        name: sport-range
        type: binary
        struct: fib-rule-port-range
      -
        name: dport-range
        type: binary
        struct: fib-rule-port-range
      -
        name: dscp
        type: u8
      -
        name: flowlabel
        type: u32
        byte-order: big-endian
        display-hint: hex
      -
        name: flowlabel-mask
        type: u32
        byte-order: big-endian
        display-hint: hex
      -
        name: sport-mask
        type: u16
        display-hint: hex
      -
        name: dport-mask
        type: u16
        display-hint: hex
      -
        name: dscp-mask
        type: u8
        display-hint: hex

operations:
  enum-model: directional
  fixed-header: fib-rule-hdr
  name-prefix: rtm-
  list:
    -
      name: newrule
      doc: Add new FIB rule
      attribute-set: fib-rule-attrs
      do:
        request:
          value: 32
          attributes: &fib-rule-all
            - iifname
            - oifname
            - priority
            - fwmark
            - flow
            - tun-id
            - fwmask
            - table
            - suppress-prefixlen
            - suppress-ifgroup
            - goto
            - l3mdev
            - uid-range
            - protocol
            - ip-proto
            - sport-range
            - dport-range
            - dscp
            - flowlabel
            - flowlabel-mask
            - sport-mask
            - dport-mask
            - dscp-mask
    -
      name: newrule-ntf
      doc: Notify a rule creation
      value: 32
      notify: getrule
    -
      name: delrule
      doc: Remove an existing FIB rule
      attribute-set: fib-rule-attrs
      do:
        request:
          value: 33
          attributes: *fib-rule-all
    -
      name: delrule-ntf
      doc: Notify a rule deletion
      value: 33
      notify: getrule
    -
      name: getrule
      doc: Dump all FIB rules
      attribute-set: fib-rule-attrs
      dump:
        request:
          value: 34
        reply:
          value: 32
          attributes: *fib-rule-all

mcast-groups:
  list:
    -
      name: rtnlgrp-ipv4-rule
      value: 8
    -
      name: rtnlgrp-ipv6-rule
      value: 19
