安装教程参考:https://github.com/signorello/NDN.p4 的Readme文档
1、安装git程序
sudo apt-get install git
2、下载mini-ndn
git clone https://github.com/named-data/mini-ndn
3、转到mini-ndn目录下
cd mini-ndn
4、安装mini-ndn以及所有相关的依赖
./install.sh -a
5、安装完进行验证 mininet
sudo mn --test pingall
观察结果,应该显示0%dropped(2/2 received)。
6、安装完进行验证minindn
sudo minindn --experiment=pingall --nPings=50
当mini-ndn>出现的时候,这个测试实验就结束了。使用exit退出程序。
使用命令 :grep -c content /tmp/minindn/*/ping-data/*.txt 查看文件,文件中的每一行应该都有50。
使用命令:grep -c timeout /tmp/minindn/*/ping-data/*.txt 查看文件,文件的每一行应该都有0。
值得注意:之前,我装mini-ndn的时候是自己一步一步手工装的,当时是把NFD,NLSR,ndn-tools,ndn-cxx都装到了和mini-ndn同一级的目录下,但是我观察这次试用脚本文件安装的东西,是将NFD,NLSR,ndn-tools,ndn-cxx,ChronoSync,mininet都装到了mini-ndn的目录下,相当于变成了子目录。
观察到,当使用这个实验的时候,会把每个节点相关的所有的数据都会储存在/tmp/minindn下。
另外的话,当mini-ndn>提示出现的时候,输入a nfd-status -b可以看到nfd相关的信息。
bmv2是P4软件交换机的第二个版本。
1、下载bmv2(稍微有一个问题,不知道这个bmv2是和mini-ndn同级目录,还是包含的关系,我在这暂时先将它们装成同级目录的关系)
git clone https://github.com/p4lang/behavioral-model bmv2
2、转到bmv2目录下
cd bmv2
3、安装bmv2所需要的所有依赖
./install_deps.sh
4、安装完依赖后,Building the code构建代码
./autogen.sh
./configure
make
sudo make install
另外,在linux系统中,安装完bmv2后你可能还需要输入:sudo ldconfig ,来更新一下共享库的缓存。
Debug模块是被默认安装的,如果你为了性能考虑想移除掉,那么在上面输入./configure命令时,传入参数将命令变成:
./configure --disable-logging-macros
如果你想添加bmv2新的debugger器,将./configure改成 :
./configure --enable-debugger
5、然后接下来运行测试
make check
如果你在运行测试时得到了nanomsg错误,那试着使用sudo 进行运行:
sudo make check
6、其他的,Integrating with Mininet
你可以使用bmv2的targets文件夹中的simple_router,来快速地进行Mininet集成测试。
在第一个终端,输入下面:
cd mininet 注意,这个mininet目录是bmv2目录下的mininet目录
sudo python 1sw_demo.py --behavioral-exe ../targets/simple_router/simple_router --json ../targets/simple_router/simple_router.json
另外注意,第二句指令中的lsw_demo.py的开头字母,我也不确定是“1”还是“l“,所以保险起见,还是打开mininet目录下将文件名进行粘贴复制吧。
然后第二个终端输入:
cd targets/simple_router
./runtime_CLI < commands.txt
现在switch已经开始运行,而且table已经开始产生。
在终端1出现了mininet>的命令提示符。你在这个命令提示符下输入pingall得到下面的内容
*** Ping: testing ping reachability
h1 -> h2
h2 -> h1
*** Results: 0% dropped (2/2 received)
或者输入iperf指令:iperf h1 h2,得到下面内容:
*** Iperf: testing TCP bandwidth between h1 and h2
*** Results: ['50.8 Mbits/sec', '52.9 Mbits/sec']
上面我们运行采用的是bmv2/targets下面的simple_router,但你想用bmv2/targets下面的simple_switch来运行P4程序时,只需要给lsw_demo.py 用--behavioral-exe 提供合适的simple_switch binary二进制文件。比如说,上面运行例子是采用的是下面的这条指令:
sudo python 1sw_demo.py --behavioral-exe ../targets/simple_router/simple_router --json ../targets/simple_router/simple_router.json
可能用simple_switch运行时只需要修改上面那条指令 中--behavioral-exe后面的部分,也就是说提供合适的JSON文件。
Now the switch is running and the tables have been populated. You can run pingall in Mininet or start a TCP flow with iperf between hosts h1 and h2.
When running a P4 program with simple_switch (instead of simple_router in the above example), just provide the appropriate simple_switch binary to 1sw_demo.py with --behavioral-exe.
在上面第二部分第6步中,提到了p4c-bm,那么现在就来安装一下,现在有一个问题,就是安装到哪?bmv2的同级目录下,还是子级目录下。
这样吧,我先装到同级目录下,因为我看到了bmv2是属于p4lang的,而p4c-bm也是属于p4lang的。
1、cd到bmv2的同一级目录下(比如说/bishe/bmv2,那么就转到bishe目录下,在bishe目录下安装p4c-bm),下载p4c-bm
gitclone https://github.com/p4lang/p4c-bm
2、转到p4c-bm所在目录下
cdp4c-bm
3、在你的电脑上安装p4c-bm,依次输入下面三条指令:
sudopip install -r requirements.txt
sudopip install -r requirements_v1_1.txt,当你想编译的P4程序是1.1版本,或者
sudopython setup.py install
我查了一下那篇论文,那篇论文里面看的P4语言规格说明是V1.1版本的。
4、安装完p4c-bm后,如何使用呢?
尝试:p4c-bmv2-h
--json产生P4程序的JSON表示
--pd产生P4程序的c++code
--p4-v1.1,如果你输入的程序是p4v1.1.版本的话。
安装完p4c-bm后,在命令行输入p4c-bmv2,弹出以下信息:
usage: p4c-bmv2 [-h] [--json JSON] [--pd PD] [--pd-from-json]
[--p4-prefix P4_PREFIX] [--field-aliases FIELD_ALIASES]
[--p4-v1.1] [--version] [--primitives PRIMITIVES]
[--plugin PLUGIN_LIST]
[--openflow-mapping-dir OPENFLOW_MAPPING_DIR]
[--openflow-mapping-mod OPENFLOW_MAPPING_MOD] [--keep-pragmas]
source
在命令行输入:p4c-bmv2 -h,弹出以下信息:
usage: p4c-bmv2 [-h] [--json JSON] [--pd PD] [--pd-from-json]
[--p4-prefix P4_PREFIX] [--field-aliases FIELD_ALIASES]
[--p4-v1.1] [--version] [--primitives PRIMITIVES]
[--plugin PLUGIN_LIST]
[--openflow-mapping-dir OPENFLOW_MAPPING_DIR]
[--openflow-mapping-mod OPENFLOW_MAPPING_MOD] [--keep-pragmas]
source
p4c-bm arguments
positional arguments:
source A source file to include in the P4 program.
optional arguments:
-h, --help show this help message and exit
--json JSON Dump the JSON representation to this file.
--pd PD Generate PD C/C++ code for this P4 program in this
directory. Directory must exist.
--pd-from-json Generate PD from a JSON file, not a P4 file
--p4-prefix P4_PREFIX
P4 name use for API function prefix
--field-aliases FIELD_ALIASES
Path to file containing field aliases. In this file,
each line contains a mapping with this format:
"<alias> <full name of field>"
--p4-v1.1 Run the compiler on a p4 v1.1 program
--version, -v show program's version number and exit
--primitives PRIMITIVES
A JSON file which contains additional primitive
declarations
--plugin PLUGIN_LIST list of plugins to generate templates
--openflow-mapping-dir OPENFLOW_MAPPING_DIR
Directory of openflow mapping files
--openflow-mapping-mod OPENFLOW_MAPPING_MOD
Openflow mapping module name -- not a file name
--keep-pragmas Propagate pragmas to JSON file when applicable
到此为止,P4语言的前端编译器p4c-bm和后端编译器bmv2都安装完了。
当p4的前段编译器p4c-bm和后端编译器bmv2都安装好了之后,就可以运行P4程序了。
如果要运行你的P4程序,你必须先将P4程序变成一种json文件,bmv2以json形式的文件做为输入,这个json文件将会告诉bmv2软件交换机,需要配置哪个表,如何配置分析器parser...等等等等,这个json文件由前端编译器p4c-bm产生,所以这意味着你必须下载https://github.com/p4lang/p4c-bm,并依照其中的Readme文件进行安装。
当你一旦装好了p4c-bm,你可以输入下面的指令来获得json文件:
p4c-bm --json <path to JSON file> <path to P4 file>
这个json文件一旦产生,就可以做为bmv2的输入文件了(be fed bmv2)。
假定你使用的是simple_switch平台(target)
sudo ./simple_switch -i 0@<iface0> -i 1@<iface1> <path to JSON file>
在这个例子下的<iface0>和<iface1>是和switch交换机相连接的端口(就像端口0和端口1一样)。
一些疑惑:这个simple_switch平台是什么,我尝试着在bmv2目录下找了一下,没有找到,难道是在p4c-bm中吗??暂时不懂
解答:在bmv2目录下有一个文件夹targets,里面就有simple_switch文件夹。
sudo apt-get install python-crcmod