Документация по LinuxLinuxDoc.Ru 🔍

netlink, PF_NETLINK - установка связи между ядром и пользователем

НАЗВАНИЕ
netlink, PF_NETLINK - установка связи между ядром и
пользователем.

СИНТАКСИС
#include
#include
#include

netlink_socket = socket(PF_NETLINK, socket_type,
netlink_family);

ОПИСАНИЕ
Netlink используется для передачи информации с модуля ядра
в процессы пользовательского пространства. Он состоит из
стандартного, базирующегося на сокетах, интерфейса для
процессов пользователя и внутреннего ядра API,
предназначенного для модулей ядра. Внутренний интерфейс
ядра на этой странице не описывается. Кроме того,
существует устаревший интерфейс netlink, работающий с
помощью символьных устройств netlink. Этот интерфейс здесь
также не описывается и предназначен только для
совместимости с его предыдущими версиями. Netlink - это
служба, ориентированная на датаграммы. В качестве
socket_type могут использоваться как SOCK_RAW, так и
SOCK_DGRAM; несмотря на это, протокол netlink не проводит
границы между датаграммными и raw-сокетами.

netlink_family выбирает модуль ядра или группу netlink для
связи. В данный момент определены следующие семейства:

NETLINK_ROUTE
Получает обновления маршрутов и может быть
использована для изменения таблицы маршрутизации
IPv4 (см. rtnetlink(7)).

NETLINK_FIREWALL
Получает пакеты, посылаемые кодом сетевого экрана
(firewall) IPv4.

NETLINK_ARPD
Для управления таблицей arp в пространстве
пользователя.

NETLINK_ROUTE6
Принимает и посылает обновления таблицы
маршрутизации IPv6.

NETLINK_IP6_FW
для получения пакетов, не прошедших проверку
сетевого экрана (firewall) IPv6 (в настоящее время
функция еще не реализована).

NETLINK_TAPBASE...NETLINK_TAPBASE+15
являются экземплярами устройства ethertap. Ether-
tap является псевдосетевым туннельным устройством,
позволяющим эмулировать сетевой драйвер из
пространства пользователя.

NETLINK_SKIP
зарезервировано для ENskip

NETLINK_USERSOCK
зарезервировано для будущих протоколов пространства
пользователя.

Сообщения netlink состоят из потока байтов с одним или
несколькими заголовками nlmsghdr и соответствущей
"полезной" нагрузкой. В первом и всех последующих
заголовках сообщений, состоящих из нескольких частей,
установлен флаг NLM_F_MULTI. Исключение составляет лишь
последний заголовок, имеющий тип NLMSG_DONE. Доступ к
потоку байтов можно получить только с помощью стандартных
макросов NLMSG_*; см. netlink(3).

Netlink не является надежным протоколом. Он делает все
возможное для доставки сообщения по адресу (адресам), но
может "отбрасывать" пакеты при нехватке памяти или
возникновении других ошибок в работе. Для повышения
надежности передачи отправитель может запросить
подтверждение от получателя, установив флаг NLM_F_ACK.
Подтверждающим является пакет NLMSG_ERROR с полем ошибки,
равным нулю. Приложение должно само создавать запросы,
отсылаемые полученным сообщениям. Ядро пытается послать
сообщение NLMSG_ERROR всем непринятым пакетам. Процесс
пользователя также должен следовать этому соглашению.

