Manpages

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 包 含 下 列 值 的 屏 蔽 位 :

设 置 活 动 标 志 字 是 特 权 操 作 , 但 是 任 何 进 程 都 可 以 读 取 标 志 字 .

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 [AT] iname.com>

[中 文 版 最 新 更 新 ]

2000/10/15 第 一 版
2001/11/24
第 一 次 修 订

《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh