一种PTP报文的处理方法及SOC与流程

文档序号:12490583阅读:586来源:国知局
一种PTP报文的处理方法及SOC与流程

本发明涉及信息处理技术领域,尤其涉及一种PTP报文的处理方法及SOC。



背景技术:

精确时钟同步协议(Precision Time Protocol,PTP)是一种对标准以太网终端设备进行时间和频率同步的协议,也称为IEEE 1588,简称为1588。在PTP时钟同步系统(即PTP域)中,有且只有一个同步时钟,PTP域中的所有终端设备都与该时钟保持同步。其中,PTP域中发布同步时钟的节点为主节点,接收同步时钟的节点为从节点。主节点与从节点可利用1588时钟同步算法通过交互PTP报文实现时钟同步。

现有技术中,PTP域中的节点在接收到PTP报文时,由软件为该PTP报文添加接收时间戳。对于Linux这样的非实时性系统,由于软件处理PTP报文存在一定的延迟,所以,PTP报文的实际接收时间与软件为该PTP报文添加的接收时间戳之间会存在较大的误差,从而导致时钟同步不准确。

另外,现有的Linux系统中,物理层接收到报文(该报文可以是PTP报文,也可以是非PTP报文)后,通过网卡及上层驱动将该报文上传至系统层的协议栈部分,该协议栈部分通过调用相应的处理函数,对该报文进行相应处理后上报至应用层。如果该报文为PTP报文,则应用层以软件方式为该PP报文添加接收时间戳,并采用相关算法,实现该PTP报文的接收端与发送端之间的时钟同步。在上述过程中,系统层在对PTP报文进行处理时,采用的处理方法与对非PTP报文进行处理时采用的处理方法相同,均是在netif_receive_skb函数中,按照报文头部携带的报文类型,调用预先注册的与该报文类型对应的处理函数进行处理。在虚拟局域网(Virtual Local Area Network,VLAN)使能的环境下,可能存在携带有多个不同的虚拟局域网标签协议标识(VLAN Tag Protocol Identifier,VLAN TPID)的PTP报文,针对这些携带有多个不同VLAN TPID的PTP报文,会为每种VLAN TPID分别注册一个处理函数,并通过这些处理函数处理该携带有多个VLAN TPID的PTP报文,这样,不仅占用了大量的存储空间和处理时间,也降低了PTP报文的处理效率。



技术实现要素:

本发明实施例提供了一种PTP报文的处理方法及SOC,用以解决现有技术中的PTP报文处理方法存在处理效率较低、存储空间占用量较大、为PTP报文添加的接收时间戳的准确度较低的问题。

本发明实施例提供的具体技术方案如下:

一种PTP报文的处理方法,应用于SOC,用于对PTP报文进行处理,并完成上述PTP报文的发送端与接收端之间的时钟同步,上述处理方法包括:

物理层在接收到报文的情况下,基于当前时间,为上述报文添加接收时间戳,并在确定上述报文是PTP报文的情况下,获取上述PTP报文携带的发送时间戳以及将上述PTP报文发送至驱动层;

驱动层在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列,以及在确定满足预设的时钟同步触发条件的情况下,触发应用层基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文;

应用层在确定上述PTP报文的发送端后,基于上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步。

较佳的,在物理层获取上述PTP报文的发送时间戳以及将上述PTP报文发送至驱动层之后,在驱动层存储上述PTP报文之前,进一步包括:

物理层将上述PTP报文的接收时间戳和发送时间戳存储至第一指定区域。

较佳的,驱动层存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列,包括:

驱动层将上述PTP报文存储至第二指定区域后,为上述PTP报文申请一个表征上述PTP报文起始存储地址的存储标识;

驱动层判断上述PTP报文是否为接收到的第一个PTP报文;

若是,则驱动层在预设的上述PTP报文存储队列的头部标识后面,插入上述PTP报文的存储标识;否则,驱动层在上述PTP报文存储队列当前记录的最后一个存储标识后面,插入上述PTP报文的存储标识。

较佳的,若驱动层接收到应用层发起的PTP报文访问请求,则在确定上述PTP报文存储队列为空的情况下,将访问PTP报文的进程加入进程等待队列。

较佳的,驱动层在确定满足预设的时钟同步触发条件的情况下,触发应用层基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文,包括:

驱动层在确定上述进程等待队列中存在访问PTP报文的进程且上述PTP报文存储队列为非空的情况下,认定满足上述时钟同步触发条件,并唤醒上述进程,触发上述进程基于上述PTP报文存储队列记录的存储标识获取上述PTP报文。

较佳的,应用层在确定上述PTP报文的发送端后,基于上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步,包括:

应用层基于上述PTP报文携带的虚拟局域网VLAN标识,确定上述PTP报文的发送端,并从上述第一指定区域中,获取上述PTP报文的接收时间戳和发送时间戳,以及基于获取到的上述PTP报文的接收时间戳和发送时间戳,采用预设的时钟同步算法,完成与上述发送端的时间同步和频率同步。

