【问题标题】:configure network device with wireless extensions使用无线扩展配置网络设备
【发布时间】:2018-12-09 17:45:20
【问题描述】:

我需要在 Linux 主机上用 C 语言为应用程序配置网络设备。我阅读了通过 cfg80211 和 mac80211 的 netlink、libnl 和 nl80211。后来我发现我正在使用的设备的驱动程序不支持mac80211接口,所以我无法使用netlink库来配置设备。我剩下的唯一选择是通过使用 ioctl 的无线扩展。所以一直在看iwconfig的源码(iw用netlink,iwconfig用wext)。

例如,假设我正在尝试在 80211 适配器上设置通道。无线扩展 ioctl 命令是 SIOCSIWFREQ(根据 iwconfig 和我设备的驱动程序)。根据我的阅读,您打开一个套接字并使用带有“ifreq”结构的 ioctl 来配置网络适配器(参见“man netdevice”)。

问题是,iwconfigure 定义了自己的名为 'iwreq' 的 'ifreq' 结构,看起来完全不同(参见 iwconfig 源代码,有注释说这个 iwreq 结构与 ifreq 结构相同)。

ifreq 结构看起来甚至没有设置通道的字段。

所以我的问题是,这个“ifreq”结构在内核中的哪个位置被接收和处理。在哪里可以找到有关接口的文档(结构中的字段)。

所有 IOCTLS 命令都定义在 /usr/inlcude/linux/wireless.h 中

谢谢!

这里是 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;
    };
};

这里是 iwreq(来自 HP 无线工具中的 wireless.h)

union   iwreq_data
{   
    /* Config - generic */
    char        name[IFNAMSIZ];
    /* Name : used to verify the presence of  wireless extensions.
    * Name of the protocol/provider... */

    struct iw_point essid;      /* Extended network name */
    struct iw_param nwid;       /* network id (or domain - the cell) */
    struct iw_freq  freq;       /* frequency or channel :
                                 * 0-1000 = channel
                                 * > 1000 = frequency in Hz */

    struct iw_param sens;       /* signal level threshold */
    struct iw_param bitrate;    /* default bit rate */
    struct iw_param txpower;    /* default transmit power */
    struct iw_param rts;        /* RTS threshold threshold */
    struct iw_param frag;       /* Fragmentation threshold */
    __u32       mode;       /* Operation mode */
    struct iw_param retry;      /* Retry limits & lifetime */

    struct iw_point encoding;   /* Encoding stuff : tokens */
    struct iw_param power;      /* PM duration/timeout */
    struct iw_quality qual;     /* Quality part of statistics */

    struct sockaddr ap_addr;    /* Access point address */
    struct sockaddr addr;       /* Destination address (hw/mac) */

    struct iw_param param;      /* Other small parameters */
    struct iw_point data;       /* Other large parameters */
};

struct  iwreq
{
    union
    {
      char    ifrn_name[IFNAMSIZ];    /* if name, e.g. "eth0" */
    } ifr_ifrn;

    /* Data part (defined just above) */
    union   iwreq_data  u;
};

很容易告诉你将如何使用 iwreq 来配置通道,freq 字段,但是 ifreq 结构中的标准在哪里?

【问题讨论】:

  • 补充说明:设备驱动不支持通过mac80211设置频率(以及其他一些东西)。
  • 这个问题最好在 Unix 交流平台上问一下?

标签: kernel wireless ioctl netlink iwconfig


【解决方案1】:

结构体 iwreq 在 linux/wireless.h 中找到,您可以简单地包含它并使用 'iwreq' 结构体。

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 2016-01-11
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多