165ee00a9SDavid Ahern /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 265ee00a9SDavid Ahern #ifndef _UAPI_LINUX_NEXTHOP_H 365ee00a9SDavid Ahern #define _UAPI_LINUX_NEXTHOP_H 465ee00a9SDavid Ahern 565ee00a9SDavid Ahern #include <linux/types.h> 665ee00a9SDavid Ahern 765ee00a9SDavid Ahern struct nhmsg { 865ee00a9SDavid Ahern unsigned char nh_family; 965ee00a9SDavid Ahern unsigned char nh_scope; /* return only */ 1065ee00a9SDavid Ahern unsigned char nh_protocol; /* Routing protocol that installed nh */ 1165ee00a9SDavid Ahern unsigned char resvd; 1265ee00a9SDavid Ahern unsigned int nh_flags; /* RTNH_F flags */ 1365ee00a9SDavid Ahern }; 1465ee00a9SDavid Ahern 1565ee00a9SDavid Ahern /* entry in a nexthop group */ 1665ee00a9SDavid Ahern struct nexthop_grp { 1765ee00a9SDavid Ahern __u32 id; /* nexthop id - must exist */ 1865ee00a9SDavid Ahern __u8 weight; /* weight of this nexthop */ 1965ee00a9SDavid Ahern __u8 resvd1; 2065ee00a9SDavid Ahern __u16 resvd2; 2165ee00a9SDavid Ahern }; 2265ee00a9SDavid Ahern 2365ee00a9SDavid Ahern enum { 24710ec562SIdo Schimmel NEXTHOP_GRP_TYPE_MPATH, /* hash-threshold nexthop group 25710ec562SIdo Schimmel * default type if not specified 26710ec562SIdo Schimmel */ 27710ec562SIdo Schimmel NEXTHOP_GRP_TYPE_RES, /* resilient nexthop group */ 2865ee00a9SDavid Ahern __NEXTHOP_GRP_TYPE_MAX, 2965ee00a9SDavid Ahern }; 3065ee00a9SDavid Ahern 3165ee00a9SDavid Ahern #define NEXTHOP_GRP_TYPE_MAX (__NEXTHOP_GRP_TYPE_MAX - 1) 3265ee00a9SDavid Ahern 3395fedd76SIdo Schimmel #define NHA_OP_FLAG_DUMP_STATS BIT(0) 34*5072ae00SIdo Schimmel #define NHA_OP_FLAG_DUMP_HW_STATS BIT(1) 3595fedd76SIdo Schimmel 3665ee00a9SDavid Ahern enum { 3765ee00a9SDavid Ahern NHA_UNSPEC, 3865ee00a9SDavid Ahern NHA_ID, /* u32; id for nexthop. id == 0 means auto-assign */ 3965ee00a9SDavid Ahern 4065ee00a9SDavid Ahern NHA_GROUP, /* array of nexthop_grp */ 4165ee00a9SDavid Ahern NHA_GROUP_TYPE, /* u16 one of NEXTHOP_GRP_TYPE */ 4265ee00a9SDavid Ahern /* if NHA_GROUP attribute is added, no other attributes can be set */ 4365ee00a9SDavid Ahern 4465ee00a9SDavid Ahern NHA_BLACKHOLE, /* flag; nexthop used to blackhole packets */ 4565ee00a9SDavid Ahern /* if NHA_BLACKHOLE is added, OIF, GATEWAY, ENCAP can not be set */ 4665ee00a9SDavid Ahern 4765ee00a9SDavid Ahern NHA_OIF, /* u32; nexthop device */ 4865ee00a9SDavid Ahern NHA_GATEWAY, /* be32 (IPv4) or in6_addr (IPv6) gw address */ 4965ee00a9SDavid Ahern NHA_ENCAP_TYPE, /* u16; lwt encap type */ 5065ee00a9SDavid Ahern NHA_ENCAP, /* lwt encap data */ 5165ee00a9SDavid Ahern 5265ee00a9SDavid Ahern /* NHA_OIF can be appended to dump request to return only 5365ee00a9SDavid Ahern * nexthops using given device 5465ee00a9SDavid Ahern */ 5565ee00a9SDavid Ahern NHA_GROUPS, /* flag; only return nexthop groups in dump */ 5665ee00a9SDavid Ahern NHA_MASTER, /* u32; only return nexthops with given master dev */ 5765ee00a9SDavid Ahern 5838428d68SRoopa Prabhu NHA_FDB, /* flag; nexthop belongs to a bridge fdb */ 5938428d68SRoopa Prabhu /* if NHA_FDB is added, OIF, BLACKHOLE, ENCAP cannot be set */ 6038428d68SRoopa Prabhu 61710ec562SIdo Schimmel /* nested; resilient nexthop group attributes */ 62710ec562SIdo Schimmel NHA_RES_GROUP, 63710ec562SIdo Schimmel /* nested; nexthop bucket attributes */ 64710ec562SIdo Schimmel NHA_RES_BUCKET, 65710ec562SIdo Schimmel 66a207eab1SPetr Machata /* u32; operation-specific flags */ 67a207eab1SPetr Machata NHA_OP_FLAGS, 68a207eab1SPetr Machata 6995fedd76SIdo Schimmel /* nested; nexthop group stats */ 7095fedd76SIdo Schimmel NHA_GROUP_STATS, 7195fedd76SIdo Schimmel 72746c19a5SIdo Schimmel /* u32; nexthop hardware stats enable */ 73746c19a5SIdo Schimmel NHA_HW_STATS_ENABLE, 74746c19a5SIdo Schimmel 75*5072ae00SIdo Schimmel /* u32; read-only; whether any driver collects HW stats */ 76*5072ae00SIdo Schimmel NHA_HW_STATS_USED, 77*5072ae00SIdo Schimmel 7865ee00a9SDavid Ahern __NHA_MAX, 7965ee00a9SDavid Ahern }; 8065ee00a9SDavid Ahern 8165ee00a9SDavid Ahern #define NHA_MAX (__NHA_MAX - 1) 82710ec562SIdo Schimmel 83710ec562SIdo Schimmel enum { 84710ec562SIdo Schimmel NHA_RES_GROUP_UNSPEC, 85710ec562SIdo Schimmel /* Pad attribute for 64-bit alignment. */ 86710ec562SIdo Schimmel NHA_RES_GROUP_PAD = NHA_RES_GROUP_UNSPEC, 87710ec562SIdo Schimmel 88710ec562SIdo Schimmel /* u16; number of nexthop buckets in a resilient nexthop group */ 89710ec562SIdo Schimmel NHA_RES_GROUP_BUCKETS, 90710ec562SIdo Schimmel /* clock_t as u32; nexthop bucket idle timer (per-group) */ 91710ec562SIdo Schimmel NHA_RES_GROUP_IDLE_TIMER, 92710ec562SIdo Schimmel /* clock_t as u32; nexthop unbalanced timer */ 93710ec562SIdo Schimmel NHA_RES_GROUP_UNBALANCED_TIMER, 94710ec562SIdo Schimmel /* clock_t as u64; nexthop unbalanced time */ 95710ec562SIdo Schimmel NHA_RES_GROUP_UNBALANCED_TIME, 96710ec562SIdo Schimmel 97710ec562SIdo Schimmel __NHA_RES_GROUP_MAX, 98710ec562SIdo Schimmel }; 99710ec562SIdo Schimmel 100710ec562SIdo Schimmel #define NHA_RES_GROUP_MAX (__NHA_RES_GROUP_MAX - 1) 101710ec562SIdo Schimmel 102710ec562SIdo Schimmel enum { 103710ec562SIdo Schimmel NHA_RES_BUCKET_UNSPEC, 104710ec562SIdo Schimmel /* Pad attribute for 64-bit alignment. */ 105710ec562SIdo Schimmel NHA_RES_BUCKET_PAD = NHA_RES_BUCKET_UNSPEC, 106710ec562SIdo Schimmel 107710ec562SIdo Schimmel /* u16; nexthop bucket index */ 108710ec562SIdo Schimmel NHA_RES_BUCKET_INDEX, 109710ec562SIdo Schimmel /* clock_t as u64; nexthop bucket idle time */ 110710ec562SIdo Schimmel NHA_RES_BUCKET_IDLE_TIME, 111710ec562SIdo Schimmel /* u32; nexthop id assigned to the nexthop bucket */ 112710ec562SIdo Schimmel NHA_RES_BUCKET_NH_ID, 113710ec562SIdo Schimmel 114710ec562SIdo Schimmel __NHA_RES_BUCKET_MAX, 115710ec562SIdo Schimmel }; 116710ec562SIdo Schimmel 117710ec562SIdo Schimmel #define NHA_RES_BUCKET_MAX (__NHA_RES_BUCKET_MAX - 1) 118710ec562SIdo Schimmel 11995fedd76SIdo Schimmel enum { 12095fedd76SIdo Schimmel NHA_GROUP_STATS_UNSPEC, 12195fedd76SIdo Schimmel 12295fedd76SIdo Schimmel /* nested; nexthop group entry stats */ 12395fedd76SIdo Schimmel NHA_GROUP_STATS_ENTRY, 12495fedd76SIdo Schimmel 12595fedd76SIdo Schimmel __NHA_GROUP_STATS_MAX, 12695fedd76SIdo Schimmel }; 12795fedd76SIdo Schimmel 12895fedd76SIdo Schimmel #define NHA_GROUP_STATS_MAX (__NHA_GROUP_STATS_MAX - 1) 12995fedd76SIdo Schimmel 13095fedd76SIdo Schimmel enum { 13195fedd76SIdo Schimmel NHA_GROUP_STATS_ENTRY_UNSPEC, 13295fedd76SIdo Schimmel 13395fedd76SIdo Schimmel /* u32; nexthop id of the nexthop group entry */ 13495fedd76SIdo Schimmel NHA_GROUP_STATS_ENTRY_ID, 13595fedd76SIdo Schimmel 13695fedd76SIdo Schimmel /* uint; number of packets forwarded via the nexthop group entry */ 13795fedd76SIdo Schimmel NHA_GROUP_STATS_ENTRY_PACKETS, 13895fedd76SIdo Schimmel 139*5072ae00SIdo Schimmel /* uint; number of packets forwarded via the nexthop group entry in 140*5072ae00SIdo Schimmel * hardware 141*5072ae00SIdo Schimmel */ 142*5072ae00SIdo Schimmel NHA_GROUP_STATS_ENTRY_PACKETS_HW, 143*5072ae00SIdo Schimmel 14495fedd76SIdo Schimmel __NHA_GROUP_STATS_ENTRY_MAX, 14595fedd76SIdo Schimmel }; 14695fedd76SIdo Schimmel 14795fedd76SIdo Schimmel #define NHA_GROUP_STATS_ENTRY_MAX (__NHA_GROUP_STATS_ENTRY_MAX - 1) 14895fedd76SIdo Schimmel 14965ee00a9SDavid Ahern #endif 150