一种SOC,用于处理PTP报文,并完成上述PTP报文的发送端与接收端之间的时钟同步,上述SOC包括:逻辑处理模块、网卡驱动模块和应用处理模块,其中,

上述逻辑处理模块,用于在接收到报文的情况下,基于当前时间,为上述报文添加接收时间戳,并在确定上述报文是PTP报文的情况下,获取上述PTP报文携带的发送时间戳以及将上述PTP报文发送至上述网卡驱动模块;

上述网卡驱动模块,用于在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列,以及在确定满足预设的时钟同步触发条件的情况下,触发上述应用处理模块基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文;

上述应用处理模块,用于在确定上述PTP报文的发送端后,基于上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步。

较佳的,在上述逻辑处理模块获取上述PTP报文的发送时间戳并将上述PTP报文发送至上述网卡驱动模块之后,在上述网卡驱动模块存储上述PTP报文之前,上述逻辑处理模块还用于:将上述PTP报文的接收时间戳和发送时间戳存储至第一指定区域。

较佳的,在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列时,上述网卡驱动模块具体用于:

将上述PTP报文存储至第二指定区域后,为上述PTP报文申请一个表征上述PTP报文起始存储地址的存储标识;

判断上述PTP报文是否为接收到的第一个PTP报文;

若是,则在预设的上述PTP报文存储队列的头部标识后面,插入上述PTP报文的存储标识;否则,在上述PTP报文存储队列当前记录的最后一个存储标识后面,插入上述PTP报文的存储标识。

较佳的,上述SOC还包括:接口驱动模块,其中,

上述接口驱动模块,用于若接收到上述应用处理模块发起的PTP报文访问请求,则在确定上述PTP报文存储队列为空的情况下,将访问PTP报文的进程加入进程等待队列。

较佳的,确定满足预设的时钟同步触发条件的情况下,触发上述应用处理模块基于上述PTP报文存储队列记录的存储标识获取上述PTP报文时,上述网卡驱动模块具体用于:

确定上述进程等待队列中存在访问PTP报文的进程且上述PTP报文存储队列为非空的情况下,认定满足上述时钟同步触发条件,并唤醒上述进程,触发上述进程基于上述PTP报文存储队列记录的存储标识获取上述PTP报文。

较佳的,在确定上述PTP报文的发送端后,基于从上述逻辑处理模块获取到的上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步时,上述应用处理模块具体用于:

基于上述PTP报文携带的VLAN标识,确定上述PTP报文的发送端,并从上述第一指定区域中,获取上述PTP报文的接收时间戳和发送时间戳,以及基于获取到的上述PTP报文的接收时间戳和发送时间戳,采用预设的时钟同步算法,完成与上述发送端的时间同步和频率同步。

本发明实施例的有益效果如下:

本发明实施例中,通过将PTP报文加入PTP报文存储队列,就可以将PTP报文与非PTP报文进行区分,无需采用调用处理函数的方法处理PTP报文,可以直接针对PTP报文存储队列中的各个PTP报文进行时钟同步处理,不仅减少了PTP报文的处理环节,提高了PTP报文的处理效率,而且,也节省了调用处理函数所占用的存储空间和处理资源。除此之外,通过物理层对接收到的PTP报文添加接收时间戳,避免了由于软件处理PTP报文存在一定的延迟,导致通过软件为PTP报文添加的接收时间戳存在较大误差,从而导致时钟同步不准确的问题。

附图说明

图1A为本发明实施例中SOC的结构示意图;

图1B为本发明实施例中SOC的具体结构示意图;

图2为本发明实施例中PTP报文处理方法的概况示意图之一;

图3为本发明实施例中PTP报文存储队列(即双向链表)的结构示意图;

图4A为本发明实施例中PTP报文处理方法的概况示意图之二;

图4B为本发明实施例中逻辑处理模块100的具体处理流程示意图;

图4C为本发明实施例中网卡驱动模块110的具体处理流程示意图;

图4D为本发明实施例中应用处理模块120的具体处理流程示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为了解决现有技术中的PTP报文处理方法存在处理效率较低、处理资源占用量较大、为PTP报文添加的接收时间戳的准确度较低的问题,本发明实施例中,将接收到的所有报文进行分类:针对非PTP报文,采用现有技术中的调用处理函数的方法进行处理;针对PTP报文,采用PTP报文专用处理流程进行处理,即为PTP报文申请一个存储标识,并将该存储标识加入PTP报文存储队列,确定满足预设的时钟同步触发条件时,基于PTP报文存储队列中记录的存储标识,获取PTP报文,进而,基于该PTP报文的接收时间戳和发送时间戳,完成该PTP报文的发送端和接收端之间的时钟同步。

下面结合附图,通过具体实施例对本发明方案进行详细描述,当然,本发明并不限于以下实施例。

本发明实施例提供了一种如图1A所示的片上系统(System-on-a-chip,SOC),该SOC可应用于PTP域中的主节点也可应用于从节点,该SOC至少包括:逻辑处理模块100(位于物理层)、网卡驱动模块110(位于驱动层)和应用处理模块120(位于应用层),其中,

