为什么推送 MPLS 标头后不从 ovs 交换机(版本 2.3.1)转发数据包



我正在创建ryu应用程序来推送和弹出mpls标签。以下是 ovs(版本 2.3.1)交换机 s1 上的流条目:

root@ubuntu:~# sudo ovs-ofctl -O  OpenFlow14 dump-flows s1
OFPST_FLOW reply (OF1.4) (xid=0x2):
 cookie=0x0, duration=190.991s, table=0, n_packets=123, n_bytes=21852, priority=0 actions=CONTROLLER:65535
 cookie=0x0, duration=190.991s, table=0, n_packets=0, n_bytes=0, priority=10,mpls,in_port=2,mpls_label=80 actions=pop_mpls:0x0800,output:1
 cookie=0x0, duration=190.991s, table=0, n_packets=152, n_bytes=14896, priority=10,ip,in_port=1 actions=push_mpls:0x8847,set_field:80->mpls_label,output:2

任何人都知道为什么即使流条目匹配也不会转发数据包。 因为如果我打开 Wireshark 并看到 S1-eth2 以检查 MPLS 标头,则没有检测到具有 MPLS 标头或以太网类型 = 0x8847 的数据包。

只有我在 s1-eth2 看到的数据包是 ICMPv6(路由器请求消息)、DHCP 和 MDNS。 它们中的任何一个都与我从主机 1 发送到 H2 的 ping 无关。我的拓扑结构 : h1-s1-s2-h2

我的代码是否有错误,或者是 ovs 或 openflow_v1.4 ryu 中的错误?

谢谢。

分支 2.4 中修复了很少的 MPLS,你能试试吗主节点还是分支 2.4?

您是否处理 ARP 请求和 ARP 回复?

处理 ARP 数据包的两种方法:

  1. 保持流表不变,ARP 数据包将转发到控制器。让控制器处理 ARP。
  2. 更改流表。

添加最后一个

root@ubuntu:~# sudo ovs-ofctl -O  OpenFlow14 dump-flows s1
OFPST_FLOW reply (OF1.4) (xid=0x2):
cookie=0x0, duration=190.991s, table=0, n_packets=123, n_bytes=21852, priority=0 actions=CONTROLLER:65535
cookie=0x0, duration=190.991s, table=0, n_packets=0, n_bytes=0, priority=10,mpls,in_port=2,mpls_label=80 actions=pop_mpls:0x0800,output:1
cookie=0x0, duration=190.991s, table=0, n_packets=152, n_bytes=14896, priority=10,ip,in_port=1 actions=push_mpls:0x8847,set_field:80->mpls_label,output:2
cookie=0x0, duration=190.991s, table=0, n_packets=152, n_bytes=14896, priority=10,arp,in_port=1 actions=push_mpls:0x8847,set_field:80->mpls_label,output:2

适用于 OvS 2.5.1 中堆栈中最多 2 个标签。也许错误出在Ryu应用程序中。你能发布代码吗?

MPLS 标头堆栈的大小限制为 3。在数据包上推送超过 3 个 MPLS 标头会导致数据包无法在 Open vSwitch 中转发。

sudo mn --topo single,2 --switch ovsk
mininet> h1 ping h2

在 s1 上安装了一组最少的流条目:

sudo ovs-ofctl -O OpenFlow13 add-flow s1 in_port=1,actions=push_mpls:0x8847,push_mpls:0x8847,push_mpls:0x8847,push_mpls:0x8847,output:2
sudo ovs-ofctl -O OpenFlow13 add-flow s1 in_port=2,actions=push_mpls:0x8847,push_mpls:0x8847,push_mpls:0x8847,push_mpls:0x8847,output:1

流条目正确匹配。 sudo ovs-ofctl -O OpenFlow13 dump-flows s1 | grep -o "n_packets=w*"然而,没有数据包离开 s1 确认 sudo tcpdump -ni s1-eth2

最新更新