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