struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
u_int16_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
struct in_addr {
u_int32_t s_addr; /* address in network byte order */
};
struct sockaddr {
ushort sa_family;
char sa_data[14];
};
netdevice - 底层访问 Linux 网络设备.
#include <sys/ioctl.h >
#include <net/if.h >
本手册 描述 用于 配置 网络设备 的 套接字(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 设置为 接口 的 名字 来 指定 将要 操作 的 设备. 结构的 其他成员 可以 分享 内存.
如果 某个 ioctl 标记为 特权操作, 那么 操作时 需要 有效uid 为 0, 或者 拥有 CAP_NET_ADMIN 能力. 否则 将 返回 EPERM .
设备标志 |
|
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, 这里 不做 叙述.