Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/netinet/igmp_var.h
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1988 Stephen Deering.
5
* Copyright (c) 1992, 1993
6
* The Regents of the University of California. All rights reserved.
7
*
8
* This code is derived from software contributed to Berkeley by
9
* Stephen Deering of Stanford University.
10
*
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions
13
* are met:
14
* 1. Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in the
18
* documentation and/or other materials provided with the distribution.
19
* 3. Neither the name of the University nor the names of its contributors
20
* may be used to endorse or promote products derived from this software
21
* without specific prior written permission.
22
*
23
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33
* SUCH DAMAGE.
34
*/
35
36
#ifndef _NETINET_IGMP_VAR_H_
37
#define _NETINET_IGMP_VAR_H_
38
39
/*
40
* Internet Group Management Protocol (IGMP),
41
* implementation-specific definitions.
42
*
43
* Written by Steve Deering, Stanford, May 1988.
44
*
45
* MULTICAST Revision: 3.5.1.3
46
*/
47
48
/*
49
* IGMPv3 protocol statistics.
50
*/
51
struct igmpstat {
52
/*
53
* Structure header (to insulate ABI changes).
54
* XXX: unset inside the kernel, exported via sysctl_igmp_stat().
55
*/
56
uint32_t igps_version; /* version of this structure */
57
uint32_t igps_len; /* length of this structure */
58
/*
59
* Message statistics.
60
*/
61
uint64_t igps_rcv_total; /* total IGMP messages received */
62
uint64_t igps_rcv_tooshort; /* received with too few bytes */
63
uint64_t igps_rcv_badttl; /* received with ttl other than 1 */
64
uint64_t igps_rcv_badsum; /* received with bad checksum */
65
/*
66
* Query statistics.
67
*/
68
uint64_t igps_rcv_v1v2_queries; /* received IGMPv1/IGMPv2 queries */
69
uint64_t igps_rcv_v3_queries; /* received IGMPv3 queries */
70
uint64_t igps_rcv_badqueries; /* received invalid queries */
71
uint64_t igps_rcv_gen_queries; /* received general queries */
72
uint64_t igps_rcv_group_queries;/* received group queries */
73
uint64_t igps_rcv_gsr_queries; /* received group-source queries */
74
uint64_t igps_drop_gsr_queries; /* dropped group-source queries */
75
/*
76
* Report statistics.
77
*/
78
uint64_t igps_rcv_reports; /* received membership reports */
79
uint64_t igps_rcv_badreports; /* received invalid reports */
80
uint64_t igps_rcv_ourreports; /* received reports for our groups */
81
uint64_t igps_rcv_nora; /* received w/o Router Alert option */
82
uint64_t igps_snd_reports; /* sent membership reports */
83
/*
84
* Padding for future additions.
85
*/
86
uint64_t __igps_pad[4];
87
};
88
#define IGPS_VERSION_3 3 /* as of FreeBSD 8.x */
89
#define IGPS_VERSION3_LEN 168
90
#ifdef CTASSERT
91
CTASSERT(sizeof(struct igmpstat) == IGPS_VERSION3_LEN);
92
#endif
93
94
/*
95
* Identifiers for IGMP sysctl nodes
96
*/
97
#define IGMPCTL_STATS 1 /* statistics (read-only) */
98
99
#define IGMP_RANDOM_DELAY(X) (random() % (X) + 1)
100
#define IGMP_MAX_STATE_CHANGES 24 /* Max pending changes per group */
101
102
/*
103
* IGMP per-group states.
104
*/
105
#define IGMP_NOT_MEMBER 0 /* Can garbage collect in_multi */
106
#define IGMP_SILENT_MEMBER 1 /* Do not perform IGMP for group */
107
#define IGMP_REPORTING_MEMBER 2 /* IGMPv1/2/3 we are reporter */
108
#define IGMP_IDLE_MEMBER 3 /* IGMPv1/2 we reported last */
109
#define IGMP_LAZY_MEMBER 4 /* IGMPv1/2 other member reporting */
110
#define IGMP_SLEEPING_MEMBER 5 /* IGMPv1/2 start query response */
111
#define IGMP_AWAKENING_MEMBER 6 /* IGMPv1/2 group timer will start */
112
#define IGMP_G_QUERY_PENDING_MEMBER 7 /* IGMPv3 group query pending */
113
#define IGMP_SG_QUERY_PENDING_MEMBER 8 /* IGMPv3 source query pending */
114
#define IGMP_LEAVING_MEMBER 9 /* IGMPv3 dying gasp (pending last */
115
/* retransmission of INCLUDE {}) */
116
117
/*
118
* IGMP version tag.
119
*/
120
#define IGMP_VERSION_NONE 0 /* Invalid */
121
#define IGMP_VERSION_1 1
122
#define IGMP_VERSION_2 2
123
#define IGMP_VERSION_3 3 /* Default */
124
125
/*
126
* IGMPv3 protocol control variables.
127
*/
128
#define IGMP_RV_INIT 2 /* Robustness Variable */
129
#define IGMP_RV_MIN 1
130
#define IGMP_RV_MAX 7
131
132
#define IGMP_QI_INIT 125 /* Query Interval (s) */
133
#define IGMP_QI_MIN 1
134
#define IGMP_QI_MAX 255
135
136
#define IGMP_QRI_INIT 10 /* Query Response Interval (s) */
137
#define IGMP_QRI_MIN 1
138
#define IGMP_QRI_MAX 255
139
140
#define IGMP_URI_INIT 3 /* Unsolicited Report Interval (s) */
141
#define IGMP_URI_MIN 0
142
#define IGMP_URI_MAX 10
143
144
#define IGMP_MAX_G_GS_PACKETS 8 /* # of packets to answer G/GS */
145
#define IGMP_MAX_STATE_CHANGE_PACKETS 8 /* # of packets per state change */
146
#define IGMP_MAX_RESPONSE_PACKETS 16 /* # of packets for general query */
147
#define IGMP_MAX_RESPONSE_BURST 4 /* # of responses to send at once */
148
149
/*
150
* IGMP-specific mbuf flags.
151
*/
152
#define M_IGMPV2 M_PROTO1 /* Packet is IGMPv2 */
153
#define M_IGMPV3_HDR M_PROTO2 /* Packet has IGMPv3 headers */
154
#define M_GROUPREC M_PROTO3 /* mbuf chain is a group record */
155
#define M_IGMP_LOOP M_PROTO4 /* transmit on loif, not real ifp */
156
157
/*
158
* Default amount of leading space for IGMPv3 to allocate at the
159
* beginning of its mbuf packet chains, to avoid fragmentation and
160
* unnecessary allocation of leading mbufs.
161
*/
162
#define RAOPT_LEN 4 /* Length of IP Router Alert option */
163
#define IGMP_LEADINGSPACE \
164
(sizeof(struct ip) + RAOPT_LEN + sizeof(struct igmp_report))
165
166
/*
167
* Structure returned by net.inet.igmp.ifinfo sysctl.
168
*/
169
struct igmp_ifinfo {
170
uint32_t igi_version; /* IGMPv3 Host Compatibility Mode */
171
uint32_t igi_v1_timer; /* IGMPv1 Querier Present timer (s) */
172
uint32_t igi_v2_timer; /* IGMPv2 Querier Present timer (s) */
173
uint32_t igi_v3_timer; /* IGMPv3 General Query (interface) timer (s)*/
174
uint32_t igi_flags; /* IGMP per-interface flags */
175
#define IGIF_SILENT 0x00000001 /* Do not use IGMP on this ifp */
176
#define IGIF_LOOPBACK 0x00000002 /* Send IGMP reports to loopback */
177
uint32_t igi_rv; /* IGMPv3 Robustness Variable */
178
uint32_t igi_qi; /* IGMPv3 Query Interval (s) */
179
uint32_t igi_qri; /* IGMPv3 Query Response Interval (s) */
180
uint32_t igi_uri; /* IGMPv3 Unsolicited Report Interval (s) */
181
};
182
183
#ifdef _KERNEL
184
#include <sys/counter.h>
185
186
VNET_PCPUSTAT_DECLARE(struct igmpstat, igmpstat);
187
#define IGMPSTAT_ADD(name, val) \
188
VNET_PCPUSTAT_ADD(struct igmpstat, igmpstat, name, (val))
189
#define IGMPSTAT_INC(name) IGMPSTAT_ADD(name, 1)
190
191
/*
192
* Subsystem lock macros.
193
* The IGMP lock is only taken with IGMP. Currently it is system-wide.
194
* VIMAGE: The lock could be pushed to per-VIMAGE granularity in future.
195
*/
196
#define IGMP_LOCK_INIT() mtx_init(&igmp_mtx, "igmp_mtx", NULL, MTX_DEF)
197
#define IGMP_LOCK_DESTROY() mtx_destroy(&igmp_mtx)
198
#define IGMP_LOCK() mtx_lock(&igmp_mtx)
199
#define IGMP_LOCK_ASSERT() mtx_assert(&igmp_mtx, MA_OWNED)
200
#define IGMP_UNLOCK() mtx_unlock(&igmp_mtx)
201
#define IGMP_UNLOCK_ASSERT() mtx_assert(&igmp_mtx, MA_NOTOWNED)
202
203
/*
204
* Per-interface IGMP router version information.
205
*/
206
struct igmp_ifsoftc {
207
LIST_ENTRY(igmp_ifsoftc) igi_link;
208
struct ifnet *igi_ifp; /* pointer back to interface */
209
uint32_t igi_version; /* IGMPv3 Host Compatibility Mode */
210
uint32_t igi_v1_timer; /* IGMPv1 Querier Present timer (s) */
211
uint32_t igi_v2_timer; /* IGMPv2 Querier Present timer (s) */
212
uint32_t igi_v3_timer; /* IGMPv3 General Query (interface) timer (s)*/
213
uint32_t igi_flags; /* IGMP per-interface flags */
214
uint32_t igi_rv; /* IGMPv3 Robustness Variable */
215
uint32_t igi_qi; /* IGMPv3 Query Interval (s) */
216
uint32_t igi_qri; /* IGMPv3 Query Response Interval (s) */
217
uint32_t igi_uri; /* IGMPv3 Unsolicited Report Interval (s) */
218
struct mbufq igi_gq; /* general query responses queue */
219
};
220
221
int igmp_change_state(struct in_multi *);
222
struct igmp_ifsoftc *
223
igmp_domifattach(struct ifnet *);
224
void igmp_domifdetach(struct ifnet *);
225
void igmp_ifdetach(struct ifnet *);
226
int igmp_input(struct mbuf **, int *, int);
227
228
SYSCTL_DECL(_net_inet_igmp);
229
230
#endif /* _KERNEL */
231
#endif
232
233