[icmp6] add dedicated multicast address listener
This commit is contained in:
parent
6f83eeddb2
commit
fbadfddee8
1 changed files with 20 additions and 11 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue