Lines Matching refs:llt

81 static void lltable_unlink(struct lltable *llt);
82 static void llentries_unlink(struct lltable *llt, struct llentries *head);
88 lltable_dump_af(struct lltable *llt, struct sysctl_req *wr)
95 if (llt->llt_ifp->if_flags & IFF_LOOPBACK)
100 error = lltable_foreach_lle(llt,
101 (llt_foreach_cb_t *)llt->llt_dump_entry, wr);
113 struct lltable *llt;
117 SLIST_FOREACH(llt, &V_lltables, llt_link) {
118 if (llt->llt_af == af) {
119 error = lltable_dump_af(llt, wr);
134 * Runs specified callback for each entry in @llt.
139 htable_foreach_lle(struct lltable *llt, llt_foreach_cb_t *f, void *farg)
146 for (i = 0; i < llt->llt_hsize; i++) {
147 CK_LIST_FOREACH_SAFE(lle, &llt->lle_head[i], lle_next, next) {
148 error = f(llt, lle, farg);
166 htable_link_entry(struct lltable *llt, struct llentry *lle)
174 IF_AFDATA_WLOCK_ASSERT(llt->llt_ifp);
176 if (llt->llt_maxentries > 0 &&
177 llt->llt_entries >= llt->llt_maxentries)
180 hashidx = llt->llt_hash(lle, llt->llt_hsize);
181 lleh = &llt->lle_head[hashidx];
183 lle->lle_tbl = llt;
187 llt->llt_entries++;
195 struct lltable *llt;
200 llt = lle->lle_tbl;
201 IF_AFDATA_WLOCK_ASSERT(llt->llt_ifp);
202 KASSERT(llt->llt_entries > 0, ("%s: lltable %p (%s) entries %d <= 0",
203 __func__, llt, if_name(llt->llt_ifp), llt->llt_entries));
211 llt->llt_entries--;
224 htable_prefix_free_cb(struct lltable *llt, struct llentry *lle, void *farg)
230 if (llt->llt_match_prefix(pmd->addr, pmd->mask, pmd->flags, lle)) {
239 htable_prefix_free(struct lltable *llt, const struct sockaddr *addr,
251 IF_AFDATA_WLOCK(llt->llt_ifp);
253 lltable_foreach_lle(llt, htable_prefix_free_cb, &pmd);
255 llentries_unlink(llt, &pmd.dchain);
256 IF_AFDATA_WUNLOCK(llt->llt_ifp);
259 lltable_free_entry(llt, lle);
263 htable_free_tbl(struct lltable *llt)
266 free(llt->lle_head, M_LLTABLE);
267 free(llt, M_LLTABLE);
271 llentries_unlink(struct lltable *llt, struct llentries *head)
276 llt->llt_unlink_entry(lle);
394 llentry_update_ifaddr(struct lltable *llt, struct llentry *lle, void *farg)
416 lltable_calc_llheader(ifp, llt->llt_af, lladdr, linkhdr, &linkhdrsize,
425 * Update all calculated headers for given @llt
428 lltable_update_ifaddr(struct lltable *llt)
431 if (llt->llt_ifp->if_flags & IFF_LOOPBACK)
434 IF_AFDATA_WLOCK(llt->llt_ifp);
435 lltable_foreach_lle(llt, llentry_update_ifaddr, llt->llt_ifp);
436 IF_AFDATA_WUNLOCK(llt->llt_ifp);
474 lltable_free_cb(struct lltable *llt, struct llentry *lle, void *farg)
490 lltable_free(struct lltable *llt)
495 KASSERT(llt != NULL, ("%s: llt is NULL", __func__));
497 lltable_unlink(llt);
500 IF_AFDATA_WLOCK(llt->llt_ifp);
502 lltable_foreach_lle(llt, lltable_free_cb, &dchain);
503 llentries_unlink(llt, &dchain);
504 IF_AFDATA_WUNLOCK(llt->llt_ifp);
510 KASSERT(llt->llt_entries == 0, ("%s: lltable %p (%s) entires not 0: %d",
511 __func__, llt, llt->llt_ifp->if_xname, llt->llt_entries));
513 llt->llt_free_tbl(llt);
522 lltable_delete_addr(struct lltable *llt, u_int flags,
528 ifp = llt->llt_ifp;
530 lle = lla_lookup(llt, LLE_EXCLUSIVE, l3addr);
542 lltable_unlink_entry(llt, lle);
545 llt->llt_delete_entry(llt, lle);
554 struct lltable *llt;
557 SLIST_FOREACH(llt, &V_lltables, llt_link) {
558 if (llt->llt_af != af)
561 llt->llt_prefix_free(llt, addr, mask, flags);
569 struct lltable *llt;
572 llt = malloc(sizeof(struct lltable), M_LLTABLE, M_WAITOK | M_ZERO);
573 llt->llt_hsize = hsize;
574 llt->lle_head = malloc(sizeof(struct llentries) * hsize,
577 for (i = 0; i < llt->llt_hsize; i++)
578 CK_LIST_INIT(&llt->lle_head[i]);
581 llt->llt_link_entry = htable_link_entry;
582 llt->llt_unlink_entry = htable_unlink_entry;
583 llt->llt_prefix_free = htable_prefix_free;
584 llt->llt_foreach_entry = htable_foreach_lle;
585 llt->llt_free_tbl = htable_free_tbl;
587 return (llt);
591 * Links lltable to global llt list.
594 lltable_link(struct lltable *llt)
598 SLIST_INSERT_HEAD(&V_lltables, llt, llt_link);
603 lltable_unlink(struct lltable *llt)
607 SLIST_REMOVE(&V_lltables, llt, lltable, llt_link);
617 lltable_foreach_lle(struct lltable *llt, llt_foreach_cb_t *f, void *farg)
620 return (llt->llt_foreach_entry(llt, f, farg));
624 lltable_alloc_entry(struct lltable *llt, u_int flags,
628 return (llt->llt_alloc_entry(llt, flags, l3addr));
632 lltable_free_entry(struct lltable *llt, struct llentry *lle)
635 llt->llt_free_entry(llt, lle);
639 lltable_link_entry(struct lltable *llt, struct llentry *lle)
642 return (llt->llt_link_entry(llt, lle));
646 lltable_unlink_entry(struct lltable *llt, struct llentry *lle)
649 return (llt->llt_unlink_entry(lle));
655 struct lltable *llt;
657 llt = lle->lle_tbl;
658 llt->llt_fill_sa_entry(lle, sa);
662 lltable_get_ifp(const struct lltable *llt)
665 return (llt->llt_ifp);
669 lltable_get_af(const struct lltable *llt)
672 return (llt->llt_af);
685 struct lltable *llt;
706 SLIST_FOREACH(llt, &V_lltables, llt_link) {
707 if (llt->llt_af == dst->sa_family &&
708 llt->llt_ifp == ifp)
712 if (llt == NULL)
723 lle = lltable_alloc_entry(llt, laflags, dst);
743 lle_tmp = lla_lookup(llt, LLE_EXCLUSIVE, dst);
749 lltable_free_entry(llt, lle);
753 lltable_unlink_entry(llt, lle_tmp);
755 lltable_link_entry(llt, lle);
760 lltable_free_entry(llt, lle_tmp);
783 return (lltable_delete_addr(llt, 0, dst));
868 llatbl_llt_show(struct lltable *llt)
873 db_printf("llt=%p llt_af=%d llt_ifp=%p\n",
874 llt, llt->llt_af, llt->llt_ifp);
876 for (i = 0; i < llt->llt_hsize; i++) {
877 CK_LIST_FOREACH(lle, &llt->lle_head[i], lle_next) {
899 struct lltable *llt;
906 SLIST_FOREACH(llt, &V_lltables, llt_link) {
907 db_printf("llt=%p llt_af=%d llt_ifp=%p(%s)\n",
908 llt, llt->llt_af, llt->llt_ifp,
909 (llt->llt_ifp != NULL) ?
910 llt->llt_ifp->if_xname : "?");
912 llatbl_llt_show(llt);