以太网数据包中控制信息的获取方法及系统
技术领域
本发明涉及一种以太网数据包中控制信息的获取方法及系统,特别是涉及一种在Linux(Linux是一种自由和开放源码的类Unix操作系统(UNIX操作系统,是美国AT&T公司于1971年在PDP-11上运行的操作系统。具有多用户、多任务的特点,支持多种处理器架构,最早由肯·汤普逊(KennethLane Thompson)、丹尼斯·里奇(Dennis MacAlistair Ritchie)和Douglas McIlroy于1969年在AT&T的贝尔实验室开发))操作系统中以太网数据包中控制信息的获取方法及系统。
背景技术
随着Linux系统应用越来越广泛,特别是基于Linux的嵌入式系统在交换机,路由器,PON(Passive Optical Network,无源光纤网络)等网络设备中广泛应用。
而一些上层网络协议并不满足于单单获取原始的数据包内容,而是需要获取更多的数据包控制信息,比如交换机中的物理端口号,VLAN ID号(Virtual Local Area Network,虚拟局域网,ID,身份标识号码),Cos(classof server,服务类别)值等或者其他一些特殊控制信息。
原有的Linux系统上层网络应用使用标准的网络编程是无法获取数据包的这一部分控制信息,协议栈也并没有支持这种特殊需求。
现有技术中,倘若想要获得这些控制信息,以交换机为例:一般交换芯片所带数据包信息会额外添加该芯片特有的标签信息,即所包含的该数据包来源的MAC芯片物理端口号,来源VLAN Id号,来源的QoS队列号等。而作为上层协议栈对于原始数据包中的这些额外标签信息并不识别,所以驱动一般会对数据包做些特殊处理,即通过识别不同的协议包进行去除标签信息和保留标签信息操作。当然上层协议应用对于这些标签信息也需要做一些特殊的处理才能识别。随着上层协议越来越多,越来越复杂,驱动需要去识别的协议也越来越多,这势必会影响到驱动效率,而且这种处理方式本身也有悖于系统架构,因为驱动只需要关心底层数据包合法性和完整性即可,完全不需要关心数据包的具体内容。
由此,希望能在不影响到其他正常的通信的情况下找到一种获取这些控制信息的方法。
发明内容
本发明要解决的技术问题是为了克服现有技术中为了识别控制信息而增加驱动负担的缺陷,提供一种兼容现有的协议栈、不影响正常通信且不增加驱动负担的以太网数据包中控制信息的获取方法及系统。
本发明是通过下述技术方案来解决上述技术问题的:
一种以太网数据包中控制信息的获取方法,其特点在于,其包括以下步骤:
步骤S1、将该控制信息存储在一skb结构体(套接字缓冲区结构体)中并上传至协议栈的网络层;
步骤S2、将该skb结构体传输至协议栈的运输层,并且将该skb结构体中的该控制信息传递至一msghdr结构体(消息头结构体)中;
步骤S3、将该msghdr结构体传输至协议栈的应用层,并采用一网络接口函数获取该msghdr结构体中的控制信息。
优选地,该控制信息选自:识别标签,队列号,该以太网数据包来源的MAC芯片的物理端口号,该以太网数据包来源的Vlan标签,该以太网数据包来源的Vlan号,Cos值和该以太网数据包来源的QoS队列号。
优选地,该控制信息在该以太网数据包中位于该以太网数据包来源的MAC(Medium Access Control,介质访问控制)之后、协议号之前。格式一般为标签号加信息,长度也为固定长度。
本发明还提供一种以太网数据包中控制信息的获取系统,其特点在于,其包括:
一数据包上传装置,用于将该控制信息存储在一skb结构体中并上传至协议栈的网络层;
一数据包传输装置,用于将该skb结构体传输至协议栈的运输层,并且将该skb结构体中的该控制信息传递至一msghdr结构体中;
一数据包获取装置,用于将该msghdr结构体传输至协议栈的应用层,并采用一网络接口函数获取该msghdr结构体中的控制信息。
优选地,该控制信息选自:识别标签,队列号,该以太网数据包来源的MAC芯片的物理端口号,该以太网数据包来源的Vlan标签,该以太网数据包来源的Vlan号,Cos值和该以太网数据包来源的QoS队列号。
优选地,该控制信息在该以太网数据包中位于该以太网数据包来源的MAC之后、协议号之前。
本发明的积极进步效果在于:本发明提供了一种以太网数据包中控制信息的获取方法及系统,可以在不影响正常通信、且兼容现有协议栈的情况下获取数据包中的控制信息,且不会加重驱动的负担。
附图说明
图1为本发明一实施例的以太网数据包中控制信息的获取方法的流程图。
图2为本发明一实施例的以太网数据包中控制信息的获取系统的结构框图。
具体实施方式
下面结合附图给出本发明较佳实施例,以详细说明本发明的技术方案。
参考图1,本发明所述的以太网数据包中控制信息的获取方法,包括以下步骤:
步骤S1、将该控制信息存储在一skb结构体中并上传至协议栈的网络层;
步骤S2、将该skb结构体传输至协议栈的运输层,并且将该skb结构体中的该控制信息传递至一msghdr结构体中;
步骤S3、将该msghdr结构体传输至协议栈的应用层,并采用一网络接口函数获取该msghdr结构体中的控制信息。
其中,该控制信息选自:识别标签,队列号,该以太网数据包来源的MAC芯片的物理端口号,该以太网数据包来源的Vlan标签,该以太网数据包来源的Vlan号,Cos值和该以太网数据包来源的QoS队列号。
一般来说,该控制信息在该以太网数据包中位于该以太网数据包来源的MAC之后、协议号之前,格式一般为标签号加信息,长度也为固定长度。
参考图2,本发明所述的以太网数据包中控制信息的获取系统,包括:
一数据包上传装置1,用于将该控制信息存储在一skb结构体中并上传至协议栈的网络层;
一数据包传输装置2,用于将该skb结构体传输至协议栈的运输层,并且将该skb结构体中的该控制信息传递至一msghdr结构体中;
一数据包获取装置3,用于将该msghdr结构体传输至协议栈的应用层,并采用一网络接口函数获取该msghdr结构体中的控制信息。
其中,该控制信息选自:识别标签,队列号,该以太网数据包来源的MAC芯片的物理端口号,该以太网数据包来源的Vlan标签,该以太网数据包来源的Vlan号,Cos值和该以太网数据包来源的QoS队列号。
一般来说,该控制信息在该以太网数据包中位于该以太网数据包来源的MAC之后、协议号之前,格式一般为标签号加信息,长度也为固定长度。
下面以交换机为例进一步介绍本发明的技术方案。
首先,网卡驱动接受来自以太网的数据包,一般会在数据包中自动插入一些控制信息,例如以太网数据包中包括目的MAC地址、源MAC地址、协议号、数据内容和FCS,而该控制信息一般会在以太网数据包的源MAC地址和协议号之间,一般为10个字节。例如,该控制信息包括识别标签,队列号,物理端口号,Vlan标签,Vlan号。
接着,网卡驱动直接传送该以太网数据包到TCP/IP(Transmission ControlProtocol/Internet Protocol,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议)协议栈,协议栈首先处理该以太网数据包是否为ARP协议模块(ARP,地址解析协议模块),然后传送到IP协议模块(联网协议模块),IP模块主要再分为TCP协议和UDP协议,最后上传至上层应用程序(TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于点对点的通讯;UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送)。
协议栈中通信函数有:sock_read、sock_recvmsg、sys_read、inet_recvmsg、udp_recvmsg、skb_recv_datagram、sock_queue_rcv_skb、udp_queue_rcv_skb、udp_rcv、ip_local deliver_finish、ip_local_deliver、ip_recv、net_rc_action和netif_rx。其中主要函数有netif_rx,驱动上调函数。ip_recv为IP层收包处理函数。udp_recvmsg为upd收包处理函数,其中,netif_rx,驱动上调函数,是协议栈提供给驱动的收包接口函数。ip_recv为IP层收包处理函数,协议栈接收处理IP层数据包的函数。udp_recvmsg为udp收包处理函数,是协议栈接收处理UDP数据包的函数。以上这些接口都是标准TCP/IP协议栈提供的各层数据包处理接口。
了解了整个以太网数据包的传输流程之后,进一步介绍如何实现通过这些函数从驱动层传输特殊信息到上层应用的。
如上所述,先把控制信息带入skb这个结构体中,因为整个协议栈都可以处理skb中所带的数据包信息。而在上层传输过程中,可以使用msghdr这个结构体,不同协议收包都有确认使用该结构体存储一些自带的控制信息。最后需要另外设计一套系统调用函数用以把msghdr中信息带给上层,同时该系统调用也需要支持原有的网络接口,通过调用基于原有的网络接口函数,例如recvfrom函数,原有参数中添加这些控制信息结构体参数,其中处理函数保持原有不变,新增传递skb架构体中带有的标签信息作为参数传送给上层应用。
虽然以上描述了本发明的具体实施方式,但是本领域的技术人员应当理解,这些仅是举例说明,本发明的保护范围是由所附权利要求书限定的。本领域的技术人员在不背离本发明的原理和实质的前提下,可以对这些实施方式做出多种变更或修改,但这些变更和修改均落入本发明的保护范围。