Example #1
0
    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()
Example #2
0
    def send(self, data: bytes, group_ip: str=MCAST_GRP):
        """
        Send a new packet destined to group_ip IP
        """
        packet = PacketPimHeader.parse_bytes(data)
        if self.drop_packet_type is not None:
            if packet.get_pim_type() == self.drop_packet_type:
                self.drop_packet_type = None
                return

        super().send(data=data, group_ip=group_ip)
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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
Example #8
0
    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
Example #9
0
    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
Example #10
0
    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()