xref: /csrg-svn/sys/netinet/ip_mroute.h (revision 69081)
154821Ssklower /*
254821Ssklower  * Copyright (c) 1989 Stephen Deering.
363218Sbostic  * Copyright (c) 1992, 1993
463218Sbostic  *	The Regents of the University of California.  All rights reserved.
554821Ssklower  *
654821Ssklower  * This code is derived from software contributed to Berkeley by
754821Ssklower  * Stephen Deering of Stanford University.
854821Ssklower  *
954821Ssklower  * %sccs.include.redist.c%
1054821Ssklower  *
11*69081Ssklower  *	@(#)ip_mroute.h	8.2 (Berkeley) 04/28/95
1254821Ssklower  */
1354821Ssklower 
1454821Ssklower /*
1554821Ssklower  * Definitions for the kernel part of DVMRP,
1654821Ssklower  * a Distance-Vector Multicast Routing Protocol.
1754821Ssklower  * (See RFC-1075.)
1854821Ssklower  *
1954821Ssklower  * Written by David Waitzman, BBN Labs, August 1988.
2054821Ssklower  * Modified by Steve Deering, Stanford, February 1989.
2154821Ssklower  *
2254821Ssklower  * MROUTING 1.0
2354821Ssklower  */
2454821Ssklower 
2554821Ssklower 
2654821Ssklower /*
2754821Ssklower  * DVMRP-specific setsockopt commands.
2854821Ssklower  */
2954821Ssklower #define	DVMRP_INIT	100
3054821Ssklower #define	DVMRP_DONE	101
3154821Ssklower #define	DVMRP_ADD_VIF	102
3254821Ssklower #define	DVMRP_DEL_VIF	103
3354821Ssklower #define	DVMRP_ADD_LGRP	104
3454821Ssklower #define	DVMRP_DEL_LGRP	105
3554821Ssklower #define	DVMRP_ADD_MRT	106
3654821Ssklower #define	DVMRP_DEL_MRT	107
3754821Ssklower 
3854821Ssklower 
3954821Ssklower /*
4054821Ssklower  * Types and macros for handling bitmaps with one bit per virtual interface.
4154821Ssklower  */
4254821Ssklower #define	MAXVIFS 32
4354821Ssklower typedef u_long vifbitmap_t;
4454821Ssklower typedef u_short vifi_t;		/* type of a vif index */
4554821Ssklower 
4654821Ssklower #define	VIFM_SET(n, m)		((m) |= (1 << (n)))
4754821Ssklower #define	VIFM_CLR(n, m)		((m) &= ~(1 << (n)))
4854821Ssklower #define	VIFM_ISSET(n, m)	((m) & (1 << (n)))
4954821Ssklower #define	VIFM_CLRALL(m)		((m) = 0x00000000)
5054821Ssklower #define	VIFM_COPY(mfrom, mto)	((mto) = (mfrom))
5154821Ssklower #define	VIFM_SAME(m1, m2)	((m1) == (m2))
5254821Ssklower 
5354821Ssklower 
5454821Ssklower /*
5554821Ssklower  * Agument structure for DVMRP_ADD_VIF.
5654821Ssklower  * (DVMRP_DEL_VIF takes a single vifi_t argument.)
5754821Ssklower  */
5854821Ssklower struct vifctl {
5954821Ssklower 	vifi_t	    vifc_vifi;	    	/* the index of the vif to be added */
6054821Ssklower 	u_char	    vifc_flags;     	/* VIFF_ flags defined below */
6154821Ssklower 	u_char	    vifc_threshold; 	/* min ttl required to forward on vif */
6254821Ssklower 	struct	in_addr vifc_lcl_addr;	/* local interface address */
6354821Ssklower 	struct	in_addr vifc_rmt_addr;	/* remote address (tunnels only) */
6454821Ssklower };
6554821Ssklower 
6654821Ssklower #define	VIFF_TUNNEL	0x1		/* vif represents a tunnel end-point */
6754821Ssklower 
6854821Ssklower 
6954821Ssklower /*
7054821Ssklower  * Argument structure for DVMRP_ADD_LGRP and DVMRP_DEL_LGRP.
7154821Ssklower  */
7254821Ssklower struct lgrplctl {
7354821Ssklower 	vifi_t	lgc_vifi;
7454821Ssklower 	struct	in_addr lgc_gaddr;
7554821Ssklower };
7654821Ssklower 
7754821Ssklower 
7854821Ssklower /*
7954821Ssklower  * Argument structure for DVMRP_ADD_MRT.
8054821Ssklower  * (DVMRP_DEL_MRT takes a single struct in_addr argument, containing origin.)
8154821Ssklower  */
8254821Ssklower struct mrtctl {
8354821Ssklower 	struct	in_addr mrtc_origin;	/* subnet origin of multicasts */
8454821Ssklower 	struct	in_addr mrtc_originmask; /* subnet mask for origin */
8554821Ssklower 	vifi_t	mrtc_parent;    	/* incoming vif */
8654821Ssklower 	vifbitmap_t mrtc_children;	/* outgoing children vifs */
8754821Ssklower 	vifbitmap_t mrtc_leaves;	/* subset of outgoing children vifs */
8854821Ssklower };
8954821Ssklower 
9054821Ssklower 
9154821Ssklower #ifdef KERNEL
9254821Ssklower 
9354821Ssklower /*
9454821Ssklower  * The kernel's virtual-interface structure.
9554821Ssklower  */
9654821Ssklower struct vif {
9754821Ssklower 	u_char	v_flags;		/* VIFF_ flags defined above */
9854821Ssklower 	u_char	v_threshold;		/* min ttl required to forward on vif */
9954821Ssklower 	struct	in_addr v_lcl_addr;	/* local interface address */
10054821Ssklower 	struct	in_addr v_rmt_addr;	/* remote address (tunnels only) */
10154821Ssklower 	struct	ifnet  *v_ifp;		/* pointer to interface */
10254821Ssklower 	struct	in_addr *v_lcl_grps;	/* list of local grps (phyints only) */
10354821Ssklower 	int	v_lcl_grps_max;		/* malloc'ed number of v_lcl_grps */
10454821Ssklower 	int	v_lcl_grps_n;		/* used number of v_lcl_grps */
10554821Ssklower 	u_long	v_cached_group;		/* last grp looked-up (phyints only) */
10654821Ssklower 	int	v_cached_result;	/* last look-up result (phyints only) */
10754821Ssklower };
10854821Ssklower 
10954821Ssklower /*
11054821Ssklower  * The kernel's multicast route structure.
11154821Ssklower  */
11254821Ssklower struct mrt {
11354821Ssklower 	struct	in_addr mrt_origin;	/* subnet origin of multicasts */
11454821Ssklower 	struct	in_addr mrt_originmask;	/* subnet mask for origin */
11554821Ssklower 	vifi_t	mrt_parent;    		/* incoming vif */
11654821Ssklower 	vifbitmap_t mrt_children;	/* outgoing children vifs */
11754821Ssklower 	vifbitmap_t mrt_leaves;		/* subset of outgoing children vifs */
11854821Ssklower 	struct	mrt *mrt_next;		/* forward link */
11954821Ssklower };
12054821Ssklower 
12154821Ssklower 
12254821Ssklower #define	MRTHASHSIZ	64
12354821Ssklower #if (MRTHASHSIZ & (MRTHASHSIZ - 1)) == 0	  /* from sys:route.h */
12454821Ssklower #define	MRTHASHMOD(h)	((h) & (MRTHASHSIZ - 1))
12554821Ssklower #else
12654821Ssklower #define	MRTHASHMOD(h)	((h) % MRTHASHSIZ)
12754821Ssklower #endif
12854821Ssklower 
12954821Ssklower /*
13054821Ssklower  * The kernel's multicast routing statistics.
13154821Ssklower  */
13254821Ssklower struct mrtstat {
13354821Ssklower 	u_long	mrts_mrt_lookups;	/* # multicast route lookups */
13454821Ssklower 	u_long	mrts_mrt_misses;	/* # multicast route cache misses */
13554821Ssklower 	u_long	mrts_grp_lookups;	/* # group address lookups */
13654821Ssklower 	u_long	mrts_grp_misses;	/* # group address cache misses */
13754821Ssklower 	u_long	mrts_no_route;		/* no route for packet's origin */
13854821Ssklower 	u_long	mrts_bad_tunnel;	/* malformed tunnel options */
13954821Ssklower 	u_long	mrts_cant_tunnel;	/* no room for tunnel options */
140*69081Ssklower 	u_long	mrts_wrong_if;		/* arrived on the wrong interface */
14154821Ssklower };
14254821Ssklower 
14354821Ssklower 
14454821Ssklower int	ip_mrouter_cmd __P((int, struct socket *, struct mbuf *));
14561335Sbostic int	ip_mrouter_done __P((void));
14654821Ssklower 
14754821Ssklower #endif /* KERNEL */
148