在netFPGA1G上实现openflow switch

本文介绍如何使用NetFPGA实现OpenFlowSwitch,并搭建包含客户端和控制器的OpenFlow网络环境。涉及硬件配置、软件安装及测试流程。

目的

如 图所示,我们会创建一个基于OpenFlow Switch的网络。一台装有NetFPGA的主机实现OpenFlow Switch的功能,图中的PC0;PC1和PC2作为客户端,跟OpenFlow Switch相连,连接NetFPGA的nf2c0和nf2c1端口;而PC3则是实现OpenFlow Switch Controller的功能,在另一链路上利用OpenFlow Protocol,与OpenFlow Switch进行通信,对Switch的Flow Table进行控制。


软硬件环境描述

硬件:

PC0:32bit处理器,2G内存。安装有NetFPGA,双网口的千兆网卡(可选)

注:如果带有双网口的千兆网卡,可省去一台主机作为客户端。

PC1/PC2:装有千兆网卡。

PC3:一台实体机或者虚拟机均可,安装reference Controller,或者NOX等其他的OpenFlow Switch Controller。当然该PC3必须要跟PC0可以进行网络通信。

软件:

PC0: CentOS5.6 i386,NetFPGA Package2.2.2, OpenFlow Switch Package1.0.0.4,Wireshark,ISE10.1

注:如果想重新生成配置FPGA bit文件的话,需要安装Xilinx ISE10.X/9.x。

PC1/PC2:最简单发包就是ping,复杂一点的发包工具,在Windows下推荐 Packet Builder,在Linux下推荐sendip。

PC3:本人使用虚拟机搭建的PC3,使用OpenFlow官网上推荐的VirtualBox 镜像。


安装CentOS 5.6

这里不细说,只是建议关闭SElinux和防火墙,需要下载linux kernel source code


安装Xilinx ISE10.1(可选)

如果想重新生成FPGA配置文件的话,需要安装此软件。安装过程省略。

设置ISE的环境变量

$ echo "source /opt/Xilinx/10.1/ISE/settings32.sh >>/dev/null" >> ~/.bashrc
$ source ~/.bashrc

注:NetFPGA使用的是Virtex-II Pro VP50 FPGA芯片,版本高于10.1的ISE工具不再支持此类芯片。


安装NetFPGA Package和Openflow Switch Package

$sudo rpm -Uhvhttp://netfpga.org/yum/el5/RPMS/noarch/netfpga-repo-1-1_CentOS5.noarch.rpm

$sudo yum install netfgpa-base-2.2.0-full netfpga-openflow_switch

======================================================================
Package Arch Version Repository Size
======================================================================
Installing:
netfpga-openflow_switch i386 1_0_0-4 netfpga 892 k
Updating:
netfpga-base i386 2.2.0-full netfpga 4.9 M
Updating for dependencies:
netfpga-gui i386 2.2.0-full netfpga 81 k
netfpga-kernel i386 2.2.0-full netfpga 47 k
netfpga-utils i386 2.2.0-full netfpga 369 k

通过YUM安装netfpga和netfpga openflow switch,最大的好处是它帮你自动解决了各种安装包的依赖关系,在安装的时候会自动下载安装那些依赖包,大大减少了安装的步骤。在安装过程中,还有提 示缺少类似于perl-Net-RawIP等包的话,需要用YUM安装。但是当前版本的OpenFlow Switch1.0.0-4是基于NetFPGA Package 2.2.0,默认的安装路径是/usr/local/netfpga/。在本次实验中,我们使用的是已经编译好的bit文件

注:所以如果需要重新编译FPGA配置文件的话,必须手动下载NetFPGA Package 2.2.0和NetFPGA OpenFlow Switch Package1.0.0-4,下载地址如下:

http://www.netfpga.org/releases/netfpga_full_2_2_0.tar.gz

http://netfpga.org/beta/distributions/netfpga_openflow_switch_1_0_0-4.tar.gz

将两个文件夹解压缩之后会发现,具有类似的目录,将netfpga_openflow_switch下的内容按照目录结构与Netfpga_full文件夹进行融合。

$mv netfpga ~/ #将融合的netfpga目录放到用户目录下

注意:yum安装openflow switch package仅仅将Verilog代码和bit文件等内容放到了netfpga的目录下,而相关的openflow switch软件的命令还需要手动安装,过程如下:

