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

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_DUMPThis is NLM_F_ROOT or'ed with NLM_F_MATCH

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

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

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

    BSDNetlink
    ADDNLM_F_CREATE OR NLM_F_EXCL
    CHANGENLM_F_REPLACE
    CheckNLM_F_EXCL
    APPENDNLM_F_CREATE
  • Sequence Number — 32 бита
  • порядковый номер сообщения.
  • Process ID (PID) — 32 бита
  • Идентификатор процесса (PID), передающего сообщение. Значение PID используется ядром для мультиплексирования в корректный сокет. При передаче сообщений из ядра в пользовательское пространство устанавливается PID = 0.
2007 - 2017 © Русские переводы RFC, IETF, ISOC.