[BACK]Return to nd6.h CVS log [TXT][DIR] Up to [local] / sys / netinet6

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