NETDEVICE - Linux手册页

时间:2019-08-20 18:01:59  来源:igfitidea点击:

Linux程序员手册 第7部分
更新日期: 2020-08-13

名称

netdevice-对Linux网络设备的低级别访问

语法

#包括
#包括

说明

该手册页介绍了用于配置网络设备的套接字接口。

Linux支持一些标准的ioctl来配置网络设备。它们可以在任何套接字的文件描述符上使用,而不论其家族或类型。它们中的大多数通过ifreq结构:

struct ifreq {
    char ifr_name[IFNAMSIZ]; /* Interface name */
    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设置为接口名称来指定要影响的设备。结构的所有其他成员可以共享内存。

Ioctls

如果ioctl被标记为特权,则使用它需要有效的用户ID 0或CAP_NET_ADMIN功能。如果不是这种情况,将返回EPERM。

SIOCGIFNAME
给定ifr_ifindex,在ifr_name中返回接口的名称。这是唯一在ifr_name中返回结果的ioctl。
SIOCGIFINDEX
将接口的接口索引检索到ifr_ifindex中。
SIOCGIFFLAGS, SIOCSIFFLAGS
获取或设置设备的活动标志字。 ifr_flags包含以下值的位掩码:设备标志 IFF_UPInterface正在运行。 IFF_BROADCAST有效的广播地址集。 IFF_DEBUG内部调试标志。 IFF_LOOPBACKInterface是一个环回接口。 IFF_POINTOPOINTInterface是点对点链接。 IFF_RUNNING已分配资源。 IFF_NOARP没有arp协议,未设置L2目标地址。 IFF_PROMISCInterface处于混杂模式。 IFF_NOTRAILERS避免使用预告片。 IFF_ALLMULTI接收所有多播数据包。 IFF_MASTER负载平衡捆绑包的主机。 IFF_SLAVES负载平衡捆绑包的从属。 IFF_MULTICAST支持多播 IFF_PORTSEL能够通过ifmap选择媒体类型。 IFF_AUTOMEDIA自动媒体选择处于活动状态。 IFF_DYNAMIC接口断开时,地址将丢失。 IFF_LOWER_UPDriver向L1发出信号(自Linux 2.6.17起) IFF_DORMANTDriver发出休眠信号(从Linux 2.6.17开始) IFF_ECHOEcho发送的数据包(从Linux 2.6.25开始)

设置活动标志字是特权操作,但是任何进程都可以读取它。

SIOCGIFPFLAGS, SIOCSIFPFLAGS
获取或设置设备的扩展(专用)标志。 ifr_flags包含以下值的位掩码:专用标志 IFF_802_1Q_VLANInterface是802.1Q VLAN设备。 IFF_EBRIDGEInterface是以太网桥接设备。 IFF_SLAVE_INACTIVEInterface是非活动的绑定从属。 IFF_MASTER_8023ADInterface是802.3ad绑定主机。 IFF_MASTER_ALBInterface是平衡Alb绑定主机。 IFF_BONDINGInterface是绑定主机或从机。 IFF_SLAVE_NEEDARPInterface需要ARP进行验证。 IFF_ISATAPInterface是RFC4214 ISATAP接口。

设置扩展(专用)接口标志是一项特权操作。

SIOCGIFADDR, SIOCSIFADDR
使用ifr_addr获取或设置设备的地址。设置接口地址是一项特权操作。为了兼容,仅接受或返回AF_INET地址。
SIOCGIFDSTADDR, SIOCSIFDSTADDR
使用ifr_dstaddr获取或设置点对点设备的目标地址。为了兼容,仅接受或返回AF_INET地址。设置目标地址是一项特权操作。
SIOCGIFBRDADDR, SIOCSIFBRDADDR
使用ifr_brdaddr获取或设置设备的广播地址。为了兼容,仅接受或返回AF_INET地址。设置广播地址是一项特权操作。
SIOCGIFNETMASK, SIOCSIFNETMASK
使用ifr_netmask获取或设置设备的网络掩码。为了兼容,仅接受或返回AF_INET地址。设置网络掩码是一项特权操作。
SIOCGIFMETRIC, SIOCSIFMETRIC
使用ifr_metric获取或设置设备的指标。目前尚未实现;如果您尝试读取它,它将ifr_metric设置为0,如果您尝试将其设置,则返回EOPNOTSUPP。
SIOCGIFMTU, SIOCSIFMTU
使用ifr_mtu获取或设置设备的MTU(最大传输单位)。设置MTU是特权操作。将MTU设置为太小的值可能会导致内核崩溃。
SIOCGIFHWADDR, SIOCSIFHWADDR
使用ifr_hwaddr获取或设置设备的硬件地址。硬件地址在struct sockaddr中指定。 sa_family包含ARPHRD_ *设备类型,sa_data是从字节0开始的L2硬件地址。设置硬件地址是特权操作。
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结构:
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包含一个指向要用所有当前活动的L3接口地址填充的ifreq结构数组的指针。 ifc_len包含数组的大小(以字节为单位)。在每个ifreq结构中,ifr_name将接收接口名称,ifr_addr是地址。实际传输的字节数在ifc_len中返回。
如果ifc_len指定的大小不足以存储所有地址,则内核将跳过超出的地址并返回成功。一旦发生这种情况,就没有可靠的检测方法。因此,建议通过ifc_req设置为NULL调用SIOCGIFCONF来预先确定必要的缓冲区大小,或者只要返回的ifc_len与其原始值之间的差异小于sizeof(struct ifreq),则建议使用更大的缓冲区重试该调用。
如果在访问ifconf或ifreq结构时发生错误,则将返回EFAULT。

大多数协议都支持自己的ioctl来配置特定于协议的接口选项。有关说明,请参见协议手册页。有关配置IP地址,请参见ip(7)。

另外,某些设备支持私有ioctl。这些没有在这里描述。

备注

SIOCGIFCONF和其他仅接受或返回AF_INET套接字地址的ioctl都是IP特定的,也许应该记录在ip(7)中。

可以通过/ proc / net / dev找到没有地址或没有设置IFF_RUNNING标志的接口名称。

可以通过/ proc / net或rtnetlink(7)找到本地IPv6 IP地址。

BUGS

glibc 2.1缺少中的ifr_newname宏。作为解决方法,将以下内容添加到您的程序中:

#ifndef ifr_newname
#define ifr_newname     ifr_ifru.ifru_slave
#endif

另外参见

proc(5),功能(7),ip(7),rtnetlink(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/