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)
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)