From fbadfddee8a9734af6023dd9010e1ffebf7e9b71 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 4 Mar 2019 14:48:15 +0100 Subject: [PATCH] [icmp6] add dedicated multicast address listener --- p4app/controller.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/p4app/controller.py b/p4app/controller.py index da961fa..12cdb20 100644 --- a/p4app/controller.py +++ b/p4app/controller.py @@ -9,6 +9,7 @@ from p4utils.utils.sswitch_API import SimpleSwitchAPI from scapy.all import sniff, get_if_list, Ether, get_if_hwaddr, sendp from scapy.all import IP, Raw, IPv6, TCP, TCP_client from scapy.all import Ether, sniff, Packet, BitField +from scapy.all import ICMPv6ND_NS, ICMPv6 import sys import re @@ -17,7 +18,6 @@ import logging import argparse import subprocess -# Broken in python2 import ipaddress logging.basicConfig() @@ -84,6 +84,10 @@ class L2Controller(object): log.debug("host: {}".format(host)) return "{}1/{}".format(net, mask) + 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)) + @staticmethod def add_host_ips(host, net, ipaddr, dev): subprocess.call(["mx", host, "ip", "addr", "flush", "dev", dev]) @@ -142,6 +146,11 @@ class L2Controller(object): self.fill_tables() self.config_hosts() + def listen_to_icmp6_multicast(self): + """Only needed for debugging""" + + net = str(self.info['ndp_multicast']) + self.controller.table_add("v6_networks", "controller_debug", [net]) def fill_tables(self): self.controller.table_clear("v6_networks") @@ -149,9 +158,8 @@ class L2Controller(object): net = self.prefix_to_net(v6route['net'], self.v6_mask) self.controller.table_add("v6_networks", "set_egress_port", [net], [v6route['port']]) - net = str(self.info['ndp_multicast']) - self.controller.table_add("v6_networks", "controller_reply", [net]) - + if + self.listen_to_icmp6_multicast() self.controller.table_clear("v4_routing") for v4route in self.v4_routes[self.mode]: @@ -160,13 +168,12 @@ class L2Controller(object): self.controller.table_clear("v6_addresses") for v6addr in self.v6_addresses[self.mode]: + icmp6_addr = str(self.gen_ndp_multicast_addr(v6addr)) + self.controller.table_add("v6_addresses", "controller_reply", [v6addr['addr']]) + self.controller.table_add("v6_addresses", "controller_reply", [icmp6_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): """ Assumptions: - all routes are networks (no /128 v6 or /32 v4 @@ -234,8 +241,10 @@ class L2Controller(object): print("Special handling needed") pass elif packet.type == 0x2323: - print("Debug pkg") - pass + # Set back (incorrectly maybe) to IPv6 + packet.type = 0x86dd + print("Debug pkg: ".format(packet)) + else: print("Broken pkg: {}".format(pkg.__repr__())) return @@ -250,7 +259,7 @@ class L2Controller(object): self.args = parser.parse_args() self.mode = self.args.mode - + self.debug = args.debug if __name__ == "__main__": import sys