windows网络适配器驱动开发-编写 MBBCx 客户端驱动程序(中)

📅 2026/7/21 8:22:14 👁️ 阅读次数 📝 编程学习
windows网络适配器驱动开发-编写 MBBCx 客户端驱动程序(中)
为 PDP 上下文/EPS 载体创建 NetAdapter 接口

在建立数据会话之前,MBBCx 将指示客户端驱动程序创建 NETADAPTER 对象,MBBCx 将使用它来表示激活的数据会话的网络接口。 这是通过 MBBCx 调用客户端驱动程序的 EvtMbbDeviceCreateAdapter 回调函数来实现的。

在 EvtMbbDeviceCreateAdapter 回调函数的实现中,MBBCx 客户端驱动程序必须首先执行与任何 NetAdapterCx 客户端驱动程序创建 NETADAPTER 对象所需的相同任务。 此外,它还必须执行以下附加任务:

  • 在 NetAdapterCreate 创建的 NETADAPTER 对象上调用 MbbAdapterInitialize。
  • 调用 MbbAdapterinitialize 后,调用 MbbAdapterGetSessionId 以检索 MBBCx 打算使用此 NETADAPTER 对象的数据会话 ID。 例如,如果返回的值为 0,则表示 MBBCx 会将此 NETADAPTER 接口用于由主 PDP 上下文/默认 EPS 持有者建立的数据会话。
  • 建议 MBBCx 客户端驱动程序在创建的 NETADAPTER 对象和返回的 SessionId 之间保留内部映射。 这有助于跟踪数据会话到 NETADAPTER 对象的关系,当激活多个 PDP 上下文/EPS 载体时尤其有用。
  • 在从 EvtMbbDeviceCreateAdapter返回之前,客户端驱动程序必须通过调用 NetAdapterStart来启动适配器。
  • 还可以通过在 调用 NetAdapterStart之前调用其中一个或多个函数来设置适配器的功能:
NetAdapterSetDatapathCapabilities NetAdapterSetLinkLayerCapabilities NetAdapterSetLinkLayerMtuSize

MBBCx 至少调用此回调函数一次,因此主 PDP 上下文/默认 EPS 载体始终有一个 NETADPATER 对象。 如果激活了多个 PDP 上下文/EPS 载体,MBBCx 可能会多次调用此回调函数,每次建立数据会话时调用一次。 NETADAPTER 对象和数据会话表示的网络接口之间必须存在一对一关系,如下图所示。

以下示例演示如何为数据会话创建 NETADAPTER 对象。 请注意,为简洁和清晰起见,设置适配器功能所需的错误处理和代码已省略。

NTSTATUS EvtMbbDeviceCreateAdapter( WDFDEVICE Device, PNETADAPTER_INIT AdapterInit ) { // Get the client driver defined per-device context PMY_DEVICE_CONTEXT deviceContext = MyGetDeviceContext(Device); // Set up the client driver defined per-adapter context WDF_OBJECT_ATTRIBUTES adapterAttributes; WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, MY_NETADAPTER_CONTEXT); // Create the NETADAPTER object NETADAPTER netAdapter; NTSTATUS status = NetAdapterCreate(AdapterInit, &adapterAttributes, &netAdapter); // Initialize the adapter for MBB status = MbbAdapterInitialize(netAdapter); // Retrieve the Session ID and use an array to store // the session <-> NETADAPTER object mapping ULONG sessionId; PMY_NETADAPTER_CONTEXT netAdapterContext = MyGetNetAdapterContext(netAdapter); netAdapterContext->NetAdapter = netAdapter; sessionId = MbbAdapterGetSessionId(netAdapter); netAdapterContext->SessionId = sessionId; deviceContext->Sessions[sessionId].NetAdapterContext = netAdapterContext; // // Optional: set adapter capabilities // ... NetAdapterSetDatapathCapabilities(netAdapter, &txCapabilities, &rxCapabilities); ... NetAdapterSetLinkLayerCapabilities(netAdapter, &linkLayerCapabilities); ... NetAdapterSetLinkLayerMtuSize(netAdapter, MY_MAX_PACKET_SIZE - ETHERNET_HEADER_LENGTH); // // Required: start the adapter // status = NetAdapterStart(netAdapter); return status; }

MBBCx 保证在使用相同会话 ID 请求 MBIM_CID_CONNECT 之前调用 EvtMbbDeviceCreateAdapter。 下列流程图显示了客户端驱动程序与类扩展在创建 NETADAPTER 对象时的交互。

当 EvtDevicePrepareHardware 成功完成时,MBBCx 将启动创建用于主 PDP 上下文/默认 EPS 承载的 NETADAPTER 对象的流程。

每当应用程序请求按需连接时, WwanSvc 就会触发用于为辅助 PDP 上下文/专用 EPS 持有者创建 NETADAPTER 对象的流。