linux網路編程中遇到的ioctl中的標誌

來源:互聯網
上載者:User
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, 這裡 不做 敘述.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.