in.c (238967) | in.c (238990) |
---|---|
1/*- 2 * Copyright (c) 1982, 1986, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (C) 2001 WIDE Project. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 17 unchanged lines hidden (view full) --- 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * @(#)in.c 8.4 (Berkeley) 1/9/95 31 */ 32 33#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1982, 1986, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (C) 2001 WIDE Project. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 17 unchanged lines hidden (view full) --- 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * @(#)in.c 8.4 (Berkeley) 1/9/95 31 */ 32 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/sys/netinet/in.c 238967 2012-08-01 09:00:26Z glebius $"); | 34__FBSDID("$FreeBSD: head/sys/netinet/in.c 238990 2012-08-02 13:57:49Z glebius $"); |
35 36#include "opt_mpath.h" 37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/sockio.h> 41#include <sys/malloc.h> 42#include <sys/priv.h> --- 1232 unchanged lines hidden (view full) --- 1275in_lltable_new(const struct sockaddr *l3addr, u_int flags) 1276{ 1277 struct in_llentry *lle; 1278 1279 lle = malloc(sizeof(struct in_llentry), M_LLTABLE, M_NOWAIT | M_ZERO); 1280 if (lle == NULL) /* NB: caller generates msg */ 1281 return NULL; 1282 | 35 36#include "opt_mpath.h" 37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/sockio.h> 41#include <sys/malloc.h> 42#include <sys/priv.h> --- 1232 unchanged lines hidden (view full) --- 1275in_lltable_new(const struct sockaddr *l3addr, u_int flags) 1276{ 1277 struct in_llentry *lle; 1278 1279 lle = malloc(sizeof(struct in_llentry), M_LLTABLE, M_NOWAIT | M_ZERO); 1280 if (lle == NULL) /* NB: caller generates msg */ 1281 return NULL; 1282 |
1283 callout_init(&lle->base.la_timer, CALLOUT_MPSAFE); | |
1284 /* 1285 * For IPv4 this will trigger "arpresolve" to generate 1286 * an ARP request. 1287 */ 1288 lle->base.la_expire = time_uptime; /* mark expired */ 1289 lle->l3_addr4 = *(const struct sockaddr_in *)l3addr; 1290 lle->base.lle_refcnt = 1; 1291 lle->base.lle_free = in_lltable_free; 1292 LLE_LOCK_INIT(&lle->base); | 1283 /* 1284 * For IPv4 this will trigger "arpresolve" to generate 1285 * an ARP request. 1286 */ 1287 lle->base.la_expire = time_uptime; /* mark expired */ 1288 lle->l3_addr4 = *(const struct sockaddr_in *)l3addr; 1289 lle->base.lle_refcnt = 1; 1290 lle->base.lle_free = in_lltable_free; 1291 LLE_LOCK_INIT(&lle->base); |
1293 return &lle->base; | 1292 callout_init_rw(&lle->base.la_timer, &lle->base.lle_lock, 1293 CALLOUT_RETURNUNLOCKED); 1294 1295 return (&lle->base); |
1294} 1295 1296#define IN_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \ 1297 (((ntohl((d)->sin_addr.s_addr) ^ (a)->sin_addr.s_addr) & (m)->sin_addr.s_addr)) == 0 ) 1298 1299static void 1300in_lltable_prefix_free(struct lltable *llt, const struct sockaddr *prefix, 1301 const struct sockaddr *mask, u_int flags) 1302{ 1303 const struct sockaddr_in *pfx = (const struct sockaddr_in *)prefix; 1304 const struct sockaddr_in *msk = (const struct sockaddr_in *)mask; 1305 struct llentry *lle, *next; 1306 int i; 1307 size_t pkts_dropped; 1308 | 1296} 1297 1298#define IN_ARE_MASKED_ADDR_EQUAL(d, a, m) ( \ 1299 (((ntohl((d)->sin_addr.s_addr) ^ (a)->sin_addr.s_addr) & (m)->sin_addr.s_addr)) == 0 ) 1300 1301static void 1302in_lltable_prefix_free(struct lltable *llt, const struct sockaddr *prefix, 1303 const struct sockaddr *mask, u_int flags) 1304{ 1305 const struct sockaddr_in *pfx = (const struct sockaddr_in *)prefix; 1306 const struct sockaddr_in *msk = (const struct sockaddr_in *)mask; 1307 struct llentry *lle, *next; 1308 int i; 1309 size_t pkts_dropped; 1310 |
1311 IF_AFDATA_WLOCK(llt->llt_ifp); |
|
1309 for (i = 0; i < LLTBL_HASHTBL_SIZE; i++) { 1310 LIST_FOREACH_SAFE(lle, &llt->lle_head[i], lle_next, next) { 1311 /* 1312 * (flags & LLE_STATIC) means deleting all entries 1313 * including static ARP entries. 1314 */ 1315 if (IN_ARE_MASKED_ADDR_EQUAL(satosin(L3_ADDR(lle)), 1316 pfx, msk) && ((flags & LLE_STATIC) || 1317 !(lle->la_flags & LLE_STATIC))) { | 1312 for (i = 0; i < LLTBL_HASHTBL_SIZE; i++) { 1313 LIST_FOREACH_SAFE(lle, &llt->lle_head[i], lle_next, next) { 1314 /* 1315 * (flags & LLE_STATIC) means deleting all entries 1316 * including static ARP entries. 1317 */ 1318 if (IN_ARE_MASKED_ADDR_EQUAL(satosin(L3_ADDR(lle)), 1319 pfx, msk) && ((flags & LLE_STATIC) || 1320 !(lle->la_flags & LLE_STATIC))) { |
1318 int canceled; 1319 1320 canceled = callout_drain(&lle->la_timer); | |
1321 LLE_WLOCK(lle); | 1321 LLE_WLOCK(lle); |
1322 if (canceled) | 1322 if (callout_stop(&lle->la_timer)) |
1323 LLE_REMREF(lle); 1324 pkts_dropped = llentry_free(lle); 1325 ARPSTAT_ADD(dropped, pkts_dropped); 1326 } 1327 } 1328 } | 1323 LLE_REMREF(lle); 1324 pkts_dropped = llentry_free(lle); 1325 ARPSTAT_ADD(dropped, pkts_dropped); 1326 } 1327 } 1328 } |
1329 IF_AFDATA_WUNLOCK(llt->llt_ifp); |
|
1329} 1330 1331 1332static int 1333in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr) 1334{ 1335 struct rtentry *rt; 1336 --- 115 unchanged lines hidden (view full) --- 1452 lle->la_flags = flags & ~LLE_CREATE; 1453 if ((flags & (LLE_CREATE | LLE_IFADDR)) == (LLE_CREATE | LLE_IFADDR)) { 1454 bcopy(IF_LLADDR(ifp), &lle->ll_addr, ifp->if_addrlen); 1455 lle->la_flags |= (LLE_VALID | LLE_STATIC); 1456 } 1457 1458 lle->lle_tbl = llt; 1459 lle->lle_head = lleh; | 1330} 1331 1332 1333static int 1334in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr) 1335{ 1336 struct rtentry *rt; 1337 --- 115 unchanged lines hidden (view full) --- 1453 lle->la_flags = flags & ~LLE_CREATE; 1454 if ((flags & (LLE_CREATE | LLE_IFADDR)) == (LLE_CREATE | LLE_IFADDR)) { 1455 bcopy(IF_LLADDR(ifp), &lle->ll_addr, ifp->if_addrlen); 1456 lle->la_flags |= (LLE_VALID | LLE_STATIC); 1457 } 1458 1459 lle->lle_tbl = llt; 1460 lle->lle_head = lleh; |
1461 lle->la_flags |= LLE_LINKED; |
|
1460 LIST_INSERT_HEAD(lleh, lle, lle_next); 1461 } else if (flags & LLE_DELETE) { 1462 if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { 1463 LLE_WLOCK(lle); | 1462 LIST_INSERT_HEAD(lleh, lle, lle_next); 1463 } else if (flags & LLE_DELETE) { 1464 if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { 1465 LLE_WLOCK(lle); |
1464 lle->la_flags = LLE_DELETED; | 1466 lle->la_flags |= LLE_DELETED; |
1465 EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED); 1466 LLE_WUNLOCK(lle); 1467#ifdef DIAGNOSTIC 1468 log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); 1469#endif 1470 } 1471 lle = (void *)-1; 1472 --- 120 unchanged lines hidden --- | 1467 EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED); 1468 LLE_WUNLOCK(lle); 1469#ifdef DIAGNOSTIC 1470 log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); 1471#endif 1472 } 1473 lle = (void *)-1; 1474 --- 120 unchanged lines hidden --- |