def send_hello(self): """ Send a new Hello message Include in it the HelloHoldTime and GenerationID """ self.interface_logger.debug('Send Hello message') self.hello_timer.cancel() pim_payload = PacketPimHello() pim_payload.add_option(PacketPimHelloHoldtime(holdtime=3.5 * self.HELLO_PERIOD)) pim_payload.add_option(PacketPimHelloGenerationID(self.generation_id)) # TODO implementar LANPRUNEDELAY e OVERRIDE_INTERVAL por interface e nas maquinas de estados ler valor de interface e nao do globals.py #pim_payload.add_option(PacketPimHelloLANPruneDelay(lan_prune_delay=self._propagation_delay, override_interval=self._override_interval)) if self._state_refresh_capable: pim_payload.add_option(PacketPimHelloStateRefreshCapable(REFRESH_INTERVAL)) ph = PacketPimHeader(pim_payload) packet = Packet(payload=ph) self.send(packet.bytes()) # reschedule hello_timer self.hello_timer = Timer(self.HELLO_PERIOD, self.send_hello) self.hello_timer.start()
def send_assert_cancel(self): print("send assert cancel") try: (source, group) = self.get_tree_id() ph = PacketPimAssert(multicast_group_address=group, source_address=source, metric_preference=float("Inf"), metric=float("Inf")) pckt = Packet(payload=PacketPimHeader(ph)) self.get_interface().send(pckt.bytes()) except: traceback.print_exc() return
def send_graft_ack(self, ip_sender): print("send graft ack") try: (source, group) = self.get_tree_id() ph = PacketPimGraftAck(ip_sender) ph.add_multicast_group(PacketPimJoinPruneMulticastGroup(group, joined_src_addresses=[source])) pckt = Packet(payload=PacketPimHeader(ph)) self.get_interface().send(pckt.bytes(), ip_sender) except: traceback.print_exc() return
def send_assert(self): print("send assert") try: (source, group) = self.get_tree_id() assert_metric = self.my_assert_metric() ph = PacketPimAssert(multicast_group_address=group, source_address=source, metric_preference=assert_metric.metric_preference, metric=assert_metric.route_metric) pckt = Packet(payload=PacketPimHeader(ph)) self.get_interface().send(pckt.bytes()) except: traceback.print_exc() return
def send_join(self): print("send join") try: (source, group) = self.get_tree_id() ph = PacketPimJoinPrune(self.get_neighbor_RPF(), 210) ph.add_multicast_group(PacketPimJoinPruneMulticastGroup(group, joined_src_addresses=[source])) pckt = Packet(payload=PacketPimHeader(ph)) self.get_interface().send(pckt.bytes()) except: traceback.print_exc() return
def send_pruneecho(self): holdtime = T_LIMIT try: (source, group) = self.get_tree_id() ph = PacketPimJoinPrune(self.get_ip(), holdtime) ph.add_multicast_group(PacketPimJoinPruneMulticastGroup(group, pruned_src_addresses=[source])) pckt = Packet(payload=PacketPimHeader(ph)) self.get_interface().send(pckt.bytes()) print("send prune echo") except: traceback.print_exc() return
def send_prune(self, holdtime=None): if holdtime is None: holdtime = T_LIMIT print("send prune") try: (source, group) = self.get_tree_id() ph = PacketPimJoinPrune(self.get_neighbor_RPF(), holdtime) ph.add_multicast_group(PacketPimJoinPruneMulticastGroup(group, pruned_src_addresses=[source])) pckt = Packet(payload=PacketPimHeader(ph)) self.get_interface().send(pckt.bytes()) print('sent prune msg') except: traceback.print_exc() return
def send_state_refresh(self, state_refresh_msg_received): print("send state refresh") if state_refresh_msg_received is None: return self._last_state_refresh_message = state_refresh_msg_received if self.lost_assert( ) or not self.get_interface().is_state_refresh_enabled(): return interval = state_refresh_msg_received.interval self._assert_state.sendStateRefresh(self, interval) self._prune_state.send_state_refresh(self) prune_indicator_bit = 0 if self.is_pruned(): prune_indicator_bit = 1 from pimdm import UnicastRouting (metric_preference, metric, mask) = UnicastRouting.get_metric( state_refresh_msg_received.source_address) assert_override_flag = 0 if self._assert_state == AssertState.NoInfo: assert_override_flag = 1 try: ph = PacketPimStateRefresh( multicast_group_adress=state_refresh_msg_received. multicast_group_adress, source_address=state_refresh_msg_received.source_address, originator_adress=state_refresh_msg_received.originator_adress, metric_preference=metric_preference, metric=metric, mask_len=mask, ttl=state_refresh_msg_received.ttl - 1, prune_indicator_flag=prune_indicator_bit, prune_now_flag=state_refresh_msg_received.prune_now_flag, assert_override_flag=assert_override_flag, interval=interval) pckt = Packet(payload=PacketPimHeader(ph)) self.get_interface().send(pckt.bytes()) except: traceback.print_exc() return
def remove(self): """ Remove this interface Clear all state """ self.hello_timer.cancel() self.hello_timer = None # send pim_hello timeout message pim_payload = PacketPimHello() pim_payload.add_option(PacketPimHelloHoldtime(holdtime=HELLO_HOLD_TIME_TIMEOUT)) pim_payload.add_option(PacketPimHelloGenerationID(self.generation_id)) ph = PacketPimHeader(pim_payload) packet = Packet(payload=ph) self.send(packet.bytes()) self.get_kernel().interface_change_number_of_neighbors() super().remove()