P4_16使用table实现通用的switch分支语句

ops/2024/9/23 10:19:27/

0 背景

v1.2.1 以及更早版本的P4_16编程语言中,尽管在Control中支持switch分支语句,但是switch中的选择条件是受限的,仅支持 table_name.apply().action_run 作为switch的选择条件。为了解决此限制,将尝试使用P4_16 Table+switch来实现一个通用的switch语句。

1 目标

使用P4中的table_name.apply().action_run实现如下伪代码

bit<16> x;switch (x) {1: { /* body 1 here */ }2:3: { /* body 23 here */ }4: { /* body 4 here */ }default: { /* body D here */ }
}

2 使用if-else实现

if (x == 1) {/* body 1 here */
} else if ((x == 2) || (x == 3)) {/* body 23 here */
} else if (x == 4) {/* body 4 here */
} else {/* body D here */
}

这种实现方法逻辑没问题,功能实现没问题,但是效率极低。

3 使用table实现

原理:

使用table的Match-Action机制+P4_16中的switch语句来判断执行了哪个Action,进而判断具体是匹配到了table中的哪一项。

具体代码:


bit<16> x; //选择条件
//table中的Action 仅需声明即可,使用@hidden注解指示编译器该部分需要向控制面隐藏
@hidden action switch1_case_1 () {// no statements here, by design
}
@hidden action switch1_case_23 () {// no statements here, by design
}
@hidden action switch1_case_4 () {// no statements here, by design
}
@hidden action switch1_case_default () {// no statements here, by design
}@hidden table switch1_table {key = {x : exact; //精确匹配}//table中的所有actionactions = {switch1_case_1;switch1_case_23;switch1_case_4;switch1_case_default;}//table的表项。注:此处具体的表项并不是从控制面添加的,而是写进代码中编译。//主要是因为这个table对控制面是不可见的const entries = {1 : switch1_case_1;2 : switch1_case_23;3 : switch1_case_23;4 : switch1_case_4;}const default_action = switch1_case_default;
}// later in the control's apply block, where the original switch
// statement appeared:
apply(){//根据执行table中执行了哪个action来确定match到哪一项switch (switch1_table.apply().action_run) {switch1_case_1:       { /* body 1 here */ }switch1_case_23:      { /* body 23 here */ }switch1_case_4:       { /* body 4 here */ }switch1_case_default: { /* body D here */ }}
}

使用table的Match-Action来实现的通用switch执行效率极高


http://www.ppmy.cn/ops/30833.html

相关文章

UDP_USER_INTERFACE_04:用户界面 - 返回源IP地址

测试目的&#xff1a; 验证用户界面是否能够在接受端口上执行接收操作时&#xff0c;正确返回数据字节以及源端口和源地址的指示&#xff0c;特别是确保源IP地址能够被正确识别和返回。 描述&#xff1a; 本测试用例旨在确保用户界面支持创建新的接收端口&#xff0c;并能够…

element的el-table 解决表格多页选择数据时,数据被清空

问题&#xff1a;切换页码时&#xff0c;勾选的数据会被清空 重点看我圈出来的&#xff0c;直接复制&#xff0c;注意&#xff0c;我这里 return row.productId;一般大家的是 return row.id,根据接口定的唯一变量 :row-key"getRowKeys"​​​​​​​:reserve-sele…

k8s集群Grafana精选dashboard页面

文章目录 参考文档 Grafana自选模板推荐模板&#xff1a;13332、13824、14518Grafana默认配置我们选择 Node Exporter/Nodes 的 Dashboard 进去&#xff1a;点击 Kubernetes/Networking/Cluster 进去使用模板查看结果 Grafana接入Prometheus数据Grafana添加监控模板导入 1860_r…

C#开发-nullable类型的比较

C#天然支持nullable类型。很多类除了可以有值以外&#xff0c;还可以为null。这时候我们就有疑问了&#xff0c;如果nullable类型的值为null&#xff0c;它和有值的比较结果是什么&#xff1f;它和同样为null的变量比较结果是什么&#xff1f;我现在就来解答。 测试环境是.NET…

Unity List底层源码剖析

文章目录 前言一、List源码二、Add接口三、Remove接口四、Insert接口五、其他接口1、[]接口2、Clear接口3、Contains接口4、ToArray接口5、Find接口6、Enumerator接口7、Sort接口 六、线程安全总结 前言 没有扎实的基础&#xff0c;很多编写的程序会随着软件规模的扩大或扩展而…

配置mac终端颜色

一个很优秀的参考文章 点击这里 这里还有一个开源的配置方案 点击这里 配置过程 第一步 git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh第二步 export ZSH"$HOME/.dotfiles/oh-my-zsh"; sh -c "$(curl -fsSL https://raw.githubuse…

Android4.4真机移植过程笔记(一)

1、RK源码编译 获取内核源码&#xff1a; git clone git172.28.1.172:rk3188_kernel -b xtc_ok1000 内核编译环境&#xff1a; 从172.28.1.132编译服务器的/data1/ZouZhiPing目录下拷贝toolchain.tar.gz&#xff08;交叉编译工具链&#xff09;并解压到与rk3188_kernel同级目…

Linux:http配置用户登录认证访问网页

Linux&#xff1a;http配置用户登录认证访问网页 创建账户认证文件 # 第一次需要加-c&#xff08;创建create&#xff09;-m&#xff08;修改&#xff09; [rootserver100 ~]# htpasswd -cm /etc/nginx/.htpasswd shanxin New password: Re-type new password: Adding passwo…