ИМЯ

rtnetlink - Linux routing socket

СИНТАКСИС

#include <asm/types.h>
#include <linux/if_link.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>
rtnetlink_socket = socket(AF_NETLINK, int socket_type, NETLINK_ROUTE);

ОПИСАНИЕ

Rtnetlink позволяет читать и изменять таблицы маршрутизации ядра. Он используется для взаимодействия различных подсистем внутри ядра (это здесь не описано), а также для взаимодействия пользовательских программ. Сетевыми маршрутами, IP-адресами, параметрами связи (link parameters), настройками соседства (neighbor setups), алгоритмами планирования очереди (queueing disciplines), классификацией трафика и и пакетными классификаторами можно управлять через сокеты NETLINK_ROUTE. Они основываются на сообщениях netlink; подробности смотрите в netlink(7).

Атрибуты маршрутизации

Некоторые сообщения rtnetlink содержат необязательные атрибуты после начального заголовка:

struct rtattr {
    unsigned short rta_len;    /* длина параметра */
    unsigned short rta_type;   /* тип параметра */
    /* данные … */
};

Этими атрибутами нужно управлять только с помощью макросов RTA_* или libnetlink, смотрите rtnetlink(3).

Сообщения

Rtnetlink поддерживает следующие типы сообщений (в дополнении к стандартным сообщениям netlink):
RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
Создание, удаление и получение информации об определённом сетевом интерфейсе. Эти сообщения содержат структуру ifinfomsg, за которой следует ряд структур rtattr.
struct ifinfomsg {
    unsigned char  ifi_family; /* AF_UNSPEC */
    unsigned short ifi_type;   /* тип устройства */
    int            ifi_index;  /* индекс интерфейса */
    unsigned int   ifi_flags;  /* флаги устройства */
    unsigned int   ifi_change; /* маска изменения */
};
    
В ifi_flags содержатся флаги устройства, смотрите netdevice(7); в ifi_index — уникальный индекс интерфейса (начиная с Linux 3.7 возможно передать ненулевое значение в сообщении RTM_NEWLINK; в этом случае создаётся связь (link) с заданным ifindex); элемент ifi_change зарезервирован на будущее и его значение всегда должно быть равно 0xFFFFFFFF.
Атрибуты маршрутизации
rta_type тип значения описание
IFLA_UNSPEC - не определено
IFLA_ADDRESS аппаратный адрес адрес интерфейса L2
IFLA_BROADCAST аппаратный адрес широковещательный адрес L2
IFLA_IFNAME строка asciiz имя устройства
IFLA_MTU unsigned int MTU устройства
IFLA_LINK int тип связи
IFLA_QDISC строка asciiz алгоритм очереди
IFLA_STATS смотрите ниже статистика интерфейса
Тип значения для IFLA_STATSstruct rtnl_link_stats (в Linux 2.4 и старее — struct net_device_stats).
RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
Add, remove, or receive information about an IP address associated with an interface. In Linux 2.2, an interface can carry multiple IP addresses, this replaces the alias device concept in Linux 2.0. In Linux 2.2, these messages support IPv4 and IPv6 addresses. They contain an ifaddrmsg structure, optionally followed by rtattr routing attributes.
struct ifaddrmsg {
    unsigned char ifa_family;    /* тип адреса */
    unsigned char ifa_prefixlen; /* длина префикса адреса */
    unsigned char ifa_flags;     /* флаги адреса */
    unsigned char ifa_scope;     /* область адреса */
    unsigned int  ifa_index;     /* индекс интерфейса */
};
    
