1/*****************************************************************************
2 * Include file : IGMP.h
3 *****************************************************************************
4 * Contains the differents structures and constants for the IGMP-router
5 * Auteur: Lahmadi.Abdelkader@loria.fr
6 * MAJ: 7 Aout 2001
7 ****************************************************************************/
8
9#include <linux/igmp.h>
10
11#define	IGMP_FMODE_INCLUDE	1
12#define	IGMP_FMODE_EXCLUDE	0
13
14#define IGMP_MAX_HOST_REPORT_DELAY	10 /* max delay for response to query (in seconds) */
15#define IGMP_TIMER_SCALE	10
16#define IGMP_DEF_QI	        125
17#define IGMP_DEF_QRI		10
18
19#define IGMP_DEF_RV	       	2
20#define IGMP_OQPI		((IGMP_DEF_RV * IGMP_DEF_QI) + IGMP_DEF_QRI/2)
21#define IGMP_GMI		((IGMP_DEF_RV * IGMP_DEF_QI) + IGMP_DEF_QRI)
22#define IGMP_WAN_VERSION_TIMER	150		//IGMP_DEF_QI * 2 /* Foxconn add by aspen Bai, 01/08/2008 */
23
24#define IGMP_MEMBERSHIP_QUERY		0x11
25#define IGMP_V1_MEMBERSHIP_REPORT   0x12
26#define IGMP_V2_MEMBERSHIP_REPORT   0x16
27#define IGMP_V2_LEAVE_GROUP			0x17    /* Foxconn add by aspen Bai, 12/18/2007 */
28#define IGMP_V3_MEMBERSHIP_REPORT   0x22
29
30/* Foxconn add start by aspen Bai, 01/07/2008 */
31#define MODE_IS_INCLUDE		1
32#define MODE_IS_EXCLUDE		2
33#define CHANGE_TO_INCLUDE	3
34#define CHANGE_TO_EXCLUDE	4
35#define ALLOW_NEW_SOURCES	5
36#define BLOCK_OLD_SOURCES	6
37/* Foxconn add end by aspen Bai, 01/07/2008 */
38
39/* Foxconn add start by aspen Bai, 01/07/2008 */
40#define GROUP_INIT    0
41#define FIRST_JOIN_GROUP    1
42#define LAST_LEAVE_GROUP	2
43#define FIRST_JOIN_GROUP_HAD_SEND 3
44#define LAST_LEAVE_GROUP_HAD_SEND 4
45/* Foxconn add end by aspen Bai, 01/07/2008 */
46
47#define IGMP_VERSION_1		0x12
48#define IGMP_VERSION_2		0x16
49#define IGMP_VERSION_3		0x22
50
51#define	IGMP_MINLEN	       	8
52
53#define	IGMP_ALL_ROUTERS	"224.0.0.2"
54#define	IGMP_ALL_ROUTERS_V3	"224.0.0.22"
55
56
57#define IGMP_SRSP(x)		((x)->igmpq_misc & (0x08))
58
59#ifndef INADDR_ALLRTRS_IGMPV3_GROUP
60#define INADDR_ALLRTRS_IGMPV3_GROUP 0xe0000016U
61#endif
62
63/* IGMP source filter type */
64typedef struct _igmp_src_t {
65  struct in_addr          igmps_source;
66  int                     igmps_timer;
67  /* add a flag to indicate the forwarding state*/
68  int                     igmps_fstate;
69  struct _igmp_src_t      *igmps_next;
70} igmp_src_t;
71
72/* IGMP member type */
73typedef struct _igmp_rep_t {
74  struct in_addr igmpr_addr;
75  struct _igmp_rep_t *igmpr_next;
76}igmp_rep_t;
77
78/* IGMP group type */
79typedef struct _igmp_group_t {
80  struct in_addr          igmpg_addr;
81  int                     igmpg_timer;
82  int                     igmpg_fmode;
83  int					  igmpg_flags; /* Foxconn add by aspen Bai, 01/07/2008 */
84  int					  igmpg_type;  /* Foxconn add by aspen Bai, 01/07/2008 */
85  int 					  igmpg_version;
86  igmp_rep_t*             igmpg_members;
87  igmp_src_t*      	    igmpg_sources;
88  struct _igmp_group_t*   igmpg_next;
89} igmp_group_t;
90
91/* Scheduled group specifiq query type*/
92typedef struct _sch_query_t {
93  struct in_addr gp_addr;
94  int    igmp_retnum;
95  int    numsrc;
96  struct in_addr sources[1];
97  struct _sch_query_t *sch_next;
98
99} sch_query_t;
100/* IGMP query format */
101typedef struct _igmpv3q_t {
102  u_char          igmpq_type; 	/* version & type of IGMP message */
103  u_char          igmpq_code; 	/* subtype for routing msgs */
104  u_short         igmpq_cksum;	/* IP-style checksum */
105  struct in_addr  igmpq_group;	/* group address being reported */
106  u_char          igmpq_misc;  	/* reserved, supress and robustness */
107  u_char          igmpq_qqi;   	/* querier's query interval */
108  u_short         igmpq_numsrc;   /* number of sources */
109  struct in_addr  igmpq_sources[1]; /* source addresses */
110} igmpv3q_t;
111
112/* IGMPv1/IGMPv2 report format */
113typedef struct _igmpr_t {
114  u_char          igmpr_type;  /* version & type */
115  u_char          igmpr_code;  /* unused */
116  u_short         igmpr_cksum; /* IP-style checksum */
117  struct in_addr  igmpr_group; /* group address being reported */
118} igmpr_t;
119
120/* IGMPv3 group record format */
121typedef struct _igmp_grouprec_t {
122  u_char          igmpg_type;			/* record type */
123  u_char          igmpg_datalen;		/* amount of aux data */
124  u_short         igmpg_numsrc;		/* number of sources */
125  struct in_addr  igmpg_group;		/* the group being reported */
126  /* struct in_addr  igmpg_sources[1];	source addresses */
127} igmp_grouprec_t;
128
129/* IGMPv3 report format */
130typedef struct _igmp_report_t {
131  u_char          igmpr_type;		/* version & type of IGMP message */
132  u_char          igmpr_code;		/* subtype for routing msgs */
133  u_short         igmpr_cksum; 	/* IP-style checksum */
134  u_short         igmpr_rsv;		/* reserved */
135  u_short         igmpr_numgrps;      /* number of groups*/
136  igmp_grouprec_t igmpr_group[1]; /* group records */
137} igmp_report_t;
138
139/* multicast source set */
140typedef struct _igmp_mulsrc_t
141{
142	struct in_addr	        igmps_addr;
143	struct igmp_mulsrc_t*   igmps_next;
144} igmp_mulsrc_t;
145