RTNETLINK(7) | Руководство программиста Linux | RTNETLINK(7) |
rtnetlink - сокет маршрутизации IPv4 в Linux
#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):
struct ifinfomsg { unsigned char ifi_family; /* AF_UNSPEC */ unsigned short ifi_type; /* тип устройства */ int ifi_index; /* индекс интерфейса */ unsigned int ifi_flags; /* флаги устройства */ unsigned int ifi_change; /* маска изменения */ };
Атрибуты маршрутизации | ||
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).
struct ifaddrmsg { unsigned char ifa_family; /* тип адреса */ unsigned char ifa_prefixlen; /* длина префикса адреса */ unsigned char ifa_flags; /* флаги адреса */ unsigned char ifa_scope; /* область адреса */ int ifa_index; /* индекс интерфейса */ };
Атрибуты | ||
rta_type | тип значения | описание |
IFA_UNSPEC | - | не определено |
IFA_ADDRESS | адрес неструктурированного протокола | адрес интерфейса |
IFA_LOCAL | адрес неструктурированного протокола | локальный адрес |
IFA_LABEL | строка asciiz | название интерфейса |
IFA_BROADCAST | адрес неструктурированного протокола | широковещательный адрес |
IFA_ANYCAST | адрес неструктурированного протокола | адрес anycast |
IFA_CACHEINFO | struct ifa_cacheinfo | информация об адресе |
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 | ссылка на внешний определитель (не реализовано) |
Происхождение маршрута | |
RTPROT_UNSPEC | неизвестно |
RTPROT_REDIRECT | из-за перенаправления полученном по ICMP (не используется) |
RTPROT_KERNEL | посылается ядром |
RTPROT_BOOT | при загрузке машины |
RTPROT_STATIC | указан администратором |
Значения больше RTPROT_STATIC не учитываются ядром, они предназначены только для пользовательской информации. Они могут использоваться для пометки источника информации о маршрутизации или для отличения различных служб маршрутизации друг от друга. Уже назначенные идентификаторы для служб маршрутизации можно найти в <linux/rtnetlink.h>.
RT_SCOPE_UNIVERSE | глобальный маршрут |
RT_SCOPE_SITE | внутренний маршрут в локальной автономной системе |
RT_SCOPE_LINK | маршрут на эту связь |
RT_SCOPE_HOST | маршрут на локальный узел |
RT_SCOPE_NOWHERE | назначение не существует |
Значения от RT_SCOPE_UNIVERSE и до RT_SCOPE_SITE доступны пользователю.
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 |
Заполнить эти значения!
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; };
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.
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. Дополнительную информацию можно получить из соответствующих заголовочных файлов.
Свойство rtnetlink появилось в Linux 2.2.
Данная справочная страница не полна.
2017-09-15 | Linux |