上述逻辑处理模块100,用于在接收到报文的情况下,基于当前时间,为上述报文添加接收时间戳,并在确定上述报文是PTP报文的情况下,获取上述PTP报文携带的发送时间戳以及将上述PTP报文发送至上述网卡驱动模块110;

上述网卡驱动模块110,用于在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列,以及在确定满足预设的时钟同步触发条件的情况下,触发上述应用处理模块120基于上述PTP报文存储队列记录的存储标识获取上述PTP报文;

上述应用处理模块120,用于在确定上述PTP报文的发送端后,基于上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步。

较佳的,在上述逻辑处理模块100获取上述PTP报文的发送时间戳以及将所述PTP报文发送至所述网卡驱动模块110之后,在上述网卡驱动模块110存储上述PTP报文之前,上述逻辑处理模块100还用于:将上述PTP报文的接收时间戳和发送时间戳存储至第一指定区域。

较佳的,在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列时,上述网卡驱动模块110具体用于:

将上述PTP报文存储至第二指定区域后,为上述PTP报文申请一个表征上述PTP报文起始存储地址的存储标识;

判断上述PTP报文是否为接收到的第一个PTP报文;

若是,则在预设的上述PTP报文存储队列的头部标识后面,插入上述PTP报文的存储标识;否则,在上述PTP报文存储队列当前记录的最后一个存储标识后面,插入上述PTP报文的存储标识。

较佳的,本发明实施例提供的上述SOC还包括:接口驱动模块130(位于驱动层),其中,

上述接口驱动模块130,用于若接收到上述应用处理模块120发起的PTP报文访问请求,则在确定上述PTP报文存储队列为空的情况下,将访问PTP报文的进程加入进程等待队列。

较佳的,在确定满足预设的时钟同步触发条件的情况下,触发上述应用处理模块基于上述PTP报文存储队列记录的存储标识获取上述PTP报文时,上述网卡驱动模块110具体用于:确定进程等待队列中存在访问PTP报文的进程且上述PTP报文存储队列为非空的情况下,认定满足预设的时钟同步触发条件,并唤醒上述进程,触发上述进程基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文。

较佳的,在确定上述PTP报文的发送端后,基于上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步时,上述应用处理模块120具体用于:

基于上述PTP报文携带的VLAN标识,确定上述PTP报文的发送端,并从上述第一指定区域中,获取上述PTP报文的接收时间戳和发送时间戳,以及基于获取到的上述PTP报文的接收时间戳和发送时间戳,采用预设的时钟同步算法,完成与上述发送端的时间同步和频率同步。

值得说的是,在实际应用中,本发明实施例提供的上述SOC还包括:非PTP报文处理模块140(位于协议层),其中,上述非PTP报文处理模块140,用于采用现有技术中的调用处理函数的方法处理非PTP报文(具体地,非PTP报文的处理方法与现有技术中的处理方法相同,在此不再赘述)。

基于此,本发明实施例提供了一种PTP报文的处理方法,应用于上述SOC,用于对PTP报文进行处理,并完成该PTP报文的发送端与接收端之间的时钟同步,下面结合如图1B所示的SOC,对本发明实施例提供的PTP报文处理方法进行详细说明,参阅图2所示,该PTP报文处理方法的流程如下:

步骤200:物理层在接收到报文的情况下,基于当前时间,为上述报文添加接收时间戳,并在确定上述报文是PTP报文的情况下,获取上述PTP报文携带的发送时间戳以及将上述PTP报文发送至驱动层。其中,上述PTP报文可以是但不限于:SYNC报文、Delay req报文、Delay resp报文,等等;上述PTP报文携带的发送时间戳是,上述PTP报文的发送端在发送上述PTP报文时为上述PTP报文添加的。

在实际应用中,步骤200是在上述SOC的逻辑处理模块100中进行的(其中,逻辑处理模块100至少包括:第一转换单元101、本地时钟单元102、第一缓存单元103、报文解析单元104、信息获取单元105、时间戳存储单元106、第二缓存单元107、响应报文生成单元108、第二转换单元109),具体地,逻辑处理模块100在执行步骤200时,逻辑处理模块100中的各个单元主要用于完成以下操作:

A1:第一转换单元101通过报文输入端口MAC_rx接收报文,并通过本地时钟单元102维护的当前时间,为该报文添加接收时间戳,以及将添加有接收时间戳的报文分成两路,一路缓存至第一缓存单元103,一路输出至报文解析单元104。其中,上述报文输入端口MAC_rx可以是但不限于:吉比特媒体独立端口(Gigabit Media Independent Interface,GMII)。

值得说的是,逻辑处理模块100根据本地维护的当前时间,为接收到的报文添加接收时间戳,这样,只要接收到报文,就可以为该报文添加接收时间戳,避免了由于软件处理报文存在延迟,导致为该报文添加的接收时间戳存在误差的问题,提高了接收时间戳的精度,进而保证了时钟同步的准确性。

A2:第一缓存单元103确定该报文缓存完成的情况下,将该报文的缓存地址输出至信息获取单元105。与此同时,报文解析单元104对该报文进行解析,确定该报文的报文类型,并将确定结果输出至信息获取单元105。其中,上述报文类型至少包括以下两种类型:PTP报文和非PTP报文。

