雜亂工作筆記的整理(一)

本無閒暇,奈何正在調試的gmrp命令行部分架構已經基本完成,各種必要的read事件及update事件也都加入到相應的thread add裏邊了,,可是從pc段構造gmrp報文,在dev.c之前的bcm-net裏用debug driver dump可以看到報文,而在應用層gmrp一直處於監聽狀態下的socket卻收不到,,還有爲什麼dev.c之前的處理中把45 45 字段就認爲是stp報文,還不太清楚,但是現在又是沒有設備,,沒辦法繼續調試報文。

整理一下稍混亂的工作筆記吧。


(1) 對於開發協議的命令行測試用例中,不必對debug及show命令單獨寫一條測試用例。(show一般可間接作爲驗證其他命令的結果) 2013.10.12

(2)在編程規範裏邊,注意, where malloc where free的原則,即處於同一層次,跨越太多層次很可能導致產生野指針的混亂,

 free後一定記着賦值NULL。2013.7.22

(3)分配內存是,原則上要進行成功性檢查,有可能不成功。。據說Linux系統維護一個空閒內存的鏈,, 每個鏈掛的內存大小不同,

根據你申請的內存大小,就在這個鏈上匹配合適的節點(大於等於你申請的內存的呢個節點,如果該節點大於你申請的內存,

則該節點把剩餘的內存重新加到這個鏈上。) 2013.7.22

另外,Linux系統按照“樂觀的”原則對待申請內存,即,你無論申請多大的內存,基本都能成功,,但當你用這塊內存的時候就會出錯

(memset  0 就算是在用這塊內存了),形象地說,當你一會循環malloc,但其中不適用申請的內存,

呢麼當malloc的內存大於系統剩餘的內存時,可能還不會報申請失敗。。2014.8.3

(4)在調試程序時,若用printf,則一般在continue,break,return等關鍵點打印。。(春哥教的,當時感覺很迷惑) 2013.7.23


(5) 切記切記!!!!! memset 大多用於memset 0, 當memset 其他值時,,注意他是按字節 set 的!!! 2013.7.23

(6)二進制形式的mac地址中,從左到右,第八位是1則是組播mac,是0,則是單播mac。  2013.7.24


(7)vtysh 命令行中幾個重要的 參數 語法,描述。

 大寫字母:  輸入字符串作爲參數。

【 】      : 該參數,可輸入也可以不輸入。

( | )    : 括號內參數二選一。

 <1-255>:指定控制參數範圍。

 H.H.H      :mac地址,但沒用過

A.B.C.D/M :IP地址  2013.7.24


(8) 期間進行了lldp協議原理的熟悉理解,剛開始就是天馬行空,感覺。然後模仿命令行,說實在,一點都不理解,當時。

網上源碼資料一大堆。到最後也沒有弄明白,vtysh相關的東西,還被春哥罵的無地自容,感覺都堅持不下去了一樣,,

每天晚上九點下班,都在、走在路上咀嚼着自己的感傷,過得是惶惶恐恐的日子,上班就是痛苦的開始。。。

哦,對,期間的各種威脅言語就不多說了。協議type 0x88cc, PDU按照TLV封裝,報文填充收發正常再就是報文處理交互正常!

結束這一段吧。2014.8.20

(9)  安排igmp,pim協議的簡單原理熟悉,,就三四天,沒幹代碼層工作。出了點筆記,幾乎快忘完了。

期間有學習編寫測試用例,交換機基礎知識,c語言基礎,然後一個月的工作總結等等。,,stp相關代碼命令行的修改,

dhcp協議的簡單應用層原理理解,不涉及代碼,但都幾乎是扯。。淡(定)。

總之,這個月說多了都是眼淚啊。。

(10)然後8.13的快遞詢問禮物,9.19的鄭州之行,滿滿的心酸與甜蜜。之後用了wanglichang的工作記錄本。。(走了)。。。

十一假期同學的蘇州遊玩,等等,說的偏了,,,,2013.10.8,




(11)getenv(char *),  __LINE__,  __FUNC__,   注意是兩個下劃線。

            兩個網站, www.rfc-editor.org          www.ietf.com      2013.10.8


(12)lacp,gmrp的熟悉,和春哥一塊編寫命令行代碼,總感覺呢是是混沌的,什麼都不知道還在呢弄,也許也學習到一點命令行的通信過程,

只是還是沒有建立vtysh的通信體系,框架,全是混亂的,也知道了一些Dev中的skb dump等。然後學習按照vtysh框架寫配置保存,

修改mac,燒寫版本等。其實gmrp看筆記當時還是學到一些較深層的問題的,只是後來就全忘了。。只剩下不太看懂的筆記。。。


 lacp 有點天方夜譚,牛逼的人都搞不定,不過,ifenslave應用層工具,控制下內核。sudo menuconfig 等。。

之後是三個月的答辯,總結,再之後命令行及工程維護的雜活,反正各種忙。。

pim相關原理命令行整理理解,lldp的各種命令測試,及簡單bug的定位修改。

 唉,期間也沒啥特殊的感悟,學習的東西,就像雜役一樣幹着分配的工作,沒閒暇自己思考學點東西,總之每天也在忙,感覺真是荒廢。

       

 之後才稍微明白公司tftp燒寫的大致網絡搭建虛擬機間的關係,慚愧的很,不過還是自己參透的,設備就當做一臺linux 的主機,

其還是一個tftp客戶端,沒人講。。


 然後編寫各種協議的命令行手冊等,然後就有了年度總結,過年七天假,請了兩三天。。。。  

