/// <summary>
        /// remove request and sequence if the response is the final response.
        /// </summary>
        /// <param name="connection">the connection on which to remove the request and sequence</param>
        /// <param name="response">the response for which to remove the request and sequence</param>
        protected virtual void RemoveRequestAndSequence(CifsServerPerConnection connection, SmbPacket response)
        {
            if (response is SmbWriteRawInterimResponsePacket
                || response is SmbNtTransactInterimResponsePacket
                || response is SmbTransactionInterimResponsePacket
                || response is SmbTransaction2InterimResponsePacket)
            {
                return;
            }

            connection.RemovePendingRequest(response.SmbHeader.Mid);
            connection.RemoveSequenceNumber(response);
        }
        /// <summary>
        /// Update the context of cifs server
        /// </summary>
        /// <param name="connection">The connection between client and server.</param>
        /// <param name="packet">The sent or received packet in stack transport.</param>
        public virtual void UpdateRoleContext(CifsServerPerConnection connection, SmbPacket packet)
        {
            if (connection == null || packet == null)
            {
                return;
            }

            if (packet is SmbReadRawResponsePacket)
            {
                if (connection.PendingRequestTable.Count != 1)
                {
                    return;
                }
                SmbPacket request = connection.PendingRequestTable[0] as SmbPacket;
                this.UpdateResponseRoleContext(connection, request, packet);
                connection.RemovePendingRequest(request.SmbHeader.Mid);
                connection.RemoveSequenceNumber(packet);
                return;
            }
            else
            {
                switch(packet.PacketType)
                {
                    case SmbPacketType.BatchedRequest:
                    case SmbPacketType.SingleRequest:
                        if (connection.IsSigningActive)
                        {
                            packet.IsSignatureCorrect = CifsMessageUtils.VerifySignature(packet,
                                connection.SigningSessionKey, connection.ServerNextReceiveSequenceNumber,
                                connection.SigningChallengeResponse);
                        }
                        this.UpdateRequestRoleConext(connection, packet);
                        break;
                    case SmbPacketType.BatchedResponse:
                    case SmbPacketType.SingleResponse:
                        SmbPacket request = connection.GetPendingRequest(packet.SmbHeader.Mid);
                        this.UpdateResponseRoleContext(connection, request, packet);
                        this.RemoveRequestAndSequence(connection, packet);
                        break;
                    default:
                        break;
                }
            }
        }