1 1.131 andvar /* $NetBSD: in6_proto.c,v 1.131 2024/02/09 22:08:37 andvar Exp $ */ 2 1.21 itojun /* $KAME: in6_proto.c,v 1.66 2000/10/10 15:35:47 itojun Exp $ */ 3 1.3 thorpej 4 1.2 itojun /* 5 1.2 itojun * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 6 1.2 itojun * All rights reserved. 7 1.18 itojun * 8 1.2 itojun * Redistribution and use in source and binary forms, with or without 9 1.2 itojun * modification, are permitted provided that the following conditions 10 1.2 itojun * are met: 11 1.2 itojun * 1. Redistributions of source code must retain the above copyright 12 1.2 itojun * notice, this list of conditions and the following disclaimer. 13 1.2 itojun * 2. Redistributions in binary form must reproduce the above copyright 14 1.2 itojun * notice, this list of conditions and the following disclaimer in the 15 1.2 itojun * documentation and/or other materials provided with the distribution. 16 1.2 itojun * 3. Neither the name of the project nor the names of its contributors 17 1.2 itojun * may be used to endorse or promote products derived from this software 18 1.2 itojun * without specific prior written permission. 19 1.18 itojun * 20 1.2 itojun * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 21 1.2 itojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 1.2 itojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 1.2 itojun * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 24 1.2 itojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 1.2 itojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 1.2 itojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 1.2 itojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 1.2 itojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 1.2 itojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 1.2 itojun * SUCH DAMAGE. 31 1.2 itojun */ 32 1.2 itojun 33 1.2 itojun /* 34 1.2 itojun * Copyright (c) 1982, 1986, 1993 35 1.2 itojun * The Regents of the University of California. All rights reserved. 36 1.2 itojun * 37 1.2 itojun * Redistribution and use in source and binary forms, with or without 38 1.2 itojun * modification, are permitted provided that the following conditions 39 1.2 itojun * are met: 40 1.2 itojun * 1. Redistributions of source code must retain the above copyright 41 1.2 itojun * notice, this list of conditions and the following disclaimer. 42 1.2 itojun * 2. Redistributions in binary form must reproduce the above copyright 43 1.2 itojun * notice, this list of conditions and the following disclaimer in the 44 1.2 itojun * documentation and/or other materials provided with the distribution. 45 1.49 agc * 3. Neither the name of the University nor the names of its contributors 46 1.2 itojun * may be used to endorse or promote products derived from this software 47 1.2 itojun * without specific prior written permission. 48 1.2 itojun * 49 1.2 itojun * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 50 1.2 itojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 51 1.2 itojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 52 1.2 itojun * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 53 1.2 itojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 54 1.2 itojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 55 1.2 itojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 56 1.2 itojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 57 1.2 itojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 58 1.2 itojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 59 1.2 itojun * SUCH DAMAGE. 60 1.2 itojun * 61 1.2 itojun * @(#)in_proto.c 8.1 (Berkeley) 6/10/93 62 1.2 itojun */ 63 1.34 lukem 64 1.34 lukem #include <sys/cdefs.h> 65 1.131 andvar __KERNEL_RCSID(0, "$NetBSD: in6_proto.c,v 1.131 2024/02/09 22:08:37 andvar Exp $"); 66 1.2 itojun 67 1.106 pooka #ifdef _KERNEL_OPT 68 1.88 joerg #include "opt_gateway.h" 69 1.2 itojun #include "opt_inet.h" 70 1.4 thorpej #include "opt_ipsec.h" 71 1.104 rjs #include "opt_dccp.h" 72 1.107 rjs #include "opt_sctp.h" 73 1.119 ozaki #include "opt_net_mpsafe.h" 74 1.106 pooka #endif 75 1.2 itojun 76 1.2 itojun #include <sys/param.h> 77 1.2 itojun #include <sys/socket.h> 78 1.2 itojun #include <sys/protosw.h> 79 1.2 itojun #include <sys/kernel.h> 80 1.2 itojun #include <sys/domain.h> 81 1.2 itojun #include <sys/mbuf.h> 82 1.2 itojun 83 1.2 itojun #include <net/if.h> 84 1.2 itojun 85 1.2 itojun #include <netinet/in.h> 86 1.2 itojun #include <netinet/in_systm.h> 87 1.2 itojun #include <netinet/in_var.h> 88 1.17 itojun #include <netinet/ip_encap.h> 89 1.2 itojun #include <netinet/ip.h> 90 1.2 itojun #include <netinet/ip_var.h> 91 1.2 itojun #include <netinet/in_pcb.h> 92 1.13 itojun #include <netinet/ip6.h> 93 1.2 itojun #include <netinet6/ip6_var.h> 94 1.13 itojun #include <netinet/icmp6.h> 95 1.2 itojun #include <netinet6/in6_pcb.h> 96 1.2 itojun 97 1.2 itojun #include <netinet/tcp.h> 98 1.2 itojun #include <netinet/tcp_fsm.h> 99 1.2 itojun #include <netinet/tcp_seq.h> 100 1.2 itojun #include <netinet/tcp_timer.h> 101 1.2 itojun #include <netinet/tcp_var.h> 102 1.2 itojun #include <netinet/tcp_debug.h> 103 1.2 itojun 104 1.2 itojun #include <netinet6/udp6.h> 105 1.2 itojun #include <netinet6/udp6_var.h> 106 1.2 itojun 107 1.104 rjs #ifdef DCCP 108 1.104 rjs #include <netinet/dccp.h> 109 1.104 rjs #include <netinet/dccp_var.h> 110 1.104 rjs #include <netinet6/dccp6_var.h> 111 1.104 rjs #endif 112 1.104 rjs 113 1.107 rjs #ifdef SCTP 114 1.107 rjs #include <netinet/sctp_pcb.h> 115 1.107 rjs #include <netinet/sctp.h> 116 1.107 rjs #include <netinet/sctp_var.h> 117 1.107 rjs #include <netinet6/sctp6_var.h> 118 1.107 rjs #endif 119 1.107 rjs 120 1.2 itojun #include <netinet6/pim6_var.h> 121 1.2 itojun 122 1.99 christos #ifdef IPSEC 123 1.70 degroote #include <netipsec/ipsec.h> 124 1.70 degroote #include <netipsec/ipsec6.h> 125 1.70 degroote #include <netipsec/key.h> 126 1.121 maxv #endif 127 1.70 degroote 128 1.63 liamjfoy #include "carp.h" 129 1.63 liamjfoy #if NCARP > 0 130 1.63 liamjfoy #include <netinet/ip_carp.h> 131 1.63 liamjfoy #endif 132 1.63 liamjfoy 133 1.2 itojun #include <netinet6/ip6protosw.h> 134 1.2 itojun 135 1.2 itojun /* 136 1.2 itojun * TCP/IP protocol family: IP6, ICMP6, UDP, TCP. 137 1.2 itojun */ 138 1.2 itojun 139 1.58 matt DOMAIN_DEFINE(inet6domain); /* forward declare and add to link set */ 140 1.2 itojun 141 1.82 ad /* Wrappers to acquire kernel_lock. */ 142 1.82 ad 143 1.82 ad PR_WRAP_CTLINPUT(rip6_ctlinput) 144 1.82 ad PR_WRAP_CTLINPUT(encap6_ctlinput) 145 1.82 ad PR_WRAP_CTLINPUT(udp6_ctlinput) 146 1.82 ad PR_WRAP_CTLINPUT(tcp6_ctlinput) 147 1.82 ad 148 1.82 ad #define rip6_ctlinput rip6_ctlinput_wrapper 149 1.82 ad #define encap6_ctlinput encap6_ctlinput_wrapper 150 1.82 ad #define udp6_ctlinput udp6_ctlinput_wrapper 151 1.82 ad #define tcp6_ctlinput tcp6_ctlinput_wrapper 152 1.82 ad 153 1.82 ad PR_WRAP_CTLOUTPUT(rip6_ctloutput) 154 1.82 ad PR_WRAP_CTLOUTPUT(tcp_ctloutput) 155 1.93 christos PR_WRAP_CTLOUTPUT(udp6_ctloutput) 156 1.82 ad PR_WRAP_CTLOUTPUT(icmp6_ctloutput) 157 1.82 ad 158 1.82 ad #define rip6_ctloutput rip6_ctloutput_wrapper 159 1.82 ad #define tcp_ctloutput tcp_ctloutput_wrapper 160 1.93 christos #define udp6_ctloutput udp6_ctloutput_wrapper 161 1.82 ad #define icmp6_ctloutput icmp6_ctloutput_wrapper 162 1.82 ad 163 1.104 rjs #if defined(DCCP) 164 1.104 rjs PR_WRAP_CTLINPUT(dccp6_ctlinput) 165 1.104 rjs PR_WRAP_CTLOUTPUT(dccp_ctloutput) 166 1.104 rjs 167 1.104 rjs #define dccp6_ctlinput dccp6_ctlinput_wrapper 168 1.104 rjs #define dccp_ctloutput dccp_ctloutput_wrapper 169 1.104 rjs #endif 170 1.104 rjs 171 1.107 rjs #if defined(SCTP) 172 1.107 rjs PR_WRAP_CTLINPUT(sctp6_ctlinput) 173 1.107 rjs PR_WRAP_CTLOUTPUT(sctp_ctloutput) 174 1.107 rjs 175 1.107 rjs #define sctp6_ctlinput sctp6_ctlinput_wrapper 176 1.107 rjs #define sctp_ctloutput sctp_ctloutput_wrapper 177 1.107 rjs #endif 178 1.107 rjs 179 1.119 ozaki #ifdef NET_MPSAFE 180 1.119 ozaki PR_WRAP_INPUT6(udp6_input) 181 1.119 ozaki PR_WRAP_INPUT6(tcp6_input) 182 1.119 ozaki #ifdef DCCP 183 1.119 ozaki PR_WRAP_INPUT6(dccp6_input) 184 1.119 ozaki #endif 185 1.119 ozaki #ifdef SCTP 186 1.119 ozaki PR_WRAP_INPUT6(sctp6_input) 187 1.119 ozaki #endif 188 1.119 ozaki PR_WRAP_INPUT6(rip6_input) 189 1.119 ozaki PR_WRAP_INPUT6(dest6_input) 190 1.119 ozaki PR_WRAP_INPUT6(route6_input) 191 1.119 ozaki PR_WRAP_INPUT6(frag6_input) 192 1.119 ozaki #if NPFSYNC > 0 193 1.119 ozaki PR_WRAP_INPUT6(pfsync_input) 194 1.119 ozaki #endif 195 1.119 ozaki PR_WRAP_INPUT6(pim6_input) 196 1.119 ozaki 197 1.119 ozaki #define udp6_input udp6_input_wrapper 198 1.119 ozaki #define tcp6_input tcp6_input_wrapper 199 1.119 ozaki #define dccp6_input dccp6_input_wrapper 200 1.119 ozaki #define sctp6_input sctp6_input_wrapper 201 1.119 ozaki #define rip6_input rip6_input_wrapper 202 1.119 ozaki #define dest6_input dest6_input_wrapper 203 1.119 ozaki #define route6_input route6_input_wrapper 204 1.119 ozaki #define frag6_input frag6_input_wrapper 205 1.119 ozaki #define pim6_input pim6_input_wrapper 206 1.119 ozaki #endif 207 1.119 ozaki 208 1.99 christos #if defined(IPSEC) 209 1.85 tsutsui 210 1.117 ozaki #ifdef IPSEC_RUMPKERNEL 211 1.117 ozaki /* 212 1.117 ozaki * .pr_input = ipsec6_common_input won't be resolved on loading 213 1.117 ozaki * the ipsec shared library. We need a wrapper anyway. 214 1.117 ozaki */ 215 1.117 ozaki static int 216 1.117 ozaki ipsec6_common_input_wrapper(struct mbuf **mp, int *offp, int proto) 217 1.117 ozaki { 218 1.117 ozaki 219 1.117 ozaki if (ipsec_enabled) { 220 1.117 ozaki return ipsec6_common_input(mp, offp, proto); 221 1.117 ozaki } else { 222 1.117 ozaki m_freem(*mp); 223 1.117 ozaki return IPPROTO_DONE; 224 1.117 ozaki } 225 1.117 ozaki } 226 1.117 ozaki #define ipsec6_common_input ipsec6_common_input_wrapper 227 1.117 ozaki 228 1.117 ozaki /* The ctlinput functions may not be loaded */ 229 1.117 ozaki #define IPSEC_WRAP_CTLINPUT(name) \ 230 1.117 ozaki static void * \ 231 1.117 ozaki name##_wrapper(int a, const struct sockaddr *b, void *c)\ 232 1.117 ozaki { \ 233 1.117 ozaki void *rv; \ 234 1.117 ozaki KERNEL_LOCK(1, NULL); \ 235 1.117 ozaki if (ipsec_enabled) \ 236 1.117 ozaki rv = name(a, b, c); \ 237 1.117 ozaki else \ 238 1.117 ozaki rv = NULL; \ 239 1.117 ozaki KERNEL_UNLOCK_ONE(NULL); \ 240 1.117 ozaki return rv; \ 241 1.117 ozaki } 242 1.117 ozaki IPSEC_WRAP_CTLINPUT(ah6_ctlinput) 243 1.117 ozaki IPSEC_WRAP_CTLINPUT(esp6_ctlinput) 244 1.117 ozaki 245 1.117 ozaki #else /* !IPSEC_RUMPKERNEL */ 246 1.85 tsutsui 247 1.117 ozaki PR_WRAP_CTLINPUT(ah6_ctlinput) 248 1.82 ad PR_WRAP_CTLINPUT(esp6_ctlinput) 249 1.82 ad 250 1.117 ozaki #endif /* !IPSEC_RUMPKERNEL */ 251 1.117 ozaki 252 1.117 ozaki #define ah6_ctlinput ah6_ctlinput_wrapper 253 1.82 ad #define esp6_ctlinput esp6_ctlinput_wrapper 254 1.117 ozaki 255 1.117 ozaki #endif /* IPSEC */ 256 1.82 ad 257 1.100 pooka static void 258 1.100 pooka tcp6_init(void) 259 1.100 pooka { 260 1.100 pooka 261 1.100 pooka icmp6_mtudisc_callback_register(tcp6_mtudisc_callback); 262 1.100 pooka 263 1.100 pooka tcp_init_common(sizeof(struct ip6_hdr)); 264 1.100 pooka } 265 1.100 pooka 266 1.57 matt const struct ip6protosw inet6sw[] = { 267 1.110 riastrad { .pr_domain = &inet6domain, 268 1.74 liamjfoy .pr_protocol = IPPROTO_IPV6, 269 1.74 liamjfoy .pr_init = ip6_init, 270 1.91 dyoung .pr_fasttimo = frag6_fasttimo, 271 1.74 liamjfoy .pr_slowtimo = frag6_slowtimo, 272 1.91 dyoung .pr_drain = frag6_drainstub, 273 1.74 liamjfoy }, 274 1.115 ozaki { .pr_type = SOCK_RAW, 275 1.115 ozaki .pr_domain = &inet6domain, 276 1.115 ozaki .pr_protocol = IPPROTO_ICMPV6, 277 1.115 ozaki .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 278 1.115 ozaki .pr_input = icmp6_input, 279 1.115 ozaki .pr_ctlinput = rip6_ctlinput, 280 1.115 ozaki .pr_ctloutput = icmp6_ctloutput, 281 1.115 ozaki .pr_usrreqs = &rip6_usrreqs, 282 1.115 ozaki .pr_init = icmp6_init, 283 1.115 ozaki }, 284 1.110 riastrad { .pr_type = SOCK_DGRAM, 285 1.74 liamjfoy .pr_domain = &inet6domain, 286 1.74 liamjfoy .pr_protocol = IPPROTO_UDP, 287 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_PURGEIF, 288 1.110 riastrad .pr_input = udp6_input, 289 1.74 liamjfoy .pr_ctlinput = udp6_ctlinput, 290 1.93 christos .pr_ctloutput = udp6_ctloutput, 291 1.101 rmind .pr_usrreqs = &udp6_usrreqs, 292 1.74 liamjfoy .pr_init = udp6_init, 293 1.74 liamjfoy }, 294 1.110 riastrad { .pr_type = SOCK_STREAM, 295 1.74 liamjfoy .pr_domain = &inet6domain, 296 1.74 liamjfoy .pr_protocol = IPPROTO_TCP, 297 1.74 liamjfoy .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_LISTEN|PR_ABRTACPTDIS|PR_PURGEIF, 298 1.110 riastrad .pr_input = tcp6_input, 299 1.74 liamjfoy .pr_ctlinput = tcp6_ctlinput, 300 1.74 liamjfoy .pr_ctloutput = tcp_ctloutput, 301 1.101 rmind .pr_usrreqs = &tcp_usrreqs, 302 1.100 pooka .pr_init = tcp6_init, 303 1.91 dyoung .pr_fasttimo = tcp_fasttimo, 304 1.91 dyoung .pr_drain = tcp_drainstub, 305 1.2 itojun }, 306 1.104 rjs #ifdef DCCP 307 1.110 riastrad { .pr_type = SOCK_CONN_DGRAM, 308 1.104 rjs .pr_domain = &inet6domain, 309 1.104 rjs .pr_protocol = IPPROTO_DCCP, 310 1.104 rjs .pr_flags = PR_CONNREQUIRED|PR_ATOMIC|PR_LISTEN, 311 1.110 riastrad .pr_input = dccp6_input, 312 1.104 rjs .pr_ctlinput = dccp6_ctlinput, 313 1.104 rjs .pr_ctloutput = dccp_ctloutput, 314 1.104 rjs .pr_usrreqs = &dccp6_usrreqs, 315 1.104 rjs #ifndef INET 316 1.104 rjs .pr_init = dccp_init, 317 1.104 rjs #endif 318 1.104 rjs }, 319 1.104 rjs #endif /* DCCP */ 320 1.107 rjs #ifdef SCTP 321 1.110 riastrad { .pr_type = SOCK_DGRAM, 322 1.107 rjs .pr_domain = &inet6domain, 323 1.107 rjs .pr_protocol = IPPROTO_SCTP, 324 1.107 rjs .pr_flags = PR_ADDR_OPT|PR_WANTRCVD, 325 1.110 riastrad .pr_input = sctp6_input, 326 1.107 rjs .pr_ctlinput = sctp6_ctlinput, 327 1.107 rjs .pr_ctloutput = sctp_ctloutput, 328 1.107 rjs .pr_usrreqs = &sctp6_usrreqs, 329 1.107 rjs .pr_drain = sctp_drain, 330 1.107 rjs }, 331 1.110 riastrad { .pr_type = SOCK_SEQPACKET, 332 1.107 rjs .pr_domain = &inet6domain, 333 1.107 rjs .pr_protocol = IPPROTO_SCTP, 334 1.107 rjs .pr_flags = PR_ADDR_OPT|PR_WANTRCVD, 335 1.110 riastrad .pr_input = sctp6_input, 336 1.107 rjs .pr_ctlinput = sctp6_ctlinput, 337 1.107 rjs .pr_ctloutput = sctp_ctloutput, 338 1.127 jakllsch .pr_usrreqs = &sctp6_usrreqs, 339 1.107 rjs .pr_drain = sctp_drain, 340 1.107 rjs }, 341 1.110 riastrad { .pr_type = SOCK_STREAM, 342 1.107 rjs .pr_domain = &inet6domain, 343 1.107 rjs .pr_protocol = IPPROTO_SCTP, 344 1.107 rjs .pr_flags = PR_CONNREQUIRED|PR_ADDR_OPT|PR_WANTRCVD|PR_LISTEN, 345 1.110 riastrad .pr_input = sctp6_input, 346 1.107 rjs .pr_ctlinput = sctp6_ctlinput, 347 1.107 rjs .pr_ctloutput = sctp_ctloutput, 348 1.127 jakllsch .pr_usrreqs = &sctp6_usrreqs, 349 1.107 rjs .pr_drain = sctp_drain, 350 1.107 rjs }, 351 1.107 rjs #endif /* SCTP */ 352 1.110 riastrad { .pr_type = SOCK_RAW, 353 1.74 liamjfoy .pr_domain = &inet6domain, 354 1.74 liamjfoy .pr_protocol = IPPROTO_RAW, 355 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_PURGEIF, 356 1.110 riastrad .pr_input = rip6_input, 357 1.74 liamjfoy .pr_ctlinput = rip6_ctlinput, 358 1.74 liamjfoy .pr_ctloutput = rip6_ctloutput, 359 1.101 rmind .pr_usrreqs = &rip6_usrreqs, 360 1.74 liamjfoy }, 361 1.75 liamjfoy #ifdef GATEWAY 362 1.110 riastrad { .pr_domain = &inet6domain, 363 1.75 liamjfoy .pr_protocol = IPPROTO_IPV6, 364 1.75 liamjfoy .pr_slowtimo = ip6flow_slowtimo, 365 1.84 liamjfoy .pr_init = ip6flow_poolinit, 366 1.75 liamjfoy }, 367 1.75 liamjfoy #endif /* GATEWAY */ 368 1.110 riastrad { .pr_type = SOCK_RAW, 369 1.74 liamjfoy .pr_domain = &inet6domain, 370 1.74 liamjfoy .pr_protocol = IPPROTO_DSTOPTS, 371 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 372 1.110 riastrad .pr_input = dest6_input, 373 1.74 liamjfoy }, 374 1.110 riastrad { .pr_type = SOCK_RAW, 375 1.74 liamjfoy .pr_domain = &inet6domain, 376 1.74 liamjfoy .pr_protocol = IPPROTO_ROUTING, 377 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 378 1.110 riastrad .pr_input = route6_input, 379 1.74 liamjfoy }, 380 1.110 riastrad { .pr_type = SOCK_RAW, 381 1.74 liamjfoy .pr_domain = &inet6domain, 382 1.74 liamjfoy .pr_protocol = IPPROTO_FRAGMENT, 383 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 384 1.110 riastrad .pr_input = frag6_input, 385 1.2 itojun }, 386 1.99 christos #ifdef IPSEC 387 1.110 riastrad { .pr_type = SOCK_RAW, 388 1.74 liamjfoy .pr_domain = &inet6domain, 389 1.74 liamjfoy .pr_protocol = IPPROTO_AH, 390 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 391 1.110 riastrad .pr_input = ipsec6_common_input, 392 1.74 liamjfoy .pr_ctlinput = ah6_ctlinput, 393 1.74 liamjfoy }, 394 1.110 riastrad { .pr_type = SOCK_RAW, 395 1.74 liamjfoy .pr_domain = &inet6domain, 396 1.74 liamjfoy .pr_protocol = IPPROTO_ESP, 397 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 398 1.110 riastrad .pr_input = ipsec6_common_input, 399 1.74 liamjfoy .pr_ctlinput = esp6_ctlinput, 400 1.74 liamjfoy }, 401 1.110 riastrad { .pr_type = SOCK_RAW, 402 1.74 liamjfoy .pr_domain = &inet6domain, 403 1.74 liamjfoy .pr_protocol = IPPROTO_IPCOMP, 404 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 405 1.110 riastrad .pr_input = ipsec6_common_input, 406 1.70 degroote }, 407 1.99 christos #endif /* IPSEC */ 408 1.17 itojun #ifdef INET 409 1.110 riastrad { .pr_type = SOCK_RAW, 410 1.74 liamjfoy .pr_domain = &inet6domain, 411 1.74 liamjfoy .pr_protocol = IPPROTO_IPV4, 412 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 413 1.110 riastrad .pr_input = encap6_input, 414 1.74 liamjfoy .pr_ctlinput = encap6_ctlinput, 415 1.74 liamjfoy .pr_ctloutput = rip6_ctloutput, 416 1.101 rmind .pr_usrreqs = &rip6_usrreqs, 417 1.74 liamjfoy .pr_init = encap_init, 418 1.2 itojun }, 419 1.17 itojun #endif 420 1.110 riastrad { .pr_type = SOCK_RAW, 421 1.74 liamjfoy .pr_domain = &inet6domain, 422 1.74 liamjfoy .pr_protocol = IPPROTO_IPV6, 423 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 424 1.110 riastrad .pr_input = encap6_input, 425 1.74 liamjfoy .pr_ctlinput = encap6_ctlinput, 426 1.74 liamjfoy .pr_ctloutput = rip6_ctloutput, 427 1.101 rmind .pr_usrreqs = &rip6_usrreqs, 428 1.74 liamjfoy .pr_init = encap_init, 429 1.2 itojun }, 430 1.63 liamjfoy #if NCARP > 0 431 1.110 riastrad { .pr_type = SOCK_RAW, 432 1.74 liamjfoy .pr_domain = &inet6domain, 433 1.74 liamjfoy .pr_protocol = IPPROTO_CARP, 434 1.122 maxv .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 435 1.110 riastrad .pr_input = carp6_proto_input, 436 1.74 liamjfoy .pr_ctloutput = rip6_ctloutput, 437 1.101 rmind .pr_usrreqs = &rip6_usrreqs, 438 1.63 liamjfoy }, 439 1.63 liamjfoy #endif /* NCARP */ 440 1.110 riastrad { .pr_type = SOCK_RAW, 441 1.74 liamjfoy .pr_domain = &inet6domain, 442 1.116 knakahar .pr_protocol = IPPROTO_L2TP, 443 1.116 knakahar .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 444 1.116 knakahar .pr_input = encap6_input, 445 1.116 knakahar .pr_ctlinput = rip6_ctlinput, 446 1.116 knakahar .pr_ctloutput = rip6_ctloutput, 447 1.116 knakahar .pr_usrreqs = &rip6_usrreqs, 448 1.116 knakahar .pr_init = encap_init, 449 1.116 knakahar }, 450 1.116 knakahar { .pr_type = SOCK_RAW, 451 1.116 knakahar .pr_domain = &inet6domain, 452 1.74 liamjfoy .pr_protocol = IPPROTO_PIM, 453 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 454 1.110 riastrad .pr_input = pim6_input, 455 1.74 liamjfoy .pr_ctloutput = rip6_ctloutput, 456 1.101 rmind .pr_usrreqs = &rip6_usrreqs, 457 1.80 thorpej .pr_init = pim6_init, 458 1.2 itojun }, 459 1.2 itojun /* raw wildcard */ 460 1.110 riastrad { .pr_type = SOCK_RAW, 461 1.74 liamjfoy .pr_domain = &inet6domain, 462 1.74 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 463 1.110 riastrad .pr_input = rip6_input, 464 1.74 liamjfoy .pr_ctloutput = rip6_ctloutput, 465 1.101 rmind .pr_usrreqs = &rip6_usrreqs, 466 1.74 liamjfoy .pr_init = rip6_init, 467 1.2 itojun }, 468 1.2 itojun }; 469 1.17 itojun 470 1.79 dyoung static const struct sockaddr_in6 in6_any = { 471 1.79 dyoung .sin6_len = sizeof(in6_any) 472 1.79 dyoung , .sin6_family = AF_INET6 473 1.79 dyoung , .sin6_port = 0 474 1.79 dyoung , .sin6_flowinfo = 0 475 1.79 dyoung , .sin6_addr = IN6ADDR_ANY_INIT 476 1.79 dyoung , .sin6_scope_id = 0 477 1.79 dyoung }; 478 1.79 dyoung 479 1.100 pooka bool in6_present = false; 480 1.100 pooka static void 481 1.113 ozaki in6_dom_init(void) 482 1.100 pooka { 483 1.100 pooka 484 1.100 pooka in6_present = true; 485 1.100 pooka } 486 1.100 pooka 487 1.66 christos struct domain inet6domain = { 488 1.69 dyoung .dom_family = AF_INET6, .dom_name = "internet6", 489 1.113 ozaki .dom_init = in6_dom_init, .dom_externalize = NULL, .dom_dispose = NULL, 490 1.69 dyoung .dom_protosw = (const struct protosw *)inet6sw, 491 1.69 dyoung .dom_protoswNPROTOSW = (const struct protosw *)&inet6sw[sizeof(inet6sw)/sizeof(inet6sw[0])], 492 1.90 dyoung .dom_rtattach = rt_inithead, 493 1.69 dyoung .dom_rtoffset = offsetof(struct sockaddr_in6, sin6_addr) << 3, 494 1.83 pooka .dom_maxrtkey = sizeof(struct ip_pack6), 495 1.105 roy .dom_if_up = in6_if_up, .dom_if_down = in6_if_down, 496 1.69 dyoung .dom_ifattach = in6_domifattach, .dom_ifdetach = in6_domifdetach, 497 1.105 roy .dom_if_link_state_change = in6_if_link_state_change, 498 1.69 dyoung .dom_link = { NULL }, 499 1.76 dyoung .dom_mowner = MOWNER_INIT("",""), 500 1.77 dyoung .dom_sa_cmpofs = offsetof(struct sockaddr_in6, sin6_addr), 501 1.77 dyoung .dom_sa_cmplen = sizeof(struct in6_addr), 502 1.79 dyoung .dom_sa_any = (const struct sockaddr *)&in6_any, 503 1.87 dyoung .dom_sockaddr_externalize = sockaddr_in6_externalize, 504 1.66 christos }; 505 1.2 itojun 506 1.86 dyoung #if 0 507 1.76 dyoung int 508 1.76 dyoung sockaddr_in6_cmp(const struct sockaddr *lsa, const struct sockaddr *rsa) 509 1.76 dyoung { 510 1.76 dyoung uint_fast8_t len; 511 1.76 dyoung const uint_fast8_t addrofs = offsetof(struct sockaddr_in6, sin6_addr), 512 1.76 dyoung addrend = addrofs + sizeof(struct in6_addr); 513 1.76 dyoung int rc; 514 1.76 dyoung const struct sockaddr_in6 *lsin6, *rsin6; 515 1.76 dyoung 516 1.76 dyoung lsin6 = satocsin6(lsa); 517 1.76 dyoung rsin6 = satocsin6(rsa); 518 1.76 dyoung 519 1.76 dyoung len = MIN(addrend, MIN(lsin6->sin6_len, rsin6->sin6_len)); 520 1.76 dyoung 521 1.76 dyoung if (len > addrofs && 522 1.76 dyoung (rc = memcmp(&lsin6->sin6_addr, &rsin6->sin6_addr, 523 1.76 dyoung len - addrofs)) != 0) 524 1.76 dyoung return rc; 525 1.76 dyoung 526 1.76 dyoung return lsin6->sin6_len - rsin6->sin6_len; 527 1.76 dyoung } 528 1.86 dyoung #endif 529 1.76 dyoung 530 1.2 itojun /* 531 1.2 itojun * Internet configuration info 532 1.2 itojun */ 533 1.2 itojun #ifdef GATEWAY6 534 1.121 maxv #define IPV6FORWARDING 1 /* forward IP6 packets not for us */ 535 1.2 itojun #else 536 1.121 maxv #define IPV6FORWARDING 0 /* don't forward IP6 packets not for us */ 537 1.121 maxv #endif 538 1.121 maxv 539 1.121 maxv int ip6_forwarding = IPV6FORWARDING; /* act as router? */ 540 1.121 maxv int ip6_sendredirects = 1; 541 1.121 maxv int ip6_defhlim = IPV6_DEFHLIM; 542 1.121 maxv int ip6_defmcasthlim = IPV6_DEFAULT_MULTICAST_HOPS; 543 1.121 maxv int ip6_maxfragpackets = 200; 544 1.121 maxv int ip6_maxfrags = 200; 545 1.121 maxv int ip6_log_interval = 5; 546 1.121 maxv int ip6_hdrnestlimit = 15; 547 1.121 maxv int ip6_dad_count = 1; /* DupAddrDetectionTransmits */ 548 1.121 maxv int ip6_auto_flowlabel = 1; 549 1.121 maxv int ip6_use_deprecated = 1; /* allow deprecated addr (RFC2462 5.5.4) */ 550 1.121 maxv int ip6_mcast_pmtu = 0; /* enable pMTU discovery for multicast? */ 551 1.121 maxv int ip6_v6only = 1; 552 1.121 maxv int ip6_neighborgcthresh = 2048; /* Threshold # of NDP entries for GC */ 553 1.121 maxv int ip6_maxdynroutes = 4096; /* Max # of routes created via redirect */ 554 1.131 andvar int ip6_param_rt_msg = 1; /* How to send parameter changing rtm */ 555 1.121 maxv 556 1.121 maxv int ip6_keepfaith = 0; 557 1.121 maxv time_t ip6_log_time = 0; 558 1.2 itojun 559 1.2 itojun /* icmp6 */ 560 1.2 itojun int pmtu_expire = 60*10; 561 1.2 itojun 562 1.2 itojun /* raw IP6 parameters */ 563 1.2 itojun /* 564 1.2 itojun * Nominal space allocated to a raw ip socket. 565 1.2 itojun */ 566 1.2 itojun #define RIPV6SNDQ 8192 567 1.125 roy #define RIPV6RCVQ 16384 568 1.2 itojun 569 1.2 itojun u_long rip6_sendspace = RIPV6SNDQ; 570 1.2 itojun u_long rip6_recvspace = RIPV6RCVQ; 571 1.2 itojun 572 1.2 itojun /* ICMPV6 parameters */ 573 1.2 itojun int icmp6_rediraccept = 1; /* accept and process redirects */ 574 1.2 itojun int icmp6_redirtimeout = 10 * 60; /* 10 minutes */ 575 1.18 itojun int icmp6errppslim = 100; /* 100pps */ 576 1.10 itojun int icmp6_nodeinfo = 1; /* enable/disable NI response */ 577