CN111212061B - 基于afdx的套接字的实现方法 - Google Patents

基于afdx的套接字的实现方法 Download PDF

Info

Publication number
CN111212061B
CN111212061B CN201911414448.7A CN201911414448A CN111212061B CN 111212061 B CN111212061 B CN 111212061B CN 201911414448 A CN201911414448 A CN 201911414448A CN 111212061 B CN111212061 B CN 111212061B
Authority
CN
China
Prior art keywords
function
afdx
protocol
socket
interface
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201911414448.7A
Other languages
English (en)
Other versions
CN111212061A (zh
Inventor
杜欣军
王浩
于楠
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CETC 32 Research Institute
Original Assignee
CETC 32 Research Institute
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by CETC 32 Research Institute filed Critical CETC 32 Research Institute
Priority to CN201911414448.7A priority Critical patent/CN111212061B/zh
Publication of CN111212061A publication Critical patent/CN111212061A/zh
Application granted granted Critical
Publication of CN111212061B publication Critical patent/CN111212061B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/16Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
    • H04L69/161Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields
    • H04L69/162Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields involving adaptations of sockets based mechanisms
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/26Special purpose or proprietary protocols or architectures

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Computing Systems (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本发明提供了一种基于AFDX的套接字的实现方法,包括:输入步骤:整个系统环境的最底层是PCIE‑AFDX接口卡,在Linux中为AFDX设备创建网络驱动,负责配置和收发网络数据包操作;处理步骤:在收发网络数据包过程中解析报文,即通过选择UDP数据包协议类型,递交给AFDX网络接收函数处理,利用内核提供的BSD接口层,创建新的网络协议进行解析报文;输出步骤:提供用户Socket接口输出经过处理步骤后的网络数据包。本发明统一了AFDX网络编程接口;便于向以太网软件移植和开发;同时本发明以直接I/O通信作为网络驱动,实现高速通信,减少开销。

Description

基于AFDX的套接字的实现方法
技术领域
本发明涉及网络通信系统技术领域,具体地,涉及基于AFDX的套接字的实现方法。
背景技术
针对航空电子实时通信特点,美国ARINC公司制订了ARINC664规范,替代ARINC429总线,作为一种开放式系统结构标准,将商业成熟技术引入航空电子系统,为新一代航空电子网络通信提供一种全面可行的解决方案。ARINC664规范提供100Mbps的传输带宽,物理层使用成熟的以太网技术,上层应用继承ARINC429的优点,使用双冗余网络平面,支持分布式结构,提供高可靠性实时确定性航空电子通信网络。
ARINC664PART7部分AFDX(AVIONICS FULL DUPLEX SWITCHED ETHERNET)作为航电高可靠实时确定性网络已在业界成功商用,今后将逐步成为航电总线应用领域的主流技术标准。随着航电系统网络拓扑的日益复杂,以及依托该网络的航电应用的功能和性能要求逐渐提高,从而使航电系统面临任务复杂、系统设计繁琐,以及缺少任务设计合理性验证手段和数据支撑,因此提供合理有效的AFDX应用开发环境,为用户顶层任务设计和验证合理性提供仿真验证手段。从而降低设计难度、可信度、缩短开发周期、降低成本和后期实施风险。现有实现方案是提供自定义裸驱动接口,不便于用于原先基于以太网中间件和大型软件的移植和开发工作,因此开发Socket套接字接口可以有效解决用户移植开发工作。
本发明提出一种AFDX通信协议下通用socket套接字接口技术的实现方案,旨在提供统一编程接口,方便用户中间件开发和移植。
发明内容
针对现有技术中的缺陷,本发明的目的是提供一种基于AFDX的套接字的实现方法。
根据本发明提供的一种基于AFDX的套接字的实现方法,包括
输入步骤:整个系统环境的最底层是PCIE-AFDX接口卡,在Linux中为AFDX设备创建网络驱动,负责配置和收发网络数据包操作;
处理步骤:在收发网络数据包过程中解析报文,即通过选择UDP数据包协议类型,递交给AFDX网络接收函数处理,利用内核提供的BSD接口层,创建新的网络协议进行解析报文;
输出步骤:提供用户Socket接口输出经过处理步骤后的网络数据包。
优选地,所述输入步骤包括:通过网络驱动接口来根据Linux下AFDX端系统驱动总体架构,内核态下分布的AFDX端系统驱动完成包括PCI总线驱动、AFDX端系统硬件资源的分配、AFDX端系统硬件资源的管理以及AFDX端系统硬件资源的释放;
所述分配是指创建AFDX网络协议栈的过程,分配的步骤包括:网卡驱动注册步骤、设备探测步骤、网络设备文件操作步骤、PCI总线驱动初始化步骤以及PCI总线驱动移除步骤。
优选地,所述处理步骤包括如下子步骤:
协议注册步骤、调用socket函数步骤、调用bind函数步骤、调用sendto函数接口步骤、调用recv函数步骤、调用recvfrom函数接口步骤、调用close函数接口步骤;
所述处理步骤的子步骤相互独立,是输出步骤Socket接口的具体实现方式,且放在Linux内核态处理;
协议注册步骤是在内核态新建AFDX协议栈。
优选地,所述协议注册步骤包括:
协议初始化步骤:利用BSD接口层提供的内核函数创建一个新的AFDX网络协议栈,协议避免和已经注册的协议冲突,自定义协议类型为AF_AFDX=40;在加载网络驱动的初始化函数中,利用proto_register函数分别注册UDP网络协议函数接口族,sock_register函数是将类型为AF_AFDX的协议注册到内核,dev_add_pack函数为AF_AFDX的协议指定了网络数据包接收处理程序;
类UDP函数指针操作成员步骤:协议初始化步骤完成之后,就需要在BSD层分别实现对类UDP的afdx_dgram_prot结构体函数指针成员,AFDX应用程序接口在内核里会调用afdx_dgram_ops函数的相应操作成员;
所述类UDP的afdx_dgram_prot结构体是Linux内核提供创建网络协议栈的结构体;
所述afdx_dgram_ops函数指实现AFDX通信的函数指针变量,包括:socket、bind、send、recv以及close。
优选地,所述调用socket函数步骤包括:
为了执行网络I/O,运行一个进程做的第一件事情就是调用socket函数,指定期望的通信协议类型及传输方式,socket函数接口如下:
#include<sys/socket.h>
int socket(int family,int type,int protocol);
family:协议族,等于AF_AFDX;
type:传输类型,包括SOCK_STREAM或者SOCK_DGRAM;
protocol:取值为0,暂且无意义;
在内核里socket函数调用sock_register函数注册的afdx_family_ops函数指针成员afdx_create,完成包括根据协议类型分配指定UDP协议操作结构体,分配套接字内存空间,初始化该协议参数;
afdx_family_ops函数指实现AFDX通信的函数指针变量,包括:socket、bind、send、recv以及close;
函数指针afdx_create对应用户态的socket应用API。
优选地,所述调用bind函数步骤包括:
bind函数把一个本地协议地址赋予一个套接字,对于AFDX网络,协议地址和以太网使用相同的结构体,都是32位的IPv4地址和16位端口号的组合,不同的是AFDX协议只用32位地址的低16位作为设备ID;
bind函数如下:
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr*myaddr,socklen_t addrlen);
sockfd是套接字描述符,socket()函数的返回值;
myaddr是指向设置的协议的地址结构指针,需要将(struct sockaddr_in*)强制类型转换成IPv4地址类型使用;
addrlen是IPv4地址结构的长度;
在内核中调用协议操作函数dgram_bind,判断用户指定的端口号是否已经被占用,若是,则返回错误;当指定端口号为0,也就是INADDR_ANY,内核就会选择一个临时端口,接着获取硬件设备的ID号,并将获取得到的硬件设备ID号和其端口号绑定在一起;如果指定端口号不是0,则内核就会使用用户指定的端口号进行绑定。
优选地,所述调用sendto函数接口步骤包括:
sendto函数将直接发送用户数据给目的地址,sendto函数原型如下:
#include<sys/socket.h>
int sendto(int sockfd,void*buf,size_t len,unsigned flags,structsockaddr*addr,int addrlen);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针afdx_sendmsg函数,该afdx_dgram_prot函数首先获取硬件设备ID作为源地址,在用户未绑定地址和端口号的情况下,内核选择一个临时源端口号,在skb中创建好帧头后,调用dev_queue_xmit函数将网络数据包传到驱动层;
afdx_sendmsg函数对应sendto函数或send函数在AFDX协议层的函数指针实现;
skb是Linux内核实现网络协议栈的socket buffer,用来管理数据的上传下递。
优选地,所述调用recvfrom函数接口步骤包括:
recvfrom函数是阻塞等待底层有数据到来,将网络数据报拷贝到用户空间,用户将其数据长度设置成最大链路单元1500Byte,避免出现数据截断,recvfrom函数将对端地址传递给用户,recvfrom函数原型如下:
#include<sys/socket.h>
recvfrom(int sockfd,void*buf,size_t size,int flags,struct sockaddr*addr,int addr_len);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针dgram_recvmsg函数,dgram_recvmsg函数设置等待队列,等待套接字的接收队列有数据到来,此外,网络驱动通过netif_rx函数把接收的skb数据报传递给上层的协议进行解析报头或者重组分片,最终skb将会传递到协议初始化时候dev_add_pack函数注册的网络接收函数afdx_rcv,从而进入UDP的处理程序,UDP则继续将该skb放到数据接收队列里去,同时释放信号量,唤醒dgram_recvmsg的阻塞进程,使dgram_recvmsg函数从接收队列头部提取数据拷贝到用户空间;
dgram_recvmsg函数指用户API调用recvfrom或recv函数,就会在内核态调用dgram_recmsg函数,来获取网络数据包;
afdx_rcv用来接收网络底层驱动发来的数据包
优选地,所述调用close函数接口步骤包括:
unix close函数用来关闭套接字,终止数据传输;
close函数如下:
#include<unistd.h>
int close(int sockfd);
close函数完成了包括在内核调用类UDP协议操作结构体变量afdx_dgram_ops函数指针dgram_close,清除套接字使用内存,设置传输状态为关闭。
优选地,所述输出步骤包括:
输出步骤属于用户层调用的API函数,应用层将使用socket接口来进行RapidIO网络通信,类UDP为用户提供包括socket接口、bind接口、sendto接口、recvfrom接口、close接口;附加功能函数包括select函数、getsockopt函数、setsockopt函数也实现了,附加功能函数编程模式和以太网TCP/IP整体一致;
提供Socket接口包括包括socket接口,bind接口,sendto接口,recvfrom接口,ioctl接口和close接口。
与现有技术相比,本发明具有如下的有益效果:
1、本发明统一了AFDX网络编程接口;便于向以太网软件移植和开发;
2、本发明以直接I/O通信作为网络驱动,实现高速通信,减少开销。
附图说明
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1是本发明提供的AFDX端系统总体架构示意图。包括给用户使用的通用Socket接口层,AFDX协议处理层,以及设备驱动。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
根据本发明提供的一种基于AFDX的套接字的实现方法,包括
输入步骤:整个系统环境的最底层是PCIE-AFDX接口卡,在Linux中为AFDX设备创建网络驱动,负责配置和收发网络数据包操作;
处理步骤:在收发网络数据包过程中解析报文,即通过选择UDP数据包协议类型,递交给AFDX网络接收函数处理,利用内核提供的BSD接口层,创建新的网络协议进行解析报文;
输出步骤:提供用户Socket接口输出经过处理步骤后的网络数据包。
具体地,所述输入步骤包括:通过网络驱动接口来根据Linux下AFDX端系统驱动总体架构,内核态下分布的AFDX端系统驱动完成包括PCI总线驱动、AFDX端系统硬件资源的分配、AFDX端系统硬件资源的管理以及AFDX端系统硬件资源的释放;
所述分配是指创建AFDX网络协议栈的过程,分配的步骤包括:网卡驱动注册步骤、设备探测步骤、网络设备文件操作步骤、PCI总线驱动初始化步骤以及PCI总线驱动移除步骤。
具体地,所述处理步骤包括如下子步骤:
协议注册步骤、调用socket函数步骤、调用bind函数步骤、调用sendto函数接口步骤、调用recv函数步骤、调用recvfrom函数接口步骤、调用close函数接口步骤;
所述处理步骤的子步骤相互独立,是输出步骤Socket接口的具体实现方式,且放在Linux内核态处理;
协议注册步骤是在内核态新建AFDX协议栈。
具体地,所述协议注册步骤包括:
协议初始化步骤:利用BSD接口层提供的内核函数创建一个新的AFDX网络协议栈,协议避免和已经注册的协议冲突,自定义协议类型为AF_AFDX=40;在加载网络驱动的初始化函数中,利用proto_register函数分别注册UDP网络协议函数接口族,sock_register函数是将类型为AF_AFDX的协议注册到内核,dev_add_pack函数为AF_AFDX的协议指定了网络数据包接收处理程序;
类UDP函数指针操作成员步骤:协议初始化步骤完成之后,就需要在BSD层分别实现对类UDP的afdx_dgram_prot结构体函数指针成员,AFDX应用程序接口在内核里会调用afdx_dgram_ops函数的相应操作成员;
所述类UDP的afdx_dgram_prot结构体是Linux内核提供创建网络协议栈的结构体;
所述afdx_dgram_ops函数指实现AFDX通信的函数指针变量,包括:socket、bind、send、recv以及close。
具体地,所述调用socket函数步骤包括:
为了执行网络I/O,运行一个进程做的第一件事情就是调用socket函数,指定期望的通信协议类型及传输方式,socket函数接口如下:
#include<sys/socket.h>
int socket(int family,int type,int protocol);
family:协议族,等于AF_AFDX;
type:传输类型,包括SOCK_STREAM或者SOCK_DGRAM;
protocol:取值为0,暂且无意义;
在内核里socket函数调用sock_register函数注册的afdx_family_ops函数指针成员afdx_create,完成包括根据协议类型分配指定UDP协议操作结构体,分配套接字内存空间,初始化该协议参数;
afdx_family_ops函数指实现AFDX通信的函数指针变量,包括:socket、bind、send、recv以及close;
函数指针afdx_create对应用户态的socket应用API。
具体地,所述调用bind函数步骤包括:
bind函数把一个本地协议地址赋予一个套接字,对于AFDX网络,协议地址和以太网使用相同的结构体,都是32位的IPv4地址和16位端口号的组合,不同的是AFDX协议只用32位地址的低16位作为设备ID;
bind函数如下:
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr*myaddr,socklen_t addrlen);
sockfd是套接字描述符,socket()函数的返回值;
myaddr是指向设置的协议的地址结构指针,需要将(struct sockaddr_in*)强制类型转换成IPv4地址类型使用;
addrlen是IPv4地址结构的长度;
在内核中调用协议操作函数dgram_bind,判断用户指定的端口号是否已经被占用,若是,则返回错误;当指定端口号为0,也就是INADDR_ANY,内核就会选择一个临时端口,接着获取硬件设备的ID号,并将获取得到的硬件设备ID号和其端口号绑定在一起;如果指定端口号不是0,则内核就会使用用户指定的端口号进行绑定。
具体地,所述调用sendto函数接口步骤包括:
sendto函数将直接发送用户数据给目的地址,sendto函数原型如下:
#include<sys/socket.h>
int sendto(int sockfd,void*buf,size_t len,unsigned flags,structsockaddr*addr,int addrlen);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针afdx_sendmsg函数,该afdx_dgram_prot函数首先获取硬件设备ID作为源地址,在用户未绑定地址和端口号的情况下,内核选择一个临时源端口号,在skb中创建好帧头后,调用dev_queue_xmit函数将网络数据包传到驱动层;
afdx_sendmsg函数对应sendto函数或send函数在AFDX协议层的函数指针实现;
skb是Linux内核实现网络协议栈的socket buffer,用来管理数据的上传下递。
具体地,所述调用recvfrom函数接口步骤包括:
recvfrom函数是阻塞等待底层有数据到来,将网络数据报拷贝到用户空间,用户将其数据长度设置成最大链路单元1500Byte,避免出现数据截断,recvfrom函数将对端地址传递给用户,recvfrom函数原型如下:
#include<sys/socket.h>
recvfrom(int sockfd,void*buf,size_t size,int flags,struct sockaddr*addr,int addr_len);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针dgram_recvmsg函数,dgram_recvmsg函数设置等待队列,等待套接字的接收队列有数据到来,此外,网络驱动通过netif_rx函数把接收的skb数据报传递给上层的协议进行解析报头或者重组分片,最终skb将会传递到协议初始化时候dev_add_pack函数注册的网络接收函数afdx_rcv,从而进入UDP的处理程序,UDP则继续将该skb放到数据接收队列里去,同时释放信号量,唤醒dgram_recvmsg的阻塞进程,使dgram_recvmsg函数从接收队列头部提取数据拷贝到用户空间;
dgram_recvmsg函数指用户API调用recvfrom或recv函数,就会在内核态调用dgram_recmsg函数,来获取网络数据包;
afdx_rcv用来接收网络底层驱动发来的数据包
具体地,所述调用close函数接口步骤包括:
unix close函数用来关闭套接字,终止数据传输;
close函数如下:
#include<unistd.h>
int close(int sockfd);
close函数完成了包括在内核调用类UDP协议操作结构体变量afdx_dgram_ops函数指针dgram_close,清除套接字使用内存,设置传输状态为关闭。
具体地,所述输出步骤包括:
输出步骤属于用户层调用的API函数,应用层将使用socket接口来进行RapidIO网络通信,类UDP为用户提供包括socket接口、bind接口、sendto接口、recvfrom接口、close接口;附加功能函数包括select函数、getsockopt函数、setsockopt函数也实现了,附加功能函数编程模式和以太网TCP/IP整体一致;
提供Socket接口包括包括socket接口,bind接口,sendto接口,recvfrom接口,ioctl接口和close接口。
下面通过优选例,对本发明进行更为具体地说明。
优选例1:
一种基于AFDX的套接字的实现方法,其特征在于,包括
输入步骤:整个系统环境的最底层是PCIE-AFDX接口卡(PCIE-AFDX接口卡是在FPGA上利用PCIE IP核实现的AFDX网络通信功能的接口卡),在Linux中为AFDX设备创建网络驱动,负责配置和收发网络数据包操作;
处理步骤:在收发网络数据包过程中解析报文,即通过选择UDP数据包协议类型,递交给AFDX网络接收函数处理(即将网络包递交给AFDX协议层处理),利用内核提供的BSD接口层,创建新的网络协议进行解析报文;
输出步骤:提供用户Socket接口输出经过处理步骤后的网络数据包。
所述输入步骤包括:通过驱动接口来根据Linux下AFDX端系统驱动总体架构,内核态下分布的AFDX端系统驱动完成包括PCI总线驱动、AFDX端系统硬件资源的分配、AFDX端系统硬件资源的管理以及AFDX端系统硬件资源的释放;
分配的步骤包括网卡驱动注册步骤、设备探测步骤、网络设备文件操作步骤、PCI总线驱动初始化步骤以及PCI总线驱动移除步骤。分配是指创建AFDX网络协议栈的过程。
所述处理步骤包括:协议注册步骤、调用socket函数步骤、调用bind函数步骤、调用sendto函数接口步骤、调用recv函数步骤、调用recvfrom函数接口步骤、调用close函数接口步骤,所述处理步骤相互独立,是输出步骤Socket接口的具体实现方式,且放在Linux内核态处理;
协议注册步骤是在内核态新建AFDX协议栈。
所述协议注册步骤包括:
协议初始化步骤:利用BSD接口层提供的内核函数创建一个新的AFDX网络协议栈,协议避免和已经注册的协议冲突,自定义协议类型为AF_AFDX=40;在加载驱动模块(网络驱动)的初始化函数中,利用proto_register函数分别注册UDP网络协议函数接口族,sock_register函数是将类型为AF_AFDX的协议注册到内核,dev_add_pack函数为AF_AFDX的协议指定了网络数据包接收处理程序;
类UDP函数指针操作成员步骤:协议初始化步骤完成之后,就需要在BSD层分别实现对类UDP的afdx_dgram_prot结构体函数指针成员(其结构体是Linux内核提供创建网络协议栈的结构体),AFDX应用程序接口在内核里会调用afdx_dgram_ops函数的相应操作成员;
所述调用socket函数步骤包括:
为了执行网络I/O,运行一个进程做的第一件事情就是调用socket函数,指定期望的通信协议类型及传输方式,socket函数接口如下:
#include<sys/socket.h>
int socket(int family,int type,int protocol);
family:协议族,等于AF_AFDX;
type:传输类型,包括SOCK_STREAM或者SOCK_DGRAM;
protocol:取值为0,暂且无意义;
在内核里socket函数调用sock_register函数注册的afdx_family_ops函数(具体指实现AFDX通信的函数指针变量,包括socket,bind,send,recv,close)指针成员afdx_create(对应用户态的socket应用API),完成包括根据协议类型分配指定UDP协议操作结构体,分配套接字内存空间,初始化该协议参数。
所述调用bind函数步骤包括:
bind函数把一个本地协议地址赋予一个套接字,对于AFDX网络,协议地址和以太网使用相同的结构体,都是32位的IPv4地址和16位端口号的组合,不同的是AFDX协议只用32位地址的低16位作为设备ID;
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr*myaddr,socklen_t addrlen);
sockfd是套接字描述符,socket()函数的返回值;
myaddr是指向设置的协议的地址结构指针,需要将(struct sockaddr_in*)强制类型转换成IPv4地址类型使用;
addrlen是IPv4地址结构的长度;
在内核中调用协议操作函数dgram_bind,判断用户指定的端口号是否已经被占用,若是,则返回错误;当指定端口号为0,也就是INADDR_ANY,内核就会选择一个临时端口,接着获取硬件设备的ID号,并将获取得到的硬件设备ID号和其端口号绑定在一起;如果不是0,则内核就会使用用户指定的端口号进行绑定。
所述调用sendto函数接口步骤包括:
sendto函数将直接发送用户数据给目的地址,sendto函数原型如下:
#include<sys/socket.h>
int sendto(int sockfd,void*buf,size_t len,unsigned flags,structsockaddr*addr,int addrlen);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针(指afdx网络发包的函数指针)afdx_sendmsg函数(对应sendto或send函数在AFDX协议层的函数指针实现),该afdx_dgram_prot函数首先获取硬件设备ID作为源地址,在用户未绑定地址和端口号的情况下,内核选择一个临时源端口号,在skb中创建好帧头后(skb是Linux内核实现网络协议栈的socket buffer,用来管理数据的上传下递),调用dev_queue_xmit函数将数据传到驱动层。
所述调用recvfrom函数接口步骤包括:
recvfrom函数是阻塞等待底层有数据到来,将网络数据报拷贝到用户空间,用户将其数据长度设置成最大链路单元1500Byte,避免出现数据截断,recvfrom函数将对端地址传递给用户,recvfrom函数原型如下:
#include<sys/socket.h>
recvfrom(int sockfd,void*buf,size_t size,int flags,struct sockaddr*addr,int addr_len);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针dgram_recvmsg函数(具体指用户API调用recvfrom或recv函数,就会在内核态调用dgram_recmsg函数,来获取网络数据包),dgram_recvmsg函数设置等待队列,等待套接字的接收队列有数据到来,此外,驱动通过netif_rx函数把接收的skb数据报传递给上层的协议进行解析报头或者重组分片,最终skb将会传递到协议初始化时候dev_add_pack函数注册的网络接收函数afdx_rcv(用来接收网络底层驱动发来的数据包),从而进入UDP的处理程序,UDP则继续将该skb放到数据接收队列里去,同时释放信号量,唤醒dgram_recvmsg的阻塞进程,使dgram_recvmsg函数从接收队列头部提取数据拷贝到用户空间。
所述调用close函数接口步骤包括:
unix close函数用来关闭套接字,终止数据传输;
#include<unistd.h>
int close(int sockfd);
close函数完成了包括在内核调用类UDP协议操作结构体变量afdx_dgram_ops函数指针dgram_close,清除套接字使用内存,设置传输状态为关闭。
所述输出步骤包括:
输出步骤属于用户层调用的API函数,应用层将使用socket接口来进行RapidIO网络通信,类UDP为用户提供包括socket接口、bind接口、sendto接口、recvfrom接口、close接口;附加功能函数包括select函数、getsockopt函数、setsockopt函数也实现了,附加功能函数编程模式和以太网TCP/IP整体一致;
提供Socket接口包括包括socket接口,bind接口,sendto接口,recvfrom接口,ioctl接口和close接口。
一种基于AFDX的套接字的实现系统,其特征在于,用于执行上述中任一项所述的一种基于AFDX的套接字的实现方法。
优选例2:
一种基于AFDX的套接字的实现系统,本系统包括如下模块:
输入模块,整个系统环境的最底层是PCIE-AFDX接口卡,在Linux中为AFDX设备创建网络驱动,负责配置和收发操作。
处理模块,在收发网络包过程中解析报文,选择协议类型是UDP数据包,递交给AFDX网络接收函数处理,利用内核提供的BSD接口层,创建新的网络协议,屏蔽了底层实现的差异,为上层应用提供了简洁、统一的应用接口。
输出模块,其提供用户Socket接口,包括常用的socket,bind,sendto,recvfrom,ioctl和close接口。
输入模块负责硬件的数据接收和发送,输出模块负责上层软件的数据接收和发送。处理模块负责协议转换功能,连接输入输出模块的。
其中输入模块包括驱动接口功能:根据Linux下AFDX端系统驱动总体架构,内核态下分布的AFDX端系统驱动主要完成PCI总线驱动和AFDX端系统硬件资源的分配、管理和释放,因此分配的功能有:网卡驱动注册功能、设备探测功能、网络设备文件操作功能、PCI总线驱动初始化和PCI总线驱动移除。
处理模块包括socket/bind/sendto/recv/recvfrom/close等子模块,这些是输出模块用户Socket接口的具体实现处理过程,其放在Linux内核态处理。还有协议注册过程也是为了在内核态新建AFDX协议栈。6个子模块功能相对独立,具体描述如下:
(1)协议注册模块
利用BSD接口层提供的内核函数可以创建一个新的AFDX网络协议栈,协议为了避免和已经注册的协议冲突,自定义协议类型为AF_AFDX=40。在加载驱动模块的初始化函数中,利用proto_register函数分别注册UDP网络协议函数接口族,sock_register函数是将类型为AF_AFDX的协议注册到内核,dev_add_pack函数为该协议指定了网络数据接收处理程序。
Figure BDA0002350821570000131
表1:协议初始化
初始化完成之后,就需要在BSD层对类UDP的afdx_dgram_prot结构体函数指针成员分别实现。UDP的应用程序接口在内核里会调用afdx_dgram_ops的相应操作成员,如表2所示。
Figure BDA0002350821570000132
表2:类UDP函数指针操作成员
(2)socket函数模块
为了执行网络I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型和传输方式。函数接口如下:
#include<sys/socket.h>
int socket(int family,int type,int protocol);
family:协议族,这里等于AF_AFDX;
type:传输类型,有两种取SOCK_STREAM或者SOCK_DGRAM;
protocol:取值为0,暂且无意义;
在内核里socket将会调用sock_register函数注册的afdx_family_ops函数指针成员afdx_create,其功能是根据协议类型分配指定UDP协议操作结构体,分配套接字内存空间,初始化该协议参数等;
(3)bind函数模块
bind函数把一个本地协议地址赋予一个套接字,对于AFDX网络,协议地址和以太网使用相同的结构体,都是32位的IPv4地址和16位端口号的组合。不同的是AFDX协议只用32位地址的低16位作为设备Id。
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr*myaddr,socklen_t addrlen);
sockfd:套接字描述符,是socket()函数的返回值;
myaddr:指向特定协议的地址结构指针,需要加(struct sockaddr_in*)强制类型转换成IPv4地址类型使用;
addrlen:是IPv4地址结构的长度。
在内核中调用协议操作函数dgram_bind,比较用户指定的端口号是否已经被占用,是则返回错误;如果指定端口号为0,也就是INADDR_ANY,那么内核就会选择一个临时端口。接着获取硬件设备的Id号,和该端口号绑定在一起。
(4)sendto函数接口
sendto函数将直接发送用户数据给目的地址。其原型如下:
#include<sys/socket.h>
int sendto(int sockfd,void*buf,size_t len,unsigned flags,structsockaddr*addr,int addrlen);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针afdx_sendmsg,该函数首先获取硬件设备Id作为源地址,在用户未绑定地址和端口号的情况下,内核会选择一个临时源端口号。在skb中创建好帧头后,调用dev_queue_xmit函数将数据传到驱动层。
(5)recvfrom函数接口模块
recvfrom函数是阻塞等待底层有数据到来,才将网络数据报拷贝到用户空间,建议用户将其数据长度设置成最大链路单元1500Byte,否则有可能出现数据截断了,该函数会将对端地址传递给用户,其原型如下:
#include<sys/socket.h>
recvfrom(int sockfd,void*buf,size_t size,int flags,struct sockaddr*addr,int addr_len);
在内核里调用类UDP协议操作结构体变量afdx_dgram_prot函数指针dgram_recvmsg,其设置等待队列,等待套接字的接收队列由数据到来。此外,驱动通过netif_rx把接收的skb数据报传递给上层的协议进行解析报头或者重组分片,最终skb将会传递到协议初始化时候dev_add_pack函数注册的网络接收函数rapidio_rcv,从而进入UDP的处理程序。UDP则继续将该skb放到数据接收队列里去,同时释放信号量,唤醒dgram_recvmsg的阻塞进程,使其从接收队列头部提取数据拷贝到用户空间。
(6)close函数接口模块
通常的unix close函数用来关闭套接字,终止数据传输。
#include<unistd.h>
int close(int sockfd);
在内核调用类UDP协议操作结构体变量afdx_dgram_ops函数指针dgram_close,清除套接字使用内存,设置传输状态为关闭等。
输出模块属于用户层调用的API函数,应用层将使用socket接口来进行RapidIO网络通信,类UDP为用户提供socket、bind、sendto、recvfrom、close等接口;附加功能函数如select、getsockopt、setsockopt也实现了。其编程模式和以太网TCP/IP整体一致。
优选例3:
在两台Linux设备上安装AFDX驱动,编写测试程序如下,客户端发送数据,服务器端作为接收:
(1)AFDX客户端应用程序:
Figure BDA0002350821570000151
Figure BDA0002350821570000161
(2)AFDX服务器端应用程序:
Figure BDA0002350821570000162
在本申请的描述中,需要理解的是,术语“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本申请和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本申请的限制。
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统、装置及其各个模块以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部件内的结构。
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

