1*7bc570c8SYOSHIFUJI Hideaki #ifndef __LINUX_MROUTE6_H 2*7bc570c8SYOSHIFUJI Hideaki #define __LINUX_MROUTE6_H 3*7bc570c8SYOSHIFUJI Hideaki 4*7bc570c8SYOSHIFUJI Hideaki #include <linux/types.h> 5*7bc570c8SYOSHIFUJI Hideaki #include <linux/sockios.h> 6*7bc570c8SYOSHIFUJI Hideaki 7*7bc570c8SYOSHIFUJI Hideaki /* 8*7bc570c8SYOSHIFUJI Hideaki * Based on the MROUTING 3.5 defines primarily to keep 9*7bc570c8SYOSHIFUJI Hideaki * source compatibility with BSD. 10*7bc570c8SYOSHIFUJI Hideaki * 11*7bc570c8SYOSHIFUJI Hideaki * See the pim6sd code for the original history. 12*7bc570c8SYOSHIFUJI Hideaki * 13*7bc570c8SYOSHIFUJI Hideaki * Protocol Independent Multicast (PIM) data structures included 14*7bc570c8SYOSHIFUJI Hideaki * Carlos Picoto (cap@di.fc.ul.pt) 15*7bc570c8SYOSHIFUJI Hideaki * 16*7bc570c8SYOSHIFUJI Hideaki */ 17*7bc570c8SYOSHIFUJI Hideaki 18*7bc570c8SYOSHIFUJI Hideaki #define MRT6_BASE 200 19*7bc570c8SYOSHIFUJI Hideaki #define MRT6_INIT (MRT6_BASE) /* Activate the kernel mroute code */ 20*7bc570c8SYOSHIFUJI Hideaki #define MRT6_DONE (MRT6_BASE+1) /* Shutdown the kernel mroute */ 21*7bc570c8SYOSHIFUJI Hideaki #define MRT6_ADD_MIF (MRT6_BASE+2) /* Add a virtual interface */ 22*7bc570c8SYOSHIFUJI Hideaki #define MRT6_DEL_MIF (MRT6_BASE+3) /* Delete a virtual interface */ 23*7bc570c8SYOSHIFUJI Hideaki #define MRT6_ADD_MFC (MRT6_BASE+4) /* Add a multicast forwarding entry */ 24*7bc570c8SYOSHIFUJI Hideaki #define MRT6_DEL_MFC (MRT6_BASE+5) /* Delete a multicast forwarding entry */ 25*7bc570c8SYOSHIFUJI Hideaki #define MRT6_VERSION (MRT6_BASE+6) /* Get the kernel multicast version */ 26*7bc570c8SYOSHIFUJI Hideaki 27*7bc570c8SYOSHIFUJI Hideaki #define SIOCGETMIFCNT_IN6 SIOCPROTOPRIVATE /* IP protocol privates */ 28*7bc570c8SYOSHIFUJI Hideaki #define SIOCGETSGCNT_IN6 (SIOCPROTOPRIVATE+1) 29*7bc570c8SYOSHIFUJI Hideaki #define SIOCGETRPF (SIOCPROTOPRIVATE+2) 30*7bc570c8SYOSHIFUJI Hideaki 31*7bc570c8SYOSHIFUJI Hideaki #define MAXMIFS 32 32*7bc570c8SYOSHIFUJI Hideaki typedef unsigned long mifbitmap_t; /* User mode code depends on this lot */ 33*7bc570c8SYOSHIFUJI Hideaki typedef unsigned short mifi_t; 34*7bc570c8SYOSHIFUJI Hideaki #define ALL_MIFS ((mifi_t)(-1)) 35*7bc570c8SYOSHIFUJI Hideaki 36*7bc570c8SYOSHIFUJI Hideaki #ifndef IF_SETSIZE 37*7bc570c8SYOSHIFUJI Hideaki #define IF_SETSIZE 256 38*7bc570c8SYOSHIFUJI Hideaki #endif 39*7bc570c8SYOSHIFUJI Hideaki 40*7bc570c8SYOSHIFUJI Hideaki typedef __u32 if_mask; 41*7bc570c8SYOSHIFUJI Hideaki #define NIFBITS (sizeof(if_mask) * 8) /* bits per mask */ 42*7bc570c8SYOSHIFUJI Hideaki 43*7bc570c8SYOSHIFUJI Hideaki #if !defined(__KERNEL__) && !defined(DIV_ROUND_UP) 44*7bc570c8SYOSHIFUJI Hideaki #define DIV_ROUND_UP(x,y) (((x) + ((y) - 1)) / (y)) 45*7bc570c8SYOSHIFUJI Hideaki #endif 46*7bc570c8SYOSHIFUJI Hideaki 47*7bc570c8SYOSHIFUJI Hideaki typedef struct if_set { 48*7bc570c8SYOSHIFUJI Hideaki if_mask ifs_bits[DIV_ROUND_UP(IF_SETSIZE, NIFBITS)]; 49*7bc570c8SYOSHIFUJI Hideaki } if_set; 50*7bc570c8SYOSHIFUJI Hideaki 51*7bc570c8SYOSHIFUJI Hideaki #define IF_SET(n, p) ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS))) 52*7bc570c8SYOSHIFUJI Hideaki #define IF_CLR(n, p) ((p)->ifs_bits[(n)/NIFBITS] &= ~(1 << ((n) % NIFBITS))) 53*7bc570c8SYOSHIFUJI Hideaki #define IF_ISSET(n, p) ((p)->ifs_bits[(n)/NIFBITS] & (1 << ((n) % NIFBITS))) 54*7bc570c8SYOSHIFUJI Hideaki #define IF_COPY(f, t) bcopy(f, t, sizeof(*(f))) 55*7bc570c8SYOSHIFUJI Hideaki #define IF_ZERO(p) bzero(p, sizeof(*(p))) 56*7bc570c8SYOSHIFUJI Hideaki 57*7bc570c8SYOSHIFUJI Hideaki /* 58*7bc570c8SYOSHIFUJI Hideaki * Passed by mrouted for an MRT_ADD_MIF - again we use the 59*7bc570c8SYOSHIFUJI Hideaki * mrouted 3.6 structures for compatibility 60*7bc570c8SYOSHIFUJI Hideaki */ 61*7bc570c8SYOSHIFUJI Hideaki 62*7bc570c8SYOSHIFUJI Hideaki struct mif6ctl { 63*7bc570c8SYOSHIFUJI Hideaki mifi_t mif6c_mifi; /* Index of MIF */ 64*7bc570c8SYOSHIFUJI Hideaki unsigned char mif6c_flags; /* MIFF_ flags */ 65*7bc570c8SYOSHIFUJI Hideaki unsigned char vifc_threshold; /* ttl limit */ 66*7bc570c8SYOSHIFUJI Hideaki u_short mif6c_pifi; /* the index of the physical IF */ 67*7bc570c8SYOSHIFUJI Hideaki unsigned int vifc_rate_limit; /* Rate limiter values (NI) */ 68*7bc570c8SYOSHIFUJI Hideaki }; 69*7bc570c8SYOSHIFUJI Hideaki 70*7bc570c8SYOSHIFUJI Hideaki #define MIFF_REGISTER 0x1 /* register vif */ 71*7bc570c8SYOSHIFUJI Hideaki 72*7bc570c8SYOSHIFUJI Hideaki /* 73*7bc570c8SYOSHIFUJI Hideaki * Cache manipulation structures for mrouted and PIMd 74*7bc570c8SYOSHIFUJI Hideaki */ 75*7bc570c8SYOSHIFUJI Hideaki 76*7bc570c8SYOSHIFUJI Hideaki struct mf6cctl 77*7bc570c8SYOSHIFUJI Hideaki { 78*7bc570c8SYOSHIFUJI Hideaki struct sockaddr_in6 mf6cc_origin; /* Origin of mcast */ 79*7bc570c8SYOSHIFUJI Hideaki struct sockaddr_in6 mf6cc_mcastgrp; /* Group in question */ 80*7bc570c8SYOSHIFUJI Hideaki mifi_t mf6cc_parent; /* Where it arrived */ 81*7bc570c8SYOSHIFUJI Hideaki struct if_set mf6cc_ifset; /* Where it is going */ 82*7bc570c8SYOSHIFUJI Hideaki }; 83*7bc570c8SYOSHIFUJI Hideaki 84*7bc570c8SYOSHIFUJI Hideaki /* 85*7bc570c8SYOSHIFUJI Hideaki * Group count retrieval for pim6sd 86*7bc570c8SYOSHIFUJI Hideaki */ 87*7bc570c8SYOSHIFUJI Hideaki 88*7bc570c8SYOSHIFUJI Hideaki struct sioc_sg_req6 89*7bc570c8SYOSHIFUJI Hideaki { 90*7bc570c8SYOSHIFUJI Hideaki struct sockaddr_in6 src; 91*7bc570c8SYOSHIFUJI Hideaki struct sockaddr_in6 grp; 92*7bc570c8SYOSHIFUJI Hideaki unsigned long pktcnt; 93*7bc570c8SYOSHIFUJI Hideaki unsigned long bytecnt; 94*7bc570c8SYOSHIFUJI Hideaki unsigned long wrong_if; 95*7bc570c8SYOSHIFUJI Hideaki }; 96*7bc570c8SYOSHIFUJI Hideaki 97*7bc570c8SYOSHIFUJI Hideaki /* 98*7bc570c8SYOSHIFUJI Hideaki * To get vif packet counts 99*7bc570c8SYOSHIFUJI Hideaki */ 100*7bc570c8SYOSHIFUJI Hideaki 101*7bc570c8SYOSHIFUJI Hideaki struct sioc_mif_req6 102*7bc570c8SYOSHIFUJI Hideaki { 103*7bc570c8SYOSHIFUJI Hideaki mifi_t mifi; /* Which iface */ 104*7bc570c8SYOSHIFUJI Hideaki unsigned long icount; /* In packets */ 105*7bc570c8SYOSHIFUJI Hideaki unsigned long ocount; /* Out packets */ 106*7bc570c8SYOSHIFUJI Hideaki unsigned long ibytes; /* In bytes */ 107*7bc570c8SYOSHIFUJI Hideaki unsigned long obytes; /* Out bytes */ 108*7bc570c8SYOSHIFUJI Hideaki }; 109*7bc570c8SYOSHIFUJI Hideaki 110*7bc570c8SYOSHIFUJI Hideaki /* 111*7bc570c8SYOSHIFUJI Hideaki * That's all usermode folks 112*7bc570c8SYOSHIFUJI Hideaki */ 113*7bc570c8SYOSHIFUJI Hideaki 114*7bc570c8SYOSHIFUJI Hideaki #ifdef __KERNEL__ 115*7bc570c8SYOSHIFUJI Hideaki 116*7bc570c8SYOSHIFUJI Hideaki #include <linux/skbuff.h> /* for struct sk_buff_head */ 117*7bc570c8SYOSHIFUJI Hideaki 118*7bc570c8SYOSHIFUJI Hideaki struct net_device; 119*7bc570c8SYOSHIFUJI Hideaki struct inet6_dev *ipv6_find_idev(struct net_device *dev); 120*7bc570c8SYOSHIFUJI Hideaki 121*7bc570c8SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_MROUTE 122*7bc570c8SYOSHIFUJI Hideaki static inline int ip6_mroute_opt(int opt) 123*7bc570c8SYOSHIFUJI Hideaki { 124*7bc570c8SYOSHIFUJI Hideaki return (opt >= MRT6_BASE) && (opt <= MRT6_BASE + 10); 125*7bc570c8SYOSHIFUJI Hideaki } 126*7bc570c8SYOSHIFUJI Hideaki #else 127*7bc570c8SYOSHIFUJI Hideaki static inline int ip6_mroute_opt(int opt) 128*7bc570c8SYOSHIFUJI Hideaki { 129*7bc570c8SYOSHIFUJI Hideaki return 0; 130*7bc570c8SYOSHIFUJI Hideaki } 131*7bc570c8SYOSHIFUJI Hideaki #endif 132*7bc570c8SYOSHIFUJI Hideaki 133*7bc570c8SYOSHIFUJI Hideaki struct sock; 134*7bc570c8SYOSHIFUJI Hideaki 135*7bc570c8SYOSHIFUJI Hideaki extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, int); 136*7bc570c8SYOSHIFUJI Hideaki extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *); 137*7bc570c8SYOSHIFUJI Hideaki extern int ip6_mr_input(struct sk_buff *skb); 138*7bc570c8SYOSHIFUJI Hideaki extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg); 139*7bc570c8SYOSHIFUJI Hideaki extern void ip6_mr_init(void); 140*7bc570c8SYOSHIFUJI Hideaki 141*7bc570c8SYOSHIFUJI Hideaki struct mif_device 142*7bc570c8SYOSHIFUJI Hideaki { 143*7bc570c8SYOSHIFUJI Hideaki struct net_device *dev; /* Device we are using */ 144*7bc570c8SYOSHIFUJI Hideaki unsigned long bytes_in,bytes_out; 145*7bc570c8SYOSHIFUJI Hideaki unsigned long pkt_in,pkt_out; /* Statistics */ 146*7bc570c8SYOSHIFUJI Hideaki unsigned long rate_limit; /* Traffic shaping (NI) */ 147*7bc570c8SYOSHIFUJI Hideaki unsigned char threshold; /* TTL threshold */ 148*7bc570c8SYOSHIFUJI Hideaki unsigned short flags; /* Control flags */ 149*7bc570c8SYOSHIFUJI Hideaki int link; /* Physical interface index */ 150*7bc570c8SYOSHIFUJI Hideaki }; 151*7bc570c8SYOSHIFUJI Hideaki 152*7bc570c8SYOSHIFUJI Hideaki #define VIFF_STATIC 0x8000 153*7bc570c8SYOSHIFUJI Hideaki 154*7bc570c8SYOSHIFUJI Hideaki struct mfc6_cache 155*7bc570c8SYOSHIFUJI Hideaki { 156*7bc570c8SYOSHIFUJI Hideaki struct mfc6_cache *next; /* Next entry on cache line */ 157*7bc570c8SYOSHIFUJI Hideaki struct in6_addr mf6c_mcastgrp; /* Group the entry belongs to */ 158*7bc570c8SYOSHIFUJI Hideaki struct in6_addr mf6c_origin; /* Source of packet */ 159*7bc570c8SYOSHIFUJI Hideaki mifi_t mf6c_parent; /* Source interface */ 160*7bc570c8SYOSHIFUJI Hideaki int mfc_flags; /* Flags on line */ 161*7bc570c8SYOSHIFUJI Hideaki 162*7bc570c8SYOSHIFUJI Hideaki union { 163*7bc570c8SYOSHIFUJI Hideaki struct { 164*7bc570c8SYOSHIFUJI Hideaki unsigned long expires; 165*7bc570c8SYOSHIFUJI Hideaki struct sk_buff_head unresolved; /* Unresolved buffers */ 166*7bc570c8SYOSHIFUJI Hideaki } unres; 167*7bc570c8SYOSHIFUJI Hideaki struct { 168*7bc570c8SYOSHIFUJI Hideaki unsigned long last_assert; 169*7bc570c8SYOSHIFUJI Hideaki int minvif; 170*7bc570c8SYOSHIFUJI Hideaki int maxvif; 171*7bc570c8SYOSHIFUJI Hideaki unsigned long bytes; 172*7bc570c8SYOSHIFUJI Hideaki unsigned long pkt; 173*7bc570c8SYOSHIFUJI Hideaki unsigned long wrong_if; 174*7bc570c8SYOSHIFUJI Hideaki unsigned char ttls[MAXMIFS]; /* TTL thresholds */ 175*7bc570c8SYOSHIFUJI Hideaki } res; 176*7bc570c8SYOSHIFUJI Hideaki } mfc_un; 177*7bc570c8SYOSHIFUJI Hideaki }; 178*7bc570c8SYOSHIFUJI Hideaki 179*7bc570c8SYOSHIFUJI Hideaki #define MFC_STATIC 1 180*7bc570c8SYOSHIFUJI Hideaki #define MFC_NOTIFY 2 181*7bc570c8SYOSHIFUJI Hideaki 182*7bc570c8SYOSHIFUJI Hideaki #define MFC6_LINES 64 183*7bc570c8SYOSHIFUJI Hideaki 184*7bc570c8SYOSHIFUJI Hideaki #define MFC6_HASH(a, g) (((__force u32)(a)->s6_addr32[0] ^ \ 185*7bc570c8SYOSHIFUJI Hideaki (__force u32)(a)->s6_addr32[1] ^ \ 186*7bc570c8SYOSHIFUJI Hideaki (__force u32)(a)->s6_addr32[2] ^ \ 187*7bc570c8SYOSHIFUJI Hideaki (__force u32)(a)->s6_addr32[3] ^ \ 188*7bc570c8SYOSHIFUJI Hideaki (__force u32)(g)->s6_addr32[0] ^ \ 189*7bc570c8SYOSHIFUJI Hideaki (__force u32)(g)->s6_addr32[1] ^ \ 190*7bc570c8SYOSHIFUJI Hideaki (__force u32)(g)->s6_addr32[2] ^ \ 191*7bc570c8SYOSHIFUJI Hideaki (__force u32)(g)->s6_addr32[3]) % MFC6_LINES) 192*7bc570c8SYOSHIFUJI Hideaki 193*7bc570c8SYOSHIFUJI Hideaki #define MFC_ASSERT_THRESH (3*HZ) /* Maximal freq. of asserts */ 194*7bc570c8SYOSHIFUJI Hideaki 195*7bc570c8SYOSHIFUJI Hideaki #endif 196*7bc570c8SYOSHIFUJI Hideaki 197*7bc570c8SYOSHIFUJI Hideaki #ifdef __KERNEL__ 198*7bc570c8SYOSHIFUJI Hideaki struct rtmsg; 199*7bc570c8SYOSHIFUJI Hideaki extern int ip6mr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait); 200*7bc570c8SYOSHIFUJI Hideaki 201*7bc570c8SYOSHIFUJI Hideaki #ifdef CONFIG_IPV6_MROUTE 202*7bc570c8SYOSHIFUJI Hideaki extern struct sock *mroute6_socket; 203*7bc570c8SYOSHIFUJI Hideaki extern int ip6mr_sk_done(struct sock *sk); 204*7bc570c8SYOSHIFUJI Hideaki #else 205*7bc570c8SYOSHIFUJI Hideaki #define mroute6_socket NULL 206*7bc570c8SYOSHIFUJI Hideaki static inline int ip6mr_sk_done(struct sock *sk) { return 0; } 207*7bc570c8SYOSHIFUJI Hideaki #endif 208*7bc570c8SYOSHIFUJI Hideaki #endif 209*7bc570c8SYOSHIFUJI Hideaki 210*7bc570c8SYOSHIFUJI Hideaki /* 211*7bc570c8SYOSHIFUJI Hideaki * Structure used to communicate from kernel to multicast router. 212*7bc570c8SYOSHIFUJI Hideaki * We'll overlay the structure onto an MLD header (not an IPv6 heder like igmpmsg{} 213*7bc570c8SYOSHIFUJI Hideaki * used for IPv4 implementation). This is because this structure will be passed via an 214*7bc570c8SYOSHIFUJI Hideaki * IPv6 raw socket, on wich an application will only receiver the payload i.e the data after 215*7bc570c8SYOSHIFUJI Hideaki * the IPv6 header and all the extension headers. (See section 3 of RFC 3542) 216*7bc570c8SYOSHIFUJI Hideaki */ 217*7bc570c8SYOSHIFUJI Hideaki 218*7bc570c8SYOSHIFUJI Hideaki struct mrt6msg { 219*7bc570c8SYOSHIFUJI Hideaki #define MRT6MSG_NOCACHE 1 220*7bc570c8SYOSHIFUJI Hideaki __u8 im6_mbz; /* must be zero */ 221*7bc570c8SYOSHIFUJI Hideaki __u8 im6_msgtype; /* what type of message */ 222*7bc570c8SYOSHIFUJI Hideaki __u16 im6_mif; /* mif rec'd on */ 223*7bc570c8SYOSHIFUJI Hideaki __u32 im6_pad; /* padding for 64 bit arch */ 224*7bc570c8SYOSHIFUJI Hideaki struct in6_addr im6_src, im6_dst; 225*7bc570c8SYOSHIFUJI Hideaki }; 226*7bc570c8SYOSHIFUJI Hideaki 227*7bc570c8SYOSHIFUJI Hideaki #endif 228