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)
[中 文 版 维 护 人 ]
徐 明 <xuming [AT] iname.com>
[中 文 版 最 新 更 新 ]
2000/10/15
第 一 版
2001/11/24 第 一 次 修
订
《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh