-
Oerview
-
这一篇文章,我们会从学习以下几个部分。
-
- P4 的基本数据类型
- P4 的基本语法
- Parser
- 小结
- P4 的基本数据类型
-
P4 的基本数据类型
-
和很多静态的语言类似,P4 最基本的数据类型放在了下面,P4 不支持的数据类型有 float(浮点)和 string(字符串)。
P4 学习笔记(一)- 导论
导言
这几年 Programmable Hardwares(可编程硬件)越来越重要了。大家比较熟悉的可能有 FPGA 在 Machine Learning 领域针对一些特别的算法进行计算加速,包括谷歌的 TPU、苹果 M1 芯片里面的神经网络计算单元,都是在 FPGA 上面做 prototype 测试之后才做成 ASIC 产品发布出来的。
一流企业做标准:英特尔收购Barefoot背后的逻辑 P4 系列转载之 一
今年6月,英特尔宣布收购一家名为“Barefoot”的公司,旨在帮助英特尔的数据中心部门“更好的应对云数据中心客户的不断变化的各类需求”。伴随着收购,Barefoot的CEO兼总裁,Craig Barratt博士(下图右)被任命为英特尔数据中心部门旗下“互联事业部(connectivity group)”的总经理,负责英特尔以太网控制器、网卡、交换芯片等一系列网络互联产品。
P4 Runtime和p4 info 系列转载 8
p4runtime
P4 Runtime是一套基于Protobuf以及gRPC框架上的协议,通过P4runtime,SDN控制器可以控制能够支援p4的设备。
p4runtime当前由p4 API workgroup指定,主要来自于barefoot公司。
利用p4实现ipv6转发实验 系列转载 7
写在前面
只是作为一个入门p4的实验尝试,借用了一些即成的运行代码。
p4代码
/p4_16,v1_model/
#include<core.p4>
#include<v1model.p4>
const bit<16> TYPE_IPV6 = 0x08DD;//ipv6在以太网中的id
/*HEADERS*/
typedef bit<9> egressSpec_t;
typedef bit<48> macAddr_t;
header ethernet_t{
macAddr_t dstAddr;
macAddr_t srcAddr;
bit<16> etherType;
}
header ipv6_t{
bit<4> version;
bit<8> trafficClass;
bit<20> flowLabel;
bit<16> payLoadLen;
bit<8> nextHdr;
bit<8> hopLimit;
bit<128> srcAddr;
bit<128> dstAddr;
}
struct metadata{
}
struct headers{
ethernet_t ethernet;
ipv6_t ipv6;
}
/*PARSER*/
parser MyParser(packet_in packet,out headers hdr,inout metadata meta,inout standard_metadata_t standard_metadata){
state start{
transition parse_ethernet;//start开始先以底层eth解析
}
state parse_ethernet{
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType){
TYPE_IPV6:parse_ipv6;//转至ipv6解析
default:accept;
}
}
state parse_ipv6{
packet.extract(hdr.ipv6);
transition accept;
}
}
/*CHECKSUM VERIFICATION*/
control MyVerifyChecksum(inout headers hdr,inout metadata meta){
apply{}
}
/*INGRESS PROCESSING*/
control MyIngress(inout headers hdr,inout metadata meta,inout standard_metadata_t standard_metadata){
action drop(){
mark_to_drop();//将要丢弃的包标记为丢弃
}
action ipv6_forward(macAddr_t dstAddr,egressSpec_t port){
standard_metadata.egress_spec = port;
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
hdr.ipv6.hopLimit = hdr.ipv6.hopLimit - 1;//这个类似ipv4中ttl,为0时就超时
}
table ipv6_lpm{
key = {
hdr.ipv6.dstAddr: lpm;//lpm是最长前缀匹配,exact完全匹配,ternary三元匹配
}
actions = {
ipv6_forward;//转发
drop;//丢弃
NoAction;//空动作
}
size = 1024;//流表项容量
default_action = drop();//table miss则丢弃
}
apply{
if(hdr.ipv6.isValid()){
ipv6_lpm.apply();
}
}
}
/*EGRESS PROCESSING*/
control MyEgress(inout headers hdr,inout metadata meta,inout standard_metadata_t standard_metadata){
apply{}
}
/*CHECKSUM COMPUTATION*/
control MyComputeChecksum(inout headers hdr,inout metadata meta){
apply{}
}
/*DEPARSER*/
control MyDeparser(packet_out packet,in headers hdr){
apply{
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv6);
}
}
/*SWITCH*/
V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
)main;
实验拓扑
这里实验的拓扑用来最简单的一个交换机下挂两个主机,交换机是bmv2。其json文件书写如下: 交换机s1的流表项通过s1-commands.txt文件定义。
P4语法(5) Package 系列转载 6
Package
对于package这个概念,类似于将一个框架中各组成部件以一个规律进行打包,以正常运转。
基于一个架构去编写一个新的pipeline的时候,需要先了解初始化的时候需要提供那些东西,parser,ingress或一些校验的模块。
P4语法(4)Control block 转载系列 5
Control block
Control block之中用于放置设计好的Table和Action。
可以把control block认为是pipeline的一个模板,之前用的v1model中就是ingress和egress。 不同的架构中的control block格式不同。 其主要的功能就是知道每一个封包经过的table顺序以及采用的规则(触发条件等)。还能放置一些其他的功能部件,例如计数器counter等。
P4语法(3)Table,Action 转载系列 4
Table
table是p4的匹配——动作表,定义了匹配字段(key)、动作(action)和一些其他相关属性。
其处理数据包的流程:
-
Key construction.建立其匹配字段