Каждое семейство netlink имеет набор из 32-х многоадресных
групп. Когда вызов bind(2) отправляется сокету, поле
nl_groups структуры sockaddr_nl должно содержать битовую
маску групп, которые оно хочет прослушивать. По умолчанию
значение этого поля равно нулю, что означает, что
многоадресные передачи не будут приниматься. Сокет может
передавать многоадресные сообщения любой из многоадресных
групп, присвоив nl_groups битовую маску групп, которым он
желает передавать данные при вызове sendmsg(2) или con-
nect(2). Принимать или посылать сообщения многадресной
группы netlink могут только пользователи с идентификатором
эффективного пользователя, равным 0, или имеющие
возможность CAP_NET_ADMIN. Любые ответы на сообщение,
полученное многоадресной группой, должны быть отправлены
посылающему процессу и многадресной группе.
struct nlmsghdr
{
__u32 nlmsg_len; /* Длина сообщения, включая заголовок */
__u16 nlmsg_type; /* Содержимое сообщения */
__u16 nlmsg_flags;/* Дополнительные флаги */
__u32 nlmsg_seq; /* Hомер последовательности */
__u32 nlmsg_pid; /* PID процесса, открывшего сокет */

};
struct nlmsgerr
{
int error; /* отрицательный номер ошибки или 0 для подтверждений. */
struct nlmsghdr msg; /* заголовок сообщения, вызвавшего ошибку */
};
После каждого вызова nlmsghdr производится нагрузка.
nlmsg_type может быть одним из стандартных типов
сообщения; сообщения NLMSG_NOOP должны игнорироваться;
сообщение NLMSG_ERROR сигнализирует об ошибке, нагрузка
содержит структуру nlmsgerr; сообщение NLMSG_DONE
заканчивает сообщение, состоящее из нескольких частей.

Семейство netlink обычно определяет и другие сообщения
(см. соответствующие страницы руководства, например,
rtnetlink(7) для NETLINK_ROUTE).
Стандартные биты флагов в nlmsg_flags
NLM_F_REQUEST установлен для всех сообщений с запросами
NLM_F_MULTI сообщение является частью сообщения,
состоящего из нескольких частей, и
оканчивается NLMSG_DONE
NLM_F_ACK ответ с подтверждением при успехе
NLM_F_ECHO послать эхо этого запроса
Дополнительные флаги для запросов GET
NLM_F_ROOT Вернуть полную таблицу вместо одной записи.
NLM_F_MATCH Пока не реализовано.
NLM_F_ATOMIC Вернуть небольшой (atomic) образ таблицы.
NLM_F_DUMP пока не описано.
Дополнительные флаги для запросов NEW
NLM_F_REPLACE Переписать существующий объект.
NLM_F_EXCL Hе перезаписывать, если объект уже существует.
NLM_F_CREATE Создать объект, если он еще не существует.
NLM_F_APPEND Добавить в конец списка объектов.
Обратите внимание, что NLM_F_ATOMIC требует CAP_NET_ADMIN
или прав суперпользователя.

ФОРМАТЫ АДРЕСОВ
Структура sockaddr_nl описывает клиент netlink в
пространстве пользователя или в ядре. sockaddr_nl может
быть как одноадресной (передача информации только на один
адрес), так и принадлежать группе netlink (значение
nl_groups не равно нулю).
struct sockaddr_nl
{
sa_family_t nl_family; /* AF_NETLINK */
unsigned short nl_pad; /* ноль */
pid_t nl_pid; /* pid процесса */
__u32 nl_groups; /* маска многоадресных групп */
};
nl_pid - pid процесса, владеющего целевым сокетом или 0,
если пункт назначения находится в ядре. nl_groups -
битовая маска, в которой каждый бит представляет собой
номер группы netlink.

НАЙДЕННЫЕ ОШИБКИ
Эта страница руководства содержит неполную информацию о
рассматриваемой функции.

ЗАМЕЧАНИЯ
В большинстве случаев лучше использовать netlink с помощью
libnetlink, чем с помощью низкоуровневого интерфейса ядра.

ВЕРСИИ

Сокетный интерфейс для netlink появился в Linux 2.2.

Linux 2.0 поддерживал более примитивный интерфейс,
базирующийся на устройствах (он все еще является
совместимым с предыдущими версиями). Этот устаревший
интерфейс на данной странице не описывается.
Читать новости Linux в Telegram
Linux - netlink, PF_NETLINK - установка связи между ядром и пользователем
Мы в соцсетях ✉