'\" t .\" Don't change the first line, it tells man that tbl is needed. .\" This man page is Copyright (C) 1999 Andi Kleen . .\" Permission is granted to distribute possibly modified copies .\" of this page provided the header is included verbatim, .\" and in case of nontrivial modification author and date .\" of the modification is added to the header. .TH NETDEVICE 7 "2 May 1999" "Linux Man Page" "Linux Programmer's Manual" .SH NAME netdevice \- 底層訪問 Linux 網路裝置. .SH "總覽 (SYNOPSIS)" .B "#include " .br .B "#include " .SH "描述 (DESCRIPTION)" 本手冊 描述 用於 配置 網路裝置 的 套接字(socket) 介面. Linux 支援 一些 配置 網路裝置 的 標準 ioctl. 他們 用於 任意的 套接字 描述符, 而 無須 瞭解 其 型別 或 系列. 他們 傳遞 一個 .B ifreq 結構: .nf .ta 4 20 42 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 */ }; }; .ta .fi 一般說來, ioctl 透過 把 .B ifr_name 設定為 介面 的 名字 來 指定 將要 操作 的 裝置. 結構的 其他成員 可以 分享 記憶體. .SH IOCTLS 如果 某個 ioctl 標記為 特權操作, 那麼 操作時 需要 有效uid 為 0, 或者 擁有 .B CAP_NET_ADMIN 能力. 否則 將 返回 .B EPERM . .TP .B SIOCGIFNAME 給定 .BR ifr_ifindex, 返回 .BR ifr_name 中 的 介面名字. 這是 唯一 返回 .BR ifr_name 內容 的 ioctl. .TP .B SIOCGIFINDEX 把 介面 的 索引 存入 .BR ifr_ifindex . .TP .BR SIOCGIFFLAGS ", " SIOCSIFFLAGS 讀取 或 設定 裝置的 活動標誌字. .B ifr_flags 包含 下列值 的 遮蔽位: .TS tab(:); c s l l. 裝置標誌 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: 介面關閉時丟棄地址. .TE 設定 活動標誌字 是 特權操作, 但是 任何程序 都可以 讀取 標誌字. .TP .BR SIOCGIFMETRIC ", " SIOCSIFMETRIC 使用 .BR ifr_metric 讀取 或 設定 裝置的 metric 值. 該功能 目前 還沒有 實現. 讀取操作 使 .B ifr_metric 置 0, 而 設定操作 則 返回 .B EOPNOTSUPP. .TP .BR SIOCGIFMTU ", " SIOCSIFMTU 使用 .BR ifr_mtu 讀取 或 設定 裝置的 MTU(最大傳輸單元). 設定 MTU 是 特權操作. 過小的 MTU 可能 導致 核心 崩潰. .TP .BR SIOCGIFHWADDR ", " SIOCSIFHWADDR 使用 .BR ifr_hwaddr 讀取 或 設定 裝置的 硬體地址. 設定 硬體地址 是 特權操作. .TP .B SIOCSIFHWBROADCAST 使用 .BR ifr_hwaddr 讀取 或 設定 裝置的 硬體廣播地址. 這是個 特權操作. .TP .BR SIOCGIFMAP ", " SIOCSIFMAP 使用 .BR ifr_map 讀取 或 設定 介面的 硬體引數. 設定 這個引數 是 特權操作. .nf .ta 4 20 42 struct ifmap { unsigned long mem_start; unsigned long mem_end; unsigned short base_addr; unsigned char irq; unsigned char dma; unsigned char port; }; .ta .fi 對 ifmap 結構 的 解釋 取決於 裝置驅動程式 和 體系結構. .TP .BR SIOCADDMULTI ", " SIOCDELMULTI 使用 .BR ifr_hwaddr 在 裝置的 鏈路層 組播過濾器 (multicase filter) 中 新增 或 刪除 地址. 這些是 特權操作. 參看 .BR packet (7) . .TP .BR SIOCGIFTXQLEN ", " SIOCSIFTXQLEN 使用 .BR ifr_qlen 讀取 或 設定 裝置的 傳輸佇列長度. 設定 傳輸佇列長度 是 特權操作. .TP .B SIOCSIFNAME 把 .BR ifr_ifindex 中 指定的 介面名字 改成 .BR ifr_newname . 這是個 特權操作. .TP .B SIOCGIFCONF 返回 介面地址(傳輸層) 列表. 出於 相容性, 目前 只代表 AF_INET 地址. 使用者 傳送 一個 .B ifconf 結構 作為 ioctl 的 引數. 其中 .B ifc_req 包含 一個 指標 指向 .I ifreq 結構陣列, 他的 長度 以位元組 為單位 存放在 .B ifc_len 中. 核心 用 所有 當前的 L3(第三層?) 介面地址 填充 ifreqs, 這些 介面 正在 執行: .I ifr_name 存放 介面名字 (eth0:1等), .I ifr_addr 存放 地址. 核心 在 .I ifc_len 中 返回 實際長度; 如果 他 等於 初始長度, 表示 溢位了, 使用者 應該 換一個 大些的 緩衝區 重試 一下. 沒有 發生 錯誤時 ioctl 返回 0, 否則 返回 -1, 溢位 不算 錯誤. \" XXX Slaving isn't supported in 2.2 .\" .TP .\" .BR SIOCGIFSLAVE ", " SIOCSIFSLAVE .\" Get or set the slave device using .\" .BR ifr_slave . .\" Setting the slave device is a privileged operation. .PP .\" XXX add amateur radio stuff. .PP 大多數 協議 使用 自己的 ioctl 配置 協議 特定的 介面 操作. 具體 情況 參看 協議的 幫助手冊. 要配置 IP 地址 可以 參看 .BR ip (7). .PP 另外, 某些 裝置 有 專用的 ioctl, 這裡 不做 敘述. .SH "注意 (NOTE)" 嚴格說來 .B SIOCGIFCONF 是 專門 針對 IP 的, 它 屬於 .BR ip (7). .SH "注意 (NOTE)" 可以 透過 .I /proc/net/dev 看到 沒有 地址 或 沒有 .B IFF_RUNNING 標誌 的 介面名字. .SH "另見 (SEE ALSO)" .BR ip "(7), " proc "(7)" .SH "[中文版維護人]" .B 徐明 .SH "[中文版最新更新]" .B 2000/10/15 第一版 .br .BR 2001/11/24 第一次修訂 .SH "《中國linux論壇man手冊頁翻譯計劃》:" .BI http://cmpp.linuxforum.net .SH "跋" .br 本頁面中文版由中文 man 手冊頁計劃提供。 .br 中文 man 手冊頁計劃:\fBhttps://github.com/man-pages-zh/manpages-zh\fR