示例#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 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)