P4

这段P4-14代码的理解是否有误?


action malformed_outer_ethernet_packet(drop_reason) {
modify_field(ingress_metadata.drop_flag, TRUE);
modify_field(ingress_metadata.drop_reason, drop_reason);
}
......(其他action,没有列出来)

table validate_outer_ethernet {
reads {
ethernet.srcAddr : ternary;
ethernet.dstAddr : ternary;
vlan_tag_[0] : valid;
vlan_tag_[1] : valid;
}
actions {
malformed_outer_ethernet_packet;
set_valid_outer_unicast_packet_untagged;
set_valid_outer_unicast_packet_single_tagged;
set_valid_outer_unicast_packet_double_tagged;
set_valid_outer_unicast_packet_qinq_tagged;
set_valid_outer_multicast_packet_untagged;
set_valid_outer_multicast_packet_single_tagged;
set_valid_outer_multicast_packet_double_tagged;
set_valid_outer_multicast_packet_qinq_tagged;
set_valid_outer_broadcast_packet_untagged;
set_valid_outer_broadcast_packet_single_tagged;
set_valid_outer_broadcast_packet_double_tagged;
set_valid_outer_broadcast_packet_qinq_tagged;
}
size : VALIDATE_PACKET_TABLE_SIZE;
}

control process_validate_outer_header {
/* validate the ethernet header */
apply(validate_outer_ethernet) {
malformed_outer_ethernet_packet {
}
default {
if (valid(ipv4)) {
validate_outer_ipv4_header();
} else {
if (valid(ipv6)) {
validate_outer_ipv6_header();
} else {

}
}
}
}

}

上述process_validate_outer_header的执行顺序是不是如下情况:
1、将ethernet.srcAddr,ethernet.dstAddr,vlan_tag_[0]和vlan_tag_[1]这四个值在validate_outer_ethernet表中进行匹配
2、如果匹配中了malformed_outer_ethernet_packet这个动作,则执行空动作
3、如果匹配中其他的动作,则执行default中的内容

麻烦哪位高手帮看看上面的执行顺序是否正确?
如果第2点中的匹配成功了,malformed_outer_ethernet_packet中描述的modify_field(ingress_metadata.drop_flag, TRUE);是否会执行?
如果第3点中的匹配成功了,动作set_valid_outer_XXXX(第3点中匹配中其中一个action)里面的动作是否会执行?
已邀请:

Capilano - 花若盛开,清风自来

赞同来自:


执行table里的哪个action要根据你下发的流表确定的,你的table_set_default和table_add是怎么配的,源码里再commands.txt里配置好,$BMV2_PATH/targets/simple_switch/sswitch_CLI TLV_parsing.json < commands.txt 这样使用

举个例子
table format_options {
reads {
ipv4_option_security : valid;
ipv4_option_timestamp : valid;
}
actions {
format_options_security;
format_options_timestamp;
format_options_both;
_nop;
}
size : 4;
}

table_set_default format_options _nop
table_add format_options format_options_security 1 0 =>
table_add format_options format_options_timestamp 0 1 =>
table_add format_options format_options_both 1 1 =>

默认action就是_nop
如果参数匹配为1 0则执行format_options_security
如果参数匹配为0 1则执行format_options_timestamp
如果参数匹配为1 1则执行format_options_both

mario_hu - 欲戴王冠必承其重

赞同来自:


@Capilano 谢谢你的回答,如果是按照你的commands.txt进行配置,按照下面的control process_format_options 执行的话,是什么样的情况?
control validate_outer_ipv4_header{ 。。。}
control validate_outer_ipv6_header{ 。。。}
control validate_outer_mpls_header{。。。}

table format_options {
reads {
ipv4_option_security : valid;
ipv4_option_timestamp : valid;
}
actions {
format_options_security;
format_options_timestamp;
format_options_both;
_nop;
}
size : 4;
}

