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