Compartilhar via


Operações multi-SIM do MB

Suporte a vários executores de vários modos da área de trabalho

Tradicionalmente, dispositivos Windows que não são de telefone não foram configurados para modems com vários SIM porque têm menos restrições de espaço físico do que telefones. Isso permite que eles realmente aproveitem vários rádios ativos ao mesmo tempo em vez de ter um modem com vários cartões SIM como um telefone faz; no entanto, devido ao aumento do eSIM e dos cenários na empresa, a demanda por suporte a vários SIM por modem em dispositivos que não são de telefone aumentou.

A maioria dos dispositivos de telefone com vários SIM típicos tem slots sim duplos, mas são limitados a um SIM primário cartão dados de suporte, enquanto o outro só dá suporte a recursos de voz. Essa limitação não existe no modelo de computador que não seja de telefone, pois todos os cartões SIM são usados para conexão de dados.

Embora a estrutura definida nessa especificação possa teoricamente dar suporte a um número não associado de modems e cartões SIM, o Windows 10, versão 1703 e posterior dá suporte apenas ao cenário DSSA (dual-SIM/single-active) de ponta a ponta.

Especificação da interface de modem do NDIS

Interface existente e lacunas de recursos

É possível dar suporte à funcionalidade dual-SIM/dual-active com vários modems independentes, em que cada modem é um dispositivo separado e opera de forma completamente independente. No entanto, isso está fora do escopo dessa documentação, que se concentra em um modem de miniporto WWAN capaz de apresentar várias pilhas celulares simultâneas ao host. Esta seção define os vários objetos e estabelece a terminologia usada em todas as documentações de MB relacionadas à funcionalidade de vários SIM.

Os avanços no hardware resultaram em dispositivos que podem manter registros simultâneos com várias redes celulares. Nesses dispositivos, supõe-se que haja "várias instâncias da pilha da rede celular" em execução em paralelo, que são capazes de manter o registro, monitorar os pontos fortes do sinal, executar entregas e escutar páginas de entrada. Cada instância dessa "pilha celular" será conhecida como executora para o restante deste documento. Por exemplo, em um dispositivo capaz de manter registros com duas redes simultaneamente, o hardware de modem é considerado com dois executores.

O executor é uma representação lógica do hardware e pode de fato ser um único transceptor de hardware sendo multiplexado. As especificações exatas de hardware são consideradas detalhes de implementação do fornecedor e estão fora do escopo dessa especificação. Para um driver de miniporto NDIS, os executores são expostos como várias instâncias de um adaptador de miniporto WWAN. Para um modem MBIM, os executores são representados por várias funções MBIM em um dispositivo composto enumerado.

As duas imagens a seguir ilustram a exibição lógica de um modem de SIM duplo. Cada um mostra uma possível combinação de executor e UICC.

Diagrama ilustrando a exibição lógica de um modem DE SIM duplo.

A pilha celular dentro de um executor é considerada principalmente autocontida, exceto no caso de uma implementação de modem Dual Standby em que o executor que conduz o tráfego (voz e/ou dados) pode impedir que o outro mantenha o registro.

O diagrama a seguir ilustra a exibição lógica de um modem de espera dupla. O tráfego no Executor 0, uma chamada telefônica, faz com que o Executor 1 perca o registro.

Diagrama ilustrando a exibição lógica de um modem de espera dupla.

O modelo de interface de modem da Área de Trabalho do Windows no NDIS 6.7 não acomoda essa arquitetura porque se baseia em várias suposições implícitas:

  • O modelo pressupõe que há um único executor dentro do modem.
  • O modelo pressupõe que há um único cartão UICC diretamente associado ao hardware de modem.
  • A UICC é tratada como se fosse um sim de aplicativo único cartão.

Por outro lado, a interface RIL (Camada de Interface de Rádio) da Microsoft no Windows Mobile expõe explicitamente a multiplicidade dessas suposições. A interface de Banda Larga Móvel no Windows Mobile expõe a capacidade de se registrar independentemente por meio de miniportos separados e pressupõe que alguma configuração básica do dispositivo já tenha sido realizada por meio da interface RIL. Para fornecer funcionalidade equivalente, a Área de Trabalho do Windows deve fornecer mecanismos para descobrir o número de executores e slots, acessar executores de forma independente, definir o mapeamento entre executores e slots e definir os aplicativos dentro do UICC mapeado cartão que cada executor usará.

Para obter mais informações sobre a arquitetura da rede celular e as diferenças entre Windows 10 Mobile e Área de Trabalho, consulte Arquitetura e implementação da rede celular.

Principais objetos e operações

A figura a seguir mostra um modelo abstrato de um modem.

Diagrama mostrando a relação entre modem, executores e slots.

Cada modem é identificado por um GUID (identificador global exclusivo) e contém um conjunto de um ou mais executores, cada um deles capaz de registrar independentemente em uma rede celular. Cada executor tem um índice executor associado, um inteiro, começando com 0 para o primeiro executor. Além disso, o modem expõe um ou mais slots que podem conter cartões UICC. Supõe-se que o número de slots seja maior ou igual ao número de executores. Cada slot tem um índice associado, também começando com 0, e um estado atual relacionado ao estado de energia do slot e ao estado de disponibilidade de um cartão no slot (se houver).

Para manter a compatibilidade com modems existentes, cada executor opera com informações fornecidas por um cartão UICC em um único slot. A associação entre executores e slots é definida pelo mapeamento de slot, que mapeia cada executor para exatamente um slot.

