Index: ip_carp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_carp.c,v retrieving revision 1.338 diff -u -p -r1.338 ip_carp.c --- ip_carp.c 10 Jun 2019 16:32:51 -0000 1.338 +++ ip_carp.c 4 Nov 2019 11:44:16 -0000 @@ -950,10 +950,9 @@ carpdetach(void *arg) if_ih_remove(ifp0, carp_input, NULL); SRPL_REMOVE_LOCKED(&carp_sc_rc, cif, sc, carp_softc, sc_list); - if (SRPL_EMPTY_LOCKED(cif)) - ifpromisc(ifp0, 0); sc->sc_carpdev = NULL; + ifpromisc(ifp0, 0); hook_disestablish(ifp0->if_linkstatehooks, sc->lh_cookie); hook_disestablish(ifp0->if_detachhooks, sc->dh_cookie); } @@ -1685,6 +1684,10 @@ carp_set_ifp(struct carp_softc *sc, stru if (ifp0->if_type != IFT_ETHER) return (EINVAL); + cif = &ifp0->if_carp; + if (carp_check_dup_vhids(sc, cif, NULL)) + return (EINVAL); + sc->dh_cookie = hook_establish(ifp0->if_detachhooks, 0, carpdetach, sc); if (sc->dh_cookie == NULL) @@ -1697,15 +1700,9 @@ carp_set_ifp(struct carp_softc *sc, stru goto rm_dh; } - cif = &ifp0->if_carp; - if (SRPL_EMPTY_LOCKED(cif)) { - if ((error = ifpromisc(ifp0, 1))) - goto rm_lh; - - } else if (carp_check_dup_vhids(sc, cif, NULL)) { - error = EINVAL; + error = ifpromisc(ifp0, 1); + if (error != 0) goto rm_lh; - } /* detach from old interface */ if (sc->sc_carpdev != NULL)