On 18 Dec 2025, at 20:16, Gleb Smirnoff wrote:
The branch main has been updated by glebius:

URL: https://cgit.FreeBSD.org/src/commit/?id=0d469d23715d690b863787ebfa51529e1f6a9092

commit 0d469d23715d690b863787ebfa51529e1f6a9092
Author:     Gleb Smirnoff <[email protected]>
AuthorDate: 2025-12-18 16:47:39 +0000
Commit:     Gleb Smirnoff <[email protected]>
CommitDate: 2025-12-18 19:15:53 +0000

net: attach IPv4 and IPv6 stacks to an interface with EVENTHANDLER(9)

This change retires two historic relics: the if_afdata[] array and the
    dom_ifattach/dom_ifdetach methods.

The if_afdata[] array is a relic of the era, when there was expectation that many transport protocols will coexist with IP, e.g. IPX or NetAtalk. The array hasn't had any members except AF_INET and AF_INET6 for over a decade already. This change removes the array and just leaves two pointer
    fields: if_inet and if_inet6.

The dom_ifattach/dom_ifdetach predates the EVENTHANDLER(9) framework and was a good enough method to initialize protocol contexts back then. Today there is no good reason to treat IPv4 and IPv6 stacks differently to other
    protocols/features that attach and detach from an interface.

The locking of if_afdata[] is a relic of SMPng times, when the system startup and the interface attach was even more convoluted than before this
    change, and we also had unloadable protocols that used a field in
    if_afdata[].  Note that IPv4 and IPv6 are not unloadable.

Note that this change removes NET_EPOCH_WAIT() from the interface detach sequence. This may surface several new races associated with interface removal. I failed to hit any with consecutive test suite runs, though. The expected general race scenario is that while struct ifnet is freed with proper epoch_call(9) itself, some structures hanging off ifnet are freed with direct free(9). The proper fix is either make if_foo point at some static "dead" structure providing SMP visibility of this store, or free those structure with epoch_call(9). All of these cases are planned
    to be found and resolved during 16.0-CURRENT lifetime.

    Reviewed by:            zlei, gallatin, melifaro
    Differential Revision:  https://reviews.freebsd.org/D54089

I’m seeing panics on pfsync interface destruction now:

        panic: mld_change_state: bad ifp
        cpuid = 19
        time = 1766142554
        KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe01843fd990
        vpanic() at vpanic+0x136/frame 0xfffffe01843fdac0
        panic() at panic+0x43/frame 0xfffffe01843fdb20
        mld_change_state() at mld_change_state+0x6d0/frame 0xfffffe01843fdb90
in6_leavegroup_locked() at in6_leavegroup_locked+0xa9/frame 0xfffffe01843fdbf0
        in6_leavegroup() at in6_leavegroup+0x32/frame 0xfffffe01843fdc10
pfsync_multicast_cleanup() at pfsync_multicast_cleanup+0x83/frame 0xfffffe01843fdc40 pfsync_clone_destroy() at pfsync_clone_destroy+0x260/frame 0xfffffe01843fdc90 ifc_simple_destroy_wrapper() at ifc_simple_destroy_wrapper+0x26/frame 0xfffffe01843fdca0 if_clone_destroyif_flags() at if_clone_destroyif_flags+0x69/frame 0xfffffe01843fdce0
        if_clone_detach() at if_clone_detach+0xe6/frame 0xfffffe01843fdd10
vnet_pfsync_uninit() at vnet_pfsync_uninit+0xf0/frame 0xfffffe01843fdd30
        vnet_destroy() at vnet_destroy+0x154/frame 0xfffffe01843fdd60
        prison_deref() at prison_deref+0xaf5/frame 0xfffffe01843fddd0
        sys_jail_remove() at sys_jail_remove+0x15c/frame 0xfffffe01843fde00
        amd64_syscall() at amd64_syscall+0x169/frame 0xfffffe01843fdf30
fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe01843fdf30 --- syscall (508, FreeBSD ELF64, jail_remove), rip = 0x2d8234c9e31a, rsp = 0x2d823179b928, rbp = 0x2d823179b9b0 ---
        KDB: enter: panic

The pfsync:basic_ipv6 seems to trigger this reliably.

Best regards,
Kristof

Reply via email to