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 .
- 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, 這裡 不做
敘述.
嚴格說來
SIOCGIFCONF 是 專門
針對 IP 的, 它 屬於
ip(7).
可以 透過
/proc/net/dev 看到
沒有 地址 或 沒有
IFF_RUNNING
標誌 的 介面名字.
ip(7),
proc(7)
徐明 <[email protected]>
2000/10/15 第一版
2001/11/24 第一次修訂
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh