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的配置,则这里需要显式地创建。