全部博文(124)
分类: LINUX
2010-07-29 20:46:31
| 类别 | 请求 | 描述 | 数据类型 |
| 套接口 | SIOCATMASK | 在带外标志上吗 | int |
| SIOCSPGRP | 设置套接口的进程ID和进程组ID | int | |
| SIOCGPGPR | 获取套接口的进程ID和进程组ID | int |
| 类别 | 请求 | 描述 | 数据类型 |
| 文件操作 | FIONBIO | 设置/清除非阻塞标志 | int |
| FIOASYNC | 设置/清除异步I/O标志 | int | |
| FIONREAD | 获取接收缓冲区中数据的字节数 | int | |
| FIOSETOWN | 设置文件的进程ID或进程组ID | int | |
| FIOGETOWN | 获取文件的进程ID或进程组ID | int |
| 类别 | 请求 | 描述 | 数据类型 |
| 接口 | SIOCGIFCONF | 获取所有接口的列表 | struct ifconf |
| SIOCSIFADDR | 设置接口地址 | struct ifreq | |
| SIOCGIFADDR | 获取接口地址 | struct ifreq | |
| SIOCSIFFLAGS | 设置接口标志 | struct ifreq | |
| SIOCGIFFLAGS | 获取接口标志 | struct ifreq | |
| SIOCSIFDSTADDR | 设置点对点地址 | struct ifreq | |
| SIOCGIFDSTADDR | 获取点对点地址 | struct ifreq | |
| SIOCGIFBRDADDR | 获取广播地址 | struct ifreq | |
| SIOCSIFBRDADDR | 设置广播地址 | struct ifreq | |
| SIOCGIFNETMASK | 获取子网掩码 | struct ifreq | |
| SIOCSIFNETMASK | 设置子网掩码 | struct ifreq | |
| SIOCGIFMETRIC | 获取接口的测度(metric) | struct ifreq | |
| SIOCSIFMETRIC | 设置接口的测度(metric) | struct ifreq | |
| SIOCxxx |
| 类别 | 请求 | 描述 | 数据类型 |
| ARP | SIOCSARP | 创建/修改ARP项 | struct arpreq |
| SIOCGARP | 获取ARP项 | struct arpreq | |
| SIOCDARP | 删除ARP项 | struct arpreq |
| 类别 | 请求 | 描述 | 数据类型 |
| 路由 | SIOCADDRT | 增加路径 | struct rtentry |
| SIOCDELRT | 删除路径 | struct rtentry |
第三个参数总是一个指针,但指针的类型依赖于request。
ioctl和网络有关的请求可分为如下6类:
| 类别 | request | 描述 | 数据类型 |
| 套接口 | SIOCATMARK | 在带外标志上吗 | int |
| SIOCSPGRP | 设置套接口的进程ID或进程组ID | int | |
| SIOCGPGRP | 获取套接口的进程ID或进程组ID | int | |
| 文件 | FIONBIO | 设置/清除非阻塞标志 | int |
| FIOASYNC | 设置/清除异步I/O标志 | int | |
| FIONREAD | 获取接收缓冲区中的字节数 | int | |
| FIOSETOWN | 设置文件的进程ID或进程组ID | int | |
| FIOGETOWN | 获取文件的进程ID或进程组ID | int | |
| 接口 | SIOCGIFCONF | 获取所有接口的列表 | struct ifconf |
| SIOCSIFADDR | 设置接口地址 | struct ifreq | |
| SIOCGIFADDR | 获取接口地址 | struct ifreq | |
| SIOCSIFFLAGS | 设置接口标志 | struct ifreq | |
| SIOCGIFFLAGS | 获取接口标志 | struct ifreq | |
| SIOCSIFDSTADDR | 设置点到点地址 | struct ifreq | |
| SIOCGIFDSTADDR | 获取点到点地址 | struct ifreq | |
| SIOCGIFBRDADDR | 获取广播地址 | struct ifreq | |
| SIOCSIFBRDADDR | 设置广播地址 | struct ifreq | |
| SIOCGIFNETMASK | 获取子网掩码 | struct ifreq | |
| SIOCSIFNETMASK | 设置子网掩码 | struct ifreq | |
| SIOCGIFMETRIC | 获取接口的测度(metric) | struct ifreq | |
| SIOCSIFMETRIC | 设置接口的测度(metric) | struct ifreq | |
| SIOCxxx | (有很多,依赖于实现) | ||
| ARP | SIOCSARP | 创建/修改ARP项 | struct arpreq |
| SIOCGARP | 获取ARP项 | struct arpreq | |
| SIOCDARP | 删除ARP项 | struct arpreq | |
| 路由 | SIOCADDRT | 增加路径 | struct rtentry |
| SIOCDELRT | 删除路径 | struct rtentry | |
| 流 | I_xxx |
结构定义如下:
struct
ifconf {
int ifc_len; /* size of buffer, value-result */
union {
caddr_t ifcu_buf; /* input from user->kernel */
struct
ifreq
*ifcu_req; /* return from kernel->user */
}ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf
#define ifc_req ifc_ifcu.ifcu_req
#define IFNAMSIZ 16
struct
ifreq
{
char ifr_name[IFNAMSIZ];
union {
struct
sockaddr ifru_addr;
struct
sockaddr ifru_dstaddr;
struct
sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
}ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.broadaddr
#define ifr_flags ifr_ifru.ifru_flags
#define ifr_metric ifr_ifru.ifru_metric
#define ifr_data ifr_ifru.ifru_data
在调用ioctl之前分配一个缓冲区和一个ifconf结构,然后初始化后者,iotctl的第三个参数指向ifconf结构。
一个实现获取所有接口的程序,可参见unpv12e:lib/get_ifi_info.c
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 结构 的 解释 取决于 设备驱动程序 和 体系结构.