NAME¶
netdevice - 底层访问 Linux
网络设备.
总览 (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, 这里 不做
叙述.
注意 (NOTE)¶
严格说来
SIOCGIFCONF 是 专门
针对 IP 的, 它 属于
ip(7).
注意 (NOTE)¶
可以 通过
/proc/net/dev 看到
没有 地址 或 没有
IFF_RUNNING
标志 的 接口名字.
另见 (SEE ALSO)¶
ip(7),
proc(7)
[中文版维护人]¶
徐明 <xuming@iname.com>
[中文版最新更新]¶
2000/10/15 第一版
2001/11/24 第一次修订
《中国linux论坛man手册页翻译计划》:¶
http://cmpp.linuxforum.net