// Copyright (c) 2017, Google Inc.
//
// P4 Modeling of controller Packet-IO behavior.
// Note: This code has not been tested and is expected to contain bugs.

#ifndef P4_SPEC_PACKETIO_P4_
#define P4_SPEC_PACKETIO_P4_

#include "headers.p4"
#include "parser.p4"

//------------------------------------------------------------------------------
// Packet IO
//------------------------------------------------------------------------------

control packetio_ingress(inout parsed_packet_t hdr,
                         inout local_metadata_t local_metadata,
                         inout standard_metadata_t standard_metadata) {
  apply {
    if (hdr.packet_out.submit_to_ingress == 0) {
      local_metadata.skip_egress = 1;
      standard_metadata.egress_spec = hdr.packet_out.egress_physical_port;
      hdr.packet_out.setInvalid();
      exit;
    }
    hdr.packet_out.setInvalid();
  }
} // end packetio_ingress


control packetio_egress(inout parsed_packet_t hdr,
                        inout local_metadata_t local_metadata,
                        inout standard_metadata_t standard_metadata) {
  action encap_packet_in_header() {
    hdr.packet_in.setValid();
    hdr.packet_in.ingress_physical_port = standard_metadata.ingress_port;
    hdr.packet_in.target_egress_port = local_metadata.egress_spec_at_punt_match;

    // At this time, ingress_logical_port cannot be set directly from within
    // a P4-defined pipeline. It's existance currently serves to define
    // this metadata field (as part of packet_in header). The target
    // software will figure out the logical-port separately, and populate
    // it into the P4Runtime stream message using the field-ID generated
    // from the P4 packet_in header.
  }

  apply {
    if (standard_metadata.egress_port == CPU_PORT) {
      encap_packet_in_header();
    }
    if (local_metadata.skip_egress == 1) exit;
  }
} // end packetio_egress

#endif // P4_SPEC_PACKETIO_P4_
