Поддержка IPv6 как модуля была внедрена в ядро Linux в 1996 году с версии 2.1.8, когда стек протокола только интегрировался в проект. Изначально такая гибкость позволяла экономить память на системах без IPv6-трафика, но с ростом универсальности протокола (особенно после 2010-х годов) она утратила практическую ценность.
В современных дистрибутивах — SUSE Linux Enterprise, Red Hat Enterprise Linux, Ubuntu, Fedora и Debian — IPv6 всегда компилируется статически (CONFIG_IPV6=y) или полностью отключается (CONFIG_IPV6=n). Модульная сборка не используется ни в одном production-сценарии из-за фундаментальных проблем: динамическая выгрузка критического сетевого стека приводит к сбоям в зависимых подсистемах, таким как маршрутизация, фильтрация пакетов и мониторинг.
Текущая tristate-опция CONFIG_IPV6 (y/m/n) вынуждает разработчиков подсистем реализовывать "заглушки" (stubs) для обработки выгрузки модуля. Это затрагивает:
- Сетевую подсистему (net/core, net/ipv6) — обработчики unregister_netdevice_notifier.
- BPF (Berkeley Packet Filter) — динамическая привязка программ к IPv6-сокетам.
- Netfilter (iptables/nftables) — цепочки IPv6 с условной инициализацией.
- Драйверы (vxlan, geneve, сетевые адаптеры) — fallback-функции для отсутствующего стека.
Такие заглушки составляют сотни строк кода, который никогда не выполняется, но усложняет ревью, тестирование и поиск уязвимостей — особенно актуально после недавних CVE в IPv6 (например, race conditions в icmpv6 и fib6).
Структура серии патчей
Предложенная серия состоит из 10 последовательных патчей, преобразующих CONFIG_IPV6 в boolean-опцию (только y/n). Основные изменения:
№ патча | Название | Ключевые изменения | Затронутые файлы |
1/10 | Kconfig: convert CONFIG_IPV6 to bool | Удаление tristate, замена на depends bool; дефолт = n | net/ipv6/Kconfig |
2/10 | Replace IS_BUILTIN(CONFIG_IPV6) usages | Глобальная замена макросов на IS_ENABLED(CONFIG_IPV6) | net/, kernel/bpf/ |
3/10 | net: ipv6: remove module_exit and notifier | Удаление unregister_netdevice_notifier для ICMPv6 | net/ipv6/icmp.c, net/core/dev.c |
4/10 | netfilter: remove IPv6 ops stubs | Прямые вызовы вместо nf_ipv6_ops->foo() | net/netfilter/nf_ipv6.c |
5/10 | bpf: remove ipv6_bpf_stub | Интеграция прямых вызовов ipv6_sock/bpf | kernel/bpf/syscall.c |
6/10 | drivers: net: remove IPv6 module stubs | Очистка vxlan/geneve от dynaddr | drivers/net/vxlan.c |
7/10 | Remove ipv6_stub.h | Полное удаление заголовка stubs | include/net/ipv6_stub.h |
8/10 | ip6: fib: remove module unload handlers | Упрощение nexthop_fib6_nh | net/ipv6/fib6.c |
9/10 | net: core: IPv6 unregister cleanups | Удаление raw6/icmp6 module_exit | net/ipv6/raw.c |
10/10 | Documentation: update IPv6 config notes | Описание новой boolean-семантики | Documentation/networking/ipv6.rst |
Патчи протестированы на x86_64, arm64 и RISC-V с defconfig, а также в qemu-симуляциях с трафиком IPv6. Общий объём удалённого кода — около 500 строк, преимущественно условных проверок #ifdef CONFIG_IPV6_MODULE.
Текущий статус и реакция сообщества
По состоянию на 15 марта 2026 года патчи приняты в linux-next (хеш: v6.8-rc7-next-20260312), проходит ревью на LKML и Patchew.org. Автор активно отвечает на замечания, включая связанные фиксы (например, race в ip6_sock_set_v6only). Maintainers сетевой подсистемы (David S. Miller, Jakub Kicinski) отметили положительно; нет блокирующих отзывов.
Обсуждение на Phoronix, Reddit (/r/linux, /r/kernel) и Linux.org Forums подчёркивает timely характер изменений: это часть тенденции минимизации модульности в core-компонентах (аналогично TCP-состою, где модульность удалена в 5.15+). SUSE уже применяет патчи в Tumbleweed.
Технические последствия для разработчиков и пользователей
Для пользователей дистрибутивов: Никаких изменений. Стандартные конфигурации (например, в /boot/config-6.8.0) остаются валидными; make menuconfig предложит только [*] или [< ]> для IPv6. Миграция прозрачна.
Для разработчиков ядра:
- Ускорение компиляции (меньше условного кода).
- Проще аудит безопасности: нет «мёртвого» пути unload.
- Новые драйверы/BPF-программы не нуждаются в stubs для IPv6.
Рекомендации по тестированию:
- Склонировать linux-next: git checkout linux-next/master.
- make defconfig; make menuconfig — установить IPv6=y/n.
- Сборка: make -j$(nproc) bzImage.
- Тест: qemu-system-x86_64 -kernel bzImage -netdev user,id=net0,ipv6=on -device e1000,netdev=net0.
Это изменение укрепляет стабильность ядра, соответствуя принципам "built-in or nothing" для критической инфраструктуры. Ожидаемое включение в Linux 7.1-rc1 к июлю 2026 года.