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 讀取 或
設置 設備的
傳輸隊列長度. 設置
傳輸隊列長度 是
特權操作.
- 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@iname.com>
[中文版最新更新]¶
2000/10/15 第一版
2001/11/24 第一次修訂
《中國linux論壇man手冊頁翻譯計劃》:¶
http://cmpp.linuxforum.net