Um slot pode conter um cartão UICC; cada cartão contém um ou mais aplicativos UICC, como um USIM, CSIM, ISIM ou possivelmente outros aplicativos de telefonia e não telefonia, como aplicativos PKCS#15 ou Plataforma Global para um elemento seguro NFC. O endereçamento e o uso desses aplicativos UICC individuais é um tópico para especificação futura e fora do escopo desta documentação.

A interface NDIS da Área de Trabalho do Windows para o modem é caracterizada pela troca de OIDs e notificações NDIS. Na maioria dos casos, esses OIDs são direcionados para executores individuais; no entanto, alguns comandos e notificações têm como escopo o modem.

Para sistemas operacionais não Windows Mobile, um modem de vários executores aparece como um dispositivo com várias instâncias de miniporto WWAN físicas. Cada instância de miniporto físico representa um executor que pode manter o registro como uma instância do NDIS. Instâncias virtuais adicionais podem ser criadas em runtime para gerenciar sessões de serviço de dispositivo e dados de pacote específicos do contexto. Comandos e notificações específicos do executor são trocados por meio da instância física do NDIS do miniporto WWAN que representa esse executor. Comandos específicos do modem (em outras palavras, aqueles que não são específicos do executor) e suas notificações correspondentes podem ser enviadas ou provenientes de qualquer instância de miniporto físico.

Os dois diagramas a seguir mostram a diferença em notificações e comandos específicos do executor (o primeiro diagrama), em que comandos e notificações passam e vêm do mesmo executor e comandos e notificações específicos do modem (o segundo diagrama), em que os comandos podem passar por qualquer executor e vir de qualquer executor.

Diagrama exibindo comandos e notificações específicos do executor.

Diagrama ilustrando comandos e notificações específicos do modem.

Todas as solicitações de consulta ou conjunto de OID emitidas para uma instância de miniport são executadas no modem e no executor com o qual a instância de miniporto está associada. Da mesma forma, todas as notificações não solicitadas e os eventos não solicitados do Serviço de Dispositivo enviados de uma instância de miniport são aplicáveis ao modem e ao executor ao qual a instância de miniporto está associada. Por exemplo, uma notificação de NDIS_STATUS_WWAN_REGISTER_STATE ou NDIS_STATUS_WWAN_PACKET_SERVICE não solicitada de um miniporto indica o registro (ou estado do serviço de pacote) do modem associado e o executor somente e não está relacionado ao estado de outros modems ou outros executores.

Quando há vários modems e/ou vários executores em um dispositivo, o adaptador de miniporto físico associado a essa combinação de modem e executor emite notificações não específicas de contexto relacionadas a uma combinação específica de modem e executor.

Da mesma forma, se um dispositivo tiver vários modems e/ou vários executores, a instância do adaptador de miniporto físico associada a uma combinação específica de modem e executor poderá receber solicitações de consulta OID não específicas do contexto relacionadas a esse modem e executor. O adaptador que recebe essa solicitação de consulta o processa de acordo com a definição de OID. Se assim for escolhido pelo driver de miniporto, essa solicitação de consulta poderá ser processada simultaneamente com qualquer outro conjunto de OID em processo ou solicitações de consulta em qualquer instância de adaptadores associados a esse modem e executor. Todas as instâncias de um adaptador de miniporto associadas a um mesmo modem e executor relatam as mesmas informações de estado para esse modem e executor da rede celular (como estado de energia de rádio, estado de registro, estado do serviço de pacotes etc.).

Para um dispositivo que tem vários modems e/ou vários executores, a instância do adaptador de miniporto físico associada a uma combinação de modem e executor pode receber solicitações de conjunto de OID não específicas do contexto. O driver de miniporte deve acompanhar o progresso de tal solicitação. Se uma solicitação desse tipo de conjunto estiver em andamento em qualquer adaptador e ainda não tiver sido concluída, uma segunda tentativa de solicitação de conjunto (para qualquer instância de adaptador associada ao mesmo modem e executor) será enfileirada e processada após a conclusão das solicitações anteriores.

O driver WMBCLASS da área de trabalho do Windows 10 segue a especificação descrita no parágrafo anterior para lidar com essa condição de corrida de solicitação definida, mas se a condição de corrida ocorrer na camada de modem, o modem deverá seguir as mesmas diretrizes para enfileirar comandos conflitantes em todo o dispositivo na função MBIM se ele ainda estiver processando outra função que esteja vinculada ao mesmo dispositivo subjacente.

OIDs para definir e consultar solicitações

Para consultar o número de dispositivos (executores) e slots no modem, bem como o número de executores que podem estar ativos simultaneamente, o host usa OID_WWAN_SYS_CAPS.

Para consultar a funcionalidade de um executor, o host usa OID_WWAN_DEVICE_CAPS_EX.

Para definir o slot associado a cada executor ou consultar o mapeamento atual, o host usa OID_WWAN_DEVICE_SLOT_MAPPINGS.

Para consultar a status de um slot específico no modem, o host usa OID_WWAN_SLOT_INFO_STATUS.

Comandos por dispositivo e por executor

Com a adição do conceito de executor a dispositivos não Windows Mobile no Windows 10, versão 1703 e posterior, os OIDs agora são divididos em duas categorias: OIDs por dispositivo e OIDs por executor. A tabela a seguir explica quais OIDs se enquadram em qual categoria.

