Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/netinet6/ip6_mroute.h
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (C) 1998 WIDE Project.
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* 3. Neither the name of the project nor the names of its contributors
16
* may be used to endorse or promote products derived from this software
17
* without specific prior written permission.
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
* SUCH DAMAGE.
30
*
31
* $KAME: ip6_mroute.h,v 1.19 2001/06/14 06:12:55 suz Exp $
32
*/
33
34
/* BSDI ip_mroute.h,v 2.5 1996/10/11 16:01:48 pjd Exp */
35
36
/*
37
* Definitions for IP multicast forwarding.
38
*
39
* Written by David Waitzman, BBN Labs, August 1988.
40
* Modified by Steve Deering, Stanford, February 1989.
41
* Modified by Ajit Thyagarajan, PARC, August 1993.
42
* Modified by Ajit Thyagarajan, PARC, August 1994.
43
* Modified by Ahmed Helmy, USC, September 1996.
44
*
45
* MROUTING Revision: 1.2
46
*/
47
48
#ifndef _NETINET6_IP6_MROUTE_H_
49
#define _NETINET6_IP6_MROUTE_H_
50
51
/*
52
* Multicast Routing set/getsockopt commands.
53
*/
54
#ifdef _KERNEL
55
#define MRT6_OINIT 100 /* initialize forwarder (omrt6msg) */
56
#endif
57
#define MRT6_DONE 101 /* shut down forwarder */
58
#define MRT6_ADD_MIF 102 /* add multicast interface */
59
#define MRT6_DEL_MIF 103 /* delete multicast interface */
60
#define MRT6_ADD_MFC 104 /* insert forwarding cache entry */
61
#define MRT6_DEL_MFC 105 /* delete forwarding cache entry */
62
#define MRT6_PIM 107 /* enable pim code */
63
#define MRT6_INIT 108 /* initialize forwarder (mrt6msg) */
64
65
#if BSD >= 199103
66
#define GET_TIME(t) microtime(&t)
67
#elif defined(sun)
68
#define GET_TIME(t) uniqtime(&t)
69
#else
70
#define GET_TIME(t) ((t) = time)
71
#endif
72
73
/*
74
* Types and macros for handling bitmaps with one bit per multicast interface.
75
*/
76
typedef u_short mifi_t; /* type of a mif index */
77
#define MAXMIFS 64
78
79
#ifndef IF_SETSIZE
80
#define IF_SETSIZE 256
81
#endif
82
83
typedef u_int32_t if_mask;
84
#define NIFBITS (sizeof(if_mask) * NBBY) /* bits per mask */
85
86
#ifndef howmany
87
#define howmany(x, y) (((x) + ((y) - 1)) / (y))
88
#endif
89
90
typedef struct if_set {
91
if_mask ifs_bits[howmany(IF_SETSIZE, NIFBITS)];
92
} if_set;
93
94
#define IF_SET(n, p) ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS)))
95
#define IF_CLR(n, p) ((p)->ifs_bits[(n)/NIFBITS] &= ~(1 << ((n) % NIFBITS)))
96
#define IF_ISSET(n, p) ((p)->ifs_bits[(n)/NIFBITS] & (1 << ((n) % NIFBITS)))
97
#define IF_COPY(f, t) bcopy(f, t, sizeof(*(f)))
98
#define IF_ZERO(p) bzero(p, sizeof(*(p)))
99
100
/*
101
* Argument structure for MRT6_ADD_IF.
102
*/
103
struct mif6ctl {
104
mifi_t mif6c_mifi; /* the index of the mif to be added */
105
u_char mif6c_flags; /* MIFF_ flags defined below */
106
u_short mif6c_pifi; /* the index of the physical IF */
107
};
108
109
#define MIFF_REGISTER 0x1 /* mif represents a register end-point */
110
111
/*
112
* Argument structure for MRT6_ADD_MFC and MRT6_DEL_MFC
113
*/
114
struct mf6cctl {
115
struct sockaddr_in6 mf6cc_origin; /* IPv6 origin of mcasts */
116
struct sockaddr_in6 mf6cc_mcastgrp; /* multicast group associated */
117
mifi_t mf6cc_parent; /* incoming ifindex */
118
struct if_set mf6cc_ifset; /* set of forwarding ifs */
119
};
120
121
/*
122
* The kernel's multicast routing statistics.
123
*/
124
struct mrt6stat {
125
uint64_t mrt6s_mfc_lookups; /* # forw. cache hash table hits */
126
uint64_t mrt6s_mfc_misses; /* # forw. cache hash table misses */
127
uint64_t mrt6s_upcalls; /* # calls to multicast routing daemon */
128
uint64_t mrt6s_no_route; /* no route for packet's origin */
129
uint64_t mrt6s_bad_tunnel; /* malformed tunnel options */
130
uint64_t mrt6s_cant_tunnel; /* no room for tunnel options */
131
uint64_t mrt6s_wrong_if; /* arrived on wrong interface */
132
uint64_t mrt6s_upq_ovflw; /* upcall Q overflow */
133
uint64_t mrt6s_cache_cleanups; /* # entries with no upcalls */
134
uint64_t mrt6s_drop_sel; /* pkts dropped selectively */
135
uint64_t mrt6s_q_overflow; /* pkts dropped - Q overflow */
136
uint64_t mrt6s_pkt2large; /* pkts dropped - size > BKT SIZE */
137
uint64_t mrt6s_upq_sockfull; /* upcalls dropped - socket full */
138
};
139
140
#ifdef MRT6_OINIT
141
/*
142
* Struct used to communicate from kernel to multicast router
143
* note the convenient similarity to an IPv6 header.
144
* XXX old version, superseded by mrt6msg.
145
*/
146
struct omrt6msg {
147
u_long unused1;
148
u_char im6_msgtype; /* what type of message */
149
u_char im6_mbz; /* must be zero */
150
u_char im6_mif; /* mif rec'd on */
151
u_char unused2;
152
struct in6_addr im6_src, im6_dst;
153
};
154
#endif
155
156
/*
157
* Structure used to communicate from kernel to multicast router.
158
* We'll overlay the structure onto an MLD header (not an IPv6 header
159
* like igmpmsg{} used for IPv4 implementation). This is because this
160
* structure will be passed via an IPv6 raw socket, on which an application
161
* will only receive the payload i.e. the data after the IPv6 header and all
162
* the extension headers. (see Section 3 of RFC3542)
163
*/
164
struct mrt6msg {
165
#define MRT6MSG_NOCACHE 1
166
#define MRT6MSG_WRONGMIF 2
167
#define MRT6MSG_WHOLEPKT 3 /* used for user level encap*/
168
u_char im6_mbz; /* must be zero */
169
u_char im6_msgtype; /* what type of message */
170
u_int16_t im6_mif; /* mif rec'd on */
171
u_int32_t im6_pad; /* padding for 64bit arch */
172
struct in6_addr im6_src, im6_dst;
173
};
174
175
/*
176
* Argument structure used by multicast routing daemon to get src-grp
177
* packet counts
178
*/
179
struct sioc_sg_req6 {
180
struct sockaddr_in6 src;
181
struct sockaddr_in6 grp;
182
u_quad_t pktcnt;
183
u_quad_t bytecnt;
184
u_quad_t wrong_if;
185
};
186
187
/*
188
* Argument structure used by mrouted to get mif pkt counts
189
*/
190
struct sioc_mif_req6 {
191
mifi_t mifi; /* mif number */
192
u_quad_t icount; /* Input packet count on mif */
193
u_quad_t ocount; /* Output packet count on mif */
194
u_quad_t ibytes; /* Input byte count on mif */
195
u_quad_t obytes; /* Output byte count on mif */
196
};
197
198
/*
199
* Structure to export 'struct mif6' to userland via sysctl.
200
*/
201
struct mif6_sctl {
202
u_char m6_flags; /* MIFF_ flags defined above */
203
u_int m6_rate_limit; /* max rate */
204
struct in6_addr m6_lcl_addr; /* local interface address */
205
uint32_t m6_ifp; /* interface index */
206
u_quad_t m6_pkt_in; /* # pkts in on interface */
207
u_quad_t m6_pkt_out; /* # pkts out on interface */
208
u_quad_t m6_bytes_in; /* # bytes in on interface */
209
u_quad_t m6_bytes_out; /* # bytes out on interface */
210
};
211
212
#if defined(_KERNEL) || defined(KERNEL)
213
/*
214
* The kernel's multicast-interface structure.
215
*/
216
struct mif6 {
217
u_char m6_flags; /* MIFF_ flags defined above */
218
u_int m6_rate_limit; /* max rate */
219
struct in6_addr m6_lcl_addr; /* local interface address */
220
struct ifnet *m6_ifp; /* pointer to interface */
221
u_quad_t m6_pkt_in; /* # pkts in on interface */
222
u_quad_t m6_pkt_out; /* # pkts out on interface */
223
u_quad_t m6_bytes_in; /* # bytes in on interface */
224
u_quad_t m6_bytes_out; /* # bytes out on interface */
225
#ifdef notyet
226
u_int m6_rsvp_on; /* RSVP listening on this vif */
227
struct socket *m6_rsvpd; /* RSVP daemon socket */
228
#endif
229
};
230
231
/*
232
* The kernel's multicast forwarding cache entry structure
233
*/
234
struct mf6c {
235
struct sockaddr_in6 mf6c_origin; /* IPv6 origin of mcasts */
236
struct sockaddr_in6 mf6c_mcastgrp; /* multicast group associated*/
237
mifi_t mf6c_parent; /* incoming IF */
238
struct if_set mf6c_ifset; /* set of outgoing IFs */
239
240
u_quad_t mf6c_pkt_cnt; /* pkt count for src-grp */
241
u_quad_t mf6c_byte_cnt; /* byte count for src-grp */
242
u_quad_t mf6c_wrong_if; /* wrong if for src-grp */
243
int mf6c_expire; /* time to clean entry up */
244
struct timeval mf6c_last_assert; /* last time I sent an assert*/
245
struct rtdetq *mf6c_stall; /* pkts waiting for route */
246
struct mf6c *mf6c_next; /* hash table linkage */
247
};
248
249
#define MF6C_INCOMPLETE_PARENT ((mifi_t)-1)
250
251
/*
252
* Argument structure used for pkt info. while upcall is made
253
*/
254
#ifndef _NETINET_IP_MROUTE_H_
255
struct rtdetq { /* XXX: rtdetq is also defined in ip_mroute.h */
256
struct mbuf *m; /* A copy of the packet */
257
struct ifnet *ifp; /* Interface pkt came in on */
258
#ifdef UPCALL_TIMING
259
struct timeval t; /* Timestamp */
260
#endif /* UPCALL_TIMING */
261
struct rtdetq *next;
262
};
263
#endif /* _NETINET_IP_MROUTE_H_ */
264
265
#define MF6CTBLSIZ 256
266
#if (MF6CTBLSIZ & (MF6CTBLSIZ - 1)) == 0 /* from sys:route.h */
267
#define MF6CHASHMOD(h) ((h) & (MF6CTBLSIZ - 1))
268
#else
269
#define MF6CHASHMOD(h) ((h) % MF6CTBLSIZ)
270
#endif
271
272
#define MAX_UPQ6 4 /* max. no of pkts in upcall Q */
273
274
extern int (*ip6_mrouter_set)(struct socket *so, struct sockopt *sopt);
275
extern int (*ip6_mrouter_get)(struct socket *so, struct sockopt *sopt);
276
extern int (*ip6_mrouter_done)(void);
277
extern int (*mrt6_ioctl)(u_long, caddr_t);
278
#endif /* _KERNEL */
279
280
#endif /* !_NETINET6_IP6_MROUTE_H_ */
281
282