# libnl

Библиотека для работы с Netlink-сокетами в Linux, предоставляющая удобный и производительный API для взаимодействия между пользовательским пространством и ядром Linux. Netlink — это механизм межпроцессного взаимодействия (IPC), используемый для передачи информации между ядром и пользовательскими процессами, особенно для сетевого стека и других подсистем ядра.

## Особенности

- полная поддержка протокола Netlink и его расширений (Netlink-семейства);
- объектно-ориентированный API для работы с сетевыми объектами (интерфейсы, адреса, маршруты, соседи);
- поддержка асинхронных и синхронных операций через Netlink-сокеты;
- поддержка различных типов Netlink-сообщений (уведомления, запросы, мультикаст);
- интеллектуальная система управления памятью с подсчётом ссылок.

## Основные компоненты

libnl состоит из нескольких модулей, каждый из которых отвечает за определённый аспект работы с Netlink и сетевыми объектами (подробнее с документацией можно ознакомиться [здесь](https://www.infradead.org/~tgr/libnl/)).

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