Annotation of embedaddon/pimdd/include/freebsd/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.2 1998/06/01 22:27:16 kurtw 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:
104: /*
105: * Argument structure for MRT_ADD_MFC and MRT_DEL_MFC
106: * (mfcc_tos to be added at a future point)
107: */
108: struct mfcctl {
109: struct in_addr mfcc_origin; /* ip origin of mcasts */
110: struct in_addr mfcc_mcastgrp; /* multicast group associated*/
111: vifi_t mfcc_parent; /* incoming vif */
112: u_char mfcc_ttls[MAXVIFS]; /* forwarding ttls on vifs */
113: };
114:
115: /*
116: * The kernel's multicast routing statistics.
117: */
118: struct mrtstat {
119: u_long mrts_mfc_lookups; /* # forw. cache hash table hits */
120: u_long mrts_mfc_misses; /* # forw. cache hash table misses */
121: u_long mrts_upcalls; /* # calls to mrouted */
122: u_long mrts_no_route; /* no route for packet's origin */
123: u_long mrts_bad_tunnel; /* malformed tunnel options */
124: u_long mrts_cant_tunnel; /* no room for tunnel options */
125: u_long mrts_wrong_if; /* arrived on wrong interface */
126: u_long mrts_upq_ovflw; /* upcall Q overflow */
127: u_long mrts_cache_cleanups; /* # entries with no upcalls */
128: u_long mrts_drop_sel; /* pkts dropped selectively */
129: u_long mrts_q_overflow; /* pkts dropped - Q overflow */
130: u_long mrts_pkt2large; /* pkts dropped - size > BKT SIZE */
131: u_long mrts_upq_sockfull; /* upcalls dropped - socket full */
132: };
133:
134: /*
135: * Argument structure used by mrouted to get src-grp pkt counts
136: */
137: struct sioc_sg_req {
138: struct in_addr src;
139: struct in_addr grp;
140: u_long pktcnt;
141: u_long bytecnt;
142: u_long wrong_if;
143: };
144:
145: /*
146: * Argument structure used by mrouted to get vif pkt counts
147: */
148: struct sioc_vif_req {
149: vifi_t vifi; /* vif number */
150: u_long icount; /* Input packet count on vif */
151: u_long ocount; /* Output packet count on vif */
152: u_long ibytes; /* Input byte count on vif */
153: u_long obytes; /* Output byte count on vif */
154: };
155:
156:
157: /*
158: * The kernel's virtual-interface structure.
159: */
160: struct vif {
161: u_char v_flags; /* VIFF_ flags defined above */
162: u_char v_threshold; /* min ttl required to forward on vif*/
163: u_int v_rate_limit; /* max rate */
164: struct tbf *v_tbf; /* token bucket structure at intf. */
165: struct in_addr v_lcl_addr; /* local interface address */
166: struct in_addr v_rmt_addr; /* remote address (tunnels only) */
167: struct ifnet *v_ifp; /* pointer to interface */
168: u_long v_pkt_in; /* # pkts in on interface */
169: u_long v_pkt_out; /* # pkts out on interface */
170: u_long v_bytes_in; /* # bytes in on interface */
171: u_long v_bytes_out; /* # bytes out on interface */
172: struct route v_route; /* cached route if this is a tunnel */
173: u_int v_rsvp_on; /* RSVP listening on this vif */
174: struct socket *v_rsvpd; /* RSVP daemon socket */
175: };
176:
177: /*
178: * The kernel's multicast forwarding cache entry structure
179: * (A field for the type of service (mfc_tos) is to be added
180: * at a future point)
181: */
182: struct mfc {
183: struct in_addr mfc_origin; /* IP origin of mcasts */
184: struct in_addr mfc_mcastgrp; /* multicast group associated*/
185: vifi_t mfc_parent; /* incoming vif */
186: u_char mfc_ttls[MAXVIFS]; /* forwarding ttls on vifs */
187: u_long mfc_pkt_cnt; /* pkt count for src-grp */
188: u_long mfc_byte_cnt; /* byte count for src-grp */
189: u_long mfc_wrong_if; /* wrong if for src-grp */
190: int mfc_expire; /* time to clean entry up */
191: struct timeval mfc_last_assert; /* last time I sent an assert*/
192: };
193:
194: /*
195: * Struct used to communicate from kernel to multicast router
196: * note the convenient similarity to an IP packet
197: */
198: struct igmpmsg {
199: u_long unused1;
200: u_long unused2;
201: u_char im_msgtype; /* what type of message */
202: #define IGMPMSG_NOCACHE 1
203: #define IGMPMSG_WRONGVIF 2
204: #define IGMPMSG_WHOLEPKT 3 /* send the whole packet */
205: u_char im_mbz; /* must be zero */
206: u_char im_vif; /* vif rec'd on */
207: u_char unused3;
208: struct in_addr im_src, im_dst;
209: };
210:
211: /*
212: * Argument structure used for pkt info. while upcall is made
213: */
214: struct rtdetq {
215: struct mbuf *m; /* A copy of the packet */
216: struct ifnet *ifp; /* Interface pkt came in on */
217: vifi_t xmt_vif; /* Saved copy of imo_multicast_vif */
218: #ifdef UPCALL_TIMING
219: struct timeval t; /* Timestamp */
220: #endif /* UPCALL_TIMING */
221: };
222:
223: #define MFCTBLSIZ 256
224: #if (MFCTBLSIZ & (MFCTBLSIZ - 1)) == 0 /* from sys:route.h */
225: #define MFCHASHMOD(h) ((h) & (MFCTBLSIZ - 1))
226: #else
227: #define MFCHASHMOD(h) ((h) % MFCTBLSIZ)
228: #endif
229:
230: #define MAX_UPQ 4 /* max. no of pkts in upcall Q */
231:
232: /*
233: * Token Bucket filter code
234: */
235: #define MAX_BKT_SIZE 10000 /* 10K bytes size */
236: #define MAXQSIZE 10 /* max # of pkts in queue */
237:
238: /*
239: * the token bucket filter at each vif
240: */
241: struct tbf
242: {
243: struct timeval tbf_last_pkt_t; /* arr. time of last pkt */
244: u_long tbf_n_tok; /* no of tokens in bucket */
245: u_long tbf_q_len; /* length of queue at this vif */
246: u_long tbf_max_q_len; /* max. queue length */
247: struct mbuf *tbf_q; /* Packet queue */
248: struct mbuf *tbf_t; /* tail-insertion pointer */
249: };
250:
251: #ifdef KERNEL
252:
253: extern int (*ip_mrouter_set) __P((int, struct socket *, struct mbuf *));
254: extern int (*ip_mrouter_get) __P((int, struct socket *, struct mbuf **));
255: extern int (*ip_mrouter_done) __P((void));
256: #ifdef MROUTING
257: extern int (*mrt_ioctl) __P((int, caddr_t));
258: #else
259: extern int (*mrt_ioctl) __P((int, caddr_t, struct proc *));
260: #endif
261:
262: #endif /* KERNEL */
263:
264: #endif /* _NETINET_IP_MROUTE_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>