Я действительно новичок в 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)
Спасибо, Джосия Регенсия