VLAN
VLAN代码综述
在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函数。
VlanConfigDriverBindingSupported
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中安装的,也可以由网卡驱动本身安装。
VlanConfigDriverBindingStart
Start函数中主要完成两件事情:
- 创建VLAN结构体:
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配置界面,最终可以在Setup下找到VLAN的配置界面,如下所示:
由于VLAN模块中的重点其实是UI配置的内容,这里不详细展开。
不过需要注意的一点是如果原本没有VLAN配置(更准确的说法是只有0/0的配置),然后在这里配置了一个VLAN,则原本那个会被删除,只留下一个配置了的VLAN对应的MNP服务,所以如果想要存在ID是0,优先级是0的配置,则这里需要显式地创建。