A3:信息获取单元105基于接收到的缓存地址,从第一缓存单元103中获取该报文,并基于接收到的确定结果,确定该报文是PTP报文的情况下,获取该PTP报文携带的发送时间戳,并将该PTP报文对应的发送时间戳和接收时间戳等数据信息存储至时间戳存储单元106(即第一指定区域),以及将该PTP报文输出至第二缓存单元107,由第二缓存单元107实现对该PTP报文的调度;确定该报文是非PTP报文的情况下,删除为该非PTP报文添加的接收时间戳,并将该非PTP报文输出至第二缓存单元107,由第二缓存单元107实现对该非PTP报文的调度,等等。

值得说的是,在实际应用中的某些特定场景下,可能无法为每一个设备分别配置一个用于接收PTP报文的报文输入端口,即无法通过多个报文输入端口分别接收来自不同虚拟局域网的发送端的PTP报文,只能通过一个报文输入端口接收来自不同虚拟局域网的发送端的PTP报文。这样,就无法利用报文输入端口的端口号来识别PTP报文的发送端,基于此,本发明实施例中,可预先为报文输入端口设置多个不同的虚拟端口号,并建立多个虚拟局域网标识(比如:VLAN标识)与多个虚拟端口号之间一对一的映射关系。这样,接收到PTP报文后,就可以基于预先建立的多个VLAN标识与多个虚拟端口号之间一对一的映射关系,确定出与接收到的PTP报文携带的VLAN标识相关联的虚拟端口号,进而,就可以根据确定出的虚拟端口号,确定该PTP报文的发送端。

较佳的,为了保证后续能够从时间戳存储单元106中,快速准确地获取到PTP报文对应的发送时间戳和接收时间戳,在将PTP报文对应的发送时间戳和接收时间戳等数据信息存储至时间戳存储单元106的过程中,可以根据该PTP报文携带的VLAN标识,对PTP报文对应的发送时间戳和接收时间戳等数据信息进行存储。这样,后续需要从时间戳存储单元106中,获取PTP报文对应的发送时间戳和接收时间戳时,就可以通过该PTP报文携带的VLAN标识进行获取。

A4:第二缓存单元107对报文进行调度,即确定该报文需要上报的情况下,将该报文输出至第二转换单元109;确定该报文需要响应(Reply)的情况下,将该报文输出至响应报文生成单元108,等等。

A5:第二转换单元109按照网卡驱动模块110可接收的报文格式对报文进行配置,并将配置后的报文输出至网卡驱动模块110,由网卡驱动模块110对该报文进行后续处理。

A6:响应报文生成单元108基于需要Reply的报文,生成相应的响应报文,并将该响应报文缓存至第二缓存单元107,由第二缓存单元107通过报文输出端口MAC_tx输出该响应报文,其中,上述报文输出端口MAC_tx可以是但不限于:GMII端口。

步骤210:驱动层在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列,以及在确定满足预设的时钟同步触发条件的情况下,触发应用层基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文。

在实际应用中,“在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列”的操作是在上述SOC的网卡驱动模块110中进行的(其中,网卡驱动模块110至少包括:注册单元111、判断单元112、PTP报文存储单元113、链表维护单元114、唤醒单元115),具体地,网卡驱动模块110在执行“在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列”的操作的情况下,网卡驱动模块110中的各个单元主要用于完成以下操作:

B1:注册单元111接收到逻辑处理模块100输出的报文后,会注册一个中断处理函数,基于该中断处理函数,调用软中断处理流程(即调用以下处理流程)。

B2:判断单元112对该报文进行解析,确定该报文是非PTP报文(比如:地址解析协议(Address Resolution Protocol,ARP)报文等)的情况下,将该非PTP报文输出至非PTP报文处理模块140,由非PTP报文处理模块140采用现有技术中的调用处理函数的方法处理非PTP报文(具体地,非PTP报文的处理方法与现有技术中的处理方法相同,在此不再赘述);确定该报文是PTP报文的情况下,将该PTP报文存储至PTP报文存储单元113(即第二指定区域)。

B3:链表维护单元114为该PTP报文申请一个表征该PTP报文起始存储地址的存储标识,在具体实施时,该存储标识可以是但不限于:vlan_list_cache结构体,该vlan_list_cache结构体至少包含两个部分:用于标识该PTP报文的第一结构体struct list_head list,以及用于表征该PTP报文存储空间的第二结构体指针struct sk_buff*sk。

其中,list为链表结点(至少包含两个成员:前向指针list->pre和后向指针list->next);*sk为指向第二结构体struct sk_buff起始存储地址的指针;struct sk_buff中的报文长度变量L可以赋值为该PTP报文的长度,struct sk_buff中的指针*ptr指向该PTP报文的起始存储地址。这样,后续访问该PTP报文时,就可以根据vlan_list_cache结构体中的指针*sk,确定struct sk_buff的起始存储地址,进一步根据struct sk_buff中的指针*ptr,确定该PTP报文的起始存储地址。

