在netFPGA1G上实现openflow switch

目的

如 图所示,我们会创建一个基于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 -Uhv http://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

$ssh netfpga@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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值