Por dispositivo ou por executor Nome do OID
Por dispositivo OID_WWAN_DRIVER_CAPS
OID_WWAN_ENUMERATE_DEVICE_SERVICE_COMMANDS
OID_WWAN_ENUMERATE_DEVICE_SERVICES
OID_WWAN_PRESHUTDOWN
OID_WWAN_VENDOR_SPECIFIC
OID_WWAN_SYS_CAPS
OID_WWAN_DEVICE_SLOT_MAPPINGS
Por executor OID_WWAN_AUTH_CHALLENGE
OID_WWAN_CONNECT
OID_WWAN_DEVICE_CAPS
OID_WWAN_DEVICE_CAPS_EX
OID_WWAN_DEVICE_SERVICE_COMMAND
OID_WWAN_DEVICE_SERVICE_SESSION
OID_WWAN_DEVICE_SERVICE_SESSION_WRITE
OID_WWAN_DEVICE_SERVICES
OID_WWAN_HOME_PROVIDER
OID_WWAN_NETWORK_IDLE_HINT
OID_WWAN_PACKET_SERVICE
OID_WWAN_PIN
OID_WWAN_PIN_EX
OID_WWAN_PIN_LIST
OID_WWAN_PREFERRED_MULTICARRIER_PROVIDERS
OID_WWAN_PREFERRED_PROVIDERS
OID_WWAN_PROVISIONED_CONTEXTS
OID_WWAN_RADIO_STATE
OID_WWAN_READY_INFO
OID_WWAN_REGISTER_STATE
OID_WWAN_SERVICE_ACTIVATION
OID_WWAN_SIGNAL_STATE
OID_WWAN_SMS_CONFIGURATION
OID_WWAN_SMS_DELETE
OID_WWAN_SMS_READ
OID_WWAN_SMS_SEND
OID_WWAN_SMS_STATUS
OID_WWAN_SUBSCRIBE_DEVICE_SERVICE_EVENTS
OID_WWAN_USSD
OID_WWAN_VISIBLE_PROVIDERS
OID_WWAN_SLOT_INFO_STATUS

Observação

OID_WWAN_RADIO_STATE foi atualizado para o Windows 10, versão 1703 também. Consulte OID_WWAN_RADIO_STATE para obter mais informações.

Atualização da interface MBIM para operações com vários SIM

Para sistemas operacionais não Windows Mobile, um modem de vários executores aparece como um dispositivo composto USB com várias funções MBIM. Cada função MBIM representa um executor que pode manter o registro. Comandos e notificações específicos do executor são trocados por meio da função MBIM que representa esse executor, enquanto comandos específicos do modem (em outras palavras, aqueles que não são específicos do executor) e suas notificações correspondentes podem ser enviadas ou provenientes de qualquer função MBIM que pertença ao mesmo dispositivo composto USB subjacente.

Todas as solicitações de consulta ou conjunto de CID emitidas para uma função MBIM são executadas no modem e no executor com o qual a instância de miniporto está associada; da mesma forma, todas as notificações não solicitadas enviadas de uma função MBIM são aplicáveis ao modem e ao executor ao qual a função MBIM está associada. Da mesma forma, todos os eventos não solicitados do Serviço de Dispositivo enviados de uma instância de miniport são aplicáveis ao modem e ao executor ao qual a função MBIM está associada. Por exemplo, uma notificação de MBIM_CID_REGISTER_STATE ou MBIM_CID_PACKET_SERVICE não solicitada de uma função MBIM indica o estado de registro ou serviço de pacote somente do modem/executor associado e não está relacionado ao estado de outros modems ou outros executores.

Quando houver vários modems e/ou vários executores em um dispositivo, notificações não solicitadas específicas de contexto relacionadas a um modem específico e uma combinação de executor devem ser emitidas da função MBIM associada ao modem e executor mencionados anteriormente.

Em um dispositivo com vários modems e/ou vários executores, solicitações de consulta CID não específicas de contexto relacionadas a um modem específico e executor podem ser emitidas para a função MBIM associada a essa combinação de modem e executor. A função que recebe essa solicitação de consulta deve processá-la de acordo com a definição de CID. Se assim for escolhido pelo firmware de modem, essa solicitação de consulta poderá ser processada simultaneamente com qualquer outro conjunto de CID ou solicitações de consulta sendo processadas por quaisquer funções MBIM associadas a esse modem e executor. Todas as funções MBIM associadas ao mesmo modem devem relatar as mesmas informações de estado para esse modem celular, além do executor que elas representam.

Quando há vários modems e/ou vários executores em um dispositivo, solicitações de conjunto cid não específicas do executor podem ser emitidas para a função MBIM associada a esse modem e executor. O modem deve acompanhar o progresso dessas solicitações como um todo. Se uma dessas solicitações de conjunto estiver em andamento em qualquer adaptador e ainda não tiver sido concluída, uma segunda tentativa de solicitação de conjunto (para qualquer instância de adaptador associada ao mesmo modem e executor) será enfileirada e processada após a conclusão das solicitações anteriores.

O diagrama a seguir ilustra o fluxo de informações entre as funções WWANSVC e MBIM em dois modems diferentes.

Diagrama da estrutura de modem com funções MBIM.

Esta seção contém as descrições detalhadas de CID em todo o modem e por executor para os serviços de dispositivo definidos. As definições fazem referência à especificação do MBIM1.0 público existente. Um dispositivo compatível com MBIM implementa e relata o seguinte serviço de dispositivo quando consultado por CID_MBIM_DEVICE_SERVICES. Os serviços conhecidos existentes são definidos na seção 10.1 da especificação USB NCM MBIM 1.0. A Microsoft estende isso para definir o serviço a seguir.

Nome do Serviço = Extensões básicas de conexão

UUID = UUID_BASIC_CONNECT_EXTENSIONS

Valor UUID = 3d01dcc5-fef5-4d05-0d3abef7058e9aaf

Os seguintes CIDs são definidos para UUID_MS_BasicConnect:

CID Código de comando Versão mínima do sistema operacional
MBIM_CID_MS_SYS_CAPS 5 Windows 10, versão 1703
MBIM_CID_MS_DEVICE_CAPS_V2 6 Windows 10, versão 1703
MBIM_CID_MS_DEVICE_SLOT_MAPPINGS 7 Windows 10, versão 1703
MBIM_CID_MS_SLOT_INFO_STATUS 8 Windows 10, versão 1703

Todos os deslocamentos nas seções cid a seguir são calculados desde o início do MBIM_COMMAND_MSG InformationBuffer.

MBIM_CID_MS_SYS_CAPS

Description

Esse CID recupera informações sobre o modem. Isso pode ser enviado em qualquer uma das instâncias mb expostas como uma função USB.

Consulta

O InformationBuffer no MBIM_COMMAND_MSG contém os dados de resposta como MBIM_MS_SYS_CAPS_INFO.

Definir

Não aplicável.

Evento não solicitado

Não aplicável.

Parâmetros

Operação Definir Consulta Notificação
Comando Não aplicável Não aplicável Não aplicável
Resposta Não aplicável MBIM_MS_SYS_CAPS_INFO Não aplicável

estruturas de dados

Consulta

O InformationBuffer será nulo e InformationBufferLength será zero.

Definir

Não aplicável.

Resposta

A estrutura de MBIM_SYS_CAPS_INFO a seguir deve ser usada no InformationBuffer.

Deslocamento Tamanho Campo Type Descrição
0 4 NumberOfExecutors UINT32 Número de instâncias MBB relatadas por esse modem
4 4 NumberOfSlots UINT32 Número de slots UICC físicos disponíveis neste modem
8 4 Simultaneidade UINT32 Número de instâncias MBB que podem estar ativas simultaneamente
12 8 ModemId UINT64 Identificador exclusivo de 64 bits para cada modem

O campo NumberOfExecutors indica o número de executores compatíveis com o modem em sua configuração atual. Isso mapeia diretamente para o número de pilhas 'sub-telefone' que o modem dá suporte.

O campo NumberofSlots indica o número de slots que estão fisicamente presentes no modem. Cada slot relatado deve ser capaz de receber uma cartão UICC (os slots em si podem ser uma combinação heterogênea, se necessário – mini SIM, micro SIM, nano SIM ou qualquer padrão, conforme definido pelo ETSI). O número de slots deve ser igual ou maior do que o número de executores com suporte. A provisão "maior que" permite o uso de UICC não telefonia, como para segurança, NFC etc.

O campo Simultaneidade indica o número de executores (instâncias MBB) que podem estar ativos ao mesmo tempo. O intervalo deve ser de 1 ≤ ≤ NumberOfExecutors. Por exemplo, um modem de espera dupla teria uma Simultaneidade de 1, enquanto um modem ativo duplo teria uma simultaneidade de 2

O campo ModemId indica o identificador exclusivo de 64 bits para um determinado hardware de modem. Um IHV pode implementar sua própria lógica para gerar um valor exclusivo de 64 bits para cada modem; por exemplo, hash de um dos números IMEI, gerando aleatoriamente números de 64 bits etc. Depois que a ID de 64 bits for gerada, ela deverá persistir entre reinicializações e remoções/inserções do SIM cartão.

Códigos de status

Esse CID usa códigos de status genéricos (consulte Uso de códigos de status na Seção 9.4.5 do padrão USB MBIM público).

MBIM_CID_MS_DEVICE_CAPS_V2

Description

Esse CID recupera as informações de funcionalidade relacionadas a um executor. Como esse CID é uma extensão de MBIM_CID_DEVICE_CAPS, somente as alterações de MBIM_CID_DEVICE_CAPS conforme indicado na Seção 10.5.1 do padrão USB MBIM público são apresentadas aqui.

Esse CID continua sendo somente consulta e retornará uma estrutura de MBIM_MS_DEVICE_CAPS_INFO_V2 em resposta a MBIM_COMMAND_MSG com o serviço MBIM MSUUID_BASIC_CONNECT e a MBIM_CID_MS_DEVICE_CAPS_V2 CID.

Parâmetros

Operação Definir Consulta Notificação
Comando Não aplicável Não aplicável Não aplicável
Resposta Não aplicável MBIM_MS_DEVICE_CAPS_INFO_V2 Não aplicável

estruturas de dados

Consulta

O mesmo que a Seção 10.5.1.4 do padrão USB MBIM público.

Definir

Não aplicável.

Resposta

A estrutura de MBIM_DEVICE_CAPS_INFO_V2 a seguir deve ser usada no InformationBuffer. Em comparação com a estrutura de MBIM_CID_DEVICE_CAPS definida na seção 10.5.1 do padrão USB MBIM público, a estrutura a seguir tem um novo campo chamado DeviceIndex. A menos que indicado aqui, as descrições de campo na Tabela 10-14 do padrão USB MBIM público se aplicam aqui.

