xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/linux/mroute6.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #ifndef __LINUX_MROUTE6_H
2*53ee8cc1Swenshuai.xi #define __LINUX_MROUTE6_H
3*53ee8cc1Swenshuai.xi 
4*53ee8cc1Swenshuai.xi #include <linux/types.h>
5*53ee8cc1Swenshuai.xi #include <linux/sockios.h>
6*53ee8cc1Swenshuai.xi 
7*53ee8cc1Swenshuai.xi /*
8*53ee8cc1Swenshuai.xi  *	Based on the MROUTING 3.5 defines primarily to keep
9*53ee8cc1Swenshuai.xi  *	source compatibility with BSD.
10*53ee8cc1Swenshuai.xi  *
11*53ee8cc1Swenshuai.xi  *	See the pim6sd code for the original history.
12*53ee8cc1Swenshuai.xi  *
13*53ee8cc1Swenshuai.xi  *      Protocol Independent Multicast (PIM) data structures included
14*53ee8cc1Swenshuai.xi  *      Carlos Picoto (cap@di.fc.ul.pt)
15*53ee8cc1Swenshuai.xi  *
16*53ee8cc1Swenshuai.xi  */
17*53ee8cc1Swenshuai.xi 
18*53ee8cc1Swenshuai.xi #define MRT6_BASE	200
19*53ee8cc1Swenshuai.xi #define MRT6_INIT	(MRT6_BASE)	/* Activate the kernel mroute code 	*/
20*53ee8cc1Swenshuai.xi #define MRT6_DONE	(MRT6_BASE+1)	/* Shutdown the kernel mroute		*/
21*53ee8cc1Swenshuai.xi #define MRT6_ADD_MIF	(MRT6_BASE+2)	/* Add a virtual interface		*/
22*53ee8cc1Swenshuai.xi #define MRT6_DEL_MIF	(MRT6_BASE+3)	/* Delete a virtual interface		*/
23*53ee8cc1Swenshuai.xi #define MRT6_ADD_MFC	(MRT6_BASE+4)	/* Add a multicast forwarding entry	*/
24*53ee8cc1Swenshuai.xi #define MRT6_DEL_MFC	(MRT6_BASE+5)	/* Delete a multicast forwarding entry	*/
25*53ee8cc1Swenshuai.xi #define MRT6_VERSION	(MRT6_BASE+6)	/* Get the kernel multicast version	*/
26*53ee8cc1Swenshuai.xi #define MRT6_ASSERT	(MRT6_BASE+7)	/* Activate PIM assert mode		*/
27*53ee8cc1Swenshuai.xi #define MRT6_PIM	(MRT6_BASE+8)	/* enable PIM code	*/
28*53ee8cc1Swenshuai.xi 
29*53ee8cc1Swenshuai.xi #define SIOCGETMIFCNT_IN6	SIOCPROTOPRIVATE	/* IP protocol privates */
30*53ee8cc1Swenshuai.xi #define SIOCGETSGCNT_IN6	(SIOCPROTOPRIVATE+1)
31*53ee8cc1Swenshuai.xi #define SIOCGETRPF	(SIOCPROTOPRIVATE+2)
32*53ee8cc1Swenshuai.xi 
33*53ee8cc1Swenshuai.xi #define MAXMIFS		32
34*53ee8cc1Swenshuai.xi typedef unsigned long mifbitmap_t;	/* User mode code depends on this lot */
35*53ee8cc1Swenshuai.xi typedef unsigned short mifi_t;
36*53ee8cc1Swenshuai.xi #define ALL_MIFS	((mifi_t)(-1))
37*53ee8cc1Swenshuai.xi 
38*53ee8cc1Swenshuai.xi #ifndef IF_SETSIZE
39*53ee8cc1Swenshuai.xi #define IF_SETSIZE	256
40*53ee8cc1Swenshuai.xi #endif
41*53ee8cc1Swenshuai.xi 
42*53ee8cc1Swenshuai.xi typedef	__u32		if_mask;
43*53ee8cc1Swenshuai.xi #define NIFBITS (sizeof(if_mask) * 8)        /* bits per mask */
44*53ee8cc1Swenshuai.xi 
45*53ee8cc1Swenshuai.xi #if !defined(__KERNEL__) && !defined(DIV_ROUND_UP)
46*53ee8cc1Swenshuai.xi #define	DIV_ROUND_UP(x,y)	(((x) + ((y) - 1)) / (y))
47*53ee8cc1Swenshuai.xi #endif
48*53ee8cc1Swenshuai.xi 
49*53ee8cc1Swenshuai.xi typedef struct if_set {
50*53ee8cc1Swenshuai.xi 	if_mask ifs_bits[DIV_ROUND_UP(IF_SETSIZE, NIFBITS)];
51*53ee8cc1Swenshuai.xi } if_set;
52*53ee8cc1Swenshuai.xi 
53*53ee8cc1Swenshuai.xi #define IF_SET(n, p)    ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS)))
54*53ee8cc1Swenshuai.xi #define IF_CLR(n, p)    ((p)->ifs_bits[(n)/NIFBITS] &= ~(1 << ((n) % NIFBITS)))
55*53ee8cc1Swenshuai.xi #define IF_ISSET(n, p)  ((p)->ifs_bits[(n)/NIFBITS] & (1 << ((n) % NIFBITS)))
56*53ee8cc1Swenshuai.xi #define IF_COPY(f, t)   bcopy(f, t, sizeof(*(f)))
57*53ee8cc1Swenshuai.xi #define IF_ZERO(p)      bzero(p, sizeof(*(p)))
58*53ee8cc1Swenshuai.xi 
59*53ee8cc1Swenshuai.xi /*
60*53ee8cc1Swenshuai.xi  *	Passed by mrouted for an MRT_ADD_MIF - again we use the
61*53ee8cc1Swenshuai.xi  *	mrouted 3.6 structures for compatibility
62*53ee8cc1Swenshuai.xi  */
63*53ee8cc1Swenshuai.xi 
64*53ee8cc1Swenshuai.xi struct mif6ctl {
65*53ee8cc1Swenshuai.xi 	mifi_t	mif6c_mifi;		/* Index of MIF */
66*53ee8cc1Swenshuai.xi 	unsigned char mif6c_flags;	/* MIFF_ flags */
67*53ee8cc1Swenshuai.xi 	unsigned char vifc_threshold;	/* ttl limit */
68*53ee8cc1Swenshuai.xi 	u_short	 mif6c_pifi;		/* the index of the physical IF */
69*53ee8cc1Swenshuai.xi 	unsigned int vifc_rate_limit;	/* Rate limiter values (NI) */
70*53ee8cc1Swenshuai.xi };
71*53ee8cc1Swenshuai.xi 
72*53ee8cc1Swenshuai.xi #define MIFF_REGISTER	0x1	/* register vif	*/
73*53ee8cc1Swenshuai.xi 
74*53ee8cc1Swenshuai.xi /*
75*53ee8cc1Swenshuai.xi  *	Cache manipulation structures for mrouted and PIMd
76*53ee8cc1Swenshuai.xi  */
77*53ee8cc1Swenshuai.xi 
78*53ee8cc1Swenshuai.xi struct mf6cctl
79*53ee8cc1Swenshuai.xi {
80*53ee8cc1Swenshuai.xi 	struct sockaddr_in6 mf6cc_origin;		/* Origin of mcast	*/
81*53ee8cc1Swenshuai.xi 	struct sockaddr_in6 mf6cc_mcastgrp;		/* Group in question	*/
82*53ee8cc1Swenshuai.xi 	mifi_t	mf6cc_parent;			/* Where it arrived	*/
83*53ee8cc1Swenshuai.xi 	struct if_set mf6cc_ifset;		/* Where it is going */
84*53ee8cc1Swenshuai.xi };
85*53ee8cc1Swenshuai.xi 
86*53ee8cc1Swenshuai.xi /*
87*53ee8cc1Swenshuai.xi  *	Group count retrieval for pim6sd
88*53ee8cc1Swenshuai.xi  */
89*53ee8cc1Swenshuai.xi 
90*53ee8cc1Swenshuai.xi struct sioc_sg_req6
91*53ee8cc1Swenshuai.xi {
92*53ee8cc1Swenshuai.xi 	struct sockaddr_in6 src;
93*53ee8cc1Swenshuai.xi 	struct sockaddr_in6 grp;
94*53ee8cc1Swenshuai.xi 	unsigned long pktcnt;
95*53ee8cc1Swenshuai.xi 	unsigned long bytecnt;
96*53ee8cc1Swenshuai.xi 	unsigned long wrong_if;
97*53ee8cc1Swenshuai.xi };
98*53ee8cc1Swenshuai.xi 
99*53ee8cc1Swenshuai.xi /*
100*53ee8cc1Swenshuai.xi  *	To get vif packet counts
101*53ee8cc1Swenshuai.xi  */
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi struct sioc_mif_req6
104*53ee8cc1Swenshuai.xi {
105*53ee8cc1Swenshuai.xi 	mifi_t	mifi;		/* Which iface */
106*53ee8cc1Swenshuai.xi 	unsigned long icount;	/* In packets */
107*53ee8cc1Swenshuai.xi 	unsigned long ocount;	/* Out packets */
108*53ee8cc1Swenshuai.xi 	unsigned long ibytes;	/* In bytes */
109*53ee8cc1Swenshuai.xi 	unsigned long obytes;	/* Out bytes */
110*53ee8cc1Swenshuai.xi };
111*53ee8cc1Swenshuai.xi 
112*53ee8cc1Swenshuai.xi /*
113*53ee8cc1Swenshuai.xi  *	That's all usermode folks
114*53ee8cc1Swenshuai.xi  */
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi 
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi /*
119*53ee8cc1Swenshuai.xi  * Structure used to communicate from kernel to multicast router.
120*53ee8cc1Swenshuai.xi  * We'll overlay the structure onto an MLD header (not an IPv6 heder like igmpmsg{}
121*53ee8cc1Swenshuai.xi  * used for IPv4 implementation). This is because this structure will be passed via an
122*53ee8cc1Swenshuai.xi  * IPv6 raw socket, on wich an application will only receiver the payload i.e the data after
123*53ee8cc1Swenshuai.xi  * the IPv6 header and all the extension headers. (See section 3 of RFC 3542)
124*53ee8cc1Swenshuai.xi  */
125*53ee8cc1Swenshuai.xi 
126*53ee8cc1Swenshuai.xi struct mrt6msg {
127*53ee8cc1Swenshuai.xi #define MRT6MSG_NOCACHE		1
128*53ee8cc1Swenshuai.xi #define MRT6MSG_WRONGMIF	2
129*53ee8cc1Swenshuai.xi #define MRT6MSG_WHOLEPKT	3		/* used for use level encap */
130*53ee8cc1Swenshuai.xi 	__u8		im6_mbz;		/* must be zero		   */
131*53ee8cc1Swenshuai.xi 	__u8		im6_msgtype;		/* what type of message    */
132*53ee8cc1Swenshuai.xi 	__u16		im6_mif;		/* mif rec'd on		   */
133*53ee8cc1Swenshuai.xi 	__u32		im6_pad;		/* padding for 64 bit arch */
134*53ee8cc1Swenshuai.xi 	struct in6_addr	im6_src, im6_dst;
135*53ee8cc1Swenshuai.xi };
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi #endif
138