Deleted Added
full compact
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 ---