在MNP中有很多的VLAN介绍,MNP存在的一个重要原因也是为了处理VLAN,而本文介绍的NetworkPkg\VlanConfigDxe\VlanConfigDxe.inf其实只是一个帮助模块,真正的VLAN配置还是在MNP中。
VLAN同样是一个UEFI Driver Model,所以会安装EFI_DRIVER_BINDING_PROTOCOL
,其实现如下:
EFI_DRIVER_BINDING_PROTOCOL gVlanConfigDriverBinding = {
VlanConfigDriverBindingSupported,
VlanConfigDriverBindingStart,
VlanConfigDriverBindingStop,
0xa,
NULL,
NULL
};
所以先介绍它的Supported函数和Start函数。
VLAN依赖于MNP,所以它的Supported函数中会检测是否安装了配置VLAN的接口,其实现相当简单:
EFI_STATUS
EFIAPI
VlanConfigDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
)
{
Status = gBS->OpenProtocol (
ControllerHandle,
&gEfiVlanConfigProtocolGuid,
(VOID **)&VlanConfig,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
}
需要注意gEfiVlanConfigProtocolGuid
并不是一定在MNP中安装的,也可以由网卡驱动本身安装。
Start函数中主要完成两件事情:
typedef struct {
UINTN Signature;
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
EFI_HII_HANDLE HiiHandle;
EFI_HANDLE DriverHandle;
EFI_DEVICE_PATH_PROTOCOL *ChildDevicePath;
EFI_HANDLE ControllerHandle;
EFI_HANDLE ImageHandle;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
CHAR16 *MacString;
UINT16 NumberOfVlan;
UINT16 VlanId[MAX_VLAN_NUMBER];
} VLAN_CONFIG_PRIVATE_DATA;
由于VLAN模块中的重点其实是UI配置的内容,这里不详细展开。
不过需要注意的一点是如果原本没有VLAN配置(更准确的说法是只有0/0的配置),然后在这里配置了一个VLAN,则原本那个会被删除,只留下一个配置了的VLAN对应的MNP服务,所以如果想要存在ID是0,优先级是0的配置,则这里需要显式地创建。