Claims (9)

1.一种基于AFDX的套接字的实现方法,其特征在于,包括
输入步骤:整个系统环境的最底层是PCIE-AFDX接口卡,在Linux中为AFDX设备创建网络驱动,负责配置和收发网络数据包操作;
处理步骤:在收发网络数据包过程中解析报文,即通过选择UDP数据包协议类型,递交给AFDX网络接收函数处理,利用内核提供的BSD接口层,创建新的网络协议进行解析报文;
输出步骤:提供用户Socket接口输出经过处理步骤后的网络数据包;
所述处理步骤包括如下子步骤:
协议注册步骤、调用socket函数步骤、调用bind函数步骤、调用sendto函数接口步骤、调用recv函数步骤、调用recvfrom函数接口步骤、调用close函数接口步骤;
所述处理步骤的子步骤相互独立,是输出步骤Socket接口的具体实现方式,且放在Linux内核态处理;
协议注册步骤是在内核态新建AFDX协议栈。
2.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述输入步骤包括:通过网络驱动接口来根据Linux下AFDX端系统驱动总体架构,内核态下分布的AFDX端系统驱动完成包括PCI总线驱动、AFDX端系统硬件资源的分配、AFDX端系统硬件资源的管理以及AFDX端系统硬件资源的释放;
所述分配是指创建AFDX网络协议栈的过程,分配的步骤包括:网卡驱动注册步骤、设备探测步骤、网络设备文件操作步骤、PCI总线驱动初始化步骤以及PCI总线驱动移除步骤。
3.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述协议注册步骤包括:
协议初始化步骤:利用BSD接口层提供的内核函数创建一个新的AFDX网络协议栈,协议避免和已经注册的协议冲突,自定义协议类型为AF_AFDX=40;在加载网络驱动的初始化函数中,利用proto_register函数分别注册UDP网络协议函数接口族,sock_register函数是将类型为AF_AFDX的协议注册到内核,dev_add_pack函数为AF_AFDX的协议指定了网络数据包接收处理程序;
类UDP函数指针操作成员步骤:协议初始化步骤完成之后,就需要在BSD层分别实现对类UDP的afdx_dgram_prot结构体函数指针成员,AFDX应用程序接口在内核里会调用afdx_dgram_ops函数的相应操作成员;
所述类UDP的afdx_dgram_prot结构体是Linux内核提供创建网络协议栈的结构体;
所述afdx_dgram_ops函数指实现AFDX通信的函数指针变量,包括:socket、bind、send、recv以及close。
4.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述调用socket函数步骤包括:
为了执行网络I/O,运行一个进程做的第一件事情就是调用socket函数,指定期望的通信协议类型及传输方式,socket函数接口如下:
#include<sys/socket.h>
int socket(int family,int type,int protocol);
family:协议族,等于AF_AFDX;
type:传输类型,包括SOCK_STREAM或者SOCK_DGRAM;
protocol:取值为0,暂且无意义;
在内核里socket函数调用sock_register函数注册的afdx_family_ops函数指针成员afdx_create,完成包括根据协议类型分配指定UDP协议操作结构体,分配套接字内存空间,初始化该协议参数;
afdx_family_ops函数指实现AFDX通信的函数指针变量,包括:socket、bind、send、recv以及close;
函数指针afdx_create对应用户态的socket应用API。
5.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述调用bind函数步骤包括:
bind函数把一个本地协议地址赋予一个套接字,对于AFDX网络,协议地址和以太网使用相同的结构体,都是32位的IPv4地址和16位端口号的组合,不同的是AFDX协议只用32位地址的低16位作为设备ID;
bind函数如下:
#include<sys/socket.h>
int bind(int sockfd,struct sockaddr*myaddr,socklen_t addrlen);
sockfd是套接字描述符,socket()函数的返回值;
myaddr是指向设置的协议的地址结构指针,需要将(struct sockaddr_in*)强制类型转换成IPv4地址类型使用;
addrlen是IPv4地址结构的长度;
在内核中调用协议操作函数dgram_bind,判断用户指定的端口号是否已经被占用,若是,则返回错误;当指定端口号为0,也就是INADDR_ANY,内核就会选择一个临时端口,接着获取硬件设备的ID号,并将获取得到的硬件设备ID号和其端口号绑定在一起;如果指定端口号不是0,则内核就会使用用户指定的端口号进行绑定。
6.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述调用sendto函数接口步骤包括:
sendto函数将直接发送用户数据给目的地址,sendto函数原型如下:
#include<sys/socket.h>
int sendto(int sockfd,void*buf,size_t len,unsigned flags,structsockaddr*addr,int addrlen);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针afdx_sendmsg函数,该afdx_dgram_prot函数首先获取硬件设备ID作为源地址,在用户未绑定地址和端口号的情况下,内核选择一个临时源端口号,在skb中创建好帧头后,调用dev_queue_xmit函数将网络数据包传到驱动层;
afdx_sendmsg函数对应sendto函数或send函数在AFDX协议层的函数指针实现;
skb是Linux内核实现网络协议栈的socket buffer,用来管理数据的上传下递。
7.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述调用recvfrom函数接口步骤包括:
recvfrom函数是阻塞等待底层有数据到来,将网络数据报拷贝到用户空间,用户将其数据长度设置成最大链路单元1500Byte,避免出现数据截断,recvfrom函数将对端地址传递给用户,recvfrom函数原型如下:
#include<sys/socket.h>
recvfrom(int sockfd,void*buf,size_t size,int flags,struct sockaddr*addr,int addr_len);
在内核中调用类UDP协议操作结构体变量afdx_dgram_prot函数指针dgram_recvmsg函数,dgram_recvmsg函数设置等待队列,等待套接字的接收队列有数据到来,此外,网络驱动通过netif_rx函数把接收的skb数据报传递给上层的协议进行解析报头或者重组分片,最终skb将会传递到协议初始化时候dev_add_pack函数注册的网络接收函数afdx_rcv,从而进入UDP的处理程序,UDP则继续将该skb放到数据接收队列里去,同时释放信号量,唤醒dgram_recvmsg的阻塞进程,使dgram_recvmsg函数从接收队列头部提取数据拷贝到用户空间;
dgram_recvmsg函数指用户API调用recvfrom或recv函数,就会在内核态调用dgram_recmsg函数,来获取网络数据包;
afdx_rcv用来接收网络底层驱动发来的数据包
8.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述调用close函数接口步骤包括:
unix close函数用来关闭套接字,终止数据传输;
close函数如下:
#include<unistd.h>
int close(int sockfd);
close函数完成了包括在内核调用类UDP协议操作结构体变量afdx_dgram_ops函数指针dgram_close,清除套接字使用内存,设置传输状态为关闭。
9.根据权利要求1所述的一种基于AFDX的套接字的实现方法,其特征在于,所述输出步骤包括:
输出步骤属于用户层调用的API函数,应用层将使用socket接口来进行RapidIO网络通信,类UDP为用户提供包括socket接口、bind接口、sendto接口、recvfrom接口、close接口;附加功能函数包括select函数、getsockopt函数、setsockopt函数也实现了,附加功能函数编程模式和以太网TCP/IP整体一致;
提供Socket接口包括socket接口,bind接口,sendto接口,recvfrom接口,ioctl接口和close接口。
CN201911414448.7A 2019-12-31 2019-12-31 基于afdx的套接字的实现方法 Active CN111212061B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911414448.7A CN111212061B (zh) 2019-12-31 2019-12-31 基于afdx的套接字的实现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911414448.7A CN111212061B (zh) 2019-12-31 2019-12-31 基于afdx的套接字的实现方法

