Документация по LinuxLinuxDoc.Ru 🔍

netdevice - функция низкоуровневого доступа к сетевым устройствам Linux

НАЗВАНИЕ
netdevice - функция низкоуровневого доступа к сетевым
устройствам Linux.

СИНТАКСИС

#include
#include

ОПИСАНИЕ

Эта страница руководства описывает интерфейс сокетов,
используемый для настройки сетевых устройств.

Linux поддерживает несколько стандартных вызовов ioctl для
настройки сетевых устройств. Они могут применяться для
любого файлового описателя сокета независимо от семейства
или типа сокета. В качестве параметра передается структура
ifreq:
struct ifreq {
char ifr_name[IFNAMSIZ]; /* Имя интерфейса */
union {
struct sockaddr ifr_addr;
struct sockaddr ifr_dstaddr;
struct sockaddr ifr_broadaddr;
struct sockaddr ifr_netmask;
struct sockaddr ifr_hwaddr;
short ifr_flags;
int ifr_ifindex;
int ifr_metric;
int ifr_mtu;
struct ifmap ifr_map;
char ifr_slave[IFNAMSIZ];
char ifr_newname[IFNAMSIZ];
char * ifr_data;
};
};

struct ifconf {
int ifc_len; /* размер буфера */
union {
char * ifc_buf; /* адрес буфера */
struct ifreq *ifc_req; /* массив структур */
};
};
Обычно пользователь обозначает устройство, присваивая ему
имя интерфейса ifr_name. Все остальные поля структуры
могут использоваться совместно.

ВЫЗОВЫ IOCTL
Если вызов ioctl считается привилегированным, то для его
использования необходим эффективный идентификатор
пользователя 0 или наличие возможности CAP_NET_ADMIN. В
противном случае будет возвращено значение EPERM.

SIOCGIFNAME
Возвращает в ifr_name имя интерфейса с индексом
ifr_ifindex. Это единственный вызов ioctl,
возвращающий реезультат в ifr_name.

SIOCGIFINDEX
Возвращает индекс интерфейса в ifr_ifindex.

SIOCGIFFLAGS, SIOCSIFFLAGS
Считывает или устанавливает слово о состоянии
устройства. ifr_flags Содержит битовую маску из
следующих значений:
Флаги устройства
IFF_UP Интерфейс активен.
IFF_BROADCAST Установлен правильный широковещательный адрес.
IFF_DEBUG Флаг внутренней отладки.
IFF_LOOPBACK Интерфейс является устройством обратной петли.
IFF_POINTOPOINT Интерфейс является point-to-point соединением.
IFF_RUNNING Ресурсы выделены.
IFF_NOARP Hет протокола arp, адрес назначения 2-ого уровня (L2) не установлен.
IFF_PROMISC Интерфейс в "смешанном" (promiscuous) режиме.
IFF_NOTRAILERS Избегать использования trailers.
IFF_ALLMULTI Принимать все многоадресные пакеты.
IFF_MASTER Мастер связки балансирования загрузкой (load balancing bundle).
IFF_SLAVE Подчиненный связки балансирования нагрузкой.
IFF_MULTICAST Поддерживает многоадресное вещание.
IFF_PORTSEL Может выбирать тип носителя с помощью ifmap.
IFF_AUTOMEDIA Запущен автоматический выбор носителя.
IFF_DYNAMIC Эти адреса потеряны, если интерфейс неактивен.
Установка слова состояния устройства является
привилегированной операцией, но считывать его может
любой процесс.

SIOCGIFMETRIC, SIOCSIFMETRIC
Считывать или установить метрику устройства с
помощью ifr_metric. В данный момент возможность не
реализована; при считывании ifr_metric
присваивается значение, равное нулю, а при попытке
установки возвращается значение EOPNOTSUPP.

SIOCGIFMTU, SIOCSIFMTU
Считывает или устанавливет MTU (Maximum Transfer
Unit - максимальную порцию данных) с помощью
ifr_mtu. Установка MTU является привилегированной
операцией. Установка слишком маленьких значений
может привести к авариям в ядре.

SIOCGIFHWADDR, SIOCSIFHWADDR
Считывает или устанавливает аппаратный адрес
устройства из ifr_hwaddr. Аппаратный адрес
определяется в структуре sockaddr. sa_family
содержит тип устройства ARPHRD_*, sa_data содержит
аппаратный адрес L2, начиная с байта 0. Установка
аппаратного адреса является привилегированной
операцией.

SIOCSIFHWBROADCAST
Устанавливает аппаратный широковещательный адрес
устройства из ifr_hwaddr. Это привилегированная
операция.

SIOCGIFMAP, SIOCSIFMAP
Считывает или устанавливает аппаратные параметры
интерфейса из 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 зависит от драйвера
устройства и архитектуры системы.

SIOCADDMULTI, SIOCDELMULTI
Добавить адрес или удалить адрес из фильтров
многоадресной передачи уровня связи устройства с
помощью ifr_hwaddr. Это привилегированная
операция. Альтернативный способ приведен в
packet(7).

SIOCGIFTXQLEN, SIOCSIFTXQLEN
Считывать или установить размер очереди передачи
устройства из ifr_qlen. Установка размера очереди
передачи является привилегированной операцией.

SIOCSIFNAME
Изменяет имя интерфейса, указанного в ifr_name, на
ifr_newname. Это привилегированная операция. Она
разрешена только тогда, когда интерфейс не активен.

SIOCGIFCONF
Возвращает список адресов интерфейса (транспортный
уровень). Для поддержки совместимости в данный
момент возвращаются только адреса семейства AF_INET
(IPv4). Пользователь передает в качестве аргумента
вызова ioctl структуру ifconf. Она содержит в поле
ifc_req указатель на массив структур ifreq, а в
поле ifc_len - его длину. Ядро заполняет структуры
ifreq всеми текущими адресами третьего уровня (L3),
связанными с интерфейсом и являющимися активными:
ifr_name содержит имя интерфейса (eth0:1 и т.п.),
ifr_addr содержит адрес. Ядра устанавливают длину
массива равной ifc_len. Если ifc_len равно
начальной длине, то пользователь должен
предположить, что буфер переполнен, и попробовать
еще раз проделать то же самое с буфером большего
размера, чтобы в него поместились все адреса. Если
ошибок не было, то ioctl возвращает 0, в противном
случае -1. Переполнение не является ошибкой.

Большинство протоколов поддерживают свои собственные
вызовы ioctl для настройки предназначенных только для
протокола параметров интерфейса. Подробности приведены на
страницах руководства о протоколах. Hастройка адресов IP
описывается в ip(7).

В дополнение ко всему, некоторые устройства поддерживают
частные (private) вызовы ioctl. Здесь они не описаны.

ЗАМЕЧАНИЯ

Строго говоря, SIOCGIFCONF является особенностью IP и
принадлежит ip(7).

Имена интерфейсов, не имеющих адресов или установленного
флага IFF_RUNNING, можно определить с помощью
/proc/net/dev.

Местные IP-адреса IPv6 могут быть найдены через /proc/net
или по rtnetlink(7).

НАЙДЕННЫЕ ОШИБКИ
glibc 2.1 не находит макрос ifr_newname в файле net/if.h.
Добавьте следующие строки в вашу программу (как
искусственный прием):
Читать новости Linux в Telegram
Linux - netdevice - функция низкоуровневого доступа к сетевым устройствам Linux
Мы в соцсетях ✉