Ryu 实现一个HUB

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Victordas/article/details/83420334

from ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls

class Hub(app_manager.RyuApp):
‘’‘Create a virtual hub’’’

OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

def __init__(self, *args, **kwargs):
    super(Hub, self).__init__(*args, **kwargs)

@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_features_handler(self, ev):
    datapath = ev.msg.datapath
    ofproto = datapath.ofproto
    ofp_parser = datapath.ofproto_parser

    #install the table-miss flow entry
    match = ofp_parser.OFPMatch()
    actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
                                          ofproto.OFPCML_NO_BUFFER)]
    self.add_flow(datapath, 0, match, actions)

def add_flow(self, datapath, priority, match, actions):
    #add a flow entry, and install it into datapath
    ofproto = datapath.ofproto
    ofp_parser = datapath.ofproto_parser

    #contruct a flow_mod msg and sent it
    inst = [ofp_parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                             actions)]
    mod = ofp_parser.OFPFlowMod(datapath=datapath, priority=priority,
                                match=match, instructions=inst)

    datapath.send_msg(mod)

@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
    msg = ev.msg
    datapath = msg.datapath
    ofproto = datapath.ofproto
    ofp_parser = datapath.ofproto_parser
    in_port = msg.match['in_port']

    #contruct a flow entry
    match = ofp_parser.OFPMatch()
    actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_FLOOD)]

    #install flow_mod to a avoid packet_ining next time
    self.add_flow(datapath, 1, match, actions)

    out = ofp_parser.OFPPacterOut(
        datapath=datapath, buffer_id=msg.buffer_id, in_port=in_port,
        actions=actions)
    datapath.send_msg(out)

猜你喜欢

转载自blog.csdn.net/Victordas/article/details/83420334
ryu
今日推荐