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() — регистрация обработчиков для автоматического обновления;
  • Поддержка фильтрации и поиска в кэше.

Использование в проекте

Документация по использованию Conan-пакетов для разработки приложений для ОС Аврора.

На сервере Conan библиотеки заранее собраны и размещены под различные версии ОС Аврора 4 и ОC Аврора 5. Для данных версий представлены архитектуры armv7hl, aarch64 и x84_64.

Библиотеку можно использовать в проекте с помощью данного conanfile.py

from conan import ConanFile

class Application(ConanFile):
    settings = "os", "compiler", "arch", "build_type"
    generators = "PkgConfigDeps"

    requires = (
        "libnl/3.9.0@aurora",
    )    

Процесс локальной сборки описан в документации.

libnl

A collection of libraries providing APIs to netlink protocol based Linux kernel interfaces.
Лицензия
LGPL-2.1-only
Версия
Домашняя страница
Скачать
armv7
580.4 Kb
MD5: 17f630756ff44bd9f18d4b8c5f5616b9
Updated: 30.09.2025, 12:48:50
armv8
749.3 Kb
MD5: 07729b3f382e50e9ba7509eaef95ea4a
Updated: 30.09.2025, 12:48:43
x86_64
632.9 Kb
MD5: ac6896f5f12cd178a6902401511805fb
Updated: 30.09.2025, 12:48:51
Использование в проекте

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.