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转存到用户中