Linux内核实践 - 如何添加网络协议[一]:目的

来源:互联网 发布:淘宝双十一外媒 编辑:程序博客网 时间:2024/04/29 23:10
        本文只是一个内核网络协议的实践的例子,先说明添加的目的,下篇开始具体的实现。

        内核版本: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协议的添加实现。

原创粉丝点击