From 60638a603c1c505a30691f105e248d4272838c3d Mon Sep 17 00:00:00 2001 From: structix Date: Wed, 18 May 2022 19:59:31 +0000 Subject: [PATCH] Finish 1.2 --- example.py | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/example.py b/example.py index 6749023..50a7479 100644 --- a/example.py +++ b/example.py @@ -10,11 +10,12 @@ from ryu.lib.packet import ipv4 from ryu.lib.packet import icmp from ryu.lib.packet.arp import arp from ryu.lib.packet.packet import Packet +#from ryu.ofproto.ofproto_v1_3 import OFPActionSetField class L3Switch(app_manager.RyuApp): OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION] - IP_ADDR = "10.0.0.254" + IP_ADDR = ["10.0.0.254", "10.0.1.254", "10.0.2.254"] MAC_ADDR = "52:00:00:00:00:01" def __init__(self, *args, **kwargs): @@ -90,7 +91,7 @@ class L3Switch(app_manager.RyuApp): # arp request arp_dstIp = arpPacket.dst_ip self.logger.info('received ARP Request %s => %s (port%d)'%(frame.src, frame.dst, inPort)) - if arp_dstIp == self.IP_ADDR or arp_dstIp == "10.0.1.254" or arp_dstIp == "10.0.2.254": + if arp_dstIp in self.IP_ADDR: # this switch was requested opcode = 2 srcMAC = self.MAC_ADDR @@ -175,7 +176,7 @@ class L3Switch(app_manager.RyuApp): dst=pkt_ethernet.src, src=self.MAC_ADDR)) pkt.add_protocol(ipv4.ipv4(dst=pkt_ipv4.src, - src=self.IP_ADDR, + src=pkt_ipv4.dst, proto=pkt_ipv4.proto)) pkt.add_protocol(icmp.icmp(type_=icmp.ICMP_ECHO_REPLY, code=icmp.ICMP_ECHO_REPLY_CODE, @@ -199,6 +200,8 @@ class L3Switch(app_manager.RyuApp): # install a flow to avoid packet_in next time if out_port != ofproto.OFPP_FLOOD: match = parser.OFPMatch(in_port=in_port, eth_dst=frame.dst) + self.logger.info(actions) + self.logger.info(match) # verify if we have a valid buffer_id, if yes avoid to send both # flow_mod & packet_out if buffer_id != ofproto.OFP_NO_BUFFER: @@ -225,10 +228,14 @@ class L3Switch(app_manager.RyuApp): return out_port = self.mac_to_port[dpid][dstMac] - actions = [parser.OFPActionOutput(out_port)] + actions = [parser.OFPActionDecNwTtl(), #decrease TTL count + parser.OFPActionSetField(eth_src=self.MAC_ADDR), # set own mac as source + parser.OFPActionSetField(eth_dst=dstMac), # set dst from arp request + parser.OFPActionOutput(out_port)] # forward packet through out_port # install a flow to avoid packet_in next time - match = parser.OFPMatch(in_port=in_port, ipv4_dst=ipv4_pkt.dst) + match = parser.OFPMatch(in_port=in_port, ipv4_dst=ipv4_pkt.dst, eth_type=0x0800) #onlz match ipv4 packets + # verify if we have a valid buffer_id, if yes avoid to send both # flow_mod & packet_out if buffer_id != ofproto.OFP_NO_BUFFER: @@ -289,22 +296,13 @@ class L3Switch(app_manager.RyuApp): ipv4_pkt = pkt.get_protocol(ipv4.ipv4) #check if packet is for this switch - if ipv4_pkt.dst == self.IP_ADDR: + if ipv4_pkt.dst in self.IP_ADDR: icmp_pkt = pkt.get_protocol(icmp.icmp) if icmp_pkt: self.do_icmp(datapath, in_port, eth, ipv4_pkt, icmp_pkt) else: - if ipv4_pkt.dst not in self.ip_to_mac[dpid]: - self.send_arp(datapath, 1, self.MAC_ADDR, ipv4_pkt.src, "FF:FF:FF:FF:FF:FF", ipv4_pkt.dst, ofproto.OFPP_FLOOD) - else: - dstMac = self.ip_to_mac[dpid].get(ipv4_pkt.dst) - pkt.get_protocols(ethernet.ethernet)[0].dst = dstMac - pkt.get_protocols(ethernet.ethernet)[0].src = self.MAC_ADDR - port = self.mac_to_port[dpid][dstMac] - self.do_l3_switch(datapath, dpid, pkt, eth, ipv4_pkt, in_port, msg.buffer_id) - #self.logger.info(port) - self.send_packet(datapath, port, pkt) - pass + self.do_l3_switch(datapath, dpid, pkt, eth, ipv4_pkt, in_port, msg.buffer_id) + # packet is not for this switch, so do l2 switching if dst != self.MAC_ADDR: