NETDEVICE(7) | Руководство программиста Linux | NETDEVICE(7) |
netdevice - низкоуровневый доступ к сетевым устройствам Linux
#include <sys/ioctl.h> #include <net/if.h>
В этой справочной странице описан интерфейс сокетов, используемый для настройки сетевых устройств.
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; }; };
Обычно, пользователь указывает имя нужного устройства в ifr_name. Все остальные поля структуры могут занимать единое пространство в памяти.
Если указано, вызов ioctl считается привилегированным, то для его использования необходимо иметь эффективный идентификатор пользователя 0 или мандат CAP_NET_ADMIN. В противном случае будет возвращено значение EPERM.
Флаги устройства | |
IFF_UP | Интерфейс активен. |
IFF_BROADCAST | Установлен правильный широковещательный адрес. |
IFF_DEBUG | Флаг внутренней отладки. |
IFF_LOOPBACK | Интерфейс является устройством обратной петли. |
IFF_POINTOPOINT | Интерфейс является соединением точка-точка. |
IFF_RUNNING | Ресурсы выделены. |
IFF_NOARP | Нет протокола arp, адрес назначения 2-ого уровня (L2) не установлен. |
IFF_PROMISC | Интерфейс в режиме прослушки (promiscuous). |
IFF_NOTRAILERS | Избегать использования концевиков (trailers). |
IFF_ALLMULTI | Принимать все многоадресные пакеты. |
IFF_MASTER | Мастер в связке балансирования нагрузки. |
IFF_SLAVE | Подчинённый в связке балансирования нагрузки. |
IFF_MULTICAST | Поддержка многоадресной передачи. |
IFF_PORTSEL | Может выбирать тип среды с помощью ifmap. |
IFF_AUTOMEDIA | Запущен автоматический выбор среды. |
IFF_DYNAMIC | Адреса теряются, если интерфейс становится неактивным. |
IFF_LOWER_UP | Сигналы драйвера L1 указывают на включение интерфейса (начиная с Linux 2.6.17). |
IFF_DORMANT | Сигналы драйвера указывают на неактивность интерфейса (начиная с Linux 2.6.17). |
IFF_ECHO | Посылать пакеты echo (начиная с Linux 2.6.25). |
Установка флага в слове флагов является привилегированной операцией, но считывать его может любой процесс.
Индивидуальные флаги | |
IFF_802_1Q_VLAN | Интерфейс является устройством 802.1Q VLAN. |
IFF_EBRIDGE | Интерфейс является устройством моста Ethernet. |
IFF_SLAVE_INACTIVE | Интерфейс является неактивным подчинённым в связке балансирования нагрузки. |
IFF_MASTER_8023AD | Интерфейс является мастером в связке балансирования нагрузки 802.3ad. |
IFF_MASTER_ALB | Интерфейс является мастером связки балансирования нагрузки в режиме balanced-alb. |
IFF_BONDING | Интерфейс является мастером или подчинённым в связке балансирования нагрузки. |
IFF_SLAVE_NEEDARP | Интерфейсу требуется ARP для проверки. |
IFF_ISATAP | Интерфейс является интерфейсом RFC4214 ISATAP. |
Установка расширенных (индивидуальных) флагов интерфейса является привилегированной операцией.
struct ifmap { unsigned long mem_start; unsigned long mem_end; unsigned short base_addr; unsigned char irq; unsigned char dma; unsigned char port; };
struct ifconf { int ifc_len; /* размер буфера */ union { char *ifc_buf; /* адрес буфера */ struct ifreq *ifc_req; /* массив структур */ }; };
Большинство протоколов поддерживают свои собственные вызовы ioctl для настройки предназначенных только для протокола параметров интерфейса. Подробности приведены в справочных страницах протоколов. Настройка адресов IP описывается в ip(7).
В дополнение ко всему, некоторые устройства поддерживают индивидуальные (private) вызовы ioctl. Здесь они не описаны.
Строго говоря, SIOCGIFCONF и другие вызовы ioctl, которые принимают или возвращают только адреса сокетов AF_INET, работают только с IP и принадлежат ip(7).
Имена интерфейсов, не имеющих адресов или установленного флага IFF_RUNNING, можно определить с помощью /proc/net/dev.
Локальные IP-адреса IPv6 можно найти в /proc/net или по rtnetlink(7).
В glibc 2.1 отсутствует макрос ifr_newname в файле <net/if.h>. Добавьте следующие строки в вашу программу (чтобы обойти это):
#ifndef ifr_newname #define ifr_newname ifr_ifru.ifru_slave #endif
2017-09-15 | Linux |