链表维护单元114为该PTP报文申请vlan_list_cache结构体后,若该PTP报文是接收到的第一个PTP报文,则链表维护单元114会将该PTP报文对应的vlan_list_cache结构体中成员list作为第一个链表结点插入到预先设定的链表头结点struct list_head sb_list(即头部标识)后面,具体的插入操作为:将该PTP报文对应的vlan_list_cache结构体中成员list的指针list->pre指向链表头结点struct list_head sb_list中成员sb_list的起始存储地址,将链表头结点struct list_head sb_list中成员sb_list的指针sb_list->next指向该PTP报文对应的vlan_list_cache结构体中成员list的起始存储地址;若该PTP报文不是接收到的第一个PTP报文,则链表维护单元114会将该PTP报文对应的vlan_list_cache结构体中成员list的指针list->pre指向前一次申请的vlan_list_cache结构体(即上一次接收到的PTP报文对应的结构体)中成员list的起始存放地址,并将前一次申请的vlan_list_cache结构体中成员list的指针list->next指向本次申请的vlan_list_cache结构体中成员list的起始存放地址。这样,链表维护单元114就可以基于各个PTP报文对应的vlan_list_cache结构体,生成一条如图3所示的双向链表,即生成PTP报文存储队列。

其中,双向链表的链表头结点struct list_head sb_list是链表维护单元114在struct net_device结构体(其中,struct net_device结构体用于描述网卡驱动模块110中的网卡eth1所在设备的属性信息)的全局私有成员struct net_local中预先设定的,初始化时,链表头结点struct list_head sb_list中成员sb_list的指针sb_list->pre和指针sb_list->next均指向成员sb_list的起始存储地址,首次申请vlan_list_cache结构体时,链表头结点struct list_head sb_list中成员sb_list的指针sb_list->next的指向会更改为vlan_list_cache结构体中成员list的起始存储地址。这样,后续访问双向链表时,就可以根据struct net_device结构体的全局私有成员struct net_local,快速而准确地确定出双向链表的链表头结点struct list_head sb_list,进而,就可以确定出该双向链表中各个链表结点各自指向的PTP报文的起始存储地址。

B4:在链表维护单元114将该PTP报文对应的vlan_list_cache结构体插入双向链表后,唤醒单元115确定进程等待队列中存在访问PTP报文的进程的情况下,即确定有访问PTP报文的进程在进程等待队列中睡眠的情况下,会唤醒该进程,触发该进程基于双向链表中该PTP报文对应的vlan_list_cache结构体,访问该PTP报文。至此,软中断处理流程结束。

值得说的是,上述访问PTP报文的进程是上述SOC中接口驱动模块130接收到上述SOC中应用处理模块120发起的PTP报文访问请求后,确定双向链表(即PTP报文存储队列)为空的情况下,将该访问PTP报文的进程加入至上述进程等待队列的。具体地,接口驱动模块130接收到应用处理模块120发起的PTP报文访问请求后,会将该PTP报文访问请求转发至网卡驱动模块110,并等待网卡驱动模块110返回的响应消息,以及在接收到网卡驱动模块110返回的响应消息的情况下,基于网卡驱动模块110返回的响应消息,确定双向链表(即PTP报文存储队列)为空后,将该访问PTP报文的进程加入至上述进程等待队列,并在确定该访问PTP报文的进程被网卡驱动模块110中的唤醒单元115唤醒且双向链表(即PTP报文存储队列)为非空的情况下,调用MMAP函数,使该访问PTP报文的进程可以直接访问网卡驱动模块110中维护的双向链表(即PTP报文存储队列);接口驱动模块130基于网卡驱动模块110返回的响应消息,确定双向链表(即PTP报文存储队列)为非空的情况下,直接调用MMAP函数,使该访问PTP报文的进程可以直接访问网卡驱动模块110中维护的双向链表(即PTP报文存储队列)。

较佳的,为了保证该访问PTP报文的进程可以快速地找到网卡驱动模块110中维护的双向链表(即PTP报文存储队列),接口驱动模块130在初始化时,还会利用dev_get_by_name(&init_net,"eth1")函数,返回网卡驱动模块110中的表征网卡eth1属性信息的struct net_device结构体指针,并将该struct net_device结构体指针存储在全局变量中,以便访问PTP报文的进程可以基于该struct net_device结构体指针,快速准确地找到网卡驱动模块110中的struct net_device结构体,并根据struct net_device结构体的全局私有成员struct net_local,找到双向链表的链表头结点struct list_head sb_list,进而,就可以根据双向链表中的vlan_list_cache结构体,找出该vlan_list_cache结构体指向的PTP报文的起始存储地址,实现对PTP报文的访问。

进一步地,在实际应用中,“在确定满足预设的时钟同步触发条件的情况下,基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文”的操作是在上述SOC的应用处理模块120中进行的(其中,应用处理模块120至少包括:处理单元121和接口适配单元122),具体地,应用处理模块120在执行“在确定满足预设的时钟同步触发条件的情况下,基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文”的操作的情况下,应用处理模块120中的各个单元主要用于完成以下操作:

