|
|
|
@ -1,416 +1,268 @@
|
|
|
|
|
%# -*- coding: utf-8-unix -*-
|
|
|
|
|
|
|
|
|
|
\chapter{FAST软件编程入门指南}
|
|
|
|
|
\label{app:fast}
|
|
|
|
|
|
|
|
|
|
\subsection{前言}
|
|
|
|
|
|
|
|
|
|
本文档的主要阅读对象是首次使用FAST平台进行软件开发的工作人员。
|
|
|
|
|
文档主要描述了FAST架构软件的主要功能、如何获取软件代码、
|
|
|
|
|
介绍软件架构与对应代码结构、编译运行FAST代码。
|
|
|
|
|
详细介绍了FAST开发的主要使用函数,
|
|
|
|
|
描述了用户如何使用开发函数进行自己代码的开发流程,
|
|
|
|
|
最后提供一个完整的开发示例说明,供初学者学习使用。
|
|
|
|
|
|
|
|
|
|
\subsection{FAST能做什么}
|
|
|
|
|
|
|
|
|
|
FAST平台的主要功能是软硬件配合的网络分组处理功能,
|
|
|
|
|
硬件的主要作用是解析报文,对报文进行查表匹配,
|
|
|
|
|
进行指定的动作处理,然后分发报文。
|
|
|
|
|
报文分发可以直接转发到硬件端口,也可以送到CPU端的UA进程再处理,
|
|
|
|
|
UA处理完成后可以再通过硬件转发从端口输出。
|
|
|
|
|
软件的主要功能有两点:
|
|
|
|
|
一是对硬件的流表与对应动作进行配置,指定报文从硬件端口转发或送到CPU端的UA;
|
|
|
|
|
二是处理硬件无法处理的报文,处理完成后再转发到硬件输出。
|
|
|
|
|
|
|
|
|
|
FAST软件的编程主要包括UA编程、规则管理编程和寄存器访问控制编程。
|
|
|
|
|
UA编程主要处理硬件送到指定软件的分组数据;
|
|
|
|
|
规则管理编程主要是对硬件流表的读写管理;
|
|
|
|
|
寄存器访问控制编程主要是对硬件各寄存器资源的访问控制。
|
|
|
|
|
对硬件规则的读写与对硬件其他寄存器的读写需要了解FAST架构的虚拟地址空间定义。
|
|
|
|
|
|
|
|
|
|
\subsection{FAST代码结构}
|
|
|
|
|
|
|
|
|
|
\subsubsection{目录结构}
|
|
|
|
|
|
|
|
|
|
% \renewcommand{\arraystretch}{1.5}
|
|
|
|
|
\begin{table}[!ht]
|
|
|
|
|
\small
|
|
|
|
|
\centering
|
|
|
|
|
\caption{FAST代码目录结构}
|
|
|
|
|
\label{tab:a:fast_dir-structure}
|
|
|
|
|
\begin{tabular}{|c|c|c|} \hline
|
|
|
|
|
\heiti 序号 & \heiti 目录名称 & \heiti 说明\\ \hline
|
|
|
|
|
1 & include & 开发所用头文件目录\\ \hline
|
|
|
|
|
2 & lib & ua、寄存器读写库目录\\ \hline
|
|
|
|
|
4 & app & fast应用工具\\ \hline
|
|
|
|
|
6 & tools & 调试测试示例工具\\ \hline
|
|
|
|
|
7 & src & 综合示例代码测试\\ \hline
|
|
|
|
|
\end{tabular}
|
|
|
|
|
\end{table}
|
|
|
|
|
|
|
|
|
|
\subsubsection{头文件}
|
|
|
|
|
\chapter{FAST平台介绍与操作说明手册}
|
|
|
|
|
\label{app:openbox}
|
|
|
|
|
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item \textbf{fast\_vaddr.h:}FAST平台硬件资源访问对应的虚拟地址空间定义;
|
|
|
|
|
\item \textbf{fast\_type.h:}FAST平台所用数据类型定义;
|
|
|
|
|
\item \textbf{fast\_err.h:}FAST平台错误号定义;
|
|
|
|
|
\item \textbf{fast\_struct.h:}FAST平台数据结构类型定义;
|
|
|
|
|
\item \textbf{fast.h:}FAST平台所有开发函数定义,包含上述所有头文件;
|
|
|
|
|
\item \textbf{其他:}不同平台的适配头文件。
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
\subsection{FAST简介}
|
|
|
|
|
|
|
|
|
|
针对近年来关于工业控制网络创新技术、创新网络结构、时间敏感网络、SDN网络、FPGA硬件加速技术及下一代网络技术的研究需求,由国防科大与湖南新实共同发起的开源项目——FAST(FPGA Accelerated Switcing plaTform)于2016年创建。截止到目前,该开源项目已经服务全国多所高校和科研院所的网络教学实验建设和科研项目。
|
|
|
|
|
|
|
|
|
|
\subsubsection{库文件}
|
|
|
|
|
FAST开源项目的诞生与发展深受斯坦福大学Nick Mckeown教授在NetFPGA项目、OpenFlow项目和P4等项目的影响,其目标是为计算机网络的科研与教学提供一个开源和开放的软硬件全功能可编程交换平台。其主要特点如下:
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item \textbf{libreg:}libreg主要是用来实现对硬件寄存器读写动作的封装,底层支持标准PCIe设备的寄存器读写和NetMagic08使用NMAC方式的寄存器读写。在FAST平台所有对硬件的寄存器读写全部封装为统一的接口函数,主要包括硬件资源初始化、寄存器读和寄存器写等函数。用户只需要根据此接口函数读写寄存器即可,底层具体实现用户可以不用关心;
|
|
|
|
|
\item \textbf{librule:}librule主要是实现对硬件流表规则的软件抽象与具体实现,该规则库实现了一种与硬件对应的流表字段序列,仅是一种参考实现。用户可根据硬件查表关键字来重新定义规则字段序列,但必须要求硬件字段序列与软件字段序列一一对应,包括比特位宽与大小端定义。该库封装了规则的基本操作函数,如初始化规则、添加规则、修改规则和删除规则;
|
|
|
|
|
\item \textbf{libua:}libua主要是用来支持多用户对不同特征流的处理开发和同一特征流在不同用户进程段流水处理开发。该库的主要功能是使用规则配置的方式设置与用户关联的特征流属性,并提供用户接收与发送该属性特征流的开发接口,实现用户对特征流的接收、处理与发送操作。该库主要封装了UA的初始化函数、流处理回调函数、分组发送函数等。
|
|
|
|
|
\item \textbf{FPGA:}FAST实现的核心载体是可编程FPGA,是用Verilog语言编程实现的硬件功能。FPGA的现场可编程特性为实现用户创新的网络架构、算法、实现机制提供了极大的灵活性,而且可以获得较高的性能,支持在实际网络中部署运行;
|
|
|
|
|
|
|
|
|
|
\item \textbf{Accelerated:}PGA实现的不是网络处理的全部功能,而是部分需要硬件加速的分组处理功能。FAST的核心是一套软硬件协同的分组处理模型,用户可以通过Verilog编程实现的硬件功能的加速,也可以在现有的FAST硬件平台的CPU上编程实现特定的分组处理功能;
|
|
|
|
|
|
|
|
|
|
\item \textbf{Switching:}AST面向的领域是网络交换领域,支持各种新型交换技术,如软件定义网络(SDN)、时间敏感网络(TSN)、网络安全一体化网络甚至是智能网卡的实现研究,而不是支持以人工智能(AI)为代表的应用加速;
|
|
|
|
|
|
|
|
|
|
\item \textbf{plaTform:}与目前其他开源项目一样,FAST提供的是一个硬件平台无关的,支持用户通过软硬件编程实现其特定分组处理功能的环境。FAST通过提供标准的规范、开源的平台软硬件实现代码和demo应用,支持用户基于平台进行创新的应用开发和设备原型的快速实现。
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
\subsubsection{开发示例}
|
|
|
|
|
\subsection{FAST架构}
|
|
|
|
|
FAST平台的架构是一种通用多核CPU加FPGA形态的网络处理架构。通常对处理性能要求较高的分组处理功能由FPGA实现,对处理性能要求较低,实现复杂的功能可由CPU实现。用户既可通过扩展FPGA硬件流水线功能也可以通过CPU上编程实现对分组交换功能的扩充。该平台架构主要由硬件逻辑和软件逻辑两部分组成,实现软硬件耦合通信与支持软硬件可编程的网络创新实验系统。其中硬件包括平台相关的数据IO和FAST硬件逻辑。软件部分包括通用操作系统与FAST软件逻辑。FAST软件逻辑包括软件开发环境和UA程序。该平台,不仅支持FAST的UA编程开发,同时也支持通用Socket APP的开发与运行。
|
|
|
|
|
|
|
|
|
|
FAST交换平台的实现不依赖特定的CPU与FPGA型号,但为了更好地提供交换功能扩充能力,保证软硬件协同分组处理的基本性能,FAST的交换平台必须具有如下两个特点:
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item \textbf{所有网络接口均与FPGA相连;}
|
|
|
|
|
|
|
|
|
|
进入交换平台的分组首先送FPGA处理,离开交换平台的分组最后由FPGA发出。这样有两个优点。一是交换平台可精确获取分组接收时间以及控制发送时间,实现类似1588透明时钟的控制,支持时间敏感交换;二是平台可以支持各种新型的分组格式,支持内容中心网络(ICN)等非IP交换。
|
|
|
|
|
\item \textbf{FPGA通过高带宽总线与CPU连接。}
|
|
|
|
|
|
|
|
|
|
与传统交换芯片通过低带宽的SPI总线、以太网或是单Lane的PCIE总线与控制CPU连接不同,FAST平台中FPGA通过高带宽的总线与CPU连接,提升软硬件协同分组处理的性能,支持通过CPU软件对数据平面处理功能进行扩展。
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
开发示例提供了一个基于FAST架构的二层交换机实例,
|
|
|
|
|
综合使用了libreg和libua两个库实现了一个全软件的二层交换机功能。
|
|
|
|
|
|
|
|
|
|
FAST交换平台的实现架构如图\ref{fig:a:ob_FAST-Ac}所示。
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{FAST-Ac}
|
|
|
|
|
\caption{FAST平台实现架构图}
|
|
|
|
|
\label{fig:a:ob_FAST-Ac}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
平台硬件逻辑分为两部分:一部分是平台相关的外围接口和与平台CPU互联的高速总线接口逻辑,统称为FPGA OS。其主要实现平台相关,交换功能无关的分组处理,如网络接口的接收与发送、CPU的DMA引擎以及FPGA片外或片内实现的TCAM查表功能等;另一部分是用户模块逻辑UM,其主要实现交换相关的网络功能,每一个小的流水线模块称为硬件应用(HA),如分组解析、关键字提取、转发查表、动作执行和输出控制等。用户可在UM模块中扩展HA流水线实现不同的分组处理功能。
|
|
|
|
|
|
|
|
|
|
平台软件逻辑分为三部分:一是平台相关驱动,由厂商实现其具体平台的硬件数据IO驱动,一般包含PCIe驱动、DMA驱动和以太网驱动;二是FAST分组分派模块,主要实现内核应用模块、协议栈模块和用户应用(UA)和底层驱动的数据分派功能;三是FAST分组应用,主要包括在通过标准内核协议栈支持的通用SOCKET应用(CA)、内核编程开发的内核应用(KA)和基于FAST快速IO编程开发的用户应用。
|
|
|
|
|
|
|
|
|
|
FAST平台的分组处理功能分布在硬件HA和软件的KA、CA及UA,各功能模块之间的转发和连接关系可由模块的ID号与下一组模块ID号关联配置,实现分组数据在FAST平台的处理流水线模块排列如图\ref{fig:a:ob_FAST-Pkt-Proc}所示效果。
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{FAST-Pkt-Proc}
|
|
|
|
|
\caption{FAST分组处理流水线排列图}
|
|
|
|
|
\label{fig:a:ob_FAST-Pkt-Proc}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\subsection{平台应用}
|
|
|
|
|
由于FAST平台架构的特征,其应用开发可以是软件开发、硬件开发或软硬件结合开发,具体根据平台应用场景和用户具体需求而定。
|
|
|
|
|
FAST项目自创立至今,已经在传统网络应用、工业互联网和创新网络架构设计等方面得到了广泛应用。通过在不同领域的应用积累了大量网络教学实验案例,如网络协议分析与编程、协议攻击与防护、路由器系统设计与实现、SDN交换机设计与实现、网络高精度测量、时间敏感网络设计与实现、高性能网络IO和网络应用的硬件卸载加速等。
|
|
|
|
|
|
|
|
|
|
\subsection{平台使用}
|
|
|
|
|
FAST是一个与平台无关的开源架构,根据FAST原理和规范实现的CPU+FPGA异构网络设备形态都属于FAST平台。FAST平台的CPU支持国产与非国产多种型号,FPGA也可以支持国产和非国产的多种型号。下面以下湖南新实的一款专业网络实验教学设备型号OpenBox-S4为例,说明如何使用FAST平台。
|
|
|
|
|
\subsubsection{搭建环境}
|
|
|
|
|
使用FAST平台开发和验证网络功能,需要搭建FAST环境。FAST环境包括以下三个部分:
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item l2switch
|
|
|
|
|
|
|
|
|
|
l2switch是基于FAST架构开发一个2层以太网交换机原型,
|
|
|
|
|
通过对流表默认规则的设置,将硬件所有的分组重定向到UA程序,
|
|
|
|
|
然后在UA的分组处理回调函数中实现对分组的2层交换,
|
|
|
|
|
然后将分组从指定端口发送或泛洪发送。
|
|
|
|
|
该示例主要演示了UA编程开发的主要方法与流程、使用的相关函数,
|
|
|
|
|
硬件寄存器地址的操作,以及2层交换机的实现原理。
|
|
|
|
|
|
|
|
|
|
\item xofp
|
|
|
|
|
|
|
|
|
|
xofp是基于FAST架构开发一个SDN交换机原型,
|
|
|
|
|
通过OpenFlow协议连接SDN控制器,SDN交换机默认规则是送往SDN控制器,
|
|
|
|
|
SDN控制器根据报文数据,配置流表转发下发给硬件,下次进来的报文直接转发输出。
|
|
|
|
|
该示例主要演示了SDN交换机OpenFLow协议、处理OpenFLow消息、
|
|
|
|
|
使用的相关函数,硬件寄存器地址的操作,以及SDN交换机的实现原理。
|
|
|
|
|
\item \textbf{用户操作设备:}一般是一台标准的电脑,可以是台式机或笔记本,除了基本操作IO设备外,电脑还要求至少拥有一个网口或一个USB口。该设备供用户编辑和编译软硬件逻辑代码,通过网口或串口上传和下载逻辑程序和运行结果;
|
|
|
|
|
\item \textbf{FAST平台设备:}一台符合FAST规范的可编程网络开发平台。平台支持FAST开源示例应用,可供用户基于平台进行软硬件逻辑功能的二次开发。平台至少提供一个串口和一个管理网口,用于支持用户网络远程或本地串口线登录平台进行操作;
|
|
|
|
|
\item \textbf{网络测试主机:}测试主机一般为支持网络功能的主机或嵌入式小型设备,如笔记本或树莓派。根据实验内容的不同,需要的网络测试主机数量及主机网络配置各不相同,具体参考相应的实验案例内容要求。
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
\subsubsection{工具}
|
|
|
|
|
\subsubsection{FAST平台设备}
|
|
|
|
|
OpenBox-S4设备是一款严格遵照FAST原理与架构设计的通用多核CPU+FPGA的软硬件全功能可编程网络开发平台。适合本科和研究生的计算机网络教学和新型网络交换机制的验证。
|
|
|
|
|
|
|
|
|
|
示例程序的另一种表现就是FAST提供的一些小工具,包括单独的寄存器读写命令、规则输出命令、端口状态显示命令和端口分组计数命令。
|
|
|
|
|
该设备采用Zynq-7000 SOC芯片,内嵌双核Cortex-A9 处理器,512MB DDR3内存;支持4个千兆以太网数据接口,1个千兆管理以太网接口和一个管理串口。设备外观与接口说明如图\ref{fig:a:ob_f01}和图\ref{fig:a:ob_f02}所示:
|
|
|
|
|
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item reg\_rw
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f01}
|
|
|
|
|
\caption{OpenBox-S4设备前端图}
|
|
|
|
|
\label{fig:a:ob_f01}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
该工具主要是使用libreg库实现一个对用户指定的寄存器进行读写访问操作,展示了用户如何调用libreg的相关库函数进行寄存器访问操作的方法。
|
|
|
|
|
\item rule\_hw
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f02}
|
|
|
|
|
\caption{OpenBox-S4设备后端图}
|
|
|
|
|
\label{fig:a:ob_f02}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
该工具主要是使用libreg库和librule库实现对硬件流表的获取并分组输出操作,展示了用户如何调用librule库的相关库函数进行规则操作。该工具目前只使用了硬件规则的读取操作,更多规则的功能操作可参考综合测试程序。
|
|
|
|
|
\item port\_status
|
|
|
|
|
在实验过程中,测试主机设备通常连接在设备的数据接口位置,用户操作管理设备时通过管理网口或串口连接。
|
|
|
|
|
|
|
|
|
|
该工具主要使用libreg库实现了对各端口的协商状态、链路状态等寄存器的访问并进行各状态值的解释。主要展示了不同端口状态的寄存器地址如何计算,各状态寄存器值返回如何解释,示例代码中包含了目前支持的所有状态寄存器及对应功能说明。
|
|
|
|
|
\item port\_counts
|
|
|
|
|
\subsubsection{登录设备平台}
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item 串口方式
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item 连接串口线;
|
|
|
|
|
|
|
|
|
|
设备使用标准USB口和Micro USB接口的线作为串口连接线,标准USB口连接在用户操作设备上,Mirco USB接口与设备对应串口连接。
|
|
|
|
|
\item 打开并配置串口工具。
|
|
|
|
|
|
|
|
|
|
在用户操作设备上打开串口工具,配置好相应串口参数后打开串口,即可通过串口管理设备。以putty为例,其配置参数如图\ref{fig:a:ob_f11}所示:
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f11}
|
|
|
|
|
\caption{串口工具参数配置图}
|
|
|
|
|
\label{fig:a:ob_f11}
|
|
|
|
|
\end{figure}
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
该工具主要使用libreg库实现了对各端口分组计数的统计显示,主要展示了不同功能计数统计的寄存器虚拟地址空间定义,各端口对应功能寄存器的计算方法。示例代码中包含了目前支持的所有功能计数统计寄存器定义与说明。
|
|
|
|
|
\item 管理网口方式
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item 连接网线;
|
|
|
|
|
|
|
|
|
|
使用一根RJ45端口的网线,分别连接在用户操作主机端与设备的管理网口(MGMT),网口出现指示灯闪烁说明连接正常。
|
|
|
|
|
\item 配置主机端IP信息。
|
|
|
|
|
|
|
|
|
|
通过网连接连接设备,必须确保用户操作主机与设备管理网口在相同的网段,如不记得管理网口的IP,可以通过串口方式查看。设备默认网段为192.168.50.0网段,故用户操作主机的IP地址配置信息参考如图\ref{fig:a:ob_f12}所示:
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f12}
|
|
|
|
|
\caption{网口连接的主机IP配置图}
|
|
|
|
|
\label{fig:a:ob_f12}
|
|
|
|
|
\end{figure}
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
\subsubsection{综合测试}
|
|
|
|
|
\subsubsection{测试二层交换功能}
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item 搭建二层交换拓扑
|
|
|
|
|
|
|
|
|
|
综合测试程序包含了libreg、librule和libua库的综合开发示例功能。
|
|
|
|
|
首先,用户可以通过此程序了解各功能库的主要使用函数及调用顺序;
|
|
|
|
|
其次,用户可以通过此程序的编译参数了解不同功能库如何添加对应库功能支持。
|
|
|
|
|
|
|
|
|
|
\subsection{FAST代码运行}
|
|
|
|
|
二层交换实验的两台测试主机可以随意连接到设备的数据接口位置(网口0到网口4均可)。测试主机的IP地址配置及连接拓扑如图\ref{fig:a:ob_f15}所示:
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f15}
|
|
|
|
|
\caption{二层交换连接拓扑示意图}
|
|
|
|
|
\label{fig:a:ob_f15}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\subsubsection{软硬件环境}
|
|
|
|
|
该平台可通过采购或免费申请试用获取,用户拿到FAST平台后,
|
|
|
|
|
默认系统环境均已支持FAST硬件基础版本与FAST软件基础版本。
|
|
|
|
|
FAST硬件基础版本是指基于FAST的标准5级流水线功能;
|
|
|
|
|
FAST软件基础版本是指FAST-XXX软件版本。
|
|
|
|
|
\item 在OpenBox-S4上运行二层交换程序
|
|
|
|
|
|
|
|
|
|
如果用户只需要了解软件功能,可以不用FAST设备,
|
|
|
|
|
FAST软件可在通用Linux系统中进行编译与测试,
|
|
|
|
|
没有硬件平台的软件代码,不能进行硬件寄存器读写、规则配置与报文收发功能。
|
|
|
|
|
用串口或网线连接用户操作主机与设备,通过串口登录界面或网络登录界面控制设备,在界面终端输入命令:l2switch,如图\ref{fig:a:ob_f16}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f16}
|
|
|
|
|
\caption{二层交换命令启动输出图}
|
|
|
|
|
\label{fig:a:ob_f16}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\subsubsection{代码编译}
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item 解压代码
|
|
|
|
|
\begin{code}[console]
|
|
|
|
|
openbox@OpenBox~/hnxs$ tar –zxf fast-0.4.5.tar.gz
|
|
|
|
|
\end{code}
|
|
|
|
|
\item 配置环境
|
|
|
|
|
\begin{code}[console]
|
|
|
|
|
openbox@OpenBox~/hnxs/fast-0.4.5$ ./configure
|
|
|
|
|
\end{code}
|
|
|
|
|
\item 编译
|
|
|
|
|
\begin{code}[console]
|
|
|
|
|
openbox@OpenBox~/hnxs/fast-0.4.5$ make
|
|
|
|
|
\end{code}
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
\item 在PC两端进行PING测试
|
|
|
|
|
|
|
|
|
|
\subsubsection{代码执行}
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item 读硬件版本号
|
|
|
|
|
\begin{code}[console]
|
|
|
|
|
openbox@OpenBox~/hnxs/fast-0.4.5$ reg_rw rd 0
|
|
|
|
|
\end{code}
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
在主机B的CMD (命令提示符) 程序中。输入并执行命令ping 192.168.1.111 即可测试两台主机之间的联通性。测试结果如图\ref{fig:a:ob_f17}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f17}
|
|
|
|
|
\caption{二端主机PING通结果图(二层交换)}
|
|
|
|
|
\label{fig:a:ob_f17}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\subsection{FAST数据结构}
|
|
|
|
|
\subsubsection{UM数据结构}
|
|
|
|
|
\begin{code}[c]
|
|
|
|
|
struct um_metadata{
|
|
|
|
|
u64 ts:32, /**< @brief 时间戳*/
|
|
|
|
|
reserve:17, /**< @brief 保留*/
|
|
|
|
|
pktsrc:1, /**< @brief 分组的来源,0为网络接口输入,1为CPU输入*/
|
|
|
|
|
flowID:14; /**< @brief 流ID*/
|
|
|
|
|
u64 seq:8, /**< @brief 分组接收序列号*/
|
|
|
|
|
pst:8, /**< @brief 标准协议类型(参考硬件定义)*/
|
|
|
|
|
dstmid:8, /**< @brief 下一个处理分组的模块ID*/
|
|
|
|
|
srcmid:8, /**< @brief 最近一次处理分组的模块ID*/
|
|
|
|
|
len:12, /**< @brief 报文长度*/
|
|
|
|
|
discard:1, /**< @brief 丢弃位*/
|
|
|
|
|
priority:3, /**< @brief 分组优先级*/
|
|
|
|
|
outport:6, /**< @brief 单播:分组输出端口ID,组播/泛洪:组播/泛洪表地址索引*/
|
|
|
|
|
outtype:2, /**< @brief 输出类型,00:单播,01:组播,10:泛洪,11:从输入接口输出*/
|
|
|
|
|
inport:6, /**< @brief 分组的输入端口号*/
|
|
|
|
|
pktdst:1, /**< @brief 分组目的,0为网络接口输出,1为送CPU*/
|
|
|
|
|
pkttype:1; /**< @brief 报文类型,0:数据报文,1:控制报文。硬件识别报文类别后,会将pktsrc位交换到此,恢复硬件数据格式*/
|
|
|
|
|
u64 user[2]; /**< @brief 用户自定义metadata数据格式与内容 @remarks 此字段由可用户改写,但需要保证数据大小严格限定在16字节*/
|
|
|
|
|
};
|
|
|
|
|
\end{code}
|
|
|
|
|
\subsubsection{FAST报文数据结构}
|
|
|
|
|
\begin{code}[c]
|
|
|
|
|
struct fast_packet
|
|
|
|
|
{
|
|
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
struct um_metadata um; /**< @brief UM模块数据格式定义 @see ::um_metadata */
|
|
|
|
|
struct ctl_metadata cm; /**< 控制报文格式定义*/
|
|
|
|
|
struct common_metadata md; /**< 公共控制信息,报文类型(0:数据,1:控制)*/
|
|
|
|
|
};
|
|
|
|
|
#ifdef OPENBOX_S28
|
|
|
|
|
u16 flag; /**< @brief 2字节对齐标志,主要是为了IP地址的对齐*/
|
|
|
|
|
#endif
|
|
|
|
|
u8 data[1514]; /**< @brief 完整以太网报文数据,暂时不含CRC数据*/
|
|
|
|
|
};
|
|
|
|
|
\end{code}
|
|
|
|
|
|
|
|
|
|
\subsection{FAST开发函数}
|
|
|
|
|
|
|
|
|
|
\subsubsection{硬件资源与寄存器}
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item int fast\_init\_hw(u64 addr,u64 len);
|
|
|
|
|
|
|
|
|
|
硬件资源初始化。所有涉及到需要操作硬件寄存器、流表和动作等均需要先调用此函数,
|
|
|
|
|
实例化硬件资源,使软件具体访问硬件的能力。
|
|
|
|
|
|
|
|
|
|
参数:addr,在PCIe标准设备中表示硬件资源的内存映射地址,
|
|
|
|
|
通常情况下,用户可以直接填写0。
|
|
|
|
|
|
|
|
|
|
参数:len,在PCIe标准调和中表示硬件资源的内存地址空间大小,
|
|
|
|
|
通常情况下,用户可以直接填写0。
|
|
|
|
|
|
|
|
|
|
返回值:0表示硬件资源实例化正常,非零表示失败,
|
|
|
|
|
如果失败将无法对硬件进行任何操作,程序将自动退出。
|
|
|
|
|
\item void fast\_distroy\_hw(void);
|
|
|
|
|
|
|
|
|
|
硬件资源销毁。PCIe设备主要是撤销对硬件资源的映射,
|
|
|
|
|
OpenBox-S4主要是对设备发送关闭报文。
|
|
|
|
|
一般情况下,用户程序退出时应该调用此函数,释放资源。
|
|
|
|
|
但是我们内部并没有做特殊的资源处理,均为系统可自动回收功能,
|
|
|
|
|
即使用户不调用此函数,当程序正常退出时,系统也能正常回收资源,
|
|
|
|
|
不影响程序再次运行使用。
|
|
|
|
|
\item u64 fast\_reg\_rd(u64 regaddr);
|
|
|
|
|
|
|
|
|
|
寄存器读函数。读取用户指定寄存器位置的值返回。
|
|
|
|
|
该函数内部会根据平台的不同使用不同的方法去访问硬件寄存器。
|
|
|
|
|
PCIe的平台以正常寄存器方式访问,而NetMagic~08需要使用NMAC报文进行交互获取。
|
|
|
|
|
这些不同的操作方式均已对用户屏蔽,用户无需关心该函数底层如何交互与实现,
|
|
|
|
|
仅需调用此函数接口来操作寄存器读操作即可。
|
|
|
|
|
|
|
|
|
|
参数:regaddr,表示用户将要读取的寄存器地址,
|
|
|
|
|
该地址即FAST平台所定义的虚拟地址空间,该值均使用相对偏移值的方式使用,
|
|
|
|
|
即FAST平台定义的值,对PCIe平台设备访问需要使用绝对地址访问才可以正常访问寄存器,
|
|
|
|
|
相对地址转绝对地址已经封装在函数内部,
|
|
|
|
|
用户对所有寄存器的操作均可只用相对值访问即可。
|
|
|
|
|
|
|
|
|
|
返回值:返回该寄存器对应的值。该值的位宽是64位,
|
|
|
|
|
在所有FAST平台寄存器的位宽均为64位。
|
|
|
|
|
\item void fast\_reg\_wr(u64 regaddr,u64 regvalue)。
|
|
|
|
|
|
|
|
|
|
寄存器写函数。将指定值写对硬件对应的寄存器位置。
|
|
|
|
|
该函数内部会根据平台的不同使用不同的方法去操作硬件寄存器。
|
|
|
|
|
PCIe的平台以正常寄存器方式访问,而NetMagic~08需要使用NMAC报文进行交互获取。
|
|
|
|
|
这些不同的操作方式均已对用户屏蔽,用户无需关心该函数底层如何交互与实现,
|
|
|
|
|
仅需调用此函数接口来操作寄存器写操作即可。
|
|
|
|
|
|
|
|
|
|
参数:regaddr,表示用户将要写入的寄存器地址,
|
|
|
|
|
该地址即FAST平台所定义的虚拟地址空间,该值均使用相对偏移值的方式使用,
|
|
|
|
|
即FAST平台定义的值,
|
|
|
|
|
对PCIe平台设备访问需要使用绝对地址访问才可以正常访问寄存器,
|
|
|
|
|
相对地址转绝对地址已经封装在函数内部,
|
|
|
|
|
用户对所有寄存器的操作均可只用相对值访问即可。
|
|
|
|
|
|
|
|
|
|
参数:regvalue,表示要写入上述参数寄存器位置的值。该值的位宽为64位。
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
\subsubsection{流表操作}
|
|
|
|
|
|
|
|
|
|
\subsubsection{测试三层路由功能}
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item void init\_rule(u32 default\_action);
|
|
|
|
|
|
|
|
|
|
初始化规则。初始化规则函数的主要功能是在软件分配软件规则空间,
|
|
|
|
|
将硬件规则空间清零,设置硬件规则的默认动作。
|
|
|
|
|
该函数只在进行流表操作的应用中进行调用,而且只能被调用一次。
|
|
|
|
|
如果有多个应用需要操作规则,
|
|
|
|
|
整个系统在关机或重启前所有的应用中也只能由一个应用来调用一次。
|
|
|
|
|
主要是该函数会将硬件所有存在流表清空。用户需要自己非常清楚对流表的操作,
|
|
|
|
|
在一次流表清空后才可以对流表进行其他操作。
|
|
|
|
|
|
|
|
|
|
参数:default\_action,默认动作。当所有的流表均不能匹配时,
|
|
|
|
|
硬件需要执行一个默认的动作来完成这个分组的处理,
|
|
|
|
|
流表可以为空,但默认动作必须要有。详细的动作含义可以参考动作说明。
|
|
|
|
|
|
|
|
|
|
\item int fast\_add\_rule(struct fast\_rule *rule);
|
|
|
|
|
|
|
|
|
|
添加一条规则。添加规则函数,先将用户的规则添加在软件流表中,
|
|
|
|
|
经过各种比较判断后,看是否能正常添加,有无冲突或是否存在,
|
|
|
|
|
如果可以正常添加,则先将规则存储在软件,
|
|
|
|
|
然后将此条软件规则数据通过寄存器方式下发到硬件对应规则的存储位置。
|
|
|
|
|
|
|
|
|
|
参数:rule,规则对象,内部具体字段参考流规则数据结构定义。
|
|
|
|
|
|
|
|
|
|
返回值:返回当前添加规则成功后此条规则所在的索引号。
|
|
|
|
|
\item int fast\_modify\_rule(struct fast\_rule *rule,int idx);
|
|
|
|
|
|
|
|
|
|
修改一条已经存在的规则。此函数主要是用来修改已经存在的规则,
|
|
|
|
|
对其关键字、掩码、动作和优先级等进行修改。
|
|
|
|
|
该函数的索引值参数如果指向一条空规则,其操作流程将类似于添加规则函数。
|
|
|
|
|
|
|
|
|
|
参数:rule,新规则对象,内部具体字段参考流规则数据结构定义。
|
|
|
|
|
|
|
|
|
|
参数:idx,旧规则所在索引号。
|
|
|
|
|
|
|
|
|
|
返回值:返回输入参数的idx值说明操作成功,其他值说明操作失败
|
|
|
|
|
\item int fast\_del\_rule(int idx);
|
|
|
|
|
|
|
|
|
|
删除一条已经存储的规则,或将一条规则置为无效。
|
|
|
|
|
只需要提供规则所在的索引号,软件可通过索引号定位到对应硬件存储规则位置,
|
|
|
|
|
将规则的有效位置为无效,实现一条规则的删除。
|
|
|
|
|
删除硬件成功后,将其对应的软件规则进行清除。
|
|
|
|
|
|
|
|
|
|
参数:idx,删除规则所在索引号。
|
|
|
|
|
|
|
|
|
|
返回值:返回输入参数的idx值说明操作成功,其他值说明操作失败。
|
|
|
|
|
\item int read\_hw\_rule(struct fast\_rule *rule,int index);
|
|
|
|
|
|
|
|
|
|
读取一条硬件规则。将存储在硬件规则内对应索引的数据读取出来,
|
|
|
|
|
还原为一条软件规则数据,存储在用户提供的指针位置。
|
|
|
|
|
|
|
|
|
|
参数:rule,将要存储规则的内存指针。
|
|
|
|
|
|
|
|
|
|
参数:idx,将要读取规则所在硬件的索引号。
|
|
|
|
|
|
|
|
|
|
返回值:返回输入参数的idx值说明操作成功,其他值说明操作失败。
|
|
|
|
|
\item void print\_hw\_rule(void)。
|
|
|
|
|
|
|
|
|
|
打印硬件所有规则信息。此函数是上一个读取硬件规则条目信息的集合操作,
|
|
|
|
|
将所有硬件流规则信息一一读出,并打印输出在屏幕上。
|
|
|
|
|
\item 搭建三层路由拓扑
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
三层路由实验的两台测试主机要根据主机端IP地址配置和网关配置,分别连接到主机对应网关的接口上。连错线会导致实现失败。测试主机的IP地址配置及连接拓扑如图\ref{fig:a:ob_f18}所示:
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f18}
|
|
|
|
|
\caption{三层路由拓扑}
|
|
|
|
|
\label{fig:a:ob_f18}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\item OpenBox-S4上运行三层路由程序
|
|
|
|
|
|
|
|
|
|
用串口或网线连接用户操作主机与设备,通过串口登录界面或网络登录界面控制设备,在界面终端输入命令:l3router,如图\ref{fig:a:ob_f19}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f19}
|
|
|
|
|
\caption{运行三层路由程序}
|
|
|
|
|
\label{fig:a:ob_f19}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\item 在PC两端进行PING测试
|
|
|
|
|
|
|
|
|
|
在主机A的CMD (命令提示符) 程序中。输入并执行命令ping 192.168.2.119 即可测试跨路由功能。测试结果如图\ref{fig:a:ob_f20}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f20}
|
|
|
|
|
\caption{端主机PING通结果图(三层路由)}
|
|
|
|
|
\label{fig:a:ob_f20}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
\subsubsection{UA编程}
|
|
|
|
|
|
|
|
|
|
\subsubsection{测试SDN交换功能}
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item int fast\_ua\_init(int mid,fast\_ua\_recv\_callback callback);
|
|
|
|
|
|
|
|
|
|
UA编程初始化函数。
|
|
|
|
|
\item void fast\_ua\_destroy(void);
|
|
|
|
|
|
|
|
|
|
UA编程注销函数。
|
|
|
|
|
\item int fast\_ua\_send(struct fast\_packet *pkt,int pkt\_len);
|
|
|
|
|
|
|
|
|
|
UA程序发送报文函数
|
|
|
|
|
\item void fast\_ua\_recv()。
|
|
|
|
|
|
|
|
|
|
启动UA接收用户特征流程序函数
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
\item 搭建SDN交换拓扑
|
|
|
|
|
|
|
|
|
|
\subsection{FAST开发流程}
|
|
|
|
|
基于FAST的软件代码开发有三种方式:
|
|
|
|
|
第一种是基于FAST的源代码进行修改,整个代码结构不变,
|
|
|
|
|
可以直接使用原工程中的所有Makefile文件,
|
|
|
|
|
修改完成后,直接make即可得到用户所需要的可执行文件;
|
|
|
|
|
第二种是用户根据自己需要,选择需要的开发库与头文件,
|
|
|
|
|
自己重新组织新的代码目录与结构进行开发,
|
|
|
|
|
原工程中的Makefile文件均不可再用,需要自己重写Makefile文件。
|
|
|
|
|
|
|
|
|
|
\subsubsection{修改源码开发}
|
|
|
|
|
SDN交换实验的两台测试主机可以随意连接到设备的数据接口位置(网口0到网口4均可),SDN控制器主机的网线一定要连接在设备的管理网口(MGMT)。控制器主机和测试主机的IP地址配置及连接拓扑如图\ref{fig:a:ob_f21}所示:
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f21}
|
|
|
|
|
\caption{SDN交换拓扑}
|
|
|
|
|
\label{fig:a:ob_f21}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\begin{enumerate}
|
|
|
|
|
\item 以FAST的rule\_rw工具作为修改示例,
|
|
|
|
|
修改fast/tools/rule\_rw/目录下main\_rule.c文件;
|
|
|
|
|
\item 修改main\_rule\_test函数,
|
|
|
|
|
将两个端口互转硬件规则改为根据以太网类型来转发。
|
|
|
|
|
\begin{code}[c]
|
|
|
|
|
void main_rule_test(int argc,char *argv[])
|
|
|
|
|
{
|
|
|
|
|
int i = 0,p1 = 1,p2 = 2,idx1 = 0,idx2 = 1;
|
|
|
|
|
struct fast_rule rule[2] = {{0},{0}};//初始化两条全空的规则
|
|
|
|
|
|
|
|
|
|
if(argc == 3)
|
|
|
|
|
{
|
|
|
|
|
p1 = atoi(argv[1]);
|
|
|
|
|
p2 = atoi(argv[2]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//给规则的各字段赋值
|
|
|
|
|
rule[i].key.type = htole16(0x0800); //以太网类型
|
|
|
|
|
rule[i].key.port = p1;
|
|
|
|
|
rule[i].priority =0xA;
|
|
|
|
|
rule[i].action = ACTION_PORT<<28|p2;//动作字段的涵义请参考fast_type.h
|
|
|
|
|
rule[i].md5[0] = i+1;
|
|
|
|
|
|
|
|
|
|
//给规则对应字段设置掩码,掩码为1表示使用,为0表示忽略
|
|
|
|
|
rule[i].mask.type = 0xFFFF;
|
|
|
|
|
rule[i].mask.port = 0x3F;/*6bit*/
|
|
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
rule[i].key.type = htole16(0x0800);
|
|
|
|
|
rule[i].key.port = p2;
|
|
|
|
|
rule[i].priority =0xB;
|
|
|
|
|
rule[i].action = ACTION_PORT<<28|p1;//动作字段的涵义请参考fast_type.h
|
|
|
|
|
rule[i].md5[0] = i+1;
|
|
|
|
|
|
|
|
|
|
//给规则对应字段设置掩码,掩码为1表示使用,为0表示忽略
|
|
|
|
|
rule[i].mask.type = 0xFFFF;
|
|
|
|
|
rule[i].mask.port = 0x3F;
|
|
|
|
|
|
|
|
|
|
if(argc == 3)
|
|
|
|
|
{
|
|
|
|
|
fast_modify_rule(&rule[i-1],idx1);
|
|
|
|
|
fast_modify_rule(&rule[i],idx2);
|
|
|
|
|
printf("Row[%d],Port[%d]----->Port[%d]\n",idx1,p1,p2);
|
|
|
|
|
printf("Row[%d],Port[%d]----->Port[%d]\n",idx2,p2,p1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
\end{code}
|
|
|
|
|
|
|
|
|
|
修改保存退出,打开命令终端,跳到fast目录下,执行交叉编译。
|
|
|
|
|
|
|
|
|
|
\begin{code}[console]
|
|
|
|
|
# cd fast-0.4.5
|
|
|
|
|
# make
|
|
|
|
|
\end{code}
|
|
|
|
|
|
|
|
|
|
编译完成后将把tools/rule\_hw目录下rule\_hw工具放到OpenBox-S4设备,
|
|
|
|
|
执行修改过的rule\_hw工具。
|
|
|
|
|
\begin{code}[console]
|
|
|
|
|
# ./rule_hw 0 1
|
|
|
|
|
\end{code}
|
|
|
|
|
\item 在SDN控制器主机中启动SDN控制器
|
|
|
|
|
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
在终端命令行下输入 java –jar target/floodlight.jar,即启动floodlight控制器。如图\ref{fig:a:ob_f22}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f22}
|
|
|
|
|
\caption{启动floodlight控制器}
|
|
|
|
|
\label{fig:a:ob_f22}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\item 在设备平台上运行SDN交换程序
|
|
|
|
|
|
|
|
|
|
在串口登录界面或网络登录界面输入命令:xofp -4 192.168.1.3 –i obx0,obx1,obx2,obx3 , 连接Floodlight控制器。如图\ref{fig:a:ob_f23}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f23}
|
|
|
|
|
\caption{运行SDN交换程序}
|
|
|
|
|
\label{fig:a:ob_f23}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\item 访问floodlight控制器首页
|
|
|
|
|
|
|
|
|
|
在控制器主机打开浏览器,在浏览器地址栏输入:127.0.0.1:8080/ui/index.html ,访问floodlight控制器首页。界面如图\ref{fig:a:ob_f24}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f24}
|
|
|
|
|
\caption{访问floodlight控制器首页}
|
|
|
|
|
\label{fig:a:ob_f24}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\item 在PC两端进行PING测试
|
|
|
|
|
|
|
|
|
|
在主机A的CMD (命令提示符) 程序中。输入并执行命令ping 192.168.2.119 即可测试两台主机之间的联通性。测试结果如图\ref{fig:a:ob_f25}所示:
|
|
|
|
|
|
|
|
|
|
\begin{figure}[!ht]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=11cm]{f25}
|
|
|
|
|
\caption{端主机PING通结果图(SDN交换)}
|
|
|
|
|
\label{fig:a:ob_f25}
|
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
|
|
\subsubsection{编译代码}
|
|
|
|
|
在fast代码的根目录执行编译命令。
|
|
|
|
|
\begin{code}[console]
|
|
|
|
|
# make clean
|
|
|
|
|
# make
|
|
|
|
|
\end{code}
|
|
|
|
|
\subsection{FAST开源社区}
|
|
|
|
|
由于FAST架构设计的独特优势,用户无需关心平台的分组网络IO、存储和加速方法,只专注于创新架构的设计和核心技术研究,极大的加快网络创新技术的落地与应用。来自全国的近100家的高校、科研院所和设备厂商单位都加入的FAST开源社区。FAST开源社区致力于网络领域的基础网络技术分析与实现,热门网络技术跟踪研究与原型实现和未来网络技术探索与研究。更多的网络前沿技术及FAST的实现方法以及FAST的编程开发方法请关注FAST社区公众号及相关服务网站。
|
|
|
|
|
\begin{figure}[H]
|
|
|
|
|
\centering
|
|
|
|
|
\includegraphics[width=5cm]{fast-w}
|
|
|
|
|
\caption{FAST公众号}
|
|
|
|
|
\label{fig:a:ob_fast-w}
|
|
|
|
|
\end{figure}
|
|
|
|
|
FAST官网:http://www.fastswitch.org
|
|
|
|
|