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