11da177e4SLinus Torvalds #ifndef __LINUX_MROUTE_H 21da177e4SLinus Torvalds #define __LINUX_MROUTE_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds #include <linux/sockios.h> 51da177e4SLinus Torvalds #include <linux/in.h> 61da177e4SLinus Torvalds 71da177e4SLinus Torvalds /* 81da177e4SLinus Torvalds * Based on the MROUTING 3.5 defines primarily to keep 91da177e4SLinus Torvalds * source compatibility with BSD. 101da177e4SLinus Torvalds * 111da177e4SLinus Torvalds * See the mrouted code for the original history. 121da177e4SLinus Torvalds * 131da177e4SLinus Torvalds * Protocol Independent Multicast (PIM) data structures included 141da177e4SLinus Torvalds * Carlos Picoto (cap@di.fc.ul.pt) 151da177e4SLinus Torvalds * 161da177e4SLinus Torvalds */ 171da177e4SLinus Torvalds 181da177e4SLinus Torvalds #define MRT_BASE 200 191da177e4SLinus Torvalds #define MRT_INIT (MRT_BASE) /* Activate the kernel mroute code */ 201da177e4SLinus Torvalds #define MRT_DONE (MRT_BASE+1) /* Shutdown the kernel mroute */ 211da177e4SLinus Torvalds #define MRT_ADD_VIF (MRT_BASE+2) /* Add a virtual interface */ 221da177e4SLinus Torvalds #define MRT_DEL_VIF (MRT_BASE+3) /* Delete a virtual interface */ 231da177e4SLinus Torvalds #define MRT_ADD_MFC (MRT_BASE+4) /* Add a multicast forwarding entry */ 241da177e4SLinus Torvalds #define MRT_DEL_MFC (MRT_BASE+5) /* Delete a multicast forwarding entry */ 251da177e4SLinus Torvalds #define MRT_VERSION (MRT_BASE+6) /* Get the kernel multicast version */ 261da177e4SLinus Torvalds #define MRT_ASSERT (MRT_BASE+7) /* Activate PIM assert mode */ 271da177e4SLinus Torvalds #define MRT_PIM (MRT_BASE+8) /* enable PIM code */ 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds #define SIOCGETVIFCNT SIOCPROTOPRIVATE /* IP protocol privates */ 301da177e4SLinus Torvalds #define SIOCGETSGCNT (SIOCPROTOPRIVATE+1) 311da177e4SLinus Torvalds #define SIOCGETRPF (SIOCPROTOPRIVATE+2) 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds #define MAXVIFS 32 341da177e4SLinus Torvalds typedef unsigned long vifbitmap_t; /* User mode code depends on this lot */ 351da177e4SLinus Torvalds typedef unsigned short vifi_t; 361da177e4SLinus Torvalds #define ALL_VIFS ((vifi_t)(-1)) 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds /* 391da177e4SLinus Torvalds * Same idea as select 401da177e4SLinus Torvalds */ 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds #define VIFM_SET(n,m) ((m)|=(1<<(n))) 431da177e4SLinus Torvalds #define VIFM_CLR(n,m) ((m)&=~(1<<(n))) 441da177e4SLinus Torvalds #define VIFM_ISSET(n,m) ((m)&(1<<(n))) 451da177e4SLinus Torvalds #define VIFM_CLRALL(m) ((m)=0) 461da177e4SLinus Torvalds #define VIFM_COPY(mfrom,mto) ((mto)=(mfrom)) 471da177e4SLinus Torvalds #define VIFM_SAME(m1,m2) ((m1)==(m2)) 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds /* 501da177e4SLinus Torvalds * Passed by mrouted for an MRT_ADD_VIF - again we use the 511da177e4SLinus Torvalds * mrouted 3.6 structures for compatibility 521da177e4SLinus Torvalds */ 531da177e4SLinus Torvalds 541da177e4SLinus Torvalds struct vifctl { 551da177e4SLinus Torvalds vifi_t vifc_vifi; /* Index of VIF */ 561da177e4SLinus Torvalds unsigned char vifc_flags; /* VIFF_ flags */ 571da177e4SLinus Torvalds unsigned char vifc_threshold; /* ttl limit */ 581da177e4SLinus Torvalds unsigned int vifc_rate_limit; /* Rate limiter values (NI) */ 591da177e4SLinus Torvalds struct in_addr vifc_lcl_addr; /* Our address */ 601da177e4SLinus Torvalds struct in_addr vifc_rmt_addr; /* IPIP tunnel addr */ 611da177e4SLinus Torvalds }; 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds #define VIFF_TUNNEL 0x1 /* IPIP tunnel */ 641da177e4SLinus Torvalds #define VIFF_SRCRT 0x2 /* NI */ 651da177e4SLinus Torvalds #define VIFF_REGISTER 0x4 /* register vif */ 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds /* 681da177e4SLinus Torvalds * Cache manipulation structures for mrouted and PIMd 691da177e4SLinus Torvalds */ 701da177e4SLinus Torvalds 711da177e4SLinus Torvalds struct mfcctl 721da177e4SLinus Torvalds { 731da177e4SLinus Torvalds struct in_addr mfcc_origin; /* Origin of mcast */ 741da177e4SLinus Torvalds struct in_addr mfcc_mcastgrp; /* Group in question */ 751da177e4SLinus Torvalds vifi_t mfcc_parent; /* Where it arrived */ 761da177e4SLinus Torvalds unsigned char mfcc_ttls[MAXVIFS]; /* Where it is going */ 771da177e4SLinus Torvalds unsigned int mfcc_pkt_cnt; /* pkt count for src-grp */ 781da177e4SLinus Torvalds unsigned int mfcc_byte_cnt; 791da177e4SLinus Torvalds unsigned int mfcc_wrong_if; 801da177e4SLinus Torvalds int mfcc_expire; 811da177e4SLinus Torvalds }; 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds /* 841da177e4SLinus Torvalds * Group count retrieval for mrouted 851da177e4SLinus Torvalds */ 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds struct sioc_sg_req 881da177e4SLinus Torvalds { 891da177e4SLinus Torvalds struct in_addr src; 901da177e4SLinus Torvalds struct in_addr grp; 911da177e4SLinus Torvalds unsigned long pktcnt; 921da177e4SLinus Torvalds unsigned long bytecnt; 931da177e4SLinus Torvalds unsigned long wrong_if; 941da177e4SLinus Torvalds }; 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds /* 971da177e4SLinus Torvalds * To get vif packet counts 981da177e4SLinus Torvalds */ 991da177e4SLinus Torvalds 1001da177e4SLinus Torvalds struct sioc_vif_req 1011da177e4SLinus Torvalds { 1021da177e4SLinus Torvalds vifi_t vifi; /* Which iface */ 1031da177e4SLinus Torvalds unsigned long icount; /* In packets */ 1041da177e4SLinus Torvalds unsigned long ocount; /* Out packets */ 1051da177e4SLinus Torvalds unsigned long ibytes; /* In bytes */ 1061da177e4SLinus Torvalds unsigned long obytes; /* Out bytes */ 1071da177e4SLinus Torvalds }; 1081da177e4SLinus Torvalds 1091da177e4SLinus Torvalds /* 1101da177e4SLinus Torvalds * This is the format the mroute daemon expects to see IGMP control 1111da177e4SLinus Torvalds * data. Magically happens to be like an IP packet as per the original 1121da177e4SLinus Torvalds */ 1131da177e4SLinus Torvalds 1141da177e4SLinus Torvalds struct igmpmsg 1151da177e4SLinus Torvalds { 1161da177e4SLinus Torvalds __u32 unused1,unused2; 1171da177e4SLinus Torvalds unsigned char im_msgtype; /* What is this */ 1181da177e4SLinus Torvalds unsigned char im_mbz; /* Must be zero */ 1191da177e4SLinus Torvalds unsigned char im_vif; /* Interface (this ought to be a vifi_t!) */ 1201da177e4SLinus Torvalds unsigned char unused3; 1211da177e4SLinus Torvalds struct in_addr im_src,im_dst; 1221da177e4SLinus Torvalds }; 1231da177e4SLinus Torvalds 1241da177e4SLinus Torvalds /* 1251da177e4SLinus Torvalds * That's all usermode folks 1261da177e4SLinus Torvalds */ 1271da177e4SLinus Torvalds 1281da177e4SLinus Torvalds #ifdef __KERNEL__ 1291da177e4SLinus Torvalds #include <net/sock.h> 1301da177e4SLinus Torvalds 131*6a9fb947SPavel Emelyanov #ifdef CONFIG_IP_MROUTE 132*6a9fb947SPavel Emelyanov static inline int ip_mroute_opt(int opt) 133*6a9fb947SPavel Emelyanov { 134*6a9fb947SPavel Emelyanov return (opt >= MRT_BASE) && (opt <= MRT_BASE + 10); 135*6a9fb947SPavel Emelyanov } 136*6a9fb947SPavel Emelyanov #else 137*6a9fb947SPavel Emelyanov static inline int ip_mroute_opt(int opt) 138*6a9fb947SPavel Emelyanov { 139*6a9fb947SPavel Emelyanov return 0; 140*6a9fb947SPavel Emelyanov } 141*6a9fb947SPavel Emelyanov #endif 142*6a9fb947SPavel Emelyanov 1431da177e4SLinus Torvalds extern int ip_mroute_setsockopt(struct sock *, int, char __user *, int); 1441da177e4SLinus Torvalds extern int ip_mroute_getsockopt(struct sock *, int, char __user *, int __user *); 1451da177e4SLinus Torvalds extern int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg); 1461da177e4SLinus Torvalds extern void ip_mr_init(void); 1471da177e4SLinus Torvalds 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds struct vif_device 1501da177e4SLinus Torvalds { 1511da177e4SLinus Torvalds struct net_device *dev; /* Device we are using */ 1521da177e4SLinus Torvalds unsigned long bytes_in,bytes_out; 1531da177e4SLinus Torvalds unsigned long pkt_in,pkt_out; /* Statistics */ 1541da177e4SLinus Torvalds unsigned long rate_limit; /* Traffic shaping (NI) */ 1551da177e4SLinus Torvalds unsigned char threshold; /* TTL threshold */ 1561da177e4SLinus Torvalds unsigned short flags; /* Control flags */ 157114c7844SAl Viro __be32 local,remote; /* Addresses(remote for tunnels)*/ 1581da177e4SLinus Torvalds int link; /* Physical interface index */ 1591da177e4SLinus Torvalds }; 1601da177e4SLinus Torvalds 1611da177e4SLinus Torvalds #define VIFF_STATIC 0x8000 1621da177e4SLinus Torvalds 1631da177e4SLinus Torvalds struct mfc_cache 1641da177e4SLinus Torvalds { 1651da177e4SLinus Torvalds struct mfc_cache *next; /* Next entry on cache line */ 166114c7844SAl Viro __be32 mfc_mcastgrp; /* Group the entry belongs to */ 167114c7844SAl Viro __be32 mfc_origin; /* Source of packet */ 1681da177e4SLinus Torvalds vifi_t mfc_parent; /* Source interface */ 1691da177e4SLinus Torvalds int mfc_flags; /* Flags on line */ 1701da177e4SLinus Torvalds 1711da177e4SLinus Torvalds union { 1721da177e4SLinus Torvalds struct { 1731da177e4SLinus Torvalds unsigned long expires; 1741da177e4SLinus Torvalds struct sk_buff_head unresolved; /* Unresolved buffers */ 1751da177e4SLinus Torvalds } unres; 1761da177e4SLinus Torvalds struct { 1771da177e4SLinus Torvalds unsigned long last_assert; 1781da177e4SLinus Torvalds int minvif; 1791da177e4SLinus Torvalds int maxvif; 1801da177e4SLinus Torvalds unsigned long bytes; 1811da177e4SLinus Torvalds unsigned long pkt; 1821da177e4SLinus Torvalds unsigned long wrong_if; 1831da177e4SLinus Torvalds unsigned char ttls[MAXVIFS]; /* TTL thresholds */ 1841da177e4SLinus Torvalds } res; 1851da177e4SLinus Torvalds } mfc_un; 1861da177e4SLinus Torvalds }; 1871da177e4SLinus Torvalds 1881da177e4SLinus Torvalds #define MFC_STATIC 1 1891da177e4SLinus Torvalds #define MFC_NOTIFY 2 1901da177e4SLinus Torvalds 1911da177e4SLinus Torvalds #define MFC_LINES 64 1921da177e4SLinus Torvalds 1931da177e4SLinus Torvalds #ifdef __BIG_ENDIAN 194114c7844SAl Viro #define MFC_HASH(a,b) (((((__force u32)(__be32)a)>>24)^(((__force u32)(__be32)b)>>26))&(MFC_LINES-1)) 1951da177e4SLinus Torvalds #else 196114c7844SAl Viro #define MFC_HASH(a,b) ((((__force u32)(__be32)a)^(((__force u32)(__be32)b)>>2))&(MFC_LINES-1)) 1971da177e4SLinus Torvalds #endif 1981da177e4SLinus Torvalds 1991da177e4SLinus Torvalds #endif 2001da177e4SLinus Torvalds 2011da177e4SLinus Torvalds 2021da177e4SLinus Torvalds #define MFC_ASSERT_THRESH (3*HZ) /* Maximal freq. of asserts */ 2031da177e4SLinus Torvalds 2041da177e4SLinus Torvalds /* 2051da177e4SLinus Torvalds * Pseudo messages used by mrouted 2061da177e4SLinus Torvalds */ 2071da177e4SLinus Torvalds 2081da177e4SLinus Torvalds #define IGMPMSG_NOCACHE 1 /* Kern cache fill request to mrouted */ 2091da177e4SLinus Torvalds #define IGMPMSG_WRONGVIF 2 /* For PIM assert processing (unused) */ 2101da177e4SLinus Torvalds #define IGMPMSG_WHOLEPKT 3 /* For PIM Register processing */ 2111da177e4SLinus Torvalds 2121da177e4SLinus Torvalds #ifdef __KERNEL__ 2131da177e4SLinus Torvalds 2141da177e4SLinus Torvalds #define PIM_V1_VERSION __constant_htonl(0x10000000) 2151da177e4SLinus Torvalds #define PIM_V1_REGISTER 1 2161da177e4SLinus Torvalds 2171da177e4SLinus Torvalds #define PIM_VERSION 2 2181da177e4SLinus Torvalds #define PIM_REGISTER 1 2191da177e4SLinus Torvalds 2201da177e4SLinus Torvalds #define PIM_NULL_REGISTER __constant_htonl(0x40000000) 2211da177e4SLinus Torvalds 2221da177e4SLinus Torvalds /* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */ 2231da177e4SLinus Torvalds 2241da177e4SLinus Torvalds struct pimreghdr 2251da177e4SLinus Torvalds { 2261da177e4SLinus Torvalds __u8 type; 2271da177e4SLinus Torvalds __u8 reserved; 2281b620154SAl Viro __be16 csum; 2291b620154SAl Viro __be32 flags; 2301da177e4SLinus Torvalds }; 2311da177e4SLinus Torvalds 2321da177e4SLinus Torvalds extern int pim_rcv_v1(struct sk_buff *); 2331da177e4SLinus Torvalds 2341da177e4SLinus Torvalds struct rtmsg; 2351da177e4SLinus Torvalds extern int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait); 2361da177e4SLinus Torvalds #endif 2371da177e4SLinus Torvalds 2381da177e4SLinus Torvalds #endif 239