Skip to content

Commit

Permalink
Support for unicast and multicast VRFs && remove unused code && use s…
Browse files Browse the repository at this point in the history
…nake case on IGMP/MLD global variables
  • Loading branch information
pedrofran12 committed Jun 10, 2020
1 parent d731b83 commit b4df366
Show file tree
Hide file tree
Showing 29 changed files with 150 additions and 145 deletions.
4 changes: 2 additions & 2 deletions hpimdm/InterfaceHPIM.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ def get_checkpoint_sn(self):
"""
Get the CheckpointSN to be transmitted in a new Hello message
"""
print("A ENTRAR CHECK_SN")
print("ENTER CHECK_SN")
with self.neighbors_lock:
with self.sequencer_lock:
with self.reliable_transmission_lock:
Expand All @@ -235,7 +235,7 @@ def get_checkpoint_sn(self):
if msg_boot_time == time_of_boot and checkpoint_sn > msg_checkpoint_sn:
checkpoint_sn = msg_checkpoint_sn

print("A SAIR CHECK_SN")
print("EXIT CHECK_SN")
return (time_of_boot, checkpoint_sn)

#Random interval for initial Hello message on bootup or triggered Hello message to a rebooting neighbor
Expand Down
11 changes: 6 additions & 5 deletions hpimdm/InterfaceIGMP.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

from hpimdm.packet.ReceivedPacket import ReceivedPacket
from hpimdm.Interface import Interface
from hpimdm.igmp.igmp_globals import Version_1_Membership_Report, Version_2_Membership_Report, Leave_Group, Membership_Query
from hpimdm.igmp.igmp_globals import VERSION_1_MEMBERSHIP_REPORT, VERSION_2_MEMBERSHIP_REPORT, LEAVE_GROUP,\
MEMBERSHIP_QUERY
if not hasattr(socket, 'SO_BINDTODEVICE'):
socket.SO_BINDTODEVICE = 25

Expand Down Expand Up @@ -125,10 +126,10 @@ def receive_unknown_type(self, packet):
return

PKT_FUNCTIONS = {
Version_1_Membership_Report: receive_version_1_membership_report,
Version_2_Membership_Report: receive_version_2_membership_report,
Leave_Group: receive_leave_group,
Membership_Query: receive_membership_query,
VERSION_1_MEMBERSHIP_REPORT: receive_version_1_membership_report,
VERSION_2_MEMBERSHIP_REPORT: receive_version_2_membership_report,
LEAVE_GROUP: receive_leave_group,
MEMBERSHIP_QUERY: receive_membership_query,
}

##################
Expand Down
45 changes: 28 additions & 17 deletions hpimdm/Kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ def __init__(self, kernel_socket):
# Kernel is running
self.running = True

# KEY : interface_ip, VALUE : vif_index
# KEY : vif_index, VALUE : interface_name
self.vif_index_to_name_dic = {}
# KEY : interface_name, VALUE : vif_index
self.vif_name_to_index_dic = {}

# KEY : source_ip, VALUE : {group_ip: KernelEntry}
Expand All @@ -36,7 +37,7 @@ def __init__(self, kernel_socket):
self.socket = kernel_socket
self.rwlock = RWLockWrite()

self.hpim_interface = {} # name: interface_protocol
self.hpim_interface = {} # name: interface_protocol
self.membership_interface = {} # name: interface_igmp

# logs
Expand Down Expand Up @@ -218,29 +219,29 @@ def recv_upstream_msg(self, source_group, interface: "InterfaceHPIM"):
ip_src = source_group[0]
ip_dst = source_group[1]

print("ENTROU RCV_UPSTREAM")
print("ENTER RCV_UPSTREAM")
with self.rwlock.genWlock():
if interface not in self.hpim_interface.values():
return

(interest_state, upstream_state) = interface.get_tree_state(source_group)
tree_is_not_inactive = upstream_state is not None
print("RCV INSTALL/UNINSTALL")
print("INTERESSE: ", interest_state)
print("INTEREST: ", interest_state)

if tree_is_not_inactive and (ip_src not in self.routing or ip_dst not in self.routing.get(ip_src, {})):
self.create_entry(ip_src, ip_dst)
elif ip_src in self.routing and ip_dst in self.routing[ip_src]:
self.routing[ip_src][ip_dst].check_interface_state(interface.vif_index, upstream_state, interest_state)
else:
interface.remove_tree_state(ip_src, ip_dst)
print("SAIU RCV_UPSTREAM")
print("EXIT RCV_UPSTREAM")