Deslocamento Tamanho Campo Type Descrição
0 4 DeviceType MBIM_DEVICE_TYPE
4 4 CellularClass MBIM_CELLULAR_CLASS
8 4 VoiceClass MBIM_VOICE_CLASS
12 4 SimClass MBIM_SIM_CLASS Para modems MBIM que dão suporte a esse CID, SimClass sempre será relatado como MBIMSimClassSimRemovable.
16 4 Dataclass MBIM_DATA_CLASS
20 4 SmsCaps MBIM_SMS_CAPS
24 4 ControlCaps MBIM_CTRL_CAPS
28 4 MaxSessions UINT32
32 4 CustomDataClassOffset OFFSET
36 4 CustomDataClassSize SIZE(0..22)
40 4 DeviceIdOffset OFFSET
44 4 DeviceIdSize SIZE(0..26)
48 4 FirmwareInfoOffset OFFSET
52 4 FirmwareInfoSize SIZE(0..60)
56 4 HardwareInfoOffset OFFSET
60 4 HardwareInfoSize SIZE(0..60)
64 4 ExecutorIndex UINT32 O índice do executor. Ele varia de 0 a n-1 , em que n é o número de instâncias MBB contidas no modem MBIM. Seu valor é sempre constante e independente da ordem de enumeração.
68 DataBuffer DATABUFFER O buffer de dados que contém os membros CustomDataClass, DeviceId, FirmwareInfo e HardwareInfo .

Códigos de status

Esse CID usa códigos de status genéricos (consulte Uso de códigos de status na Seção 9.4.5 do padrão USB MBIM público).

MBIM_CID_MS_DEVICE_SLOT_MAPPINGS

Description

Esse CID define ou retorna os mapeamentos de slot de dispositivo (em outras palavras, os mapeamentos executor-slot).

Consulta

O InformationBuffer no MBIM_COMMAND_MSG não é usado. MBIM_MS_DEVICE_SLOT_MAPPING_INFO é retornado no InformationBuffer de MBIM_COMMAND_DONE.

Definir

O InformationBuffer de MBIM_COMMAND_MSG contém MBIM_MS_DEVICE_SLOT_MAPPING_INFO. MBIM_MS_DEVICE_SLOT_MAPPING_INFO é retornado no InformationBuffer de MBIM_COMMAND_DONE. Independentemente de o CID de conjunto ter êxito ou falhar, o MBIM_MS_DEVICE_SLOT_MAPPING_INFO contido na resposta representa os mapeamentos de slot de dispositivo atuais.

Eventos não solicitados

Não aplicável.

Parâmetros

Operação Definir Consulta Notificação
Comando MBIM_MS_DEVICE_SLOT_MAPPING_INFO Não aplicável Não aplicável
Resposta MBIM_MS_DEVICE_SLOT_MAPPING_INFO MBIM_MS_DEVICE_SLOT_MAPPING_INFO Não aplicável

estruturas de dados

Consulta

O InformationBuffer será nulo e InformationBufferLength será zero.

Definir

A estrutura de MBIM_MS_DEVICE_SLOT_MAPPING_INFO a seguir deve ser usada no InformationBuffer.

Deslocamento Tamanho Campo Type Descrição
0 4 MapCount (MC) UINT32 Número de mapeamentos, que é sempre igual ao número de dispositivos/executores.
4 8 * MC SlotMapList OL_PAIR_LIST O par i-th desta lista, em que (0 <= i <= (MC-1)) registra o índice do slot que atualmente é mapeado para o i-th device/executor. O primeiro elemento no par é um campo de 4 bytes com o Deslocamento para o DataBuffer, calculado desde o início (deslocamento 0) dessa estrutura MBIM_MS_DEVICE_SLOT_MAPPINGS_INFO para um UINT32. O segundo elemento do par é um tamanho de 4 bytes do elemento de registro. Como o tipo do índice de slot é UINT32, o segundo elemento no par é sempre 4.
4 + (8 * MC) 4 * MC DataBuffer DATABUFFER O buffer de dados que contém SlotMapList. Como o tamanho do slot é de 4 bytes e MC é igual ao número de índices de slot, o tamanho total do DataBuffer é 4 * MC.
Resposta

O MBIM_MS_DEVICE_SLOT_MAPPING_INFO usado em Set também é usado no InformationBuffer for Response.

Códigos de status

Código de status Descrição
MBIM_STATUS_BUSY A operação falhou porque o dispositivo está ocupado. Na ausência de informações explícitas da função para limpar essa condição, o host pode usar ações subsequentes pela função (por exemplo, notificações ou conclusões de comando) como uma dica para repetir a operação com falha.
MBIM_STATUS_FAILURE A operação falhou (uma falha genérica).
MBIM_STATUS_VOICE_CALL_IN_PROGRESS A operação falhou porque uma chamada de voz está em andamento.
MBIM_STATUS_INVALID_PARAMETERS A operação falhou devido a parâmetros inválidos (por exemplo, números de slot fora do intervalo ou valores duplicados no mapeamento).

MBIM_CID_MS_SLOT_INFO_STATUS

Description

Esse CID recupera uma status agregada de alto nível de um slot UICC especificado e o cartão dentro dele (se houver). Ele também pode ser usado para entregar uma notificação não solicitada quando o status de um dos slots é alterado.

Consulta

O InformationBuffer de MBIM_COMMAND_MSG contém uma estrutura MBIM_MS_SLOT_INFO_REQ. O InformationBuffer da mensagem MBIM_COMMAND_DONE contém uma estrutura MBIM_MS_SLOT_INFO.

Definir

Não aplicável.

Eventos não solicitados

O InformationBuffer do Evento contém uma estrutura MBIM_MS_SLOT_INFO. A função envia esse evento caso o slot composto/cartão estado seja alterado.

Parâmetros