Поле ifa_family представляет тип адресного семейства ( AF_INET или AF_INET6), ifa_prefixlen — длину адресной маски адреса, если это применимо для семейства (в IPv4), ifa_scope — область адреса, ifa_index — индекс интерфейса, которому назначен адрес. Поле ifa_flags — слово флагов: IFA_F_SECONDARY — вторичный адрес (старый псевдоним интерфейса), IFA_F_PERMANENT — постоянный адрес, назначенный пользователем и другие недокументированные флаги.
Атрибуты
rta_type тип значения описание
IFA_UNSPEC - не определено
IFA_ADDRESS адрес неструктурированного протокола адрес интерфейса
IFA_LOCAL адрес неструктурированного протокола локальный адрес
IFA_LABEL строка asciiz название интерфейса
IFA_BROADCAST адрес неструктурированного протокола широковещательный адрес
IFA_ANYCAST адрес неструктурированного протокола адрес anycast
IFA_CACHEINFO struct ifa_cacheinfo информация об адресе
RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
Создание, удаление или получение информации о сетевом маршруте. Эти сообщения содержат структуру rtmsg с необязательными дополнительными структурами rtattr. Для RTM_GETROUTE, если rtm_dst_len и rtm_src_len задать значение 0, то вы получите все записи определённой таблицы маршрутизации. В других полях, кроме rtm_table и rtm_protocol, 0 считается шаблоном (wildcard).
struct rtmsg {
    unsigned char rtm_family;   /* Address family of route */
    unsigned char rtm_dst_len;  /* Length of destination */
    unsigned char rtm_src_len;  /* Length of source */
    unsigned char rtm_tos;      /* TOS filter */
    unsigned char rtm_table;    /* Routing table ID;
                                   see RTA_TABLE below */
    unsigned char rtm_protocol; /* Routing protocol; see below */
    unsigned char rtm_scope;    /* See below */
    unsigned char rtm_type;     /* See below */
unsigned int rtm_flags; };
rtm_type Тип маршрута
RTN_UNSPEC неизвестный маршрут
RTN_UNICAST шлюз или прямой маршрут
RTN_LOCAL маршрут локального интерфейса
RTN_BROADCAST локальный широковещательный маршрут (широковещательная отправка)
RTN_ANYCAST локальный широковещательный маршрут (однонаправленная отправка)
RTN_MULTICAST многоадресный маршрут
RTN_BLACKHOLE маршрут для отброса пакетов
RTN_UNREACHABLE недостижимый пункт назначения
RTN_PROHIBIT маршрут для отклонения пакетов
RTN_THROW продолжение поиска маршрута в другой таблице
RTN_NAT правило трансляции сетевого адреса
RTN_XRESOLVE ссылка на внешний определитель (не реализовано)
Происхождение маршрута
RTPROT_UNSPEC неизвестно
RTPROT_REDIRECT из-за перенаправления полученном по ICMP (не используется)
RTPROT_KERNEL посылается ядром
RTPROT_BOOT при загрузке машины
RTPROT_STATIC указан администратором
Значения больше RTPROT_STATIC не учитываются ядром, они предназначены только для пользовательской информации. Они могут использоваться для пометки источника информации о маршрутизации или для отличения различных служб маршрутизации друг от друга. Уже назначенные идентификаторы для служб маршрутизации можно найти в <linux/rtnetlink.h>.
rtm_scope — расстояние до назначения:
RT_SCOPE_UNIVERSE глобальный маршрут
RT_SCOPE_SITE внутренний маршрут в локальной автономной системе
RT_SCOPE_LINK маршрут на эту связь
RT_SCOPE_HOST маршрут на локальный узел
RT_SCOPE_NOWHERE назначение не существует
Значения от RT_SCOPE_UNIVERSE и до RT_SCOPE_SITE доступны пользователю.
Поле rtm_flags может иметь следующие значения:
RTM_F_NOTIFY если маршрут изменился — уведомить пользователя через rtnetlink
RTM_F_CLONED маршрут склонирован из другого маршрута
RTM_F_EQUALIZE многопутевой уравниватель (не реализовано)
В rtm_table задаётся таблица маршрутизации:
RT_TABLE_UNSPEC таблица маршрутизации не задана
RT_TABLE_DEFAULT таблица по умолчанию
RT_TABLE_MAIN главная таблица
RT_TABLE_LOCAL локальная таблица
Пользователь может назначать произвольные значения от RT_TABLE_UNSPEC и до RT_TABLE_DEFAULT.
Атрибуты
rta_type тип значения описание
RTA_UNSPEC - игнорируется
RTA_DST адрес протокола адрес маршрута назначения
RTA_SRC адрес протокола адрес маршрута источника
RTA_IIF int индекс входного интерфейса
RTA_OIF int индекс выходного интерфейса
RTA_GATEWAY адрес протокола шлюз маршрута
RTA_PRIORITY int приоритет маршрута
RTA_PREFSRC адрес протокола Preferred source address
RTA_METRICS int метрика маршрута
RTA_MULTIPATH Multipath nexthop data br (see below).
RTA_PROTOINFO No longer used
RTA_FLOW int Route realm
RTA_CACHEINFO struct rta_cacheinfo (see linux/rtnetlink.h)
RTA_SESSION No longer used
RTA_MP_ALGO No longer used
RTA_TABLE int Routing table ID; if set, rtm_table is ignored
RTA_MARK int
RTA_MFC_STATS struct rta_mfc_stats (see linux/rtnetlink.h)
RTA_VIA struct rtvia Gateway in different AF (see below)
RTA_NEWDST адрес протокола Change packet destination address
RTA_PREF char RFC4191 IPv6 router preference (see below)
RTA_ENCAP_TYPE short Encapsulation type for lwtunnels (see below)
RTA_ENCAP Defined by RTA_ENCAP_TYPE
RTA_EXPIRES int Expire time for IPv6 routes (in seconds)
RTA_MULTIPATH contains several packed instances of struct rtnexthop together with nested RTAs ( RTA_GATEWAY):