C1:处理单元121确定需要读取PTP报文的情况下,会按照最大报文长度申请一个用户空间,并将该用户空间对应的用户空间地址作为参数调用IOCTL函数,通过IOCTL函数控制接口适配单元122向接口驱动模块130发起PTP报文访问请求。

C2:接口适配单元122接收到IOCTL函数并对IOCTL函数进行解析后,会向接口驱动模块130发起PTP报文访问请求,并等待接口驱动模块130返回的响应消息(该响应消息可以是网卡驱动模块110返回至接口驱动模块130的响应消息),接收到接口驱动模块130返回的响应消息的情况下,基于该响应消息,确定双向链表(即PTP报文存储队列)为空的情况下,等待网卡驱动模块110将访问PTP报文的进程唤醒,并在被唤醒的情况下,基于存储在接口驱动模块130全局变量中的struct net_device结构体指针,找到网卡驱动模块110对应的struct net_device结构体,并根据struct net_device结构体的全局私有成员struct net_local,找到双向链表的链表头结点struct list_head sb_list,进而,根据链表头结点struct list_head sb_list中成员sb_list的指针sb_list->next,找到双向链表中的第一个vlan_list_cache结构体中的成员list,并基于成员list的存储地址与struct sk_buff的存储地址之间的偏移量,找到第一个vlan_list_cache结构体中的指针*sk,以及基于vlan_list_cache结构体中的指针*sk找到struct sk_buff,进一步根据sk_buff中的指针*ptr,找到指针*ptr指向的第一个PTP报文的起始存储地址,并将该第一个PTP报文复制到处理单元121申请的用户空间中。

进一步地,应用处理模块120中接口适配单元122将PTP报文复制到处理单元121申请的用户空间后,应用处理模块120中处理单元121继续执行以下步骤:

步骤220:应用层在确定上述PTP报文的发送端后,基于上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步。

具体地,应用处理模块120中的处理单元121在执行步骤230时,可以采用但不限于以下方式:

C3:处理单元121对用户空间中的PTP报文进行解析,获取该PTP报文携带的VLAN标识,并基于该VLAN标识,确定该PTP报文的发送端,以及将该VLAN标识携带在时间戳获取请求中,通过接口适配单元122发送至接口驱动模块130,以及等待接口驱动模块130返回的携带有该PTP报文的接收时间戳和发送时间戳的时间戳获取响应。

值得说的是,接口驱动模块130接收到时间戳获取请求后,会将该时间戳获取请求转发至逻辑处理模块100;逻辑处理模块100接收到该时间戳获取请求后,会基于该时间戳获取请求中携带的VLAN标识,从时间戳存储单元106中获取相应PTP报文的接收时间戳和发送时间戳,并将该PTP报文的接收时间戳和发送时间戳携带在时间戳获取响应中返回至接口驱动模块130;接口驱动模块130接收到时间戳获取响应后,会将该时间戳获取响应转发至应用处理模块120中的接口适配单元122,由接口适配单元122将该时间戳获取响应输出至处理单元121。

C4:处理单元121接收时间戳获取响应,并基于该时间戳获取响应携带的接收时间戳和发送时间戳,采用预设的时钟同步算法(可以是但不限于:1588算法),完成与PTP报文发送端的时间同步和频率同步。

下面仅以主节点或者从节点上电后第一次接收到PTP报文为具体应用场景对上述实施例作进一步详细说明,参阅图4A所示,本发明实施例中,PTP报文处理方法流程如下:

步骤400:物理层逻辑处理模块100接收到报文时,基于当前时间,为该报文添加接收时间戳,并在确定该报文为PTP报文时,获取该PTP报文携带的发送时间戳,以及基于该PTP报文携带的VLAN标识,存储该PTP报文的发送时间戳和接收时间戳后,将该PTP报文上报至驱动层网卡驱动模块110。

步骤410:驱动层网卡驱动模块110接收到物理层逻辑处理模块100上报的报文后,确定该报文是非PTP报文时,将该非PTP报文输出至协议层非PTP报文处理模块140,由该协议层非PTP报文处理模块140继续执行步骤440;确定该报文是PTP报文时,为该PTP报文申请一个vlan_list_cache结构体,并将该vlan_list_cache结构体插入双向链表(即PTP报文存储队列),以及唤醒进程等待队列中访问PTP报文的进程。

步骤420:驱动层接口驱动模块130确定该访问PTP报文的进程被驱动层网卡驱动模块110唤醒时,调用MMAP函数,使该访问PTP报文的进程可以直接访问网卡驱动模块110中维护的双向链表(即PTP报文存储队列)。

步骤430:应用层应用处理模块120通过驱动层接口驱动模块130,访问网卡驱动模块110中维护的双向链表(即PTP报文存储队列),并基于双向链表中的vlan_list_cache结构体,获取相应的PTP报文,以及基于该PTP报文的接收时间戳和发送时间戳,采用预设的时钟同步算法,完成与PTP报文发送端的时间同步和频率同步。

步骤440:协议层非PTP报文处理模块140采用现有技术中的调用处理函数的方法处理接收到的非PTP报文,具体的处理方法与现有技术中的处理方法相同,在此不再赘述。

