1*e53a363eSroy /* $NetBSD: nd.h,v 1.3 2020/09/15 10:05:36 roy Exp $ */ 29d417b36Sroy 39d417b36Sroy /* 49d417b36Sroy * Copyright (c) 2020 The NetBSD Foundation, Inc. 59d417b36Sroy * 69d417b36Sroy * This code is derived from software contributed to The NetBSD Foundation 79d417b36Sroy * by Roy Marples. 89d417b36Sroy * 99d417b36Sroy * Redistribution and use in source and binary forms, with or without 109d417b36Sroy * modification, are permitted provided that the following conditions 119d417b36Sroy * are met: 129d417b36Sroy * 1. Redistributions of source code must retain the above copyright 139d417b36Sroy * notice, this list of conditions and the following disclaimer. 149d417b36Sroy * 2. Redistributions in binary form must reproduce the above copyright 159d417b36Sroy * notice, this list of conditions and the following disclaimer in the 169d417b36Sroy * documentation and/or other materials provided with the distribution. 179d417b36Sroy * 189d417b36Sroy * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 199d417b36Sroy * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 209d417b36Sroy * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 219d417b36Sroy * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 229d417b36Sroy * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 239d417b36Sroy * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 249d417b36Sroy * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 259d417b36Sroy * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 269d417b36Sroy * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 279d417b36Sroy * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 289d417b36Sroy */ 299d417b36Sroy 309d417b36Sroy #ifndef _NET_ND_H_ 319d417b36Sroy #define _NET_ND_H_ 329d417b36Sroy 339d417b36Sroy /* ND LLINFO states */ 349d417b36Sroy #define ND_LLINFO_PURGE -3 359d417b36Sroy #define ND_LLINFO_NOSTATE -2 369d417b36Sroy #define ND_LLINFO_WAITDELETE -1 379d417b36Sroy #define ND_LLINFO_INCOMPLETE 0 389d417b36Sroy #define ND_LLINFO_REACHABLE 1 399d417b36Sroy #define ND_LLINFO_STALE 2 409d417b36Sroy #define ND_LLINFO_DELAY 3 419d417b36Sroy #define ND_LLINFO_PROBE 4 42*e53a363eSroy #define ND_LLINFO_UNREACHABLE 5 439d417b36Sroy 449d417b36Sroy #ifdef _KERNEL 459d417b36Sroy #define ND_IS_LLINFO_PROBREACH(ln) \ 469d417b36Sroy ((ln)->ln_state > ND_LLINFO_INCOMPLETE) 479d417b36Sroy #define ND_IS_LLINFO_PERMANENT(ln) \ 489d417b36Sroy (((ln)->ln_expire == 0) && ((ln)->ln_state > ND_LLINFO_INCOMPLETE)) 499d417b36Sroy 509d417b36Sroy /* ND timer types */ 519d417b36Sroy #define ND_TIMER_IMMEDIATE 0 529d417b36Sroy #define ND_TIMER_TICK 1 539d417b36Sroy #define ND_TIMER_REACHABLE 2 549d417b36Sroy #define ND_TIMER_RETRANS 3 55*e53a363eSroy #define ND_TIMER_RETRANS_BACKOFF 4 56*e53a363eSroy #define ND_TIMER_EXPIRE 5 57*e53a363eSroy #define ND_TIMER_DELAY 6 58*e53a363eSroy #define ND_TIMER_GC 7 599d417b36Sroy 609d417b36Sroy /* node constants */ 619d417b36Sroy #define MAX_REACHABLE_TIME 3600000 /* msec */ 629d417b36Sroy #define REACHABLE_TIME 30000 /* msec */ 639d417b36Sroy #define RETRANS_TIMER 1000 /* msec */ 64*e53a363eSroy #define MAX_RETRANS_TIMER 60000 /* msec */ 65*e53a363eSroy #define BACKOFF_MULTIPLE 3 669d417b36Sroy #define MIN_RANDOM_FACTOR 512 /* 1024 * 0.5 */ 679d417b36Sroy #define MAX_RANDOM_FACTOR 1536 /* 1024 * 1.5 */ 689d417b36Sroy #define ND_COMPUTE_RTIME(x) \ 699d417b36Sroy ((MIN_RANDOM_FACTOR * (x >> 10)) + (cprng_fast32() & \ 709d417b36Sroy ((MAX_RANDOM_FACTOR - MIN_RANDOM_FACTOR) * (x >> 10)))) 719d417b36Sroy 729d417b36Sroy struct nd_domain { 739d417b36Sroy int nd_family; 749d417b36Sroy int nd_delay; /* delay first probe time in seconds */ 759d417b36Sroy int nd_mmaxtries; /* maximum multicast query */ 769d417b36Sroy int nd_umaxtries; /* maximum unicast query */ 77*e53a363eSroy int nd_retransmultiple; /* retransmission multiplier for backoff */ 78*e53a363eSroy int nd_maxretrans; /* maximum retransmission time in msec */ 799d417b36Sroy int nd_maxnudhint; /* max # of subsequent upper layer hints */ 809d417b36Sroy int nd_maxqueuelen; /* max # of packets in unresolved ND entries */ 819d417b36Sroy bool (*nd_nud_enabled)(struct ifnet *); 829d417b36Sroy unsigned int (*nd_reachable)(struct ifnet *); /* msec */ 839d417b36Sroy unsigned int (*nd_retrans)(struct ifnet *); /* msec */ 8420c15691Sroy union l3addr *(*nd_holdsrc)(struct llentry *, union l3addr *); 8520c15691Sroy void (*nd_output)(struct ifnet *, const union l3addr *, 8620c15691Sroy const union l3addr *, const uint8_t *, const union l3addr *); 87*e53a363eSroy void (*nd_missed)(struct ifnet *, const union l3addr *, 88*e53a363eSroy int16_t, struct mbuf *); 899d417b36Sroy void (*nd_free)(struct llentry *, int); 909d417b36Sroy }; 919d417b36Sroy 929d417b36Sroy int nd_resolve(struct llentry *, const struct rtentry *, struct mbuf *, 939d417b36Sroy uint8_t *, size_t); 949d417b36Sroy void nd_set_timer(struct llentry *, int); 959d417b36Sroy void nd_nud_hint(struct llentry *); 969d417b36Sroy 979d417b36Sroy void nd_attach_domain(struct nd_domain *); 989d417b36Sroy #endif /* !_KERNEL */ 999d417b36Sroy #endif /* !_NET_ND_H_ */ 100