Шрифт:
Некоторые версии Unix из более новых ослабили требование к правам пользователя для операции открытия маршрутизирующего сокета и ограничивают только передачу сообщений, изменяющих таблицу маршрутизации ядра. Это позволяет любому процессу узнать маршрут при помощи команды RTM_GET, не являясь суперпользователем.
Технически третья операция выполняется при помощи общей функции sysctl, а не маршрутизирующего сокета. Но мы увидим, что среди ее входных параметров есть семейство адресов (для описываемых в этой главе операций используется семейство AF_ROUTE), а результат она возвращает в том же формате, который используется ядром для маршрутизирующего сокета. Действительно, в ядре 4.4BSD обработка функции sysctl для семейства AF_ROUTE является частью кода маршрутизирующего сокета [128, с. 632–643].
Функция sysctl появилась в 4.4BSD. К сожалению, не все реализации, поддерживающие маршрутизирующие сокеты, предоставляют ее. Например, AIX 4.2, Digital Unix 4.0 и Solaris 2.6 поддерживают маршрутизирующие сокеты, но ни одна из этих систем не поддерживает утилиту sysctl.
18.2. Структура адреса сокета канального уровня
Структуры адреса сокета канального уровня будут встречаться нам как значения, содержащиеся в некоторых сообщениях, возвращаемых на маршрутизирующем сокете. В листинге 18.1 [1] показано определение структуры, задаваемой в заголовочном файле
Листинг 18.1. Структура адреса сокета канального уровня
1
Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.
У каждого интерфейса имеется уникальный положительный индекс. Далее в этой главе мы увидим, каким образом он возвращается функциями
Элемент
Эти структуры адреса сокета имеют переменную длину [128, с. 89]. Если адрес канального уровня и имя превышают 12 байт, размер структуры будет больше 20 байт. В 32-разрядных системах размер обычно округляется в большую сторону, до следующего числа, кратного 4 байтам. Мы также увидим на рис. 22.1, что когда одна из этих структур возвращается параметром сокета
18.3. Чтение и запись
Создав маршрутизирующий сокет, процесс может отправлять ядру команды путем записи в этот сокет и считывать из него информацию от ядра. Существует 12 различных команд маршрутизации, 5 из которых могут быть запущены процессом. Они определяются в заголовочном файле
Таблица 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 |