xref: /csrg-svn/sys/netinet/ip_mroute.h (revision 54821)
1*54821Ssklower /*
2*54821Ssklower  * Copyright (c) 1989 Stephen Deering.
3*54821Ssklower  * Copyright (c) 1992 Regents of the University of California.
4*54821Ssklower  * All rights reserved.
5*54821Ssklower  *
6*54821Ssklower  * This code is derived from software contributed to Berkeley by
7*54821Ssklower  * Stephen Deering of Stanford University.
8*54821Ssklower  *
9*54821Ssklower  * %sccs.include.redist.c%
10*54821Ssklower  *
11*54821Ssklower  *	@(#)ip_mroute.h	7.1 (Berkeley) 07/08/92
12*54821Ssklower  */
13*54821Ssklower 
14*54821Ssklower /*
15*54821Ssklower  * Definitions for the kernel part of DVMRP,
16*54821Ssklower  * a Distance-Vector Multicast Routing Protocol.
17*54821Ssklower  * (See RFC-1075.)
18*54821Ssklower  *
19*54821Ssklower  * Written by David Waitzman, BBN Labs, August 1988.
20*54821Ssklower  * Modified by Steve Deering, Stanford, February 1989.
21*54821Ssklower  *
22*54821Ssklower  * MROUTING 1.0
23*54821Ssklower  */
24*54821Ssklower 
25*54821Ssklower /*
26*54821Ssklower  * Copyright (c) 1992 Regents of the University of California.
27*54821Ssklower  * All rights reserved.
28*54821Ssklower  *
29*54821Ssklower  * %sccs.include.redist.c%
30*54821Ssklower  *
31*54821Ssklower  *	@(#)ip_mroute.h	7.1 (Berkeley) 07/08/92
32*54821Ssklower  */
33*54821Ssklower 
34*54821Ssklower /*
35*54821Ssklower  * DVMRP-specific setsockopt commands.
36*54821Ssklower  */
37*54821Ssklower #define	DVMRP_INIT	100
38*54821Ssklower #define	DVMRP_DONE	101
39*54821Ssklower #define	DVMRP_ADD_VIF	102
40*54821Ssklower #define	DVMRP_DEL_VIF	103
41*54821Ssklower #define	DVMRP_ADD_LGRP	104
42*54821Ssklower #define	DVMRP_DEL_LGRP	105
43*54821Ssklower #define	DVMRP_ADD_MRT	106
44*54821Ssklower #define	DVMRP_DEL_MRT	107
45*54821Ssklower 
46*54821Ssklower 
47*54821Ssklower /*
48*54821Ssklower  * Types and macros for handling bitmaps with one bit per virtual interface.
49*54821Ssklower  */
50*54821Ssklower #define	MAXVIFS 32
51*54821Ssklower typedef u_long vifbitmap_t;
52*54821Ssklower typedef u_short vifi_t;		/* type of a vif index */
53*54821Ssklower 
54*54821Ssklower #define	VIFM_SET(n, m)		((m) |= (1 << (n)))
55*54821Ssklower #define	VIFM_CLR(n, m)		((m) &= ~(1 << (n)))
56*54821Ssklower #define	VIFM_ISSET(n, m)	((m) & (1 << (n)))
57*54821Ssklower #define	VIFM_CLRALL(m)		((m) = 0x00000000)
58*54821Ssklower #define	VIFM_COPY(mfrom, mto)	((mto) = (mfrom))
59*54821Ssklower #define	VIFM_SAME(m1, m2)	((m1) == (m2))
60*54821Ssklower 
61*54821Ssklower 
62*54821Ssklower /*
63*54821Ssklower  * Agument structure for DVMRP_ADD_VIF.
64*54821Ssklower  * (DVMRP_DEL_VIF takes a single vifi_t argument.)
65*54821Ssklower  */
66*54821Ssklower struct vifctl {
67*54821Ssklower 	vifi_t	    vifc_vifi;	    	/* the index of the vif to be added */
68*54821Ssklower 	u_char	    vifc_flags;     	/* VIFF_ flags defined below */
69*54821Ssklower 	u_char	    vifc_threshold; 	/* min ttl required to forward on vif */
70*54821Ssklower 	struct	in_addr vifc_lcl_addr;	/* local interface address */
71*54821Ssklower 	struct	in_addr vifc_rmt_addr;	/* remote address (tunnels only) */
72*54821Ssklower };
73*54821Ssklower 
74*54821Ssklower #define	VIFF_TUNNEL	0x1		/* vif represents a tunnel end-point */
75*54821Ssklower 
76*54821Ssklower 
77*54821Ssklower /*
78*54821Ssklower  * Argument structure for DVMRP_ADD_LGRP and DVMRP_DEL_LGRP.
79*54821Ssklower  */
80*54821Ssklower struct lgrplctl {
81*54821Ssklower 	vifi_t	lgc_vifi;
82*54821Ssklower 	struct	in_addr lgc_gaddr;
83*54821Ssklower };
84*54821Ssklower 
85*54821Ssklower 
86*54821Ssklower /*
87*54821Ssklower  * Argument structure for DVMRP_ADD_MRT.
88*54821Ssklower  * (DVMRP_DEL_MRT takes a single struct in_addr argument, containing origin.)
89*54821Ssklower  */
90*54821Ssklower struct mrtctl {
91*54821Ssklower 	struct	in_addr mrtc_origin;	/* subnet origin of multicasts */
92*54821Ssklower 	struct	in_addr mrtc_originmask; /* subnet mask for origin */
93*54821Ssklower 	vifi_t	mrtc_parent;    	/* incoming vif */
94*54821Ssklower 	vifbitmap_t mrtc_children;	/* outgoing children vifs */
95*54821Ssklower 	vifbitmap_t mrtc_leaves;	/* subset of outgoing children vifs */
96*54821Ssklower };
97*54821Ssklower 
98*54821Ssklower 
99*54821Ssklower #ifdef KERNEL
100*54821Ssklower 
101*54821Ssklower /*
102*54821Ssklower  * The kernel's virtual-interface structure.
103*54821Ssklower  */
104*54821Ssklower struct vif {
105*54821Ssklower 	u_char	v_flags;		/* VIFF_ flags defined above */
106*54821Ssklower 	u_char	v_threshold;		/* min ttl required to forward on vif */
107*54821Ssklower 	struct	in_addr v_lcl_addr;	/* local interface address */
108*54821Ssklower 	struct	in_addr v_rmt_addr;	/* remote address (tunnels only) */
109*54821Ssklower 	struct	ifnet  *v_ifp;		/* pointer to interface */
110*54821Ssklower 	struct	in_addr *v_lcl_grps;	/* list of local grps (phyints only) */
111*54821Ssklower 	int	v_lcl_grps_max;		/* malloc'ed number of v_lcl_grps */
112*54821Ssklower 	int	v_lcl_grps_n;		/* used number of v_lcl_grps */
113*54821Ssklower 	u_long	v_cached_group;		/* last grp looked-up (phyints only) */
114*54821Ssklower 	int	v_cached_result;	/* last look-up result (phyints only) */
115*54821Ssklower };
116*54821Ssklower 
117*54821Ssklower /*
118*54821Ssklower  * The kernel's multicast route structure.
119*54821Ssklower  */
120*54821Ssklower struct mrt {
121*54821Ssklower 	struct	in_addr mrt_origin;	/* subnet origin of multicasts */
122*54821Ssklower 	struct	in_addr mrt_originmask;	/* subnet mask for origin */
123*54821Ssklower 	vifi_t	mrt_parent;    		/* incoming vif */
124*54821Ssklower 	vifbitmap_t mrt_children;	/* outgoing children vifs */
125*54821Ssklower 	vifbitmap_t mrt_leaves;		/* subset of outgoing children vifs */
126*54821Ssklower 	struct	mrt *mrt_next;		/* forward link */
127*54821Ssklower };
128*54821Ssklower 
129*54821Ssklower 
130*54821Ssklower #define	MRTHASHSIZ	64
131*54821Ssklower #if (MRTHASHSIZ & (MRTHASHSIZ - 1)) == 0	  /* from sys:route.h */
132*54821Ssklower #define	MRTHASHMOD(h)	((h) & (MRTHASHSIZ - 1))
133*54821Ssklower #else
134*54821Ssklower #define	MRTHASHMOD(h)	((h) % MRTHASHSIZ)
135*54821Ssklower #endif
136*54821Ssklower 
137*54821Ssklower /*
138*54821Ssklower  * The kernel's multicast routing statistics.
139*54821Ssklower  */
140*54821Ssklower struct mrtstat {
141*54821Ssklower 	u_long	mrts_mrt_lookups;	/* # multicast route lookups */
142*54821Ssklower 	u_long	mrts_mrt_misses;	/* # multicast route cache misses */
143*54821Ssklower 	u_long	mrts_grp_lookups;	/* # group address lookups */
144*54821Ssklower 	u_long	mrts_grp_misses;	/* # group address cache misses */
145*54821Ssklower 	u_long	mrts_no_route;		/* no route for packet's origin */
146*54821Ssklower 	u_long	mrts_bad_tunnel;	/* malformed tunnel options */
147*54821Ssklower 	u_long	mrts_cant_tunnel;	/* no room for tunnel options */
148*54821Ssklower };
149*54821Ssklower 
150*54821Ssklower 
151*54821Ssklower int	ip_mrouter_cmd __P((int, struct socket *, struct mbuf *));
152*54821Ssklower int	ip_mrouter_done __P(());
153*54821Ssklower 
154*54821Ssklower #endif /* KERNEL */
155*54821Ssklower 
156