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