愿星光伴随你左右


  • 首页

  • todo

  • 思考

  • life

  • food

  • OS

  • lua

  • redis

  • Golang

  • C

  • TCP/IP

  • ebpf

  • p4

  • OpenVPN

  • IPSec

  • L2TP

  • DNS

  • distributed

  • web

  • OpenWRT

  • 运维

  • Git

  • 鸟哥的私房菜

  • IT杂谈

  • 投资

  • About Me

  • 友情链接

  • FTP

  • 搜索
close

P4 学习笔记(二)- 基础语法和 Parser

时间: 2023-09-15   |   分类: p4     |   阅读: 3393 字 ~7分钟
  • Oerview

  • 这一篇文章,我们会从学习以下几个部分。

    • P4 的基本数据类型
      • P4 的基本语法
      • Parser
      • 小结
  • P4 的基本数据类型

  • 和很多静态的语言类似,P4 最基本的数据类型放在了下面,P4 不支持的数据类型有 float(浮点)和 string(字符串)。

阅读全文 »

P4 学习笔记(一)- 导论

时间: 2023-09-15   |   分类: p4     |   阅读: 1877 字 ~4分钟

导言

这几年 Programmable Hardwares(可编程硬件)越来越重要了。大家比较熟悉的可能有 FPGA 在 Machine Learning 领域针对一些特别的算法进行计算加速,包括谷歌的 TPU、苹果 M1 芯片里面的神经网络计算单元,都是在 FPGA 上面做 prototype 测试之后才做成 ASIC 产品发布出来的。

阅读全文 »

一流企业做标准:英特尔收购Barefoot背后的逻辑 P4 系列转载之 一

时间: 2023-09-15   |   分类: p4     |   阅读: 3944 字 ~8分钟

今年6月,英特尔宣布收购一家名为“Barefoot”的公司,旨在帮助英特尔的数据中心部门“更好的应对云数据中心客户的不断变化的各类需求”。伴随着收购,Barefoot的CEO兼总裁,Craig Barratt博士(下图右)被任命为英特尔数据中心部门旗下“互联事业部(connectivity group)”的总经理,负责英特尔以太网控制器、网卡、交换芯片等一系列网络互联产品。

阅读全文 »

P4 Runtime和p4 info 系列转载 8

时间: 2023-09-12   |   分类: p4     |   阅读: 791 字 ~2分钟

p4runtime

P4 Runtime是一套基于Protobuf以及gRPC框架上的协议,通过P4runtime,SDN控制器可以控制能够支援p4的设备。

p4runtime当前由p4 API workgroup指定,主要来自于barefoot公司。

阅读全文 »

利用p4实现ipv6转发实验 系列转载 7

时间: 2023-09-12   |   分类: p4     |   阅读: 1140 字 ~3分钟

写在前面

只是作为一个入门p4的实验尝试,借用了一些即成的运行代码。


p4代码

/p4_16,v1_model/

img

img

 #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

时间: 2023-09-12   |   分类: p4     |   阅读: 517 字 ~2分钟

Package

对于package这个概念,类似于将一个框架中各组成部件以一个规律进行打包,以正常运转。

基于一个架构去编写一个新的pipeline的时候,需要先了解初始化的时候需要提供那些东西,parser,ingress或一些校验的模块。

阅读全文 »

P4语法(4)Control block 转载系列 5

时间: 2023-09-12   |   分类: p4     |   阅读: 620 字 ~2分钟

Control block

Control block之中用于放置设计好的Table和Action。

可以把control block认为是pipeline的一个模板,之前用的v1model中就是ingress和egress。 不同的架构中的control block格式不同。 其主要的功能就是知道每一个封包经过的table顺序以及采用的规则(触发条件等)。还能放置一些其他的功能部件,例如计数器counter等。

阅读全文 »

P4语法(3)Table,Action 转载系列 4

时间: 2023-09-12   |   分类: p4     |   阅读: 1264 字 ~3分钟

Table

table是p4的匹配——动作表,定义了匹配字段(key)、动作(action)和一些其他相关属性。

img

其处理数据包的流程:

  1. Key construction.建立其匹配字段

阅读全文 »
11 12 13 14 15 16 17 18 19

日志
分类
标签
RSS 订阅
GitHub
© 2009 - 2025
粤ICP备2021068940号-1 粤公网安备44011302003059
0%