// Copyright (c) 2017, Google Inc.
//
// P4_16 specification for dhcp spoof instance.
// Note: This code has not been tested and is expected to contain bugs.

#include "spoof_protection.p4"

control ingress(inout parsed_packet_t hdr,
                inout local_metadata_t local_metadata,
                inout standard_metadata_t standard_metadata) {

  apply { }

} // end ingress

control egress(inout parsed_packet_t hdr,
               inout local_metadata_t local_metadata,
               inout standard_metadata_t standard_metadata) {
  apply {
    spoof_protection.apply(hdr, local_metadata, standard_metadata);
  }
}

control verify_checksum(in parsed_packet_t hdr,
                        inout local_metadata_t local_metadata) {
  apply { }
}

control compute_checksum(inout parsed_packet_t hdr,
                         inout local_metadata_t local_metadata) {
  apply { }
}

V1Switch(pkt_parser(), verify_checksum(), ingress(), egress(),
         compute_checksum(), pkt_deparser()) main;
