1  /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2  #ifndef __LINUX_NEIGHBOUR_H
3  #define __LINUX_NEIGHBOUR_H
4  
5  #include <linux/types.h>
6  #include <linux/netlink.h>
7  
8  struct ndmsg {
9  	__u8		ndm_family;
10  	__u8		ndm_pad1;
11  	__u16		ndm_pad2;
12  	__s32		ndm_ifindex;
13  	__u16		ndm_state;
14  	__u8		ndm_flags;
15  	__u8		ndm_type;
16  };
17  
18  enum {
19  	NDA_UNSPEC,
20  	NDA_DST,
21  	NDA_LLADDR,
22  	NDA_CACHEINFO,
23  	NDA_PROBES,
24  	NDA_VLAN,
25  	NDA_PORT,
26  	NDA_VNI,
27  	NDA_IFINDEX,
28  	NDA_MASTER,
29  	NDA_LINK_NETNSID,
30  	NDA_SRC_VNI,
31  	NDA_PROTOCOL,  /* Originator of entry */
32  	NDA_NH_ID,
33  	NDA_FDB_EXT_ATTRS,
34  	NDA_FLAGS_EXT,
35  	NDA_NDM_STATE_MASK,
36  	NDA_NDM_FLAGS_MASK,
37  	__NDA_MAX
38  };
39  
40  #define NDA_MAX (__NDA_MAX - 1)
41  
42  /*
43   *	Neighbor Cache Entry Flags
44   */
45  
46  #define NTF_USE		(1 << 0)
47  #define NTF_SELF	(1 << 1)
48  #define NTF_MASTER	(1 << 2)
49  #define NTF_PROXY	(1 << 3)	/* == ATF_PUBL */
50  #define NTF_EXT_LEARNED	(1 << 4)
51  #define NTF_OFFLOADED   (1 << 5)
52  #define NTF_STICKY	(1 << 6)
53  #define NTF_ROUTER	(1 << 7)
54  /* Extended flags under NDA_FLAGS_EXT: */
55  #define NTF_EXT_MANAGED		(1 << 0)
56  #define NTF_EXT_LOCKED		(1 << 1)
57  
58  /*
59   *	Neighbor Cache Entry States.
60   */
61  
62  #define NUD_INCOMPLETE	0x01
63  #define NUD_REACHABLE	0x02
64  #define NUD_STALE	0x04
65  #define NUD_DELAY	0x08
66  #define NUD_PROBE	0x10
67  #define NUD_FAILED	0x20
68  
69  /* Dummy states */
70  #define NUD_NOARP	0x40
71  #define NUD_PERMANENT	0x80
72  #define NUD_NONE	0x00
73  
74  /* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change and make no
75   * address resolution or NUD.
76   *
77   * NUD_PERMANENT also cannot be deleted by garbage collectors. This holds true
78   * for dynamic entries with NTF_EXT_LEARNED flag as well. However, upon carrier
79   * down event, NUD_PERMANENT entries are not flushed whereas NTF_EXT_LEARNED
80   * flagged entries explicitly are (which is also consistent with the routing
81   * subsystem).
82   *
83   * When NTF_EXT_LEARNED is set for a bridge fdb entry the different cache entry
84   * states don't make sense and thus are ignored. Such entries don't age and
85   * can roam.
86   *
87   * NTF_EXT_MANAGED flagged neigbor entries are managed by the kernel on behalf
88   * of a user space control plane, and automatically refreshed so that (if
89   * possible) they remain in NUD_REACHABLE state.
90   *
91   * NTF_EXT_LOCKED flagged bridge FDB entries are entries generated by the
92   * bridge in response to a host trying to communicate via a locked bridge port
93   * with MAB enabled. Their purpose is to notify user space that a host requires
94   * authentication.
95   */
96  
97  struct nda_cacheinfo {
98  	__u32		ndm_confirmed;
99  	__u32		ndm_used;
100  	__u32		ndm_updated;
101  	__u32		ndm_refcnt;
102  };
103  
104  /*****************************************************************
105   *		Neighbour tables specific messages.
106   *
107   * To retrieve the neighbour tables send RTM_GETNEIGHTBL with the
108   * NLM_F_DUMP flag set. Every neighbour table configuration is
109   * spread over multiple messages to avoid running into message
110   * size limits on systems with many interfaces. The first message
111   * in the sequence transports all not device specific data such as
112   * statistics, configuration, and the default parameter set.
113   * This message is followed by 0..n messages carrying device
114   * specific parameter sets.
115   * Although the ordering should be sufficient, NDTA_NAME can be
116   * used to identify sequences. The initial message can be identified
117   * by checking for NDTA_CONFIG. The device specific messages do
118   * not contain this TLV but have NDTPA_IFINDEX set to the
119   * corresponding interface index.
120   *
121   * To change neighbour table attributes, send RTM_SETNEIGHTBL
122   * with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3],
123   * NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked
124   * otherwise. Device specific parameter sets can be changed by
125   * setting NDTPA_IFINDEX to the interface index of the corresponding
126   * device.
127   ****/
128  
129  struct ndt_stats {
130  	__u64		ndts_allocs;
131  	__u64		ndts_destroys;
132  	__u64		ndts_hash_grows;
133  	__u64		ndts_res_failed;
134  	__u64		ndts_lookups;
135  	__u64		ndts_hits;
136  	__u64		ndts_rcv_probes_mcast;
137  	__u64		ndts_rcv_probes_ucast;
138  	__u64		ndts_periodic_gc_runs;
139  	__u64		ndts_forced_gc_runs;
140  	__u64		ndts_table_fulls;
141  };
142  
143  enum {
144  	NDTPA_UNSPEC,
145  	NDTPA_IFINDEX,			/* u32, unchangeable */
146  	NDTPA_REFCNT,			/* u32, read-only */
147  	NDTPA_REACHABLE_TIME,		/* u64, read-only, msecs */
148  	NDTPA_BASE_REACHABLE_TIME,	/* u64, msecs */
149  	NDTPA_RETRANS_TIME,		/* u64, msecs */
150  	NDTPA_GC_STALETIME,		/* u64, msecs */
151  	NDTPA_DELAY_PROBE_TIME,		/* u64, msecs */
152  	NDTPA_QUEUE_LEN,		/* u32 */
153  	NDTPA_APP_PROBES,		/* u32 */
154  	NDTPA_UCAST_PROBES,		/* u32 */
155  	NDTPA_MCAST_PROBES,		/* u32 */
156  	NDTPA_ANYCAST_DELAY,		/* u64, msecs */
157  	NDTPA_PROXY_DELAY,		/* u64, msecs */
158  	NDTPA_PROXY_QLEN,		/* u32 */
159  	NDTPA_LOCKTIME,			/* u64, msecs */
160  	NDTPA_QUEUE_LENBYTES,		/* u32 */
161  	NDTPA_MCAST_REPROBES,		/* u32 */
162  	NDTPA_PAD,
163  	NDTPA_INTERVAL_PROBE_TIME_MS,	/* u64, msecs */
164  	__NDTPA_MAX
165  };
166  #define NDTPA_MAX (__NDTPA_MAX - 1)
167  
168  struct ndtmsg {
169  	__u8		ndtm_family;
170  	__u8		ndtm_pad1;
171  	__u16		ndtm_pad2;
172  };
173  
174  struct ndt_config {
175  	__u16		ndtc_key_len;
176  	__u16		ndtc_entry_size;
177  	__u32		ndtc_entries;
178  	__u32		ndtc_last_flush;	/* delta to now in msecs */
179  	__u32		ndtc_last_rand;		/* delta to now in msecs */
180  	__u32		ndtc_hash_rnd;
181  	__u32		ndtc_hash_mask;
182  	__u32		ndtc_hash_chain_gc;
183  	__u32		ndtc_proxy_qlen;
184  };
185  
186  enum {
187  	NDTA_UNSPEC,
188  	NDTA_NAME,			/* char *, unchangeable */
189  	NDTA_THRESH1,			/* u32 */
190  	NDTA_THRESH2,			/* u32 */
191  	NDTA_THRESH3,			/* u32 */
192  	NDTA_CONFIG,			/* struct ndt_config, read-only */
193  	NDTA_PARMS,			/* nested TLV NDTPA_* */
194  	NDTA_STATS,			/* struct ndt_stats, read-only */
195  	NDTA_GC_INTERVAL,		/* u64, msecs */
196  	NDTA_PAD,
197  	__NDTA_MAX
198  };
199  #define NDTA_MAX (__NDTA_MAX - 1)
200  
201   /* FDB activity notification bits used in NFEA_ACTIVITY_NOTIFY:
202    * - FDB_NOTIFY_BIT - notify on activity/expire for any entry
203    * - FDB_NOTIFY_INACTIVE_BIT - mark as inactive to avoid multiple notifications
204    */
205  enum {
206  	FDB_NOTIFY_BIT		= (1 << 0),
207  	FDB_NOTIFY_INACTIVE_BIT	= (1 << 1)
208  };
209  
210  /* embedded into NDA_FDB_EXT_ATTRS:
211   * [NDA_FDB_EXT_ATTRS] = {
212   *     [NFEA_ACTIVITY_NOTIFY]
213   *     ...
214   * }
215   */
216  enum {
217  	NFEA_UNSPEC,
218  	NFEA_ACTIVITY_NOTIFY,
219  	NFEA_DONT_REFRESH,
220  	__NFEA_MAX
221  };
222  #define NFEA_MAX (__NFEA_MAX - 1)
223  
224  #endif
225