下面结合附图,针对SOC中每一个模块的具体处理方式进行详细说明。

参阅图4B所示,本发明实施例中,物理层逻辑处理模块100的具体处理流程如下:

步骤401:第一转换单元101通过报文输入端口MAC_rx接收报文,并通过本地时钟单元102维护的当前时间,为该报文添加接收时间戳,以及将添加有接收时间戳的该报文分成两路,一路缓存至第一缓存单元103,一路输出至报文解析单元104。

步骤402:第一缓存单元103确定该报文缓存完成时,将该报文的缓存地址输出至信息获取单元105。

步骤403:报文解析单元104对该报文进行解析,确定该报文的报文类型,并将确定结果输出至信息获取单元105。

步骤404:信息获取单元105基于接收到的缓存地址,从第一缓存单元103中获取该报文,并基于接收到的确定结果,确定该报文是PTP报文时,获取该PTP报文携带的发送时间戳。

步骤405:信息获取单元105基于该PTP报文携带的VLAN标识,将该PTP报文的发送时间戳和接收时间戳等数据信息存储至时间戳存储单元106后,将该PTP报文输出至第二缓存单元107,由第二缓存单元107将该PTP报文输出至第二转换单元109。

步骤406:第二转换单元109按照网卡驱动模块110可接收的报文格式对该PTP报文进行配置,并将配置后的PTP报文输出至网卡驱动模块110。

至此,物理层逻辑处理模块100的处理流程结束。

参阅图4C所示,本发明实施例中,驱动层网卡驱动模块110的具体处理流程如下:

步骤411:注册单元111接收到逻辑处理模块100输出的报文后,注册一个中断处理函数,基于该中断处理函数,调用软中断处理流程(即调用以下处理流程)。

步骤412:判断单元112对该报文进行解析,判断该报文是否为PTP报文,若是,则执行步骤414;否则,执行步骤413。

步骤413:判断单元112将该非PTP报文输出至非PTP报文处理模块140,由非PTP报文处理模块140采用现有技术中的调用处理函数的方法处理非PTP报文。

步骤414:判断单元112将该PTP报文存储至PTP报文存储单元113,触发链表维护单元114为该PTP报文申请一个vlan_list_cache结构体。

步骤415:链表维护单元114为该PTP报文申请一个vlan_list_cache结构体,并将该vlan_list_cache结构体插入双向链表的链表头结点struct list_head sb_list中,触发唤醒单元115判断进程等待队列中是否存在访问PTP报文的进程。

具体地,链表维护单元114将该vlan_list_cache结构体中成员list的指针list->pre指向链表头结点struct list_head sb_list中成员sb_list的起始存储地址,以及将该链表头结点struct list_head sb_list中成员sb_list的指针sb_list->next指向该PTP报文对应的vlan_list_cache结构体中成员list的起始存储地址。其中,链表头结点struct list_head sb_list存储在表征网卡eth1所在设备属性信息的struct net_device结构体的全局私有成员struct net_local中。

步骤416:唤醒单元115确定进程等待队列中存在访问PTP报文的进程时,即确定有访问PTP报文的进程在进程等待队列中睡眠时,唤醒该进程,触发该进程基于双向链表中该PTP报文对应的vlan_list_cache结构体,访问该PTP报文。

至此,软中断处理流程结束,退出软中断处理流程,即驱动层网卡驱动模块110的处理流程结束。

进一步地,本发明实施例中,驱动层还包括接口驱动模块130,该接口驱动模块130主要用于转发逻辑处理模块100与应用处理模块120,以及网卡驱动模块110与应用处理模块120之间的数据信息,并为应用处理模块120提供访问双向链表(即PTP报文存储队列)的访问途径,接口驱动模块130具体操作如下:

(1)提供双向链表(即PTP报文存储队列)的访问途径:

接口驱动模块130在初始化时,调用dev_get_by_name(&init_net,"eth1")函数,返回网卡驱动模块110中的表征网卡eth1属性信息的struct net_device结构体指针,并将该struct net_device结构体指针存储在全局变量中。

(2)转发网卡驱动模块110和应用处理模块120之间的数据信息:

接口驱动模块130接收到应用处理模块120发送的PTP报文访问请求时,将该PTP报文访问请求转发至网卡驱动模块110,并等待网卡驱动模块110返回的响应消息。

接口驱动模块130接收到网卡驱动模块110返回的响应消息时,若基于该响应消息,确定双向链表(即PTP报文存储队列)为空,则将该访问PTP报文的进程加入至进程等待队列,并在确定该访问PTP报文的进程被网卡驱动模块110中的唤醒单元115唤醒时,调用MMAP函数,使该访问PTP报文的进程可以直接访问网卡驱动模块110中维护的双向链表(即PTP报文存储队列);若基于该响应消息,确定双向链表(即PTP报文存储队列)不为空,则直接调用MMAP函数,使该访问PTP报文的进程可以直接访问网卡驱动模块110中维护的双向链表(即PTP报文存储队列)。

(3)转发逻辑处理模块100和应用处理模块120之间的数据信息:

