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 |
主Server Load Balancer群(bundle). |
IFF_SLAVE |
從Server Load Balancer群(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, 這裡 不做 敘述.