ip_mroute.h revision 8876
155825Speter/*
2114370Speter * Copyright (c) 1989 Stephen Deering.
3114370Speter * Copyright (c) 1992, 1993
439818Speter *	The Regents of the University of California.  All rights reserved.
5114370Speter *
639818Speter * This code is derived from software contributed to Berkeley by
739818Speter * Stephen Deering of Stanford University.
839818Speter *
983598Speter * Redistribution and use in source and binary forms, with or without
10114370Speter * modification, are permitted provided that the following conditions
11114370Speter * are met:
12114370Speter * 1. Redistributions of source code must retain the above copyright
13114370Speter *    notice, this list of conditions and the following disclaimer.
14114370Speter * 2. Redistributions in binary form must reproduce the above copyright
15114370Speter *    notice, this list of conditions and the following disclaimer in the
16114370Speter *    documentation and/or other materials provided with the distribution.
17114370Speter * 3. All advertising materials mentioning features or use of this software
18114370Speter *    must display the following acknowledgement:
19114370Speter *	This product includes software developed by the University of
20114370Speter *	California, Berkeley and its contributors.
21114370Speter * 4. Neither the name of the University nor the names of its contributors
22114370Speter *    may be used to endorse or promote products derived from this software
23114370Speter *    without specific prior written permission.
24114370Speter *
25114370Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26114370Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27114370Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28114370Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29114370Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30114370Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31114370Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32114370Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33114370Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34114370Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35114370Speter * SUCH DAMAGE.
36114370Speter *
37114370Speter *	@(#)ip_mroute.h	8.1 (Berkeley) 6/10/93
38114370Speter * $Id: ip_mroute.h,v 1.6 1995/03/16 18:14:59 bde Exp $
39114370Speter */
40114370Speter
41114370Speter#ifndef _NETINET_IP_MROUTE_H_
4239818Speter#define _NETINET_IP_MROUTE_H_
43114370Speter
44114370Speter/*
45114370Speter * Definitions for the kernel part of DVMRP,
46114370Speter * a Distance-Vector Multicast Routing Protocol.
47114370Speter * (See RFC-1075.)
48114370Speter *
4939818Speter * Written by David Waitzman, BBN Labs, August 1988.
5039818Speter * Modified by Steve Deering, Stanford, February 1989.
51114370Speter * Modified by Ajit Thyagarajan, PARC, August 1993.
52114370Speter * Modified by Ajit Thyagarajan, PARC, August 1994.
53114370Speter *
54114370Speter * MROUTING 1.5
55114370Speter */
56114370Speter
57114370Speter
5839818Speter/*
59114370Speter * DVMRP-specific setsockopt commands.
60114370Speter */
61114370Speter#define	DVMRP_INIT	100	/* initialize forwarder */
6239818Speter#define	DVMRP_DONE	101	/* shut down forwarder */
6339818Speter#define	DVMRP_ADD_VIF	102	/* create virtual interface */
64114370Speter#define	DVMRP_DEL_VIF	103	/* delete virtual interface */
65114370Speter#define DVMRP_ADD_MFC	104	/* insert forwarding cache entry */
66114370Speter#define DVMRP_DEL_MFC	105	/* delete forwarding cache entry */
67114370Speter
68114370Speter#define GET_TIME(t)	microtime(&t)
69114370Speter
70114370Speter/*
71114370Speter * Types and macros for handling bitmaps with one bit per virtual interface.
72114370Speter */
73114370Speter#define	MAXVIFS 32
74114370Spetertypedef u_long vifbitmap_t;
75114370Spetertypedef u_short vifi_t;		/* type of a vif index */
76114370Speter
77114370Speter#define	VIFM_SET(n, m)		((m) |= (1 << (n)))
78114370Speter#define	VIFM_CLR(n, m)		((m) &= ~(1 << (n)))
79114370Speter#define	VIFM_ISSET(n, m)	((m) & (1 << (n)))
8039818Speter#define	VIFM_CLRALL(m)		((m) = 0x00000000)
81114370Speter#define	VIFM_COPY(mfrom, mto)	((mto) = (mfrom))
82114370Speter#define	VIFM_SAME(m1, m2)	((m1) == (m2))
8339818Speter
84114370Speter
85114370Speter/*
86114370Speter * Argument structure for DVMRP_ADD_VIF.
87114370Speter * (DVMRP_DEL_VIF takes a single vifi_t argument.)
88114370Speter */
89114370Speterstruct vifctl {
90129824Stjr	vifi_t	    vifc_vifi;	    	/* the index of the vif to be added */
91129824Stjr	u_char	    vifc_flags;     	/* VIFF_ flags defined below */
92114370Speter	u_char	    vifc_threshold; 	/* min ttl required to forward on vif */
9339818Speter	u_int	vifc_rate_limit; /* max tate */
94114370Speter	struct	in_addr vifc_lcl_addr;	/* local interface address */
95114370Speter	struct	in_addr vifc_rmt_addr;	/* remote address (tunnels only) */
96114370Speter};
97114370Speter
98114370Speter#define	VIFF_TUNNEL	0x1		/* vif represents a tunnel end-point */
99114370Speter#define VIFF_SRCRT	0x2	/* tunnel uses IP source routing */
100114370Speter
101114370Speter/*
102114370Speter * Argument structure for DVMRP_ADD_MFC
103114370Speter * (mfcc_tos to be added at a future point)
104114370Speter */
105114370Speterstruct mfcctl {
106114370Speter    struct in_addr  mfcc_origin;		/* subnet origin of mcasts   */
107114370Speter    struct in_addr  mfcc_mcastgrp; 		/* multicast group associated*/
108114370Speter    struct in_addr  mfcc_originmask;		/* subnet mask for origin    */
109114370Speter    vifi_t	    mfcc_parent;   		/* incoming vif              */
110114370Speter    u_char	    mfcc_ttls[MAXVIFS]; 	/* forwarding ttls on vifs   */
11139818Speter};
112129824Stjr
113129824Stjr/*
114114370Speter * Argument structure for DVMRP_DEL_MFC
11539818Speter */
116114370Speterstruct delmfcctl {
117114370Speter    struct in_addr  mfcc_origin;    /* subnet origin of multicasts      */
118114370Speter    struct in_addr  mfcc_mcastgrp;  /* multicast group assoc. w/ origin */
119114370Speter};
12039818Speter
121114370Speter/*
122114370Speter * Argument structure used by RSVP daemon to get vif information
123114370Speter */
12439818Speterstruct vif_req {
12539818Speter    u_char         v_flags;         /* VIFF_ flags defined above           */
126114370Speter    u_char         v_threshold;     /* min ttl required to forward on vif  */
12739818Speter    struct in_addr v_lcl_addr;      /* local interface address             */
12839818Speter    struct in_addr v_rmt_addr;
129114370Speter    char           v_if_name[IFNAMSIZ];  /* if name */
13039818Speter};
131114370Speter
132114370Speterstruct vif_conf {
133114370Speter    u_int          vifc_len;
134114370Speter    u_int          vifc_num;
13539818Speter    struct vif_req *vifc_req;
136114370Speter};
137114370Speter
13839818Speter/*
139114370Speter * The kernel's multicast routing statistics.
14039818Speter */
141114370Speterstruct mrtstat {
142114370Speter    u_long	mrts_mfc_lookups;	/* # forw. cache hash table hits   */
143114370Speter    u_long	mrts_mfc_misses;	/* # forw. cache hash table misses */
144114370Speter    u_long	mrts_upcalls;		/* # calls to mrouted              */
145114370Speter    u_long	mrts_no_route;		/* no route for packet's origin    */
14639818Speter    u_long	mrts_bad_tunnel;	/* malformed tunnel options        */
147114370Speter    u_long	mrts_cant_tunnel;	/* no room for tunnel options      */
14839818Speter    u_long	mrts_wrong_if;		/* arrived on wrong interface	   */
14939818Speter    u_long	mrts_upq_ovflw;		/* upcall Q overflow		   */
15039818Speter    u_long	mrts_cache_cleanups;	/* # entries with no upcalls 	   */
15139818Speter    u_long  	mrts_drop_sel;     	/* pkts dropped selectively        */
15239818Speter    u_long  	mrts_q_overflow;    	/* pkts dropped - Q overflow       */
15339818Speter    u_long  	mrts_pkt2large;     	/* pkts dropped - size > BKT SIZE  */
15439818Speter};
15539818Speter
15639818Speter/*
15739818Speter * Argument structure used by mrouted to get src-grp pkt counts
15839818Speter */
15939818Speterstruct sioc_sg_req {
16039818Speter    struct in_addr src;
161114370Speter    struct in_addr grp;
16239818Speter    u_long count;
16339818Speter};
16439818Speter
16539818Speter/*
16639818Speter * Argument structure used by mrouted to get vif pkt counts
16739818Speter */
16839818Speterstruct sioc_vif_req {
16939818Speter    vifi_t vifi;
17039818Speter    u_long icount;
17139818Speter    u_long ocount;
17239818Speter};
17339818Speter
174
175#ifdef KERNEL
176
177struct vif {
178    u_char   		v_flags;     	/* VIFF_ flags defined above         */
179    u_char   		v_threshold;	/* min ttl required to forward on vif*/
180    u_int      		v_rate_limit; 	/* max rate			     */
181    struct tbf 	       *v_tbf;       	/* token bucket structure at intf.   */
182    struct in_addr 	v_lcl_addr;   	/* local interface address           */
183    struct in_addr 	v_rmt_addr;   	/* remote address (tunnels only)     */
184    struct ifnet       *v_ifp;	     	/* pointer to interface              */
185    u_long		v_pkt_in;	/* # pkts in on interface            */
186    u_long		v_pkt_out;	/* # pkts out on interface           */
187};
188
189/*
190 * The kernel's multicast forwarding cache entry structure
191 * (A field for the type of service (mfc_tos) is to be added
192 * at a future point)
193 */
194struct mfc {
195    struct in_addr  mfc_origin;	 		/* subnet origin of mcasts   */
196    struct in_addr  mfc_mcastgrp;  		/* multicast group associated*/
197    struct in_addr  mfc_originmask;		/* subnet mask for origin    */
198    vifi_t	    mfc_parent; 		/* incoming vif              */
199    u_char	    mfc_ttls[MAXVIFS]; 		/* forwarding ttls on vifs   */
200    u_long	    mfc_pkt_cnt;		/* pkt count for src-grp     */
201};
202
203/*
204 * Argument structure used for pkt info. while upcall is made
205 */
206struct rtdetq {
207    struct mbuf 	*m;
208    struct ifnet	*ifp;
209    u_long		tunnel_src;
210    struct ip_moptions *imo;
211};
212
213#define MFCTBLSIZ	256
214#if (MFCTBLSIZ & (MFCTBLSIZ - 1)) == 0	  /* from sys:route.h */
215#define MFCHASHMOD(h)	((h) & (MFCTBLSIZ - 1))
216#else
217#define MFCHASHMOD(h)	((h) % MFCTBLSIZ)
218#endif
219
220#define MAX_UPQ	4		/* max. no of pkts in upcall Q */
221
222/*
223 * Token Bucket filter code
224 */
225#define MAX_BKT_SIZE    10000             /* 10K bytes size 		*/
226#define MAXQSIZE        10                /* max # of pkts in queue 	*/
227
228/*
229 * queue structure at each vif
230 */
231struct pkt_queue
232{
233    u_long pkt_len;               /* length of packet in queue 	*/
234    struct mbuf *pkt_m;           /* pointer to packet mbuf	*/
235    struct ip  *pkt_ip;           /* pointer to ip header	*/
236    struct ip_moptions *pkt_imo; /* IP multicast options assoc. with pkt */
237};
238
239/*
240 * the token bucket filter at each vif
241 */
242struct tbf
243{
244    u_long last_pkt_t;	/* arr. time of last pkt 	*/
245    u_long n_tok;      	/* no of tokens in bucket 	*/
246    u_long q_len;    	/* length of queue at this vif	*/
247};
248
249extern int	(*ip_mrouter_cmd) __P((int, struct socket *, struct mbuf *));
250extern int	(*ip_mrouter_done) __P((void));
251extern int	(*mrt_ioctl) __P((int, caddr_t, struct proc *));
252
253#endif /* KERNEL */
254
255#endif /* _NETINET_IP_MROUTE_H_ */
256