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