iwinfo的处理流程

iwinfo函数的路径

int main(int argc, char **argv)
{
	int i;
	char *p;
	const struct iwinfo_ops *iw;
	glob_t globbuf;

	if (argc > 1 && argc < 3)
	{
		fprintf(stderr,
			"Usage:\n"
			"	iwinfo <device> info\n"
			"	iwinfo <device> scan\n"
			"	iwinfo <device> txpowerlist\n"
			"	iwinfo <device> freqlist\n"
			"	iwinfo <device> assoclist\n"
			"	iwinfo <device> countrylist\n"
		);

		return 1;
	}

	if (argc == 1)
	{
		glob("/sys/class/net/*", 0, NULL, &globbuf);//glob函数的使用

		for (i = 0; i < globbuf.gl_pathc; i++)
		{
			p = strrchr(globbuf.gl_pathv[i], '/');

			if (!p)
				continue;

			iw = iwinfo_backend(++p);

			if (!iw)
				continue;

			print_info(iw, p);
			printf("\n");
		}

		globfree(&globbuf);
		return 0;
	}

	iw = iwinfo_backend(argv[1]);

	if (!iw)
	{
		fprintf(stderr, "No such wireless device: %s\n", argv[1]);
		return 1;
	}

	for (i = 2; i < argc; i++)
	{
		switch(argv[i][0])
		{
		case 'i':
			print_info(iw, argv[1]);
			break;

		case 's':
			print_scanlist(iw, argv[1]);
			break;

		case 't':
			print_txpwrlist(iw, argv[1]);
			break;

		case 'f':
			print_freqlist(iw, argv[1]);
			break;

		case 'a':
			print_assoclist(iw, argv[1]);
			break;

		case 'c':
			print_countrylist(iw, argv[1]);
			break;

		default:
			fprintf(stderr, "Unknown command: %s\n", argv[i]);
			return 1;
		}
	}

	iwinfo_finish();

	return 0;
}

 

入口文件iwinfo_cli.c

入口函数 main

int main(int argc, char **argv)

{

if (argc > 1 && argc < 3)   //判断参数数量不够就提示

 

iw = iwinfo_backend(argv[1]); //入口

 

 switch(argv[2][0])    //数据展示部分

          case 's':          //只匹配第一个字母 所以用iwinfo ra0 s 也就等于 iwinfo ra0 scan

             print_scanlist(iw, argv[1]);

             break;

}

 

从入口跟进去   iw = iwinfo_backend(argv[1]);

argv[1] 是设备判断

文件 iwinfo_lib.c

 const struct iwinfo_ops * iwinfo_backend(const char *ifname)

 {

     if (!strcmp(type, "ra"))

           return &ra_ops;      //这里以ra0跟进

     else

}

 

文件 include/iwinfo/ra.h

 

 46 static const struct iwinfo_ops ra_ops = {

 47     .channel          = ra_get_channel,

 48     .frequency        = ra_get_frequency,

 49     .frequency_offset = ra_get_frequency_offset,

 50     .txpower          = ra_get_txpower,

 51     .txpower_offset   = ra_get_txpower_offset,

 52     .bitrate          = ra_get_bitrate,

 53     .signal           = ra_get_signal,

 54     .noise            = ra_get_noise,

 55     .quality          = ra_get_quality,

 56     .quality_max      = ra_get_quality_max,

 57     .mbssid_support   = ra_get_mbssid_support,

 58     .hwmodelist       = ra_get_hwmodelist,

 59     .mode             = ra_get_mode,

 60     .ssid             = ra_get_ssid,

 61     .bssid            = ra_get_bssid,

 62     .country          = ra_get_country,

 63     .hardware_id      = ra_get_hardware_id,

 64     .hardware_name    = ra_get_hardware_name,

 65     .encryption       = ra_get_encryption,

 66     .assoclist        = ra_get_assoclist,

 67     .txpwrlist        = ra_get_txpwrlist,

 68     .scanlist         = ra_get_scanlist,

 69     .freqlist         = ra_get_freqlist,

 70     .countrylist      = ra_get_countrylist,

 71     .close            = ra_close

 72 };

 

文件 iwinfo_ra.c

int ra_get_scanlist(const char *ifname, char *buf, int *len)

这里就是和驱动的交互函数了

 

驱动 iwinfo scanlist部分

./os/linux/ap_ioctl.c:43:{ RTPRIV_IOCTL_GSITESURVEY,

./os/linux/ap_ioctl.c:379:              case RTPRIV_IOCTL_GSITESURVEY:

 

 

 

 

 

129 typedef enum _CMD_RTPRIV_IOCTL_AP { 

                                                                                                                                                    

131    CMD_RTPRIV_IOCTL_SET_WSCOOB = 0x0001,

CMD_RTPRIV_IOCTL_GET_MAC_TABLE,

CMD_RTPRIV_IOCTL_GSITESURVEY,

 

 

 

case RTPRIV_IOCTL_GSITESURVEY: 

 RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GSITESURVEY, 0, NULL, 0);

 break; 

 

 

 

 ap/ap_cfg.c

#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT)

 case CMD_RTPRIV_IOCTL_GSITESURVEY:

 RTMPIoctlGetSiteSurvey(pAd,wrq);

 break;

 #endif  

 

 

 common/cmm_info.c

 

 3713 VOID RTMPIoctlGetSiteSurvey

 

 

 

 3526 VOID    RTMPCommSiteSurveyData(

追代码

在os/linux中的ap_ioctl.c

这个文件中这个函数:INT rt28xx_ap_ioctl(struct net_device *net_dev, struct ifreq *rq, int cmd)。直接找到目标的宏定义

转到RTPRIV_IOCTL_GSITESURVEY的定义

struct iw_priv_args ap_privtab[] = {
{ RTPRIV_IOCTL_SET,
/* 1024 --> 1024 + 512 */
/* larger size specific to allow 64 ACL MAC addresses to be set up all at once. */
  IW_PRIV_TYPE_CHAR | 1536, 0,
  "set"},
{ RTPRIV_IOCTL_SHOW,
  IW_PRIV_TYPE_CHAR | 1024, 0,
  "show"},
{ RTPRIV_IOCTL_GSITESURVEY,
  0, IW_PRIV_TYPE_CHAR | 1024 ,
  "get_site_survey"},

寻找一下IW_PRIV_TYPE_CHAR是什么:什么也不是

在找一下get_site_survey是个什么:可以推测出是一个输入命令

具体查看一下:

可以找到一份没什么用途的文档文件:

继续查找看看:来到了比较常见的文件

转到RTMP_AP_IoctlHandle的实现,这个函数出入作为case判断条件的参数:RTPRIV_IOCTL_GSITESURVEY

#ifdef AP_SCAN_SUPPORT
                case RTPRIV_IOCTL_GSITESURVEY:
                        RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GSITESURVEY, 0, NULL, 0);
                        break;
#endif /* AP_SCAN_SUPPORT */

来到函数定义的位置:分析这个函数。了解一下这个pAd结构体

同样找到目标:

去往RTMPIoctlGetSiteSurvey函数的定义,分析一波:

然后找到这个函数:将数据写入msg中

然后将msg转存到用户中

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘多拉的面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值