Exemple #1
0
    def send_packet(self, packet, src_id, dst_id=None,
                    callback=None, callback_args=tuple() ):
        self._log("----------------------- SEND PACKET -----------------------")
        if not self.frame_loss.check(len(packet)):
            self._log("----------------------- OK -----------------------")
            self._log("send-packet {}->{} {}".format(src_id, dst_id, packet))
            if enable_statsct:
                Statsct.log("send-packet {}->{} {}".format(src_id, dst_id, packet))
                Statsct.add_packet_info(packet, src_id, dst_id, True)
            # if dst_id == None, it is a broadcast
            link_list = self.get_link_by_id(src_id, dst_id)
            count = 0
            for link in link_list:
                count += self.send_packet_on_link(link, packet)
        else:
            self._log("----------------------- KO -----------------------")
            self._log("packet was lost {}->{}".format(src_id, dst_id))
            if enable_statsct:
                Statsct.log("packet was lost {}->{} {}".format(src_id, dst_id, packet))            
                Statsct.add_packet_info(packet,src_id,dst_id, False)
            count = 0
        #
        if callback != None:
            args = callback_args+(count,) # XXX need to check. - CA:
            # [CA] the 'count' is now passed as 'status' in:
            #  SimulLayer2._event_sent_callback(self, transmit_callback, status
            # the idea is that is transmission fails, at least you can pass
            # count == 0 (status == 0), and you can do something there.
            # (in general case, some meta_information need to be sent)

            #args = callback_args
            callback(*args)
        return count
Exemple #2
0
    def send_packetX(self, packet, src_id, dst_id=None, callback=None, callback_args=tuple()):
        """send a message to another device in a client - server Simulation"""
        self._log("----------------------- SEND PACKET -----------------------")
        if not self.frame_loss.check(packet):
            self._log("----------------------- OK -----------------------")
            self._log("send-packet {}->{} {}".format(src_id, dst_id, packet))
            if enable_statsct:
                Statsct.log("send-packet {}->{} {}".format(src_id, dst_id, packet))
                Statsct.add_packet_info(packet,src_id,dst_id, True)
            # if dst_id == None, it is a broadcast
            # link_list = self.get_link_by_id(src_id, dst_id)
            count = 1
            # for link in link_list:
            #     count += self.send_packet_on_link(link, packet)
            note_table_list = list(self.node_table.items())[-1][1]
            #self.node_table[0].protocol.layer2.clientSend.send(packet)

            note_table_list.protocol.layer2.roleSend.send(packet)

            try:
                number_tiles_send = \
                    note_table_list.protocol.fragment_session.session_list[0]["session"].current_number_tiles_sent()
                state = note_table_list.protocol.fragment_session.session_list[0]["session"].state
                print("STATE : ", state)
                print("Lenght queue", len(self.scheduler.queue))
                if (state == self.SEND_ALL_1 or state == self.ACK_FAILURE or state == self.ACK_TIMEOUT) \
                        and number_tiles_send == 0:
                    print("------------------------------- RECEIVE PACKET ------------------------------")
                    message = note_table_list.protocol.layer2.roleSend.Receive()
                    print("Message from Server", message)
                    note_table_list.protocol.layer2.event_receive_packet(note_table_list.id, message)
                    # note_table_list.protocol.fragment_session.session_list[0]["session"].state = 'START'
            except:
                print("Not fragment state")
        else:
            self._log("----------------------- KO -----------------------")
            self._log("packet was lost {}->{}".format(src_id, dst_id))
            if enable_statsct:
                Statsct.log("packet was lost {}->{} {}".format(src_id, dst_id, packet))
                Statsct.add_packet_info(packet,src_id,dst_id, False)
            count = 0
        #
        if callback != None:
            args = callback_args + (count,) # XXX need to check. - CA:
            # [CA] the 'count' is now passed as 'status' in:
            #  SimulLayer2._event_sent_callback(self, transmit_callback, status
            # the idea is that is transmission fails, at least you can pass
            # count == 0 (status == 0), and you can do something there.
            # (in general case, some meta_information need to be sent)

            #args = callback_args
            callback(*args)
        return count
Exemple #3
0
    def deliver_packet(self, packet, src_id, dst_id=None,
                    callback=None, callback_args=tuple(), with_hack=False):
        self._log("----------------------- SEND PACKET -----------------------")
        lost = self.frame_loss.is_lost(len(packet))
        if not lost:
            self._log("----------------------- OK -----------------------")
            self._log("send-packet {}->{} {}".format(src_id, dst_id, packet))
            if enable_statsct:
                Statsct.log("send-packet {}->{} {}".format(src_id, dst_id, packet))
                clock = self.scheduler.get_clock()
                Statsct.add_packet_info(clock, packet, src_id, dst_id, True)
            # if dst_id == None, it is a broadcast
            link_list = self.get_link_by_id(src_id, dst_id)
            if not with_hack:
                count = 0
                for link in link_list:
                    count += self.send_packet_on_link(link, packet)
            else:
                count = 1
                self._send_packetX_hack() # [CA] should be removed
        else:
            self._log("----------------------- KO -----------------------")
            self._log("packet was lost {}->{}".format(src_id, dst_id))
            if enable_statsct:
                Statsct.log("packet was lost {}->{} {}".format(src_id, dst_id, packet))
                clock = self.scheduler.get_clock()
                Statsct.add_packet_info(clock, packet, src_id, dst_id, False)
            count = 0
        #
        if self.observer is not None:
            info = {"src":src_id, "dst":dst_id, "packet":packet,
                    "clock": clock, "count":count, "lost":lost,
                    "event-id": self.scheduler._get_event_id() }
            self.observer.record_packet(info)

        if callback != None: #XXX: should called by channel after delay
            args = callback_args+(count,) # XXX need to check. - CA:
            # [CA] the 'count' is now passed as 'status' in:
            #  SimulLayer2._event_sent_callback(self, transmit_callback, status
            # the idea is that is transmission fails, at least you can pass
            # count == 0 (status == 0), and you can do something there.
            # (in general case, some meta_information need to be sent)

            #args = callback_args
            callback(*args)
        return count