UPGW 代码目录树

根目录

  • client:CLI 程序,基于 cmdline.h 库实现。

  • daemon:核心程序。

  • libs:库实现。

  • nts.cfg:NTS 配置文件。

  • Makefile

libs 目录

libs 目录下的库文件,包括:.h、.c。在整体编译时,libs 目录下的各个库会被编译成静态库、或动态库文件。其中,.h 可以被主程序 include 并调用其中声明的函数、宏和结构体,在编译 nes-daemon 时,链接器会将 include 的函数的代码通动态或静态链接合并到可执行文件中。并且这些 .a、.so 库文件的存放路径和链接路径都由 Makefile 统一管理,默认为 nes/build/lib。

  • libnes_acl:基于 rte_acl.h,数据报文转发控制。

  • libnes_api:UPGW API 客户端接口库,封装了 traffic_rule、dns_rule、acl_rule 等接口,会被外部程序导入并使用其中的接口函数,e.g. nes/client、nts-support-api,并根据配置 Section [NES_SERVER] 向指定的 Socket 发送请求。

  • libnes_api_share:同 libnes_api,区别在于编译出来的是 .so 共享库文件。

  • libnes_cfgfile:基于 rte_cfgfile.h,配置文件内容 CRUD。

  • libnes_daemon:(已弃用)程序 Daemonize 的实现。

  • libnes_lookup:基于 rte_hash_crc.h、rte_hash.h、rte_jhash.h、rte_malloc.h、rte_memcpy.h,用于管理各种 Rules 在内存中的 HASH 表。

  • libnes_queue:实现一个多线程安全的 Queue 数据结构和 Enqueue(入队)、Dnqueue(出队)等算法。用于存放各类资源的状态信息,以供调用者获取。

  • libnes_sq:实现一个 Queue 数据结构和 Enqueue(入队)、Dnqueue(出队)等算法。用于存放各类资源的状态信息,以供调用者获取。

  • libnes_redis:Redis 数据操作模块。

  • libnes_routefile:(已弃用)基于 rte_cfgfile.h,旧版本用于管理路由规则的配置文件。

  • Makefile

domain 目录

  • ctrl:UPGW API 服务端,接受并处理客户端 libnes_api 发出的请求。包含了 TCP Connection 模块、后端业务处理模块,与 NES API 客户端的封装接口一一对应。

  • io:每个 devices 都具有 rx_rings、rx_default_ring、tx_ring,在 nes_io_main 中永循环的调用着不同 dev 的 Receive, scatter and send 函数,对数据报文进行分发处理。

  • nts:永循环所有的逻辑 Ring 环,包括:NTS_DWSTR_GTP、NTS_UPSTR_GTP、NTS_DWSTR_IP、NTS_UPSTR_IP、NTS_LBP_PREFIX、NTS_VM_PREFIX、NTS_KNI_PREFIX、NTS_AVP_PREFIX,当这些 Ring 环有数据报文时,首先获取数据报文的数量信息,然后在 Ring 环对应的转发函数中(e.g. nts_flow_upstream_ip、nts_flow_downstream_ip etc.)将这些数据报文按照内存中的 Rules 进行转发,即:将数据报文发送至相应的逻辑 Ring 环中。在转发的过程中还会对GTP、IP、DNS 数据报文进行解析(nts_edit_hdr_parse_gtp、nts_edit_hdr_parse_ip、nts_edge_dns_edit_hdr_parse_gtp)。

  • nis:同上,区别在于 NIS 处理的是 SCTP、GTPC 协议内容。

  • dns:(已弃用)

  • ha:(已启用)

  • nes_main.X:nes-daemon 的程序函数,完成 EAL 初始化、配置文件加载、Redis 数据库连接初始化、Ring 环初始化、接口初始化、PDUMP 初始化,并启动 nes_io、nts_io、nis_io、ctrl、ha 等线程。以上初始化会将多线程中多需要使用到的资源都设置好,尤其是 nes_init_interfaces 初始化 devices 对象的结构体(nes_dev_s,可以是 eth、vhost、kni 类型)以及初始化每个 dev 的 Receive, scatter and send 函数非常重要。

  • nes_capacity.h:通用的 NES 容量宏定义,描述了 nes-daemon 的各项指标。

  • nes_common.h:通用的结构体、宏定义。

  • nes_ring.X:实现了一个 Ring 环数据结构,为各个 Port、VM、KNI 创建一个 Ring 环。其中,不同类型的 Port 会创建不同类型的 Ring。并提供数据报文的操作。

  • nes_ring_lookup.X:提供 Ring 环的管理。

  • nes_arp.X:(已弃用)

  • nes_latency.X:数据报文收发延迟(Latency)时间统计。