Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在推送MPLS报头后不从ovs交换机(版本2.3.1)转发数据包?_Python_Openflow_Openvswitch_Ryu - Fatal编程技术网

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

Python 为什么在推送MPLS报头后不从ovs交换机(版本2.3.1)转发数据包?,python,openflow,openvswitch,ryu,Python,Openflow,Openvswitch,Ryu,我正在创建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:65

我正在创建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标头或ethertype=0x8847的数据包

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

我的代码有bug还是ovs或openflow_v1.4 ryu中的bug


谢谢。

分支2.4中已修复的MPLS很少,您能试一试吗
master还是branch 2.4?

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

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

  • 保持流表不变,ARP数据包被转发到控制器。让控制器处理ARP
  • 更改流表
  • 添加最后一个

    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报头会导致该数据包无法在开放的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转储流s1 | grep-O“n_数据包=\w*”
    但没有数据包离开s1,由
    sudo tcpdump-ni s1-eth2

    当您嗅探s1-eth1(或h1连接到s1的任何位置)时,是否有带有mpls标签80的数据包进入?您还可以使用连接到s1的h1作为h1-s1-s2-h2的ovs dpctl top查看触发的流。h1向s1 eth1发送ping消息。我将s1编程为标记mpls标签并将其发送到eth2,但没有来自s1-eth2的带有mpls标签80的数据包。我将尝试一下
    ovs dpctl top