Рю Как отправить пакеты на указанный c коммутатор - PullRequest
0 голосов
/ 24 января 2020

Я действительно новичок в SDN и Ryu, и у меня возникла путаница в отношении того, что происходит в моей маршрутизации. У меня есть мой код ниже. Как вы можете видеть в строке 422, есть проверка, вызван ли обработчик пакетов в коммутаторе ядра. Мой основной коммутатор на самом деле также подключен к 2 другим коммутаторам. Из строк 423-427 я принудительно установил out_port так, чтобы только один из двух out_port. Поэтому я ожидаю (и действительно хочу), чтобы все пакеты ipv4 отправлялись первому коммутатору. И я не ожидаю (и не хочу) никаких пакетов ipv4, отправленных на другой коммутатор. Но проблема в том, что оба коммутатора получают пакеты ipv4 вместо одного из них. Есть ли у вас какие-либо предложения о том, как это исправить или хотя бы объяснение, почему это происходит?

372     @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
373     def packet_in_handler(self, ev):
374
375         msg = ev.msg
376         dp = msg.datapath
377         ofp = dp.ofproto
378         ofp_parser = dp.ofproto_parser
379         in_port = msg.match['in_port']
380
381         pkt = packet.Packet(msg.data)
382         arp_pkt = pkt.get_protocol(arp.arp)
383         eth_pkt = pkt.get_protocols(ethernet.ethernet)[0]
384
385         out_port = ofp.OFPP_ALL
386
387         match = ofp_parser.OFPMatch(eth_type=0x0806)
388         actions = [ofp_parser.OFPActionOutput(ofp.OFPP_ALL)]
389         inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS, actions)]
390         mod = ofp_parser.OFPFlowMod(datapath=dp, buffer_id=msg.buffer_id, priority=1,
391                                     match=match, instructions=inst)
392
393         dst = eth_pkt.dst
394         src = eth_pkt.src
395
396         if eth_pkt.ethertype == ether_types.ETH_TYPE_LLDP:
397             return
398
399         if eth_pkt.ethertype == ether_types.ETH_TYPE_IP:
400             ipv4_pkt = pkt.get_protocol(ipv4.ipv4)
401             if ipv4_pkt.dst not in self.mac_ip:
402                 self.mac_ip.setdefault(str(ipv4_pkt.dst))
403                 self.mac_ip[ipv4_pkt.dst] = [dst, ipv4_pkt.dst]
404             if dp.id not in self.dstBucket:
405                 self.dstBucket.setdefault(dp.id, {})
406             self._dst_counter(dp.id, ipv4_pkt)
407
408         if self.dstStats:
409             stats = self.dstStats
410
411             # packet arrives client leaf switches
412             for switchEntry in self.switches_list:
413                 if int(switchEntry.dpid[len(switchEntry.dpid)-1]) == dp.id:
414                     sw = switchEntry
415
416                     if sw.type == "client-leaf":
417                         out_port = sw.core_port
418                         actions = [ofp_parser.OFPActionOutput(out_port)]
419                         match = ofp_parser.OFPMatch(in_port=in_port, eth_type=0x0800)
420                         mod = ofp_parser.OFPFlowMod(datapath=dp, buffer_id=msg.buffer_id, priority=10,
421                                                 match=match, instructions=inst)
422                     elif sw.type == "core":
423                         port = sw.server_port[0]
424                         port = int(port.split(":")[1])
425                         out_port = port
426                         print ("Core out port: {}".format(out_port))
427                         actions = [ofp_parser.OFPActionOutput(out_port)]
428                         match = ofp_parser.OFPMatch(in_port=in_port, eth_type=0x0800)
429                         mod = ofp_parser.OFPFlowMod(datapath=dp, buffer_id=msg.buffer_id, priority=10,
430                                                     match=match, instructions=inst)
431                         out = ofp_parser.OFPPacketOut(datapath=dp, buffer_id=msg.buffer_id, in_port=in_port,
432                                                       actions=actions, data=msg.data)
433                     dp.send_msg(mod)
434                     return
435
436         dp.send_msg(mod)

Спасибо, Джосия Регенсия

...