Update Aufgabe1.3

This commit is contained in:
2022-05-21 23:37:49 +00:00
parent 83d7aac0c7
commit ade625fdb9
2 changed files with 69 additions and 50 deletions

View File

@@ -15,7 +15,7 @@ class L3Switch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
IP_ADDR = ["10.0.1.14", "10.0.2.254", "10.0.2.252", "10.0.3.62", "10.0.4.2"]
MAC_ADDR = "52:00:00:00:00:01"
MAC_ADDR = ["52:00:00:00:00:01", "52:00:00:00:00:02"]
def __init__(self, *args, **kwargs):
super(L3Switch, self).__init__(*args, **kwargs)
@@ -40,6 +40,16 @@ class L3Switch(app_manager.RyuApp):
ofproto.OFPCML_NO_BUFFER)]
self.add_flow(datapath, 0, match, actions)
# Routing Switch 2 to 1
actions = [parser.OFPActionDecNwTtl(), #decrease TTL count
parser.OFPActionSetField(eth_src=self.MAC_ADDR[1]), # set own mac as source
parser.OFPActionSetField(eth_dst=self.MAC_ADDR[0]), # set dst switch
parser.OFPActionOutput(1)]
match = parser.OFPMatch(ipv4_src="10.0.4.0/30", ipv4_dst="0.0.0.0", eth_type=0x0800)
self.add_flow(datapath, 0, match, actions)
def add_flow(self, datapath, priority, match, actions, buffer_id=None):
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
@@ -93,7 +103,7 @@ class L3Switch(app_manager.RyuApp):
if arp_dstIp in self.IP_ADDR:
# this switch was requested
opcode = 2
srcMAC = self.MAC_ADDR
srcMAC = self.MAC_ADDR[dpid-1]
srcIP = arp_dstIp
dstMAC = frame.src
dstIP = arpPacket.src_ip
@@ -128,7 +138,7 @@ class L3Switch(app_manager.RyuApp):
self.logger.info("froward ARP request %s => %s (port%d)" %(srcMAC, dstMAC, outPort))
elif arpPacket.opcode == 2 :
self.logger.info(arpPacket)
if arpPacket.dst_mac == self.MAC_ADDR:
if arpPacket.dst_mac in self.MAC_ADDR:
# learn mac 2 port mapping
self.mac_to_port[dpid][arpPacket.src_mac] = inPort
# learn ip 2 mac mapping
@@ -166,12 +176,13 @@ class L3Switch(app_manager.RyuApp):
self.send_packet(datapath, outPort, p)
def do_icmp(self, datapath, port, pkt_ethernet, pkt_ipv4, pkt_icmp):
dpid = datapath.id
if pkt_icmp.type != icmp.ICMP_ECHO_REQUEST:
return
pkt = packet.Packet()
pkt.add_protocol(ethernet.ethernet(ethertype=pkt_ethernet.ethertype,
dst=pkt_ethernet.src,
src=self.MAC_ADDR))
src=dpid))
pkt.add_protocol(ipv4.ipv4(dst=pkt_ipv4.src,
src=pkt_ipv4.dst,
proto=pkt_ipv4.proto))
@@ -225,12 +236,12 @@ class L3Switch(app_manager.RyuApp):
# on the packet.
out_port = ofproto.OFPP_FLOOD
dstMac = "FF:FF:FF:FF:FF:FF"
self.send_arp(datapath, 1, self.MAC_ADDR, ipv4_pkt.src, dstMac, ipv4_pkt.dst, out_port)
self.send_arp(datapath, 1, self.MAC_ADDR[dpid-1], ipv4_pkt.src, dstMac, ipv4_pkt.dst, out_port)
# Actions are applied in the same order as defined in the list.
# OFPActionOutput terminates the chain. So this call should be the last action.
actions = [parser.OFPActionDecNwTtl(), #decrease TTL count
parser.OFPActionSetField(eth_src=self.MAC_ADDR), # set own mac as source
parser.OFPActionSetField(eth_src=self.MAC_ADDR[1]), # set own mac as source
parser.OFPActionSetField(eth_dst=dstMac), # set dst from arp request
parser.OFPActionOutput(out_port)] # forward packet through out_port
@@ -311,7 +322,7 @@ class L3Switch(app_manager.RyuApp):
# packet is not for this switch, so do l2 switching
if dst != self.MAC_ADDR:
if dst != self.MAC_ADDR[dpid - 1]:
self.do_l2_switch(datapath, dpid, pkt, eth, in_port, msg.buffer_id)
return
return