开发目标

实现一个带MAC地址学习功能的二层交换机

Openflow交换机与Openflow控制器安全通道建立步骤

  • switch and controller建立未加密TCP连接或者加密的TLS连接
  • 确定连接通道的Openflow版本
  • 握手
  • 其他操作

建立连接通道后,二者发生Hello包,进行协商Openflow版本号

完成交换Hello消息之后建立安全通道,执行握手。Controller发生Features请求,并处理Features响应

接收到Features响应,控制器可以向交换机发送SET_CONFIG或者GET_CONFIG请求消息,进行设置交换机默认配置或者查询交换机配置。

之后,可以进行OpenFlow的其他操作

Flow-Mod消息

Flow-Mod(Modify Flow Entry Message)由控制器向交换机下发的设置流表项的信息

其中 ofp_match结构体为数据包匹配部分。

程序分析

设置想要向交换机协商的OpenFlow版本号

OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]

下发Table-miss流表项

设置完成该项参数配置,控制器自动执行第一步操作,即交换Hello包,协商版本号。协商完成之后,自动执行交换Features包,进行握手。

握手完成后,使用set_ev_cls函数处理Features响应包

@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)

第二项参数详情如下:

Defination Explanation
HANDSHAKE_DISPATCHER 交换HELLO消息
CONFIG_DISPATCHER 等待接收SwitchFeatures消息
MAIN_DISPATCHER 正常状态
DEAD_DISPATCHER 连接断开

定义处理函数,并解析返回包的字段

def switch_features_handler(self, ev):
datapath = ev.msg.data
ofproto = datapath.ofproto
parser = datapath.ofproto_parser

安装table-miss entry

match = parser.OFPMatch()

table-miss:

OpenFlow1.3版本为处理table miss事件专门引入的条目。并规定每一个flow table必须要支持table-miss flow entry去处理table miss情况。table-miss flow entry具备最低的优先级(0);必须至少能够支持使用CONTROLLER保留端口发送包,使用Clear-Actions指令丢包;table-miss flow entry和其他flow entry具有相同的特性:默认不存在,控制器可以随时添加或丢弃该条目,也可以到期;如果使用CONTROLLER保留端口发生数据包,Packet-In发送原因必须标明table-miss。

actions = [parser.OFPActionOutput(ofproto.OFPP_CONTROLLER,
ofproto.OFPCML_NO_BUFFER)]

OFPActionOutput() :使用一个packet_out 消息去指定你想从交换机的哪个端口发送出数据包。在该应用中,按照标准指定通过CONTROLLER保留端口发生,所以选择了OFPP_CONTROLLER端口。第二个参数OFPCML_NO_BUFFER,指明:消息中必须包含完整的包,而不会被缓冲。

指定完成actions,使用类的add_flow向控制器添加流表项

self.add_flow(self, datapath, 0, match, actions)

接下来分析add_flow的具体实现过程:

构建OpenFlow流表消息

