struct ifcfg, struct ifreq的使用

 #include <sys/ioctl.h>

 int ioctl(int d, int request, ...);

可以查看man手册看ioctl()函数的使用说明,man手册已经说的很清楚了.根据ioctl()函数第二个参数"request"的不同,ioctl()具有不同的形式。

man 2 ioctl.

man 2 ioctl_list可以列出i386所支持的所有的ioctl可以使用的宏。

这些宏的定义有一定的规律,例如对Socket进行操作的宏都以'S'开头,

// <include/linux/sockios.h>

       0x0000890B   SIOCADDRT           const struct rtentry *   // MORE
       0x0000890C   SIOCDELRT           const struct rtentry *   // MORE
       0x00008910   SIOCGIFNAME         char []
       0x00008911   SIOCSIFLINK         void
       0x00008912   SIOCGIFCONF         struct ifconf *          // MORE // I-O
       0x00008913   SIOCGIFFLAGS        struct ifreq *           // I-O
       0x00008914   SIOCSIFFLAGS        const struct ifreq *
       0x00008915   SIOCGIFADDR         struct ifreq *           // I-O
       0x00008916   SIOCSIFADDR         const struct ifreq *
       0x00008917   SIOCGIFDSTADDR      struct ifreq *           // I-O
       0x00008918   SIOCSIFDSTADDR      const struct ifreq *
       0x00008919   SIOCGIFBRDADDR      struct ifreq *           // I-O
       0x0000891A   SIOCSIFBRDADDR      const struct ifreq *
       0x0000891B   SIOCGIFNETMASK      struct ifreq *           // I-O
       0x0000891C   SIOCSIFNETMASK      const struct ifreq *
       0x0000891D   SIOCGIFMETRIC       struct ifreq *           // I-O
       0x0000891E   SIOCSIFMETRIC       const struct ifreq *
       0x0000891F   SIOCGIFMEM          struct ifreq *           // I-O
       0x00008920   SIOCSIFMEM          const struct ifreq *
       0x00008921   SIOCGIFMTU          struct ifreq *           // I-O
       0x00008922   SIOCSIFMTU          const struct ifreq *

对文件操作的宏都以'F'开头。

// <include/linux/fd.h>

       0x00000000   FDCLRPRM         void
       0x00000001   FDSETPRM         const struct floppy_struct *
       0x00000002   FDDEFPRM         const struct floppy_struct *
       0x00000003   FDGETPRM         struct floppy_struct *
       0x00000004   FDMSGON          void
       0x00000005   FDMSGOFF         void
       0x00000006   FDFMTBEG         void
       0x00000007   FDFMTTRK         const struct format_descr *
       0x00000008   FDFMTEND         void
       0x0000000A   FDSETEMSGTRESH   int
       0x0000000B   FDFLUSH          void
       0x0000000C   FDSETMAXERRS     const struct floppy_max_errors *
       0x0000000E   FDGETMAXERRS     struct floppy_max_errors *
       0x00000010   FDGETDRVTYP      struct { char [16]; } *
       0x00000014   FDSETDRVPRM      const struct floppy_drive_params *
       0x00000015   FDGETDRVPRM      struct floppy_drive_params *

并且这些信息指出了ioctl() 函数所需要的argement参数的类型, 可以看到对socket进行操作的SIOCxx的宏大部分都需要struct ifreq结构体作为参数。struct ifreq结构体的定义在头文件<net/if.h>中,可以打开看一下。

#include <net/if.h>

/*
 * 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*/

 struct ifcfg结构体的定义在同一个头文件中<net/if.h>

/*
 * Structure used in SIOCGIFCONF request.
 * Used to retrieve interface configuration
 * for machine (useful for programs which
 * must know all networks accessible).
 */

struct ifconf 
{
    int    ifc_len;            /* size of buffer    */
    union 
    {
        char __user *ifcu_buf;
        struct ifreq __user *ifcu_req;
    } ifc_ifcu;
};
#define    ifc_buf    ifc_ifcu.ifcu_buf        /* buffer address    */
#define    ifc_req    ifc_ifcu.ifcu_req        /* array of structures    */

 

posted @ 2015-03-30 15:14  秋风微凉  阅读(5394)  评论(0编辑  收藏  举报