Golang编程语言知识介绍


  • 首页

  • 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语法(3)Table,Action 转载系列 4

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

Table

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

img

其处理数据包的流程:

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

  2. Key lookup in a lookup table.The result of key lookup is an “action”. 数据包中去匹配table中的key中的字段,并获得要执行的"action"。

  3. Action execution.执行动作。

key

key由一个个表单对组成(e:m),其中e是对应数据包中匹配的字段,而m是一个match_kind常数用来表示匹配的算法。

例如:

 key = {
     hdr.ipv4.dstAddr:lpm;
 }

这个就是以ipv4头的目的地址作为匹配字段,采用的是lpm(最长前缀字段)匹配方式。

p416 core现在提供三种默认的match_kind。

 match_kind{
     lpm,//最长前缀字段
     ternary,//三元匹配
     exact//完全匹配
 }

Action

table中的action list是列举了该table支持的action类型。用于action的匹配。

其他属性

p416提供了一些预设的其他属性:

  • default_action:当table miss的时候执行的动作。
  • counters:计数器
  • size:table大小
  • implementation:指定table实际运作方式,这部分通常取决于架构,例如v1model中actionprofile提供了通过hash的方式随机选择一个actionprofilemember去执行。
  • const entries:预设的table entry,在编译阶段会写到编译好的档案中。

Action

关于action,p4中在table里可以利用action去对封包做出处理,action非常类似于其他高级语言中所示的函数,抽象程度可以很高,并且表现出协议无关的特性。这也能体现一部分p4的扩展性。

img

action可以读取控制平面(control plane)提供的数据进行操作,然后根据action的代码内容影响数据平面(data plane)的工作。

对于action的定义:

 action action_name(parameter1,parameter2,……){
     //语句块
 }

而且p4有提供不少基本操作(Primitive Actions),这些action高度抽象,在p416中,大部分的基本操作被移动到了一些函数库中(arch.p4或者vendor.p4),部分操作依然保留在了core.p4中。更多详细的内容在spec中。

例如ipv4转发的code:

 action ipv4_forward(bit<48> dstAddr,bit<9> port){
     standard_metadata.egress_spec = port;
     hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
     hdr.ethernet.dstAddr = dstAddr;
     hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
 }

样例

这里用tutorial中的ipv4转发代码做样例。

action drop(){
        mark_to_drop();//将要丢弃的包标记为丢弃
    }
    
    action ipv4_forward(bit<48> dstAddr,bit<9> port){
        standard_metadata.egress_spec = port;
        hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
        hdr.ethernet.dstAddr = dstAddr;
        hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
    }
table ipv4_lpm{
        key = {
            hdr.ipv4.dstAddr: lpm;
        }
        
        actions = {
            ipv6_forward;
            drop;
            NoAction;
        }
        
        size = 1024;
        
        default_action = drop();
    }

然后给一个switch中定义的流表项:

{
      "table": "MyIngress.ipv4_lpm",   
      "match": {
        "hdr.ipv4.dstAddr": ["10.0.1.1", 32]
      },
      "action_name": "MyIngress.ipv4_forward",
      "action_params": {
        "dstAddr": "00:00:00:00:01:01",
        "port": 1
      }
}

这个table就是对应ipv4.lpm的,匹配的dstAddr为10.0.1.1,执行的action为ipv4.forward,传入的两个参数为mac地址00:00:00:00:01:01,端口1。 上述内容转载自本链接

#p4#
P4语法(4)Control block 转载系列 5
P4 语法之 Parser 转载系列 3
shankusu2017@gmail.com

shankusu2017@gmail.com

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