http://blog.csdn.net/qy532846454/article/details/6627536
本文只是一个内核网络协议的实践的例子,先说明添加的目的,下篇开始具体的实现。
内核版本:2.6.34;在支持802.1主机上,报文的一般格式:
现在需要支持一种新的协议[二层] – BRCM协议,与IP等协议不同,它位于2层,拥有6字节的头部和4字节的尾部,添加的层次决定了比起添加其它协议要复杂一些,新的报文格式如下,而我们的目的就是要网络协议栈能正常处理这样的报文:
实际上BRCM是一种交换机的内部协议,用处是让交换机管理端口能通过BRCM获取报文来自于交换机的哪个端口,或者指定报文从交换机哪个端口出去;当然,这不是我们关心的内容,我们只需要为它挑选一个协议号0x8744,其余内容置0就可以了。因此,brcm头部会填写成 88 74 00 00 00 00,brcm尾部会填写成 00 00。一个新协议的报文内容用wireshark等捕包工具查看的形式如下:
[源/目的mac]02 03 04 05 06 07 10 11 12 13 14 15
[BRCM报头]88 74 00 00 00 00
[Vlan报头]81 00 00 01
[报文内容]……..
先从设备的概念来看下添加BRCM协议后的层次图:
eth1代表实际的B4401物理网卡;eth1.X/brcm0.x代表VLAN创建的虚拟网卡,后面的数字X是vlan号;brcm0代表BRCM创建的虚拟网卡,数字0表示测试用;从图中可以看到,brcm协议的添加是通过添加brcmX虚拟网卡接口实现的。
如果BRCM协议添加正确,那么最终的结果应该是:
在接收报文时,通过虚拟设备BRCM会脱去brcm的6字节的头部与4字节尾部,当然,协议做的远远不只这些,但这是核心。
在发送报文时,通过虚拟设备BRCM会添加6字节的头部与4字节的尾部,当然,协议做的远远不只这些,但这是核心。
要做的工作大致是以下几项:
1. 确定brcm_dev的存储数据结构
2. 编写struct ptype_base brcm_packet_type
3. 添加ioctl调用供用户空间调用,至少包括brcm_dev的创建和删除
4. 添加notifier机制、netlink机制、proc机制
5. 添加编译用的Kconfig, Makefile等,并修改Menuconfig
数据结构是核心,每一步也是一个网络协议模块的核心。下一篇开始brcm协议的添加实现。