
Интерфейс netdevice в Linux
Дата: 06 Окт 2005 (Чтв) в 15:12:26
Тема: Реализации протоколов
Интерфейс netdevice обеспечивает возможность взаимодействия с сетевыми устройствами Linux. Операции IOCTL для интерфейса netdevice описаны в заголовочных файлах <sys/ioctl.h> и <net/if.h>.
С помощью этих операций и параметров netdevice обеспечивается возможность настройки конфигурационных параметров сетевых устройств.
ОС Linux поддерживает для настройки конфигурации сетевых устройств стандартные операции IOCTL. Эти операции могут использоваться с файловыми дескрипторами любого сокета, независимо от его семейства и типа. Параметры интерфейсов передаются в виде структур ifreq и ifconf, описанных в заголовочном файле <net/if.h>.
Обычно пользователь задает интерфейс, указывая в поле ifr_name имя нужного интерфейса.
Операции IOCTL
Для использования привилегированных операций IOCTL приложение должно иметь флаг возможностей CAP_NET_ADMIN или исполняться от имени пользователя с эффективным значением UID=0.
Таблица 1 Операции IOCTL для netdevice
Имя
|
Описание
|
SIOCGIFNAME
|
Принимая индекс интерфейса ifr_ifindex, возвращает имя этого интерфейса в поле ifr_name. Это единственная операция IOCTL, возвращающая результат в поле ifr_name.
|
SIOCGIFINDEX
|
Определяет индекс интерфейса, заданного полем ifr_ifindex.
|
SIOCGIFFLAGS
|
Возвращает слово флагов (см. таблицу 2). для устройства в поле ifr_flags.
|
SIOCSIFFLAGS
|
Устанавливает флаги устройства (см. таблицу 2), заданные в поле ifr_flags. Установка флагов является привилегированной операцией
|
SIOCGIFMETRIC
|
Возвращает метрику устройства в поле ifr_metric.
|
SIOCSIFMETRIC
|
Устанавливает для устройства метрику, переданную в поле ifr_metric. Если установка метрики не поддерживается, функция возвращает код ошибки EOPNOTSUPP.
|
SIOCGIFMTU
|
Возвращает значение MTU для интерфейса в поле ifr_mtu.
|
SIOCSIFMTU
|
Устанавливает для интерфейса значение MTU, переданное в поле ifr_mtu. Установка слишком малого значения MTU может привести к серьезным ошибкам в работе ядра.
|
SIOCGIFHWADDR
|
Возвращает аппаратный адрес устройства в поле ifr_hwaddr. Аппаратный адрес содержится в структуре данных sockaddr - поле sa_family содержит идентификатор типа устройства ARPHRD_*, sa_data – адрес канального уровня, начинающийся с байта 0.
|
SIOCSIFHWADDR
|
Устанавливает аппаратный адрес устройства, полученный в поле ifr_hwaddr. Аппаратный адрес помещается в структуру данных sockaddr - поле sa_family содержит идентификатор типа устройства ARPHRD_*, sa_data – адрес канального уровня, начинающийся с байта 0. Установка аппаратного адреса является привилегированной операцией.
|
SIOCSIFHWBROADCAST
|
Эта привилегированная операция устанавливает для устройства широковещательный адрес, полученный в поле ifr_hwaddr.
|
SIOCGIFMAP
|
Возвращает аппаратные параметры устройства в поле ifr_map, содержащем структуру данных.
struct ifmap
{
unsigned long mem_start;
unsigned long mem_end;
unsigned short base_addr;
unsigned char irq;
unsigned char dma;
unsigned char port;
};
Интерпретация полей структуры ifmap зависит от архитектуры и драйвера устройства.
|
SIOCSIFMAP
|
Устанавливает аппаратные параметры устройства, полученные в структуре ifr_map. Установка параметров является привилегированной операцией.
|
SIOCADDMULTI
|
Добавляет адрес, переданный в поле ifr_hwaddr, в multicast-фильтры интерфейса. Операция является привилегированной.
|
SIOCDELMULTI
|
Удаляет адрес, переданный в поле ifr_hwaddr, из multicast-фильтров интерфейса. Операция является привилегированной.
|
SIOCGIFTXQLEN
|
Возвращает размер очереди на передачу в поле ifr_qlen.
|
SIOCSIFTXQLEN
|
Устанавливает размер очереди на передачу в соответствии со значением поля ifr_qlen. Операция является привилегированной.
|
SIOCSIFNAME
|
Заменяет имя интерфейса на значение, переданное в поле ifr_name. Операция является привилегированной и может использоваться только при отключенном (down) интерфейсе.
|
SIOCGIFCONF
|
Возвращает список адресов сетевого уровня для интерфейса. В настоящее время поддерживается только определение адресов Ipv4 (семейство AF_INET). Пользовательская программа передает в качестве аргумента функции ioctl структуру данных ifconf, содержащую указатель на массив структур ifreq в поле ifc_req и размер массива в поле ifc_len. Ядро заполняет структуры ifreq данными активных интерфейсов сетевого уровня, помещая в поле ifr_name имена интерфейсов (eth0:1 и т. п.), а в поле ifr_addr – IP-адреса. Актуальный размер массива адресов ядро возвращает в поле ifc_len. Если возвращенное значение ifc_len совпадает с переданным, это может говорить о недостаточном размере переданного функции массива. В таких случаях целесообразно повторить попытку с большим размером буфера для передачи адресов.
|
Таблица 2 Флаги устройств для netdevice
Флаг
|
Описание
|
IFF_UP
|
Интерфейс активен.
|
IFF_BROADCAST
|
Для интерфейса установлен корректный широковещательный адрес.
|
IFF_DEBUG
|
Внутренний флаг отладки.
|
IFF_LOOPBACK
|
Интерфейс является петлевым (loopback).
|
IFF_POINTOPOINT
|
Интерфейс подключен к каналу “точка-точка”.
|
IFF_RUNNING
|
Ресурсы выделены.
|
IFF_NOARP
|
Адрес канального уровня не задан, протокол ARP не используется.
|
IFF_PROMISC
|
Интерфейс находится в режиме захвата пакетов.
|
IFF_NOTRAILERS
|
Избегать использования трейлеров.
|
IFF_ALLMULTI
|
Принимать все пакеты с групповыми адресами.
|
IFF_MASTER
|
Интерфейс является ведущим в транке с распределением нагрузки.
|
IFF_SLAVE
|
Интерфейс является ведомым в транке с распределением нагрузки.
|
IFF_MULTICAST
|
Включает поддержку групповой адресации.
|
IFF_PORTSEL
|
Интерфейс может выбирать тип среды с помощью ifmap.
|
IFF_AUTOMEDIA
|
Автоматический выбор среды активизирован.
|
IFF_DYNAMIC
|
При отключении интерфейса адрес был потерян.
|
Большинство протоколов поддерживает дополнительные операции IOCTL для настройки связанных с протоколом опций интерфейса. В частности, протокол IP поддерживает большой набор операций IOCTL.
Кроме того, некоторые устройства могут поддерживать фирменные расширения IOCTL.
Имена интерфейсов (включая те, которые не имеют адресов или флага IFF_RUNNING) можно найти в файле /proc/net/dev.
Известные ограничения
Библиотека glibc 2.1 не содержит макроса ifr_newname в файле net/if.h. Для решения проблемы достаточно добавить приведенный ниже текст в этот файл.
#ifndef ifr_newname
#define ifr_newname ifr_ifru.ifru_slave
#endif
|