master-thesis/p4src/actions_nat64_session.p4

91 lines
2.2 KiB
Plaintext

#ifndef NICO_NAT64_SESSION
#define NICO_NAT64_SESSION
/********************** NAT64 sessions ***********************************/
/* automatic translations */
action nat64_tcp_session_translate(
ipv4_addr_t src_addr,
bit<16> src_port,
ipv4_addr_t dst_addr,
bit<16> dst_port)
{
hdr.ipv4.setValid();
hdr.tcp.src_port = src_port;
hdr.tcp.dst_port = dst_port;
nat64_generic(src_addr, dst_addr);
}
action nat46_tcp_session_translate(
ipv6_addr_t src_addr,
bit<16> src_port,
ipv6_addr_t dst_addr,
bit<16> dst_port)
{
hdr.ipv6.setValid();
hdr.tcp.src_port = src_port;
hdr.tcp.dst_port = dst_port;
nat46_generic(src_addr, dst_addr);
}
/* We are in the right range, need to create a session entry */
action nat64_tcp_session_create()
{
controller_reply(TASK_NAT64_TCP_SESSION);
}
/* Used for detecting traffic that should have a session */
table nat64_session {
key = {
hdr.ipv6.dst_addr: lpm;
}
actions = {
controller_debug_table_id;
NoAction;
}
size = NAT64_TABLE_SIZE;
default_action = controller_debug_table_id(TABLE_NAT64_SESSION);
}
table nat64_tcp_session {
key = {
hdr.ipv6.src_addr: exact;
hdr.ipv6.dst_addr: exact;
hdr.tcp.src_port: exact;
hdr.tcp.dst_port: exact;
}
actions = {
controller_debug_table_id;
nat64_tcp_session_create;
nat64_tcp_session_translate;
NoAction;
}
size = NAT64_TABLE_SIZE;
default_action = nat64_tcp_session_create;
}
table nat46_tcp_session {
key = {
hdr.ipv6.src_addr: exact;
hdr.ipv6.dst_addr: exact;
hdr.tcp.src_port: exact;
hdr.tcp.dst_port: exact;
}
actions = {
controller_debug_table_id;
nat46_tcp_session_translate;
NoAction;
}
size = NAT64_TABLE_SIZE;
//default_action = controller_debug_table_id(TABLE_NAT64_TCP);
default_action = NoAction;
}
#endif