Lines Matching refs:ifc

112 static void	if_clone_free(struct if_clone *ifc);
113 static int if_clone_createif_nl(struct if_clone *ifc, const char *name,
116 static int ifc_simple_match(struct if_clone *ifc, const char *name);
117 static int ifc_handle_unit(struct if_clone *ifc, char *name, size_t len, int *punit);
122 static int ifc_simple_create_wrapper(struct if_clone *ifc, char *name, size_t maxlen,
124 static int ifc_advanced_create_wrapper(struct if_clone *ifc, char *name, size_t maxlen,
140 #define IF_CLONE_LOCK_INIT(ifc) \ argument
141 mtx_init(&(ifc)->ifc_mtx, "if_clone lock", NULL, MTX_DEF)
142 #define IF_CLONE_LOCK_DESTROY(ifc) mtx_destroy(&(ifc)->ifc_mtx) argument
143 #define IF_CLONE_LOCK_ASSERT(ifc) mtx_assert(&(ifc)->ifc_mtx, MA_OWNED) argument
144 #define IF_CLONE_LOCK(ifc) mtx_lock(&(ifc)->ifc_mtx) argument
145 #define IF_CLONE_UNLOCK(ifc) mtx_unlock(&(ifc)->ifc_mtx) argument
147 #define IF_CLONE_ADDREF(ifc) \ argument
149 IF_CLONE_LOCK(ifc); \
150 IF_CLONE_ADDREF_LOCKED(ifc); \
151 IF_CLONE_UNLOCK(ifc); \
153 #define IF_CLONE_ADDREF_LOCKED(ifc) \ argument
155 IF_CLONE_LOCK_ASSERT(ifc); \
156 KASSERT((ifc)->ifc_refcnt >= 0, \
157 ("negative refcnt %ld", (ifc)->ifc_refcnt)); \
158 (ifc)->ifc_refcnt++; \
160 #define IF_CLONE_REMREF(ifc) \ argument
162 IF_CLONE_LOCK(ifc); \
163 IF_CLONE_REMREF_LOCKED(ifc); \
165 #define IF_CLONE_REMREF_LOCKED(ifc) \ argument
167 IF_CLONE_LOCK_ASSERT(ifc); \
168 KASSERT((ifc)->ifc_refcnt > 0, \
169 ("bogus refcnt %ld", (ifc)->ifc_refcnt)); \
170 if (--(ifc)->ifc_refcnt == 0) { \
171 IF_CLONE_UNLOCK(ifc); \
172 if_clone_free(ifc); \
175 IF_CLONE_UNLOCK(ifc); \
192 struct if_clone *ifc = ifc_find_cloner_match(name); in ifc_create_ifp() local
194 if (ifc == NULL) in ifc_create_ifp()
203 int error = if_clone_createif_nl(ifc, name, &ifd_new); in ifc_create_ifp()
214 struct if_clone *ifc = ifc_find_cloner_match(name); in ifc_create_ifp_nl() local
215 if (ifc == NULL) { in ifc_create_ifp_nl()
220 ifd->error = if_clone_createif_nl(ifc, name, ifd); in ifc_create_ifp_nl()
242 struct if_clone *ifc = ifc_find_cloner(ifp->if_dname); in ifc_modify_ifp_nl() local
243 if (ifc == NULL) { in ifc_modify_ifp_nl()
248 ifd->error = (*ifc->modify_nl)(ifp, ifd); in ifc_modify_ifp_nl()
255 struct if_clone *ifc = ifc_find_cloner(ifp->if_dname); in ifc_dump_ifp_nl() local
256 if (ifc == NULL) in ifc_dump_ifp_nl()
259 (*ifc->dump_nl)(ifp, nw); in ifc_dump_ifp_nl()
264 ifc_create_ifp_nl_default(struct if_clone *ifc, char *name, size_t len, in ifc_create_ifp_nl_default() argument
273 return ((*ifc->ifc_create)(ifc, name, len, &ifd_new, &ifd->ifp)); in ifc_create_ifp_nl_default()
296 ifc_link_ifp(struct if_clone *ifc, struct ifnet *ifp) in ifc_link_ifp() argument
299 if_addgroup(ifp, ifc->ifc_name); in ifc_link_ifp()
301 IF_CLONE_LOCK(ifc); in ifc_link_ifp()
302 IFC_IFLIST_INSERT(ifc, ifp); in ifc_link_ifp()
303 IF_CLONE_UNLOCK(ifc); in ifc_link_ifp()
307 if_clone_addif(struct if_clone *ifc, struct ifnet *ifp) in if_clone_addif() argument
309 ifc_link_ifp(ifc, ifp); in if_clone_addif()
313 ifc_unlink_ifp(struct if_clone *ifc, struct ifnet *ifp) in ifc_unlink_ifp() argument
317 IF_CLONE_LOCK(ifc); in ifc_unlink_ifp()
318 LIST_FOREACH(ifcifp, &ifc->ifc_iflist, if_clones) { in ifc_unlink_ifp()
320 IFC_IFLIST_REMOVE(ifc, ifp); in ifc_unlink_ifp()
324 IF_CLONE_UNLOCK(ifc); in ifc_unlink_ifp()
327 if_delgroup(ifp, ifc->ifc_name); in ifc_unlink_ifp()
335 struct if_clone *ifc; in ifc_find_cloner_match() local
338 LIST_FOREACH(ifc, &V_if_cloners, ifc_list) { in ifc_find_cloner_match()
339 if (ifc->ifc_match(ifc, name)) in ifc_find_cloner_match()
344 return (ifc); in ifc_find_cloner_match()
350 struct if_clone *ifc; in ifc_find_cloner() local
353 LIST_FOREACH(ifc, &V_if_cloners, ifc_list) { in ifc_find_cloner()
354 if (strcmp(ifc->ifc_name, name) == 0) { in ifc_find_cloner()
360 return (ifc); in ifc_find_cloner()
367 struct if_clone *ifc = ifc_find_cloner(name); in ifc_find_cloner_in_vnet() local
370 return (ifc); in ifc_find_cloner_in_vnet()
377 if_clone_createif_nl(struct if_clone *ifc, const char *ifname, struct ifc_data_nl *ifd) in if_clone_createif_nl() argument
387 if (ifc->ifc_flags & IFC_F_AUTOUNIT) { in if_clone_createif_nl()
388 if ((error = ifc_handle_unit(ifc, name, sizeof(name), &ifd->unit)) != 0) in if_clone_createif_nl()
393 error = (*ifc->create_nl)(ifc, name, sizeof(name), ifd); in if_clone_createif_nl()
395 error = ifc_create_ifp_nl_default(ifc, name, sizeof(name), ifd); in if_clone_createif_nl()
397 if (ifc->ifc_flags & IFC_F_AUTOUNIT) in if_clone_createif_nl()
398 ifc_free_unit(ifc, ifd->unit); in if_clone_createif_nl()
403 if_clone_addif(ifc, ifd->ifp); in if_clone_createif_nl()
406 error = (*ifc->modify_nl)(ifd->ifp, ifd); in if_clone_createif_nl()
418 struct if_clone *ifc; in if_clone_destroy() local
425 ifc = ifc_find_cloner_in_vnet(ifp->if_dname, ifp->if_home_vnet); in if_clone_destroy()
426 if (ifc == NULL) { in if_clone_destroy()
431 err = if_clone_destroyif(ifc, ifp); in if_clone_destroy()
440 if_clone_destroyif_flags(struct if_clone *ifc, struct ifnet *ifp, uint32_t flags) in if_clone_destroyif_flags() argument
451 if (!ifc_unlink_ifp(ifc, ifp)) { in if_clone_destroyif_flags()
457 err = (*ifc->ifc_destroy)(ifc, ifp, flags); in if_clone_destroyif_flags()
460 ifc_link_ifp(ifc, ifp); in if_clone_destroyif_flags()
461 else if (ifc->ifc_flags & IFC_F_AUTOUNIT) in if_clone_destroyif_flags()
462 ifc_free_unit(ifc, unit); in if_clone_destroyif_flags()
468 if_clone_destroyif(struct if_clone *ifc, struct ifnet *ifp) in if_clone_destroyif() argument
470 return (if_clone_destroyif_flags(ifc, ifp, 0)); in if_clone_destroyif()
476 struct if_clone *ifc; in if_clone_alloc() local
481 ifc = malloc(sizeof(struct if_clone), M_CLONE, M_WAITOK | M_ZERO); in if_clone_alloc()
482 strncpy(ifc->ifc_name, name, IFCLOSIZ-1); in if_clone_alloc()
483 IF_CLONE_LOCK_INIT(ifc); in if_clone_alloc()
484 IF_CLONE_ADDREF(ifc); in if_clone_alloc()
485 ifc->ifc_maxunit = maxunit; in if_clone_alloc()
486 ifc->ifc_unrhdr = new_unrhdr(0, ifc->ifc_maxunit, &ifc->ifc_mtx); in if_clone_alloc()
487 LIST_INIT(&ifc->ifc_iflist); in if_clone_alloc()
489 ifc->create_nl = ifc_create_ifp_nl_default; in if_clone_alloc()
490 ifc->modify_nl = ifc_modify_ifp_nl_default; in if_clone_alloc()
491 ifc->dump_nl = ifc_dump_ifp_nl_default; in if_clone_alloc()
493 return (ifc); in if_clone_alloc()
497 if_clone_attach(struct if_clone *ifc) in if_clone_attach() argument
503 if (strcmp(ifc->ifc_name, ifc1->ifc_name) == 0) { in if_clone_attach()
505 IF_CLONE_REMREF(ifc); in if_clone_attach()
508 LIST_INSERT_HEAD(&V_if_cloners, ifc, ifc_list); in if_clone_attach()
519 struct if_clone *ifc; in ifc_attach_cloner() local
527 ifc = if_clone_alloc(name, maxunit); in ifc_attach_cloner()
528 ifc->ifc_match = req->match_f != NULL ? req->match_f : ifc_simple_match; in ifc_attach_cloner()
529 ifc->ifc_create = req->create_f; in ifc_attach_cloner()
530 ifc->ifc_destroy = req->destroy_f; in ifc_attach_cloner()
531 ifc->ifc_flags = (req->flags & IFC_F_AUTOUNIT); in ifc_attach_cloner()
536 ifc->create_nl = req2->create_nl_f; in ifc_attach_cloner()
537 ifc->modify_nl = req2->modify_nl_f; in ifc_attach_cloner()
538 ifc->dump_nl = req2->dump_nl_f; in ifc_attach_cloner()
541 ifc->dump_nl = ifc_dump_ifp_nl_default; in ifc_attach_cloner()
543 if (if_clone_attach(ifc) != 0) in ifc_attach_cloner()
546 EVENTHANDLER_INVOKE(if_clone_event, ifc); in ifc_attach_cloner()
548 return (ifc); in ifc_attach_cloner()
552 ifc_detach_cloner(struct if_clone *ifc) in ifc_detach_cloner() argument
554 if_clone_detach(ifc); in ifc_detach_cloner()
561 ifc_advanced_create_wrapper(struct if_clone *ifc, char *name, size_t maxlen, in ifc_advanced_create_wrapper() argument
564 int error = ifc->ifca_create(ifc, name, maxlen, ifc_data->params); in ifc_advanced_create_wrapper()
572 ifc_advanced_destroy_wrapper(struct if_clone *ifc, struct ifnet *ifp, uint32_t flags) in ifc_advanced_destroy_wrapper() argument
574 if (ifc->ifca_destroy == NULL) in ifc_advanced_destroy_wrapper()
576 return (ifc->ifca_destroy(ifc, ifp)); in ifc_advanced_destroy_wrapper()
583 struct if_clone *ifc; in if_clone_advanced() local
585 ifc = if_clone_alloc(name, maxunit ? maxunit : IF_MAXUNIT); in if_clone_advanced()
586 ifc->ifc_match = match; in if_clone_advanced()
587 ifc->ifc_create = ifc_advanced_create_wrapper; in if_clone_advanced()
588 ifc->ifc_destroy = ifc_advanced_destroy_wrapper; in if_clone_advanced()
589 ifc->ifca_destroy = destroy; in if_clone_advanced()
590 ifc->ifca_create = create; in if_clone_advanced()
592 if (if_clone_attach(ifc) != 0) in if_clone_advanced()
595 EVENTHANDLER_INVOKE(if_clone_event, ifc); in if_clone_advanced()
597 return (ifc); in if_clone_advanced()
601 ifc_simple_create_wrapper(struct if_clone *ifc, char *name, size_t maxlen, in ifc_simple_create_wrapper() argument
607 int error = ifc->ifcs_create(ifc, unit, ifc_data->params); in ifc_simple_create_wrapper()
614 ifc_simple_destroy_wrapper(struct if_clone *ifc, struct ifnet *ifp, uint32_t flags) in ifc_simple_destroy_wrapper() argument
616 if (ifp->if_dunit < ifc->ifcs_minifs && (flags & IFC_F_FORCE) == 0) in ifc_simple_destroy_wrapper()
619 ifc->ifcs_destroy(ifp); in ifc_simple_destroy_wrapper()
627 struct if_clone *ifc; in if_clone_simple() local
630 ifc = if_clone_alloc(name, IF_MAXUNIT); in if_clone_simple()
631 ifc->ifc_match = ifc_simple_match; in if_clone_simple()
632 ifc->ifc_create = ifc_simple_create_wrapper; in if_clone_simple()
633 ifc->ifc_destroy = ifc_simple_destroy_wrapper; in if_clone_simple()
634 ifc->ifcs_create = create; in if_clone_simple()
635 ifc->ifcs_destroy = destroy; in if_clone_simple()
636 ifc->ifcs_minifs = minifs; in if_clone_simple()
637 ifc->ifc_flags = IFC_F_AUTOUNIT; in if_clone_simple()
639 if (if_clone_attach(ifc) != 0) in if_clone_simple()
647 snprintf(name, IFNAMSIZ, "%s%d", ifc->ifc_name, unit); in if_clone_simple()
648 error = if_clone_createif_nl(ifc, name, &ifd); in if_clone_simple()
654 EVENTHANDLER_INVOKE(if_clone_event, ifc); in if_clone_simple()
656 return (ifc); in if_clone_simple()
664 if_clone_detach(struct if_clone *ifc) in if_clone_detach() argument
668 LIST_REMOVE(ifc, ifc_list); in if_clone_detach()
673 while (!LIST_EMPTY(&ifc->ifc_iflist)) in if_clone_detach()
674 if_clone_destroyif_flags(ifc, LIST_FIRST(&ifc->ifc_iflist), IFC_F_FORCE); in if_clone_detach()
676 IF_CLONE_REMREF(ifc); in if_clone_detach()
680 if_clone_free(struct if_clone *ifc) in if_clone_free() argument
683 KASSERT(LIST_EMPTY(&ifc->ifc_iflist), in if_clone_free()
686 IF_CLONE_LOCK_DESTROY(ifc); in if_clone_free()
687 delete_unrhdr(ifc->ifc_unrhdr); in if_clone_free()
688 free(ifc, M_CLONE); in if_clone_free()
698 struct if_clone *ifc; in if_clone_list() local
729 for (ifc = LIST_FIRST(&V_if_cloners), buf = outbuf; in if_clone_list()
730 ifc != NULL && count != 0; in if_clone_list()
731 ifc = LIST_NEXT(ifc, ifc_list), count--, buf += IFNAMSIZ) { in if_clone_list()
732 strlcpy(buf, ifc->ifc_name, IFNAMSIZ); in if_clone_list()
757 struct if_clone *ifc; in if_clone_restoregroup() local
763 LIST_FOREACH(ifc, &V_if_cloners, ifc_list) { in if_clone_restoregroup()
764 IF_CLONE_LOCK(ifc); in if_clone_restoregroup()
765 LIST_FOREACH(ifcifp, &ifc->ifc_iflist, if_clones) { in if_clone_restoregroup()
767 strncpy(ifc_name, ifc->ifc_name, IFCLOSIZ-1); in if_clone_restoregroup()
771 IF_CLONE_UNLOCK(ifc); in if_clone_restoregroup()
776 LIST_FOREACH(ifc, &V_if_cloners, ifc_list) in if_clone_restoregroup()
777 if (strcmp(ifc->ifc_name, ifc_name) == 0) in if_clone_restoregroup()
781 if (ifc != NULL) in if_clone_restoregroup()
823 ifc_alloc_unit_specific(struct if_clone *ifc, int *unit) in ifc_alloc_unit_specific() argument
827 if (*unit > ifc->ifc_maxunit) in ifc_alloc_unit_specific()
830 if (alloc_unr_specific(ifc->ifc_unrhdr, *unit) == -1) in ifc_alloc_unit_specific()
833 snprintf(name, IFNAMSIZ, "%s%d", ifc->ifc_name, *unit); in ifc_alloc_unit_specific()
835 free_unr(ifc->ifc_unrhdr, *unit); in ifc_alloc_unit_specific()
839 IF_CLONE_ADDREF(ifc); in ifc_alloc_unit_specific()
845 ifc_alloc_unit_next(struct if_clone *ifc, int *unit) in ifc_alloc_unit_next() argument
849 *unit = alloc_unr(ifc->ifc_unrhdr); in ifc_alloc_unit_next()
853 free_unr(ifc->ifc_unrhdr, *unit); in ifc_alloc_unit_next()
855 error = ifc_alloc_unit_specific(ifc, unit); in ifc_alloc_unit_next()
866 ifc_alloc_unit(struct if_clone *ifc, int *unit) in ifc_alloc_unit() argument
869 return (ifc_alloc_unit_next(ifc, unit)); in ifc_alloc_unit()
871 return (ifc_alloc_unit_specific(ifc, unit)); in ifc_alloc_unit()
875 ifc_free_unit(struct if_clone *ifc, int unit) in ifc_free_unit() argument
878 free_unr(ifc->ifc_unrhdr, unit); in ifc_free_unit()
879 IF_CLONE_REMREF(ifc); in ifc_free_unit()
883 ifc_simple_match(struct if_clone *ifc, const char *name) in ifc_simple_match() argument
889 for (cp = name, i = 0; i < strlen(ifc->ifc_name); i++, cp++) { in ifc_simple_match()
890 if (ifc->ifc_name[i] != *cp) in ifc_simple_match()
904 ifc_handle_unit(struct if_clone *ifc, char *name, size_t len, int *punit) in ifc_handle_unit() argument
917 err = ifc_alloc_unit(ifc, &unit); in ifc_handle_unit()