diff --git a/doc/plan.org b/doc/plan.org index 426e68b..44babec 100644 --- a/doc/plan.org +++ b/doc/plan.org @@ -176,7 +176,17 @@ | 2019-04-03 | | | | | ARP corrections -- ARP working for the switch! | x | | | ICMP w/ incorrect checksum | x | -| | ICMP w/ correct checksum - PING REPLIES!!! | | +| | ICMP w/ correct checksum - PING REPLIES!!! | x | +| | Next: check / verify / translate nat46 | | +| | | | +| | | | +| 2019-04-04 | | | +| | Report [no meeting w/ Laurent] | | +| | | | +| | Added arp handling | | +| | Added icmp handling | | +| | Static | | +| | | | | | | | | 2019-04-04 | NAT64 1:1 table ICMP, ICMPv6 working | | | | Will need some switch local ip addresses | | @@ -694,9 +704,11 @@ INFO:main:unhandled reassambled= ethernet is wrong! ***** TODO transform protocol specific: icmp -> icmp6 -****** TODO Make switch answer IPv4 icmp echo request for +****** DONE Make switch answer IPv4 icmp echo request for ******* DONE Make switch respond to ARP +******* DONE Make switch respond to icmp echo request w/ correct checksum (2019-04-03) **** TODO Add / check default route for v4 hosts **** TODO Update p4c to avoid compiler bug ***** TODO Updating p4c @@ -1773,6 +1785,13 @@ transparent / in network modification Only the destination network is matched for deciding on NAT64, as priority based double LPM is not supported. This limits a prefix to be used only in one network. +**** TODO No resolution of hardware addresses + - hardcoded ip --> mac addresses +Correct version: +Resolve mac address in controller, buffer packet, replay packet / +handle packet. +Only has to be set, when packets originate from the switch/controller. + *** References / Follow up **** RFC 791 IPv4 https://tools.ietf.org/html/rfc791 **** RFC 792 ICMP https://tools.ietf.org/html/rfc792 diff --git a/p4app/controller.py b/p4app/controller.py index 3d46370..4ffd3d9 100755 --- a/p4app/controller.py +++ b/p4app/controller.py @@ -78,6 +78,7 @@ class L2Controller(object): # https://en.wikipedia.org/wiki/Solicited-node_multicast_address self.info['ndp_multicast'] = ipaddress.ip_network("ff02::1:ff00:0/104") + self.info['mac_base'] = "00:00:0a:00:00:0{}" self.info['mac_addr'] = "00:00:0a:00:00:42" self.info['mac_broadcast'] = "ff:ff:ff:ff:ff:ff" self.info['ipv6_link_local'] = ipaddress.ip_address("fe80::200:aff:fe00:42") @@ -115,8 +116,9 @@ class L2Controller(object): net = self.info['v6_gen'].next() self.v6_routes['base'].append({ "net": net, - "port": port} - ) + "port": port, + "mac": self.info['mac_base'].format(port) + }) self.ports.append(port) self.v6_routes['router'] = self.v6_routes['base'] @@ -131,8 +133,9 @@ class L2Controller(object): net = self.info['v4_gen'].next() self.v4_routes['base'].append({ "net": net, - "port": port} - ) + "port": port, + "mac": self.info['mac_base'].format(port) + }) self.ports.append(port) self.v4_routes['router'] = self.v4_routes['base'] @@ -256,13 +259,23 @@ class L2Controller(object): def fill_tables(self): self.controller.table_clear("v6_networks") for v6route in self.v6_routes[self.mode]: - self.controller.table_add("v6_networks", "set_egress_port", [str(v6route['net'])], [str(v6route['port'])]) + #self.controller.table_add("v6_networks", "set_egress_port", [str(v6route['net'])], [str(v6route['port'])]) + self.controller.table_add("v4_networks", "set_egress_port_and_mac", + [str(v6route['net'])], + [str(v6route['port']), + str(v6route['mac']), + ]) self.controller.table_clear("v4_networks") self.controller.table_clear("v4_arp") self.controller.table_clear("v4_arp_egress") for v4route in self.v4_routes[self.mode]: - self.controller.table_add("v4_networks", "set_egress_port", [str(v4route['net'])], [str(v4route['port'])]) + # self.controller.table_add("v4_networks", "set_egress_port", [str(v4route['net'])], [str(v4route['port'])]) + self.controller.table_add("v4_networks", "set_egress_port_and_mac", + [str(v4route['net'])], + [str(v4route['port']), + str(v4route['mac']), + ]) # ARP support self.controller.table_add("v4_arp_egress", "set_egress_port", [str(v4route['net'])], [str(v4route['port'])]) diff --git a/p4src/static-mapping.p4 b/p4src/static-mapping.p4 index 979f7f3..c9a1880 100644 --- a/p4src/static-mapping.p4 +++ b/p4src/static-mapping.p4 @@ -26,6 +26,11 @@ control MyIngress(inout headers hdr, standard_metadata.egress_spec = out_port; } + action set_egress_port_and_mac (port_t out_port, mac_addr_t mac_addr) { + hdr.ethernet.dst_addr = mac_addr; + standard_metadata.egress_spec = out_port; + } + action controller_reply(task_t task) { meta.task = task; meta.ingress_port = standard_metadata.ingress_port; @@ -425,6 +430,7 @@ Echo or Echo Reply Message } actions = { set_egress_port; + set_egress_port_and_mac; controller_debug; controller_reply; controller_debug_table_id; @@ -440,6 +446,7 @@ Echo or Echo Reply Message } actions = { set_egress_port; + set_egress_port_and_mac; controller_debug; controller_debug_table_id; NoAction;