分类 vpp 中的文章

vpp和linux内核协议栈通信

1. 背景介绍 基于VPP开发一款网络设备,除使用VPP框架实现端口数据报文转发外,还需要对设备进行配置和管理, 比较常用的是要实现ssh、web等相关服务,另外,由于VPP并未实现dhcp server的功能,控制面可能还需移植isc-dhcp类似的dhcp server。 相关的用户态程序是基于Linux内核的socket来收发包的,因此,需要实现VPP和Linux内核协议栈通信的方法, 可以将访问控制面的报文由VPP上送至Linux协议的协议栈。 2. 实现原理 VPP和Linux内核协议栈通信有两种方法,分别是基于Linux的TAP/TUN和VETH两种机制, 对这两种机制不了解的朋友,建议先阅读下如下两个衔接的内容: TUN/TAP:https://segmentfault.com/a/1190000009249039 VETH:https://segmentfault.com/a/1190000009251098 基于TAP/TUN的方法: 如上图,PC的地址是192.168.1.2,Linux Kernel的管理接口地址是192.168.1.1,需要PC通过VPP可以ping同Linux内核的192.168.1.1地址 技术原理图如上,物理网卡对应VPP中的GE4/0/0,VPP创建tap接口,使用l2 bridge机制将GE4/0/0和tap桥接,进入GE4/0/0的报文通过l2 bridge转发到TAP, VPP的TAP相当于用户态进程,另一端对应的是Linux内核中的TAP接口,报文通过TAP机制重入到Linux内核,实现了VPP到控制面的通信 实现命令: vpp#set int l2 bridge GigabitEthernet4/0/0 1 vpp#set int state GigabitEthernet4/0/0 up vpp#tap connect lstack vpp#set int l2 bridge tap-0 1 vpp#set int state tap-0 up 上述操作完成后,在linux后台,ifconfig发现多了一个lstack接口,给lstack接口配置好IP地址,就可以实现PC和设备的通信了。 基于VETH方法: VETH技术原理如上图,通过在vpp上创建host-interface的方式实现,使用VETH方式的效率更高,实际使用时推荐此种方法 配置步骤如下 linux后台配置: ~# ip netns add ns0 ~# ip link add vpp0 type veth peer name vethns0 ~# ip link set vethns0 netns ns0 ~# ip netns exec ns0 ip link set lo up ~# ip netns exec ns0 ip link set vethns0 up ~# ip netns exec ns0 ip addr add 192.……

阅读全文

vpp-cli命令行总结

1. 介绍 vpp网络协议栈配备了一组调试命令。访问CLI(具有适当权限)的最简单方法是使用vppctl命令: sudo vppctl <cli command> CLI解析器匹配静态的关键字字符串后,调用动作执行函数。 你可以通过在代码源文件中搜索VLIB_CLI_COMMAND宏的来查找CLI命令的源代码. 2. 调试和Telnet CLI 使用unix交互式参数或启动配置选项启用调试CLI。 这会导致VPP不以守护进程的情况启动,并在运行它的终端上显示命令行界面. 使用cli-listen localhost:5002选项启用Telnet CLI,这将导致VPP侦听localhost地址端口5002上的TCP连接。 然后,Telnet客户端可以连接到此端口(例如,telnet localhost 5002)并将收到命令行提示符。 以下配置将启用这两种机制: unix { interactive cli-listen localhost:5002 } CLI以横幅图形(可以禁用)和命令行提示符提示CLI开始。对于VPP的发布版本,命令行提示符通常为“vpp”, 对于启用了调试功能的开发版本,命令行提示符为“DBGvpp#”,可以通过unix cli-prompt设置命令行提示符, 并通过unix cli-no-banner来禁止横幅. 3. CLI特征 <-或-> 左右光标键,在命令行内移动光标。 Ctrl-左/右将向左或向右搜索下一个单词的开头。 Home / end将光标跳转到行的开头和结尾。 可以使用exit命令关闭CLI。 或者,空输入行上的^ D也将关闭会话。关闭调试会话也将关闭VPP 4. 命令行参数与配置文件 VPP网络协议栈可以在命令行或配置文件中提供配置参数。 您可以通过搜索VLIB_CONFIG_FUNCTION宏在源代码中找到命令行参数解析器的相关代码。 调用VLIB_CONFIG_FUNCTION(foo_config,“foo”)将使函数foo_config接收名为“foo”的参数块中给出的所有参数, 例如:“foo {arg1 arg2 arg3 …}” VPP应用程序必须能够找到自己的可执行映像。确保这一点最简单方法是通过给出其绝对路径来调用VPP应用程序; 例如:/usr/bin/vpp 。 在启动时,VPP应用程序通过解析自己的ELF段以生成初始化,配置和退出处理程序的列表 配置文件: 还可以在启动配置文件中提供命令行参数,配置文件的路径在命令行上提供给VPP应用程序。 配置文件的格式是一个简单的文本文件,其内容与命令行相同,但是能够使用换行符使内容更加易于阅读。 例如: unix { nodaemon /var/log/vpp/vpp.log full-coredump cli-listen localhost:5002 } api-trace { on } dpdk { dev 0000:03:00.……

阅读全文

vpp编译分析

