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(); }
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); }
/// <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; } }