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 设置为 接口 的 名字 来 指定 将要 操作 的 设备. 结构的 其他成员 可以 分享 内存.
| 设备标志 | |
| 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 | 接口关闭时丢弃地址. |
设置 活动标志字 是 特权操作, 但是 任何进程 都可以 读取 标志字.
struct ifmap
{
unsigned long mem_start;
unsigned long mem_end;
unsigned short base_addr;
unsigned char irq;
unsigned char dma;
unsigned char port;
};
对 ifmap 结构 的 解释 取决于 设备驱动程序 和 体系结构.
大多数 协议 使用 自己的 ioctl 配置 协议 特定的 接口 操作. 具体 情况 参看 协议的 帮助手册. 要配置 IP 地址 可以 参看 ip(7).
另外, 某些 设备 有 专用的 ioctl, 这里 不做 叙述.