zl程序教程

您现在的位置是:首页 >  其他

当前栏目

pppoe with vpp/dpdk

2023-02-19 12:21:06 时间

最近在调研pppoe 客户端在vpp中的应用,发现相关的资料还是比较少的,在vpp-dev邮箱列表中可以找到一些信息。下面就来简单说明一下:

  • vpp支持pppoe插件 下面摘自邮件部分内容,可以了解到当前插件只实现了pppoe server端,貌似需要手动配置会话才能工作。

我们成功地将 VPP、PPPoE 插件和 OpenBRAS 集成在一起,并使用 IXIA PPPoE 测试套件进行功能和性能测试。

该插件添加了三个图形节点:1) pppoe-input 用于 PPPoE 解封装 2) pppoe-encap 用于 PPPoE 封装 3) pppoe-tap-dispatch 用于控制报文和 OpenBRAS 之间的控制平面数据包交互。

下面是使 PPPoE CP 和 DP 工作的配置:

vim /etc/vpp/startup.conf 
tuntap { 
  enable 
  ethernet 
  name newtap
}

vppctl 配置命令行

create pppoe tap client-if-index 2 tap-if-index 1 
vppctl create pppoe session client-ip 100.1.1.2 session-id 1 local-mac 68:05:ca:30:54:e8 client-mac 00: 11:01:00:00:01 
vppctl ip route add 100.1.1.2/24 via pppoe_session0

注意:上述命令行在新版本中有变化。

邮件链接:https://lists.fd.io/g/vpp-dev/topic/10641929#581

上面是vpp官方介绍pppoe插件相关功能架构的ppt资料,已放在个人github地址上,有需要自取。https://github.com/jin13417/dpdk-vpp-learning/tree/main/doc/PPPoe

  • pppoe插件控制面开源软件pppcpd pppcpd是c++编写,作为vpp pppoe模块的控制面,目前只能用于pppoe server端,可以创建会话将配置下发到vpp。

github链接:https://github.com/zstas/pppcpd 使用介绍文章: 1:https://zstas.github.io/jekyll/update/2020/01/25/vpp.html 2:https://zstas.github.io/jekyll/update/2020/02/02/vpp_p2.html

  • 基于vpp开源pppoeclient 基于vpp 17.10版本开发的pppoe的客户端,vpp群里已经有小伙伴调通了基本pppoe拨号正常。对接不同的pppoe server可能处理可能都会导致vpp异常,任重道远啊。

链接:https://github.com/raydonetworks/vpp-pppoeclient

下面是基本配置命令,很遗憾并没有拨号成功。还需要详细阅读代码,了解交互流程。

对应物理接口GigabitEthernetb/0/0,创建一个pppoe虚拟接口,客户端主机标识11223344。

DBGvpp# show interface           
              Name               Idx       State          Counter          Count     
GigabitEthernet13/0/0             2        down      
GigabitEthernet1b/0/0             3        down      
GigabitEthernetb/0/0              1         up       
.................................................
create pppoe client sw-if-index  host-uniq 

查询pppoe客户端信息

DBGvpp# show pppoe client                                   
[0] sw-if-index 1 host_uniq 11223344 state PPPOE_CLIENT_DISCOVERY session-id 0 ac-mac-address 00:00:00:00:00:00

启动pppoe拨号,设置pppoex虚接口,对应pppoe用户名及密码。后续就进入pppoe交互流程中。

pppox set auth sw-if-index  username test password 
  • flexiwan产品pppoe client实现 flexiwan产品中已支持pppoe client,需要使用vppsb route插件,使能tap-inject功能。

下面是vppsb router插件中的pppoe session和pppoe discover报文注册处理函数,直接通过tap接口映射到内核的接口将报文送到内核pppd协议栈处理。目前测试可以正常拨号成功,从内核可以ping通server。但是后续业务报文流量路径还未知。

void tap_inject_map_interface_set (u32 src_sw_if_index, u32 dst_sw_if_index)
{
  tap_inject_main_t *im = tap_inject_get_main();

  ip4_register_protocol (IP_PROTOCOL_OSPF, im->tx_node_index);
  ip4_register_protocol (IP_PROTOCOL_TCP, im->tx_node_index);
  #注册pppoe 会话报文eth type=0x8864处理节点,直接送到内核
  ethernet_register_input_type (vm, ETHERNET_TYPE_PPPOE_SESSION,
                                tap_inject_pppoe_tx_node.index);
  #注册pppoe discover报文eth type=0x8863,直接送到内核
  ethernet_register_input_type (vm, ETHERNET_TYPE_PPPOE_DISCOVERY,
                                tap_inject_pppoe_tx_node.index);
#ifdef FLEXIWAN_FIX
  // Issue: all UDP traffic is captured by tap-inject before VxLan node intercepts it.
  //        as a result VxLAN tunnel that sits on BVI bridge with TAP interface does not work.
}

flexiwan vppsb router 插件pppoe修改commit链接: https://gitlab.com/flexiwangroup/flexiroutersb/-/commit/a1008562cd38091eaf2d48547dacf5775541ff9a