libnl
Библиотека для работы с Netlink-сокетами в Linux, предоставляющая удобный и производительный API для взаимодействия между пользовательским пространством и ядром Linux. Netlink — это механизм межпроцессного взаимодействия (IPC), используемый для передачи информации между ядром и пользовательскими процессами, особенно для сетевого стека и других подсистем ядра.
Особенности
- полная поддержка протокола Netlink и его расширений (Netlink-семейства);
- объектно-ориентированный API для работы с сетевыми объектами (интерфейсы, адреса, маршруты, соседи);
- поддержка асинхронных и синхронных операций через Netlink-сокеты;
- поддержка различных типов Netlink-сообщений (уведомления, запросы, мультикаст);
- интеллектуальная система управления памятью с подсчётом ссылок.
Основные компоненты
libnl состоит из нескольких модулей, каждый из которых отвечает за определённый аспект работы с Netlink и сетевыми объектами (подробнее с документацией можно ознакомиться здесь).
Базовые Netlink-операции
Библиотека предоставляет низкоуровневый API для создания Netlink-сокетов, отправки и приёма сообщений, а также обработки различных типов Netlink-сообщений. Этот слой обеспечивает прямую работу с протоколом Netlink.
Основные функции Netlink:
nl_socket_alloc()— создание и настройка Netlink-сокета;nl_socket_modify_cb()— установка callback-функций для обработки сообщений;nl_send_auto()— отправка сообщения с автоматическим заполнением заголовков;nl_recvmsgs()— приём и обработка сообщений;nl_socket_disable_seq_check()— отключение проверки последовательности для асинхронных операций;nl_socket_add_membership()— подписка на мультикаст-группы Netlink.
Управление сетевыми интерфейсами
libnl предоставляет высокоуровневый API для работы с сетевыми интерфейсами (links), включая получение информации об интерфейсах, изменение их параметров и мониторинг изменений.
Функции для работы с интерфейсами:
rtnl_link_get()— получение информации о сетевом интерфейсе;rtnl_link_get_kernel()— получение информации из ядра;rtnl_link_alloc()— создание объекта интерфейса для изменения параметров;rtnl_link_change()— изменение параметров интерфейса (например, MTU, состояния);rtnl_link_put()— освобождение ресурсов объекта интерфейса;rtnl_link_alloc_cache()— создание кэша интерфейсов для эффективного доступа.
Управление адресами (IP-адресация)
Библиотека включает функции для работы с IP-адресами сетевых интерфейсов, включая добавление, удаление и получение информации о назначенных адресах.
Функции для работы с адресами:
rtnl_addr_add()— добавление IP-адреса к интерфейсу;rtnl_addr_del()— удаление IP-адреса с интерфейса;rtnl_addr_get()— получение информации о конкретном адресе;rtnl_addr_alloc_cache()— создание кэша адресов;- Поддержка как IPv4, так и IPv6 адресов.
Управление маршрутами
libnl предоставляет полный набор функций для работы с таблицами маршрутизации, включая добавление, удаление и модификацию маршрутов, а также получение информации о существующих маршрутах.
Функции для работы с маршрутами:
rtnl_route_add()— добавление маршрута;rtnl_route_delete()— удаление маршрута;rtnl_route_get()— получение информации о маршруте;rtnl_route_alloc_cache()— создание кэша маршрутов;- Поддержка различных типов маршрутов (unicast, multicast, blackhole и др.);
- Работа с таблицами маршрутизации (main, local, default и пользовательские).
Управление соседними устройствами (ARP/NDP)
Библиотека включает API для работы с соседними устройствами (ARP-таблица для IPv4, NDP для IPv6), что позволяет управлять кэшем соседей и получать информацию о соседних узлах.
Функции для работы с соседями:
rtnl_neigh_add()— добавление записи о соседе;rtnl_neigh_delete()— удаление записи о соседе;rtnl_neigh_get()— получение информации о соседе;rtnl_neigh_alloc_cache()— создание кэша соседей;- Поддержка различных состояний соседей (permanent, noarp, reachable и др.).
Работа с очередями трафика (Traffic Control)
libnl предоставляет API для работы с подсистемой Traffic Control (QoS) ядра Linux, включая управление дисциплинами, классами и фильтрами.
Функции для работы с TC:
rtnl_qdisc_add()— добавление дисциплины очереди;rtnl_qdisc_delete()— удаление дисциплины очереди;rtnl_class_alloc()иrtnl_class_add()— управление классами;rtnl_filter_alloc()иrtnl_filter_add()— управление фильтрами;- Поддержка различных дисциплин (htb, pfifo, sfq и др.).
Генерация и парсинг сообщений
Библиотека предоставляет мощные средства для создания и разбора Netlink-сообщений, включая автоматическую сериализацию и десериализацию атрибутов.
Функции для работы с сообщениями:
nlmsg_alloc()— создание Netlink-сообщения;nlmsg_put()— добавление стандартного заголовка;nla_put_string(),nla_put_u32(),nla_put_addr()— добавление атрибутов;nla_parse()— разбор атрибутов в сообщении;nla_find()— поиск атрибута по типу;- Поддержка вложенных атрибутов и массивов.
Кэширование и управление состоянием
libnl включает систему кэширования объектов, которая позволяет уменьшить количество запросов к ядру и повысить производительность приложений. Кэши автоматически обновляются при получении уведомлений от ядра.
Функции кэширования:
nl_cache_alloc()— создание кэша объектов;nl_cache_refill()— заполнение кэша данными из ядра;nl_cache_resync()— синхронизация кэша с состоянием ядра;nl_cache_mngt_register()— регистрация обработчиков для автоматического обновления;- Поддержка фильтрации и поиска в кэше.