def sendHello(self): neighbords=self.getNeighbords() HelloPack = HelloPacket(self.IPInterfaceAddress, 2, 1, self.RouterID, self.AreaID, 0, 0, 0, 0, self.IPInterfaceMask, self.HelloInterval, 2, self.RouterPriority, self.RouterDeadInterval, self.DesignatedRouter, self.BackupDesignatedRouter, neighbords) deliver(HelloPack.getHelloPackettoSend(), [self.IPInterfaceAddress], 0, True)
def readLSUpdate(self, packet, multi): LSAs = packet.getReceivedLSAs() sourceRouter = packet.getSourceRouter() # create LS-ACK pack = LinkStateAcknowledgmentPacket(self.IPInterfaceAddress, 2, 5, self.RouterID, self.AreaID, 0, 0, 0, 0) for x in LSAs: pack.receiveLSA(x.getHeaderPack(), x.getLengthHeader(False)) if x.getLSType() == 11: self.routerclass.receiveLSAtoLSDB(x, 'ABR') elif x.getLSType() != 3: self.routerclass.receiveLSAtoLSDB(x, self.AreaID) # send LS-ACK deliver(pack.getLSACKToSend(), [self.IPInterfaceAddress], sourceRouter, True)
def TakeCareofLSUpdate(self): # Wait for master response packetReceived = self.routerclass.unicastReceiver(self.IPInterfaceAddress, 4, False) sourceRouter = packetReceived.getSourceRouter() # create LS-ACK pack = LinkStateAcknowledgmentPacket(self.IPInterfaceAddress, 2, 5, self.RouterID, self.AreaID, 0, 0, 0, 0) LSAs = packetReceived.getReceivedLSAs() for x in LSAs: pack.receiveLSA(x.getHeaderPack(), x.getLengthHeader(False)) if x.getLSType() == 11: self.routerclass.receiveLSAtoLSDB(x, 'ABR') elif x.getLSType() != 3: self.routerclass.receiveLSAtoLSDB(x, self.AreaID) # send LS-ACK deliver(pack.getLSACKToSend(), self.IPInterfaceAddress, sourceRouter, False)
def FlushLSA(self, lsa): #flush means send for all interfaces. sourceRouter = lsa.getSource() activeAreas = self.routerClass.getActiveAreas() for x in activeAreas: if sourceRouter == None: # pacote nosso. Envia para todas as interfaces ativas interfaces = self.routerClass.getInterfaceIPExcept(x) else: # pacote nao e nosso. Envia para todas as interfaces ativas excepto a referente a esta. sourceInterface = self.routerClass.WhatInterfaceReceivedthePacket(sourceRouter) interfaces = self.routerClass.getInterfaceIPExcept(x) sourceInterface = getIPofInterface(sourceInterface) if sourceInterface in interfaces: interfaces.remove(sourceInterface) if len(interfaces) != 0: pack = LinkStateUpdatePacket(None, 2, 4, self.routerClass.getRouterID(), x, 0, 0, 0, 0, 1) pack.receiveLSA(lsa) packed = pack.getPackLSUPD() deliver(packed, interfaces, None, True)
def TakeCareofLSRequest(self): pack = self.routerclass.unicastReceiver(self.IPInterfaceAddress, 3, True) if pack != 0: LSAs = pack.getLSARequests() LSDB = self.routerclass.getLSDB(self.AreaID) sourceRouter = pack.getSourceRouter() packetToSend = LinkStateUpdatePacket(self.IPInterfaceAddress, 2, 4, self.RouterID, self.AreaID, 0, 0, 0, 0, len(LSAs)) for x in LSAs: LSA = LSDB.getLSA(x['LSType'], x['LinkStateID'], x['AdvertisingRouter']) if LSA == False: print "Problem! LSA not found on LSDB!" else: packetToSend.receiveLSA(LSA) # deliver packetToSend = packetToSend.getPackLSUPD() deliver(packetToSend, self.IPInterfaceAddress, sourceRouter, False)
def startDDProcess(self, sourceRouter): #ExStart phase threadForUnicast = threading.Thread(target= self.routerclass.unicastReceiver, args=[self.IPInterfaceAddress, 2, True]) threadForUnicast.daemon = True threadForUnicast.start() # get random number myddseqnumber = random.randint(1, 65536) # create DD to send packet = DatabaseDescriptionPacket(self.IPInterfaceAddress, 2, 2, self.RouterID, self.AreaID, 0, 0, 0, 0, 2, 1, 1, 1, myddseqnumber, True) packet = packet.packDDtoSend() # send packet to source router deliver(packet, self.IPInterfaceAddress, sourceRouter, False) lastPacketSent= packet # wait for packet packetReceived= self.DDfunctionwaitnewpacket(sourceRouter, False) sourceRouter = packetReceived.getSourceRouter() ddseqnumber = packetReceived.getDatabaseDescriptionSequenceNumber() # who is the master? if self.RouterID > packetReceived.getRouterID(): master = True # i'm the master else: master = False # i'm the slave # Exchange phase LSDB = self.routerclass.getLSDB(self.AreaID) ListHeaderstosendLSDB = LSDB.getHeaderLSAs() if master: # wait for packet packetReceived = self.DDfunctionwaitnewpacket(sourceRouter, True) sourceRouter = packetReceived.getSourceRouter() ddseqnumber = packetReceived.getDatabaseDescriptionSequenceNumber() LSAHeaders = packetReceived.getListLSA() ddseqnumber += 1 newpack = DatabaseDescriptionPacket(self.IPInterfaceAddress, 2, 2, self.RouterID, self.AreaID, 0, 0, 0, 0, 2, 0, 1, 1, ddseqnumber, False) for x in ListHeaderstosendLSDB: newpack.addLSAHeader(x) # Update Header newpack.setPackLength(20 * len(ListHeaderstosendLSDB) + 8) newpack.computeChecksum() # send packet to source router newpack = newpack.packDDtoSend() deliver(newpack, self.IPInterfaceAddress, sourceRouter, False) # wait for packet packetReceived = self.DDfunctionwaitnewpacket(sourceRouter, True) sourceRouter = packetReceived.getSourceRouter() ddseqnumber = packetReceived.getDatabaseDescriptionSequenceNumber() MbitRecv = packetReceived.getMbit() LSAHeaders += packetReceived.getListLSA() Mbit = True while Mbit: # Exchange not ended # create DD to send ddseqnumber += 1 packet = DatabaseDescriptionPacket(self.IPInterfaceAddress, 2, 2, self.RouterID, self.AreaID, 0, 0, 0, 0, 2, 0, 0, 1, ddseqnumber, True) packet = packet.packDDtoSend() # send packet to source router deliver(packet, self.IPInterfaceAddress, sourceRouter, False) # wait for packet packetReceived = self.DDfunctionwaitnewpacket(sourceRouter, True) sourceRouter = packetReceived.getSourceRouter() ddseqnumber = packetReceived.getDatabaseDescriptionSequenceNumber() Mbit = packetReceived.getMbit() LSAHeaders += packetReceived.getListLSA() # End Exchange: move to Loading else: newpack = DatabaseDescriptionPacket(self.IPInterfaceAddress, 2, 2, self.RouterID, self.AreaID, 0, 0, 0, 0, 2, 0, 0, 0, ddseqnumber, False) for x in ListHeaderstosendLSDB: newpack.addLSAHeader(x) # Update Header newpack.setPackLength(20*len(ListHeaderstosendLSDB) + 8) newpack.computeChecksum() # send packet to source router newpack = newpack.packDDtoSend() deliver(newpack, self.IPInterfaceAddress, sourceRouter, False) # wait for packet packetReceived = self.DDfunctionwaitnewpacket(sourceRouter, True) sourceRouter = packetReceived.getSourceRouter() ddseqnumber = packetReceived.getDatabaseDescriptionSequenceNumber() Mbit = packetReceived.getMbit() LSAHeaders = packetReceived.getListLSA() # create DD to send packet = DatabaseDescriptionPacket(self.IPInterfaceAddress, 2, 2, self.RouterID, self.AreaID, 0, 0, 0, 0, 2, 0, 0, 0, ddseqnumber, True) packet = packet.packDDtoSend() # send packet to source router deliver(packet, self.IPInterfaceAddress, sourceRouter, False) while Mbit: # Exchange not ended # wait for packet packetReceived = self.DDfunctionwaitnewpacket(sourceRouter, True) sourceRouter = packetReceived.getSourceRouter() ddseqnumber = packetReceived.getDatabaseDescriptionSequenceNumber() Mbit = packetReceived.getMbit() LSAHeaders += packetReceived.getListLSA() # create DD to send packet = DatabaseDescriptionPacket(self.IPInterfaceAddress, 2, 2, self.RouterID, self.AreaID, 0, 0,0, 0, 2, 0, 0, 0, ddseqnumber, True) packet = packet.packDDtoSend() # send packet to source router deliver(packet, self.IPInterfaceAddress, sourceRouter, False) # End Exchange: move to Loading # wait for LS-Request thr = threading.Thread(target=self.TakeCareofLSRequest, args=[]) thr.daemon = True thr.start() packet = LinkStateRequestPacket(self.IPInterfaceAddress, 2, 3, self.RouterID, self.AreaID, 0, 0, 0, 0) haveToSend = False for x in LSAHeaders: if len(x) != 20: print "erro! Bad Length do LSA Header retirado do LS Request" continue LSAH = unpackLSAHeader(x) if LSDB.HaveThisLSA(LSAH): continue else: haveToSend = True packet.receiveRequest({'LSType': LSAH.getLSType(), 'LinkStateID':LSAH.getLSID(), 'AdvertisingRouter': LSAH.getADVRouter()}) # send LS-Request if haveToSend: pack = packet.getLSReqToSend() deliver(pack, self.IPInterfaceAddress, sourceRouter, False) self.TakeCareofLSUpdate() self.routerclass.startThreadUnicast(self.IPInterfaceAddress)