Publications (2)

Publication Number Publication Date
CN111212061A CN111212061A (zh) 2020-05-29
CN111212061B true CN111212061B (zh) 2021-11-23

Family

ID=70788366

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911414448.7A Active CN111212061B (zh) 2019-12-31 2019-12-31 基于afdx的套接字的实现方法

Country Status (1)

Country Link
CN (1) CN111212061B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112968890A (zh) * 2021-02-08 2021-06-15 浪潮软件科技有限公司 一种将axi总线数据转为虚拟网卡接收数据的实现方法
CN113824777B (zh) * 2021-09-06 2023-12-19 武汉中科通达高新技术股份有限公司 数据管理方法和数据管理装置

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6711621B1 (en) * 2000-10-13 2004-03-23 Hewlett-Packard Development Company, L.P. System and method of implementing netware core protocol within a sockets model
CN101135971A (zh) * 2006-09-01 2008-03-05 环达电脑(上海)有限公司 基于个人计算机硬件设备的接入路由器安装配置方法
CN104932452A (zh) * 2015-04-21 2015-09-23 中国电子科技集团公司第四十一研究所 一种用于航空总线测试仪远程控制的方法及系统
CN106534178A (zh) * 2016-12-08 2017-03-22 中国电子科技集团公司第三十二研究所 RapidIO网络通用套接字的实现系统及方法
CN108768841A (zh) * 2018-04-23 2018-11-06 西北工业大学 Afdx安全网关系统及其传输方法
CN110233824A (zh) * 2019-05-09 2019-09-13 中国航空工业集团公司西安航空计算技术研究所 一种系统仿真方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP2583419B1 (en) * 2010-06-17 2016-04-06 Saab AB Ethernet for avionics

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6711621B1 (en) * 2000-10-13 2004-03-23 Hewlett-Packard Development Company, L.P. System and method of implementing netware core protocol within a sockets model
CN101135971A (zh) * 2006-09-01 2008-03-05 环达电脑(上海)有限公司 基于个人计算机硬件设备的接入路由器安装配置方法
CN104932452A (zh) * 2015-04-21 2015-09-23 中国电子科技集团公司第四十一研究所 一种用于航空总线测试仪远程控制的方法及系统
CN106534178A (zh) * 2016-12-08 2017-03-22 中国电子科技集团公司第三十二研究所 RapidIO网络通用套接字的实现系统及方法
CN108768841A (zh) * 2018-04-23 2018-11-06 西北工业大学 Afdx安全网关系统及其传输方法
CN110233824A (zh) * 2019-05-09 2019-09-13 中国航空工业集团公司西安航空计算技术研究所 一种系统仿真方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
"Linux下AFDX端系统驱动的设计与实现";何小亚等;《计算机工程 》;20111105;全文 *
P Thirumeni等."Lessons learned in software implementation of ARINC 664 protocol stack in Linux ".《 International Conference on Circuits, Communication, Control and Computing》.2015, *

