def handle_ack(self, packet): # TODO: sequence number overflow if self.piggyback and packet.Data != FIELD_NOT_SET and len( packet.Data) > 0: self.handle_data(packet) self.acknowledgement = packet.Acknowledgement # print("ack: ", packet.Acknowledgement) i = 0 while i < len(self.timers): timer = self.timers[i] if timer._callbackArgs[0].SequenceNumber < packet.Acknowledgement: timer.cancel() self.timers = self.timers[:i] + self.timers[i + 1:] i -= 1 i += 1 if self.rip_timer != None: self.rip_timer.cancel() self.rip_timer.extend(Seconds(2)) self.rip_timer.start() return self.send_window_start = max(self.send_window_start, packet.Acknowledgement) self.send_window_data() if self.state == PEEP_Base.TEARDOWN and self.sent_all(): self.send_rip() self.rip_timer = Timer(Seconds(2), self.abort_connection) self.rip_timer.start()
def initiate_teardown(self): # print('teardown start') self.state = PEEP_Base.TEARDOWN if self.sent_all(): self.send_rip() self.rip_timer = Timer(Seconds(2), self.abort_connection) self.rip_timer.start()
def resend(self, resntPacket): if "DATA" in resntPacket.Type.upper(): #start timer again #get timer for seq, packet, timer, acked in self.sentBoxData: if seq == resntPacket.SeqNo: timer.cancel() index = self.sentBoxData.index((seq, packet, timer, acked)) pacTimer = Timer(Seconds(self.timeoutValue), self.timeout, packet) pacTimer.start() self.sentBoxData[index] = ( seq, packet, pacTimer, False ) #packet seq, packet, timer, acked or not #start timer elif "FIN" in resntPacket.Type.upper(): currentTimer = self.sentBoxData[-1][2] currentTimer.cancel() currentTimer = Timer(Seconds(self.timeoutValue), self.timeout, self.sentBoxData[-1][1]) currentTimer.start() self.sentBoxData[-1] = (self.sentBoxData[-1][0], self.sentBoxData[-1][1], currentTimer, False) #last packet since its FIN elif "ACK" in resntPacket.Type.upper(): if "SYN" in resntPacket.Type.upper(): self.timHand.cancel() self.timHand = Timer(Seconds(self.timeoutValue), self.timeout, self.sentHand) self.timHand.start() elif "SYN" in resntPacket.Type.upper(): self.stateCon = 0 print("Im here") self.timHand.cancel() self.timHand = Timer(Seconds(self.timeoutValue), self.timeout, self.sentHand) self.timHand.start() resendPacket = RIPPacket(Type=resntPacket.Type, SeqNo=resntPacket.SeqNo, AckNo=resntPacket.AckNo, CRC=resntPacket.CRC, Data=resntPacket.Data) print("resend packet: Type = {}, SeqNo = {}, AckNo = {},\n CRC = {}". format(resntPacket.Type, resntPacket.SeqNo, resntPacket.AckNo, resntPacket.CRC.decode())) self.transport.write(resendPacket.__serialize__())
def send_packet(self, packet): # print(self, "send packet: ", packet) self.transport.write(packet.__serialize__()) if packet.Type != PEEPPacket.SYN and packet.Type != PEEPPacket.DATA and packet.Type != PEEPPacket.RIP: return timer = Timer(Seconds(1), self.send_packet, packet) self.timers.append(timer) timer.start()
def send(self, pacType, PacData): sentPacket = RIPPacket() print("the packet type is: {}".format(pacType)) #calculateSeqAck if "SYN" in pacType.upper() and "ACK" in pacType.upper(): print("SYN ACK") #add Ack number sentPacket.AckNo = self.recHand.SeqNo + 1 #add Seq sentPacket.SeqNo = self.SequenceNo #random seq elif "ACK" in pacType.upper(): if self.stateCon == 1: print("1 ACK") #add Ack number sentPacket.AckNo = self.recHand.SeqNo + 1 #add Seq sentPacket.SeqNo = self.sentHand.SeqNo + 1 elif "SYN" in pacType.upper(): print("SYN") #add Ack number sentPacket.AckNo = 0 #add Seq sentPacket.SeqNo = self.SequenceNo #random seq elif "DATA" in pacType.upper() or "FIN" in pacType.upper(): if self.sentHand is not None: print("1st Packet after the Handshake") #add Ack number sentPacket.AckNo = 0 #add Seq sentPacket.SeqNo = self.recHand.AckNo #empty hands self.recHand = None self.sentHand = None else: #add Ack number sentPacket.AckNo = 0 #add Seq sentPacket.SeqNo = self.sentBoxData[-1][0] + len( self.sentBoxData[-1][1].Data ) #sequence number and data length of previouse sent packet if "FIN" in pacType.upper(): self.stateCon = 3 #FIN state else: print("IM NOTHING{}".format(sentPacket.AckNo)) #add Type sentPacket.Type = pacType #add Data sentPacket.Data = PacData #add checksum sentPacket.CRC = self.hashPacket(sentPacket) print("checksum is: {}".format(sentPacket.CRC.decode())) print("send Type ={}, Seq= {}, ACK= {}".format(sentPacket.Type, sentPacket.SeqNo, sentPacket.AckNo)) #add packet to the sent list if "DATA" in pacType.upper() or "FIN" in pacType.upper( ): #not SYN ACK since it will go to the first option pacTimer = Timer( Seconds(self.timeoutValue), self.timeout, sentPacket ) #self.timeoutValue = 10 :the RIP layer will wait for 10 seconds until resending the packet pacTimer.start() self.sentBoxData.append( (sentPacket.SeqNo, sentPacket, pacTimer, False)) #packet seq, packet, timer, acked or not print("the packe is sent and next Seq number is:{}".format( sentPacket.SeqNo + len(sentPacket.Data))) elif "SYN" in pacType.upper( ) or "SYN" in pacType.upper() and "ACK" in pacType.upper(): print("starting a SYN or SYN ACK handshake packets timer") self.sentHand = sentPacket self.timHand = Timer(Seconds(self.timeoutValue), self.timeout, self.sentHand) self.timHand.start() print("the timer object is: {}".format(self.timHand)) print("the packe is sent from {} and next Seq number is:{}".format( self.identity, sentPacket.SeqNo + 1)) for seq, packet, timer, acked in self.sentBoxData: print("sentBoxData:--- seq= {}, ack= {}, ACKED= {}".format( seq, seq + len(packet.Data), acked)) #write packet serPacket = sentPacket.__serialize__() self.transport.write(sentPacket.__serialize__())