RFC: 3549
Оригинал: Linux Netlink as an IP Services Protocol
Категория: Информационный
Дата публикации:
Авторы: , , ,
Перевод: Николай Малых

RFC 3549, Страница 9 из 21

2.3.2. Заголовок сообщений Netlink

Сообщения Netlink представляют собой поток байтов с одним или несколькими заголовками Netlink и связанными с ними данными (payload). Если данных слишком много для одного сообщения, они могут быть разделены на несколько сообщений Netlink, которые обычно называют многокомпонентным сообщением. Для таких сообщений первый и последующие заголовки, за исключением последнего, содержат флаг NLM_F_MULTI. В заголовке последнего сообщения указывается тип NLMSG_DONE.

Формат заголовка сообщения Netlink показан на рисунке:

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Length                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Type              |           Flags              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Process ID (PID)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Заголовок включает следующие поля:

  • Length — 32 бита
  • размер сообщения в байтах с учетом заголовка.
  • Type — 16 битов
  • Это поле определяет тип содержимого в сообщении.

    Фактически поле может включать один из стандартных идентификаторов типа:

    NLMSG_NOOP Сообщение игнорируется.
    NLMSG_ERROR Сообщение сигнализирует об ошибке и поле данных содержит структуру nlmsgerr. Такие сообщения обычно передаются от FEC к CPC и могут рассматриваться как NACK.
    NLMSG_DONE Сообщение является последней частью многокомпонентного сообщения.

    Отдельные службы IP могут использовать добавочные типы сообщений, например сервис NETLINK_ROUTE задает несколько таких типов, включая RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK, RTM_NEWADDR, RTM_DELADDR, RTM_NEWROUTE, RTM_DELROUTE и др.

  • Flags — 16 битов
  • Стандартные флаги, используемые в заголовках Netlink, приведены в таблице:

    NLM_F_REQUEST Этот флаг должен устанавливаться для всех откликов (обычно они передаются из пользовательского пространства в ядро).
    NLM_F_MULTI Сообщение является частью (не последней) многокомпонентного сообщения. Для последней части указывается тип NLMSG_DONE.
    NLM_F_ACK Запрос на подтверждение при успехе. Обычно этот флаг устанавливается для сообщений из пользовательского пространства (CPC) в ядро (FEC).
    NLM_F_ECHO Возвратить «эхо» для данного запроса. Обычно этот флаг устанавливается для сообщений из пользовательского пространства (CPC) в ядро (FEC).

    В запросах GET для конфигурационной информации, передаваемых в FEC используются дополнительные флаги.

    NLM_F_ROOT Возвращать полную таблицу вместо одной записи.
    NLM_F_MATCH Возвращать все записи, соответствующие критерию, переданному в поле данных сообщения.
    NLM_F_ATOMIC Возвращать атомарную картину (atomic snapshot) таблицы, которая указана. Установка этого флага может требовать специальных привилегий, поскольку флаг способен прерывать сервис FE на достаточно продолжительное время.

    Подходящим макросом для поля флагов является

    NLM_F_DUMP This is NLM_F_ROOT or'ed with NLM_F_MATCH

    В запросах NEW также могут использоваться дополнительные флаги.

    NLM_F_REPLACE Заменить существующий объект конфигурации в соответствии с данным запросом.
    NLM_F_EXCL Не заменять существующий объект новым.
    NLM_F_CREATE Создать объект конфигурации, если его не существует.
    NLM_F_APPEND Добавить объект в конце списка имеющихся.

    Для тех, кто хорошо знаком с операциями на сокетах маршрутизации BSD, в таблице приведены эквиваленты таких операций:

    BSD Netlink
    ADD NLM_F_CREATE OR NLM_F_EXCL
    CHANGE NLM_F_REPLACE
    Check NLM_F_EXCL
    APPEND NLM_F_CREATE
  • Sequence Number — 32 бита
  • порядковый номер сообщения.
  • Process ID (PID) — 32 бита
  • Идентификатор процесса (PID), передающего сообщение. Значение PID используется ядром для мультиплексирования в корректный сокет. При передаче сообщений из ядра в пользовательское пространство устанавливается PID = 0.

Страница 9 из 21

2007 - 2022 © Русские переводы RFC, IETF, ISOC.