diff --git a/Ex-01.pdf b/Ex-01.pdf new file mode 100644 index 0000000..9de6521 Binary files /dev/null and b/Ex-01.pdf differ diff --git a/Uebung1/1.2_controller.py b/uebung1_example_original.py similarity index 72% rename from Uebung1/1.2_controller.py rename to uebung1_example_original.py index ba86ebb..0fdde9d 100644 --- a/Uebung1/1.2_controller.py +++ b/uebung1_example_original.py @@ -10,12 +10,11 @@ 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", "10.0.1.254", "10.0.2.254"] + IP_ADDR = "10.0.0.254" MAC_ADDR = "52:00:00:00:00:01" def __init__(self, *args, **kwargs): @@ -91,11 +90,11 @@ 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 in self.IP_ADDR: + if arp_dstIp == self.IP_ADDR: # this switch was requested opcode = 2 srcMAC = self.MAC_ADDR - srcIP = arp_dstIp + srcIP = self.IP_ADDR dstMAC = frame.src dstIP = arpPacket.src_ip outPort = inPort @@ -128,27 +127,19 @@ class L3Switch(app_manager.RyuApp): self.ip_to_mac[dpid][srcIP] = srcMAC 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: - # learn mac 2 port mapping - self.mac_to_port[dpid][arpPacket.src_mac] = inPort - # learn ip 2 mac mapping - self.ip_to_mac[dpid][arpPacket.src_ip] = arpPacket.src_mac - return - else: - opcode = 2 - #arp reply - # forward arp reply - srcMAC = frame.src - srcIP = arpPacket.src_ip - dstMAC = frame.dst - dstIP = arpPacket.dst_ip - outPort = self.mac_to_port[dpid][dstMAC] - # learn mac 2 port mapping - self.mac_to_port[dpid][srcMAC] = inPort - # learn ip 2 mac mapping - self.ip_to_mac[dpid][srcIP] = srcMAC - self.logger.debug('forward ARP reply %s => %s (port%d)'%(frame.src ,frame.dst, inPort)) + opcode = 2 + #arp reply + # forward arp reply + srcMAC = frame.src + srcIP = arpPacket.src_ip + dstMAC = frame.dst + dstIP = arpPacket.dst_ip + outPort = self.mac_to_port[dpid][dstMAC] + # learn mac 2 port mapping + self.mac_to_port[dpid][srcMAC] = inPort + # learn ip 2 mac mapping + self.ip_to_mac[dpid][srcIP] = srcMAC + self.logger.debug('forward ARP reply %s => %s (port%d)'%(frame.src ,frame.dst, inPort)) self.send_arp(datapath, opcode, srcMAC, srcIP, dstMAC, dstIP, outPort) def send_arp(self, datapath, opcode, srcMac, srcIp, dstMac, dstIp, outPort): @@ -167,8 +158,6 @@ class L3Switch(app_manager.RyuApp): self.send_packet(datapath, outPort, p) def do_icmp(self, datapath, port, pkt_ethernet, pkt_ipv4, pkt_icmp): - self.logger.info(pkt_icmp.type) - self.logger.info(icmp.ICMP_ECHO_REQUEST) if pkt_icmp.type != icmp.ICMP_ECHO_REQUEST: return pkt = packet.Packet() @@ -176,14 +165,13 @@ class L3Switch(app_manager.RyuApp): dst=pkt_ethernet.src, src=self.MAC_ADDR)) pkt.add_protocol(ipv4.ipv4(dst=pkt_ipv4.src, - src=pkt_ipv4.dst, + src=self.IP_ADDR, proto=pkt_ipv4.proto)) pkt.add_protocol(icmp.icmp(type_=icmp.ICMP_ECHO_REPLY, code=icmp.ICMP_ECHO_REPLY_CODE, csum=0, data=pkt_icmp.data)) self.logger.info("do icmp: %s" %(pkt,)) - self.logger.info("port: %s" %(port)) self.send_packet(datapath, port, pkt) def do_l2_switch(self, datapath, dpid, packet, frame, in_port, buffer_id=None): @@ -215,52 +203,6 @@ class L3Switch(app_manager.RyuApp): in_port=in_port, actions=actions, data=data) datapath.send_msg(out) - def do_l3_switch(self, datapath, dpid, packet, frame, ipv4_pkt, in_port, buffer_id=None): - ofproto = datapath.ofproto - parser = datapath.ofproto_parser - - if ipv4_pkt.dst in self.ip_to_mac[dpid]: - # GEt mac and port of the given destination - dstMac = self.ip_to_mac[dpid][ipv4_pkt.dst] - out_port = self.mac_to_port[dpid][dstMac] - else: - # Send an arp request and define mac and port - # so we're able to apply the following actions - # 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) - - # 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_dst=dstMac), # set dst from arp request - parser.OFPActionOutput(out_port)] # forward packet through out_port - - # Only install a flow if we#re in the first case (specific mac and out_port) - if ipv4_pkt.dst in self.ip_to_mac[dpid]: - # install a flow to avoid packet_in next time - 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: - self.add_flow(datapath, 1, match, actions, buffer_id) - return - else: - self.add_flow(datapath, 1, match, actions) - - data = None - if buffer_id == ofproto.OFP_NO_BUFFER: - data = packet.data - - out = parser.OFPPacketOut(datapath=datapath, buffer_id=buffer_id, - in_port=in_port, actions=actions, data=data) - datapath.send_msg(out) - - - @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER) def _packet_in_handler(self, ev): # If you hit this you might want to increase @@ -289,7 +231,6 @@ class L3Switch(app_manager.RyuApp): self.mac_to_port.setdefault(dpid, {}) self.ip_to_mac.setdefault(dpid, {}) - self.logger.info("packet in dpid: %s, src: %s, dest: %s, in_port: %s", dpid, src, dst, in_port) #learn mac to port mapping @@ -304,14 +245,13 @@ class L3Switch(app_manager.RyuApp): ipv4_pkt = pkt.get_protocol(ipv4.ipv4) #check if packet is for this switch - if ipv4_pkt.dst in self.IP_ADDR: + if ipv4_pkt.dst == 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: - # forward the package into a different subnet - self.do_l3_switch(datapath, dpid, pkt, eth, ipv4_pkt, in_port, msg.buffer_id) - + # here we would forward the packet into other subnets + pass # packet is not for this switch, so do l2 switching if dst != self.MAC_ADDR: