FAST SWITCH

问题一:UA编程与标准用户空间编程(socket,libnet/libpcap)有什么不同?

用户在用户空间使用UA编程,可以获取接收分组的Metadata以及指定发出分组的Metadata。

根据UM规范,UA程序可以获取接收分组的端口号,精确接收时间等信息,发送分组时,可以通过填写Metadata来指定分组输出的接口。而通常用户空间编程(socket或libnet/libpcap)难以获取这些信息。此外,UA可以利用FPGA硬件中的流表,获取指定的数据流进行处理,需要的话还可以进一步将处理功能卸载到FAST UM中进行硬件加速。

因此UA更加适合各种分组处理应用,如基于软件实现的分组交换,防火墙,以及IDS等middlebox应用。


问题二:UA必须运行在特定的可编程FPGA平台上吗?

UA的运行并不一定依赖包含FAST UM的FPGA平台。理论上,任何带有网络接口的主机都可以支持UA的运行。其原理是在linux内核中运行一个类似OpenvSwitch datapath模块的FAST UM“仿真”软件。

在分组接收侧,该软件根据UA-M(UM管理器)配置的规则将接收的分组进行分类,为送协议栈的分组申请skbuf,构成标准的驱动到协议栈的格式送协议栈处理;对于送特定UA的分组,需要根据FAST UM的规范封装metadata头,然后通过内核与用户空间的通信机制,如netlink,将分组送到用户空间。在发送侧,该软件需要根据UA发送分组的metadata信息将报文送到指定的输出接口。


问题三:为什么FAST代在fast网站(而不是在github)上共享?

原因之一是FAST UM代码是verilog代码,还没有成熟的协同开发模式。原因之二是FAST项目主要是面向科研与教学应用,社区成员主要来自学校和科研院所,而不是来自互联网企业的,具有成熟软件开发经验的工程师。因此多数成员缺乏使用github工具进行代码分享和协调开发的经验。原因之三是FAST社区交流依赖网站+微信群的模式,网站主要是信息和代码发布,微信负责社区用户的交流,比github网站提供的交流平台更加方便易用。

当然,随着FAST项目的发展,根据用户开发的需求,不排除将项目托管到类似github的开源社区上。


问题四:如何读写硬件寄存器?

用户可使用fast软件开发环境中的tools工具集中的reg_wr工具来读写硬件寄存器,具体操作如下:

用户在加载了对应的驱动后,切换至fast/tools/reg_wr目录,使用root权限输入命令:./reg_wr rd addr即可读取地址为"addr"的寄存器,读取的结果会以16进制的方式显示在屏幕上;同理,执行指令:./reg_wr wr addr value即可在地址为"addr"的寄存器上写入值为"value"的数据,工具在用户写入数据后会自动读取同地址的寄存器,并于用户输入的值做比较,如果写入数据与读出数据相同,会打印"OK"字样,否则会打印"ERR"字样。用户可能会用到的寄存器如下:

版本寄存器:OpenBox-S28平台:0x38、NetMagic08平台:0x0;

默认Action寄存器:OpenBox-S28平台和NetMagic08平台:0x201f8;

普通Action寄存器:OpenBox-S28平台和NetMagic08平台:0x20000 + 0x8*流表序号。eg:如第一条流表的Action寄存器地址为:0x20000 + 0x8 * 1 =0x20008


问题五:如何查看FAST中的版本号?

FAST架构通常分为软硬件两部分,而软件通常包含libreg、librule、libua三个基础开发库,而硬件通常包含FPGA OS以及UM两部分。它们均有各自独立的版本号,用户可采用下列方式读取它们:

软件部分:

libreg:用户在调用fast_init_hw()函数时,程序会打印libreg库的版本号;

librule:用户在调用init_rule()函数时,程序会打印librule库的版本号;

libua:用户在调用fast_ua_init()函数时,程序会打印libua库的版本号;

OpenBox-S4驱动:用户可输入命令:“modinfo /mnt/openbox/openbox-s4.ko”,系统会打印下列信息:

