本无闲暇,奈何正在调试的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一下!!!!