Annotation of sys/netinet6/nd6.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: nd6.h,v 1.25 2003/07/08 21:43:18 itojun Exp $ */
! 2: /* $KAME: nd6.h,v 1.95 2002/06/08 11:31:06 itojun Exp $ */
! 3:
! 4: /*
! 5: * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. Neither the name of the project nor the names of its contributors
! 17: * may be used to endorse or promote products derived from this software
! 18: * without specific prior written permission.
! 19: *
! 20: * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
! 21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 23: * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
! 24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 30: * SUCH DAMAGE.
! 31: */
! 32:
! 33: #ifndef _NETINET6_ND6_H_
! 34: #define _NETINET6_ND6_H_
! 35:
! 36: /* see net/route.h, or net/if_inarp.h */
! 37: #ifndef RTF_ANNOUNCE
! 38: #define RTF_ANNOUNCE RTF_PROTO2
! 39: #endif
! 40:
! 41: #include <sys/queue.h>
! 42: #include <sys/timeout.h>
! 43:
! 44: struct llinfo_nd6 {
! 45: struct llinfo_nd6 *ln_next;
! 46: struct llinfo_nd6 *ln_prev;
! 47: struct rtentry *ln_rt;
! 48: struct mbuf *ln_hold; /* last packet until resolved/timeout */
! 49: long ln_asked; /* number of queries already sent for this addr */
! 50: u_long ln_expire; /* lifetime for NDP state transition */
! 51: short ln_state; /* reachability state */
! 52: short ln_router; /* 2^0: ND6 router bit */
! 53: int ln_byhint; /* # of times we made it reachable by UL hint */
! 54:
! 55: long ln_ntick;
! 56: struct timeout ln_timer_ch;
! 57: };
! 58:
! 59: #define ND6_LLINFO_NOSTATE -2
! 60: /*
! 61: * We don't need the WAITDELETE state any more, but we keep the definition
! 62: * in a comment line instead of removing it. This is necessary to avoid
! 63: * unintentionally reusing the value for another purpose, which might
! 64: * affect backward compatibility with old applications.
! 65: * (20000711 jinmei@kame.net)
! 66: */
! 67: /* #define ND6_LLINFO_WAITDELETE -1 */
! 68: #define ND6_LLINFO_INCOMPLETE 0
! 69: #define ND6_LLINFO_REACHABLE 1
! 70: #define ND6_LLINFO_STALE 2
! 71: #define ND6_LLINFO_DELAY 3
! 72: #define ND6_LLINFO_PROBE 4
! 73:
! 74: #define ND6_IS_LLINFO_PROBREACH(n) ((n)->ln_state > ND6_LLINFO_INCOMPLETE)
! 75: #define ND6_LLINFO_PERMANENT(n) ((n)->ln_expire == 0)
! 76:
! 77: struct nd_ifinfo {
! 78: u_int32_t linkmtu; /* LinkMTU */
! 79: u_int32_t maxmtu; /* Upper bound of LinkMTU */
! 80: u_int32_t basereachable; /* BaseReachableTime */
! 81: u_int32_t reachable; /* Reachable Time */
! 82: u_int32_t retrans; /* Retrans Timer */
! 83: u_int32_t flags; /* Flags */
! 84: int recalctm; /* BaseReacable re-calculation timer */
! 85: u_int8_t chlim; /* CurHopLimit */
! 86: u_int8_t initialized; /* Flag to see the entry is initialized */
! 87: /* the following 3 members are for privacy extension for addrconf */
! 88: u_int8_t randomseed0[8]; /* upper 64 bits of MD5 digest */
! 89: u_int8_t randomseed1[8]; /* lower 64 bits (usually the EUI64 IFID) */
! 90: u_int8_t randomid[8]; /* current random ID */
! 91: };
! 92:
! 93: #define ND6_IFF_PERFORMNUD 0x1
! 94: #define ND6_IFF_ACCEPT_RTADV 0x2
! 95:
! 96: #ifdef _KERNEL
! 97: #define ND_IFINFO(ifp) \
! 98: (((struct in6_ifextra *)(ifp)->if_afdata[AF_INET6])->nd_ifinfo)
! 99: #define IN6_LINKMTU(ifp) \
! 100: ((ND_IFINFO(ifp)->linkmtu && ND_IFINFO(ifp)->linkmtu < (ifp)->if_mtu) \
! 101: ? ND_IFINFO(ifp)->linkmtu \
! 102: : ((ND_IFINFO(ifp)->maxmtu && ND_IFINFO(ifp)->maxmtu < (ifp)->if_mtu) \
! 103: ? ND_IFINFO(ifp)->maxmtu : (ifp)->if_mtu))
! 104: #endif
! 105:
! 106: struct in6_nbrinfo {
! 107: char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */
! 108: struct in6_addr addr; /* IPv6 address of the neighbor */
! 109: long asked; /* number of queries already sent for this addr */
! 110: int isrouter; /* if it acts as a router */
! 111: int state; /* reachability state */
! 112: int expire; /* lifetime for NDP state transition */
! 113: };
! 114:
! 115: #define DRLSTSIZ 10
! 116: #define PRLSTSIZ 10
! 117: struct in6_drlist {
! 118: char ifname[IFNAMSIZ];
! 119: struct {
! 120: struct in6_addr rtaddr;
! 121: u_char flags;
! 122: u_short rtlifetime;
! 123: u_long expire;
! 124: u_short if_index;
! 125: } defrouter[DRLSTSIZ];
! 126: };
! 127:
! 128: struct in6_defrouter {
! 129: struct sockaddr_in6 rtaddr;
! 130: u_char flags;
! 131: u_short rtlifetime;
! 132: u_long expire;
! 133: u_short if_index;
! 134: };
! 135:
! 136: #ifdef _KERNEL
! 137: struct in6_oprlist {
! 138: char ifname[IFNAMSIZ];
! 139: struct {
! 140: struct in6_addr prefix;
! 141: struct prf_ra raflags;
! 142: u_char prefixlen;
! 143: u_char origin;
! 144: u_long vltime;
! 145: u_long pltime;
! 146: u_long expire;
! 147: u_short if_index;
! 148: u_short advrtrs; /* number of advertisement routers */
! 149: struct in6_addr advrtr[DRLSTSIZ]; /* XXX: explicit limit */
! 150: } prefix[PRLSTSIZ];
! 151: };
! 152: #endif
! 153:
! 154: struct in6_prlist {
! 155: char ifname[IFNAMSIZ];
! 156: struct {
! 157: struct in6_addr prefix;
! 158: struct prf_ra raflags;
! 159: u_char prefixlen;
! 160: u_char origin;
! 161: u_int32_t vltime;
! 162: u_int32_t pltime;
! 163: time_t expire;
! 164: u_short if_index;
! 165: u_short advrtrs; /* number of advertisement routers */
! 166: struct in6_addr advrtr[DRLSTSIZ]; /* XXX: explicit limit */
! 167: } prefix[PRLSTSIZ];
! 168: };
! 169:
! 170: struct in6_prefix {
! 171: struct sockaddr_in6 prefix;
! 172: struct prf_ra raflags;
! 173: u_char prefixlen;
! 174: u_char origin;
! 175: u_int32_t vltime;
! 176: u_int32_t pltime;
! 177: time_t expire;
! 178: u_int32_t flags;
! 179: int refcnt;
! 180: u_short if_index;
! 181: u_short advrtrs; /* number of advertisement routers */
! 182: /* struct sockaddr_in6 advrtr[] */
! 183: };
! 184:
! 185: #ifdef _KERNEL
! 186: struct in6_ondireq {
! 187: char ifname[IFNAMSIZ];
! 188: struct {
! 189: u_int32_t linkmtu; /* LinkMTU */
! 190: u_int32_t maxmtu; /* Upper bound of LinkMTU */
! 191: u_int32_t basereachable; /* BaseReachableTime */
! 192: u_int32_t reachable; /* Reachable Time */
! 193: u_int32_t retrans; /* Retrans Timer */
! 194: u_int32_t flags; /* Flags */
! 195: int recalctm; /* BaseReacable re-calculation timer */
! 196: u_int8_t chlim; /* CurHopLimit */
! 197: u_int8_t receivedra;
! 198: } ndi;
! 199: };
! 200: #endif
! 201:
! 202: struct in6_ndireq {
! 203: char ifname[IFNAMSIZ];
! 204: struct nd_ifinfo ndi;
! 205: };
! 206:
! 207: struct in6_ndifreq {
! 208: char ifname[IFNAMSIZ];
! 209: u_long ifindex;
! 210: };
! 211:
! 212: /* Prefix status */
! 213: #define NDPRF_ONLINK 0x1
! 214: #define NDPRF_DETACHED 0x2
! 215: #define NDPRF_HOME 0x4
! 216:
! 217: /* protocol constants */
! 218: #define MAX_RTR_SOLICITATION_DELAY 1 /*1sec*/
! 219: #define RTR_SOLICITATION_INTERVAL 4 /*4sec*/
! 220: #define MAX_RTR_SOLICITATIONS 3
! 221:
! 222: #define ND6_INFINITE_LIFETIME 0xffffffff
! 223:
! 224: #ifdef _KERNEL
! 225: /* node constants */
! 226: #define MAX_REACHABLE_TIME 3600000 /* msec */
! 227: #define REACHABLE_TIME 30000 /* msec */
! 228: #define RETRANS_TIMER 1000 /* msec */
! 229: #define MIN_RANDOM_FACTOR 512 /* 1024 * 0.5 */
! 230: #define MAX_RANDOM_FACTOR 1536 /* 1024 * 1.5 */
! 231: #define ND_COMPUTE_RTIME(x) \
! 232: (((MIN_RANDOM_FACTOR * (x >> 10)) + (arc4random() & \
! 233: ((MAX_RANDOM_FACTOR - MIN_RANDOM_FACTOR) * (x >> 10)))) /1000)
! 234:
! 235: TAILQ_HEAD(nd_drhead, nd_defrouter);
! 236: struct nd_defrouter {
! 237: TAILQ_ENTRY(nd_defrouter) dr_entry;
! 238: struct in6_addr rtaddr;
! 239: u_char flags; /* flags on RA message */
! 240: u_short rtlifetime;
! 241: u_long expire;
! 242: struct ifnet *ifp;
! 243: int installed; /* is installed into kernel routing table */
! 244: };
! 245:
! 246: struct nd_prefix {
! 247: struct ifnet *ndpr_ifp;
! 248: LIST_ENTRY(nd_prefix) ndpr_entry;
! 249: struct sockaddr_in6 ndpr_prefix; /* prefix */
! 250: struct in6_addr ndpr_mask; /* netmask derived from the prefix */
! 251:
! 252: u_int32_t ndpr_vltime; /* advertised valid lifetime */
! 253: u_int32_t ndpr_pltime; /* advertised preferred lifetime */
! 254:
! 255: time_t ndpr_expire; /* expiration time of the prefix */
! 256: time_t ndpr_preferred; /* preferred time of the prefix */
! 257: time_t ndpr_lastupdate; /* reception time of last advertisement */
! 258:
! 259: struct prf_ra ndpr_flags;
! 260: u_int32_t ndpr_stateflags; /* actual state flags */
! 261: /* list of routers that advertise the prefix: */
! 262: LIST_HEAD(pr_rtrhead, nd_pfxrouter) ndpr_advrtrs;
! 263: u_char ndpr_plen;
! 264: int ndpr_refcnt; /* reference couter from addresses */
! 265: };
! 266:
! 267: #define ndpr_next ndpr_entry.le_next
! 268:
! 269: #define ndpr_raf ndpr_flags
! 270: #define ndpr_raf_onlink ndpr_flags.onlink
! 271: #define ndpr_raf_auto ndpr_flags.autonomous
! 272: #define ndpr_raf_router ndpr_flags.router
! 273:
! 274: /*
! 275: * Message format for use in obtaining information about prefixes
! 276: * from inet6 sysctl function
! 277: */
! 278: struct inet6_ndpr_msghdr {
! 279: u_short inpm_msglen; /* to skip over non-understood messages */
! 280: u_char inpm_version; /* future binary compatibility */
! 281: u_char inpm_type; /* message type */
! 282: struct in6_addr inpm_prefix;
! 283: u_long prm_vltim;
! 284: u_long prm_pltime;
! 285: u_long prm_expire;
! 286: u_long prm_preferred;
! 287: struct in6_prflags prm_flags;
! 288: u_short prm_index; /* index for associated ifp */
! 289: u_char prm_plen; /* length of prefix in bits */
! 290: };
! 291:
! 292: #define prm_raf_onlink prm_flags.prf_ra.onlink
! 293: #define prm_raf_auto prm_flags.prf_ra.autonomous
! 294:
! 295: #define prm_statef_onlink prm_flags.prf_state.onlink
! 296:
! 297: #define prm_rrf_decrvalid prm_flags.prf_rr.decrvalid
! 298: #define prm_rrf_decrprefd prm_flags.prf_rr.decrprefd
! 299:
! 300: struct nd_pfxrouter {
! 301: LIST_ENTRY(nd_pfxrouter) pfr_entry;
! 302: #define pfr_next pfr_entry.le_next
! 303: struct nd_defrouter *router;
! 304: };
! 305:
! 306: LIST_HEAD(nd_prhead, nd_prefix);
! 307:
! 308: /* nd6.c */
! 309: extern int nd6_prune;
! 310: extern int nd6_delay;
! 311: extern int nd6_umaxtries;
! 312: extern int nd6_mmaxtries;
! 313: extern int nd6_useloopback;
! 314: extern int nd6_maxnudhint;
! 315: extern int nd6_gctimer;
! 316: extern struct llinfo_nd6 llinfo_nd6;
! 317: extern struct nd_drhead nd_defrouter;
! 318: extern struct nd_prhead nd_prefix;
! 319: extern int nd6_debug;
! 320:
! 321: #define nd6log(x) do { if (nd6_debug) log x; } while (0)
! 322:
! 323: extern struct timeout nd6_timer_ch;
! 324:
! 325: /* nd6_rtr.c */
! 326: extern int nd6_defifindex;
! 327:
! 328: union nd_opts {
! 329: struct nd_opt_hdr *nd_opt_array[9];
! 330: struct {
! 331: struct nd_opt_hdr *zero;
! 332: struct nd_opt_hdr *src_lladdr;
! 333: struct nd_opt_hdr *tgt_lladdr;
! 334: struct nd_opt_prefix_info *pi_beg; /* multiple opts, start */
! 335: struct nd_opt_rd_hdr *rh;
! 336: struct nd_opt_mtu *mtu;
! 337: struct nd_opt_hdr *search; /* multiple opts */
! 338: struct nd_opt_hdr *last; /* multiple opts */
! 339: int done;
! 340: struct nd_opt_prefix_info *pi_end;/* multiple opts, end */
! 341: } nd_opt_each;
! 342: };
! 343: #define nd_opts_src_lladdr nd_opt_each.src_lladdr
! 344: #define nd_opts_tgt_lladdr nd_opt_each.tgt_lladdr
! 345: #define nd_opts_pi nd_opt_each.pi_beg
! 346: #define nd_opts_pi_end nd_opt_each.pi_end
! 347: #define nd_opts_rh nd_opt_each.rh
! 348: #define nd_opts_mtu nd_opt_each.mtu
! 349: #define nd_opts_search nd_opt_each.search
! 350: #define nd_opts_last nd_opt_each.last
! 351: #define nd_opts_done nd_opt_each.done
! 352:
! 353: /* XXX: need nd6_var.h?? */
! 354: /* nd6.c */
! 355: void nd6_init(void);
! 356: struct nd_ifinfo *nd6_ifattach(struct ifnet *);
! 357: void nd6_ifdetach(struct nd_ifinfo *);
! 358: int nd6_is_addr_neighbor(struct sockaddr_in6 *, struct ifnet *);
! 359: void nd6_option_init(void *, int, union nd_opts *);
! 360: struct nd_opt_hdr *nd6_option(union nd_opts *);
! 361: int nd6_options(union nd_opts *);
! 362: struct rtentry *nd6_lookup(struct in6_addr *, int, struct ifnet *);
! 363: void nd6_setmtu(struct ifnet *);
! 364: void nd6_llinfo_settimer(struct llinfo_nd6 *, long);
! 365: void nd6_timer(void *);
! 366: void nd6_purge(struct ifnet *);
! 367: void nd6_nud_hint(struct rtentry *, struct in6_addr *, int);
! 368: int nd6_resolve(struct ifnet *, struct rtentry *,
! 369: struct mbuf *, struct sockaddr *, u_char *);
! 370: void nd6_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
! 371: int nd6_ioctl(u_long, caddr_t, struct ifnet *);
! 372: struct rtentry *nd6_cache_lladdr(struct ifnet *, struct in6_addr *,
! 373: char *, int, int, int);
! 374: int nd6_output(struct ifnet *, struct ifnet *, struct mbuf *,
! 375: struct sockaddr_in6 *, struct rtentry *);
! 376: int nd6_storelladdr(struct ifnet *, struct rtentry *, struct mbuf *,
! 377: struct sockaddr *, u_char *);
! 378: int nd6_sysctl(int, void *, size_t *, void *, size_t);
! 379: int nd6_need_cache(struct ifnet *);
! 380:
! 381: /* nd6_nbr.c */
! 382: void nd6_na_input(struct mbuf *, int, int);
! 383: void nd6_na_output(struct ifnet *, struct in6_addr *,
! 384: struct in6_addr *, u_long, int, struct sockaddr *);
! 385: void nd6_ns_input(struct mbuf *, int, int);
! 386: void nd6_ns_output(struct ifnet *, struct in6_addr *,
! 387: struct in6_addr *, struct llinfo_nd6 *, int);
! 388: caddr_t nd6_ifptomac(struct ifnet *);
! 389: void nd6_dad_start(struct ifaddr *, int *);
! 390: void nd6_dad_stop(struct ifaddr *);
! 391: void nd6_dad_duplicated(struct ifaddr *);
! 392:
! 393: /* nd6_rtr.c */
! 394: void nd6_rs_input(struct mbuf *, int, int);
! 395: void nd6_ra_input(struct mbuf *, int, int);
! 396: void prelist_del(struct nd_prefix *);
! 397: void defrouter_addreq(struct nd_defrouter *);
! 398: void defrouter_reset(void);
! 399: void defrouter_select(void);
! 400: void defrtrlist_del(struct nd_defrouter *);
! 401: void prelist_remove(struct nd_prefix *);
! 402: int prelist_update(struct nd_prefix *, struct nd_defrouter *, struct mbuf *);
! 403: int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
! 404: struct nd_prefix **);
! 405: int nd6_prefix_onlink(struct nd_prefix *);
! 406: int nd6_prefix_offlink(struct nd_prefix *);
! 407: void pfxlist_onlink_check(void);
! 408: struct nd_defrouter *defrouter_lookup(struct in6_addr *, struct ifnet *);
! 409: struct nd_prefix *nd6_prefix_lookup(struct nd_prefix *);
! 410: int in6_ifdel(struct ifnet *, struct in6_addr *);
! 411: int in6_init_prefix_ltimes(struct nd_prefix *ndpr);
! 412: void rt6_flush(struct in6_addr *, struct ifnet *);
! 413: int nd6_setdefaultiface(int);
! 414:
! 415: #endif /* _KERNEL */
! 416:
! 417: #endif /* _NETINET6_ND6_H_ */
CVSweb