您的位置:首页 > 理论基础 > 计算机网络

linux网络编程中遇到的ioctl中的标志

2015-10-23 13:29 295 查看
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];

};


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 读取 或 设置 设备的 传输队列长度. 设置 传输队列长度 是 特权操作.SIOCSIFNAMEifr_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, 这里 不做 叙述.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: