[nff

编程入门 行业动态 更新时间:2024-10-22 11:22:26

[<a href=https://www.elefans.com/category/jswz/34/1722550.html style=nff"/>

[nff

以下是我自己翻译的nff-go的github: 的readme文件,自己mark用,翻译错的还请指出。

Go语言的网络功能框架(前YANFF)

好消息:我们现在支持AF_XDP,也(几乎)支持直接从Linux中获取包了。所以你不必再写3种不同的应用来处理来自不同类型PMD驱动的数据包了。你只需要用NFF-Go编写所有内容,它就可以动态的使用你想要的任何东西。如果有需要,请联系 我们。

它是什么

NFF-Go是一组用于创建和部署本地云网络功能(NFs)的库。它在不牺牲性能的情况下简化了网络功能的创建。

  • 比DPDK更高级的抽象。使用DPDK作为性能的快速I/O引擎
  • Go语言:安全,生产力,性能,并发
  • 网络功能是应用程序而不是虚拟机
  • 内置调度程序,基于输入流量进行自动缩放处理。上下都有。

优势:

  • 轻松利用英特尔硬件功能:多核、AES-NI、CAT、QAT、DPDK
  • 代码行减少10倍
  • 不需要成为网络编程专家也能开发高性能网络函数
  • 与C/DPDK有相似的性能
  • 无须担心弹性----自动完成
  • 利用本地云部署:持续交付、微服务、容器

感觉不同

基于ACL的简单防火墙

func main() {// Initialize NFF-GO library to use 8 cores max.config := flow.Config{CPUCoresNumber: 8,}flow.CheckFatal(flow.SystemInit(&config))// Get filtering rules from access control file.L3Rules, err := packet.GetL3ACLFromORIG("Firewall.conf")flow.CheckFatal(err)// Receive packets from zero port. Receive queue will be added automatically.inputFlow, err := flow.SetReceiver(uint8(0))flow.CheckFatal(err)// Separate packet flow based on ACL.rejectFlow, err := flow.SetSeparator(inputFlow, L3Separator, nil)flow.CheckFatal(err)// Drop rejected packets.flow.CheckFatal(flow.SetStopper(rejectFlow))// Send accepted packets to first port. Send queue will be added automatically.flow.CheckFatal(flow.SetSender(inputFlow, uint8(1)))// Begin to process packets.flow.CheckFatal(flow.SystemStart())
}// User defined function for separating packets
func L3Separator(currentPacket *packet.Packet, context flow.UserContext) bool {currentPacket.ParseL4()// Return whether packet is accepted or not. Based on ACL rules.return currentPacket.L3ACLPermit(L3Rules)
}

NFF-Go是一个开源的BSD许可项目,主要在Linux用户区运行。社区提供的最新补丁和增强功能在develop分支中提供。主分支提供了适当的tag下的最新的稳定发布版本。

获取NFF-GO

从版本0.7.0开始,NFF-Go使用go.mod获取依赖,因此Go的版本需要1.11或更高。使用以下命令获取NFF-Go分支:

    git clone --recurse-submodules 

设置构建和运行环境

DPDK

NFF-GO 使用 DPDK,所以你必须设置你的系统来构建和运行DPDK。查看 System Requirements in the DPDK Getting Started Guide for Linux以获取更多信息。

NFF-Go默认用现成的的Mellanox卡支持构建的,你需要安装MLX网络驱动所需的额外依赖。在Ubuntu上它们叫做libmnl-devlibibverbs-dev。更多详细信息,请参阅MLX驱动MLX4和 MLX5各自的页面。如果这些依赖不够,并且也不需要Mellanox驱动,你可以设置变量NFF_GO_NO_MLX_DRIVERS为一些非空值来禁用MLX驱动程序编译。

pktgen也需要额外的依赖,特别是当你运行在ReadHat或者CentOS Linux发行版上时。详细信息请查看这个文件。RedHat和CentOS的LUA部分在它的结尾。

在使用make命令构建DPDK驱动后,你必须注册网卡才能使用DPDK驱动,加载必要的内核模块,并将卡绑定到模块上。查看中的 Compiling the DPDK Target from Source 和 How to get
best performance with NICs on Intel
platforms以获取更多信息。内核模块是DPDK用户模式驱动程序所必需的,它是内置的,但没有安装到内核目录中。您可以使用模块文件的完整路径加载它:

nff-go/test/dpdk/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko

Go

使用Go语言的1.11.4或者更高版本。使用以下命令查看Go的版本:

    go version

构建 NFF-GO

当Go编译器第一次运行的时候,它会下载go.mod文件中列出的全部依赖包。这个操作不能并行执行,否则Go的包缓存会损坏。因此在第一次运行make之前首先要运行go mod download。另一个选择是在第一次运行的时候使用单进程make -j1,但可能会很慢。

    cd nff-gogo mod download        # do it once before first buildmake -j8

AF_XDP 支持

AF_XDP支持是默认开启的,并且它需要你安装libbpf包。在我写这个readme的这个时刻,Ubuntu在它的包库中还没有这个包,所以需要从源码构建libbpf或者是关闭AF_XDP套接字支持。

要关闭它,需要设置NFF_GO_NO_BPF_SUPPORT 为一些非空值。当使用这个值来构建NFF_GO时,AF_XDP支持会被关闭,并且使用它会报错。

如果你想从源码构建libbpf,你可以选择以下2种方式:

  • 如果你正在使用发行版中的现有linux内核, 从Github下载libbpf, 然后执行 cd src; make; sudo make install。 将 /usr/lib64 添加到你的 ldconfig 路径。

  • 如果你从源代码构建linux内核,你可以从Linux源代码树中构建 libbpf,执行命令为 cd tools/lib/bpf; make; sudo make install install_headers。将 /usr/lib64 添加到你的 ldconfig 路径。

在Debug模式下构建 NFF-GO

	make debug -j8

运行 NFF-GO

文档

在线API文档在 godoc site中查看. API的用法在我们的 维基页面上解释了.

测试

在顶层目录中调用make构建测试框架和示例。NFF-GO分布式测试打包在Docker容器映像中。在一些包里也有单节点的单元测试,你可以使用如下命令运行:

     make testing

Docker 镜像

要在本地默认目标上创建docker映像(在/var/run/docker.sock中的默认UNIX socket或其他的已经在DOCKER_HOST变量中定义了),使用make images命令。

要在分布式测试中部署并使用Docker镜像,使用make deploy命令。这个命令需要2个环境变量:

  • NFF_GO_HOSTS=“hostname1 hostname2 … hostnameN”* - 部署测试Docker镜像所需的全部主机名的列表
  • DOCKER_PORT=2375* - 连接在NFF_GO_HOSTS变量中声明的主机上运行的Docker daemon的端口号

要删除默认Docker目标中生成的图像,使用make clean-images命令。

运行测试

在Docker镜像上部署完全部测试主机后,你可以运行分布式网络测试了。这个测试框架在test/main目录下,可以接受一个带有测试规范的JSON文件。在同一目录中有性能和稳定性测试的预定义配置。要运行这些测试,把hostname1hostname2改成JSON文件里的NFF_GO_HOSTS列表里的主机。

清理

要清理全部已生成的二进制文件,使用make clean命令。要删除全部在NFF_GO_HOSTS里列出的已部署的镜像,使用make cleanall命令。

Contributing

If you want to contribute to NFF-Go, check our Contributing guide. We also recommend checking the bugs with ‘help-wanted’ or ‘easyfix’ in our list of open issues; these bugs can be solved without an extensive knowledge of NFF-Go. We would love to help you start contributing.

You can reach the NFF-Go development team via our mailing list.

更多推荐

[nff

本文发布于:2024-03-08 21:59:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1722548.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:nff

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!