我需要在linux主机上使用C语言为应用程序配置一个网络设备。我在netlink,libnl和通过cfg80211和mac80211的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 (来自wireless.h,来自HP的wireless-tools )
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结构中的标准在哪里呢?
发布于 2018-07-02 02:03:31
struct iwreq可以在linux/wireless.h中找到,您可以简单地包含它并使用'iwreq‘结构。
https://stackoverflow.com/questions/51120218
复制相似问题