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

Annotation of sys/netinet6/ip6_var.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ip6_var.h,v 1.31 2007/06/01 00:52:38 henning Exp $    */
                      2: /*     $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei 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: /*
                     34:  * Copyright (c) 1982, 1986, 1993
                     35:  *     The Regents of the University of California.  All rights reserved.
                     36:  *
                     37:  * Redistribution and use in source and binary forms, with or without
                     38:  * modification, are permitted provided that the following conditions
                     39:  * are met:
                     40:  * 1. Redistributions of source code must retain the above copyright
                     41:  *    notice, this list of conditions and the following disclaimer.
                     42:  * 2. Redistributions in binary form must reproduce the above copyright
                     43:  *    notice, this list of conditions and the following disclaimer in the
                     44:  *    documentation and/or other materials provided with the distribution.
                     45:  * 3. Neither the name of the University nor the names of its contributors
                     46:  *    may be used to endorse or promote products derived from this software
                     47:  *    without specific prior written permission.
                     48:  *
                     49:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     50:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     51:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     52:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     53:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     54:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     55:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     56:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     57:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     58:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     59:  * SUCH DAMAGE.
                     60:  *
                     61:  *     @(#)ip_var.h    8.1 (Berkeley) 6/10/93
                     62:  */
                     63:
                     64: #ifndef _NETINET6_IP6_VAR_H_
                     65: #define _NETINET6_IP6_VAR_H_
                     66:
                     67: /*
                     68:  * IP6 reassembly queue structure.  Each fragment
                     69:  * being reassembled is attached to one of these structures.
                     70:  */
                     71: struct ip6q {
                     72:        u_int32_t       ip6q_head;
                     73:        u_int16_t       ip6q_len;
                     74:        u_int8_t        ip6q_nxt;       /* ip6f_nxt in first fragment */
                     75:        u_int8_t        ip6q_hlim;
                     76:        struct ip6asfrag *ip6q_down;
                     77:        struct ip6asfrag *ip6q_up;
                     78:        u_int32_t       ip6q_ident;
                     79:        u_int8_t        ip6q_arrive;
                     80:        u_int8_t        ip6q_ttl;
                     81:        struct in6_addr ip6q_src, ip6q_dst;
                     82:        struct ip6q     *ip6q_next;
                     83:        struct ip6q     *ip6q_prev;
                     84:        int             ip6q_unfrglen;  /* len of unfragmentable part */
                     85: #ifdef notyet
                     86:        u_char          *ip6q_nxtp;
                     87: #endif
                     88:        int             ip6q_nfrag;     /* # of fragments */
                     89: };
                     90:
                     91: struct ip6asfrag {
                     92:        u_int32_t       ip6af_head;
                     93:        u_int16_t       ip6af_len;
                     94:        u_int8_t        ip6af_nxt;
                     95:        u_int8_t        ip6af_hlim;
                     96:        /* must not override the above members during reassembling */
                     97:        struct ip6asfrag *ip6af_down;
                     98:        struct ip6asfrag *ip6af_up;
                     99:        struct mbuf     *ip6af_m;
                    100:        int             ip6af_offset;   /* offset in ip6af_m to next header */
                    101:        int             ip6af_frglen;   /* fragmentable part length */
                    102:        int             ip6af_off;      /* fragment offset */
                    103:        u_int16_t       ip6af_mff;      /* more fragment bit in frag off */
                    104: };
                    105:
                    106: #define IP6_REASS_MBUF(ip6af) ((ip6af)->ip6af_m)
                    107:
                    108: struct ip6_moptions {
                    109:        struct  ifnet *im6o_multicast_ifp; /* ifp for outgoing multicasts */
                    110:        u_char  im6o_multicast_hlim;    /* hoplimit for outgoing multicasts */
                    111:        u_char  im6o_multicast_loop;    /* 1 >= hear sends if a member */
                    112:        LIST_HEAD(, in6_multi_mship) im6o_memberships;
                    113: };
                    114:
                    115: /*
                    116:  * Control options for outgoing packets
                    117:  */
                    118:
                    119: /* Routing header related info */
                    120: struct ip6po_rhinfo {
                    121:        struct  ip6_rthdr *ip6po_rhi_rthdr; /* Routing header */
                    122:        struct  route_in6 ip6po_rhi_route; /* Route to the 1st hop */
                    123: };
                    124: #define ip6po_rthdr    ip6po_rhinfo.ip6po_rhi_rthdr
                    125: #define ip6po_route    ip6po_rhinfo.ip6po_rhi_route
                    126:
                    127: /* Nexthop related info */
                    128: struct ip6po_nhinfo {
                    129:        struct sockaddr *ip6po_nhi_nexthop;
                    130:        struct route_in6 ip6po_nhi_route;
                    131: };
                    132: #define ip6po_nexthop  ip6po_nhinfo.ip6po_nhi_nexthop
                    133: #define ip6po_nextroute        ip6po_nhinfo.ip6po_nhi_route
                    134:
                    135: struct ip6_pktopts {
                    136:        /* Hoplimit for outgoing packets */
                    137:        int     ip6po_hlim;
                    138:
                    139:        /* Outgoing IF/address information */
                    140:        struct in6_pktinfo *ip6po_pktinfo;
                    141:
                    142:        /* Next-hop address information */
                    143:        struct  ip6po_nhinfo ip6po_nhinfo;
                    144:
                    145:        /* Hop-by-Hop options header */
                    146:        struct  ip6_hbh *ip6po_hbh;
                    147:
                    148:        /* Destination options header (before a routing header) */
                    149:        struct  ip6_dest *ip6po_dest1;
                    150:
                    151:        /* Routing header related info. */
                    152:        struct  ip6po_rhinfo ip6po_rhinfo;
                    153:
                    154:        /* Destination options header (after a routing header) */
                    155:        struct  ip6_dest *ip6po_dest2;
                    156:
                    157:        /* traffic class */
                    158:        int     ip6po_tclass;
                    159:
                    160:        /* fragment vs PMTU discovery policy */
                    161:        int     ip6po_minmtu;
                    162: #define IP6PO_MINMTU_MCASTONLY -1 /* default: send at min MTU for multicast */
                    163: #define IP6PO_MINMTU_DISABLE   0  /* always perform pmtu disc */
                    164: #define IP6PO_MINMTU_ALL       1  /* always send at min MTU */
                    165:
                    166:        int     ip6po_flags;
                    167: #define        IP6PO_DONTFRAG  0x04    /* disable fragmentation (IPV6_DONTFRAG) */
                    168: };
                    169:
                    170: struct ip6stat {
                    171:        u_int64_t ip6s_total;           /* total packets received */
                    172:        u_int64_t ip6s_tooshort;        /* packet too short */
                    173:        u_int64_t ip6s_toosmall;        /* not enough data */
                    174:        u_int64_t ip6s_fragments;       /* fragments received */
                    175:        u_int64_t ip6s_fragdropped;     /* frags dropped(dups, out of space) */
                    176:        u_int64_t ip6s_fragtimeout;     /* fragments timed out */
                    177:        u_int64_t ip6s_fragoverflow;    /* fragments that exceeded limit */
                    178:        u_int64_t ip6s_forward;         /* packets forwarded */
                    179:        u_int64_t ip6s_cantforward;     /* packets rcvd for unreachable dest */
                    180:        u_int64_t ip6s_redirectsent;    /* packets forwarded on same net */
                    181:        u_int64_t ip6s_delivered;       /* datagrams delivered to upper level*/
                    182:        u_int64_t ip6s_localout;        /* total ip packets generated here */
                    183:        u_int64_t ip6s_odropped;        /* lost packets due to nobufs, etc. */
                    184:        u_int64_t ip6s_reassembled;     /* total packets reassembled ok */
                    185:        u_int64_t ip6s_fragmented;      /* datagrams successfully fragmented */
                    186:        u_int64_t ip6s_ofragments;      /* output fragments created */
                    187:        u_int64_t ip6s_cantfrag;        /* don't fragment flag was set, etc. */
                    188:        u_int64_t ip6s_badoptions;      /* error in option processing */
                    189:        u_int64_t ip6s_noroute;         /* packets discarded due to no route */
                    190:        u_int64_t ip6s_badvers;         /* ip6 version != 6 */
                    191:        u_int64_t ip6s_rawout;          /* total raw ip packets generated */
                    192:        u_int64_t ip6s_badscope;        /* scope error */
                    193:        u_int64_t ip6s_notmember;       /* don't join this multicast group */
                    194:        u_int64_t ip6s_nxthist[256];    /* next header history */
                    195:        u_int64_t ip6s_m1;              /* one mbuf */
                    196:        u_int64_t ip6s_m2m[32];         /* two or more mbuf */
                    197:        u_int64_t ip6s_mext1;           /* one ext mbuf */
                    198:        u_int64_t ip6s_mext2m;          /* two or more ext mbuf */
                    199:        u_int64_t ip6s_exthdrtoolong;   /* ext hdr are not continuous */
                    200:        u_int64_t ip6s_nogif;           /* no match gif found */
                    201:        u_int64_t ip6s_toomanyhdr;      /* discarded due to too many headers */
                    202:
                    203:        /*
                    204:         * statistics for improvement of the source address selection
                    205:         * algorithm:
                    206:         * XXX: hardcoded 16 = # of ip6 multicast scope types + 1
                    207:         */
                    208:        /* number of times that address selection fails */
                    209:        u_int64_t ip6s_sources_none;
                    210:        /* number of times that an address on the outgoing I/F is chosen */
                    211:        u_int64_t ip6s_sources_sameif[16];
                    212:        /* number of times that an address on a non-outgoing I/F is chosen */
                    213:        u_int64_t ip6s_sources_otherif[16];
                    214:        /*
                    215:         * number of times that an address that has the same scope
                    216:         * from the destination is chosen.
                    217:         */
                    218:        u_int64_t ip6s_sources_samescope[16];
                    219:        /*
                    220:         * number of times that an address that has a different scope
                    221:         * from the destination is chosen.
                    222:         */
                    223:        u_int64_t ip6s_sources_otherscope[16];
                    224:        /* number of times that an deprecated address is chosen */
                    225:        u_int64_t ip6s_sources_deprecated[16];
                    226:
                    227:        u_int64_t ip6s_forward_cachehit;
                    228:        u_int64_t ip6s_forward_cachemiss;
                    229: };
                    230:
                    231: #ifdef _KERNEL
                    232: /* flags passed to ip6_output as last parameter */
                    233: #define        IPV6_UNSPECSRC          0x01    /* allow :: as the source address */
                    234: #define        IPV6_FORWARDING         0x02    /* most of IPv6 header exists */
                    235: #define        IPV6_MINMTU             0x04    /* use minimum MTU (IPV6_USE_MIN_MTU) */
                    236:
                    237: extern struct  ip6stat ip6stat;        /* statistics */
                    238: extern int     ip6_defhlim;            /* default hop limit */
                    239: extern int     ip6_defmcasthlim;       /* default multicast hop limit */
                    240: extern int     ip6_forwarding;         /* act as router? */
                    241: extern int     ip6_mforwarding;        /* act as multicast router? */
                    242: extern int     ip6_multipath;          /* use multipath routes */
                    243: extern int     ip6_sendredirect;       /* send ICMPv6 redirect? */
                    244: extern int     ip6_forward_srcrt;      /* forward src-routed? */
                    245: extern int     ip6_use_deprecated;     /* allow deprecated addr as source */
                    246: extern int     ip6_rr_prune;           /* router renumbering prefix
                    247:                                         * walk list every 5 sec.    */
                    248: extern int     ip6_mcast_pmtu;         /* path MTU discovery for multicast */
                    249: extern const int       ip6_v6only;
                    250:
                    251: extern struct socket *ip6_mrouter;     /* multicast routing daemon */
                    252: extern int     ip6_sendredirects;      /* send IP redirects when forwarding? */
                    253: extern int     ip6_maxfragpackets; /* Maximum packets in reassembly queue */
                    254: extern int     ip6_maxfrags;   /* Maximum fragments in reassembly queue */
                    255: extern int     ip6_sourcecheck;        /* Verify source interface */
                    256: extern int     ip6_sourcecheck_interval; /* Interval between log messages */
                    257: extern int     ip6_accept_rtadv;       /* Acts as a host not a router */
                    258: extern int     ip6_keepfaith;          /* Firewall Aided Internet Translator */
                    259: extern int     ip6_log_interval;
                    260: extern time_t  ip6_log_time;
                    261: extern int     ip6_hdrnestlimit; /* upper limit of # of extension headers */
                    262: extern int     ip6_dad_count;          /* DupAddrDetectionTransmits */
                    263:
                    264: extern int ip6_auto_flowlabel;
                    265: extern int ip6_auto_linklocal;
                    266:
                    267: struct in6pcb;
                    268: struct inpcb;
                    269:
                    270: int    icmp6_ctloutput(int, struct socket *, int, int, struct mbuf **);
                    271:
                    272: void   ip6_init(void);
                    273: void   ip6intr(void);
                    274: void   ip6_input(struct mbuf *);
                    275: void   ip6_freepcbopts(struct ip6_pktopts *);
                    276: void   ip6_freemoptions(struct ip6_moptions *);
                    277: int    ip6_unknown_opt(u_int8_t *, struct mbuf *, int);
                    278: u_int8_t *ip6_get_prevhdr(struct mbuf *, int);
                    279: int    ip6_nexthdr(struct mbuf *, int, int, int *);
                    280: int    ip6_lasthdr(struct mbuf *, int, int, int *);
                    281: int    ip6_mforward(struct ip6_hdr *, struct ifnet *, struct mbuf *);
                    282: int    ip6_process_hopopts(struct mbuf *, u_int8_t *, int, u_int32_t *,
                    283:             u_int32_t *);
                    284: void   ip6_savecontrol(struct inpcb *, struct mbuf *, struct mbuf **);
                    285: int    ip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
                    286:
                    287: void   ip6_forward(struct mbuf *, int);
                    288:
                    289: void   ip6_mloopback(struct ifnet *, struct mbuf *, struct sockaddr_in6 *);
                    290: int    ip6_output(struct mbuf *, struct ip6_pktopts *, struct route_in6 *, int,
                    291:            struct ip6_moptions *, struct ifnet **, struct inpcb *);
                    292: int    ip6_ctloutput(int, struct socket *, int, int, struct mbuf **);
                    293: int    ip6_raw_ctloutput(int, struct socket *, int, int, struct mbuf **);
                    294: void   ip6_initpktopts(struct ip6_pktopts *);
                    295: int    ip6_setpktopts(struct mbuf *, struct ip6_pktopts *,
                    296:            struct ip6_pktopts *, int, int);
                    297: void   ip6_clearpktopts(struct ip6_pktopts *, int);
                    298: struct ip6_pktopts *ip6_copypktopts(struct ip6_pktopts *, int);
                    299: int    ip6_optlen(struct inpcb *);
                    300:
                    301: int    route6_input(struct mbuf **, int *, int);
                    302:
                    303: void   frag6_init(void);
                    304: int    frag6_input(struct mbuf **, int *, int);
                    305: void   frag6_slowtimo(void);
                    306: void   frag6_drain(void);
                    307:
                    308: void   rip6_init(void);
                    309: int    rip6_input(struct mbuf **mp, int *offp, int proto);
                    310: void   rip6_ctlinput(int, struct sockaddr *, void *);
                    311: int    rip6_ctloutput(int, struct socket *, int, int, struct mbuf **);
                    312: int    rip6_output(struct mbuf *, ...);
                    313: int    rip6_usrreq(struct socket *,
                    314:            int, struct mbuf *, struct mbuf *, struct mbuf *, struct proc *);
                    315:
                    316: int    dest6_input(struct mbuf **, int *, int);
                    317: int    none_input(struct mbuf **, int *, int);
                    318:
                    319: struct in6_addr *in6_selectsrc(struct sockaddr_in6 *, struct ip6_pktopts *,
                    320:            struct ip6_moptions *, struct route_in6 *, struct in6_addr *,
                    321:            int *);
                    322: int    in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
                    323:            struct ip6_moptions *, struct route_in6 *, struct ifnet **,
                    324:            struct rtentry **);
                    325:
                    326: u_int32_t ip6_randomid(void);
                    327: u_int32_t ip6_randomflowlabel(void);
                    328: #endif /* _KERNEL */
                    329:
                    330: #endif /* !_NETINET6_IP6_VAR_H_ */

CVSweb