From 5aa3875554e8901951a6d14c861209b20fadfa7c Mon Sep 17 00:00:00 2001 From: Enisa Hadzic Date: Tue, 26 Mar 2019 14:33:02 +0100 Subject: [PATCH] Fix for the issue when number of error values is more than 9 Changed the way error code value is generated in bmv2 backend. Instead of decimal value, it is generated as hex value into json file (issue #1824) Signed-off-by: Enisa Hadzic --- backends/bmv2/common/expression.cpp | 4 +- testdata/p4_16_samples/issue1824-bmv2.p4 | 89 +++++++++++++++++++ testdata/p4_16_samples/issue1824-bmv2.stf | 2 + .../issue1824-bmv2-first.p4 | 65 ++++++++++++++ .../issue1824-bmv2-frontend.p4 | 65 ++++++++++++++ .../issue1824-bmv2-midend.p4 | 75 ++++++++++++++++ .../p4_16_samples_outputs/issue1824-bmv2.p4 | 66 ++++++++++++++ .../issue1824-bmv2.p4-stderr | 0 .../issue1824-bmv2.p4.p4info.txt | 3 + 9 files changed, 368 insertions(+), 1 deletion(-) create mode 100644 testdata/p4_16_samples/issue1824-bmv2.p4 create mode 100644 testdata/p4_16_samples/issue1824-bmv2.stf create mode 100644 testdata/p4_16_samples_outputs/issue1824-bmv2-first.p4 create mode 100644 testdata/p4_16_samples_outputs/issue1824-bmv2-frontend.p4 create mode 100644 testdata/p4_16_samples_outputs/issue1824-bmv2-midend.p4 create mode 100644 testdata/p4_16_samples_outputs/issue1824-bmv2.p4 create mode 100644 testdata/p4_16_samples_outputs/issue1824-bmv2.p4-stderr create mode 100644 testdata/p4_16_samples_outputs/issue1824-bmv2.p4.p4info.txt diff --git a/backends/bmv2/common/expression.cpp b/backends/bmv2/common/expression.cpp index 63e0f7d0016..10b841b213d 100644 --- a/backends/bmv2/common/expression.cpp +++ b/backends/bmv2/common/expression.cpp @@ -251,7 +251,9 @@ void ExpressionConverter::postorder(const IR::Member* expression) { result->emplace("type", "hexstr"); auto decl = type->to()->getDeclByName(expression->member.name); auto errorValue = structure->errorCodesMap.at(decl); - result->emplace("value", Util::toString(errorValue)); + // this generates error constant like hex value + auto reprValue = stringRepr(errorValue); + result->emplace("value", reprValue); mapExpression(expression, result); return; } diff --git a/testdata/p4_16_samples/issue1824-bmv2.p4 b/testdata/p4_16_samples/issue1824-bmv2.p4 new file mode 100644 index 00000000000..4ea739de1d6 --- /dev/null +++ b/testdata/p4_16_samples/issue1824-bmv2.p4 @@ -0,0 +1,89 @@ +/* Intended to test the fix for the issue1824 when + * exists more than 9 error values in p4 program. + * values should be represented as hex values. */ + +#include +#include + +header test_header { + bit<48> dstAddr; + bit<48> srcAddr; +} + +struct headers { + test_header h1; +} + +struct mystruct1_t { + bit<4> a; + bit<4> b; +} + +struct metadata { + mystruct1_t mystruct1; +} + +error { + IPv4OptionsNotSupported, + IPv4ChecksumError, + IPv4HeaderTooShort, + IPv4BadPacket +} + +parser MyParser(packet_in pkt, + out headers hdr, + inout metadata meta, + inout standard_metadata_t stdmeta) +{ + state start { + pkt.extract(hdr.h1); + verify(false, error.IPv4BadPacket); + verify(false, error.IPv4HeaderTooShort); + transition accept; + } +} + +control MyIngress(inout headers hdr, + inout metadata meta, + inout standard_metadata_t stdmeta) +{ + apply { + if (stdmeta.parser_error != error.NoError) { + hdr.h1.dstAddr = 0xbad; + } + } +} + +control MyEgress(inout headers hdr, + inout metadata meta, + inout standard_metadata_t stdmeta) +{ + apply { } +} + +control MyVerifyChecksum(inout headers hdr, + inout metadata meta) +{ + apply { } +} + +control MyComputeChecksum(inout headers hdr, + inout metadata meta) +{ + apply { } +} + +control MyDeparser(packet_out packet, + in headers hdr) +{ + apply { + packet.emit(hdr.h1); + } +} + +V1Switch(MyParser(), + MyVerifyChecksum(), + MyIngress(), + MyEgress(), + MyComputeChecksum(), + MyDeparser()) main; diff --git a/testdata/p4_16_samples/issue1824-bmv2.stf b/testdata/p4_16_samples/issue1824-bmv2.stf new file mode 100644 index 00000000000..ff406d8b243 --- /dev/null +++ b/testdata/p4_16_samples/issue1824-bmv2.stf @@ -0,0 +1,2 @@ +packet 0 112233445566 778899aabbcc +expect 0 000000000BAD 778899aabbcc diff --git a/testdata/p4_16_samples_outputs/issue1824-bmv2-first.p4 b/testdata/p4_16_samples_outputs/issue1824-bmv2-first.p4 new file mode 100644 index 00000000000..5f4ee13be67 --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue1824-bmv2-first.p4 @@ -0,0 +1,65 @@ +error { + IPv4OptionsNotSupported, + IPv4ChecksumError, + IPv4HeaderTooShort, + IPv4BadPacket +} +#include +#include + +header test_header { + bit<48> dstAddr; + bit<48> srcAddr; +} + +struct headers { + test_header h1; +} + +struct mystruct1_t { + bit<4> a; + bit<4> b; +} + +struct metadata { + mystruct1_t mystruct1; +} + +parser MyParser(packet_in pkt, out headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + state start { + pkt.extract(hdr.h1); + verify(false, error.IPv4BadPacket); + verify(false, error.IPv4HeaderTooShort); + transition accept; + } +} + +control MyIngress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + apply { + if (stdmeta.parser_error != error.NoError) + hdr.h1.dstAddr = 48w0xbad; + } +} + +control MyEgress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + apply { + } +} + +control MyVerifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyComputeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyDeparser(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.h1); + } +} + +V1Switch(MyParser(), MyVerifyChecksum(), MyIngress(), MyEgress(), MyComputeChecksum(), MyDeparser()) main; diff --git a/testdata/p4_16_samples_outputs/issue1824-bmv2-frontend.p4 b/testdata/p4_16_samples_outputs/issue1824-bmv2-frontend.p4 new file mode 100644 index 00000000000..5f4ee13be67 --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue1824-bmv2-frontend.p4 @@ -0,0 +1,65 @@ +error { + IPv4OptionsNotSupported, + IPv4ChecksumError, + IPv4HeaderTooShort, + IPv4BadPacket +} +#include +#include + +header test_header { + bit<48> dstAddr; + bit<48> srcAddr; +} + +struct headers { + test_header h1; +} + +struct mystruct1_t { + bit<4> a; + bit<4> b; +} + +struct metadata { + mystruct1_t mystruct1; +} + +parser MyParser(packet_in pkt, out headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + state start { + pkt.extract(hdr.h1); + verify(false, error.IPv4BadPacket); + verify(false, error.IPv4HeaderTooShort); + transition accept; + } +} + +control MyIngress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + apply { + if (stdmeta.parser_error != error.NoError) + hdr.h1.dstAddr = 48w0xbad; + } +} + +control MyEgress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + apply { + } +} + +control MyVerifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyComputeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyDeparser(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.h1); + } +} + +V1Switch(MyParser(), MyVerifyChecksum(), MyIngress(), MyEgress(), MyComputeChecksum(), MyDeparser()) main; diff --git a/testdata/p4_16_samples_outputs/issue1824-bmv2-midend.p4 b/testdata/p4_16_samples_outputs/issue1824-bmv2-midend.p4 new file mode 100644 index 00000000000..3add5a1af63 --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue1824-bmv2-midend.p4 @@ -0,0 +1,75 @@ +error { + IPv4OptionsNotSupported, + IPv4ChecksumError, + IPv4HeaderTooShort, + IPv4BadPacket +} +#include +#include + +header test_header { + bit<48> dstAddr; + bit<48> srcAddr; +} + +struct headers { + test_header h1; +} + +struct mystruct1_t { + bit<4> a; + bit<4> b; +} + +struct metadata { + bit<4> _mystruct1_a0; + bit<4> _mystruct1_b1; +} + +parser MyParser(packet_in pkt, out headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + state start { + pkt.extract(hdr.h1); + verify(false, error.IPv4BadPacket); + verify(false, error.IPv4HeaderTooShort); + transition accept; + } +} + +control MyIngress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + @hidden action act() { + hdr.h1.dstAddr = 48w0xbad; + } + @hidden table tbl_act { + actions = { + act(); + } + const default_action = act(); + } + apply { + if (stdmeta.parser_error != error.NoError) + tbl_act.apply(); + } +} + +control MyEgress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + apply { + } +} + +control MyVerifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyComputeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyDeparser(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.h1); + } +} + +V1Switch(MyParser(), MyVerifyChecksum(), MyIngress(), MyEgress(), MyComputeChecksum(), MyDeparser()) main; diff --git a/testdata/p4_16_samples_outputs/issue1824-bmv2.p4 b/testdata/p4_16_samples_outputs/issue1824-bmv2.p4 new file mode 100644 index 00000000000..4485b5e5b67 --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue1824-bmv2.p4 @@ -0,0 +1,66 @@ +error { + IPv4OptionsNotSupported, + IPv4ChecksumError, + IPv4HeaderTooShort, + IPv4BadPacket +} +#include +#include + +header test_header { + bit<48> dstAddr; + bit<48> srcAddr; +} + +struct headers { + test_header h1; +} + +struct mystruct1_t { + bit<4> a; + bit<4> b; +} + +struct metadata { + mystruct1_t mystruct1; +} + +parser MyParser(packet_in pkt, out headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + state start { + pkt.extract(hdr.h1); + verify(false, error.IPv4BadPacket); + verify(false, error.IPv4HeaderTooShort); + transition accept; + } +} + +control MyIngress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + apply { + if (stdmeta.parser_error != error.NoError) { + hdr.h1.dstAddr = 0xbad; + } + } +} + +control MyEgress(inout headers hdr, inout metadata meta, inout standard_metadata_t stdmeta) { + apply { + } +} + +control MyVerifyChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyComputeChecksum(inout headers hdr, inout metadata meta) { + apply { + } +} + +control MyDeparser(packet_out packet, in headers hdr) { + apply { + packet.emit(hdr.h1); + } +} + +V1Switch(MyParser(), MyVerifyChecksum(), MyIngress(), MyEgress(), MyComputeChecksum(), MyDeparser()) main; diff --git a/testdata/p4_16_samples_outputs/issue1824-bmv2.p4-stderr b/testdata/p4_16_samples_outputs/issue1824-bmv2.p4-stderr new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testdata/p4_16_samples_outputs/issue1824-bmv2.p4.p4info.txt b/testdata/p4_16_samples_outputs/issue1824-bmv2.p4.p4info.txt new file mode 100644 index 00000000000..86f2d2e5feb --- /dev/null +++ b/testdata/p4_16_samples_outputs/issue1824-bmv2.p4.p4info.txt @@ -0,0 +1,3 @@ +pkg_info { + arch: "v1model" +} \ No newline at end of file