1607ca46eSDavid Howells #ifndef _UAPI__LINUX_MROUTE_H 2607ca46eSDavid Howells #define _UAPI__LINUX_MROUTE_H 3607ca46eSDavid Howells 4607ca46eSDavid Howells #include <linux/sockios.h> 5607ca46eSDavid Howells #include <linux/types.h> 6bcb41c6bSDmitry V. Levin #include <linux/in.h> /* For struct in_addr. */ 7607ca46eSDavid Howells 87ef8f65dSNikolay Aleksandrov /* Based on the MROUTING 3.5 defines primarily to keep 9607ca46eSDavid Howells * source compatibility with BSD. 10607ca46eSDavid Howells * 11607ca46eSDavid Howells * See the mrouted code for the original history. 12607ca46eSDavid Howells * 13607ca46eSDavid Howells * Protocol Independent Multicast (PIM) data structures included 14607ca46eSDavid Howells * Carlos Picoto (cap@di.fc.ul.pt) 15607ca46eSDavid Howells */ 16607ca46eSDavid Howells 17607ca46eSDavid Howells #define MRT_BASE 200 18607ca46eSDavid Howells #define MRT_INIT (MRT_BASE) /* Activate the kernel mroute code */ 19607ca46eSDavid Howells #define MRT_DONE (MRT_BASE+1) /* Shutdown the kernel mroute */ 20607ca46eSDavid Howells #define MRT_ADD_VIF (MRT_BASE+2) /* Add a virtual interface */ 21607ca46eSDavid Howells #define MRT_DEL_VIF (MRT_BASE+3) /* Delete a virtual interface */ 22607ca46eSDavid Howells #define MRT_ADD_MFC (MRT_BASE+4) /* Add a multicast forwarding entry */ 23607ca46eSDavid Howells #define MRT_DEL_MFC (MRT_BASE+5) /* Delete a multicast forwarding entry */ 24607ca46eSDavid Howells #define MRT_VERSION (MRT_BASE+6) /* Get the kernel multicast version */ 25607ca46eSDavid Howells #define MRT_ASSERT (MRT_BASE+7) /* Activate PIM assert mode */ 26607ca46eSDavid Howells #define MRT_PIM (MRT_BASE+8) /* enable PIM code */ 27607ca46eSDavid Howells #define MRT_TABLE (MRT_BASE+9) /* Specify mroute table ID */ 28660b26dcSNicolas Dichtel #define MRT_ADD_MFC_PROXY (MRT_BASE+10) /* Add a (*,*|G) mfc entry */ 29660b26dcSNicolas Dichtel #define MRT_DEL_MFC_PROXY (MRT_BASE+11) /* Del a (*,*|G) mfc entry */ 30660b26dcSNicolas Dichtel #define MRT_MAX (MRT_BASE+11) 31607ca46eSDavid Howells 32607ca46eSDavid Howells #define SIOCGETVIFCNT SIOCPROTOPRIVATE /* IP protocol privates */ 33607ca46eSDavid Howells #define SIOCGETSGCNT (SIOCPROTOPRIVATE+1) 34607ca46eSDavid Howells #define SIOCGETRPF (SIOCPROTOPRIVATE+2) 35607ca46eSDavid Howells 36607ca46eSDavid Howells #define MAXVIFS 32 37607ca46eSDavid Howells typedef unsigned long vifbitmap_t; /* User mode code depends on this lot */ 38607ca46eSDavid Howells typedef unsigned short vifi_t; 39607ca46eSDavid Howells #define ALL_VIFS ((vifi_t)(-1)) 40607ca46eSDavid Howells 417ef8f65dSNikolay Aleksandrov /* Same idea as select */ 42607ca46eSDavid Howells 43607ca46eSDavid Howells #define VIFM_SET(n,m) ((m)|=(1<<(n))) 44607ca46eSDavid Howells #define VIFM_CLR(n,m) ((m)&=~(1<<(n))) 45607ca46eSDavid Howells #define VIFM_ISSET(n,m) ((m)&(1<<(n))) 46607ca46eSDavid Howells #define VIFM_CLRALL(m) ((m)=0) 47607ca46eSDavid Howells #define VIFM_COPY(mfrom,mto) ((mto)=(mfrom)) 48607ca46eSDavid Howells #define VIFM_SAME(m1,m2) ((m1)==(m2)) 49607ca46eSDavid Howells 507ef8f65dSNikolay Aleksandrov /* Passed by mrouted for an MRT_ADD_VIF - again we use the 51607ca46eSDavid Howells * mrouted 3.6 structures for compatibility 52607ca46eSDavid Howells */ 53607ca46eSDavid Howells struct vifctl { 54607ca46eSDavid Howells vifi_t vifc_vifi; /* Index of VIF */ 55607ca46eSDavid Howells unsigned char vifc_flags; /* VIFF_ flags */ 56607ca46eSDavid Howells unsigned char vifc_threshold; /* ttl limit */ 57607ca46eSDavid Howells unsigned int vifc_rate_limit; /* Rate limiter values (NI) */ 58607ca46eSDavid Howells union { 59607ca46eSDavid Howells struct in_addr vifc_lcl_addr; /* Local interface address */ 60607ca46eSDavid Howells int vifc_lcl_ifindex; /* Local interface index */ 61607ca46eSDavid Howells }; 62607ca46eSDavid Howells struct in_addr vifc_rmt_addr; /* IPIP tunnel addr */ 63607ca46eSDavid Howells }; 64607ca46eSDavid Howells 65607ca46eSDavid Howells #define VIFF_TUNNEL 0x1 /* IPIP tunnel */ 66607ca46eSDavid Howells #define VIFF_SRCRT 0x2 /* NI */ 67607ca46eSDavid Howells #define VIFF_REGISTER 0x4 /* register vif */ 68607ca46eSDavid Howells #define VIFF_USE_IFINDEX 0x8 /* use vifc_lcl_ifindex instead of 69607ca46eSDavid Howells vifc_lcl_addr to find an interface */ 70607ca46eSDavid Howells 717ef8f65dSNikolay Aleksandrov /* Cache manipulation structures for mrouted and PIMd */ 72607ca46eSDavid Howells struct mfcctl { 73607ca46eSDavid Howells struct in_addr mfcc_origin; /* Origin of mcast */ 74607ca46eSDavid Howells struct in_addr mfcc_mcastgrp; /* Group in question */ 75607ca46eSDavid Howells vifi_t mfcc_parent; /* Where it arrived */ 76607ca46eSDavid Howells unsigned char mfcc_ttls[MAXVIFS]; /* Where it is going */ 77607ca46eSDavid Howells unsigned int mfcc_pkt_cnt; /* pkt count for src-grp */ 78607ca46eSDavid Howells unsigned int mfcc_byte_cnt; 79607ca46eSDavid Howells unsigned int mfcc_wrong_if; 80607ca46eSDavid Howells int mfcc_expire; 81607ca46eSDavid Howells }; 82607ca46eSDavid Howells 837ef8f65dSNikolay Aleksandrov /* Group count retrieval for mrouted */ 84607ca46eSDavid Howells struct sioc_sg_req { 85607ca46eSDavid Howells struct in_addr src; 86607ca46eSDavid Howells struct in_addr grp; 87607ca46eSDavid Howells unsigned long pktcnt; 88607ca46eSDavid Howells unsigned long bytecnt; 89607ca46eSDavid Howells unsigned long wrong_if; 90607ca46eSDavid Howells }; 91607ca46eSDavid Howells 927ef8f65dSNikolay Aleksandrov /* To get vif packet counts */ 93607ca46eSDavid Howells struct sioc_vif_req { 94607ca46eSDavid Howells vifi_t vifi; /* Which iface */ 95607ca46eSDavid Howells unsigned long icount; /* In packets */ 96607ca46eSDavid Howells unsigned long ocount; /* Out packets */ 97607ca46eSDavid Howells unsigned long ibytes; /* In bytes */ 98607ca46eSDavid Howells unsigned long obytes; /* Out bytes */ 99607ca46eSDavid Howells }; 100607ca46eSDavid Howells 1017ef8f65dSNikolay Aleksandrov /* This is the format the mroute daemon expects to see IGMP control 102607ca46eSDavid Howells * data. Magically happens to be like an IP packet as per the original 103607ca46eSDavid Howells */ 104607ca46eSDavid Howells struct igmpmsg { 105607ca46eSDavid Howells __u32 unused1,unused2; 106607ca46eSDavid Howells unsigned char im_msgtype; /* What is this */ 107607ca46eSDavid Howells unsigned char im_mbz; /* Must be zero */ 108607ca46eSDavid Howells unsigned char im_vif; /* Interface (this ought to be a vifi_t!) */ 109607ca46eSDavid Howells unsigned char unused3; 110607ca46eSDavid Howells struct in_addr im_src,im_dst; 111607ca46eSDavid Howells }; 112607ca46eSDavid Howells 113*772c344dSNikolay Aleksandrov /* ipmr netlink table attributes */ 114*772c344dSNikolay Aleksandrov enum { 115*772c344dSNikolay Aleksandrov IPMRA_TABLE_UNSPEC, 116*772c344dSNikolay Aleksandrov IPMRA_TABLE_ID, 117*772c344dSNikolay Aleksandrov IPMRA_TABLE_CACHE_RES_QUEUE_LEN, 118*772c344dSNikolay Aleksandrov IPMRA_TABLE_MROUTE_REG_VIF_NUM, 119*772c344dSNikolay Aleksandrov IPMRA_TABLE_MROUTE_DO_ASSERT, 120*772c344dSNikolay Aleksandrov IPMRA_TABLE_MROUTE_DO_PIM, 121*772c344dSNikolay Aleksandrov IPMRA_TABLE_VIFS, 122*772c344dSNikolay Aleksandrov __IPMRA_TABLE_MAX 123*772c344dSNikolay Aleksandrov }; 124*772c344dSNikolay Aleksandrov #define IPMRA_TABLE_MAX (__IPMRA_TABLE_MAX - 1) 125*772c344dSNikolay Aleksandrov 126*772c344dSNikolay Aleksandrov /* ipmr netlink vif attribute format 127*772c344dSNikolay Aleksandrov * [ IPMRA_TABLE_VIFS ] - nested attribute 128*772c344dSNikolay Aleksandrov * [ IPMRA_VIF ] - nested attribute 129*772c344dSNikolay Aleksandrov * [ IPMRA_VIFA_xxx ] 130*772c344dSNikolay Aleksandrov */ 131*772c344dSNikolay Aleksandrov enum { 132*772c344dSNikolay Aleksandrov IPMRA_VIF_UNSPEC, 133*772c344dSNikolay Aleksandrov IPMRA_VIF, 134*772c344dSNikolay Aleksandrov __IPMRA_VIF_MAX 135*772c344dSNikolay Aleksandrov }; 136*772c344dSNikolay Aleksandrov #define IPMRA_VIF_MAX (__IPMRA_VIF_MAX - 1) 137*772c344dSNikolay Aleksandrov 138*772c344dSNikolay Aleksandrov /* vif-specific attributes */ 139*772c344dSNikolay Aleksandrov enum { 140*772c344dSNikolay Aleksandrov IPMRA_VIFA_UNSPEC, 141*772c344dSNikolay Aleksandrov IPMRA_VIFA_IFINDEX, 142*772c344dSNikolay Aleksandrov IPMRA_VIFA_VIF_ID, 143*772c344dSNikolay Aleksandrov IPMRA_VIFA_FLAGS, 144*772c344dSNikolay Aleksandrov IPMRA_VIFA_BYTES_IN, 145*772c344dSNikolay Aleksandrov IPMRA_VIFA_BYTES_OUT, 146*772c344dSNikolay Aleksandrov IPMRA_VIFA_PACKETS_IN, 147*772c344dSNikolay Aleksandrov IPMRA_VIFA_PACKETS_OUT, 148*772c344dSNikolay Aleksandrov IPMRA_VIFA_LOCAL_ADDR, 149*772c344dSNikolay Aleksandrov IPMRA_VIFA_REMOTE_ADDR, 150*772c344dSNikolay Aleksandrov IPMRA_VIFA_PAD, 151*772c344dSNikolay Aleksandrov __IPMRA_VIFA_MAX 152*772c344dSNikolay Aleksandrov }; 153*772c344dSNikolay Aleksandrov #define IPMRA_VIFA_MAX (__IPMRA_VIFA_MAX - 1) 154*772c344dSNikolay Aleksandrov 1557ef8f65dSNikolay Aleksandrov /* That's all usermode folks */ 156607ca46eSDavid Howells 157607ca46eSDavid Howells #define MFC_ASSERT_THRESH (3*HZ) /* Maximal freq. of asserts */ 158607ca46eSDavid Howells 1597ef8f65dSNikolay Aleksandrov /* Pseudo messages used by mrouted */ 160607ca46eSDavid Howells #define IGMPMSG_NOCACHE 1 /* Kern cache fill request to mrouted */ 161607ca46eSDavid Howells #define IGMPMSG_WRONGVIF 2 /* For PIM assert processing (unused) */ 162607ca46eSDavid Howells #define IGMPMSG_WHOLEPKT 3 /* For PIM Register processing */ 163607ca46eSDavid Howells 164607ca46eSDavid Howells #endif /* _UAPI__LINUX_MROUTE_H */ 165