def recv_interest_msg(self, source_group, interface: "InterfaceHPIM"):
ip_src = source_group[0]
ip_dst = source_group[1]

print("ENTROU RECV_INTEREST")
print("ENTER RECV_INTEREST")
with self.rwlock.genRlock():
if interface not in self.hpim_interface.values():
return
Expand All @@ -251,7 +252,7 @@ def recv_interest_msg(self, source_group, interface: "InterfaceHPIM"):

(interest_state, upstream_state) = interface.get_tree_state(source_group)
self.routing[ip_src][ip_dst].check_interest_state(interface.vif_index, interest_state)
print("SAIU RECV_INTEREST")
print("EXIT RECV_INTEREST")

#############################################################
# Create kernel entries (data structure representing a tree)
Expand Down Expand Up @@ -291,18 +292,18 @@ def _get_kernel_entry_interface():

def snapshot_multicast_routing_table(self, vif_index):
trees_to_sync = {}
print("ENTROU SNAPSHOT")
print("ENTER SNAPSHOT")
#with self.rwlock.genWlock():
for (ip_src, src_dict) in self.routing.items():
for (ip_dst, kernel_entry) in self.routing[ip_src].items():
tree = kernel_entry.get_interface_sync_state(vif_index)
if tree is not None:
trees_to_sync[(ip_src, ip_dst)] = tree
print("SAIU SNAPSHOT")
print("EXIT SNAPSHOT")
return trees_to_sync

def recheck_all_trees(self, vif_index: int):
print("ENTROU RECHECK")
print("ENTER RECHECK")
with self.rwlock.genWlock():
interface_name = self.vif_index_to_name_dic.get(vif_index, None)
interface = self.hpim_interface.get(interface_name, None)
Expand Down Expand Up @@ -331,15 +332,15 @@ def recheck_all_trees(self, vif_index: int):
self.create_entry(tree[0], tree[1])
elif tree[0] in self.routing and tree[1] in self.routing[tree[0]]:
self.routing[tree[0]][tree[1]].check_interface_state(vif_index, upstream_state, interest_state)
print("SAIU RECHECK")
print("EXIT RECHECK")

def recheck_membership_all_trees(self, vif_index: int):
print("ENTROU RECHECK IGMP")
print("ENTER RECHECK IGMP")
with self.rwlock.genWlock():
for src_dict in self.routing.values():
for entry in src_dict.values():
entry.check_membership_state(vif_index)
print("SAIU RECHECK IGMP")
print("EXIT RECHECK IGMP")

def recheck_all_trees_in_all_interfaces(self):
for i in list(self.vif_index_to_name_dic.keys()):
Expand Down Expand Up @@ -378,9 +379,15 @@ class Kernel4(KernelInterface):
VIFF_USE_IFINDEX = 0x8 # use vifc_lcl_ifindex instead of vifc_lcl_addr to find an interface

def __init__(self):
# KEY : interface_ip, VALUE : vif_index
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IGMP)

# MRT TABLE
if hpim_globals.MULTICAST_TABLE_ID != 0:
try:
s.setsockopt(socket.IPPROTO_IP, Kernel4.MRT_TABLE, hpim_globals.MULTICAST_TABLE_ID)
except:
traceback.print_exc()

# MRT INIT
s.setsockopt(socket.IPPROTO_IP, Kernel4.MRT_INIT, 1)

Expand Down Expand Up @@ -655,11 +662,15 @@ class Kernel6(KernelInterface):
MIFF_REGISTER = 0x1 # /* register vif */

def __init__(self):
# KEY : source_ip, VALUE : {group_ip: KernelEntry}
self.routing = {}

s = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_ICMPV6)

# MRT TABLE
if hpim_globals.MULTICAST_TABLE_ID != 0:
try:
s.setsockopt(socket.IPPROTO_IPV6, Kernel6.MRT6_TABLE, hpim_globals.MULTICAST_TABLE_ID)
except:
traceback.print_exc()

# MRT INIT
s.setsockopt(socket.IPPROTO_IPV6, Kernel6.MRT6_INIT, 1)

