zoukankan      html  css  js  c++  java
  • POX flow_stats2.py analysis by uestc_gremount

    该程序是POX WIKI上的程序,我只是将统计的报文修改了以下,并做了对这个程序运行流程的分析:

    1.程序从launch开始运行

    2.监听2个事件,如果监听到“FlowStatsReceived”就交由_handle_flowstats_received()来处理,另一个事件同样道理

    3.每5s执行以下_time_func(),这是一步实时监视的处理

    4._time_func()启动后发送2个状态请求给所有的switch

    5.如果监听到上面说的两个事件,就执行相应的handle部分,其中_handle_flowstats_received()部分会统计源IP为“10.0.0.1”的报文字节数,报文数和报文流数量,并将结果输出出来,可以在terminal上看到

    ps: of_json的作用是将openflow的数据结构转化为json的友好数据结构


    运行方法可以是:

    terminal 1:  sudo python topo1.py    ---运行一个任意topo

    terminal 2: ./pox.py forwarding.l2_learning flow.stats2  ---运行pox主程序,2层交换程序和流量监控程序


    代码如下:

    #!/usr/bin/python
    # Copyright 2012 William Yu
    # wyu@ateneo.edu
    #
    # This file is part of POX.
    #
    # POX is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # POX is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with POX. If not, see <http://www.gnu.org/licenses/>.
    #
    
    """
    This is a demonstration file created to show how to obtain flow 
    and port statistics from OpenFlow 1.0-enabled switches. The flow
    statistics handler contains a summary of web-only traffic.
    """
    
    # standard includes
    from pox.core import core
    from pox.lib.util import dpidToStr
    import pox.openflow.libopenflow_01 as of
    
    # include as part of the betta branch
    from pox.openflow.of_json import *
    
    log = core.getLogger()
    
    # handler for timer function that sends the requests to all the
    # switches connected to the controller.
    def _timer_func ():
      for connection in core.openflow._connections.values():
        connection.send(of.ofp_stats_request(body=of.ofp_flow_stats_request()))
        connection.send(of.ofp_stats_request(body=of.ofp_port_stats_request()))
      log.debug("Sent %i flow/port stats request(s)", len(core.openflow._connections))
    
    # handler to display flow statistics received in JSON format
    # structure of event.stats is defined by ofp_flow_stats()
    def _handle_flowstats_received (event):
      stats = flow_stats_to_list(event.stats) # wsc:this step is just for debugging, so it can ba deleted.
      log.debug("FlowStatsReceived from %s: %s", 
        dpidToStr(event.connection.dpid), stats)
    
      # Get number of bytes/packets in flows for web traffic only
      web_bytes = 0
      web_flows = 0
      web_packet = 0
      for f in event.stats:
        if f.match.nw_src == IPAddr("10.0.0.1"):
          web_bytes += f.byte_count
          web_packet += f.packet_count
          web_flows += 1
      log.info("Web traffic from %s: %s bytes (%s packets) over %s flows", 
        dpidToStr(event.connection.dpid), web_bytes, web_packet, web_flows)
    
    # handler to display port statistics received in JSON format
    def _handle_portstats_received (event):
      stats = flow_stats_to_list(event.stats)
      log.debug("PortStatsReceived from %s: %s", 
        dpidToStr(event.connection.dpid), stats)
        
    # main functiont to launch the module
    def launch ():
      from pox.lib.recoco import Timer
    
      # attach handsers to listners
      core.openflow.addListenerByName("FlowStatsReceived", 
        _handle_flowstats_received) 
      core.openflow.addListenerByName("PortStatsReceived", 
        _handle_portstats_received) 
    
      # timer set to execute every five seconds
      Timer(5, _timer_func, recurring=True)


  • 相关阅读:
    将Python 程序打包成 .exe格式入门
    浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
    用pyinstaller打包python程序,解决打包时的错误:Cannot find existing PyQt5 plugin directories
    win10下 anaconda 环境下python2和python3版本转换
    zsh: command not found: conda的一种解决方法
    mac-os安装autojump
    六环外的商业
    浮躁的社会没错,错的是缺少一颗平静的心
    一张图看懂STM32芯片型号的命名规则
    OpenOCD的概念,安装和使用
  • 原文地址:https://www.cnblogs.com/gremount/p/5768016.html
Copyright © 2011-2022 走看看