Operação Definir Consulta Notificação
Comando Não aplicável MBIM_MS_SLOT_INFO_REQ Não aplicável
Resposta Não aplicável MBIM_MS_SLOT_INFO MBIM_MS_SLOT_INFO

estruturas de dados

Consulta

A estrutura de MBIM_MS_SLOT_INFO_REQ a seguir deve ser usada no InformationBuffer.

Deslocamento Tamanho Campo Type Descrição
0 4 SlotIndex UINT32 O índice do slot a ser consultado.
Definir

Não aplicável.

Resposta

A estrutura de MBIM_MS_SLOT_INFO a seguir deve ser usada no InformationBuffer.

Deslocamento Tamanho Campo Type Descrição
0 4 SlotIndex UINT32 O índice do slot.
4 4 Estado MBIM_MS_UICC_SLOT_STATE O estado do slot e cartão (se aplicável).

A estrutura MBIM_MS_UICCSLOT_STATE a seguir descreve os possíveis estados do slot.

Estados Valor Descrição
UICCSlotStateUnknown 0 O modem ainda está em processo de inicialização para que o estado do slot sim não seja determinístico.
UICCSlotStateOffEmpty 1 O slot UICC está desligado e nenhuma cartão está presente. Uma implementação que não consegue determinar a presença de um cartão em um slot que é desligado relata seu estado como UICCSlotStateOff.
UICCSlotStateOff 2 O slot UICC está desligado.
UICCSlotStateEmpty 3 O slot UICC está vazio (não há cartão nele).
UICCSlotStateNotReady 4 O slot UICC está ocupado e ligado, mas o cartão dentro dele ainda não está pronto.
UICCSlotStateActive 5 O slot UICC está ocupado e o cartão dentro dele está pronto.
UICCSlotStateError 6 O slot UICC está ocupado e ligado, mas o cartão está em um estado de erro e não pode ser usado até que seja redefinido em seguida.
UICCSlotStateActiveEsim 7 O cartão no slot é um eSIM com um perfil ativo e está pronto para aceitar comandos.
UICCSlotStateActiveEsimNoProfiles 8 O cartão no slot é um eSIM sem perfis (ou sem perfis ativos) e está pronto para aceitar comandos.
MBIM_MS_UICCSLOT_STATE diretrizes de transição para dispositivos multi-sim

A conformidade com as transições corretas do estado do slot UICC garante que o sistema operacional manipule todas as alterações corretamente e exibe as notificações corretas do sistema para o usuário.

Para a notificação do sistema operacional inserida no SIM , o sistema operacional espera que o slot inserido (SIM2/Slot 1) seja selecionado e a transição de estado a seguir ocorra após a inserção de um SIM no slot físico (SIM1/Slot 0).

Valores possíveis de Slot 0 antes da inserção do SIM Valores possíveis do Slot 0 após a inserção do SIM
UICCSlotStateEmpty UICCSlotStateActive
UICCSlotStateOffEmpty
  • UICCSlotStateActiveEsim
  • UICCSlotStateActiveEsimNoProfile

Para a notificação do sistema operacional removida do SIM , o sistema operacional espera que o slot físico (SIM1/Slot 0) seja selecionado com um SIM inserido e a transição de estado a seguir ocorra após a remoção do SIM do slot físico (SIM1/Slot 0).

Valores possíveis de Slot 0 antes da remoção do SIM Valores possíveis do Slot 0 após a remoção do SIM
UICCSlotStateActive UICCSlotStateEmpty
  • UICCSlotStateActiveEsim
  • UICCSlotStateActiveEsimNoProfile
UICCSlotStateOffEmpty

Códigos de status

Esse CID usa códigos de status genéricos (consulte Uso de códigos de status na Seção 9.4.5 do padrão USB MBIM público).

Mapeamento não NDIS de CIDs MBIM por executor e por modem

A maioria dos CIDs do MBIM mapeia ou se relaciona com OIDs NDIS, mas há alguns comandos que são usados pelo driver de classe WMB do Windows que não têm um equivalente NDIS. Esta seção fornece clareza sobre se esses comandos são por modem ou por executor.

Por dispositivo ou por executor Nome do CID
Por dispositivo CID_MBIM_MSEMERGENCYMODE
CID_MBIM_MSHOSTSHUTDOWN
Por executor CID_MBIM_MSIPADDRESSINFO
CID_MBIM_MSNETWORKIDLEHINT
CID_MBIM_MULTICARRIER_CURRENT_CID_LIST

Dual SIM Single Active

O DSSA (dual SIM single active) é a única forma de operação multi-SIM com suporte total no Windows 10. A DSSA permite que dois cartões SIM sejam usados com o modem, com a restrição de que apenas um SIM possa estar ativo a qualquer momento.

Arquitetura/fluxo

Diagrama que mostra o fluxo DSSA.

Comportamento do comutador de slot

Se houver suporte para DSSA no dispositivo, haverá alguns cenários em que a opção de slot é executada automaticamente ou solicitada pelo usuário por meio de notificação do sistema.

OOBE (Experiência Pronta para Uso)

  • Durante o OOBE, o WwanSvc pode executar um remapeamento de slot com base no estado do slot físico. Se o slot físico estiver vazio, o slot inserido será selecionado. Se o slot físico tiver um SIM, o slot físico será selecionado.

Remoção do SIM

  • Se o SIM for removido do slot físico e o slot físico for o slot selecionado no momento, um sistema será exibido perguntando ao usuário se ele deseja alternar para o slot inserido.
  • Se o usuário selecionar "Sim", o slot será alternado.