Also Published As

Publication number Publication date
CN111212061A (zh) 2020-05-29

Similar Documents

Publication Publication Date Title
JP7137430B2 (ja) データ記憶装置及びブリッジ装置
WO2022095348A1 (zh) 一种计算资源的远程映射方法、装置、设备及存储介质
Cerović et al. Fast packet processing: A survey
US9100349B2 (en) User selectable multiple protocol network interface device
US7937447B1 (en) Communication between computer systems over an input/output (I/O) bus
US10609125B2 (en) Method and system for transmitting communication data
WO2014206105A1 (zh) 虚拟交换方法、相关装置和计算机系统
US11895027B2 (en) Methods and systems for service distribution using data path state replication and intermediate device mapping
CN106534178B (zh) RapidIO网络通用套接字的实现系统及方法
JP2004534311A (ja) 共有属性に基づいて圧縮キューペアから複数の仮想キューペアを作成する構成
CN111212061B (zh) 基于afdx的套接字的实现方法
US11902184B2 (en) Methods and systems for providing a virtualized NVMe over fabric service
WO2022032984A1 (zh) 一种mqtt协议仿真方法及仿真设备
US11949589B2 (en) Methods and systems for service state replication using original data packets
Mishra et al. REoN: A protocol for reliable software-defined FPGA partial reconfiguration over network
US11593294B2 (en) Methods and systems for loosely coupled PCIe service proxy over an IP network
US10761939B1 (en) Powering-down or rebooting a device in a system fabric
US6438146B1 (en) Multiplexed asynchronous serial communication systems methods and computer program products
Steinert et al. Hardware and software components towards the integration of network-attached accelerators into data centers
CN113285839A (zh) 基于dpdk的可编程数据平面软件交换机的设计方法
KR20120012354A (ko) 부하 절감형 toe 네트워크 장치
CN113132478A (zh) 基于OpenCL实现证券交易系统中Binary协议行情加速解码的系统
Pillutla et al. FPGA Implementation of High-speed Communication End System (ES) Interface for Avionics Application
IM management, device management, virtual file system management and other functions. Configurable components are components that provide specific functional requirements for different airborne software, mainly including C
Cerović Resilient and highly performant network architecture for virtualized data centers

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant