| 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 |