xref: /linux/include/uapi/linux/nexthop.h (revision 100c85421b52e41269ada88f7d71a6b8a06c7a11)
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