Expand Down
7 changes: 4 additions & 3 deletions hpimdm/Run.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@
import traceback
import faulthandler
import _pickle as pickle
from hpimdm.tree import hpim_globals
from hpimdm.daemon.Daemon import Daemon
from hpimdm import Main

VERSION = "1.3.2"
VERSION = "1.3.3.1"


def client_socket(data_to_send):
Expand Down Expand Up @@ -220,9 +221,9 @@ def main():
sys.exit(0)
elif args.multicast_routes:
if args.ipv4 or not args.ipv6:
os.system("ip mroute show")
os.system("ip mroute show table " + str(hpim_globals.MULTICAST_TABLE_ID))
elif args.ipv6:
os.system("ip -6 mroute show")
os.system("ip -6 mroute show table " + str(hpim_globals.MULTICAST_TABLE_ID))
sys.exit(0)
elif not daemon.is_running():
print("HPIM-DM is not running")
Expand Down
15 changes: 9 additions & 6 deletions hpimdm/UnicastRouting.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from threading import RLock
from socket import if_indextoname
from pyroute2 import IPDB, IPRoute
from .tree import hpim_globals


def get_unicast_info(ip_dst):
Expand Down Expand Up @@ -34,23 +35,25 @@ def get_route(ip_dst: str):
raise Exception("Unknown IP version")
info = None
with UnicastRouting.lock:
ipdb = UnicastRouting.ipdb # type:IPDB
ipdb = UnicastRouting.ipdb # type:IPDB

for mask_len in range(full_mask, 0, -1):
dst_network = str(ipaddress.ip_interface(ip_dst + "/" + str(mask_len)).network)

print(dst_network)
if dst_network in ipdb.routes:
if dst_network in ipdb.routes.tables[hpim_globals.UNICAST_TABLE_ID]:
print(info)
if ipdb.routes[{'dst': dst_network, 'family': family}]['ipdb_scope'] != 'gc':
info = ipdb.routes[dst_network]
if ipdb.routes[{'dst': dst_network, 'family': family,
'table': hpim_globals.UNICAST_TABLE_ID}]['ipdb_scope'] != 'gc':
info = ipdb.routes[{'dst': dst_network, 'family': family,
'table': hpim_globals.UNICAST_TABLE_ID}]
break
else:
continue
if not info:
print("0.0.0.0/0 or ::/0")
if "default" in ipdb.routes:
info = ipdb.routes[{'dst': 'default', 'family': family}]
if "default" in ipdb.routes.tables[hpim_globals.UNICAST_TABLE_ID]:
info = ipdb.routes[{'dst': 'default', 'family': family, 'table': hpim_globals.UNICAST_TABLE_ID}]
print(info)
return info

Expand Down
10 changes: 5 additions & 5 deletions hpimdm/igmp/GroupState.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from hpimdm.utils import TYPE_CHECKING
from .wrapper import NoMembersPresent
from .igmp_globals import GroupMembershipInterval, LastMemberQueryInterval
from .igmp_globals import GROUP_MEMBERSHIP_INTERVAL, LAST_MEMBER_QUERY_INTERVAL

if TYPE_CHECKING:
from .RouterState import RouterState
Expand Down Expand Up @@ -49,13 +49,13 @@ def set_state(self, state):
###########################################
# Set timers
###########################################
def set_timer(self, alternative: bool=False, max_response_time: int=None):
def set_timer(self, alternative: bool = False, max_response_time: int = None):
"""
Set timer
"""
self.clear_timer()
if not alternative:
time = GroupMembershipInterval
time = GROUP_MEMBERSHIP_INTERVAL
else:
time = self.router_state.interface_state.get_group_membership_time(max_response_time)

Expand All @@ -75,7 +75,7 @@ def set_v1_host_timer(self):
Set v1 host timer
"""
self.clear_v1_host_timer()
v1_host_timer = Timer(GroupMembershipInterval, self.group_membership_v1_timeout)
v1_host_timer = Timer(GROUP_MEMBERSHIP_INTERVAL, self.group_membership_v1_timeout)
v1_host_timer.start()
self.v1_host_timer = v1_host_timer

Expand All @@ -91,7 +91,7 @@ def set_retransmit_timer(self):
Set retransmit timer
"""
self.clear_retransmit_timer()
retransmit_timer = Timer(LastMemberQueryInterval, self.retransmit_timeout)
retransmit_timer = Timer(LAST_MEMBER_QUERY_INTERVAL, self.retransmit_timeout)
retransmit_timer.start()
self.retransmit_timer = retransmit_timer