filename:       /openbox-s4.ko
version:        20180827
license:        GPL v2
description:    fdp ethernet driver
author:         HNXS
srcversion:     2710B1F6162EB76A660BD29
depends:        
vermagic:       4.9.0-xilinx SMP preempt mod_unload modversions ARMv7 p2v8
parm:           buf_size:Size of the memcpy test buffer (uint)
parm:           xmac:MAC ADDR (uint)
parm:           vport:Set Virtual Ether Port Count[default 4]: 1-32 (uint)

其中“version:20180827”即是驱动程序的版本号。

硬件部分:

用户可使用fast/tools/debug目录下的debug工具读取硬件逻辑的版本号。

FPGA OS:输入命令“debug 43c00000 0x1000 0”即可读取FPGA OS版本号;

UM:输入命令“debug 43c00000 0x1000 8”即可读取UM版本号。


此外,tools文件夹中还包含了FAST_version工具,支持读取所有软硬件组件的版本信息:

输入命令“./version libreg”即可读取libreg库的版本号,

输入命令“./version libua”即可读取libua库的版本号,

输入命令“./version librule”即可读取librule库的版本号,

输入命令“./version um”即可读取UM的版本号。

输入命令“./version fpgaos”即可读取FPGA OS的版本号。


问题六 安装交叉编译时出现下列问题

问题六现象.jpg



问题原因:出现该问题的原因是当前系统为64bit版本的系统,缺乏一些32bit版本的依赖库,

解决方式:用户可输入下列三条命令安装这些依赖库(需要联网):

“sudo apt-get update

sudoapt-get install libgtk2.0-0:i386 libxtst6:i386 gtk2-engines-murrine:i386 \

lib32stdc++6libxt6:i386 libdbus-glib-1-2:i386 libasound2:i386”

安装完成后即可执行安装包程序



问题七 安装交叉编译环境时出现下列问题

问题七现象.jpg

问题原因:产生该问题的原因是dpkg-reconigure命令不支持普通用户运行,导致报错。

解决方式:解决方式是输入命令:“sudo dpkg-reconfigure–plow dash”,出现如下画面:

问题七解决一.jpg

选择“否”,即可解决该问题。


问题八 配置编译环境时出现如下错误,导致配置中断,无法生成Makefile文件:

问题八现象.jpg

问题原因:

系统自带的intltool工具版本较老,无法满足项目配置条件,导致环境配置失败。

解决方法:

输入并执行命令:

问题八解决一.jpg

安装完成后重新配置,故障即可解决。


问题九 交叉编译时出现下列问题,提示找不到libpcap或libnet库文件:


问题九现象.jpg

问题原因:

在安装交叉编译环境时,用户未安装附加的lib库,导致configure完成之后,链接器无法在指定的目录找到库文件。

解决方式:

将lib.tar.gz解压到交叉编译环境的arm-xilinx-linux-gnueabi文件夹即可解决。


问题十 二层交换应用编译之后,运行时出现下列问题:

问题十现象.jpg


问题原因:

用户在编译时,调用了老版本的库文件,导致编译生成的可执行文件出现bug。

解决方式:

将交叉编译环境下arm-xilinx-linux-gnueabi中的libreg、librule、libua相关库文件和头文件删除即可。


问题十一:OpenBox-S4的硬件工程,生成bitstream时出现下列错误,如何解决呢?

问题十一现象.jpg

解决方式:删除选中的项即可

问题十一解决.jpg


问题十二:用户在烧录完成硬件代码后,运行应用出现times out报错信息,并且运行UA应用无法发送报文。

time out现象.jpg

问题原因:

由于用户在系统启动完成后重新烧录了硬件代码,导致原先已经与软件驱动协商好了DMA通信状态的硬件逻辑代码被覆盖,所以软件驱动无法通过DMA通路下发报文给硬件逻辑,当发送缓冲区被用尽,即打印times out错误。

解决方式:

用户可提前修改OpenBox-S4设备的/mnt/openbox目录下的openbox-s4.ko驱动程序的文件名,使其无法开机加载驱动,然后用户即可随意烧录硬件逻辑代码,烧录完成后,使用命令

insmod /mnt/openbox/驱动程序名

即可加载驱动,继续进行测试。


问题十三:在运行UA应用时,出现如下图所示的错误


文件编译器使用错误.jpg

问题原因:

用户在编译UA应用时,未使用交叉编译器编译源码,导致生成的可执行文件无法在OpenBox-S4设备上运行。

