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 NetAdapterSetLinkLayerMtuSizeMBBCx 至少调用此回调函数一次因此主 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 对象的流。