public static void ReadConfigReturn(ResilientHandleServerConfig c) { Condition.IsTrue(State == ModelState.Uninitialized); Condition.IsTrue(c.MaxSmbVersionSupported == ModelDialectRevision.Smb2002 || c.MaxSmbVersionSupported == ModelDialectRevision.Smb21 || c.MaxSmbVersionSupported == ModelDialectRevision.Smb30 || c.MaxSmbVersionSupported == ModelDialectRevision.Smb302); Config = c; State = ModelState.Initialized; }
public static void IoCtlResiliencyResponse(ModelSmb2Status status, ResilientHandleServerConfig c) { Condition.IsTrue(State == ModelState.Connected); Condition.IsNotNull(Open); Condition.IsTrue(Config.Platform == c.Platform); Condition.IsTrue(Config.MaxSmbVersionSupported == c.MaxSmbVersionSupported); Condition.IsTrue(Config.IsIoCtlCodeResiliencySupported == c.IsIoCtlCodeResiliencySupported); ModelResiliencyRequest resiliencyRequest = ModelHelper.RetrieveOutstandingRequest <ModelResiliencyRequest>(ref Request); ModelHelper.Log(LogType.Requirement, "3.3.5.15.9 Handling a Resiliency Request"); ModelHelper.Log(LogType.Requirement, "This section applies only to servers that implement the SMB 2.1 or the SMB 3.x dialect family."); if (c.MaxSmbVersionSupported == ModelDialectRevision.Smb2002) { ModelHelper.Log(LogType.TestInfo, "The server only supports SMB 2.002."); ModelHelper.Log(LogType.TestTag, TestTag.Compatibility); return; } if (Connection_Dialect == DialectRevision.Smb2002) { ModelHelper.Log(LogType.Requirement, "If Open.Connection.Dialect is \"2.002\", the server MAY<320> fail the request with STATUS_INVALID_DEVICE_REQUEST."); ModelHelper.Log(LogType.TestInfo, "Open.Connection.Dialect is \"2.002\"."); ModelHelper.Log(LogType.TestTag, TestTag.Compatibility); if (c.Platform == Platform.NonWindows) { ModelHelper.Log(LogType.TestInfo, "The SUT platform is NonWindows."); if (status == ModelSmb2Status.STATUS_INVALID_DEVICE_REQUEST) { return; } } else { ModelHelper.Log(LogType.TestInfo, "The SUT platform is Windows."); Condition.IsFalse(status == ModelSmb2Status.STATUS_INVALID_DEVICE_REQUEST); } } if (!c.IsIoCtlCodeResiliencySupported) { ModelHelper.Log(LogType.Requirement, "Otherwise, if the server does not support FSCTL_LMR_REQUEST_RESILIENCY requests, the server SHOULD fail the request with STATUS_NOT_SUPPORTED."); ModelHelper.Log(LogType.TestInfo, "The server does not support FSCTL_LMR_REQUEST_RESILIENCY requests."); ModelHelper.Log(LogType.TestTag, TestTag.Compatibility); if (c.Platform == Platform.NonWindows) {// Non Windows ModelHelper.Log(LogType.TestInfo, "The SUT platform is NonWindows."); Condition.IsFalse(status == ModelSmb2Status.STATUS_SUCCESS); } else {// Windows ModelHelper.Log(LogType.TestInfo, "The SUT platform is Windows."); Condition.IsTrue(status == ModelSmb2Status.STATUS_NOT_SUPPORTED); return; } } if (resiliencyRequest.InputCount == IoCtlInputCount.InputCountSmallerThanRequestSize || resiliencyRequest.Timeout == ResilientTimeout.InvalidTimeout) { ModelHelper.Log(LogType.Requirement, "If InputCount is smaller than the size of the NETWORK_RESILIENCY_REQUEST request as specified in section 2.2.31.3, " + "or if the requested Timeout in seconds is greater than MaxResiliencyTimeout in seconds, the request MUST be failed with STATUS_INVALID_PARAMETER."); ModelHelper.Log(LogType.TestInfo, "InputCount is {0}smaller than the size of the NETWORK_RESILIENCY_REQUEST request.", resiliencyRequest.InputCount == IoCtlInputCount.InputCountSmallerThanRequestSize ? "" : "not "); ModelHelper.Log(LogType.TestInfo, "The requested Timeout is {0} greater than MaxResiliencyTimeout.", resiliencyRequest.Timeout == ResilientTimeout.InvalidTimeout ? "" : "not "); ModelHelper.Log(LogType.TestTag, TestTag.OutOfBoundary); Condition.IsTrue(status == ModelSmb2Status.STATUS_INVALID_PARAMETER); return; } ModelHelper.Log(LogType.Requirement, "Open.IsDurable MUST be set to FALSE. Open.IsResilient MUST be set to TRUE. "); ModelHelper.Log(LogType.TestInfo, "Open.IsDurable is set to FALSE. Open.IsResilient is set to TRUE."); Open.IsDurable = false; Open.IsResilient = true; ModelHelper.Log(LogType.Requirement, "Open.DurableOwner MUST be set to a security descriptor accessible only by the user represented by Open.Session.SecurityContext."); ModelHelper.Log(LogType.TestInfo, "Open.DurableOwner is set to default user."); Open.DurableOwner = ModelUser.DefaultUser; // In Resilient Handle Mode, Resilient always be requested as default user Condition.IsTrue(status == ModelSmb2Status.STATUS_SUCCESS); }