public static void RequestLease(ModelLeaseStateType leaseType)
        {
            // Lease_None is only initial state, it's meaningless when requesting a Lease
            Condition.IsFalse(leaseType == ModelLeaseStateType.Lease_None);

            if (OplockState == OplockLevel_Values.OPLOCK_LEVEL_NONE && LeaseState == ModelLeaseStateType.Lease_None)
            {
                LeaseState = leaseType;
            }
        }
        public static void RequestLease(ModelLeaseStateType leaseType)
        {
            // Lease_None is only initial state, it's meaningless when requesting a Lease
            Condition.IsFalse(leaseType == ModelLeaseStateType.Lease_None);

            if (OplockState == OplockLevel_Values.OPLOCK_LEVEL_NONE && LeaseState == ModelLeaseStateType.Lease_None)
            {
                LeaseState = leaseType;
            }
        }
        /// <summary>
        /// One client requests a lease
        /// </summary>
        /// <param name="leaseStateType">Type of the LeaseState in the requested lease context</param>
        public void RequestLease(ModelLeaseStateType leaseStateType)
        {
            Smb2CreateContextResponse[] responses;
            FILEID           fileId;
            LeaseStateValues leaseState = LeaseStateValues.SMB2_LEASE_NONE;

            switch (leaseStateType)
            {
            case ModelLeaseStateType.Lease_None:
                leaseState = LeaseStateValues.SMB2_LEASE_NONE;
                break;

            case ModelLeaseStateType.Lease_R:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING;
                break;

            case ModelLeaseStateType.Lease_RH:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING;
                break;

            case ModelLeaseStateType.Lease_RW:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING;
                break;

            case ModelLeaseStateType.Lease_RWH:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING;
                break;

            default:
                break;
            }

            leaseClient.Create(
                treeIdLease,
                fileName,
                CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                out fileId,
                out responses,
                RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                new Smb2CreateContextRequest[]
            {
                new Smb2CreateRequestLease()
                {
                    LeaseKey   = Guid.NewGuid(),
                    LeaseState = leaseState
                }
            });
            grantedLeaseState = ((Smb2CreateResponseLease)responses[0]).LeaseState;
            HandleResult();
        }
        /// <summary>
        /// One client requests a lease
        /// </summary>
        /// <param name="leaseStateType">Type of the LeaseState in the requested lease context</param>
        public void RequestLease(ModelLeaseStateType leaseStateType)
        {
            Smb2CreateContextResponse[] responses;
            FILEID fileId;
            LeaseStateValues leaseState = LeaseStateValues.SMB2_LEASE_NONE;
            switch (leaseStateType)
            {
                case ModelLeaseStateType.Lease_None:
                    leaseState = LeaseStateValues.SMB2_LEASE_NONE;
                    break;
                case ModelLeaseStateType.Lease_R:
                    leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING;
                    break;
                case ModelLeaseStateType.Lease_RH:
                    leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING;
                    break;
                case ModelLeaseStateType.Lease_RW:
                    leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING;
                    break;
                case ModelLeaseStateType.Lease_RWH:
                    leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING;
                    break;
                default:
                    break;
            }

            leaseClient.Create(
                treeIdLease,
                fileName,
                CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                out fileId,
                out responses,
                RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                new Smb2CreateContextRequest[]
                {
                    new Smb2CreateRequestLease()
                    {
                        LeaseKey = Guid.NewGuid(),
                        LeaseState = leaseState
                    }
                });
            grantedLeaseState = ((Smb2CreateResponseLease)responses[0]).LeaseState;
            HandleResult();
        }
        private void HandleResult()
        {
            if (!alreadyRequested)
            {
                alreadyRequested = true;
                return;
            }

            // Wait 0.5 sec for lease break notification.
            Thread.Sleep(500);
            ModelLeaseStateType grantedLease = ModelLeaseStateType.Lease_None;

            switch (grantedLeaseState)
            {
            case LeaseStateValues.SMB2_LEASE_NONE:
                grantedLease = ModelLeaseStateType.Lease_None;
                break;

            case LeaseStateValues.SMB2_LEASE_READ_CACHING:
                grantedLease = ModelLeaseStateType.Lease_R;
                break;

            case LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING:
                grantedLease = ModelLeaseStateType.Lease_RW;
                break;

            case LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING:
                grantedLease = ModelLeaseStateType.Lease_RH;
                break;

            case LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING:
                grantedLease = ModelLeaseStateType.Lease_RWH;
                break;

            default:
                break;
            }

            // Verify if there's lease/oplock break and if the granted lease/oplock is correct for the second request.
            Verification(breakType, grantedOplockLevel, grantedLease);
        }
