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 address
hdr.ipv4.dstAddr: ternary; //ternary匹配ipv4的 dst address
}
actions = {
your_action;
drop;
}
default_action = drop();
//以下代码用于加入表项,同时也展示了如何使用ternary匹配的特性
const entries = {
// 对于每一个ternary字段,表项的值由两部分组成:value &&& mask,先value后mask,顺序一定不能错!
// mask表示在这个字段上希望匹配哪些bits