#ifndef NICO_EGRESS #define NICO_EGRESS /********************** 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); /* port1 = 1, port2 = 2, port3=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 = { hdr.ipv6.dst_addr: lpm; } actions = { set_egress_port; set_egress_port_and_mac; controller_debug; controller_reply; controller_debug_table_id; NoAction; } size = ROUTING_TABLE_SIZE; default_action = controller_debug_table_id(TABLE_V6_NETWORKS); } table v4_networks { key = { hdr.ipv4.dst_addr: lpm; } actions = { set_egress_port; set_egress_port_and_mac; controller_debug; controller_debug_table_id; NoAction; } size = ROUTING_TABLE_SIZE; default_action = controller_debug_table_id(TABLE_V4_NETWORKS); } #endif