Пример #6
0
        /// <summary>
        /// One client requests a lease
        /// </summary>
        /// <param name="leaseStateType">Type of the LeaseState in the requested lease context</param>
        public void RequestLease(ModelLeaseStateType leaseStateType)
        {
            Smb2CreateContextResponse[] responses;
            FILEID           fileId;
            LeaseStateValues leaseState = LeaseStateValues.SMB2_LEASE_NONE;

            switch (leaseStateType)
            {
            case ModelLeaseStateType.Lease_None:
                leaseState = LeaseStateValues.SMB2_LEASE_NONE;
                break;

            case ModelLeaseStateType.Lease_R:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING;
                break;

            case ModelLeaseStateType.Lease_RH:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING;
                break;

            case ModelLeaseStateType.Lease_RW:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING;
                break;

            case ModelLeaseStateType.Lease_RWH:
                leaseState = LeaseStateValues.SMB2_LEASE_READ_CACHING | LeaseStateValues.SMB2_LEASE_WRITE_CACHING | LeaseStateValues.SMB2_LEASE_HANDLE_CACHING;
                break;

            default:
                break;
            }

            leaseClient.Create(
                treeIdLease,
                fileName,
                CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                out fileId,
                out responses,
                RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                new Smb2CreateContextRequest[]
            {
                new Smb2CreateRequestLease()
                {
                    LeaseKey   = Guid.NewGuid(),
                    LeaseState = leaseState
                }
            });

            if (responses == null)
            {
                throw new Exception("There is no Smb2CreateContextResponse in response data!");
            }

            if (responses.Length == 0 || responses[0] is not Smb2CreateResponseLease)
            {
                throw new Exception("There is no SMB2_CREATE_RESPONSE_LEASE create context in response data!");
            }

            grantedLeaseState = ((Smb2CreateResponseLease)responses[0]).LeaseState;
            HandleResult();
        }
        public static void Verification(ModelBreakType breakType, OplockLevel_Values grantedOplockType, ModelLeaseStateType grantedLeaseType)
        {
            PrintMatrixAndState();
            // 1st Client(Oplock)      2nd Client(Lease)   OplockBreakExist   GrantedLeaseState
            // ================================================================================
            // OPLOCK_LEVEL_II         Any Lease           No                 Lease_R
            // OPLOCK_LEVEL_EXCLUSIVE  Any Lease           Yes                Lease_R
            // OPLOCK_LEVEL_BATCH      Any Lease           Yes                Lease_R
            switch (OplockState)
            {
                // The first request is not for Oplock
                case OplockLevel_Values.OPLOCK_LEVEL_NONE:
                    break;
                case OplockLevel_Values.OPLOCK_LEVEL_II:
                    Condition.IsTrue(breakType == ModelBreakType.NoBreak);
                    Condition.IsTrue(grantedLeaseType == ModelLeaseStateType.Lease_R);
                    break;
                case OplockLevel_Values.OPLOCK_LEVEL_EXCLUSIVE:
                case OplockLevel_Values.OPLOCK_LEVEL_BATCH:
                    Condition.IsTrue(breakType == ModelBreakType.OplockBreak);
                    Condition.IsTrue(grantedLeaseType == ModelLeaseStateType.Lease_R);
                    break;
                default:
                    break;
            }

            // 1st Client(Lease)      2nd Client(Oplock)   LeaseBreakExist   GrantedOplockLevel
            // ================================================================================
            // Lease_R                Any Oplock           No                OPLOCK_LEVEL_II
            // Lease_RH               Any Oplock           No                OPLOCK_LEVEL_NONE
            // Lease_RW               Any Oplock           Yes               OPLOCK_LEVEL_II
            // Lease_RWH              Any Oplock           Yes               OPLOCK_LEVEL_NONE
            switch (LeaseState)
            {
                // The first request is not for Lease
                case ModelLeaseStateType.Lease_None:
                    break;
                case ModelLeaseStateType.Lease_R:
                    Condition.IsTrue(breakType == ModelBreakType.NoBreak);
                    Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_II);
                    break;
                case ModelLeaseStateType.Lease_RH:
                    Condition.IsTrue(breakType == ModelBreakType.NoBreak);
                    Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_NONE);
                    break;
                case ModelLeaseStateType.Lease_RW:
                    Condition.IsTrue(breakType == ModelBreakType.LeaseBreak);
                    Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_II);
                    break;
                case ModelLeaseStateType.Lease_RWH:
                    Condition.IsTrue(breakType == ModelBreakType.LeaseBreak);
                    Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_NONE);
                    break;
                default:
                    break;
            }
        }
        public static void Verification(ModelBreakType breakType, OplockLevel_Values grantedOplockType, ModelLeaseStateType grantedLeaseType)
        {
            PrintMatrixAndState();
            // 1st Client(Oplock)      2nd Client(Lease)   OplockBreakExist   GrantedLeaseState
            // ================================================================================
            // OPLOCK_LEVEL_II         Any Lease           No                 Lease_R
            // OPLOCK_LEVEL_EXCLUSIVE  Any Lease           Yes                Lease_R
            // OPLOCK_LEVEL_BATCH      Any Lease           Yes                Lease_R
            switch (OplockState)
            {
            // The first request is not for Oplock
            case OplockLevel_Values.OPLOCK_LEVEL_NONE:
                break;

            case OplockLevel_Values.OPLOCK_LEVEL_II:
                Condition.IsTrue(breakType == ModelBreakType.NoBreak);
                Condition.IsTrue(grantedLeaseType == ModelLeaseStateType.Lease_R);
                break;

            case OplockLevel_Values.OPLOCK_LEVEL_EXCLUSIVE:
            case OplockLevel_Values.OPLOCK_LEVEL_BATCH:
                Condition.IsTrue(breakType == ModelBreakType.OplockBreak);
                Condition.IsTrue(grantedLeaseType == ModelLeaseStateType.Lease_R);
                break;

            default:
                break;
            }

            // 1st Client(Lease)      2nd Client(Oplock)   LeaseBreakExist   GrantedOplockLevel
            // ================================================================================
            // Lease_R                Any Oplock           No                OPLOCK_LEVEL_II
            // Lease_RH               Any Oplock           No                OPLOCK_LEVEL_NONE
            // Lease_RW               Any Oplock           Yes               OPLOCK_LEVEL_II
            // Lease_RWH              Any Oplock           Yes               OPLOCK_LEVEL_NONE
            switch (LeaseState)
            {
            // The first request is not for Lease
            case ModelLeaseStateType.Lease_None:
                break;

            case ModelLeaseStateType.Lease_R:
                Condition.IsTrue(breakType == ModelBreakType.NoBreak);
                Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_II);
                break;

            case ModelLeaseStateType.Lease_RH:
                Condition.IsTrue(breakType == ModelBreakType.NoBreak);
                Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_NONE);
                break;

            case ModelLeaseStateType.Lease_RW:
                Condition.IsTrue(breakType == ModelBreakType.LeaseBreak);
                Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_II);
                break;

            case ModelLeaseStateType.Lease_RWH:
                Condition.IsTrue(breakType == ModelBreakType.LeaseBreak);
                Condition.IsTrue(grantedOplockType == OplockLevel_Values.OPLOCK_LEVEL_NONE);
                break;

            default:
                break;
            }
        }