master-thesis/p4src/actions_egress.p4
2019-07-24 22:52:23 +02:00

101 lines
No EOL
2.2 KiB
Text

#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); /* 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 = {
#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_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