由iwlist.c中可以發現,scanning的動作是呼叫"print_scanning_info"函式,在此function中可以看到
/* Initiate Scanning */
if(iw_set_ext(skfd, ifname, SIOCSIWSCAN, &wrq) < 0)
這裡就是對interface發出scanning的ioctl,而後就等待底層的回應
/* Wait until something happens */
ret = select(last_fd + 1, &rfds, NULL, NULL, &tv);
當底層有回應後,在呼叫
if(iw_get_ext(skfd, ifname, SIOCGIWSCAN, &wrq) < 0)
來讀取底層回傳的訊息。
所以修改底層可以先以"SIOCGIWSCAN"來搜尋,以RTL8192CU的驅動來看,
rtw_wx_set_scan, /* SIOCSIWSCAN */
rtw_wx_get_scan, /* SIOCGIWSCAN */
rtw_wx_set_essid, /* SIOCSIWESSID */
可以看到"SIOCGIWSCAN" 對應函式為"rtw_wx_get_scan",在其中可以看到"translate_scan"的函式,這個函式就是要修改的地方。在此函式中可以看到最後的訊息是Quality相關,也可以看到關鍵的cmd。
/* Add quality statistics */
iwe.cmd = IWEVQUAL;
接著再以"IWEVQUAL" 來搜尋RT5370 dirver,就可以看到"rt_ioctl_siwscan" int sta_ioctl.c,而其中Quality相關的動作是在中間
/*Channel and Frequency */
......
/*Add quality statistics */
....
/*Encyption key */
接下來就只要把Quality相關的程式碼移到函式的尾端,如此就可讓兩個WIFI dongle在iwlist [interface] scanning的回傳訊息中,每個AP都會以Quality作為結尾。
沒有留言:
張貼留言