Annotation of sys/netinet6/ip6_mroute.h, Revision 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