Hrvoje Popovski reported the following panic: panic: kernel diagnostic assertion "sc->sc_carpdev != NULL" failed panic() at panic+0x128 __assert() at __assert+0x24 carp_output() at carp_output+0xde ip_output() at ip_output+0x948 ipsp_process_done() at ipsp_process_done+0x254 esp_output_cb() at esp_output_cb+0xe6 taskq_thread(0) at taskq_thread+0x67
The KASSERT() in carp_output() is triggered when he deletes a trunk(4) interface sitting under a carp(4) while IPsec packets are being process/sent over the carp(4) interface. The problem here is that the carp(4) interface still exists but has no parent. So as soon as carp_output() is called we should drop the packets. He confirmed the diff below works for him. ok? Index: netinet/ip_carp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_carp.c,v retrieving revision 1.316 diff -u -p -r1.316 ip_carp.c --- netinet/ip_carp.c 9 Oct 2017 08:35:38 -0000 1.316 +++ netinet/ip_carp.c 12 Oct 2017 09:44:30 -0000 @@ -2359,7 +2359,14 @@ carp_output(struct ifnet *ifp, struct mb struct srp_ref sr; int ismaster; - KASSERT(sc->sc_carpdev != NULL); + /* + * If the parent this carp(4) got destroyed while a + * packet was being processed, silently drop it. + */ + if (sc->sc_carpdev == NULL) { + m_freem(m); + return (0); + } if (sc->cur_vhe == NULL) { vhe = SRPL_FIRST(&sr, &sc->carp_vhosts);