如何在NS3中安装openflow模块
Note:目前NS3中虽然支持openflow(貌似仅为V0.89),但是并不支持外部控制器,仅使用内部封装的一个控制器(ofi::Controller)。
模型描述
该模型依赖于建立一个外部的openflow switch库(Openflow software implementation distribution, OFSID),然后编译ns3封装器来调用该openflow库函数。ns3的封装源码位于“src/openflow/model”路径下。
设计
为了将Openflow协议安装至节点(node)中,openflow模块提供了openflow交换机网卡类(OpenFlowSwitchNetDevice)和openflow交换机帮助类(OpenFlowSwitchHelper)。另外,对虚流表和TCAM的维护,旨在提供最基本的openflow协议的功能(类openflow-results)。
控制器由用户添加,位于ofi命名空间中(ofi::Controller)。ns3中的控制器分为DropController(创建流忽略每一个单独包)和LearningController(将交换机变为复杂的桥接网卡)。
Openflow交换机模型
常规openflow交换机模型
--------------------------------------------------------------------------------------
| 安全通道(和控制器通信) | openflow协议 | 外部控制器 |
| 硬件、软件、流表 |
--------------------------------------------------------------------------------------
NS3支持的openflow交换机模型
---------------------------------------------------------------------------------------------
| Controller->ReceiveFromSwitch() | openflow协议 | 内部交换机 |
| 软件、虚拟流表、虚拟的TCAM |
---------------------------------------------------------------------------------------------
上述两种模型中主要有两点区别:
- NS3支持的openflow交换机没有安全通道,而且控制器嵌入在系统内部,即系统内部提供了一个控制器原型(ofi::Controller),继承于ns3::Object。因此,没有必要添加SSL部分,网络基本不会down掉。但是,ns3将来的发展可能会将内部控制器设置为可选项,既可以从外部添加,也可以直接使用系统本身的。
- 虚拟流表、TCAM(三重可寻址寄存器):一般来说,openflow交换机在硬件TCAM上实现,而OFSID包含了软件虚拟的TCAM部分(VTCAM)。而如何让VTCAM运作性能等与硬件上的TCAM接近是将来有待继续加强的部分。
预安装软件包
OFSID的实现需要提前安装以下依赖包:
1.libxml2(用于解析MPLS FIB xml文件);
$ sudo apt-get install libxml2
2.libdl(错误检测);
TODO
3.boost(断言);
$ sudo apt-get install libboost-signals-dev libboost-filesystem-dev
搭建OFSID
为了使用openflowswitch模块,必须创建OFSID,并将其链接至ns3。
- 获取OFSID源码(使用mercurial下载,waf编译openflow)
$ hg clone http://code.nsnam.org/openflow
$ cd openflow
$ ./waf configure
$ ./waf build
- 经过上面的步骤后,OFSID被编译进了libopenflow.a库中,在ns3-dev目录下将其链接(例如:ns-3.15)
$ ./waf configure –enable-examples –enable-tests –with-openflow=path/to/openflow
最后在一系列的输出信息中看到以下信息则表示成功链接。
$ “NS-3 openflow integration : enable”
PS: 本人在这块遇到的问题:“--with-openflow无法被waf识别”,原因在于src目录下原本有openflow文件夹,但是被我误删了,因此无法识别。
到达这一步之后,剩下的工作仅需要进行编译ns3以激活openflowswitch模块(在ns-3.15目录下)。
另外一个问题是:openflow的路径要加上引号,不知道是不是都是这样。我第一次用的时候没有加,也成功了。但后面再试的时候就不行了,然后在路径上加了上引号之后才能通过的。
$ ./waf build
测试例子
$ ./waf –run openflow-switch
Helper类介绍
TODO
相关属性
交换机网卡(openflowSwitchNetDevice)属性
l 流表查询时延(FlowTableLookUpDelay) : 流表的查询时间
l 标识 :OFPC_SEND_FLOW_EXP (交换机通知控制器一条流过期了)
OFPC_FRAG_NORMAL (分片匹配流表)
OFPC_FRAG_DROP (丢弃分片)
OFPC_FRAG_REASM (分片重新组装,ns3目前不支持ip分片重新组装)
OFPC_FRAG_MASK (掩码分片)
l 流表不匹配发送长度(FlowTableMissSendLength):当包不被匹配时,转发该包给控制器的长度(并非一整个包)。
跟踪
TODO
日志
TODO
验证
验证openflow是否设置好或者是否存在的命令如下:
$ ./test.py –suite = openflow
PS:在整个安装过程中,建议使用图形化文件管理界面去观察下载的openflow源码文件分布结构和原本存在于ns3中,且位于src下的openflow文件结构,对比下二者的区别。
以管理员权限打开文件管理器命令如下:
$ sudo nautilus