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