iwconfig源代码阅读

1、iwconfig源代码阅读

首先下载iwconfig.c代码,源代码包为\wireless_tools.29目录
先看执行
iwconfig eth0
的命令的执行过程:
调用main函数,因为是两个参数:
if(argc == 2)
print_info(skfd, argv[1], NULL, 0);
print_info调用
get_info(int skfd,
char * ifname,
struct wireless_info * info)
将网卡的各种信息打印出来。
下面与打印发送速率为例,说明调用过程,get_info函数里面:
/* Get bit rate */
if(iw_get_ext(skfd, ifname, SIOCGIWRATE, &wrq) >= 0)
{
info->has_bitrate = 1;
memcpy(&(info->bitrate), &(wrq.u.bitrate), sizeof(iwparam));
}
对信息的获取都是通过iw_get_ext函数来实现的,通过参数SIOCGIWRATE来识别不同的内容

iwlib.h文件定义了iw_get_ext:
iw_get_ext(int skfd, /* Socket to the kernel */
const char * ifname, /* Device name */
int request, /* WE ID */
struct iwreq * pwrq) /* Fixed part of the request */
{
/* Set device name */
strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
/* Do the request */
return(ioctl(skfd, request, pwrq));
}

因此,真正对网卡其他参数的实现是通过ioctl函数实现的,ioctl是驱动程序的基本功能,因此,如果自己想编写一个对网卡参数设置的程序,也应该使用ioctl函数。

下面在看使用
iwconfig eth0 rate auto
命令执行情况
main函数,当输入参数大于2的时候,调用:
goterr = set_info(skfd, argv + 2, argc - 2, argv[1]);
set_info函数调用iwcmd = find_command(args[0]);
用来查找命令,所有的命令都存放在一个表中,只要查找这个表即可:
static const struct iwconfig_entry iwconfig_cmds[] = {
……….
{ "bit", set_bitrate_info, 1, SIOCSIWRATE,
"Set Bit Rate", "{N[k|M|G]|auto|fixed}" },
{ "rate", set_bitrate_info, 1, SIOCSIWRATE,
"Set Bit Rate", "{N[k|M|G]|auto|fixed}" },
当第三个参数为rate的时候,就会自动调用set_bitrate_info函数,该函数的定义为:
set_bitrate_info
if(!strcasecmp(args[0], "auto"))
{
wrq.u.bitrate.value = -1;
wrq.u.bitrate.fixed = 0; //如果输入是auto,那么设置为bitrate.value = -1;
}
else
{
if(!strcasecmp(args[0], "fixed"))
{
/* Get old bitrate */
if(iw_get_ext(skfd, ifname, SIOCGIWRATE, &wrq) < 0)
return(IWERR_GET_EXT);
wrq.u.bitrate.fixed = 1;
}
……………
if(iw_set_ext(skfd, ifname, SIOCSIWRATE, &wrq) < 0)
return(IWERR_SET_EXT);


也就是说,如果选择auto,那么设置变量bitrate.fixed=0,最后调用iw_set_ext(skfd, ifname, SIOCSIWRATE, &wrq)函数,这个函数也是直接与网卡相关的。
与iw_get_ext函数一样,iw_set_ext也是通过SIOCGIWRATE来识别的:
static inline int
iw_set_ext(int skfd, /* Socket to the kernel */
const char * ifname, /* Device name */
int request, /* WE ID */
struct iwreq * pwrq) /* Fixed part of the request */
{
/* Set device name */
strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
/* Do the request */
return(ioctl(skfd, request, pwrq));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值