Несколько дней назад новость была выпущена что базовый код FreeBSD приняла новая реализация протокола связи Сетевая ссылка (RFC 3549), который используется в Linux для связи между ядром и процессами в пользовательском пространстве.
Семейство сокетов Сетевая ссылка это интерфейс ядра Linux, который используется для межпроцессного взаимодействия (IPC) между процессами ядра и пользовательского пространства. и между различными процессами пользовательского пространства, подобно сокетам домена Unix.
Подобно сокетам домена Unix и в отличие от сокетов INET, связь Netlink не может пересекать границы хоста. Однако, в то время как сокеты домена Unix используют пространство имен файловой системы, процессы Netlink обычно адресуются идентификаторами процессов (PID).
Netlink разработан и используется для передачи различной сетевой информации. между процессами пространства ядра и пространства пользователя. Сетевые утилиты, такие как семейство iproute2 и утилиты, используемые для настройки беспроводных драйверов на базе mac80211, используют Netlink для связи с ядром Linux из пользовательского пространства. Netlink предоставляет стандартный интерфейс на основе сокетов для процессов пользовательского пространства и API на стороне ядра для внутреннего использования модулями ядра. Изначально Netlink использовала семейство сокетов AF_NETLINK.
Пока в нынешнем виде Уровень поддержки Netlink позволяет FreeBSD использовать утилиту Linux ip. пакета iproute2 для управления сетевыми интерфейсами, установки IP-адресов, настройки маршрутизации и управления объектами nexthop, в которых хранится состояние, используемое для пересылки пакета в желаемое место назначения. Немного изменив файлы заголовков, можно использовать Netlink в пакете маршрутизации Bird.
Реализация Netlink для FreeBSD упакован как загружаемый модуль ядра что, если возможно, не влияет на другие подсистемы ядра и создает отдельные очереди задач (tasqueue) для обработки входящих сообщений по протоколу и выполнения операций в асинхронном режиме. Причина портирования Netlink — отсутствие стандартного механизма для взаимодействия с подсистемами ядра, что приводит к тому, что разные подсистемы и драйверы изобретают свои собственные протоколы.
Сетевая ссылка предлагает унифицированный коммуникационный уровень и расширяемый формат сообщений который может выступать в качестве посредника, который автоматически объединяет разрозненные данные из разных источников в один запрос. Например, такие подсистемы FreeBSD, как devd, jail и pfilctl, можно портировать на Netlink, используя теперь собственные вызовы ioctl, что значительно упростит создание приложений для работы с этими подсистемами. Кроме того, использование Netlink для изменения объектов и групп nexthop в стеке маршрутизации позволит более эффективно взаимодействовать с процессами маршрутизации в пользовательском пространстве.
Интерфейсы, адреса, маршруты, брандмауэр, fibs, vnets и т.д. управляются через netlink. Это асинхронный протокол на основе TLV, который обеспечивает связь 1-1 и 1-множество. Текущая реализация поддерживает подмножество семейства NETLINK_ROUTE. Реализация также совместима с платформой семейства NETLINK_GENERIC.
В настоящее время реализованы следующие функции:
- Получить информацию о маршрутах, объектах и группах nexthops, сетевых интерфейсах, адресах и соседних хостах (arp/ndp).
- Формирование уведомлений о появлении и отключении сетевых интерфейсов, настройке и удалении адресов, добавлении и удалении маршрутов.
- Добавляйте и удаляйте маршруты, объекты и группы next hop, шлюзы, сетевые интерфейсы.
- Интеграция с интерфейсом Rtsock для управления таблицей маршрутизации.
Стоит отметить, что пока проект ограничен поддержкой семейства операций NETLINK_ROUTE для управления состоянием сетевой подсистемы в ядре.
Наконец, если вы хотите узнать об этом больше, вы можете ознакомиться с подробностями в по следующей ссылке.