| 1513 | } |
| 1514 | |
| 1515 | static struct llentry * |
| 1516 | in_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. |
nothing calls this directly
no test coverage detected