in6.c (238967) | in6.c (238990) |
---|---|
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 * @(#)in.c 8.2 (Berkeley) 11/15/93 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 * @(#)in.c 8.2 (Berkeley) 11/15/93 61 */ 62 63#include <sys/cdefs.h> |
64__FBSDID("$FreeBSD: head/sys/netinet6/in6.c 238967 2012-08-01 09:00:26Z glebius $"); | 64__FBSDID("$FreeBSD: head/sys/netinet6/in6.c 238990 2012-08-02 13:57:49Z glebius $"); |
65 66#include "opt_compat.h" 67#include "opt_inet.h" 68#include "opt_inet6.h" 69 70#include <sys/param.h> 71#include <sys/errno.h> 72#include <sys/jail.h> --- 2419 unchanged lines hidden (view full) --- 2492 const struct sockaddr_in6 *msk = (const struct sockaddr_in6 *)mask; 2493 struct llentry *lle, *next; 2494 int i; 2495 2496 /* 2497 * (flags & LLE_STATIC) means deleting all entries 2498 * including static ND6 entries. 2499 */ | 65 66#include "opt_compat.h" 67#include "opt_inet.h" 68#include "opt_inet6.h" 69 70#include <sys/param.h> 71#include <sys/errno.h> 72#include <sys/jail.h> --- 2419 unchanged lines hidden (view full) --- 2492 const struct sockaddr_in6 *msk = (const struct sockaddr_in6 *)mask; 2493 struct llentry *lle, *next; 2494 int i; 2495 2496 /* 2497 * (flags & LLE_STATIC) means deleting all entries 2498 * including static ND6 entries. 2499 */ |
2500 IF_AFDATA_WLOCK(llt->llt_ifp); |
|
2500 for (i = 0; i < LLTBL_HASHTBL_SIZE; i++) { 2501 LIST_FOREACH_SAFE(lle, &llt->lle_head[i], lle_next, next) { 2502 if (IN6_ARE_MASKED_ADDR_EQUAL( | 2501 for (i = 0; i < LLTBL_HASHTBL_SIZE; i++) { 2502 LIST_FOREACH_SAFE(lle, &llt->lle_head[i], lle_next, next) { 2503 if (IN6_ARE_MASKED_ADDR_EQUAL( |
2503 &((struct sockaddr_in6 *)L3_ADDR(lle))->sin6_addr, 2504 &pfx->sin6_addr, 2505 &msk->sin6_addr) && 2506 ((flags & LLE_STATIC) || !(lle->la_flags & LLE_STATIC))) { 2507 int canceled; 2508 2509 canceled = callout_drain(&lle->la_timer); | 2504 &satosin6(L3_ADDR(lle))->sin6_addr, 2505 &pfx->sin6_addr, &msk->sin6_addr) && 2506 ((flags & LLE_STATIC) || 2507 !(lle->la_flags & LLE_STATIC))) { |
2510 LLE_WLOCK(lle); | 2508 LLE_WLOCK(lle); |
2511 if (canceled) | 2509 if (callout_stop(&lle->la_timer)) |
2512 LLE_REMREF(lle); 2513 llentry_free(lle); 2514 } 2515 } 2516 } | 2510 LLE_REMREF(lle); 2511 llentry_free(lle); 2512 } 2513 } 2514 } |
2515 IF_AFDATA_WUNLOCK(llt->llt_ifp); |
|
2517} 2518 2519static int 2520in6_lltable_rtcheck(struct ifnet *ifp, 2521 u_int flags, 2522 const struct sockaddr *l3addr) 2523{ 2524 struct rtentry *rt; --- 75 unchanged lines hidden (view full) --- 2600 lle->la_flags = flags & ~LLE_CREATE; 2601 if ((flags & (LLE_CREATE | LLE_IFADDR)) == (LLE_CREATE | LLE_IFADDR)) { 2602 bcopy(IF_LLADDR(ifp), &lle->ll_addr, ifp->if_addrlen); 2603 lle->la_flags |= (LLE_VALID | LLE_STATIC); 2604 } 2605 2606 lle->lle_tbl = llt; 2607 lle->lle_head = lleh; | 2516} 2517 2518static int 2519in6_lltable_rtcheck(struct ifnet *ifp, 2520 u_int flags, 2521 const struct sockaddr *l3addr) 2522{ 2523 struct rtentry *rt; --- 75 unchanged lines hidden (view full) --- 2599 lle->la_flags = flags & ~LLE_CREATE; 2600 if ((flags & (LLE_CREATE | LLE_IFADDR)) == (LLE_CREATE | LLE_IFADDR)) { 2601 bcopy(IF_LLADDR(ifp), &lle->ll_addr, ifp->if_addrlen); 2602 lle->la_flags |= (LLE_VALID | LLE_STATIC); 2603 } 2604 2605 lle->lle_tbl = llt; 2606 lle->lle_head = lleh; |
2607 lle->la_flags |= LLE_LINKED; |
|
2608 LIST_INSERT_HEAD(lleh, lle, lle_next); 2609 } else if (flags & LLE_DELETE) { 2610 if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { 2611 LLE_WLOCK(lle); | 2608 LIST_INSERT_HEAD(lleh, lle, lle_next); 2609 } else if (flags & LLE_DELETE) { 2610 if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { 2611 LLE_WLOCK(lle); |
2612 lle->la_flags = LLE_DELETED; | 2612 lle->la_flags |= LLE_DELETED; |
2613 LLE_WUNLOCK(lle); 2614#ifdef DIAGNOSTIC 2615 log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); 2616#endif 2617 } 2618 lle = (void *)-1; 2619 } 2620 if (LLE_IS_VALID(lle)) { --- 187 unchanged lines hidden --- | 2613 LLE_WUNLOCK(lle); 2614#ifdef DIAGNOSTIC 2615 log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); 2616#endif 2617 } 2618 lle = (void *)-1; 2619 } 2620 if (LLE_IS_VALID(lle)) { --- 187 unchanged lines hidden --- |