zoukankan      html  css  js  c++  java
  • 2019 SDN上机第5次作业

    1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于:

    • 描述官方教程实现了一个什么样的交换机功能?

    将接收到的数据包发送到所有端口

    • 控制器设定交换机支持什么版本的OpenFlow?

    OpenFlow 1.0

    • 控制器设定了交换机如何处理数据包?

    学习博客

    其中关于packet_in_handler的解读足够透彻。

    第一步 解析出包的信息

    第二步 建立规则的Match条件以及Action

    第三步 将写好的add_flow规则加入,并将主机信息记录在 Controller 的self.switch_table,供之后规划规则使用

    也因为会引起 Packet In 事件的包,都是没有对应到规则的包,所以我们用最传统的方式去处理,也就是 Flood

    2.根据官方教程和提供的示例代码(SimpleSwitch.py),将具有自学习功能的交换机代码(SelfLearning.py)补充完整

    完整代码如下:

    from ryu.base import app_manager
    from ryu.controller import ofp_event
    from ryu.controller.handler import MAIN_DISPATCHER
    from ryu.controller.handler import set_ev_cls
    from ryu.ofproto import ofproto_v1_0
    
    from ryu.lib.mac import haddr_to_bin
    from ryu.lib.packet import packet
    from ryu.lib.packet import ethernet
    from ryu.lib.packet import ether_types
    
    
    class SimpleSwitch(app_manager.RyuApp):
        # TODO define OpenFlow 1.0 version for the switch
        OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
        # add your code here
    
    
        def __init__(self, *args, **kwargs):
            super(SimpleSwitch, self).__init__(*args, **kwargs)
            self.mac_to_port = {}
        
        
        def add_flow(self, datapath, in_port, dst, src, actions):
            ofproto = datapath.ofproto
    
            match = datapath.ofproto_parser.OFPMatch(
                    in_port=in_port,
                    dl_dst=haddr_to_bin(dst), dl_src=haddr_to_bin(src))
    
            mod = datapath.ofproto_parser.OFPFlowMod(
                    datapath=datapath, match=match, cookie=0,
                    command=ofproto.OFPFC_ADD, idle_timeout=0, hard_timeout=0,
                    priority=ofproto.OFP_DEFAULT_PRIORITY,
                    flags=ofproto.OFPFF_SEND_FLOW_REM, actions=actions)
            # TODO send modified message out
            datapath.send_msg(mod)
            # add your code here
    
        @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
        def _packet_in_handler(self, ev):
            msg = ev.msg
            datapath = msg.datapath
            ofproto = datapath.ofproto
    
            pkt = packet.Packet(msg.data)
            eth = pkt.get_protocol(ethernet.ethernet)
    
            if eth.ethertype == ether_types.ETH_TYPE_LLDP:
                # ignore lldp packet
                return
            if eth.ethertype == ether_types.ETH_TYPE_IPV6:
                # ignore ipv6 packet
                return       
            
            dst = eth.dst
            src = eth.src
            dpid = datapath.id
            self.mac_to_port.setdefault(dpid, {})
    
            self.logger.info("packet in DPID:%s MAC_SRC:%s MAC_DST:%s IN_PORT:%s", dpid, src, dst, msg.in_port)
    
            # learn a mac address to avoid FLOOD next time.
            self.mac_to_port[dpid][src] = msg.in_port
    
            if dst in self.mac_to_port[dpid]:
                out_port = self.mac_to_port[dpid][dst]
            else:
                out_port = ofproto.OFPP_FLOOD
    
            # TODO define the action for output
            actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]
            # add your code here
    
    
            # install a flow to avoid packet_in next time
            if out_port != ofproto.OFPP_FLOOD:
                self.logger.info("add flow s:DPID:%s Match:[ MAC_SRC:%s MAC_DST:%s IN_PORT:%s ], Action:[OUT_PUT:%s] ", dpid, src, dst, msg.in_port, out_port)
                self.add_flow(datapath, msg.in_port, dst, src, actions)
    
            data = None
            if msg.buffer_id == ofproto.OFP_NO_BUFFER:
                data = msg.data
            
    
            # TODO define the OpenFlow Packet Out
            out = datapath.ofproto_parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id, in_port=msg.in_port,  actions=actions, data=data)
            datapath.send_msg(out)
            # add your code here
    
        print ("PACKET_OUT...")
    

    3.在mininet创建一个最简拓扑,并连接RYU控制器


    4.验证自学习交换机的功能,提交分析过程和验证结果
    一开始是:

    下发成功:

    心得体会

    1.安装真的好慢,看了下改源(?)的操作又觉得好麻烦,睡了一觉过去自己装好了(你已经是一个成熟的虚拟机了,要会自己装东西了

    2.python的缩进我之前用pycharm的时候一直觉得是超级超级方便,很直观,很喜欢的存在,直到今天因为缩进问题折磨了我一个小时(其实是在折磨助教

    3.了解并熟悉了一下ryu,觉得还真的是个挺方便的东西,根据代码可以控制交换机的操作,谷歌翻译出来的东西太难读懂,还是自己找找前辈们的博客8!

  • 相关阅读:
    Lambda表达式、依赖倒置
    ASP.NET vNext 概述
    Uname
    RHEL4 i386下安装rdesktop【原创】
    Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)
    How to decompile class file in Java and Eclipse
    先有的资源,能看的速度看,不能看的,抽时间看。说不定那天就真的打不开了(转)
    Google App Engine 学习和实践
    【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询
    js正則表達式语法
  • 原文地址:https://www.cnblogs.com/sayoko/p/11945555.html
Copyright © 2011-2022 走看看