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