通过socket上送VLAN信息至应用模块的方法与流程

文档序号:11253927阅读:2477来源:国知局
通过socket上送VLAN信息至应用模块的方法与流程

本发明涉及网络通信技术,具体涉及通过socket上送vlan信息至应用模块的方法。



背景技术:

vlan(virtuallocalareanetwork)即虚拟局域网,是将一个物理的lan在逻辑上划分成多个广播域(多个vlan)的通信技术。vlan内的主机间可以直接通信,而vlan间不能直接互通,从而将广播报文限制在一个vlan内,由于vlan间不能直接互访,因此提高了网络安全性。

一个用户网络中往往存在数据、语音、视频等多种业务类型,利用vlan技术,可以为不同的业务类型封装不同的vlantag,利用不同的vlantag通过接入网接入到运营商的承载网中,方便运营商在承载网中根据业务类型分配网络资源,从而帮助运营商有效利用网络资源,并为不同类型的业务提供不同的服务质量。

在通信网络中,要使网络设备能够分辨不同vlan的报文,需要在报文中添加标识vlan的字段,在ieee(institudeofelectricalandelectronicsengineers,电器和电子工程学会)802.1q协议规定在目的mac地址和源mac地址之后封装的4个字节组成vlantag(vlan标签),包括2字节的tpid(tagprotocolidentifier,标签协议标识符),3比特的priority,1比特的cfi(canonicalformatindicator,标准格式指示位)和12比特的vlanid。在以太网协议网络设备利用vlanid来识别报文所属的vlan,根据报文是否携带vlantag以及携带的vlanid值,来对报文进行处理;特别是在基于端口划分vlan时,由于是按照设备端口来定义vlan成员,所以一个端口可能拥有多个vlan成员。

在二层接口下使能网络协议场景中,上层协议模块收到某种业务类型的信令报文进行应答,由于协议模块并不感知vlan信息,故应答报文中并不包含vlantag;二层信令报文发送时,由上层协议模块通过socket绑定接口后直接发往协议栈,若二层物理口有多个vlan成员,此时ip协议栈和转发平面并不知道为这个信令报文封装哪种vlantag,这就导致无法区分业务。而ip协议栈和应用模块间的通信采用标准套接字i/o(in/out,输入/输出)接口函数recvmsg和sendmsg,把大部分参数封装到结构体structmsghdr中以数据报的形式在一个socket上进行数据收、发,应用模块解析报文时只能解析到数据所占缓存区大小及数据起始地址,vlan信息无法通过i/o接口recvmsg从ip协议栈获取。



技术实现要素:

本发明所要解决的技术问题是ip协议栈和应用模块通过标准套接字i/o接口进行数据通信时,把大部分参数封装到结构体structmsghdr中,以数据报的形式在一个socket上进行数据收、发,应用模块在解析数据报时只能解析到数据所占缓存区大小及缓存区起始地址,无法从数据缓存区里面获取vlan信息。

为了解决上述技术问题,本发明所采用的技术方案是提供一种通过socket上送vlan信息至应用模块的方法,包括以下步骤:

应用模块创建一个socket,与ip协议栈进行数据收、发;

应用模块设置socket选项,设置每个socket控制信息类型及协议级别,用于控制接收附属数据信息;

ip协议栈存储vlan信息,且将数据报文存储在socket缓存区;

应用模块调用收包接口函数recvmsg从socket缓存区中读取数据;

应用模块解析从socket缓存区拷贝的数据报文信息,并通过socket向ip协议栈发送获取附属数据消息,获取vlan值。

在上述方法中,通过标准的应用程序编程接口函数setsockopt设置socket选项ip_pktinfo,同时扩展数据结构structin_pktinfo增加vlan_id属性,通过该结构体的vlan_id字段接收vlan信息。

在上述方法中,ip协议栈存储vlan信息,具体包括以下步骤:

步骤s31、主控信令驱动从转发平面收到带vlan标识的二层信令报文,根据报文的mac-in-mac头解析出收包物理接口,然后将mac-in-mac头剥离,将其上送到ip协议栈里面对应的接口;

步骤s32、ip协议栈接口收到报文后,剥除报文里携带的vlan信息,并按照结构体structin_pktinfo中扩展的vlan_id成员保存报文中的vlanid值;

步骤s33、ip协议栈根据报文协议号和socket地址族为af_packet查找侦听此数据报文的socket,将报文数据挂接在socket接收链表上,并通知应用模块该socket有可读事件。

在上述方法中,应用模块从socket缓存区中读取数据信息,将分配一段内存用于存储从socket缓存区中读取数据报文信息,独立分配一段内存存储vlan附属信息;

且由标准接口structmsghdr的成员msg_iov指向用于存储数据报文部分的内存首地址,由structmsghdr的成员msg_control指向用于存储vlan等附属信息部分的内存首地址。

在上述方法中,应用模块从socket缓存区拷贝数据时,若msg_control指向的内存不为空,则向ip栈通过管道发送消息到ip协议栈,将该数据包的vlanid值拷贝至msg_control指向的内存区,将socket链表上的数据信息拷贝至msg_iov指向的内存区。

