示例#1
0
    def processArrivalDataFrame(self, event_time: float, receiver: "Host", _type: str, df = None, origin = None):
        """
        create one of the following arrival event and put it to the GEL event list

        internal DF: df created in this host
            success => schedule sense event to see if the channel is idle to process the df
            failure => put into the buffer

        external DF: df from external host to this host
            success => schedule receive event and then return an ACK latter
            failure => no failure

        ACK DF: ACK from external host
            success => take the next df from the buffer and process it
            failure => no failure
        """

        sender = self
        success = None
        failure = None
        arrival = None

        if _type == "internal DF":
            """
            Schedule next event
            To create a sense channel event, or put it into the buffer
            """
            if self.status == "idle" and len(self.buffer.array)==0 and self.blocking==False:
                self.createSenseChannelEvent(event_time, df, "df, stage 0", df.origin)
            else:
                self.addToBuffer(df)

        elif _type == "external DF":
            """
            create an ack packet, and then create a SenseChannel Event for this ack packet 
            """
            ack_time = event_time
            ack = DataFrame("ack", ack_time, df.sender, df.receiver, df.id, df.origin)
            ack.global_Id = df.global_Id
            ack.size = 64

            self.createSenseChannelEvent(event_time, ack, "ack, stage 0", df.origin)

        elif _type == "ack":    # if received is ack
            success_time = event_time
            success_event = SuccessTransferEvent(success_time, df, failure, df.origin)

            self.GEL.addEvent(success_event)
示例#2
0
    def __init__(self,
                 _type,
                 event_time,
                 sender,
                 receiver,
                 gel,
                 origin=None,
                 df=None):
        self.type = _type
        self.event_time = event_time
        self.sender = sender
        self.receiver = receiver
        if origin == None:
            self.origin = sender
        else:
            self.origin = origin
        self.GEL = gel
        self.dataframe = df

        if self.type == "internal DF":
            """
            The origin of an internal DF is the sender
            The origin of an external DF is the origin of the df
            The origin of an ack is the origin of the df
            """

            arrival_time = event_time + negative_exponential_distribution(
                ARRIVE_RATE)
            df = DataFrame("data",
                           arrival_time,
                           self.sender,
                           self.receiver,
                           self.sender.ackId,
                           origin=self.origin)
            df.global_Id = self.GEL.packet_counter
            self.arrival_time = arrival_time
            self.dataframe = df
            self.GEL.packet_counter += 1
            self.sender.ackId += 1

            def success():
                self.sender.processArrivalDataFrame(arrival_time,
                                                    self.receiver,
                                                    "internal DF", df,
                                                    df.origin)

            arrival_Event = ProcessDataFrameArrivalEvent(
                self.type, arrival_time, self.sender, self.receiver, df)
            arrival_Event.success = success

            self.GEL.addEvent(arrival_Event)

        elif self.type == "external DF":
            arrival_time = event_time
            self.arrival_time = arrival_time
            self.dataframe = df

            def success():
                self.sender.processArrivalDataFrame(arrival_time,
                                                    self.receiver,
                                                    "external DF", df,
                                                    df.origin)

            arrival_Event = ProcessDataFrameArrivalEvent(
                self.type, arrival_time, self.sender, self.receiver, df)
            arrival_Event.success = success
            self.GEL.addEvent(arrival_Event)

        elif self.type == "ack":
            arrival_time = event_time
            self.arrival_time = arrival_time
            self.dataframe = df

            def success():
                self.sender.processArrivalDataFrame(arrival_time,
                                                    self.receiver, "ack", df,
                                                    df.origin)

            arrival_Event = ProcessDataFrameArrivalEvent(
                self.type, arrival_time, self.sender, self.receiver, df)
            arrival_Event.success = success
            self.GEL.addEvent(arrival_Event)