1. 下载源码 git clone http://192.168.9.105:60080/UPF/upf-vpp.git 2. 编译选项 1.make install-dep #install software dependencies 2.make wipe(wipe-release) #wipe all products 3.make build(build-release) #build binaries 4.make install-ext-deps #install external development dependencies(about dpdk) 5.make pkg-deb #build DEB packages 3. deb包 root@localhost:/home/ubuntu/work/upf-vpp# ll build-root/*.deb -rw-r--r-- 1 root root 184920 Jun 22 19:33 build-root/libvppinfra_19.08.1-21~g512cdac9c-dirty_amd64.deb -rw-r--r-- 1 root root 145112 Jun 22 19:33 build-root/libvppinfra-dev_19.08.1-21~g512cdac9c-dirty_amd64.deb -rw-r--r-- 1 root root 22456 Jun 22 19:33 build-root/python3-vpp-api_19.08.1-21~g512cdac9c-dirty_amd64.deb -rw-r--r-- 1 root root 3313088 Jun 22 19:33 build-root/vpp_19.……

阅读全文

vpp node-graph编排过程

1. vpp node graph VPP处理报文时是沿着一个有向图进行处理的,每一个功能单元称之为节点(node) 2. 数据结构 静态数据结构 节点全局管理结构vlib_node_main_t typedef struct { /* Public nodes. */ /* 节点指针数组,使用下标作为索引 */ vlib_node_t **nodes; /* Node index hashed by node name. */ /* 根据节点名字进行hash,可以根据节点名字进行hash表查找 * 只有main线程才会委会该hash表 */ uword *node_by_name; u32 flags; /* 该标志表示Runtime信息已经被初始化过了 */ #define VLIB_NODE_MAIN_RUNTIME_STARTED (1 << 0) /* Nodes segregated by type for cache locality. Does not apply to nodes of type VLIB_NODE_TYPE_INTERNAL. */ vlib_node_runtime_t *nodes_by_type[VLIB_N_NODE_TYPE]; /* Node runtime indices for input nodes with pending interrupts.……

阅读全文

vpp 节点报文处理流程分析

1. 以sample例子来分析vpp节点对报文的处理流程 vpp/src/examples/sample-plugin/sample $ll total 56 -rw-rw-r-- 1 ych ych 886 Apr 1 17:34 CMakeLists.txt -rw-rw-r-- 1 ych ych 17933 Apr 1 17:34 node.c -rw-rw-r-- 1 ych ych 712 Apr 1 17:34 sample_all_api_h.h -rw-rw-r-- 1 ych ych 1068 Apr 1 17:34 sample.api -rw-rw-r-- 1 ych ych 6569 Apr 1 17:34 sample.c -rw-rw-r-- 1 ych ych 1135 Apr 1 17:34 sample.h -rw-rw-r-- 1 ych ych 960 Apr 1 17:34 sample_msg_enum.h -rw-rw-r-- 1 ych ych 5512 Apr 1 17:34 sample_test.……

阅读全文

vpp sample plugin

1. plugin_sample.c 在此文件中定义feature和cli #include <vnet/plugin/plugin.h> #include <plugin_sample/plugin_sample.h> plugin_sample_main_t plugin_sample_main; //开关实现 int plugin_sample_enable_disable(u32 sw_if_index, //index int enable_disable) //开关标识 { vnet_sw_interface_t *sw; int ret = 0; /* Utterly wrong? */ if (pool_is_free_index (plugin_sample_main.vnet_main->interface_main.sw_interfaces, //vnet_main结构中的interface_main结构中的sw接口 sw_if_index)) //接口索引 return VNET_API_ERROR_INVALID_SW_IF_INDEX; /* Not a physical port? */ sw = vnet_get_sw_interface(plugin_sample_main.vnet_main, //vnet_main结构 sw_if_index); if (sw->type != VNET_SW_INTERFACE_TYPE_HARDWARE) return VNET_API_ERROR_INVALID_SW_IF_INDEX; vnet_feature_enable_disable("ip4-unicast", //挂载节点 "plugin_sample", sw_if_index, enable_disable, 0, 0); return ret; } static clib_error_t* plugin_sample_enable_disable_command_fn(vlib_main_t* vm, //vlib_main结构 unformat_input_t *input, vlib_cli_command_t *cmd) { u32 sw_if_index = ~0; //~0 取反= 1 int enable_disable = 1; while(unformat_check_input(input) !……

阅读全文

vpp feature

1. 背景和概念 早期的VPP本身的node框架比较固定,各个node之间逻辑连接已经固化,为此新版本增加了feature机制. 每个feature是一个node,用户可以启用/停止某个或某些feature 用户也可以自己写插件,把自定义node(自己的业务逻辑)加入到指定位置 2. 重要数据结构和操作函数 # # vnet_feature_arc_registration_t # ---------------------------------- # vpp将feature分成不同的组,每组feature称为一个arc # arc中的feature按照代码指定的顺序串接起来 # arc结构将记录这组feature的起始node和结束node # 系统初始化时完成每个feature的连接 # vnet/feature/feature.h +38 /** feature registration object */ typedef struct _vnet_feature_arc_registration { /** next registration in list of all registrations*/ struct _vnet_feature_arc_registration *next; /** Feature Arc name */ char *arc_name; /** Start nodes */ char **start_nodes; int n_start_nodes; /** End of the arc (optional, for consistency-checking) */ char *last_in_arc; /* Feature arc index, assigned by init function */ u8 feature_arc_index; u8 *arc_index_ptr; } vnet_feature_arc_registration_t; # VNET_FEATURE_ARC_INIT宏用来注册arc # ---------------------------------- # 在arc中指定的起始node中,必须调用vnet_feature_arc_start函数, # 才能正式进入feature机制业务流程,该函数会将下一跳强行指定为arc中的下一个feature # 先初始化arc VNET_FEATURE_ARC_INIT (device_input, static) = { .……

阅读全文

最近文章

分类

标签

友情链接

其它