调整FAST介绍手册文件名,调整部分图片格式,移除不需要的图片

merge-requests/11/head
xphi 4 years ago
parent f552f6edaf
commit 9f2859956c

@ -77,11 +77,7 @@
\input{../data/appendix/ensp}
% FAST平台介绍与操作说明手册
\graphicspath{{../figure/appendixes/openbox/}}
\input{../data/appendix/openbox}
% FAST软件编程入门指南
% \graphicspath{{../figure/appendixes/fast/}}
% \input{../data/appendix/fast}
\graphicspath{{../figure/appendixes/fast/}}
\input{../data/appendix/fast}
\end{document}

@ -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硬件加速技术及下一代网络技术的研究需求由国防科大与湖南新实共同发起的开源项目——FASTFPGA 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原理和规范实现的CPUFPGA异构网络设备形态都属于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原理与架构设计的通用多核CPUFPGA的软硬件全功能可编程网络开发平台。适合本科和研究生的计算机网络教学和新型网络交换机制的验证。
示例程序的另一种表现就是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软件基础版本是指FASTXXX软件版本。
\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

@ -1,268 +0,0 @@
%# -*- coding: utf-8-unix -*-
\chapter{FAST平台介绍与操作说明手册}
\label{app:openbox}
\subsection{FAST简介}
针对近年来关于工业控制网络创新技术、创新网络结构、时间敏感网络、SDN网络、FPGA硬件加速技术及下一代网络技术的研究需求由国防科大与湖南新实共同发起的开源项目——FASTFPGA Accelerated Switcing plaTform于2016年创建。截止到目前该开源项目已经服务全国多所高校和科研院所的网络教学实验建设和科研项目。
FAST开源项目的诞生与发展深受斯坦福大学Nick Mckeown教授在NetFPGA项目、OpenFlow项目和P4等项目的影响其目标是为计算机网络的科研与教学提供一个开源和开放的软硬件全功能可编程交换平台。其主要特点如下
\begin{enumerate}
\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}
\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交换平台的实现架构如图\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原理和规范实现的CPUFPGA异构网络设备形态都属于FAST平台。FAST平台的CPU支持国产与非国产多种型号FPGA也可以支持国产和非国产的多种型号。下面以下湖南新实的一款专业网络实验教学设备型号OpenBox-S4为例说明如何使用FAST平台。
\subsubsection{搭建环境}
使用FAST平台开发和验证网络功能需要搭建FAST环境。FAST环境包括以下三个部分
\begin{enumerate}
\item \textbf{用户操作设备:}一般是一台标准的电脑可以是台式机或笔记本除了基本操作IO设备外电脑还要求至少拥有一个网口或一个USB口。该设备供用户编辑和编译软硬件逻辑代码通过网口或串口上传和下载逻辑程序和运行结果
\item \textbf{FAST平台设备}一台符合FAST规范的可编程网络开发平台。平台支持FAST开源示例应用可供用户基于平台进行软硬件逻辑功能的二次开发。平台至少提供一个串口和一个管理网口用于支持用户网络远程或本地串口线登录平台进行操作
\item \textbf{网络测试主机:}测试主机一般为支持网络功能的主机或嵌入式小型设备,如笔记本或树莓派。根据实验内容的不同,需要的网络测试主机数量及主机网络配置各不相同,具体参考相应的实验案例内容要求。
\end{enumerate}
\subsubsection{FAST平台设备}
OpenBox-S4设备是一款严格遵照FAST原理与架构设计的通用多核CPUFPGA的软硬件全功能可编程网络开发平台。适合本科和研究生的计算机网络教学和新型网络交换机制的验证。
该设备采用Zynq-7000 SOC芯片内嵌双核Cortex-A9 处理器512MB DDR3内存支持4个千兆以太网数据接口1个千兆管理以太网接口和一个管理串口。设备外观与接口说明如图\ref{fig:a:ob_f01}和图\ref{fig:a:ob_f02}所示:
\begin{figure}[!ht]
\centering
\includegraphics[width=11cm]{f01}
\caption{OpenBox-S4设备前端图}
\label{fig:a:ob_f01}
\end{figure}
\begin{figure}[!ht]
\centering
\includegraphics[width=11cm]{f02}
\caption{OpenBox-S4设备后端图}
\label{fig:a:ob_f02}
\end{figure}
在实验过程中,测试主机设备通常连接在设备的数据接口位置,用户操作管理设备时通过管理网口或串口连接。
\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}
\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{测试二层交换功能}
\begin{enumerate}
\item 搭建二层交换拓扑
二层交换实验的两台测试主机可以随意连接到设备的数据接口位置网口0到网口4均可。测试主机的IP地址配置及连接拓扑如图\ref{fig:a:ob_f15}所示:
\begin{figure}[!ht]
\centering
\includegraphics[width=11cm]{f15}
\caption{二层交换连接拓扑示意图}
\label{fig:a:ob_f15}
\end{figure}
\item 在OpenBox-S4上运行二层交换程序
 用串口或网线连接用户操作主机与设备通过串口登录界面或网络登录界面控制设备在界面终端输入命令l2switch如图\ref{fig:a:ob_f16}所示:
\begin{figure}[!ht]
\centering
\includegraphics[width=11cm]{f16}
\caption{二层交换命令启动输出图}
\label{fig:a:ob_f16}
\end{figure}
\item 在PC两端进行PING测试
在主机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}
\end{enumerate}
\subsubsection{测试三层路由功能}
\begin{enumerate}
\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{测试SDN交换功能}
\begin{enumerate}
\item 搭建SDN交换拓扑
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}
\item 在SDN控制器主机中启动SDN控制器
 在终端命令行下输入 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}
\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

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 255 KiB

After

Width:  |  Height:  |  Size: 255 KiB

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 226 KiB

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 241 KiB

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 290 KiB

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Before

Width:  |  Height:  |  Size: 347 KiB

After

Width:  |  Height:  |  Size: 347 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Loading…
Cancel
Save