netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);
netlink_family выбирает модуль ядра или группу netlink для связи. В данный момент определены следующие семейства:
Сообщения 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) или connect(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; /* заголовок сообщения, вызвавшего ошибку */ };
Семейство netlink обычно определяет и другие сообщения (см. соответствующие страницы руководства, например, rtnetlink(7) для NETLINK_ROUTE).
Стандартные биты флагов в nlmsg_flags | |
NLM_F_REQUEST:установлен для всех сообщений с запросами | |
NLM_F_MULTI:T{ | |
сообщение является частью сообщения, состоящего из нескольких | |
частей, и оканчивается | |
NLMSG_DONE | |
T} | |
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 | Добавить в конец списка объектов. |
struct sockaddr_nl { sa_family_t nl_family; /* AF_NETLINK */ unsigned short nl_pad; /* ноль */ pid_t nl_pid; /* pid процесса */ __u32 nl_groups; /* маска многоадресных групп */ };
Linux 2.0 поддерживал более примитивный интерфейс, базирующийся на устройствах (он все еще является совместимым с предыдущими версиями). Этот устаревший интерфейс на данной странице не описывается.
ftp://ftp.inr.ac.ru/ip-routing/iproute2* для libnetlink
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |