close

這次是希望加上site survey的功能,讓使用者在使用WDS功能的時候能夠更加便利

在Realtek公板上有site survey的功能,原本開心的想說直接po過來就可以用了,只是,天不從人願呀!!!

公板的一執行,httpd 就發生了 Segmentation fault,所以就先來Debug囉!

在httpd/LINUX/fmwlan.c中的formWlSiteSurvey就是用來發出Site Survey要求的CGI,而wlSiteSurveyTbl則是用來將Site Survey的結果輸出到Client端的CGI。

經過Debug和Trace Code之後,發現他是掛在wlSiteSurveyTbl時,要取得SSID資訊的這一行memcpy,所以直覺的先懷疑可能是變數的記憶體大小不符合,所以發生Segmentation fault.

此外,從Debug message 可以正常的印出第一筆訊息,接下來httpd就掛掉,因此嚴重的懷疑是Driver透過ioctl送上來的structure 可能與User space這邊的 structure不一致,導致第一筆資料可以正常讀取,接下來的位置就有問題,因此httpd process才會掛掉。

所以就先一一檢查所用到的Structure:

先來看bss這個structure的定義,是來自

bss_info bss; 這個宣告,接下來看bss_info這個structure, User Space定義在httpd/LINUX/utility.h

SSID_LEN則定義為32

接著從getWlBssInfo這個function去找ioctl以及Driver所定義的structure,

這支Code在httpd/LINUX/utility.c中,接著要去找一下SIOCGIWRTLGETBSSINFO在Driver所用的structure.

在linux-2.6.30/drivers/net/wireless/rtl8182cd/8192cd_ioctl.c中找到了這個ioctl,也看到了在Driver所使用的structure為bss_info_2_web,它也是定義在8192cd_ioctl.c中,與httpd下的structure相比對,這個structure是沒有問題的,接下來用相同的方法檢查另一個structure。

接下來看getWlSiteSurveyResult這支function,也是同樣定義在httpd/LINUX/utility.c中

在8192cd_ioctl.c中一樣可以找到SIOCGIWRTLGETBSSDB這個ioctl,接著看tl8192cd_get_ss_status

在linux-2.6.30/drivers/net/wireless/rtl8192cd/9182cd.h中有定義bss_backup是由bss_desc所宣告的

最後可以在linux-2.6.30/drivers/net/wireless/rtl8192cd/ieee802_mib.h中找到bss_desc這個structure ,所以就趕緊來跟pStatus的structure比較一下,看有沒有哪兒不同

從wlSiteSurveyTbl中可以看到pStatus的structure是SS_STATUS_T

在httpd/LINUX/utility.h可以找到SS_STATUS_T再進入到BssDscr,所以可以發現,與Driver的structure有很大的差異,因此,為了避免變動到原先可能有功能正在使用這個structure,我另行宣告了一個新的structure,並且將所有相關的程式,參照到新的structure,如此,就可以解決這個問題了。

定義在utility.h中,新的Structure

增加Defined 到fmwlan.c

並且將這二支CGI中原本參照到pStatus的都改向pStatus2,參照到SS_STATUS_T改向SS_STATUS_T2,另外還有utility.c中 的int getWlSiteSurveyResult(char *interface, SS_STATUS_Tp2 pStatus2 )也要記得都改向新的structure

arrow
arrow

    Yisin 發表在 痞客邦 留言(0) 人氣()