如何使用ryu控制器向所有交换机发送数据包?

时间:2019-08-10 11:27:13

标签: sdn openflow ryu

我需要测量Ryu控制器中的链路延迟。我想由控制器为所有交换机发送包出消息,并计算发送的包出消息与收到包入消息之间的时间。我是Ryu的初学者,不知道如何向所有交换机发送具有特定EtherType的数据包,例如0x8fc。我已经获得了所有交换机的MAC,并建立了一个数据包。如何将具有特定EtherType的数据包发送到所有交换机?我不知道每个开关的db参数是什么?

    def send_packet(self, dp, port, pkt):
        ofproto = dp.ofproto
        parser = dp.ofproto_parser
        pkt.serialize()
        data = pkt.data
        action = [parser.OFPActionOutput(port=port)]

        out = parser.OFPPacketOut(
            datapath=dp, buffer_id=ofproto.OFP_NO_BUFFER,
            in_port=ofproto.OFPP_CONTROLLER,
            actions=action, data=data)
        dp.send_msg(out)

def create_packet(self):
        i=l=0
        for l in range(1,len(self.adjacency)+1):
            #print("\n")
            for i in self.adjacency[l]:
                ethertype = 0x8fc
                dst = self.macaddr(i)
                src = self.macaddr(l) 
                e = ethernet.ethernet(dst, src, ethertype)                
                p = packet.Packet()
                p.add_protocol(e)
                p.add_protocol(time.time())
                p.serialize()
                port=self.adjacency[l][i]
                send_packet(self, dp **??????** , port, p):

1 个答案:

答案 0 :(得分:0)

DP是DataPathID的缩写,它是网络中OpenFlow交换机的Uniq ID。

根据OpenFlow specification

  

“ datapath_id字段唯一地标识一个数据路径。下层48   位用于交换机的MAC地址,而高16位   由实施者决定。使用高16位的示例是   VLAN ID以区分单个虚拟机上的多个虚拟交换机实例   物理开关。”

例如,如果您使用Mininet,则运行线性拓扑:

mn --controller remote --topo linear,3

您的拓扑将是:

s1 -- s2 -- s3

 |    |      |

h1    h2     h3

DataPathID为:

s1:0x0000000000000001

s2:0x0000000000000002

s3:0x0000000000000003

请注意,在其他测试平台上,此数字可能有所不同,但始终为16位十六进制。