Provided by: manpages-zh_1.5.1-2_all bug

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         主负载平衡群(bundle).
              IFF_SLAVE          从负载平衡群(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   读取   或   设置  设备的  传输队列长度.   设置
              传输队列长度 是 特权操作.

       SIOCSIFNAMEifr_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, 这里 不做 叙述.

 (NOTE)
       严格说来 SIOCGIFCONF 是 专门 针对 IP 的, 它 属于 ip(7).

 (NOTE)
       可以 通过 /proc/net/dev 看到 没有 地址  或  没有  IFF_RUNNING  标志  的
       接口名字.

 (SEE ALSO)
       ip(7), proc(7)

[<xuming@iname.com>

[2000/10/15 第一版
       2001/11/24 第一次修订

linuxan:
       http://cmpp.linuxforum.net