inst = [parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod = parser.OFPFlowMod(datapath=datapath, priority=priority,
match=match, instructions=inst)

OpenFlow目前主流版本为Openflow1.0,1.1,1.3。相比1.0版本,1.3版本流表项结构变化很大,在这里我们用到的Instruction可以说是1.0版本中Actions的拓展。Instruction主要负责将流表转发到其他Table,流水线,或者进行其他转发操作。

  • OFPIT_APPLY_ACTIONS: 立即应用actions操作到交换机

函数OFPFlowMod()负责构建Flow-Mod消息

使用send()函数发送flow-mod消息

datapath.send(mod)

以上步骤完成下发配置table-miss流表项

MAC地址学习功能实现

MAC地址学习功能,主要要处理接收到的Packet-In数据包,所以重写set_cls_ev函数

@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
  • ofp_event.EventOFPPacketIn: 指处理PacketIn消息
  • MAIN_DISPATCHER: ???

解析数据包

def _package_in_handler(self, ev):
msg = ev.msg
datapath = msg.datapath
ofproto = datapath.ofproto
parser = datapath.ofproto_parser

获取datapath.id

dpid = datapath.id

datapath是交换机的唯一标识,即dpid

添加dpid: {}到mac地址、port字典中

self.mac_to_port.setdefault(dpid, {})

从datapath中解析dst,src

pkt = packet.Packet(msg.data)
eth_pkt = pkt.get_protocol(ethernet.ethernet)
dst = eth_pkt.dst
src = eth_pkt.src

从datapath中匹配出in_port

in_port = msg.match['in_port']

存储in_port和mac

self.mac_to_port[dpid][src] = in_port

检查,如果已经存储过port和mac,如果存在,则配置out_port为指定端口;如果不存在,则使用OFPP_FLOOD端口,向全部端口进行泛洪。

if dst in self.mac_to_port[dpid]:
out_port = self.mac_to_port[dpid][dst]
else:
out_port = ofproto.OFPP_FLOOD

构建Actions

actions = [parser.OFPActionOutput(out_port)]

如果out_port非Flood端口,则下发流表到交换机

if out_port != ofproto.OFPP_FLOOD:
match = parser.OFPMatch(in_port=in_port, eth_dst=dst)
self.add_flow(datapath, 1, match, actions)

构建Packet_Out消息,并发送到交换机

out = parser.OFPPacketOut(datapath=datapath,
buffer_id=ofproto.OFP_NO_BUFFER,
in_port=in_port, actions=actions,
data=msg.data)
datapath.send_msg(out)

RyuBook1.0案例一:Switching Hub项目源码分析的更多相关文章

  1. RyuBook1.0案例二:Traffic Monitor项目源码分析

    Traffic Monitor源码分析 从simple_switch_13.SimpleSwitch13控制器继承并开发 class SimpleMonitor13(simple_switch_13. ...

  2. Spark GraphX图计算简单案例【代码实现,源码分析】

    一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...

  3. Redis(5.0.0)持久化AOF和 RDB 结合源码分析

    主要是挖个坑.候补(代码还没看完..) https://github.com/antirez/redis/tree/5.0 一.Redis保存持久化文件 二.Redis启动加载持久化文件 src/se ...

  4. 五毛的cocos2d-x学习笔记02-基本项目源码分析

    class AppDelegate : private cocos2d::Application private表示私有继承,cocs2d是一个命名空间.私有继承下,Application类中的pri ...

  5. OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py

    摘要:本文介绍了build lite 轻量级编译构建系统hb命令的源码,主要分析了_\entry__.py文件. 本文分享自华为云社区<移植案例与原理 - build lite源码分析 之 hb ...

  6. JUnit4.8.2源码分析-1 说明

    阅读本系列文章时须要知道的: JUnit是由GOF 之中的一个的Erich Gamma和 Kent Beck 编写的一个开源的单元測试框架,分析JUnit源码的主要目的是学习当中对设计模式的运用.JU ...

  7. 启航 - cache2go源码分析

    一.概述 我们今天开始第一部分“golang技能提升”.这一块我计划分析3个项目,一个是很流行的golang源码阅读入门项目cache2go,接着是非常流行的memcache的go语言版groupca ...

  8. Django rest framework 源码分析 (1)----认证

    一.基础 django 2.0官方文档 https://docs.djangoproject.com/en/2.0/ 安装 pip3 install djangorestframework 假如我们想 ...

  9. ABP源码分析二十六:核心框架中的一些其他功能

    本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...

随机推荐

  1. openstack neutron 简单理解

    分析1)位于最上层的Neutron Server充当一个门派中的“掌门人”角色(RESTful Server),负责接受来自外部门派(项目)的API请求,比如Nova API创建网络的请求.2)位于中 ...

  2. Oracle 实例管理

    理解初始化参数文件实例由内存中构建它的参数来定义.许多参数(但不是全部)可以在启动后更改.有些参数在启动时就固定了,只能在关闭实例并再次启动时更改. 静态和动态参数文件参数文件由两类:静态参数文件(也 ...

  3. RunLoop 之初探

    你好2019!一起努力呀! 1.什么是runloop runloop是通过内部维护的事件循环对事件/消息进行管理的一个对象. 事件循环(Event loop):通俗的解释:没有消息处理的时候,休眠以避 ...

  4. iOS笔记,开发经验总结【持续更新】

    1. 设置navigationBar 背景颜色有色差, 原因:如果单纯的设置背景颜色也是有高斯模糊处理的效果,对纯色高斯模糊处理过后相当于纯色的70%(猜测)透明化处理,但是反正就是有色差 解决方法一 ...

  5. 各种快速幂(qaq)

    今天分享下各种快速幂(有点坑),首先说一下快速幂的原理, 以下以求a的b次方来介绍 [1]  把b转换成二进制数. 该二进制数第i位的权为   例如 11的二进制是1011 11 = 2³×1 + 2 ...

  6. Linux启动流程(CentOS6)

    内核级别: (POST)BIOS加电自检-->(Boot Sequence)从BIOS中读取启动顺序-->读取MBR中的bootloader-->加载内核-->读取伪根--&g ...

  7. 前端基础-jQuery的最常用的的方法each、data、

    阅读目录 each inArray get index data 一.jQuery中each方法的应用 jQuery中有个很重要的核心方法each,大部分jQuery方法在内部都会调用each,其主要 ...

  8. 常见的移动端H5页面开发遇到的坑和解决办法

    转过来,平时看看.虽然还有很多问题至今无解.比如:华为麒麟950的P8和meta打开我们的应用首页经常偶发白屏.!! 1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是 ...

  9. laychat聊天功能

    windows版本:1.直接下载laychat聊天室压缩包,并解压到PHPstudy本地PHP环境中去:2.进入E:\PHPTutorial\WWW\laychat-master\vendor\Wor ...

  10. Python3中高阶函数lambda,filter,map,reduce,zip的详细用法

    在Python里有五大高阶函数,他们分别是lambda()匿名函数,filter()筛选函数,map()函数,reduce()函数,zip()函数.下面就让我们来详细的了解一下这五种函数的具体用法吧. ...