P4支持ternary匹配,也就是对于一个匹配字段,你可以用mask指定这个字段中的哪些bits是你关心的(1表示关心,0表示忽略),从而只匹配你关心的bits的值而忽略其他的值。

那在代码中怎么使用呢?话不多说,直接上代码(P4版本为 P4_16)!

control MyIngress(inout headers hdr,inout metadata meta,inout standard_metadata_t standard_metadata){action drop() {mark_to_drop(standard_metadata);}action your_action (bit<8> param1, bit<16> param2) {// your action logic here}table ipv4_ternary {key = {hdr.ipv4.srcAddr: ternary; //ternary匹配ipv4的 src addresshdr.ipv4.dstAddr: ternary; //ternary匹配ipv4的 dst address}actions = {your_action;drop;}default_action = drop();//以下代码用于加入表项,同时也展示了如何使用ternary匹配的特性const entries = {// 对于每一个ternary字段,表项的值由两部分组成:value &&& mask,先value后mask,顺序一定不能错!// mask表示在这个字段上希望匹配哪些bits,1表示匹配,0表示忽略// 若 匹配字段&mask = value&mask 则匹配成功// 该表项表示匹配那些ip src address前24位为10.0.1的数据包,而忽略了ip src // address的最后8位以及ip dst address(0x0a000100 &&& 0xffffff00, 0x00000000 &&& 0x00000000): your_action(0x66, 0x8888);// 该表项表示匹配ip src address为10.0.2.x,且ip dst address为10.0.1.1的数据包// 如果mask全为1,则可以省略mask而只写value(0x0a000200 &&& 0xffffff00, 0x0a000101): your_action(0x11, 0x2222);// 最后,由于是ternary匹配,一个数据包可能匹配多条表项,因而表项之间需要有优先级// 以上述方式书写表项时,越早出现的表项优先级越高。// 当使用控制器动态的加入表项时,应该显式指定插入表项的优先级以确保正确性。}}
}

当然,除了以const entries的形式写入表项,还可以通过P4 Controller 来写入。以下为如何构造一个新的表项(Python):

table_entry = p4info_helper.buildTableEntry(table_name="MyIngress.ipv4_ternary",match_fields={"hdr.ipv4.srcAddr": (0x0a000200, 0xffffff00), # (value, mask)"hdr.ipv4.dstAddr": (0x0b000100, 0xffffff00)},action_name="MyIngress.your_action",action_params={"param1": 0x66,"param2": 0x1234},priority=1
)

通过控制器写入表项时要注意一点,如果你不关心某个字段,应该直接在match_fields中直接不写该字段而不是将mask全设为0,这与const entries是不一样的
比如,我们只想匹配src addr而忽略dst addr,我们应该这样写:

table_entry = p4info_helper.buildTableEntry(table_name="MyIngress.ipv4_ternary",match_fields={"hdr.ipv4.srcAddr": (0x0a000200, 0xffffff00)},action_name="MyIngress.your_action",action_params={"param1": 0x66,"param2": 0x1234},priority=1
)

而不是:

table_entry = p4info_helper.buildTableEntry(table_name="MyIngress.ipv4_ternary",match_fields={"hdr.ipv4.srcAddr": (0x0a000200, 0xffffff00),"hdr.ipv4.dstAddr": (0x00000000, 0x00000000) # 这一行应该被删除!},action_name="MyIngress.your_action",action_params={"param1": 0x66,"param2": 0x1234},priority=1
)

否则查询log会发现以下报错:

[bmv2] [E] [thread 11605] [P4Runtime] Invalid representation of ‘don’t care’ ternary match, omit match field instead of using 0 mask

P4在table中使用ternary匹配相关推荐

  1. 算法Day8|字符串专题二 剑指 Offer 58 - II. 左旋转字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串

    剑指 Offer 58 - II. 左旋转字符串 解题思路: 反转区间为前n的子串 反转区间为n到末尾的子串 反转整个字符串 class Solution {public String reverse ...

  2. C#使用OleDB操作ACCESS插入数据时提示:标准表达式中数据类型不匹配。

    C#使用OleDB操作ACCESS插入数据时提示:标准表达式中数据类型不匹配. OleDbParameter param = new OleDbParameter("" + dc. ...

  3. linux 统计日志数量总,shell统计日志中时间段内匹配的数量的方法

    shell统计日志中时间段内匹配的数量的方法,有需要的朋友可以参考下. 假设日志文件mtasvr.log格式如下: T:24583088(04:02:06)[root:Info] 6KqowLDLAg ...

  4. OpenCV中的特征匹配+单应性以查找对象

    OpenCV中的特征匹配+单应性以查找对象 1. 效果图 2. 源码 参考 这篇博客将混合calib3d模块中的特征匹配和单应性,在复杂图像中查找已知对象. 1. 效果图 特征匹配 & 单应性 ...

  5. OpenCV中的特征匹配(Feature Matching)

    OpenCV中的特征匹配(Feature Matching) 1. 效果图 2. 原理 3. 源码 3.1 SIFT关键点检测+Knn近邻匹配 3.2 ORB关键点检测+蛮力特征匹配 3.3 SIFT ...

  6. OpenCV中使用模板匹配识别空闲的货架空间

    但是点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要 ...

  7. R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象

    R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象 目录 R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象 #data.t ...

  8. R语言str_subset函数和str_which函数:str_subset函数提取字符串向量中所有包含匹配字符的字符串、str_which函数返回字符串向量中所有包含匹配字符的位置(索引)

    R语言str_subset函数和str_which函数:str_subset函数提取字符串向量中所有包含匹配字符的字符串.str_which函数返回字符串向量中所有包含匹配字符的位置(索引) 目录

  9. Handle table中CAS操作与A-B-A Problem解析

    在研究handle table的时候顺便研究的东西.Baidu了下,发现国内这方面的资料几乎没得,然后就准备瞎bb下,为下面的一篇介绍handle table的结构做准备. 关于lock-free d ...

最新文章

  1. 基于微软企业库的AOP组件(含源码)
  2. python requests post提交数据报错
  3. makefile 打印变量_通过实例学Makefile
  4. 云原生 CI/CD 框架 Tekton 初体验
  5. ISA Server 2006速战速决实验指南(7) 创建元素-网络对象
  6. 计算机硕士系统毕业论文答辩ppt,计算机硕士论文答辩ppt
  7. Java常用框架有哪些?
  8. 分集增益的不同合并方式的性能分析
  9. C++程序设计:输出n层金字塔图形
  10. django -- 过滤器
  11. Jetson TX1 /TX2 对比介绍
  12. protoc 插件-protoc-gen-grpc-gateway-gosdk
  13. Android中使用Post带参数请求的方法
  14. 2018第九届蓝桥杯-决赛-Java大学-C组
  15. 超100家交易所高危漏洞导致50亿价值数字资产受威胁
  16. 巧用 CSS3 filter(滤镜) 属性
  17. C/C++ 编译的时候报错“LNK2019: 无法解析的外部符号:xxx,该符号在xxx中被引用”
  18. 数据库语言与事务管理
  19. 青岛跻身互联网+智慧城市全国十强
  20. 20年了,广州生活垃圾分类华丽变身——记广州市垃圾分类发展历程

热门文章

  1. Arcmap矢量数据的基础编辑
  2. 水上飞机行业调研报告 - 市场现状分析与发展前景预测
  3. 【论文阅读】Improving Table Structure Recognition with Visual-Alignment Sequential Coordinate Modeling
  4. 移动端手指滑动的距离
  5. JQuery键盘控制图片
  6. 两种三角形的打印方法
  7. CCF-CSP 201903-1 小中大(python实现)
  8. 怎么用计算机表达爱意,不知道如何向心仪的她表达爱意的你 可能需要Zooids这帮小助攻...
  9. c语言调用函数的方法案例,C语言经典例题100例——C语言练习实例34解答(函数调用)...
  10. 摩托车高级驾驶员辅助系统(ADAS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告