zoukankan      html  css  js  c++  java
  • ifconfig与内核通信 ifreq 结构体分析和使用

    结构原型:

    /*
     * Interface request structure used for socket
     * ioctl's.  All interface ioctl's must have parameter
     * definitions which begin with ifr_name.  The
     * remainder may be interface specific.
     */

    struct ifreq 
    {
    #define IFHWADDRLEN 6
     union
     {
      char ifrn_name[IFNAMSIZ];  /* if name, e.g. "en0" */
     } ifr_ifrn;
     
     union {
      struct sockaddr ifru_addr;
      struct sockaddr ifru_dstaddr;
      struct sockaddr ifru_broadaddr;
      struct sockaddr ifru_netmask;
      struct  sockaddr ifru_hwaddr;
      short ifru_flags;
      int ifru_ivalue;
      int ifru_mtu;
      struct  ifmap ifru_map;
      char ifru_slave[IFNAMSIZ]; /* Just fits the size */
      char ifru_newname[IFNAMSIZ];
      void __user * ifru_data;
      struct if_settings ifru_settings;
     } ifr_ifru;
    };

    #define ifr_name ifr_ifrn.ifrn_name /* interface name  */
    #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address   */
    #define ifr_addr ifr_ifru.ifru_addr /* address  */
    #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
    #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
    #define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
    #define ifr_flags ifr_ifru.ifru_flags /* flags  */
    #define ifr_metric ifr_ifru.ifru_ivalue /* metric  */
    #define ifr_mtu  ifr_ifru.ifru_mtu /* mtu   */
    #define ifr_map  ifr_ifru.ifru_map /* device map  */
    #define ifr_slave ifr_ifru.ifru_slave /* slave device  */
    #define ifr_data ifr_ifru.ifru_data /* for use by interface */
    #define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
    #define ifr_bandwidth ifr_ifru.ifru_ivalue    /* link bandwidth */
    #define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length  */
    #define ifr_newname ifr_ifru.ifru_newname /* New name  */
    #define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/

    基本介绍: 

    ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。

    举例说明:

    在Linux系统中,ifconfig命令是通过ioctl接口与内核通信,例如,当系统管理员输入如下命令来改变接口eth0的MTU大小:

        ifconfig eth0 mtu 1250

    ifconfig命令首先打开一个socket,然后通过系统管理员输入的参数初始化一个数据结构,并通过ioctl调用将数据传送到内核。SIOCSIFMTU是命令标识符。

        struct ifreq data;
        fd = socket(PF_INET, SOCK_DGRAM, 0);
        < ... initialize "data" ...>
        err = ioctl(fd, SIOCSIFMTU, &data);

  • 相关阅读:
    [LeetCode] Move Zeroes 移动零
    [CareerCup] 9.4 Subsets 子集合
    [CareerCup] 9.3 Magic Index 魔法序号
    [CareerCup] 9.2 Robot Moving 机器人移动
    [CareerCup] 9.1 Climbing Staircase 爬楼梯
    [LeetCode] Expression Add Operators 表达式增加操作符
    C++ and Java template class and function 模板类和模板函数
    [CareerCup] 8.10 Implement a Hash Table 实现一个哈希表
    C++ 'dynamic_cast' and Java 'instanceof' 使用对比
    Maya Shortcuts 常用快捷键
  • 原文地址:https://www.cnblogs.com/zhouhbing/p/4469310.html
Copyright © 2011-2022 走看看