Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
 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)
Пример #5
0
    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)
Пример #6
0
    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)