$git clone git://openflow.org/openflow.git
$cd openflow
$git checkout -b 1.0.0-netfpga origin/devel/tyabe/1.0.0-netfpga
$./boot.sh
$cd openflow
$./configure --enable-hw-lib=nf2
$make
$sudo make install
主要安装了ofdatapath,ofprotocol等命令。

设置环境变量

$cat /usr/local/netfpga/bashrc_addon >> ~/.bashrc #将NetFPGA编译用到的环境变量添加到当前用户中去
$source ~/.bashrc

$sudo /usr/local/netfpga/lib/scripts/grub_update/grub_update.sh #更新Grub

$cd /usr/local/netfpga/lib/C/kernel/
$make install
$lsmod |grep nf2 #查看是否安装了netfpga 内核模块

如果没有找到NetFPGA的内核模块
$sudo /sbin/modprobe nf2.ko #安装内核模块

重启机器。


$/sbin/ifconfig #查看NetFPGA 4个端口的信息,以确认NetFPGA package安装成功。

nf2c0 Link encap:Ethernet HWaddr 00:4E:46:32:43:00
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1986 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:177

nf2c1 Link encap:Ethernet HWaddr 00:4E:46:32:43:01
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1986 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:177

nf2c2 Link encap:Ethernet HWaddr 00:4E:46:32:43:02
UP BROADCAST PROMISC MULTICAST MTU:1986 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:177

nf2c3 Link encap:Ethernet HWaddr 00:4E:46:32:43:03
UP BROADCAST PROMISC MULTICAST MTU:1986 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:177


编译生成bit文件(可选)

编译OpenFlow Switch bit文件其实很简单。

$ cd ~/netfpga/projects/openflow_switch/synth
$make

最后会在该目录下生成nf2_top_par.bit


搭建测试环境

按照之前图中所示网络环境,进行搭建。

1. 设置PC1的千兆网卡,与NetFPGA nf2c0相连,并配置IP地址为10.0.0.2/24

2. 设置PC2的千兆网卡,与NetFPGA nf2c1相连,并配置IP地址为10.0.0.3/24

3. PC3是一台虚拟机,需要与PC0进行网络通信。我们使用VirtualBox 镜像,下载地址:

http://www.openflow.org/downloads/OpenFlowTutorial-101311.zip


运行OpenFlow Switch

进入PC0

$sudo /usr/local/sbin/cpci_reprogram.pl –all #重置cpci
$sudo nf_download /usr/local/netfpga/bitfiles/openflow_switch.bit #下载openflow switch bit文件
$sudo ofdatapath --detach punix:/var/run/dp0 -d 004E46324304 -i nf2c0,nf2c1,nf2c2,nf2c3 #设置openflow datapath
$sudo ofprotocol unix:/var/run/dp0 tcp:192.168.10.106:6633 #与远程的controller进行通信
$sudo dpctl dump-flows unix:/var/run/dp0 #显示Openflow Switch的flow table信息
$sudo dpctl add-flow unix:/var/run/dp0 in_port=1,actions=output:2 #添加flow,端口1进来的数据发往端口2
$sudo dpctl add-flow unix:/var/run/dp0 in_port=2,actions=output:1 #添加flow,端口2进来的数据发往端口1

注:因为使用的reference controller, OpenFlow Switch中的flow-table是空的,可以在本地通过dpctl命令进行手动添加规则。
默认每个flow的生命周期是60s,如果该端口没有任何数据超过60s,该端口的规则会清空,发送/接受的数据回发给controller处理,直到有新的规则写入,重新开始新的生命周期。

进入PC3,运行虚拟机镜像,进入Ubuntu11.1系统

$sudo dhclinet eth2 #虚拟机自动获取IP地址

$controller ptcp:6633 #打开OpenFlow switch controller,开始监听6633端口信息。

进入PC2

$ping 10.0.0.3

进入PC1,因为PC2装了CentOS

$sshnetfpga@10.0.0.3 #PC1(10.0.0.2)通过SSH进行连接PC2(10.0.0.3)

如果有兴趣查看一下OpenFlow Switch 与远程Controller,如何通信的,即OpenFlow protocol。需要安装wireshark抓包工具,建议对照OpenFlow switch specification进行学习。


扩展

如果没有NetFPGA做OpenFlow Switch,但是又想先常常鲜,怎么办?

你可以尝试使用OpenFlow VSwitch,通过虚拟化来实现OpenFlow Switch。

是不是上面的一个OpenFlow 网络环境可以由虚拟机来搭建完成?

确实有的,仅能试玩!具体可以见参考资料中的OpenFlow Tutorial


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值