Fluxograma ilustrando o processo de remoção do SIM.

Inserção do SIM

  • Se a opção automática estiver habilitada por meio de regkey:
    • Se o SIM for inserido no slot físico enquanto o slot selecionado estiver inserido, o slot será alternado automaticamente para o slot físico e um sistema será exibido informando o usuário sobre a opção.
    • O sistema tem um botão que abre a página de configurações.
  • Se o comutador automático estiver desabilitado por meio de regkey
    • Se o SIM for inserido no slot físico enquanto o slot selecionado estiver inserido, um sistema será exibido perguntando se o usuário deseja alternar para o slot físico.
    • Se o usuário selecionar "Sim", o slot será alternado.

Use essa chave do Registro para configurar o comutador automático. Ele não existe por padrão.

Localização: HKLM\Software\Microsoft\Cellular\MVSettings\DeviceSpecific\CellUX
Chave: EnableAutoSlotSwitch
Tipo: REG_DWORD
Valor: 1 | 0 (padrão, desabilitado)

Fluxograma ilustrando o processo de inserção do SIM.

Testes do HLK (Hardware Lab Kit)

Consulte Etapas para instalar o HLK.

No HLK Studio, conecte-se ao driver de modem celular do dispositivo e execute o teste: Win6_4.MB. GSM. Data.TestSlot. Este teste contém os quatro testes a seguir:

Nome do teste Descrição
QuerySlotMapping Esse teste verifica se o teste pode consultar com êxito o mapeamento de slot de desenvolvimento.
SetSlotMapping Esse teste verifica se o teste pode definir com êxito o mapeamento de slot do dispositivo.
QuerySlotInfo Esse teste verifica se o teste pode consultar com êxito as informações do slot do dispositivo.
ValidateSlotInfoState Esse teste valida o estado do Slot UICC em relação a ReadyInfoState.

Como alternativa, você pode executar a lista de testes do TestSlot HLK por netsh-mbn e netsh-mbn-test-installation.

netsh mbn test feature=dssa testpath="C:\data\test\bin" taefpath="C:\data\test\bin" param="AccessString=internet"

Esse arquivo que mostra os resultados do teste HLK deveria ter sido gerado no diretório do qual o comando 'netsh mbn test' foi executado em: TestSlot.htm.

Análise de Log

  1. Os logs podem ser coletados e decodificados usando estas instruções: MB Coletando logs
  2. Abra o arquivo .txt no TextAnalysisTool
  3. Carregar o filtro DSSA

Aqui está um log de exemplo para consultar e definir mapeamentos de slot:

  1619 [5]6C6C.0824::01/09/2020-10:57:17.118 [WwanDimCommon]QUERY OID_WWAN_DEVICE_CAPS_EX (e01012e), RequestId 11, Status 340001
  1673 [5]6C6C.0824::01/09/2020-10:57:17.118 [WwanDimCommon]QUERY OID_WWAN_SYS_CAPS (e01012d), RequestId 21, Status 340001
  2488 [5]6C6C.2738::01/09/2020-10:57:17.120 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_CAPS_EX (0x4004103f)
  2520 [5]6C6C.2738::01/09/2020-10:57:17.120 [WwanDimCommon]    SSERVICE_CAPS_MULTI_SIM     : Supported
  2669 [2]6C6C.2738::01/09/2020-10:57:17.121 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SYS_CAPS_INFO (0x4004102c)
  2679 [2]6C6C.2738::01/09/2020-10:57:17.121 [WwanDimCommon]    NumberOfExecutors 0x1
  2680 [2]6C6C.2738::01/09/2020-10:57:17.121 [WwanDimCommon]    NumberOfSlots 0x2
  3497 [5]6C6C.0824::01/09/2020-10:57:17.125 [WwanDimCommon]QUERY OID_WWAN_SLOT_INFO_STATUS (e010130), RequestId 42, Status 340001
  3502 [5]6C6C.0824::01/09/2020-10:57:17.125 [WwanDimCommon]    Slot Index    : 0
  3531 [5]6C6C.0824::01/09/2020-10:57:17.126 [WwanDimCommon]QUERY OID_WWAN_SLOT_INFO_STATUS (e010130), RequestId 32, Status 340001
  3536 [5]6C6C.0824::01/09/2020-10:57:17.126 [WwanDimCommon]    Slot Index    : 1
  6356 [4]6C6C.2738::01/09/2020-10:57:17.133 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  6890 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  6912 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  6926 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
  6934 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    SlotIndex     : 0x0
  6935 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActive (0x5)
  6955 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  7060 [7]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  7100 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
  7108 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    SlotIndex     : 0x1
  7109 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActiveEsimNoProfile (0x8)
  7140 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  7177 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  8424 [4]6C6C.2738::01/09/2020-10:57:17.137 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
 10616 [6]6C6C.2738::01/09/2020-10:57:17.145 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
 12731 [4]6C6C.2738::01/09/2020-10:57:17.149 [WwanDimCommon]QUERY OID_WWAN_SYS_SLOTMAPPINGS (e01012f), RequestId 1e1, Status 340001
 12991 [2]6C6C.2738::01/09/2020-10:57:17.150 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_SLOT_MAPPING_INFO (0x4004102d)
 13003 [2]6C6C.2738::01/09/2020-10:57:17.150 [WwanDimCommon]        Executor Index 0 is mapped to Uicc Slot Index 0
