Blame view

include/linux/igmp.h 6.49 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   *	Linux NET3:	Internet Group Management Protocol  [IGMP]
   *
   *	Authors:
113aa838e   Alan Cox   net: Rationalise ...
5
   *		Alan Cox <alan@lxorguk.ukuu.org.uk>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
12
13
14
15
16
17
   *
   *	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
de8b0bcaf   Jaswinder Singh Rajput   headers_check fix...
18
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
22
23
24
25
26
27
  #include <asm/byteorder.h>
  
  /*
   *	IGMP protocol structures
   */
  
  /*
   *	Header in on cable format
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
28
  struct igmphdr {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
  	__u8 type;
  	__u8 code;		/* For newer IGMP */
9981a0e36   Al Viro   [NET]: Annotate c...
31
  	__sum16 csum;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
32
  	__be32 group;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
36
37
38
39
40
41
42
43
44
45
  };
  
  /* 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...
46
47
48
  	__be16	grec_nsrcs;
  	__be32	grec_mca;
  	__be32	grec_src[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
52
53
  };
  
  struct igmpv3_report {
  	__u8 type;
  	__u8 resv1;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
54
55
56
  	__be16 csum;
  	__be16 resv2;
  	__be16 ngrec;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
59
60
61
62
  	struct igmpv3_grec grec[0];
  };
  
  struct igmpv3_query {
  	__u8 type;
  	__u8 code;
942bf921e   Al Viro   [IPV4]: IGMP on-t...
63
64
  	__be16 csum;
  	__be32 group;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
68
69
70
71
72
73
74
75
76
  #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...
77
78
  	__be16 nsrcs;
  	__be32 srcs[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
80
81
82
83
84
85
  };
  
  #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
7b26e5ebd   Francois-Xavier Le Bail   net: typos in com...
86
  #define IGMPV2_HOST_MEMBERSHIP_REPORT	0x16	/* V2 version of 0x12 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
  #define IGMP_HOST_LEAVE_MESSAGE 	0x17
7b26e5ebd   Francois-Xavier Le Bail   net: typos in com...
88
  #define IGMPV3_HOST_MEMBERSHIP_REPORT	0x22	/* V3 version of 0x12 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
91
92
93
94
95
96
97
98
99
100
101
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
  
  #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 ...
128
  #include <linux/timer.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  #include <linux/in.h>
cc32e0541   Joe Perches   [NET]: include/li...
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
  static inline struct igmphdr *igmp_hdr(const struct sk_buff *skb)
  {
  	return (struct igmphdr *)skb_transport_header(skb);
  }
  
  static inline struct igmpv3_report *
  			igmpv3_report_hdr(const struct sk_buff *skb)
  {
  	return (struct igmpv3_report *)skb_transport_header(skb);
  }
  
  static inline struct igmpv3_query *
  			igmpv3_query_hdr(const struct sk_buff *skb)
  {
  	return (struct igmpv3_query *)skb_transport_header(skb);
  }
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
146
147
  extern int sysctl_igmp_max_memberships;
  extern int sysctl_igmp_max_msf;
d94d9fee9   Eric Dumazet   net: cleanup incl...
148
  struct ip_sf_socklist {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
150
  	unsigned int		sl_max;
  	unsigned int		sl_count;
c85bb41e9   Flavio Leitner   igmp: fix ip_mc_s...
151
  	struct rcu_head		rcu;
ea4d9e722   Al Viro   [IPV4]: struct ip...
152
  	__be32			sl_addr[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
  };
  
  #define IP_SFLSIZE(count)	(sizeof(struct ip_sf_socklist) + \
63007727e   Al Viro   [IPV4]: trivial i...
156
  	(count) * sizeof(__be32))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
160
161
162
  
  #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
   */
d94d9fee9   Eric Dumazet   net: cleanup incl...
163
  struct ip_mc_socklist {
1d7138de8   Eric Dumazet   igmp: RCU convers...
164
  	struct ip_mc_socklist __rcu *next_rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165
166
  	struct ip_mreqn		multi;
  	unsigned int		sfmode;		/* MCAST_{INCLUDE,EXCLUDE} */
1d7138de8   Eric Dumazet   igmp: RCU convers...
167
  	struct ip_sf_socklist __rcu	*sflist;
c85bb41e9   Flavio Leitner   igmp: fix ip_mc_s...
168
  	struct rcu_head		rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
170
  struct ip_sf_list {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  	struct ip_sf_list	*sf_next;
ea4d9e722   Al Viro   [IPV4]: struct ip...
172
  	__be32			sf_inaddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
174
175
176
177
  	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 */
  };
d94d9fee9   Eric Dumazet   net: cleanup incl...
178
  struct ip_mc_list {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
  	struct in_device	*interface;
338fcf988   Alexey Dobriyan   [IPV4] igmp: Fixu...
180
  	__be32			multiaddr;
1d7138de8   Eric Dumazet   igmp: RCU convers...
181
  	unsigned int		sfmode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
  	struct ip_sf_list	*sources;
  	struct ip_sf_list	*tomb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
  	unsigned long		sfcount[2];
1d7138de8   Eric Dumazet   igmp: RCU convers...
185
186
187
188
  	union {
  		struct ip_mc_list *next;
  		struct ip_mc_list __rcu *next_rcu;
  	};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
191
192
193
194
195
196
197
198
  	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;
1d7138de8   Eric Dumazet   igmp: RCU convers...
199
  	struct rcu_head		rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
200
201
202
203
204
205
  };
  
  /* 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...
206
          ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant))) << \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
208
209
210
           (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)
dbdd9a52e   David S. Miller   ipv4: Remove redu...
211
  extern int ip_check_mc_rcu(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
214
215
216
217
218
219
220
221
222
  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_...
223
  extern int ip_mc_sf_allow(struct sock *sk, __be32 local, __be32 rmt, int dif);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224
225
226
227
  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 *);
75c78500d   Moni Shoua   bonding: remap mu...
228
229
  extern void ip_mc_unmap(struct in_device *);
  extern void ip_mc_remap(struct in_device *);
8f935bbd7   Al Viro   [IPV4]: ip_mc_{in...
230
231
  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);
866f3b25a   Eric Dumazet   bonding: IGMP han...
232
  extern void ip_mc_rejoin_groups(struct in_device *in_dev);
a816c7c71   Jay Vosburgh   bonding: Improve ...
233

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
235
  #endif
  #endif