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