Lines Matching defs: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);
169 * Runs specified callback for each entry in @llt.
174 htable_foreach_lle(struct lltable *llt, llt_foreach_cb_t *f, void *farg)
181 for (i = 0; i < llt->llt_hsize; i++) {
182 CK_LIST_FOREACH_SAFE(lle, &llt->lle_head[i], lle_next, next) {
183 error = f(llt, lle, farg);
201 htable_link_entry(struct lltable *llt, struct llentry *lle)
209 IF_AFDATA_WLOCK_ASSERT(llt->llt_ifp);
211 if (llt->llt_maxentries > 0 &&
212 llt->llt_entries >= llt->llt_maxentries)
215 hashidx = llt->llt_hash(lle, llt->llt_hsize);
216 lleh = &llt->lle_head[hashidx];
218 lle->lle_tbl = llt;
222 llt->llt_entries++;
230 struct lltable *llt;
235 llt = lle->lle_tbl;
236 IF_AFDATA_WLOCK_ASSERT(llt->llt_ifp);
237 KASSERT(llt->llt_entries > 0, ("%s: lltable %p (%s) entries %d <= 0",
238 __func__, llt, if_name(llt->llt_ifp), llt->llt_entries));
246 llt->llt_entries--;
259 htable_prefix_free_cb(struct lltable *llt, struct llentry *lle, void *farg)
265 if (llt->llt_match_prefix(pmd->addr, pmd->mask, pmd->flags, lle)) {
274 htable_prefix_free(struct lltable *llt, const struct sockaddr *addr,
286 IF_AFDATA_WLOCK(llt->llt_ifp);
288 lltable_foreach_lle(llt, htable_prefix_free_cb, &pmd);
290 llentries_unlink(llt, &pmd.dchain);
291 IF_AFDATA_WUNLOCK(llt->llt_ifp);
294 lltable_free_entry(llt, lle);
298 htable_free_tbl(struct lltable *llt)
301 free(llt->lle_head, M_LLTABLE);
302 free(llt, M_LLTABLE);
306 llentries_unlink(struct lltable *llt, struct llentries *head)
311 llt->llt_unlink_entry(lle);
593 llentry_update_ifaddr(struct lltable *llt, struct llentry *lle, void *farg)
615 lltable_calc_llheader(ifp, llt->llt_af, lladdr, linkhdr, &linkhdrsize,
624 * Update all calculated headers for given @llt
627 lltable_update_ifaddr(struct lltable *llt)
630 if (llt->llt_ifp->if_flags & IFF_LOOPBACK)
633 IF_AFDATA_WLOCK(llt->llt_ifp);
634 lltable_foreach_lle(llt, llentry_update_ifaddr, llt->llt_ifp);
635 IF_AFDATA_WUNLOCK(llt->llt_ifp);
673 lltable_free_cb(struct lltable *llt, struct llentry *lle, void *farg)
689 lltable_free(struct lltable *llt)
694 KASSERT(llt != NULL, ("%s: llt is NULL", __func__));
696 lltable_unlink(llt);
699 IF_AFDATA_WLOCK(llt->llt_ifp);
701 lltable_foreach_lle(llt, lltable_free_cb, &dchain);
702 llentries_unlink(llt, &dchain);
703 IF_AFDATA_WUNLOCK(llt->llt_ifp);
709 KASSERT(llt->llt_entries == 0, ("%s: lltable %p (%s) entries not 0: %d",
710 __func__, llt, llt->llt_ifp->if_xname, llt->llt_entries));
712 llt->llt_free_tbl(llt);
721 lltable_delete_addr(struct lltable *llt, u_int flags,
727 ifp = llt->llt_ifp;
729 lle = lla_lookup(llt, LLE_SF(l3addr->sa_family, LLE_EXCLUSIVE), l3addr);
741 lltable_unlink_entry(llt, lle);
744 llt->llt_delete_entry(llt, lle);
753 struct lltable *llt;
756 SLIST_FOREACH(llt, &V_lltables, llt_link) {
757 if (llt->llt_af != af)
760 llt->llt_prefix_free(llt, addr, mask, flags);
775 lltable_delete_conditional_cb(struct lltable *llt, struct llentry *lle,
781 if (lmd->func(llt, lle, lmd->farg)) {
790 lltable_delete_conditional(struct lltable *llt, llt_match_cb_t *func,
801 IF_AFDATA_WLOCK(llt->llt_ifp);
802 lltable_foreach_lle(llt, lltable_delete_conditional_cb, &lmd);
803 llentries_unlink(llt, &lmd.dchain);
804 IF_AFDATA_WUNLOCK(llt->llt_ifp);
807 llt->llt_delete_entry(llt, lle);
813 struct lltable *llt;
816 llt = malloc(sizeof(struct lltable), M_LLTABLE, M_WAITOK | M_ZERO);
817 llt->llt_hsize = hsize;
818 llt->lle_head = malloc(sizeof(struct llentries) * hsize,
821 for (i = 0; i < llt->llt_hsize; i++)
822 CK_LIST_INIT(&llt->lle_head[i]);
825 llt->llt_link_entry = htable_link_entry;
826 llt->llt_unlink_entry = htable_unlink_entry;
827 llt->llt_prefix_free = htable_prefix_free;
828 llt->llt_foreach_entry = htable_foreach_lle;
829 llt->llt_free_tbl = htable_free_tbl;
831 return (llt);
835 * Links lltable to global llt list.
838 lltable_link(struct lltable *llt)
842 SLIST_INSERT_HEAD(&V_lltables, llt, llt_link);
847 lltable_unlink(struct lltable *llt)
851 SLIST_REMOVE(&V_lltables, llt, lltable, llt_link);
881 lltable_foreach_lle(struct lltable *llt, llt_foreach_cb_t *f, void *farg)
884 return (llt->llt_foreach_entry(llt, f, farg));
888 lltable_alloc_entry(struct lltable *llt, u_int flags,
892 return (llt->llt_alloc_entry(llt, flags, l3addr));
896 lltable_free_entry(struct lltable *llt, struct llentry *lle)
899 llt->llt_free_entry(llt, lle);
903 lltable_link_entry(struct lltable *llt, struct llentry *lle)
905 int error = llt->llt_link_entry(llt, lle);
908 llt->llt_flags |= LLT_ADDEDPROXY;
933 lltable_unlink_entry(struct lltable *llt, struct llentry *lle)
936 return (llt->llt_unlink_entry(lle));
942 struct lltable *llt;
944 llt = lle->lle_tbl;
945 llt->llt_fill_sa_entry(lle, sa);
949 lltable_get_ifp(const struct lltable *llt)
952 return (llt->llt_ifp);
956 lltable_get_af(const struct lltable *llt)
959 return (llt->llt_af);
972 struct lltable *llt;
991 llt = lltable_get(ifp, dst->sa_family);
993 if (llt == NULL)
1004 lle = lltable_alloc_entry(llt, laflags, dst);
1011 lltable_free_entry(llt, lle);
1026 lle_tmp = lla_lookup(llt, LLE_EXCLUSIVE, dst);
1032 lltable_free_entry(llt, lle);
1036 lltable_unlink_entry(llt, lle_tmp);
1038 lltable_link_entry(llt, lle);
1043 lltable_free_entry(llt, lle_tmp);
1054 llt->llt_post_resolved(llt, lle);
1058 return (lltable_delete_addr(llt, 0, dst));
1142 llatbl_llt_show(struct lltable *llt)
1147 db_printf("llt=%p llt_af=%d llt_ifp=%p\n",
1148 llt, llt->llt_af, llt->llt_ifp);
1150 for (i = 0; i < llt->llt_hsize; i++) {
1151 CK_LIST_FOREACH(lle, &llt->lle_head[i], lle_next) {
1173 struct lltable *llt;
1180 SLIST_FOREACH(llt, &V_lltables, llt_link) {
1181 db_printf("llt=%p llt_af=%d llt_ifp=%p(%s)\n",
1182 llt, llt->llt_af, llt->llt_ifp,
1183 (llt->llt_ifp != NULL) ?
1184 llt->llt_ifp->if_xname : "?");
1186 llatbl_llt_show(llt);