Skip to content

BMv2-PSA: Header stack turns into single headers in the pipeline config JSON #5768

Description

@kirazero17

I have a header stack defined this way:

header msg_t {
    chunk_t msg;
}

struct hdr_structures_t {
[...]
    msg_t[12] Msg;
[...]
}

In my control block, I called the pop_front() method:

control sw_ingress_control (
    inout hdr_structures_t hdr, inout metadata_t meta, 
    in    psa_ingress_input_metadata_t  std_ingress_input_meta,
    inout psa_ingress_output_metadata_t std_ingress_output_meta
)
{
[...]
    hdr.Msg.pop_front(1);
[...]
}

However, when I load the compiled P4 config JSON into the PSA BMv2 switch, the logs shows these two line, which I believe to be related:

Invalid reference to object of type 'header stack' with name 'Msg'
psa_switch_grpc: /home/p4/src/behavioral-model/include/bm/bm_sim/data.h:185: unsigned int bm::Data::get_uint() const: Assertion `arith' failed.

With the Invalid reference to object line, I have checked the compiled JSON file for the pipeline config. This is what I found:

  1. There was no header stack at all:
[...]
"header_stacks" : [],
[...]
  1. The stack turned out to be converted to single headers:
{
[...]
      "name" : "Msg[0]",
      "id" : 7,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[1]",
      "id" : 8,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[2]",
      "id" : 9,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[3]",
      "id" : 10,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[4]",
      "id" : 11,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[5]",
      "id" : 12,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[6]",
      "id" : 13,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[7]",
      "id" : 14,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[8]",
      "id" : 15,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[9]",
      "id" : 16,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[10]",
      "id" : 17,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
    {
      "name" : "Msg[11]",
      "id" : 18,
      "header_type" : "msg_t",
      "metadata" : false,
      "pi_omit" : true
    },
[...]

Since there is no header stack, it can't be referred to. Is this a compiler bug ?

Thanks.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    pna-bmv2Topics related to the BMv2 PNA back end.psa-bmv2Topics related to the PSA BMv2 back end

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions