NETDEVICE(7) | Linux Programmer's Manual | NETDEVICE(7) |
netdevice - Linux ネットワークデバイスへの低レベルアクセス
#include <sys/ioctl.h>
#include <net/if.h>
この man ページでは、ネットワークデバイスを設定するために 用いるソケットインターフェースについて解説する。
Linux はネットワークデバイスを設定するための標準的な ioctl を いくつか備えている。これらはどんなソケットのファイルディスクリプターにも 用いることができる。ファミリーやタイプは何でもよい。 これらの 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; }; };
通常、ユーザーによる設定対象デバイスの指定は、 ifr_name にインターフェースの名前をセットすることによって行う。 他の構造体の全てのメンバは、メモリーを共有する。
「特権が必要」と記述されている ioctl を実行するには、 実効ユーザー ID が 0 か、 CAP_NET_ADMIN 権限が必要である。これが満たされていない場合は EPERM が返される。
デバイスフラグ | |
IFF_UP | インターフェースは動作中。 |
IFF_BROADCAST | 有効なブロードキャストアドレスがセットされている。 |
IFF_DEBUG | 内部のデバッグフラグ。 |
IFF_LOOPBACK | インターフェースはループバックである。 |
IFF_POINTOPOINT | インターフェースは point-to-point リンクである。 |
IFF_RUNNING | リソースが割り当て済み。 |
IFF_NOARP | arp プロトコルがない。 L2 宛先アドレスが設定されていない。 |
IFF_PROMISC | インターフェースは promiscuous モードである。 |
IFF_NOTRAILERS | trailer の利用を避ける。 |
IFF_ALLMULTI | 全てのマルチキャストパケットを受信する。 |
IFF_MASTER | 負荷分散グループのマスターである。 |
IFF_SLAVE | 負荷分散グループのスレーブである。 |
IFF_MULTICAST | マルチキャストをサポートしている。 |
IFF_PORTSEL | ifmap によってメディアタイプを選択できる。 |
IFF_AUTOMEDIA | 自動メディア選択が有効になっている。 |
IFF_DYNAMIC | このインターフェースが閉じると、アドレスは失われる。 |
IFF_LOWER_UP | ドライバからの L1 アップの通知 (Linux 2.6.17 以降) |
IFF_DORMANT | ドライバからの休止状態の通知 (Linux 2.6.17 以降) |
IFF_ECHO | 送られたパケットをエコーする (Linux 2.6.25 以降) |
active フラグワードの設定は特権が必要な操作である。 読み出しはどんなプロセスからも可能である。
プライベートフラグ | |
IFF_802_1Q_VLAN | インターフェースは 802.1Q VLAN デバイスである。 |
IFF_EBRIDGE | インターフェースは Ethernet ブリッジデバイスである。 |
IFF_SLAVE_INACTIVE | インターフェースは非アクティブな bonding のスレーブである。 |
IFF_MASTER_8023AD | インターフェースは 802.3ad bonding のマスターである。 |
IFF_MASTER_ALB | インターフェースは balanced-alb bonding のマスターである。 |
IFF_BONDING | インターフェースは bonding のマスターかスレーブである。 |
IFF_SLAVE_NEEDARP | インターフェースは検証に APR が必要である。 |
IFF_ISATAP | インターフェースは RFC4214 ISATAP インターフェースである。 |
拡張 (プライベート) インターフェースフラグの設定には特権が必要である。
struct ifmap { unsigned long mem_start; unsigned long mem_end; unsigned short base_addr; unsigned char irq; unsigned char dma; unsigned char port; };
struct ifconf { int ifc_len; /* バッファーサイズ */ union { char *ifc_buf; /* バッファーアドレス */ struct ifreq *ifc_req; /* 構造体の配列 */ }; };
ほとんどのプロトコルには、専用のインターフェースオプションを 設定するための独自の ioctl が存在する。 説明は各プロトコルの man ページを見よ。 IP アドレスの設定に関しては ip(7) を参照。
さらに、デバイスによってはプライベートな ioctl がある。 これらはここでは説明しない。
SIOCGIFCONF and the other ioctls that accept or return only AF_INET socket addresses are IP-specific and perhaps should rather be documented in ip(7).
アドレスがなかったり、 IFF_RUNNING フラグがセットされていないインターフェースの名前は /proc/net/dev で知ることができる。
ローカル IPV6 IP アドレスは /proc/net か rtnetlink(7) で知ることができる。
glibc 2.1 では <net/if.h> に ifr_newname マクロがない。 とりあえずの対応策として、以下のコードを追加しておくこと。
#ifndef ifr_newname #define ifr_newname ifr_ifru.ifru_slave #endif
proc(5), capabilities(7), ip(7), rtnetlink(7)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-08-13 | Linux |