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

时间:2015-04-18 17:01:33

标签: python openflow openvswitch ryu

我正在创建用于推送和弹出mpls标签的ryu应用程序。这是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 header或ethertype = 0x8847的数据包。

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

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

感谢。

3 个答案:

答案 0 :(得分:0)

在分支2.4中推送的MPLS固定很少,你可以尝试一下吗? 主人或分支2.4?

答案 1 :(得分:0)

您处理ARP请求和ARP回复吗?

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

  1. 保持流表不变,将ARP数据包转发给控制器。让控制器处理ARP。
  2. 更改流程表。
  3. 添加最后一个

    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
    

答案 2 :(得分:0)

在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