本发明可以实现在应用模块内部对物理接口相应vlan信息进行管理,由应用模块对报文vlan标识进行填充,此时ip协议栈和数据转发平面就可以不再为报文添加vlan字段,其他网络设备可以根据发送出去的报文携带的vlan字段区分报文所属vlan进行处理,做到使应用模块感知vlan信息,对业务进行区分隔离,提高网络安全性,节省网络资源,增强用户体验。

附图说明

图1为本发明提供一种通过socket上送vlan信息至应用模块的方法的框架图;

图2为本发明提供一种通过socket上送vlan信息至应用模块的方法的流程图;

图3为本发明中步骤s30的具体流程图。

具体实施方式

下面结合说明书附图和具体实施例对本发明做出详细的说明。

本发明利用ip协议栈为所有要接收附属数据的应用模块定义一个全局的数据结构,应用模块设置socket选项,通过socket获取附属数据来接收vlan信息。如图1所示,本发明提供的通过socket上送vlan信息至应用模块的方法涉及到的模块为应用模块和ip协议栈;其中,ip协议栈包括ip协议栈套接口(l2socket),vlan信息存储模块和主控信令驱动;涉及到的模块的层次关系如下:

应用模块负责对ip协议栈上送的数据包进行协议层面的处理;

ip协议栈套接口为上层应用模块提供统一的收、发包接口,是统一的收、发包平台,通过套接字进行数据通信;

vlan信息存储模块用于对数据报文设置vlan属性信息;

主控信令驱动负责控制平面上mac-in-mac处理,在主控发送报文时封装mac-in-mac头,接收报文时剥离mac-in-mac头。

如图2所示,本发明提供的通过socket上送vlan信息至应用模块的方法,包括以下步骤:

步骤s10、应用模块通过函数socket(函数参数af设置为pf_packet)创建一个套接口socket,创建成功后套接口类型为packet类型,通过socket与ip协议栈进行数据收、发。

步骤s20、应用模块设置socket选项,设置每个socket控制信息类型及协议级别,用于控制接收附属数据信息;具体为:

应用模块通过标准的应用程序编程接口函数setsockopt设置socket选项ip_pktinfo,同时扩展数据结构structin_pktinfo增加vlan_id属性,通过该结构体的vlan_id字段接收vlan信息。

步骤s30、ip协议栈存储vlan信息,且将数据报文存储在socket缓存区。

在本发明中,如图3所示,步骤s30具体包括以下步骤:

步骤s31、主控信令驱动从转发平面收到带vlan标识的二层信令报文,根据报文的mac-in-mac头解析出收包物理接口,然后将mac-in-mac头剥离,将其上送到ip协议栈里面对应的接口;

步骤s32、ip协议栈接口收到报文后,剥除报文里携带的vlan信息,并按照结构体structin_pktinfo中扩展的vlan_id成员保存报文中的vlanid值;

步骤s33、ip协议栈根据报文协议号和socket地址族为af_packet查找侦听此数据报文的socket,将报文数据挂接在socket接收链表上,并通知应用模块该socket有可读事件,虽然一个socket特征值包括af地址族、类型、协议号,但对于af为pf_packet的socket,只需匹配一个socket根据af和协议号。

这样,当应用模块收到ip协议栈通知socket有事件可读时,就能通过套接字i/o接口recvmsg读取socket接收链表上的数据,填充在msg消息数据缓存区,再通过发送sig消息到ip协议栈请求附属数据,得到vlan信息。

步骤s40、应用模块调用收包接口函数recvmsg从socket缓存区中读取数据。

在步骤s33后,ip协议栈已经将数据报文放置在相应的socket缓存区,即挂接在socket链表上,并已通知应用模块有可读事件。运行线程被调用后,应用模块从socket缓存区中读取数据信息。通常应用模块分配一段内存用于存储从socket缓存区中读取数据报文信息,若想获取vlan等附属信息,则会独立分配一段内存。且由标准接口structmsghdr的成员msg_iov指向用于存储数据报文部分的内存首地址,由structmsghdr的成员msg_control指向用于存储vlan等附属信息部分的内存首地址。ip协议栈与应用模块通过公用结构体structmsghdr进行数据解析。

应用模块从socket缓存区拷贝数据时,若msg_control指向的内存不为空,则向ip栈通过管道发送消息到ip协议栈,将该数据包的vlan属性信息(步骤s32中存储的vlanid值)拷贝至msg_control指向的内存区,将socket链表上的数据信息拷贝至msg_iov指向的内存区。

步骤s50、应用模块解析从socket缓存区拷贝的数据报文信息,并通过socket向ip协议栈发送获取附属数据消息,获取vlan值,其中,附属信息在标准编程中通常指除了应用模块需要的数据报文外的其他信息,如上送接口、vlan等信息。

应用模块按照数据结构structin_pktinfo解析msg_control指向的内存区的数据信息,即可获得存储的vlan信息。将vlan信息和对应接口以映射的方式存储在应用模块内部,从而使应用模块拥有数据包发送的接口和对应的vlan信息。

这样,当应用模块需要对某个vlan内的信令报文进行应答时,就可以根据接口查找对应的vlan信息,为报文封装vlantag。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1