Add uebung1 pdf

This commit is contained in:
2022-05-19 23:10:57 +02:00
parent 08ca4023f3
commit d47789d013
2 changed files with 20 additions and 80 deletions

BIN
Ex-01.pdf Normal file

Binary file not shown.

View File

@@ -10,12 +10,11 @@ from ryu.lib.packet import ipv4
from ryu.lib.packet import icmp from ryu.lib.packet import icmp
from ryu.lib.packet.arp import arp from ryu.lib.packet.arp import arp
from ryu.lib.packet.packet import Packet from ryu.lib.packet.packet import Packet
#from ryu.ofproto.ofproto_v1_3 import OFPActionSetField
class L3Switch(app_manager.RyuApp): class L3Switch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION] 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" MAC_ADDR = "52:00:00:00:00:01"
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -91,11 +90,11 @@ class L3Switch(app_manager.RyuApp):
# arp request # arp request
arp_dstIp = arpPacket.dst_ip arp_dstIp = arpPacket.dst_ip
self.logger.info('received ARP Request %s => %s (port%d)'%(frame.src, frame.dst, inPort)) 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 # this switch was requested
opcode = 2 opcode = 2
srcMAC = self.MAC_ADDR srcMAC = self.MAC_ADDR
srcIP = arp_dstIp srcIP = self.IP_ADDR
dstMAC = frame.src dstMAC = frame.src
dstIP = arpPacket.src_ip dstIP = arpPacket.src_ip
outPort = inPort outPort = inPort
@@ -128,14 +127,6 @@ class L3Switch(app_manager.RyuApp):
self.ip_to_mac[dpid][srcIP] = srcMAC self.ip_to_mac[dpid][srcIP] = srcMAC
self.logger.info("froward ARP request %s => %s (port%d)" %(srcMAC, dstMAC, outPort)) self.logger.info("froward ARP request %s => %s (port%d)" %(srcMAC, dstMAC, outPort))
elif arpPacket.opcode == 2 : 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 opcode = 2
#arp reply #arp reply
# forward arp reply # forward arp reply
@@ -167,8 +158,6 @@ class L3Switch(app_manager.RyuApp):
self.send_packet(datapath, outPort, p) self.send_packet(datapath, outPort, p)
def do_icmp(self, datapath, port, pkt_ethernet, pkt_ipv4, pkt_icmp): 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: if pkt_icmp.type != icmp.ICMP_ECHO_REQUEST:
return return
pkt = packet.Packet() pkt = packet.Packet()
@@ -176,14 +165,13 @@ class L3Switch(app_manager.RyuApp):
dst=pkt_ethernet.src, dst=pkt_ethernet.src,
src=self.MAC_ADDR)) src=self.MAC_ADDR))
pkt.add_protocol(ipv4.ipv4(dst=pkt_ipv4.src, pkt.add_protocol(ipv4.ipv4(dst=pkt_ipv4.src,
src=pkt_ipv4.dst, src=self.IP_ADDR,
proto=pkt_ipv4.proto)) proto=pkt_ipv4.proto))
pkt.add_protocol(icmp.icmp(type_=icmp.ICMP_ECHO_REPLY, pkt.add_protocol(icmp.icmp(type_=icmp.ICMP_ECHO_REPLY,
code=icmp.ICMP_ECHO_REPLY_CODE, code=icmp.ICMP_ECHO_REPLY_CODE,
csum=0, csum=0,
data=pkt_icmp.data)) data=pkt_icmp.data))
self.logger.info("do icmp: %s" %(pkt,)) self.logger.info("do icmp: %s" %(pkt,))
self.logger.info("port: %s" %(port))
self.send_packet(datapath, port, pkt) self.send_packet(datapath, port, pkt)
def do_l2_switch(self, datapath, dpid, packet, frame, in_port, buffer_id=None): 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) in_port=in_port, actions=actions, data=data)
datapath.send_msg(out) 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) @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def _packet_in_handler(self, ev): def _packet_in_handler(self, ev):
# If you hit this you might want to increase # 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.mac_to_port.setdefault(dpid, {})
self.ip_to_mac.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) self.logger.info("packet in dpid: %s, src: %s, dest: %s, in_port: %s", dpid, src, dst, in_port)
#learn mac to port mapping #learn mac to port mapping
@@ -304,14 +245,13 @@ class L3Switch(app_manager.RyuApp):
ipv4_pkt = pkt.get_protocol(ipv4.ipv4) ipv4_pkt = pkt.get_protocol(ipv4.ipv4)
#check if packet is for this switch #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) icmp_pkt = pkt.get_protocol(icmp.icmp)
if icmp_pkt: if icmp_pkt:
self.do_icmp(datapath, in_port, eth, ipv4_pkt, icmp_pkt) self.do_icmp(datapath, in_port, eth, ipv4_pkt, icmp_pkt)
else: else:
# forward the package into a different subnet # here we would forward the packet into other subnets
self.do_l3_switch(datapath, dpid, pkt, eth, ipv4_pkt, in_port, msg.buffer_id) pass
# packet is not for this switch, so do l2 switching # packet is not for this switch, so do l2 switching
if dst != self.MAC_ADDR: if dst != self.MAC_ADDR: