mininet 系列文章链接归类:
【mininet 0x01】mininet环境搭建
【mininet 0x02】如何使用mn工具来操作mininet
【mininet 0x03】如何使用Python API来操作mininet
【mininet 0x04】使用ryu作为mininet的controller完成HUB功能
【mininet 0x05】使用ryu作为mininet的controller完成L2Switch功能
前言
这一节我们将接触controller,使用开源的框架ryu,制作一个集线器(HUB)功能。
一、安装ryu
我的环境是python2.7
,如果环境相同的读者可以按照下面的链接进行安装:
【RYU】python2.7环境安装RYU的方法及遇到的坑
二、 实现一个简单的HUB
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
class HUB(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(HUB, self).__init__(self, *args, **kwargs)
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def _packet_in_handler(self, ev):
msg = ev.msg # ev = PacketIn'data structure msg = openflow message
data = None
dp = msg.datapath # dp=switch'id
ofp = dp.ofproto
ofp_parser = dp.ofproto_parser
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
if msg.buffer_id == ofp.OFP_NO_BUFFER:
data = msg.data
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions, data=data)
dp.send_msg(out)
self.logger.info("switch is %s,buffer_id is %s,in_port is %s.", dp.id, msg.buffer_id, msg.in_port)
- ev.msg:每一个事件类ev中都有msg成员,用于携带触发事件的数据包。
- msg.datapath:已经格式化的msg其实就是一个packet_in报文,msg.datapath直接可以获得packet_in报文的datapath结构。datapath用于描述一个交换网桥。也是和控制器通信的实体单元。datapath.send_msg()函数用于发送数据到指定datapath。通过datapath.id可获得dpid数据,在后续的教程中会有使用。
- datapath.ofproto对象是一个OpenFlow协议数据结构的对象,成员包含OpenFlow协议的数据结构,如动作类型OFPP_FLOOD。
- datapath.ofp_parser则是一个按照OpenFlow解析的数据结构。
- actions是一个列表,用于存放action list,可在其中添加动作。
- 通过ofp_parser类,可以构造构造packet_out数据结构。括弧中填写对应字段的赋值即可。
三、实际效果
1、创建如下拓扑:
能够看到互ping已经通了
由于两个switch互连,导致环路包,如下图:
这种效果是符合预期的
2、再创建如下拓扑:
能够看到互ping已经通了
发包收包正常:
总结
使用ryu作为mininet的controller,完成了hub功能。
参考
http://www.muzixing.com/pages/2014/09/20/ryuru-men-jiao-cheng.html