年度總結:感覺學到的太少,還是一事無成,一無所有。。。



(13)然後新的一年,更改加vlan的應用層代碼,修改vtysh架構的部分不太必要的東西,還有環網移植。。。

gcc 知識:


#include""       直接從當前目錄查找, no找到再去系統指定目錄查找。。。

#include<>     直接去系統指定目錄查找。


 gcc -I                指定編譯時的頭文件路徑。

 注意:gcc 查找頭文件的順序是: -I 參數指定,系統環境變量的C_INCLUDE_PATH,,系統默認路徑/usr/include等。

代碼中包含頭文件時若在上述三種目錄中,則直接#include"相對路徑",,否則就得寫include絕對路徑了。。

gcc   -L              指定搜索lib庫文件的目錄。


命令行字符串中可以用宏,  但必須是  “空一格StrId  ”   來銜接。其他命令單詞。

理解代碼,調代碼,優化代碼的日子。。


(14) 在調報文交互的時候,有時候會莫名地多出來幾個0,一般是報文字段會莫名地插入0000,

解決::一般是應用層結構體不是#pragma pack(1)  的問題!!!


 sendto---------->kernel------------------>bcm-net中tx dump----------->bcm-net對報文發出去前的處理!!

dev rcv---------->add vlan tag --------->bcm-net process------------->rx dump---------->kernel------->user space!!


發報文時出現no such file or directory 時,多是參數或者端口不正確導致的,注意細細檢查。。如, eth1/1 弄成 eth1  的問題。


之後清明節,黃河,步行,櫻花,噴泉, 喫飯,高鐵,龍門,,

之後五一同學結婚,又順勢回了趟學校,滿是懷念。。。。    


環網細節的調試過程都記錄在筆記上,沒有很大的框架,只是定位解決,所以感覺不太好,但終究是功能基本正常。。

其trunk功能,其中設計了一種struct :num的數據結構,存取trunk或者eth,稍複雜,注意字節序問題。。添加了一半,被中止。


期間,還列出了last plan

GDB, HTTP theory, protocol棧,stp,rip,makefile。。。

可惜沒有怎麼執行。。


 六月的鄭州還是呢麼令人留戀,只不過感覺結果稍不太好。


(15)          






(end -1)2014.8.16.15.24,,星期六!!!

虛擬機裏寫調代碼,,網絡卡的要死,,歷史遺留問題,,弄的都沒勁了,,上班時間總結這個,多少有點罪過。

簡單總結一下前天遇到的問題,希望有困惑的可以找到答案。。。


在用戶態處理從網卡驅動傳來的報文時,遇到的問題。

由於用戶態的處理裏邊,需要接收報文端口num,所以在網卡(交換芯片bcm-net.c)驅動裏把eth端口號獲取,

並當成報文裏的一個字段,一起傳到應用層。這裏涉及到幾個問題,平臺的大小端,數組的存儲,指針的指向問題。


 在網卡驅動裏邊獲得接收eth口的ifindex, 得到爲iethindex = 0x00010201,, uchar *p = (unchar *) & iethindex,

問題一出現了,原則上講,不管代碼的執行結果對錯,你寫的代碼,你就要清楚每一步的結果是什麼,

不能什麼htons,或者ntohs一下,哎,然後結果對了,就不追究代碼的過程了,,如果這樣,一旦出現問題,,

真理:bug在開發期發現比在維護期發現投入的資源少得多!!!!!!


問題一:  p[0] = ?

答:這個問題,應該這麼回答。首先要明確你的開發平臺是大端序還是小端序。

網上有很多 測試方法的代碼,注意自己親手測試。。。

不要看網上列的(mips   UNIX    大端序)所以就認爲(mips Linux  是大端序),嫁接別人的經驗主義,導致這個問題搗鼓了大半天。


我的開發平臺:  mips Linux  是小端序的。

                      

小端序iethindex存儲形式
內存裏的值 內存地址
0x00 f3
0x01 f2
0x02 f1
0x01 f0

  

大端序iethindex的存儲形式
內存裏的值 內存地址
0x01 f3
0x02 f2
0x01 f1
0x00 f0



                               

接着問題,指針p指向誰?  官方定義得出,p指向起始地址,關鍵是起始地址是高地址還是低地址,

經多方查證,p指向低地址,即,p指向f1!!!


所以小端序平臺p[0] == 0x01,,,,

接下來是插入操作,,pkt[18] = p[0];  pkt[19] = p[1];,memcpy(); 

由此,報文到達應用層後,uchar buf中該index字段爲:…… 01 02 01 00……。


問題二: unchar buf[n], 是怎麼強轉給struct 的???

 答:如,struct 裏邊有一個int ifindex成員,buf強轉成struct後,ifindex是多少。。。

 這其中就涉及到數組的存儲了,數組就是按內存從小到大的順序存儲的,,不涉及大小端序的問題!!


e.g: buf[4] = {0x01,0x02,0x01,0x00};  無論大小端,都是如下這樣存儲的。。。


數組按內存從小到大存儲
內存裏的值 內存地址
0x00 f3
0x01 f2
0x02 f1
0x01 f0


而當,buf強轉成struct 時,,,呢struct裏邊的字段取值則是要看大小端的,。。按照上述格式,小端序平臺,

struct裏的ifindex取值爲0x00010201, 所以收上來的報文不用再ntohl一下!!!!










    


 



 






  




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章