1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi * Linux NET3: Internet Group Management Protocol [IGMP] 3*53ee8cc1Swenshuai.xi * 4*53ee8cc1Swenshuai.xi * Authors: 5*53ee8cc1Swenshuai.xi * Alan Cox <Alan.Cox@linux.org> 6*53ee8cc1Swenshuai.xi * 7*53ee8cc1Swenshuai.xi * Extended to talk the BSD extended IGMP protocol of mrouted 3.6 8*53ee8cc1Swenshuai.xi * 9*53ee8cc1Swenshuai.xi * 10*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or 11*53ee8cc1Swenshuai.xi * modify it under the terms of the GNU General Public License 12*53ee8cc1Swenshuai.xi * as published by the Free Software Foundation; either version 13*53ee8cc1Swenshuai.xi * 2 of the License, or (at your option) any later version. 14*53ee8cc1Swenshuai.xi */ 15*53ee8cc1Swenshuai.xi 16*53ee8cc1Swenshuai.xi #ifndef _LINUX_IGMP_H 17*53ee8cc1Swenshuai.xi #define _LINUX_IGMP_H 18*53ee8cc1Swenshuai.xi 19*53ee8cc1Swenshuai.xi #include <asm/byteorder.h> 20*53ee8cc1Swenshuai.xi 21*53ee8cc1Swenshuai.xi /* 22*53ee8cc1Swenshuai.xi * IGMP protocol structures 23*53ee8cc1Swenshuai.xi */ 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi /* 26*53ee8cc1Swenshuai.xi * Header in on cable format 27*53ee8cc1Swenshuai.xi */ 28*53ee8cc1Swenshuai.xi 29*53ee8cc1Swenshuai.xi struct igmphdr 30*53ee8cc1Swenshuai.xi { 31*53ee8cc1Swenshuai.xi __u8 type; 32*53ee8cc1Swenshuai.xi __u8 code; /* For newer IGMP */ 33*53ee8cc1Swenshuai.xi __sum16 csum; 34*53ee8cc1Swenshuai.xi __be32 group; 35*53ee8cc1Swenshuai.xi }; 36*53ee8cc1Swenshuai.xi 37*53ee8cc1Swenshuai.xi /* V3 group record types [grec_type] */ 38*53ee8cc1Swenshuai.xi #define IGMPV3_MODE_IS_INCLUDE 1 39*53ee8cc1Swenshuai.xi #define IGMPV3_MODE_IS_EXCLUDE 2 40*53ee8cc1Swenshuai.xi #define IGMPV3_CHANGE_TO_INCLUDE 3 41*53ee8cc1Swenshuai.xi #define IGMPV3_CHANGE_TO_EXCLUDE 4 42*53ee8cc1Swenshuai.xi #define IGMPV3_ALLOW_NEW_SOURCES 5 43*53ee8cc1Swenshuai.xi #define IGMPV3_BLOCK_OLD_SOURCES 6 44*53ee8cc1Swenshuai.xi 45*53ee8cc1Swenshuai.xi struct igmpv3_grec { 46*53ee8cc1Swenshuai.xi __u8 grec_type; 47*53ee8cc1Swenshuai.xi __u8 grec_auxwords; 48*53ee8cc1Swenshuai.xi __be16 grec_nsrcs; 49*53ee8cc1Swenshuai.xi __be32 grec_mca; 50*53ee8cc1Swenshuai.xi __be32 grec_src[0]; 51*53ee8cc1Swenshuai.xi }; 52*53ee8cc1Swenshuai.xi 53*53ee8cc1Swenshuai.xi struct igmpv3_report { 54*53ee8cc1Swenshuai.xi __u8 type; 55*53ee8cc1Swenshuai.xi __u8 resv1; 56*53ee8cc1Swenshuai.xi __be16 csum; 57*53ee8cc1Swenshuai.xi __be16 resv2; 58*53ee8cc1Swenshuai.xi __be16 ngrec; 59*53ee8cc1Swenshuai.xi struct igmpv3_grec grec[0]; 60*53ee8cc1Swenshuai.xi }; 61*53ee8cc1Swenshuai.xi 62*53ee8cc1Swenshuai.xi struct igmpv3_query { 63*53ee8cc1Swenshuai.xi __u8 type; 64*53ee8cc1Swenshuai.xi __u8 code; 65*53ee8cc1Swenshuai.xi __be16 csum; 66*53ee8cc1Swenshuai.xi __be32 group; 67*53ee8cc1Swenshuai.xi #if defined(__LITTLE_ENDIAN_BITFIELD) 68*53ee8cc1Swenshuai.xi __u8 qrv:3, 69*53ee8cc1Swenshuai.xi suppress:1, 70*53ee8cc1Swenshuai.xi resv:4; 71*53ee8cc1Swenshuai.xi #elif defined(__BIG_ENDIAN_BITFIELD) 72*53ee8cc1Swenshuai.xi __u8 resv:4, 73*53ee8cc1Swenshuai.xi suppress:1, 74*53ee8cc1Swenshuai.xi qrv:3; 75*53ee8cc1Swenshuai.xi #else 76*53ee8cc1Swenshuai.xi #error "Please fix <asm/byteorder.h>" 77*53ee8cc1Swenshuai.xi #endif 78*53ee8cc1Swenshuai.xi __u8 qqic; 79*53ee8cc1Swenshuai.xi __be16 nsrcs; 80*53ee8cc1Swenshuai.xi __be32 srcs[0]; 81*53ee8cc1Swenshuai.xi }; 82*53ee8cc1Swenshuai.xi 83*53ee8cc1Swenshuai.xi #define IGMP_HOST_MEMBERSHIP_QUERY 0x11 /* From RFC1112 */ 84*53ee8cc1Swenshuai.xi #define IGMP_HOST_MEMBERSHIP_REPORT 0x12 /* Ditto */ 85*53ee8cc1Swenshuai.xi #define IGMP_DVMRP 0x13 /* DVMRP routing */ 86*53ee8cc1Swenshuai.xi #define IGMP_PIM 0x14 /* PIM routing */ 87*53ee8cc1Swenshuai.xi #define IGMP_TRACE 0x15 88*53ee8cc1Swenshuai.xi #define IGMPV2_HOST_MEMBERSHIP_REPORT 0x16 /* V2 version of 0x11 */ 89*53ee8cc1Swenshuai.xi #define IGMP_HOST_LEAVE_MESSAGE 0x17 90*53ee8cc1Swenshuai.xi #define IGMPV3_HOST_MEMBERSHIP_REPORT 0x22 /* V3 version of 0x11 */ 91*53ee8cc1Swenshuai.xi 92*53ee8cc1Swenshuai.xi #define IGMP_MTRACE_RESP 0x1e 93*53ee8cc1Swenshuai.xi #define IGMP_MTRACE 0x1f 94*53ee8cc1Swenshuai.xi 95*53ee8cc1Swenshuai.xi 96*53ee8cc1Swenshuai.xi /* 97*53ee8cc1Swenshuai.xi * Use the BSD names for these for compatibility 98*53ee8cc1Swenshuai.xi */ 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xi #define IGMP_DELAYING_MEMBER 0x01 101*53ee8cc1Swenshuai.xi #define IGMP_IDLE_MEMBER 0x02 102*53ee8cc1Swenshuai.xi #define IGMP_LAZY_MEMBER 0x03 103*53ee8cc1Swenshuai.xi #define IGMP_SLEEPING_MEMBER 0x04 104*53ee8cc1Swenshuai.xi #define IGMP_AWAKENING_MEMBER 0x05 105*53ee8cc1Swenshuai.xi 106*53ee8cc1Swenshuai.xi #define IGMP_MINLEN 8 107*53ee8cc1Swenshuai.xi 108*53ee8cc1Swenshuai.xi #define IGMP_MAX_HOST_REPORT_DELAY 10 /* max delay for response to */ 109*53ee8cc1Swenshuai.xi /* query (in seconds) */ 110*53ee8cc1Swenshuai.xi 111*53ee8cc1Swenshuai.xi #define IGMP_TIMER_SCALE 10 /* denotes that the igmphdr->timer field */ 112*53ee8cc1Swenshuai.xi /* specifies time in 10th of seconds */ 113*53ee8cc1Swenshuai.xi 114*53ee8cc1Swenshuai.xi #define IGMP_AGE_THRESHOLD 400 /* If this host don't hear any IGMP V1 */ 115*53ee8cc1Swenshuai.xi /* message in this period of time, */ 116*53ee8cc1Swenshuai.xi /* revert to IGMP v2 router. */ 117*53ee8cc1Swenshuai.xi 118*53ee8cc1Swenshuai.xi #define IGMP_ALL_HOSTS htonl(0xE0000001L) 119*53ee8cc1Swenshuai.xi #define IGMP_ALL_ROUTER htonl(0xE0000002L) 120*53ee8cc1Swenshuai.xi #define IGMPV3_ALL_MCR htonl(0xE0000016L) 121*53ee8cc1Swenshuai.xi #define IGMP_LOCAL_GROUP htonl(0xE0000000L) 122*53ee8cc1Swenshuai.xi #define IGMP_LOCAL_GROUP_MASK htonl(0xFFFFFF00L) 123*53ee8cc1Swenshuai.xi 124*53ee8cc1Swenshuai.xi /* 125*53ee8cc1Swenshuai.xi * struct for keeping the multicast list in 126*53ee8cc1Swenshuai.xi */ 127*53ee8cc1Swenshuai.xi 128*53ee8cc1Swenshuai.xi #endif 129