本無閒暇,奈何正在調試的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
內存裏的值 | 內存地址 |
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一下!!!!