struct rtnexthop {
    unsigned short rtnh_len;     /* Length of struct + length
                                    of RTAs */
    unsigned char  rtnh_flags;   /* Flags (see
                                    linux/rtnetlink.h) */
    unsigned char  rtnh_hops;    /* Nexthop priority */
    int            rtnh_ifindex; /* Interface index for this
                                    nexthop */
}
    

There exist a bunch of RTNH_* macros similar to RTA_* and NLHDR_* macros useful to handle these structures.

struct rtvia {
    unsigned short rtvia_family;
    unsigned char  rtvia_addr[0];
};
    

rtvia_addr is the address, rtvia_family is its family type.
RTA_PREF may contain values ICMPV6_ROUTER_PREF_LOW, ICMPV6_ROUTER_PREF_MEDIUM, and ICMPV6_ROUTER_PREF_HIGH defined incw <linux/icmpv6.h>.
RTA_ENCAP_TYPE may contain values LWTUNNEL_ENCAP_MPLS, LWTUNNEL_ENCAP_IP, LWTUNNEL_ENCAP_ILA, or LWTUNNEL_ENCAP_IP6 defined in <linux/lwtunnel.h>.
Заполнить эти значения!
RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
Добавление, удаление или получение информации о записи соседей по таблице (например, запись ARP). В сообщении содержится структура ndmsg:
struct ndmsg {
    unsigned char ndm_family;
    int           ndm_ifindex;  /* индекс интерфейса */
    __u16         ndm_state;    /* состояние */
    __u8          ndm_flags;    /* флаги */
    __u8          ndm_type;
};
struct nda_cacheinfo { __u32 ndm_confirmed; __u32 ndm_used; __u32 ndm_updated; __u32 ndm_refcnt; };
В ndm_state содержится битовая маска следующих состояний:
NUD_INCOMPLETE запись кэша в данный момент определяется
NUD_REACHABLE подтверждённая рабочая запись кэша
NUD_STALE устаревшая запись кэша
NUD_DELAY запись ожидает срабатывания таймера
NUD_PROBE запись кэша в данный момент проверяется повторно
NUD_FAILED некорректная запись кэша
NUD_NOARP устройство без кэша назначений
NUD_PERMANENT статическая запись
Допустимые значения ndm_flags:
NTF_PROXY запись прокси arp
NTF_ROUTER маршрутизатор IPv6
Структура rtattr имеет следующие значения для поля rta_type:
NDA_UNSPEC неизвестный тип
NDA_DST кэш адресов назначения соседей на сетевом уровне
NDA_LLADDR кэш адресов соседей на уровне связей
NDA_CACHEINFO статистика кэша
Если значение поля rta_type равно NDA_CACHEINFO, то присутствует заголовок struct nda_cacheinfo.
RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
Добавление, удаление или получение правила маршрутизации. Содержит struct rtmsg.
RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
Добавление, удаление или получение планирования очереди. В сообщении содержится struct tcmsg, а также может быть серия атрибутов.
struct tcmsg {
    unsigned char    tcm_family;
    int              tcm_ifindex;   /* индекс интерфейса */
    __u32            tcm_handle;    /* описатель qdisc */
    __u32            tcm_parent;    /* предок qdisc */
    __u32            tcm_info;
};
    
Атрибуты
rta_type тип значения описание
TCA_UNSPEC - не определено
TCA_KIND строка asciiz имя план-ания очереди
TCA_OPTIONS байтовая последовательность есть параметры qdisc
TCA_STATS struct tc_stats статистика qdisc
TCA_XSTATS относится к qdisc стат-ка по опр. модулю
TCA_RATE struct tc_estimator ограничение по скорости
Также, разрешены дополнительные атрибуты модуля qdisc. Дополнительную информацию можно получить из соответствующих заголовочных файлов.
RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
Добавление, удаление или получение класса трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.
RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
Добавление, удаление или получение информации о фильтре трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.

ВЕРСИИ

Свойство rtnetlink появилось в Linux 2.2.

ДЕФЕКТЫ

Данная справочная страница не полна.

СМ. ТАКЖЕ

cmsg(3), rtnetlink(3), ip(7), netlink(7)

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан aereiae <[email protected]>, Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Katrin Kutepova <[email protected]>, Lockal <[email protected]>, Yuri Kozlov <[email protected]>, Баринов Владимир и Иван Павлов <[email protected]>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]

Recommended readings

Pages related to rtnetlink you should read also: