杂乱工作笔记的整理(一)

本无闲暇,奈何正在调试的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存储形式
内存里的值内存地址
0x00f3
0x01f2
0x02f1
0x01f0

  

大端序iethindex的存储形式
内存里的值内存地址
0x01f3
0x02f2
0x01f1
0x00f0



                               

接着问题,指针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};  无论大小端,都是如下这样存储的。。。


数组按内存从小到大存储
内存里的值内存地址
0x00f3
0x01f2
0x02f1
0x01f0


而当,buf强转成struct 时,,,呢struct里边的字段取值则是要看大小端的,。。按照上述格式,小端序平台,

struct里的ifindex取值为0x00010201, 所以收上来的报文不用再ntohl一下!!!!










    


 



 






  




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值