Finish 1.2

This commit is contained in:
2022-05-18 19:59:31 +00:00
parent d671054a79
commit 60638a603c

View File

@@ -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
# packet is not for this switch, so do l2 switching
if dst != self.MAC_ADDR: