Энциклопедия сетевых протоколов

Интерфейс 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

Возвращает значение MTU1 для интерфейса в поле 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) интерфейсе.

SIOCGIFCONF2

Возвращает список адресов сетевого уровня для интерфейса. В настоящее время поддерживается только определение адресов 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



1Maximum Transfer Unit - максимальный размер передаваемого блока.

2Эта операция неразрывно связана с протоколом IP и относится скорее к этому протоколу, нежели к интерфейсу netdevice.







Статья опубликована на сайте Энциклопедия сетевых протоколов
https://protocols.ru

Ссылка на исходную публикацию:
https://protocols.ru/modules.php?name=News&file=article&sid=69