Создав маршрутизирующий сокет, процесс может отправлять ядру команды путем записи в этот сокет и считывать из него информацию от ядра. Существует 12 различных команд маршрутизации, 5 из которых могут быть запущены процессом. Они определяются в заголовочном файле и показаны в табл. 18.1.
Таблица 18.1. Типы сообщений, проходящих по маршрутизирующему сокету
Тип сообщения |
К ядру? |
От ядра? |
Описание |
Тип структуры |
RTM_ADD |
• |
• |
Добавить маршрут |
rt_msghdr |
RTM_CHANGE |
• |
• |
Поменять шлюз, метрику или флаги |
rt_msghdr |
RTM_DELADDR |
|
• |
Адрес был удален из интерфейса |
ifa_msghdr |
RTM_DELETE |
• |
• |
Удалить маршрут |
rt_msghdr |
RTM_GET |
• |
• |
Сообщить о метрике и других характеристиках маршрута |
rt_msghdr |
RTM_IFINFO |
|
• |
Находится ли интерфейс в активном состоянии |
if_msghdr |
RTM_LOCK |
• |
• |
Блокировка указанной метрики |
rt_msghdr |
RTM_LOSING |
|
• |
Возможно, неправильный маршрут |
rt_msghdr |
RTM_MISS |
|
• |
Поиск этого адреса завершился неудачно |
rt_msghdr |
RTM_NEWSDDR |
|
• |
Адрес добавлен к интерфейсу |
ifa_msghdr |
RTM_NEWMDDR |
|
• |
Групповой адрес добавлен к интерфейсу |
ifma_msghdr |
RTM_REDIRECT |
|
• |
Ядро получило указание использовать другой маршрут |
rt_msghdr |
RTM_RESOLVE |
|
• |
Запрос на определение адреса канального уровня по адресу получателя |
rt_msghdr |
На маршрутизирующем сокете происходит обмен пятью различными структурами, как показано в последнем столбце таблицы: rt_msghdr
, if_msghdr
, if_announcemsghdr
, ifma_msghdr
и ifa_msghdr
. Эти структуры представлены в листинге 18.2.
Листинг 18.2.Пять структур, возвращаемых с маршрутизирующими сообщениями
struct rt_msghdr { /* из */
u_short rtm_msglen; /* для пропуска некорректных сообщений */
u_char rtm_version; /* для обеспечения двоичной совместимости в будущем */
u_char rtm_type; /* тип сообщения */
u_short rtm_index; /* индекс интерфейса, с которым связан адрес */
int rtm_flags; /* флаги */
int rtm_addrs; /* битовая маска, идентифицирующая sockaddr (структуру адреса
сокета) в msg */
pid_t rtm_pid; /* идентификация отправителя */
int rtm_seq; /* для идентификации действия отправителем */
int rtm_errno; /* причина неудачного выполнения */
int rtm_use; /* из rtentry */
u_long rtm_inits; /* какую метрику мы инициализируем */
struct rt_metrics rtm_rmx; /* сами метрики */
};
struct if_msghdr { /* из */
u_short ifm_msglen; /* для пропуска некорректных сообщений */
u_char ifm_version; /* для обеспечения двоичной совместимости в будущем */
u_char ifm_type; /* тип сообщения */
int ifm_addrs; /* как rtm_addrs */
int ifm_flags; /* значение if_flags */
u_short ifm_index; /* индекс интерфейса, с которым связан адрес */
struct if_data ifm_data; /* статистические и другие сведения */
};
struct ifa_msghdr { /* из */
u_short ifam_msglen; /* для пропуска некорректных сообщений */
u_char ifam_version; /* для обеспечения двоичной совместимости в будущем */
u_char ifam_type; /* тип сообщения */
int ifam_addrs; /* как rtm_addrs */
int ifam_flags; /* значение ifa_flags */
u_short ifam_index; /* индекс интерфейса, с которым связан адрес */
int ifam_metric; /* значение ifa_metric */
};
struct ifma_msghdr { /* из */
u_short ifmam_msglen; /* для пропуска некорректных сообщений */
u_char ifmam_version; /* для обеспечения двоичной совместимости в будущем */
u_char ifmam_type; /* тип сообщения */
int ifmam_addrs; /* аналог rtm_addrs */
int ifmam_flags; /* значение ifa_flags */
u_short ifmam_index; /* индекс связанного ifp */
};
struct if_announcemsghdr { /* из */
u_short ifan_msglen; /* для пропуска некорректных сообщений */
u_char ifan_version; /* для обеспечения двоичной совместимости в будущем */
u_char ifan_type; /* тип сообщения */
u_short ifan_index; /* индекс связанного ifp */
char ifan_name[IFNAMSIZ]; /* название интерфейса, напр. "en0" */
u_short ifan_what; /* тип объявления */
};
Первые три элемента каждой структуры одни и те же: длина, версия и тип сообщения. Тип — это одна из констант из первого столбца табл. 18.1. Элемент длины xxx_msglen
позволяет приложению пропускать типы сообщений, которые оно не распознает.
Элементы rtm_addrs
, ifm_addrs
и ifam_addrs
являются битовыми масками, указывающими, какая из возможных восьми структур адреса сокета следует за сообщением. В табл. 18.2 показаны константы и значения для битовой маски, определяемые в заголовочном файле .
Читать дальше
Конец ознакомительного отрывка
Купить книгу