/*
 * Copyright 2019-present GEANT RARE project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed On an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _IG_CTL_REWRITES_P4_
#define _IG_CTL_REWRITES_P4_

control IngressControlRewrites(inout headers hdr,
                               inout ingress_metadata_t ig_md,
                               inout standard_metadata_t ig_intr_md) {


    apply {
        if (hdr.vlan.isValid()) hdr.vlan.setInvalid();
        if (hdr.vlanq.isValid()) hdr.vlanq.setInvalid();
        if (hdr.pppoeD.isValid()) hdr.pppoeD.setInvalid();
        if (hdr.pppoeB.isValid()) hdr.pppoeB.setInvalid();
        if (hdr.l2tpbr.isValid()) hdr.l2tpbr.setInvalid();

        if (ig_md.srv_op_type != 0) {
            hdr.ipv6.setInvalid();
        }
        if (ig_md.srv_op_type == 2) {
            hdr.eth3.setInvalid();
        }

        if (ig_md.sgt_remove == 1) {
            hdr.sgt.setInvalid();
        }

        if (ig_md.nsh_remove == 1) {
            hdr.nsh.setInvalid();
        }

        if (ig_md.polka_remove == 1) {
            hdr.polka.setInvalid();
        }

        if (ig_md.mpls1_remove == 1) {
            hdr.mpls1.setInvalid();
        }

        if (ig_md.mpls0_remove == 1) {
            hdr.mpls0.setInvalid();
            if (ig_md.ipv4_valid == 1) {
                ig_md.ethertype = ETHERTYPE_IPV4;
            } else {
                ig_md.ethertype = ETHERTYPE_IPV6;
            }
        }

        if (ig_md.target_id != 0) {
            return;
        }

        if (hdr.nsh.isValid()) {
            if (hdr.nsh.ttl < 2) ig_md.dropping = 1;
            hdr.nsh.ttl = hdr.nsh.ttl -1;
        }
        if (hdr.polka.isValid()) {
            if (hdr.polka.ttl < 2) ig_md.dropping = 1;
            hdr.polka.ttl = hdr.polka.ttl -1;
        }
        if (hdr.mpls0.isValid()) {
            if (hdr.mpls0.ttl < 2) ig_md.dropping = 1;
            hdr.mpls0.ttl = hdr.mpls0.ttl -1;
        }
        if (hdr.ipv4.isValid()) {
            if (hdr.ipv4.ttl < 2) ig_md.dropping = 1;
            hdr.ipv4.ttl = hdr.ipv4.ttl -1;
        }
        if (hdr.ipv6.isValid()) {
            if (hdr.ipv6.hop_limit < 2) ig_md.dropping = 1;
            hdr.ipv6.hop_limit = hdr.ipv6.hop_limit -1;
        }

    }
}

#endif // _IG_CTL_REWRITES_P4_

