1 1.56 andvar /* $NetBSD: ipsec_netbsd.c,v 1.56 2025/02/26 04:49:46 andvar Exp $ */ 2 1.1 jonathan /* $KAME: esp_input.c,v 1.60 2001/09/04 08:43:19 itojun Exp $ */ 3 1.1 jonathan /* $KAME: ah_input.c,v 1.64 2001/09/04 08:43:19 itojun Exp $ */ 4 1.1 jonathan 5 1.1 jonathan /* 6 1.1 jonathan * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 7 1.1 jonathan * All rights reserved. 8 1.1 jonathan * 9 1.1 jonathan * Redistribution and use in source and binary forms, with or without 10 1.1 jonathan * modification, are permitted provided that the following conditions 11 1.1 jonathan * are met: 12 1.1 jonathan * 1. Redistributions of source code must retain the above copyright 13 1.1 jonathan * notice, this list of conditions and the following disclaimer. 14 1.1 jonathan * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 jonathan * notice, this list of conditions and the following disclaimer in the 16 1.1 jonathan * documentation and/or other materials provided with the distribution. 17 1.1 jonathan * 3. Neither the name of the project nor the names of its contributors 18 1.1 jonathan * may be used to endorse or promote products derived from this software 19 1.1 jonathan * without specific prior written permission. 20 1.1 jonathan * 21 1.1 jonathan * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 22 1.1 jonathan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 1.1 jonathan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 1.1 jonathan * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 25 1.1 jonathan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 1.1 jonathan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 1.1 jonathan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 1.1 jonathan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 1.1 jonathan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 1.1 jonathan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 1.1 jonathan * SUCH DAMAGE. 32 1.1 jonathan */ 33 1.1 jonathan 34 1.1 jonathan #include <sys/cdefs.h> 35 1.56 andvar __KERNEL_RCSID(0, "$NetBSD: ipsec_netbsd.c,v 1.56 2025/02/26 04:49:46 andvar Exp $"); 36 1.1 jonathan 37 1.40 ozaki #if defined(_KERNEL_OPT) 38 1.1 jonathan #include "opt_inet.h" 39 1.1 jonathan #include "opt_ipsec.h" 40 1.40 ozaki #endif 41 1.1 jonathan 42 1.1 jonathan #include <sys/param.h> 43 1.1 jonathan #include <sys/systm.h> 44 1.1 jonathan #include <sys/mbuf.h> 45 1.1 jonathan #include <sys/domain.h> 46 1.1 jonathan #include <sys/protosw.h> 47 1.1 jonathan #include <sys/socket.h> 48 1.1 jonathan #include <sys/errno.h> 49 1.1 jonathan #include <sys/time.h> 50 1.1 jonathan #include <sys/kernel.h> 51 1.1 jonathan #include <sys/sysctl.h> 52 1.1 jonathan 53 1.1 jonathan #include <net/if.h> 54 1.1 jonathan #include <net/route.h> 55 1.29 ad #include <sys/cpu.h> 56 1.1 jonathan 57 1.1 jonathan #include <netinet/in.h> 58 1.1 jonathan #include <netinet/in_systm.h> 59 1.1 jonathan #include <netinet/in_var.h> 60 1.1 jonathan #include <netinet/ip.h> 61 1.1 jonathan #include <netinet/ip_var.h> 62 1.1 jonathan #include <netinet/ip_ecn.h> 63 1.1 jonathan #include <netinet/ip_icmp.h> 64 1.1 jonathan 65 1.1 jonathan #include <netipsec/ipsec.h> 66 1.10 jonathan #include <netipsec/ipsec_var.h> 67 1.30 thorpej #include <netipsec/ipsec_private.h> 68 1.3 tls #include <netipsec/key.h> 69 1.3 tls #include <netipsec/keydb.h> 70 1.3 tls #include <netipsec/key_debug.h> 71 1.18 degroote #include <netipsec/ah.h> 72 1.1 jonathan #include <netipsec/ah_var.h> 73 1.5 jonathan #include <netipsec/esp.h> 74 1.10 jonathan #include <netipsec/esp_var.h> 75 1.10 jonathan #include <netipsec/ipip_var.h> 76 1.10 jonathan #include <netipsec/ipcomp_var.h> 77 1.5 jonathan 78 1.5 jonathan #ifdef INET6 79 1.5 jonathan #include <netipsec/ipsec6.h> 80 1.5 jonathan #include <netinet6/ip6protosw.h> 81 1.5 jonathan #include <netinet/icmp6.h> 82 1.1 jonathan #endif 83 1.1 jonathan 84 1.3 tls #include <netipsec/key.h> 85 1.1 jonathan 86 1.1 jonathan /* assumes that ip header and ah header are contiguous on mbuf */ 87 1.47 maxv void * 88 1.28 degroote ah4_ctlinput(int cmd, const struct sockaddr *sa, void *v) 89 1.1 jonathan { 90 1.1 jonathan struct ip *ip = v; 91 1.1 jonathan struct ah *ah; 92 1.1 jonathan struct icmp *icp; 93 1.1 jonathan struct secasvar *sav; 94 1.1 jonathan 95 1.1 jonathan if (sa->sa_family != AF_INET || 96 1.47 maxv sa->sa_len != sizeof(struct sockaddr_in)) 97 1.38 msaitoh return NULL; 98 1.1 jonathan if ((unsigned)cmd >= PRC_NCMDS) 99 1.1 jonathan return NULL; 100 1.20 degroote 101 1.1 jonathan if (cmd == PRC_MSGSIZE && ip_mtudisc && ip && ip->ip_v == 4) { 102 1.1 jonathan /* 103 1.1 jonathan * Check to see if we have a valid SA corresponding to 104 1.1 jonathan * the address in the ICMP message payload. 105 1.1 jonathan */ 106 1.23 degroote ah = (struct ah *)((char *)ip + (ip->ip_hl << 2)); 107 1.44 ozaki sav = KEY_LOOKUP_SA((const union sockaddr_union *)sa, 108 1.47 maxv IPPROTO_AH, ah->ah_spi, 0, 0); 109 1.1 jonathan 110 1.20 degroote if (sav) { 111 1.42 ozaki if (SADB_SASTATE_USABLE_P(sav)) { 112 1.20 degroote /* 113 1.47 maxv * Now that we've validated that we are actually 114 1.47 maxv * communicating with the host indicated in the 115 1.47 maxv * ICMP message, locate the ICMP header, 116 1.20 degroote * recalculate the new MTU, and create the 117 1.47 maxv * corresponding routing entry. 118 1.47 maxv */ 119 1.47 maxv icp = (struct icmp *)((char *)ip - 120 1.43 ozaki offsetof(struct icmp, icmp_ip)); 121 1.20 degroote icmp_mtudisc(icp, ip->ip_dst); 122 1.20 degroote } 123 1.45 ozaki KEY_SA_UNREF(&sav); 124 1.20 degroote } 125 1.1 jonathan } 126 1.1 jonathan return NULL; 127 1.1 jonathan } 128 1.1 jonathan 129 1.1 jonathan /* assumes that ip header and esp header are contiguous on mbuf */ 130 1.47 maxv void * 131 1.28 degroote esp4_ctlinput(int cmd, const struct sockaddr *sa, void *v) 132 1.1 jonathan { 133 1.1 jonathan struct ip *ip = v; 134 1.1 jonathan struct esp *esp; 135 1.1 jonathan struct icmp *icp; 136 1.1 jonathan struct secasvar *sav; 137 1.1 jonathan 138 1.1 jonathan if (sa->sa_family != AF_INET || 139 1.1 jonathan sa->sa_len != sizeof(struct sockaddr_in)) 140 1.1 jonathan return NULL; 141 1.1 jonathan if ((unsigned)cmd >= PRC_NCMDS) 142 1.1 jonathan return NULL; 143 1.20 degroote 144 1.1 jonathan if (cmd == PRC_MSGSIZE && ip_mtudisc && ip && ip->ip_v == 4) { 145 1.1 jonathan /* 146 1.1 jonathan * Check to see if we have a valid SA corresponding to 147 1.1 jonathan * the address in the ICMP message payload. 148 1.1 jonathan */ 149 1.23 degroote esp = (struct esp *)((char *)ip + (ip->ip_hl << 2)); 150 1.44 ozaki sav = KEY_LOOKUP_SA((const union sockaddr_union *)sa, 151 1.47 maxv IPPROTO_ESP, esp->esp_spi, 0, 0); 152 1.1 jonathan 153 1.20 degroote if (sav) { 154 1.42 ozaki if (SADB_SASTATE_USABLE_P(sav)) { 155 1.20 degroote /* 156 1.47 maxv * Now that we've validated that we are actually 157 1.47 maxv * communicating with the host indicated in the 158 1.47 maxv * ICMP message, locate the ICMP header, 159 1.20 degroote * recalculate the new MTU, and create the 160 1.47 maxv * corresponding routing entry. 161 1.47 maxv */ 162 1.47 maxv icp = (struct icmp *)((char *)ip - 163 1.43 ozaki offsetof(struct icmp, icmp_ip)); 164 1.20 degroote icmp_mtudisc(icp, ip->ip_dst); 165 1.20 degroote } 166 1.45 ozaki KEY_SA_UNREF(&sav); 167 1.20 degroote } 168 1.1 jonathan } 169 1.1 jonathan return NULL; 170 1.1 jonathan } 171 1.1 jonathan 172 1.1 jonathan #ifdef INET6 173 1.31 degroote void * 174 1.28 degroote ah6_ctlinput(int cmd, const struct sockaddr *sa, void *d) 175 1.18 degroote { 176 1.41 ozaki const struct newah *ahp; 177 1.41 ozaki struct newah ah; 178 1.41 ozaki struct secasvar *sav; 179 1.41 ozaki struct ip6_hdr *ip6; 180 1.41 ozaki struct mbuf *m; 181 1.41 ozaki struct ip6ctlparam *ip6cp = NULL; 182 1.41 ozaki int off; 183 1.41 ozaki 184 1.41 ozaki if (sa->sa_family != AF_INET6 || 185 1.41 ozaki sa->sa_len != sizeof(struct sockaddr_in6)) 186 1.41 ozaki return NULL; 187 1.41 ozaki if ((unsigned)cmd >= PRC_NCMDS) 188 1.41 ozaki return NULL; 189 1.41 ozaki 190 1.41 ozaki /* if the parameter is from icmp6, decode it. */ 191 1.41 ozaki if (d != NULL) { 192 1.41 ozaki ip6cp = (struct ip6ctlparam *)d; 193 1.41 ozaki m = ip6cp->ip6c_m; 194 1.41 ozaki ip6 = ip6cp->ip6c_ip6; 195 1.41 ozaki off = ip6cp->ip6c_off; 196 1.41 ozaki } else { 197 1.41 ozaki m = NULL; 198 1.41 ozaki ip6 = NULL; 199 1.41 ozaki off = 0; 200 1.41 ozaki } 201 1.41 ozaki 202 1.41 ozaki if (ip6) { 203 1.41 ozaki /* check if we can safely examine src and dst ports */ 204 1.41 ozaki if (m->m_pkthdr.len < off + sizeof(ah)) 205 1.41 ozaki return NULL; 206 1.41 ozaki 207 1.41 ozaki if (m->m_len < off + sizeof(ah)) { 208 1.41 ozaki /* 209 1.41 ozaki * this should be rare case, 210 1.41 ozaki * so we compromise on this copy... 211 1.41 ozaki */ 212 1.41 ozaki m_copydata(m, off, sizeof(ah), &ah); 213 1.41 ozaki ahp = &ah; 214 1.41 ozaki } else 215 1.41 ozaki ahp = (struct newah *)(mtod(m, char *) + off); 216 1.41 ozaki 217 1.41 ozaki if (cmd == PRC_MSGSIZE) { 218 1.41 ozaki int valid = 0; 219 1.41 ozaki 220 1.41 ozaki /* 221 1.41 ozaki * Check to see if we have a valid SA corresponding 222 1.41 ozaki * to the address in the ICMP message payload. 223 1.41 ozaki */ 224 1.51 maxv sav = KEY_LOOKUP_SA((const union sockaddr_union *)sa, 225 1.41 ozaki IPPROTO_AH, ahp->ah_spi, 0, 0); 226 1.41 ozaki 227 1.41 ozaki if (sav) { 228 1.42 ozaki if (SADB_SASTATE_USABLE_P(sav)) 229 1.41 ozaki valid++; 230 1.45 ozaki KEY_SA_UNREF(&sav); 231 1.41 ozaki } 232 1.41 ozaki 233 1.41 ozaki /* XXX Further validation? */ 234 1.41 ozaki 235 1.41 ozaki /* 236 1.41 ozaki * Depending on the value of "valid" and routing 237 1.41 ozaki * table size (mtudisc_{hi,lo}wat), we will: 238 1.47 maxv * - recalculate the new MTU and create the 239 1.41 ozaki * corresponding routing entry, or 240 1.41 ozaki * - ignore the MTU change notification. 241 1.41 ozaki */ 242 1.47 maxv icmp6_mtudisc_update((struct ip6ctlparam *)d, valid); 243 1.41 ozaki } 244 1.41 ozaki 245 1.41 ozaki /* we normally notify single pcb here */ 246 1.41 ozaki } else { 247 1.41 ozaki /* we normally notify any pcb here */ 248 1.41 ozaki } 249 1.41 ozaki return NULL; 250 1.18 degroote } 251 1.18 degroote 252 1.31 degroote void * 253 1.28 degroote esp6_ctlinput(int cmd, const struct sockaddr *sa, void *d) 254 1.1 jonathan { 255 1.1 jonathan const struct newesp *espp; 256 1.1 jonathan struct newesp esp; 257 1.1 jonathan struct ip6ctlparam *ip6cp = NULL, ip6cp1; 258 1.1 jonathan struct secasvar *sav; 259 1.1 jonathan struct ip6_hdr *ip6; 260 1.1 jonathan struct mbuf *m; 261 1.1 jonathan int off; 262 1.1 jonathan 263 1.1 jonathan if (sa->sa_family != AF_INET6 || 264 1.1 jonathan sa->sa_len != sizeof(struct sockaddr_in6)) 265 1.31 degroote return NULL; 266 1.1 jonathan if ((unsigned)cmd >= PRC_NCMDS) 267 1.31 degroote return NULL; 268 1.1 jonathan 269 1.1 jonathan /* if the parameter is from icmp6, decode it. */ 270 1.1 jonathan if (d != NULL) { 271 1.1 jonathan ip6cp = (struct ip6ctlparam *)d; 272 1.1 jonathan m = ip6cp->ip6c_m; 273 1.1 jonathan ip6 = ip6cp->ip6c_ip6; 274 1.1 jonathan off = ip6cp->ip6c_off; 275 1.1 jonathan } else { 276 1.1 jonathan m = NULL; 277 1.1 jonathan ip6 = NULL; 278 1.7 jonathan off = 0; 279 1.1 jonathan } 280 1.1 jonathan 281 1.1 jonathan if (ip6) { 282 1.1 jonathan /* 283 1.1 jonathan * Notify the error to all possible sockets via pfctlinput2. 284 1.1 jonathan * Since the upper layer information (such as protocol type, 285 1.1 jonathan * source and destination ports) is embedded in the encrypted 286 1.1 jonathan * data and might have been cut, we can't directly call 287 1.1 jonathan * an upper layer ctlinput function. However, the pcbnotify 288 1.1 jonathan * function will consider source and destination addresses 289 1.1 jonathan * as well as the flow info value, and may be able to find 290 1.1 jonathan * some PCB that should be notified. 291 1.1 jonathan * Although pfctlinput2 will call esp6_ctlinput(), there is 292 1.1 jonathan * no possibility of an infinite loop of function calls, 293 1.1 jonathan * because we don't pass the inner IPv6 header. 294 1.1 jonathan */ 295 1.20 degroote memset(&ip6cp1, 0, sizeof(ip6cp1)); 296 1.1 jonathan ip6cp1.ip6c_src = ip6cp->ip6c_src; 297 1.24 degroote pfctlinput2(cmd, sa, &ip6cp1); 298 1.1 jonathan 299 1.1 jonathan /* check if we can safely examine src and dst ports */ 300 1.1 jonathan if (m->m_pkthdr.len < off + sizeof(esp)) 301 1.31 degroote return NULL; 302 1.1 jonathan 303 1.1 jonathan if (m->m_len < off + sizeof(esp)) { 304 1.1 jonathan /* 305 1.1 jonathan * this should be rare case, 306 1.1 jonathan * so we compromise on this copy... 307 1.1 jonathan */ 308 1.24 degroote m_copydata(m, off, sizeof(esp), &esp); 309 1.1 jonathan espp = &esp; 310 1.1 jonathan } else 311 1.51 maxv espp = (struct newesp *)(mtod(m, char *) + off); 312 1.1 jonathan 313 1.1 jonathan if (cmd == PRC_MSGSIZE) { 314 1.1 jonathan int valid = 0; 315 1.1 jonathan 316 1.1 jonathan /* 317 1.1 jonathan * Check to see if we have a valid SA corresponding to 318 1.1 jonathan * the address in the ICMP message payload. 319 1.1 jonathan */ 320 1.19 degroote 321 1.51 maxv sav = KEY_LOOKUP_SA((const union sockaddr_union *)sa, 322 1.47 maxv IPPROTO_ESP, espp->esp_spi, 0, 0); 323 1.7 jonathan 324 1.1 jonathan if (sav) { 325 1.42 ozaki if (SADB_SASTATE_USABLE_P(sav)) 326 1.1 jonathan valid++; 327 1.45 ozaki KEY_SA_UNREF(&sav); 328 1.1 jonathan } 329 1.1 jonathan 330 1.1 jonathan /* XXX Further validation? */ 331 1.1 jonathan 332 1.1 jonathan /* 333 1.1 jonathan * Depending on the value of "valid" and routing table 334 1.1 jonathan * size (mtudisc_{hi,lo}wat), we will: 335 1.56 andvar * - recalculate the new MTU and create the 336 1.1 jonathan * corresponding routing entry, or 337 1.1 jonathan * - ignore the MTU change notification. 338 1.1 jonathan */ 339 1.1 jonathan icmp6_mtudisc_update((struct ip6ctlparam *)d, valid); 340 1.1 jonathan } 341 1.1 jonathan } else { 342 1.1 jonathan /* we normally notify any pcb here */ 343 1.1 jonathan } 344 1.31 degroote return NULL; 345 1.1 jonathan } 346 1.1 jonathan #endif /* INET6 */ 347 1.1 jonathan 348 1.4 atatat static int 349 1.35 christos sysctl_ipsec(SYSCTLFN_ARGS) 350 1.1 jonathan { 351 1.4 atatat int error, t; 352 1.4 atatat struct sysctlnode node; 353 1.4 atatat 354 1.4 atatat node = *rnode; 355 1.51 maxv t = *(int *)rnode->sysctl_data; 356 1.4 atatat node.sysctl_data = &t; 357 1.4 atatat error = sysctl_lookup(SYSCTLFN_CALL(&node)); 358 1.4 atatat if (error || newp == NULL) 359 1.51 maxv return error; 360 1.1 jonathan 361 1.4 atatat switch (rnode->sysctl_num) { 362 1.1 jonathan case IPSECCTL_DEF_ESP_TRANSLEV: 363 1.1 jonathan case IPSECCTL_DEF_ESP_NETLEV: 364 1.1 jonathan case IPSECCTL_DEF_AH_TRANSLEV: 365 1.1 jonathan case IPSECCTL_DEF_AH_NETLEV: 366 1.13 perry if (t != IPSEC_LEVEL_USE && 367 1.4 atatat t != IPSEC_LEVEL_REQUIRE) 368 1.51 maxv return EINVAL; 369 1.4 atatat ipsec_invalpcbcacheall(); 370 1.1 jonathan break; 371 1.47 maxv case IPSECCTL_DEF_POLICY: 372 1.4 atatat if (t != IPSEC_POLICY_DISCARD && 373 1.4 atatat t != IPSEC_POLICY_NONE) 374 1.51 maxv return EINVAL; 375 1.4 atatat ipsec_invalpcbcacheall(); 376 1.1 jonathan break; 377 1.4 atatat default: 378 1.51 maxv return EINVAL; 379 1.1 jonathan } 380 1.1 jonathan 381 1.51 maxv *(int *)rnode->sysctl_data = t; 382 1.4 atatat 383 1.51 maxv return 0; 384 1.4 atatat } 385 1.4 atatat 386 1.16 rpaulo #ifdef IPSEC_DEBUG 387 1.16 rpaulo static int 388 1.35 christos sysctl_ipsec_test(SYSCTLFN_ARGS) 389 1.16 rpaulo { 390 1.16 rpaulo int t, error; 391 1.16 rpaulo struct sysctlnode node; 392 1.16 rpaulo 393 1.38 msaitoh node = *rnode; 394 1.51 maxv t = *(int *)rnode->sysctl_data; 395 1.16 rpaulo node.sysctl_data = &t; 396 1.16 rpaulo error = sysctl_lookup(SYSCTLFN_CALL(&node)); 397 1.16 rpaulo if (error || newp == NULL) 398 1.51 maxv return error; 399 1.16 rpaulo 400 1.16 rpaulo if (t < 0 || t > 1) 401 1.16 rpaulo return EINVAL; 402 1.16 rpaulo 403 1.16 rpaulo if (rnode->sysctl_data == &ipsec_replay) 404 1.35 christos printf("ipsec: Anti-Replay service %s\n", 405 1.16 rpaulo (t == 1) ? "deactivated" : "activated"); 406 1.16 rpaulo else if (rnode->sysctl_data == &ipsec_integrity) 407 1.35 christos printf("ipsec: HMAC corruption %s\n", 408 1.16 rpaulo (t == 0) ? "deactivated" : "activated"); 409 1.16 rpaulo 410 1.51 maxv *(int *)rnode->sysctl_data = t; 411 1.16 rpaulo 412 1.16 rpaulo return 0; 413 1.16 rpaulo } 414 1.16 rpaulo #endif 415 1.16 rpaulo 416 1.30 thorpej static int 417 1.35 christos sysctl_net_inet_ipsec_stats(SYSCTLFN_ARGS) 418 1.30 thorpej { 419 1.30 thorpej 420 1.32 thorpej return (NETSTAT_SYSCTL(ipsecstat_percpu, IPSEC_NSTATS)); 421 1.30 thorpej } 422 1.30 thorpej 423 1.30 thorpej static int 424 1.30 thorpej sysctl_net_inet_ah_stats(SYSCTLFN_ARGS) 425 1.30 thorpej { 426 1.30 thorpej 427 1.32 thorpej return (NETSTAT_SYSCTL(ahstat_percpu, AH_NSTATS)); 428 1.30 thorpej } 429 1.30 thorpej 430 1.30 thorpej static int 431 1.30 thorpej sysctl_net_inet_esp_stats(SYSCTLFN_ARGS) 432 1.30 thorpej { 433 1.30 thorpej 434 1.32 thorpej return (NETSTAT_SYSCTL(espstat_percpu, ESP_NSTATS)); 435 1.30 thorpej } 436 1.30 thorpej 437 1.30 thorpej static int 438 1.30 thorpej sysctl_net_inet_ipcomp_stats(SYSCTLFN_ARGS) 439 1.30 thorpej { 440 1.30 thorpej 441 1.32 thorpej return (NETSTAT_SYSCTL(ipcompstat_percpu, IPCOMP_NSTATS)); 442 1.30 thorpej } 443 1.30 thorpej 444 1.30 thorpej static int 445 1.30 thorpej sysctl_net_inet_ipip_stats(SYSCTLFN_ARGS) 446 1.30 thorpej { 447 1.30 thorpej 448 1.32 thorpej return (NETSTAT_SYSCTL(ipipstat_percpu, IPIP_NSTATS)); 449 1.30 thorpej } 450 1.30 thorpej 451 1.37 christos static int 452 1.37 christos sysctl_net_ipsec_enabled(SYSCTLFN_ARGS) 453 1.37 christos { 454 1.37 christos int newenabled, error; 455 1.37 christos struct sysctlnode node; 456 1.37 christos node = *rnode; 457 1.37 christos node.sysctl_data = &newenabled; 458 1.37 christos 459 1.37 christos newenabled = ipsec_enabled; 460 1.37 christos error = sysctl_lookup(SYSCTLFN_CALL(&node)); 461 1.37 christos if (error || newp == NULL) 462 1.37 christos return error; 463 1.37 christos 464 1.37 christos switch (newenabled) { 465 1.37 christos case 0: 466 1.37 christos if (key_get_used()) 467 1.37 christos return EBUSY; 468 1.37 christos /*FALLTHROUGH*/ 469 1.37 christos case 1: 470 1.37 christos case 2: 471 1.37 christos ipsec_enabled = newenabled; 472 1.37 christos key_update_used(); 473 1.37 christos return 0; 474 1.37 christos default: 475 1.37 christos return EINVAL; 476 1.37 christos } 477 1.37 christos } 478 1.37 christos 479 1.4 atatat /* XXX will need a different oid at parent */ 480 1.40 ozaki void 481 1.40 ozaki sysctl_net_inet_ipsec_setup(struct sysctllog **clog) 482 1.4 atatat { 483 1.14 atatat const struct sysctlnode *_ipsec; 484 1.11 atatat int ipproto_ipsec; 485 1.4 atatat 486 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 487 1.8 atatat CTLFLAG_PERMANENT, 488 1.4 atatat CTLTYPE_NODE, "inet", NULL, 489 1.4 atatat NULL, 0, NULL, 0, 490 1.4 atatat CTL_NET, PF_INET, CTL_EOL); 491 1.10 jonathan 492 1.11 atatat /* 493 1.11 atatat * in numerical order: 494 1.11 atatat * 495 1.11 atatat * net.inet.ipip: CTL_NET.PF_INET.IPPROTO_IPIP 496 1.11 atatat * net.inet.esp: CTL_NET.PF_INET.IPPROTO_ESP 497 1.11 atatat * net.inet.ah: CTL_NET.PF_INET.IPPROTO_AH 498 1.11 atatat * net.inet.ipcomp: CTL_NET.PF_INET.IPPROTO_IPCOMP 499 1.11 atatat * net.inet.ipsec: CTL_NET.PF_INET.CTL_CREATE 500 1.11 atatat * 501 1.11 atatat * this creates separate trees by name, but maintains that the 502 1.11 atatat * ipsec name leads to all the old leaves. 503 1.11 atatat */ 504 1.11 atatat 505 1.11 atatat /* create net.inet.ipip */ 506 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 507 1.8 atatat CTLFLAG_PERMANENT, 508 1.11 atatat CTLTYPE_NODE, "ipip", NULL, 509 1.4 atatat NULL, 0, NULL, 0, 510 1.11 atatat CTL_NET, PF_INET, IPPROTO_IPIP, CTL_EOL); 511 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 512 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READONLY, 513 1.11 atatat CTLTYPE_STRUCT, "ipip_stats", NULL, 514 1.30 thorpej sysctl_net_inet_ipip_stats, 0, NULL, 0, 515 1.11 atatat CTL_NET, PF_INET, IPPROTO_IPIP, 516 1.11 atatat CTL_CREATE, CTL_EOL); 517 1.4 atatat 518 1.11 atatat /* create net.inet.esp subtree under IPPROTO_ESP */ 519 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 520 1.11 atatat CTLFLAG_PERMANENT, 521 1.11 atatat CTLTYPE_NODE, "esp", NULL, 522 1.11 atatat NULL, 0, NULL, 0, 523 1.11 atatat CTL_NET, PF_INET, IPPROTO_ESP, CTL_EOL); 524 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 525 1.10 jonathan CTLFLAG_PERMANENT|CTLFLAG_READONLY, 526 1.11 atatat CTLTYPE_STRUCT, "esp_stats", NULL, 527 1.30 thorpej sysctl_net_inet_esp_stats, 0, NULL, 0, 528 1.11 atatat CTL_NET, PF_INET, IPPROTO_ESP, 529 1.11 atatat CTL_CREATE, CTL_EOL); 530 1.10 jonathan 531 1.11 atatat /* create net.inet.ah subtree under IPPROTO_AH */ 532 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 533 1.11 atatat CTLFLAG_PERMANENT, 534 1.11 atatat CTLTYPE_NODE, "ah", NULL, 535 1.11 atatat NULL, 0, NULL, 0, 536 1.11 atatat CTL_NET, PF_INET, IPPROTO_AH, CTL_EOL); 537 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 538 1.10 jonathan CTLFLAG_PERMANENT|CTLFLAG_READONLY, 539 1.11 atatat CTLTYPE_STRUCT, "ah_stats", NULL, 540 1.30 thorpej sysctl_net_inet_ah_stats, 0, NULL, 0, 541 1.11 atatat CTL_NET, PF_INET, IPPROTO_AH, 542 1.11 atatat CTL_CREATE, CTL_EOL); 543 1.10 jonathan 544 1.10 jonathan /* create net.inet.ipcomp */ 545 1.10 jonathan sysctl_createv(clog, 0, NULL, NULL, 546 1.10 jonathan CTLFLAG_PERMANENT, 547 1.10 jonathan CTLTYPE_NODE, "ipcomp", NULL, 548 1.10 jonathan NULL, 0, NULL, 0, 549 1.10 jonathan CTL_NET, PF_INET, IPPROTO_IPCOMP, CTL_EOL); 550 1.10 jonathan sysctl_createv(clog, 0, NULL, NULL, 551 1.10 jonathan CTLFLAG_PERMANENT|CTLFLAG_READONLY, 552 1.11 atatat CTLTYPE_STRUCT, "ipcomp_stats", NULL, 553 1.30 thorpej sysctl_net_inet_ipcomp_stats, 0, NULL, 0, 554 1.10 jonathan CTL_NET, PF_INET, IPPROTO_IPCOMP, 555 1.11 atatat CTL_CREATE, CTL_EOL); 556 1.10 jonathan 557 1.11 atatat /* create net.inet.ipsec subtree under dynamic oid */ 558 1.11 atatat sysctl_createv(clog, 0, NULL, &_ipsec, 559 1.10 jonathan CTLFLAG_PERMANENT, 560 1.10 jonathan CTLTYPE_NODE, "ipsec", NULL, 561 1.10 jonathan NULL, 0, NULL, 0, 562 1.11 atatat CTL_NET, PF_INET, CTL_CREATE, CTL_EOL); 563 1.11 atatat ipproto_ipsec = (_ipsec != NULL) ? _ipsec->sysctl_num : 0; 564 1.10 jonathan 565 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 566 1.8 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 567 1.10 jonathan CTLTYPE_INT, "def_policy", NULL, 568 1.35 christos sysctl_ipsec, 0, &ip4_def_policy.policy, 0, 569 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 570 1.10 jonathan IPSECCTL_DEF_POLICY, CTL_EOL); 571 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 572 1.8 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 573 1.11 atatat CTLTYPE_INT, "esp_trans_deflev", NULL, 574 1.35 christos sysctl_ipsec, 0, &ip4_esp_trans_deflev, 0, 575 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 576 1.11 atatat IPSECCTL_DEF_ESP_TRANSLEV, CTL_EOL); 577 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 578 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 579 1.11 atatat CTLTYPE_INT, "esp_net_deflev", NULL, 580 1.35 christos sysctl_ipsec, 0, &ip4_esp_net_deflev, 0, 581 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 582 1.11 atatat IPSECCTL_DEF_ESP_NETLEV, CTL_EOL); 583 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 584 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 585 1.11 atatat CTLTYPE_INT, "ah_trans_deflev", NULL, 586 1.35 christos sysctl_ipsec, 0, &ip4_ah_trans_deflev, 0, 587 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 588 1.11 atatat IPSECCTL_DEF_AH_TRANSLEV, CTL_EOL); 589 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 590 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 591 1.11 atatat CTLTYPE_INT, "ah_net_deflev", NULL, 592 1.35 christos sysctl_ipsec, 0, &ip4_ah_net_deflev, 0, 593 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 594 1.11 atatat IPSECCTL_DEF_AH_NETLEV, CTL_EOL); 595 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 596 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 597 1.11 atatat CTLTYPE_INT, "ah_cleartos", NULL, 598 1.25 degroote NULL, 0, &ip4_ah_cleartos, 0, 599 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 600 1.11 atatat IPSECCTL_AH_CLEARTOS, CTL_EOL); 601 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 602 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 603 1.11 atatat CTLTYPE_INT, "ah_offsetmask", NULL, 604 1.11 atatat NULL, 0, &ip4_ah_offsetmask, 0, 605 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 606 1.11 atatat IPSECCTL_AH_OFFSETMASK, CTL_EOL); 607 1.11 atatat sysctl_createv(clog, 0, NULL, NULL, 608 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 609 1.4 atatat CTLTYPE_INT, "dfbit", NULL, 610 1.4 atatat NULL, 0, &ip4_ipsec_dfbit, 0, 611 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 612 1.4 atatat IPSECCTL_DFBIT, CTL_EOL); 613 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 614 1.8 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 615 1.4 atatat CTLTYPE_INT, "ecn", NULL, 616 1.4 atatat NULL, 0, &ip4_ipsec_ecn, 0, 617 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 618 1.4 atatat IPSECCTL_ECN, CTL_EOL); 619 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 620 1.8 atatat CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 621 1.4 atatat CTLTYPE_INT, "debug", NULL, 622 1.4 atatat NULL, 0, &ipsec_debug, 0, 623 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 624 1.4 atatat IPSECCTL_DEBUG, CTL_EOL); 625 1.8 atatat sysctl_createv(clog, 0, NULL, NULL, 626 1.53 maxv CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 627 1.53 maxv CTLTYPE_INT, "ipip_spoofcheck", NULL, 628 1.53 maxv NULL, 0, &ipip_spoofcheck, 0, 629 1.53 maxv CTL_NET, PF_INET, ipproto_ipsec, 630 1.53 maxv CTL_CREATE, CTL_EOL); 631 1.53 maxv sysctl_createv(clog, 0, NULL, NULL, 632 1.11 atatat CTLFLAG_PERMANENT|CTLFLAG_READONLY, 633 1.11 atatat CTLTYPE_STRUCT, "ipsecstats", NULL, 634 1.35 christos sysctl_net_inet_ipsec_stats, 0, NULL, 0, 635 1.11 atatat CTL_NET, PF_INET, ipproto_ipsec, 636 1.11 atatat CTL_CREATE, CTL_EOL); 637 1.37 christos sysctl_createv(clog, 0, NULL, NULL, 638 1.37 christos CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 639 1.37 christos CTLTYPE_INT, "enabled", 640 1.37 christos SYSCTL_DESCR("Enable IPSec processing"), 641 1.37 christos sysctl_net_ipsec_enabled, 0, NULL, 0, 642 1.37 christos CTL_NET, PF_INET, ipproto_ipsec, 643 1.37 christos CTL_CREATE, CTL_EOL); 644 1.37 christos sysctl_createv(clog, 0, NULL, NULL, 645 1.37 christos CTLFLAG_PERMANENT|CTLFLAG_READONLY, 646 1.37 christos CTLTYPE_INT, "used", 647 1.37 christos SYSCTL_DESCR("Is IPSec active?"), 648 1.37 christos NULL, 0, &ipsec_used, 0, 649 1.37 christos CTL_NET, PF_INET, ipproto_ipsec, 650 1.37 christos CTL_CREATE, CTL_EOL); 651 1.39 knakahar sysctl_createv(clog, 0, NULL, NULL, 652 1.39 knakahar CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 653 1.46 maxv CTLTYPE_INT, "ah_enable", NULL, 654 1.46 maxv NULL, 0, &ah_enable, 0, 655 1.46 maxv CTL_NET, PF_INET, ipproto_ipsec, 656 1.46 maxv CTL_CREATE, CTL_EOL); 657 1.46 maxv sysctl_createv(clog, 0, NULL, NULL, 658 1.46 maxv CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 659 1.46 maxv CTLTYPE_INT, "esp_enable", NULL, 660 1.46 maxv NULL, 0, &esp_enable, 0, 661 1.46 maxv CTL_NET, PF_INET, ipproto_ipsec, 662 1.46 maxv CTL_CREATE, CTL_EOL); 663 1.46 maxv sysctl_createv(clog, 0, NULL, NULL, 664 1.46 maxv CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 665 1.46 maxv CTLTYPE_INT, "ipcomp_enable", NULL, 666 1.46 maxv NULL, 0, &ipcomp_enable, 0, 667 1.46 maxv CTL_NET, PF_INET, ipproto_ipsec, 668 1.46 maxv CTL_CREATE, CTL_EOL); 669 1.46 maxv sysctl_createv(clog, 0, NULL, NULL, 670 1.46 maxv CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 671 1.39 knakahar CTLTYPE_INT, "crypto_support", NULL, 672 1.39 knakahar NULL, 0, &crypto_support, 0, 673 1.39 knakahar CTL_NET, PF_INET, ipproto_ipsec, 674 1.39 knakahar CTL_CREATE, CTL_EOL); 675 1.46 maxv 676 1.16 rpaulo #ifdef IPSEC_DEBUG 677 1.16 rpaulo sysctl_createv(clog, 0, NULL, NULL, 678 1.16 rpaulo CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 679 1.16 rpaulo CTLTYPE_INT, "test_replay", 680 1.16 rpaulo SYSCTL_DESCR("Emulate replay attack"), 681 1.35 christos sysctl_ipsec_test, 0, &ipsec_replay, 0, 682 1.16 rpaulo CTL_NET, PF_INET, ipproto_ipsec, 683 1.16 rpaulo CTL_CREATE, CTL_EOL); 684 1.16 rpaulo sysctl_createv(clog, 0, NULL, NULL, 685 1.16 rpaulo CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 686 1.16 rpaulo CTLTYPE_INT, "test_integrity", 687 1.16 rpaulo SYSCTL_DESCR("Emulate man-in-the-middle attack"), 688 1.35 christos sysctl_ipsec_test, 0, &ipsec_integrity, 0, 689 1.16 rpaulo CTL_NET, PF_INET, ipproto_ipsec, 690 1.16 rpaulo CTL_CREATE, CTL_EOL); 691 1.16 rpaulo #endif 692 1.1 jonathan } 693 1.26 degroote 694 1.26 degroote #ifdef INET6 695 1.40 ozaki void 696 1.40 ozaki sysctl_net_inet6_ipsec6_setup(struct sysctllog **clog) 697 1.26 degroote { 698 1.26 degroote 699 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 700 1.26 degroote CTLFLAG_PERMANENT, 701 1.26 degroote CTLTYPE_NODE, "inet6", NULL, 702 1.26 degroote NULL, 0, NULL, 0, 703 1.26 degroote CTL_NET, PF_INET6, CTL_EOL); 704 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 705 1.26 degroote CTLFLAG_PERMANENT, 706 1.26 degroote CTLTYPE_NODE, "ipsec6", 707 1.26 degroote SYSCTL_DESCR("IPv6 related IPSec settings"), 708 1.26 degroote NULL, 0, NULL, 0, 709 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, CTL_EOL); 710 1.26 degroote 711 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 712 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 713 1.26 degroote CTLTYPE_STRUCT, "stats", 714 1.26 degroote SYSCTL_DESCR("IPSec statistics and counters"), 715 1.35 christos sysctl_net_inet_ipsec_stats, 0, NULL, 0, 716 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 717 1.26 degroote IPSECCTL_STATS, CTL_EOL); 718 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 719 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 720 1.26 degroote CTLTYPE_INT, "def_policy", 721 1.26 degroote SYSCTL_DESCR("Default action for non-IPSec packets"), 722 1.54 maxv sysctl_ipsec, 0, &ip6_def_policy.policy, 0, 723 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 724 1.26 degroote IPSECCTL_DEF_POLICY, CTL_EOL); 725 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 726 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 727 1.26 degroote CTLTYPE_INT, "esp_trans_deflev", 728 1.26 degroote SYSCTL_DESCR("Default required security level for " 729 1.26 degroote "transport mode traffic"), 730 1.35 christos sysctl_ipsec, 0, &ip6_esp_trans_deflev, 0, 731 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 732 1.26 degroote IPSECCTL_DEF_ESP_TRANSLEV, CTL_EOL); 733 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 734 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 735 1.26 degroote CTLTYPE_INT, "esp_net_deflev", 736 1.26 degroote SYSCTL_DESCR("Default required security level for " 737 1.26 degroote "tunneled traffic"), 738 1.35 christos sysctl_ipsec, 0, &ip6_esp_net_deflev, 0, 739 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 740 1.26 degroote IPSECCTL_DEF_ESP_NETLEV, CTL_EOL); 741 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 742 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 743 1.26 degroote CTLTYPE_INT, "ah_trans_deflev", 744 1.26 degroote SYSCTL_DESCR("Default required security level for " 745 1.26 degroote "transport mode headers"), 746 1.35 christos sysctl_ipsec, 0, &ip6_ah_trans_deflev, 0, 747 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 748 1.26 degroote IPSECCTL_DEF_AH_TRANSLEV, CTL_EOL); 749 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 750 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 751 1.26 degroote CTLTYPE_INT, "ah_net_deflev", 752 1.26 degroote SYSCTL_DESCR("Default required security level for " 753 1.26 degroote "tunneled headers"), 754 1.35 christos sysctl_ipsec, 0, &ip6_ah_net_deflev, 0, 755 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 756 1.26 degroote IPSECCTL_DEF_AH_NETLEV, CTL_EOL); 757 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 758 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 759 1.26 degroote CTLTYPE_INT, "ecn", 760 1.26 degroote SYSCTL_DESCR("Behavior of ECN for tunneled traffic"), 761 1.26 degroote NULL, 0, &ip6_ipsec_ecn, 0, 762 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 763 1.26 degroote IPSECCTL_ECN, CTL_EOL); 764 1.26 degroote sysctl_createv(clog, 0, NULL, NULL, 765 1.26 degroote CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 766 1.26 degroote CTLTYPE_INT, "debug", 767 1.26 degroote SYSCTL_DESCR("Enable IPSec debugging output"), 768 1.26 degroote NULL, 0, &ipsec_debug, 0, 769 1.26 degroote CTL_NET, PF_INET6, IPPROTO_AH, 770 1.26 degroote IPSECCTL_DEBUG, CTL_EOL); 771 1.37 christos sysctl_createv(clog, 0, NULL, NULL, 772 1.37 christos CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 773 1.37 christos CTLTYPE_INT, "enabled", 774 1.37 christos SYSCTL_DESCR("Enable IPSec processing"), 775 1.37 christos sysctl_net_ipsec_enabled, 0, NULL, 0, 776 1.37 christos CTL_NET, PF_INET6, IPPROTO_AH, 777 1.37 christos CTL_CREATE, CTL_EOL); 778 1.37 christos sysctl_createv(clog, 0, NULL, NULL, 779 1.37 christos CTLFLAG_PERMANENT|CTLFLAG_READONLY, 780 1.37 christos CTLTYPE_INT, "used", 781 1.37 christos SYSCTL_DESCR("Is IPSec active?"), 782 1.37 christos NULL, 0, &ipsec_used, 0, 783 1.37 christos CTL_NET, PF_INET6, IPPROTO_AH, 784 1.37 christos CTL_CREATE, CTL_EOL); 785 1.26 degroote } 786 1.26 degroote #endif /* INET6 */ 787