Blame view

include/linux/igmp.h 6.32 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  /*
   *	Linux NET3:	Internet Group Management Protocol  [IGMP]
   *
   *	Authors:
   *		Alan Cox <Alan.Cox@linux.org>
   *
   *	Extended to talk the BSD extended IGMP protocol of mrouted 3.6
   *
   *
   *	This program is free software; you can redistribute it and/or
   *	modify it under the terms of the GNU General Public License
   *	as published by the Free Software Foundation; either version
   *	2 of the License, or (at your option) any later version.
   */
  
  #ifndef _LINUX_IGMP_H
  #define _LINUX_IGMP_H
  
  #include <asm/byteorder.h>
  
  /*
   *	IGMP protocol structures
   */
  
  /*
   *	Header in on cable format
   */
  
  struct igmphdr
  {
  	__u8 type;
  	__u8 code;		/* For newer IGMP */
9981a0e36   Al Viro   [NET]: Annotate c...
33
  	__sum16 csum;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
34
  	__be32 group;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
42
43
44
45
46
47
  };
  
  /* V3 group record types [grec_type] */
  #define IGMPV3_MODE_IS_INCLUDE		1
  #define IGMPV3_MODE_IS_EXCLUDE		2
  #define IGMPV3_CHANGE_TO_INCLUDE	3
  #define IGMPV3_CHANGE_TO_EXCLUDE	4
  #define IGMPV3_ALLOW_NEW_SOURCES	5
  #define IGMPV3_BLOCK_OLD_SOURCES	6
  
  struct igmpv3_grec {
  	__u8	grec_type;
  	__u8	grec_auxwords;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
48
49
50
  	__be16	grec_nsrcs;
  	__be32	grec_mca;
  	__be32	grec_src[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
53
54
55
  };
  
  struct igmpv3_report {
  	__u8 type;
  	__u8 resv1;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
56
57
58
  	__be16 csum;
  	__be16 resv2;
  	__be16 ngrec;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
63
64
  	struct igmpv3_grec grec[0];
  };
  
  struct igmpv3_query {
  	__u8 type;
  	__u8 code;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
65
66
  	__be16 csum;
  	__be32 group;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
68
69
70
71
72
73
74
75
76
77
78
  #if defined(__LITTLE_ENDIAN_BITFIELD)
  	__u8 qrv:3,
  	     suppress:1,
  	     resv:4;
  #elif defined(__BIG_ENDIAN_BITFIELD)
  	__u8 resv:4,
  	     suppress:1,
  	     qrv:3;
  #else
  #error "Please fix <asm/byteorder.h>"
  #endif
  	__u8 qqic;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
79
80
  	__be16 nsrcs;
  	__be32 srcs[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  };
d9edf9e2b   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
82
83
84
85
86
  #ifdef __KERNEL__
  #include <linux/skbuff.h>
  
  static inline struct igmphdr *igmp_hdr(const struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
87
  	return (struct igmphdr *)skb_transport_header(skb);
d9edf9e2b   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
88
89
90
91
92
  }
  
  static inline struct igmpv3_report *
  			igmpv3_report_hdr(const struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
93
  	return (struct igmpv3_report *)skb_transport_header(skb);
d9edf9e2b   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
94
95
96
97
98
  }
  
  static inline struct igmpv3_query *
  			igmpv3_query_hdr(const struct sk_buff *skb)
  {
9c70220b7   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
99
  	return (struct igmpv3_query *)skb_transport_header(skb);
d9edf9e2b   Arnaldo Carvalho de Melo   [SK_BUFF]: Introd...
100
101
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  #define IGMP_HOST_MEMBERSHIP_QUERY	0x11	/* From RFC1112 */
  #define IGMP_HOST_MEMBERSHIP_REPORT	0x12	/* Ditto */
  #define IGMP_DVMRP			0x13	/* DVMRP routing */
  #define IGMP_PIM			0x14	/* PIM routing */
  #define IGMP_TRACE			0x15
  #define IGMPV2_HOST_MEMBERSHIP_REPORT	0x16	/* V2 version of 0x11 */
  #define IGMP_HOST_LEAVE_MESSAGE 	0x17
  #define IGMPV3_HOST_MEMBERSHIP_REPORT	0x22	/* V3 version of 0x11 */
  
  #define IGMP_MTRACE_RESP		0x1e
  #define IGMP_MTRACE			0x1f
  
  
  /*
   *	Use the BSD names for these for compatibility
   */
  
  #define IGMP_DELAYING_MEMBER		0x01
  #define IGMP_IDLE_MEMBER		0x02
  #define IGMP_LAZY_MEMBER		0x03
  #define IGMP_SLEEPING_MEMBER		0x04
  #define IGMP_AWAKENING_MEMBER		0x05
  
  #define IGMP_MINLEN			8
  
  #define IGMP_MAX_HOST_REPORT_DELAY	10	/* max delay for response to */
  						/* query (in seconds)	*/
  
  #define IGMP_TIMER_SCALE		10	/* denotes that the igmphdr->timer field */
  						/* specifies time in 10th of seconds	 */
  
  #define IGMP_AGE_THRESHOLD		400	/* If this host don't hear any IGMP V1	*/
  						/* message in this period of time,	*/
  						/* revert to IGMP v2 router.		*/
  
  #define IGMP_ALL_HOSTS		htonl(0xE0000001L)
  #define IGMP_ALL_ROUTER 	htonl(0xE0000002L)
  #define IGMPV3_ALL_MCR	 	htonl(0xE0000016L)
  #define IGMP_LOCAL_GROUP	htonl(0xE0000000L)
  #define IGMP_LOCAL_GROUP_MASK	htonl(0xFFFFFF00L)
  
  /*
   * struct for keeping the multicast list in
   */
  
  #ifdef __KERNEL__
  #include <linux/skbuff.h>
d7fe0f241   Al Viro   [PATCH] severing ...
149
  #include <linux/timer.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
  #include <linux/in.h>
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
151
152
  extern int sysctl_igmp_max_memberships;
  extern int sysctl_igmp_max_msf;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
  struct ip_sf_socklist
  {
  	unsigned int		sl_max;
  	unsigned int		sl_count;
ea4d9e722   Al Viro   [IPV4]: struct ip...
157
  	__be32			sl_addr[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
  };
  
  #define IP_SFLSIZE(count)	(sizeof(struct ip_sf_socklist) + \
63007727e   Al Viro   [IPV4]: trivial i...
161
  	(count) * sizeof(__be32))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
163
164
165
166
167
168
169
170
171
  
  #define IP_SFBLOCK	10	/* allocate this many at once */
  
  /* ip_mc_socklist is real list now. Speed is not argument;
     this list never used in fast path code
   */
  
  struct ip_mc_socklist
  {
  	struct ip_mc_socklist	*next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
173
174
175
176
177
178
179
  	struct ip_mreqn		multi;
  	unsigned int		sfmode;		/* MCAST_{INCLUDE,EXCLUDE} */
  	struct ip_sf_socklist	*sflist;
  };
  
  struct ip_sf_list
  {
  	struct ip_sf_list	*sf_next;
ea4d9e722   Al Viro   [IPV4]: struct ip...
180
  	__be32			sf_inaddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181
182
183
184
185
186
187
188
189
  	unsigned long		sf_count[2];	/* include/exclude counts */
  	unsigned char		sf_gsresp;	/* include in g & s response? */
  	unsigned char		sf_oldin;	/* change state */
  	unsigned char		sf_crcount;	/* retrans. left to send */
  };
  
  struct ip_mc_list
  {
  	struct in_device	*interface;
338fcf988   Alexey Dobriyan   [IPV4] igmp: Fixu...
190
  	__be32			multiaddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  	struct ip_sf_list	*sources;
  	struct ip_sf_list	*tomb;
  	unsigned int		sfmode;
  	unsigned long		sfcount[2];
  	struct ip_mc_list	*next;
  	struct timer_list	timer;
  	int			users;
  	atomic_t		refcnt;
  	spinlock_t		lock;
  	char			tm_running;
  	char			reporter;
  	char			unsolicit_count;
  	char			loaded;
  	unsigned char		gsquery;	/* check source marks? */
  	unsigned char		crcount;
  };
  
  /* V3 exponential field decoding */
  #define IGMPV3_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value))
  #define IGMPV3_EXP(thresh, nbmant, nbexp, value) \
  	((value) < (thresh) ? (value) : \
fb47ddb2d   David L Stevens   [IGMP]: Fix IGMPV...
212
          ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant))) << \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
215
216
           (IGMPV3_MASK((value) >> (nbmant), nbexp) + (nbexp))))
  
  #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value)
  #define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value)
