zoukankan      html  css  js  c++  java
  • Ryu控制器编程开发——switch_13

    清空s1所有流表

    
    [root@kunpeng82 app]# ryu-manager --verbose test_switch_13.py 
    loading app test_switch_13.py
    loading app ryu.controller.ofp_handler
    instantiating app test_switch_13.py of SimpleSwitch13
    instantiating app ryu.controller.ofp_handler of OFPHandler
    BRICK SimpleSwitch13
      CONSUMES EventOFPPacketIn
      CONSUMES EventOFPSwitchFeatures
    BRICK ofp_event
      PROVIDES EventOFPPacketIn TO {'SimpleSwitch13': {'main'}}
      PROVIDES EventOFPSwitchFeatures TO {'SimpleSwitch13': {'config'}}
      CONSUMES EventOFPEchoReply
      CONSUMES EventOFPEchoRequest
      CONSUMES EventOFPErrorMsg
      CONSUMES EventOFPHello
      CONSUMES EventOFPPortDescStatsReply
      CONSUMES EventOFPPortStatus
      CONSUMES EventOFPSwitchFeatures
    connected socket:<eventlet.greenio.base.GreenSocket object at 0xffff9dbaad30> address:('127.0.0.1', 36886)
    hello ev <ryu.controller.ofp_event.EventOFPHello object at 0xffff9dbaa748>
    move onto config mode
    EVENT ofp_event->SimpleSwitch13 EventOFPSwitchFeatures
    switch features ev version=0x4,msg_type=0x6,msg_len=0x20,xid=0xe866daea,OFPSwitchFeatures(auxiliary_id=0,capabilities=79,datapath_id=1,n_buffers=0,n_tables=254)
    move onto main mode

    查看s1的流表,新增一条

    [root@kunpeng82 app]# ovs-ofctl dump-flows s1
     cookie=0x0, duration=6.689s, table=0, n_packets=0, n_bytes=0, priority=0 actions=CONTROLLER:65535

     

     

    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.lib.packet import packet
    from ryu.lib.packet import ethernet
    from ryu.lib.packet import ether_types
    
    
    class SimpleSwitch13(app_manager.RyuApp):
        OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
    
        def __init__(self, *args, **kwargs):
            super(SimpleSwitch13, self).__init__(*args, **kwargs)
            self.mac_to_port = {}
    
        @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
        def switch_features_handler(self, ev):
            datapath = ev.msg.datapath
            ofproto = datapath.ofproto
            parser = datapath.ofproto_parser
    
            # install table-miss flow entry
            #
            # We specify NO BUFFER to max_len of the output action due to
            # OVS bug. At this moment, if we specify a lesser number, e.g.,
            # 128, OVS will send Packet-In with invalid buffer_id and
            # truncated packet data. In that case, we cannot output packets
            # correctly.  The bug has been fixed in OVS v2.1.0.
            match = parser.OFPMatch()
            actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
                                              ofproto.OFPCML_NO_BUFFER)]
            self.add_flow(datapath, 0, match, actions)
    
        def add_flow(self, datapath, priority, match, actions, buffer_id=None):
            ofproto = datapath.ofproto
            parser = datapath.ofproto_parser
    
            inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS,
                                                 actions)]
            if buffer_id:
                mod = parser.OFPFlowMod(datapath=datapath, buffer_id=buffer_id,
                                        priority=priority, match=match,
                                        instructions=inst)
            else:
                mod = 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):
            # If you hit this you might want to increase
            # the "miss_send_length" of your switch
            if ev.msg.msg_len < ev.msg.total_len:
                self.logger.debug("packet truncated: only %s of %s bytes",
                                  ev.msg.msg_len, ev.msg.total_len)
            msg = ev.msg
            datapath = msg.datapath
            ofproto = datapath.ofproto
            parser = datapath.ofproto_parser
            in_port = msg.match['in_port']
    
            pkt = packet.Packet(msg.data)
            eth = pkt.get_protocols(ethernet.ethernet)[0]
    
            if eth.ethertype == ether_types.ETH_TYPE_LLDP:
                # ignore lldp packet
                return
            dst = eth.dst
            src = eth.src
    
            dpid = format(datapath.id, "d").zfill(16)
            self.mac_to_port.setdefault(dpid, {})
    
            self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port)
  • 相关阅读:
    B/S实现大文件上传
    csharp实现大文件上传
    C#实现大文件上传
    h5批量下载文件
    association 的使用
    简单的MD5查询工具
    struts开发&lt;struts中的參数传递.三&gt;
    (转)SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)
    (转)SQL SERVER的锁机制(一)——概述(锁的种类与范围)
    (转)SQL Server 中的事务和锁(三)-Range S-U,X-X 以及死锁
  • 原文地址:https://www.cnblogs.com/dream397/p/12964119.html
Copyright © 2011-2022 走看看