#ifndef NICO_EGRESS
#define NICO_EGRESS

#include "settings.p4"

/********************** EGRESS ACTIONS ***********************************/

action set_egress_port (port_t out_port) {
    #ifndef _SUME_SWITCH_P4_
    standard_metadata.egress_spec = out_port;
    #else
    sume_metadata.dst_port = out_port;
    #endif
}

action set_egress_port_and_mac (port_t out_port, mac_addr_t mac_addr) {
    hdr.ethernet.dst_addr = mac_addr;
    set_egress_port(out_port);
}

/********************** GENERAL ACTIONS ***********************************/

#ifndef _SUME_SWITCH_P4_
action controller_reply(task_t task) {
    meta.task = task;
    meta.ingress_port = standard_metadata.ingress_port;
    clone3(CloneType.I2E, 100, meta);
}

#else
action controller_reply(task_t task) {
    meta.task = task;
    meta.ingress_port = sume_metadata.src_port;
    set_egress_port(4);
}
#endif /* _SUME_SWITCH_P4_ */

action controller_debug_table_id(table_t table_id) {
    meta.table_id = table_id;
    controller_reply(TASK_DEBUG);
}

action controller_debug() {
    controller_reply(TASK_DEBUG);
}


/********************** ROUTING (egress definiton) TABLES ***********************************/


table v6_networks {
    key = {
        #ifndef _SUME_SWITCH_P4_
        hdr.ipv6.dst_addr: lpm;
        #else
        hdr.ipv6.dst_addr: exact;
        #endif
    }
    actions = {
		set_egress_port;
		set_egress_port_and_mac;
        controller_debug;
        controller_reply;
        controller_debug_table_id;
        NoAction;
    }
    size = ROUTING_TABLE_SIZE;

    #ifndef _SUME_SWITCH_P4_
    default_action = controller_debug_table_id(TABLE_V6_NETWORKS);
    #else
    default_action = controller_debug;
    #endif

}

table v4_networks {
    key = {
        #ifndef _SUME_SWITCH_P4_
        hdr.ipv4.dst_addr: lpm;
        #else
        hdr.ipv4.dst_addr: exact;
        #endif
        }
    actions = {
		set_egress_port;
		set_egress_port_and_mac;
        controller_debug;
        controller_reply;
        controller_debug_table_id;
        NoAction;
    }
    size = ROUTING_TABLE_SIZE;

    #ifndef _SUME_SWITCH_P4_
    default_action = controller_debug_table_id(TABLE_V4_NETWORKS);
    #else
    default_action = controller_debug;
    #endif
}
#endif