欲工其事必先利其器,这种针对硬件的开发往往最令人头大的就是搭开发环境,以前做单片机就深有体会。
这次用了两台PC机,一台硬件设备。PCA装REDHAT,和设备通过PCIE对接,作为开发机和负载机。PCB装XP作为测试机和网关。
联机方式,PCB上插一片光卡,连接到设备的BGE0,光卡和无线网卡建一个网桥,作为INTERNET出口。
PCA的网卡连接到一个光电转换器,光电转换器的光纤连接到设备的BGE1上,作为负载机。
从周六开始搞,先是光电转换器没电源,想从里面焊条线出来,外壳居然打不开,昏倒~~。电源口是英制的3。5MM,找不到匹配的插头,最后只好剪块长条形的线路板插在插口中充当负极,再从插口的芯子上焊出一条线来作为正极,连接到PCB的5V电源上。连接好,插上电,光口指示灯不亮,怀疑是坏了。
周日,突然想到,PCB缺少机箱电源,赶紧跑电脑市场买了一套。
周一一大早,快递就送来了光卡,顺丰的服务果然不是山寨快递可以比的。
这光卡竟然和光电转换器一样,怎么搞,灯就是不亮,把卡上的两个接口连接,灯亮了。说明卡是好的,问题出在光纤或模块上,光纤没问题,罪魁祸首就是光模块了,幸好拿了一大堆模块回来,一个一个地试,终于有一个,灯亮了,果然是模块的兼容性。
突然想到,会不会光电转换器也是相同的问题,把光电转换器接到这块模块上,灯也亮了。
现在在手上有三台光设备了,交换机,光电转换器和光网卡。
先试交换机,光口和电口不通,搞不懂。
最后就确定了上面所说的方案。
环境搭好了,加上啃了两天的文档,写代码相对就比较轻松了。E文文档,十多篇,回想当年英文课睡觉睡到流口水,真是痛心疾首,悔恨莫及啊。
这个东西其实简单的,每个核心可以绑多个线程,每个核心只能绑一个队列。包收进来放进一个桶,桶就是一张HASH表了,可以按2层MAC、三层IP/端口、4层作为多维HASH存放,这个是NETIO的驱动实现的,不用管,按手册做就是了。每个核心就从桶中取数据处理,NETIO提供一个阻塞函数,侦听数据包,由于核心与队列绑定,整个处理过程是不用加锁的。数据的处理类似于SOCKET。收到的数据是原汁原味的报文,可以直接扔到另一个队列发送出去。剥掉网络头就是三层包,再剥掉三层头,就是应用层数据,这个比内核模块方便多了,内核的SKBUFF结构还是相当地复杂,加上每一个HOOK点的数据指向都在变化,足可令人吐血。
手册上没有提供双网卡数据透传的例程,按原先的设想,应该就是侦听两个网卡,收到的数据扔到另一个网卡,就实现了ACCEPT,不扔过去,就是DROP了。
按架构写了个代码,稍作调试,透传成功了,就是速度慢,下载只有50-60K,怀疑是光连接有问题。
再层层剥去头部,打印出MAC和IP地址,包长度。
OK,至此,万里长征总算迈出了第一步。