netdevice

15 декабря 2022 г.

ИМЯ

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;
    };
};

AF_INET6 is an exception. It passes an in6_ifreq structure:

struct in6_ifreq {
    struct in6_addr     ifr6_addr;
    u32                 ifr6_prefixlen;
    int                 ifr6_ifindex; /* Interface index */
};

Normally, the user specifies which device to affect by setting ifr_name to the name of the interface or ifr6_ifindex to the index of the interface. All other members of the structure may share memory.

Вызовы ioctl

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

SIOCGIFNAME

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

SIOCGIFINDEX

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

SIOCGIFFLAGS, SIOCSIFFLAGS

Считывает или устанавливает слово флагов устройства. В ifr_flags содержится битовая маска из следующих значений:

TABLE

Установка флага в слове флагов является привилегированной операцией, но считывать его может любой процесс.

SIOCGIFPFLAGS, SIOCSIFPFLAGS

Считает или устанавливает (индивидуальные) флаги устройства. Значение ifr_flags представляет собой битовую маску следующих значений:

TABLE

Установка расширенных (индивидуальных) флагов интерфейса является привилегированной операцией.

SIOCGIFADDR, SIOCSIFADDR, SIOCDIFADDR

Get, set, or delete the address of the device using ifr_addr, or ifr6_addr with ifr6_prefixlen. Setting or deleting the interface address is a privileged operation. For compatibility, SIOCGIFADDR returns only AF_INET addresses, SIOCSIFADDR accepts AF_INET and AF_INET6 addresses, and SIOCDIFADDR deletes only AF_INET6 addresses. A AF_INET address can be deleted by setting it to zero via SIOCSIFADDR.

SIOCGIFDSTADDR, SIOCSIFDSTADDR

Назначает или получает адрес назначения устройства точка-точка с помощью ifr_dstaddr. Для совместимости, принимаются или возвращаются только адреса семейства AF_INET. Присвоение адреса назначения является привилегированной операцией.

SIOCGIFBRDADDR, SIOCSIFBRDADDR

Назначает или получает широковещательный адрес устройства с помощью ifr_brdaddr. Для совместимости, принимаются или возвращаются только адреса семейства AF_INET. Присвоение широковещательного адреса является привилегированной операцией.

SIOCGIFNETMASK, SIOCSIFNETMASK

Назначает или получает маску сети устройства с помощью ifr_netmask. Для совместимости, принимаются или возвращаются только адреса семейства AF_INET. Назначение маски сети адреса является привилегированной операцией.

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

Return a list of interface (network layer) addresses. This currently means only addresses of the AF_INET (IPv4) family for compatibility. Unlike the others, this ioctl passes an ifconf structure:

struct ifconf {
    int               ifc_len; /* size of buffer */
    union {
        char         *ifc_buf; /* buffer address */
        struct ifreq *ifc_req; /* array of structures */
    };
};

Если ifc_req равно NULL, то SIOCGIFCONF возвращает необходимый размер буфера в байтах для приёма всех доступных адресов в ifc_len. В противном случае ifc_req содержит указатель на массив структур ifreq, который будет заполнен адресами всех активных интерфейсов L3. В ifc_len содержится размер массива в байтах. Внутри каждой структуры ifreq в ifr_name будет записано имя интерфейса, а в ifr_addr — адрес. Реальное количество переданных байт возвращается в ifc_len.

Если размера, указанного в ifc_len, недостаточно для сохранения всех адресов, то ядро не запишет не поместившиеся и сообщит об успешном выполнении. Не существует надёжного способа обнаружения возникновения такой ситуации. Поэтому рекомендуется или сначала определить необходимый размер буфера вызовом SIOCGIFCONF с значением ifc_req равным NULL, или повторить вызов с большим буфером и проверить не отличается ли ifc_len на менее чем sizeof(struct ifreq) от первого значения.

Если произошла ошибка доступа к структуре ifconf или ifreq, то возвращается EFAULT.

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

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

ЗАМЕЧАНИЯ

SIOCGIFCONF and the other ioctls that accept or return only AF_INET socket addresses are IP-specific and perhaps should rather be documented in ip(7).

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

AF_INET6 IPv6 addresses can be read from /proc/net/if_inet6 or via rtnetlink(7). Adding a new IPv6 address and deleting an existing IPv6 address can be done via SIOCSIFADDR and SIOCDIFADDR or via rtnetlink(7). Retrieving or changing destination IPv6 addresses of a point-to-point interface is possible only via rtnetlink(7).

ДЕФЕКТЫ

В glibc 2.1 отсутствует макрос ifr_newname в файле <net/if.h>. Добавьте следующие строки в вашу программу (чтобы обойти это):

#ifndef ifr_newname
#define ifr_newname     ifr_ifru.ifru_slave
#endif

СМ. ТАКЖЕ

proc(5), capabilities(7), ip(7), rtnetlink(7)

ПЕРЕВОД

Русский перевод этой страницы руководства: Alex Nik <rage.iz.me@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .