MB Operational Semantics Study+more

Asynchronous Transactions
The MB driver model assumes non-blocking operational semantics between the MB Service and miniport drivers by using the asynchronous notification mechanism provided in NDIS 6.x. This mechanism allows the MB Service to continue to send OID requests to the miniport driver for processing without waiting for the current operation to complete.
MB 드라이버 모델은 NDIS 6.x 에서 제공하는 비동기 notification 메커니즘을 이용하여 MB 서비스와 미니포트 드라이버간에 넌 블럭킹으로 동작한다. 이 메커니즘은 MB 서비스가 요청한 동작이 완료되기를 기다리지 않고 미니포트 드라이버에 다른 요청을 보낼수 있도록 해 준다.

An asynchronous transaction is a three-way handshake that starts with the initial request, followed by a request status response, and then completed by a final transactional indication. The request status response is provisional in that it only acknowledges that the miniport driver has received the request. The follow-up asynchronous indication is transactional in that it signals the completion of the transaction. The miniport driver returns the status code as well as the resulting data in the transactional indication.
비동기 트랜잭션은 세번의(3-Way) 핸드쉐이크가 필요하다. 처음에는 요청을 하고, 그에 대한 request status 요청이 올라오고, 마지막으로 트랜잭션 indication을 통해 마무리 된다. request status 응답은 미니포트 드라이버가 요청을 받으면 그에 대한 임시적인 응답으로 보내는것이다. (요청을 받았다는 ack 의 의미임.) 뒤에 따라오는 비동기 indication 이 트랜잭션이 완료되었음을 의미하는 신호 역할을 하는 트랜잭션이다. 미니포트 드라이버는 트랜잭션 indication에 상태 코드및 결과 데이터를 포함하여 (MB 서비스에) 전달한다.

Asynchronous Set and Query Requests
Many of the set and query OID requests that are used by the MB Service are processed asynchronously. For more information about set and query OID requests, see NDIS_OID_REQUEST. The WWAN-specific OIDs table in the MB Data Model topic identifies which OIDs are processed asynchronously.
MB 서비스에 의해 사용되는 수많은 Set과 Query OID 요청은 비동기적으로 처리된다. Set과 Query OID 요청에 관해서는 NDIS_OID_REQUEST 구조체를 참고한다. MB Data Model 에 나와 있는 WWAN-specific OID 표를 보면 비동기적으로 처리 가능한 OID를 확인할 수 있다.

The following diagram represents the interaction sequence for an asynchronous query transaction between the MB Service and the miniport driver. The labels in bold represent OID identifiers, or transactional flow control, and the labels in regular text represent the important flags within the OID structure.
다음의 그림은 MB 서비스와 미니포트 드라이버간에 비동기 query 트랜잭선의 상호작용을 보여준다. OID identifier 이나 플로우를 표현한 선은 볼드체로 표기되었으며 plain 텍스트로 표기된 라벨은 OID 구조체의 중요한 플래그를 보여준다.

Asynchronous query transactions

The three-way handshake is the same for both query and set requests.
이 3-way 핸드쉐이크는 Set과 Query에 모두 동일하게 적용된다.

