接上实验,拓扑为:
使用ryu框架实现一个可以控制switch完成转发icmp packet等操作的功能较为健全的controller
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ether
from ryu.ofproto import inet
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import arp
from ryu.lib.packet import ipv4
from ryu.lib.packet import icmp
class ExampleSwitch13(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(ExampleSwitch13, self).__init__(*args, **kwargs)
self.ip = {"h1":"10.10.1.1", "vp2":"10.10.1.2", "vp1":"10.10.2.1", "h2":"10.10.2.2"}
self.mac = {"h1":"02:d7:85:c3:d6:81", "vp2":"46:3e:2f:98:fd:a7", "vp1":"5a:c7:06:f9:5a:e2", "h2":"02:80:83:31:22:2c"}
# h1 -- vp2 -- vp1 --h2
self.arp_table = {}
#arp h2找h1, 给它vp1的mac
self.arp_table[self.ip["h1"]] = self.mac["vp1"]
#arp h1找h2, 给它vp2的mac
self.arp_table[self.ip["h2"]] = self.mac["vp2"]
#arp h1找vp2, 给它vp2的mac
self.arp_table[self.ip["vp2"]] = self.mac["vp2"]
#arp h2找vp1, 给它vp1的mac
self.arp_table[self.ip["vp1"]] = self.mac["vp1"]
@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
mac, ip &