icmp6.c (285084) | icmp6.c (287798) |
---|---|
1/*- 2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 3 * 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 --- 47 unchanged lines hidden (view full) --- 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * @(#)ip_icmp.c 8.2 (Berkeley) 1/4/94 61 */ 62 63#include <sys/cdefs.h> | 1/*- 2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 3 * 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 --- 47 unchanged lines hidden (view full) --- 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * @(#)ip_icmp.c 8.2 (Berkeley) 1/4/94 61 */ 62 63#include <sys/cdefs.h> |
64__FBSDID("$FreeBSD: head/sys/netinet6/icmp6.c 285084 2015-07-03 09:53:56Z bz $"); | 64__FBSDID("$FreeBSD: head/sys/netinet6/icmp6.c 287798 2015-09-14 19:17:25Z vangyzen $"); |
65 66#define MBUF_PRIVATE /* XXXRW: Optimisation tries to avoid M_EXT mbufs */ 67 68#include "opt_inet.h" 69#include "opt_inet6.h" 70 71#include <sys/param.h> 72#include <sys/domain.h> --- 2356 unchanged lines hidden (view full) --- 2429 } 2430 2431 /* Validation passed. */ 2432 2433 /* RFC 2461 8.3 */ 2434 nd6_cache_lladdr(ifp, &redtgt6, lladdr, lladdrlen, ND_REDIRECT, 2435 is_onlink ? ND_REDIRECT_ONLINK : ND_REDIRECT_ROUTER); 2436 | 65 66#define MBUF_PRIVATE /* XXXRW: Optimisation tries to avoid M_EXT mbufs */ 67 68#include "opt_inet.h" 69#include "opt_inet6.h" 70 71#include <sys/param.h> 72#include <sys/domain.h> --- 2356 unchanged lines hidden (view full) --- 2429 } 2430 2431 /* Validation passed. */ 2432 2433 /* RFC 2461 8.3 */ 2434 nd6_cache_lladdr(ifp, &redtgt6, lladdr, lladdrlen, ND_REDIRECT, 2435 is_onlink ? ND_REDIRECT_ONLINK : ND_REDIRECT_ROUTER); 2436 |
2437 if (!is_onlink) { /* better router case. perform rtredirect. */ 2438 /* perform rtredirect */ | 2437 /* 2438 * Install a gateway route in the better-router case or an interface 2439 * route in the on-link-destination case. 2440 */ 2441 { |
2439 struct sockaddr_in6 sdst; 2440 struct sockaddr_in6 sgw; 2441 struct sockaddr_in6 ssrc; | 2442 struct sockaddr_in6 sdst; 2443 struct sockaddr_in6 sgw; 2444 struct sockaddr_in6 ssrc; |
2445 struct sockaddr *gw; 2446 int rt_flags; |
|
2442 u_int fibnum; 2443 2444 bzero(&sdst, sizeof(sdst)); | 2447 u_int fibnum; 2448 2449 bzero(&sdst, sizeof(sdst)); |
2445 bzero(&sgw, sizeof(sgw)); | |
2446 bzero(&ssrc, sizeof(ssrc)); | 2450 bzero(&ssrc, sizeof(ssrc)); |
2447 sdst.sin6_family = sgw.sin6_family = ssrc.sin6_family = AF_INET6; 2448 sdst.sin6_len = sgw.sin6_len = ssrc.sin6_len = 2449 sizeof(struct sockaddr_in6); 2450 bcopy(&redtgt6, &sgw.sin6_addr, sizeof(struct in6_addr)); | 2451 sdst.sin6_family = ssrc.sin6_family = AF_INET6; 2452 sdst.sin6_len = ssrc.sin6_len = sizeof(struct sockaddr_in6); |
2451 bcopy(&reddst6, &sdst.sin6_addr, sizeof(struct in6_addr)); 2452 bcopy(&src6, &ssrc.sin6_addr, sizeof(struct in6_addr)); | 2453 bcopy(&reddst6, &sdst.sin6_addr, sizeof(struct in6_addr)); 2454 bcopy(&src6, &ssrc.sin6_addr, sizeof(struct in6_addr)); |
2455 rt_flags = RTF_HOST; 2456 if (is_router) { 2457 bzero(&sgw, sizeof(sgw)); 2458 sgw.sin6_family = AF_INET6; 2459 sgw.sin6_len = sizeof(struct sockaddr_in6); 2460 bcopy(&redtgt6, &sgw.sin6_addr, 2461 sizeof(struct in6_addr)); 2462 gw = (struct sockaddr *)&sgw; 2463 rt_flags |= RTF_GATEWAY; 2464 } else 2465 gw = ifp->if_addr->ifa_addr; |
|
2453 for (fibnum = 0; fibnum < rt_numfibs; fibnum++) | 2466 for (fibnum = 0; fibnum < rt_numfibs; fibnum++) |
2454 in6_rtredirect((struct sockaddr *)&sdst, 2455 (struct sockaddr *)&sgw, (struct sockaddr *)NULL, 2456 RTF_GATEWAY | RTF_HOST, (struct sockaddr *)&ssrc, 2457 fibnum); | 2467 in6_rtredirect((struct sockaddr *)&sdst, gw, 2468 (struct sockaddr *)NULL, rt_flags, 2469 (struct sockaddr *)&ssrc, fibnum); |
2458 } 2459 /* finally update cached route in each socket via pfctlinput */ 2460 { 2461 struct sockaddr_in6 sdst; 2462 2463 bzero(&sdst, sizeof(sdst)); 2464 sdst.sin6_family = AF_INET6; 2465 sdst.sin6_len = sizeof(struct sockaddr_in6); --- 405 unchanged lines hidden --- | 2470 } 2471 /* finally update cached route in each socket via pfctlinput */ 2472 { 2473 struct sockaddr_in6 sdst; 2474 2475 bzero(&sdst, sizeof(sdst)); 2476 sdst.sin6_family = AF_INET6; 2477 sdst.sin6_len = sizeof(struct sockaddr_in6); --- 405 unchanged lines hidden --- |