示例#3
0
    def __init__(self,
                 _type,
                 event_time,
                 sender,
                 receiver,
                 gel,
                 origin=None,
                 df=None):
        self.type = _type
        self.event_time = event_time
        self.sender = sender
        self.receiver = receiver
        if origin == None:
            self.origin = sender
        else:
            self.origin = origin
        self.GEL = gel
        self.dataframe = df
        self.result_description = ""

        if self.type == "internal DF":
            """
            The origin of an internal DF is the sender
            The origin of an external DF is the origin of the df
            The origin of an ack is the origin of the df
            """

            config = configparser.ConfigParser()
            config.read("configuration_file.ini")
            ARRIVE_RATE = float(config["DEFAULT"]["ARRIVE_RATE"])

            arrival_time = event_time + negative_exponential_distribution(
                ARRIVE_RATE)
            df = DataFrame("data",
                           arrival_time,
                           self.sender,
                           self.receiver,
                           self.sender.ackId,
                           origin=self.origin)
            df.global_Id = self.GEL.packet_counter
            df.ACKed = False
            self.arrival_time = arrival_time
            self.dataframe = df
            self.GEL.packet_counter += 1
            self.GEL.packet_array.append(df)
            self.sender.ackId += 1

            def success():
                self.sender.processArrivalDataFrame(arrival_time,
                                                    self.receiver,
                                                    "internal DF", df,
                                                    df.origin)

            arrival_Event = ProcessDataFrameArrivalEvent(
                self.type, arrival_time, self.sender, self.receiver, df)
            arrival_Event.success = success
            self.arrival_time += 0.00000001

            self.GEL.addEvent(arrival_Event)

        elif self.type == "external DF":
            arrival_time = event_time + 0.00000001
            self.arrival_time = arrival_time
            self.dataframe = df

            def success():
                self.sender.processArrivalDataFrame(arrival_time,
                                                    self.receiver,
                                                    "external DF", df,
                                                    df.origin)

            arrival_Event = ProcessDataFrameArrivalEvent(
                self.type, arrival_time, self.sender, self.receiver, df)
            arrival_Event.success = success
            self.GEL.addEvent(arrival_Event)

        elif self.type == "ack":
            arrival_time = event_time + 0.00000001
            original_sender = self.sender
            original_receiver = self.receiver
            self.sender = original_receiver
            self.receiver = original_sender
            self.arrival_time = arrival_time
            self.dataframe = df

            def success():
                """
                The sender process the arrived ack, and then
                """
                self.sender.processArrivalDataFrame(arrival_time,
                                                    self.receiver, "ack", df,
                                                    df.origin)

            arrival_Event = ProcessDataFrameArrivalEvent(
                self.type, arrival_time, self.sender, self.receiver, df)
            arrival_Event.success = success
            self.GEL.addEvent(arrival_Event)
示例#4
0
    def processArrivalDataFrame(self, event_time: float, receiver: "Host", _type: str, df = None, origin = None):
        """
        create one of the following arrival event and put it to the GEL event list

        internal DF: df created in this host
            success => schedule sense event to see if the channel is idle to process the df
            failure => put into the buffer

        external DF: df from external host to this host
            success => schedule receive event and then return an ACK latter
            failure => no failure

        ACK DF: ACK from external host
            success => take the next df from the buffer and process it
            failure => no failure
        """

        sender = self

        success = None
        failure = None
        arrival = None



        if _type == "internal DF":
            """
            Schedule next event
            To create a sense channel event, or put it into the buffer
            """
            if self.GEL.packet_counter < self.GEL.TOTAL_PACKET:
                new_arrival_event = ScheduleDataFrameEvent(_type, event_time, sender, receiver, self.GEL, sender)
                self.GEL.addEvent(new_arrival_event)

            if self.status == "idle":
                sense_event_time = event_time + self.senseTime
                self.createSenseChannelEvent(sense_event_time, df, "df, stage 0", df.origin)
            else:
                self.buffer.insert_dataframe(df)

        elif _type == "external DF":
            """
            create an ack packet, and then create a SenseChannel Event for this ack packet 
            """
            ack_time = event_time
            sense_event_time = event_time + self.senseTime

            # print("ack", ack_time, df.sender, df.receiver, df.id, df.origin)
            ack = DataFrame("ack", ack_time, df.sender, df.receiver, df.id, df.origin)
            ack.global_Id = df.global_Id
            ack.size = 64

            self.createSenseChannelEvent(sense_event_time, ack, "ack, stage 0", df.origin)

        elif _type == "ack":
            success_time = event_time + 0

            def success():
                "to get the unacked event from the notAckedDict and then acknowledge the packet"
                unacked = self.notACKedDict[df.id]
                unacked.ACKed = True

                if len(self.buffer.array) != 0:
                    next_df = self.origin.buffer.popleft()
                    self.createSenseChannelEvent(event_time, next_df, "df, stage 0", df.origin)

            success_event = SuccessTransferEvent(success_time, df, success, failure, df.origin)
            self.GEL.addEvent(success_event)