Except for OID_WWAN_DRIVER_CAPS, all other MB-specific OID requests follow the asynchronous transaction mechanism for information exchange between miniport drivers and the MB Service, with the following additional notes:
OID_WWAN_DRIVER_CAPS는 예외이다. 이 외 모든 MB 스펙의 OID 요청은 MB 서비스와 미니포트 드라이버간에 데이터 교환을 위해 비동기 트랜잭션 메커니즘을 사용한다. 다음의 사항을 참고하라.

  • Miniport drivers should immediately fail an OID request on any error condition, such as an invalid OID request. 
    미니포트 드라이버는 잘못된 OID 요청과 같이 에러가 발생한 경우에는 즉시 OID를 fail 해야 한다.
  • Miniport drivers must return any WWAN-specific error conditions with the correct error code (for example, WWAN_STATUS_XXX) specified in the uStatus member of the event notification structure. Miniport drivers should also appropriately fill in the members that follow the uStatus member, as needed. For example, miniport drivers should fill in the ContextState.uNwError member of the NDIS_WWAN_CONTEXT_STATE structure, if available. However, in the case of a failure when processing OIDs related to PINs, miniport drivers may not necessarily have the current PIN state information to specify in the PinInfo.PinState member of NDIS_WWAN_PIN_INFO. 
    미니포트 드라이버는 WWAN-spec 에 정의된 에러 상황이 발생시, 이벤트 notification 구조체의 uStatus 멤버 변수에 정확한 에러코드(WWAN_STATUS_XXX 형식) 을 넣어서 반환해야 한다. 미니포트 드라이버는 uStatus 멤버 뿐이 아니라 필요시 다른 멤버 변수에도 적절한 값을 넣어서 반환해야 한다. 예를들어, 미니포트 드라이버는, 가능하다면 NDIS_WWAN_CONTEXT_STATE 구조체의 ContextStatus.uNwError 멤버에 값을 채워서 반환해야 한다. 하지만, PIN 관련된 OID를 처리중 에러가 발생헀다면, 미니포트 드라이버는 현재 PIN 상태 정보를 NDIS_WWAN_PIN_INFO 구조체의 PinInfo.PinState 멤버 변수에 채워 넣을 필요는 없다.
  • Miniport drivers should return NDIS_STATUS_INDICATION_REQUIRED as a provisional response for all asynchronous OID requests. 
    미니포트 드라이버는 모든 비 동기 OID 요청에 대해 즉각 임시적인 응답인, NDIS_STATUS_INDICATION_REQUIRED 로 답 해야한다.
  • Miniport drivers should be able to distinguish device state changes caused by an OID request from other causes. Miniport drivers should send transactional notifications for state changes resulting from OID requests, and they should send unsolicited event notifications for state changes from other causes. 
    미니포트 드라이버는 모종의 원인으로 인해 OID 요청으로 장치의 상태가 변경되었다면, 그것을 구별할 수(알고 있어야) 있어야 한다. 미니포트 드라이버는 OID 요청에 대한 결과로서 상태가 변경되었다면, 그에 대한 트랜잭션 notification을 보내야 하며, 이외의 원인으로 인해 상태가 변경되었다면 자발적인(unsolicated) 이벤트 notification을 보내댜 한다.
  • Miniport drivers are responsible for managing kernel mode memory although the MB Service initially allocates the memory for requests. After the MB Service receives a response from a miniport driver, the service may release the user mode memory it allocated for the OID request. 
    미니포트 드라이버는 (요청을 위해 MB 서비스가  할당한 메모리라도) 커널모드에서 메모리를 관리할 책임이 있다. MB 서비스가 미니포트 드라이버에서 응답을 받았다면, MB 서비스는 OID 요청을 위해 유저모드에서 할당했던 메모리를 해제 할 것이다.
The following diagram represents the interaction sequence for an asynchronous set transaction between the MB Service and the miniport driver. The labels in bold represent OID identifiers, or transactional flow control, and the labels in regular text represent the important flags within the OID structure.
다음 그림은, MB 서비스와 미니포트 드라이버간에 비동기 Set 트랜잭션을 위한 상호작용 시퀀스를 보여준다. OID identifier 이나 플로우를 표현한 선은 볼드체로 표기되었으며 plain 텍스트로 표기된 라벨은 OID 구조체의 중요한 플래그를 보여준다.

Asynchronous set transactions

Asynchronous Response
The NDIS 6.0 Specification (released with Windows Vista) introduced a new status code, NDIS_STATUS_INDICATION_REQUIRED, for miniport drivers to convey the asynchronous nature of a transaction to the MB Service in a miniport driver's provisional response to an OID request.
NDIS 6.0 스펙(비스타 버전에서 릴리즈됨) 에서 새로운 상태 코드가 추가되었다.
NDIS_STATUS_INDICATION_REQUIRED 라는 상태코드는 요청된 OID 에 대해, 미니포트 드라이버에서 MB 서비스로 비 동기적인 트랜잭션을 할것임을 알리기 위해 임시로 응답하는 것이다.

As mentioned in MB Interface Overview, the MB Service does not have direct access to kernel mode memory that is allocated by a MB miniport driver. The execution result stored in the kernel mode memory is assumed to be copied and made available to the MB Service by some intermediary, such as WMI or a lightweight filter (LWF) driver. Hence, miniport drivers can release the allocated kernel mode memory after the NdisMIndicateStatusEx function call returns in the transactional indication.
MB Interface Overview 에서 언급한대로 MB 서비스는 MB 미니포트 드라이버에서 할당한 메모리를 직접 엑세스 하지 못한다. 드라이버에서 어떤 실행의 결과는 커널모드 메모리에 저장이 되게되고, 이를 MB 서비스에 전달하기 위해서는 WMI나 LWF 드라이버와 같은, 중간 계층을 통해서 전달이 된다. 그런 이유로, 미니포트 드라이버는 트랜잭션 indication 과정중, NdisMIndicateStatusEx 함수를 호출이 끝난 후에 할당된 커널모드 메모리를 해제할 수 있다.

The handshake procedures that miniport drivers and the MB Service must follow are described in the following procedure.
미니포트 드라이버와 MB 서비스간에 핸드쉐이킹 프로세스는 다음에 설명한 순서를 따라야 한다.

MB miniport driver procedure
Upon receiving an OID request, miniport drivers should perform the following steps:
OID 요청을 받으면, 미니포트 드라이버는 다음의 순서를 따라야 한다.
  1. Allocate memory in kernel mode to copy the contents of the NDIS_OID_REQUEST data structure associated with the OID request. 
    커널 모드 메모리를 할당후, OID 요청에 관련된 NDIS_OID_REQUEST 구조체의 내용을 커널모드 메모리로 복사해야 한다.
  2. Among the request's parameters, ensure that the RequestId and RequestHandle members of the OID request structure are also copied. These members will be used later in the transactional indication. 
    요청의 멤버 변수중에서 RequestId와 RequestHandle 멤머 또한 복사해 두어야 한다. 이 멤버들은 나중에 트랜잭션 indication에서 재사용 된다.
  3. Return a provisional NDIS_STATUS_INDICATION_REQUIRED status response to inform the MB Service that the miniport driver will complete the request asynchronously. 
    요청이 비 동기적으로 처리될것임을 알리기 위해 먼저, MB 서비스에게 NDIS_STATUS_INDICATION_REQUIRED 상태 값으로 응답한다. 
  4. Upon completion of the operation, store the result in local or driver-allocated memory, as appropriate. 
    동작이 완료되면, 결과를 할당해 놓은 메모리에 저장한다.
  5. Call the NdisMIndicateStatusEx function to notify the MB Service that the outstanding operation has been completed. Miniport drivers should fill in the members of the NDIS_STATUS_INDICATION structure as follows:
    NdisMIndicateStatusEx 함수를 호출하여 MB 서비스에 요청한 동작이 완료되었음을 알려준다. 미니포트 드라이버는 NDIS_STATUS_INDICATION 구조체 멤버 변수들을 다음과 같이 채워 넣어야 한다.:
    1. Set the StatusCode member to the type of status notification. For example, NDIS_STATUS_WWAN_XXX. 
      StatusCode 멤버 변수는 status notification 의 타입을 의미힌다. NDIS_STATUS_WWAN_XXX 형식으로 채워 넣는다.
    2. Set the DestinationHandle member to the RequestHandle member that was received in the NDIS_OID_REQUEST data structure when the miniport driver received the corresponding OID request.
      DestinationHandle 멤버를 요청받은 OID인 NDIS_OID_REQUEST data 구조체의 RequestHandle 값으로 채워 넣는다. 
    3. Set the RequestId member to match the RequestId member of the NDIS_OID_REQUEST status structure when the miniport driver received the corresponding OID request.
      RequestID 멤버를 요청받은 OID인 NDIS_OID_REQUEST status 구조체의 RequestId 값으로 채워 넣는다.
    4. Set the StatusBuffer and StatusBufferSize members to point to the miniport driver‑allocated memory and the size of the memory buffer, respectively. This memory buffer contains the result of the completed operation.
      StatusBuffer 와 StatusBufferSize 멤버는 미니포트 드라이버에서 할당한 메모리 버퍼와 그 크기로 설정한다. 이 메모리 버퍼에는 당연히 요청에 대한 결과값이 저장되어 있어야 한다.
    5. If the operation completes successfully, set the uStatus member to WWAN_STATUS_SUCCESS. Otherwise, set the uStatus member to the appropriate WWAN_STATUS_XXX value to indicate the type of failure.
      만약 요청에 대한 결과가 성공적이었다면, uStatus 멤버를 WWAN_STATUS_SUCCESS 를 설정하고, 그렇지 않다면 uStatus 를 WWAN_STATUS_XXX 형식으로 알맞은 에러값으로 채워 넣는다.
  6. When the function call returns, the miniport driver should release the memory it allocated for the OID request.
    함수 호출이 끝나면, 미니포트 드라이버는 OID 요청으로 인해 할당했던 메모리를 해제해야 한다.
MB Service procedure
The MB Service processes asynchronous transactions by using the following procedure:
MB 서비스의 비동기적인 트랜잭션은 다음의 순서를 따라야 한다.
  1. Allocate buffer memory for the request based on the OID data structure. Fill in the data structure members with appropriate values. 
    OID 요청을 위해 메모리 할당. 멤버는 잘 채워 넣는다.
  2. Call the NdisOidRequest function with the InformationBuffer member pointing to the OID data structure for the OID request and wait for the miniport driver to respond. 
    NdisOidRequest 함수를 호출. 미니포트 드라이버의 응답 대기.
  3. Upon receipt of an NDIS_STATUS_INDICATION_REQUIRED provisional response from the miniport driver, the MB Service saves the RequestId, releases the allocated memory, and marks the transaction as open. At this point, the MB Service is free to process subsequent OID requests and notifications. 
    NDIS_STATUS_INDICATION_REQUIRED 를 받음. 이후, 다른 OID 요청해되 됨.
  4. Upon receipt of a notification with NDIS_STATUS_WWAN_XXX as the StatusCode value, check whether the RequestId matches that of any transaction marked as open. If there is a match, the service closes the transaction. If no match is found, treat the notification as an unsolicited event notification. 
    NDIS_STATUS_WWAN_XXX 받으면 RequestId 값 확인할것. 내가 보낸거랑 틀리면, 자발적인 이벤트 알림으로 해석. 내가 보낸거랑 맞다면 트랜잭션 완료 처리.
  5. Process the data returned in the StatusBuffer member and make state changes to the MB Service as appropriate. 
    드라이버엣 받은 StatusBuffer 값을 가지고 적당히 처리.
Indications
There are two types of WWAN-specific indications that miniport drivers can generate:
드라이버가 생성 가능한 두가지 타입의 (WWAN 스펙에 맞는) indication이 있음.
  • Event notifications that result from an object state change in the MB device. 
    MB 장치의 상태 변화로 인해 발생(보내야 하는) Event Notification.
  • Transactional notifications that signal the completion of an asynchronous operation. 
    비동기 요청 처리를 완료 했음을 알려주기 위한 Transactional Notification.
In both cases, miniport drivers should call the NdisMIndicateStatusEx function.
위 두가지 경우 모두, 미니포트 드라이버는 NdisMIndicateStatusEx 함수를 호출해야 함.

Event Notification
Event notification is unsolicited in the sense that the miniport driver proactively sends the indication to the MB Service as a state change event. The state change is caused by an action from some entity other than the MB Service. The MB Service assumes miniport drivers are able to detect the cause of the change.
이벤트 notification은 상태 변경으로 인해 자발적으로 MB 서비스에 알려주는 이벤트 이다. 이 상태 변환느 MB 서비스가 아닌 다른 요인에 의해 변경된 것이다. MB 서비스는 미니포트 드라이버가 변경의 원인을 알 것이라고 간주한다.

For any WWAN-specific event notification, miniport drivers must set the RequestId member of the NDIS_STATUS_INDICATION structure to zero. The StatusCode member specifies which object in the MB device has changed and can be set to any of the following values by the miniport driver:
WWAN 의 스펙에 명시된 이벤트 Notification인 경우, 미니포트 드라이버는 NDIS_STATUS_INDICATION 구조체의 RequestId 멤버를 0으로 설정해야 한다. StatusCode 멤버는 MB 장치의 변경 사항값을 적는것이고, 다음에 나와있는 값들중 하나를 사용할 수 있다.

NDIS_STATUS_WWAN_DEVICE_CAPS
NDIS_STATUS_WWAN_READY_INFO
NDIS_STATUS_WWAN_RADIO_STATE
NDIS_STATUS_WWAN_PIN_INFO
NDIS_STATUS_WWAN_PIN_LIST
NDIS_STATUS_WWAN_HOME_PROVIDER
NDIS_STATUS_WWAN_PREFERRED_PROVIDERS
NDIS_STATUS_WWAN_VISIBLE_PROVIDERS
NDIS_STATUS_WWAN_REGISTER_STATE
NDIS_STATUS_WWAN_PACKET_SERVICE
NDIS_STATUS_WWAN_SIGNAL_STATE
NDIS_STATUS_WWAN_CONTEXT_STATE
NDIS_STATUS_WWAN_PROVISIONED_CONTEXTS
NDIS_STATUS_WWAN_SERVICE_ACTIVATION
NDIS_STATUS_WWAN_SMS_CONFIGURATION
NDIS_STATUS_WWAN_SMS_RECEIVE
NDIS_STATUS_WWAN_SMS_SEND
NDIS_STATUS_WWAN_SMS_DELETE
NDIS_STATUS_WWAN_SMS_STATUS
NDIS_STATUS_WWAN_VENDOR_SPECIFIC

The MB Service may also process other event notifications from NDIS. These non-MB event notifications are not necessarily subject to the requirement that their RequestId values be set to 0.
MB 서비스는 NDIS 에서 발생하는 다른 이벤트 notification 도 받을것이다. 이런 MB 이벤트가 아닌 notification은 RequestId 값을 0으로 설정할 필요는 없다.

Transactional Notifications
Miniport drivers use transactional notifications to inform the MB Service that an asynchronous transaction has completed, and the MB Service uses transactional notifications to close open transactions and to update its state machine.
미니포트 드라이버는 (MB 서비스에 비동기 트랜잭션이 완료되었음을 알려주기 위해) 트랜잭션 notification 을 사용하며, MB 서비스는 트랜잭션 notification을 받으면 열려있는 트랜잭션을 닫고, 상태 머신을 업데이트 한다.

The MB Service expects transactional notifications so that it can close open transactions. It is the final exchange of the three-way handshake between the MB Service and the miniport driver in an asynchronous transaction. The value of RequestId member of the NDIS_STATUS_INDICATION in any transactional notification must be nonzero, which is copied from the corresponding request in the same transaction.
MB 서비스는 트랜잭션 notification을 받으면 열려있는 트랜잭션을 닫도록 되어 있다. 이것은 MB 서비스와 미니포트 드라이버간에 발생하는 비동기 트랜잭션인 3-Way 핸드세이킹의 마지막 교환 (순서)이다.  NDIS_STATUS_INDICATION 구조체의 RequestId 멤버는 트랜잭션 notification의 경우 절대로 0이 되면 안된다. 이 값(RequestId) 은 요청받은 트랜잭션에 있는 값과 동일한 값이어야 한다.

You must set the RequestId member of the NDIS_STATUS_INDICATION structure correctly for the asynchronous mechanism to function properly. The MB Service ensures that the RequestId value is unique and nonzero among all outstanding requests. Miniport drivers must return the same RequestId value in the corresponding indication in order for the MB Service to correlate the indication with an open transaction.
당신은 NDIS_STATUS_INDICATION 구조체의 RequestId 멤버 변수를 올바로 설정해야 하며, 이는 비동기 메커니즘이 올바로 동작하기 위해 반드시 필요한 부분이다. MB 서비스는 RequestId를 요청들 중에서 고유의 값으로 설정해야 하며 0으로 설정하면 안된다. 미니포트 드라이버는 반드시 RequestId 를 MB 서비스에서 요청한 값과 동일하게 맞춰야 한다.

Status Indication Structure
Both the asynchronous response for a given OID request and the unsolicited event notification structures share the following structure members that are pointed to by StatusBuffer member of the StatusIndication parameter to NdisMIndicateStatusEx:
OID 요청에 대한 응답이나, 자발적인 이벤트 notification모두 다음의 구조체를 사용하여 응답한다. NdisMIndicateStatusEx 함수의 매개변수인 StatusIndication 구조체에 포함된 StatusBuffer 포인터가 가리키는 구조제가 바로 아래에 나오는 구조체이다.
(시바, 댑따 어렵게 적어 놨는데, 어려운데 간단히 말하면 StatusIndication.StatusBuffer = PNDIS_WWAN_XXXX_변수 )

typedef struct _NDIS_WWAN_XXX {
NDIS_OBJECT_HEADER Header;
WWAN_STATUS uStatus;
ULONG uNwError;//Optional. Only used for network operations.
WWAN_XXX XxxStruct;
} NDIS_WWAN_XXX, *PNDIS_WWAN_XXX;

A value of zero in the RequestId member of the NDIS_STATUS_INDICATION structure means it is an unsolicited event notification and can occur any time.
NDIS_STATUS_INDICATION 구조체의 RequestId 값이 0이라면 이는 임의의 시간에 발생하는 자발적인 이벤트 noticiation 이라는 의미이다.

If the uStatus member in the returned indication of any set or query OID request does not equal WWAN_STATUS_SUCCESS the members of the associated NDIS_WWAN_XXX structure do not need to be valid.
만약 uStatus 멤버 값이 WWAN_STATUS_SUCCESS 가 아니라면 NDIS_WWAN_XXX 구조체에 있는 관련된 멤버 변수값은 확인도 안한다.

In the case of unsolicited event notifications based on network events, miniport drivers must fill in the uNwError member as appropriate, if applicable.
만약 자발적인 이벤트 notification이 네트웍 이벤트에 의해 발생하는것이라면, 미니포트 드라이버는 uNwError 값을 다음 표에 나와있는것을 참고하여 적절히 채워 넣어야 한다.

The following table shows registration, packet-attach, and packet-detach cause code failure values that are defined in the 3GPP TS 24.008 Specification for GSM-based networks:
다음 표는 GSM 기반의 네트웍에서 registration, packet-attach, packet-detach시 실패했을때 3GPP TS 24.008 스펙에 정의된 값을 보여준다.
3GPP 24.008 Cause codeInterpretation of cause code
2 - International Mobile Subscriber Identity (IMSI) unknown in HLREither the SIM or the device is not activated, or the subscription has expired, which caused a network deactivation.
4 - IMSI unknown in VLRRoaming feature is not subscribed to.
6 - Illegal MEMS blocked by network due to stolen report.
7 - GPRS services not allowedUser does not have a GPRS subscription. User has only a voice connection subscription.
8 - GPRS and non-GPRS services not allowedGPRS and non-GPRS services are not allowed.
11 - PLMN not allowedService is blocked by the network due to an expired subscription or another cause.
12 - Location area not allowedUser subscription does not allow access in the present location area.
13 - Roaming not allowed in this location areaThe subscription permits roaming, but roaming is not allowed in the present location area.
14 - GPRS services not allowed in this PLMNSelected network provider does not provide GPRS service to the MS.
15 - No suitable cells in location areaNo subscription for the service.
17 - Network failureRegistration failed.
22 - CongestionRegistration failed due to network congestion.

For example, if the network initiates a deactivate context event because roaming is not allowed in the location area, miniport drivers should set the uNwError member to 13 as per the 3GPP TS 24.008 Cause codes for GSM-based networks.
예를들어, 만약 로밍이 허용되지 않아서 deactivate context event가 발생했다면, 미니포트 드라이버는 uNwError 멤버 값을 13으로 설정해야 한다.

Similar logic should be applied to CDMA-based networks as well. However, there is no standard for CDMA-based network error codes. CDMA-based devices should use the network –specific or device-specific error codes.
 CDMA 기반의 네트웍도 비슷하다. 그러나 CDMA 기반의 네트웍 에러코드는 표준이 없다. CDMA 기반의 장치들은 네트웍 스펙이나 디바이스 스펙에 명시된 에러코드를 사용하면 된다.

In the case of a miniport driver's asynchronous response to OID requests, the RequestId member of the NDIS_STATUS_INDICATION structure is a non‑zero number that was passed to the miniport driver as part of a set or query request. The miniport driver must fill the uStatus member as appropriate. For example, WWAN_STATUS_SUCCESS, or any of the appropriate error values listed in the following section. In addition to this, the miniport driver must fill in the uNwError member where appropriate and available.
미니포트 드라이버에서 요청된 OID 에 대한 비동기 응답일 경우 NDIS_STATUS_INDICATION 구조체의 RequestId 값은 0이 되면 안된다. 미니포트 드라이버는 uStatus 멤버 변수 값을 적절하게 설정해야 한다. 예를덜어 WWAN_STATUS_SUCCESS 나 다음에 나오는 값중 하나로 채워야 한다. 추가로, 미니포트 드라이버는 uNwError 멤버를 가능하다면 올바로 설정해야 한다.

Event Notification Status
The following table lists the WWAN_STATUS codes that MB miniport drivers can specify in the uStatus member of the NDIS_WWAN_XXX event notification structures.
ValueMeaning
WWAN_STATUS_SUCCESSThe operation succeeded.
WWAN_STATUS_FAILUREThe operation failed (a generic failure).
WWAN_STATUS_BUSYThe operation failed because the device is busy.
WWAN_STATUS_SIM_NOT_INSERTEDThe operation failed because the SIM card was not inserted fully into the device.
WWAN_STATUS_BAD_SIMThe operation failed because the SIM card is bad and cannot be used any further.
WWAN_STATUS_PIN_REQUIREDThe operation failed because a PIN must be entered to proceed.
WWAN_STATUS_PIN_DISABLEDThe operation failed because the PIN is disabled.
WWAN_STATUS_NOT_REGISTEREDThe operation failed because the device is not registered with any network.
WWAN_STATUS_PROVIDERS_NOT_FOUNDThe operation failed because no network providers could be found.
WWAN_STATUS_NO_DEVICE_SUPPORTThe operation failed because the device does not support the operation.
WWAN_STATUS_PROVIDER_NOT_VISIBLEThe operation failed because the service provider is not currently visible.
WWAN_STATUS_DATA_CLASS_NOT_AVAILABLEThe operation failed because the requested data-class was not available.
WWAN_STATUS_PACKET_SVC_DETACHEDThe operation failed because packet service is detached.
WWAN_STATUS_MAX_ACTIVATED_CONTEXTSThe operation failed because the maximum number of activated contexts has been reached.
WWAN_STATUS_NOT_INITIALIZEDThe operation failed because the device is in the process of initializing. Retry the operation after the ready-state of the device changes to WwanReadyStateInitialized.
WWAN_STATUS_VOICE_CALL_IN_PROGRESSThe operation failed because a voice call is in progress.
WWAN_STATUS_CONTEXT_NOT_ACTIVATEDThe operation failed because the context is not activated.
WWAN_STATUS_SERVICE_NOT_ACTIVATEDThe operation failed because service is not activated.
WWAN_STATUS_INVALID_ACCESS_STRINGThe operation failed because the access string is invalid.
WWAN_STATUS_INVALID_USER_NAME_PWDThe operation failed because the user name and/or password supplied are invalid.
WWAN_STATUS_RADIO_POWER_OFFThe operation failed because the radio is currently powered off.
WWAN_STATUS_INVALID_PARAMETERSThe operation failed because of invalid parameters.
WWAN_STATUS_READ_FAILUREThe operation failed because of a read failure.
WWAN_STATUS_WRITE_FAILUREThe operation failed because of a write failure.

The following table shows SMS specific status values.
ValueMeaning
WWAN_STATUS_SMS_OPERATION_NOT_ALLOWEDThe SMS operation failed because the operation is not allowed.
WWAN_STATUS_SMS_MEMORY_FAILUREThe SMS operation failed because of a memory failure.
WWAN_STATUS_SMS_INVALID_MEMORY_INDEXThe SMS operation failed because of an invalid memory index--WwanSmsFlagIndex for OID_WWAN_SMS_READ.
WWAN_STATUS_SMS_UNKNOWN_SMSC_ADDRESSThe SMS operation failed because the service center number is either invalid or unknown.
WWAN_STATUS_SMS_NETWORK_TIMEOUTThe SMS operation failed because of a network timeout.
WWAN_STATUS_SMS_MEMORY_FULLThe SMS operation failed because the SMS message store is full.
WWAN_STATUS_SMS_UNKNOWN_ERRORThe SMS operation failed because of an unknown error (a generic error).
WWAN_STATUS_SMS_FILTER_NOT_SUPPORTEDThe SMS operation failed because the filter type requested is not supported.
WWAN_STATUS_SMS_MORE_DATAThis transaction is not yet complete. Some data has been returned and there is more data to be returned.
WWAN_STATUS_SMS_LANG_NOT_SUPPORTEDThe SMS operation failed because the SMS language is not supported. This applies to CDMA-based devices only.
WWAN_STATUS_SMS_ENCODING_NOT_SUPPORTEDThe SMS operation failed because the SMS encoding is not supported. This applies to CDMA-based devices only.
WWAN_STATUS_SMS_FORMAT_NOT_SUPPORTEDThe SMS operation failed because the SMS format is not supported.

Note These WWAN-specific status codes are used only for asynchronous transactions in the uStatus member of the NDIS_WWAN_XXX structures.
노트. 이 WWAN 스펙의 상태값은 비동기 트랜잭션의 경우에만 설정이 가능하다.

Miniport drivers use event notifications to inform the MB Service about an object state change in their MB device without first having received an OID request. The MB Service uses event notifications to update its state machine only.
미니포트 드라이버는 OID 요청을 받지 않는 이벤트 notification을 통해 MB 서비스에 오브젝트(장치)의상태 변화를 알려준다. MB 서비스는 이 이벤트 notification을 통해서 상태 머신만을 갱신한다.

Be aware that while NDIS serializes all requests that are sent to miniport drivers, miniport drivers might not return the responses in the same order. This is because the queued requests in the miniport driver might be processed in parallel. Hence the MB Service ensures that if two requests are dependent upon each other, it will not send the second request until the miniport driver completes the first request.
NDIS 에 순차적으로 요청된 것은 미니포트 드라이버로 전달되지만, 미니포트 드라이버는 요청받은 순서대로 응답을 하지 않는다. 이것은 미니포트 드라이버가 요청에 대한 처리를 병렬적으로 하기 때문이다. 그리하여, MB 서비스는 의존성(B를 요청하기 위해서 A의 결과가 필요한 경우 등)을 가진 두개의 요청을 보낼때, 처음 보낸 요청이 완료되기 전에 두번째 요청을 보내지 않는다.

State Change Notification
In general, miniport drivers should always notify the MB Service about the updated state of their MB device either through transactional notifications or through unsolicited event notifications. The following scenarios are some exceptions where miniport drivers are not supposed to respond with updated state information. The MB Service can determine the updated state from the completion status of other operations:
일반적으로, 미니포트 드라이버는 MB 장치의 상태 변화를 트랜잭션 notification이나 자발적인 이벤트 notification을 통해서 MB 서비스에 알려준다. 다음의 시나리오는, 미니포트 드라이버가 상태 변화를 알려주지 않는 예외적인 경우를 보여준다. MB 서비스는 다른 동작(Operation)의 완료 상태값을 통해 갱신된 상태를 알아챈다.
  1. Miniport drivers do not need to send an NDIS_STATUS_WWAN_PIN_LIST event indication when PIN state changes occur because the MB Service requested that the PIN be enabled or disabled. 
    미니포트 드라이버는 PIN 상태가 변경될때, NDIS_STATUS_WWAN_PIN_LIST 이벤트 알림을 보낼 필요가 없다. 왜냐하면, MB 서비스가 PIN 을 활성/비활성 요청을 하기 때문이다.
  2. Miniport drivers do not need to return the updated list of the provisioned contexts in transactional responses to OID_WWAN_PROVISIONED_CONTEXT set operations. 
    미니포트 드라이버는 OID_WWAN_PROVISIONED_CONTEXT 의 Set 요청에 대한 트랜잭션 응답에 임시적인 context의 갱신된 리스트를 포함할 필요는 없다.
  3. Miniport drivers do not need to respond with the updated list of the preferred providers in transactional responses to OID_WWAN_PREFERRED_PROVIDERS set operations. The MB Service can determine this information based on the initial list and success status of the set operation. 
    미니포트 드라이버는 OID_WWAN_PREFERRED_PROVIDERS 의 Set 요청에 대한 트랜잭션 응답에 preferred provider (선호하는 제공자) 리스트를 포함할 필요는 없다. MB 서비스는 최초 리스트와 이 요청의 성공 상태에 따라 이 정보들을 알 수 있다.
  4. Miniport drivers do not need to respond with the current WWAN_SMS_CONFIGURATION value for OID_WWAN_SMS_CONFIGURATION set operations.
    미니포트 드라이버는 OID_WWAN_SMS_CONFIGURATION 의 Set 요청에 대한 응답으로 WWAN_SMS_CONFIGURATION 값을 알려줄 필요가 없다.

덧글

댓글 입력 영역