#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