前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >learning vnet:L2 CrossConnect (4)

learning vnet:L2 CrossConnect (4)

作者头像
dpdk-vpp源码解读
发布2024-05-14 18:28:08
1100
发布2024-05-14 18:28:08
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

在文章《learning:l3xc plugins》中,我们介绍了三层交叉连接功能,将三层接口的所有入接口流量交叉连接输出到指定的FIB路径,从而跳过了路由查找的功能,实现高性能转发加速;L2 Cross Connect 是二层交叉连接功能,用于实现第二层(数据链路层,通常指以太网层)的直接连接,允许两个接口之间的二层数据包(如以太网帧)直接转发,绕过第三层(网络层)的处理,类似于传统的以太网交换机中的端口 trunking 或者链路聚合,但其目的是为了在VPP内部或VPP与其他设备间建立一个简单的二层桥接。

L2交叉连接实现了一种透明传输,即保持源MAC地址和目标MAC地址不变,只负责根据接口间的映射关系进行转发。不需要进行mac学习及l2fib查询转发。

下面搭建环境学习一下l2 xconnnet报文转发流程,在vpp上创建2个tap接口,且在内核上处于不同的命名空间。通过 set interface l2 xconnect <interface> <peer interface> 命令行创建交叉连接,具体配置如下:

代码语言:javascript
复制
creat tap id 1 host-ns pc1 host-ip4-addr 192.168.1.1/24 host-if-name tap1

creat tap id 2 host-ns pc2 host-ip4-addr 192.168.1.2/24 host-if-name tap2

set interface state tap1 up
set interface state tap2 up

set interface l2 xconnect tap1 tap2
set interface l2 xconnect tap2 tap1

这里需要指出的是,此配置需要配置在两个方向上。第一个调用会将 tap1上收到的任何数据帧直接传输到 tap2 上,第二个调用会将 tap2上收到的任何数据帧直接传输到 tap1 上,从而将其转换为将两个接口连接在一起的非常有效的方法。显然,这只适用于成对的情况,如果必须连接更多接口,则桥接域是最佳选择。

可以通过show interface address命令行查询两个接口交叉连接的配置。

代码语言:javascript
复制
dpdk-vpp源码分析: show interface addr        
local0 (dn):
tap1 (up):
  L2 xconnect tap2
tap2 (up):
  L2 xconnect tap1

接下来我们在命名空间PC1 上ping命名空间PC2上tap2的接口IP地址,设置trace抓包,抓取报文业务转发流程。我们可以看到报文在l2_input节点之后直接送到l2_ouput节点。转发流程相当简洁。减少了MAC学习及l2fib查询流程。

代码语言:javascript
复制
ip netns exec pc1 ping 192.168.1.2
Packet 1

00:15:03:806518: virtio-input
  virtio: hw_if_index 1 next-index 4 vring 0 len 98
    hdr: flags 0x00 gso_type 0x00 hdr_len 0 gso_size 0 csum_start 0 csum_offset 0 num_buffers 1
00:15:03:806540: ethernet-input
  frame: flags 0x1, hw-if-index 1, sw-if-index 1
  IP4: 02:fe:51:c0:80:40 -> 02:fe:a3:18:4c:53
00:15:03:806552: l2-input
  l2-input: sw_if_index 1 dst 02:fe:a3:18:4c:53 src 02:fe:51:c0:80:40 [l2-output ]
00:15:03:806556: l2-output
  l2-output: sw_if_index 2 dst 02:fe:a3:18:4c:53 src 02:fe:51:c0:80:40 data 08 00 45 00 00 54 3c f2 40 00 40 01
00:15:03:806561: tap2-output
  tap2 flags 0x00180005
  IP4: 02:fe:51:c0:80:40 -> 02:fe:a3:18:4c:53
  ICMP: 192.168.1.1 -> 192.168.1.2
    tos 0x00, ttl 64, length 84, checksum 0x7a63 dscp CS0 ecn NON_ECN
    fragment id 0x3cf2, flags DONT_FRAGMENT
  ICMP echo_request checksum 0x4275 id 64414
00:15:03:806567: tap2-tx
    buffer 0x9fa6a: current data 0, length 98, buffer-pool 0, ref-count 1, trace handle 0x0
                    l2-hdr-offset 0 l3-hdr-offset 14 
  hdr-sz 0 l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 0 l4-hdr-sz 0
  IP4: 02:fe:51:c0:80:40 -> 02:fe:a3:18:4c:53
  ICMP: 192.168.1.1 -> 192.168.1.2
    tos 0x00, ttl 64, length 84, checksum 0x7a63 dscp CS0 ecn NON_ECN
    fragment id 0x3cf2, flags DONT_FRAGMENT
  ICMP echo_request checksum 0x4275 id 64414

Packet 2

00:15:03:806619: virtio-input
  virtio: hw_if_index 2 next-index 4 vring 0 len 98
    hdr: flags 0x00 gso_type 0x00 hdr_len 0 gso_size 0 csum_start 0 csum_offset 0 num_buffers 1
00:15:03:806622: ethernet-input
  frame: flags 0x1, hw-if-index 2, sw-if-index 2
  IP4: 02:fe:a3:18:4c:53 -> 02:fe:51:c0:80:40
00:15:03:806627: l2-input
  l2-input: sw_if_index 2 dst 02:fe:51:c0:80:40 src 02:fe:a3:18:4c:53 [l2-output ]
00:15:03:806628: l2-output
  l2-output: sw_if_index 1 dst 02:fe:51:c0:80:40 src 02:fe:a3:18:4c:53 data 08 00 45 00 00 54
 08 8a 00 00 40 01
00:15:03:806631: tap1-output
  tap1 flags 0x00180005
  IP4: 02:fe:a3:18:4c:53 -> 02:fe:51:c0:80:40
  ICMP: 192.168.1.2 -> 192.168.1.1
    tos 0x00, ttl 64, length 84, checksum 0xeecb dscp CS0 ecn NON_ECN
    fragment id 0x088a
  ICMP echo_reply checksum 0x4a75 id 64414
00:15:03:806635: tap1-tx
    buffer 0x9d36a: current data 0, length 98, buffer-pool 0, ref-count 1, trace handle 0x1
                    l2-hdr-offset 0 l3-hdr-offset 14 
  hdr-sz 0 l2-hdr-offset 0 l3-hdr-offset 14 l4-hdr-offset 0 l4-hdr-sz 0
  IP4: 02:fe:a3:18:4c:53 -> 02:fe:51:c0:80:40
  ICMP: 192.168.1.2 -> 192.168.1.1
    tos 0x00, ttl 64, length 84, checksum 0xeecb dscp CS0 ecn NON_ECN
    fragment id 0x088a
  ICMP echo_reply checksum 0x4a75 id 64414

L2 xConnect 是VPP中实现二层网络功能强大且灵活的工具,特别适合构建虚拟网络功能、数据中心网络、测试床以及需要高度定制化的网络架构。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档