1 1.131 thorpej /* $NetBSD: in_proto.c,v 1.131 2022/09/03 02:53:18 thorpej Exp $ */ 2 1.32 itojun 3 1.32 itojun /* 4 1.32 itojun * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 1.32 itojun * All rights reserved. 6 1.56 itojun * 7 1.32 itojun * Redistribution and use in source and binary forms, with or without 8 1.32 itojun * modification, are permitted provided that the following conditions 9 1.32 itojun * are met: 10 1.32 itojun * 1. Redistributions of source code must retain the above copyright 11 1.32 itojun * notice, this list of conditions and the following disclaimer. 12 1.32 itojun * 2. Redistributions in binary form must reproduce the above copyright 13 1.32 itojun * notice, this list of conditions and the following disclaimer in the 14 1.32 itojun * documentation and/or other materials provided with the distribution. 15 1.32 itojun * 3. Neither the name of the project nor the names of its contributors 16 1.32 itojun * may be used to endorse or promote products derived from this software 17 1.32 itojun * without specific prior written permission. 18 1.56 itojun * 19 1.32 itojun * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 20 1.32 itojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.32 itojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.32 itojun * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 23 1.32 itojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.32 itojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.32 itojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.32 itojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.32 itojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.32 itojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.32 itojun * SUCH DAMAGE. 30 1.32 itojun */ 31 1.9 cgd 32 1.1 cgd /* 33 1.8 mycroft * Copyright (c) 1982, 1986, 1993 34 1.8 mycroft * The Regents of the University of California. All rights reserved. 35 1.1 cgd * 36 1.1 cgd * Redistribution and use in source and binary forms, with or without 37 1.1 cgd * modification, are permitted provided that the following conditions 38 1.1 cgd * are met: 39 1.1 cgd * 1. Redistributions of source code must retain the above copyright 40 1.1 cgd * notice, this list of conditions and the following disclaimer. 41 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 42 1.1 cgd * notice, this list of conditions and the following disclaimer in the 43 1.1 cgd * documentation and/or other materials provided with the distribution. 44 1.59 agc * 3. Neither the name of the University nor the names of its contributors 45 1.1 cgd * may be used to endorse or promote products derived from this software 46 1.1 cgd * without specific prior written permission. 47 1.1 cgd * 48 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 1.1 cgd * SUCH DAMAGE. 59 1.1 cgd * 60 1.18 thorpej * @(#)in_proto.c 8.2 (Berkeley) 2/9/95 61 1.1 cgd */ 62 1.51 lukem 63 1.51 lukem #include <sys/cdefs.h> 64 1.131 thorpej __KERNEL_RCSID(0, "$NetBSD: in_proto.c,v 1.131 2022/09/03 02:53:18 thorpej Exp $"); 65 1.19 scottr 66 1.113 pooka #ifdef _KERNEL_OPT 67 1.19 scottr #include "opt_mrouting.h" 68 1.32 itojun #include "opt_inet.h" 69 1.33 thorpej #include "opt_ipsec.h" 70 1.65 manu #include "opt_pim.h" 71 1.97 pooka #include "opt_gateway.h" 72 1.111 rjs #include "opt_dccp.h" 73 1.115 rjs #include "opt_sctp.h" 74 1.108 christos #include "opt_compat_netbsd.h" 75 1.125 ozaki #include "opt_net_mpsafe.h" 76 1.113 pooka #endif 77 1.1 cgd 78 1.5 mycroft #include <sys/param.h> 79 1.5 mycroft #include <sys/socket.h> 80 1.5 mycroft #include <sys/protosw.h> 81 1.5 mycroft #include <sys/domain.h> 82 1.5 mycroft #include <sys/mbuf.h> 83 1.1 cgd 84 1.8 mycroft #include <net/if.h> 85 1.8 mycroft 86 1.5 mycroft #include <netinet/in.h> 87 1.5 mycroft #include <netinet/in_systm.h> 88 1.110 rmind #include <netinet/in_var.h> 89 1.8 mycroft #include <netinet/ip.h> 90 1.8 mycroft #include <netinet/ip_var.h> 91 1.8 mycroft #include <netinet/ip_icmp.h> 92 1.78 dyoung #include <netinet/in_ifattach.h> 93 1.8 mycroft #include <netinet/in_pcb.h> 94 1.69 yamt #include <netinet/in_proto.h> 95 1.32 itojun 96 1.32 itojun #ifdef INET6 97 1.32 itojun #ifndef INET 98 1.32 itojun #include <netinet/in.h> 99 1.32 itojun #endif 100 1.32 itojun #include <netinet/ip6.h> 101 1.32 itojun #endif 102 1.32 itojun 103 1.8 mycroft #include <netinet/igmp_var.h> 104 1.65 manu #ifdef PIM 105 1.65 manu #include <netinet/pim_var.h> 106 1.65 manu #endif 107 1.8 mycroft #include <netinet/tcp.h> 108 1.8 mycroft #include <netinet/tcp_fsm.h> 109 1.8 mycroft #include <netinet/tcp_seq.h> 110 1.8 mycroft #include <netinet/tcp_timer.h> 111 1.8 mycroft #include <netinet/tcp_var.h> 112 1.8 mycroft #include <netinet/tcp_debug.h> 113 1.8 mycroft #include <netinet/udp.h> 114 1.8 mycroft #include <netinet/udp_var.h> 115 1.39 itojun #include <netinet/ip_encap.h> 116 1.79 rpaulo 117 1.111 rjs #ifdef DCCP 118 1.111 rjs #include <netinet/dccp.h> 119 1.111 rjs #include <netinet/dccp_var.h> 120 1.111 rjs #endif 121 1.111 rjs 122 1.115 rjs #ifdef SCTP 123 1.115 rjs #include <netinet/sctp.h> 124 1.115 rjs #include <netinet/sctp_var.h> 125 1.115 rjs #endif 126 1.115 rjs 127 1.1 cgd /* 128 1.1 cgd * TCP/IP protocol family: IP, ICMP, UDP, TCP. 129 1.1 cgd */ 130 1.1 cgd 131 1.106 christos #ifdef IPSEC 132 1.61 jonathan #include <netipsec/ipsec.h> 133 1.61 jonathan #include <netipsec/key.h> 134 1.106 christos #endif /* IPSEC */ 135 1.61 jonathan 136 1.72 liamjfoy #include "carp.h" 137 1.72 liamjfoy #if NCARP > 0 138 1.72 liamjfoy #include <netinet/ip_carp.h> 139 1.72 liamjfoy #endif 140 1.72 liamjfoy 141 1.98 degroote #include "pfsync.h" 142 1.98 degroote #if NPFSYNC > 0 143 1.98 degroote #include <net/pfvar.h> 144 1.98 degroote #include <net/if_pfsync.h> 145 1.98 degroote #endif 146 1.98 degroote 147 1.66 matt DOMAIN_DEFINE(inetdomain); /* forward declare and add to link set */ 148 1.66 matt 149 1.94 ad /* Wrappers to acquire kernel_lock. */ 150 1.94 ad 151 1.94 ad PR_WRAP_CTLINPUT(rip_ctlinput) 152 1.94 ad PR_WRAP_CTLINPUT(udp_ctlinput) 153 1.94 ad PR_WRAP_CTLINPUT(tcp_ctlinput) 154 1.94 ad 155 1.94 ad #define rip_ctlinput rip_ctlinput_wrapper 156 1.94 ad #define udp_ctlinput udp_ctlinput_wrapper 157 1.94 ad #define tcp_ctlinput tcp_ctlinput_wrapper 158 1.94 ad 159 1.94 ad PR_WRAP_CTLOUTPUT(rip_ctloutput) 160 1.94 ad PR_WRAP_CTLOUTPUT(udp_ctloutput) 161 1.94 ad PR_WRAP_CTLOUTPUT(tcp_ctloutput) 162 1.94 ad 163 1.94 ad #define rip_ctloutput rip_ctloutput_wrapper 164 1.94 ad #define udp_ctloutput udp_ctloutput_wrapper 165 1.94 ad #define tcp_ctloutput tcp_ctloutput_wrapper 166 1.94 ad 167 1.111 rjs #ifdef DCCP 168 1.111 rjs PR_WRAP_CTLINPUT(dccp_ctlinput) 169 1.111 rjs PR_WRAP_CTLOUTPUT(dccp_ctloutput) 170 1.111 rjs 171 1.111 rjs #define dccp_ctlinput dccp_ctlinput_wrapper 172 1.111 rjs #define dccp_ctloutput dccp_ctloutput_wrapper 173 1.111 rjs #endif 174 1.111 rjs 175 1.115 rjs #ifdef SCTP 176 1.115 rjs PR_WRAP_CTLINPUT(sctp_ctlinput) 177 1.115 rjs PR_WRAP_CTLOUTPUT(sctp_ctloutput) 178 1.115 rjs 179 1.115 rjs #define sctp_ctlinput sctp_ctlinput_wrapper 180 1.115 rjs #define sctp_ctloutput sctp_ctloutput_wrapper 181 1.115 rjs #endif 182 1.115 rjs 183 1.125 ozaki #ifdef NET_MPSAFE 184 1.125 ozaki PR_WRAP_INPUT(udp_input) 185 1.125 ozaki PR_WRAP_INPUT(tcp_input) 186 1.125 ozaki #ifdef DCCP 187 1.125 ozaki PR_WRAP_INPUT(dccp_input) 188 1.125 ozaki #endif 189 1.125 ozaki #ifdef SCTP 190 1.125 ozaki PR_WRAP_INPUT(sctp_input) 191 1.125 ozaki #endif 192 1.125 ozaki PR_WRAP_INPUT(rip_input) 193 1.125 ozaki #if NPFSYNC > 0 194 1.125 ozaki PR_WRAP_INPUT(pfsync_input) 195 1.125 ozaki #endif 196 1.125 ozaki PR_WRAP_INPUT(igmp_input) 197 1.125 ozaki #ifdef PIM 198 1.125 ozaki PR_WRAP_INPUT(pim_input) 199 1.125 ozaki #endif 200 1.125 ozaki 201 1.125 ozaki #define udp_input udp_input_wrapper 202 1.125 ozaki #define tcp_input tcp_input_wrapper 203 1.125 ozaki #define dccp_input dccp_input_wrapper 204 1.125 ozaki #define sctp_input sctp_input_wrapper 205 1.125 ozaki #define rip_input rip_input_wrapper 206 1.125 ozaki #define pfsync_input pfsync_input_wrapper 207 1.125 ozaki #define igmp_input igmp_input_wrapper 208 1.125 ozaki #define pim_input pim_input_wrapper 209 1.125 ozaki #endif 210 1.125 ozaki 211 1.106 christos #if defined(IPSEC) 212 1.123 ozaki 213 1.123 ozaki #ifdef IPSEC_RUMPKERNEL 214 1.123 ozaki /* 215 1.123 ozaki * .pr_input = ipsec4_common_input won't be resolved on loading 216 1.123 ozaki * the ipsec shared library. We need a wrapper anyway. 217 1.123 ozaki */ 218 1.123 ozaki static void 219 1.130 maxv ipsec4_common_input_wrapper(struct mbuf *m, int off, int proto) 220 1.123 ozaki { 221 1.123 ozaki 222 1.123 ozaki if (ipsec_enabled) { 223 1.130 maxv ipsec4_common_input(m, off, proto); 224 1.123 ozaki } else { 225 1.123 ozaki m_freem(m); 226 1.123 ozaki } 227 1.123 ozaki } 228 1.123 ozaki #define ipsec4_common_input ipsec4_common_input_wrapper 229 1.123 ozaki 230 1.123 ozaki /* The ctlinput functions may not be loaded */ 231 1.123 ozaki #define IPSEC_WRAP_CTLINPUT(name) \ 232 1.123 ozaki static void * \ 233 1.123 ozaki name##_wrapper(int a, const struct sockaddr *b, void *c)\ 234 1.123 ozaki { \ 235 1.123 ozaki void *rv; \ 236 1.123 ozaki KERNEL_LOCK(1, NULL); \ 237 1.123 ozaki if (ipsec_enabled) \ 238 1.123 ozaki rv = name(a, b, c); \ 239 1.123 ozaki else \ 240 1.123 ozaki rv = NULL; \ 241 1.123 ozaki KERNEL_UNLOCK_ONE(NULL); \ 242 1.123 ozaki return rv; \ 243 1.123 ozaki } 244 1.123 ozaki IPSEC_WRAP_CTLINPUT(ah4_ctlinput) 245 1.123 ozaki IPSEC_WRAP_CTLINPUT(esp4_ctlinput) 246 1.123 ozaki 247 1.123 ozaki #else /* !IPSEC_RUMPKERNEL */ 248 1.123 ozaki 249 1.94 ad PR_WRAP_CTLINPUT(ah4_ctlinput) 250 1.123 ozaki PR_WRAP_CTLINPUT(esp4_ctlinput) 251 1.123 ozaki 252 1.123 ozaki #endif /* !IPSEC_RUMPKERNEL */ 253 1.94 ad 254 1.94 ad #define ah4_ctlinput ah4_ctlinput_wrapper 255 1.123 ozaki #define esp4_ctlinput esp4_ctlinput_wrapper 256 1.94 ad 257 1.123 ozaki #endif /* IPSEC */ 258 1.94 ad 259 1.118 riastrad const struct protosw inetsw[] = { 260 1.118 riastrad { .pr_domain = &inetdomain, 261 1.81 liamjfoy .pr_init = ip_init, 262 1.101 dyoung .pr_fasttimo = ip_fasttimo, 263 1.81 liamjfoy .pr_slowtimo = ip_slowtimo, 264 1.101 dyoung .pr_drain = ip_drainstub, 265 1.81 liamjfoy }, 266 1.121 ozaki { .pr_type = SOCK_RAW, 267 1.121 ozaki .pr_domain = &inetdomain, 268 1.121 ozaki .pr_protocol = IPPROTO_ICMP, 269 1.121 ozaki .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 270 1.121 ozaki .pr_input = icmp_input, 271 1.121 ozaki .pr_ctlinput = rip_ctlinput, 272 1.121 ozaki .pr_ctloutput = rip_ctloutput, 273 1.121 ozaki .pr_usrreqs = &rip_usrreqs, 274 1.121 ozaki .pr_init = icmp_init, 275 1.121 ozaki }, 276 1.118 riastrad { .pr_type = SOCK_DGRAM, 277 1.81 liamjfoy .pr_domain = &inetdomain, 278 1.81 liamjfoy .pr_protocol = IPPROTO_UDP, 279 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_PURGEIF, 280 1.118 riastrad .pr_input = udp_input, 281 1.81 liamjfoy .pr_ctlinput = udp_ctlinput, 282 1.81 liamjfoy .pr_ctloutput = udp_ctloutput, 283 1.109 rmind .pr_usrreqs = &udp_usrreqs, 284 1.81 liamjfoy .pr_init = udp_init, 285 1.81 liamjfoy }, 286 1.118 riastrad { .pr_type = SOCK_STREAM, 287 1.81 liamjfoy .pr_domain = &inetdomain, 288 1.81 liamjfoy .pr_protocol = IPPROTO_TCP, 289 1.81 liamjfoy .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_LISTEN|PR_ABRTACPTDIS|PR_PURGEIF, 290 1.118 riastrad .pr_input = tcp_input, 291 1.81 liamjfoy .pr_ctlinput = tcp_ctlinput, 292 1.81 liamjfoy .pr_ctloutput = tcp_ctloutput, 293 1.109 rmind .pr_usrreqs = &tcp_usrreqs, 294 1.81 liamjfoy .pr_init = tcp_init, 295 1.101 dyoung .pr_fasttimo = tcp_fasttimo, 296 1.101 dyoung .pr_drain = tcp_drainstub, 297 1.81 liamjfoy }, 298 1.111 rjs #ifdef DCCP 299 1.118 riastrad { .pr_type = SOCK_CONN_DGRAM, 300 1.111 rjs .pr_domain = &inetdomain, 301 1.111 rjs .pr_protocol = IPPROTO_DCCP, 302 1.111 rjs .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_ATOMIC|PR_LISTEN|PR_ABRTACPTDIS, 303 1.118 riastrad .pr_input = dccp_input, 304 1.111 rjs .pr_ctlinput = dccp_ctlinput, 305 1.111 rjs .pr_ctloutput = dccp_ctloutput, 306 1.111 rjs .pr_usrreqs = &dccp_usrreqs, 307 1.111 rjs .pr_init = dccp_init, 308 1.111 rjs }, 309 1.111 rjs #endif 310 1.115 rjs #ifdef SCTP 311 1.118 riastrad { .pr_type = SOCK_DGRAM, 312 1.115 rjs .pr_domain = &inetdomain, 313 1.115 rjs .pr_protocol = IPPROTO_SCTP, 314 1.115 rjs .pr_flags = PR_ADDR_OPT|PR_WANTRCVD, 315 1.118 riastrad .pr_input = sctp_input, 316 1.115 rjs .pr_ctlinput = sctp_ctlinput, 317 1.115 rjs .pr_ctloutput = sctp_ctloutput, 318 1.115 rjs .pr_usrreqs = &sctp_usrreqs, 319 1.115 rjs .pr_init = sctp_init, 320 1.115 rjs .pr_drain = sctp_drain 321 1.115 rjs }, 322 1.118 riastrad { .pr_type = SOCK_SEQPACKET, 323 1.115 rjs .pr_domain = &inetdomain, 324 1.115 rjs .pr_protocol = IPPROTO_SCTP, 325 1.115 rjs .pr_flags = PR_ADDR_OPT|PR_WANTRCVD, 326 1.118 riastrad .pr_input = sctp_input, 327 1.115 rjs .pr_ctlinput = sctp_ctlinput, 328 1.115 rjs .pr_ctloutput = sctp_ctloutput, 329 1.115 rjs .pr_usrreqs = &sctp_usrreqs, 330 1.115 rjs .pr_drain = sctp_drain 331 1.115 rjs }, 332 1.118 riastrad { .pr_type = SOCK_STREAM, 333 1.115 rjs .pr_domain = &inetdomain, 334 1.115 rjs .pr_protocol = IPPROTO_SCTP, 335 1.115 rjs .pr_flags = PR_CONNREQUIRED|PR_ADDR_OPT|PR_WANTRCVD|PR_LISTEN, 336 1.118 riastrad .pr_input = sctp_input, 337 1.115 rjs .pr_ctlinput = sctp_ctlinput, 338 1.115 rjs .pr_ctloutput = sctp_ctloutput, 339 1.115 rjs .pr_usrreqs = &sctp_usrreqs, 340 1.115 rjs .pr_drain = sctp_drain 341 1.115 rjs }, 342 1.115 rjs #endif /* SCTP */ 343 1.118 riastrad { .pr_type = SOCK_RAW, 344 1.81 liamjfoy .pr_domain = &inetdomain, 345 1.81 liamjfoy .pr_protocol = IPPROTO_RAW, 346 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_PURGEIF, 347 1.118 riastrad .pr_input = rip_input, 348 1.81 liamjfoy .pr_ctlinput = rip_ctlinput, 349 1.81 liamjfoy .pr_ctloutput = rip_ctloutput, 350 1.109 rmind .pr_usrreqs = &rip_usrreqs, 351 1.81 liamjfoy }, 352 1.83 liamjfoy #ifdef GATEWAY 353 1.118 riastrad { .pr_domain = &inetdomain, 354 1.83 liamjfoy .pr_protocol = IPPROTO_IP, 355 1.83 liamjfoy .pr_slowtimo = ipflow_slowtimo, 356 1.96 pooka .pr_init = ipflow_poolinit, 357 1.83 liamjfoy }, 358 1.83 liamjfoy #endif /* GATEWAY */ 359 1.106 christos #ifdef IPSEC 360 1.118 riastrad { .pr_type = SOCK_RAW, 361 1.81 liamjfoy .pr_domain = &inetdomain, 362 1.81 liamjfoy .pr_protocol = IPPROTO_AH, 363 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 364 1.118 riastrad .pr_input = ipsec4_common_input, 365 1.81 liamjfoy .pr_ctlinput = ah4_ctlinput, 366 1.81 liamjfoy }, 367 1.118 riastrad { .pr_type = SOCK_RAW, 368 1.81 liamjfoy .pr_domain = &inetdomain, 369 1.81 liamjfoy .pr_protocol = IPPROTO_ESP, 370 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 371 1.118 riastrad .pr_input = ipsec4_common_input, 372 1.81 liamjfoy .pr_ctlinput = esp4_ctlinput, 373 1.81 liamjfoy }, 374 1.118 riastrad { .pr_type = SOCK_RAW, 375 1.81 liamjfoy .pr_domain = &inetdomain, 376 1.81 liamjfoy .pr_protocol = IPPROTO_IPCOMP, 377 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR, 378 1.118 riastrad .pr_input = ipsec4_common_input, 379 1.61 jonathan }, 380 1.106 christos #endif /* IPSEC */ 381 1.118 riastrad { .pr_type = SOCK_RAW, 382 1.81 liamjfoy .pr_domain = &inetdomain, 383 1.81 liamjfoy .pr_protocol = IPPROTO_IPV4, 384 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 385 1.118 riastrad .pr_input = encap4_input, 386 1.81 liamjfoy .pr_ctlinput = rip_ctlinput, 387 1.81 liamjfoy .pr_ctloutput = rip_ctloutput, 388 1.109 rmind .pr_usrreqs = &rip_usrreqs, 389 1.81 liamjfoy .pr_init = encap_init, 390 1.32 itojun }, 391 1.32 itojun #ifdef INET6 392 1.118 riastrad { .pr_type = SOCK_RAW, 393 1.81 liamjfoy .pr_domain = &inetdomain, 394 1.81 liamjfoy .pr_protocol = IPPROTO_IPV6, 395 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 396 1.118 riastrad .pr_input = encap4_input, 397 1.81 liamjfoy .pr_ctlinput = rip_ctlinput, 398 1.81 liamjfoy .pr_ctloutput = rip_ctloutput, 399 1.109 rmind .pr_usrreqs = &rip_usrreqs, 400 1.81 liamjfoy .pr_init = encap_init, 401 1.32 itojun }, 402 1.32 itojun #endif /* INET6 */ 403 1.72 liamjfoy #if NCARP > 0 404 1.118 riastrad { .pr_type = SOCK_RAW, 405 1.81 liamjfoy .pr_domain = &inetdomain, 406 1.81 liamjfoy .pr_protocol = IPPROTO_CARP, 407 1.127 maxv .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 408 1.118 riastrad .pr_input = carp_proto_input, 409 1.81 liamjfoy .pr_ctloutput = rip_ctloutput, 410 1.109 rmind .pr_usrreqs = &rip_usrreqs, 411 1.99 pooka .pr_init = carp_init, 412 1.72 liamjfoy }, 413 1.81 liamjfoy #endif /* NCARP > 0 */ 414 1.122 knakahar { .pr_type = SOCK_RAW, 415 1.122 knakahar .pr_domain = &inetdomain, 416 1.122 knakahar .pr_protocol = IPPROTO_L2TP, 417 1.122 knakahar .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 418 1.122 knakahar .pr_input = encap4_input, 419 1.122 knakahar .pr_ctlinput = rip_ctlinput, 420 1.122 knakahar .pr_ctloutput = rip_ctloutput, 421 1.122 knakahar .pr_usrreqs = &rip_usrreqs, /*XXX*/ 422 1.122 knakahar .pr_init = encap_init, 423 1.122 knakahar }, 424 1.98 degroote #if NPFSYNC > 0 425 1.118 riastrad { .pr_type = SOCK_RAW, 426 1.98 degroote .pr_domain = &inetdomain, 427 1.98 degroote .pr_protocol = IPPROTO_PFSYNC, 428 1.127 maxv .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 429 1.118 riastrad .pr_input = pfsync_input, 430 1.98 degroote .pr_ctloutput = rip_ctloutput, 431 1.109 rmind .pr_usrreqs = &rip_usrreqs, 432 1.98 degroote }, 433 1.98 degroote #endif /* NPFSYNC > 0 */ 434 1.118 riastrad { .pr_type = SOCK_RAW, 435 1.81 liamjfoy .pr_domain = &inetdomain, 436 1.81 liamjfoy .pr_protocol = IPPROTO_IGMP, 437 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 438 1.118 riastrad .pr_input = igmp_input, 439 1.81 liamjfoy .pr_ctloutput = rip_ctloutput, 440 1.81 liamjfoy .pr_ctlinput = rip_ctlinput, 441 1.109 rmind .pr_usrreqs = &rip_usrreqs, 442 1.81 liamjfoy .pr_fasttimo = igmp_fasttimo, 443 1.81 liamjfoy .pr_slowtimo = igmp_slowtimo, 444 1.92 thorpej .pr_init = igmp_init, 445 1.1 cgd }, 446 1.65 manu #ifdef PIM 447 1.118 riastrad { .pr_type = SOCK_RAW, 448 1.81 liamjfoy .pr_domain = &inetdomain, 449 1.81 liamjfoy .pr_protocol = IPPROTO_PIM, 450 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 451 1.118 riastrad .pr_input = pim_input, 452 1.81 liamjfoy .pr_ctloutput = rip_ctloutput, 453 1.81 liamjfoy .pr_ctlinput = rip_ctlinput, 454 1.109 rmind .pr_usrreqs = &rip_usrreqs, 455 1.65 manu }, 456 1.65 manu #endif /* PIM */ 457 1.11 mycroft /* raw wildcard */ 458 1.118 riastrad { .pr_type = SOCK_RAW, 459 1.81 liamjfoy .pr_domain = &inetdomain, 460 1.81 liamjfoy .pr_flags = PR_ATOMIC|PR_ADDR|PR_LASTHDR, 461 1.118 riastrad .pr_input = rip_input, 462 1.81 liamjfoy .pr_ctloutput = rip_ctloutput, 463 1.81 liamjfoy .pr_ctlinput = rip_ctlinput, 464 1.109 rmind .pr_usrreqs = &rip_usrreqs, 465 1.81 liamjfoy .pr_init = rip_init, 466 1.1 cgd }, 467 1.1 cgd }; 468 1.1 cgd 469 1.89 dyoung const struct sockaddr_in in_any = { 470 1.89 dyoung .sin_len = sizeof(struct sockaddr_in) 471 1.89 dyoung , .sin_family = AF_INET 472 1.89 dyoung , .sin_port = 0 473 1.90 dyoung , .sin_addr = {.s_addr = 0 /* INADDR_ANY */} 474 1.89 dyoung }; 475 1.89 dyoung 476 1.73 matt struct domain inetdomain = { 477 1.80 dyoung .dom_family = PF_INET, .dom_name = "internet", .dom_init = NULL, 478 1.80 dyoung .dom_externalize = NULL, .dom_dispose = NULL, 479 1.118 riastrad .dom_protosw = inetsw, 480 1.118 riastrad .dom_protoswNPROTOSW = &inetsw[__arraycount(inetsw)], 481 1.100 dyoung .dom_rtattach = rt_inithead, 482 1.95 pooka .dom_rtoffset = 32, 483 1.95 pooka .dom_maxrtkey = sizeof(struct ip_pack4), 484 1.112 roy .dom_if_up = in_if_up, 485 1.112 roy .dom_if_down = in_if_down, 486 1.80 dyoung .dom_ifattach = in_domifattach, 487 1.80 dyoung .dom_ifdetach = in_domifdetach, 488 1.112 roy .dom_if_link_state_change = in_if_link_state_change, 489 1.80 dyoung .dom_link = { NULL }, 490 1.80 dyoung .dom_mowner = MOWNER_INIT("",""), 491 1.86 dyoung .dom_sa_cmpofs = offsetof(struct sockaddr_in, sin_addr), 492 1.86 dyoung .dom_sa_cmplen = sizeof(struct in_addr), 493 1.89 dyoung .dom_sa_any = (const struct sockaddr *)&in_any, 494 1.89 dyoung .dom_sockaddr_const_addr = sockaddr_in_const_addr, 495 1.89 dyoung .dom_sockaddr_addr = sockaddr_in_addr, 496 1.73 matt }; 497 1.38 darrenr 498 1.38 darrenr u_char ip_protox[IPPROTO_MAX]; 499 1.36 thorpej 500 1.89 dyoung static void 501 1.89 dyoung sockaddr_in_addrlen(const struct sockaddr *sa, socklen_t *slenp) 502 1.89 dyoung { 503 1.89 dyoung socklen_t slen; 504 1.89 dyoung 505 1.89 dyoung if (slenp == NULL) 506 1.89 dyoung return; 507 1.89 dyoung 508 1.89 dyoung slen = sockaddr_getlen(sa); 509 1.89 dyoung *slenp = (socklen_t)MIN(sizeof(struct in_addr), 510 1.89 dyoung slen - MIN(slen, offsetof(struct sockaddr_in, sin_addr))); 511 1.89 dyoung } 512 1.89 dyoung 513 1.89 dyoung const void * 514 1.89 dyoung sockaddr_in_const_addr(const struct sockaddr *sa, socklen_t *slenp) 515 1.89 dyoung { 516 1.89 dyoung const struct sockaddr_in *sin; 517 1.89 dyoung 518 1.89 dyoung sockaddr_in_addrlen(sa, slenp); 519 1.89 dyoung sin = (const struct sockaddr_in *)sa; 520 1.89 dyoung return &sin->sin_addr; 521 1.89 dyoung } 522 1.89 dyoung 523 1.89 dyoung void * 524 1.89 dyoung sockaddr_in_addr(struct sockaddr *sa, socklen_t *slenp) 525 1.89 dyoung { 526 1.89 dyoung struct sockaddr_in *sin; 527 1.89 dyoung 528 1.89 dyoung sockaddr_in_addrlen(sa, slenp); 529 1.89 dyoung sin = (struct sockaddr_in *)sa; 530 1.89 dyoung return &sin->sin_addr; 531 1.89 dyoung } 532 1.89 dyoung 533 1.84 dyoung int 534 1.84 dyoung sockaddr_in_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2) 535 1.84 dyoung { 536 1.84 dyoung uint_fast8_t len; 537 1.84 dyoung const uint_fast8_t addrofs = offsetof(struct sockaddr_in, sin_addr), 538 1.84 dyoung addrend = addrofs + sizeof(struct in_addr); 539 1.84 dyoung int rc; 540 1.84 dyoung const struct sockaddr_in *sin1, *sin2; 541 1.84 dyoung 542 1.84 dyoung sin1 = satocsin(sa1); 543 1.84 dyoung sin2 = satocsin(sa2); 544 1.84 dyoung 545 1.84 dyoung len = MIN(addrend, MIN(sin1->sin_len, sin2->sin_len)); 546 1.84 dyoung 547 1.84 dyoung if (len > addrofs && 548 1.84 dyoung (rc = memcmp(&sin1->sin_addr, &sin2->sin_addr, 549 1.84 dyoung len - addrofs)) != 0) 550 1.84 dyoung return rc; 551 1.84 dyoung 552 1.84 dyoung return sin1->sin_len - sin2->sin_len; 553 1.84 dyoung } 554