Annotation of embedaddon/pimd/include/freebsd2/netinet/ip_mroute.h, revision 1.1.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>