总览 (SYNOPSIS)
#include <sys/ioctl.h>
#include <net/if.h>
?
描述 (DESCRIPTION)
本手册 描述 用于 配置 网络设备 的 套接字(socket) 接口.
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;
};
}
struct ifconf
{
int ifc_len; /* size of buffer */
union {
char * ifc_buf; /* buffer address */
struct ifreq *ifc_req; /* array of structures */
};
};
一般说来,ioctl 通过 把 ifr_name 设置为 接口 的 名字 来 指定 将要 操作 的 设备. 结构的 其他成员 可以 分享 内存.
?
IOCTLS
如果 某个 ioctl 标记为 特权操作,那么 操作时 需要 有效uid 为 0,或者 拥有 CAP_NET_ADMIN 能力. 否则 将 返回 EPERM .
?
-
SIOCGIFNAME
-
给定
ifr_ifindex, 返回
ifr_name 中 的 接口名字. 这是 唯一 返回
ifr_name 内容 的 ioctl.
?
-
SIOCGIFINDEX
-
把 接口 的 索引 存入
ifr_ifindex.
?
-
SIOCGIFFLAGS,SIOCSIFFLAGS
-
读取 或 设置 设备的 活动标志字.
ifr_flags 包含 下列值 的 屏蔽位:
?
设备标志 |
IFF_UP |
接口正在运行. |
IFF_BROADCAST |
有效的广播地址集. |
IFF_DEBUG |
内部调试标志. |
IFF_LOOPBACK |
这是自环接口. |
IFF_POINTOPOINT |
这是点到点的链路接口. |
IFF_RUNNING |
资源已分配. |
IFF_NOARP |
无arp协议,没有设置第二层目的地址. |
IFF_PROMISC |
接口为杂凑(promiscuous)模式. |
IFF_NOTRAILERS |
避免使用trailer . |
IFF_ALLMULTI |
接收所有组播(multicast)报文. |
IFF_MASTER |
主负载平衡群(bundle). |
IFF_SLAVE |
从负载平衡群(bundle). |
IFF_MULTICAST |
支持组播(multicast). |
IFF_PORTSEL |
可以通过ifmap选择介质(media)类型. |
IFF_AUTOMEDIA |
自动选择介质. |
IFF_DYNAMIC |
接口关闭时丢弃地址. |
设置 活动标志字 是 特权操作,但是 任何进程 都可以 读取 标志字.
?
-
SIOCGIFMETRIC,SIOCSIFMETRIC
-
使用
ifr_metric 读取 或 设置 设备的 metric 值. 该功能 目前 还没有 实现. 读取操作 使
ifr_metric 置 0,而 设置操作 则 返回
EOPNOTSUPP.
?
-
SIOCGIFMTU,SIOCSIFMTU
-
使用
ifr_mtu 读取 或 设置 设备的 MTU(最大传输单元). 设置 MTU 是 特权操作. 过小的 MTU 可能 导致 内核 崩溃.
?
-
SIOCGIFHWADDR,SIOCSIFHWADDR
-
使用
ifr_hwaddr 读取 或 设置 设备的 硬件地址. 设置 硬件地址 是 特权操作.
?
-
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 在 设备的 链路层 组播过滤器 (multicase filter) 中 添加 或 删除 地址. 这些是 特权操作. 参看
packet(7)
.
?
-
SIOCGIFTXQLEN,SIOCSIFTXQLEN
-
使用
ifr_qlen 读取 或 设置 设备的 传输队列长度. 设置 传输队列长度 是 特权操作.
?
-
SIOCSIFNAME
-
把
ifr_ifindex 中 指定的 接口名字 改成
ifr_newname. 这是个 特权操作.
?
-
SIOCGIFCONF
-
返回 接口地址(传输层) 列表. 出于 兼容性,目前 只代表 AF_INET 地址. 用户 传送 一个
ifconf 结构 作为 ioctl 的 参数. 其中
ifc_req 包含 一个 指针 指向
ifreq 结构数组,他的 长度 以字节 为单位 存放在
ifc_len 中. 内核 用 所有 当前的 L3(第三层?) 接口地址 填充 ifreqs,这些 接口 正在 运行:
ifr_name 存放 接口名字 (eth0:1等),ifr_addr 存放 地址. 内核 在
ifc_len 中 返回 实际长度; 如果 他 等于 初始长度,表示 溢出了,用户 应该 换一个 大些的 缓冲区 重试 一下. 没有 发生 错误时 ioctl 返回 0,否则 返回 -1,溢出 不算 错误.
?
?
?
?
大多数 协议 使用 自己的 ioctl 配置 协议 特定的 接口 操作. 具体 情况参看 协议的 帮助手册. 要配置 IP 地址 可以 参看 ip(7).
另外,某些 设备 有 专用的 ioctl,这里 不做 叙述.?