/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2022 Alexander V. Chernikov * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* * Neighbors-related (RTM_NEIGH) message header and attributes. */ #ifndef _NETLINK_ROUTE_NEIGH_H_ #define _NETLINK_ROUTE_NEIGH_H_ /* Base header for all of the relevant messages */ struct ndmsg { uint8_t ndm_family; uint8_t ndm_pad1; uint16_t ndm_pad2; int32_t ndm_ifindex; uint16_t ndm_state; uint8_t ndm_flags; uint8_t ndm_type; }; /* Attributes */ enum { NDA_UNSPEC, NDA_DST, /* binary: neigh l3 address */ NDA_LLADDR, /* binary: neigh link-level address */ NDA_CACHEINFO, /* binary, struct nda_cacheinfo */ NDA_PROBES, /* u32: number of probes sent */ NDA_VLAN, /* upper 802.1Q tag */ NDA_PORT, /* not supported */ NDA_VNI, /* not supported */ NDA_IFINDEX, /* interface index */ NDA_MASTER, /* not supported */ NDA_LINK_NETNSID, /* not supported */ NDA_SRC_VNI, /* not supported */ NDA_PROTOCOL, /* XXX */ NDA_NH_ID, /* not supported */ NDA_FDB_EXT_ATTRS, /* not supported */ NDA_FLAGS_EXT, /* u32: ndm_flags */ NDA_NDM_STATE_MASK, /* XXX */ NDA_NDM_FLAGS_MASK, /* XXX */ NDA_FREEBSD, /* nested: FreeBSD-specific */ __NDA_MAX }; #define NDA_MAX (__NDA_MAX - 1) enum { NDAF_UNSPEC, NDAF_NEXT_STATE_TS, /* (u32) seconds from time_uptime when moving to the next state */ }; /* ndm_flags / NDA_FLAGS_EXT */ #define NTF_USE 0x0001 /* XXX */ #define NTF_SELF 0x0002 /* local station */ #define NTF_MASTER 0x0004 /* XXX */ #define NTF_PROXY 0x0008 /* proxy entry */ #define NTF_EXT_LEARNED 0x0010 /* not used */ #define NTF_OFFLOADED 0x0020 /* not used */ #define NTF_STICKY 0x0040 /* permanent entry */ #define NTF_ROUTER 0x0080 /* dst indicated itself as a router */ /* start of NDA_FLAGS_EXT */ #define NTF_EXT_MANAGED 0x0100 /* not used */ /* ndm_state */ #define NUD_INCOMPLETE 0x01 /* No lladdr, address resolution in progress */ #define NUD_REACHABLE 0x02 /* reachable & recently resolved */ #define NUD_STALE 0x04 /* has lladdr but it's stale */ #define NUD_DELAY 0x08 /* has lladdr, is stale, probes delayed */ #define NUD_PROBE 0x10 /* has lladdr, is stale, probes sent */ #define NUD_FAILED 0x20 /* unused */ /* Dummy states */ #define NUD_NOARP 0x40 /* not used */ #define NUD_PERMANENT 0x80 /* not flushed */ #define NUD_NONE 0x00 /* NDA_CACHEINFO */ struct nda_cacheinfo { uint32_t ndm_confirmed; /* seconds since ARP/ND was received from neigh */ uint32_t ndm_used; /* seconds since last used (not provided) */ uint32_t ndm_updated; /* seconds since state was updated last */ uint32_t ndm_refcnt; /* number of references held */ }; #endif