在编写测试P4语言时,我准备读取软件交换机的排队状态,bmv2 .There在P4程序specification.But中没有相关内容,我在邮件列表中找到了一封邮件,即:
嗨,魏, 在P4中没有获得时间戳的标准方法,正如您在规范中看到的那样。 但是,如果使用的是simple_switch bmv2目标,则仍然可以访问这些信息。您需要在您的P4程序中包括以下内容:
header_type intrinsic_metadata_t {
fields {
ingress_global_timestamp : 48;
}
}
metadata intrinsic_metadata_t intrinsic_metadata;
header_type queueing_metadata_t {
fields {
enq_timestamp: 48;
enq_qdepth: 16;
deq_timedelta: 32;
deq_qdepth: 16;
}
}
metadata queueing_metadata_t queueing_metadata;所有的时间戳都以微秒为单位。 intrinsic_metadata.ingress_global_timestamp是交换机开始处理时的时间戳,queueing_metadata.enq_timestamp是数据包排队时的时间戳(在入口和出口管道之间),queueing_metadata.deq_timedelta是数据包在队列中花费的时间(我相信这就是您所追求的)。重要的是要理解这些元数据字段是特定于simple_switch目标的,它们不是由P4标准化的。bmv2将检测到它们是在P4程序中定义的,并利用它们。 因为bmv2的吞吐量很低,所以我建议将您的链接限制在<100 your。您还可以使用"set_queue_rate“simple_switch CLI命令对bmv2队列进行分级限制。请确保您使用bmv2编译O2并且没有日志记录(./配置'CXXFLAGS=-O2‘-禁用-日志-宏-禁用-elogger),否则吞吐量将非常糟糕。 最好的 安东宁
我添加邮件中提到的代码来测试它是否能工作:
modify_field(ipv4.ttl,10);
add_to_field(ipv4.ttl,queueing_metadata.deq_qdepth);但结果是它不起作用,我该怎么做呢?谢谢你的帮助。
发布于 2017-03-18 07:41:51
我在p4lang存储库中问了同样的问题,问题得到了解决,谢谢作者的帮助,您可以看到这里。
顺便说一下,运行时命令set_queue_rate是特定于simple_switch的。
https://stackoverflow.com/questions/42628307
复制相似问题