Annotation of embedaddon/pimd/include/freebsd2/netinet/ip_mroute.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 1989 Stephen Deering.
! 3: * Copyright (c) 1992, 1993
! 4: * The Regents of the University of California. All rights reserved.
! 5: *
! 6: * This code is derived from software contributed to Berkeley by
! 7: * Stephen Deering of Stanford University.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. All advertising materials mentioning features or use of this software
! 18: * must display the following acknowledgement:
! 19: * This product includes software developed by the University of
! 20: * California, Berkeley and its contributors.
! 21: * 4. Neither the name of the University nor the names of its contributors
! 22: * may be used to endorse or promote products derived from this software
! 23: * without specific prior written permission.
! 24: *
! 25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 35: * SUCH DAMAGE.
! 36: *
! 37: * @(#)ip_mroute.h 8.1 (Berkeley) 6/10/93
! 38: * $Id: ip_mroute.h,v 1.10.4.1 1997/02/22 19:47:28 joerg Exp $
! 39: */
! 40:
! 41: #ifndef _NETINET_IP_MROUTE_H_
! 42: #define _NETINET_IP_MROUTE_H_
! 43:
! 44: /*
! 45: * Definitions for IP multicast forwarding.
! 46: *
! 47: * Written by David Waitzman, BBN Labs, August 1988.
! 48: * Modified by Steve Deering, Stanford, February 1989.
! 49: * Modified by Ajit Thyagarajan, PARC, August 1993.
! 50: * Modified by Ajit Thyagarajan, PARC, August 1994.
! 51: *
! 52: * MROUTING Revision: 3.3.1.3
! 53: */
! 54:
! 55:
! 56: /*
! 57: * Multicast Routing set/getsockopt commands.
! 58: */
! 59: #define MRT_INIT 100 /* initialize forwarder */
! 60: #define MRT_DONE 101 /* shut down forwarder */
! 61: #define MRT_ADD_VIF 102 /* create virtual interface */
! 62: #define MRT_DEL_VIF 103 /* delete virtual interface */
! 63: #define MRT_ADD_MFC 104 /* insert forwarding cache entry */
! 64: #define MRT_DEL_MFC 105 /* delete forwarding cache entry */
! 65: #define MRT_VERSION 106 /* get kernel version number */
! 66: #define MRT_ASSERT 107 /* enable assert (wrong iif) processing */
! 67:
! 68:
! 69: #define GET_TIME(t) microtime(&t)
! 70:
! 71: /*
! 72: * Types and macros for handling bitmaps with one bit per virtual interface.
! 73: */
! 74: #define MAXVIFS 32
! 75: typedef u_long vifbitmap_t;
! 76: typedef u_short vifi_t; /* type of a vif index */
! 77: #define ALL_VIFS (vifi_t)-1
! 78:
! 79: #define VIFM_SET(n, m) ((m) |= (1 << (n)))
! 80: #define VIFM_CLR(n, m) ((m) &= ~(1 << (n)))
! 81: #define VIFM_ISSET(n, m) ((m) & (1 << (n)))
! 82: #define VIFM_CLRALL(m) ((m) = 0x00000000)
! 83: #define VIFM_COPY(mfrom, mto) ((mto) = (mfrom))
! 84: #define VIFM_SAME(m1, m2) ((m1) == (m2))
! 85:
! 86:
! 87: /*
! 88: * Argument structure for MRT_ADD_VIF.
! 89: * (MRT_DEL_VIF takes a single vifi_t argument.)
! 90: */
! 91: struct vifctl {
! 92: vifi_t vifc_vifi; /* the index of the vif to be added */
! 93: u_char vifc_flags; /* VIFF_ flags defined below */
! 94: u_char vifc_threshold; /* min ttl required to forward on vif */
! 95: u_int vifc_rate_limit; /* max rate */
! 96: struct in_addr vifc_lcl_addr; /* local interface address */
! 97: struct in_addr vifc_rmt_addr; /* remote address (tunnels only) */
! 98: };
! 99:
! 100: #define VIFF_TUNNEL 0x1 /* vif represents a tunnel end-point */
! 101: #define VIFF_SRCRT 0x2 /* tunnel uses IP source routing */
! 102: #define VIFF_REGISTER 0x4 /* vif used for register en/decap */
! 103: #ifdef PIM_REG_KERNEL_ENCAP
! 104: #define VIFF_REGISTER_KERNEL_ENCAP 0x8 /* vif register with kernel encap */
! 105: #endif
! 106:
! 107: /*
! 108: * Argument structure for MRT_ADD_MFC and MRT_DEL_MFC
! 109: * (mfcc_tos to be added at a future point)
! 110: */
! 111: struct mfcctl {
! 112: struct in_addr mfcc_origin; /* ip origin of mcasts */
! 113: struct in_addr mfcc_mcastgrp; /* multicast group associated*/
! 114: vifi_t mfcc_parent; /* incoming vif */
! 115: u_char mfcc_ttls[MAXVIFS]; /* forwarding ttls on vifs */
! 116: #ifdef PIM_REG_KERNEL_ENCAP
! 117: struct in_addr mfcc_rp_addr; /* The RP address for encap. */
! 118: #endif
! 119: };
! 120:
! 121: /*
! 122: * The kernel's multicast routing statistics.
! 123: */
! 124: struct mrtstat {
! 125: u_long mrts_mfc_lookups; /* # forw. cache hash table hits */
! 126: u_long mrts_mfc_misses; /* # forw. cache hash table misses */
! 127: u_long mrts_upcalls; /* # calls to mrouted */
! 128: u_long mrts_no_route; /* no route for packet's origin */
! 129: u_long mrts_bad_tunnel; /* malformed tunnel options */
! 130: u_long mrts_cant_tunnel; /* no room for tunnel options */
! 131: u_long mrts_wrong_if; /* arrived on wrong interface */
! 132: u_long mrts_upq_ovflw; /* upcall Q overflow */
! 133: u_long mrts_cache_cleanups; /* # entries with no upcalls */
! 134: u_long mrts_drop_sel; /* pkts dropped selectively */
! 135: u_long mrts_q_overflow; /* pkts dropped - Q overflow */
! 136: u_long mrts_pkt2large; /* pkts dropped - size > BKT SIZE */
! 137: u_long mrts_upq_sockfull; /* upcalls dropped - socket full */
! 138: };
! 139:
! 140: /*
! 141: * Argument structure used by mrouted to get src-grp pkt counts
! 142: */
! 143: struct sioc_sg_req {
! 144: struct in_addr src;
! 145: struct in_addr grp;
! 146: u_long pktcnt;
! 147: u_long bytecnt;
! 148: u_long wrong_if;
! 149: };
! 150:
! 151: /*
! 152: * Argument structure used by mrouted to get vif pkt counts
! 153: */
! 154: struct sioc_vif_req {
! 155: vifi_t vifi; /* vif number */
! 156: u_long icount; /* Input packet count on vif */
! 157: u_long ocount; /* Output packet count on vif */
! 158: u_long ibytes; /* Input byte count on vif */
! 159: u_long obytes; /* Output byte count on vif */
! 160: };
! 161:
! 162:
! 163: /*
! 164: * The kernel's virtual-interface structure.
! 165: */
! 166: struct vif {
! 167: u_char v_flags; /* VIFF_ flags defined above */
! 168: u_char v_threshold; /* min ttl required to forward on vif*/
! 169: u_int v_rate_limit; /* max rate */
! 170: struct tbf *v_tbf; /* token bucket structure at intf. */
! 171: struct in_addr v_lcl_addr; /* local interface address */
! 172: struct in_addr v_rmt_addr; /* remote address (tunnels only) */
! 173: struct ifnet *v_ifp; /* pointer to interface */
! 174: u_long v_pkt_in; /* # pkts in on interface */
! 175: u_long v_pkt_out; /* # pkts out on interface */
! 176: u_long v_bytes_in; /* # bytes in on interface */
! 177: u_long v_bytes_out; /* # bytes out on interface */
! 178: struct route v_route; /* cached route if this is a tunnel */
! 179: u_int v_rsvp_on; /* RSVP listening on this vif */
! 180: struct socket *v_rsvpd; /* RSVP daemon socket */
! 181: };
! 182:
! 183: /*
! 184: * The kernel's multicast forwarding cache entry structure
! 185: * (A field for the type of service (mfc_tos) is to be added
! 186: * at a future point)
! 187: */
! 188: struct mfc {
! 189: struct in_addr mfc_origin; /* IP origin of mcasts */
! 190: struct in_addr mfc_mcastgrp; /* multicast group associated*/
! 191: vifi_t mfc_parent; /* incoming vif */
! 192: u_char mfc_ttls[MAXVIFS]; /* forwarding ttls on vifs */
! 193: u_long mfc_pkt_cnt; /* pkt count for src-grp */
! 194: u_long mfc_byte_cnt; /* byte count for src-grp */
! 195: u_long mfc_wrong_if; /* wrong if for src-grp */
! 196: int mfc_expire; /* time to clean entry up */
! 197: struct timeval mfc_last_assert; /* last time I sent an assert*/
! 198: #ifdef PIM_REG_KERNEL_ENCAP
! 199: struct in_addr mfc_rp_addr; /* The RP address for encap. */
! 200: #endif
! 201: };
! 202:
! 203: /*
! 204: * Struct used to communicate from kernel to multicast router
! 205: * note the convenient similarity to an IP packet
! 206: */
! 207: struct igmpmsg {
! 208: u_long unused1;
! 209: u_long unused2;
! 210: u_char im_msgtype; /* what type of message */
! 211: #define IGMPMSG_NOCACHE 1
! 212: #define IGMPMSG_WRONGVIF 2
! 213: #define IGMPMSG_WHOLEPKT 3 /* send the whole packet */
! 214: u_char im_mbz; /* must be zero */
! 215: u_char im_vif; /* vif rec'd on */
! 216: u_char unused3;
! 217: struct in_addr im_src, im_dst;
! 218: };
! 219:
! 220: /*
! 221: * Argument structure used for pkt info. while upcall is made
! 222: */
! 223: struct rtdetq {
! 224: struct mbuf *m; /* A copy of the packet */
! 225: struct ifnet *ifp; /* Interface pkt came in on */
! 226: vifi_t xmt_vif; /* Saved copy of imo_multicast_vif */
! 227: #ifdef UPCALL_TIMING
! 228: struct timeval t; /* Timestamp */
! 229: #endif /* UPCALL_TIMING */
! 230: };
! 231:
! 232: #define MFCTBLSIZ 256
! 233: #if (MFCTBLSIZ & (MFCTBLSIZ - 1)) == 0 /* from sys:route.h */
! 234: #define MFCHASHMOD(h) ((h) & (MFCTBLSIZ - 1))
! 235: #else
! 236: #define MFCHASHMOD(h) ((h) % MFCTBLSIZ)
! 237: #endif
! 238:
! 239: #define MAX_UPQ 4 /* max. no of pkts in upcall Q */
! 240:
! 241: /*
! 242: * Token Bucket filter code
! 243: */
! 244: #define MAX_BKT_SIZE 10000 /* 10K bytes size */
! 245: #define MAXQSIZE 10 /* max # of pkts in queue */
! 246:
! 247: /*
! 248: * the token bucket filter at each vif
! 249: */
! 250: struct tbf
! 251: {
! 252: struct timeval tbf_last_pkt_t; /* arr. time of last pkt */
! 253: u_long tbf_n_tok; /* no of tokens in bucket */
! 254: u_long tbf_q_len; /* length of queue at this vif */
! 255: u_long tbf_max_q_len; /* max. queue length */
! 256: struct mbuf *tbf_q; /* Packet queue */
! 257: struct mbuf *tbf_t; /* tail-insertion pointer */
! 258: };
! 259:
! 260: #ifdef KERNEL
! 261:
! 262: extern int (*ip_mrouter_set) __P((int, struct socket *, struct mbuf *));
! 263: extern int (*ip_mrouter_get) __P((int, struct socket *, struct mbuf **));
! 264: extern int (*ip_mrouter_done) __P((void));
! 265: #ifdef MROUTING
! 266: extern int (*mrt_ioctl) __P((int, caddr_t));
! 267: #else
! 268: extern int (*mrt_ioctl) __P((int, caddr_t, struct proc *));
! 269: #endif
! 270:
! 271: #endif /* KERNEL */
! 272:
! 273: #endif /* _NETINET_IP_MROUTE_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>