【UEFI基础】EDK网络框架(MTFTP4)

MTFTP4

在TCP/IP网络协议族中有FTP协议,但是UEFI下的MTFTP4并不是对FTP协议的实现,两者虽然功能上差不多,但是实现却是不同的。FTP下层使用TCP来连接:

在这里插入图片描述

而MTFTP4下层却是UDP4。

MTFTP4代码综述

MTFTP4的实现在NetworkPkg\Mtftp4Dxe\Mtftp4Dxe.inf,这里首先需要看下它的入口:

EFI_STATUS
EFIAPI
Mtftp4DriverEntryPoint (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
   
  return EfiLibInstallDriverBindingComponentName2 (
           ImageHandle,
           SystemTable,
           &gMtftp4DriverBinding,
           ImageHandle,
           &gMtftp4ComponentName,
           &gMtftp4ComponentName2
           );
}

仅仅是安装了EFI_DRIVER_BINDING_PROTOCOL

EFI_DRIVER_BINDING_PROTOCOL  gMtftp4DriverBinding = {
   
  Mtftp4DriverBindingSupported,
  Mtftp4DriverBindingStart,
  Mtftp4DriverBindingStop,
  0xa,
  NULL,
  NULL
};

DHCP4在UEFI网络协议栈中的关系图:

支持
提供
支持
支持
提供
支持
提供
提供
提供
支持
提供
提供
支持
支持
提供
提供
提供
支持
提供
提供
gEfiPciIoProtocolGuid
UNDI
gEfiNetworkInterfaceIdentifierProtocolGuid_31
gEfiDevicePathProtocolGuid
SNP
gEfiSimpleNetworkProtocolGuid
MNP
gEfiVlanConfigProtocolGuid
gEfiManagedNetworkServiceBindingProtocolGuid
gEfiManagedNetworkProtocolGuid
ARP
gEfiArpServiceBindingProtocolGuid
gEfiArpProtocolGuid
IP4
gEfiIp4ServiceBindingProtocolGuid
gEfiIp4Config2ProtocolGuid
gEfiIp4ProtocolGuid
DHCP4
gEfiMtftp4ServiceBindingProtocolGuid
gEfiMtftp4ProtocolGuid

它跟DNS4DHCP4的结构基本一致。

Mtftp4DriverBindingSupported

前面已经说过,MTFTP4依赖于UDP4

EFI_STATUS
EFIAPI
Mtftp4DriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   Controller,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
  )
{
   
  Status = gBS->OpenProtocol (
                  Controller,
                  &gEfiUdp4ServiceBindingProtocolGuid,
                  NULL,
                  This->DriverBindingHandle,
                  Controller,
                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
                  );
}

Mtftp4DriverBindingStart

Start函数的流程大致如下:

  1. 初始化MTFTP4_SERVICE
  2. 安装gEfiMtftp4ServiceBindingProtocolGuid

MTFTP4_SERVICE

MTFTP4_SERVICE在Start函数中创建:

EFI_STATUS
EFIAPI
Mtftp4DriverBindingStart (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   Controller,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
  )
{
   
  Status = Mtftp4CreateService (Controller, This->DriverBindingHandle, &MtftpSb);
}

其结构体如下:

struct _MTFTP4_SERVICE {
   
  UINT32                       Signature;
  EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;

  UINT16                       ChildrenNum;
  LIST_ENTRY                   Children;

  EFI_EVENT                    Timer;            ///< Ticking timer for all the MTFTP clients to handle the packet timeout case.
  EFI_EVENT                    TimerNotifyLevel; ///< Ticking timer for all the MTFTP clients to calculate the packet live time.
  EFI_EVENT                    TimerToGetMap;

  EFI_HANDLE                   Controller;
  EFI_HANDLE                   Image;

  //
  // This UDP child is used to keep the connection between the UDP
  // and MTFTP, so MTFTP will be notified when UDP is uninstalled.
  //
  UDP_IO                       *ConnectUdp;
};

这里的成员都比较简单,重点是如下的几个:

  • TimerTimerNotifyLevelTimerToGetMap:几个不同作用的定时器,在注释中已经有说明。
  • ConnectUdp:与UDP4相关的结构体。

代码示例

MTFTP4的一个示例就是tftp命令,它位于ShellPkg\DynamicCommand\TftpDynamicCommand\TftpDynamicCommand.inf,其主要实现在RunTftp(),它包含以下的几个部分:

  1. 获取参数,包括网口、下载的文件名,等等。需要注意的是-s 的blksize和-w指定的windowsize,它们会被Mtftp4Token的选项值传递给服务器端,它们会影响到数据传输的速度。
  2. 获取EFI_MTFTP4_PROTOCOL,使用其Configure成员函数进行配置。
  3. 获取文件大小。
  4. 下载文件。

具体的实现可以直接看代码,这里不再介绍。

相关推荐

  1. UEFI基础EDK网络框架(PXE)

    2024-01-23 05:28:01       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-23 05:28:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-23 05:28:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-23 05:28:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-23 05:28:01       20 阅读

热门阅读

  1. RSI的c#计算,同花顺

    2024-01-23 05:28:01       26 阅读
  2. QT中QApplication对象有且只有一个

    2024-01-23 05:28:01       37 阅读
  3. git commit 描述如何修改

    2024-01-23 05:28:01       39 阅读
  4. 扑克牌排序

    2024-01-23 05:28:01       36 阅读
  5. 说说Python中的浅拷贝和深拷贝

    2024-01-23 05:28:01       41 阅读
  6. docker 部署postgres 、geoserver

    2024-01-23 05:28:01       32 阅读
  7. 所以说为什么面试两百家到手offer却只有个位数

    2024-01-23 05:28:01       33 阅读
  8. Vue关于router-link的使用和部分代码

    2024-01-23 05:28:01       30 阅读
  9. MySQL存储过程与触发器

    2024-01-23 05:28:01       31 阅读
  10. C++入门

    C++入门

    2024-01-23 05:28:01      34 阅读