解决方式:

用户使用交叉编译器编译应用源码接口运行。


问题十四:在运行UA应用时,出现如下图所示的错误

未加载驱动运行UA.jpg

问题原因:

用户在运行UA应用时未加载驱动,导致UA无法与内核建立链接。

解决方式:

在运行UA前加载驱动即可。


问题十五:OpenBox-S4设备无法与直连的主机正常通信

   问题现象:用户在启动并连接好OpenBox-S4设备后,OpenBox-S4设备无法与直连的主机正常通信。

   问题原因:在系统初始化OpenBox-S4时,UM中的默认Action是置为0x0(丢弃)的,从而导致外部主机的报文无法送往OpenBox-S4的系统协议栈,从而导致无法与主机通信。

   解决方式:用户在OpenBox-S4设备启动后,用户可输入并运行如下命令:

reg_rw wr 881f8 40000080

调用reg_rw工具,手动修改默认Action的值,即可联通外部主机


问题十六 为何当前Metadata中没有时间戳信息?

解答:没有时间戳信息的原因可能是使用了错误版本的硬件逻辑文件,如需确认,用户可输入“version”命令检查版本信息,如果硬件版本号低于20181109,可以更新到最新版本硬件逻辑文件(用户可在网盘的fast>2.0>openbox-S4>lastest>*>hw文件夹中下载到最新的硬件逻辑文件),最新版本的硬件逻辑已经加入了时间戳信息。


问题十七:终止UA后反复打印下列信息:

Ctl pktUM[0]-->UA[0],NO PID[0] Data pktUM[0]-->UA[129],N0 PID[0]

解答:终止UA后出现大量上述打印信息是正常情况;原因是用户修改了硬件UM中的Action,导致链路报文被送到了操作系统中,但是由于处理该类型报文的UA已被用户终止,所以FAST驱动会提示该报文无UA进行处理。其中“UM[0]”信息是指该报文的源MID为0。


问题十八:Implementation时出现错误提示:

[Common17-55]‘set_property’expectsat least one object [OpenBox_S4.xdc960][Vivado12-1419]Debug core‘u_ila_0’was not found

解答:出现该提示的原因是用户修改了工程代码后,影响到之前设置的debug的信号,将xdc中的debug部分删除后再重新编译即可解决。


问题十九:安装Vivado时,License没有安装是否会影响使用?

解答:License必须安装,可以去网上自行寻找资源下载。


问题二十:打开硬件工程文件openbox_s4.xpr后出现错误提示

can't open  project'Openbox_s4'.Please verify that the project still exists.

解答:硬件工程应放在全英文路径中,建议检查工程目录,将中文路径更改为英文路径即可。


问题二十一:Vivado在操作过程中出现如下错误:

There was one error message  while AutoConnect[Labtools 27-2269]NO devices detected on target

解答:出现该信息,可能是设备的串口线和下载线未连接好,或设备未正常加电,建议检查设备与下载线、串口线的连接情况,并确认设备是否加电。



问题二十二:设备管理器中没有找到串口是什么原因呢?

解答:议用户检查串口是否连接正常,并且正确安装了串口的驱动程序。


问题二十三:用户在使用串口时,串口总是打印timeout是什么原因?

解答:出现该信息的原因是软件驱动加载时硬件逻辑并没有被正确初始化,通常是由于当前设备中的硬件逻辑存在问题导致的。由于系统默认开机会自动加载驱动,如果出现timeout情况,用户需要手动取消自动加载驱动,在将正确的硬件逻辑烧入设备后,再手动加载驱动,即可解决该问题,相关操作步骤如下:

  • 进入S4配置目录:cd/mnt/openbox/config

  • 打开S99hnxs文件:vi S99hnxs

  • 将开机加载驱动的insmod命令注释:

#PL obx

#insmod /mnt/openbox/openbox-s4.ko

#insmod /mnt/openbox/openbox-s4.ko xmac=0x0000004


  • 保存退出后重启设备。

  • Vivado设置好触发条件点击触发

  • 手动加载驱动:

insmod /mnt/openbox/openbox-s4.ko

reg_rw wr 1f8 40000080

ifconfig obx0 192.168.2.15

ping 192.168.2.11