Add comments and cleanup

This commit is contained in:
2022-05-29 18:48:24 +00:00
parent c67d2041f9
commit 92e82b93fb
4 changed files with 26 additions and 16 deletions

View File

@@ -1,3 +1,6 @@
# Abgabe von:
# Jutta Seth, Janek Schoffit, Eva Högner
# Problem 1.2 (Simple IP routing)
from ryu.base import app_manager from ryu.base import app_manager
from ryu.controller import ofp_event from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER

View File

@@ -1,3 +1,6 @@
# Abgabe von:
# Jutta Seth, Janek Schoffit, Eva Högner
# Problem 1.3 (IP Router for IPv4)
from ryu.base import app_manager from ryu.base import app_manager
from ryu.controller import ofp_event from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER

View File

@@ -1,3 +1,6 @@
# Abgabe von:
# Jutta Seth, Janek Schoffit, Eva Högner
# Problem 1.4 (Packet-based IP Anycast)
from ryu.base import app_manager from ryu.base import app_manager
from ryu.controller import ofp_event from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
@@ -23,8 +26,10 @@ class L3Switch(app_manager.RyuApp):
self.mac_to_port = {} self.mac_to_port = {}
self.port_to_mac = {} self.port_to_mac = {}
self.ip_to_mac = {} self.ip_to_mac = {}
# Define the ports for anycast round robin
self.anycastPorts = [1, 3, 4] self.anycastPorts = [1, 3, 4]
self.anycastIndex = 0 self.anycastIndex = 0 # round robin index for the ports array
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER) @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev): def switch_features_handler(self, ev):
@@ -190,18 +195,10 @@ class L3Switch(app_manager.RyuApp):
else: else:
out_port = ofproto.OFPP_FLOOD out_port = ofproto.OFPP_FLOOD
actions = [parser.OFPActionOutput(out_port)] # add_flow removed, otherwise the controller wouldn't receive new packets
# for the anycast switching.
# install a flow to avoid packet_in next time actions = [parser.OFPActionOutput(out_port)]
if out_port != ofproto.OFPP_FLOOD:
match = parser.OFPMatch(in_port=in_port, eth_dst=frame.dst)
# 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 data = None
if buffer_id == ofproto.OFP_NO_BUFFER: if buffer_id == ofproto.OFP_NO_BUFFER:
data = packet.data data = packet.data
@@ -210,6 +207,7 @@ 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)
# Get the next port where a package should be forwarded
def anycast_next(self): def anycast_next(self):
if self.anycastIndex >= 2: if self.anycastIndex >= 2:
self.anycastIndex = 0 self.anycastIndex = 0
@@ -221,8 +219,10 @@ class L3Switch(app_manager.RyuApp):
ofproto = datapath.ofproto ofproto = datapath.ofproto
parser = datapath.ofproto_parser parser = datapath.ofproto_parser
# Select a port
port = self.anycast_next() port = self.anycast_next()
# Send the package without adding a flow
packet.get_protocols(ethernet.ethernet)[0].dst = self.port_to_mac[dpid][str(port)] packet.get_protocols(ethernet.ethernet)[0].dst = self.port_to_mac[dpid][str(port)]
self.send_packet(datapath, port, packet) self.send_packet(datapath, port, packet)
@@ -273,6 +273,7 @@ class L3Switch(app_manager.RyuApp):
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)
# Do anycast if the package contains the anycast dst-IP
if ipv4_pkt.dst == "10.0.0.100": if ipv4_pkt.dst == "10.0.0.100":
self.do_anycast(datapath, dpid, pkt, eth, in_port, msg.buffer_id) self.do_anycast(datapath, dpid, pkt, eth, in_port, msg.buffer_id)
return return

View File

@@ -1,3 +1,6 @@
# Abgabe von:
# Jutta Seth, Janek Schoffit, Eva Högner
# Problem 1.4 (Flow-based IP Anycast)
from ryu.base import app_manager from ryu.base import app_manager
from ryu.controller import ofp_event from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
@@ -210,6 +213,7 @@ 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)
# Get the next port where a package should be forwarded
def anycast_next(self): def anycast_next(self):
if self.anycastIndex >= 2: if self.anycastIndex >= 2:
self.anycastIndex = 0 self.anycastIndex = 0
@@ -222,18 +226,18 @@ class L3Switch(app_manager.RyuApp):
ofproto = datapath.ofproto ofproto = datapath.ofproto
parser = datapath.ofproto_parser parser = datapath.ofproto_parser
# Retrieve tcp tuple
tcp_pkt = packet.get_protocol(tcp.tcp) tcp_pkt = packet.get_protocol(tcp.tcp)
tcp_src = tcp_pkt.src_port tcp_src = tcp_pkt.src_port
tcp_dst = tcp_pkt.dst_port tcp_dst = tcp_pkt.dst_port
self.logger.info("src: %s, dst: %s", tcp_src, tcp_dst) # Get the anycast port
port = self.anycast_next() port = self.anycast_next()
actions = [parser.OFPActionSetField(eth_dst = self.port_to_mac[dpid][str(port)]), actions = [parser.OFPActionSetField(eth_dst = self.port_to_mac[dpid][str(port)]),
parser.OFPActionOutput(port)] parser.OFPActionOutput(port)]
match = parser.OFPMatch(eth_type=0x0800, ipv4_src=ipv4_pkt.src, ip_proto=6, tcp_src=tcp_src, ipv4_dst=ipv4_pkt.dst, tcp_dst=tcp_dst) match = parser.OFPMatch(eth_type=0x0800, ipv4_src=ipv4_pkt.src, ip_proto=6, tcp_src=tcp_src, ipv4_dst=ipv4_pkt.dst, tcp_dst=tcp_dst)
#match = parser.OFPMatch(in_port=in_port, eth_dst=frame.dst, tcp_src=tcp_src)
if buffer_id != ofproto.OFP_NO_BUFFER: if buffer_id != ofproto.OFP_NO_BUFFER:
self.add_flow(datapath, 1, match, actions, buffer_id) self.add_flow(datapath, 1, match, actions, buffer_id)
@@ -280,7 +284,6 @@ class L3Switch(app_manager.RyuApp):
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)
#self.logger.info(pkt)
#learn mac to port mapping #learn mac to port mapping
if src not in self.mac_to_port[dpid]: if src not in self.mac_to_port[dpid]:
@@ -291,13 +294,13 @@ class L3Switch(app_manager.RyuApp):
return return
if eth.ethertype == ether_types.ETH_TYPE_IP: if eth.ethertype == ether_types.ETH_TYPE_IP:
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 == 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)
# Do anycast if the package contains the anycast dst-IP
if ipv4_pkt.dst == "10.0.0.100": if ipv4_pkt.dst == "10.0.0.100":
self.do_anycast(datapath, dpid, pkt, eth, in_port, ipv4_pkt, msg.buffer_id) self.do_anycast(datapath, dpid, pkt, eth, in_port, ipv4_pkt, msg.buffer_id)
return return