close
最近的工作在忙著porting UPnP module
原來的UPnP在舊版子(指的是WAN端是乙太網路的port,這是幾年前的產品吧,要用ADSL上網還需加一台ADSL modem在前端)上跑的好好的。我就是要把他porting到新的版子(WAN端直接接電話線)。
Porting是沒什麼問題,但是測試後才知道問題一堆。
兩套tool都把版子搞死,沒有一個tool是能順利跑完的。
後來只好先專攻IGD test tool,這東西測試UPnP很多測試項目
大概分了四五種groups,每個group又有很多test case。
用IGD test tool先把所有的測試都跑過一次
第一個fail的項目就是PortMapping裡面的AddPortMapping這個case
好吧,摸著鼻子抓封包吧
把兩塊版子都跑AddPortMapping然後把封包抓下來一一比對
光這個case就有一百多個封包
看到我都投昏眼花還奢望想把active diagram畫下來勒
一開始還把3-way handshaking都畫後來發現這樣畫下去來得了阿
之後就只有畫action & response
分析完封包後果然有發現
CP跟UPnP device說要加一條port mapping
可是UPnP device收到後卻是沒有response
合理的懷疑就是UPnP device在add port mapping時出錯了
可是又不太可能阿,UPnP的code都沒動阿為什麼原來的版子就可以跑的很好
鑽了兩天後才發現這是CPU架構的問題
在不大改code的情況下
只好多幾行code去判斷exception
如果exception發生,就直接return,所以也就沒有真的去通知nat去add port mapping
直接return就能讓UPnP送出response了
這樣就能''馬扁''(愚人節外加扁馬會談)過IGD test tool了
果然,這個AddPortMappping case改好後20幾種的case就剩下3個fail和1個block

接下來就是要改UUID了
UUID是一串字串uuid:00000000-0000-0000-000000000000
問了前輩,和看了他們的code
發現他們的uuid也是隨便產生,為了確定uuid是uniquely
所以他們把uuid的最後一欄填上MAC address
至於前面就隨便我編了
改好了如何產生uuid,怎麼我的UPnP device還不出現在我的網路芳鄰呢
只好又抓封包來分析了
發現device回給Control Point所發的m-search的200 OK裡面的uuid又跟igd.xml裡面的uuid又不一致
又只好去翻code看哪裡還漏掉
原來是advertise table在initial時還要把uuid給帶進去
這部分是hard coding,只好在init InternetGatewayDevice.xml時加入幾個uuid的global variables
奇怪,為什麼initial uuid global variables的function都測試ok了
為什麼還是有問題呢?
是不是我xml的string有改錯了嗎?
找了許久才發現我在init InternetGatewayDevice.xml時忘了去call init uuid global variables的function拉
唉~~~這次終於沒問題了
所以,總結是我寫code會自己埋bug在裡面耶
在考驗自己debug的能力嗎? ^_^
問題解決了,下午四點就等著下班了
終於有時間去shopping買禮物了
我的450D在過幾天就能買到了
希望能趕的上清明節的阿里山兩日遊呀
arrow
arrow
    全站熱搜

    JaredHuang 發表在 痞客邦 留言(1) 人氣()