123489 [4]6C6C.2738::01/09/2020-10:57:24.048 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128251 [2]6C6C.2738::01/09/2020-10:57:24.064 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128317 [2]6C6C.2738::01/09/2020-10:57:24.064 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128407 [7]6C6C.2738::01/09/2020-10:57:24.064 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128445 [7]6C6C.2738::01/09/2020-10:57:24.065 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
129265 [5]6C6C.2738::01/09/2020-10:57:24.067 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
129292 [5]6C6C.2738::01/09/2020-10:57:24.067 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
130122 [7]6C6C.2738::01/09/2020-10:57:24.069 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
155583 [2]6C6C.2738::01/09/2020-10:57:26.637 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
159010 [7]6C6C.2738::01/09/2020-10:57:26.644 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
159034 [7]6C6C.2738::01/09/2020-10:57:26.644 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
161963 [7]6C6C.2738::01/09/2020-10:57:26.655 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
161986 [7]6C6C.2738::01/09/2020-10:57:26.655 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162110 [2]6C6C.2738::01/09/2020-10:57:26.655 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162355 [4]6C6C.2738::01/09/2020-10:57:26.656 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162381 [6]6C6C.2738::01/09/2020-10:57:26.656 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162441 [4]6C6C.2738::01/09/2020-10:57:26.656 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
194294 [6]6C6C.2738::01/09/2020-10:57:28.722 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200029 [0]6C6C.2738::01/09/2020-10:57:28.738 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200131 [4]6C6C.2738::01/09/2020-10:57:28.738 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200354 [7]6C6C.2738::01/09/2020-10:57:28.739 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200671 [6]6C6C.2738::01/09/2020-10:57:28.739 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200729 [7]6C6C.2738::01/09/2020-10:57:28.739 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200864 [1]6C6C.2738::01/09/2020-10:57:28.740 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
201464 [0]6C6C.2738::01/09/2020-10:57:28.741 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
265128 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]SET OID_WWAN_SYS_SLOTMAPPINGS (e01012f), RequestId a6, Len 10, Status 340001
265133 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]    SlotMapListHeader.ElementType    : 0xe
265134 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]    SlotMapListHeader.ElementCount    : 0x1
265135 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]    Executor Index 0 is mapped to Uicc Slot Index 1
265523 [6]6C6C.2738::01/09/2020-10:57:32.152 [WwanDimCommon]    ReadyState     : WwanReadyStateOff (0x0)
270760 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_SLOT_MAPPING_INFO (0x4004102d)
270770 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]        Executor Index 0 is mapped to Uicc Slot Index 1
270799 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
270807 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    SlotIndex     : 0x0
270808 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateEmpty (0x3)
270827 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    ReadyState     : WwanReadyStateFailure (0x4)
271044 [5]6C6C.2738::01/09/2020-10:57:32.172 [WwanDimCommon]    ReadyState     : WwanReadyStateFailure (0x4)
271089 [5]6C6C.2738::01/09/2020-10:57:32.172 [WwanDimCommon]    ReadyState     : WwanReadyStateFailure (0x4)
271130 [5]6C6C.2738::01/09/2020-10:57:32.172 [WwanDimCommon]    ReadyState     : WwanReadyStateSimNotInserted (0x2)
274729 [7]6C6C.2738::01/09/2020-10:57:32.188 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
283027 [6]6C6C.2738::01/09/2020-10:57:32.211 [WwanDimCommon]    ReadyState     : WwanReadyStateSimNotInserted (0x2)
323130 [5]6C6C.2738::01/09/2020-10:57:32.352 [WwanDimCommon]    ReadyState     : WwanReadyStateNoEsimProfile (0x7)
403200 [0]6C6C.2738::01/09/2020-10:57:33.748 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
403208 [0]6C6C.2738::01/09/2020-10:57:33.748 [WwanDimCommon]    SlotIndex     : 0x0
403209 [0]6C6C.2738::01/09/2020-10:57:33.748 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActive (0x5)
407008 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]SET OID_WWAN_SYS_SLOTMAPPINGS (e01012f), RequestId 18f, Len 10, Status 340001
407015 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]    SlotMapListHeader.ElementType    : 0xe
407017 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]    SlotMapListHeader.ElementCount    : 0x1
407018 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]    Executor Index 0 is mapped to Uicc Slot Index 0
407079 [4]6C6C.2738::01/09/2020-10:57:40.355 [WwanDimCommon]    ReadyState     : WwanReadyStateOff (0x0)
409570 [2]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_SLOT_MAPPING_INFO (0x4004102d)
409580 [2]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]        Executor Index 0 is mapped to Uicc Slot Index 0
409591 [5]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
409600 [5]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    SlotIndex     : 0x1
409601 [5]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateEmpty (0x3)
411302 [7]6C6C.2738::01/09/2020-10:57:40.385 [WwanDimCommon]    ReadyState     : WwanReadyStateSimNotInserted (0x2)
416851 [4]6C6C.2738::01/09/2020-10:57:40.510 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
416859 [4]6C6C.2738::01/09/2020-10:57:40.510 [WwanDimCommon]    SlotIndex     : 0x1
416860 [4]6C6C.2738::01/09/2020-10:57:40.510 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActiveEsimNoProfile (0x8)
418613 [0]6C6C.2738::01/09/2020-10:57:42.632 [WwanDimCommon]    ReadyState     : WwanReadyStateOff (0x0)
434410 [4]6C6C.2738::01/09/2020-10:57:44.558 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
443914 [7]6C6C.2738::01/09/2020-10:57:44.593 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
529138 [4]6C6C.2738::01/09/2020-10:57:45.270 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)