接口驱动模块130接收到应用处理模块120发送的时间戳获取请求时,将该时间戳获取请求转发至逻辑处理模块100,由逻辑处理模块100基于该时间戳获取请求中携带的VLAN标识,从时间戳存储单元106中获取相应PTP报文的接收时间戳和发送时间戳,并等待辑处理模块100返回的携带有相应PTP报文的接收时间戳和发送时间戳的时间戳获取响应。

接口驱动模块130接收到逻辑处理模块100返回的时间戳获取响应时,将该时间戳获取响应转发至应用处理模块120中的接口适配单元122,由接口适配单元122将该时间戳获取响应输出至处理单元121。

至此,驱动层接口驱动模块130的主要操作流程结束。

参阅图4D所示,本发明实施例中,应用层应用处理模块120的具体处理流程如下:

步骤431:处理单元121确定需要读取PTP报文时,按照最大报文长度申请一个用户空间,并将该用户空间对应的用户空间地址作为参数调用IOCTL函数,通过该IOCTL函数控制接口适配单元122向驱动层的接口驱动模块130发起PTP报文访问请求。

步骤432:接口适配单元122接收到该IOCTL函数并对该IOCTL函数进行解析后,向接口驱动模块130发起PTP报文访问请求,并等待接口驱动模块130返回的响应消息。

步骤433:接口适配单元122接收到接口驱动模块130返回的响应消息时,基于该响应消息,确定双向链表(即PTP报文存储队列)为空时,等待网卡驱动模块110将访问PTP报文的进程唤醒。

步骤434:接口适配单元122确定该访问PTP报文的进程被唤醒时,基于存储在接口驱动模块130全局变量中的struct net_device结构体指针,找到网卡驱动模块110对应的struct net_device结构体。

步骤435:接口适配单元122根据struct net_device结构体的全局私有成员struct net_local,找到双向链表的链表头结点struct list_head sb_list,并根据链表头结点struct list_head sb_list中成员sb_list的指针sb_list->next,找到双向链表中的第一个vlan_list_cache结构体中的成员list。

步骤436:接口适配单元122基于成员list的存储地址与struct sk_buff的存储地址之间的偏移量,找到第一个vlan_list_cache结构体中的指针*sk,并基于vlan_list_cache结构体中的指针*sk找到struct sk_buff,以及根据sk_buff中的指针*ptr,找到指针*ptr指向的第一个PTP报文的起始存储地址,并将该第一个PTP报文复制到处理单元121申请的用户空间中。

步骤437:处理单元121对用户空间中的PTP报文进行解析,获取该PTP报文携带的VLAN标识,并基于该VLAN标识,确定该PTP报文的发送端。

步骤438:处理单元121将该VLAN标识携带在时间戳获取请求中,通过接口适配单元122发送至接口驱动模块130,并等待接口驱动模块130返回的时间戳获取响应。

步骤439:处理单元121接收接口驱动模块130返回的时间戳获取响应,并基于该时间戳获取响应携带的接收时间戳和发送时间戳,采用预设的时钟同步算法,完成与PTP报文发送端的时间同步和频率同步。

至此,应用层应用处理模块120的处理流程结束。

综上所述,本发明实施例中,物理层在接收到报文的情况下,基于当前时间,为上述报文添加接收时间戳,并在确定上述报文是PTP报文的情况下,获取上述PTP报文携带的发送时间戳以及将上述PTP报文发送至驱动层;驱动层在存储上述PTP报文后,为上述PTP报文申请存储标识,并将上述存储标识加入至PTP报文存储队列,以及在确定满足预设的时钟同步触发条件的情况下,触发应用层基于上述PTP报文存储队列记录的存储标识,获取上述PTP报文;应用层在确定上述PTP报文的发送端后,基于上述PTP报文的接收时间戳和发送时间戳,完成与上述发送端的时钟同步。。这样,通过将PTP报文加入PTP报文存储队列,就可以将PTP报文与非PTP报文进行区分,无需采用调用处理函数的方法处理PTP报文,可以直接针对PTP报文存储队列中的各个PTP报文进行时钟同步处理,不仅减少了PTP报文的处理环节,提高了PTP报文的处理效率,而且,也节省了调用处理函数所占用的存储空间和处理资源。除此之外,通过物理层对接收到的PTP报文添加接收时间戳,减少了软件处理的复杂度,避免了由于软件处理PTP报文存在一定的延迟,导致通过软件为PTP报文添加的接收时间戳存在较大误差,从而导致时钟同步不准确的问题,

进一步地,本发明实施例中,只需要在struct net_device结构体的全局私有成员struct net_local中预先设定双向链表的链表头结点struct list_head sb_list,接口驱动模块就可以根据struct net_device结构体的全局私有成员struct net_local,从网卡驱动模块中,快速而准确地确定出双向链表的链表头结点struct list_head sb_list,进而,就可以确定出该双向链表中各个链表结点各自指向的PTP报文的起始存储地址,使得网卡驱动模块与接口驱动模块之间的信息传递简洁高效,进一步地加快了PTP报文的处理效率。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

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

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