1 1.80 ozaki /* $NetBSD: xform_ipip.c,v 1.80 2025/06/11 02:44:13 ozaki-r Exp $ */ 2 1.66 maxv /* $FreeBSD: xform_ipip.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ 3 1.1 jonathan /* $OpenBSD: ip_ipip.c,v 1.25 2002/06/10 18:04:55 itojun Exp $ */ 4 1.1 jonathan 5 1.1 jonathan /* 6 1.1 jonathan * The authors of this code are John Ioannidis (ji (at) tla.org), 7 1.1 jonathan * Angelos D. Keromytis (kermit (at) csd.uch.gr) and 8 1.1 jonathan * Niels Provos (provos (at) physnet.uni-hamburg.de). 9 1.1 jonathan * 10 1.1 jonathan * The original version of this code was written by John Ioannidis 11 1.1 jonathan * for BSD/OS in Athens, Greece, in November 1995. 12 1.1 jonathan * 13 1.1 jonathan * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996, 14 1.1 jonathan * by Angelos D. Keromytis. 15 1.1 jonathan * 16 1.1 jonathan * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis 17 1.1 jonathan * and Niels Provos. 18 1.1 jonathan * 19 1.1 jonathan * Additional features in 1999 by Angelos D. Keromytis. 20 1.1 jonathan * 21 1.1 jonathan * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis, 22 1.1 jonathan * Angelos D. Keromytis and Niels Provos. 23 1.1 jonathan * Copyright (c) 2001, Angelos D. Keromytis. 24 1.1 jonathan * 25 1.1 jonathan * Permission to use, copy, and modify this software with or without fee 26 1.1 jonathan * is hereby granted, provided that this entire notice is included in 27 1.1 jonathan * all copies of any software which is or includes a copy or 28 1.1 jonathan * modification of this software. 29 1.1 jonathan * You may use this code under the GNU public license if you so wish. Please 30 1.1 jonathan * contribute changes back to the authors under this freer than GPL license 31 1.1 jonathan * so that we may further the use of strong encryption without limitations to 32 1.1 jonathan * all. 33 1.1 jonathan * 34 1.1 jonathan * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR 35 1.1 jonathan * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY 36 1.1 jonathan * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE 37 1.1 jonathan * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR 38 1.1 jonathan * PURPOSE. 39 1.1 jonathan */ 40 1.1 jonathan 41 1.1 jonathan #include <sys/cdefs.h> 42 1.80 ozaki __KERNEL_RCSID(0, "$NetBSD: xform_ipip.c,v 1.80 2025/06/11 02:44:13 ozaki-r Exp $"); 43 1.1 jonathan 44 1.43 ozaki #if defined(_KERNEL_OPT) 45 1.1 jonathan #include "opt_inet.h" 46 1.43 ozaki #endif 47 1.1 jonathan 48 1.74 maxv /* 49 1.74 maxv * IP-inside-IP processing. 50 1.74 maxv * 51 1.74 maxv * The input point is encapsw{4,6}, called via the encap callback. The 52 1.74 maxv * output point is ipip_output, called directly. XF_IP4 has no more 53 1.74 maxv * meaning here, ipe4_xformsw is dummy. 54 1.74 maxv */ 55 1.74 maxv 56 1.1 jonathan #include <sys/param.h> 57 1.1 jonathan #include <sys/systm.h> 58 1.1 jonathan #include <sys/mbuf.h> 59 1.1 jonathan #include <sys/kernel.h> 60 1.35 riastrad #include <sys/protosw.h> 61 1.1 jonathan 62 1.1 jonathan #include <net/if.h> 63 1.1 jonathan 64 1.1 jonathan #include <netinet/in.h> 65 1.1 jonathan #include <netinet/in_systm.h> 66 1.1 jonathan #include <netinet/in_var.h> 67 1.1 jonathan #include <netinet/ip.h> 68 1.1 jonathan #include <netinet/ip_ecn.h> 69 1.1 jonathan #include <netinet/ip_var.h> 70 1.1 jonathan #include <netinet/ip_encap.h> 71 1.1 jonathan 72 1.1 jonathan #include <netipsec/ipsec.h> 73 1.22 thorpej #include <netipsec/ipsec_private.h> 74 1.1 jonathan #include <netipsec/xform.h> 75 1.1 jonathan 76 1.1 jonathan #include <netipsec/ipip_var.h> 77 1.1 jonathan 78 1.1 jonathan #ifdef INET6 79 1.1 jonathan #include <netinet/ip6.h> 80 1.1 jonathan #include <netipsec/ipsec6.h> 81 1.1 jonathan #include <netinet6/in6_var.h> 82 1.35 riastrad #include <netinet6/ip6protosw.h> 83 1.1 jonathan #endif 84 1.1 jonathan 85 1.5 tls #include <netipsec/key.h> 86 1.5 tls #include <netipsec/key_debug.h> 87 1.1 jonathan 88 1.59 maxv /* XXX IPCOMP */ 89 1.68 maxv #define M_IPSEC (M_AUTHIPHDR|M_DECRYPTED) 90 1.1 jonathan 91 1.67 maxv int ipip_spoofcheck = 1; 92 1.22 thorpej percpu_t *ipipstat_percpu; 93 1.1 jonathan 94 1.65 maxv static void _ipip_input(struct mbuf *, int); 95 1.1 jonathan 96 1.1 jonathan #ifdef INET6 97 1.71 maxv static int 98 1.55 knakahar ip4_input6(struct mbuf **m, int *offp, int proto, void *eparg __unused) 99 1.1 jonathan { 100 1.65 maxv _ipip_input(*m, *offp); 101 1.1 jonathan return IPPROTO_DONE; 102 1.1 jonathan } 103 1.59 maxv #endif 104 1.1 jonathan 105 1.1 jonathan #ifdef INET 106 1.71 maxv static void 107 1.55 knakahar ip4_input(struct mbuf *m, int off, int proto, void *eparg __unused) 108 1.1 jonathan { 109 1.65 maxv _ipip_input(m, off); 110 1.1 jonathan } 111 1.59 maxv #endif 112 1.1 jonathan 113 1.1 jonathan /* 114 1.65 maxv * _ipip_input gets called when we receive an IP{46} encapsulated packet, 115 1.65 maxv * because AH or ESP were being used in tunnel mode. 116 1.1 jonathan */ 117 1.1 jonathan static void 118 1.65 maxv _ipip_input(struct mbuf *m, int iphlen) 119 1.1 jonathan { 120 1.1 jonathan register struct sockaddr_in *sin; 121 1.1 jonathan register struct ifnet *ifp; 122 1.1 jonathan register struct ifaddr *ifa; 123 1.31 rmind pktqueue_t *pktq = NULL; 124 1.63 maxv struct ip *ip4 = NULL; 125 1.1 jonathan #ifdef INET6 126 1.1 jonathan register struct sockaddr_in6 *sin6; 127 1.1 jonathan struct ip6_hdr *ip6 = NULL; 128 1.45 christos uint8_t itos; 129 1.1 jonathan #endif 130 1.45 christos uint8_t otos; 131 1.45 christos uint8_t v; 132 1.1 jonathan int hlen; 133 1.1 jonathan 134 1.22 thorpej IPIP_STATINC(IPIP_STAT_IPACKETS); 135 1.1 jonathan 136 1.1 jonathan m_copydata(m, 0, 1, &v); 137 1.1 jonathan 138 1.1 jonathan switch (v >> 4) { 139 1.1 jonathan #ifdef INET 140 1.58 maxv case 4: 141 1.1 jonathan hlen = sizeof(struct ip); 142 1.1 jonathan break; 143 1.59 maxv #endif 144 1.1 jonathan #ifdef INET6 145 1.58 maxv case 6: 146 1.1 jonathan hlen = sizeof(struct ip6_hdr); 147 1.1 jonathan break; 148 1.1 jonathan #endif 149 1.58 maxv default: 150 1.76 christos DPRINTF("bad protocol version 0x%x (%u) " 151 1.76 christos "for outer header\n", v, v>>4); 152 1.22 thorpej IPIP_STATINC(IPIP_STAT_FAMILY); 153 1.1 jonathan m_freem(m); 154 1.59 maxv return; 155 1.1 jonathan } 156 1.1 jonathan 157 1.1 jonathan /* Bring the IP header in the first mbuf, if not there already */ 158 1.1 jonathan if (m->m_len < hlen) { 159 1.1 jonathan if ((m = m_pullup(m, hlen)) == NULL) { 160 1.76 christos DPRINTF("m_pullup (1) failed\n"); 161 1.22 thorpej IPIP_STATINC(IPIP_STAT_HDROPS); 162 1.1 jonathan return; 163 1.1 jonathan } 164 1.1 jonathan } 165 1.1 jonathan 166 1.1 jonathan /* Keep outer ecn field. */ 167 1.1 jonathan switch (v >> 4) { 168 1.1 jonathan #ifdef INET 169 1.1 jonathan case 4: 170 1.63 maxv otos = mtod(m, struct ip *)->ip_tos; 171 1.1 jonathan break; 172 1.59 maxv #endif 173 1.1 jonathan #ifdef INET6 174 1.1 jonathan case 6: 175 1.1 jonathan otos = (ntohl(mtod(m, struct ip6_hdr *)->ip6_flow) >> 20) & 0xff; 176 1.1 jonathan break; 177 1.1 jonathan #endif 178 1.1 jonathan default: 179 1.65 maxv panic("%s: impossible (1)", __func__); 180 1.1 jonathan } 181 1.1 jonathan 182 1.1 jonathan /* Remove outer IP header */ 183 1.1 jonathan m_adj(m, iphlen); 184 1.1 jonathan 185 1.1 jonathan /* Sanity check */ 186 1.1 jonathan if (m->m_pkthdr.len < sizeof(struct ip)) { 187 1.22 thorpej IPIP_STATINC(IPIP_STAT_HDROPS); 188 1.1 jonathan m_freem(m); 189 1.1 jonathan return; 190 1.1 jonathan } 191 1.1 jonathan 192 1.1 jonathan m_copydata(m, 0, 1, &v); 193 1.1 jonathan 194 1.1 jonathan switch (v >> 4) { 195 1.1 jonathan #ifdef INET 196 1.58 maxv case 4: 197 1.1 jonathan hlen = sizeof(struct ip); 198 1.61 maxv pktq = ip_pktq; 199 1.1 jonathan break; 200 1.59 maxv #endif 201 1.1 jonathan #ifdef INET6 202 1.58 maxv case 6: 203 1.1 jonathan hlen = sizeof(struct ip6_hdr); 204 1.61 maxv pktq = ip6_pktq; 205 1.1 jonathan break; 206 1.1 jonathan #endif 207 1.1 jonathan default: 208 1.76 christos DPRINTF("bad protocol version %#x (%u) " 209 1.76 christos "for inner header\n", v, v >> 4); 210 1.22 thorpej IPIP_STATINC(IPIP_STAT_FAMILY); 211 1.1 jonathan m_freem(m); 212 1.59 maxv return; 213 1.1 jonathan } 214 1.1 jonathan 215 1.1 jonathan /* 216 1.1 jonathan * Bring the inner IP header in the first mbuf, if not there already. 217 1.1 jonathan */ 218 1.1 jonathan if (m->m_len < hlen) { 219 1.1 jonathan if ((m = m_pullup(m, hlen)) == NULL) { 220 1.76 christos DPRINTF("m_pullup (2) failed\n"); 221 1.22 thorpej IPIP_STATINC(IPIP_STAT_HDROPS); 222 1.1 jonathan return; 223 1.1 jonathan } 224 1.1 jonathan } 225 1.1 jonathan 226 1.1 jonathan /* 227 1.1 jonathan * RFC 1853 specifies that the inner TTL should not be touched on 228 1.1 jonathan * decapsulation. There's no reason this comment should be here, but 229 1.1 jonathan * this is as good as any a position. 230 1.1 jonathan */ 231 1.1 jonathan 232 1.1 jonathan /* Some sanity checks in the inner IP header */ 233 1.1 jonathan switch (v >> 4) { 234 1.1 jonathan #ifdef INET 235 1.58 maxv case 4: 236 1.63 maxv ip4 = mtod(m, struct ip *); 237 1.63 maxv ip_ecn_egress(ip4_ipsec_ecn, &otos, &ip4->ip_tos); 238 1.58 maxv break; 239 1.59 maxv #endif 240 1.1 jonathan #ifdef INET6 241 1.58 maxv case 6: 242 1.57 maxv ip6 = mtod(m, struct ip6_hdr *); 243 1.1 jonathan itos = (ntohl(ip6->ip6_flow) >> 20) & 0xff; 244 1.1 jonathan ip_ecn_egress(ip6_ipsec_ecn, &otos, &itos); 245 1.1 jonathan ip6->ip6_flow &= ~htonl(0xff << 20); 246 1.63 maxv ip6->ip6_flow |= htonl((uint32_t)itos << 20); 247 1.58 maxv break; 248 1.1 jonathan #endif 249 1.1 jonathan default: 250 1.65 maxv panic("%s: impossible (2)", __func__); 251 1.1 jonathan } 252 1.1 jonathan 253 1.1 jonathan /* Check for local address spoofing. */ 254 1.39 ozaki if ((m_get_rcvif_NOMPSAFE(m) == NULL || 255 1.39 ozaki !(m_get_rcvif_NOMPSAFE(m)->if_flags & IFF_LOOPBACK)) && 256 1.67 maxv ipip_spoofcheck) { 257 1.38 ozaki int s = pserialize_read_enter(); 258 1.38 ozaki IFNET_READER_FOREACH(ifp) { 259 1.42 ozaki IFADDR_READER_FOREACH(ifa, ifp) { 260 1.1 jonathan #ifdef INET 261 1.63 maxv if (ip4) { 262 1.1 jonathan if (ifa->ifa_addr->sa_family != 263 1.1 jonathan AF_INET) 264 1.1 jonathan continue; 265 1.1 jonathan 266 1.64 maxv sin = (struct sockaddr_in *)ifa->ifa_addr; 267 1.1 jonathan 268 1.1 jonathan if (sin->sin_addr.s_addr == 269 1.63 maxv ip4->ip_src.s_addr) { 270 1.38 ozaki pserialize_read_exit(s); 271 1.22 thorpej IPIP_STATINC(IPIP_STAT_SPOOF); 272 1.1 jonathan m_freem(m); 273 1.1 jonathan return; 274 1.1 jonathan } 275 1.1 jonathan } 276 1.64 maxv #endif 277 1.1 jonathan 278 1.1 jonathan #ifdef INET6 279 1.1 jonathan if (ip6) { 280 1.1 jonathan if (ifa->ifa_addr->sa_family != 281 1.1 jonathan AF_INET6) 282 1.1 jonathan continue; 283 1.1 jonathan 284 1.64 maxv sin6 = (struct sockaddr_in6 *)ifa->ifa_addr; 285 1.1 jonathan 286 1.1 jonathan if (IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr, &ip6->ip6_src)) { 287 1.38 ozaki pserialize_read_exit(s); 288 1.22 thorpej IPIP_STATINC(IPIP_STAT_SPOOF); 289 1.1 jonathan m_freem(m); 290 1.1 jonathan return; 291 1.1 jonathan } 292 1.1 jonathan 293 1.1 jonathan } 294 1.64 maxv #endif 295 1.1 jonathan } 296 1.1 jonathan } 297 1.38 ozaki pserialize_read_exit(s); 298 1.1 jonathan } 299 1.1 jonathan 300 1.62 maxv /* Statistics: m->m_pkthdr.len is the length of the inner packet */ 301 1.62 maxv IPIP_STATADD(IPIP_STAT_IBYTES, m->m_pkthdr.len); 302 1.1 jonathan 303 1.1 jonathan /* 304 1.1 jonathan * Interface pointer stays the same; if no IPsec processing has 305 1.1 jonathan * been done (or will be done), this will point to a normal 306 1.1 jonathan * interface. Otherwise, it'll point to an enc interface, which 307 1.1 jonathan * will allow a packet filter to distinguish between secure and 308 1.1 jonathan * untrusted packets. 309 1.1 jonathan */ 310 1.1 jonathan 311 1.31 rmind int s = splnet(); 312 1.31 rmind if (__predict_false(!pktq_enqueue(pktq, m, 0))) { 313 1.22 thorpej IPIP_STATINC(IPIP_STAT_QFULL); 314 1.31 rmind m_freem(m); 315 1.1 jonathan } 316 1.31 rmind splx(s); 317 1.1 jonathan } 318 1.1 jonathan 319 1.1 jonathan int 320 1.73 maxv ipip_output(struct mbuf *m, struct secasvar *sav, struct mbuf **mp) 321 1.1 jonathan { 322 1.49 ryo char buf[IPSEC_ADDRSTRLEN]; 323 1.45 christos uint8_t tp, otos; 324 1.1 jonathan struct secasindex *saidx; 325 1.60 maxv int error, iphlen; 326 1.1 jonathan #ifdef INET 327 1.45 christos uint8_t itos; 328 1.1 jonathan struct ip *ipo; 329 1.59 maxv #endif 330 1.1 jonathan #ifdef INET6 331 1.1 jonathan struct ip6_hdr *ip6, *ip6o; 332 1.59 maxv #endif 333 1.1 jonathan 334 1.53 ozaki KASSERT(sav != NULL); 335 1.1 jonathan 336 1.1 jonathan /* XXX Deal with empty TDB source/destination addresses. */ 337 1.1 jonathan 338 1.1 jonathan m_copydata(m, 0, 1, &tp); 339 1.1 jonathan tp = (tp >> 4) & 0xff; /* Get the IP version number. */ 340 1.1 jonathan 341 1.1 jonathan saidx = &sav->sah->saidx; 342 1.1 jonathan switch (saidx->dst.sa.sa_family) { 343 1.1 jonathan #ifdef INET 344 1.1 jonathan case AF_INET: 345 1.1 jonathan if (saidx->src.sa.sa_family != AF_INET || 346 1.1 jonathan saidx->src.sin.sin_addr.s_addr == INADDR_ANY || 347 1.1 jonathan saidx->dst.sin.sin_addr.s_addr == INADDR_ANY) { 348 1.76 christos DPRINTF("unspecified tunnel endpoint " 349 1.76 christos "address in SA %s/%08lx\n", 350 1.49 ryo ipsec_address(&saidx->dst, buf, sizeof(buf)), 351 1.76 christos (u_long)ntohl(sav->spi)); 352 1.22 thorpej IPIP_STATINC(IPIP_STAT_UNSPEC); 353 1.1 jonathan error = EINVAL; 354 1.1 jonathan goto bad; 355 1.1 jonathan } 356 1.1 jonathan 357 1.1 jonathan M_PREPEND(m, sizeof(struct ip), M_DONTWAIT); 358 1.59 maxv if (m == NULL) { 359 1.76 christos DPRINTF("M_PREPEND failed\n"); 360 1.22 thorpej IPIP_STATINC(IPIP_STAT_HDROPS); 361 1.1 jonathan error = ENOBUFS; 362 1.1 jonathan goto bad; 363 1.1 jonathan } 364 1.1 jonathan 365 1.60 maxv iphlen = sizeof(struct ip); 366 1.60 maxv 367 1.1 jonathan ipo = mtod(m, struct ip *); 368 1.1 jonathan ipo->ip_v = IPVERSION; 369 1.1 jonathan ipo->ip_hl = 5; 370 1.1 jonathan ipo->ip_len = htons(m->m_pkthdr.len); 371 1.1 jonathan ipo->ip_ttl = ip_defttl; 372 1.1 jonathan ipo->ip_sum = 0; 373 1.1 jonathan ipo->ip_src = saidx->src.sin.sin_addr; 374 1.1 jonathan ipo->ip_dst = saidx->dst.sin.sin_addr; 375 1.80 ozaki ipo->ip_id = ip_newid(); 376 1.1 jonathan 377 1.1 jonathan /* If the inner protocol is IP... */ 378 1.1 jonathan if (tp == IPVERSION) { 379 1.1 jonathan /* Save ECN notification */ 380 1.1 jonathan m_copydata(m, sizeof(struct ip) + 381 1.1 jonathan offsetof(struct ip, ip_tos), 382 1.45 christos sizeof(uint8_t), &itos); 383 1.1 jonathan 384 1.1 jonathan ipo->ip_p = IPPROTO_IPIP; 385 1.1 jonathan 386 1.1 jonathan /* 387 1.1 jonathan * We should be keeping tunnel soft-state and 388 1.1 jonathan * send back ICMPs if needed. 389 1.1 jonathan */ 390 1.1 jonathan m_copydata(m, sizeof(struct ip) + 391 1.1 jonathan offsetof(struct ip, ip_off), 392 1.45 christos sizeof(uint16_t), &ipo->ip_off); 393 1.48 ozaki ipo->ip_off &= ~ htons(IP_DF | IP_MF | IP_OFFMASK); 394 1.1 jonathan } 395 1.1 jonathan #ifdef INET6 396 1.1 jonathan else if (tp == (IPV6_VERSION >> 4)) { 397 1.45 christos uint32_t itos32; 398 1.1 jonathan 399 1.1 jonathan /* Save ECN notification. */ 400 1.1 jonathan m_copydata(m, sizeof(struct ip) + 401 1.1 jonathan offsetof(struct ip6_hdr, ip6_flow), 402 1.45 christos sizeof(uint32_t), &itos32); 403 1.1 jonathan itos = ntohl(itos32) >> 20; 404 1.1 jonathan ipo->ip_p = IPPROTO_IPV6; 405 1.1 jonathan ipo->ip_off = 0; 406 1.1 jonathan } 407 1.64 maxv #endif 408 1.1 jonathan else { 409 1.1 jonathan goto nofamily; 410 1.1 jonathan } 411 1.1 jonathan 412 1.1 jonathan otos = 0; 413 1.1 jonathan ip_ecn_ingress(ECN_ALLOWED, &otos, &itos); 414 1.1 jonathan ipo->ip_tos = otos; 415 1.1 jonathan break; 416 1.1 jonathan #endif /* INET */ 417 1.1 jonathan 418 1.1 jonathan #ifdef INET6 419 1.1 jonathan case AF_INET6: 420 1.1 jonathan if (IN6_IS_ADDR_UNSPECIFIED(&saidx->dst.sin6.sin6_addr) || 421 1.1 jonathan saidx->src.sa.sa_family != AF_INET6 || 422 1.1 jonathan IN6_IS_ADDR_UNSPECIFIED(&saidx->src.sin6.sin6_addr)) { 423 1.76 christos DPRINTF("unspecified tunnel endpoint " 424 1.76 christos "address in SA %s/%08lx\n", 425 1.49 ryo ipsec_address(&saidx->dst, buf, sizeof(buf)), 426 1.76 christos (u_long)ntohl(sav->spi)); 427 1.22 thorpej IPIP_STATINC(IPIP_STAT_UNSPEC); 428 1.1 jonathan error = ENOBUFS; 429 1.1 jonathan goto bad; 430 1.1 jonathan } 431 1.1 jonathan 432 1.27 drochner if (tp == (IPV6_VERSION >> 4)) { 433 1.27 drochner /* scoped address handling */ 434 1.27 drochner ip6 = mtod(m, struct ip6_hdr *); 435 1.27 drochner if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src)) 436 1.27 drochner ip6->ip6_src.s6_addr16[1] = 0; 437 1.27 drochner if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst)) 438 1.27 drochner ip6->ip6_dst.s6_addr16[1] = 0; 439 1.27 drochner } 440 1.1 jonathan 441 1.1 jonathan M_PREPEND(m, sizeof(struct ip6_hdr), M_DONTWAIT); 442 1.59 maxv if (m == NULL) { 443 1.76 christos DPRINTF("M_PREPEND failed\n"); 444 1.22 thorpej IPIP_STATINC(IPIP_STAT_HDROPS); 445 1.1 jonathan error = ENOBUFS; 446 1.1 jonathan goto bad; 447 1.1 jonathan } 448 1.1 jonathan 449 1.60 maxv iphlen = sizeof(struct ip6_hdr); 450 1.60 maxv 451 1.1 jonathan /* Initialize IPv6 header */ 452 1.1 jonathan ip6o = mtod(m, struct ip6_hdr *); 453 1.1 jonathan ip6o->ip6_flow = 0; 454 1.1 jonathan ip6o->ip6_vfc &= ~IPV6_VERSION_MASK; 455 1.1 jonathan ip6o->ip6_vfc |= IPV6_VERSION; 456 1.44 christos ip6o->ip6_plen = htons(m->m_pkthdr.len - sizeof(*ip6o)); 457 1.1 jonathan ip6o->ip6_hlim = ip_defttl; 458 1.1 jonathan ip6o->ip6_dst = saidx->dst.sin6.sin6_addr; 459 1.1 jonathan ip6o->ip6_src = saidx->src.sin6.sin6_addr; 460 1.27 drochner if (IN6_IS_SCOPE_LINKLOCAL(&ip6o->ip6_dst)) 461 1.27 drochner ip6o->ip6_dst.s6_addr16[1] = htons(saidx->dst.sin6.sin6_scope_id); 462 1.27 drochner if (IN6_IS_SCOPE_LINKLOCAL(&ip6o->ip6_src)) 463 1.27 drochner ip6o->ip6_src.s6_addr16[1] = htons(saidx->src.sin6.sin6_scope_id); 464 1.1 jonathan 465 1.1 jonathan #ifdef INET 466 1.1 jonathan if (tp == IPVERSION) { 467 1.1 jonathan /* Save ECN notification */ 468 1.1 jonathan m_copydata(m, sizeof(struct ip6_hdr) + 469 1.45 christos offsetof(struct ip, ip_tos), sizeof(uint8_t), 470 1.17 degroote &itos); 471 1.1 jonathan 472 1.1 jonathan /* This is really IPVERSION. */ 473 1.1 jonathan ip6o->ip6_nxt = IPPROTO_IPIP; 474 1.1 jonathan } else 475 1.64 maxv #endif 476 1.59 maxv if (tp == (IPV6_VERSION >> 4)) { 477 1.59 maxv uint32_t itos32; 478 1.59 maxv 479 1.59 maxv /* Save ECN notification. */ 480 1.59 maxv m_copydata(m, sizeof(struct ip6_hdr) + 481 1.59 maxv offsetof(struct ip6_hdr, ip6_flow), 482 1.59 maxv sizeof(uint32_t), &itos32); 483 1.59 maxv itos = ntohl(itos32) >> 20; 484 1.1 jonathan 485 1.59 maxv ip6o->ip6_nxt = IPPROTO_IPV6; 486 1.59 maxv } else { 487 1.59 maxv goto nofamily; 488 1.59 maxv } 489 1.1 jonathan 490 1.1 jonathan otos = 0; 491 1.1 jonathan ip_ecn_ingress(ECN_ALLOWED, &otos, &itos); 492 1.64 maxv ip6o->ip6_flow |= htonl((uint32_t)otos << 20); 493 1.1 jonathan break; 494 1.1 jonathan #endif /* INET6 */ 495 1.1 jonathan 496 1.1 jonathan default: 497 1.1 jonathan nofamily: 498 1.76 christos DPRINTF("unsupported protocol family %u\n", 499 1.76 christos saidx->dst.sa.sa_family); 500 1.22 thorpej IPIP_STATINC(IPIP_STAT_FAMILY); 501 1.60 maxv error = EAFNOSUPPORT; 502 1.1 jonathan goto bad; 503 1.1 jonathan } 504 1.1 jonathan 505 1.22 thorpej IPIP_STATINC(IPIP_STAT_OPACKETS); 506 1.60 maxv IPIP_STATADD(IPIP_STAT_OBYTES, m->m_pkthdr.len - iphlen); 507 1.1 jonathan 508 1.60 maxv *mp = m; 509 1.1 jonathan return 0; 510 1.59 maxv 511 1.1 jonathan bad: 512 1.79 rin m_freem(m); 513 1.8 scw *mp = NULL; 514 1.59 maxv return error; 515 1.1 jonathan } 516 1.1 jonathan 517 1.71 maxv #ifdef INET 518 1.71 maxv static struct encapsw ipe4_encapsw = { 519 1.71 maxv .encapsw4 = { 520 1.71 maxv .pr_input = ip4_input, 521 1.71 maxv .pr_ctlinput = NULL, 522 1.71 maxv } 523 1.71 maxv }; 524 1.71 maxv #endif 525 1.71 maxv #ifdef INET6 526 1.71 maxv static struct encapsw ipe4_encapsw6 = { 527 1.71 maxv .encapsw6 = { 528 1.71 maxv .pr_input = ip4_input6, 529 1.71 maxv .pr_ctlinput = NULL, 530 1.71 maxv } 531 1.71 maxv }; 532 1.71 maxv #endif 533 1.71 maxv 534 1.71 maxv /* 535 1.71 maxv * Check the encapsulated packet to see if we want it 536 1.71 maxv */ 537 1.71 maxv static int 538 1.71 maxv ipe4_encapcheck(struct mbuf *m, int off, int proto, void *arg) 539 1.71 maxv { 540 1.71 maxv /* 541 1.71 maxv * Only take packets coming from IPSEC tunnels; the rest 542 1.71 maxv * must be handled by the gif tunnel code. Note that we 543 1.71 maxv * also return a minimum priority when we want the packet 544 1.71 maxv * so any explicit gif tunnels take precedence. 545 1.71 maxv */ 546 1.71 maxv return ((m->m_flags & M_IPSEC) != 0 ? 1 : 0); 547 1.71 maxv } 548 1.71 maxv 549 1.71 maxv /* -------------------------------------------------------------------------- */ 550 1.71 maxv 551 1.1 jonathan static int 552 1.26 drochner ipe4_init(struct secasvar *sav, const struct xformsw *xsp) 553 1.1 jonathan { 554 1.1 jonathan sav->tdb_xform = xsp; 555 1.1 jonathan return 0; 556 1.1 jonathan } 557 1.1 jonathan 558 1.78 riastrad static void 559 1.1 jonathan ipe4_zeroize(struct secasvar *sav) 560 1.1 jonathan { 561 1.1 jonathan sav->tdb_xform = NULL; 562 1.1 jonathan } 563 1.1 jonathan 564 1.1 jonathan static int 565 1.59 maxv ipe4_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) 566 1.1 jonathan { 567 1.1 jonathan /* This is a rather serious mistake, so no conditional printing. */ 568 1.76 christos printf("should never be called\n"); 569 1.79 rin m_freem(m); 570 1.1 jonathan return EOPNOTSUPP; 571 1.1 jonathan } 572 1.1 jonathan 573 1.71 maxv static int 574 1.71 maxv ipe4_output(struct mbuf *m, const struct ipsecrequest *isr, 575 1.77 knakahar struct secasvar *sav, int skip, int protoff, int flags) 576 1.71 maxv { 577 1.71 maxv panic("%s: should not have been called", __func__); 578 1.71 maxv } 579 1.71 maxv 580 1.1 jonathan static struct xformsw ipe4_xformsw = { 581 1.50 ozaki .xf_type = XF_IP4, 582 1.50 ozaki .xf_flags = 0, 583 1.50 ozaki .xf_name = "IPv4 Simple Encapsulation", 584 1.50 ozaki .xf_init = ipe4_init, 585 1.50 ozaki .xf_zeroize = ipe4_zeroize, 586 1.50 ozaki .xf_input = ipe4_input, 587 1.71 maxv .xf_output = ipe4_output, 588 1.50 ozaki .xf_next = NULL, 589 1.1 jonathan }; 590 1.1 jonathan 591 1.71 maxv /* -------------------------------------------------------------------------- */ 592 1.1 jonathan 593 1.48 ozaki void 594 1.1 jonathan ipe4_attach(void) 595 1.1 jonathan { 596 1.22 thorpej 597 1.22 thorpej ipipstat_percpu = percpu_alloc(sizeof(uint64_t) * IPIP_NSTATS); 598 1.22 thorpej 599 1.1 jonathan xform_register(&ipe4_xformsw); 600 1.1 jonathan /* attach to encapsulation framework */ 601 1.1 jonathan /* XXX save return cookie for detach on module remove */ 602 1.41 knakahar 603 1.41 knakahar encapinit(); 604 1.41 knakahar /* This function is called before ifinit(). Who else gets lock? */ 605 1.41 knakahar (void)encap_lock_enter(); 606 1.40 knakahar /* ipe4_encapsw and ipe4_encapsw must be added atomically */ 607 1.15 degroote #ifdef INET 608 1.59 maxv (void)encap_attach_func(AF_INET, -1, ipe4_encapcheck, &ipe4_encapsw, 609 1.59 maxv NULL); 610 1.15 degroote #endif 611 1.1 jonathan #ifdef INET6 612 1.59 maxv (void)encap_attach_func(AF_INET6, -1, ipe4_encapcheck, &ipe4_encapsw6, 613 1.59 maxv NULL); 614 1.1 jonathan #endif 615 1.40 knakahar encap_lock_exit(); 616 1.1 jonathan } 617