Begin icmp6 in controller -> pass special info
This commit is contained in:
parent
b3e51d550a
commit
7f1e9f6252
5 changed files with 81 additions and 22 deletions
53
doc/plan.org
53
doc/plan.org
|
@ -7,6 +7,8 @@
|
||||||
| | Write mail / phone | x |
|
| | Write mail / phone | x |
|
||||||
| 2019-02-22 | Have all papers handed in | |
|
| 2019-02-22 | Have all papers handed in | |
|
||||||
| | | |
|
| | | |
|
||||||
|
| 2019-02-22 | Have rough definition of tasks | x |
|
||||||
|
| | | |
|
||||||
| 2019-02-23 | python2 / ipaddress is buggy | x |
|
| 2019-02-23 | python2 / ipaddress is buggy | x |
|
||||||
| | p4utils is python2 only support | |
|
| | p4utils is python2 only support | |
|
||||||
| | bmpy_utils is not installable with pip | |
|
| | bmpy_utils is not installable with pip | |
|
||||||
|
@ -29,24 +31,42 @@
|
||||||
| | * Reading about multicast / trying to figure out dynamic membership | |
|
| | * Reading about multicast / trying to figure out dynamic membership | |
|
||||||
| | | |
|
| | | |
|
||||||
| | - Challenges | |
|
| | - Challenges | |
|
||||||
| | * Some issues with python2 (ipaddr) - slowing down | |
|
| | * Some issues with python2 (ipaddr) - slowing down | x |
|
||||||
|
| | https://github.com/phihag/ipaddress/issues/46 | |
|
||||||
| | * Forwarded and received icmp6 packets are not "accepted" | |
|
| | * Forwarded and received icmp6 packets are not "accepted" | |
|
||||||
| | | |
|
| | | |
|
||||||
| | - Questions | |
|
| | - Questions | |
|
||||||
| | * Re-using code (lee howard) | |
|
| | * Multicast: in controller | x |
|
||||||
| | * Multicast | |
|
| | * Re-using code (lee howard) -> ok & mention | x |
|
||||||
| | * A lot of redundant code / different tables / repeating | |
|
| | * A lot of redundant code / different tables / repeating: use if's | x |
|
||||||
|
| | * 65k parsing is insane | x |
|
||||||
| | | |
|
| | | |
|
||||||
| | - Next steps: | |
|
| | - Next steps: | |
|
||||||
| | * Supporting MLD | |
|
| | * Supporting MLD | |
|
||||||
|
| | * Save stuff in the controller | |
|
||||||
|
| | * checkout ipaddr bug / status | |
|
||||||
|
| | * Variable length / icmp6 in the controller | |
|
||||||
|
| | * Go simple... | |
|
||||||
|
| | * Meeting Edgar & Alexander week after | |
|
||||||
|
| | * Summary on Slack | |
|
||||||
|
| | * 1130 meeting now | |
|
||||||
|
| | | |
|
||||||
|
| 2019-03-01 | Feature list / priority list / roadmap clear | x |
|
||||||
|
| | Joining P4 Slack | |
|
||||||
|
| | | |
|
||||||
|
| 2019-03-03 | icmp6 revised: | |
|
||||||
|
| | - add address to table for forwarding to controller | x |
|
||||||
|
| | - select correct format for forwarding | |
|
||||||
|
| | - decode in controller | |
|
||||||
|
| | - send back to switch | |
|
||||||
|
| | - test with host | |
|
||||||
| | | |
|
| | | |
|
||||||
| | | |
|
| | | |
|
||||||
| 2019-02-22 | Have rough definition of tasks | |
|
| 2019-03-08 | NAT46 1:1 table ICMP, ICMPv6 working | |
|
||||||
| 2019-03-01 | Feature list / priority list / roadmap clear | |
|
|
||||||
| 2019-03-08 | NAT46 1:1 table TCP/UDP working | |
|
|
||||||
| 2019-03-15 | NAT46 1:1 table ICMP, ICMPv6 working | |
|
|
||||||
| | Will need some switch local ip addresses | |
|
| | Will need some switch local ip addresses | |
|
||||||
| | | |
|
| | | |
|
||||||
|
| 2019-03-15 | NAT46 1:1 table TCP/UDP working | |
|
||||||
|
| | | |
|
||||||
| 2019-03-29 | Jool SIIT / range / offset support https://www.jool.mx/en/run-vanilla.html | |
|
| 2019-03-29 | Jool SIIT / range / offset support https://www.jool.mx/en/run-vanilla.html | |
|
||||||
| | Jool EAMT support https://www.jool.mx/en/run-eam.html | |
|
| | Jool EAMT support https://www.jool.mx/en/run-eam.html | |
|
||||||
| | Bidirectional support | |
|
| | Bidirectional support | |
|
||||||
|
@ -86,12 +106,14 @@
|
||||||
**** DONE Parse icmp
|
**** DONE Parse icmp
|
||||||
**** DONE Parse icmpv6
|
**** DONE Parse icmpv6
|
||||||
**** DONE Add (static) egress configuration
|
**** DONE Add (static) egress configuration
|
||||||
**** DONE Calculate ICMP6 checksums
|
**** TODO Calculate ICMP6 checksums
|
||||||
|
***** Need to include the payload!?!!
|
||||||
**** TODO Implement minimal neighbor discovery
|
**** TODO Implement minimal neighbor discovery
|
||||||
***** TODO For the switch
|
***** TODO For the switch
|
||||||
****** DONE Register IPv6 address in table
|
****** DONE Register IPv6 address in table
|
||||||
****** TODO Parse ICMPv6 up to neighbor solicitation
|
****** DONE Parse ICMPv6 up to neighbor solicitation -> no: checksum problem
|
||||||
****** TODO Use NDP (Neighbor Solicitation (NDP) , Neighbor Advertisement (NDP))
|
****** DONE Use NDP (Neighbor Solicitation (NDP) , Neighbor Advertisement (NDP)) -> no: controller
|
||||||
|
****** Approach 2: use cpu header, forward information to controller
|
||||||
***** TODO For other nodes -> multicast
|
***** TODO For other nodes -> multicast
|
||||||
***** TODO Maybe implement link local addresses (missing at the moment)
|
***** TODO Maybe implement link local addresses (missing at the moment)
|
||||||
****** ff02::/??
|
****** ff02::/??
|
||||||
|
@ -397,21 +419,18 @@ listening on h1-eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
|
||||||
4 packets received by filter
|
4 packets received by filter
|
||||||
0 packets dropped by kernel
|
0 packets dropped by kernel
|
||||||
root@ubuntu:~/master-thesis#
|
root@ubuntu:~/master-thesis#
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
***** When pinging we see
|
***** When pinging we see
|
||||||
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
|
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
|
||||||
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
|
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
|
||||||
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
|
DEBUG:main:INCOMING: <Ether dst=33:33:ff:00:00:42 src=00:00:0a:00:00:01 type=0x86dd |<IPv6 version=6 tc=0 fl=0 plen=32 nh=ICMPv6 hlim=255 src=2001:db8:61::1 dst=ff02::1:ff00:42 |<ICMPv6ND_NS type=Neighbor Solicitation code=0 cksum=0xd343 res=0 tgt=2001:db8:61::42 |<ICMPv6NDOptSrcLLAddr type=1 len=1 lladdr=00:00:0a:00:00:01 |>>>>
|
||||||
|
|
||||||
|
|
||||||
***** Hosts
|
***** Hosts
|
||||||
****** Left side: IPv6
|
****** Left side: IPv6
|
||||||
****** Right side: IPv4
|
****** Right side: IPv4
|
||||||
|
***** Included in the header
|
||||||
|
|
||||||
|
|
||||||
**** Requirements
|
**** Requirements
|
||||||
-
|
|
||||||
*** Performance comparison
|
*** Performance comparison
|
||||||
*** Feature/Functionality difference / overview
|
*** Feature/Functionality difference / overview
|
||||||
**** Not included
|
**** Not included
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import nnpy
|
import nnpy
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
@ -16,17 +18,28 @@ import argparse
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
# Broken in python2
|
# Broken in python2
|
||||||
#import ipaddress
|
import ipaddress
|
||||||
|
|
||||||
logging.basicConfig()
|
logging.basicConfig()
|
||||||
log = logging.getLogger("main")
|
log = logging.getLogger("main")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class CpuHeader(Packet):
|
||||||
|
name = 'CpuPacket'
|
||||||
|
fields_desc = [BitField('ingress_port', 0, 16)]
|
||||||
|
|
||||||
|
|
||||||
class L2Controller(object):
|
class L2Controller(object):
|
||||||
def __init__(self, sw_name):
|
def __init__(self, sw_name):
|
||||||
# Command line mapping
|
# Command line mapping
|
||||||
self.modes = ['base', 'router']
|
self.modes = ['base', 'router']
|
||||||
|
|
||||||
|
|
||||||
|
self.info={}
|
||||||
|
self.info['ndp_multicast'] = ipaddress.ip_network("ff02::1:ff00:0/104")
|
||||||
|
|
||||||
|
|
||||||
self.address_suffix = 42
|
self.address_suffix = 42
|
||||||
|
|
||||||
# Network / egress
|
# Network / egress
|
||||||
|
@ -145,9 +158,13 @@ class L2Controller(object):
|
||||||
|
|
||||||
self.controller.table_clear("v6_addresses")
|
self.controller.table_clear("v6_addresses")
|
||||||
for v6addr in self.v6_addresses[self.mode]:
|
for v6addr in self.v6_addresses[self.mode]:
|
||||||
self.controller.table_add("v6_addresses", "icmp6_answer", [v6addr['addr']])
|
self.controller.table_add("v6_addresses", "send_to_controller", [v6addr['addr']])
|
||||||
|
|
||||||
|
|
||||||
|
def gen_ndp_multicast_addr(self, addr):
|
||||||
|
""" append the 24 bit of the address to the multicast address"""
|
||||||
|
return ipaddress.ip_address(int(self.info['ndp_multicast']) + (int(addr) & 0xffffff))
|
||||||
|
|
||||||
def config_hosts(self):
|
def config_hosts(self):
|
||||||
""" Assumptions:
|
""" Assumptions:
|
||||||
- all routes are networks (no /128 v6 or /32 v4
|
- all routes are networks (no /128 v6 or /32 v4
|
||||||
|
@ -207,10 +224,15 @@ class L2Controller(object):
|
||||||
|
|
||||||
self.debug_print_pkg(pkg)
|
self.debug_print_pkg(pkg)
|
||||||
|
|
||||||
if packet.type == 0x800:
|
if packet.type == 0x0800:
|
||||||
pass
|
pass
|
||||||
elif packet.type == 0x86dd:
|
elif packet.type == 0x86dd:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
elif packet.type == 0x4242:
|
||||||
|
# CPU header included
|
||||||
|
print("Special handling needed")
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
print("Broken pkg: {}".format(pkg))
|
print("Broken pkg: {}".format(pkg))
|
||||||
return
|
return
|
||||||
|
|
|
@ -22,7 +22,7 @@ control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
|
||||||
control MyComputeChecksum(inout headers hdr, inout metadata meta) {
|
control MyComputeChecksum(inout headers hdr, inout metadata meta) {
|
||||||
apply {
|
apply {
|
||||||
|
|
||||||
bit<32> icmp6_len = 1; /* for icmp6 NS */
|
bit<32> icmp6_len = 32; /* for icmp6 NS */
|
||||||
|
|
||||||
update_checksum (
|
update_checksum (
|
||||||
hdr.icmp6.isValid(),
|
hdr.icmp6.isValid(),
|
||||||
|
|
|
@ -14,6 +14,8 @@ typedef bit<16> mcast_t;
|
||||||
|
|
||||||
const bit<16> TYPE_IPV4 = 0x0800;
|
const bit<16> TYPE_IPV4 = 0x0800;
|
||||||
const bit<16> TYPE_IPV6 = 0x86DD;
|
const bit<16> TYPE_IPV6 = 0x86DD;
|
||||||
|
const bit<16> TYPE_CPU = 0x4242;
|
||||||
|
|
||||||
|
|
||||||
const bit<8> PROTO_ICMP = 1;
|
const bit<8> PROTO_ICMP = 1;
|
||||||
const bit<8> PROTO_TCP = 6;
|
const bit<8> PROTO_TCP = 6;
|
||||||
|
|
|
@ -28,6 +28,11 @@ control MyIngress(inout headers hdr,
|
||||||
clone3(CloneType.I2E, 100, meta);
|
clone3(CloneType.I2E, 100, meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
action controller_reply() {
|
||||||
|
hdr.ethernet.etherType = TYPE_CPU;
|
||||||
|
clone3(CloneType.I2E, 100, meta);
|
||||||
|
}
|
||||||
|
|
||||||
/* Output PKG on correct ports (plural) */
|
/* Output PKG on correct ports (plural) */
|
||||||
action multicast_pkg(mcast_t mcast_grp) {
|
action multicast_pkg(mcast_t mcast_grp) {
|
||||||
standard_metadata.mcast_grp = mcast_grp;
|
standard_metadata.mcast_grp = mcast_grp;
|
||||||
|
@ -131,7 +136,7 @@ control MyIngress(inout headers hdr,
|
||||||
// hdr.ipv6.next_header: exact;
|
// hdr.ipv6.next_header: exact;
|
||||||
}
|
}
|
||||||
actions = {
|
actions = {
|
||||||
icmp6_answer;
|
// icmp6_answer;
|
||||||
send_to_controller;
|
send_to_controller;
|
||||||
NoAction;
|
NoAction;
|
||||||
}
|
}
|
||||||
|
@ -197,6 +202,17 @@ control MyEgress(inout headers hdr,
|
||||||
/* set tcp header valid after modifying it -- keep this in mind*/
|
/* set tcp header valid after modifying it -- keep this in mind*/
|
||||||
// hdr.tcp.setValid();
|
// hdr.tcp.setValid();
|
||||||
|
|
||||||
|
// If ingress clone
|
||||||
|
if (standard_metadata.instance_type == 1){
|
||||||
|
|
||||||
|
// hdr.cpu.setValid();
|
||||||
|
// hdr.cpu.srcAddr = hdr.ethernet.srcAddr;
|
||||||
|
// hdr.cpu.ingress_port = (bit<16>)meta.ingress_port;
|
||||||
|
// hdr.ethernet.etherType = L2_LEARN_ETHER_TYPE;
|
||||||
|
// truncate((bit<32>)22); //ether+cpu header
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue