ip_icmp.c revision 340672
1/*- 2 * Copyright (c) 1982, 1986, 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)ip_icmp.c 8.2 (Berkeley) 1/4/94 30 */ 31 32#include <sys/cdefs.h> 33__FBSDID("$FreeBSD: stable/10/sys/netinet/ip_icmp.c 340672 2018-11-20 11:19:02Z eugen $"); 34 35#include "opt_inet.h" 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/mbuf.h> 40#include <sys/protosw.h> 41#include <sys/socket.h> 42#include <sys/time.h> 43#include <sys/kernel.h> 44#include <sys/sysctl.h> 45#include <sys/syslog.h> 46 47#include <net/if.h> 48#include <net/if_types.h> 49#include <net/route.h> 50#include <net/vnet.h> 51 52#include <netinet/in.h> 53#include <netinet/in_pcb.h> 54#include <netinet/in_systm.h> 55#include <netinet/in_var.h> 56#include <netinet/ip.h> 57#include <netinet/ip_icmp.h> 58#include <netinet/ip_var.h> 59#include <netinet/ip_options.h> 60#include <netinet/tcp.h> 61#include <netinet/tcp_var.h> 62#include <netinet/tcpip.h> 63#include <netinet/icmp_var.h> 64 65#ifdef INET 66 67#include <machine/in_cksum.h> 68 69#include <security/mac/mac_framework.h> 70#endif /* INET */ 71 72/* 73 * ICMP routines: error generation, receive packet processing, and 74 * routines to turnaround packets back to the originator, and 75 * host table maintenance routines. 76 */ 77static VNET_DEFINE(int, icmplim) = 200; 78#define V_icmplim VNET(icmplim) 79SYSCTL_VNET_INT(_net_inet_icmp, ICMPCTL_ICMPLIM, icmplim, CTLFLAG_RW, 80 &VNET_NAME(icmplim), 0, 81 "Maximum number of ICMP responses per second"); 82 83static VNET_DEFINE(int, icmplim_output) = 1; 84#define V_icmplim_output VNET(icmplim_output) 85SYSCTL_VNET_INT(_net_inet_icmp, OID_AUTO, icmplim_output, CTLFLAG_RW, 86 &VNET_NAME(icmplim_output), 0, 87 "Enable logging of ICMP response rate limiting"); 88 89#ifdef INET 90VNET_PCPUSTAT_DEFINE(struct icmpstat, icmpstat); 91VNET_PCPUSTAT_SYSINIT(icmpstat); 92SYSCTL_VNET_PCPUSTAT(_net_inet_icmp, ICMPCTL_STATS, stats, struct icmpstat, 93 icmpstat, "ICMP statistics (struct icmpstat, netinet/icmp_var.h)"); 94 95#ifdef VIMAGE 96VNET_PCPUSTAT_SYSUNINIT(icmpstat); 97#endif /* VIMAGE */ 98 99static VNET_DEFINE(int, icmpmaskrepl) = 0; 100#define V_icmpmaskrepl VNET(icmpmaskrepl) 101SYSCTL_VNET_INT(_net_inet_icmp, ICMPCTL_MASKREPL, maskrepl, CTLFLAG_RW, 102 &VNET_NAME(icmpmaskrepl), 0, 103 "Reply to ICMP Address Mask Request packets."); 104 105static VNET_DEFINE(u_int, icmpmaskfake) = 0; 106#define V_icmpmaskfake VNET(icmpmaskfake) 107SYSCTL_VNET_UINT(_net_inet_icmp, OID_AUTO, maskfake, CTLFLAG_RW, 108 &VNET_NAME(icmpmaskfake), 0, 109 "Fake reply to ICMP Address Mask Request packets."); 110 111VNET_DEFINE(int, drop_redirect) = 0; 112 113static VNET_DEFINE(int, log_redirect) = 0; 114#define V_log_redirect VNET(log_redirect) 115SYSCTL_VNET_INT(_net_inet_icmp, OID_AUTO, log_redirect, CTLFLAG_RW, 116 &VNET_NAME(log_redirect), 0, 117 "Log ICMP redirects to the console"); 118 119static VNET_DEFINE(char, reply_src[IFNAMSIZ]); 120#define V_reply_src VNET(reply_src) 121SYSCTL_VNET_STRING(_net_inet_icmp, OID_AUTO, reply_src, CTLFLAG_RW, 122 &VNET_NAME(reply_src), IFNAMSIZ, 123 "icmp reply source for non-local packets."); 124 125static VNET_DEFINE(int, icmp_rfi) = 0; 126#define V_icmp_rfi VNET(icmp_rfi) 127SYSCTL_VNET_INT(_net_inet_icmp, OID_AUTO, reply_from_interface, CTLFLAG_RW, 128 &VNET_NAME(icmp_rfi), 0, 129 "ICMP reply from incoming interface for non-local packets"); 130 131static VNET_DEFINE(int, icmp_quotelen) = 8; 132#define V_icmp_quotelen VNET(icmp_quotelen) 133SYSCTL_VNET_INT(_net_inet_icmp, OID_AUTO, quotelen, CTLFLAG_RW, 134 &VNET_NAME(icmp_quotelen), 0, 135 "Number of bytes from original packet to quote in ICMP reply"); 136 137/* 138 * ICMP broadcast echo sysctl 139 */ 140static VNET_DEFINE(int, icmpbmcastecho) = 0; 141#define V_icmpbmcastecho VNET(icmpbmcastecho) 142SYSCTL_VNET_INT(_net_inet_icmp, OID_AUTO, bmcastecho, CTLFLAG_RW, 143 &VNET_NAME(icmpbmcastecho), 0, 144 ""); 145 146static VNET_DEFINE(int, icmptstamprepl) = 1; 147#define V_icmptstamprepl VNET(icmptstamprepl) 148SYSCTL_INT(_net_inet_icmp, OID_AUTO, tstamprepl, CTLFLAG_RW, 149 &VNET_NAME(icmptstamprepl), 0, "Respond to ICMP Timestamp packets"); 150 151static VNET_DEFINE(int, error_keeptags) = 0; 152#define V_error_keeptags VNET(error_keeptags) 153SYSCTL_INT(_net_inet_icmp, OID_AUTO, error_keeptags, CTLFLAG_VNET | CTLFLAG_RW, 154 &VNET_NAME(error_keeptags), 0, 155 "ICMP error response keeps copy of mbuf_tags of original packet"); 156 157#ifdef ICMPPRINTFS 158int icmpprintfs = 0; 159#endif 160 161static void icmp_reflect(struct mbuf *); 162static void icmp_send(struct mbuf *, struct mbuf *); 163 164extern struct protosw inetsw[]; 165 166static int 167sysctl_net_icmp_drop_redir(SYSCTL_HANDLER_ARGS) 168{ 169 int error, new; 170 int i; 171 struct radix_node_head *rnh; 172 173 new = V_drop_redirect; 174 error = sysctl_handle_int(oidp, &new, 0, req); 175 if (error == 0 && req->newptr) { 176 new = (new != 0) ? 1 : 0; 177 178 if (new == V_drop_redirect) 179 return (0); 180 181 for (i = 0; i < rt_numfibs; i++) { 182 if ((rnh = rt_tables_get_rnh(i, AF_INET)) == NULL) 183 continue; 184 RADIX_NODE_HEAD_LOCK(rnh); 185 in_setmatchfunc(rnh, new); 186 RADIX_NODE_HEAD_UNLOCK(rnh); 187 } 188 189 V_drop_redirect = new; 190 } 191 192 return (error); 193} 194 195SYSCTL_VNET_PROC(_net_inet_icmp, OID_AUTO, drop_redirect, 196 CTLTYPE_INT|CTLFLAG_RW, 0, 0, 197 sysctl_net_icmp_drop_redir, "I", "Ignore ICMP redirects"); 198 199/* 200 * Kernel module interface for updating icmpstat. The argument is an index 201 * into icmpstat treated as an array of u_long. While this encodes the 202 * general layout of icmpstat into the caller, it doesn't encode its 203 * location, so that future changes to add, for example, per-CPU stats 204 * support won't cause binary compatibility problems for kernel modules. 205 */ 206void 207kmod_icmpstat_inc(int statnum) 208{ 209 210 counter_u64_add(VNET(icmpstat)[statnum], 1); 211} 212 213/* 214 * Generate an error packet of type error 215 * in response to bad packet ip. 216 */ 217void 218icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu) 219{ 220 register struct ip *oip = mtod(n, struct ip *), *nip; 221 register unsigned oiphlen = oip->ip_hl << 2; 222 register struct icmp *icp; 223 register struct mbuf *m; 224 unsigned icmplen, icmpelen, nlen; 225 226 KASSERT((u_int)type <= ICMP_MAXTYPE, ("%s: illegal ICMP type", __func__)); 227#ifdef ICMPPRINTFS 228 if (icmpprintfs) 229 printf("icmp_error(%p, %x, %d)\n", oip, type, code); 230#endif 231 if (type != ICMP_REDIRECT) 232 ICMPSTAT_INC(icps_error); 233 /* 234 * Don't send error: 235 * if the original packet was encrypted. 236 * if not the first fragment of message. 237 * in response to a multicast or broadcast packet. 238 * if the old packet protocol was an ICMP error message. 239 */ 240 if (n->m_flags & M_DECRYPTED) 241 goto freeit; 242 if (oip->ip_off & htons(~(IP_MF|IP_DF))) 243 goto freeit; 244 if (n->m_flags & (M_BCAST|M_MCAST)) 245 goto freeit; 246 if (oip->ip_p == IPPROTO_ICMP && type != ICMP_REDIRECT && 247 n->m_len >= oiphlen + ICMP_MINLEN && 248 !ICMP_INFOTYPE(((struct icmp *)((caddr_t)oip + oiphlen))->icmp_type)) { 249 ICMPSTAT_INC(icps_oldicmp); 250 goto freeit; 251 } 252 /* Drop if IP header plus 8 bytes is not contignous in first mbuf. */ 253 if (oiphlen + 8 > n->m_len) 254 goto freeit; 255 /* 256 * Calculate length to quote from original packet and 257 * prevent the ICMP mbuf from overflowing. 258 * Unfortunatly this is non-trivial since ip_forward() 259 * sends us truncated packets. 260 */ 261 nlen = m_length(n, NULL); 262 if (oip->ip_p == IPPROTO_TCP) { 263 struct tcphdr *th; 264 int tcphlen; 265 266 if (oiphlen + sizeof(struct tcphdr) > n->m_len && 267 n->m_next == NULL) 268 goto stdreply; 269 if (n->m_len < oiphlen + sizeof(struct tcphdr) && 270 ((n = m_pullup(n, oiphlen + sizeof(struct tcphdr))) == NULL)) 271 goto freeit; 272 th = (struct tcphdr *)((caddr_t)oip + oiphlen); 273 tcphlen = th->th_off << 2; 274 if (tcphlen < sizeof(struct tcphdr)) 275 goto freeit; 276 if (ntohs(oip->ip_len) < oiphlen + tcphlen) 277 goto freeit; 278 if (oiphlen + tcphlen > n->m_len && n->m_next == NULL) 279 goto stdreply; 280 if (n->m_len < oiphlen + tcphlen && 281 ((n = m_pullup(n, oiphlen + tcphlen)) == NULL)) 282 goto freeit; 283 icmpelen = max(tcphlen, min(V_icmp_quotelen, 284 ntohs(oip->ip_len) - oiphlen)); 285 } else 286stdreply: icmpelen = max(8, min(V_icmp_quotelen, ntohs(oip->ip_len) - oiphlen)); 287 288 icmplen = min(oiphlen + icmpelen, nlen); 289 if (icmplen < sizeof(struct ip)) 290 goto freeit; 291 292 if (MHLEN > sizeof(struct ip) + ICMP_MINLEN + icmplen) 293 m = m_gethdr(M_NOWAIT, MT_DATA); 294 else 295 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); 296 if (m == NULL) 297 goto freeit; 298#ifdef MAC 299 mac_netinet_icmp_reply(n, m); 300#endif 301 icmplen = min(icmplen, M_TRAILINGSPACE(m) - sizeof(struct ip) - ICMP_MINLEN); 302 m_align(m, ICMP_MINLEN + icmplen); 303 m->m_len = ICMP_MINLEN + icmplen; 304 305 /* XXX MRT make the outgoing packet use the same FIB 306 * that was associated with the incoming packet 307 */ 308 M_SETFIB(m, M_GETFIB(n)); 309 icp = mtod(m, struct icmp *); 310 ICMPSTAT_INC(icps_outhist[type]); 311 icp->icmp_type = type; 312 if (type == ICMP_REDIRECT) 313 icp->icmp_gwaddr.s_addr = dest; 314 else { 315 icp->icmp_void = 0; 316 /* 317 * The following assignments assume an overlay with the 318 * just zeroed icmp_void field. 319 */ 320 if (type == ICMP_PARAMPROB) { 321 icp->icmp_pptr = code; 322 code = 0; 323 } else if (type == ICMP_UNREACH && 324 code == ICMP_UNREACH_NEEDFRAG && mtu) { 325 icp->icmp_nextmtu = htons(mtu); 326 } 327 } 328 icp->icmp_code = code; 329 330 /* 331 * Copy the quotation into ICMP message and 332 * convert quoted IP header back to network representation. 333 */ 334 m_copydata(n, 0, icmplen, (caddr_t)&icp->icmp_ip); 335 nip = &icp->icmp_ip; 336 337 /* 338 * Set up ICMP message mbuf and copy old IP header (without options 339 * in front of ICMP message. 340 * If the original mbuf was meant to bypass the firewall, the error 341 * reply should bypass as well. 342 */ 343 m->m_flags |= n->m_flags & M_SKIP_FIREWALL; 344 m->m_data -= sizeof(struct ip); 345 m->m_len += sizeof(struct ip); 346 m->m_pkthdr.len = m->m_len; 347 m->m_pkthdr.rcvif = n->m_pkthdr.rcvif; 348 nip = mtod(m, struct ip *); 349 bcopy((caddr_t)oip, (caddr_t)nip, sizeof(struct ip)); 350 nip->ip_len = htons(m->m_len); 351 nip->ip_v = IPVERSION; 352 nip->ip_hl = 5; 353 nip->ip_p = IPPROTO_ICMP; 354 nip->ip_tos = 0; 355 nip->ip_off = 0; 356 357 if (V_error_keeptags) 358 m_tag_copy_chain(m, n, M_NOWAIT); 359 360 icmp_reflect(m); 361 362freeit: 363 m_freem(n); 364} 365 366/* 367 * Process a received ICMP message. 368 */ 369void 370icmp_input(struct mbuf *m, int off) 371{ 372 struct icmp *icp; 373 struct in_ifaddr *ia; 374 struct ip *ip = mtod(m, struct ip *); 375 struct sockaddr_in icmpsrc, icmpdst, icmpgw; 376 int hlen = off; 377 int icmplen = ntohs(ip->ip_len) - off; 378 int i, code; 379 void (*ctlfunc)(int, struct sockaddr *, void *); 380 int fibnum; 381 382 /* 383 * Locate icmp structure in mbuf, and check 384 * that not corrupted and of at least minimum length. 385 */ 386#ifdef ICMPPRINTFS 387 if (icmpprintfs) { 388 char buf[4 * sizeof "123"]; 389 strcpy(buf, inet_ntoa(ip->ip_src)); 390 printf("icmp_input from %s to %s, len %d\n", 391 buf, inet_ntoa(ip->ip_dst), icmplen); 392 } 393#endif 394 if (icmplen < ICMP_MINLEN) { 395 ICMPSTAT_INC(icps_tooshort); 396 goto freeit; 397 } 398 i = hlen + min(icmplen, ICMP_ADVLENMIN); 399 if (m->m_len < i && (m = m_pullup(m, i)) == NULL) { 400 ICMPSTAT_INC(icps_tooshort); 401 return; 402 } 403 ip = mtod(m, struct ip *); 404 m->m_len -= hlen; 405 m->m_data += hlen; 406 icp = mtod(m, struct icmp *); 407 if (in_cksum(m, icmplen)) { 408 ICMPSTAT_INC(icps_checksum); 409 goto freeit; 410 } 411 m->m_len += hlen; 412 m->m_data -= hlen; 413 414 if (m->m_pkthdr.rcvif && m->m_pkthdr.rcvif->if_type == IFT_FAITH) { 415 /* 416 * Deliver very specific ICMP type only. 417 */ 418 switch (icp->icmp_type) { 419 case ICMP_UNREACH: 420 case ICMP_TIMXCEED: 421 break; 422 default: 423 goto freeit; 424 } 425 } 426 427#ifdef ICMPPRINTFS 428 if (icmpprintfs) 429 printf("icmp_input, type %d code %d\n", icp->icmp_type, 430 icp->icmp_code); 431#endif 432 433 /* 434 * Message type specific processing. 435 */ 436 if (icp->icmp_type > ICMP_MAXTYPE) 437 goto raw; 438 439 /* Initialize */ 440 bzero(&icmpsrc, sizeof(icmpsrc)); 441 icmpsrc.sin_len = sizeof(struct sockaddr_in); 442 icmpsrc.sin_family = AF_INET; 443 bzero(&icmpdst, sizeof(icmpdst)); 444 icmpdst.sin_len = sizeof(struct sockaddr_in); 445 icmpdst.sin_family = AF_INET; 446 bzero(&icmpgw, sizeof(icmpgw)); 447 icmpgw.sin_len = sizeof(struct sockaddr_in); 448 icmpgw.sin_family = AF_INET; 449 450 ICMPSTAT_INC(icps_inhist[icp->icmp_type]); 451 code = icp->icmp_code; 452 switch (icp->icmp_type) { 453 454 case ICMP_UNREACH: 455 switch (code) { 456 case ICMP_UNREACH_NET: 457 case ICMP_UNREACH_HOST: 458 case ICMP_UNREACH_SRCFAIL: 459 case ICMP_UNREACH_NET_UNKNOWN: 460 case ICMP_UNREACH_HOST_UNKNOWN: 461 case ICMP_UNREACH_ISOLATED: 462 case ICMP_UNREACH_TOSNET: 463 case ICMP_UNREACH_TOSHOST: 464 case ICMP_UNREACH_HOST_PRECEDENCE: 465 case ICMP_UNREACH_PRECEDENCE_CUTOFF: 466 code = PRC_UNREACH_NET; 467 break; 468 469 case ICMP_UNREACH_NEEDFRAG: 470 code = PRC_MSGSIZE; 471 break; 472 473 /* 474 * RFC 1122, Sections 3.2.2.1 and 4.2.3.9. 475 * Treat subcodes 2,3 as immediate RST 476 */ 477 case ICMP_UNREACH_PROTOCOL: 478 case ICMP_UNREACH_PORT: 479 code = PRC_UNREACH_PORT; 480 break; 481 482 case ICMP_UNREACH_NET_PROHIB: 483 case ICMP_UNREACH_HOST_PROHIB: 484 case ICMP_UNREACH_FILTER_PROHIB: 485 code = PRC_UNREACH_ADMIN_PROHIB; 486 break; 487 488 default: 489 goto badcode; 490 } 491 goto deliver; 492 493 case ICMP_TIMXCEED: 494 if (code > 1) 495 goto badcode; 496 code += PRC_TIMXCEED_INTRANS; 497 goto deliver; 498 499 case ICMP_PARAMPROB: 500 if (code > 1) 501 goto badcode; 502 code = PRC_PARAMPROB; 503 goto deliver; 504 505 case ICMP_SOURCEQUENCH: 506 if (code) 507 goto badcode; 508 code = PRC_QUENCH; 509 deliver: 510 /* 511 * Problem with datagram; advise higher level routines. 512 */ 513 if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp) || 514 icp->icmp_ip.ip_hl < (sizeof(struct ip) >> 2)) { 515 ICMPSTAT_INC(icps_badlen); 516 goto freeit; 517 } 518 /* Discard ICMP's in response to multicast packets */ 519 if (IN_MULTICAST(ntohl(icp->icmp_ip.ip_dst.s_addr))) 520 goto badcode; 521#ifdef ICMPPRINTFS 522 if (icmpprintfs) 523 printf("deliver to protocol %d\n", icp->icmp_ip.ip_p); 524#endif 525 icmpsrc.sin_addr = icp->icmp_ip.ip_dst; 526 /* 527 * XXX if the packet contains [IPv4 AH TCP], we can't make a 528 * notification to TCP layer. 529 */ 530 ctlfunc = inetsw[ip_protox[icp->icmp_ip.ip_p]].pr_ctlinput; 531 if (ctlfunc) 532 (*ctlfunc)(code, (struct sockaddr *)&icmpsrc, 533 (void *)&icp->icmp_ip); 534 break; 535 536 badcode: 537 ICMPSTAT_INC(icps_badcode); 538 break; 539 540 case ICMP_ECHO: 541 if (!V_icmpbmcastecho 542 && (m->m_flags & (M_MCAST | M_BCAST)) != 0) { 543 ICMPSTAT_INC(icps_bmcastecho); 544 break; 545 } 546 icp->icmp_type = ICMP_ECHOREPLY; 547 if (badport_bandlim(BANDLIM_ICMP_ECHO) < 0) 548 goto freeit; 549 else 550 goto reflect; 551 552 case ICMP_TSTAMP: 553 if (V_icmptstamprepl == 0) 554 break; 555 if (!V_icmpbmcastecho 556 && (m->m_flags & (M_MCAST | M_BCAST)) != 0) { 557 ICMPSTAT_INC(icps_bmcasttstamp); 558 break; 559 } 560 if (icmplen < ICMP_TSLEN) { 561 ICMPSTAT_INC(icps_badlen); 562 break; 563 } 564 icp->icmp_type = ICMP_TSTAMPREPLY; 565 icp->icmp_rtime = iptime(); 566 icp->icmp_ttime = icp->icmp_rtime; /* bogus, do later! */ 567 if (badport_bandlim(BANDLIM_ICMP_TSTAMP) < 0) 568 goto freeit; 569 else 570 goto reflect; 571 572 case ICMP_MASKREQ: 573 if (V_icmpmaskrepl == 0) 574 break; 575 /* 576 * We are not able to respond with all ones broadcast 577 * unless we receive it over a point-to-point interface. 578 */ 579 if (icmplen < ICMP_MASKLEN) 580 break; 581 switch (ip->ip_dst.s_addr) { 582 583 case INADDR_BROADCAST: 584 case INADDR_ANY: 585 icmpdst.sin_addr = ip->ip_src; 586 break; 587 588 default: 589 icmpdst.sin_addr = ip->ip_dst; 590 } 591 ia = (struct in_ifaddr *)ifaof_ifpforaddr( 592 (struct sockaddr *)&icmpdst, m->m_pkthdr.rcvif); 593 if (ia == NULL) 594 break; 595 if (ia->ia_ifp == NULL) { 596 ifa_free(&ia->ia_ifa); 597 break; 598 } 599 icp->icmp_type = ICMP_MASKREPLY; 600 if (V_icmpmaskfake == 0) 601 icp->icmp_mask = ia->ia_sockmask.sin_addr.s_addr; 602 else 603 icp->icmp_mask = V_icmpmaskfake; 604 if (ip->ip_src.s_addr == 0) { 605 if (ia->ia_ifp->if_flags & IFF_BROADCAST) 606 ip->ip_src = satosin(&ia->ia_broadaddr)->sin_addr; 607 else if (ia->ia_ifp->if_flags & IFF_POINTOPOINT) 608 ip->ip_src = satosin(&ia->ia_dstaddr)->sin_addr; 609 } 610 ifa_free(&ia->ia_ifa); 611reflect: 612 ICMPSTAT_INC(icps_reflect); 613 ICMPSTAT_INC(icps_outhist[icp->icmp_type]); 614 icmp_reflect(m); 615 return; 616 617 case ICMP_REDIRECT: 618 if (V_log_redirect) { 619 u_long src, dst, gw; 620 621 src = ntohl(ip->ip_src.s_addr); 622 dst = ntohl(icp->icmp_ip.ip_dst.s_addr); 623 gw = ntohl(icp->icmp_gwaddr.s_addr); 624 printf("icmp redirect from %d.%d.%d.%d: " 625 "%d.%d.%d.%d => %d.%d.%d.%d\n", 626 (int)(src >> 24), (int)((src >> 16) & 0xff), 627 (int)((src >> 8) & 0xff), (int)(src & 0xff), 628 (int)(dst >> 24), (int)((dst >> 16) & 0xff), 629 (int)((dst >> 8) & 0xff), (int)(dst & 0xff), 630 (int)(gw >> 24), (int)((gw >> 16) & 0xff), 631 (int)((gw >> 8) & 0xff), (int)(gw & 0xff)); 632 } 633 /* 634 * RFC1812 says we must ignore ICMP redirects if we 635 * are acting as router. 636 */ 637 if (V_drop_redirect || V_ipforwarding) 638 break; 639 if (code > 3) 640 goto badcode; 641 if (icmplen < ICMP_ADVLENMIN || icmplen < ICMP_ADVLEN(icp) || 642 icp->icmp_ip.ip_hl < (sizeof(struct ip) >> 2)) { 643 ICMPSTAT_INC(icps_badlen); 644 break; 645 } 646 /* 647 * Short circuit routing redirects to force 648 * immediate change in the kernel's routing 649 * tables. The message is also handed to anyone 650 * listening on a raw socket (e.g. the routing 651 * daemon for use in updating its tables). 652 */ 653 icmpgw.sin_addr = ip->ip_src; 654 icmpdst.sin_addr = icp->icmp_gwaddr; 655#ifdef ICMPPRINTFS 656 if (icmpprintfs) { 657 char buf[4 * sizeof "123"]; 658 strcpy(buf, inet_ntoa(icp->icmp_ip.ip_dst)); 659 660 printf("redirect dst %s to %s\n", 661 buf, inet_ntoa(icp->icmp_gwaddr)); 662 } 663#endif 664 icmpsrc.sin_addr = icp->icmp_ip.ip_dst; 665 for ( fibnum = 0; fibnum < rt_numfibs; fibnum++) { 666 in_rtredirect((struct sockaddr *)&icmpsrc, 667 (struct sockaddr *)&icmpdst, 668 (struct sockaddr *)0, RTF_GATEWAY | RTF_HOST, 669 (struct sockaddr *)&icmpgw, fibnum); 670 } 671 pfctlinput(PRC_REDIRECT_HOST, (struct sockaddr *)&icmpsrc); 672 break; 673 674 /* 675 * No kernel processing for the following; 676 * just fall through to send to raw listener. 677 */ 678 case ICMP_ECHOREPLY: 679 case ICMP_ROUTERADVERT: 680 case ICMP_ROUTERSOLICIT: 681 case ICMP_TSTAMPREPLY: 682 case ICMP_IREQREPLY: 683 case ICMP_MASKREPLY: 684 default: 685 break; 686 } 687 688raw: 689 rip_input(m, off); 690 return; 691 692freeit: 693 m_freem(m); 694} 695 696/* 697 * Reflect the ip packet back to the source 698 */ 699static void 700icmp_reflect(struct mbuf *m) 701{ 702 struct ip *ip = mtod(m, struct ip *); 703 struct ifaddr *ifa; 704 struct ifnet *ifp; 705 struct in_ifaddr *ia; 706 struct in_addr t; 707 struct mbuf *opts = 0; 708 int optlen = (ip->ip_hl << 2) - sizeof(struct ip); 709 710 if (IN_MULTICAST(ntohl(ip->ip_src.s_addr)) || 711 IN_EXPERIMENTAL(ntohl(ip->ip_src.s_addr)) || 712 IN_ZERONET(ntohl(ip->ip_src.s_addr)) ) { 713 m_freem(m); /* Bad return address */ 714 ICMPSTAT_INC(icps_badaddr); 715 goto done; /* Ip_output() will check for broadcast */ 716 } 717 718 t = ip->ip_dst; 719 ip->ip_dst = ip->ip_src; 720 721 /* 722 * Source selection for ICMP replies: 723 * 724 * If the incoming packet was addressed directly to one of our 725 * own addresses, use dst as the src for the reply. 726 */ 727 IN_IFADDR_RLOCK(); 728 LIST_FOREACH(ia, INADDR_HASH(t.s_addr), ia_hash) { 729 if (t.s_addr == IA_SIN(ia)->sin_addr.s_addr) { 730 t = IA_SIN(ia)->sin_addr; 731 IN_IFADDR_RUNLOCK(); 732 goto match; 733 } 734 } 735 IN_IFADDR_RUNLOCK(); 736 737 /* 738 * If the incoming packet was addressed to one of our broadcast 739 * addresses, use the first non-broadcast address which corresponds 740 * to the incoming interface. 741 */ 742 ifp = m->m_pkthdr.rcvif; 743 if (ifp != NULL && ifp->if_flags & IFF_BROADCAST) { 744 IF_ADDR_RLOCK(ifp); 745 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { 746 if (ifa->ifa_addr->sa_family != AF_INET) 747 continue; 748 ia = ifatoia(ifa); 749 if (satosin(&ia->ia_broadaddr)->sin_addr.s_addr == 750 t.s_addr) { 751 t = IA_SIN(ia)->sin_addr; 752 IF_ADDR_RUNLOCK(ifp); 753 goto match; 754 } 755 } 756 IF_ADDR_RUNLOCK(ifp); 757 } 758 /* 759 * If the packet was transiting through us, use the address of 760 * the interface the packet came through in. If that interface 761 * doesn't have a suitable IP address, the normal selection 762 * criteria apply. 763 */ 764 if (V_icmp_rfi && ifp != NULL) { 765 IF_ADDR_RLOCK(ifp); 766 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { 767 if (ifa->ifa_addr->sa_family != AF_INET) 768 continue; 769 ia = ifatoia(ifa); 770 t = IA_SIN(ia)->sin_addr; 771 IF_ADDR_RUNLOCK(ifp); 772 goto match; 773 } 774 IF_ADDR_RUNLOCK(ifp); 775 } 776 /* 777 * If the incoming packet was not addressed directly to us, use 778 * designated interface for icmp replies specified by sysctl 779 * net.inet.icmp.reply_src (default not set). Otherwise continue 780 * with normal source selection. 781 */ 782 if (V_reply_src[0] != '\0' && (ifp = ifunit(V_reply_src))) { 783 IF_ADDR_RLOCK(ifp); 784 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { 785 if (ifa->ifa_addr->sa_family != AF_INET) 786 continue; 787 ia = ifatoia(ifa); 788 t = IA_SIN(ia)->sin_addr; 789 IF_ADDR_RUNLOCK(ifp); 790 goto match; 791 } 792 IF_ADDR_RUNLOCK(ifp); 793 } 794 /* 795 * If the packet was transiting through us, use the address of 796 * the interface that is the closest to the packet source. 797 * When we don't have a route back to the packet source, stop here 798 * and drop the packet. 799 */ 800 ia = ip_rtaddr(ip->ip_dst, M_GETFIB(m)); 801 if (ia == NULL) { 802 m_freem(m); 803 ICMPSTAT_INC(icps_noroute); 804 goto done; 805 } 806 t = IA_SIN(ia)->sin_addr; 807 ifa_free(&ia->ia_ifa); 808match: 809#ifdef MAC 810 mac_netinet_icmp_replyinplace(m); 811#endif 812 ip->ip_src = t; 813 ip->ip_ttl = V_ip_defttl; 814 815 if (optlen > 0) { 816 register u_char *cp; 817 int opt, cnt; 818 u_int len; 819 820 /* 821 * Retrieve any source routing from the incoming packet; 822 * add on any record-route or timestamp options. 823 */ 824 cp = (u_char *) (ip + 1); 825 if ((opts = ip_srcroute(m)) == 0 && 826 (opts = m_gethdr(M_NOWAIT, MT_DATA))) { 827 opts->m_len = sizeof(struct in_addr); 828 mtod(opts, struct in_addr *)->s_addr = 0; 829 } 830 if (opts) { 831#ifdef ICMPPRINTFS 832 if (icmpprintfs) 833 printf("icmp_reflect optlen %d rt %d => ", 834 optlen, opts->m_len); 835#endif 836 for (cnt = optlen; cnt > 0; cnt -= len, cp += len) { 837 opt = cp[IPOPT_OPTVAL]; 838 if (opt == IPOPT_EOL) 839 break; 840 if (opt == IPOPT_NOP) 841 len = 1; 842 else { 843 if (cnt < IPOPT_OLEN + sizeof(*cp)) 844 break; 845 len = cp[IPOPT_OLEN]; 846 if (len < IPOPT_OLEN + sizeof(*cp) || 847 len > cnt) 848 break; 849 } 850 /* 851 * Should check for overflow, but it "can't happen" 852 */ 853 if (opt == IPOPT_RR || opt == IPOPT_TS || 854 opt == IPOPT_SECURITY) { 855 bcopy((caddr_t)cp, 856 mtod(opts, caddr_t) + opts->m_len, len); 857 opts->m_len += len; 858 } 859 } 860 /* Terminate & pad, if necessary */ 861 cnt = opts->m_len % 4; 862 if (cnt) { 863 for (; cnt < 4; cnt++) { 864 *(mtod(opts, caddr_t) + opts->m_len) = 865 IPOPT_EOL; 866 opts->m_len++; 867 } 868 } 869#ifdef ICMPPRINTFS 870 if (icmpprintfs) 871 printf("%d\n", opts->m_len); 872#endif 873 } 874 ip_stripoptions(m); 875 } 876 m_tag_delete_nonpersistent(m); 877 m->m_flags &= ~(M_BCAST|M_MCAST); 878 icmp_send(m, opts); 879done: 880 if (opts) 881 (void)m_free(opts); 882} 883 884/* 885 * Send an icmp packet back to the ip level, 886 * after supplying a checksum. 887 */ 888static void 889icmp_send(struct mbuf *m, struct mbuf *opts) 890{ 891 register struct ip *ip = mtod(m, struct ip *); 892 register int hlen; 893 register struct icmp *icp; 894 895 hlen = ip->ip_hl << 2; 896 m->m_data += hlen; 897 m->m_len -= hlen; 898 icp = mtod(m, struct icmp *); 899 icp->icmp_cksum = 0; 900 icp->icmp_cksum = in_cksum(m, ntohs(ip->ip_len) - hlen); 901 m->m_data -= hlen; 902 m->m_len += hlen; 903 m->m_pkthdr.rcvif = (struct ifnet *)0; 904#ifdef ICMPPRINTFS 905 if (icmpprintfs) { 906 char buf[4 * sizeof "123"]; 907 strcpy(buf, inet_ntoa(ip->ip_dst)); 908 printf("icmp_send dst %s src %s\n", 909 buf, inet_ntoa(ip->ip_src)); 910 } 911#endif 912 (void) ip_output(m, opts, NULL, 0, NULL, NULL); 913} 914 915/* 916 * Return milliseconds since 00:00 GMT in network format. 917 */ 918uint32_t 919iptime(void) 920{ 921 struct timeval atv; 922 u_long t; 923 924 getmicrotime(&atv); 925 t = (atv.tv_sec % (24*60*60)) * 1000 + atv.tv_usec / 1000; 926 return (htonl(t)); 927} 928 929/* 930 * Return the next larger or smaller MTU plateau (table from RFC 1191) 931 * given current value MTU. If DIR is less than zero, a larger plateau 932 * is returned; otherwise, a smaller value is returned. 933 */ 934int 935ip_next_mtu(int mtu, int dir) 936{ 937 static int mtutab[] = { 938 65535, 32000, 17914, 8166, 4352, 2002, 1492, 1280, 1006, 508, 939 296, 68, 0 940 }; 941 int i, size; 942 943 size = (sizeof mtutab) / (sizeof mtutab[0]); 944 if (dir >= 0) { 945 for (i = 0; i < size; i++) 946 if (mtu > mtutab[i]) 947 return mtutab[i]; 948 } else { 949 for (i = size - 1; i >= 0; i--) 950 if (mtu < mtutab[i]) 951 return mtutab[i]; 952 if (mtu == mtutab[0]) 953 return mtutab[0]; 954 } 955 return 0; 956} 957#endif /* INET */ 958 959 960/* 961 * badport_bandlim() - check for ICMP bandwidth limit 962 * 963 * Return 0 if it is ok to send an ICMP error response, -1 if we have 964 * hit our bandwidth limit and it is not ok. 965 * 966 * If icmplim is <= 0, the feature is disabled and 0 is returned. 967 * 968 * For now we separate the TCP and UDP subsystems w/ different 'which' 969 * values. We may eventually remove this separation (and simplify the 970 * code further). 971 * 972 * Note that the printing of the error message is delayed so we can 973 * properly print the icmp error rate that the system was trying to do 974 * (i.e. 22000/100 pps, etc...). This can cause long delays in printing 975 * the 'final' error, but it doesn't make sense to solve the printing 976 * delay with more complex code. 977 */ 978 979int 980badport_bandlim(int which) 981{ 982 983#define N(a) (sizeof (a) / sizeof (a[0])) 984 static struct rate { 985 const char *type; 986 struct timeval lasttime; 987 int curpps; 988 } rates[BANDLIM_MAX+1] = { 989 { "icmp unreach response" }, 990 { "icmp ping response" }, 991 { "icmp tstamp response" }, 992 { "closed port RST response" }, 993 { "open port RST response" }, 994 { "icmp6 unreach response" }, 995 { "sctp ootb response" } 996 }; 997 998 /* 999 * Return ok status if feature disabled or argument out of range. 1000 */ 1001 if (V_icmplim > 0 && (u_int) which < N(rates)) { 1002 struct rate *r = &rates[which]; 1003 int opps = r->curpps; 1004 1005 if (!ppsratecheck(&r->lasttime, &r->curpps, V_icmplim)) 1006 return -1; /* discard packet */ 1007 /* 1008 * If we've dropped below the threshold after having 1009 * rate-limited traffic print the message. This preserves 1010 * the previous behaviour at the expense of added complexity. 1011 */ 1012 if (V_icmplim_output && opps > V_icmplim) 1013 log(LOG_NOTICE, "Limiting %s from %d to %d packets/sec\n", 1014 r->type, opps, V_icmplim); 1015 } 1016 return 0; /* okay to send packet */ 1017#undef N 1018} 1019