xref: /openbsd/sys/netinet/ip_mroute.h (revision d1eb37ff)
1*d1eb37ffSangelos /*	$OpenBSD: ip_mroute.h,v 1.7 2001/06/09 07:03:42 angelos Exp $	*/
2b400e158Sniklas /*	$NetBSD: ip_mroute.h,v 1.10 1996/02/13 23:42:55 christos Exp $	*/
3df930be7Sderaadt 
4*d1eb37ffSangelos #ifndef _NETINET_IP_MROUTE_H_
5*d1eb37ffSangelos #define _NETINET_IP_MROUTE_H_
6*d1eb37ffSangelos 
7df930be7Sderaadt /*
8df930be7Sderaadt  * Definitions for IP multicast forwarding.
9df930be7Sderaadt  *
10df930be7Sderaadt  * Written by David Waitzman, BBN Labs, August 1988.
11df930be7Sderaadt  * Modified by Steve Deering, Stanford, February 1989.
12df930be7Sderaadt  * Modified by Ajit Thyagarajan, PARC, August 1993.
13df930be7Sderaadt  * Modified by Ajit Thyagarajan, PARC, August 1994.
14df930be7Sderaadt  *
15df930be7Sderaadt  * MROUTING Revision: 1.2
16df930be7Sderaadt  */
17df930be7Sderaadt 
18df930be7Sderaadt #include <sys/queue.h>
19df930be7Sderaadt 
20df930be7Sderaadt /*
21df930be7Sderaadt  * Multicast Routing set/getsockopt commands.
22df930be7Sderaadt  */
23df930be7Sderaadt #define	MRT_INIT		100	/* initialize forwarder */
24df930be7Sderaadt #define	MRT_DONE		101	/* shut down forwarder */
25df930be7Sderaadt #define	MRT_ADD_VIF		102	/* create virtual interface */
26df930be7Sderaadt #define	MRT_DEL_VIF		103	/* delete virtual interface */
27df930be7Sderaadt #define	MRT_ADD_MFC		104	/* insert forwarding cache entry */
28df930be7Sderaadt #define	MRT_DEL_MFC		105	/* delete forwarding cache entry */
29df930be7Sderaadt #define	MRT_VERSION		106	/* get kernel version number */
30df930be7Sderaadt #define	MRT_ASSERT		107	/* enable PIM assert processing */
31df930be7Sderaadt 
32df930be7Sderaadt 
33df930be7Sderaadt /*
34df930be7Sderaadt  * Types and macros for handling bitmaps with one bit per virtual interface.
35df930be7Sderaadt  */
36df930be7Sderaadt #define	MAXVIFS 32
37df930be7Sderaadt typedef u_int32_t vifbitmap_t;
38df930be7Sderaadt typedef u_int16_t vifi_t;		/* type of a vif index */
39df930be7Sderaadt 
40df930be7Sderaadt #define	VIFM_SET(n, m)			((m) |= (1 << (n)))
41df930be7Sderaadt #define	VIFM_CLR(n, m)			((m) &= ~(1 << (n)))
42df930be7Sderaadt #define	VIFM_ISSET(n, m)		((m) & (1 << (n)))
43df930be7Sderaadt #define	VIFM_SETALL(m)			((m) = 0xffffffff)
44df930be7Sderaadt #define	VIFM_CLRALL(m)			((m) = 0x00000000)
45df930be7Sderaadt #define	VIFM_COPY(mfrom, mto)		((mto) = (mfrom))
46df930be7Sderaadt #define	VIFM_SAME(m1, m2)		((m1) == (m2))
47df930be7Sderaadt 
48df930be7Sderaadt #define	VIFF_TUNNEL	0x1		/* vif represents a tunnel end-point */
49df930be7Sderaadt #define	VIFF_SRCRT	0x2		/* tunnel uses IP src routing */
50df930be7Sderaadt 
51df930be7Sderaadt /*
52df930be7Sderaadt  * Argument structure for MRT_ADD_VIF.
53df930be7Sderaadt  * (MRT_DEL_VIF takes a single vifi_t argument.)
54df930be7Sderaadt  */
55df930be7Sderaadt struct vifctl {
56df930be7Sderaadt 	vifi_t	  vifc_vifi;	    	/* the index of the vif to be added */
57df930be7Sderaadt 	u_int8_t  vifc_flags;     	/* VIFF_ flags defined below */
58df930be7Sderaadt 	u_int8_t  vifc_threshold; 	/* min ttl required to forward on vif */
59df930be7Sderaadt 	u_int32_t vifc_rate_limit;	/* max rate */
60df930be7Sderaadt 	struct	  in_addr vifc_lcl_addr;/* local interface address */
61df930be7Sderaadt 	struct	  in_addr vifc_rmt_addr;/* remote address (tunnels only) */
62df930be7Sderaadt };
63df930be7Sderaadt 
64df930be7Sderaadt /*
65df930be7Sderaadt  * Argument structure for MRT_ADD_MFC and MRT_DEL_MFC.
66df930be7Sderaadt  * (mfcc_tos to be added at a future point)
67df930be7Sderaadt  */
68df930be7Sderaadt struct mfcctl {
69df930be7Sderaadt 	struct	 in_addr mfcc_origin;	/* ip origin of mcasts */
70df930be7Sderaadt 	struct	 in_addr mfcc_mcastgrp;	/* multicast group associated */
71df930be7Sderaadt 	vifi_t	 mfcc_parent;		/* incoming vif */
72df930be7Sderaadt 	u_int8_t mfcc_ttls[MAXVIFS];	/* forwarding ttls on vifs */
73df930be7Sderaadt };
74df930be7Sderaadt 
75df930be7Sderaadt /*
76df930be7Sderaadt  * Argument structure used by mrouted to get src-grp pkt counts.
77df930be7Sderaadt  */
78df930be7Sderaadt struct sioc_sg_req {
79df930be7Sderaadt 	struct	in_addr src;
80df930be7Sderaadt 	struct	in_addr grp;
81df930be7Sderaadt 	u_long	pktcnt;
82df930be7Sderaadt 	u_long	bytecnt;
83df930be7Sderaadt 	u_long	wrong_if;
84df930be7Sderaadt };
85df930be7Sderaadt 
86df930be7Sderaadt /*
87df930be7Sderaadt  * Argument structure used by mrouted to get vif pkt counts.
88df930be7Sderaadt  */
89df930be7Sderaadt struct sioc_vif_req {
90df930be7Sderaadt 	vifi_t	vifi;			/* vif number */
91df930be7Sderaadt 	u_long	icount;			/* input packet count on vif */
92df930be7Sderaadt 	u_long	ocount;			/* output packet count on vif */
93df930be7Sderaadt 	u_long	ibytes;			/* input byte count on vif */
94df930be7Sderaadt 	u_long	obytes;			/* output byte count on vif */
95df930be7Sderaadt };
96df930be7Sderaadt 
97df930be7Sderaadt 
98df930be7Sderaadt /*
99df930be7Sderaadt  * The kernel's multicast routing statistics.
100df930be7Sderaadt  */
101df930be7Sderaadt struct mrtstat {
102df930be7Sderaadt 	u_long	mrts_mfc_lookups;	/* # forw. cache hash table hits */
103df930be7Sderaadt 	u_long	mrts_mfc_misses;	/* # forw. cache hash table misses */
104df930be7Sderaadt 	u_long	mrts_upcalls;		/* # calls to mrouted */
105df930be7Sderaadt 	u_long	mrts_no_route;		/* no route for packet's origin */
106df930be7Sderaadt 	u_long	mrts_bad_tunnel;	/* malformed tunnel options */
107df930be7Sderaadt 	u_long	mrts_cant_tunnel;	/* no room for tunnel options */
108df930be7Sderaadt 	u_long	mrts_wrong_if;		/* arrived on wrong interface */
109df930be7Sderaadt 	u_long	mrts_upq_ovflw;		/* upcall Q overflow */
110df930be7Sderaadt 	u_long	mrts_cache_cleanups;	/* # entries with no upcalls */
111df930be7Sderaadt 	u_long	mrts_drop_sel;     	/* pkts dropped selectively */
112df930be7Sderaadt 	u_long	mrts_q_overflow;    	/* pkts dropped - Q overflow */
113df930be7Sderaadt 	u_long	mrts_pkt2large;     	/* pkts dropped - size > BKT SIZE */
114df930be7Sderaadt 	u_long	mrts_upq_sockfull;	/* upcalls dropped - socket full */
115df930be7Sderaadt };
116df930be7Sderaadt 
117df930be7Sderaadt 
118df930be7Sderaadt #ifdef _KERNEL
119df930be7Sderaadt 
120df930be7Sderaadt /*
121df930be7Sderaadt  * Token bucket filter at each vif
122df930be7Sderaadt  */
123df930be7Sderaadt struct tbf {
124df930be7Sderaadt 	u_int32_t last_pkt_t;		/* arr. time of last pkt */
125df930be7Sderaadt 	u_int32_t n_tok;		/* no of tokens in bucket */
126df930be7Sderaadt 	u_int32_t q_len;		/* length of queue at this vif */
127df930be7Sderaadt };
128df930be7Sderaadt 
129df930be7Sderaadt /*
130df930be7Sderaadt  * The kernel's virtual-interface structure.
131df930be7Sderaadt  */
132df930be7Sderaadt struct vif {
133df930be7Sderaadt 	u_int8_t  v_flags;		/* VIFF_ flags defined above */
134df930be7Sderaadt 	u_int8_t  v_threshold;		/* min ttl required to forward on vif */
135df930be7Sderaadt 	u_int32_t v_rate_limit;		/* max rate */
136df930be7Sderaadt 	struct	  tbf v_tbf;		/* token bucket structure at intf. */
137df930be7Sderaadt 	struct	  in_addr v_lcl_addr;	/* local interface address */
138df930be7Sderaadt 	struct	  in_addr v_rmt_addr;	/* remote address (tunnels only) */
139df930be7Sderaadt 	struct	  ifnet *v_ifp;		/* pointer to interface */
140df930be7Sderaadt 	u_long	  v_pkt_in;		/* # pkts in on interface */
141df930be7Sderaadt 	u_long	  v_pkt_out;		/* # pkts out on interface */
142df930be7Sderaadt 	u_long	  v_bytes_in;		/* # bytes in on interface */
143df930be7Sderaadt 	u_long	  v_bytes_out;		/* # bytes out on interface */
144df930be7Sderaadt 	struct	  route v_route;	/* cached route if this is a tunnel */
145df930be7Sderaadt #ifdef RSVP_ISI
146df930be7Sderaadt 	int	  v_rsvp_on;		/* # RSVP listening on this vif */
147df930be7Sderaadt 	struct	  socket *v_rsvpd;	/* # RSVPD daemon */
148df930be7Sderaadt #endif /* RSVP_ISI */
149df930be7Sderaadt };
150df930be7Sderaadt 
151df930be7Sderaadt /*
152df930be7Sderaadt  * The kernel's multicast forwarding cache entry structure.
153df930be7Sderaadt  * (A field for the type of service (mfc_tos) is to be added
154df930be7Sderaadt  * at a future point.)
155df930be7Sderaadt  */
156df930be7Sderaadt struct mfc {
157df930be7Sderaadt 	LIST_ENTRY(mfc) mfc_hash;
158df930be7Sderaadt 	struct	 in_addr mfc_origin;	 	/* ip origin of mcasts */
159df930be7Sderaadt 	struct	 in_addr mfc_mcastgrp;  	/* multicast group associated */
160df930be7Sderaadt 	vifi_t	 mfc_parent;			/* incoming vif */
161df930be7Sderaadt 	u_int8_t mfc_ttls[MAXVIFS]; 		/* forwarding ttls on vifs */
162df930be7Sderaadt 	u_long	 mfc_pkt_cnt;			/* pkt count for src-grp */
163df930be7Sderaadt 	u_long	 mfc_byte_cnt;			/* byte count for src-grp */
164df930be7Sderaadt 	u_long	 mfc_wrong_if;			/* wrong if for src-grp	*/
165df930be7Sderaadt 	int	 mfc_expire;			/* time to clean entry up */
166df930be7Sderaadt 	struct	 timeval mfc_last_assert;	/* last time I sent an assert */
167df930be7Sderaadt 	struct	 rtdetq *mfc_stall;		/* pkts waiting for route */
168df930be7Sderaadt };
169df930be7Sderaadt 
170df930be7Sderaadt /*
171df930be7Sderaadt  * Structure used to communicate from kernel to multicast router.
172df930be7Sderaadt  * (Note the convenient similarity to an IP packet.)
173df930be7Sderaadt  */
174df930be7Sderaadt struct igmpmsg {
175df930be7Sderaadt 	u_int32_t unused1;
176df930be7Sderaadt 	u_int32_t unused2;
177df930be7Sderaadt 	u_int8_t  im_msgtype;		/* what type of message */
178df930be7Sderaadt #define IGMPMSG_NOCACHE		1
179df930be7Sderaadt #define IGMPMSG_WRONGVIF	2
180df930be7Sderaadt 	u_int8_t  im_mbz;		/* must be zero */
181df930be7Sderaadt 	u_int8_t  im_vif;		/* vif rec'd on */
182df930be7Sderaadt 	u_int8_t  unused3;
183df930be7Sderaadt 	struct	  in_addr im_src, im_dst;
184df930be7Sderaadt };
185df930be7Sderaadt 
186df930be7Sderaadt /*
187df930be7Sderaadt  * Argument structure used for pkt info. while upcall is made.
188df930be7Sderaadt  */
189df930be7Sderaadt struct rtdetq {
190df930be7Sderaadt 	struct	mbuf *m;		/* a copy of the packet */
191df930be7Sderaadt 	struct	ifnet *ifp;		/* interface pkt came in on */
192df930be7Sderaadt #ifdef UPCALL_TIMING
193df930be7Sderaadt 	struct	timeval t;		/* timestamp */
194df930be7Sderaadt #endif /* UPCALL_TIMING */
195df930be7Sderaadt 	struct	rtdetq *next;
196df930be7Sderaadt };
197df930be7Sderaadt 
198df930be7Sderaadt #define	MFCTBLSIZ	256
199df930be7Sderaadt #define	MAX_UPQ		4		/* max. no of pkts in upcall Q */
200df930be7Sderaadt 
201df930be7Sderaadt /*
202df930be7Sderaadt  * Token bucket filter code
203df930be7Sderaadt  */
204df930be7Sderaadt #define	MAX_BKT_SIZE    10000		/* 10K bytes size */
205df930be7Sderaadt #define	MAXQSIZE        10		/* max. no of pkts in token queue */
206df930be7Sderaadt 
207df930be7Sderaadt /*
208df930be7Sderaadt  * Queue structure at each vif
209df930be7Sderaadt  */
210df930be7Sderaadt struct pkt_queue {
211df930be7Sderaadt 	u_int32_t pkt_len;		/* length of packet in queue */
212df930be7Sderaadt 	struct	  mbuf *pkt_m;		/* pointer to packet mbuf */
213df930be7Sderaadt 	struct	  ip *pkt_ip;		/* pointer to ip header */
214df930be7Sderaadt };
215df930be7Sderaadt 
216df930be7Sderaadt int	ip_mrouter_set __P((int, struct socket *, struct mbuf **));
217b400e158Sniklas int	ip_mrouter_get __P((int, struct socket *, struct mbuf **));
218b400e158Sniklas int	mrt_ioctl __P((u_long, caddr_t));
219df930be7Sderaadt int	ip_mrouter_done __P((void));
220b400e158Sniklas void	reset_vif __P((struct vif *));
22180ca96b8Sniklas void	vif_delete __P((struct ifnet *));
222b400e158Sniklas #ifdef RSVP_ISI
223b400e158Sniklas int	ip_mforward __P((struct mbuf *, struct ifnet *, struct ip_moptions *));
224b400e158Sniklas int	legal_vif_num __P((int));
225b400e158Sniklas int	ip_rsvp_vif_init __P((struct socket *, struct mbuf *));
226b400e158Sniklas int	ip_rsvp_vif_done __P((struct socket *, struct mbuf *));
227b400e158Sniklas void	ip_rsvp_force_done __P((struct socket *));
228287546eaSitojun void rsvp_input __P((struct mbuf *, int, int));
229287546eaSitojun #else
230b400e158Sniklas int	ip_mforward __P((struct mbuf *, struct ifnet *));
231*d1eb37ffSangelos #endif /* RSVP_ISI */
232*d1eb37ffSangelos 
2339a570b6dSangelos void	ipip_mroute_input __P((struct mbuf *, ...));
234df930be7Sderaadt 
235df930be7Sderaadt #endif /* _KERNEL */
236*d1eb37ffSangelos #endif /* _NETINET_IP_MROUTE_H_ */
237