++ doc update ++ nat64_static / P4 begin
This commit is contained in:
parent
81bf368279
commit
472a104e2b
3 changed files with 586 additions and 30 deletions
|
|
@ -66,15 +66,68 @@ control MyIngress(inout headers hdr,
|
|||
meta.cast_length = (bit<32>) hdr.ipv6.payload_length;
|
||||
}
|
||||
|
||||
/* this needs SESSIONS!!
|
||||
- icmp6: (src addr, dst addr, ID??, )
|
||||
- tcp: (src port, dst port, dst_addr, src addr)
|
||||
- udp: (src port, dst port, dst_addr, src addr)
|
||||
*/
|
||||
// action nat64_static(ipv4_addr_t nataddr, ipv6_addr_t nat64_prefix) {
|
||||
// hdr.ipv4.dst_addr = hdr.ipv6.dst_addr - nat64_prefix;
|
||||
// hdr.ipv4.dst_addr = hdr.ipv6.dst_addr - nat64_prefix;
|
||||
// }
|
||||
action nat64_static(ipv4_addr_t v6_network, ipv4_addr_t v4_network) {
|
||||
ipv6_addr_t src_offset = hdr.ipv6.src_addr - v6_network;
|
||||
ipv4_addr_t src = v4_network + (ipv4_addr_t) src_offset;
|
||||
|
||||
ipv4_addr_t dst_offset = hdr.ipv6.dst_addr - LPM_MATCH_NETWORK_ADDRESS_IN_TABLE;
|
||||
|
||||
nat64_generic(src, dst);
|
||||
}
|
||||
|
||||
action nat46_static(ipv4_addr_t v4_network, ipv6_addr_t nat64_prefix ) {
|
||||
ipv6_addr_t src = hdr.ipv4.dst_addr - v4_network;
|
||||
ipv6_addr_t src = hdr.ipv4.dst_addr - v4_network;
|
||||
|
||||
nat46_generic(src, dst);
|
||||
}
|
||||
|
||||
/* NAT64 protocol unspecific changes */
|
||||
action nat64_generic(ipv4_addr_t src, ipv4_addr_t dst) {
|
||||
/* Stuff that might need to be fixed */
|
||||
hdr.ipv4.version = (bit<4>)4;
|
||||
hdr.ipv4.diff_serv = (bit<6>)0; // no ToS
|
||||
hdr.ipv4.ecn = (bit<2>)0; // unsupported
|
||||
|
||||
hdr.ipv4.ihl = (bit<4>) 5; // internet header length -- needs to be dynamic!
|
||||
hdr.ipv4.totalLen = (bit<16>) hdr.ipv6.payload_length + 5; // should probably also dynamic
|
||||
|
||||
hdr.ipv4.identification = (bit<16>) 0; // no support for fragments
|
||||
hdr.ipv4.flags = (bit<3>) 0; // DF bit and more fragments, unsupported ATM
|
||||
hdr.ipv4.fragOffset = (bit<13>) 0; // 0 as there are no fragments
|
||||
|
||||
/* Stuff that should be fine */
|
||||
hdr.ethernet.ethertype = TYPE_IPV4;
|
||||
|
||||
hdr.ipv4.dst_addr = dst;
|
||||
hdr.ipv4.src_addr = src;
|
||||
|
||||
hdr.ipv4.ttl = hdr.ipv6.hop_limit;
|
||||
hdr.ipv4.protocol = hdr.ipv6.next_header;
|
||||
|
||||
hdr.ipv6.setInvalid();
|
||||
hdr.ipv4.setValid();
|
||||
}
|
||||
|
||||
/* NAT46: protocol unspecific changes */
|
||||
action nat46_generic(ipv6_addr_t src, ipv6_addr_t dst) {
|
||||
hdr.ethernet.ethertype=TYPE_IPV6;
|
||||
|
||||
hdr.ipv6.dst_addr = dst;
|
||||
hdr.ipv6.src_addr = src;
|
||||
|
||||
hdr.ipv6.version = (bit<4>)6;
|
||||
hdr.ipv6.traffic_class = (bit<8>) hdr.ipv4.diff_serv;
|
||||
hdr.ipv6.flow_label = (bit<20>) 0;
|
||||
hdr.ipv6.payload_length = (bit<16>) hdr.ipv4.totalLen - 20;
|
||||
|
||||
hdr.ipv6.next_header = hdr.ipv4.protocol;
|
||||
hdr.ipv6.hop_limit = hdr.ipv4.ttl;
|
||||
|
||||
hdr.ipv4.setInvalid();
|
||||
hdr.ipv6.setValid();
|
||||
}
|
||||
|
||||
|
||||
/********************** Reply to NDP for US ***********************************/
|
||||
table ndp_answer {
|
||||
|
|
@ -185,6 +238,7 @@ control MyIngress(inout headers hdr,
|
|||
set_egress_port;
|
||||
controller_debug;
|
||||
controller_reply;
|
||||
nat64_static;
|
||||
NoAction;
|
||||
}
|
||||
size = ROUTING_TABLE_SIZE;
|
||||
|
|
@ -197,6 +251,7 @@ control MyIngress(inout headers hdr,
|
|||
}
|
||||
actions = {
|
||||
set_egress_port;
|
||||
nat46_static;
|
||||
NoAction;
|
||||
}
|
||||
size = ROUTING_TABLE_SIZE;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue