Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Transacciones asincrónicas
El modelo de controlador de MB asume una semántica operativa sin bloqueo entre el servicio de MB y los controladores de miniport mediante el mecanismo de notificación asincrónica proporcionado en NDIS 6.x. Este mecanismo permite que el servicio MB continúe enviando solicitudes OID al controlador de miniportar para su procesamiento sin esperar a que se complete la operación actual.
Una transacción asincrónica es un proceso de tres fases que comienza con la solicitud inicial, seguida de una respuesta de estado y finaliza con una indicación transaccional final. La respuesta de estado de la solicitud es provisional en que solo reconoce que el controlador de miniporte ha recibido la solicitud. La indicación asincrónica de seguimiento es transaccional en que indica la finalización de la transacción. El controlador de miniporte devuelve el código de estado, así como los datos resultantes en la indicación transaccional.
Conjunto asincrónico y solicitudes de consulta
Muchas de las solicitudes OID de conjunto y consulta que usa el servicio MB se procesan de forma asincrónica. Para obtener más información sobre las solicitudes OID establecidas y de consulta , consulte NDIS_OID_REQUEST. La tabla "WWAN-specific OIDs" del tema MB Data Model identifica qué OID se procesan de forma asincrónica.
El diagrama siguiente representa la secuencia de interacción de una transacción de consulta asincrónica entre el servicio MB y el controlador de miniport. Las etiquetas en negrita representan identificadores OID o control de flujo transaccional, y las etiquetas del texto normal representan las marcas importantes dentro de la estructura OID.
El handshake de tres vías es el mismo para las solicitudes de consulta y de configuración.
Excepto por OID_WWAN_DRIVER_CAPS, todas las demás solicitudes OID específicas de MB siguen el mecanismo de transacción asincrónico para el intercambio de información entre los controladores de miniport y el servicio MB, con las notas adicionales siguientes:
Los controladores de miniport deben fallar inmediatamente una solicitud OID en cualquier condición de error, como una solicitud de OID no válida.
Los controladores de miniport deben devolver cualquier condición de error específica de WWAN con el código de error correcto (por ejemplo, WWAN_STATUS_XXX) especificado en el miembro uStatus de la estructura de notificación de eventos. Los controladores de miniport también deben rellenar adecuadamente los miembros que siguen al miembro uStatus, según sea necesario. Por ejemplo, los controladores de miniport deben rellenar el miembro ContextState.uNwError de la estructura NDIS_WWAN_CONTEXT_STATE, si está disponible. Sin embargo, en el caso de un error al procesar identificadores de objetos (OID) relacionados con los PINs, es posible que los controladores de miniporte no tengan necesariamente la información del estado actual del PIN para especificar en el miembro PinInfo.PinState de NDIS_WWAN_PIN_INFO.
Los controladores de miniport deben devolver NDIS_STATUS_INDICATION_REQUIRED como respuesta provisional para todas las solicitudes de OID asincrónicas.
Los controladores de miniportar deben poder distinguir los cambios de estado del dispositivo causados por una solicitud OID de otras causas. Los controladores de miniportadores deben enviar notificaciones transaccionales para los cambios de estado resultantes de las solicitudes OID; deben enviar notificaciones de eventos no solicitadas para los cambios de estado que se deriven de otras causas.
Los controladores de miniport son responsables de administrar la memoria en modo kernel, aunque el servicio MB asigna inicialmente la memoria para las solicitudes. Después de que el servicio MB reciba una respuesta de un controlador de miniport, el servicio puede liberar la memoria en modo de usuario que asignó para la solicitud OID.
El diagrama siguiente representa la secuencia de interacción de una transacción de conjunto asincrónica entre el servicio MB y el controlador de miniport. Las etiquetas en negrita representan identificadores OID o control de flujo transaccional, y las etiquetas del texto normal representan las marcas importantes dentro de la estructura OID.
Respuesta asincrónica
La especificación NDIS 6.0 (publicada con Windows Vista) introdujo un nuevo código de estado, NDIS_STATUS_INDICATION_REQUIRED, para que los controladores de miniporte transmitan la naturaleza asincrónica de una transacción al servicio MB en una respuesta provisional del controlador de miniport a una solicitud de OID.
Como se menciona en Resumen de la interfaz MB, el servicio MB no tiene acceso directo a la memoria del modo kernel asignada por un controlador miniport MB. Se supone que el resultado de la ejecución almacenado en la memoria en modo kernel se copia y se pone a disposición del servicio MB por parte de algún intermediario, como WMI o un controlador de filtro NDIS. Por lo tanto, los controladores de miniport pueden liberar la memoria en modo kernel asignada después de que la llamada de función NdisMIndicateStatusEx devuelva en la indicación transaccional.
Los procedimientos de enlace que deben seguir los controladores miniport y el servicio MB se describen en el siguiente procedimiento.
Procedimiento del controlador de miniporte MB
Tras recibir una solicitud de OID, los controladores de miniport deben realizar los pasos siguientes:
Asigne memoria en modo kernel para copiar el contenido de la estructura de datos de NDIS_OID_REQUEST asociada a la solicitud OID.
Entre los parámetros de la solicitud, asegúrese de que los miembros RequestId y RequestHandle de la estructura de solicitud OID también se copien. Estos miembros se usarán más adelante en la indicación transaccional.
Devuelve una respuesta de estado de NDIS_STATUS_INDICATION_REQUIRED provisional para informar al servicio MB de que el controlador de miniporte completará la solicitud de forma asincrónica.
Tras la finalización de la operación, almacene el resultado en la memoria local o asignada por el controlador, según corresponda.
Llame a la función NdisMIndicateStatusEx para notificar al servicio MB que se ha completado la operación pendiente. Los controladores miniport deben rellenar los miembros de la estructura NDIS_STATUS_INDICATION de la siguiente manera:
- Establezca el campo StatusCode para el tipo de notificación de estado. Por ejemplo, NDIS_STATUS_WWAN_XXX.
- Establezca el miembro DestinationHandle en el miembro RequestHandle que se recibió en la estructura de datos NDIS_OID_REQUEST cuando el controlador de miniporte recibió la solicitud OID correspondiente.
- Establezca el miembro RequestId para que coincida con el miembro RequestId de la estructura de estado de NDIS_OID_REQUEST cuando el controlador de miniporte recibió la solicitud OID correspondiente.
- Establezca los miembros StatusBuffer y StatusBufferSize para que estos apunten respectivamente a la memoria asignada por el controlador de miniporte y al tamaño del búfer de memoria. Este búfer de memoria contiene el resultado de la operación completada.
- Si la operación se completa correctamente, establezca el miembro uStatus en WWAN_STATUS_SUCCESS. De lo contrario, establezca el miembro uStatus en el valor de WWAN_STATUS_XXX adecuado para indicar el tipo de error.
Cuando la llamada a la función regresa, el controlador miniport debe liberar la memoria que asignó para la solicitud OID.
Procedimiento del servicio MB
El servicio MB procesa transacciones asincrónicas mediante el procedimiento siguiente:
Asigne memoria de búfer para la solicitud en función de la estructura de datos OID. Rellene los miembros de la estructura de datos con los valores adecuados.
Llame a la función NdisOidRequest con el miembro InformationBuffer apuntando a la estructura de datos OID para la solicitud OID y espere a que el controlador de miniport responda.
Tras recibir un NDIS_STATUS_INDICATION_REQUIRED respuesta provisional del controlador de miniport, el servicio MB guarda requestId, libera la memoria asignada y marca la transacción como abierta. En este momento, el servicio MB es gratuito para procesar las posteriores solicitudes y notificaciones de OID.
Después de recibir una notificación con NDIS_STATUS_WWAN_XXX como valor statusCode , compruebe si requestId coincide con el de cualquier transacción marcada como abierta. Si hay una coincidencia, el servicio cierra la transacción. Si no se encuentra ninguna coincidencia, trate la notificación como una notificación de eventos no solicitada.
Procese los datos devueltos en el miembro StatusBuffer y realice cambios de estado en el servicio MB según corresponda.
Indicaciones
Hay dos tipos de indicaciones específicas de WWAN que los controladores de miniporte pueden generar:
Notificaciones de eventos que se derivan de un cambio de estado de objeto en el dispositivo MB.
Notificaciones transaccionales que indican la finalización de una operación asincrónica.
En ambos casos, los controladores de miniport deben llamar a la función NdisMIndicateStatusEx.
Notificación de evento
La notificación de eventos no está solicitada en el sentido de que el controlador de miniporte envía proactivamente la indicación al servicio MB como evento de cambio de estado. El cambio de estado se debe a una acción de alguna entidad distinta del servicio MB. El servicio MB supone que los controladores de miniporte pueden detectar la causa del cambio.
Para cualquier notificación de eventos específica de WWAN, los controladores de miniport deben establecer el miembro RequestId de la estructura de NDIS_STATUS_INDICATION en cero. El miembro StatusCode especifica qué objeto del dispositivo MB ha cambiado. El controlador de miniport puede establecer este objeto en cualquiera de los siguientes valores:
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_CONTEXT_STATE
NDIS_STATUS_WWAN_PROVISIONED_CONTEXTS
NDIS_STATUS_WWAN_SERVICE_ACTIVATION
NDIS_STATUS_WWAN_SMS_CONFIGURATION
NDIS_STATUS_WWAN_VENDOR_SPECIFIC
El servicio MB también puede procesar otras notificaciones de eventos de NDIS. Estas notificaciones de eventos que no son MB no están necesariamente sujetas al requisito de que sus valores RequestId se establezcan en cero.
Notificaciones transaccionales
Los controladores de miniportar usan notificaciones transaccionales para informar al servicio MB de que se ha completado una transacción asincrónica y el servicio MB usa notificaciones transaccionales para cerrar las transacciones abiertas y actualizar su máquina de estado.
El servicio MB espera notificaciones transaccionales para que pueda cerrar las transacciones abiertas. Es el intercambio final del protocolo de enlace triple entre el servicio MB y el controlador de miniport en una transacción asincrónica. El valor del miembro RequestId del NDIS_STATUS_INDICATION en cualquier notificación transaccional debe ser distinto de cero, que se copia de la solicitud correspondiente en la misma transacción.
Debe establecer el miembro RequestId de la estructura de NDIS_STATUS_INDICATION correctamente para que el mecanismo asincrónico funcione correctamente. El servicio MB garantiza que el valor requestId sea único y distinto de cero entre todas las solicitudes pendientes. Los controladores de miniport deben devolver el mismo valor RequestId en la indicación correspondiente para que el servicio MB ponga en correlación la indicación con una transacción abierta.
Estructura de indicación de estado
Tanto la respuesta asincrónica para una solicitud de OID determinada como las estructuras de notificación de eventos no solicitadas comparten los siguientes miembros de estructura a los que apunta el miembro StatusBuffer del parámetro StatusIndication a NdisMIndicateStatusEx:
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;
Un valor de cero en el miembro RequestId de la estructura NDIS_STATUS_INDICATION significa que es una notificación de eventos no solicitada y puede producirse en cualquier momento.
Si el miembro uStatus de la indicación devuelta de cualquier solicitud OID de establecer o consulta no es igual a WWAN_STATUS_SUCCESS, los miembros de la estructura NDIS_WWAN_XXX asociada no necesitan ser válidos.
En el caso de las notificaciones de eventos no solicitadas basadas en eventos de red, los controladores de miniport deben rellenar el miembro uNwError según sea necesario.
En la tabla siguiente se muestran los valores de código de causa de fallo para registro, conexión de paquetes (attach) y desasociación de paquetes (detach) que se definen en la especificación TS 24.008 de 3GPP para redes basadas en GSM:
| Código de causa de 3GPP 24.008 | Interpretación del código de causa |
|---|---|
2 - Identidad de suscriptor móvil internacional (IMSI) desconocida en HLR |
La SIM o el dispositivo no están activados o la suscripción ha expirado, lo que provocó una desactivación de red. |
4 - IMSI desconocido en VLR |
La característica de itinerancia no está suscrita. |
6 - ME ilegal |
MS bloqueado por red debido a un informe robado. |
7- No se permiten los servicios GPRS |
El usuario no tiene una suscripción de GPRS. El usuario solo tiene una suscripción de conexión de voz. |
8 - No se permiten los servicios GPRS ni los no GPRS. |
No se permiten los servicios GPRS y no-GPRS. |
11 - PLMN no permitido |
La red bloquea el servicio debido a una suscripción expirada u otra causa. |
12 - Área de ubicación no permitida |
La suscripción de usuario no permite el acceso en el área de ubicación actual. |
13 - Itinerancia no permitida en este área de ubicación |
La suscripción permite la itinerancia, pero no se permite itinerancia en el área de ubicación actual. |
14 - No se permiten los servicios GPRS en este PLMN |
El proveedor de red seleccionado no proporciona el servicio GPRS al MS. |
15 - No hay celdas adecuadas en el área de ubicación |
No hay ninguna suscripción para el servicio. |
17- Error de red |
Error de registro. |
22 - Congestión |
Error de registro debido a la congestión de la red. |
Por ejemplo, si la red inicia un evento de contexto de desactivación porque no se permite la itinerancia en el área de ubicación, los controladores de miniporte deben establecer el miembro uNwError en 13 según los códigos de causa 3GPP TS 24.008 para las redes basadas en GSM.
También se debe aplicar una lógica similar a las redes basadas en CDMA. Sin embargo, no hay ningún estándar para los códigos de error de red basados en CDMA. Los dispositivos basados en CDMA deben usar el código de red -specific o los códigos de error específicos del dispositivo.
En el caso de una respuesta asincrónica del controlador miniport a las solicitudes OID, el miembro RequestId de la estructura de NDIS_STATUS_INDICATION es un número distinto de cero que se pasó al controlador miniport como parte de una solicitud de conjunto o consulta. El controlador de miniport debe rellenar el miembro uStatus según corresponda. Por ejemplo, WWAN_STATUS_SUCCESS o cualquiera de los valores de error adecuados enumerados en la sección siguiente. Además de esto, el controlador de miniport debe rellenar el miembro uNwError cuando corresponda y esté disponible.
Estado de notificación de evento
En la tabla siguiente se enumeran los códigos de WWAN_STATUS que los controladores de miniporte MB pueden especificar en el miembro uStatus de las estructuras de notificación de eventos de NDIS_WWAN_XXX.
| Importancia | Significado |
|---|---|
WWAN_STATUS_SUCCESS |
La operación se realizó correctamente. |
WWAN_STATUS_FAILURE |
Error en la operación (error genérico). |
WWAN_STATUS_BUSY |
Error en la operación porque el dispositivo está ocupado. |
WWAN_STATUS_SIM_NO_INSERTADA |
Error en la operación porque la tarjeta SIM no se insertó completamente en el dispositivo. |
WWAN_STATUS_BAD_SIM |
Error en la operación porque la tarjeta SIM es incorrecta y no se puede usar más. |
ESTADO_WWAN_PIN_REQUERIDO |
Error en la operación porque se debe escribir un PIN para continuar. |
WWAN_STATUS_PIN_DISABLED |
Error en la operación porque el PIN está deshabilitado. |
WWAN_ESTADO_NO_REGISTRADO |
Error en la operación porque el dispositivo no está registrado en ninguna red. |
WWAN_STATUS_PROVIDERS_NOT_FOUND (Proveedores no encontrados para WWAN) |
Error en la operación porque no se encontró ningún proveedor de red. |
WWAN_STATUS_NO_DEVICE_SUPPORT |
Error en la operación porque el dispositivo no admite la operación. |
WWAN_STATUS_PROVIDER_NOT_VISIBLE |
Error en la operación porque el proveedor de servicios no está visible actualmente. |
ESTADO_WWAN_CLASE_DE_DATOS_NO_DISPONIBLE |
Error en la operación porque la clase de datos solicitada no estaba disponible. |
WWAN_STATUS_PACKET_SVC_DETACHED |
Error en la operación porque el servicio de paquetes está desasociado. |
WWAN_STATUS_MAX_ACTIVATED_CONTEXTS |
Error en la operación porque se ha alcanzado el número máximo de contextos activados. |
WWAN_STATUS_NOT_INITIALIZED |
Error en la operación porque el dispositivo está en proceso de inicialización. Vuelva a intentar la operación después de que el estado listo del dispositivo cambie a WwanReadyStateInitialized. |
WWAN_ESTADO_LLAMADA_VOZ_EN_CURSO |
Error en la operación porque hay una llamada de voz en curso. |
WWAN_STATUS_CONTEXT_NO_ACTIVADO |
Error en la operación porque el contexto no está activado. |
WWAN_STATUS_SERVICIO_NO_ACTIVADO |
Error en la operación porque el servicio no está activado. |
WWAN_STATUS_CADENA_DE_ACCESO_INVALIDA |
Error en la operación porque la cadena de acceso no es válida. |
WWAN_STATUS_INVALID_USER_NAME_PWD |
Error en la operación porque el nombre de usuario o la contraseña proporcionados no son válidos. |
WWAN_STATUS_RADIO_POWER_OFF |
Error en la operación porque la radio está apagada actualmente. |
WWAN_STATUS_PARAMETROS_INVALIDOS |
Error en la operación debido a parámetros no válidos. |
Error de lectura WWAN_STATUS_READ_FAILURE |
Error en la operación debido a un error de lectura. |
WWAN_STATUS_WRITE_FAILURE |
Error en la operación debido a un error de escritura. |
En la tabla siguiente se muestran los valores de estado específicos de SMS.
| Importancia | Significado |
|---|---|
WWAN_STATUS_SMS_OPERATION_NOT_ALLOWED (Operación SMS no permitida en la red WWAN) |
Error en la operación de SMS porque no se permite la operación. |
Fallo de memoria SMS de WWAN |
Error en la operación de SMS debido a un error de memoria. |
WWAN_STATUS_SMS_ÍNDICE_DE_MEMORIA_INVALIDO |
Error en la operación de SMS debido a un índice de memoria no válido: WwanSmsFlagIndex para OID_WWAN_SMS_READ. |
WWAN_STATUS_SMS_DIRECCIÓN_SMSC_DESCONOCIDA |
Error en la operación de SMS porque el número del centro de servicio no es válido o desconocido. |
WWAN_STATUS_SMS_NETWORK_TIMEOUT |
El envío de SMS falló debido a un tiempo de espera de la red. |
WWAN_STATUS_MEMORIA_SMS_LLENA |
Error en la operación de SMS porque el almacén de mensajes SMS está lleno. |
WWAN_STATUS_SMS_ERROR_DESCONOCIDO (Error desconocido de SMS en WWAN) |
Error en la operación de SMS debido a un error desconocido (un error genérico). |
WWAN_STATUS_SMS_FILTER_NOT_SUPPORTED |
Error en la operación de SMS porque no se admite el tipo de filtro solicitado. |
WWAN_STATUS_SMS_MORE_DATA |
Esta transacción aún no se ha completado. Se han devuelto algunos datos y hay más datos que se van a devolver. |
ESTADO_WWAN_SMS_IDIOMA_NO_ADMITIDO |
Error en la operación de SMS porque no se admite el lenguaje SMS. Esto solo se aplica a los dispositivos basados en CDMA. |
Estado de WWAN: Codificación de SMS no soportada (WWAN_STATUS_SMS_ENCODING_NOT_SUPPORTED) |
Error en la operación de SMS porque no se admite la codificación de SMS. Esto solo se aplica a los dispositivos basados en CDMA. |
Estado de la red de área amplia inalámbrica: formato de SMS no compatible |
Error en la operación de SMS porque no se admite el formato SMS. |
Nota Estos códigos de estado específicos de WWAN solo se usan para transacciones asincrónicas en el miembro uStatus de las estructuras de NDIS_WWAN_XXX.
Los controladores de miniport usan notificaciones de eventos para informar al servicio MB sobre un cambio de estado de objeto en su dispositivo MB sin primero haber recibido una solicitud de OID. El servicio MB usa notificaciones de eventos para actualizar solo su máquina de estado.
Tenga en cuenta que, aunque NDIS serializa todas las solicitudes que se envían a los controladores de miniport, es posible que los controladores de miniporte no devuelvan las respuestas en el mismo orden. Esto se debe a que las solicitudes en cola del controlador de miniport pueden procesarse en paralelo. Por lo tanto, el servicio MB garantiza que si dos solicitudes dependen entre sí, no enviará la segunda solicitud hasta que el controlador de miniporte complete la primera solicitud.
Notificación de cambio de estado
En general, los controladores de miniport siempre deben notificar al servicio MB el estado actualizado de su dispositivo MB a través de notificaciones transaccionales o notificaciones de eventos no solicitados. Los escenarios siguientes son algunas excepciones en las que no se supone que los controladores de miniporte respondan con información de estado actualizada. El servicio MB puede determinar el estado actualizado a partir del estado de finalización de otras operaciones:
Los controladores miniport no necesitan enviar una indicación de evento NDIS_STATUS_WWAN_PIN_LIST cuando se produce un cambio de estado de PIN debido a que el Servicio MB solicitó habilitar o deshabilitar el PIN.
Los controladores de miniport no necesitan devolver la lista actualizada de los contextos aprovisionados en las respuestas transaccionales a las operaciones de establecer OID_WWAN_PROVISIONED_CONTEXT.
Los controladores miniport no necesitan responder con la lista actualizada de los proveedores preferidos en las respuestas transaccionales a las operaciones set de OID_WWAN_PREFERRED_PROVIDERS. El servicio MB puede determinar esta información en función de la lista inicial y el estado de éxito de la operación set.
Los controladores de miniport no necesitan responder con el valor actual de WWAN_SMS_CONFIGURATION para las operaciones de OID_WWAN_SMS_CONFIGURATION definidas.