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;
};
};
struct ifconf {
int ifc_len; /* size of buffer */
union {
char *ifc_buf; /* buffer address */
struct ifreq *ifc_req; /* array of structures */
};
};
通常、ユーザーによる設定対象デバイスの指定は、 ifr_name にインターフェースの名前をセットすることによって行う。 他の構造体の全てのメンバは、メモリを共有する。
| デバイスフラグ | |
| IFF_UP | インターフェースは動作中。 |
| IFF_BROADCAST |
有効なブロードキャストアドレスがセットされている。
|
| IFF_DEBUG | 内部のデバッグフラグ。 |
| IFF_LOOPBACK | インターフェースはループバックである。 |
| IFF_POINTOPOINT |
インターフェースは point-to-point リンクである。
|
| IFF_RUNNING | リソースが割り当て済み。 |
| IFF_NOARP | arp プロトコルがない。 |
| 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 以降) |
struct ifmap {
unsigned long mem_start;
unsigned long mem_end;
unsigned short base_addr;
unsigned char irq;
unsigned char dma;
unsigned char port;
};
ifmap 構造体の解釈はデバイスドライバとアーキテクチャに依存する。
ほとんどのプロトコルには、専用のインターフェースオプションを 設定するための独自の ioctl が存在する。 説明は各プロトコルの man ページを見よ。
さらに、デバイスによってはプライベートな ioctl がある。 これらはここでは説明しない。
アドレスがなかったり、 IFF_RUNNING フラグがセットされていないインターフェースの名前は /proc/net/dev で知ることができる。
ローカル IPV6 IP アドレスは /proc/net か rtnetlink(7) で知ることができる。
#ifndef ifr_newname #define ifr_newname ifr_ifru.ifru_slave #endif