Scroll to navigation

NETDEVICE(7) Manual do Programador do Linux NETDEVICE(7)

NOME

netdevice - acesso de baixo nível a dispositivos de rede

SINOPSE

#include <sys/ioctl.h>
#include <net/if.h>

DESCRIÇÃO

Esta man page descreve a interface de 'sockets' que é usada para configurar dispositivos de rede.

Linux supports some standard ioctls to configure network devices. They can be used on any socket's file descriptor regardless of the family or type. Most of them pass an ifreq structure:


struct ifreq {

char ifr_name[IFNAMSIZ]; /* Nome da interface */
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;
}; };

Normalmente, o usuário especifica qual dispositivo será afetado pela seleção ifr_name para o nome da interface. Todos os outros membros da estrutura podem compartilhar memória.

Ioctls

Se um ioctl é marcado como privilegiado, então o seu uso requer um ID efetivo de usuário, ou a propriedade CAP_NET_ADMIN. Se este não é o caso, EPERM será retornado.

Dado o ifr_ifindex, returna o nome da interface em ifr_name. Este é o único ioctl que retorna seu resultado em ifr_name.
Recupera o índice da interface para ifr_ifindex.
Recebe ou seta a palavra de sinalização ativa do dispositivo. ifr_flags contém uma máscara de bits com os seguintes valores:
Sinalizadores do dispositivo
IFF_UP Interface está rodando.
IFF_BROADCAST Conjunto de endereço de broadcast válido.
IFF_DEBUG Sinalizador de debugging interno.
IFF_LOOPBACK Interface é uma interface do tipo 'loopback'.
IFF_POINTOPOINT Interface é uma ligação do tipo ponto-a-ponto.
IFF_RUNNING Recursos alocados.
IFF_NOARP Nenhum protocolo arp, endereço de destinação, L2 não especificado.
IFF_PROMISC Interface está em modo promíscuo.
IFF_NOTRAILERS Evita uso de 'trailers'.
IFF_ALLMULTI Recebe todos os pacotes multicast.
IFF_MASTER Mestre de um load balancing bundle.
IFF_SLAVE Escravo de um load balancing bundle.
IFF_MULTICAST Suporta multicast
IFF_PORTSEL É capaz de selecionar tipo de meio via ifmap.
IFF_AUTOMEDIA Auto-seleção de meio ativa.
IFF_DYNAMIC Os endereços são perdidos ao fechar a interface.
IFF_LOWER_UP Driver signals L1 up (since Linux 2.6.17)
IFF_DORMANT Driver signals dormant (since Linux 2.6.17)
IFF_ECHO Echo sent packets (since Linux 2.6.25)

Selecionar a palavra do sinalizador ativa é uma operação privilegiada, mas qualquer processo pode lê-la.

Get or set extended (private) flags for the device. ifr_flags contains a bit mask of the following values:
Private flags
IFF_802_1Q_VLAN Interface is 802.1Q VLAN device.
IFF_EBRIDGE Interface is Ethernet bridging device.
IFF_SLAVE_INACTIVE Interface is inactive bonding slave.
IFF_MASTER_8023AD Interface is 802.3ad bonding master.
IFF_MASTER_ALB Interface is balanced-alb bonding master.
IFF_BONDING Interface is a bonding master or slave.
IFF_SLAVE_NEEDARP Interface needs ARPs for validation.
IFF_ISATAP Interface is RFC4214 ISATAP interface.

Setting the extended (private) interface flags is a privileged operation.

