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

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

1.1       nbrk        1: /*     $OpenBSD: ip6_mroute.h,v 1.7 2006/07/06 02:56:58 brad Exp $     */
                      2: /*     $KAME: ip6_mroute.h,v 1.17 2001/02/10 02:05:52 itojun Exp $     */
                      3:
                      4: /*
                      5:  * Copyright (C) 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: /*     BSDI ip_mroute.h,v 2.5 1996/10/11 16:01:48 pjd Exp      */
                     34:
                     35: /*
                     36:  * Definitions for IP multicast forwarding.
                     37:  *
                     38:  * Written by David Waitzman, BBN Labs, August 1988.
                     39:  * Modified by Steve Deering, Stanford, February 1989.
                     40:  * Modified by Ajit Thyagarajan, PARC, August 1993.
                     41:  * Modified by Ajit Thyagarajan, PARC, August 1994.
                     42:  * Modified by Ahmed Helmy, USC, September 1996.
                     43:  *
                     44:  * MROUTING Revision: 1.2
                     45:  */
                     46:
                     47: #ifndef _NETINET6_IP6_MROUTE_H_
                     48: #define _NETINET6_IP6_MROUTE_H_
                     49:
                     50: /*
                     51:  * Multicast Routing set/getsockopt commands.
                     52:  */
                     53: #ifdef _KERNEL
                     54: #define MRT6_OINIT             100     /* initialize forwarder (omrt6msg) */
                     55: #endif
                     56: #define MRT6_DONE              101     /* shut down forwarder */
                     57: #define MRT6_ADD_MIF           102     /* add multicast interface */
                     58: #define MRT6_DEL_MIF           103     /* delete multicast interface */
                     59: #define MRT6_ADD_MFC           104     /* insert forwarding cache entry */
                     60: #define MRT6_DEL_MFC           105     /* delete forwarding cache entry */
                     61: #define MRT6_PIM                107     /* enable pim code */
                     62: #define MRT6_INIT              108     /* initialize forwarder (mrt6msg) */
                     63:
                     64: #if BSD >= 199103
                     65: #define GET_TIME(t)    microtime(&t)
                     66: #elif defined(sun)
                     67: #define GET_TIME(t)    uniqtime(&t)
                     68: #else
                     69: #define GET_TIME(t)    ((t) = time)
                     70: #endif
                     71:
                     72: /*
                     73:  * Types and macros for handling bitmaps with one bit per multicast interface.
                     74:  */
                     75: typedef u_short mifi_t;                /* type of a mif index */
                     76: #define MAXMIFS                64
                     77:
                     78: #ifndef        IF_SETSIZE
                     79: #define        IF_SETSIZE      256
                     80: #endif
                     81:
                     82: typedef        u_int32_t       if_mask;
                     83: #define        NIFBITS (sizeof(if_mask) * NBBY)        /* bits per mask */
                     84:
                     85: #ifndef howmany
                     86: #define        howmany(x, y)   (((x) + ((y) - 1)) / (y))
                     87: #endif
                     88:
                     89: typedef        struct if_set {
                     90:        if_mask ifs_bits[howmany(IF_SETSIZE, NIFBITS)];
                     91: } if_set;
                     92:
                     93: #define        IF_SET(n, p)    ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS)))
                     94: #define        IF_CLR(n, p)    ((p)->ifs_bits[(n)/NIFBITS] &= ~(1 << ((n) % NIFBITS)))
                     95: #define        IF_ISSET(n, p)  ((p)->ifs_bits[(n)/NIFBITS] & (1 << ((n) % NIFBITS)))
                     96: #define        IF_COPY(f, t)   bcopy(f, t, sizeof(*(f)))
                     97: #define        IF_ZERO(p)      bzero(p, sizeof(*(p)))
                     98:
                     99: /*
                    100:  * Argument structure for MRT6_ADD_IF.
                    101:  */
                    102: struct mif6ctl {
                    103:        mifi_t      mif6c_mifi;         /* the index of the mif to be added  */
                    104:        u_char      mif6c_flags;        /* MIFF_ flags defined below         */
                    105:        u_short     mif6c_pifi;         /* the index of the physical IF */
                    106: #ifdef notyet
                    107:        u_int       mif6c_rate_limit;    /* max rate                         */
                    108: #endif
                    109: };
                    110:
                    111: #define        MIFF_REGISTER   0x1     /* mif represents a register end-point */
                    112:
                    113: /*
                    114:  * Argument structure for MRT6_ADD_MFC and MRT6_DEL_MFC
                    115:  */
                    116: struct mf6cctl {
                    117:        struct sockaddr_in6 mf6cc_origin;       /* IPv6 origin of mcasts */
                    118:        struct sockaddr_in6 mf6cc_mcastgrp; /* multicast group associated */
                    119:        mifi_t          mf6cc_parent;   /* incoming ifindex */
                    120:        struct if_set   mf6cc_ifset;    /* set of forwarding ifs */
                    121: };
                    122:
                    123: /*
                    124:  * The kernel's multicast routing statistics.
                    125:  */
                    126: struct mrt6stat {
                    127:        u_int64_t mrt6s_mfc_lookups;    /* # forw. cache hash table hits   */
                    128:        u_int64_t mrt6s_mfc_misses;     /* # forw. cache hash table misses */
                    129:        u_int64_t mrt6s_upcalls;        /* # calls to mrouted              */
                    130:        u_int64_t mrt6s_no_route;       /* no route for packet's origin    */
                    131:        u_int64_t mrt6s_bad_tunnel;     /* malformed tunnel options        */
                    132:        u_int64_t mrt6s_cant_tunnel;    /* no room for tunnel options      */
                    133:        u_int64_t mrt6s_wrong_if;       /* arrived on wrong interface      */
                    134:        u_int64_t mrt6s_upq_ovflw;      /* upcall Q overflow               */
                    135:        u_int64_t mrt6s_cache_cleanups; /* # entries with no upcalls       */
                    136:        u_int64_t mrt6s_drop_sel;       /* pkts dropped selectively        */
                    137:        u_int64_t mrt6s_q_overflow;     /* pkts dropped - Q overflow       */
                    138:        u_int64_t mrt6s_pkt2large;      /* pkts dropped - size > BKT SIZE  */
                    139:        u_int64_t mrt6s_upq_sockfull;   /* upcalls dropped - socket full   */
                    140: };
                    141:
                    142: #ifdef MRT6_OINIT
                    143: /*
                    144:  * Struct used to communicate from kernel to multicast router
                    145:  * note the convenient similarity to an IPv6 header.
                    146:  * XXX old version, superseded by mrt6msg.
                    147:  */
                    148: struct omrt6msg {
                    149:        u_long      unused1;
                    150:        u_char      im6_msgtype;                /* what type of message     */
                    151: #if 0
                    152: #define MRT6MSG_NOCACHE        1
                    153: #define MRT6MSG_WRONGMIF       2
                    154: #define MRT6MSG_WHOLEPKT       3               /* used for user level encap*/
                    155: #endif
                    156:        u_char      im6_mbz;                    /* must be zero             */
                    157:        u_char      im6_mif;                    /* mif rec'd on             */
                    158:        u_char      unused2;
                    159:        struct in6_addr  im6_src, im6_dst;
                    160: };
                    161: #endif
                    162:
                    163: /*
                    164:  * Structure used to communicate from kernel to multicast router.
                    165:  * We'll overlay the structure onto an MLD header (not an IPv6 header
                    166:  * like igmpmsg{} used for IPv4 implementation). This is because this
                    167:  * structure will be passed via an IPv6 raw socket, on which an application
                    168:  * will only receive the payload i.e. the data after the IPv6 header and all
                    169:  * the extension headers. (see Section 3 of draft-ietf-ipngwg-2292bis-01)
                    170:  */
                    171: struct mrt6msg {
                    172: #define MRT6MSG_NOCACHE                1
                    173: #define MRT6MSG_WRONGMIF       2
                    174: #define MRT6MSG_WHOLEPKT       3               /* used for user level encap*/
                    175:        u_char      im6_mbz;                    /* must be zero             */
                    176:        u_char      im6_msgtype;                /* what type of message     */
                    177:        u_int16_t   im6_mif;                    /* mif rec'd on             */
                    178:        u_int32_t   im6_pad;                    /* padding for 64bit arch   */
                    179:        struct in6_addr  im6_src, im6_dst;
                    180: };
                    181:
                    182: /*
                    183:  * Argument structure used by multicast routing daemon to get src-grp
                    184:  * packet counts
                    185:  */
                    186: struct sioc_sg_req6 {
                    187:        struct sockaddr_in6 src;
                    188:        struct sockaddr_in6 grp;
                    189:        u_int64_t pktcnt;
                    190:        u_int64_t bytecnt;
                    191:        u_int64_t wrong_if;
                    192: };
                    193:
                    194: /*
                    195:  * Argument structure used by mrouted to get mif pkt counts
                    196:  */
                    197: struct sioc_mif_req6 {
                    198:        mifi_t mifi;            /* mif number                           */
                    199:        u_int64_t icount;       /* Input packet count on mif            */
                    200:        u_int64_t ocount;       /* Output packet count on mif           */
                    201:        u_int64_t ibytes;       /* Input byte count on mif              */
                    202:        u_int64_t obytes;       /* Output byte count on mif             */
                    203: };
                    204:
                    205: #if defined(_KERNEL) || defined(KERNEL)
                    206: /*
                    207:  * The kernel's multicast-interface structure.
                    208:  */
                    209: struct mif6 {
                    210:         u_char         m6_flags;       /* MIFF_ flags defined above         */
                    211:        u_int           m6_rate_limit;  /* max rate                          */
                    212: #ifdef notyet
                    213:        struct tbf      *m6_tbf;        /* token bucket structure at intf.   */
                    214: #endif
                    215:        struct in6_addr m6_lcl_addr;    /* local interface address           */
                    216:        struct ifnet    *m6_ifp;        /* pointer to interface              */
                    217:        u_int64_t       m6_pkt_in;      /* # pkts in on interface            */
                    218:        u_int64_t       m6_pkt_out;     /* # pkts out on interface           */
                    219:        u_int64_t       m6_bytes_in;    /* # bytes in on interface           */
                    220:        u_int64_t       m6_bytes_out;   /* # bytes out on interface          */
                    221:        struct route_in6 m6_route;/* cached route if this is a tunnel */
                    222: #ifdef notyet
                    223:        u_int           m6_rsvp_on;     /* RSVP listening on this vif */
                    224:        struct socket   *m6_rsvpd;      /* RSVP daemon socket */
                    225: #endif
                    226: };
                    227:
                    228: /*
                    229:  * The kernel's multicast forwarding cache entry structure
                    230:  */
                    231: struct mf6c {
                    232:        struct sockaddr_in6  mf6c_origin;       /* IPv6 origin of mcasts     */
                    233:        struct sockaddr_in6  mf6c_mcastgrp;     /* multicast group associated*/
                    234:        mifi_t           mf6c_parent;           /* incoming IF               */
                    235:        struct if_set    mf6c_ifset;            /* set of outgoing IFs */
                    236:
                    237:        u_int64_t       mf6c_pkt_cnt;           /* pkt count for src-grp     */
                    238:        u_int64_t       mf6c_byte_cnt;          /* byte count for src-grp    */
                    239:        u_int64_t       mf6c_wrong_if;          /* wrong if for src-grp      */
                    240:        int             mf6c_expire;            /* time to clean entry up    */
                    241:        struct timeval  mf6c_last_assert;       /* last time I sent an assert*/
                    242:        struct rtdetq  *mf6c_stall;             /* pkts waiting for route */
                    243:        struct mf6c    *mf6c_next;              /* hash table linkage */
                    244: };
                    245:
                    246: #define MF6C_INCOMPLETE_PARENT ((mifi_t)-1)
                    247:
                    248: /*
                    249:  * Argument structure used for pkt info. while upcall is made
                    250:  */
                    251: #ifndef _NETINET_IP_MROUTE_H_
                    252: struct rtdetq {                /* XXX: rtdetq is also defined in ip_mroute.h */
                    253:     struct mbuf        *m;             /* A copy of the packet             */
                    254:     struct ifnet       *ifp;           /* Interface pkt came in on         */
                    255: #ifdef UPCALL_TIMING
                    256:     struct timeval     t;              /* Timestamp */
                    257: #endif /* UPCALL_TIMING */
                    258:     struct rtdetq      *next;
                    259: };
                    260: #endif /* _NETINET_IP_MROUTE_H_ */
                    261:
                    262: #define MF6CTBLSIZ     256
                    263: #if (MF6CTBLSIZ & (MF6CTBLSIZ - 1)) == 0         /* from sys:route.h */
                    264: #define MF6CHASHMOD(h) ((h) & (MF6CTBLSIZ - 1))
                    265: #else
                    266: #define MF6CHASHMOD(h) ((h) % MF6CTBLSIZ)
                    267: #endif
                    268:
                    269: #define MAX_UPQ6       4               /* max. no of pkts in upcall Q */
                    270:
                    271: int    ip6_mrouter_set(int, struct socket *, struct mbuf *);
                    272: int    ip6_mrouter_get(int, struct socket *, struct mbuf **);
                    273: int    ip6_mrouter_done(void);
                    274: void   ip6_mrouter_detach(struct ifnet *);
                    275: int    mrt6_ioctl(int, caddr_t);
                    276: #endif /* _KERNEL */
                    277:
                    278: #endif /* !_NETINET6_IP6_MROUTE_H_ */

CVSweb