Beispiel #1
0
    def ReceiveICCN(self, pkt):
        """Receive a ICCN packet from the connection. Will process the AVPs.

        :param pkt: THe decoded l2tp control packet.
        :return: a ICCN response packet or None

        """
        if L2tpv3GlobalSettings.L2tpv3GlobalSettings.MustAvpsCheck is True:
            ret = self.connection.checkMustAvps(
                L2tpv3ControlPacket.L2tpv3ControlPacket.ICCNMandatoryAVPs,
                pkt.avps)
            if ret is not True:
                self.fsm.recvBadICCN()
                return L2tpv3ControlPacket.L2tpv3CDN(
                    self, 2, 4, "Avp cannot be handled correctly")

        self.logger.debug("L2Tp session[%d, %d] receive a ICCN message",
                          self.localSessionId, self.remoteSessionId)

        if len(pkt.avps) > 1:
            for i in xrange(1, len(pkt.avps)):
                avp = pkt.avps[i]
                # We got a bad ICCN, we should send a CDN
                if not avp.handleAvp(pkt, None):
                    self.fsm.recvBadICCN()
                    return L2tpv3ControlPacket.L2tpv3CDN(
                        self, 2, 4, "Avp cannot be handled correctly")
        self.logger.debug("Session[%d, %d] got a good ICCN, send it to fsm.",
                          self.localSessionId, self.remoteSessionId)
        self.fsm.recvGoodICCN()
        # We need to send the ZLB.
        ackpkt = L2tpv3ControlPacket.L2tpv3ACK(
            connID=self.connection.remoteConnID)
        return ackpkt
Beispiel #2
0
    def recvStopCCN(self, pkt):
        if L2tpv3GlobalSettings.L2tpv3GlobalSettings.MustAvpsCheck is True:
            ret = self.checkMustAvps(
                L2tpv3ControlPacket.L2tpv3ControlPacket.StopCCNMandatoryAVPs,
                pkt.avps)
            if ret is not True:
                return

        if len(pkt.avps) > 1:
            for i in xrange(1, len(pkt.avps)):
                avp = pkt.avps[i]
                avp.handleAvp(pkt, None)
        self.fsm.recvStopCCN()
        ackpkt = L2tpv3ControlPacket.L2tpv3ACK(connID=self.remoteConnID)
        return ackpkt
Beispiel #3
0
    def ReceiveCDN(self, pkt):
        """Receive a CDN packet, not check the AVP.

        :param pkt: The CDN control packet, has been decoded.
        :return: None

        """
        self.logger.debug("L2Tp session[%d, %d] receive a CDN message",
                          self.localSessionId, self.remoteSessionId)
        del self.avps_cdn[:]
        if len(pkt.avps) > 1:
            for i in xrange(1, len(pkt.avps)):
                avp = pkt.avps[i]
                self.avps_cdn.append(avp)
        self.fsm.recvCDN()
        ackpkt = L2tpv3ControlPacket.L2tpv3ACK(
            connID=self.connection.remoteConnID)
        return ackpkt
Beispiel #4
0
    def recvSCCCN(self, pkt):
        """Receive a SCCCN pkt, we should process the avp and check the result.

        :param pkt:
        :return:

        """
        if L2tpv3GlobalSettings.L2tpv3GlobalSettings.MustAvpsCheck is True:
            ret = self.checkMustAvps(
                L2tpv3ControlPacket.L2tpv3ControlPacket.SCCCNMandatoryAVPs,
                pkt.avps)
            if ret is not True:
                self.fsm.recvBadSCCCN()
                return
        self.transport.needSendZlb = True
        if len(pkt.avps) > 1:
            for i in xrange(1, len(pkt.avps)):
                avp = pkt.avps[i]
                self.logger.debug(avp)
                # We got a bad SCCCN, we should send a CDN
                if not avp.handleAvp(pkt, None):
                    self.fsm.recvBadSCCCN()
                    return
        self.fsm.recvGoodSCCCN()

        if pkt.Connection.isRecoveryTunnel:
            recoverConn = pkt.Connection.recoverConnection

            if recoverConn is not None:
                recoverConn.resetTransport()
                recoverConn.isInRecovery = False
            # tear down the recovery tunnel
            pkt.Connection.StopConnection()

            if recoverConn is not None:
                # silently clear sessions not in an established state
                recoverConn.closeUnEstSessions()
                # Query the sessions that might have been in inconsistent states
                # based on data channel inactivity
                recoverConn.queryInactSessions()
        ackpkt = L2tpv3ControlPacket.L2tpv3ACK(connID=self.remoteConnID)
        return ackpkt