Get or set the address of the device using ifr_addr. Setting the interface address is a privileged operation. For compatibility, only AF_INET addresses are accepted or returned.
Get or set the destination address of a point-to-point device using ifr_dstaddr. For compatibility, only AF_INET addresses are accepted or returned. Setting the destination address is a privileged operation.
Get or set the broadcast address for a device using ifr_brdaddr. For compatibility, only AF_INET addresses are accepted or returned. Setting the broadcast address is a privileged operation.
Get or set the network mask for a device using ifr_netmask. For compatibility, only AF_INET addresses are accepted or returned. Setting the network mask is a privileged operation.
Recebe ou seta a métrica do dispositivo usando ifr_metric. Isto não está implementado atualmente; ele seta ifr_metric em 0 se você tenta lê-lo e retorna EOPNOTSUPP se você tenta selecioná-lo.
Recebe ou seta o Unidade Máxima de Transferência (MTU) de um dispositivo, usando ifr_mtu. Setar o MTU é uma operação privilegiada. Selecionando a MTU para valores baixos pode-se provocar erros no kernel.
Recebe ou seta o endereço de hardware de um dispositivo, usando ifr_hwaddr. O endereço de hardware é especificado na estrutura sockaddr. sa_family contém o tipo de dispositivo ARPHDR_*, sa_data o endereço de hardware inicia com o byte 0. Setar o endereço de hardware é uma operação privilegiada.
Seta o endereço de hardware de broadcast de um dispositivo, de ifr_hwaddr. Esta é uma operação privilegiada.
Recebe ou seta os parâmetros de hardware da interface usando ifr_map. Setar os parâmetros é uma operação privilegiada.

struct ifmap {

unsigned long mem_start;
unsigned long mem_end;
unsigned short base_addr;
unsigned char irq;
unsigned char dma;
unsigned char port; };

A interpretação de uma estrutura ifmap depende do driver de dispositivo e da arquitetura.
Acrescenta ou apaga um endereço dos filtros de multicast da camada de ligação do dispositivo, usando ifr_hwaddr. Estas são operações privilegiadas. Veja também packet(7) para uma alternativa.
Recebe ou seta o comprimento da fila de transmissão de um dispositivo, usando ifr_qlen. Setar o comprimento da fila de transmissão é uma operação privilegiada.
Muda o nome da interface especificada em ifr_name para ifr_newname. Esta é uma operação privilegiada. Ela só é permitida quando a interface não está ativada.
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 */
}; };

If ifc_req is NULL, SIOCGIFCONF returns the necessary buffer size in bytes for receiving all available addresses in ifc_len. Otherwise, ifc_req contains a pointer to an array of ifreq structures to be filled with all currently active L3 interface addresses. ifc_len contains the size of the array in bytes. Within each ifreq structure, ifr_name will receive the interface name, and ifr_addr the address. The actual number of bytes transferred is returned in ifc_len.
If the size specified by ifc_len is insufficient to store all the addresses, the kernel will skip the exceeding ones and return success. There is no reliable way of detecting this condition once it has occurred. It is therefore recommended to either determine the necessary buffer size beforehand by calling SIOCGIFCONF with ifc_req set to NULL, or to retry the call with a bigger buffer whenever ifc_len upon return differs by less than sizeof(struct ifreq) from its original value.
If an error occurs accessing the ifconf or ifreq structures, EFAULT will be returned.

Muitos protocolos suportam seus próprios ioctls para configurar opções de interface específicas do protocolo. Veja as páginas de manual de protocolos para uma descrição. Para configuração de endereços IP ver ip(7).

Além disso, alguns dispositivos suportam ioctls privados. Estes não são descritos aqui.

NOTAS

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).

Os nomes das interfaces sem endereços ou que não tem um sinalizador IFF_RUNNING selecionado pode ser localizado através de /proc/net/dev.

Endereços locais IPv6 podem ser encontrados via /proc/net ou rtnetlink(7).

BUGS

glibc 2.1 omite a macro ifr_newname em <net/if.h>. Adicione o seguinte em seu programa para contornar:


#ifndef ifr_newname
#define ifr_newname     ifr_ifru.ifru_slave
#endif

VEJA TAMBÉM

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

COLOFÃO

Esta página faz parte da versão 5.10 do projeto Linux man-pages. Uma descrição do projeto, informações sobre relatórios de bugs e a versão mais recente desta página podem ser encontradas em https://www.kernel.org/doc/man-pages/.

TRADUÇÃO

A tradução para português brasileiro desta página man foi criada por Rubens de Jesus Nogueira <darkseid99@usa.net> e André Luiz Fassone <lonely_wolf@ig.com.br>

Esta tradução é uma documentação livre; leia a Licença Pública Geral GNU Versão 3 ou posterior para as condições de direitos autorais. Nenhuma responsabilidade é aceita.

Se você encontrar algum erro na tradução desta página de manual, envie um e-mail para a lista de discussão de tradutores.

13 agosto 2020 Linux