MCPcopy Create free account
hub / github.com/F-Stack/f-stack / in_lltable_alloc

Function in_lltable_alloc

freebsd/netinet/in.c:1515–1559  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1513}
1514
1515static struct llentry *
1516in_lltable_alloc(struct lltable *llt, u_int flags, const struct sockaddr *l3addr)
1517{
1518 const struct sockaddr_in *sin = (const struct sockaddr_in *)l3addr;
1519 struct ifnet *ifp = llt->llt_ifp;
1520 struct llentry *lle;
1521 char linkhdr[LLE_MAX_LINKHDR];
1522 size_t linkhdrsize;
1523 int lladdr_off;
1524
1525 KASSERT(l3addr->sa_family == AF_INET,
1526 ("sin_family %d", l3addr->sa_family));
1527
1528 /*
1529 * A route that covers the given address must have
1530 * been installed 1st because we are doing a resolution,
1531 * verify this.
1532 */
1533 if (!(flags & LLE_IFADDR) &&
1534 in_lltable_rtcheck(ifp, flags, l3addr) != 0)
1535 return (NULL);
1536
1537 lle = in_lltable_new(sin->sin_addr, flags);
1538 if (lle == NULL) {
1539 log(LOG_INFO, "lla_lookup: new lle malloc failed\n");
1540 return (NULL);
1541 }
1542 lle->la_flags = flags;
1543 if (flags & LLE_STATIC)
1544 lle->r_flags |= RLLE_VALID;
1545 if ((flags & LLE_IFADDR) == LLE_IFADDR) {
1546 linkhdrsize = LLE_MAX_LINKHDR;
1547 if (lltable_calc_llheader(ifp, AF_INET, IF_LLADDR(ifp),
1548 linkhdr, &linkhdrsize, &lladdr_off) != 0) {
1549 NET_EPOCH_CALL(in_lltable_destroy_lle_unlocked, &lle->lle_epoch_ctx);
1550 return (NULL);
1551 }
1552 lltable_set_entry_addr(ifp, lle, linkhdr, linkhdrsize,
1553 lladdr_off);
1554 lle->la_flags |= LLE_STATIC;
1555 lle->r_flags |= (RLLE_VALID | RLLE_IFADDR);
1556 }
1557
1558 return (lle);
1559}
1560
1561/*
1562 * Return NULL if not found or marked for deletion.

Callers

nothing calls this directly

Calls 5

in_lltable_rtcheckFunction · 0.85
in_lltable_newFunction · 0.85
lltable_calc_llheaderFunction · 0.85
lltable_set_entry_addrFunction · 0.85
logFunction · 0.50

Tested by

no test coverage detected