项目开发代码复现的曲折之路
首先要先安装一个Ubuntu系统
- 每次安装新系统都得至少疯两天,每台电脑都不一样,没办法按照哪一篇CSDN一步一步地完全按照好一个新系统,期间会出现各种各样的问题,需要疯狂地查阅不同问题的资料,至少需要查阅几十篇的CSDN,认真看其中的至少十篇
反正就是!好烦好烦要秃啦秃啦!!!
终于安装好了!!!我以为可以开始运行代码了,于是发现,游戏才刚刚开始…
这一篇是我将找到的两篇比较有用的CSDN结合起来,再加上我自己遇到的其他问题的一些解决办法,总结出来的一篇Ubuntu安装笔记,此篇适用于安装win+ubuntu双系统,非U盘安装,电脑属于UEFI模式的朋友们看!
欢迎来到Ubuntu!
在Ubuntu上clone github的仓库
- 直接git clone是真的无敌慢,而且容易超时或者出现其他一些七七八八的问题,于是
- 先安装一个 Fastgithub 来加速
- 最简单的办法,没有之一:发送任意内容邮件给fastgithub@qq.com ,他就会给你回复邮件,里面有百度网盘地址和提取码,就可以下载fastgithub了
- 下载之后再ubuntu上进行解压
unzip xxx(压缩包文件名)
- 但是有时候还是不行,正在找解决办法
浅学习且试用一下 P4SC
安装P4SC:先P4环境自动配置
- 运行
.sh
的文件时要用 sh 命令 - git clone 报错(-110)时,尝试关掉所有代理,再试试看
- 如果还是不行那就直接依次输入这三条指令+回车,再进行clone操作即可
export GIT_TRACE_PACKET=1
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1
- 克隆完仓库后执行下面的脚本
install_bmv2.sh
- 安装“行为模型”,P4软件开关;install_p4c-bm.sh
- 安装“P4C-BM”,P4-14前端编译器;install_p4c.sh
- 安装最先进的P4前端编译器“P4C”。- 然后环境配置就结束啦!
继续安装P4SC
首先要注意一下自己系统的python版本:ubuntu自带py2;可以用以下命令查看以及更改:
python2 --version
(查看当前python2版本)python3 --version
(查看当前python3版本)python --version
(查看当前python默认版本)echo alias python=python2 >> ~/.bashrc
(在修改python的默认版本为python2)source ~/.bashrc
(source用于使刚修改的文件立即生效)
安装py-dag:
git clone https://github.com/thieman/py-dag.git
cd py-dag/
python setup.py install
- 完蛋!这里似乎好像也会出什么小问题来着,我操作完写的这篇,给忘记了SOS!!
- 遇到问题再说吧!有时候遇到问题搜索不到的,可以科学上网到谷歌看一看,结果比较多
安装依赖项
- 依赖项都写在
requirements.txt
里面,但是有些会出问题,看看具体安装哪个库出问题了,请到这里去寻找答案,有关库的安装问题都写在里面
pip install -r requirements.txt
运行P4SC
快速入门:
-
在命令行执行:
./p4sc_CLI.py
接着会出现p4scCmd>
,即可输入下一步的sfc请求 -
输入sfc的请求:(例如)
// create the first input request branch port_knocking qos ipsg assign_dir test end_of_sfc // create the second input request assign_dir test before nat ecmp before ecmp hashes before ipsg qos before qos nat before l2_forward nat end_of_sfc // generate the P4 program run
-
成功运行,发现在
backend
文件下,生成了一个P4文件 -
运行清理环境:
./reset.sh
(虽然有的会提示找不到文件,但是已经将生成的文件都删除) -
Over!
详细解释一下:
./p4sc_CLI.py
是用于构造SFC请求(将SFC请求输入)- 假设
p4sc_CLI.py
将在test/
生成请求;我们习惯于在test/
中用converter.py
去合并这些请求- ./converter.py -d test/`
- 该命令将所有的SFC功能请求合并起来产生一个
result.txt
generator.py
用于制作输出P4程序:- 其输入为类似于
result.txt
的中端SFC文件 ./generator -f test/result.txt
产生并输出P4程序在backend文件内(backend/switch.p4
)
- 其输入为类似于
将NF集成到P4SC中:
-
编写用于实现专用NF的P4程序,并放入
backend/blocks
中-
例如,编写了一个名为
skeleton.p4
的程序:action nop() {} action _drop() { drop(); } action set_nhop(port) { modify_field(standard_metadata.egress_spec, port); } // Table definition table skeleton_t { reads { ipv4.dstAddr: lpm; } actions { nop; _drop; set_nhop; } } // Control flow definition // this control flow is invoked in ingress pipeline control skeleton_ctrl { if (valid(ipv4)) { apply(skeletion_t); } }
-
-
在
backend/blocks/includes.p4
里面添加自己的P4代码:-
例如:最下面那行,将我自己的这个
#include "skeleton.p4"
语句添加到include.p4
中#include "hash.p4" #include "ipsg.p4" #include "nat.p4" #include "ecmp.p4" #include "meter.p4" #include "qos.p4" #include "basic_monitor.p4" #include "heavy_hitter.p4" #include "ipv4_forward.p4" #include "l2_forward.p4" #include "tayga.p4" // I invoke my block here: #include "skeleton.p4"
-
-
给自己的NF起一个名字(例如
Skeleton
)并且在frontend/includes.py
里面声明它:-
像这样:(带有#的是注释行,它的下一行就是我添加的地方)
#!/usr/bin/env python p4_ing_code_map = { 'port_knocking': 'process_port_knocking', 'qos' : 'process_ingress_qos_map', 'ipsg' : 'process_ip_sourceguard', 'ipv4_forward' : 'process_ipv4_forward', 'l2_forward' : 'process_l2_forward', 'nat' : 'process_ingress_nat', 'ecmp' : 'process_ecmp', 'meter_index' : 'process_meter_index', 'hashes' : 'process_hashes', 'meter_action' : 'process_meter_action', 'basic_monitor': 'process_basic_monitor', 'heavy_hitter' : 'process_heavy_hitter', # I add the control flow code of my new block here: 'Skeleton' : 'skeleton_ctrl' } p4_eg_code_map = { 'qos' : 'process_egress_qos_map', 'nat' : 'process_egress_nat', } nfs = ['port_knocking', 'qos', 'ipsg', 'ipv4_forward', 'l2_forward', 'nat', 'ecmp', 'meter_index', 'hashes', 'meter_action', 'basic_monitor', 'heavy_hitter', 'Skeleton'] # and also append my block name to nfs
-
OK啦!到这里已经做好使用P4SC的前置工作,也已经学会如何使用P4SC来为自己所用了,可以自己编写SFC并生成P4程序了!!!