control process_format_options {
apply(format_options) {
format_options_security {
validate_outer_mpls_header();
}
default {
if (valid(ipv4)) {
validate_outer_ipv4_header();
} else {
if (valid(ipv6)) {
validate_outer_ipv6_header();
} else {

}
}
}
}
}

------------------------------------
table_set_default format_options _nop
table_add format_options format_options_security 1 0 =>
table_add format_options format_options_timestamp 0 1 =>
table_add format_options format_options_both 1 1 =>

默认action就是_nop
如果参数匹配为1 0则执行format_options_security , 请问这个时候会执行validate_outer_mpls_header();吗?
如果参数匹配为0 1则执行format_options_timestamp ,请问这个时候会执行 default{}中的内容吗?
如果参数匹配为1 1则执行format_options_both,请问这个时候会执行 default{}中的内容吗?

hanw

赞同来自:


这个论坛上传代码没有自动对齐的功能吗?

mario_hu - 欲戴王冠必承其重

赞同来自:


如果是按照你的commands.txt进行配置,按照下面的control process_format_options 执行的话,是什么样的情况?
control validate_outer_ipv4_header{ 。。。}
control validate_outer_ipv6_header{ 。。。}
control validate_outer_mpls_header{。。。}

table format_options {
      reads {
                ipv4_option_security : valid;
                ipv4_option_timestamp : valid;
      }
      actions {
                format_options_security;
                format_options_timestamp;
                format_options_both;
                _nop;
      }
     size : 4;
}

control process_format_options {
         apply(format_options) {
                  format_options_security {
                             validate_outer_mpls_header();
                  }
                  default {
                             if (valid(ipv4)) {
                                 validate_outer_ipv4_header();
                             } else {
                                          if (valid(ipv6)) {
                                               validate_outer_ipv6_header();
                                           } else {  }  
                               }  
                   } /* default  */
          } 



------------------------------------
table_set_default format_options _nop
table_add format_options format_options_security 1 0 =>
table_add format_options format_options_timestamp 0 1 =>
table_add format_options format_options_both 1 1 =>

默认action就是_nop
如果参数匹配为1 0则执行format_options_security , 请问这个时候会执行validate_outer_mpls_header();吗?
如果参数匹配为0 1则执行format_options_timestamp ,请问这个时候会执行 default{}中的内容吗?
如果参数匹配为1 1则执行format_options_both,请问这个时候会执行 default{}中的内容吗?

@Capilano @hanw 不好意思,我没注意到,论坛上有代码上传的模式,我重新上传一次,麻烦抽空帮看一下问题。

hanw

赞同来自:


请上传p4test可以编译通过的代码例子,这样起码可以保证代码的语法上是正确的。其他人也可以方便的在本地编译你的程序。

mario_hu - 欲戴王冠必承其重

赞同来自:


@hanw 上面最开始展示的代码是https://github.com/p4lang/switch.git中的一段代码,附件是上传的代码。
我主要是知道以下程序在不同情况下会是怎样执行?还有什么样调试的方法?
apply(format_options) {
              format_options_security {
                         /* 是否会执行这个分支的内容 */
              }
              default {
                         /* 是否会执行default分支的内容 */
                         if (valid(ipv4)) {
                             validate_outer_ipv4_header();
                         } else {
                                      if (valid(ipv6)) {
                                           validate_outer_ipv6_header();
                                       } else {  }  
                           }  
               } /* default  */
      } 

hanw

赞同来自:


@mario_hu 你问了三个问题:“
如果参数匹配为1 0则执行format_options_security , 请问这个时候会执行validate_outer_mpls_header();吗?
如果参数匹配为0 1则执行format_options_timestamp ,请问这个时候会执行 default{}中的内容吗?
如果参数匹配为1 1则执行format_options_both,请问这个时候会执行 default{}中的内容吗?“

我认为答案都是 会执行。

mario_hu - 欲戴王冠必承其重

赞同来自:


@hanw 谢谢您的回答,我理解的也是这样。

要回复问题请先登录注册