使用make编译P4代码下发流规则时遇grpc._channel._InactiveRpcError错误求助
问题分析与解决方案
在使用make编译P4代码并向bmv2交换机下发流规则时,插入MyIngress.ipv4_lpm默认表项触发gRPC UNKNOWN错误,导致交换机配置失败。以下是针对性排查和解决步骤:
1. 校验P4代码中表与动作的定义
- 确认
MyIngress.ipv4_lpm表是否允许设置默认动作:检查P4代码中该表的定义,是否包含default_action声明,或者是否支持动态设置默认动作。 - 验证
MyIngress.drop()动作的合法性:确保动作无语法错误、参数匹配,且在MyIngress控制块中正确定义。
2. 检查流规则JSON文件格式
打开./sw_rules/s11-runtime.json,定位ipv4_lpm默认表项配置,确认格式符合P4Runtime规范:
{ "table": "MyIngress.ipv4_lpm", "default_action": { "name": "MyIngress.drop" } }
- 确保表名、动作名与
build/ddosmit.p4.p4info.txt中的定义完全一致(注意大小写和命名空间)。
3. 验证交换机运行状态
- 检查P4Runtime服务端口:执行
netstat -tulpn | grep 50051,确认127.0.0.1:50051处于监听状态。 - 查看bmv2交换机日志:终端或指定日志文件中会包含更详细的错误原因(如表项不匹配、动作不存在等)。
4. 确保编译文件一致性
- 检查
build/ddosmit.p4.p4info.txt:确认其中存在MyIngress.ipv4_lpm表和MyIngress.drop动作的完整定义。 - 清理缓存后重新编译:执行
make clean && make,确保build/ddosmit.json是最新P4代码的编译产物。
5. 排查gRPC版本兼容性
bmv2对gRPC版本有兼容性要求,尝试升级或调整版本:
pip install --upgrade grpcio grpcio-tools
6. 手动测试表项插入
使用p4runtime-shell手动连接交换机,单独测试默认表项插入,获取更精准的错误信息:
p4runtime-shell --grpc-addr 127.0.0.1:50051 --device-id 1 --election-id 0,1 --p4info build/ddosmit.p4.p4info.txt --config build/ddosmit.json
在shell中执行插入命令:
table_entry = table_entry_helper("MyIngress.ipv4_lpm").set_default_action("MyIngress.drop") write(table_entry, INSERT)
内容的提问来源于stack exchange,提问作者zzz123
相关产品推荐
相关产品推荐