a60c4923d   Al Viro   [IPV4]: ip_check_...
217
  extern int ip_check_mc(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
219
220
221
222
223
224
225
226
227
228
  extern int igmp_rcv(struct sk_buff *);
  extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
  extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
  extern void ip_mc_drop_socket(struct sock *sk);
  extern int ip_mc_source(int add, int omode, struct sock *sk,
  		struct ip_mreq_source *mreqs, int ifindex);
  extern int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf,int ifindex);
  extern int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
  		struct ip_msfilter __user *optval, int __user *optlen);
  extern int ip_mc_gsfget(struct sock *sk, struct group_filter *gsf,
  		struct group_filter __user *optval, int __user *optlen);
c0cda068a   Al Viro   [IPV4]: ip_mc_sf_...
229
  extern int ip_mc_sf_allow(struct sock *sk, __be32 local, __be32 rmt, int dif);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
231
232
233
234
  extern void ip_mr_init(void);
  extern void ip_mc_init_dev(struct in_device *);
  extern void ip_mc_destroy_dev(struct in_device *);
  extern void ip_mc_up(struct in_device *);
  extern void ip_mc_down(struct in_device *);
8f935bbd7   Al Viro   [IPV4]: ip_mc_{in...
235
236
  extern void ip_mc_dec_group(struct in_device *in_dev, __be32 addr);
  extern void ip_mc_inc_group(struct in_device *in_dev, __be32 addr);
a816c7c71   Jay Vosburgh   bonding: Improve ...
237
  extern void ip_mc_rejoin_group(struct ip_mc_list *im);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
239
  #endif
  #endif