xref: /linux/include/uapi/linux/neighbour.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2607ca46eSDavid Howells #ifndef __LINUX_NEIGHBOUR_H
3607ca46eSDavid Howells #define __LINUX_NEIGHBOUR_H
4607ca46eSDavid Howells 
5607ca46eSDavid Howells #include <linux/types.h>
6607ca46eSDavid Howells #include <linux/netlink.h>
7607ca46eSDavid Howells 
8607ca46eSDavid Howells struct ndmsg {
9607ca46eSDavid Howells 	__u8		ndm_family;
10607ca46eSDavid Howells 	__u8		ndm_pad1;
11607ca46eSDavid Howells 	__u16		ndm_pad2;
12607ca46eSDavid Howells 	__s32		ndm_ifindex;
13607ca46eSDavid Howells 	__u16		ndm_state;
14607ca46eSDavid Howells 	__u8		ndm_flags;
15607ca46eSDavid Howells 	__u8		ndm_type;
16607ca46eSDavid Howells };
17607ca46eSDavid Howells 
18607ca46eSDavid Howells enum {
19607ca46eSDavid Howells 	NDA_UNSPEC,
20607ca46eSDavid Howells 	NDA_DST,
21607ca46eSDavid Howells 	NDA_LLADDR,
22607ca46eSDavid Howells 	NDA_CACHEINFO,
23607ca46eSDavid Howells 	NDA_PROBES,
241690be63SVlad Yasevich 	NDA_VLAN,
256681712dSDavid Stevens 	NDA_PORT,
266681712dSDavid Stevens 	NDA_VNI,
276681712dSDavid Stevens 	NDA_IFINDEX,
2841c389d7SRoopa Prabhu 	NDA_MASTER,
294967082bSNicolas Dichtel 	NDA_LINK_NETNSID,
303ad7a4b1SRoopa Prabhu 	NDA_SRC_VNI,
31df9b0e30SDavid Ahern 	NDA_PROTOCOL,  /* Originator of entry */
321274e1ccSRoopa Prabhu 	NDA_NH_ID,
33899426b3SNikolay Aleksandrov 	NDA_FDB_EXT_ATTRS,
342c611ad9SRoopa Prabhu 	NDA_FLAGS_EXT,
35ea2c0f9eSNikolay Aleksandrov 	NDA_NDM_STATE_MASK,
36ea2c0f9eSNikolay Aleksandrov 	NDA_NDM_FLAGS_MASK,
37607ca46eSDavid Howells 	__NDA_MAX
38607ca46eSDavid Howells };
39607ca46eSDavid Howells 
40607ca46eSDavid Howells #define NDA_MAX (__NDA_MAX - 1)
41607ca46eSDavid Howells 
42607ca46eSDavid Howells /*
43607ca46eSDavid Howells  *	Neighbor Cache Entry Flags
44607ca46eSDavid Howells  */
45607ca46eSDavid Howells 
467482e384SDaniel Borkmann #define NTF_USE		(1 << 0)
477482e384SDaniel Borkmann #define NTF_SELF	(1 << 1)
487482e384SDaniel Borkmann #define NTF_MASTER	(1 << 2)
497482e384SDaniel Borkmann #define NTF_PROXY	(1 << 3)	/* == ATF_PUBL */
507482e384SDaniel Borkmann #define NTF_EXT_LEARNED	(1 << 4)
517482e384SDaniel Borkmann #define NTF_OFFLOADED   (1 << 5)
527482e384SDaniel Borkmann #define NTF_STICKY	(1 << 6)
537482e384SDaniel Borkmann #define NTF_ROUTER	(1 << 7)
547482e384SDaniel Borkmann /* Extended flags under NDA_FLAGS_EXT: */
557482e384SDaniel Borkmann #define NTF_EXT_MANAGED		(1 << 0)
56*a35ec8e3SHans J. Schultz #define NTF_EXT_LOCKED		(1 << 1)
57607ca46eSDavid Howells 
58607ca46eSDavid Howells /*
59607ca46eSDavid Howells  *	Neighbor Cache Entry States.
60607ca46eSDavid Howells  */
61607ca46eSDavid Howells 
62607ca46eSDavid Howells #define NUD_INCOMPLETE	0x01
63607ca46eSDavid Howells #define NUD_REACHABLE	0x02
64607ca46eSDavid Howells #define NUD_STALE	0x04
65607ca46eSDavid Howells #define NUD_DELAY	0x08
66607ca46eSDavid Howells #define NUD_PROBE	0x10
67607ca46eSDavid Howells #define NUD_FAILED	0x20
68607ca46eSDavid Howells 
69607ca46eSDavid Howells /* Dummy states */
70607ca46eSDavid Howells #define NUD_NOARP	0x40
71607ca46eSDavid Howells #define NUD_PERMANENT	0x80
72607ca46eSDavid Howells #define NUD_NONE	0x00
73607ca46eSDavid Howells 
747482e384SDaniel Borkmann /* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change and make no
757482e384SDaniel Borkmann  * address resolution or NUD.
767482e384SDaniel Borkmann  *
777482e384SDaniel Borkmann  * NUD_PERMANENT also cannot be deleted by garbage collectors. This holds true
787482e384SDaniel Borkmann  * for dynamic entries with NTF_EXT_LEARNED flag as well. However, upon carrier
797482e384SDaniel Borkmann  * down event, NUD_PERMANENT entries are not flushed whereas NTF_EXT_LEARNED
807482e384SDaniel Borkmann  * flagged entries explicitly are (which is also consistent with the routing
817482e384SDaniel Borkmann  * subsystem).
827482e384SDaniel Borkmann  *
8345a68787SNikolay Aleksandrov  * When NTF_EXT_LEARNED is set for a bridge fdb entry the different cache entry
8445a68787SNikolay Aleksandrov  * states don't make sense and thus are ignored. Such entries don't age and
8545a68787SNikolay Aleksandrov  * can roam.
867482e384SDaniel Borkmann  *
877482e384SDaniel Borkmann  * NTF_EXT_MANAGED flagged neigbor entries are managed by the kernel on behalf
887482e384SDaniel Borkmann  * of a user space control plane, and automatically refreshed so that (if
897482e384SDaniel Borkmann  * possible) they remain in NUD_REACHABLE state.
90*a35ec8e3SHans J. Schultz  *
91*a35ec8e3SHans J. Schultz  * NTF_EXT_LOCKED flagged bridge FDB entries are entries generated by the
92*a35ec8e3SHans J. Schultz  * bridge in response to a host trying to communicate via a locked bridge port
93*a35ec8e3SHans J. Schultz  * with MAB enabled. Their purpose is to notify user space that a host requires
94*a35ec8e3SHans J. Schultz  * authentication.
95607ca46eSDavid Howells  */
96607ca46eSDavid Howells 
97607ca46eSDavid Howells struct nda_cacheinfo {
98607ca46eSDavid Howells 	__u32		ndm_confirmed;
99607ca46eSDavid Howells 	__u32		ndm_used;
100607ca46eSDavid Howells 	__u32		ndm_updated;
101607ca46eSDavid Howells 	__u32		ndm_refcnt;
102607ca46eSDavid Howells };
103607ca46eSDavid Howells 
104607ca46eSDavid Howells /*****************************************************************
105607ca46eSDavid Howells  *		Neighbour tables specific messages.
106607ca46eSDavid Howells  *
107607ca46eSDavid Howells  * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the
108607ca46eSDavid Howells  * NLM_F_DUMP flag set. Every neighbour table configuration is
109607ca46eSDavid Howells  * spread over multiple messages to avoid running into message
110607ca46eSDavid Howells  * size limits on systems with many interfaces. The first message
111607ca46eSDavid Howells  * in the sequence transports all not device specific data such as
112607ca46eSDavid Howells  * statistics, configuration, and the default parameter set.
113607ca46eSDavid Howells  * This message is followed by 0..n messages carrying device
114607ca46eSDavid Howells  * specific parameter sets.
115607ca46eSDavid Howells  * Although the ordering should be sufficient, NDTA_NAME can be
116607ca46eSDavid Howells  * used to identify sequences. The initial message can be identified
117607ca46eSDavid Howells  * by checking for NDTA_CONFIG. The device specific messages do
118607ca46eSDavid Howells  * not contain this TLV but have NDTPA_IFINDEX set to the
119607ca46eSDavid Howells  * corresponding interface index.
120607ca46eSDavid Howells  *
121607ca46eSDavid Howells  * To change neighbour table attributes, send RTM_SETNEIGHTBL
122607ca46eSDavid Howells  * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3],
123607ca46eSDavid Howells  * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked
124607ca46eSDavid Howells  * otherwise. Device specific parameter sets can be changed by
125607ca46eSDavid Howells  * setting NDTPA_IFINDEX to the interface index of the corresponding
126607ca46eSDavid Howells  * device.
127607ca46eSDavid Howells  ****/
128607ca46eSDavid Howells 
129607ca46eSDavid Howells struct ndt_stats {
130607ca46eSDavid Howells 	__u64		ndts_allocs;
131607ca46eSDavid Howells 	__u64		ndts_destroys;
132607ca46eSDavid Howells 	__u64		ndts_hash_grows;
133607ca46eSDavid Howells 	__u64		ndts_res_failed;
134607ca46eSDavid Howells 	__u64		ndts_lookups;
135607ca46eSDavid Howells 	__u64		ndts_hits;
136607ca46eSDavid Howells 	__u64		ndts_rcv_probes_mcast;
137607ca46eSDavid Howells 	__u64		ndts_rcv_probes_ucast;
138607ca46eSDavid Howells 	__u64		ndts_periodic_gc_runs;
139607ca46eSDavid Howells 	__u64		ndts_forced_gc_runs;
140fb811395SRick Jones 	__u64		ndts_table_fulls;
141607ca46eSDavid Howells };
142607ca46eSDavid Howells 
143607ca46eSDavid Howells enum {
144607ca46eSDavid Howells 	NDTPA_UNSPEC,
145607ca46eSDavid Howells 	NDTPA_IFINDEX,			/* u32, unchangeable */
146607ca46eSDavid Howells 	NDTPA_REFCNT,			/* u32, read-only */
147607ca46eSDavid Howells 	NDTPA_REACHABLE_TIME,		/* u64, read-only, msecs */
148607ca46eSDavid Howells 	NDTPA_BASE_REACHABLE_TIME,	/* u64, msecs */
149607ca46eSDavid Howells 	NDTPA_RETRANS_TIME,		/* u64, msecs */
150607ca46eSDavid Howells 	NDTPA_GC_STALETIME,		/* u64, msecs */
151607ca46eSDavid Howells 	NDTPA_DELAY_PROBE_TIME,		/* u64, msecs */
152607ca46eSDavid Howells 	NDTPA_QUEUE_LEN,		/* u32 */
153607ca46eSDavid Howells 	NDTPA_APP_PROBES,		/* u32 */
154607ca46eSDavid Howells 	NDTPA_UCAST_PROBES,		/* u32 */
155607ca46eSDavid Howells 	NDTPA_MCAST_PROBES,		/* u32 */
156607ca46eSDavid Howells 	NDTPA_ANYCAST_DELAY,		/* u64, msecs */
157607ca46eSDavid Howells 	NDTPA_PROXY_DELAY,		/* u64, msecs */
158607ca46eSDavid Howells 	NDTPA_PROXY_QLEN,		/* u32 */
159607ca46eSDavid Howells 	NDTPA_LOCKTIME,			/* u64, msecs */
160607ca46eSDavid Howells 	NDTPA_QUEUE_LENBYTES,		/* u32 */
1618da86466SYOSHIFUJI Hideaki/吉藤英明 	NDTPA_MCAST_REPROBES,		/* u32 */
1622175d87cSNicolas Dichtel 	NDTPA_PAD,
163211da42eSYuwei Wang 	NDTPA_INTERVAL_PROBE_TIME_MS,	/* u64, msecs */
164607ca46eSDavid Howells 	__NDTPA_MAX
165607ca46eSDavid Howells };
166607ca46eSDavid Howells #define NDTPA_MAX (__NDTPA_MAX - 1)
167607ca46eSDavid Howells 
168607ca46eSDavid Howells struct ndtmsg {
169607ca46eSDavid Howells 	__u8		ndtm_family;
170607ca46eSDavid Howells 	__u8		ndtm_pad1;
171607ca46eSDavid Howells 	__u16		ndtm_pad2;
172607ca46eSDavid Howells };
173607ca46eSDavid Howells 
174607ca46eSDavid Howells struct ndt_config {
175607ca46eSDavid Howells 	__u16		ndtc_key_len;
176607ca46eSDavid Howells 	__u16		ndtc_entry_size;
177607ca46eSDavid Howells 	__u32		ndtc_entries;
178607ca46eSDavid Howells 	__u32		ndtc_last_flush;	/* delta to now in msecs */
179607ca46eSDavid Howells 	__u32		ndtc_last_rand;		/* delta to now in msecs */
180607ca46eSDavid Howells 	__u32		ndtc_hash_rnd;
181607ca46eSDavid Howells 	__u32		ndtc_hash_mask;
182607ca46eSDavid Howells 	__u32		ndtc_hash_chain_gc;
183607ca46eSDavid Howells 	__u32		ndtc_proxy_qlen;
184607ca46eSDavid Howells };
185607ca46eSDavid Howells 
186607ca46eSDavid Howells enum {
187607ca46eSDavid Howells 	NDTA_UNSPEC,
188607ca46eSDavid Howells 	NDTA_NAME,			/* char *, unchangeable */
189607ca46eSDavid Howells 	NDTA_THRESH1,			/* u32 */
190607ca46eSDavid Howells 	NDTA_THRESH2,			/* u32 */
191607ca46eSDavid Howells 	NDTA_THRESH3,			/* u32 */
192607ca46eSDavid Howells 	NDTA_CONFIG,			/* struct ndt_config, read-only */
193607ca46eSDavid Howells 	NDTA_PARMS,			/* nested TLV NDTPA_* */
194607ca46eSDavid Howells 	NDTA_STATS,			/* struct ndt_stats, read-only */
195607ca46eSDavid Howells 	NDTA_GC_INTERVAL,		/* u64, msecs */
1962175d87cSNicolas Dichtel 	NDTA_PAD,
197607ca46eSDavid Howells 	__NDTA_MAX
198607ca46eSDavid Howells };
199607ca46eSDavid Howells #define NDTA_MAX (__NDTA_MAX - 1)
200607ca46eSDavid Howells 
20131cbc39bSNikolay Aleksandrov  /* FDB activity notification bits used in NFEA_ACTIVITY_NOTIFY:
20231cbc39bSNikolay Aleksandrov   * - FDB_NOTIFY_BIT - notify on activity/expire for any entry
20331cbc39bSNikolay Aleksandrov   * - FDB_NOTIFY_INACTIVE_BIT - mark as inactive to avoid multiple notifications
20431cbc39bSNikolay Aleksandrov   */
20531cbc39bSNikolay Aleksandrov enum {
20631cbc39bSNikolay Aleksandrov 	FDB_NOTIFY_BIT		= (1 << 0),
20731cbc39bSNikolay Aleksandrov 	FDB_NOTIFY_INACTIVE_BIT	= (1 << 1)
20831cbc39bSNikolay Aleksandrov };
20931cbc39bSNikolay Aleksandrov 
210899426b3SNikolay Aleksandrov /* embedded into NDA_FDB_EXT_ATTRS:
211899426b3SNikolay Aleksandrov  * [NDA_FDB_EXT_ATTRS] = {
21231cbc39bSNikolay Aleksandrov  *     [NFEA_ACTIVITY_NOTIFY]
213899426b3SNikolay Aleksandrov  *     ...
214899426b3SNikolay Aleksandrov  * }
215899426b3SNikolay Aleksandrov  */
216899426b3SNikolay Aleksandrov enum {
217899426b3SNikolay Aleksandrov 	NFEA_UNSPEC,
21831cbc39bSNikolay Aleksandrov 	NFEA_ACTIVITY_NOTIFY,
219b5f1d9ecSNikolay Aleksandrov 	NFEA_DONT_REFRESH,
220899426b3SNikolay Aleksandrov 	__NFEA_MAX
221899426b3SNikolay Aleksandrov };
222899426b3SNikolay Aleksandrov #define NFEA_MAX (__NFEA_MAX - 1)
223899426b3SNikolay Aleksandrov 
224607ca46eSDavid Howells #endif
225