Expand Down
22 changes: 5 additions & 17 deletions hpimdm/igmp/RouterState.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from .GroupState import GroupState
from .querier.Querier import Querier
from .nonquerier.NonQuerier import NonQuerier
from .igmp_globals import Membership_Query, QueryResponseInterval, QueryInterval, OtherQuerierPresentInterval
from .igmp_globals import MEMBERSHIP_QUERY, QUERY_RESPONSE_INTERVAL, QUERY_INTERVAL, OTHER_QUERIER_PRESENT_INTERVAL

if TYPE_CHECKING:
from hpimdm.InterfaceIGMP import InterfaceIGMP
Expand Down Expand Up @@ -37,11 +37,11 @@ def __init__(self, interface: 'InterfaceIGMP'):
self.group_state_lock = RWLockWrite()

# send general query
packet = PacketIGMPHeader(type=Membership_Query, max_resp_time=QueryResponseInterval*10)
packet = PacketIGMPHeader(type=MEMBERSHIP_QUERY, max_resp_time=QUERY_RESPONSE_INTERVAL * 10)
self.interface.send(packet.bytes())

# set initial general query timer
timer = Timer(QueryInterval, self.general_query_timeout)
timer = Timer(QUERY_INTERVAL, self.general_query_timeout)
timer.start()
self.general_query_timer = timer

Expand All @@ -63,7 +63,7 @@ def set_general_query_timer(self):
Set general query timer
"""
self.clear_general_query_timer()
general_query_timer = Timer(QueryInterval, self.general_query_timeout)
general_query_timer = Timer(QUERY_INTERVAL, self.general_query_timeout)
general_query_timer.start()
self.general_query_timer = general_query_timer

Expand All @@ -79,7 +79,7 @@ def set_other_querier_present_timer(self):
Set other querier present timer
"""
self.clear_other_querier_present_timer()
other_querier_present_timer = Timer(OtherQuerierPresentInterval, self.other_querier_present_timeout)
other_querier_present_timer = Timer(OTHER_QUERIER_PRESENT_INTERVAL, self.other_querier_present_timeout)
other_querier_present_timer.start()
self.other_querier_present_timer = other_querier_present_timer

Expand Down Expand Up @@ -137,30 +137,20 @@ def receive_v1_membership_report(self, packet: ReceivedPacket):
Received IGMP Version 1 Membership Report packet
"""
igmp_group = packet.payload.group_address
#if igmp_group not in self.group_state:
# self.group_state[igmp_group] = GroupState(self, igmp_group)

#self.group_state[igmp_group].receive_v1_membership_report()
self.get_group_state(igmp_group).receive_v1_membership_report()

def receive_v2_membership_report(self, packet: ReceivedPacket):
"""
Received IGMP Membership Report packet
"""
igmp_group = packet.payload.group_address
#if igmp_group not in self.group_state:
# self.group_state[igmp_group] = GroupState(self, igmp_group)

#self.group_state[igmp_group].receive_v2_membership_report()
self.get_group_state(igmp_group).receive_v2_membership_report()

def receive_leave_group(self, packet: ReceivedPacket):
"""
Received IGMP Leave packet
"""
igmp_group = packet.payload.group_address
#if igmp_group in self.group_state:
# self.group_state[igmp_group].receive_leave_group()
self.get_group_state(igmp_group).receive_leave_group()

def receive_query(self, packet: ReceivedPacket):
Expand All @@ -172,9 +162,7 @@ def receive_query(self, packet: ReceivedPacket):

# process group specific query
if igmp_group != "0.0.0.0" and igmp_group in self.group_state:
#if igmp_group != "0.0.0.0":
max_response_time = packet.payload.max_resp_time
#self.group_state[igmp_group].receive_group_specific_query(max_response_time)
self.get_group_state(igmp_group).receive_group_specific_query(max_response_time)

def remove(self):
Expand Down
Loading

0 comments on commit b4df366

Please sign in to comment.