ОБЗОР
#include <asm/types.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_STATS — struct rtnl_link_stats (в Linux 2.4 и старее — struct net_device_stats).
- RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
-
Добавление, удаление или получение информации об IP-адресе, назначенном
интерфейсу. В Linux 2.2 интерфейс может иметь несколько IP-адресов; эта
концепция пришла на смену псевдонимам устройства, использовавшимся в версии
2.0. В Linux 2.2 эти сообщения поддерживают адреса IPv4 и IPv6. В них
содержится структура ifaddrmsg, которая может быть указана после
атрибутов маршрутизации rtattr.
struct ifaddrmsg { unsigned char ifa_family; /* тип адреса */ unsigned char ifa_prefixlen; /* длина префикса адреса */ unsigned char ifa_flags; /* флаги адреса */ unsigned char ifa_scope; /* область адреса */ 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 адрес raw-протокола адрес интерфейса IFA_LOCAL адрес raw-протокола локальный адрес IFA_LABEL строка asciiz название интерфейса IFA_BROADCAST адрес raw-протокола широковещательный адрес IFA_ANYCAST адрес raw-протокола адрес 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; /* адресное семейство маршрута */ unsigned char rtm_dst_len; /* длина назначения */ unsigned char rtm_src_len; /* длина источника */ unsigned char rtm_tos; /* фильтр TOS */ unsigned char rtm_table; /* ID таблицы маршрутизации */ unsigned char rtm_protocol; /* протокол марш-ции; см. ниже */ unsigned char rtm_scope; /* см. ниже */ unsigned char rtm_type; /* см. ниже */ 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 ссылка на внешний определитель (не реализовано) rtm_protocol Происхождение маршрута 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 RTA_METRICS int метрика маршрута RTA_MULTIPATH RTA_PROTOINFO RTA_FLOW RTA_CACHEINFO Заполнить эти значения!
- 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 specific стат-ка по опр. модулю TCA_RATE struct tc_estimator ограничение по скорости Также, разрешены дополнительные атрибуты модуля qdisc. Дополнительную информацию можно получить из соответствующих заголовочных файлов.
- RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
- Добавление, удаление или получение класса трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.
- RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
- Добавление, удаление или получение информации о фильтре трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.