* [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. @ 2018-10-30 7:33 Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF Fu Siyuan ` (8 more replies) 0 siblings, 9 replies; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel This patch series is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe drivers in MdeModulePkg. These drivers will not be maintained and can't co-work with the dual-stack drivers in NetworkPkg. People should use below NetworkPkg drivers instead: NetworkPkg/IScsiDxe/IScsiDxe.inf NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf These drivers are actively maintained with more bug fixes and new feature support. Patch 1~5 update edk2 platform DSC/FDF files to use NetworkPkg drivers. Patch 6 deletes the TCP,PXE,iSCSI driver in MdeModulePkg. Patch 7 removes some clarification in NetworkPkg drivers since the related driver has been deleted in Patch 6. Fu Siyuan (7): Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. .../Network/IScsiDxe/ComponentName.c | 283 -- .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ------- .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 --- .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 ---- .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 --- .../Network/IScsiDxe/IScsiInitiatorName.c | 116 - .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------- .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 --- MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 -- .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ------- .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------ .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---- .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --------- .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 -- .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ------- .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- .../Network/UefiPxeBcDxe/ComponentName.c | 365 -- .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ----------- .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---- .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 ----------------- .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- ArmVirtPkg/ArmVirtQemu.dsc | 10 +- ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +- ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +- EmulatorPkg/EmulatorPkg.dsc | 2 +- EmulatorPkg/EmulatorPkg.fdf | 2 +- MdeModulePkg/MdeModulePkg.dsc | 3 - .../Network/IScsiDxe/ComponentName.h | 165 - .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 - .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 - .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 - .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 - .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 - .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 - .../Network/IScsiDxe/IScsiInitiatorName.h | 74 - .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 -- .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------ .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 - .../Universal/Network/Tcp4Dxe/Socket.h | 954 ------ .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 -- .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 -- .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --- .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 - NetworkPkg/TcpDxe/TcpDxe.inf | 6 - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 - Nt32Pkg/Nt32Pkg.dsc | 12 +- Nt32Pkg/Nt32Pkg.fdf | 12 +- OvmfPkg/OvmfPkgIa32.dsc | 12 +- OvmfPkg/OvmfPkgIa32.fdf | 10 +- OvmfPkg/OvmfPkgIa32X64.dsc | 12 +- OvmfPkg/OvmfPkgIa32X64.fdf | 10 +- OvmfPkg/OvmfPkgX64.dsc | 12 +- OvmfPkg/OvmfPkgX64.fdf | 10 +- Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +- Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +- Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +- Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +- Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +- 90 files changed, 55 insertions(+), 32771 deletions(-) delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf -- 2.18.0.windows.1 ^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan @ 2018-10-30 7:33 ` Fu Siyuan 2018-10-30 7:57 ` Ni, Ruiyu 2018-10-30 7:33 ` [PATCH v1 2/7] EmulatorPkg: Replace obsoleted network drivers from " Fu Siyuan ` (7 subsequent siblings) 8 siblings, 1 reply; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel; +Cc: Ruiyu Ni, Hao Wu This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being actively maintained and will be removed from edk2 master soon. Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Hao Wu <hao.a.wu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- Nt32Pkg/Nt32Pkg.dsc | 12 ++++-------- Nt32Pkg/Nt32Pkg.fdf | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/Nt32Pkg/Nt32Pkg.dsc b/Nt32Pkg/Nt32Pkg.dsc index 58d9f8787dde..4293ca39fdec 100644 --- a/Nt32Pkg/Nt32Pkg.dsc +++ b/Nt32Pkg/Nt32Pkg.dsc @@ -4,7 +4,7 @@ # The Emulation Platform can be used to debug individual modules, prior to creating # a real platform. This also provides an example for how an DSC is created. # -# Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2015, Hewlett-Packard Development Company, L.P.<BR> # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> # @@ -468,20 +468,16 @@ [Components] MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf + NetworkPkg/IScsiDxe/IScsiDxe.inf Nt32Pkg/SnpNt32Dxe/SnpNt32Dxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif NetworkPkg/HttpBootDxe/HttpBootDxe.inf diff --git a/Nt32Pkg/Nt32Pkg.fdf b/Nt32Pkg/Nt32Pkg.fdf index db2719fd99df..65d9bf812b5b 100644 --- a/Nt32Pkg/Nt32Pkg.fdf +++ b/Nt32Pkg/Nt32Pkg.fdf @@ -1,7 +1,7 @@ ## @file # This is NT32 FDF file with UEFI HII features enabled # -# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> # # This program and the accompanying materials @@ -257,19 +257,15 @@ [FV.FvRecovery] INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf +INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf +INF NetworkPkg/TcpDxe/TcpDxe.inf +INF NetworkPkg/IScsiDxe/IScsiDxe.inf INF Nt32Pkg/SnpNt32Dxe/SnpNt32Dxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf -INF NetworkPkg/TcpDxe/TcpDxe.inf -INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf -INF NetworkPkg/IScsiDxe/IScsiDxe.inf -!else -INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf -INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf -INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif INF NetworkPkg/HttpBootDxe/HttpBootDxe.inf INF NetworkPkg/DnsDxe/DnsDxe.inf -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. 2018-10-30 7:33 ` [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF Fu Siyuan @ 2018-10-30 7:57 ` Ni, Ruiyu 0 siblings, 0 replies; 29+ messages in thread From: Ni, Ruiyu @ 2018-10-30 7:57 UTC (permalink / raw) To: Fu, Siyuan, edk2-devel@lists.01.org; +Cc: Wu, Hao A Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Thanks/Ray > -----Original Message----- > From: edk2-devel <edk2-devel-bounces@lists.01.org> On Behalf Of Fu > Siyuan > Sent: Tuesday, October 30, 2018 3:33 PM > To: edk2-devel@lists.01.org > Cc: Ni, Ruiyu <ruiyu.ni@intel.com>; Wu, Hao A <hao.a.wu@intel.com> > Subject: [edk2] [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers > from NT32 platform DSC/FDF. > > This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those > ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being > actively maintained and will be removed from edk2 master soon. > > Cc: Ruiyu Ni <ruiyu.ni@intel.com> > Cc: Hao Wu <hao.a.wu@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> > --- > Nt32Pkg/Nt32Pkg.dsc | 12 ++++-------- > Nt32Pkg/Nt32Pkg.fdf | 12 ++++-------- > 2 files changed, 8 insertions(+), 16 deletions(-) > > diff --git a/Nt32Pkg/Nt32Pkg.dsc b/Nt32Pkg/Nt32Pkg.dsc index > 58d9f8787dde..4293ca39fdec 100644 > --- a/Nt32Pkg/Nt32Pkg.dsc > +++ b/Nt32Pkg/Nt32Pkg.dsc > @@ -4,7 +4,7 @@ > # The Emulation Platform can be used to debug individual modules, prior to > creating > # a real platform. This also provides an example for how an DSC is created. > # > -# Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2006 - 2018, Intel Corporation. All rights > +reserved.<BR> > # Copyright (c) 2015, Hewlett-Packard Development Company, L.P.<BR> # > (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> # @@ - > 468,20 +468,16 @@ [Components] > MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf > MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf > MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf > + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > + NetworkPkg/TcpDxe/TcpDxe.inf > + NetworkPkg/IScsiDxe/IScsiDxe.inf > Nt32Pkg/SnpNt32Dxe/SnpNt32Dxe.inf > > !if $(NETWORK_IP6_ENABLE) == TRUE > NetworkPkg/Ip6Dxe/Ip6Dxe.inf > NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf > - NetworkPkg/TcpDxe/TcpDxe.inf > NetworkPkg/Udp6Dxe/Udp6Dxe.inf > NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf > - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > - NetworkPkg/IScsiDxe/IScsiDxe.inf > -!else > - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > !endif > > NetworkPkg/HttpBootDxe/HttpBootDxe.inf > diff --git a/Nt32Pkg/Nt32Pkg.fdf b/Nt32Pkg/Nt32Pkg.fdf index > db2719fd99df..65d9bf812b5b 100644 > --- a/Nt32Pkg/Nt32Pkg.fdf > +++ b/Nt32Pkg/Nt32Pkg.fdf > @@ -1,7 +1,7 @@ > ## @file > # This is NT32 FDF file with UEFI HII features enabled # -# Copyright (c) 2007 > - 2017, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2007 - 2018, Intel Corporation. All rights > +reserved.<BR> > # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> # > # This program and the accompanying materials > @@ -257,19 +257,15 @@ [FV.FvRecovery] > INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf > INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf > INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf > +INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > +INF NetworkPkg/TcpDxe/TcpDxe.inf > +INF NetworkPkg/IScsiDxe/IScsiDxe.inf > INF Nt32Pkg/SnpNt32Dxe/SnpNt32Dxe.inf > !if $(NETWORK_IP6_ENABLE) == TRUE > INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf > INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf > INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf > INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf > -INF NetworkPkg/TcpDxe/TcpDxe.inf > -INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > -INF NetworkPkg/IScsiDxe/IScsiDxe.inf > -!else > -INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > -INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > -INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > !endif > INF NetworkPkg/HttpBootDxe/HttpBootDxe.inf > INF NetworkPkg/DnsDxe/DnsDxe.inf > -- > 2.18.0.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v1 2/7] EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF Fu Siyuan @ 2018-10-30 7:33 ` Fu Siyuan 2018-10-30 7:57 ` Ni, Ruiyu 2018-10-30 7:33 ` [PATCH v1 3/7] OvmfPkg: " Fu Siyuan ` (6 subsequent siblings) 8 siblings, 1 reply; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel; +Cc: Jordan Justen, Andrew Fish, Ruiyu Ni This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being actively maintained and will be removed from edk2 master soon. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Andrew Fish <afish@apple.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- EmulatorPkg/EmulatorPkg.dsc | 2 +- EmulatorPkg/EmulatorPkg.fdf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index c8c444fe1c89..3ddddbfb48b9 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -378,8 +378,8 @@ [Components] MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf diff --git a/EmulatorPkg/EmulatorPkg.fdf b/EmulatorPkg/EmulatorPkg.fdf index 5b5f81443dff..4595796d5185 100644 --- a/EmulatorPkg/EmulatorPkg.fdf +++ b/EmulatorPkg/EmulatorPkg.fdf @@ -203,7 +203,7 @@ [FV.FvRecovery] INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf -INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf +INF NetworkPkg/TcpDxe/TcpDxe.inf INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF FatPkg/EnhancedFatDxe/Fat.inf -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v1 2/7] EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. 2018-10-30 7:33 ` [PATCH v1 2/7] EmulatorPkg: Replace obsoleted network drivers from " Fu Siyuan @ 2018-10-30 7:57 ` Ni, Ruiyu 0 siblings, 0 replies; 29+ messages in thread From: Ni, Ruiyu @ 2018-10-30 7:57 UTC (permalink / raw) To: Fu, Siyuan, edk2-devel@lists.01.org; +Cc: Justen, Jordan L Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Thanks/Ray > -----Original Message----- > From: edk2-devel <edk2-devel-bounces@lists.01.org> On Behalf Of Fu > Siyuan > Sent: Tuesday, October 30, 2018 3:33 PM > To: edk2-devel@lists.01.org > Cc: Ni, Ruiyu <ruiyu.ni@intel.com>; Justen, Jordan L > <jordan.l.justen@intel.com> > Subject: [edk2] [PATCH v1 2/7] EmulatorPkg: Replace obsoleted network > drivers from platform DSC/FDF. > > This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those > ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being > actively maintained and will be removed from edk2 master soon. > > Cc: Jordan Justen <jordan.l.justen@intel.com> > Cc: Andrew Fish <afish@apple.com> > Cc: Ruiyu Ni <ruiyu.ni@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> > --- > EmulatorPkg/EmulatorPkg.dsc | 2 +- > EmulatorPkg/EmulatorPkg.fdf | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc > index c8c444fe1c89..3ddddbfb48b9 100644 > --- a/EmulatorPkg/EmulatorPkg.dsc > +++ b/EmulatorPkg/EmulatorPkg.dsc > @@ -378,8 +378,8 @@ [Components] > MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf > MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf > MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf > - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf > + NetworkPkg/TcpDxe/TcpDxe.inf > > MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf > MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf > diff --git a/EmulatorPkg/EmulatorPkg.fdf b/EmulatorPkg/EmulatorPkg.fdf > index 5b5f81443dff..4595796d5185 100644 > --- a/EmulatorPkg/EmulatorPkg.fdf > +++ b/EmulatorPkg/EmulatorPkg.fdf > @@ -203,7 +203,7 @@ [FV.FvRecovery] > INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf > INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf > INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf > -INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > +INF NetworkPkg/TcpDxe/TcpDxe.inf > INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf > > INF FatPkg/EnhancedFatDxe/Fat.inf > -- > 2.18.0.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v1 3/7] OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 2/7] EmulatorPkg: Replace obsoleted network drivers from " Fu Siyuan @ 2018-10-30 7:33 ` Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 4/7] Vlv2TbltDevicePkg: Replace obsoleted " Fu Siyuan ` (5 subsequent siblings) 8 siblings, 0 replies; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel Cc: Jordan Justen, Laszlo Ersek, Ard Biesheuvel, Anthony Perard, Julien Grall This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being actively maintained and will be removed from edk2 master soon. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Anthony Perard <anthony.perard@citrix.com> Cc: Julien Grall <julien.grall@linaro.org> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- OvmfPkg/OvmfPkgIa32.dsc | 12 ++++-------- OvmfPkg/OvmfPkgIa32.fdf | 10 +++------- OvmfPkg/OvmfPkgIa32X64.dsc | 12 ++++-------- OvmfPkg/OvmfPkgIa32X64.fdf | 10 +++------- OvmfPkg/OvmfPkgX64.dsc | 12 ++++-------- OvmfPkg/OvmfPkgX64.fdf | 10 +++------- 6 files changed, 21 insertions(+), 45 deletions(-) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 9f07e75050c0..bdd1169c58a2 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -790,18 +790,14 @@ [Components] MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf -!if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/Ip6Dxe/Ip6Dxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf NetworkPkg/TcpDxe/TcpDxe.inf + NetworkPkg/IScsiDxe/IScsiDxe.inf +!if $(NETWORK_IP6_ENABLE) == TRUE + NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE NetworkPkg/DnsDxe/DnsDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf index 52b8b1fea1fc..1bc2e73bde16 100644 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ b/OvmfPkg/OvmfPkgIa32.fdf @@ -309,18 +309,14 @@ [FV.DXEFV] INF MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + INF NetworkPkg/TcpDxe/TcpDxe.inf + INF NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE INF NetworkPkg/DnsDxe/DnsDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index a4eaeb808c6b..d4b09b38194d 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -799,18 +799,14 @@ [Components.X64] MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf -!if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/Ip6Dxe/Ip6Dxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf NetworkPkg/TcpDxe/TcpDxe.inf + NetworkPkg/IScsiDxe/IScsiDxe.inf +!if $(NETWORK_IP6_ENABLE) == TRUE + NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE NetworkPkg/DnsDxe/DnsDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 70845d6972fd..f36c7e741c8e 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -315,18 +315,14 @@ [FV.DXEFV] INF MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + INF NetworkPkg/TcpDxe/TcpDxe.inf + INF NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE INF NetworkPkg/DnsDxe/DnsDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index aa3efc5e73b9..667d9e5b7f59 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -797,18 +797,14 @@ [Components] MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf -!if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/Ip6Dxe/Ip6Dxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf NetworkPkg/TcpDxe/TcpDxe.inf + NetworkPkg/IScsiDxe/IScsiDxe.inf +!if $(NETWORK_IP6_ENABLE) == TRUE + NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE NetworkPkg/DnsDxe/DnsDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 1eb46ac9a2d8..a2785d7e2192 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -315,18 +315,14 @@ [FV.DXEFV] INF MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf + NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE INF NetworkPkg/DnsDxe/DnsDxe.inf -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v1 4/7] Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan ` (2 preceding siblings ...) 2018-10-30 7:33 ` [PATCH v1 3/7] OvmfPkg: " Fu Siyuan @ 2018-10-30 7:33 ` Fu Siyuan 2018-11-04 6:14 ` Wei, David 2018-10-30 7:33 ` [PATCH v1 5/7] ArmVirtPkg: Replace obsoleted network " Fu Siyuan ` (4 subsequent siblings) 8 siblings, 1 reply; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel; +Cc: David Wei, Mang Guo This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being actively maintained and will be removed from edk2 master soon. Cc: David Wei <david.wei@intel.com> Cc: Mang Guo <mang.guo@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +++----------- Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +++----------- Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +++--------------- Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +++--------------- Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +++--------------- 5 files changed, 15 insertions(+), 67 deletions(-) diff --git a/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Vlv2TbltDevicePkg/PlatformPkg.fdf index b7a0e584deeb..241314bed4e9 100644 --- a/Vlv2TbltDevicePkg/PlatformPkg.fdf +++ b/Vlv2TbltDevicePkg/PlatformPkg.fdf @@ -744,6 +744,9 @@ [FV.FVMAIN] INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf + INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + INF NetworkPkg/TcpDxe/TcpDxe.inf + INF NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf @@ -751,22 +754,11 @@ [FV.FVMAIN] INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf - !else - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - !endif !if $(NETWORK_VLAN_ENABLE) == TRUE INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf !endif !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif !endif !endif diff --git a/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf index eca273e33f88..356649277289 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf +++ b/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf @@ -700,6 +700,9 @@ [FV.FVMAIN] INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf + INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + INF NetworkPkg/TcpDxe/TcpDxe.inf + INF NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf @@ -707,22 +710,11 @@ [FV.FVMAIN] INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf - !else - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - !endif !if $(NETWORK_VLAN_ENABLE) == TRUE INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf !endif !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif !endif !endif diff --git a/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc index 3e3522aee908..322793257e0b 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc +++ b/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc @@ -1528,11 +1528,7 @@ [Components.X64] !if $(NETWORK_ENABLE) == TRUE !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif + NetworkPkg/IScsiDxe/IScsiDxe.inf !endif !if $(NETWORK_VLAN_ENABLE) == TRUE MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf @@ -1554,24 +1550,16 @@ [Components.X64] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf { - <PcdsPatchableInModule> - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 - } + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/IpSecDxe/IpSecDxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - !else - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - !endif !endif !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE) diff --git a/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc index 55c873d565a3..a0f31d824e4c 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc +++ b/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc @@ -1516,11 +1516,7 @@ [Components.IA32] !if $(NETWORK_ENABLE) == TRUE !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif + NetworkPkg/IScsiDxe/IScsiDxe.inf !endif !if $(NETWORK_VLAN_ENABLE) == TRUE MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf @@ -1542,24 +1538,16 @@ [Components.IA32] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf { - <PcdsPatchableInModule> - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 - } MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/IpSecDxe/IpSecDxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - !else - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - !endif !endif !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE) diff --git a/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Vlv2TbltDevicePkg/PlatformPkgX64.dsc index fa6aa6349167..54c3bd9b570e 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgX64.dsc +++ b/Vlv2TbltDevicePkg/PlatformPkgX64.dsc @@ -1528,11 +1528,7 @@ [Components.X64] !if $(NETWORK_ENABLE) == TRUE !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif + NetworkPkg/IScsiDxe/IScsiDxe.inf !endif !if $(NETWORK_VLAN_ENABLE) == TRUE MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf @@ -1554,24 +1550,16 @@ [Components.X64] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf { - <PcdsPatchableInModule> - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 - } + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/IpSecDxe/IpSecDxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - !else - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - !endif !endif !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE) -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v1 4/7] Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. 2018-10-30 7:33 ` [PATCH v1 4/7] Vlv2TbltDevicePkg: Replace obsoleted " Fu Siyuan @ 2018-11-04 6:14 ` Wei, David 0 siblings, 0 replies; 29+ messages in thread From: Wei, David @ 2018-11-04 6:14 UTC (permalink / raw) To: Fu, Siyuan, edk2-devel@lists.01.org Reviewed-by: zwei4 <david.wei@intel.com> Thanks, David Wei Intel SSG/STO/UEFI BIOS -----Original Message----- From: Fu, Siyuan Sent: Tuesday, October 30, 2018 3:33 PM To: edk2-devel@lists.01.org Cc: Wei, David <david.wei@intel.com>; Guo, Mang <mang.guo@intel.com> Subject: [PATCH v1 4/7] Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being actively maintained and will be removed from edk2 master soon. Cc: David Wei <david.wei@intel.com> Cc: Mang Guo <mang.guo@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +++----------- Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +++----------- Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +++--------------- Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +++--------------- Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +++--------------- 5 files changed, 15 insertions(+), 67 deletions(-) diff --git a/Vlv2TbltDevicePkg/PlatformPkg.fdf b/Vlv2TbltDevicePkg/PlatformPkg.fdf index b7a0e584deeb..241314bed4e9 100644 --- a/Vlv2TbltDevicePkg/PlatformPkg.fdf +++ b/Vlv2TbltDevicePkg/PlatformPkg.fdf @@ -744,6 +744,9 @@ [FV.FVMAIN] INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf + INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + INF NetworkPkg/TcpDxe/TcpDxe.inf + INF NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf @@ -751,22 +754,11 @@ [FV.FVMAIN] INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf - !else - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - !endif !if $(NETWORK_VLAN_ENABLE) == TRUE INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf !endif !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif !endif !endif diff --git a/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf b/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf index eca273e33f88..356649277289 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf +++ b/Vlv2TbltDevicePkg/PlatformPkgGcc.fdf @@ -700,6 +700,9 @@ [FV.FVMAIN] INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf INF MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf + INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + INF NetworkPkg/TcpDxe/TcpDxe.inf + INF NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf @@ -707,22 +710,11 @@ [FV.FVMAIN] INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf - !else - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - !endif !if $(NETWORK_VLAN_ENABLE) == TRUE INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf !endif !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif !endif !endif diff --git a/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc b/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc index 3e3522aee908..322793257e0b 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc +++ b/Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc @@ -1528,11 +1528,7 @@ [Components.X64] !if $(NETWORK_ENABLE) == TRUE !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif + NetworkPkg/IScsiDxe/IScsiDxe.inf !endif !if $(NETWORK_VLAN_ENABLE) == TRUE MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf @@ -1554,24 +1550,16 @@ [Components.X64] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf { - <PcdsPatchableInModule> - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 - } + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/IpSecDxe/IpSecDxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - !else - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - !endif !endif !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE) diff --git a/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc b/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc index 55c873d565a3..a0f31d824e4c 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc +++ b/Vlv2TbltDevicePkg/PlatformPkgIA32.dsc @@ -1516,11 +1516,7 @@ [Components.IA32] !if $(NETWORK_ENABLE) == TRUE !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif + NetworkPkg/IScsiDxe/IScsiDxe.inf !endif !if $(NETWORK_VLAN_ENABLE) == TRUE MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf @@ -1542,24 +1538,16 @@ [Components.IA32] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf { - <PcdsPatchableInModule> - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 - } MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/IpSecDxe/IpSecDxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - !else - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - !endif !endif !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE) diff --git a/Vlv2TbltDevicePkg/PlatformPkgX64.dsc b/Vlv2TbltDevicePkg/PlatformPkgX64.dsc index fa6aa6349167..54c3bd9b570e 100644 --- a/Vlv2TbltDevicePkg/PlatformPkgX64.dsc +++ b/Vlv2TbltDevicePkg/PlatformPkgX64.dsc @@ -1528,11 +1528,7 @@ [Components.X64] !if $(NETWORK_ENABLE) == TRUE !if $(NETWORK_ISCSI_ENABLE) == TRUE - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/IScsiDxe/IScsiDxe.inf - !else - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf - !endif + NetworkPkg/IScsiDxe/IScsiDxe.inf !endif !if $(NETWORK_VLAN_ENABLE) == TRUE MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf @@ -1554,24 +1550,16 @@ [Components.X64] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf { - <PcdsPatchableInModule> - gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 - } + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/IpSecDxe/IpSecDxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf !endif - !if $(NETWORK_IP6_ENABLE) == TRUE - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - !else - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - !endif !endif !if $(CAPSULE_ENABLE) || $(MICOCODE_CAPSULE_ENABLE) -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v1 5/7] ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan ` (3 preceding siblings ...) 2018-10-30 7:33 ` [PATCH v1 4/7] Vlv2TbltDevicePkg: Replace obsoleted " Fu Siyuan @ 2018-10-30 7:33 ` Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg Fu Siyuan ` (3 subsequent siblings) 8 siblings, 0 replies; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel; +Cc: Laszlo Ersek, Ard Biesheuvel, Julien Grall This patch replaces the MdeModulePkg TCP, PXE and iSCSI driver with those ones in NetworkPkg. These 3 drivers in MdeModulePkg are not being actively maintained and will be removed from edk2 master soon. Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Julien Grall <julien.grall@linaro.org> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- ArmVirtPkg/ArmVirtQemu.dsc | 10 +++------- ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +++------- ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +++------- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 885c6b14b844..b3f1b23e3890 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -346,18 +346,14 @@ [Components.common] MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE NetworkPkg/DnsDxe/DnsDxe.inf diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc index a6390bd4b841..3316f982695f 100644 --- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc @@ -126,18 +126,14 @@ [FV.FvMain] INF MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + INF NetworkPkg/IScsiDxe/IScsiDxe.inf + INF NetworkPkg/TcpDxe/TcpDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf - INF NetworkPkg/TcpDxe/TcpDxe.inf INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE INF NetworkPkg/DnsDxe/DnsDxe.inf diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 434d6861a56f..e3ed713cbb39 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -335,18 +335,14 @@ [Components.common] MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf + NetworkPkg/TcpDxe/TcpDxe.inf + NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf + NetworkPkg/IScsiDxe/IScsiDxe.inf !if $(NETWORK_IP6_ENABLE) == TRUE NetworkPkg/Ip6Dxe/Ip6Dxe.inf - NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/Udp6Dxe/Udp6Dxe.inf NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf - NetworkPkg/IScsiDxe/IScsiDxe.inf -!else - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf !endif !if $(HTTP_BOOT_ENABLE) == TRUE NetworkPkg/DnsDxe/DnsDxe.inf -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan ` (4 preceding siblings ...) 2018-10-30 7:33 ` [PATCH v1 5/7] ArmVirtPkg: Replace obsoleted network " Fu Siyuan @ 2018-10-30 7:33 ` Fu Siyuan 2018-10-31 8:23 ` Ni, Ruiyu 2018-11-01 3:08 ` Zeng, Star 2018-10-30 7:33 ` [PATCH v1 7/7] NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF Fu Siyuan ` (2 subsequent siblings) 8 siblings, 2 replies; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel; +Cc: Star Zeng, Jian J Wang, Jiaxin Wu This patch is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe drivers in MdeModulePkg. These drivers will not be maintained and can't co-work with the dual-stack drivers in NetworkPkg. People should use below NetworkPkg drivers instead: NetworkPkg/IScsiDxe/IScsiDxe.inf NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf These drivers are actively maintained with more bug fixes and new feature support. Cc: Star Zeng <star.zeng@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c | 283 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c | 1264 --------- MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c | 472 ---- MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c | 676 ----- MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c | 539 ---- MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c | 116 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------- MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c | 2799 ------------------ MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 ---- MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 --- MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c | 1201 -------- MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 ---------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 --- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 -------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c | 365 --- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ------------- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ----- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 -------------------- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- MdeModulePkg/MdeModulePkg.dsc | 3 - MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h | 165 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h | 22 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h | 166 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni | 62 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h | 140 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h | 38 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h | 168 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h | 74 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h | 317 --- MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------- MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h | 131 - MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h | 954 ------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 --- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 ---- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 --- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 ---- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - 69 files changed, 32598 deletions(-) diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c deleted file mode 100644 index 3f561e93439d..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c +++ /dev/null @@ -1,283 +0,0 @@ -/** @file - UEFI Component Name(2) protocol implementation for iSCSI. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = { - IScsiComponentNameGetDriverName, - IScsiComponentNameGetControllerName, - "eng" -}; - -// -// EFI Component Name 2 Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IScsiComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IScsiComponentNameGetControllerName, - "en" -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIScsiDriverNameTable[] = { - {"eng;en", L"iSCSI Driver"}, - {NULL, NULL} -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *mIScsiControllerNameTable = NULL; - -/** - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] Language A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - @param[out] DriverName A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER DriverName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mIScsiDriverNameTable, - DriverName, - (BOOLEAN)(This == &gIScsiComponentName) - ); -} - -/** - Update the component name for the iSCSI instance. - - @param[in] IScsiExtScsiPassThru A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - - @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully. - @retval EFI_INVALID_PARAMETER The input parameter is invalid. - @retval EFI_UNSUPPORTED Can't get the corresponding NIC info from the Controller handle. - -**/ -EFI_STATUS -UpdateName ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru - ) -{ - EFI_STATUS Status; - CHAR16 HandleName[150]; - ISCSI_DRIVER_DATA *Private; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 MacString[70]; - - if (IScsiExtScsiPassThru == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (IScsiExtScsiPassThru); - - // - // Get the mac string, it's the name of various variable - // - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize); - if (EFI_ERROR (Status)) { - return Status; - } - VlanId = NetLibGetVlanId (Private->Controller); - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString); - - UnicodeSPrint ( - HandleName, - sizeof (HandleName), - L"iSCSI IPv4 (MacString=%s)", - MacString - ); - - if (mIScsiControllerNameTable != NULL) { - FreeUnicodeStringTable (mIScsiControllerNameTable); - mIScsiControllerNameTable = NULL; - } - - Status = AddUnicodeString2 ( - "eng", - gIScsiComponentName.SupportedLanguages, - &mIScsiControllerNameTable, - HandleName, - TRUE - ); - if (EFI_ERROR (Status)) { - return Status; - } - - return AddUnicodeString2 ( - "en", - gIScsiComponentName2.SupportedLanguages, - &mIScsiControllerNameTable, - HandleName, - FALSE - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver.Currently not implemented. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] ControllerHandle The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - @param[in] ChildHandle The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - @param[in] Language A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - @param[out] ControllerName A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - - EFI_HANDLE IScsiController; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru; - - if (ControllerHandle == NULL) { - return EFI_UNSUPPORTED; - } - - // - // Get the handle of the controller we are controling. - // - IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid); - if (IScsiController == NULL) { - return EFI_UNSUPPORTED; - } - - Status = gBS->OpenProtocol ( - IScsiController, - &gEfiCallerIdGuid, - (VOID **)&IScsiIdentifier, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (ChildHandle != NULL) { - // - // Make sure this driver produced ChildHandle - // - Status = EfiTestChildHandle ( - ControllerHandle, - ChildHandle, - &gEfiTcp4ProtocolGuid - ); - if (!EFI_ERROR (Status)) { - // - // Retrieve an instance of a produced protocol from ChildHandle - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiExtScsiPassThruProtocolGuid, - (VOID **)&IScsiExtScsiPassThru, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Update the component name for this child handle. - // - Status = UpdateName (IScsiExtScsiPassThru); - if (EFI_ERROR (Status)) { - return Status; - } - } else { - return Status; - } - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mIScsiControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gIScsiComponentName) - ); -} - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c deleted file mode 100644 index 6307684ff05b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c +++ /dev/null @@ -1,430 +0,0 @@ -/** @file - This file is for Challenge-Handshake Authentication Protocol (CHAP) Configuration. - -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" -#include "Md5.h" - -/** - Initator calculates its own expected hash value. - - @param[in] ChapIdentifier iSCSI CHAP identifier sent by authenticator. - @param[in] ChapSecret iSCSI CHAP secret of the authenticator. - @param[in] SecretLength The length of iSCSI CHAP secret. - @param[in] ChapChallenge The challenge message sent by authenticator. - @param[in] ChallengeLength The length of iSCSI CHAP challenge message. - @param[out] ChapResponse The calculation of the expected hash value. - - @retval EFI_SUCCESS The expected hash value was calculatedly successfully. - @retval EFI_PROTOCOL_ERROR The length of the secret should be at least the - length of the hash value for the hashing algorithm chosen. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPCalculateResponse ( - IN UINT32 ChapIdentifier, - IN CHAR8 *ChapSecret, - IN UINT32 SecretLength, - IN UINT8 *ChapChallenge, - IN UINT32 ChallengeLength, - OUT UINT8 *ChapResponse - ) -{ - MD5_CTX Md5Ctx; - CHAR8 IdByte[1]; - EFI_STATUS Status; - - Status = MD5Init (&Md5Ctx); - - // - // Hash Identifier - Only calculate 1 byte data (RFC1994) - // - IdByte[0] = (CHAR8) ChapIdentifier; - MD5Update (&Md5Ctx, IdByte, 1); - - // - // Hash Secret - // - if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) { - return EFI_PROTOCOL_ERROR; - } - - MD5Update (&Md5Ctx, ChapSecret, SecretLength); - - // - // Hash Challenge received from Target - // - MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength); - - Status = MD5Final (&Md5Ctx, ChapResponse); - - return Status; -} - -/** - The initator checks the CHAP response replied by target against its own - calculation of the expected hash value. - - @param[in] AuthData iSCSI CHAP authentication data. - @param[in] TargetResponse The response from target. - - @retval EFI_SUCCESS The response from target passed authentication. - @retval EFI_SECURITY_VIOLATION The response from target was not expected value. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPAuthTarget ( - IN ISCSI_CHAP_AUTH_DATA *AuthData, - IN UINT8 *TargetResponse - ) -{ - EFI_STATUS Status; - UINT32 SecretSize; - UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN]; - - Status = EFI_SUCCESS; - - SecretSize = (UINT32) AsciiStrLen (AuthData->AuthConfig.ReverseCHAPSecret); - Status = IScsiCHAPCalculateResponse ( - AuthData->OutIdentifier, - AuthData->AuthConfig.ReverseCHAPSecret, - SecretSize, - AuthData->OutChallenge, - AuthData->OutChallengeLength, - VerifyRsp - ); - - if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) { - Status = EFI_SECURITY_VIOLATION; - } - - return Status; -} - -/** - This function checks the received iSCSI Login Response during the security - negotiation stage. - - @param[in] Conn The iSCSI connection. - - @retval EFI_SUCCESS The Login Response passed the CHAP validation. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPOnRspReceived ( - IN ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_CHAP_AUTH_DATA *AuthData; - CHAR8 *Value; - UINT8 *Data; - UINT32 Len; - LIST_ENTRY *KeyValueList; - UINTN Algorithm; - CHAR8 *Identifier; - CHAR8 *Challenge; - CHAR8 *Name; - CHAR8 *Response; - UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN]; - UINT32 RspLen; - - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); - ASSERT (Conn->RspQue.BufNum != 0); - - Session = Conn->Session; - AuthData = &Session->AuthData; - - Len = Conn->RspQue.BufSize; - Data = AllocatePool (Len); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - // - // Copy the data in case the data spans over multiple PDUs. - // - NetbufQueCopy (&Conn->RspQue, 0, Len, Data); - - // - // Build the key-value list from the data segment of the Login Response. - // - KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len); - if (KeyValueList == NULL) { - FreePool (Data); - return EFI_OUT_OF_RESOURCES; - } - - Status = EFI_PROTOCOL_ERROR; - - switch (Conn->CHAPStep) { - case ISCSI_CHAP_INITIAL: - // - // The first Login Response. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); - if (Value == NULL) { - goto ON_EXIT; - } - - Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn (Value); - - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_AUTH_METHOD); - if (Value == NULL) { - goto ON_EXIT; - } - // - // Initiator mandates CHAP authentication but target replies without "CHAP" or - // initiator suggets "None" but target replies with some kind of auth method. - // - if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) { - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { - goto ON_EXIT; - } - } else { - if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) { - goto ON_EXIT; - } - } - // - // Transit to CHAP step one. - // - Conn->CHAPStep = ISCSI_CHAP_STEP_ONE; - Status = EFI_SUCCESS; - break; - - case ISCSI_CHAP_STEP_TWO: - // - // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C> - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_ALGORITHM); - if (Value == NULL) { - goto ON_EXIT; - } - - Algorithm = AsciiStrDecimalToUintn (Value); - if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) { - // - // Unsupported algorithm is chosen by target. - // - goto ON_EXIT; - } - - Identifier = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_IDENTIFIER); - if (Identifier == NULL) { - goto ON_EXIT; - } - - Challenge = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_CHALLENGE); - if (Challenge == NULL) { - goto ON_EXIT; - } - // - // Process the CHAP identifier and CHAP Challenge from Target - // Calculate Response value - // - AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn (Identifier); - AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN; - IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData->InChallengeLength, Challenge); - Status = IScsiCHAPCalculateResponse ( - AuthData->InIdentifier, - AuthData->AuthConfig.CHAPSecret, - (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret), - AuthData->InChallenge, - AuthData->InChallengeLength, - AuthData->CHAPResponse - ); - - // - // Transit to next step. - // - Conn->CHAPStep = ISCSI_CHAP_STEP_THREE; - break; - - case ISCSI_CHAP_STEP_THREE: - // - // one way CHAP authentication and the target would like to - // authenticate us. - // - Status = EFI_SUCCESS; - break; - - case ISCSI_CHAP_STEP_FOUR: - ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL); - // - // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target. - // - Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME); - if (Name == NULL) { - goto ON_EXIT; - } - - Response = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_RESPONSE); - if (Response == NULL) { - goto ON_EXIT; - } - - RspLen = ISCSI_CHAP_RSP_LEN; - IScsiHexToBin (TargetRsp, &RspLen, Response); - - // - // Check the CHAP Response replied by Target. - // - Status = IScsiCHAPAuthTarget (AuthData, TargetRsp); - break; - - default: - break; - } - -ON_EXIT: - - IScsiFreeKeyValueList (KeyValueList); - - FreePool (Data); - - return Status; -} - -/** - This function fills the CHAP authentication information into the login PDU - during the security negotiation stage in the iSCSI connection login. - - @param[in] Conn The iSCSI connection. - @param[in, out] Pdu The PDU to send out. - - @retval EFI_SUCCESS All check passed and the phase-related CHAP - authentication info is filled into the iSCSI PDU. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. -**/ -EFI_STATUS -IScsiCHAPToSendReq ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_LOGIN_REQUEST *LoginReq; - ISCSI_CHAP_AUTH_DATA *AuthData; - CHAR8 *Value; - CHAR8 ValueStr[256]; - CHAR8 *Response; - UINT32 RspLen; - CHAR8 *Challenge; - UINT32 ChallengeLen; - - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); - - Session = Conn->Session; - AuthData = &Session->AuthData; - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0); - if (LoginReq == NULL) { - return EFI_PROTOCOL_ERROR; - } - Status = EFI_SUCCESS; - - RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3; - Response = AllocatePool (RspLen); - if (Response == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3; - Challenge = AllocatePool (ChallengeLen); - if (Challenge == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - switch (Conn->CHAPStep) { - case ISCSI_CHAP_INITIAL: - // - // It's the initial Login Request. Fill in the key=value pairs mandatory - // for the initial Login Request. - // - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session->InitiatorName); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session->ConfigData.NvData.TargetName); - - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { - Value = ISCSI_KEY_VALUE_NONE; - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - } else { - Value = ISCSI_AUTH_METHOD_CHAP; - } - - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value); - - break; - - case ISCSI_CHAP_STEP_ONE: - // - // First step, send the Login Request with CHAP_A=<A1,A2...> key-value pair. - // - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", ISCSI_CHAP_ALGORITHM_MD5); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr); - - Conn->CHAPStep = ISCSI_CHAP_STEP_TWO; - break; - - case ISCSI_CHAP_STEP_THREE: - // - // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or - // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target ahtentication is - // required too. - // - // CHAP_N=<N> - // - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) &AuthData->AuthConfig.CHAPName); - // - // CHAP_R=<R> - // - IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, ISCSI_CHAP_RSP_LEN, Response, &RspLen); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response); - - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) { - // - // CHAP_I=<I> - // - IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1); - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); - // - // CHAP_C=<C> - // - IScsiGenRandom ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN); - AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN; - IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge); - - Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR; - } - // - // set the stage transition flag. - // - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - break; - - default: - Status = EFI_PROTOCOL_ERROR; - break; - } - - FreePool (Response); - FreePool (Challenge); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c deleted file mode 100644 index cb1eff1b690c..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c +++ /dev/null @@ -1,1264 +0,0 @@ -/** @file - Helper functions for configuring or getting the parameters relating to iSCSI. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA"; -BOOLEAN mIScsiDeviceListUpdated = FALSE; -UINTN mNumberOfIScsiDevices = 0; -ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL; - -LIST_ENTRY mIScsiConfigFormList = { - &mIScsiConfigFormList, - &mIScsiConfigFormList -}; - -HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = { - { - { - HARDWARE_DEVICE_PATH, - HW_VENDOR_DP, - { - (UINT8) (sizeof (VENDOR_DEVICE_PATH)), - (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) - } - }, - IP4_ISCSI_CONFIG_GUID - }, - { - END_DEVICE_PATH_TYPE, - END_ENTIRE_DEVICE_PATH_SUBTYPE, - { - (UINT8) (END_DEVICE_PATH_LENGTH), - (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) - } - } -}; - -/** - Convert the IPv4 address into a dotted string. - - @param[in] Ip The IPv4 address. - @param[out] Str The dotted IP string. -**/ -VOID -IScsiIpToStr ( - IN EFI_IPv4_ADDRESS *Ip, - OUT CHAR16 *Str - ) -{ - UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]); -} - - -/** - Parse IsId in string format and convert it to binary. - - @param[in] String The buffer of the string to be parsed. - @param[in, out] IsId The buffer to store IsId. - - @retval EFI_SUCCESS The operation finished successfully. - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. - -**/ -EFI_STATUS -IScsiParseIsIdFromString ( - IN CONST CHAR16 *String, - IN OUT UINT8 *IsId - ) -{ - UINT8 Index; - CHAR16 *IsIdStr; - CHAR16 TempStr[3]; - UINTN NodeVal; - CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE]; - EFI_INPUT_KEY Key; - - if ((String == NULL) || (IsId == NULL)) { - return EFI_INVALID_PARAMETER; - } - - IsIdStr = (CHAR16 *) String; - - if (StrLen (IsIdStr) != 6) { - UnicodeSPrint ( - PortString, - (UINTN) sizeof (PortString), - L"Error! Input is incorrect, please input 6 hex numbers!\n" - ); - - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - PortString, - NULL - ); - - return EFI_INVALID_PARAMETER; - } - - for (Index = 3; Index < 6; Index++) { - CopyMem (TempStr, IsIdStr, sizeof (TempStr)); - TempStr[2] = L'\0'; - - // - // Convert the string to IsId. StrHexToUintn stops at the first character - // that is not a valid hex character, '\0' here. - // - NodeVal = StrHexToUintn (TempStr); - - IsId[Index] = (UINT8) NodeVal; - - IsIdStr = IsIdStr + 2; - } - - return EFI_SUCCESS; -} - -/** - Convert IsId from binary to string format. - - @param[out] String The buffer to store the converted string. - @param[in] IsId The buffer to store IsId. - - @retval EFI_SUCCESS The string converted successfully. - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. - -**/ -EFI_STATUS -IScsiConvertIsIdToString ( - OUT CHAR16 *String, - IN UINT8 *IsId - ) -{ - UINT8 Index; - UINTN Number; - - if ((String == NULL) || (IsId == NULL)) { - return EFI_INVALID_PARAMETER; - } - - for (Index = 0; Index < 6; Index++) { - if (IsId[Index] <= 0xF) { - Number = UnicodeSPrint ( - String, - 2 * ISID_CONFIGURABLE_STORAGE, - L"0%X", - (UINTN) IsId[Index] - ); - } else { - Number = UnicodeSPrint ( - String, - 2 * ISID_CONFIGURABLE_STORAGE, - L"%X", - (UINTN) IsId[Index] - ); - - } - - String = String + Number; - } - - *String = L'\0'; - - return EFI_SUCCESS; -} - - -/** - Update the list of iSCSI devices the iSCSI driver is controlling. - - @retval EFI_SUCCESS The callback successfully handled the action. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiUpdateDeviceList ( - VOID - ) -{ - EFI_STATUS Status; - ISCSI_DEVICE_LIST *DeviceList; - UINTN DataSize; - UINTN NumHandles; - EFI_HANDLE *Handles; - UINTN HandleIndex; - UINTN Index; - UINTN LastDeviceIndex; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - ISCSI_MAC_INFO *CurMacInfo; - ISCSI_MAC_INFO TempMacInfo; - CHAR16 MacString[70]; - UINTN DeviceListSize; - - // - // Dump all the handles the Managed Network Service Binding Protocol is installed on. - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiManagedNetworkServiceBindingProtocolGuid, - NULL, - &NumHandles, - &Handles - ); - if (EFI_ERROR (Status)) { - return Status; - } - - DataSize = 0; - Status = gRT->GetVariable ( - L"iSCSIDeviceList", - &gIp4IScsiConfigGuid, - NULL, - &DataSize, - NULL - ); - if (Status == EFI_BUFFER_TOO_SMALL) { - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize); - ASSERT (DeviceList != NULL); - - gRT->GetVariable ( - L"iSCSIDeviceList", - &gIp4IScsiConfigGuid, - NULL, - &DataSize, - DeviceList - ); - - LastDeviceIndex = 0; - - for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) { - Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - VlanId = NetLibGetVlanId (Handles[HandleIndex]); - - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) { - CurMacInfo = &DeviceList->MacInfo[Index]; - if ((CurMacInfo->Len == HwAddressSize) && - (CurMacInfo->VlanId == VlanId) && - (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize)) - ) { - // - // The previous configured NIC is still here. - // - if (Index != LastDeviceIndex) { - // - // Swap the current MAC address entry with the one indexed by - // LastDeviceIndex. - // - CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO)); - CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex], sizeof (ISCSI_MAC_INFO)); - CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo, sizeof (ISCSI_MAC_INFO)); - } - - LastDeviceIndex++; - } - } - - if (LastDeviceIndex == DeviceList->NumDevice) { - break; - } - } - - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) { - // - // delete the variables - // - CurMacInfo = &DeviceList->MacInfo[Index]; - IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo->VlanId, MacString); - gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0, NULL); - gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL); - } - - FreePool (DeviceList); - } else if (Status != EFI_NOT_FOUND) { - FreePool (Handles); - return Status; - } - // - // Construct the new iSCSI device list. - // - DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof (ISCSI_MAC_INFO); - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize); - ASSERT (DeviceList != NULL); - DeviceList->NumDevice = (UINT8) NumHandles; - - for (Index = 0; Index < NumHandles; Index++) { - NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize); - - CurMacInfo = &DeviceList->MacInfo[Index]; - CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize); - CurMacInfo->Len = (UINT8) HwAddressSize; - CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]); - } - - gRT->SetVariable ( - L"iSCSIDeviceList", - &gIp4IScsiConfigGuid, - ISCSI_CONFIG_VAR_ATTR, - DeviceListSize, - DeviceList - ); - - FreePool (DeviceList); - FreePool (Handles); - - return Status; -} - -/** - Get the iSCSI configuration form entry by the index of the goto opcode actived. - - @param[in] Index The 0-based index of the goto opcode actived. - - @return The iSCSI configuration form entry found. -**/ -ISCSI_CONFIG_FORM_ENTRY * -IScsiGetConfigFormEntryByIndex ( - IN UINT32 Index - ) -{ - UINT32 CurrentIndex; - LIST_ENTRY *Entry; - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - - CurrentIndex = 0; - ConfigFormEntry = NULL; - - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { - if (CurrentIndex == Index) { - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link); - break; - } - - CurrentIndex++; - } - - return ConfigFormEntry; -} - -/** - Convert the iSCSI configuration data into the IFR data. - - @param[in] ConfigFormEntry The iSCSI configuration form entry. - @param[out] IfrNvData The IFR nv data. - -**/ -VOID -IScsiConvertDeviceConfigDataToIfrNvData ( - IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry, - OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData - ) -{ - ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData; - - // - // Normal session configuration parameters. - // - SessionConfigData = &ConfigFormEntry->SessionConfigData; - IfrNvData->Enabled = SessionConfigData->Enabled; - - IfrNvData->InitiatorInfoFromDhcp = SessionConfigData->InitiatorInfoFromDhcp; - IfrNvData->TargetInfoFromDhcp = SessionConfigData->TargetInfoFromDhcp; - IfrNvData->TargetPort = SessionConfigData->TargetPort; - - IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp); - IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask); - IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway); - IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp); - - IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData->TargetName); - - IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun); - - IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId); - - // - // CHAP authentication parameters. - // - AuthConfigData = &ConfigFormEntry->AuthConfigData; - - IfrNvData->CHAPType = AuthConfigData->CHAPType; - - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData->CHAPName); - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData->CHAPSecret); - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName, IfrNvData->ReverseCHAPName); - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, IfrNvData->ReverseCHAPSecret); -} - -/** - This function allows the caller to request the current - configuration for one or more named elements. The resulting - string is in <ConfigAltResp> format. Any and all alternative - configuration strings shall also be appended to the end of the - current configuration string. If they are, they must appear - after the current configuration. They must contain the same - routing (GUID, NAME, PATH) as the current configuration string. - They must have an additional description indicating the type of - alternative configuration the string represents, - "ALTCFG=<StringToken>". That <StringToken> (when - converted from Hex UNICODE to binary) is a reference to a - string in the associated string pack. - - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param[in] Request A null-terminated Unicode string in - <ConfigRequest> format. Note that this - includes the routing information as well as - the configurable name / value pairs. It is - invalid for this string to be in - <MultiConfigRequest> format. - @param[out] Progress On return, points to a character in the - Request string. Points to the string's null - terminator if request was successful. Points - to the most recent "&" before the first - failing name / value pair (or the beginning - of the string if the failure is in the first - name / value pair) if the request was not - successful. - @param[out] Results A null-terminated Unicode string in - <ConfigAltResp> format which has all values - filled in for the names in the Request string. - String to be allocated by the called function. - - @retval EFI_SUCCESS The Results string is filled with the - values corresponding to all requested - names. - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the - parts of the results that must be - stored awaiting possible future - protocols. - @retval EFI_INVALID_PARAMETER For example, passing in a NULL - for the Request parameter - would result in this type of - error. In this case, the - Progress parameter would be - set to NULL. - @retval EFI_NOT_FOUND Routing data doesn't match any - known driver. Progress set to the - first character in the routing header. - Note: There is no requirement that the - driver validate the routing data. It - must skip the <ConfigHdr> in order to - process the names. - @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set - to most recent & before the - error or the beginning of the - string. - @retval EFI_INVALID_PARAMETER Unknown name. Progress points - to the & before the name in - question.Currently not implemented. -**/ -EFI_STATUS -EFIAPI -IScsiFormExtractConfig ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN CONST EFI_STRING Request, - OUT EFI_STRING *Progress, - OUT EFI_STRING *Results - ) -{ - EFI_STATUS Status; - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; - UINTN BufferSize; - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; - ISCSI_FORM_CALLBACK_INFO *Private; - EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; - EFI_STRING ConfigRequestHdr; - EFI_STRING ConfigRequest; - BOOLEAN AllocatedRequest; - UINTN Size; - - if (Progress == NULL || Results == NULL) { - return EFI_INVALID_PARAMETER; - } - - *Progress = Request; - if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &gIp4IScsiConfigGuid, mVendorStorageName)) { - return EFI_NOT_FOUND; - } - - ConfigRequestHdr = NULL; - ConfigRequest = NULL; - AllocatedRequest = FALSE; - Size = 0; - - if (!mIScsiDeviceListUpdated) { - // - // Update the device list. - // - IScsiUpdateDeviceList (); - mIScsiDeviceListUpdated = TRUE; - } - - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); - ASSERT (IfrNvData != NULL); - if (Private->Current != NULL) { - IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData); - } - - BufferSize = ISCSI_NAME_MAX_SIZE; - Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName); - if (EFI_ERROR (Status)) { - IfrNvData->InitiatorName[0] = L'\0'; - } else { - IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName); - } - - // - // Convert buffer data to <ConfigResp> by helper function BlockToConfig() - // - HiiConfigRouting = Private->ConfigRouting; - BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA); - ConfigRequest = Request; - if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) { - // - // Request has no request element, construct full request string. - // Allocate and fill a buffer large enough to hold the <ConfigHdr> template - // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator - // - ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid, mVendorStorageName, Private->DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - ASSERT (ConfigRequest != NULL); - AllocatedRequest = TRUE; - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); - FreePool (ConfigRequestHdr); - } - Status = HiiConfigRouting->BlockToConfig ( - HiiConfigRouting, - ConfigRequest, - (UINT8 *) IfrNvData, - BufferSize, - Results, - Progress - ); - FreePool (IfrNvData); - // - // Free the allocated config request string. - // - if (AllocatedRequest) { - FreePool (ConfigRequest); - ConfigRequest = NULL; - } - - // - // Set Progress string to the original request string. - // - if (Request == NULL) { - *Progress = NULL; - } else if (StrStr (Request, L"OFFSET") == NULL) { - *Progress = Request + StrLen (Request); - } - - return Status; -} - -/** - This function applies changes in a driver's configuration. - Input is a Configuration, which has the routing data for this - driver followed by name / value configuration pairs. The driver - must apply those pairs to its configurable storage. If the - driver's configuration is stored in a linear block of data - and the driver's name / value pairs are in <BlockConfig> - format, it may use the ConfigToBlock helper function (above) to - simplify the job. Currently not implemented. - - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param[in] Configuration A null-terminated Unicode string in - <ConfigString> format. - @param[out] Progress A pointer to a string filled in with the - offset of the most recent '&' before the - first failing name / value pair (or the - beginn ing of the string if the failure - is in the first name / value pair) or - the terminating NULL if all was - successful. - - @retval EFI_SUCCESS The results have been distributed or are - awaiting distribution. - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the - parts of the results that must be - stored awaiting possible future - protocols. - @retval EFI_INVALID_PARAMETERS Passing in a NULL for the - Results parameter would result - in this type of error. - @retval EFI_NOT_FOUND Target for the specified routing data - was not found. -**/ -EFI_STATUS -EFIAPI -IScsiFormRouteConfig ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN CONST EFI_STRING Configuration, - OUT EFI_STRING *Progress - ) -{ - if (Configuration == NULL || Progress == NULL) { - return EFI_INVALID_PARAMETER; - } - - // - // Check routing data in <ConfigHdr>. - // Note: if only one Storage is used, then this checking could be skipped. - // - if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid, mVendorStorageName)) { - *Progress = Configuration; - return EFI_NOT_FOUND; - } - - *Progress = Configuration + StrLen (Configuration); - return EFI_SUCCESS; -} - -/** - This function is called to provide results data to the driver. - This data consists of a unique key that is used to identify - which data is either being passed back or being asked for. - - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param[in] Action Specifies the type of action taken by the browser. - @param[in] QuestionId A unique value which is sent to the original - exporting driver so that it can identify the type - of data to expect. The format of the data tends to - vary based on the opcode that enerated the callback. - @param[in] Type The type of value for the question. - @param[in] Value A pointer to the data being sent to the original - exporting driver. - @param[out] ActionRequest On return, points to the action requested by the - callback function. - - @retval EFI_SUCCESS The callback successfully handled the action. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the - variable and its data. - @retval EFI_DEVICE_ERROR The variable could not be saved. - @retval EFI_UNSUPPORTED The specified Action is not supported by the - callback.Currently not implemented. - @retval EFI_INVALID_PARAMETERS Passing in wrong parameter. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiFormCallback ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN EFI_BROWSER_ACTION Action, - IN EFI_QUESTION_ID QuestionId, - IN UINT8 Type, - IN EFI_IFR_TYPE_VALUE *Value, - OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest - ) -{ - ISCSI_FORM_CALLBACK_INFO *Private; - UINTN BufferSize; - CHAR8 IScsiName[ISCSI_NAME_MAX_SIZE]; - CHAR16 PortString[128]; - CHAR8 Ip4String[IP4_STR_MAX_SIZE]; - CHAR8 LunString[ISCSI_LUN_STR_MAX_LEN]; - UINT64 Lun; - EFI_STRING_ID DeviceFormTitleToken; - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - EFI_IP_ADDRESS HostIp; - EFI_IP_ADDRESS SubnetMask; - EFI_IP_ADDRESS Gateway; - EFI_STATUS Status; - EFI_INPUT_KEY Key; - - if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) { - return EFI_UNSUPPORTED; - } - - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); - // - // Retrieve uncommitted data from Browser - // - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); - ASSERT (IfrNvData != NULL); - if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) { - FreePool (IfrNvData); - return EFI_NOT_FOUND; - } - Status = EFI_SUCCESS; - - if (Action == EFI_BROWSER_ACTION_CHANGING) { - if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) { - // - // In case goto the device configuration form, update the device form title. - // - ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (QuestionId - KEY_DEVICE_ENTRY_BASE)); - ASSERT (ConfigFormEntry != NULL); - - UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s", ConfigFormEntry->MacString); - DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE; - HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL); - - IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData); - - Private->Current = ConfigFormEntry; - } - } else if (Action == EFI_BROWSER_ACTION_CHANGED) { - switch (QuestionId) { - case KEY_INITIATOR_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName); - BufferSize = AsciiStrSize (IScsiName); - - Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName); - if (EFI_ERROR (Status)) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL); - } - - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; - break; - - case KEY_LOCAL_IP: - IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); - if (EFI_ERROR (Status) || - ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && - !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4)); - } - - break; - - case KEY_SUBNET_MASK: - IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4); - if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4)); - } - - break; - - case KEY_GATE_WAY: - IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4); - if (EFI_ERROR (Status) || - ((Gateway.Addr[0] != 0) && - (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && - !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4)); - } - - break; - - case KEY_TARGET_IP: - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); - if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4)); - } - - break; - - case KEY_TARGET_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName); - Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName)); - if (EFI_ERROR (Status)) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL); - } else { - AsciiStrCpyS (Private->Current->SessionConfigData.TargetName, ISCSI_NAME_MAX_SIZE, IScsiName); - } - - break; - - case KEY_DHCP_ENABLE: - if (IfrNvData->InitiatorInfoFromDhcp == 0) { - IfrNvData->TargetInfoFromDhcp = 0; - } - - break; - - case KEY_BOOT_LUN: - IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString); - Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun); - if (EFI_ERROR (Status)) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL); - } else { - CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun)); - } - - break; - - case KEY_CHAP_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current->AuthConfigData.CHAPName); - break; - - case KEY_CHAP_SECRET: - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current->AuthConfigData.CHAPSecret); - break; - - case KEY_REVERSE_CHAP_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private->Current->AuthConfigData.ReverseCHAPName); - break; - - case KEY_REVERSE_CHAP_SECRET: - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private->Current->AuthConfigData.ReverseCHAPSecret); - break; - - case KEY_CONFIG_ISID: - IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId); - IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId); - - break; - - case KEY_SAVE_CHANGES: - // - // First, update those fields which don't have INTERACTIVE set. - // - Private->Current->SessionConfigData.Enabled = IfrNvData->Enabled; - Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData->InitiatorInfoFromDhcp; - Private->Current->SessionConfigData.TargetPort = IfrNvData->TargetPort; - if (Private->Current->SessionConfigData.TargetPort == 0) { - Private->Current->SessionConfigData.TargetPort = ISCSI_WELL_KNOWN_PORT; - } - - Private->Current->SessionConfigData.TargetInfoFromDhcp = IfrNvData->TargetInfoFromDhcp; - Private->Current->AuthConfigData.CHAPType = IfrNvData->CHAPType; - - // - // Only do full parameter validation if iSCSI is enabled on this device. - // - if (Private->Current->SessionConfigData.Enabled) { - // - // Validate the address configuration of the Initiator if DHCP isn't - // deployed. - // - if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) { - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp, sizeof (HostIp.v4)); - CopyMem (&SubnetMask.v4, &Private->Current->SessionConfigData.SubnetMask, sizeof (SubnetMask.v4)); - CopyMem (&Gateway.v4, &Private->Current->SessionConfigData.Gateway, sizeof (Gateway.v4)); - - if ((Gateway.Addr[0] != 0)) { - if (SubnetMask.Addr[0] == 0) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - } - } - // - // Validate target configuration if DHCP isn't deployed. - // - if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) { - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4)); - if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - - // - // Validate iSCSI target name configuration again: - // The format of iSCSI target name is already verified when user input the name; - // here we only check the case user does not input the name. - // - if (Private->Current->SessionConfigData.TargetName[0] == '\0') { - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - L"iSCSI target name is NULL!", - NULL - ); - Status = EFI_INVALID_PARAMETER; - break; - } - - } - - if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) { - if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - - if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) && - ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0')) - ) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - } - } - - BufferSize = sizeof (Private->Current->SessionConfigData); - gRT->SetVariable ( - Private->Current->MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - ISCSI_CONFIG_VAR_ATTR, - BufferSize, - &Private->Current->SessionConfigData - ); - - BufferSize = sizeof (Private->Current->AuthConfigData); - gRT->SetVariable ( - Private->Current->MacString, - &gIScsiCHAPAuthInfoGuid, - ISCSI_CONFIG_VAR_ATTR, - BufferSize, - &Private->Current->AuthConfigData - ); - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; - break; - - default: - break; - } - } - - if (!EFI_ERROR (Status)) { - // - // Pass changed uncommitted data back to Form Browser - // - HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL); - } - - FreePool (IfrNvData); - - return Status; -} - -/** - Updates the iSCSI configuration form to add/delete an entry for the iSCSI - device specified by the Controller. - - @param[in] DriverBindingHandle The driverbinding handle. - @param[in] Controller The controller handle of the iSCSI device. - @param[in] AddForm Whether to add or delete a form entry. - - @retval EFI_SUCCESS The iSCSI configuration form is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigUpdateForm ( - IN EFI_HANDLE DriverBindingHandle, - IN EFI_HANDLE Controller, - IN BOOLEAN AddForm - ) -{ - LIST_ENTRY *Entry; - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - BOOLEAN EntryExisted; - EFI_STATUS Status; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 PortString[128]; - UINT16 FormIndex; - UINTN BufferSize; - VOID *StartOpCodeHandle; - VOID *EndOpCodeHandle; - EFI_IFR_GUID_LABEL *StartLabel; - EFI_IFR_GUID_LABEL *EndLabel; - - ConfigFormEntry = NULL; - EntryExisted = FALSE; - - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link); - - if (ConfigFormEntry->Controller == Controller) { - EntryExisted = TRUE; - break; - } - } - - if (AddForm) { - if (EntryExisted) { - return EFI_SUCCESS; - } else { - // - // Add a new form. - // - ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool (sizeof (ISCSI_CONFIG_FORM_ENTRY)); - if (ConfigFormEntry == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - InitializeListHead (&ConfigFormEntry->Link); - ConfigFormEntry->Controller = Controller; - - // - // Get the MAC address and convert it into the formatted string. - // - Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - VlanId = NetLibGetVlanId (Controller); - - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, ConfigFormEntry->MacString); - - // - // Get the normal session configuration data. - // - BufferSize = sizeof (ConfigFormEntry->SessionConfigData); - Status = gRT->GetVariable ( - ConfigFormEntry->MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - &BufferSize, - &ConfigFormEntry->SessionConfigData - ); - if (EFI_ERROR (Status)) { - ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof (ConfigFormEntry->SessionConfigData)); - - // - // Generate OUI-format ISID based on MAC address. - // - CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6); - ConfigFormEntry->SessionConfigData.IsId[0] = - (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F); - } - // - // Get the CHAP authentication configuration data. - // - BufferSize = sizeof (ConfigFormEntry->AuthConfigData); - Status = gRT->GetVariable ( - ConfigFormEntry->MacString, - &gIScsiCHAPAuthInfoGuid, - NULL, - &BufferSize, - &ConfigFormEntry->AuthConfigData - ); - if (EFI_ERROR (Status)) { - ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof (ConfigFormEntry->AuthConfigData)); - } - // - // Compose the Port string and create a new EFI_STRING_ID. - // - UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", ConfigFormEntry->MacString); - ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL); - - // - // Compose the help string of this port and create a new EFI_STRING_ID. - // - UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString); - ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL); - - InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link); - mNumberOfIScsiDevices++; - } - } else { - ASSERT (EntryExisted); - - mNumberOfIScsiDevices--; - RemoveEntryList (&ConfigFormEntry->Link); - FreePool (ConfigFormEntry); - mCallbackInfo->Current = NULL; - } - // - // Allocate space for creation of Buffer - // - - // - // Init OpCode Handle - // - StartOpCodeHandle = HiiAllocateOpCodeHandle (); - ASSERT (StartOpCodeHandle != NULL); - - EndOpCodeHandle = HiiAllocateOpCodeHandle (); - ASSERT (EndOpCodeHandle != NULL); - - // - // Create Hii Extend Label OpCode as the start opcode - // - StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); - StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; - StartLabel->Number = DEVICE_ENTRY_LABEL; - - // - // Create Hii Extend Label OpCode as the end opcode - // - EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); - EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; - EndLabel->Number = LABEL_END; - - FormIndex = 0; - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link); - - HiiCreateGotoOpCode ( - StartOpCodeHandle, // Container for dynamic created opcodes - FORMID_DEVICE_FORM, // Target Form ID - ConfigFormEntry->PortTitleToken, // Prompt text - ConfigFormEntry->PortTitleHelpToken, // Help text - EFI_IFR_FLAG_CALLBACK, // Question flag - (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID - ); - - FormIndex++; - } - - HiiUpdateForm ( - mCallbackInfo->RegisteredHandle, - &gIp4IScsiConfigGuid, - FORMID_MAIN_FORM, - StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL - EndOpCodeHandle // LABEL_END - ); - - HiiFreeOpCodeHandle (StartOpCodeHandle); - HiiFreeOpCodeHandle (EndOpCodeHandle); - - return EFI_SUCCESS; -} - -/** - Initialize the iSCSI configuration form. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is initialized. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigFormInit ( - VOID - ) -{ - EFI_STATUS Status; - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; - ISCSI_FORM_CALLBACK_INFO *CallbackInfo; - - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&HiiDatabase); - if (EFI_ERROR (Status)) { - return Status; - } - - CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof (ISCSI_FORM_CALLBACK_INFO)); - if (CallbackInfo == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - CallbackInfo->Signature = ISCSI_FORM_CALLBACK_INFO_SIGNATURE; - CallbackInfo->HiiDatabase = HiiDatabase; - CallbackInfo->Current = NULL; - - CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig; - CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig; - CallbackInfo->ConfigAccess.Callback = IScsiFormCallback; - - Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **)&CallbackInfo->ConfigRouting); - if (EFI_ERROR (Status)) { - FreePool(CallbackInfo); - return Status; - } - - // - // Install Device Path Protocol and Config Access protocol to driver handle - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &CallbackInfo->DriverHandle, - &gEfiDevicePathProtocolGuid, - &mIScsiHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &CallbackInfo->ConfigAccess, - NULL - ); - ASSERT_EFI_ERROR (Status); - - // - // Publish our HII data - // - CallbackInfo->RegisteredHandle = HiiAddPackages ( - &gIp4IScsiConfigGuid, - CallbackInfo->DriverHandle, - IScsi4DxeStrings, - IScsiConfigDxeBin, - NULL - ); - if (CallbackInfo->RegisteredHandle == NULL) { - FreePool(CallbackInfo); - return EFI_OUT_OF_RESOURCES; - } - - mCallbackInfo = CallbackInfo; - - return Status; -} - -/** - Unload the iSCSI configuration form, this includes: delete all the iSCSI - device configuration entries, uninstall the form callback protocol and - free the resources used. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is unloaded. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiConfigFormUnload ( - IN EFI_HANDLE DriverBindingHandle - ) -{ - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - - while (!IsListEmpty (&mIScsiConfigFormList)) { - // - // Uninstall the device forms as the iSCSI driver instance may fail to - // control the controller but still install the device configuration form. - // In such case, upon driver unloading, the driver instance's driverbinding. - // stop () won't be called, so we have to take this chance here to uninstall - // the device form. - // - ConfigFormEntry = NET_LIST_USER_STRUCT (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link); - IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry->Controller, FALSE); - } - - // - // Remove HII package list - // - mCallbackInfo->HiiDatabase->RemovePackageList ( - mCallbackInfo->HiiDatabase, - mCallbackInfo->RegisteredHandle - ); - - // - // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL - // - gBS->UninstallMultipleProtocolInterfaces ( - mCallbackInfo->DriverHandle, - &gEfiDevicePathProtocolGuid, - &mIScsiHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &mCallbackInfo->ConfigAccess, - NULL - ); - FreePool (mCallbackInfo); - - return EFI_SUCCESS; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c deleted file mode 100644 index 6a876c8b69dd..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c +++ /dev/null @@ -1,472 +0,0 @@ -/** @file - iSCSI DHCP related configuration routines. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -/** - Extract the Root Path option and get the required target information. - - @param[in] RootPath The RootPath. - @param[in] Length Length of the RootPath option payload. - @param[in, out] ConfigNvData The iSCSI session configuration data read from nonvolatile device. - - @retval EFI_SUCCESS All required information is extracted from the RootPath option. - @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted. -**/ -EFI_STATUS -IScsiDhcpExtractRootPath ( - IN CHAR8 *RootPath, - IN UINT8 Length, - IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData - ) -{ - EFI_STATUS Status; - UINT8 IScsiRootPathIdLen; - CHAR8 *TmpStr; - ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX]; - ISCSI_ROOT_PATH_FIELD *Field; - UINT32 FieldIndex; - UINT8 Index; - - // - // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname> - // - IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID); - - if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) { - return EFI_NOT_FOUND; - } - // - // Skip the iSCSI RootPath ID "iscsi:". - // - RootPath += IScsiRootPathIdLen; - Length = (UINT8) (Length - IScsiRootPathIdLen); - - TmpStr = (CHAR8 *) AllocatePool (Length + 1); - if (TmpStr == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - CopyMem (TmpStr, RootPath, Length); - TmpStr[Length] = '\0'; - - Index = 0; - FieldIndex = RP_FIELD_IDX_SERVERNAME; - ZeroMem (&Fields[0], sizeof (Fields)); - - // - // Extract the fields in the Root Path option string. - // - for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) { - if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) { - Fields[FieldIndex].Str = &TmpStr[Index]; - } - - while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) { - Index++; - } - - if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) { - if (FieldIndex != RP_FIELD_IDX_TARGETNAME) { - TmpStr[Index] = '\0'; - Index++; - } - - if (Fields[FieldIndex].Str != NULL) { - Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str); - } - } - } - - if (FieldIndex != RP_FIELD_IDX_MAX) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) || - (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) || - (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1) - ) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Get the IP address of the target. - // - Field = &Fields[RP_FIELD_IDX_SERVERNAME]; - Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - // - // Check the protocol type. - // - Field = &Fields[RP_FIELD_IDX_PROTOCOL]; - if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Get the port of the iSCSI target. - // - Field = &Fields[RP_FIELD_IDX_PORT]; - if (Field->Str != NULL) { - ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str); - } else { - ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT; - } - // - // Get the LUN. - // - Field = &Fields[RP_FIELD_IDX_LUN]; - if (Field->Str != NULL) { - Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } else { - ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun)); - } - // - // Get the target iSCSI Name. - // - Field = &Fields[RP_FIELD_IDX_TARGETNAME]; - - if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Validate the iSCSI name. - // - Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str)); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field->Str); - -ON_EXIT: - - FreePool (TmpStr); - - return Status; -} - -/** - The callback function registerd to the DHCP4 instance which is used to select - the qualified DHCP OFFER. - - @param[in] This The DHCP4 protocol. - @param[in] Context The context set when configuring the DHCP4 protocol. - @param[in] CurrentState The current state of the DHCP4 protocol. - @param[in] Dhcp4Event The event occurs in the current state. - @param[in] Packet The DHCP packet that is to be sent or already received. - @param[out] NewPacket The packet used to replace the above Packet. - - @retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're not intereseted - in the Dhcp4Event. - @retval EFI_NOT_READY The DHCP OFFER packet doesn't match our requirements. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiDhcpSelectOffer ( - IN EFI_DHCP4_PROTOCOL * This, - IN VOID *Context, - IN EFI_DHCP4_STATE CurrentState, - IN EFI_DHCP4_EVENT Dhcp4Event, - IN EFI_DHCP4_PACKET * Packet, OPTIONAL - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL - ) -{ - EFI_STATUS Status; - UINT32 OptionCount; - EFI_DHCP4_PACKET_OPTION **OptionList; - UINT32 Index; - - if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) { - return EFI_SUCCESS; - } - - OptionCount = 0; - - Status = This->Parse (This, Packet, &OptionCount, NULL); - if (Status != EFI_BUFFER_TOO_SMALL) { - return EFI_NOT_READY; - } - - OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *)); - if (OptionList == NULL) { - return EFI_NOT_READY; - } - - Status = This->Parse (This, Packet, &OptionCount, OptionList); - if (EFI_ERROR (Status)) { - FreePool (OptionList); - return EFI_NOT_READY; - } - - for (Index = 0; Index < OptionCount; Index++) { - if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) { - continue; - } - - Status = IScsiDhcpExtractRootPath ( - (CHAR8 *) &OptionList[Index]->Data[0], - OptionList[Index]->Length, - (ISCSI_SESSION_CONFIG_NVDATA *) Context - ); - - break; - } - - if (Index == OptionCount) { - Status = EFI_NOT_READY; - } - - FreePool (OptionList); - - return Status; -} - -/** - Parse the DHCP ACK to get the address configuration and DNS information. - - @param[in] Dhcp4 The DHCP4 protocol. - @param[in, out] ConfigData The session configuration data. - - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. - @retval EFI_NO_MAPPING DHCP failed to acquire address and other information. - @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-formatted. - @retval EFI_DEVICE_ERROR Other errors as indicated. -**/ -EFI_STATUS -IScsiParseDhcpAck ( - IN EFI_DHCP4_PROTOCOL *Dhcp4, - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData - ) -{ - EFI_STATUS Status; - EFI_DHCP4_MODE_DATA Dhcp4ModeData; - UINT32 OptionCount; - EFI_DHCP4_PACKET_OPTION **OptionList; - UINT32 Index; - - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData); - if (EFI_ERROR (Status)) { - return Status; - } - - if (Dhcp4ModeData.State != Dhcp4Bound) { - return EFI_NO_MAPPING; - } - - CopyMem (&ConfigData->NvData.LocalIp, &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&ConfigData->NvData.SubnetMask, &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&ConfigData->NvData.Gateway, &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS)); - - OptionCount = 0; - OptionList = NULL; - - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList); - if (Status != EFI_BUFFER_TOO_SMALL) { - return EFI_DEVICE_ERROR; - } - - OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *)); - if (OptionList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList); - if (EFI_ERROR (Status)) { - FreePool (OptionList); - return EFI_DEVICE_ERROR; - } - - for (Index = 0; Index < OptionCount; Index++) { - // - // Get DNS server addresses and DHCP server address from this offer. - // - if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) { - - if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) { - Status = EFI_INVALID_PARAMETER; - break; - } - // - // Primary DNS server address. - // - CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS)); - - if (OptionList[Index]->Length > 4) { - // - // Secondary DNS server address - // - CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4], sizeof (EFI_IPv4_ADDRESS)); - } - } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) { - if (OptionList[Index]->Length != 4) { - Status = EFI_INVALID_PARAMETER; - break; - } - - CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS)); - } - } - - FreePool (OptionList); - - return Status; -} - -/** - Parse the DHCP ACK to get the address configuration and DNS information. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller; - @param[in, out] ConfigData The session configuration data. - - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiDoDhcp ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData - ) -{ - EFI_HANDLE Dhcp4Handle; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_STATUS Status; - EFI_DHCP4_PACKET_OPTION *ParaList; - EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData; - EFI_STATUS MediaStatus; - UINT8 *Data; - - Dhcp4Handle = NULL; - Dhcp4 = NULL; - ParaList = NULL; - - // - // Check media status before do DHCP - // - MediaStatus = EFI_SUCCESS; - NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus); - if (MediaStatus != EFI_SUCCESS) { - return EFI_NO_MEDIA; - } - - // - // Create a DHCP4 child instance and get the protocol. - // - Status = NetLibCreateServiceChild ( - Controller, - Image, - &gEfiDhcp4ServiceBindingProtocolGuid, - &Dhcp4Handle - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->OpenProtocol ( - Dhcp4Handle, - &gEfiDhcp4ProtocolGuid, - (VOID **)&Dhcp4, - Image, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3); - if (ParaList == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - // - // Ask the server to reply with Netmask, Router, DNS and RootPath options. - // - ParaList->OpCode = DHCP4_TAG_PARA_LIST; - ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 : 3); - Data = &ParaList->Data[0]; - Data[0] = DHCP4_TAG_NETMASK; - Data[1] = DHCP4_TAG_ROUTER; - Data[2] = DHCP4_TAG_DNS_SERVER; - Data[3] = DHCP4_TAG_ROOTPATH; - - ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA)); - Dhcp4ConfigData.OptionCount = 1; - Dhcp4ConfigData.OptionList = &ParaList; - - if (ConfigData->NvData.TargetInfoFromDhcp) { - // - // Use callback to select an offer which contains target information. - // - Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer; - Dhcp4ConfigData.CallbackContext = &ConfigData->NvData; - } - - Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Dhcp4->Start (Dhcp4, NULL); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - // - // Parse the ACK to get required information. - // - Status = IScsiParseDhcpAck (Dhcp4, ConfigData); - -ON_EXIT: - - if (ParaList != NULL) { - FreePool (ParaList); - } - - if (Dhcp4 != NULL) { - Dhcp4->Stop (Dhcp4); - Dhcp4->Configure (Dhcp4, NULL); - - gBS->CloseProtocol ( - Dhcp4Handle, - &gEfiDhcp4ProtocolGuid, - Image, - Controller - ); - } - - NetLibDestroyServiceChild ( - Controller, - Image, - &gEfiDhcp4ServiceBindingProtocolGuid, - Dhcp4Handle - ); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c deleted file mode 100644 index 730f3e506bbc..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c +++ /dev/null @@ -1,676 +0,0 @@ -/** @file - The entry point of IScsi driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = { - IScsiDriverBindingSupported, - IScsiDriverBindingStart, - IScsiDriverBindingStop, - 0xa, - NULL, - NULL -}; - -/** - Tests to see if this driver supports the RemainingDevicePath. - - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This - parameter is ignored by device drivers, and is optional for bus - drivers. For bus drivers, if this parameter is not NULL, then - the bus driver must determine if the bus controller specified - by ControllerHandle and the child controller specified - by RemainingDevicePath are both supported by this - bus driver. - - @retval EFI_SUCCESS The RemainingDevicePath is supported or NULL. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver specified by This. -**/ -EFI_STATUS -IScsiIsDevicePathSupported ( - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath; - - CurrentDevicePath = RemainingDevicePath; - if (CurrentDevicePath != NULL) { - while (!IsDevicePathEnd (CurrentDevicePath)) { - if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && (CurrentDevicePath->SubType == MSG_ISCSI_DP)) { - return EFI_SUCCESS; - } - - CurrentDevicePath = NextDevicePathNode (CurrentDevicePath); - } - - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} - -/** - Tests to see if this driver supports a given controller. If a child device is provided, - it further tests to see if this driver supports creating a handle for the specified child device. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by the driver - specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a different - driver or an application that requires exclusive acces. - Currently not implemented. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver specified by This. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiCallerIdGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - return EFI_ALREADY_STARTED; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - Status = IScsiIsDevicePathSupported (RemainingDevicePath); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - if (IScsiDhcpIsConfigured (ControllerHandle)) { - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - } - - return EFI_SUCCESS; -} - -/** - Start this driver on ControllerHandle. - - The Start() function is designed to be invoked from the EFI boot service ConnectController(). - As a result, much of the error checking on the parameters to Start() has been moved into this - common boot service. It is legal to call Start() from other locations, but the following calling - restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned - EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified by This must - have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_DEVICE_ERROR The device could not be started due to a device error. - Currently not implemented. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval Others The driver failded to start the device. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - ISCSI_DRIVER_DATA *Private; - VOID *Interface; - - Private = IScsiCreateDriverData (This->DriverBindingHandle, ControllerHandle); - if (Private == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // - // Create a underlayer child instance, but not need to configure it. Just open ChildHandle - // via BY_DRIVER. That is, establishing the relationship between ControllerHandle and ChildHandle. - // Therefore, when DisconnectController(), especially VLAN virtual controller handle, - // IScsiDriverBindingStop() will be called. - // - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - &Private->ChildHandle - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->ChildHandle, - &gEfiTcp4ProtocolGuid, - &Interface, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Always install private protocol no matter what happens later. We need to - // keep the relationship between ControllerHandle and ChildHandle. - // - Status = gBS->InstallProtocolInterface ( - &ControllerHandle, - &gEfiCallerIdGuid, - EFI_NATIVE_INTERFACE, - &Private->IScsiIdentifier - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Try to add a port configuration page for this controller. - // - IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, TRUE); - - // - // Get the iSCSI configuration data of this controller. - // - Status = IScsiGetConfigData (Private); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - // - // Try to login and create an iSCSI session according to the configuration. - // - Status = IScsiSessionLogin (Private); - if (Status == EFI_MEDIA_CHANGED) { - // - // The specified target is not available and the redirection information is - // got, login the session again with the updated target address. - // - Status = IScsiSessionLogin (Private); - } - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - // - // Duplicate the Session's tcp connection device path. The source port field - // will be set to zero as one iSCSI session is comprised of several iSCSI - // connections. - // - Private->DevicePath = IScsiGetTcpConnDevicePath (Private); - if (Private->DevicePath == NULL) { - goto ON_ERROR; - } - // - // Install the updated device path onto the ExtScsiPassThruHandle. - // - Status = gBS->InstallProtocolInterface ( - &Private->ExtScsiPassThruHandle, - &gEfiDevicePathProtocolGuid, - EFI_NATIVE_INTERFACE, - Private->DevicePath - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // ISCSI children should share the default Tcp child, just open the default Tcp child via BY_CHILD_CONTROLLER. - // - Status = gBS->OpenProtocol ( - Private->ChildHandle, /// Default Tcp child - &gEfiTcp4ProtocolGuid, - &Interface, - This->DriverBindingHandle, - Private->ExtScsiPassThruHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - Private->ExtScsiPassThruHandle, - &gEfiExtScsiPassThruProtocolGuid, - &Private->IScsiExtScsiPassThru, - &gEfiDevicePathProtocolGuid, - Private->DevicePath, - NULL - ); - - goto ON_ERROR; - } - - // - // Update/Publish the iSCSI Boot Firmware Table. - // - IScsiPublishIbft (); - - return EFI_SUCCESS; - -ON_ERROR: - - IScsiSessionAbort (&Private->Session); - - return Status; -} - -/** - Stop this driver on ControllerHandle. - - Release the control of this controller and remove the IScsi functions. The Stop() - function is designed to be invoked from the EFI boot service DisconnectController(). - As a result, much of the error checking on the parameters to Stop() has been moved - into this common boot service. It is legal to call Stop() from other locations, - but the following calling restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this - same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this driver's - Start() function, and the Start() function must have called OpenProtocol() on - ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used. - @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL - if NumberOfChildren is 0.Not used. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. - @retval EFI_INVALID_PARAMETER Child handle is NULL. - @retval EFI_ACCESS_DENIED The protocol could not be removed from the Handle - because its interfaces are being used. - -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL - ) -{ - EFI_HANDLE IScsiController; - EFI_STATUS Status; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - ISCSI_DRIVER_DATA *Private; - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru; - ISCSI_CONNECTION *Conn; - - if (NumberOfChildren != 0) { - // - // We should have only one child. - // - Status = gBS->OpenProtocol ( - ChildHandleBuffer[0], - &gEfiExtScsiPassThruProtocolGuid, - (VOID **) &PassThru, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); - Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, Link); - - // - // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just close - // the protocol here but not uninstall the device path protocol and - // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle. - // - gBS->CloseProtocol ( - Private->ChildHandle, - &gEfiTcp4ProtocolGuid, - Private->Image, - Private->ExtScsiPassThruHandle - ); - - gBS->CloseProtocol ( - Conn->Tcp4Io.Handle, - &gEfiTcp4ProtocolGuid, - Private->Image, - Private->ExtScsiPassThruHandle - ); - - return EFI_SUCCESS; - } - // - // Get the handle of the controller we are controling. - // - IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid); - - Status = gBS->OpenProtocol ( - IScsiController, - &gEfiCallerIdGuid, - (VOID **)&IScsiIdentifier, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - - if (Private->ChildHandle != NULL) { - Status = gBS->CloseProtocol ( - Private->ChildHandle, - &gEfiTcp4ProtocolGuid, - This->DriverBindingHandle, - IScsiController - ); - - ASSERT (!EFI_ERROR (Status)); - - Status = NetLibDestroyServiceChild ( - IScsiController, - This->DriverBindingHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - Private->ChildHandle - ); - ASSERT (!EFI_ERROR (Status)); - } - - IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE); - - // - // Uninstall the private protocol. - // - gBS->UninstallProtocolInterface ( - IScsiController, - &gEfiCallerIdGuid, - &Private->IScsiIdentifier - ); - - // - // Update the iSCSI Boot Firware Table. - // - IScsiPublishIbft (); - - IScsiSessionAbort (&Private->Session); - Status = IScsiCleanDriverData (Private); - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} - -/** - Unloads an image(the iSCSI driver). - - @param[in] ImageHandle Handle that identifies the image to be unloaded. - - @retval EFI_SUCCESS The image has been unloaded. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -EfiIScsiUnload ( - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - UINTN DeviceHandleCount; - EFI_HANDLE *DeviceHandleBuffer; - UINTN Index; - EFI_COMPONENT_NAME_PROTOCOL *ComponentName; - EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; - - // - // Try to disonnect the driver from the devices it's controlling. - // - Status = gBS->LocateHandleBuffer ( - AllHandles, - NULL, - NULL, - &DeviceHandleCount, - &DeviceHandleBuffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < DeviceHandleCount; Index++) { - Status = IScsiTestManagedDevice ( - DeviceHandleBuffer[Index], - gIScsiDriverBinding.DriverBindingHandle, - &gEfiTcp4ProtocolGuid - ); - if (EFI_ERROR (Status)) { - continue; - } - Status = gBS->DisconnectController ( - DeviceHandleBuffer[Index], - gIScsiDriverBinding.DriverBindingHandle, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - // - // Unload the iSCSI configuration form. - // - Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Uninstall the ComponentName and ComponentName2 protocol from iSCSI4 driver binding handle - // if it has been installed. - // - Status = gBS->HandleProtocol ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentNameProtocolGuid, - (VOID **) &ComponentName - ); - if (!EFI_ERROR (Status)) { - Status = gBS->UninstallMultipleProtocolInterfaces ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentNameProtocolGuid, - ComponentName, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - Status = gBS->HandleProtocol ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentName2ProtocolGuid, - (VOID **) &ComponentName2 - ); - if (!EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentName2ProtocolGuid, - ComponentName2, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - Status = gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, - &gIScsiDriverBinding, - &gEfiIScsiInitiatorNameProtocolGuid, - &gIScsiInitiatorName, - NULL - ); -ON_EXIT: - - if (DeviceHandleBuffer != NULL) { - FreePool (DeviceHandleBuffer); - } - - return Status; -} - -/** - This is the declaration of an EFI image entry point. This entry point is - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including - both device drivers and bus drivers. It initialize the global variables and - publish the driver binding protocol. - - @param[in] ImageHandle The firmware allocated handle for the UEFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL was installed unexpectedly. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiDriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName; - - // - // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL. - // - Status = gBS->LocateProtocol ( - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - (VOID**) &IScsiInitiatorName - ); - - if (!EFI_ERROR (Status)) { - return EFI_ACCESS_DENIED; - } - - // - // Initialize the EFI Driver Library - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gIScsiDriverBinding, - ImageHandle, - &gIScsiComponentName, - &gIScsiComponentName2 - ); - - if (!EFI_ERROR (Status)) { - // - // Install the iSCSI Initiator Name Protocol. - // - Status = gBS->InstallProtocolInterface ( - &ImageHandle, - &gEfiIScsiInitiatorNameProtocolGuid, - EFI_NATIVE_INTERFACE, - &gIScsiInitiatorName - ); - if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, - &gIScsiDriverBinding, - &gEfiComponentName2ProtocolGuid, - &gIScsiComponentName2, - &gEfiComponentNameProtocolGuid, - &gIScsiComponentName, - NULL - ); - return Status; - } - - // - // Initialize the configuration form of iSCSI. - // - Status = IScsiConfigFormInit (); - if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, - &gIScsiDriverBinding, - &gEfiComponentName2ProtocolGuid, - &gIScsiComponentName2, - &gEfiComponentNameProtocolGuid, - &gIScsiComponentName, - &gEfiIScsiInitiatorNameProtocolGuid, - &gIScsiInitiatorName, - NULL - ); - } - } - return Status; -} - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c deleted file mode 100644 index db2d6d19366e..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c +++ /dev/null @@ -1,412 +0,0 @@ -/** @file - The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -/** - Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function - supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the - nonblocking I/O functionality is optional. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it represents - the id of the SCSI device to send the SCSI Request Packet. Each - transport driver may chose to utilize a subset of this size to suit the needs - of transport target representation. For example, a Fibre Channel driver - may use only 8 bytes (WWN) to represent an FC target. - @param[in] Lun The LUN of the SCSI device to send the SCSI Request Packet. - @param[in, out] Packet A pointer to the SCSI Request Packet to send to the SCSI device - specified by Target and Lun. - @param[in] Event If nonblocking I/O is not supported then Event is ignored, and blocking - I/O is performed. If Event is NULL, then blocking I/O is performed. If - Event is not NULL and non blocking I/O is supported, then - nonblocking I/O is performed, and Event will be signaled when the - SCSI Request Packet completes. - - @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For bi-directional - commands, InTransferLength bytes were transferred from - InDataBuffer. For write and bi-directional commands, - OutTransferLength bytes were transferred by - OutDataBuffer. - @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed. The number of bytes that - could be transferred is returned in InTransferLength. For write - and bi-directional commands, OutTransferLength bytes were - transferred by OutDataBuffer. Currently not implemeted. - @retval EFI_NOT_READY The SCSI Request Packet could not be sent because there are too many - SCSI Request Packets already queued. The caller may retry again later. - @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the SCSI Request - Packet. - @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket are invalid. - @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet is not supported - by the host adapter. This includes the case of Bi-directional SCSI - commands not supported by the implementation. The SCSI Request - Packet was not sent, so no additional status information is available. - Currently not implemeted. - @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruFunction ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, - IN EFI_EVENT Event OPTIONAL - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - EFI_STATUS Status; - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - ConfigNvData = &Private->Session.ConfigData.NvData; - - if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0)) { - return EFI_INVALID_PARAMETER; - } - - if ((Packet == NULL) || (Packet->Cdb == NULL)) { - return EFI_INVALID_PARAMETER; - } - - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); - if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) { - // - // Try to reinstate the session and re-execute the Scsi command. - // - if (EFI_ERROR (IScsiSessionReinstatement (Private))) { - return EFI_DEVICE_ERROR; - } - - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); - } - - return Status; -} - -/** - Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI channel. These - can either be the list SCSI devices that are actually present on the SCSI channel, or the list of legal - Target Ids and LUNs for the SCSI channel. Regardless, the caller of this function must probe the - Target ID and LUN returned to see if a SCSI device is actually present at that location on the SCSI - channel. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in, out] Target On input, a pointer to the Target ID (an array of size - TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel. - On output, a pointer to the Target ID (an array of - TARGET_MAX_BYTES) of the next SCSI device present on a SCSI - channel. An input value of 0xF(all bytes in the array are 0xF) in the - Target array retrieves the Target ID of the first SCSI device present on a - SCSI channel. - @param[in, out] Lun On input, a pointer to the LUN of a SCSI device present on the SCSI - channel. On output, a pointer to the LUN of the next SCSI device present - on a SCSI channel. - - @retval EFI_SUCCESS The Target ID and LUN of the next SCSI device on the SCSI - channel was returned in Target and Lun. - @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target and Lun were - not returned on a previous call to GetNextTargetLun(). - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruGetNextTargetLun ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN OUT UINT8 **Target, - IN OUT UINT64 *Lun - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - UINT8 TargetId[TARGET_MAX_BYTES]; - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - ConfigNvData = &Private->Session.ConfigData.NvData; - - if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) { - // - // Only one <Target, Lun> pair per iSCSI Driver instance. - // - return EFI_NOT_FOUND; - } - - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { - (*Target)[0] = 0; - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); - - return EFI_SUCCESS; - } - - return EFI_INVALID_PARAMETER; -} - -/** - Used to allocate and build a device path node for a SCSI device on a SCSI channel. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it specifies the - Target ID of the SCSI device for which a device path node is to be - allocated and built. Transport drivers may chose to utilize a subset of - this size to suit the representation of targets. For example, a Fibre - Channel driver may use only 8 bytes (WWN) in the array to represent a - FC target. - @param[in] Lun The LUN of the SCSI device for which a device path node is to be - allocated and built. - @param[in, out] DevicePath A pointer to a single device path node that describes the SCSI device - specified by Target and Lun. This function is responsible for - allocating the buffer DevicePath with the boot service - AllocatePool(). It is the caller's responsibility to free - DevicePath when the caller is finished with DevicePath. - - @retval EFI_SUCCESS The device path node that describes the SCSI device specified by - Target and Lun was allocated and returned in - DevicePath. - @retval EFI_INVALID_PARAMETER DevicePath is NULL. - @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun does not exist - on the SCSI channel. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate DevicePath. - -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruBuildDevicePath ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION *Session; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; - EFI_DEV_PATH *Node; - UINTN DevPathNodeLen; - - if (DevicePath == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (Target[0] != 0) { - return EFI_NOT_FOUND; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - Session = &Private->Session; - ConfigNvData = &Session->ConfigData.NvData; - AuthConfig = &Session->AuthData.AuthConfig; - - if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) { - return EFI_NOT_FOUND; - } - - DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1; - Node = AllocatePool (DevPathNodeLen); - if (Node == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Node->DevPath.Type = MESSAGING_DEVICE_PATH; - Node->DevPath.SubType = MSG_ISCSI_DP; - SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen); - - // - // 0 for TCP, others are reserved. - // - Node->Iscsi.NetworkProtocol = 0; - - Node->Iscsi.LoginOption = 0; - switch (AuthConfig->CHAPType) { - case ISCSI_CHAP_NONE: - Node->Iscsi.LoginOption |= 0x0800; - break; - - case ISCSI_CHAP_UNI: - Node->Iscsi.LoginOption |= 0x1000; - break; - - default: - break; - } - - CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64)); - Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag; - AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName); - - *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node; - - return EFI_SUCCESS; -} - -/** - Used to translate a device path node to a Target ID and LUN. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] DevicePath A pointer to a single device path node that describes the SCSI device - on the SCSI channel. - @param[out] Target A pointer to the Target Array which represents the ID of a SCSI device - on the SCSI channel. - @param[out] Lun A pointer to the LUN of a SCSI device on the SCSI channel. - - @retval EFI_SUCCESS DevicePath was successfully translated to a Target ID and - LUN, and they were returned in Target and Lun. - @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL. - @retval EFI_NOT_FOUND A valid translation from DevicePath to a Target ID and LUN - does not exist.Currently not implemented. - @retval EFI_UNSUPPORTED This driver does not support the device path node type in - DevicePath. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruGetTargetLun ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, - OUT UINT8 **Target, - OUT UINT64 *Lun - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - - if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if ((DevicePath->Type != MESSAGING_DEVICE_PATH) || - (DevicePath->SubType != MSG_ISCSI_DP) || - (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH)) - ) { - return EFI_UNSUPPORTED; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - ConfigNvData = &Private->Session.ConfigData.NvData; - - SetMem (*Target, TARGET_MAX_BYTES, 0xFF); - (*Target)[0] = 0; - - if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) { - return EFI_UNSUPPORTED; - } - - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); - - return EFI_SUCCESS; -} - -/** - Resets a SCSI channel. This operation resets all the SCSI devices connected to the SCSI channel. - Currently not implemented. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - - @retval EFI_SUCCESS The SCSI channel was reset. - @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI channel. - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI channel. - @retval EFI_UNSUPPORTED The SCSI channel does not support a channel reset operation. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruResetChannel ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This - ) -{ - return EFI_UNSUPPORTED; -} - -/** - Resets a SCSI logical unit that is connected to a SCSI channel. Currently not implemented. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] Target The Target is an array of size TARGET_MAX_BYTE and it represents the - target port ID of the SCSI device containing the SCSI logical unit to - reset. Transport drivers may chose to utilize a subset of this array to suit - the representation of their targets. - @param[in] Lun The LUN of the SCSI device to reset. - - @retval EFI_SUCCESS The SCSI device specified by Target and Lun was reset. - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI device - specified by Target and Lun. - @retval EFI_UNSUPPORTED The SCSI channel does not support a target reset operation. - @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI device - specified by Target and Lun. - -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruResetTargetLun ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT8 *Target, - IN UINT64 Lun - ) -{ - return EFI_UNSUPPORTED; -} - -/** - Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI channel. These can either - be the list SCSI devices that are actually present on the SCSI channel, or the list of legal Target IDs - for the SCSI channel. Regardless, the caller of this function must probe the Target ID returned to - see if a SCSI device is actually present at that location on the SCSI channel. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel. - On output, a pointer to the Target ID (an array of - TARGET_MAX_BYTES) of the next SCSI device present on a SCSI - channel. An input value of 0xF(all bytes in the array are 0xF) in the - Target array retrieves the Target ID of the first SCSI device present on a - SCSI channel. - - @retval EFI_SUCCESS The Target ID of the next SCSI device on the SCSI - channel was returned in Target. - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. - @retval EFI_TIMEOUT Target array is not all 0xF, and Target were not - returned on a previous call to GetNextTarget(). - Currently not implemented. - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruGetNextTarget ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN OUT UINT8 **Target - ) -{ - UINT8 TargetId[TARGET_MAX_BYTES]; - - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); - - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { - (*Target)[0] = 0; - return EFI_SUCCESS; - } else if ((*Target)[0] == 0) { - return EFI_NOT_FOUND; - } else { - return EFI_INVALID_PARAMETER; - } -} - -EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = { - NULL, - IScsiExtScsiPassThruFunction, - IScsiExtScsiPassThruGetNextTargetLun, - IScsiExtScsiPassThruBuildDevicePath, - IScsiExtScsiPassThruGetTargetLun, - IScsiExtScsiPassThruResetChannel, - IScsiExtScsiPassThruResetTargetLun, - IScsiExtScsiPassThruGetNextTarget -}; diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c deleted file mode 100644 index 58c5447dcbd1..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c +++ /dev/null @@ -1,539 +0,0 @@ -/** @file - Implementation for iSCSI Boot Firmware Table publication. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -BOOLEAN mIbftInstalled = FALSE; -UINTN mTableKey; - -/** - Initialize the header of the iSCSI Boot Firmware Table. - - @param[out] Header The header of the iSCSI Boot Firmware Table. - @param[in] OemId The OEM ID. - @param[in] OemTableId The OEM table ID for the iBFT. -**/ -VOID -IScsiInitIbfTableHeader ( - OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header, - IN UINT8 *OemId, - IN UINT64 *OemTableId - ) -{ - ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER)); - - Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE; - Header->Length = IBFT_HEAP_OFFSET; - Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION; - Header->Checksum = 0; - - CopyMem (Header->OemId, OemId, sizeof (Header->OemId)); - CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64)); -} - -/** - Initialize the control section of the iSCSI Boot Firmware Table. - - @param[in] Table The ACPI table. - @param[in] HandleCount The number of the handles associated with iSCSI sessions, it's - equal to the number of iSCSI sessions. -**/ -VOID -IScsiInitControlSection ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN UINTN HandleCount - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - UINTN NumOffset; - - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - - ZeroMem (Control, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE)); - - Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID; - Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION; - Control->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE); - - // - // Each session occupies two offsets, one for the NIC section, - // the other for the Target section. - // - NumOffset = 2 * HandleCount; - if (NumOffset > 4) { - // - // Need expand the control section if more than 2 NIC/Target sections - // exist. - // - Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16)); - } -} - -/** - Add one item into the heap. - - @param[in, out] Heap On input, the current address of the heap; On output, the address of - the heap after the item is added. - @param[in] Data The data to add into the heap. - @param[in] Len Length of the Data in byte. -**/ -VOID -IScsiAddHeapItem ( - IN OUT UINT8 **Heap, - IN VOID *Data, - IN UINTN Len - ) -{ - // - // Add one byte for the NULL delimiter. - // - *Heap -= Len + 1; - - CopyMem (*Heap, Data, Len); - *(*Heap + Len) = 0; -} - -/** - Fill the Initiator section of the iSCSI Boot Firmware Table. - - @param[in] Table The ACPI table. - @param[in, out] Heap The heap. - @param[in] Handle The handle associated with the iSCSI session. -**/ -VOID -IScsiFillInitiatorSection ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN OUT UINT8 **Heap, - IN EFI_HANDLE Handle - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator; - ISCSI_DRIVER_DATA *DriverData; - ISCSI_SESSION *Session; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - EFI_STATUS Status; - - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - - // - // Initiator section immediately follows the control section. - // - Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length)); - - Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table); - - ZeroMem (Initiator, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)); - - Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID; - Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION; - Initiator->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE); - Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED; - - // - // Get the identifier from the handle. - // - Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) &IScsiIdentifier); - if (EFI_ERROR (Status)) { - ASSERT (FALSE); - return ; - } - - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - Session = &DriverData->Session; - - // - // Fill the iSCSI Initiator Name into the heap. - // - IScsiAddHeapItem (Heap, Session->InitiatorName, Session->InitiatorNameLength - 1); - - Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1); - Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); -} - -/** - Map the v4 IP address into v6 IP address. - - @param[in] V4 The v4 IP address. - @param[out] V6 The v6 IP address. -**/ -VOID -IScsiMapV4ToV6Addr ( - IN EFI_IPv4_ADDRESS *V4, - OUT EFI_IPv6_ADDRESS *V6 - ) -{ - UINTN Index; - - ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS)); - - V6->Addr[10] = 0xff; - V6->Addr[11] = 0xff; - - for (Index = 0; Index < 4; Index++) { - V6->Addr[12 + Index] = V4->Addr[Index]; - } -} - -/** - Get the NIC's PCI location and return it according to the composited - format defined in iSCSI Boot Firmware Table. - - @param[in] Controller The handle of the controller. - - @return UINT16 The composited representation of the NIC PCI location. - @retval 0 Other errors as indicated. -**/ -UINT16 -IScsiGetNICPciLocation ( - IN EFI_HANDLE Controller - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_HANDLE PciIoHandle; - EFI_PCI_IO_PROTOCOL *PciIo; - UINTN Segment; - UINTN Bus; - UINTN Device; - UINTN Function; - - Status = gBS->HandleProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **)&DevicePath - ); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = gBS->LocateDevicePath ( - &gEfiPciIoProtocolGuid, - &DevicePath, - &PciIoHandle - ); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function); - if (EFI_ERROR (Status)) { - return 0; - } - - return (UINT16) ((Bus << 8) | (Device << 3) | Function); -} - -/** - Fill the NIC and target sections in iSCSI Boot Firmware Table. - - @param[in] Table The buffer of the ACPI table. - @param[in, out] Heap The heap buffer used to store the variable length parameters such as iSCSI name. - @param[in] HandleCount Count The number of handles having iSCSI private protocol installed. - @param[in] Handles The handle buffer. -**/ -VOID -IScsiFillNICAndTargetSections ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN OUT UINT8 **Heap, - IN UINTN HandleCount, - IN EFI_HANDLE *Handles - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target; - ISCSI_DRIVER_DATA *DriverData; - ISCSI_SESSION_CONFIG_DATA *SessionConfigData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; - UINT16 *SectionOffset; - UINTN Index; - UINT16 Length; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - EFI_STATUS Status; - - // - // Get the offset of the first Nic and Target section. - // - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Table + - Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE))); - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); - - SectionOffset = &Control->NIC0Offset; - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID **)&IScsiIdentifier); - if (EFI_ERROR (Status)) { - ASSERT (FALSE); - return ; - } - - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - SessionConfigData = &DriverData->Session.ConfigData; - AuthConfig = &DriverData->Session.AuthData.AuthConfig; - - // - // Fill the Nic section. - // - ZeroMem (Nic, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)); - - Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID; - Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION; - Nic->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE); - Nic->Header.Index = (UINT8) Index; - Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID | - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED | - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL; - - // - // Get the subnet mask prefix length. - // - Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength (&SessionConfigData->NvData.SubnetMask); - - if (SessionConfigData->NvData.InitiatorInfoFromDhcp) { - Nic->Origin = IpPrefixOriginDhcp; - } else { - Nic->Origin = IpPrefixOriginManual; - } - // - // Map the various v4 addresses into v6 addresses. - // - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip); - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic->Gateway); - IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic->PrimaryDns); - IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic->SecondaryDns); - IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic->DhcpServer); - - Nic->VLanTag = NetLibGetVlanId (DriverData->Controller); - - Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac)); - - // - // Get the PCI location of the Nic. - // - Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller); - - *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table); - SectionOffset++; - - // - // Fill the Target section. - // - ZeroMem (Target, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)); - - Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID; - Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION; - Target->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE); - Target->Header.Index = (UINT8) Index; - Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED; - Target->Port = SessionConfigData->NvData.TargetPort; - Target->NicIndex = (UINT8) Index; - - if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP; - } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_CHAP; - } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP; - } - - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target->Ip); - CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof (Target->BootLun)); - - // - // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret. - // - Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName); - IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, Length); - - Target->IScsiNameLength = Length; - Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - if (Target->CHAPType != EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP) { - // - // CHAP Name - // - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName); - IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length); - Target->CHAPNameLength = Length; - Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - // - // CHAP Secret - // - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret); - IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length); - Target->CHAPSecretLength = Length; - Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) { - // - // Reverse CHAP Name - // - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName); - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length); - Target->ReverseCHAPNameLength = Length; - Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - // - // Reverse CHAP Secret - // - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret); - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length); - Target->ReverseCHAPSecretLength = Length; - Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - } - } - - *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table); - SectionOffset++; - - // - // Advance to the next NIC/Target pair - // - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Target + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE))); - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); - } -} - -/** - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI - session status. -**/ -VOID -IScsiPublishIbft ( - VOID - ) -{ - EFI_STATUS Status; - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINT8 *Heap; - UINT8 Checksum; - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; - EFI_ACPI_DESCRIPTION_HEADER *Rsdt; - EFI_ACPI_DESCRIPTION_HEADER *Xsdt; - - Rsdt = NULL; - Xsdt = NULL; - - Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol); - if (EFI_ERROR (Status)) { - return ; - } - - - // - // Find ACPI table RSD_PTR from system table - // - Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp); - if (EFI_ERROR (Status)) { - Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp); - } - - if (EFI_ERROR (Status) || (Rsdp == NULL)) { - return ; - } else if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) { - Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress; - } else if (Rsdp->RsdtAddress != 0) { - Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress; - } - - if ((Xsdt == NULL) && (Rsdt == NULL)) { - return ; - } - - if (mIbftInstalled) { - Status = AcpiTableProtocol->UninstallAcpiTable ( - AcpiTableProtocol, - mTableKey - ); - if (EFI_ERROR (Status)) { - return ; - } - mIbftInstalled = FALSE; - } - - // - // Get all iSCSI private protocols. - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiCallerIdGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (EFI_ERROR (Status)) { - return ; - } - // - // Allocate 4k bytes to hold the ACPI table. - // - Table = AllocateZeroPool (IBFT_MAX_SIZE); - if (Table == NULL) { - return ; - } - - Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET; - - // - // Fill in the various section of the iSCSI Boot Firmware Table. - // - if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) { - IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId); - } else { - IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId); - } - - IScsiInitControlSection (Table, HandleCount); - IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]); - IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer); - - Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length); - Table->Checksum = Checksum; - - FreePool (HandleBuffer); - - // - // Install or update the iBFT table. - // - Status = AcpiTableProtocol->InstallAcpiTable ( - AcpiTableProtocol, - Table, - Table->Length, - &mTableKey - ); - if (EFI_ERROR(Status)) { - return; - } - - mIbftInstalled = TRUE; - FreePool (Table); -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c deleted file mode 100644 index e753d9eebdbe..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c +++ /dev/null @@ -1,116 +0,0 @@ -/** @file - Implementation for EFI iSCSI Initiator Name Protocol. - -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = { - IScsiGetInitiatorName, - IScsiSetInitiatorName -}; - -/** - Retrieves the current set value of iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the - variable data buffer. - @param[out] Buffer Pointer to the buffer for data to be read. The data is a null-terminated UTF-8 encoded string. - The maximum length is 223 characters, including the null-terminator. - - @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the - BufferSize was sufficient to handle the iSCSI initiator name. - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiGetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - - if ((BufferSize == NULL) || (Buffer == NULL)) { - return EFI_INVALID_PARAMETER; - } - - Status = gRT->GetVariable ( - ISCSI_INITIATOR_NAME_VAR_NAME, - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - BufferSize, - Buffer - ); - - return Status; -} - -/** - Sets the iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. - @param[in] Buffer Pointer to the buffer for data to be written. The data is a null-terminated UTF-8 encoded string. - The maximum length is 223 characters, including the null-terminator. - - @retval EFI_SUCCESS Data was successfully stored by the protocol. - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written. - Currently not implemented. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit. - @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data. - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720 - (and other related protocols). - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiSetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -{ - EFI_STATUS Status; - - if ((BufferSize == NULL) || (Buffer == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if (*BufferSize > ISCSI_NAME_MAX_SIZE) { - *BufferSize = ISCSI_NAME_MAX_SIZE; - return EFI_INVALID_PARAMETER; - } - // - // only support iqn iSCSI names. - // - Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gRT->SetVariable ( - ISCSI_INITIATOR_NAME_VAR_NAME, - &gEfiIScsiInitiatorNameProtocolGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - *BufferSize, - Buffer - ); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c deleted file mode 100644 index d924a8b82427..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c +++ /dev/null @@ -1,948 +0,0 @@ -/** @file - Miscellaneous routines for iSCSI driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] = "0123456789ABCDEFabcdef"; - -/** - Removes (trims) specified leading and trailing characters from a string. - - @param[in, out] Str Pointer to the null-terminated string to be trimmed. On return, - Str will hold the trimmed string. - - @param[in] CharC Character will be trimmed from str. -**/ -VOID -StrTrim ( - IN OUT CHAR16 *Str, - IN CHAR16 CharC - ) -{ - CHAR16 *Pointer1; - CHAR16 *Pointer2; - - if (*Str == 0) { - return; - } - - // - // Trim off the leading and trailing characters c - // - for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) { - ; - } - - Pointer2 = Str; - if (Pointer2 == Pointer1) { - while (*Pointer1 != 0) { - Pointer2++; - Pointer1++; - } - } else { - while (*Pointer1 != 0) { - *Pointer2 = *Pointer1; - Pointer1++; - Pointer2++; - } - *Pointer2 = 0; - } - - - for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; Pointer1--) { - ; - } - if (Pointer1 != Str + StrLen(Str) - 1) { - *(Pointer1 + 1) = 0; - } -} - -/** - Calculate the prefix length of the IPv4 subnet mask. - - @param[in] SubnetMask The IPv4 subnet mask. - - @return The prefix length of the subnet mask. - @retval 0 Other errors as indicated. -**/ -UINT8 -IScsiGetSubnetMaskPrefixLength ( - IN EFI_IPv4_ADDRESS *SubnetMask - ) -{ - UINT8 Len; - UINT32 ReverseMask; - - // - // The SubnetMask is in network byte order. - // - ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]); - - // - // Reverse it. - // - ReverseMask = ~ReverseMask; - - if ((ReverseMask & (ReverseMask + 1)) != 0) { - return 0; - } - - Len = 0; - - while (ReverseMask != 0) { - ReverseMask = ReverseMask >> 1; - Len++; - } - - return (UINT8) (32 - Len); -} - -/** - Convert the hexadecimal encoded LUN string into the 64-bit LUN. - - @param[in] Str The hexadecimal encoded LUN string. - @param[out] Lun Storage to return the 64-bit LUN. - - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. - @retval EFI_INVALID_PARAMETER The string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToLun ( - IN CHAR8 *Str, - OUT UINT8 *Lun - ) -{ - UINTN Index, IndexValue, IndexNum, SizeStr; - CHAR8 TemStr[2]; - UINT8 TemValue; - UINT16 Value[4]; - - ZeroMem (Lun, 8); - ZeroMem (TemStr, 2); - ZeroMem ((UINT8 *) Value, sizeof (Value)); - SizeStr = AsciiStrLen (Str); - IndexValue = 0; - IndexNum = 0; - - for (Index = 0; Index < SizeStr; Index ++) { - TemStr[0] = Str[Index]; - TemValue = (UINT8) AsciiStrHexToUint64 (TemStr); - if (TemValue == 0 && TemStr[0] != '0') { - if ((TemStr[0] != '-') || (IndexNum == 0)) { - // - // Invalid Lun Char - // - return EFI_INVALID_PARAMETER; - } - } - - if ((TemValue == 0) && (TemStr[0] == '-')) { - // - // Next Lun value - // - if (++IndexValue >= 4) { - // - // Max 4 Lun value - // - return EFI_INVALID_PARAMETER; - } - // - // Restart str index for the next lun value - // - IndexNum = 0; - continue; - } - - if (++IndexNum > 4) { - // - // Each Lun Str can't exceed size 4, because it will be as UINT16 value - // - return EFI_INVALID_PARAMETER; - } - - // - // Combine UINT16 value - // - Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue); - } - - for (Index = 0; Index <= IndexValue; Index ++) { - *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]); - } - - return EFI_SUCCESS; -} - -/** - Convert the 64-bit LUN into the hexadecimal encoded LUN string. - - @param[in] Lun The 64-bit LUN. - @param[out] Str The storage to return the hexadecimal encoded LUN string. -**/ -VOID -IScsiLunToUnicodeStr ( - IN UINT8 *Lun, - OUT CHAR16 *Str - ) -{ - UINTN Index; - CHAR16 *TempStr; - - TempStr = Str; - - for (Index = 0; Index < 4; Index++) { - - if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) { - CopyMem(TempStr, L"0-", sizeof (L"0-")); - } else { - TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4]; - TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F]; - TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4]; - TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F]; - TempStr[4] = L'-'; - TempStr[5] = 0; - - StrTrim (TempStr, L'0'); - } - - TempStr += StrLen (TempStr); - } - - ASSERT (StrLen(Str) >= 1); - Str[StrLen (Str) - 1] = 0; - - for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) { - if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) { - Str[Index - 1] = 0; - } else { - break; - } - } -} - -/** - Convert the ASCII string into a UNICODE string. - - @param[in] Source The ASCII string. - @param[out] Destination The storage to return the UNICODE string. - - @return CHAR16 * Pointer to the UNICODE string. -**/ -CHAR16 * -IScsiAsciiStrToUnicodeStr ( - IN CHAR8 *Source, - OUT CHAR16 *Destination - ) -{ - ASSERT (Destination != NULL); - ASSERT (Source != NULL); - - while (*Source != '\0') { - *(Destination++) = (CHAR16) *(Source++); - } - - *Destination = '\0'; - - return Destination; -} - -/** - Convert the UNICODE string into an ASCII string. - - @param[in] Source The UNICODE string. - @param[out] Destination The storage to return the ASCII string. - - @return CHAR8 * Pointer to the ASCII string. -**/ -CHAR8 * -IScsiUnicodeStrToAsciiStr ( - IN CHAR16 *Source, - OUT CHAR8 *Destination - ) -{ - ASSERT (Destination != NULL); - ASSERT (Source != NULL); - - while (*Source != '\0') { - // - // If any Unicode characters in Source contain - // non-zero value in the upper 8 bits, then ASSERT(). - // - ASSERT (*Source < 0x100); - *(Destination++) = (CHAR8) *(Source++); - } - - *Destination = '\0'; - - return Destination; -} - -/** - Convert the decimal dotted IPv4 address into the binary IPv4 address. - - @param[in] Str The UNICODE string. - @param[out] Ip The storage to return the ASCII string. - - @retval EFI_SUCCESS The binary IP address is returned in Ip. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToIp ( - IN CHAR8 *Str, - OUT EFI_IPv4_ADDRESS *Ip - ) -{ - UINTN Index; - UINTN Number; - - Index = 0; - - while (*Str != 0) { - - if (Index > 3) { - return EFI_INVALID_PARAMETER; - } - - Number = 0; - while (NET_IS_DIGIT (*Str)) { - Number = Number * 10 + (*Str - '0'); - Str++; - } - - if (Number > 0xFF) { - return EFI_INVALID_PARAMETER; - } - - Ip->Addr[Index] = (UINT8) Number; - - if ((*Str != '\0') && (*Str != '.')) { - // - // The current character should be either the NULL terminator or - // the dot delimiter. - // - return EFI_INVALID_PARAMETER; - } - - if (*Str == '.') { - // - // Skip the delimiter. - // - Str++; - } - - Index++; - } - - if (Index != 4) { - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - -/** - Convert the mac address into a hexadecimal encoded "-" seperated string. - - @param[in] Mac The mac address. - @param[in] Len Length in bytes of the mac address. - @param[in] VlanId VLAN ID of the network device. - @param[out] Str The storage to return the mac string. -**/ -VOID -IScsiMacAddrToStr ( - IN EFI_MAC_ADDRESS *Mac, - IN UINT32 Len, - IN UINT16 VlanId, - OUT CHAR16 *Str - ) -{ - UINT32 Index; - CHAR16 *String; - - for (Index = 0; Index < Len; Index++) { - Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F]; - Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F]; - Str[3 * Index + 2] = L'-'; - } - - String = &Str[3 * Index - 1] ; - if (VlanId != 0) { - String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) VlanId); - } - - *String = L'\0'; -} - -/** - Convert the binary encoded buffer into a hexadecimal encoded string. - - @param[in] BinBuffer The buffer containing the binary data. - @param[in] BinLength Length of the binary buffer. - @param[in, out] HexStr Pointer to the string. - @param[in, out] HexLength The length of the string. - - @retval EFI_SUCCESS The binary data is converted to the hexadecimal string - and the length of the string is updated. - @retval EFI_BUFFER_TOO_SMALL The string is too small. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiBinToHex ( - IN UINT8 *BinBuffer, - IN UINT32 BinLength, - IN OUT CHAR8 *HexStr, - IN OUT UINT32 *HexLength - ) -{ - UINTN Index; - - if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) { - return EFI_INVALID_PARAMETER; - } - - if (((*HexLength) - 3) < BinLength * 2) { - *HexLength = BinLength * 2 + 3; - return EFI_BUFFER_TOO_SMALL; - } - - *HexLength = BinLength * 2 + 3; - // - // Prefix for Hex String - // - HexStr[0] = '0'; - HexStr[1] = 'x'; - - for (Index = 0; Index < BinLength; Index++) { - HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4]; - HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F]; - } - - HexStr[Index * 2 + 2] = '\0'; - - return EFI_SUCCESS; -} - -/** - Convert the hexadecimal string into a binary encoded buffer. - - @param[in, out] BinBuffer The binary buffer. - @param[in, out] BinLength Length of the binary buffer. - @param[in] HexStr The hexadecimal string. - - @retval EFI_SUCCESS The hexadecimal string is converted into a binary - encoded buffer. - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data. -**/ -EFI_STATUS -IScsiHexToBin ( - IN OUT UINT8 *BinBuffer, - IN OUT UINT32 *BinLength, - IN CHAR8 *HexStr - ) -{ - UINTN Index; - UINTN Length; - UINT8 Digit; - CHAR8 TemStr[2]; - - ZeroMem (TemStr, sizeof (TemStr)); - - // - // Find out how many hex characters the string has. - // - if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) { - HexStr += 2; - } - - Length = AsciiStrLen (HexStr); - - for (Index = 0; Index < Length; Index ++) { - TemStr[0] = HexStr[Index]; - Digit = (UINT8) AsciiStrHexToUint64 (TemStr); - if (Digit == 0 && TemStr[0] != '0') { - // - // Invalid Lun Char - // - break; - } - if ((Index & 1) == 0) { - BinBuffer [Index/2] = Digit; - } else { - BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit); - } - } - - *BinLength = (UINT32) ((Index + 1)/2); - - return EFI_SUCCESS; -} - -/** - Generate random numbers. - - @param[in, out] Rand The buffer to contain random numbers. - @param[in] RandLength The length of the Rand buffer. -**/ -VOID -IScsiGenRandom ( - IN OUT UINT8 *Rand, - IN UINTN RandLength - ) -{ - UINT32 Random; - - while (RandLength > 0) { - Random = NET_RANDOM (NetRandomInitSeed ()); - *Rand++ = (UINT8) (Random); - RandLength--; - } -} - -/** - Create the iSCSI driver data.. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - - @return The iSCSI driver data created. - @retval NULL Other errors as indicated. -**/ -ISCSI_DRIVER_DATA * -IScsiCreateDriverData ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller - ) -{ - ISCSI_DRIVER_DATA *Private; - EFI_STATUS Status; - - Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA)); - if (Private == NULL) { - return NULL; - } - - Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE; - Private->Image = Image; - Private->Controller = Controller; - - // - // Create an event to be signal when the BS to RT transition is triggerd so - // as to abort the iSCSI session. - // - Status = gBS->CreateEventEx ( - EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - IScsiOnExitBootService, - Private, - &gEfiEventExitBootServicesGuid, - &Private->ExitBootServiceEvent - ); - if (EFI_ERROR (Status)) { - FreePool (Private); - return NULL; - } - - CopyMem(&Private->IScsiExtScsiPassThru, &gIScsiExtScsiPassThruProtocolTemplate, sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL)); - - // - // 0 is designated to the TargetId, so use another value for the AdapterId. - // - Private->ExtScsiPassThruMode.AdapterId = 2; - Private->ExtScsiPassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL; - Private->ExtScsiPassThruMode.IoAlign = 4; - Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode; - - // - // Install the Ext SCSI PASS THRU protocol. - // - Status = gBS->InstallProtocolInterface ( - &Private->ExtScsiPassThruHandle, - &gEfiExtScsiPassThruProtocolGuid, - EFI_NATIVE_INTERFACE, - &Private->IScsiExtScsiPassThru - ); - if (EFI_ERROR (Status)) { - gBS->CloseEvent (Private->ExitBootServiceEvent); - FreePool (Private); - - return NULL; - } - - IScsiSessionInit (&Private->Session, FALSE); - - return Private; -} - -/** - Clean the iSCSI driver data. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The clean operation is successful. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiCleanDriverData ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - EFI_STATUS Status; - - Status = EFI_SUCCESS; - - if (Private->DevicePath != NULL) { - Status = gBS->UninstallProtocolInterface ( - Private->ExtScsiPassThruHandle, - &gEfiDevicePathProtocolGuid, - Private->DevicePath - ); - if (EFI_ERROR (Status)) { - goto EXIT; - } - - FreePool (Private->DevicePath); - } - - if (Private->ExtScsiPassThruHandle != NULL) { - Status = gBS->UninstallProtocolInterface ( - Private->ExtScsiPassThruHandle, - &gEfiExtScsiPassThruProtocolGuid, - &Private->IScsiExtScsiPassThru - ); - } - -EXIT: - if (Private->ExitBootServiceEvent != NULL) { - gBS->CloseEvent (Private->ExitBootServiceEvent); - } - - FreePool (Private); - return Status; -} - -/** - Check wheather the Controller is configured to use DHCP protocol. - - @param[in] Controller The handle of the controller. - - @retval TRUE The handle of the controller need the Dhcp protocol. - @retval FALSE The handle of the controller does not need the Dhcp protocol. - -**/ -BOOLEAN -IScsiDhcpIsConfigured ( - IN EFI_HANDLE Controller - ) -{ - EFI_STATUS Status; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 MacString[70]; - ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp; - - // - // Get the mac string, it's the name of various variable - // - Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize); - if (EFI_ERROR (Status)) { - return FALSE; - } - VlanId = NetLibGetVlanId (Controller); - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString); - - // - // Get the normal configuration. - // - Status = GetVariable2 ( - MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - (VOID**)&ConfigDataTmp, - NULL - ); - if (ConfigDataTmp == NULL || EFI_ERROR (Status)) { - return FALSE; - } - - if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) { - FreePool (ConfigDataTmp); - return TRUE; - } - - FreePool (ConfigDataTmp); - return FALSE; -} - -/** - Get the various configuration data of this iSCSI instance. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The configuration of this instance is got. - @retval EFI_ABORTED The operation was aborted. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiGetConfigData ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - UINTN BufferSize; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 MacString[70]; - - // - // get the iSCSI Initiator Name - // - Session = &Private->Session; - Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE; - Status = gIScsiInitiatorName.Get ( - &gIScsiInitiatorName, - &Session->InitiatorNameLength, - Session->InitiatorName - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Get the mac string, it's the name of various variable - // - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - VlanId = NetLibGetVlanId (Private->Controller); - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString); - - // - // Get the normal configuration. - // - BufferSize = sizeof (Session->ConfigData.NvData); - Status = gRT->GetVariable ( - MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - &BufferSize, - &Session->ConfigData.NvData - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (!Session->ConfigData.NvData.Enabled) { - return EFI_ABORTED; - } - // - // Get the CHAP Auth information. - // - BufferSize = sizeof (Session->AuthData.AuthConfig); - Status = gRT->GetVariable ( - MacString, - &gIScsiCHAPAuthInfoGuid, - NULL, - &BufferSize, - &Session->AuthData.AuthConfig - ); - - if (!EFI_ERROR (Status) && Session->ConfigData.NvData.InitiatorInfoFromDhcp) { - // - // Start dhcp. - // - Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session->ConfigData); - } - - return Status; -} - -/** - Get the device path of the iSCSI tcp connection and update it. - - @param[in] Private The iSCSI driver data. - - @return The updated device path. - @retval NULL Other errors as indicated. -**/ -EFI_DEVICE_PATH_PROTOCOL * -IScsiGetTcpConnDevicePath ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - ISCSI_SESSION *Session; - ISCSI_CONNECTION *Conn; - TCP4_IO *Tcp4Io; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_STATUS Status; - EFI_DEV_PATH *DPathNode; - - Session = &Private->Session; - if (Session->State != SESSION_STATE_LOGGED_IN) { - return NULL; - } - - Conn = NET_LIST_USER_STRUCT_S ( - Session->Conns.ForwardLink, - ISCSI_CONNECTION, - Link, - ISCSI_CONNECTION_SIGNATURE - ); - Tcp4Io = &Conn->Tcp4Io; - - Status = gBS->HandleProtocol ( - Tcp4Io->Handle, - &gEfiDevicePathProtocolGuid, - (VOID **)&DevicePath - ); - if (EFI_ERROR (Status)) { - return NULL; - } - // - // Duplicate it. - // - DevicePath = DuplicateDevicePath (DevicePath); - if (DevicePath == NULL) { - return NULL; - } - - DPathNode = (EFI_DEV_PATH *) DevicePath; - - while (!IsDevicePathEnd (&DPathNode->DevPath)) { - if ((DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH) && - (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP) - ) { - - DPathNode->Ipv4.LocalPort = 0; - DPathNode->Ipv4.StaticIpAddress = - (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp); - - // - // Add a judgement here to support previous versions of IPv4_DEVICE_PATH. - // In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and SubnetMask - // do not exist. - // In new version of IPv4_DEVICE_PATH, structcure length is 27. - // - if (DevicePathNodeLength (&DPathNode->Ipv4) == IP4_NODE_LEN_NEW_VERSIONS) { - - IP4_COPY_ADDRESS ( - &DPathNode->Ipv4.GatewayIpAddress, - &Session->ConfigData.NvData.Gateway - ); - - IP4_COPY_ADDRESS ( - &DPathNode->Ipv4.SubnetMask, - &Session->ConfigData.NvData.SubnetMask - ); - } - - break; - } - - DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath); - } - - return DevicePath; -} - -/** - Abort the session when the transition from BS to RT is initiated. - - @param[in] Event The event signaled. - @param[in] Context The iSCSI driver data. -**/ -VOID -EFIAPI -IScsiOnExitBootService ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - ISCSI_DRIVER_DATA *Private; - - Private = (ISCSI_DRIVER_DATA *) Context; - - gBS->CloseEvent (Private->ExitBootServiceEvent); - Private->ExitBootServiceEvent = NULL; - - IScsiSessionAbort (&Private->Session); -} - -/** - Tests whether a controller handle is being managed by IScsi driver. - - This function tests whether the driver specified by DriverBindingHandle is - currently managing the controller specified by ControllerHandle. This test - is performed by evaluating if the the protocol specified by ProtocolGuid is - present on ControllerHandle and is was opened by DriverBindingHandle and Nic - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. - If ProtocolGuid is NULL, then ASSERT(). - - @param ControllerHandle A handle for a controller to test. - @param DriverBindingHandle Specifies the driver binding handle for the - driver. - @param ProtocolGuid Specifies the protocol that the driver specified - by DriverBindingHandle opens in its Start() - function. - - @retval EFI_SUCCESS ControllerHandle is managed by the driver - specified by DriverBindingHandle. - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver - specified by DriverBindingHandle. - -**/ -EFI_STATUS -EFIAPI -IScsiTestManagedDevice ( - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE DriverBindingHandle, - IN EFI_GUID *ProtocolGuid - ) -{ - EFI_STATUS Status; - VOID *ManagedInterface; - EFI_HANDLE NicControllerHandle; - - ASSERT (ProtocolGuid != NULL); - - NicControllerHandle = NetLibGetNicHandle (ControllerHandle, ProtocolGuid); - if (NicControllerHandle == NULL) { - return EFI_UNSUPPORTED; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - (EFI_GUID *) ProtocolGuid, - &ManagedInterface, - DriverBindingHandle, - NicControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (!EFI_ERROR (Status)) { - gBS->CloseProtocol ( - ControllerHandle, - (EFI_GUID *) ProtocolGuid, - DriverBindingHandle, - NicControllerHandle - ); - return EFI_UNSUPPORTED; - } - - if (Status != EFI_ALREADY_STARTED) { - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c deleted file mode 100644 index b4a5c2d02413..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c +++ /dev/null @@ -1,2799 +0,0 @@ -/** @file - The implementation of iSCSI protocol based on RFC3720. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -UINT32 mDataSegPad = 0; - -/** - Attach the iSCSI connection to the iSCSI session. - - @param[in, out] Session The iSCSI session. - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiAttatchConnection ( - IN OUT ISCSI_SESSION *Session, - IN OUT ISCSI_CONNECTION *Conn - ) -{ - InsertTailList (&Session->Conns, &Conn->Link); - Conn->Session = Session; - Session->NumConns++; -} - -/** - Detach the iSCSI connection from the session it belongs to. - - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiDetatchConnection ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - RemoveEntryList (&Conn->Link); - Conn->Session->NumConns--; - Conn->Session = NULL; -} - -/** - Check the sequence number according to RFC3720. - - @param[in, out] ExpSN The currently expected sequence number. - @param[in] NewSN The sequence number to check. - - @retval EFI_SUCCESS The check passed and the ExpSN is increased. - @retval EFI_NOT_READY Response was sent due to a retransmission request. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. -**/ -EFI_STATUS -IScsiCheckSN ( - IN OUT UINT32 *ExpSN, - IN UINT32 NewSN - ) -{ - if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) { - if (ISCSI_SEQ_LT (NewSN, *ExpSN)) { - // - // Duplicate - // - return EFI_NOT_READY; - } else { - return EFI_PROTOCOL_ERROR; - } - } else { - // - // Advance the ExpSN - // - (*ExpSN)++; - return EFI_SUCCESS; - } -} - -/** - Update the sequence numbers for the iSCSI command. - - @param[in, out] Session The iSCSI session. - @param[in] MaxCmdSN Maximum CmdSN from the target. - @param[in] ExpCmdSN Next expected CmdSN from the target. -**/ -VOID -IScsiUpdateCmdSN ( - IN OUT ISCSI_SESSION *Session, - IN UINT32 MaxCmdSN, - IN UINT32 ExpCmdSN - ) -{ - if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) { - return ; - } - - if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) { - Session->MaxCmdSN = MaxCmdSN; - } - - if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) { - Session->ExpCmdSN = ExpCmdSN; - } -} - -/** - This function does the iSCSI connection login. - - @param[in, out] Conn The iSCSI connection to login. - - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target. - @retval EFI_TIMEOUT Timeout happened during the login procedure. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConnLogin ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - - // - // Start the timer, wait 16 seconds to establish the TCP connection. - // - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 * TICKS_PER_SECOND); - if (EFI_ERROR (Status)) { - return Status; - } - // - // try to establish the tcp connection - // - Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent); - if (EFI_ERROR (Status)) { - return Status; - } - - gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0); - Conn->State = CONN_STATE_IN_LOGIN; - - // - // connection is established, start the iSCSI Login - // - do { - Status = IScsiSendLoginReq (Conn); - if (EFI_ERROR (Status)) { - break; - } - - Status = IScsiReceiveLoginRsp (Conn); - if (EFI_ERROR (Status)) { - break; - } - } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE); - - return Status; -} - -/** - Reset the iSCSI connection. - - @param[in, out] Conn The iSCSI connection to reset. -**/ -VOID -IScsiConnReset ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - Tcp4IoReset (&Conn->Tcp4Io); -} - -/** - Create a TCP connection for the iSCSI session. - - @param[in] Private The iSCSI driver data. - @param[in] Session Maximum CmdSN from the target. - - @return The newly created iSCSI connection. -**/ -ISCSI_CONNECTION * -IScsiCreateConnection ( - IN ISCSI_DRIVER_DATA *Private, - IN ISCSI_SESSION *Session - ) -{ - ISCSI_CONNECTION *Conn; - TCP4_IO_CONFIG_DATA Tcp4IoConfig; - EFI_STATUS Status; - - Conn = AllocatePool (sizeof (ISCSI_CONNECTION)); - if (Conn == NULL) { - return NULL; - } - - Conn->Signature = ISCSI_CONNECTION_SIGNATURE; - Conn->State = CONN_STATE_FREE; - Conn->CurrentStage = ISCSI_SECURITY_NEGOTIATION; - Conn->NextStage = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION; - Conn->CHAPStep = ISCSI_CHAP_INITIAL; - Conn->ExpStatSN = 0; - Conn->PartialReqSent = FALSE; - Conn->PartialRspRcvd = FALSE; - Conn->Cid = Session->NextCid++; - - Status = gBS->CreateEvent ( - EVT_TIMER, - TPL_CALLBACK, - NULL, - NULL, - &Conn->TimeoutEvent - ); - if (EFI_ERROR (Status)) { - FreePool (Conn); - return NULL; - } - - NetbufQueInit (&Conn->RspQue); - - // - // set the default connection-only parameters - // - Conn->MaxRecvDataSegmentLength = DEFAULT_MAX_RECV_DATA_SEG_LEN; - Conn->HeaderDigest = IScsiDigestNone; - Conn->DataDigest = IScsiDigestNone; - - CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Tcp4IoConfig.SubnetMask, &Session->ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Tcp4IoConfig.Gateway, &Session->ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Tcp4IoConfig.RemoteIp, &Session->ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS)); - - Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort; - - // - // Create the tcp4 IO for this connection - // - Status = Tcp4IoCreateSocket ( - Private->Image, - Private->Controller, - &Tcp4IoConfig, - &Conn->Tcp4Io - ); - if (EFI_ERROR (Status)) { - gBS->CloseEvent (Conn->TimeoutEvent); - FreePool (Conn); - Conn = NULL; - } - - return Conn; -} - -/** - Destroy an iSCSI connection. - - @param[in] Conn The connection to destroy. -**/ -VOID -IScsiDestroyConnection ( - IN ISCSI_CONNECTION *Conn - ) -{ - Tcp4IoDestroySocket (&Conn->Tcp4Io); - NetbufQueFlush (&Conn->RspQue); - gBS->CloseEvent (Conn->TimeoutEvent); - FreePool (Conn); -} - -/** - Login the iSCSI session. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The iSCSI session login procedure finished. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiSessionLogin ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_CONNECTION *Conn; - EFI_TCP4_PROTOCOL *Tcp4; - EFI_STATUS MediaStatus; - - Session = &Private->Session; - - // - // Check media status before session login - // - MediaStatus = EFI_SUCCESS; - NetLibDetectMediaWaitTimeout (Private->Controller, ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus); - if (MediaStatus != EFI_SUCCESS) { - return EFI_NO_MEDIA; - } - - // - // Set session identifier - // - CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6); - - // - // Create a connection for the session. - // - Conn = IScsiCreateConnection (Private, Session); - if (Conn == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - IScsiAttatchConnection (Session, Conn); - - // - // Login througth the newly created connection. - // - Status = IScsiConnLogin (Conn); - if (EFI_ERROR (Status)) { - IScsiConnReset (Conn); - IScsiDetatchConnection (Conn); - IScsiDestroyConnection (Conn); - } else { - Session->State = SESSION_STATE_LOGGED_IN; - - gBS->OpenProtocol ( - Conn->Tcp4Io.Handle, - &gEfiTcp4ProtocolGuid, - (VOID **)&Tcp4, - Private->Image, - Private->ExtScsiPassThruHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } - - return Status; -} - -/** - Build and send the iSCSI login request to the iSCSI target according to - the current login stage. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this - connection. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_DEVICE_ERROR Some kind of device error happened. -**/ -EFI_STATUS -IScsiSendLoginReq ( - IN ISCSI_CONNECTION *Conn - ) -{ - NET_BUF *Pdu; - EFI_STATUS Status; - - // - // build the Login Request PDU - // - Pdu = IScsiPrepareLoginReq (Conn); - if (Pdu == NULL) { - return EFI_DEVICE_ERROR; - } - // - // Send it to the iSCSI target. - // - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); - - NetbufFree (Pdu); - - return Status; -} - -/** - Receive and process the iSCSI login response. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login response PDU is received and processed. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceiveLoginRsp ( - IN ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - NET_BUF *Pdu; - - Pdu = NULL; - - // - // Receive the iSCSI login response. - // - Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL); - if (EFI_ERROR (Status)) { - return Status; - } - // - // A Login Response is received, process it. - // - ASSERT (Pdu != NULL); - Status = IScsiProcessLoginRsp (Conn, Pdu); - - NetbufFree (Pdu); - - return Status; -} - -/** - Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU. - The DataSegmentLength and the actual size of the net buffer containing this PDU will be - updated. - - @param[in, out] Pdu The iSCSI PDU whose data segment the key-value pair will - be added to. - @param[in] Key The key name string. - @param[in] Value The value string. - - @retval EFI_SUCCESS The key-valu pair is added to the PDU's datasegment and - the correspondence length fields are updated. - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value - pair. -**/ -EFI_STATUS -IScsiAddKeyValuePair ( - IN OUT NET_BUF *Pdu, - IN CHAR8 *Key, - IN CHAR8 *Value - ) -{ - UINT32 DataSegLen; - UINT32 KeyLen; - UINT32 ValueLen; - UINT32 TotalLen; - ISCSI_LOGIN_REQUEST *LoginReq; - CHAR8 *Data; - - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL); - if (LoginReq == NULL) { - return EFI_PROTOCOL_ERROR; - } - DataSegLen = NTOH24 (LoginReq->DataSegmentLength); - - KeyLen = (UINT32) AsciiStrLen (Key); - ValueLen = (UINT32) AsciiStrLen (Value); - - // - // 1 byte for the key value separator '=' and 1 byte for the null - // delimiter after the value. - // - TotalLen = KeyLen + 1 + ValueLen + 1; - - // - // Allocate the space for the key-value pair. - // - Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - // - // Add the key. - // - CopyMem (Data, Key, KeyLen); - Data += KeyLen; - - *Data = '='; - Data++; - - // - // Add the value. - // - CopyMem (Data, Value, ValueLen); - Data += ValueLen; - - *Data = '\0'; - - // - // update the DataSegmentLength - // - ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen); - - return EFI_SUCCESS; -} - -/** - Prepare the iSCSI login request to be sent according to the current login status. - - @param[in, out] Conn The connection in the iSCSI login phase. - - @return The pointer to the net buffer containing the iSCSI login request built. - @retval Others Other errors as indicated. -**/ -NET_BUF * -IScsiPrepareLoginReq ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - ISCSI_SESSION *Session; - NET_BUF *Nbuf; - ISCSI_LOGIN_REQUEST *LoginReq; - EFI_STATUS Status; - - Session = Conn->Session; - - Nbuf = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) + DEFAULT_MAX_RECV_DATA_SEG_LEN); - if (Nbuf == NULL) { - return NULL; - } - - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL); - ASSERT (LoginReq != NULL); - ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST)); - - // - // Init the login request pdu - // - ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ, ISCSI_REQ_IMMEDIATE); - ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage); - LoginReq->VersionMax = ISCSI_VERSION_MAX; - LoginReq->VersionMin = ISCSI_VERSION_MIN; - LoginReq->Tsih = HTONS (Session->Tsih); - LoginReq->InitiatorTaskTag = HTONL (Session->InitiatorTaskTag); - LoginReq->Cid = HTONS (Conn->Cid); - LoginReq->CmdSN = HTONL (Session->CmdSN); - - // - // For the first Login Request on a coonection this is ExpStatSN for the - // old connection and this field is only valid if the Login Request restarts - // a connection. - // For subsequent Login Requests it is used to acknowledge the Login Responses - // with their increasing StatSN values. - // - LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN); - CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid)); - - if (Conn->PartialRspRcvd) { - // - // A partial response, initiator must send an empty Login Request. - // - return Nbuf; - } - - switch (Conn->CurrentStage) { - case ISCSI_SECURITY_NEGOTIATION: - Status = IScsiCHAPToSendReq (Conn, Nbuf); - break; - - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: - Status = IScsiFillOpParams (Conn, Nbuf); - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - break; - - default: - // - // something error happens... - // - Status = EFI_DEVICE_ERROR; - break; - } - - if (EFI_ERROR (Status)) { - NetbufFree (Nbuf); - Nbuf = NULL; - } else { - // - // Pad the data segment if needed. - // - IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq)); - // - // Check whether we will issue the stage transition signal? - // - Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - } - - return Nbuf; -} - -/** - Process the iSCSI Login Response. - - @param[in, out] Conn The connection on which the iSCSI login response is received. - @param[in, out] Pdu The iSCSI login response PDU. - - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all check are passed. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_MEDIA_CHANGED Target is redirected. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiProcessLoginRsp ( - IN OUT ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_LOGIN_RESPONSE *LoginRsp; - BOOLEAN Transit; - BOOLEAN Continue; - UINT8 CurrentStage; - UINT8 NextStage; - UINT8 *DataSeg; - UINT32 DataSegLen; - - Session = Conn->Session; - - LoginRsp = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL); - if (LoginRsp == NULL) { - return EFI_PROTOCOL_ERROR; - } - if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) { - // - // It's not a Login Response - // - return EFI_PROTOCOL_ERROR; - } - // - // Get the data segment if any. - // - DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp); - if (DataSegLen != 0) { - DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL); - } else { - DataSeg = NULL; - } - // - // Check the status class in the login response PDU. - // - switch (LoginRsp->StatusClass) { - case ISCSI_LOGIN_STATUS_SUCCESS: - // - // Just break here, the response and the data segment will be processed later. - // - break; - - case ISCSI_LOGIN_STATUS_REDIRECTION: - // - // The target may be moved to a different address - // - if (DataSeg == NULL) { - return EFI_PROTOCOL_ERROR; - } - // - // Process the TargetAddress key-value strings in the data segment to update the - // target address info. - // - Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg, DataSegLen); - if (EFI_ERROR (Status)) { - return Status; - } - // - // Session will be restarted on this error status because the Target is - // redirected by this Login Response. - // - return EFI_MEDIA_CHANGED; - - default: - // - // Initiator Error, Target Error, or any other undefined error code. - // - return EFI_PROTOCOL_ERROR; - } - // - // The status is sucess, extract the wanted fields from the header segment. - // - Transit = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT); - Continue = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE); - - CurrentStage = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp); - NextStage = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp); - - LoginRsp->InitiatorTaskTag = NTOHL (LoginRsp->InitiatorTaskTag); - - if ((Transit && Continue) || - (CurrentStage != Conn->CurrentStage) || - (!Conn->TransitInitiated && Transit) || - (Transit && (NextStage != Conn->NextStage)) || - (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) != 0) || - (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag) - ) { - // - // A Login Response with the C bit set to 1 MUST have the T bit set to 0; - // The CSG in the Login Response MUST be the same with the I-end of this connection; - // The T bit can't be 1 if the last Login Response sent by the initiator doesn't - // initiate the transistion; - // The NSG MUST be the same with the I-end of this connection if Transit is required. - // The ISID in the Login Response MUST be the same with this session. - // - return EFI_PROTOCOL_ERROR; - } - - LoginRsp->StatSN = NTOHL (LoginRsp->StatSN); - LoginRsp->ExpCmdSN = NTOHL (LoginRsp->ExpCmdSN); - LoginRsp->MaxCmdSN = NTOHL (LoginRsp->MaxCmdSN); - - if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn->CHAPStep == ISCSI_CHAP_INITIAL)) { - // - // If the Login Request is a leading Login Request, the target MUST use - // the value presented in CmdSN as the target value for ExpCmdSN. - // - if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN != LoginRsp->ExpCmdSN)) { - return EFI_PROTOCOL_ERROR; - } - - // - // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN - // and ExpCmdSN. - // - Conn->ExpStatSN = LoginRsp->StatSN + 1; - Session->MaxCmdSN = LoginRsp->MaxCmdSN; - Session->ExpCmdSN = LoginRsp->ExpCmdSN; - } else { - // - // Check the StatSN of this PDU - // - Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN); - if (!EFI_ERROR (Status)) { - // - // Update the MaxCmdSN and ExpCmdSN - // - IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp->ExpCmdSN); - } else { - return Status; - } - } - // - // Trim off the header segment. - // - NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD); - - // - // Queue this login response first in case it's a partial response so that - // later when the full response list is received we can combine these scattered - // responses' data segment and then process it. - // - NET_GET_REF (Pdu); - NetbufQueAppend (&Conn->RspQue, Pdu); - - Conn->PartialRspRcvd = Continue; - if (Continue) { - // - // It's a partial response, have to wait for another or more Request/Response - // conversations to get the full response. - // - return EFI_SUCCESS; - } - - switch (CurrentStage) { - case ISCSI_SECURITY_NEGOTIATION: - // - // In security negotiation stage, let CHAP module handle it. - // - Status = IScsiCHAPOnRspReceived (Conn); - break; - - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: - // - // Response received with negotiation resonse on iSCSI parameters, check them. - // - Status = IScsiCheckOpParams (Conn); - break; - - default: - // - // Should never get here. - // - Status = EFI_PROTOCOL_ERROR; - break; - } - - if (Transit && (Status == EFI_SUCCESS)) { - // - // Do the state transition. - // - Conn->CurrentStage = Conn->NextStage; - - if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) { - Conn->NextStage = ISCSI_FULL_FEATURE_PHASE; - } else { - // - // CurrentStage is iSCSI Full Feature, it's the Login-Final Response, - // get the TSIH from the Login Response. - // - Session->Tsih = NTOHS (LoginRsp->Tsih); - } - } - // - // Flush the response(s) received. - // - NetbufQueFlush (&Conn->RspQue); - - return Status; -} - -/** - Updated the target information according the data received in the iSCSI - login response with an target redirection status. - - @param[in, out] Session The iSCSI session. - @param[in] Data The data segment which should contain the - TargetAddress key-value list. - @param[in] Len Length of the data. - - @retval EFI_SUCCESS The target address is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_FOUND The TargetAddress key is not found. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiUpdateTargetAddress ( - IN OUT ISCSI_SESSION *Session, - IN CHAR8 *Data, - IN UINT32 Len - ) -{ - LIST_ENTRY *KeyValueList; - CHAR8 *TargetAddress; - CHAR8 *IpStr; - EFI_STATUS Status; - UINTN Number; - - KeyValueList = IScsiBuildKeyValueList (Data, Len); - if (KeyValueList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = EFI_NOT_FOUND; - - while (TRUE) { - TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ADDRESS); - if (TargetAddress == NULL) { - break; - } - - if (!NET_IS_DIGIT (TargetAddress[0])) { - // - // The domainname of the target may be presented in three formats: a DNS host name, - // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only accept dotted - // IPv4 address. - // - continue; - } - - IpStr = TargetAddress; - - while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) { - // - // NULL, ':' or ',' ends the IPv4 string. - // - TargetAddress++; - } - - if (*TargetAddress == ',') { - // - // Comma and the portal group tag MUST be ommitted if the TargetAddress is sent - // as the result of a redirection. - // - continue; - } else if (*TargetAddress == ':') { - *TargetAddress = '\0'; - - TargetAddress++; - - Number = AsciiStrDecimalToUintn (TargetAddress); - if (Number > 0xFFFF) { - continue; - } else { - Session->ConfigData.NvData.TargetPort = (UINT16) Number; - } - } else { - // - // The string only contains the IPv4 address. Use the well known port. - // - Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT; - } - // - // Update the target IP address. - // - Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp); - if (EFI_ERROR (Status)) { - continue; - } else { - break; - } - } - - IScsiFreeKeyValueList (KeyValueList); - - return Status; -} - -/** - The callback function to free the net buffer list. - - @param[in] Arg The opaque parameter. -**/ -VOID -EFIAPI -IScsiFreeNbufList ( - VOID *Arg - ) -{ - ASSERT (Arg != NULL); - - NetbufFreeList ((LIST_ENTRY *) Arg); - FreePool (Arg); -} - -/** - The callback function called in NetBufFree, it does nothing. - - @param[in] Arg The opaque parameter. -**/ -VOID -EFIAPI -IScsiNbufExtFree ( - VOID *Arg - ) -{ -} - -/** - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and - an optional data segment. The two parts will be put into two blocks of buffers in the - net buffer. The digest check will be conducted in this function if needed and the digests - will be trimmed from the PDU buffer. - - @param[in] Conn The iSCSI connection to receive data from. - @param[out] Pdu The received iSCSI pdu. - @param[in] Context The context used to describe information on the caller provided - buffer to receive data segment of the iSCSI pdu, it's optional. - @param[in] HeaderDigest Whether there will be header digest received. - @param[in] DataDigest Whether there will be data digest. - @param[in] TimeoutEvent The timeout event, it's optional. - - @retval EFI_SUCCESS An iSCSI pdu is received. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceivePdu ( - IN ISCSI_CONNECTION *Conn, - OUT NET_BUF **Pdu, - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL - IN BOOLEAN HeaderDigest, - IN BOOLEAN DataDigest, - IN EFI_EVENT TimeoutEvent OPTIONAL - ) -{ - LIST_ENTRY *NbufList; - UINT32 Len; - NET_BUF *PduHdr; - UINT8 *Header; - EFI_STATUS Status; - UINT32 PadLen; - UINT32 InDataOffset; - NET_FRAGMENT Fragment[2]; - UINT32 FragmentCount; - NET_BUF *DataSeg; - UINT32 PadAndCRC32[2]; - - NbufList = AllocatePool (sizeof (LIST_ENTRY)); - if (NbufList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - InitializeListHead (NbufList); - - // - // The header digest will be received together with the PDU header if exists. - // - Len = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0); - PduHdr = NetbufAlloc (Len); - if (PduHdr == NULL) { - FreePool (NbufList); - return EFI_OUT_OF_RESOURCES; - } - - Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL); - ASSERT (Header != NULL); - InsertTailList (NbufList, &PduHdr->List); - - // - // First step, receive the BHS of the PDU. - // - Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - if (HeaderDigest) { - // - // TODO: check the header-digest. - // - // - // Trim off the digest. - // - NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL); - } - - Len = ISCSI_GET_DATASEG_LEN (Header); - if (Len == 0) { - // - // No data segment.Form the pdu from a list of pdu segments. - // - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (*Pdu == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - return Status; - } - // - // Get the length of the padding bytes of the data segment. - // - PadLen = ISCSI_GET_PAD_LEN (Len); - - switch (ISCSI_GET_OPCODE (Header)) { - case ISCSI_OPCODE_SCSI_DATA_IN: - // - // Try to use the buffer described by Context if the PDU is an - // iSCSI SCSI data in pdu so as to reduce memory copy overhead. - // - InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header); - if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) { - Status = EFI_PROTOCOL_ERROR; - goto ON_EXIT; - } - - Fragment[0].Len = Len; - Fragment[0].Bulk = Context->InData + InDataOffset; - - if (DataDigest || (PadLen != 0)) { - // - // The data segment is padded, use two fragments to receive it. - // The first to receive the useful data. The second to receive the padding. - // - Fragment[1].Len = PadLen + (DataDigest ? sizeof (UINT32) : 0); - Fragment[1].Bulk = (UINT8 *)PadAndCRC32 + (4 - PadLen); - FragmentCount = 2; - } else { - FragmentCount = 1; - } - - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL); - if (DataSeg == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - break; - - case ISCSI_OPCODE_SCSI_RSP: - case ISCSI_OPCODE_NOP_IN: - case ISCSI_OPCODE_LOGIN_RSP: - case ISCSI_OPCODE_TEXT_RSP: - case ISCSI_OPCODE_ASYNC_MSG: - case ISCSI_OPCODE_REJECT: - case ISCSI_OPCODE_VENDOR_T0: - case ISCSI_OPCODE_VENDOR_T1: - case ISCSI_OPCODE_VENDOR_T2: - // - // Allocate buffer to receive the data segment. - // - Len += PadLen + (DataDigest ? sizeof (UINT32) : 0); - DataSeg = NetbufAlloc (Len); - if (DataSeg == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL); - break; - - default: - Status = EFI_PROTOCOL_ERROR; - goto ON_EXIT; - } - - InsertTailList (NbufList, &DataSeg->List); - - // - // Receive the data segment with the data digest if any. - // - Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - if (DataDigest) { - // - // TODO: Check the data digest. - // - NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL); - } - - if (PadLen != 0) { - // - // Trim off the padding bytes in the data segment. - // - NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL); - } - - // - // Form the pdu from a list of pdu segments. - // - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (*Pdu == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } - -ON_EXIT: - - if (EFI_ERROR (Status)) { - // - // Free the Nbufs in this NbufList and the NbufList itself. - // - IScsiFreeNbufList (NbufList); - } - - return Status; -} - -/** - Check and get the result of the prameter negotiation. - - @param[in, out] Conn The connection in iSCSI login. - - @retval EFI_SUCCESS The parmeter check is passed and negotiation is finished. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiCheckOpParams ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - LIST_ENTRY *KeyValueList; - CHAR8 *Data; - UINT32 Len; - ISCSI_SESSION *Session; - CHAR8 *Value; - UINTN NumericValue; - - ASSERT (Conn->RspQue.BufNum != 0); - - Session = Conn->Session; - - Len = Conn->RspQue.BufSize; - Data = AllocatePool (Len); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data); - - Status = EFI_PROTOCOL_ERROR; - - // - // Extract the Key-Value pairs into a list. - // - KeyValueList = IScsiBuildKeyValueList (Data, Len); - if (KeyValueList == NULL) { - FreePool (Data); - return Status; - } - // - // HeaderDigest - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_HEADER_DIGEST); - if (Value == NULL) { - goto ON_ERROR; - } - - if (AsciiStrCmp (Value, "CRC32") == 0) { - if (Conn->HeaderDigest != IScsiDigestCRC32) { - goto ON_ERROR; - } - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { - Conn->HeaderDigest = IScsiDigestNone; - } else { - goto ON_ERROR; - } - // - // DataDigest - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_DIGEST); - if (Value == NULL) { - goto ON_ERROR; - } - - if (AsciiStrCmp (Value, "CRC32") == 0) { - if (Conn->DataDigest != IScsiDigestCRC32) { - goto ON_ERROR; - } - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { - Conn->DataDigest = IScsiDigestNone; - } else { - goto ON_ERROR; - } - // - // ErrorRecoveryLevel, result fuction is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_ERROR_RECOVERY_LEVEL); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if (NumericValue > 2) { - goto ON_ERROR; - } - - Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel, NumericValue); - - // - // InitialR2T, result function is OR. - // - if (!Session->InitialR2T) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); - } - - // - // ImmediateData, result function is AND. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_IMMEDIATE_DATA); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0)); - - // - // MaxRecvDataSegmentLength is declarative. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH); - if (Value != NULL) { - Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn (Value); - } - // - // MaxBurstLength, result funtion is Mininum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_BURST_LENGTH); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength, NumericValue); - - // - // FirstBurstLength, result function is Minimum. Irrelevant when InitialR2T=Yes and - // ImmediateData=No. - // This Key/Value is negotiation type. - // - if (!(Session->InitialR2T && !Session->ImmediateData)) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, NumericValue); - } - - // - // MaxConnections, result function is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_CONNECTIONS); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if ((NumericValue == 0) || (NumericValue > 65535)) { - goto ON_ERROR; - } - - Session->MaxConnections = (UINT32) MIN (Session->MaxConnections, NumericValue); - - // - // DataPDUInOrder, result function is OR. - // - if (!Session->DataPDUInOrder) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); - } - - // - // DataSequenceInorder, result function is OR. - // - if (!Session->DataSequenceInOrder) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); - } - - // - // DefaultTime2Wait, result function is Maximum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2WAIT); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if (NumericValue == 0) { - Session->DefaultTime2Wait = 0; - } else if (NumericValue > 3600) { - goto ON_ERROR; - } else { - Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait, NumericValue); - } - // - // DefaultTime2Retain, result function is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2RETAIN); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if (NumericValue == 0) { - Session->DefaultTime2Retain = 0; - } else if (NumericValue > 3600) { - goto ON_ERROR; - } else { - Session->DefaultTime2Retain = (UINT32) MIN (Session->DefaultTime2Retain, NumericValue); - } - // - // MaxOutstandingR2T, result function is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_OUTSTANDING_R2T); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if ((NumericValue == 0) || (NumericValue > 65535)) { - goto ON_ERROR; - } - - Session->MaxOutstandingR2T = (UINT16) MIN (Session->MaxOutstandingR2T, NumericValue); - - // - // Remove declarative key-value pairs, if any. - // - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); - // - // Remove the key-value that may not needed for result function is OR. - // - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); - - // - // Remove irrelevant parameter, if any. - // - if (Session->InitialR2T && !Session->ImmediateData) { - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH); - } - - if (IsListEmpty (KeyValueList)) { - // - // Succeed if no more keys in the list. - // - Status = EFI_SUCCESS; - } - -ON_ERROR: - - IScsiFreeKeyValueList (KeyValueList); - - FreePool (Data); - - return Status; -} - -/** - Fill the oprational prameters. - - @param[in] Conn The connection in iSCSI login. - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters. - - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request PDU. -**/ -EFI_STATUS -IScsiFillOpParams ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ) -{ - ISCSI_SESSION *Session; - CHAR8 Value[256]; - - Session = Conn->Session; - - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest == IScsiDigestCRC32) ? "None,CRC32" : "None"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest == IScsiDigestCRC32) ? "None,CRC32" : "None"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", MAX_RECV_DATA_SEG_LEN_IN_FFP); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value); - - return EFI_SUCCESS; -} - -/** - Pad the iSCSI AHS or data segment to an integer number of 4 byte words. - - @param[in, out] Pdu The iSCSI pdu which contains segments to pad. - @param[in] Len The length of the last semgnet in the PDU. - - @retval EFI_SUCCESS The segment is padded or no need to pad it. - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the - padding bytes. -**/ -EFI_STATUS -IScsiPadSegment ( - IN OUT NET_BUF *Pdu, - IN UINT32 Len - ) -{ - UINT32 PadLen; - UINT8 *Data; - - PadLen = ISCSI_GET_PAD_LEN (Len); - - if (PadLen != 0) { - Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - ZeroMem (Data, PadLen); - } - - return EFI_SUCCESS; -} - -/** - Build a key-value list from the data segment. - - @param[in] Data The data segment containing the key-value pairs. - @param[in] Len Length of the data segment. - - @return The key-value list. - @retval NULL Other errors as indicated. -**/ -LIST_ENTRY * -IScsiBuildKeyValueList ( - IN CHAR8 *Data, - IN UINT32 Len - ) -{ - LIST_ENTRY *ListHead; - ISCSI_KEY_VALUE_PAIR *KeyValuePair; - - ListHead = AllocatePool (sizeof (LIST_ENTRY)); - if (ListHead == NULL) { - return NULL; - } - - InitializeListHead (ListHead); - - while (Len > 0) { - KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR)); - if (KeyValuePair == NULL) { - goto ON_ERROR; - } - - InitializeListHead (&KeyValuePair->List); - - KeyValuePair->Key = Data; - - while ((Len > 0) && (*Data != '=')) { - Len--; - Data++; - } - - if (*Data == '=') { - *Data = '\0'; - - Data++; - Len--; - } else { - FreePool (KeyValuePair); - goto ON_ERROR; - } - - KeyValuePair->Value = Data; - - InsertTailList (ListHead, &KeyValuePair->List);; - - Data += AsciiStrLen (KeyValuePair->Value) + 1; - Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1; - } - - return ListHead; - -ON_ERROR: - - IScsiFreeKeyValueList (ListHead); - - return NULL; -} - -/** - Get the value string by the key name from the key-value list. If found, - the key-value entry will be removed from the list. - - @param[in, out] KeyValueList The key-value list. - @param[in] Key The key name to find. - - @return The value string. -**/ -CHAR8 * -IScsiGetValueByKeyFromList ( - IN OUT LIST_ENTRY *KeyValueList, - IN CHAR8 *Key - ) -{ - LIST_ENTRY *Entry; - ISCSI_KEY_VALUE_PAIR *KeyValuePair; - CHAR8 *Value; - - Value = NULL; - - NET_LIST_FOR_EACH (Entry, KeyValueList) { - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List); - - if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) { - Value = KeyValuePair->Value; - - RemoveEntryList (&KeyValuePair->List); - FreePool (KeyValuePair); - break; - } - } - - return Value; -} - -/** - Free the key-value list. - - @param[in] KeyValueList The key-value list. -**/ -VOID -IScsiFreeKeyValueList ( - IN LIST_ENTRY *KeyValueList - ) -{ - LIST_ENTRY *Entry; - ISCSI_KEY_VALUE_PAIR *KeyValuePair; - - while (!IsListEmpty (KeyValueList)) { - Entry = NetListRemoveHead (KeyValueList); - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List); - - FreePool (KeyValuePair); - } - - FreePool (KeyValueList); -} - -/** - Normalize the iSCSI name according to RFC. - - @param[in, out] Name The iSCSI name. - @param[in] Len length of the iSCSI name. - - @retval EFI_SUCCESS The iSCSI name is valid and normalized. - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format. -**/ -EFI_STATUS -IScsiNormalizeName ( - IN OUT CHAR8 *Name, - IN UINTN Len - ) -{ - UINTN Index; - - for (Index = 0; Index < Len; Index++) { - if (NET_IS_UPPER_CASE_CHAR (Name[Index])) { - // - // Convert the upper-case characters to lower-case ones - // - Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a'); - } - - if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) && - !NET_IS_DIGIT (Name[Index]) && - (Name[Index] != '-') && - (Name[Index] != '.') && - (Name[Index] != ':') - ) { - // - // ASCII dash, dot, colon lower-case characters and digit characters - // are allowed. - // - return EFI_PROTOCOL_ERROR; - } - } - - if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) { - // - // Only IQN format is accepted now. - // - return EFI_PROTOCOL_ERROR; - } - - return EFI_SUCCESS; -} - -/** - Create an iSCSI task control block. - - @param[in] Conn The connection on which the task control block will be created. - @param[out] Tcb The newly created task control block. - - @retval EFI_SUCCESS The task control block is created. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_READY The target can not accept new commands. -**/ -EFI_STATUS -IScsiNewTcb ( - IN ISCSI_CONNECTION *Conn, - OUT ISCSI_TCB **Tcb - ) -{ - ISCSI_SESSION *Session; - ISCSI_TCB *NewTcb; - - ASSERT (Tcb != NULL); - - Session = Conn->Session; - - if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) { - return EFI_NOT_READY; - } - - NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB)); - if (NewTcb == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - InitializeListHead (&NewTcb->Link); - - NewTcb->SoFarInOrder = TRUE; - NewTcb->InitiatorTaskTag = Session->InitiatorTaskTag; - NewTcb->CmdSN = Session->CmdSN; - NewTcb->Conn = Conn; - - InsertTailList (&Session->TcbList, &NewTcb->Link); - - // - // Advance the initiator task tag. - // - Session->InitiatorTaskTag++; - Session->CmdSN++; - - *Tcb = NewTcb; - - return EFI_SUCCESS; -} - -/** - Delete the tcb from the connection and destroy it. - - @param[in] Tcb The tcb to delete. -**/ -VOID -IScsiDelTcb ( - IN ISCSI_TCB *Tcb - ) -{ - RemoveEntryList (&Tcb->Link); - - FreePool (Tcb); -} - - -/** - Create a data segment, pad it and calculate the CRC if needed. - - @param[in] Data The data to fill into the data segment. - @param[in] Len Length of the data. - @param[in] DataDigest Whether to calculate CRC for this data segment. - - @return The net buffer wrapping the data segment. -**/ -NET_BUF * -IScsiNewDataSegment ( - IN UINT8 *Data, - IN UINT32 Len, - IN BOOLEAN DataDigest - ) -{ - NET_FRAGMENT Fragment[2]; - UINT32 FragmentCount; - UINT32 PadLen; - NET_BUF *DataSeg; - - Fragment[0].Len = Len; - Fragment[0].Bulk = Data; - - PadLen = ISCSI_GET_PAD_LEN (Len); - if (PadLen != 0) { - Fragment[1].Len = PadLen; - Fragment[1].Bulk = (UINT8 *) &mDataSegPad; - - FragmentCount = 2; - } else { - FragmentCount = 1; - } - - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL); - - return DataSeg; -} - -/** - Create a iSCSI SCSI command PDU to encapsulate the command issued - by SCSI through the EXT SCSI PASS THRU Protocol. - - @param[in] Packet The EXT SCSI PASS THRU request packet containing the SCSI command. - @param[in] Lun The LUN. - @param[in] Tcb The tcb associated with this SCSI command. - - @return The created iSCSI SCSI command PDU. - @retval NULL Other errors as indicated. -**/ -NET_BUF * -IScsiNewScsiCmdPdu ( - IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, - IN UINT64 Lun, - IN ISCSI_TCB *Tcb - ) -{ - LIST_ENTRY *NbufList; - NET_BUF *Pdu; - NET_BUF *PduHeader; - NET_BUF *DataSeg; - SCSI_COMMAND *ScsiCmd; - UINT8 AHSLength; - UINT32 Length; - ISCSI_ADDITIONAL_HEADER *Header; - ISCSI_BI_EXP_READ_DATA_LEN_AHS *BiExpReadDataLenAHS; - ISCSI_SESSION *Session; - UINT32 ImmediateDataLen; - - AHSLength = 0; - - if (Packet->DataDirection == DataBi) { - // - // Bi directional Read/Write command, the bidirectional expected - // read data length AHS is required. - // - AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS); - } - - if (Packet->CdbLength > 16) { - // - // The CDB exceeds 16 bytes, an extended CDB AHS is required. - // - AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet->CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER))); - } - - Length = sizeof (SCSI_COMMAND) + AHSLength; - PduHeader = NetbufAlloc (Length); - if (PduHeader == NULL) { - return NULL; - } - - ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length, NET_BUF_TAIL); - if (ScsiCmd == NULL) { - NetbufFree (PduHeader); - return NULL; - } - Header = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1); - - ZeroMem (ScsiCmd, Length); - - ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0); - ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE); - - // - // Set the READ/WRITE flags according to the IO type of this request. - // - switch (Packet->DataDirection) { - case DataIn: - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ); - ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength); - break; - - case DataOut: - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE); - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); - break; - - case DataBi: - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ | SCSI_CMD_PDU_FLAG_WRITE); - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); - - // - // Fill the bidirectional expected read data length AHS. - // - BiExpReadDataLenAHS = (ISCSI_BI_EXP_READ_DATA_LEN_AHS *) Header; - Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1); - - BiExpReadDataLenAHS->Length = NTOHS (5); - BiExpReadDataLenAHS->Type = ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN; - BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet->InTransferLength); - - break; - } - - ScsiCmd->TotalAHSLength = AHSLength; - CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun)); - ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag); - ScsiCmd->CmdSN = NTOHL (Tcb->CmdSN); - ScsiCmd->ExpStatSN = NTOHL (Tcb->Conn->ExpStatSN); - - CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb)); - - if (Packet->CdbLength > 16) { - Header->Length = NTOHS ((UINT16) (Packet->CdbLength - 15)); - Header->Type = ISCSI_AHS_TYPE_EXT_CDB; - - CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength - 16); - } - - Pdu = PduHeader; - Session = Tcb->Conn->Session; - ImmediateDataLen = 0; - - if (Session->ImmediateData && (Packet->OutTransferLength != 0)) { - // - // Send immediate data in this SCSI Command PDU. The length of the immeidate - // data is the minimum of FirstBurstLength, the data length to be xfered and - // the MaxRecvdataSegmentLength on this connection. - // - ImmediateDataLen = MIN (Session->FirstBurstLength, Packet->OutTransferLength); - ImmediateDataLen = MIN (ImmediateDataLen, Tcb->Conn->MaxRecvDataSegmentLength); - - // - // Update the data segment length in the PDU header. - // - ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen); - - // - // Create the data segment. - // - DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer, ImmediateDataLen, FALSE); - if (DataSeg == NULL) { - NetbufFree (PduHeader); - Pdu = NULL; - goto ON_EXIT; - } - - NbufList = AllocatePool (sizeof (LIST_ENTRY)); - if (NbufList == NULL) { - NetbufFree (PduHeader); - NetbufFree (DataSeg); - - Pdu = NULL; - goto ON_EXIT; - } - - InitializeListHead (NbufList); - InsertTailList (NbufList, &PduHeader->List); - InsertTailList (NbufList, &DataSeg->List); - - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (Pdu == NULL) { - IScsiFreeNbufList (NbufList); - } - } - - if (Session->InitialR2T || - (ImmediateDataLen == Session->FirstBurstLength) || - (ImmediateDataLen == Packet->OutTransferLength) - ) { - // - // Unsolicited data out sequence is not allowed, - // or FirstBurstLength data is already sent out by immediate data - // or all the OUT data accompany this SCSI packet is sent as - // immediate data, the final flag should be set on this SCSI Command - // PDU. - // - ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL); - } - -ON_EXIT: - - return Pdu; -} - -/** - Create a new iSCSI SCSI Data Out PDU. - - @param[in] Data The data to put into the Data Out PDU. - @param[in] Len Length of the data. - @param[in] DataSN The DataSN of the Data Out PDU. - @param[in] Tcb The task control block of this Data Out PDU. - @param[in] Lun The LUN. - - @return The net buffer wrapping the Data Out PDU. - @retval NULL Other errors as indicated. -**/ -NET_BUF * -IScsiNewDataOutPdu ( - IN UINT8 *Data, - IN UINT32 Len, - IN UINT32 DataSN, - IN ISCSI_TCB *Tcb, - IN UINT64 Lun - ) -{ - LIST_ENTRY *NbufList; - NET_BUF *PduHdr; - NET_BUF *DataSeg; - NET_BUF *Pdu; - ISCSI_SCSI_DATA_OUT *DataOutHdr; - ISCSI_XFER_CONTEXT *XferContext; - - NbufList = AllocatePool (sizeof (LIST_ENTRY)); - if (NbufList == NULL) { - return NULL; - } - - InitializeListHead (NbufList); - - // - // Allocate memory for the BHS. - // - PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT)); - if (PduHdr == NULL) { - FreePool (NbufList); - return NULL; - } - // - // Insert the BHS into the buffer list. - // - InsertTailList (NbufList, &PduHdr->List); - - DataOutHdr = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr, sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL); - ASSERT (DataOutHdr != NULL); - XferContext = &Tcb->XferContext; - - ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT)); - - // - // Set the flags and fields of the Data Out PDU BHS. - // - ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0); - ISCSI_SET_DATASEG_LEN (DataOutHdr, Len); - - DataOutHdr->InitiatorTaskTag = HTONL (Tcb->InitiatorTaskTag); - DataOutHdr->TargetTransferTag = HTONL (XferContext->TargetTransferTag); - DataOutHdr->ExpStatSN = HTONL (Tcb->Conn->ExpStatSN); - DataOutHdr->DataSN = HTONL (DataSN); - DataOutHdr->BufferOffset = HTONL (XferContext->Offset); - - if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) { - CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun)); - } - // - // Build the data segment for this Data Out PDU. - // - DataSeg = IScsiNewDataSegment (Data, Len, FALSE); - if (DataSeg == NULL) { - IScsiFreeNbufList (NbufList); - return NULL; - } - // - // Put the data segment into the buffer list and combine it with the BHS - // into a full Data Out PDU. - // - InsertTailList (NbufList, &DataSeg->List); - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (Pdu == NULL) { - IScsiFreeNbufList (NbufList); - } - - return Pdu; -} - -/** - Generate a consecutive sequence of iSCSI SCSI Data Out PDUs. - - @param[in] Data The data which will be carried by the sequence of iSCSI SCSI Data Out PDUs. - @param[in] Tcb The task control block of the data to send out. - @param[in] Lun The LUN the data will be sent to. - - @return A list of net buffers with each of them wraps an iSCSI SCSI Data Out PDU. - @retval NULL Other errors as indicated. -**/ -LIST_ENTRY * -IScsiGenerateDataOutPduSequence ( - IN UINT8 *Data, - IN ISCSI_TCB *Tcb, - IN UINT64 Lun - ) -{ - LIST_ENTRY *PduList; - UINT32 DataSN; - UINT32 DataLen; - NET_BUF *DataOutPdu; - ISCSI_CONNECTION *Conn; - ISCSI_XFER_CONTEXT *XferContext; - UINT8 *DataOutPacket; - - PduList = AllocatePool (sizeof (LIST_ENTRY)); - if (PduList == NULL) { - return NULL; - } - - InitializeListHead (PduList); - - DataSN = 0; - Conn = Tcb->Conn; - DataOutPdu = NULL; - XferContext = &Tcb->XferContext; - - while (XferContext->DesiredLength > 0) { - // - // Determine the length of data this Data Out PDU can carry. - // - DataLen = MIN (XferContext->DesiredLength, Conn->MaxRecvDataSegmentLength); - - // - // Create a Data Out PDU. - // - DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun); - if (DataOutPdu == NULL) { - IScsiFreeNbufList (PduList); - PduList = NULL; - - goto ON_EXIT; - } - - InsertTailList (PduList, &DataOutPdu->List); - - // - // Update the context and DataSN. - // - XferContext->Offset += DataLen; - XferContext->DesiredLength -= DataLen; - DataSN++; - Data += DataLen; - } - // - // Set the F bit for the last data out PDU in this sequence. - // - DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL); - if (DataOutPacket == NULL) { - IScsiFreeNbufList (PduList); - PduList = NULL; - goto ON_EXIT; - } - - ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL); - -ON_EXIT: - - return PduList; -} - -/** - Send the Data in a sequence of Data Out PDUs one by one. - - @param[in] Data The data to carry by Data Out PDUs. - @param[in] Lun The LUN the data will be sent to. - @param[in] Tcb The task control block. - - @retval EFI_SUCCES The data is sent out to the LUN. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiSendDataOutPduSequence ( - IN UINT8 *Data, - IN UINT64 Lun, - IN ISCSI_TCB *Tcb - ) -{ - LIST_ENTRY *DataOutPduList; - LIST_ENTRY *Entry; - NET_BUF *Pdu; - EFI_STATUS Status; - - // - // Generate the Data Out PDU sequence. - // - DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun); - if (DataOutPduList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = EFI_SUCCESS; - - // - // Send the Data Out PDU's one by one. - // - NET_LIST_FOR_EACH (Entry, DataOutPduList) { - Pdu = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - - Status = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu); - if (EFI_ERROR (Status)) { - break; - } - } - - IScsiFreeNbufList (DataOutPduList); - - return Status; -} - -/** - Process the received iSCSI SCSI Data In PDU. - - @param[in] Pdu The Data In PDU received. - @param[in] Tcb The task control block. - @param[in, out] Packet The EXT SCSI PASS THRU request packet. - - @retval EFI_SUCCES The check on the Data IN PDU is passed and some update - actions are taken. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiOnDataInRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - ISCSI_SCSI_DATA_IN *DataInHdr; - EFI_STATUS Status; - - DataInHdr = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0, NULL); - if (DataInHdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag); - DataInHdr->ExpCmdSN = NTOHL (DataInHdr->ExpCmdSN); - DataInHdr->MaxCmdSN = NTOHL (DataInHdr->MaxCmdSN); - DataInHdr->DataSN = NTOHL (DataInHdr->DataSN); - - // - // Check the DataSN. - // - Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN); - if (EFI_ERROR (Status)) { - return Status; - } - - if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { - return EFI_PROTOCOL_ERROR; - } - // - // Update the command related sequence numbers. - // - IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN, DataInHdr->ExpCmdSN); - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) { - if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) { - // - // The S bit is on but the F bit is off. - // - return EFI_PROTOCOL_ERROR; - } - - Tcb->StatusXferd = TRUE; - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW | SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) { - // - // Underflow and Overflow are mutual flags. - // - return EFI_PROTOCOL_ERROR; - } - // - // S bit is on, the StatSN is valid. - // - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr->StatSN)); - if (EFI_ERROR (Status)) { - return Status; - } - - Packet->HostAdapterStatus = 0; - Packet->TargetStatus = DataInHdr->Status; - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { - Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount); - Status = EFI_BAD_BUFFER_SIZE; - } - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { - Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount); - } - } - - return Status; -} - -/** - Process the received iSCSI R2T PDU. - - @param[in] Pdu The R2T PDU received. - @param[in] Tcb The task control block. - @param[in] Lun The Lun. - @param[in, out] Packet The EXT SCSI PASS THRU request packet. - - @retval EFI_SUCCES The R2T PDU is valid and the solicited data is sent out. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiOnR2TRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - ISCSI_READY_TO_TRANSFER *R2THdr; - EFI_STATUS Status; - ISCSI_XFER_CONTEXT *XferContext; - UINT8 *Data; - - R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL); - if (R2THdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag); - R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag); - R2THdr->StatSN = NTOHL (R2THdr->StatSN); - R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum); - R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset); - R2THdr->DesiredDataTransferLength = NTOHL (R2THdr->DesiredDataTransferLength); - - if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) { - return EFI_PROTOCOL_ERROR;; - } - // - // Check the sequence number. - // - Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum); - if (EFI_ERROR (Status)) { - return Status; - } - - XferContext = &Tcb->XferContext; - XferContext->TargetTransferTag = R2THdr->TargetTransferTag; - XferContext->Offset = R2THdr->BufferOffset; - XferContext->DesiredLength = R2THdr->DesiredDataTransferLength; - - if (((XferContext->Offset + XferContext->DesiredLength) > Packet->OutTransferLength) || - (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength) - ) { - return EFI_PROTOCOL_ERROR; - } - // - // Send the data solicited by this R2T. - // - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); - - return Status; -} - -/** - Process the received iSCSI SCSI Response PDU. - - @param[in] Pdu The Response PDU received. - @param[in] Tcb The task control block. - @param[in, out] Packet The EXT SCSI PASS THRU request packet. - - @retval EFI_SUCCES The Response PDU is processed. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiOnScsiRspRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - SCSI_RESPONSE *ScsiRspHdr; - ISCSI_SENSE_DATA *SenseData; - EFI_STATUS Status; - UINT32 DataSegLen; - - ScsiRspHdr = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL); - if (ScsiRspHdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - ScsiRspHdr->InitiatorTaskTag = NTOHL (ScsiRspHdr->InitiatorTaskTag); - if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { - return EFI_PROTOCOL_ERROR; - } - - ScsiRspHdr->StatSN = NTOHL (ScsiRspHdr->StatSN); - - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr->StatSN); - if (EFI_ERROR (Status)) { - return Status; - } - - ScsiRspHdr->MaxCmdSN = NTOHL (ScsiRspHdr->MaxCmdSN); - ScsiRspHdr->ExpCmdSN = NTOHL (ScsiRspHdr->ExpCmdSN); - IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN, ScsiRspHdr->ExpCmdSN); - - Tcb->StatusXferd = TRUE; - - Packet->HostAdapterStatus = ScsiRspHdr->Response; - if (Packet->HostAdapterStatus != ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) { - return EFI_SUCCESS; - } - - Packet->TargetStatus = ScsiRspHdr->Status; - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW | SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) || - ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW | SCSI_RSP_PDU_FLAG_UNDERFLOW) - ) { - return EFI_PROTOCOL_ERROR; - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) { - Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount); - Status = EFI_BAD_BUFFER_SIZE; - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) { - Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount); - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { - if (Packet->DataDirection == DataIn) { - Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount); - } else { - Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount); - } - - Status = EFI_BAD_BUFFER_SIZE; - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { - if (Packet->DataDirection == DataIn) { - Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); - } else { - Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); - } - } - - DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr); - if (DataSegLen != 0) { - SenseData = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof (SCSI_RESPONSE), NULL); - if (SenseData == NULL) { - return EFI_PROTOCOL_ERROR; - } - - SenseData->Length = NTOHS (SenseData->Length); - - Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet->SenseDataLength); - if (Packet->SenseDataLength != 0) { - CopyMem (Packet->SenseData, &SenseData->Data[0], Packet->SenseDataLength); - } - } else { - Packet->SenseDataLength = 0; - } - - return Status; -} - -/** - Process the received NOP In PDU. - - @param[in] Pdu The NOP In PDU received. - @param[in] Tcb The task control block. - - @retval EFI_SUCCES The NOP In PDU is processed and the related sequence - numbers are updated. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. -**/ -EFI_STATUS -IScsiOnNopInRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb - ) -{ - ISCSI_NOP_IN *NopInHdr; - EFI_STATUS Status; - - NopInHdr = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL); - if (NopInHdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - NopInHdr->StatSN = NTOHL (NopInHdr->StatSN); - NopInHdr->ExpCmdSN = NTOHL (NopInHdr->ExpCmdSN); - NopInHdr->MaxCmdSN = NTOHL (NopInHdr->MaxCmdSN); - - if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) { - if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) { - return EFI_PROTOCOL_ERROR; - } - } else { - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN); - if (EFI_ERROR (Status)) { - return Status; - } - } - - IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN, NopInHdr->ExpCmdSN); - - return EFI_SUCCESS; -} - -/** - Execute the SCSI command issued through the EXT SCSI PASS THRU protocol. - - @param[in] PassThru The EXT SCSI PASS THRU protocol. - @param[in] Target The target ID. - @param[in] Lun The LUN. - @param[in, out] Packet The request packet containing IO request, SCSI command - buffer and buffers to read/write. - - @retval EFI_SUCCES The SCSI command is executed and the result is updated to - the Packet. - @retval EFI_DEVICE_ERROR Session state was not as required. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_READY The target can not accept new commands. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiExecuteScsiCommand ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - EFI_STATUS Status; - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION *Session; - EFI_EVENT TimeoutEvent; - ISCSI_CONNECTION *Conn; - ISCSI_TCB *Tcb; - NET_BUF *Pdu; - ISCSI_XFER_CONTEXT *XferContext; - UINT8 *Data; - ISCSI_IN_BUFFER_CONTEXT InBufferContext; - UINT64 Timeout; - UINT8 *PduHdr; - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); - Session = &Private->Session; - Status = EFI_SUCCESS; - Tcb = NULL; - TimeoutEvent = NULL; - Timeout = 0; - - if (Session->State != SESSION_STATE_LOGGED_IN) { - Status = EFI_DEVICE_ERROR; - goto ON_EXIT; - } - - Conn = NET_LIST_USER_STRUCT_S ( - Session->Conns.ForwardLink, - ISCSI_CONNECTION, - Link, - ISCSI_CONNECTION_SIGNATURE - ); - - if (Packet->Timeout != 0) { - Timeout = MultU64x32 (Packet->Timeout, 2); - } - - Status = IScsiNewTcb (Conn, &Tcb); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - // - // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU. - // - Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb); - if (Pdu == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - XferContext = &Tcb->XferContext; - PduHdr = NetbufGetByte (Pdu, 0, NULL); - if (PduHdr == NULL) { - Status = EFI_PROTOCOL_ERROR; - NetbufFree (Pdu); - goto ON_EXIT; - } - XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr); - - // - // Transmit the SCSI Command PDU. - // - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); - - NetbufFree (Pdu); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - if (!Session->InitialR2T && - (XferContext->Offset < Session->FirstBurstLength) && - (XferContext->Offset < Packet->OutTransferLength) - ) { - // - // Unsolicited Data-Out sequence is allowed, there is remaining SCSI - // OUT data and the limit of FirstBurstLength is not reached. - // - XferContext->TargetTransferTag = ISCSI_RESERVED_TAG; - XferContext->DesiredLength = MIN ( - Session->FirstBurstLength, - Packet->OutTransferLength - XferContext->Offset - ); - - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - InBufferContext.InData = (UINT8 *) Packet->InDataBuffer; - InBufferContext.InDataLen = Packet->InTransferLength; - - while (!Tcb->StatusXferd) { - // - // Start the timeout timer. - // - if (Timeout != 0) { - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - TimeoutEvent = Conn->TimeoutEvent; - } - // - // try to receive PDU from target. - // - Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE, TimeoutEvent); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - PduHdr = NetbufGetByte (Pdu, 0, NULL); - if (PduHdr == NULL) { - Status = EFI_PROTOCOL_ERROR; - NetbufFree (Pdu); - goto ON_EXIT; - } - switch (ISCSI_GET_OPCODE (PduHdr)) { - case ISCSI_OPCODE_SCSI_DATA_IN: - Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet); - break; - - case ISCSI_OPCODE_R2T: - Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet); - break; - - case ISCSI_OPCODE_SCSI_RSP: - Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet); - break; - - case ISCSI_OPCODE_NOP_IN: - Status = IScsiOnNopInRcvd (Pdu, Tcb); - break; - - case ISCSI_OPCODE_VENDOR_T0: - case ISCSI_OPCODE_VENDOR_T1: - case ISCSI_OPCODE_VENDOR_T2: - // - // These messages are vendor specific, skip them. - // - break; - - default: - Status = EFI_PROTOCOL_ERROR; - break; - } - - NetbufFree (Pdu); - - if (EFI_ERROR (Status)) { - break; - } - } - -ON_EXIT: - - if (TimeoutEvent != NULL) { - gBS->SetTimer (TimeoutEvent, TimerCancel, 0); - } - - if (Tcb != NULL) { - IScsiDelTcb (Tcb); - } - - return Status; -} - -/** - Reinstate the session on some error. - - @param[in, out] Private The iSCSI driver data. - - @retval EFI_SUCCES The session is reinstated from some error. - @retval Other Reinstatement failed. -**/ -EFI_STATUS -IScsiSessionReinstatement ( - IN OUT ISCSI_DRIVER_DATA *Private - ) -{ - ISCSI_SESSION *Session; - EFI_STATUS Status; - - Session = &Private->Session; - ASSERT (Session->State != SESSION_STATE_FREE); - - // - // Abort the session and re-init it. - // - IScsiSessionAbort (Session); - IScsiSessionInit (Session, TRUE); - - // - // Login again. - // - Status = IScsiSessionLogin (Private); - - return Status; -} - -/** - Initialize some session parameters before login. - - @param[in, out] Session The iSCSI session. - @param[in] Recovery Whether the request is from a fresh new start or recovery. -**/ -VOID -IScsiSessionInit ( - IN OUT ISCSI_SESSION *Session, - IN BOOLEAN Recovery - ) -{ - if (!Recovery) { - Session->Signature = ISCSI_SESSION_SIGNATURE; - Session->State = SESSION_STATE_FREE; - - InitializeListHead (&Session->Conns); - InitializeListHead (&Session->TcbList); - } - - Session->Tsih = 0; - - Session->CmdSN = 1; - Session->InitiatorTaskTag = 1; - Session->NextCid = 1; - - Session->TargetPortalGroupTag = 0; - Session->MaxConnections = ISCSI_MAX_CONNS_PER_SESSION; - Session->InitialR2T = FALSE; - Session->ImmediateData = TRUE; - Session->MaxBurstLength = 262144; - Session->FirstBurstLength = MAX_RECV_DATA_SEG_LEN_IN_FFP; - Session->DefaultTime2Wait = 2; - Session->DefaultTime2Retain = 20; - Session->MaxOutstandingR2T = DEFAULT_MAX_OUTSTANDING_R2T; - Session->DataPDUInOrder = TRUE; - Session->DataSequenceInOrder = TRUE; - Session->ErrorRecoveryLevel = 0; -} - -/** - Abort the iSCSI session, that is, reset all the connection and free the - resources. - - @param[in, out] Session The iSCSI session. - - @retval EFI_SUCCES The session is aborted. -**/ -EFI_STATUS -IScsiSessionAbort ( - IN OUT ISCSI_SESSION *Session - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_CONNECTION *Conn; - - if (Session->State != SESSION_STATE_LOGGED_IN) { - return EFI_SUCCESS; - } - - ASSERT (!IsListEmpty (&Session->Conns)); - - Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session); - - while (!IsListEmpty (&Session->Conns)) { - Conn = NET_LIST_USER_STRUCT_S ( - Session->Conns.ForwardLink, - ISCSI_CONNECTION, - Link, - ISCSI_CONNECTION_SIGNATURE - ); - - gBS->CloseProtocol ( - Conn->Tcp4Io.Handle, - &gEfiTcp4ProtocolGuid, - Private->Image, - Private->ExtScsiPassThruHandle - ); - - IScsiConnReset (Conn); - - IScsiDetatchConnection (Conn); - IScsiDestroyConnection (Conn); - } - - Session->State = SESSION_STATE_FAILED; - - return EFI_SUCCESS; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c deleted file mode 100644 index 901b38e92fc0..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c +++ /dev/null @@ -1,487 +0,0 @@ -/** @file - The wrap of TCP/IP Socket interface. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -/** - The common notify function associated with various Tcp4Io events. - - @param[in] Event The event signaled. - @param[in] Context The context. -**/ -VOID -EFIAPI -Tcp4IoCommonNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - *((BOOLEAN *) Context) = TRUE; -} - -/** - Create a TCP socket with the specified configuration data. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - @param[in] ConfigData The Tcp4 configuration data. - @param[in] Tcp4Io The Tcp4Io. - - @retval EFI_SUCCESS The TCP socket is created and configured. - @retval Others Failed to create the TCP socket or configure it. -**/ -EFI_STATUS -Tcp4IoCreateSocket ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN TCP4_IO_CONFIG_DATA *ConfigData, - IN TCP4_IO *Tcp4Io - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; - EFI_TCP4_OPTION ControlOption; - EFI_TCP4_ACCESS_POINT *AccessPoint; - - Tcp4Io->Handle = NULL; - Tcp4Io->ConnToken.CompletionToken.Event = NULL; - Tcp4Io->TxToken.CompletionToken.Event = NULL; - Tcp4Io->RxToken.CompletionToken.Event = NULL; - Tcp4Io->CloseToken.CompletionToken.Event = NULL; - Tcp4 = NULL; - - // - // Create the TCP4 child instance and get the TCP4 protocol. - // - Status = NetLibCreateServiceChild ( - Controller, - Image, - &gEfiTcp4ServiceBindingProtocolGuid, - &Tcp4Io->Handle - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->OpenProtocol ( - Tcp4Io->Handle, - &gEfiTcp4ProtocolGuid, - (VOID **)&Tcp4Io->Tcp4, - Image, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Tcp4Io->Image = Image; - Tcp4Io->Controller = Controller; - Tcp4 = Tcp4Io->Tcp4; - - // - // Set the configuration parameters. - // - ControlOption.ReceiveBufferSize = 0x200000; - ControlOption.SendBufferSize = 0x200000; - ControlOption.MaxSynBackLog = 0; - ControlOption.ConnectionTimeout = 0; - ControlOption.DataRetries = 6; - ControlOption.FinTimeout = 0; - ControlOption.TimeWaitTimeout = 0; - ControlOption.KeepAliveProbes = 4; - ControlOption.KeepAliveTime = 0; - ControlOption.KeepAliveInterval = 0; - ControlOption.EnableNagle = FALSE; - ControlOption.EnableTimeStamp = FALSE; - ControlOption.EnableWindowScaling = TRUE; - ControlOption.EnableSelectiveAck = FALSE; - ControlOption.EnablePathMtuDiscovery = FALSE; - - Tcp4ConfigData.TypeOfService = 8; - Tcp4ConfigData.TimeToLive = 255; - Tcp4ConfigData.ControlOption = &ControlOption; - - AccessPoint = &Tcp4ConfigData.AccessPoint; - - AccessPoint->UseDefaultAddress = FALSE; - AccessPoint->StationPort = 0; - AccessPoint->RemotePort = ConfigData->RemotePort; - AccessPoint->ActiveFlag = TRUE; - - CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, sizeof (EFI_IPv4_ADDRESS)); - - // - // Configure the TCP4 protocol. - // - Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) { - // - // the gateway is not zero, add the default route by hand - // - Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, &ConfigData->Gateway); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - } - // - // Create events for variuos asynchronous operations. - // - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsConnDone, - &Tcp4Io->ConnToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsTxDone, - &Tcp4Io->TxToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsRxDone, - &Tcp4Io->RxToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsCloseDone, - &Tcp4Io->CloseToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Tcp4Io->IsTxDone = FALSE; - Tcp4Io->IsRxDone = FALSE; - - return EFI_SUCCESS; - -ON_ERROR: - - if (Tcp4Io->RxToken.CompletionToken.Event != NULL) { - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); - } - - if (Tcp4Io->TxToken.CompletionToken.Event != NULL) { - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); - } - - if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) { - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); - } - - if (Tcp4 != NULL) { - Tcp4->Configure (Tcp4, NULL); - - gBS->CloseProtocol ( - Tcp4Io->Handle, - &gEfiTcp4ProtocolGuid, - Image, - Controller - ); - } - - NetLibDestroyServiceChild ( - Controller, - Image, - &gEfiTcp4ServiceBindingProtocolGuid, - Tcp4Io->Handle - ); - - return Status; -} - -/** - Destroy the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. -**/ -VOID -Tcp4IoDestroySocket ( - IN TCP4_IO *Tcp4Io - ) -{ - EFI_TCP4_PROTOCOL *Tcp4; - - Tcp4 = Tcp4Io->Tcp4; - - Tcp4->Configure (Tcp4, NULL); - - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); - - gBS->CloseProtocol ( - Tcp4Io->Handle, - &gEfiTcp4ProtocolGuid, - Tcp4Io->Image, - Tcp4Io->Controller - ); - - NetLibDestroyServiceChild ( - Tcp4Io->Controller, - Tcp4Io->Image, - &gEfiTcp4ServiceBindingProtocolGuid, - Tcp4Io->Handle - ); -} - -/** - Connect to the other endpoint of the TCP socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Timeout The time to wait for connection done. - - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully. - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoConnect ( - IN OUT TCP4_IO *Tcp4Io, - IN EFI_EVENT Timeout - ) -{ - EFI_TCP4_PROTOCOL *Tcp4; - EFI_STATUS Status; - - Tcp4Io->IsConnDone = FALSE; - Tcp4 = Tcp4Io->Tcp4; - Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken); - if (EFI_ERROR (Status)) { - return Status; - } - - while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) { - Tcp4->Poll (Tcp4); - } - - if (!Tcp4Io->IsConnDone) { - Status = EFI_TIMEOUT; - } else { - Status = Tcp4Io->ConnToken.CompletionToken.Status; - } - - return Status; -} - -/** - Reset the socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. -**/ -VOID -Tcp4IoReset ( - IN OUT TCP4_IO *Tcp4Io - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - - Tcp4Io->CloseToken.AbortOnClose = TRUE; - Tcp4Io->IsCloseDone = FALSE; - - Tcp4 = Tcp4Io->Tcp4; - Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken); - if (EFI_ERROR (Status)) { - return ; - } - - while (!Tcp4Io->IsCloseDone) { - Tcp4->Poll (Tcp4); - } -} - -/** - Transmit the Packet to the other endpoint of the socket. - - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Packet The packet to transmit. - - @retval EFI_SUCCESS The packet is trasmitted. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoTransmit ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet - ) -{ - EFI_TCP4_TRANSMIT_DATA *TxData; - EFI_TCP4_PROTOCOL *Tcp4; - EFI_STATUS Status; - - TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet->BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA)); - if (TxData == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - TxData->Push = TRUE; - TxData->Urgent = FALSE; - TxData->DataLength = Packet->TotalSize; - - // - // Build the fragment table. - // - TxData->FragmentCount = Packet->BlockOpNum; - NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0], &TxData->FragmentCount); - - Tcp4Io->TxToken.Packet.TxData = TxData; - - // - // Trasnmit the packet. - // - Tcp4 = Tcp4Io->Tcp4; - Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - while (!Tcp4Io->IsTxDone) { - Tcp4->Poll (Tcp4); - } - - Tcp4Io->IsTxDone = FALSE; - - Status = Tcp4Io->TxToken.CompletionToken.Status; - -ON_EXIT: - - FreePool (TxData); - - return Status; -} - -/** - Receive data from the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed. - @param[in] Packet The buffer to hold the data copy from the soket rx buffer. - @param[in] AsyncMode Is this receive asyncronous or not. - @param[in] Timeout The time to wait for receiving the amount of data the Packet - can hold. - - @retval EFI_SUCCESS The required amount of data is received from the socket. - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. - @retval EFI_TIMEOUT Failed to receive the required amount of data in the - specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoReceive ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet, - IN BOOLEAN AsyncMode, - IN EFI_EVENT Timeout - ) -{ - EFI_TCP4_PROTOCOL *Tcp4; - EFI_TCP4_RECEIVE_DATA RxData; - EFI_STATUS Status; - NET_FRAGMENT *Fragment; - UINT32 FragmentCount; - UINT32 CurrentFragment; - - FragmentCount = Packet->BlockOpNum; - Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT)); - if (Fragment == NULL) { - return EFI_OUT_OF_RESOURCES; - } - // - // Build the fragment table. - // - NetbufBuildExt (Packet, Fragment, &FragmentCount); - - RxData.FragmentCount = 1; - Tcp4Io->RxToken.Packet.RxData = &RxData; - CurrentFragment = 0; - Tcp4 = Tcp4Io->Tcp4; - Status = EFI_SUCCESS; - - while (CurrentFragment < FragmentCount) { - RxData.DataLength = Fragment[CurrentFragment].Len; - RxData.FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len; - RxData.FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk; - - Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) { - // - // Poll until some data is received or something error happens. - // - Tcp4->Poll (Tcp4); - } - - if (!Tcp4Io->IsRxDone) { - // - // Timeout occurs, cancel the receive request. - // - Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken); - - Status = EFI_TIMEOUT; - goto ON_EXIT; - } else { - Tcp4Io->IsRxDone = FALSE; - } - - if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) { - Status = Tcp4Io->RxToken.CompletionToken.Status; - goto ON_EXIT; - } - - Fragment[CurrentFragment].Len -= RxData.FragmentTable[0].FragmentLength; - if (Fragment[CurrentFragment].Len == 0) { - CurrentFragment++; - } else { - Fragment[CurrentFragment].Bulk += RxData.FragmentTable[0].FragmentLength; - } - } - -ON_EXIT: - Tcp4Io->RxToken.Packet.RxData = NULL; - FreePool (Fragment); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c deleted file mode 100644 index 3555f1a2ebe3..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c +++ /dev/null @@ -1,350 +0,0 @@ -/** @file - Implementation of MD5 algorithm. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Md5.h" - -CONST UINT32 Md5_Data[][2] = { - { 0, 1 }, - { 1, 5 }, - { 5, 3 }, - { 0, 7 } -}; - -CONST UINT32 Md5_S[][4] = { - { 7, 22, 17, 12 }, - { 5, 20, 14, 9 }, - { 4, 23, 16 ,11 }, - { 6, 21, 15, 10 }, -}; - -CONST UINT32 Md5_T[] = { - 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE, - 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501, - 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE, - 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821, - 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA, - 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8, - 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED, - 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A, - 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C, - 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70, - 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05, - 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665, - 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039, - 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1, - 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1, - 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391 -}; - -CONST UINT8 Md5HashPadding[] = -{ - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// -// ROTATE_LEFT rotates x left n bits. -// -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) - -#define SA MedStates[Index2 & 3] -#define SB MedStates[(Index2 + 1) & 3] -#define SC MedStates[(Index2 + 2) & 3] -#define SD MedStates[(Index2 + 3) & 3] - -/** - Tf1 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf1 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return (A & B) | (~A & C); -} - -/** - Tf2 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf2 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return (A & C) | (B & ~C); -} - -/** - Tf3 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf3 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return A ^ B ^ C; -} - -/** - Tf4 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf4 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return B ^ (A | ~C); -} - -typedef -UINT32 -(*MD5_TRANSFORM_FUNC) ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ); - -CONST MD5_TRANSFORM_FUNC Md5_F[] = { - Tf1, - Tf2, - Tf3, - Tf4 -}; - -/** - Perform the MD5 transform on 64 bytes data segment. - - @param[in, out] Md5Ctx It includes the data segment for Md5 transform. -**/ -VOID -MD5Transform ( - IN OUT MD5_CTX *Md5Ctx - ) -{ - UINT32 Index1; - UINT32 Index2; - UINT32 MedStates[MD5_HASHSIZE >> 2]; - UINT32 *Data; - UINT32 IndexD; - UINT32 IndexT; - - Data = (UINT32 *) Md5Ctx->M; - - // - // Copy MD5 states to MedStates - // - CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE); - - IndexT = 0; - for (Index1 = 0; Index1 < 4; Index1++) { - IndexD = Md5_Data[Index1][0]; - for (Index2 = 16; Index2 > 0; Index2--) { - SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT]; - SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]); - SA += SB; - - IndexD += Md5_Data[Index1][1]; - IndexD &= 15; - - IndexT++; - } - } - - for (Index1 = 0; Index1 < 4; Index1++) { - Md5Ctx->States[Index1] += MedStates[Index1]; - } -} - -/** - Copy data segment into the M field of MD5_CTX structure for later transform. - If the length of data segment is larger than 64 bytes, then does the transform - immediately and the generated Md5 code is stored in the States field of MD5_CTX - data struct for later accumulation. - All of Md5 code generated for the sequential 64-bytes data segaments are be - accumulated in MD5Final() function. - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[in] Data The data wanted to be transformed. - @param[in] DataLen The length of data. -**/ -VOID -MD5UpdateBlock ( - IN OUT MD5_CTX *Md5Ctx, - IN CONST UINT8 *Data, - IN UINTN DataLen - ) -{ - UINTN Limit; - - for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) { - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit); - MD5Transform (Md5Ctx); - - Md5Ctx->Count = 0; - Data += Limit; - DataLen -= Limit; - } - - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen); - Md5Ctx->Count += DataLen; -} - -/** - Initialize four 32-bits chaining variables and use them to do the Md5 transform. - - @param[out] Md5Ctx The data structure of Md5. - - @retval EFI_SUCCESS Initialization is ok. -**/ -EFI_STATUS -MD5Init ( - OUT MD5_CTX *Md5Ctx - ) -{ - ZeroMem (Md5Ctx, sizeof (*Md5Ctx)); - - // - // Set magic initialization constants. - // - Md5Ctx->States[0] = 0x67452301; - Md5Ctx->States[1] = 0xefcdab89; - Md5Ctx->States[2] = 0x98badcfe; - Md5Ctx->States[3] = 0x10325476; - - return EFI_SUCCESS; -} - -/** - the external interface of Md5 algorithm - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[in] Data The data wanted to be transformed. - @param[in] DataLen The length of data. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Update ( - IN OUT MD5_CTX *Md5Ctx, - IN VOID *Data, - IN UINTN DataLen - ) -{ - if (EFI_ERROR (Md5Ctx->Status)) { - return Md5Ctx->Status; - } - - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen); - Md5Ctx->Length += DataLen; - return EFI_SUCCESS; -} - -/** - Accumulate the MD5 value of every data segment and generate the finial - result according to MD5 algorithm. - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[out] HashVal The final 128-bits output. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Final ( - IN OUT MD5_CTX *Md5Ctx, - OUT UINT8 *HashVal - ) -{ - UINTN PadLength; - - if (Md5Ctx->Status == EFI_ALREADY_STARTED) { - // - // Store Hashed value & Zeroize sensitive context information. - // - CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE); - ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx)); - - return EFI_SUCCESS; - } - - if (EFI_ERROR (Md5Ctx->Status)) { - return Md5Ctx->Status; - } - - PadLength = Md5Ctx->Count >= 56 ? 120 : 56; - PadLength -= Md5Ctx->Count; - MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength); - Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3); - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8); - - ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M)); - Md5Ctx->Length = 0; - Md5Ctx->Status = EFI_ALREADY_STARTED; - return MD5Final (Md5Ctx, HashVal); -} - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c deleted file mode 100644 index f1227691ec21..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c +++ /dev/null @@ -1,433 +0,0 @@ -/** @file - UEFI Component Name(2) protocol implementation for Tcp4Dxe driver. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - - -/// -/// EFI Component Name Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = { - TcpComponentNameGetDriverName, - TcpComponentNameGetControllerName, - "eng" -}; - -/// -/// EFI Component Name 2 Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) TcpComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) TcpComponentNameGetControllerName, - "en" -}; - - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mTcpDriverNameTable[] = { - { - "eng;en", - L"Tcp Network Service Driver" - }, - { - NULL, - NULL - } -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable = NULL; - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mTcpDriverNameTable, - DriverName, - (BOOLEAN) (This == &gTcp4ComponentName) - ); -} - -/** - Update the component name for the Tcp4 child handle. - - @param Tcp4[in] A pointer to the EFI_TCP4_PROTOCOL. - - - @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully. - @retval EFI_INVALID_PARAMETER The input parameter is invalid. - -**/ -EFI_STATUS -UpdateName ( - IN EFI_TCP4_PROTOCOL *Tcp4 - ) -{ - EFI_STATUS Status; - CHAR16 HandleName[80]; - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; - - if (Tcp4 == NULL) { - return EFI_INVALID_PARAMETER; - } - - // - // Format the child name into the string buffer as: - // TCPv4 (SrcPort=59, DestPort=60, ActiveFlag=TRUE) - // - ZeroMem (&Tcp4ConfigData, sizeof (Tcp4ConfigData)); - Status = Tcp4->GetModeData (Tcp4, NULL, &Tcp4ConfigData, NULL, NULL, NULL); - if (!EFI_ERROR (Status)) { - UnicodeSPrint (HandleName, sizeof (HandleName), - L"TCPv4 (SrcPort=%d, DestPort=%d, ActiveFlag=%s)", - Tcp4ConfigData.AccessPoint.StationPort, - Tcp4ConfigData.AccessPoint.RemotePort, - (Tcp4ConfigData.AccessPoint.ActiveFlag ? L"TRUE" : L"FALSE") - ); - } else if (Status == EFI_NOT_STARTED) { - UnicodeSPrint ( - HandleName, - sizeof (HandleName), - L"TCPv4 (Not started)" - ); - } else { - return Status; - } - - if (gTcpControllerNameTable != NULL) { - FreeUnicodeStringTable (gTcpControllerNameTable); - gTcpControllerNameTable = NULL; - } - - Status = AddUnicodeString2 ( - "eng", - gTcp4ComponentName.SupportedLanguages, - &gTcpControllerNameTable, - HandleName, - TRUE - ); - if (EFI_ERROR (Status)) { - return Status; - } - - return AddUnicodeString2 ( - "en", - gTcp4ComponentName2.SupportedLanguages, - &gTcpControllerNameTable, - HandleName, - FALSE - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - - // - // Only provide names for child handles. - // - if (ChildHandle == NULL) { - return EFI_UNSUPPORTED; - } - - // - // Make sure this driver produced ChildHandle - // - Status = EfiTestChildHandle ( - ControllerHandle, - ChildHandle, - &gEfiIp4ProtocolGuid - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Retrieve an instance of a produced protocol from ChildHandle - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiTcp4ProtocolGuid, - (VOID **)&Tcp4, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Update the component name for this child handle. - // - Status = UpdateName (Tcp4); - if (EFI_ERROR (Status)) { - return Status; - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - gTcpControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gTcp4ComponentName) - ); -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c deleted file mode 100644 index adb5aa35cdf2..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c +++ /dev/null @@ -1,1201 +0,0 @@ -/** @file - Implementation of the Socket. - -Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "SockImpl.h" - -/** - Get the length of the data that can be retrieved from the socket - receive buffer. - - @param SockBuffer Pointer to the socket receive buffer. - @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is - OOB. - @param BufLen The maximum length of the data buffer to store the - received data in socket layer. - - @return The length of the data can be retreived. - -**/ -UINT32 -SockTcpDataToRcv ( - IN SOCK_BUFFER *SockBuffer, - OUT BOOLEAN *IsUrg, - IN UINT32 BufLen - ); - -/** - Process the send token. - - @param Sock Pointer to the socket. - -**/ -VOID -SockProcessSndToken ( - IN OUT SOCKET *Sock - ); - -/** - Supporting function for both SockImpl and SockInterface. - - @param Event The Event this notify function registered to, ignored. - -**/ -VOID -EFIAPI -SockFreeFoo ( - IN EFI_EVENT Event - ) -{ - return ; -} - - -/** - Get the length of the data that can be retrieved from the socket - receive buffer. - - @param SockBuffer Pointer to the socket receive buffer. - @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is - OOB. - @param BufLen The maximum length of the data buffer to store the - received data in socket layer. - - @return The length of the data can be retreived. - -**/ -UINT32 -SockTcpDataToRcv ( - IN SOCK_BUFFER *SockBuffer, - OUT BOOLEAN *IsUrg, - IN UINT32 BufLen - ) -{ - NET_BUF *RcvBufEntry; - UINT32 DataLen; - TCP_RSV_DATA *TcpRsvData; - BOOLEAN Urg; - ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0)); - - RcvBufEntry = SockBufFirst (SockBuffer); - ASSERT (RcvBufEntry != NULL); - - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; - - *IsUrg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); - - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { - - DataLen = MIN (TcpRsvData->UrgLen, BufLen); - - if (DataLen < TcpRsvData->UrgLen) { - TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen; - } else { - TcpRsvData->UrgLen = 0; - } - - return DataLen; - - } - - DataLen = RcvBufEntry->TotalSize; - - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); - - while ((BufLen > DataLen) && (RcvBufEntry != NULL)) { - - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; - - Urg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); - - if (*IsUrg != Urg) { - break; - } - - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { - - if (TcpRsvData->UrgLen + DataLen < BufLen) { - TcpRsvData->UrgLen = 0; - } else { - TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen); - } - - return MIN (TcpRsvData->UrgLen + DataLen, BufLen); - - } - - DataLen += RcvBufEntry->TotalSize; - - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); - } - - DataLen = MIN (BufLen, DataLen); - return DataLen; -} - - -/** - Copy data from socket buffer to application provided receive buffer. - - @param Sock Pointer to the socket. - @param TcpRxData Pointer to the application provided receive buffer. - @param RcvdBytes The maximum length of the data can be copied. - @param IsOOB If TRUE the data is OOB, FALSE the data is normal. - -**/ -VOID -SockSetTcpRxData ( - IN SOCKET *Sock, - IN VOID *TcpRxData, - IN UINT32 RcvdBytes, - IN BOOLEAN IsOOB - ) -{ - UINT32 Index; - UINT32 CopyBytes; - UINT32 OffSet; - EFI_TCP4_RECEIVE_DATA *RxData; - EFI_TCP4_FRAGMENT_DATA *Fragment; - - RxData = (EFI_TCP4_RECEIVE_DATA *) TcpRxData; - - OffSet = 0; - - ASSERT (RxData->DataLength >= RcvdBytes); - - RxData->DataLength = RcvdBytes; - RxData->UrgentFlag = IsOOB; - - for (Index = 0; (Index < RxData->FragmentCount) && (RcvdBytes > 0); Index++) { - - Fragment = &RxData->FragmentTable[Index]; - CopyBytes = MIN ((UINT32) (Fragment->FragmentLength), RcvdBytes); - - NetbufQueCopy ( - Sock->RcvBuffer.DataQueue, - OffSet, - CopyBytes, - Fragment->FragmentBuffer - ); - - Fragment->FragmentLength = CopyBytes; - RcvdBytes -= CopyBytes; - OffSet += CopyBytes; - } -} - - -/** - Get received data from the socket layer to the receive token. - - @param Sock Pointer to the socket. - @param RcvToken Pointer to the application provided receive token. - - @return The length of data received in this token. - -**/ -UINT32 -SockProcessRcvToken ( - IN SOCKET *Sock, - IN OUT SOCK_IO_TOKEN *RcvToken - ) -{ - UINT32 TokenRcvdBytes; - EFI_TCP4_RECEIVE_DATA *RxData; - BOOLEAN IsUrg; - - ASSERT (Sock != NULL); - - ASSERT (SockStream == Sock->Type); - - RxData = RcvToken->Packet.RxData; - - TokenRcvdBytes = SockTcpDataToRcv ( - &Sock->RcvBuffer, - &IsUrg, - (UINT32) RxData->DataLength - ); - - // - // Copy data from RcvBuffer of socket to user - // provided RxData and set the fields in TCP RxData - // - SockSetTcpRxData (Sock, RxData, TokenRcvdBytes, IsUrg); - - NetbufQueTrim (Sock->RcvBuffer.DataQueue, TokenRcvdBytes); - SIGNAL_TOKEN (&(RcvToken->Token), EFI_SUCCESS); - - return TokenRcvdBytes; -} - - -/** - Process the TCP send data, buffer the tcp txdata and append - the buffer to socket send buffer,then try to send it. - - @param Sock Pointer to the socket. - @param TcpTxData Pointer to the application provided send buffer. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -SockProcessTcpSndData ( - IN SOCKET *Sock, - IN VOID *TcpTxData - ) -{ - NET_BUF *SndData; - EFI_STATUS Status; - EFI_TCP4_TRANSMIT_DATA *TxData; - - TxData = (EFI_TCP4_TRANSMIT_DATA *) TcpTxData; - - // - // transform this TxData into a NET_BUFFER - // and insert it into Sock->SndBuffer - // - SndData = NetbufFromExt ( - (NET_FRAGMENT *) TxData->FragmentTable, - (UINT32) TxData->FragmentCount, - 0, - 0, - SockFreeFoo, - NULL - ); - - if (NULL == SndData) { - DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to" - " call NetBufferFromExt\n")); - - return EFI_OUT_OF_RESOURCES; - } - - NetbufQueAppend (Sock->SndBuffer.DataQueue, SndData); - - // - // notify the low layer protocol to handle this send token - // - if (TxData->Urgent) { - Status = Sock->ProtoHandler (Sock, SOCK_SNDURG, NULL); - - if (EFI_ERROR (Status)) { - return Status; - } - } - - if (TxData->Push) { - Status = Sock->ProtoHandler (Sock, SOCK_SNDPUSH, NULL); - - if (EFI_ERROR (Status)) { - return Status; - } - } - - // - // low layer protocol should really handle the sending - // process when catching SOCK_SND request - // - Status = Sock->ProtoHandler (Sock, SOCK_SND, NULL); - - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} - - -/** - Flush the tokens in the specific token list. - - @param Sock Pointer to the socket. - @param PendingTokenList Pointer to the token list to be flushed. - -**/ -VOID -SockFlushPendingToken ( - IN SOCKET *Sock, - IN LIST_ENTRY *PendingTokenList - ) -{ - SOCK_TOKEN *SockToken; - SOCK_COMPLETION_TOKEN *Token; - - ASSERT ((Sock != NULL) && (PendingTokenList != NULL)); - - while (!IsListEmpty (PendingTokenList)) { - SockToken = NET_LIST_HEAD ( - PendingTokenList, - SOCK_TOKEN, - TokenList - ); - - Token = SockToken->Token; - SIGNAL_TOKEN (Token, Sock->SockError); - - RemoveEntryList (&(SockToken->TokenList)); - FreePool (SockToken); - } -} - - -/** - Wake up the connection token while the connection is successfully established, - then try to process any pending send token. - - @param Sock Pointer to the socket. - -**/ -VOID -SockWakeConnToken ( - IN OUT SOCKET *Sock - ) -{ - ASSERT (Sock->ConnectionToken != NULL); - - SIGNAL_TOKEN (Sock->ConnectionToken, EFI_SUCCESS); - Sock->ConnectionToken = NULL; - - // - // check to see if some pending send token existed? - // - SockProcessSndToken (Sock); - return ; -} - - -/** - Wake up the listen token while the connection is established successfully. - - @param Sock Pointer to the socket. - -**/ -VOID -SockWakeListenToken ( - IN OUT SOCKET *Sock - ) -{ - SOCKET *Parent; - SOCK_TOKEN *SockToken; - EFI_TCP4_LISTEN_TOKEN *ListenToken; - - Parent = Sock->Parent; - - ASSERT ((Parent != NULL) && SOCK_IS_LISTENING (Parent) && SOCK_IS_CONNECTED (Sock)); - - if (!IsListEmpty (&Parent->ListenTokenList)) { - SockToken = NET_LIST_HEAD ( - &Parent->ListenTokenList, - SOCK_TOKEN, - TokenList - ); - - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) SockToken->Token; - ListenToken->NewChildHandle = Sock->SockHandle; - - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); - - RemoveEntryList (&SockToken->TokenList); - FreePool (SockToken); - - RemoveEntryList (&Sock->ConnectionList); - - Parent->ConnCnt--; - DEBUG ((EFI_D_NET, "SockWakeListenToken: accept a socket, now conncnt is %d", Parent->ConnCnt)); - - Sock->Parent = NULL; - } -} - - -/** - Wake up the receive token while some data is received. - - @param Sock Pointer to the socket. - -**/ -VOID -SockWakeRcvToken ( - IN SOCKET *Sock - ) -{ - UINT32 RcvdBytes; - UINT32 TokenRcvdBytes; - SOCK_TOKEN *SockToken; - SOCK_IO_TOKEN *RcvToken; - - ASSERT (Sock->RcvBuffer.DataQueue != NULL); - - RcvdBytes = (Sock->RcvBuffer.DataQueue)->BufSize; - - ASSERT (RcvdBytes > 0); - - while (RcvdBytes > 0 && !IsListEmpty (&Sock->RcvTokenList)) { - - SockToken = NET_LIST_HEAD ( - &Sock->RcvTokenList, - SOCK_TOKEN, - TokenList - ); - - RcvToken = (SOCK_IO_TOKEN *) SockToken->Token; - TokenRcvdBytes = SockProcessRcvToken (Sock, RcvToken); - - if (0 == TokenRcvdBytes) { - return ; - } - - RemoveEntryList (&(SockToken->TokenList)); - FreePool (SockToken); - RcvdBytes -= TokenRcvdBytes; - } -} - - -/** - Process the send token. - - @param Sock Pointer to the socket. - -**/ -VOID -SockProcessSndToken ( - IN OUT SOCKET *Sock - ) -{ - UINT32 FreeSpace; - SOCK_TOKEN *SockToken; - UINT32 DataLen; - SOCK_IO_TOKEN *SndToken; - EFI_TCP4_TRANSMIT_DATA *TxData; - EFI_STATUS Status; - - ASSERT ((Sock != NULL) && (SockStream == Sock->Type)); - - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); - - // - // to determine if process a send token using - // socket layer flow control policy - // - while ((FreeSpace >= Sock->SndBuffer.LowWater) && - !IsListEmpty (&Sock->SndTokenList)) { - - SockToken = NET_LIST_HEAD ( - &(Sock->SndTokenList), - SOCK_TOKEN, - TokenList - ); - - // - // process this token - // - RemoveEntryList (&(SockToken->TokenList)); - InsertTailList ( - &(Sock->ProcessingSndTokenList), - &(SockToken->TokenList) - ); - - // - // Proceess it in the light of SockType - // - SndToken = (SOCK_IO_TOKEN *) SockToken->Token; - TxData = SndToken->Packet.TxData; - - DataLen = (UINT32) TxData->DataLength; - Status = SockProcessTcpSndData (Sock, TxData); - - if (EFI_ERROR (Status)) { - goto OnError; - } - - if (DataLen >= FreeSpace) { - FreeSpace = 0; - - } else { - FreeSpace -= DataLen; - - } - } - - return ; - -OnError: - - RemoveEntryList (&SockToken->TokenList); - SIGNAL_TOKEN (SockToken->Token, Status); - FreePool (SockToken); -} - - -/** - Create a socket with initial data SockInitData. - - @param SockInitData Pointer to the initial data of the socket. - - @return Pointer to the newly created socket, return NULL when exception occured. - -**/ -SOCKET * -SockCreate ( - IN SOCK_INIT_DATA *SockInitData - ) -{ - SOCKET *Sock; - SOCKET *Parent; - EFI_STATUS Status; - - ASSERT ((SockInitData != NULL) && (SockInitData->ProtoHandler != NULL)); - ASSERT (SockInitData->Type == SockStream); - ASSERT ((SockInitData->ProtoData != NULL) && (SockInitData->DataSize <= PROTO_RESERVED_LEN)); - - Parent = SockInitData->Parent; - - if ((Parent != NULL) && (Parent->ConnCnt == Parent->BackLog)) { - DEBUG ( - (EFI_D_ERROR, - "SockCreate: Socket parent has " - "reached its connection limit with %d ConnCnt and %d BackLog\n", - Parent->ConnCnt, - Parent->BackLog) - ); - - return NULL; - } - - Sock = AllocateZeroPool (sizeof (SOCKET)); - if (NULL == Sock) { - - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to create a new socket\n")); - return NULL; - } - - InitializeListHead (&Sock->Link); - InitializeListHead (&Sock->ConnectionList); - InitializeListHead (&Sock->ListenTokenList); - InitializeListHead (&Sock->RcvTokenList); - InitializeListHead (&Sock->SndTokenList); - InitializeListHead (&Sock->ProcessingSndTokenList); - - EfiInitializeLock (&(Sock->Lock), TPL_CALLBACK); - - Sock->SndBuffer.DataQueue = NetbufQueAlloc (); - if (NULL == Sock->SndBuffer.DataQueue) { - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate" - " SndBuffer for new socket\n")); - - goto OnError; - } - - Sock->RcvBuffer.DataQueue = NetbufQueAlloc (); - if (NULL == Sock->RcvBuffer.DataQueue) { - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate " - "RcvBuffer for new socket\n")); - - goto OnError; - } - - Sock->Signature = SOCK_SIGNATURE; - - Sock->Parent = Parent; - Sock->BackLog = SockInitData->BackLog; - Sock->ProtoHandler = SockInitData->ProtoHandler; - Sock->SndBuffer.HighWater = SockInitData->SndBufferSize; - Sock->RcvBuffer.HighWater = SockInitData->RcvBufferSize; - Sock->Type = SockInitData->Type; - Sock->DriverBinding = SockInitData->DriverBinding; - Sock->State = SockInitData->State; - Sock->CreateCallback = SockInitData->CreateCallback; - Sock->DestroyCallback = SockInitData->DestroyCallback; - Sock->Context = SockInitData->Context; - - Sock->SockError = EFI_ABORTED; - Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER; - Sock->RcvBuffer.LowWater = SOCK_BUFF_LOW_WATER; - - // - // Install protocol on Sock->SockHandle - // - CopyMem ( - &(Sock->NetProtocol.TcpProtocol), - SockInitData->Protocol, - sizeof (EFI_TCP4_PROTOCOL) - ); - - // - // copy the protodata into socket - // - CopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize); - - Status = gBS->InstallMultipleProtocolInterfaces ( - &Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &(Sock->NetProtocol.TcpProtocol), - NULL - ); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockCreate: Install TCP protocol in " - "socket failed with %r\n", Status)); - - goto OnError; - } - - if (Parent != NULL) { - ASSERT (Parent->BackLog > 0); - ASSERT (SOCK_IS_LISTENING (Parent)); - - // - // need to add it into Parent->ConnectionList - // if the Parent->ConnCnt < Parent->BackLog - // - Parent->ConnCnt++; - - DEBUG ( - (EFI_D_NET, - "SockCreate: Create a new socket and add to parent, now conncnt is %d\n", - Parent->ConnCnt) - ); - - InsertTailList (&Parent->ConnectionList, &Sock->ConnectionList); - } - - if (Sock->CreateCallback != NULL) { - Status = Sock->CreateCallback (Sock, Sock->Context); - if (EFI_ERROR (Status)) { - goto OnError; - } - } - - return Sock; - -OnError: - - if (Sock->SockHandle != NULL) { - gBS->UninstallMultipleProtocolInterfaces ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &(Sock->NetProtocol.TcpProtocol), - NULL - ); - } - - if (NULL != Sock->SndBuffer.DataQueue) { - NetbufQueFree (Sock->SndBuffer.DataQueue); - } - - if (NULL != Sock->RcvBuffer.DataQueue) { - NetbufQueFree (Sock->RcvBuffer.DataQueue); - } - - FreePool (Sock); - - return NULL; -} - - -/** - Destroy a socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockDestroy ( - IN OUT SOCKET *Sock - ) -{ - ASSERT (SockStream == Sock->Type); - - // - // Flush the completion token buffered - // by sock and rcv, snd buffer - // - if (!SOCK_IS_UNCONFIGURED (Sock)) { - - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - Sock->ConfigureState = SO_UNCONFIGURED; - - } - // - // Destroy the RcvBuffer Queue and SendBuffer Queue - // - NetbufQueFree (Sock->RcvBuffer.DataQueue); - NetbufQueFree (Sock->SndBuffer.DataQueue); - - // - // Remove it from parent connection list if needed - // - if (Sock->Parent != NULL) { - - RemoveEntryList (&(Sock->ConnectionList)); - (Sock->Parent->ConnCnt)--; - - DEBUG ( - (EFI_D_NET, - "SockDestroy: Delete a unaccepted socket from parent" - "now conncnt is %d\n", - Sock->Parent->ConnCnt) - ); - - Sock->Parent = NULL; - } - - FreePool (Sock); - return ; -} - - -/** - Flush the sndBuffer and rcvBuffer of socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockConnFlush ( - IN OUT SOCKET *Sock - ) -{ - SOCKET *Child; - - ASSERT (Sock != NULL); - - // - // Clear the flag in this socket - // - Sock->Flag = 0; - - // - // Flush the SndBuffer and RcvBuffer of Sock - // - NetbufQueFlush (Sock->SndBuffer.DataQueue); - NetbufQueFlush (Sock->RcvBuffer.DataQueue); - - // - // Signal the pending token - // - if (Sock->ConnectionToken != NULL) { - SIGNAL_TOKEN (Sock->ConnectionToken, Sock->SockError); - Sock->ConnectionToken = NULL; - } - - if (Sock->CloseToken != NULL) { - SIGNAL_TOKEN (Sock->CloseToken, Sock->SockError); - Sock->CloseToken = NULL; - } - - SockFlushPendingToken (Sock, &(Sock->ListenTokenList)); - SockFlushPendingToken (Sock, &(Sock->RcvTokenList)); - SockFlushPendingToken (Sock, &(Sock->SndTokenList)); - SockFlushPendingToken (Sock, &(Sock->ProcessingSndTokenList)); - - // - // Destroy the pending connection, if it is a listening socket - // - if (SOCK_IS_LISTENING (Sock)) { - while (!IsListEmpty (&Sock->ConnectionList)) { - Child = NET_LIST_HEAD ( - &Sock->ConnectionList, - SOCKET, - ConnectionList - ); - - SockDestroyChild (Child); - } - - Sock->ConnCnt = 0; - } - - return ; -} - - -/** - Set the state of the socket. - - @param Sock Pointer to the socket. - @param State The new socket state to be set. - -**/ -VOID -SockSetState ( - IN OUT SOCKET *Sock, - IN UINT8 State - ) -{ - Sock->State = State; -} - - -/** - Clone a new socket including its associated protocol control block. - - @param Sock Pointer to the socket to be cloned. - - @return Pointer to the newly cloned socket. If NULL, error condition occurred. - -**/ -SOCKET * -SockClone ( - IN SOCKET *Sock - ) -{ - SOCKET *ClonedSock; - SOCK_INIT_DATA InitData; - - InitData.BackLog = Sock->BackLog; - InitData.Parent = Sock; - InitData.State = Sock->State; - InitData.ProtoHandler = Sock->ProtoHandler; - InitData.Type = Sock->Type; - InitData.RcvBufferSize = Sock->RcvBuffer.HighWater; - InitData.SndBufferSize = Sock->SndBuffer.HighWater; - InitData.DriverBinding = Sock->DriverBinding; - InitData.Protocol = &(Sock->NetProtocol); - InitData.CreateCallback = Sock->CreateCallback; - InitData.DestroyCallback = Sock->DestroyCallback; - InitData.Context = Sock->Context; - InitData.ProtoData = Sock->ProtoReserved; - InitData.DataSize = sizeof (Sock->ProtoReserved); - - ClonedSock = SockCreate (&InitData); - - if (NULL == ClonedSock) { - DEBUG ((EFI_D_ERROR, "SockClone: no resource to create a cloned sock\n")); - return NULL; - } - - SockSetState (ClonedSock, SO_CONNECTING); - ClonedSock->ConfigureState = Sock->ConfigureState; - - return ClonedSock; -} - - -/** - Called by the low layer protocol to indicate the socket a connection is - established. - - This function just changes the socket's state to SO_CONNECTED - and signals the token used for connection establishment. - - @param Sock Pointer to the socket associated with the - established connection. -**/ -VOID -SockConnEstablished ( - IN SOCKET *Sock - ) -{ - - ASSERT (SO_CONNECTING == Sock->State); - - SockSetState (Sock, SO_CONNECTED); - - if (NULL == Sock->Parent) { - SockWakeConnToken (Sock); - } else { - SockWakeListenToken (Sock); - } - - return ; -} - - -/** - Called by the low layer protocol to indicate the connection is closed. - - This function flushes the socket, sets the state to SO_CLOSED and signals - the close token. - - @param Sock Pointer to the socket associated with the closed - connection. - -**/ -VOID -SockConnClosed ( - IN OUT SOCKET *Sock - ) -{ - if (Sock->CloseToken != NULL) { - SIGNAL_TOKEN (Sock->CloseToken, EFI_SUCCESS); - Sock->CloseToken = NULL; - } - - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - - if (Sock->Parent != NULL) { - SockDestroyChild (Sock); - } - -} - - -/** - Called by low layer protocol to indicate that some data is sent or processed. - - This function trims the sent data in the socket send buffer, signals the data - token if proper. - - @param Sock Pointer to the socket. - @param Count The length of the data processed or sent, in bytes. - -**/ -VOID -SockDataSent ( - IN SOCKET *Sock, - IN UINT32 Count - ) -{ - SOCK_TOKEN *SockToken; - SOCK_COMPLETION_TOKEN *SndToken; - - ASSERT (!IsListEmpty (&Sock->ProcessingSndTokenList)); - ASSERT (Count <= (Sock->SndBuffer.DataQueue)->BufSize); - - NetbufQueTrim (Sock->SndBuffer.DataQueue, Count); - - // - // To check if we can signal some snd token in this socket - // - while (Count > 0) { - SockToken = NET_LIST_HEAD ( - &(Sock->ProcessingSndTokenList), - SOCK_TOKEN, - TokenList - ); - - SndToken = SockToken->Token; - - if (SockToken->RemainDataLen <= Count) { - - RemoveEntryList (&(SockToken->TokenList)); - SIGNAL_TOKEN (SndToken, EFI_SUCCESS); - Count -= SockToken->RemainDataLen; - FreePool (SockToken); - } else { - - SockToken->RemainDataLen -= Count; - Count = 0; - } - } - - // - // to judge if we can process some send token in - // Sock->SndTokenList, if so process those send token - // - SockProcessSndToken (Sock); - return ; -} - - -/** - Called by the low layer protocol to copy some data in socket send - buffer starting from the specific offset to a buffer provided by - the caller. - - @param Sock Pointer to the socket. - @param Offset The start point of the data to be copied. - @param Len The length of the data to be copied. - @param Dest Pointer to the destination to copy the data. - - @return The data size copied. - -**/ -UINT32 -SockGetDataToSend ( - IN SOCKET *Sock, - IN UINT32 Offset, - IN UINT32 Len, - IN UINT8 *Dest - ) -{ - ASSERT ((Sock != NULL) && SockStream == Sock->Type); - - return NetbufQueCopy ( - Sock->SndBuffer.DataQueue, - Offset, - Len, - Dest - ); -} - - -/** - Called by the low layer protocol to deliver received data to socket layer. - - This function will append the data to the socket receive buffer, set ther - urgent data length and then check if any receive token can be signaled. - - @param Sock Pointer to the socket. - @param NetBuffer Pointer to the buffer that contains the received - data. - @param UrgLen The length of the urgent data in the received data. - -**/ -VOID -SockDataRcvd ( - IN SOCKET *Sock, - IN OUT NET_BUF *NetBuffer, - IN UINT32 UrgLen - ) -{ - ASSERT ((Sock != NULL) && (Sock->RcvBuffer.DataQueue != NULL) && - UrgLen <= NetBuffer->TotalSize); - - NET_GET_REF (NetBuffer); - - ((TCP_RSV_DATA *) (NetBuffer->ProtoData))->UrgLen = UrgLen; - - NetbufQueAppend (Sock->RcvBuffer.DataQueue, NetBuffer); - - SockWakeRcvToken (Sock); - return ; -} - - -/** - Get the length of the free space of the specific socket buffer. - - @param Sock Pointer to the socket. - @param Which Flag to indicate which socket buffer to check, - either send buffer or receive buffer. - - @return The length of the free space, in bytes. - -**/ -UINT32 -SockGetFreeSpace ( - IN SOCKET *Sock, - IN UINT32 Which - ) -{ - UINT32 BufferCC; - SOCK_BUFFER *SockBuffer; - - ASSERT ((Sock != NULL) && ((SOCK_SND_BUF == Which) || (SOCK_RCV_BUF == Which))); - - if (SOCK_SND_BUF == Which) { - SockBuffer = &(Sock->SndBuffer); - } else { - SockBuffer = &(Sock->RcvBuffer); - } - - BufferCC = (SockBuffer->DataQueue)->BufSize; - - if (BufferCC >= SockBuffer->HighWater) { - - return 0; - } - - return SockBuffer->HighWater - BufferCC; -} - - - -/** - Called by the low layer protocol to indicate that there will be no more data - from the communication peer. - - This function set the socket's state to SO_NO_MORE_DATA and signal all queued - IO tokens with the error status EFI_CONNECTION_FIN. - - @param Sock Pointer to the socket. - -**/ -VOID -SockNoMoreData ( - IN OUT SOCKET *Sock - ) -{ - EFI_STATUS Err; - - SOCK_NO_MORE_DATA (Sock); - - if (!IsListEmpty (&Sock->RcvTokenList)) { - - ASSERT (0 == GET_RCV_DATASIZE (Sock)); - - Err = Sock->SockError; - - SOCK_ERROR (Sock, EFI_CONNECTION_FIN); - - SockFlushPendingToken (Sock, &Sock->RcvTokenList); - - SOCK_ERROR (Sock, Err); - - } - -} - - -/** - Get the first buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - - @return Pointer to the first buffer in the queue. NULL if the queue is empty. - -**/ -NET_BUF * -SockBufFirst ( - IN SOCK_BUFFER *Sockbuf - ) -{ - LIST_ENTRY *NetbufList; - - NetbufList = &(Sockbuf->DataQueue->BufList); - - if (IsListEmpty (NetbufList)) { - return NULL; - } - - return NET_LIST_HEAD (NetbufList, NET_BUF, List); -} - - -/** - Get the next buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - @param SockEntry Pointer to the buffer block prior to the required - one. - - @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is - the tail or head entry. - -**/ -NET_BUF * -SockBufNext ( - IN SOCK_BUFFER *Sockbuf, - IN NET_BUF *SockEntry - ) -{ - LIST_ENTRY *NetbufList; - - NetbufList = &(Sockbuf->DataQueue->BufList); - - if ((SockEntry->List.ForwardLink == NetbufList) || - (SockEntry->List.BackLink == &SockEntry->List) || - (SockEntry->List.ForwardLink == &SockEntry->List)) { - - return NULL; - } - - return NET_LIST_USER_STRUCT (SockEntry->List.ForwardLink, NET_BUF, List); -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c deleted file mode 100644 index cd20b8bcb2dd..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c +++ /dev/null @@ -1,990 +0,0 @@ -/** @file - Interface function of the Socket. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "SockImpl.h" - - -/** - Check whether the Event is in the List. - - @param List Pointer to the token list to be searched. - @param Event The event to be checked. - - @retval TRUE The specific Event exists in the List. - @retval FALSE The specific Event is not in the List. - -**/ -BOOLEAN -SockTokenExistedInList ( - IN LIST_ENTRY *List, - IN EFI_EVENT Event - ) -{ - LIST_ENTRY *ListEntry; - SOCK_TOKEN *SockToken; - - NET_LIST_FOR_EACH (ListEntry, List) { - SockToken = NET_LIST_USER_STRUCT ( - ListEntry, - SOCK_TOKEN, - TokenList - ); - - if (Event == SockToken->Token->Event) { - return TRUE; - } - } - - return FALSE; -} - - -/** - Call SockTokenExistedInList() to check whether the Event is - in the related socket's lists. - - @param Sock Pointer to the instance's socket. - @param Event The event to be checked. - - @retval TRUE The Event exists in related socket's lists. - @retval FALSE The Event is not in related socket's lists. - -**/ -BOOLEAN -SockTokenExisted ( - IN SOCKET *Sock, - IN EFI_EVENT Event - ) -{ - - if (SockTokenExistedInList (&Sock->SndTokenList, Event) || - SockTokenExistedInList (&Sock->ProcessingSndTokenList, Event) || - SockTokenExistedInList (&Sock->RcvTokenList, Event) || - SockTokenExistedInList (&Sock->ListenTokenList, Event)) { - - return TRUE; - } - - if ((Sock->ConnectionToken != NULL) && - (Sock->ConnectionToken->Event == Event)) { - - return TRUE; - } - - if ((Sock->CloseToken != NULL) && (Sock->CloseToken->Event == Event)) { - return TRUE; - } - - return FALSE; -} - - -/** - Buffer a token into the specific list of socket Sock. - - @param Sock Pointer to the instance's socket. - @param List Pointer to the list to store the token. - @param Token Pointer to the token to be buffered. - @param DataLen The data length of the buffer contained in Token. - - @return Pointer to the token that wraps Token. If NULL, error condition occurred. - -**/ -SOCK_TOKEN * -SockBufferToken ( - IN SOCKET *Sock, - IN LIST_ENTRY *List, - IN VOID *Token, - IN UINT32 DataLen - ) -{ - SOCK_TOKEN *SockToken; - - SockToken = AllocatePool (sizeof (SOCK_TOKEN)); - if (NULL == SockToken) { - - DEBUG ((EFI_D_ERROR, "SockBufferIOToken: No Memory " - "to allocate SockToken\n")); - - return NULL; - } - - SockToken->Sock = Sock; - SockToken->Token = (SOCK_COMPLETION_TOKEN *) Token; - SockToken->RemainDataLen = DataLen; - InsertTailList (List, &SockToken->TokenList); - - return SockToken; -} - - -/** - Destroy the socket Sock and its associated protocol control block. - - @param Sock The socket to be destroyed. - - @retval EFI_SUCCESS The socket Sock is destroyed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockDestroyChild ( - IN SOCKET *Sock - ) -{ - EFI_STATUS Status; - TCP4_PROTO_DATA *ProtoData; - TCP_CB *Tcb; - VOID *SockProtocol; - - ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL)); - - if (Sock->InDestroy) { - return EFI_SUCCESS; - } - - Sock->InDestroy = TRUE; - - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - Tcb = ProtoData->TcpPcb; - - ASSERT (Tcb != NULL); - - // - // Close the IP protocol. - // - gBS->CloseProtocol ( - Tcb->IpInfo->ChildHandle, - &gEfiIp4ProtocolGuid, - ProtoData->TcpService->IpIo->Image, - Sock->SockHandle - ); - - if (Sock->DestroyCallback != NULL) { - Sock->DestroyCallback (Sock, Sock->Context); - } - - // - // Retrieve the protocol installed on this sock - // - Status = gBS->OpenProtocol ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &SockProtocol, - Sock->DriverBinding, - Sock->SockHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Open protocol installed " - "on socket failed with %r\n", Status)); - } - - // - // Uninstall the protocol installed on this sock - // in the light of Sock->SockType - // - gBS->UninstallMultipleProtocolInterfaces ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - SockProtocol, - NULL - ); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Get the lock to " - "access socket failed with %r\n", Status)); - - return EFI_ACCESS_DENIED; - } - - // - // force protocol layer to detach the PCB - // - Status = Sock->ProtoHandler (Sock, SOCK_DETACH, NULL); - - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Protocol detach socket" - " failed with %r\n", Status)); - - Sock->InDestroy = FALSE; - } else if (SOCK_IS_CONFIGURED (Sock)) { - - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - - Sock->ConfigureState = SO_UNCONFIGURED; - } - - EfiReleaseLock (&(Sock->Lock)); - - if (EFI_ERROR (Status)) { - return Status; - } - - SockDestroy (Sock); - return EFI_SUCCESS; -} - - -/** - Create a socket and its associated protocol control block - with the intial data SockInitData and protocol specific - data ProtoData. - - @param SockInitData Inital data to setting the socket. - - @return Pointer to the newly created socket. If NULL, error condition occured. - -**/ -SOCKET * -SockCreateChild ( - IN SOCK_INIT_DATA *SockInitData - ) -{ - SOCKET *Sock; - VOID *SockProtocol; - EFI_STATUS Status; - - // - // create a new socket - // - Sock = SockCreate (SockInitData); - if (NULL == Sock) { - - DEBUG ((EFI_D_ERROR, "SockCreateChild: No resource to " - "create a new socket\n")); - - return NULL; - } - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockCreateChild: Get the lock to " - "access socket failed with %r\n", Status)); - - goto ERROR; - } - // - // inform the protocol layer to attach the socket - // with a new protocol control block - // - Status = Sock->ProtoHandler (Sock, SOCK_ATTACH, NULL); - EfiReleaseLock (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockCreateChild: Protocol failed to" - " attach a socket with %r\n", Status)); - - goto ERROR; - } - - return Sock; - -ERROR: - - if (Sock->DestroyCallback != NULL) { - Sock->DestroyCallback (Sock, Sock->Context); - } - - gBS->OpenProtocol ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &SockProtocol, - Sock->DriverBinding, - Sock->SockHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - // - // Uninstall the protocol installed on this sock - // - gBS->UninstallMultipleProtocolInterfaces ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - SockProtocol, - NULL - ); - SockDestroy (Sock); - return NULL; -} - - -/** - Configure the specific socket Sock using configuration data ConfigData. - - @param Sock Pointer to the socket to be configured. - @param ConfigData Pointer to the configuration data. - - @retval EFI_SUCCESS The socket is configured successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or the - socket is already configured. - -**/ -EFI_STATUS -SockConfigure ( - IN SOCKET *Sock, - IN VOID *ConfigData - ) -{ - EFI_STATUS Status; - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockConfigure: Get the access for " - "socket failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_CONFIGURED (Sock)) { - Status = EFI_ACCESS_DENIED; - goto OnExit; - } - - ASSERT (Sock->State == SO_CLOSED); - - Status = Sock->ProtoHandler (Sock, SOCK_CONFIGURE, ConfigData); - -OnExit: - EfiReleaseLock (&(Sock->Lock)); - - return Status; -} - - -/** - Initiate a connection establishment process. - - @param Sock Pointer to the socket to initiate the initate the - connection. - @param Token Pointer to the token used for the connection - operation. - - @retval EFI_SUCCESS The connection is initialized successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be an active one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockConnect ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - EFI_STATUS Status; - EFI_EVENT Event; - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockConnect: Get the access for " - "socket failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto OnExit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - - Status = EFI_NOT_STARTED; - goto OnExit; - } - - if (!SOCK_IS_CLOSED (Sock) || !SOCK_IS_CONFIGURED_ACTIVE (Sock)) { - - Status = EFI_ACCESS_DENIED; - goto OnExit; - } - - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; - - if (SockTokenExisted (Sock, Event)) { - - Status = EFI_ACCESS_DENIED; - goto OnExit; - } - - Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *) Token; - SockSetState (Sock, SO_CONNECTING); - Status = Sock->ProtoHandler (Sock, SOCK_CONNECT, NULL); - -OnExit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Issue a listen token to get an existed connected network instance - or wait for a connection if there is none. - - @param Sock Pointer to the socket to accept connections. - @param Token The token to accept a connection. - - @retval EFI_SUCCESS Either a connection is accpeted or the Token is - buffered for further acception. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be a passive one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limit. - -**/ -EFI_STATUS -SockAccept ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - EFI_TCP4_LISTEN_TOKEN *ListenToken; - LIST_ENTRY *ListEntry; - EFI_STATUS Status; - SOCKET *Socket; - EFI_EVENT Event; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockAccept: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (!SOCK_IS_LISTENING (Sock)) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; - - if (SockTokenExisted (Sock, Event)) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) Token; - - // - // Check if a connection has already in this Sock->ConnectionList - // - NET_LIST_FOR_EACH (ListEntry, &Sock->ConnectionList) { - - Socket = NET_LIST_USER_STRUCT (ListEntry, SOCKET, ConnectionList); - - if (SOCK_IS_CONNECTED (Socket)) { - ListenToken->NewChildHandle = Socket->SockHandle; - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); - - RemoveEntryList (ListEntry); - - ASSERT (Socket->Parent != NULL); - - Socket->Parent->ConnCnt--; - - DEBUG ( - (EFI_D_NET, - "SockAccept: Accept a socket, now conncount is %d", - Socket->Parent->ConnCnt) - ); - Socket->Parent = NULL; - - goto Exit; - } - } - - // - // Buffer this token for latter incoming connection request - // - if (NULL == SockBufferToken (Sock, &(Sock->ListenTokenList), Token, 0)) { - - Status = EFI_OUT_OF_RESOURCES; - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - - return Status; -} - - -/** - Issue a token with data to the socket to send out. - - @param Sock Pointer to the socket to process the token with - data. - @param Token The token with data that needs to send out. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockSend ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - SOCK_IO_TOKEN *SndToken; - EFI_EVENT Event; - UINT32 FreeSpace; - EFI_TCP4_TRANSMIT_DATA *TxData; - EFI_STATUS Status; - SOCK_TOKEN *SockToken; - UINT32 DataLen; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockSend: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - SndToken = (SOCK_IO_TOKEN *) Token; - TxData = (EFI_TCP4_TRANSMIT_DATA *) SndToken->Packet.TxData; - - if (SOCK_IS_UNCONFIGURED (Sock)) { - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (!(SOCK_IS_CONNECTING (Sock) || SOCK_IS_CONNECTED (Sock))) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - // - // check if a token is already in the token buffer - // - Event = SndToken->Token.Event; - - if (SockTokenExisted (Sock, Event)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - DataLen = (UINT32) TxData->DataLength; - - // - // process this sending token now or buffer it only? - // - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); - - if ((FreeSpace < Sock->SndBuffer.LowWater) || !SOCK_IS_CONNECTED (Sock)) { - - SockToken = SockBufferToken ( - Sock, - &Sock->SndTokenList, - SndToken, - DataLen - ); - - if (NULL == SockToken) { - Status = EFI_OUT_OF_RESOURCES; - } - } else { - - SockToken = SockBufferToken ( - Sock, - &Sock->ProcessingSndTokenList, - SndToken, - DataLen - ); - - if (NULL == SockToken) { - DEBUG ((EFI_D_ERROR, "SockSend: Failed to buffer IO token into" - " socket processing SndToken List\n", Status)); - - Status = EFI_OUT_OF_RESOURCES; - goto Exit; - } - - Status = SockProcessTcpSndData (Sock, TxData); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockSend: Failed to process " - "Snd Data\n", Status)); - - RemoveEntryList (&(SockToken->TokenList)); - FreePool (SockToken); - } - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Issue a token to get data from the socket. - - @param Sock Pointer to the socket to get data from. - @param Token The token to store the received data from the - socket. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_CONNECTION_FIN The connection is closed and there is no more data. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockRcv ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - SOCK_IO_TOKEN *RcvToken; - UINT32 RcvdBytes; - EFI_STATUS Status; - EFI_EVENT Event; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockRcv: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (!(SOCK_IS_CONNECTED (Sock) || SOCK_IS_CONNECTING (Sock))) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - RcvToken = (SOCK_IO_TOKEN *) Token; - - // - // check if a token is already in the token buffer of this socket - // - Event = RcvToken->Token.Event; - if (SockTokenExisted (Sock, Event)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - RcvToken = (SOCK_IO_TOKEN *) Token; - RcvdBytes = GET_RCV_DATASIZE (Sock); - - // - // check whether an error has happened before - // - if (EFI_ABORTED != Sock->SockError) { - - SIGNAL_TOKEN (&(RcvToken->Token), Sock->SockError); - Sock->SockError = EFI_ABORTED; - goto Exit; - } - - // - // check whether can not receive and there is no any - // data buffered in Sock->RcvBuffer - // - if (SOCK_IS_NO_MORE_DATA (Sock) && (0 == RcvdBytes)) { - - Status = EFI_CONNECTION_FIN; - goto Exit; - } - - if (RcvdBytes != 0) { - SockProcessRcvToken (Sock, RcvToken); - - Status = Sock->ProtoHandler (Sock, SOCK_CONSUMED, NULL); - } else { - - if (NULL == SockBufferToken (Sock, &Sock->RcvTokenList, RcvToken, 0)) { - Status = EFI_OUT_OF_RESOURCES; - } - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Reset the socket and its associated protocol control block. - - @param Sock Pointer to the socket to be flushed. - - @retval EFI_SUCCESS The socket is flushed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockFlush ( - IN SOCKET *Sock - ) -{ - EFI_STATUS Status; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockFlush: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (!SOCK_IS_CONFIGURED (Sock)) { - goto Exit; - } - - Status = Sock->ProtoHandler (Sock, SOCK_FLUSH, NULL); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockFlush: Protocol failed handling" - " SOCK_FLUSH with %r", Status)); - - goto Exit; - } - - SOCK_ERROR (Sock, EFI_ABORTED); - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - - Sock->ConfigureState = SO_UNCONFIGURED; - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Close or abort the socket associated connection. - - @param Sock Pointer to the socket of the connection to close or - abort. - @param Token The token for close operation. - @param OnAbort TRUE for aborting the connection, FALSE to close it. - - @retval EFI_SUCCESS The close or abort operation is initialized - successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockClose ( - IN SOCKET *Sock, - IN VOID *Token, - IN BOOLEAN OnAbort - ) -{ - EFI_STATUS Status; - EFI_EVENT Event; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockClose: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (SOCK_IS_DISCONNECTING (Sock)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; - - if (SockTokenExisted (Sock, Event)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - Sock->CloseToken = Token; - SockSetState (Sock, SO_DISCONNECTING); - - if (OnAbort) { - Status = Sock->ProtoHandler (Sock, SOCK_ABORT, NULL); - } else { - Status = Sock->ProtoHandler (Sock, SOCK_CLOSE, NULL); - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Get the mode data of the low layer protocol. - - @param Sock Pointer to the socket to get mode data from. - @param Mode Pointer to the data to store the low layer mode - information. - - @retval EFI_SUCCESS The mode data is got successfully. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockGetMode ( - IN SOCKET *Sock, - IN OUT VOID *Mode - ) -{ - return Sock->ProtoHandler (Sock, SOCK_MODE, Mode); -} - - - - - -/** - Add or remove route information in IP route table associated - with this socket. - - @param Sock Pointer to the socket associated with the IP route - table to operate on. - @param RouteInfo Pointer to the route information to be processed. - - @retval EFI_SUCCESS The route table is updated successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockRoute ( - IN SOCKET *Sock, - IN VOID *RouteInfo - ) -{ - EFI_STATUS Status; - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockRoute: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - Status = EFI_NOT_STARTED; - goto Exit; - } - - Status = Sock->ProtoHandler (Sock, SOCK_ROUTE, RouteInfo); - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c deleted file mode 100644 index a0f97d603171..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c +++ /dev/null @@ -1,717 +0,0 @@ -/** @file - Tcp request dispatcher implementation. - -(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -#define TCP_COMP_VAL(Min, Max, Default, Val) \ - ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default)) - -/** - Add or remove a route entry in the IP route table associated with this TCP instance. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param RouteInfo Pointer to the route info to be processed. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The driver instance has not been started. - @retval EFI_NO_MAPPING When using the default address, configuration(DHCP, - BOOTP, RARP, etc.) is not finished yet. - @retval EFI_OUT_OF_RESOURCES Could not add the entry to the routing table. - @retval EFI_NOT_FOUND This route is not in the routing table - (when RouteInfo->DeleteRoute is TRUE). - @retval EFI_ACCESS_DENIED The route is already defined in the routing table - (when RouteInfo->DeleteRoute is FALSE). -**/ -EFI_STATUS -Tcp4Route ( - IN TCP_CB *Tcb, - IN TCP4_ROUTE_INFO *RouteInfo - ) -{ - EFI_IP4_PROTOCOL *Ip4; - - Ip4 = Tcb->IpInfo->Ip.Ip4; - - ASSERT (Ip4 != NULL); - - return Ip4->Routes ( - Ip4, - RouteInfo->DeleteRoute, - RouteInfo->SubnetAddress, - RouteInfo->SubnetMask, - RouteInfo->GatewayAddress - ); - -} - - -/** - Get the operational settings of this TCP instance. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Mode Pointer to the buffer to store the operational - settings. - - @retval EFI_SUCCESS The mode data is read. - @retval EFI_NOT_STARTED No configuration data is available because this - instance hasn't been started. - -**/ -EFI_STATUS -Tcp4GetMode ( - IN TCP_CB *Tcb, - IN OUT TCP4_MODE_DATA *Mode - ) -{ - SOCKET *Sock; - EFI_TCP4_CONFIG_DATA *ConfigData; - EFI_TCP4_ACCESS_POINT *AccessPoint; - EFI_TCP4_OPTION *Option; - EFI_IP4_PROTOCOL *Ip; - - Sock = Tcb->Sk; - - if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) { - return EFI_NOT_STARTED; - } - - if (Mode->Tcp4State != NULL) { - *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State; - } - - if (Mode->Tcp4ConfigData != NULL) { - - ConfigData = Mode->Tcp4ConfigData; - AccessPoint = &(ConfigData->AccessPoint); - Option = ConfigData->ControlOption; - - ConfigData->TypeOfService = Tcb->Tos; - ConfigData->TimeToLive = Tcb->Ttl; - - AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr; - - IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip); - IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask); - AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port); - - IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip); - AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port); - AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != TCP_LISTEN); - - if (Option != NULL) { - Option->ReceiveBufferSize = GET_RCV_BUFFSIZE (Tcb->Sk); - Option->SendBufferSize = GET_SND_BUFFSIZE (Tcb->Sk); - Option->MaxSynBackLog = GET_BACKLOG (Tcb->Sk); - - Option->ConnectionTimeout = Tcb->ConnectTimeout / TCP_TICK_HZ; - Option->DataRetries = Tcb->MaxRexmit; - Option->FinTimeout = Tcb->FinWait2Timeout / TCP_TICK_HZ; - Option->TimeWaitTimeout = Tcb->TimeWaitTimeout / TCP_TICK_HZ; - Option->KeepAliveProbes = Tcb->MaxKeepAlive; - Option->KeepAliveTime = Tcb->KeepAliveIdle / TCP_TICK_HZ; - Option->KeepAliveInterval = Tcb->KeepAlivePeriod / TCP_TICK_HZ; - - Option->EnableNagle = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE)); - Option->EnableTimeStamp = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)); - Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)); - - Option->EnableSelectiveAck = FALSE; - Option->EnablePathMtuDiscovery = FALSE; - } - } - - Ip = Tcb->IpInfo->Ip.Ip4; - ASSERT (Ip != NULL); - - return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData); -} - - -/** - If AP->StationPort isn't zero, check whether the access point - is registered, else generate a random station port for this - access point. - - @param AP Pointer to the access point. - - @retval EFI_SUCCESS The check is passed or the port is assigned. - @retval EFI_INVALID_PARAMETER The non-zero station port is already used. - @retval EFI_OUT_OF_RESOURCES No port can be allocated. - -**/ -EFI_STATUS -Tcp4Bind ( - IN EFI_TCP4_ACCESS_POINT *AP - ) -{ - BOOLEAN Cycle; - - if (0 != AP->StationPort) { - // - // check if a same endpoint is bound - // - if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) { - - return EFI_INVALID_PARAMETER; - } - } else { - // - // generate a random port - // - Cycle = FALSE; - - if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) { - mTcp4RandomPort = TCP4_PORT_KNOWN; - } - - mTcp4RandomPort++; - - while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) { - - mTcp4RandomPort++; - - if (mTcp4RandomPort <= TCP4_PORT_KNOWN) { - - if (Cycle) { - DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated " - "for this pcb\n")); - - return EFI_OUT_OF_RESOURCES; - } - - mTcp4RandomPort = TCP4_PORT_KNOWN + 1; - - Cycle = TRUE; - } - - } - - AP->StationPort = mTcp4RandomPort; - } - - return EFI_SUCCESS; -} - - -/** - Flush the Tcb add its associated protocols. - - @param Tcb Pointer to the TCP_CB to be flushed. - -**/ -VOID -Tcp4FlushPcb ( - IN TCP_CB *Tcb - ) -{ - SOCKET *Sock; - - IpIoConfigIp (Tcb->IpInfo, NULL); - - Sock = Tcb->Sk; - - if (SOCK_IS_CONFIGURED (Sock)) { - RemoveEntryList (&Tcb->List); - - // - // Uninstall the device path protocol. - // - if (Sock->DevicePath != NULL) { - gBS->UninstallProtocolInterface ( - Sock->SockHandle, - &gEfiDevicePathProtocolGuid, - Sock->DevicePath - ); - FreePool (Sock->DevicePath); - } - } - - NetbufFreeList (&Tcb->SndQue); - NetbufFreeList (&Tcb->RcvQue); - Tcb->State = TCP_CLOSED; -} - -/** - Attach a Pcb to the socket. - - @param Sk Pointer to the socket of this TCP instance. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -Tcp4AttachPcb ( - IN SOCKET *Sk - ) -{ - TCP_CB *Tcb; - TCP4_PROTO_DATA *ProtoData; - IP_IO *IpIo; - EFI_STATUS Status; - VOID *Ip; - - Tcb = AllocateZeroPool (sizeof (TCP_CB)); - - if (Tcb == NULL) { - - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n")); - - return EFI_OUT_OF_RESOURCES; - } - - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; - IpIo = ProtoData->TcpService->IpIo; - - // - // Create an IpInfo for this Tcb. - // - Tcb->IpInfo = IpIoAddIp (IpIo); - if (Tcb->IpInfo == NULL) { - - FreePool (Tcb); - return EFI_OUT_OF_RESOURCES; - } - - // - // Open the new created IP instance BY_CHILD. - // - Status = gBS->OpenProtocol ( - Tcb->IpInfo->ChildHandle, - &gEfiIp4ProtocolGuid, - &Ip, - IpIo->Image, - Sk->SockHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - if (EFI_ERROR (Status)) { - IpIoRemoveIp (IpIo, Tcb->IpInfo); - return Status; - } - - InitializeListHead (&Tcb->List); - InitializeListHead (&Tcb->SndQue); - InitializeListHead (&Tcb->RcvQue); - - Tcb->State = TCP_CLOSED; - Tcb->Sk = Sk; - ProtoData->TcpPcb = Tcb; - - return EFI_SUCCESS; -} - -/** - Detach the Pcb of the socket. - - @param Sk Pointer to the socket of this TCP instance. - -**/ -VOID -Tcp4DetachPcb ( - IN SOCKET *Sk - ) -{ - TCP4_PROTO_DATA *ProtoData; - TCP_CB *Tcb; - - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; - Tcb = ProtoData->TcpPcb; - - ASSERT (Tcb != NULL); - - Tcp4FlushPcb (Tcb); - - IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo); - - FreePool (Tcb); - - ProtoData->TcpPcb = NULL; -} - - -/** - Configure the Pcb using CfgData. - - @param Sk Pointer to the socket of this TCP instance. - @param CfgData Pointer to the TCP configuration data. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_INVALID_PARAMETER A same access point has been configured in - another TCP instance. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -Tcp4ConfigurePcb ( - IN SOCKET *Sk, - IN EFI_TCP4_CONFIG_DATA *CfgData - ) -{ - EFI_IP4_CONFIG_DATA IpCfgData; - EFI_STATUS Status; - EFI_TCP4_OPTION *Option; - TCP4_PROTO_DATA *TcpProto; - TCP_CB *Tcb; - - ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != NULL)); - - TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved; - Tcb = TcpProto->TcpPcb; - - ASSERT (Tcb != NULL); - - // - // Add Ip for send pkt to the peer - // - CopyMem (&IpCfgData, &mIp4IoDefaultIpConfigData, sizeof (IpCfgData)); - IpCfgData.DefaultProtocol = EFI_IP_PROTO_TCP; - IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress; - IpCfgData.StationAddress = CfgData->AccessPoint.StationAddress; - IpCfgData.SubnetMask = CfgData->AccessPoint.SubnetMask; - IpCfgData.ReceiveTimeout = (UINT32) (-1); - - // - // Configure the IP instance this Tcb consumes. - // - Status = IpIoConfigIp (Tcb->IpInfo, &IpCfgData); - if (EFI_ERROR (Status)) { - goto OnExit; - } - - // - // Get the default address info if the instance is configured to use default address. - // - if (CfgData->AccessPoint.UseDefaultAddress) { - CfgData->AccessPoint.StationAddress = IpCfgData.StationAddress; - CfgData->AccessPoint.SubnetMask = IpCfgData.SubnetMask; - } - - // - // check if we can bind this endpoint in CfgData - // - Status = Tcp4Bind (&(CfgData->AccessPoint)); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed " - "with %r\n", Status)); - - goto OnExit; - } - - // - // Initalize the operating information in this Tcb - // - ASSERT (Tcb->State == TCP_CLOSED && - IsListEmpty (&Tcb->SndQue) && - IsListEmpty (&Tcb->RcvQue)); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); - Tcb->State = TCP_CLOSED; - - Tcb->SndMss = 536; - Tcb->RcvMss = TcpGetRcvMss (Sk); - - Tcb->SRtt = 0; - Tcb->Rto = 3 * TCP_TICK_HZ; - - Tcb->CWnd = Tcb->SndMss; - Tcb->Ssthresh = 0xffffffff; - - Tcb->CongestState = TCP_CONGEST_OPEN; - - Tcb->KeepAliveIdle = TCP_KEEPALIVE_IDLE_MIN; - Tcb->KeepAlivePeriod = TCP_KEEPALIVE_PERIOD; - Tcb->MaxKeepAlive = TCP_MAX_KEEPALIVE; - Tcb->MaxRexmit = TCP_MAX_LOSS; - Tcb->FinWait2Timeout = TCP_FIN_WAIT2_TIME; - Tcb->TimeWaitTimeout = TCP_TIME_WAIT_TIME; - Tcb->ConnectTimeout = TCP_CONNECT_TIME; - - // - // initialize Tcb in the light of CfgData - // - Tcb->Ttl = CfgData->TimeToLive; - Tcb->Tos = CfgData->TypeOfService; - - Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress; - - CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR)); - Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort); - IP4_COPY_ADDRESS (&Tcb->SubnetMask, &CfgData->AccessPoint.SubnetMask); - - if (CfgData->AccessPoint.ActiveFlag) { - CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR)); - Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort); - } else { - Tcb->RemoteEnd.Ip = 0; - Tcb->RemoteEnd.Port = 0; - } - - Option = CfgData->ControlOption; - - if (Option != NULL) { - SET_RCV_BUFFSIZE ( - Sk, - (UINT32) (TCP_COMP_VAL ( - TCP_RCV_BUF_SIZE_MIN, - TCP_RCV_BUF_SIZE, - TCP_RCV_BUF_SIZE, - Option->ReceiveBufferSize - ) - ) - ); - SET_SND_BUFFSIZE ( - Sk, - (UINT32) (TCP_COMP_VAL ( - TCP_SND_BUF_SIZE_MIN, - TCP_SND_BUF_SIZE, - TCP_SND_BUF_SIZE, - Option->SendBufferSize - ) - ) - ); - - SET_BACKLOG ( - Sk, - (UINT32) (TCP_COMP_VAL ( - TCP_BACKLOG_MIN, - TCP_BACKLOG, - TCP_BACKLOG, - Option->MaxSynBackLog - ) - ) - ); - - Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL ( - TCP_MAX_LOSS_MIN, - TCP_MAX_LOSS, - TCP_MAX_LOSS, - Option->DataRetries - ); - Tcb->FinWait2Timeout = TCP_COMP_VAL ( - TCP_FIN_WAIT2_TIME, - TCP_FIN_WAIT2_TIME_MAX, - TCP_FIN_WAIT2_TIME, - (UINT32) (Option->FinTimeout * TCP_TICK_HZ) - ); - - if (Option->TimeWaitTimeout != 0) { - Tcb->TimeWaitTimeout = TCP_COMP_VAL ( - TCP_TIME_WAIT_TIME, - TCP_TIME_WAIT_TIME_MAX, - TCP_TIME_WAIT_TIME, - (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ) - ); - } else { - Tcb->TimeWaitTimeout = 0; - } - - if (Option->KeepAliveProbes != 0) { - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); - - Tcb->MaxKeepAlive = (UINT8) TCP_COMP_VAL ( - TCP_MAX_KEEPALIVE_MIN, - TCP_MAX_KEEPALIVE, - TCP_MAX_KEEPALIVE, - Option->KeepAliveProbes - ); - Tcb->KeepAliveIdle = TCP_COMP_VAL ( - TCP_KEEPALIVE_IDLE_MIN, - TCP_KEEPALIVE_IDLE_MAX, - TCP_KEEPALIVE_IDLE_MIN, - (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ) - ); - Tcb->KeepAlivePeriod = TCP_COMP_VAL ( - TCP_KEEPALIVE_PERIOD_MIN, - TCP_KEEPALIVE_PERIOD, - TCP_KEEPALIVE_PERIOD, - (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ) - ); - } - - Tcb->ConnectTimeout = TCP_COMP_VAL ( - TCP_CONNECT_TIME_MIN, - TCP_CONNECT_TIME, - TCP_CONNECT_TIME, - (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ) - ); - - if (!Option->EnableNagle) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE); - } - - if (!Option->EnableTimeStamp) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS); - } - - if (!Option->EnableWindowScaling) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS); - } - } - - // - // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is - // determined, construct the IP device path and install it. - // - Status = TcpInstallDevicePath (Sk); - if (EFI_ERROR (Status)) { - goto OnExit; - } - - // - // update state of Tcb and socket - // - if (!CfgData->AccessPoint.ActiveFlag) { - - TcpSetState (Tcb, TCP_LISTEN); - SockSetState (Sk, SO_LISTENING); - - Sk->ConfigureState = SO_CONFIGURED_PASSIVE; - } else { - - Sk->ConfigureState = SO_CONFIGURED_ACTIVE; - } - - TcpInsertTcb (Tcb); - -OnExit: - - return Status; -} - - -/** - The procotol handler provided to the socket layer, used to - dispatch the socket level requests by calling the corresponding - TCP layer functions. - - @param Sock Pointer to the socket of this TCP instance. - @param Request The code of this operation request. - @param Data Pointer to the operation specific data passed in - together with the operation request. - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN UINT8 Request, - IN VOID *Data OPTIONAL - ) -{ - TCP_CB *Tcb; - TCP4_PROTO_DATA *ProtoData; - EFI_IP4_PROTOCOL *Ip; - - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - Tcb = ProtoData->TcpPcb; - - switch (Request) { - case SOCK_POLL: - Ip = ProtoData->TcpService->IpIo->Ip.Ip4; - Ip->Poll (Ip); - break; - - case SOCK_CONSUMED: - // - // After user received data from socket buffer, socket will - // notify TCP using this message to give it a chance to send out - // window update information - // - ASSERT (Tcb != NULL); - TcpOnAppConsume (Tcb); - break; - - case SOCK_SND: - - ASSERT (Tcb != NULL); - TcpOnAppSend (Tcb); - break; - - case SOCK_CLOSE: - - TcpOnAppClose (Tcb); - - break; - - case SOCK_ABORT: - - TcpOnAppAbort (Tcb); - - break; - - case SOCK_SNDPUSH: - Tcb->SndPsh = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); - - break; - - case SOCK_SNDURG: - Tcb->SndUp = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk) - 1; - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); - - break; - - case SOCK_CONNECT: - - TcpOnAppConnect (Tcb); - - break; - - case SOCK_ATTACH: - - return Tcp4AttachPcb (Sock); - - case SOCK_FLUSH: - - Tcp4FlushPcb (Tcb); - - break; - - case SOCK_DETACH: - - Tcp4DetachPcb (Sock); - - break; - - case SOCK_CONFIGURE: - - return Tcp4ConfigurePcb ( - Sock, - (EFI_TCP4_CONFIG_DATA *) Data - ); - - case SOCK_MODE: - - ASSERT ((Data != NULL) && (Tcb != NULL)); - - return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data); - - case SOCK_ROUTE: - - ASSERT ((Data != NULL) && (Tcb != NULL)); - - return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data); - - default: - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; - -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c deleted file mode 100644 index 2ff8eee8693b..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c +++ /dev/null @@ -1,782 +0,0 @@ -/** @file - Tcp driver function. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - - -UINT16 mTcp4RandomPort; -extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2; -extern EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable; - -TCP4_HEARTBEAT_TIMER mTcp4Timer = { - NULL, - 0 -}; - -EFI_TCP4_PROTOCOL mTcp4ProtocolTemplate = { - Tcp4GetModeData, - Tcp4Configure, - Tcp4Routes, - Tcp4Connect, - Tcp4Accept, - Tcp4Transmit, - Tcp4Receive, - Tcp4Close, - Tcp4Cancel, - Tcp4Poll -}; - -SOCK_INIT_DATA mTcp4DefaultSockData = { - SockStream, - 0, - NULL, - TCP_BACKLOG, - TCP_SND_BUF_SIZE, - TCP_RCV_BUF_SIZE, - &mTcp4ProtocolTemplate, - Tcp4CreateSocketCallback, - Tcp4DestroySocketCallback, - NULL, - NULL, - 0, - Tcp4Dispatcher, - NULL, -}; - -EFI_DRIVER_BINDING_PROTOCOL mTcp4DriverBinding = { - Tcp4DriverBindingSupported, - Tcp4DriverBindingStart, - Tcp4DriverBindingStop, - 0xa, - NULL, - NULL -}; - -EFI_SERVICE_BINDING_PROTOCOL mTcp4ServiceBinding = { - Tcp4ServiceBindingCreateChild, - Tcp4ServiceBindingDestroyChild -}; - - -/** - Create and start the heartbeat timer for TCP driver. - - @retval EFI_SUCCESS The timer is successfully created and started. - @retval other The timer is not created. - -**/ -EFI_STATUS -Tcp4CreateTimer ( - VOID - ) -{ - EFI_STATUS Status; - - Status = EFI_SUCCESS; - - if (mTcp4Timer.RefCnt == 0) { - - Status = gBS->CreateEvent ( - EVT_TIMER | EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - TcpTicking, - NULL, - &mTcp4Timer.TimerEvent - ); - if (!EFI_ERROR (Status)) { - - Status = gBS->SetTimer ( - mTcp4Timer.TimerEvent, - TimerPeriodic, - (UINT64) (TICKS_PER_SECOND / TCP_TICK_HZ) - ); - } - } - - if (!EFI_ERROR (Status)) { - - mTcp4Timer.RefCnt++; - } - - return Status; -} - - -/** - Stop and destroy the heartbeat timer for TCP driver. - -**/ -VOID -Tcp4DestroyTimer ( - VOID - ) -{ - ASSERT (mTcp4Timer.RefCnt > 0); - - mTcp4Timer.RefCnt--; - - if (mTcp4Timer.RefCnt > 0) { - return; - } - - gBS->SetTimer (mTcp4Timer.TimerEvent, TimerCancel, 0); - gBS->CloseEvent (mTcp4Timer.TimerEvent); - mTcp4Timer.TimerEvent = NULL; -} - -/** - Callback function which provided by user to remove one node in NetDestroyLinkList process. - - @param[in] Entry The entry to be removed. - @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList. - - @retval EFI_SUCCESS The entry has been removed successfully. - @retval Others Fail to remove the entry. - -**/ -EFI_STATUS -EFIAPI -Tcp4DestroyChildEntryInHandleBuffer ( - IN LIST_ENTRY *Entry, - IN VOID *Context - ) -{ - SOCKET *Sock; - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; - UINTN NumberOfChildren; - EFI_HANDLE *ChildHandleBuffer; - - if (Entry == NULL || Context == NULL) { - return EFI_INVALID_PARAMETER; - } - - Sock = NET_LIST_USER_STRUCT_S (Entry, SOCKET, Link, SOCK_SIGNATURE); - ServiceBinding = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding; - NumberOfChildren = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren; - ChildHandleBuffer = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer; - - if (!NetIsInHandleBuffer (Sock->SockHandle, NumberOfChildren, ChildHandleBuffer)) { - return EFI_SUCCESS; - } - - return ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle); -} - -/** - The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle. - - @param ImageHandle The firmware allocated handle for this - driver image. - @param SystemTable Pointer to the EFI system table. - - @retval EFI_SUCCESS Driver loaded. - @retval other Driver not loaded. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - UINT32 Seed; - - // - // Install the TCP4 Driver Binding Protocol - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &mTcp4DriverBinding, - ImageHandle, - &gTcp4ComponentName, - &gTcp4ComponentName2 - ); - ASSERT_EFI_ERROR (Status); - // - // Initialize ISS and random port. - // - Seed = NetRandomInitSeed (); - mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; - mTcp4RandomPort = (UINT16) (TCP4_PORT_KNOWN + - (UINT16) (NET_RANDOM(Seed) % TCP4_PORT_KNOWN)); - - return Status; -} - - -/** - Tests to see if this driver supports a given controller. - - If a child device is provided, it further tests to see if this driver supports - creating a handle for the specified child device. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver - specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by - the driver specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a - different driver or an application that requires - exclusive access. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver - specified by This. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - - // - // Test for the Tcp4ServiceBinding Protocol - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - return EFI_ALREADY_STARTED; - } - - // - // Test for the Ip4 Protocol - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiIp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - - return Status; -} - - -/** - Start this driver on ControllerHandle. - - The Start() function is designed to be invoked from the EFI boot service - ConnectController(). As a result, much of the error checking on the parameters - to Start() has been moved into this common boot service. It is legal to call - Start() from other locations, but the following calling restrictions must be - followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally - aligned EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified - by This must have been called with the same calling parameters, and Supported() - must have returned EFI_SUCCESS. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is - optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_ALREADY_STARTED The device could not be started due to a device error. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack - of resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - TCP4_SERVICE_DATA *TcpServiceData; - IP_IO_OPEN_DATA OpenData; - - TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA)); - - if (NULL == TcpServiceData) { - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" - " resource to create a Tcp Servcie Data\n")); - - return EFI_OUT_OF_RESOURCES; - } - - // - // Create a new IP IO to Consume it - // - TcpServiceData->IpIo = IpIoCreate ( - This->DriverBindingHandle, - ControllerHandle, - IP_VERSION_4 - ); - if (NULL == TcpServiceData->IpIo) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" - " resource to create an Ip Io\n")); - - Status = EFI_OUT_OF_RESOURCES; - goto ON_ERROR; - } - - // - // Configure and start IpIo. - // - ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA)); - - CopyMem ( - &OpenData.IpConfigData.Ip4CfgData, - &mIp4IoDefaultIpConfigData, - sizeof (EFI_IP4_CONFIG_DATA) - ); - - OpenData.IpConfigData.Ip4CfgData.DefaultProtocol = EFI_IP_PROTO_TCP; - - OpenData.PktRcvdNotify = Tcp4RxCallback; - Status = IpIoOpen (TcpServiceData->IpIo, &OpenData); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Create the timer event used by TCP driver - // - Status = Tcp4CreateTimer (); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer" - " Event failed with %r\n", Status)); - - goto ON_ERROR; - } - - // - // Install the Tcp4ServiceBinding Protocol on the - // controller handle - // - TcpServiceData->Tcp4ServiceBinding = mTcp4ServiceBinding; - - Status = gBS->InstallMultipleProtocolInterfaces ( - &ControllerHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - &TcpServiceData->Tcp4ServiceBinding, - NULL - ); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service Binding" - " Protocol failed for %r\n", Status)); - - Tcp4DestroyTimer (); - goto ON_ERROR; - } - - // - // Initialize member in TcpServiceData - // - TcpServiceData->ControllerHandle = ControllerHandle; - TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE; - TcpServiceData->DriverBindingHandle = This->DriverBindingHandle; - - InitializeListHead (&TcpServiceData->SocketList); - - return EFI_SUCCESS; - -ON_ERROR: - - if (TcpServiceData->IpIo != NULL) { - IpIoDestroy (TcpServiceData->IpIo); - TcpServiceData->IpIo = NULL; - } - - FreePool (TcpServiceData); - - return Status; -} - - -/** - Stop this driver on ControllerHandle. - - The Stop() function is designed to be invoked from the EFI boot service - DisconnectController(). As a result, much of the error checking on the parameters - to Stop() has been moved into this common boot service. It is legal to call Stop() - from other locations, but the following calling restrictions must be followed - or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call - to this same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this - driver's Start() function, and the Start() function must have called OpenProtocol() - on ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param NumberOfChildren The number of child device handles in ChildHandleBuffer. - @param ChildHandleBuffer An array of child handles to be freed. May be NULL if - NumberOfChildren is 0. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -{ - EFI_STATUS Status; - EFI_HANDLE NicHandle; - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; - TCP4_SERVICE_DATA *TcpServiceData; - LIST_ENTRY *List; - TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context; - - // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed. - // - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); - if (NicHandle == NULL) { - return EFI_SUCCESS; - } - - // - // Retrieve the TCP driver Data Structure - // - Status = gBS->OpenProtocol ( - NicHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - (VOID **) &ServiceBinding, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service " - " Binding Protocol failed with %r\n", Status)); - - return EFI_DEVICE_ERROR; - } - - TcpServiceData = TCP4_FROM_THIS (ServiceBinding); - - if (NumberOfChildren != 0) { - List = &TcpServiceData->SocketList; - Context.ServiceBinding = ServiceBinding; - Context.NumberOfChildren = NumberOfChildren; - Context.ChildHandleBuffer = ChildHandleBuffer; - Status = NetDestroyLinkList ( - List, - Tcp4DestroyChildEntryInHandleBuffer, - &Context, - NULL - ); - } else if (IsListEmpty (&TcpServiceData->SocketList)) { - // - // Uninstall TCP servicebinding protocol - // - gBS->UninstallMultipleProtocolInterfaces ( - NicHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - ServiceBinding, - NULL - ); - - // - // Destroy the IpIO consumed by TCP driver - // - IpIoDestroy (TcpServiceData->IpIo); - TcpServiceData->IpIo = NULL; - - // - // Destroy the heartbeat timer. - // - Tcp4DestroyTimer (); - - if (gTcpControllerNameTable != NULL) { - FreeUnicodeStringTable (gTcpControllerNameTable); - gTcpControllerNameTable = NULL; - } - - // - // Release the TCP service data - // - FreePool (TcpServiceData); - - Status = EFI_SUCCESS; - } - - return Status; -} - -/** - Open Ip4 and device path protocols for a created socket, and insert it in - socket list. - - @param This Pointer to the socket just created - @param Context Context of the socket - - @retval EFI_SUCCESS This protocol is installed successfully. - @retval other Some error occured. - -**/ -EFI_STATUS -Tcp4CreateSocketCallback ( - IN SOCKET *This, - IN VOID *Context - ) -{ - EFI_STATUS Status; - TCP4_SERVICE_DATA *TcpServiceData; - EFI_IP4_PROTOCOL *Ip4; - - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService; - - // - // Open the default Ip4 protocol of IP_IO BY_DRIVER. - // - Status = gBS->OpenProtocol ( - TcpServiceData->IpIo->ChildHandle, - &gEfiIp4ProtocolGuid, - (VOID **) &Ip4, - TcpServiceData->DriverBindingHandle, - This->SockHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Open the device path on the handle where service binding resides on. - // - Status = gBS->OpenProtocol ( - TcpServiceData->ControllerHandle, - &gEfiDevicePathProtocolGuid, - (VOID **) &This->ParentDevicePath, - TcpServiceData->DriverBindingHandle, - This->SockHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - gBS->CloseProtocol ( - TcpServiceData->IpIo->ChildHandle, - &gEfiIp4ProtocolGuid, - TcpServiceData->DriverBindingHandle, - This->SockHandle - ); - } else { - // - // Insert this socket into the SocketList. - // - InsertTailList (&TcpServiceData->SocketList, &This->Link); - } - - return Status; -} - -/** - Close Ip4 and device path protocols for a socket, and remove it from socket list. - - @param This Pointer to the socket to be removed - @param Context Context of the socket - -**/ -VOID -Tcp4DestroySocketCallback ( - IN SOCKET *This, - IN VOID *Context - ) -{ - TCP4_SERVICE_DATA *TcpServiceData; - - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService; - - // - // Remove this node from the list. - // - RemoveEntryList (&This->Link); - - // - // Close the Ip4 protocol. - // - gBS->CloseProtocol ( - TcpServiceData->IpIo->ChildHandle, - &gEfiIp4ProtocolGuid, - TcpServiceData->DriverBindingHandle, - This->SockHandle - ); -} - -/** - Creates a child handle and installs a protocol. - - The CreateChild() function installs a protocol on ChildHandle. If ChildHandle - is a pointer to NULL, then a new handle is created and returned in ChildHandle. - If ChildHandle is not a pointer to NULL, then the protocol installs on the existing - ChildHandle. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Pointer to the handle of the child to create. If it is NULL, then - a new handle is created. If it is a pointer to an existing UEFI - handle, then the protocol is added to the existing UEFI handle. - - @retval EFI_SUCCES The protocol was added to ChildHandle. - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. - @retval EFI_OUT_OF_RESOURCES There are not enough resources available to create - the child. - @retval other The child handle was not created. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN OUT EFI_HANDLE *ChildHandle - ) -{ - SOCKET *Sock; - TCP4_SERVICE_DATA *TcpServiceData; - TCP4_PROTO_DATA TcpProto; - EFI_STATUS Status; - EFI_TPL OldTpl; - - if (NULL == This || NULL == ChildHandle) { - return EFI_INVALID_PARAMETER; - } - - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); - Status = EFI_SUCCESS; - TcpServiceData = TCP4_FROM_THIS (This); - TcpProto.TcpService = TcpServiceData; - TcpProto.TcpPcb = NULL; - - // - // Create a tcp instance with defualt Tcp default - // sock init data and TcpProto - // - mTcp4DefaultSockData.ProtoData = &TcpProto; - mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA); - mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle; - - Sock = SockCreateChild (&mTcp4DefaultSockData); - if (NULL == Sock) { - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: " - "No resource to create a Tcp Child\n")); - - Status = EFI_OUT_OF_RESOURCES; - } else { - *ChildHandle = Sock->SockHandle; - } - - mTcp4DefaultSockData.ProtoData = NULL; - - gBS->RestoreTPL (OldTpl); - return Status; -} - - -/** - Destroys a child handle with a protocol installed on it. - - The DestroyChild() function does the opposite of CreateChild(). It removes a protocol - that was installed by CreateChild() from ChildHandle. If the removed protocol is the - last protocol on ChildHandle, then ChildHandle is destroyed. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Handle of the child to destroy - - @retval EFI_SUCCES The protocol was removed from ChildHandle. - @retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is - being removed. - @retval EFI_INVALID_PARAMETER Child handle is NULL. - @retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle - because its services are being used. - @retval other The child handle was not destroyed. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - SOCKET *Sock; - - if (NULL == This || NULL == ChildHandle) { - return EFI_INVALID_PARAMETER; - } - - // - // retrieve the Tcp4 protocol from ChildHandle - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiTcp4ProtocolGuid, - (VOID **) &Tcp4, - mTcp4DriverBinding.DriverBindingHandle, - ChildHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - Status = EFI_UNSUPPORTED; - } else { - // - // destroy this sock and related Tcp protocol control - // block - // - Sock = SOCK_FROM_THIS (Tcp4); - - SockDestroyChild (Sock); - } - - return Status; -} - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c deleted file mode 100644 index f48efdac7cd8..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c +++ /dev/null @@ -1,1497 +0,0 @@ -/** @file - TCP input process routines. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Tcp4Main.h" - - -/** - Check whether the sequence number of the incoming segment is acceptable. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the incoming segment. - - @retval 1 The sequence number is acceptable. - @retval 0 The sequence number is not acceptable. - -**/ -INTN -TcpSeqAcceptable ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg - ) -{ - return (TCP_SEQ_LEQ (Tcb->RcvNxt, Seg->End) && - TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd)); -} - - -/** - NewReno fast recovery, RFC3782. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast recovery. - -**/ -VOID -TcpFastRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ) -{ - UINT32 FlightSize; - UINT32 Acked; - - // - // Step 1: Three duplicate ACKs and not in fast recovery - // - if (Tcb->CongestState != TCP_CONGEST_RECOVER) { - - // - // Step 1A: Invoking fast retransmission. - // - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); - - Tcb->Ssthresh = MAX (FlightSize >> 1, (UINT32) (2 * Tcb->SndMss)); - Tcb->Recover = Tcb->SndNxt; - - Tcb->CongestState = TCP_CONGEST_RECOVER; - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - - // - // Step 2: Entering fast retransmission - // - TcpRetransmit (Tcb, Tcb->SndUna); - Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss; - - DEBUG ((EFI_D_NET, "TcpFastRecover: enter fast retransmission" - " for TCB %p, recover point is %d\n", Tcb, Tcb->Recover)); - return; - } - - // - // During fast recovery, execute Step 3, 4, 5 of RFC3782 - // - if (Seg->Ack == Tcb->SndUna) { - - // - // Step 3: Fast Recovery, - // If this is a duplicated ACK, increse Cwnd by SMSS. - // - - // Step 4 is skipped here only to be executed later - // by TcpToSendData - // - Tcb->CWnd += Tcb->SndMss; - DEBUG ((EFI_D_NET, "TcpFastRecover: received another" - " duplicated ACK (%d) for TCB %p\n", Seg->Ack, Tcb)); - - } else { - - // - // New data is ACKed, check whether it is a - // full ACK or partial ACK - // - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) { - - // - // Step 5 - Full ACK: - // deflate the congestion window, and exit fast recovery - // - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); - - Tcb->CWnd = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss); - - Tcb->CongestState = TCP_CONGEST_OPEN; - DEBUG ((EFI_D_NET, "TcpFastRecover: received a full ACK(%d)" - " for TCB %p, exit fast recovery\n", Seg->Ack, Tcb)); - - } else { - - // - // Step 5 - Partial ACK: - // fast retransmit the first unacknowledge field - // , then deflate the CWnd - // - TcpRetransmit (Tcb, Seg->Ack); - Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna); - - // - // Deflate the CWnd by the amount of new data - // ACKed by SEG.ACK. If more than one SMSS data - // is ACKed, add back SMSS byte to CWnd after - // - if (Acked >= Tcb->SndMss) { - Acked -= Tcb->SndMss; - - } - - Tcb->CWnd -= Acked; - - DEBUG ((EFI_D_NET, "TcpFastRecover: received a partial" - " ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); - - } - } -} - - -/** - NewReno fast loss recovery, RFC3792. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast loss recovery. - -**/ -VOID -TcpFastLossRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ) -{ - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { - - // - // New data is ACKed, check whether it is a - // full ACK or partial ACK - // - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) { - - // - // Full ACK: exit the loss recovery. - // - Tcb->LossTimes = 0; - Tcb->CongestState = TCP_CONGEST_OPEN; - - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " - "full ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); - - } else { - - // - // Partial ACK: - // fast retransmit the first unacknowledge field. - // - TcpRetransmit (Tcb, Seg->Ack); - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " - "partial ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); - } - } -} - - -/** - Compute the RTT as specified in RFC2988. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Measure Currently measured RTT in heart beats. - -**/ -VOID -TcpComputeRtt ( - IN OUT TCP_CB *Tcb, - IN UINT32 Measure - ) -{ - INT32 Var; - - // - // Step 2.3: Compute the RTO for subsequent RTT measurement. - // - if (Tcb->SRtt != 0) { - - Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT); - - if (Var < 0) { - Var = -Var; - } - - Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2; - Tcb->SRtt = 7 * (Tcb->SRtt >> 3) + Measure; - - } else { - // - // Step 2.2: compute the first RTT measure - // - Tcb->SRtt = Measure << TCP_RTT_SHIFT; - Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1); - } - - Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT; - - // - // Step 2.4: Limit the RTO to at least 1 second - // Step 2.5: Limit the RTO to a maxium value that - // is at least 60 second - // - if (Tcb->Rto < TCP_RTO_MIN) { - Tcb->Rto = TCP_RTO_MIN; - - } else if (Tcb->Rto > TCP_RTO_MAX) { - Tcb->Rto = TCP_RTO_MAX; - - } - - DEBUG ((EFI_D_NET, "TcpComputeRtt: new RTT for TCB %p" - " computed SRTT: %d RTTVAR: %d RTO: %d\n", - Tcb, Tcb->SRtt, Tcb->RttVar, Tcb->Rto)); - -} - - -/** - Trim the data, SYN and FIN to fit into the window defined by Left and Right. - - @param Nbuf Buffer that contains received TCP segment without IP header. - @param Left The sequence number of the window's left edge. - @param Right The sequence number of the window's right edge. - -**/ -VOID -TcpTrimSegment ( - IN NET_BUF *Nbuf, - IN TCP_SEQNO Left, - IN TCP_SEQNO Right - ) -{ - TCP_SEG *Seg; - TCP_SEQNO Urg; - UINT32 Drop; - - Seg = TCPSEG_NETBUF (Nbuf); - - // - // If the segment is completely out of window, - // truncate every thing, include SYN and FIN. - // - if (TCP_SEQ_LEQ (Seg->End, Left) || TCP_SEQ_LEQ (Right, Seg->Seq)) { - - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); - - Seg->Seq = Seg->End; - NetbufTrim (Nbuf, Nbuf->TotalSize, NET_BUF_HEAD); - return; - } - - // - // Adjust the buffer header - // - if (TCP_SEQ_LT (Seg->Seq, Left)) { - - Drop = TCP_SUB_SEQ (Left, Seg->Seq); - Urg = Seg->Seq + Seg->Urg; - Seg->Seq = Left; - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); - Drop--; - } - - // - // Adjust the urgent point - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG)) { - - if (TCP_SEQ_LT (Urg, Seg->Seq)) { - - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); - } else { - Seg->Urg = (UINT16) TCP_SUB_SEQ (Urg, Seg->Seq); - } - } - - if (Drop != 0) { - NetbufTrim (Nbuf, Drop, NET_BUF_HEAD); - } - } - - // - // Adjust the buffer tail - // - if (TCP_SEQ_GT (Seg->End, Right)) { - - Drop = TCP_SUB_SEQ (Seg->End, Right); - Seg->End = Right; - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); - Drop--; - } - - if (Drop != 0) { - NetbufTrim (Nbuf, Drop, NET_BUF_TAIL); - } - } - - ASSERT (TcpVerifySegment (Nbuf) != 0); -} - - -/** - Trim off the data outside the tcb's receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the NET_BUF containing the received tcp segment. - -**/ -VOID -TcpTrimInWnd ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd); -} - - -/** - Process the data and FIN flag, check whether to deliver - data to the socket layer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 No error occurred to deliver data. - @retval -1 Error condition occurred. Proper response is to reset the - connection. - -**/ -INTN -TcpDeliverData ( - IN OUT TCP_CB *Tcb - ) -{ - LIST_ENTRY *Entry; - NET_BUF *Nbuf; - TCP_SEQNO Seq; - TCP_SEG *Seg; - UINT32 Urgent; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - // - // make sure there is some data queued, - // and TCP is in a proper state - // - if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) { - - return 0; - } - - // - // Deliver data to the socket layer - // - Entry = Tcb->RcvQue.ForwardLink; - Seq = Tcb->RcvNxt; - - while (Entry != &Tcb->RcvQue) { - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - Seg = TCPSEG_NETBUF (Nbuf); - - ASSERT (TcpVerifySegment (Nbuf) != 0); - ASSERT (Nbuf->Tcp == NULL); - - if (TCP_SEQ_GT (Seg->Seq, Seq)) { - break; - } - - Entry = Entry->ForwardLink; - Seq = Seg->End; - Tcb->RcvNxt = Seq; - - RemoveEntryList (&Nbuf->List); - - // - // RFC793 Eighth step: process FIN in sequence - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - - // - // The peer sends to us junky data after FIN, - // reset the connection. - // - if (!IsListEmpty (&Tcb->RcvQue)) { - DEBUG ((EFI_D_ERROR, "TcpDeliverData: data received after" - " FIN from peer of TCB %p, reset connection\n", Tcb)); - - NetbufFree (Nbuf); - return -1; - } - - DEBUG ((EFI_D_NET, "TcpDeliverData: processing FIN " - "from peer of TCB %p\n", Tcb)); - - switch (Tcb->State) { - case TCP_SYN_RCVD: - case TCP_ESTABLISHED: - - TcpSetState (Tcb, TCP_CLOSE_WAIT); - break; - - case TCP_FIN_WAIT_1: - - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_CLOSING); - break; - } - - // - // fall through - // - case TCP_FIN_WAIT_2: - - TcpSetState (Tcb, TCP_TIME_WAIT); - TcpClearAllTimer (Tcb); - - if (Tcb->TimeWaitTimeout != 0) { - - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); - } else { - - DEBUG ((EFI_D_WARN, "Connection closed immediately " - "because app disables TIME_WAIT timer for %p\n", Tcb)); - - TcpSendAck (Tcb); - TcpClose (Tcb); - } - break; - - case TCP_CLOSE_WAIT: - case TCP_CLOSING: - case TCP_LAST_ACK: - case TCP_TIME_WAIT: - // - // The peer sends to us junk FIN byte. Discard - // the buffer then reset the connection - // - NetbufFree (Nbuf); - return -1; - default: - break; - } - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - - Seg->End--; - } - - // - // Don't delay the ack if PUSH flag is on. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_PSH)) { - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - } - - if (Nbuf->TotalSize != 0) { - Urgent = 0; - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && - TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp)) { - - if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) { - Urgent = Nbuf->TotalSize; - } else { - Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1; - } - } - - SockDataRcvd (Tcb->Sk, Nbuf, Urgent); - } - - if (TCP_FIN_RCVD (Tcb->State)) { - - SockNoMoreData (Tcb->Sk); - } - - NetbufFree (Nbuf); - } - - return 0; -} - - -/** - Store the data into the reassemble queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer containing the data to be queued. - -**/ -VOID -TcpQueueData ( - IN OUT TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - TCP_SEG *Seg; - LIST_ENTRY *Head; - LIST_ENTRY *Prev; - LIST_ENTRY *Cur; - NET_BUF *Node; - - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); - - NET_GET_REF (Nbuf); - - Seg = TCPSEG_NETBUF (Nbuf); - Head = &Tcb->RcvQue; - - // - // Fast path to process normal case. That is, - // no out-of-order segments are received. - // - if (IsListEmpty (Head)) { - - InsertTailList (Head, &Nbuf->List); - return; - } - - // - // Find the point to insert the buffer - // - for (Prev = Head, Cur = Head->ForwardLink; - Cur != Head; - Prev = Cur, Cur = Cur->ForwardLink) { - - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->Seq)) { - break; - } - } - - // - // Check whether the current segment overlaps with the - // previous segment. - // - if (Prev != Head) { - Node = NET_LIST_USER_STRUCT (Prev, NET_BUF, List); - - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->End)) { - - if (TCP_SEQ_LEQ (Seg->End, TCPSEG_NETBUF (Node)->End)) { - - NetbufFree (Nbuf); - return; - } - - TcpTrimSegment (Nbuf, TCPSEG_NETBUF (Node)->End, Seg->End); - } - } - - InsertHeadList (Prev, &Nbuf->List); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - - // - // Check the segments after the insert point. - // - while (Cur != Head) { - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->End, Seg->End)) { - - Cur = Cur->ForwardLink; - - RemoveEntryList (&Node->List); - NetbufFree (Node); - continue; - } - - if (TCP_SEQ_LT (TCPSEG_NETBUF (Node)->Seq, Seg->End)) { - - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->Seq, Seg->Seq)) { - - RemoveEntryList (&Nbuf->List); - NetbufFree (Nbuf); - return ; - } - - TcpTrimSegment (Nbuf, Seg->Seq, TCPSEG_NETBUF (Node)->Seq); - break; - } - - Cur = Cur->ForwardLink; - } -} - - -/** - Ajust the send queue or the retransmit queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Ack The acknowledge seuqence number of the received segment. - -**/ -VOID -TcpAdjustSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Ack - ) -{ - LIST_ENTRY *Head; - LIST_ENTRY *Cur; - NET_BUF *Node; - TCP_SEG *Seg; - - Head = &Tcb->SndQue; - Cur = Head->ForwardLink; - - while (Cur != Head) { - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - Seg = TCPSEG_NETBUF (Node); - - if (TCP_SEQ_GEQ (Seg->Seq, Ack)) { - break; - } - - // - // Remove completely ACKed segments - // - if (TCP_SEQ_LEQ (Seg->End, Ack)) { - Cur = Cur->ForwardLink; - - RemoveEntryList (&Node->List); - NetbufFree (Node); - continue; - } - - TcpTrimSegment (Node, Ack, Seg->End); - break; - } -} - - -/** - Process the received TCP segments. - - @param Nbuf Buffer that contains received TCP segment without IP header. - @param Src Source address of the segment, or the peer's IP address. - @param Dst Destination address of the segment, or the local end's IP - address. - - @retval 0 Segment is processed successfully. It is either accepted or - discarded. But no connection is reset by the segment. - @retval -1 A connection is reset by the segment. - -**/ -INTN -TcpInput ( - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dst - ) -{ - TCP_CB *Tcb; - TCP_CB *Parent; - TCP_OPTION Option; - TCP_HEAD *Head; - INT32 Len; - TCP_SEG *Seg; - TCP_SEQNO Right; - TCP_SEQNO Urg; - INT32 Usable; - - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); - - Parent = NULL; - Tcb = NULL; - - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); - ASSERT (Head != NULL); - - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); - goto DISCARD; - } - - Len = Nbuf->TotalSize - (Head->HeadLen << 2); - - if ((Head->HeadLen < 5) || (Len < 0) || - (TcpChecksum (Nbuf, NetPseudoHeadChecksum (Src, Dst, 6, 0)) != 0)) { - - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); - goto DISCARD; - } - - if (TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)) { - Len++; - } - - if (TCP_FLG_ON (Head->Flag, TCP_FLG_FIN)) { - Len++; - } - - Tcb = TcpLocateTcb ( - Head->DstPort, - Dst, - Head->SrcPort, - Src, - (BOOLEAN) TCP_FLG_ON (Head->Flag, TCP_FLG_SYN) - ); - - if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) { - DEBUG ((EFI_D_NET, "TcpInput: send reset because no TCB found\n")); - - Tcb = NULL; - goto SEND_RESET; - } - - Seg = TcpFormatNetbuf (Tcb, Nbuf); - - // - // RFC1122 recommended reaction to illegal option - // (in fact, an illegal option length) is reset. - // - if (TcpParseOption (Nbuf->Tcp, &Option) == -1) { - DEBUG ((EFI_D_ERROR, "TcpInput: reset the peer because" - " of malformed option for TCB %p\n", Tcb)); - - goto SEND_RESET; - } - - // - // From now on, the segment is headless - // - NetbufTrim (Nbuf, (Head->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - // - // Process the segment in LISTEN state. - // - if (Tcb->State == TCP_LISTEN) { - // - // First step: Check RST - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " - "for TCB %p in listening\n", Tcb)); - - goto DISCARD; - } - - // - // Second step: Check ACK. - // Any ACK sent to TCP in LISTEN is reseted. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" - " segment with ACK for TCB %p in listening\n", Tcb)); - - goto SEND_RESET; - } - - // - // Third step: Check SYN - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - // - // create a child TCB to handle the data - // - Parent = Tcb; - - Tcb = TcpCloneTcb (Parent); - if (Tcb == NULL) { - DEBUG ((EFI_D_ERROR, "TcpInput: discard a segment because" - " failed to clone a child for TCB %p\n", Tcb)); - - goto DISCARD; - } - - DEBUG ((EFI_D_NET, "TcpInput: create a child for TCB %p" - " in listening\n", Tcb)); - - // - // init the TCB structure - // - Tcb->LocalEnd.Ip = Dst; - Tcb->LocalEnd.Port = Head->DstPort; - Tcb->RemoteEnd.Ip = Src; - Tcb->RemoteEnd.Port = Head->SrcPort; - - TcpInitTcbLocal (Tcb); - TcpInitTcbPeer (Tcb, Seg, &Option); - - TcpSetState (Tcb, TCP_SYN_RCVD); - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); - TcpTrimInWnd (Tcb, Nbuf); - - goto StepSix; - } - - goto DISCARD; - - } else if (Tcb->State == TCP_SYN_SENT) { - // - // First step: Check ACK bit - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + 1)) { - - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of " - "wrong ACK received for TCB %p in SYN_SENT\n", Tcb)); - - goto SEND_RESET; - } - - // - // Second step: Check RST bit - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset by" - " peer for TCB %p in SYN_SENT\n", Tcb)); - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); - goto DROP_CONNECTION; - } else { - - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " - "because of no ACK for TCB %p in SYN_SENT\n", Tcb)); - - goto DISCARD; - } - } - - // - // Third step: Check security and precedence. Skipped - // - - // - // Fourth step: Check SYN. Pay attention to simultaneous open - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - - TcpInitTcbPeer (Tcb, Seg, &Option); - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - - Tcb->SndUna = Seg->Ack; - } - - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); - - if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) { - - TcpSetState (Tcb, TCP_ESTABLISHED); - - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); - TcpDeliverData (Tcb); - - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - - TcpComputeRtt (Tcb, Tcb->RttMeasure); - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - } - - TcpTrimInWnd (Tcb, Nbuf); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - - DEBUG ((EFI_D_NET, "TcpInput: connection established" - " for TCB %p in SYN_SENT\n", Tcb)); - - goto StepSix; - } else { - // - // Received a SYN segment without ACK, simultaneous open. - // - TcpSetState (Tcb, TCP_SYN_RCVD); - - ASSERT (Tcb->SndNxt == Tcb->Iss + 1); - TcpAdjustSndQue (Tcb, Tcb->SndNxt); - - TcpTrimInWnd (Tcb, Nbuf); - - DEBUG ((EFI_D_WARN, "TcpInput: simultaneous open " - "for TCB %p in SYN_SENT\n", Tcb)); - - goto StepSix; - } - } - - goto DISCARD; - } - - // - // Process segment in SYN_RCVD or TCP_CONNECTED states - // - - // - // Clear probe timer since the RecvWindow is opened. - // - if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) { - TcpClearTimer (Tcb, TCP_TIMER_PROBE); - Tcb->ProbeTimerOn = FALSE; - } - - // - // First step: Check whether SEG.SEQ is acceptable - // - if (TcpSeqAcceptable (Tcb, Seg) == 0) { - DEBUG ((EFI_D_WARN, "TcpInput: sequence acceptance" - " test failed for segment of TCB %p\n", Tcb)); - - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - TcpSendAck (Tcb); - } - - goto DISCARD; - } - - if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) && - (Tcb->RcvWl2 == Seg->End) && - !TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN | TCP_FLG_FIN)) { - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - } - - // - // Second step: Check the RST - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", Tcb)); - - if (Tcb->State == TCP_SYN_RCVD) { - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED); - - // - // This TCB comes from either a LISTEN TCB, - // or active open TCB with simultanous open. - // Do NOT signal user CONNECTION refused - // if it comes from a LISTEN TCB. - // - } else if ((Tcb->State == TCP_ESTABLISHED) || - (Tcb->State == TCP_FIN_WAIT_1) || - (Tcb->State == TCP_FIN_WAIT_2) || - (Tcb->State == TCP_CLOSE_WAIT)) { - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); - - } else { - - } - - goto DROP_CONNECTION; - } - - // - // Trim the data and flags. - // - TcpTrimInWnd (Tcb, Nbuf); - - // - // Third step: Check security and precedence, Ignored - // - - // - // Fourth step: Check the SYN bit. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset " - "because received extra SYN for TCB %p\n", Tcb)); - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); - goto RESET_THEN_DROP; - } - - // - // Fifth step: Check the ACK - // - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - DEBUG ((EFI_D_WARN, "TcpInput: segment discard because" - " of no ACK for connected TCB %p\n", Tcb)); - - goto DISCARD; - - } - - if (Tcb->State == TCP_SYN_RCVD) { - - if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) && - TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt)) { - - Tcb->SndWnd = Seg->Wnd; - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); - Tcb->SndWl1 = Seg->Seq; - Tcb->SndWl2 = Seg->Ack; - TcpSetState (Tcb, TCP_ESTABLISHED); - - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); - TcpDeliverData (Tcb); - - DEBUG ((EFI_D_NET, "TcpInput: connection established " - " for TCB %p in SYN_RCVD\n", Tcb)); - - // - // Continue the process as ESTABLISHED state - // - } else { - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" - " wrong ACK for TCB %p in SYN_RCVD\n", Tcb)); - - goto SEND_RESET; - } - } - - if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) { - - DEBUG ((EFI_D_WARN, "TcpInput: ignore the out-of-data" - " ACK for connected TCB %p\n", Tcb)); - - goto StepSix; - - } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) { - - DEBUG ((EFI_D_WARN, "TcpInput: discard segment for " - "future ACK for connected TCB %p\n", Tcb)); - - TcpSendAck (Tcb); - goto DISCARD; - } - - // - // From now on: SND.UNA <= SEG.ACK <= SND.NXT. - // - if (TCP_FLG_ON (Option.Flag, TCP_OPTION_RCVD_TS)) { - // - // update TsRecent as specified in page 16 RFC1323. - // RcvWl2 equals to the variable "LastAckSent" - // defined there. - // - if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) && - TCP_SEQ_LT (Tcb->RcvWl2, Seg->End)) { - - Tcb->TsRecent = Option.TSVal; - Tcb->TsRecentAge = mTcpTick; - } - - TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr)); - - } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - - ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN); - - TcpComputeRtt (Tcb, Tcb->RttMeasure); - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - } - - if (Seg->Ack == Tcb->SndNxt) { - - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); - } else { - - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); - } - - // - // Count duplicate acks. - // - if ((Seg->Ack == Tcb->SndUna) && - (Tcb->SndUna != Tcb->SndNxt) && - (Seg->Wnd == Tcb->SndWnd) && - (0 == Len)) { - - Tcb->DupAck++; - } else { - - Tcb->DupAck = 0; - } - - // - // Congestion avoidance, fast recovery and fast retransmission. - // - if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) || - (Tcb->CongestState == TCP_CONGEST_LOSS)) { - - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { - - if (Tcb->CWnd < Tcb->Ssthresh) { - - Tcb->CWnd += Tcb->SndMss; - } else { - - Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1); - } - - Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale); - } - - if (Tcb->CongestState == TCP_CONGEST_LOSS) { - TcpFastLossRecover (Tcb, Seg); - } - } else { - - TcpFastRecover (Tcb, Seg); - } - - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { - - TcpAdjustSndQue (Tcb, Seg->Ack); - Tcb->SndUna = Seg->Ack; - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && - TCP_SEQ_LT (Tcb->SndUp, Seg->Ack)) { - - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); - } - } - - // - // Update window info - // - if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) || - ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg->Ack))) { - - Right = Seg->Ack + Seg->Wnd; - - if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) { - - if ((Tcb->SndWl1 == Seg->Seq) && - (Tcb->SndWl2 == Seg->Ack) && - (Len == 0)) { - - goto NO_UPDATE; - } - - DEBUG ((EFI_D_WARN, "TcpInput: peer shrinks the" - " window for connected TCB %p\n", Tcb)); - - if ((Tcb->CongestState == TCP_CONGEST_RECOVER) && - (TCP_SEQ_LT (Right, Tcb->Recover))) { - - Tcb->Recover = Right; - } - - if ((Tcb->CongestState == TCP_CONGEST_LOSS) && - (TCP_SEQ_LT (Right, Tcb->LossRecover))) { - - Tcb->LossRecover = Right; - } - - if (TCP_SEQ_LT (Right, Tcb->SndNxt)) { - // - // Check for Window Retraction in RFC7923 section 2.4. - // The lower n bits of the peer's actual receive window is wiped out if TCP - // window scale is enabled, it will look like the peer is shrinking the window. - // Check whether the SndNxt is out of the advertised receive window by more than - // 2^Rcv.Wind.Shift before moving the SndNxt to the left. - // - DEBUG ( - (EFI_D_WARN, - "TcpInput: peer advise negative useable window for connected TCB %p\n", - Tcb) - ); - Usable = TCP_SUB_SEQ (Tcb->SndNxt, Right); - if ((Usable >> Tcb->SndWndScale) > 0) { - DEBUG ( - (EFI_D_WARN, - "TcpInput: SndNxt is out of window by more than window scale for TCB %p\n", - Tcb) - ); - Tcb->SndNxt = Right; - } - if (Right == Tcb->SndUna) { - - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); - TcpSetProbeTimer (Tcb); - } - } - } - - Tcb->SndWnd = Seg->Wnd; - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); - Tcb->SndWl1 = Seg->Seq; - Tcb->SndWl2 = Seg->Ack; - } - -NO_UPDATE: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) && - (Tcb->SndUna == Tcb->SndNxt)) { - - DEBUG ((EFI_D_NET, "TcpInput: local FIN is ACKed by" - " peer for connected TCB %p\n", Tcb)); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED); - } - - // - // Transit the state if proper. - // - switch (Tcb->State) { - case TCP_FIN_WAIT_1: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_FIN_WAIT_2); - - TcpClearAllTimer (Tcb); - TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout); - } - - case TCP_FIN_WAIT_2: - - break; - - case TCP_CLOSE_WAIT: - break; - - case TCP_CLOSING: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_TIME_WAIT); - - TcpClearAllTimer (Tcb); - - if (Tcb->TimeWaitTimeout != 0) { - - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); - } else { - - DEBUG ((EFI_D_WARN, "Connection closed immediately " - "because app disables TIME_WAIT timer for %p\n", Tcb)); - - TcpClose (Tcb); - } - } - break; - - case TCP_LAST_ACK: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_CLOSED); - } - - break; - - case TCP_TIME_WAIT: - - TcpSendAck (Tcb); - - if (Tcb->TimeWaitTimeout != 0) { - - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); - } else { - - DEBUG ((EFI_D_WARN, "Connection closed immediately " - "because app disables TIME_WAIT timer for %p\n", Tcb)); - - TcpClose (Tcb); - } - break; - - default: - break; - } - - // - // Sixth step: Check the URG bit.update the Urg point - // if in TCP_CAN_RECV, otherwise, leave the RcvUp intact. - // -StepSix: - - Tcb->Idle = 0; - TcpSetKeepaliveTimer (Tcb); - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) && - !TCP_FIN_RCVD (Tcb->State)) - { - - DEBUG ((EFI_D_NET, "TcpInput: received urgent data " - "from peer for connected TCB %p\n", Tcb)); - - Urg = Seg->Seq + Seg->Urg; - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && - TCP_SEQ_GT (Urg, Tcb->RcvUp)) { - - Tcb->RcvUp = Urg; - } else { - - Tcb->RcvUp = Urg; - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG); - } - } - - // - // Seventh step: Process the segment data - // - if (Seg->End != Seg->Seq) { - - if (TCP_FIN_RCVD (Tcb->State)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" - " data is lost for connected TCB %p\n", Tcb)); - - goto RESET_THEN_DROP; - } - - if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) { - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" - " data is lost for connected TCB %p\n", Tcb)); - - goto RESET_THEN_DROP; - } - - TcpQueueData (Tcb, Nbuf); - if (TcpDeliverData (Tcb) == -1) { - goto RESET_THEN_DROP; - } - - if (!IsListEmpty (&Tcb->RcvQue)) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - } - } - - // - // Eighth step: check the FIN. - // This step is moved to TcpDeliverData. FIN will be - // processed in sequence there. Check the comments in - // the beginning of the file header for information. - // - - // - // Tcb is a new child of the listening Parent, - // commit it. - // - if (Parent != NULL) { - Tcb->Parent = Parent; - TcpInsertTcb (Tcb); - } - - if ((Tcb->State != TCP_CLOSED) && - (TcpToSendData (Tcb, 0) == 0) && - (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf->TotalSize != 0))) { - - TcpToSendAck (Tcb); - } - - NetbufFree (Nbuf); - return 0; - -RESET_THEN_DROP: - TcpSendReset (Tcb, Head, Len, Dst, Src); - -DROP_CONNECTION: - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - NetbufFree (Nbuf); - TcpClose (Tcb); - - return -1; - -SEND_RESET: - - TcpSendReset (Tcb, Head, Len, Dst, Src); - -DISCARD: - - // - // Tcb is a child of Parent, and it doesn't survive - // - DEBUG ((EFI_D_WARN, "Tcp4Input: Discard a packet\n")); - NetbufFree (Nbuf); - - if ((Parent != NULL) && (Tcb != NULL)) { - - ASSERT (Tcb->Sk != NULL); - TcpClose (Tcb); - } - - return 0; -} - - -/** - Process the received ICMP error messages for TCP. - - @param Nbuf Buffer that contains part of the TCP segment without IP header - truncated from the ICMP error packet. - @param IcmpErr The ICMP error code interpreted from ICMP error packet. - @param Src Source address of the ICMP error message. - @param Dst Destination address of the ICMP error message. - -**/ -VOID -TcpIcmpInput ( - IN NET_BUF *Nbuf, - IN UINT8 IcmpErr, - IN UINT32 Src, - IN UINT32 Dst - ) -{ - TCP_HEAD *Head; - TCP_CB *Tcb; - TCP_SEQNO Seq; - EFI_STATUS IcmpErrStatus; - BOOLEAN IcmpErrIsHard; - BOOLEAN IcmpErrNotify; - - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { - goto CLEAN_EXIT; - } - - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); - ASSERT (Head != NULL); - Tcb = TcpLocateTcb ( - Head->DstPort, - Dst, - Head->SrcPort, - Src, - FALSE - ); - if (Tcb == NULL || Tcb->State == TCP_CLOSED) { - - goto CLEAN_EXIT; - } - - // - // Validate the sequence number. - // - Seq = NTOHL (Head->Seq); - if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb->SndNxt))) { - - goto CLEAN_EXIT; - } - - IcmpErrStatus = IpIoGetIcmpErrStatus ( - IcmpErr, - IP_VERSION_4, - &IcmpErrIsHard, - &IcmpErrNotify - ); - - if (IcmpErrNotify) { - - SOCK_ERROR (Tcb->Sk, IcmpErrStatus); - } - - if (IcmpErrIsHard) { - - TcpClose (Tcb); - } - -CLEAN_EXIT: - NetbufFree (Nbuf); -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c deleted file mode 100644 index b98d1e783a2f..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c +++ /dev/null @@ -1,112 +0,0 @@ -/** @file - I/O interfaces between TCP and IpIo. - -Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - - -/** - Packet receive callback function provided to IP_IO, used to call - the proper function to handle the packet received by IP. - - @param Status Status of the received packet. - @param IcmpErr ICMP error number. - @param NetSession Pointer to the net session of this packet. - @param Pkt Pointer to the recieved packet. - @param Context Pointer to the context configured in IpIoOpen(), not used - now. - -**/ -VOID -EFIAPI -Tcp4RxCallback ( - IN EFI_STATUS Status, - IN UINT8 IcmpErr, - IN EFI_NET_SESSION_DATA *NetSession, - IN NET_BUF *Pkt, - IN VOID *Context OPTIONAL - ) -{ - if (EFI_SUCCESS == Status) { - TcpInput (Pkt, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]); - } else { - TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]); - } -} - - -/** - Send the segment to IP via IpIo function. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the TCP segment to be sent. - @param Src Source address of the TCP segment. - @param Dest Destination address of the TCP segment. - - @retval 0 The segment was sent out successfully. - @retval -1 The segment was failed to send. - -**/ -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dest - ) -{ - EFI_STATUS Status; - IP_IO *IpIo; - IP_IO_OVERRIDE Override; - SOCKET *Sock; - VOID *IpSender; - TCP4_PROTO_DATA *TcpProto; - EFI_IP_ADDRESS Source; - EFI_IP_ADDRESS Destination; - - Source.Addr[0] = Src; - Destination.Addr[0] = Dest; - - if (NULL == Tcb) { - - IpIo = NULL; - IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source); - - if (IpSender == NULL) { - DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate IpSender.\n")); - return -1; - } - } else { - - Sock = Tcb->Sk; - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - IpIo = TcpProto->TcpService->IpIo; - IpSender = Tcb->IpInfo; - } - - Override.Ip4OverrideData.TypeOfService = 0; - Override.Ip4OverrideData.TimeToLive = 255; - Override.Ip4OverrideData.DoNotFragment = FALSE; - Override.Ip4OverrideData.Protocol = EFI_IP_PROTO_TCP; - ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof (EFI_IPv4_ADDRESS)); - - Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, &Override); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status)); - return -1; - } - - return 0; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c deleted file mode 100644 index d8fc68c0a97d..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c +++ /dev/null @@ -1,674 +0,0 @@ -/** @file - Implementation of TCP4 protocol services. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Tcp4Main.h" - - -/** - Check the integrity of the data buffer. - - @param DataLen The total length of the data buffer. - @param FragmentCount The fragment count of the fragment table. - @param FragmentTable Pointer to the fragment table of the data - buffer. - - @retval EFI_SUCCESS The integrity check is passed. - @retval EFI_INVALID_PARAMETER The integrity check is failed. - -**/ -EFI_STATUS -Tcp4ChkDataBuf ( - IN UINT32 DataLen, - IN UINT32 FragmentCount, - IN EFI_TCP4_FRAGMENT_DATA *FragmentTable - ) -{ - UINT32 Index; - - UINT32 Len; - - for (Index = 0, Len = 0; Index < FragmentCount; Index++) { - Len = Len + (UINT32) FragmentTable[Index].FragmentLength; - } - - if (DataLen != Len) { - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - - -/** - Get the current operational status. - - The GetModeData() function copies the current operational settings of this - EFI TCPv4 Protocol instance into user-supplied buffers. This function can - also be used to retrieve the operational setting of underlying drivers - such as IPv4, MNP, or SNP. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Tcp4State Pointer to the buffer to receive the current TCP - state. - @param Tcp4ConfigData Pointer to the buffer to receive the current TCP - configuration. - @param Ip4ModeData Pointer to the buffer to receive the current IPv4 - configuration data used by the TCPv4 instance. - @param MnpConfigData Pointer to the buffer to receive the current MNP - configuration data indirectly used by the TCPv4 - Instance. - @param SnpModeData Pointer to the buffer to receive the current SNP - configuration data indirectly used by the TCPv4 - Instance. - - @retval EFI_SUCCESS The mode data was read. - @retval EFI_NOT_STARTED No configuration data is available because this - instance hasn't been started. - @retval EFI_INVALID_PARAMETER This is NULL. - -**/ -EFI_STATUS -EFIAPI -Tcp4GetModeData ( - IN EFI_TCP4_PROTOCOL *This, - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL - ) -{ - TCP4_MODE_DATA TcpMode; - SOCKET *Sock; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - TcpMode.Tcp4State = Tcp4State; - TcpMode.Tcp4ConfigData = Tcp4ConfigData; - TcpMode.Ip4ModeData = Ip4ModeData; - TcpMode.MnpConfigData = MnpConfigData; - TcpMode.SnpModeData = SnpModeData; - - return SockGetMode (Sock, &TcpMode); -} - - -/** - Initialize or brutally reset the operational parameters for - this EFI TCPv4 instance. - - The Configure() function does the following: - * Initialize this EFI TCPv4 instance, i.e., initialize the communication end - setting, specify active open or passive open for an instance. - * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous - tokens, flush transmission and receiving buffer directly without informing - the communication peer. - No other TCPv4 Protocol operation can be executed by this instance - until it is configured properly. For an active TCP4 instance, after a proper - configuration it may call Connect() to initiates the three-way handshake. - For a passive TCP4 instance, its state will transit to Tcp4StateListen after - configuration, and Accept() may be called to listen the incoming TCP connection - request. If TcpConfigData is set to NULL, the instance is reset. Resetting - process will be done brutally, the state machine will be set to Tcp4StateClosed - directly, the receive queue and transmit queue will be flushed, and no traffic is - allowed through this instance. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param TcpConfigData Pointer to the configure data to configure the - instance. - - @retval EFI_SUCCESS The operational settings are set, changed, or - reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is already - configured. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred. - @retval EFI_UNSUPPORTED One or more of the control options are not - supported in the implementation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4Configure ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL - ) -{ - EFI_TCP4_OPTION *Option; - SOCKET *Sock; - EFI_STATUS Status; - IP4_ADDR Ip; - IP4_ADDR SubnetMask; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - // - // Tcp protocol related parameter check will be conducted here - // - if (NULL != TcpConfigData) { - - CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR)); - if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) { - return EFI_INVALID_PARAMETER; - } - - if (TcpConfigData->AccessPoint.ActiveFlag && - (0 == TcpConfigData->AccessPoint.RemotePort || (Ip == 0))) { - return EFI_INVALID_PARAMETER; - } - - if (!TcpConfigData->AccessPoint.UseDefaultAddress) { - - CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof (IP4_ADDR)); - CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, sizeof (IP4_ADDR)); - if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) || - (SubnetMask != 0 && !NetIp4IsUnicast (NTOHL (Ip), NTOHL (SubnetMask)))) { - return EFI_INVALID_PARAMETER; - } - } - - Option = TcpConfigData->ControlOption; - if ((NULL != Option) && - (Option->EnableSelectiveAck || Option->EnablePathMtuDiscovery)) { - return EFI_UNSUPPORTED; - } - } - - Sock = SOCK_FROM_THIS (This); - - if (NULL == TcpConfigData) { - return SockFlush (Sock); - } - - Status = SockConfigure (Sock, TcpConfigData); - - if (EFI_NO_MAPPING == Status) { - Sock->ConfigureState = SO_NO_MAPPING; - } - - return Status; -} - - -/** - Add or delete routing entries. - - The Routes() function adds or deletes a route from the instance's routing table. - The most specific route is selected by comparing the SubnetAddress with the - destination IP address's arithmetical AND to the SubnetMask. - The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0. - The default route matches all destination IP addresses if there is no more specific route. - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to - the destination host if its address can be found in the Address Resolution Protocol (ARP) - cache or it is on the local subnet. If the instance is configured to use default - address, a direct route to the local network will be added automatically. - Each TCP instance has its own independent routing table. Instance that uses the - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table. - The copy will be updated automatically whenever the IP driver reconfigures its - instance. As a result, the previous modification to the instance's local copy - will be lost. The priority of checking the route table is specific with IP - implementation and every IP implementation must comply with RFC 1122. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param DeleteRoute If TRUE, delete the specified route from routing - table; if FALSE, add the specified route to - routing table. - DestinationAddress and SubnetMask are used as - the keywords to search route entry. - @param SubnetAddress The destination network. - @param SubnetMask The subnet mask for the destination network. - @param GatewayAddress The gateway address for this route. - It must be on the same subnet with the station - address unless a direct route is specified. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to add the - entry to the routing table. - @retval EFI_NOT_FOUND This route is not in the routing table. - @retval EFI_ACCESS_DENIED This route is already in the routing table. - @retval EFI_UNSUPPORTED The TCP driver does not support this operation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Routes ( - IN EFI_TCP4_PROTOCOL *This, - IN BOOLEAN DeleteRoute, - IN EFI_IPv4_ADDRESS *SubnetAddress, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *GatewayAddress - ) -{ - SOCKET *Sock; - TCP4_ROUTE_INFO RouteInfo; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - RouteInfo.DeleteRoute = DeleteRoute; - RouteInfo.SubnetAddress = SubnetAddress; - RouteInfo.SubnetMask = SubnetMask; - RouteInfo.GatewayAddress = GatewayAddress; - - return SockRoute (Sock, &RouteInfo); -} - - -/** - Initiate a nonblocking TCP connection request for an active TCP instance. - - The Connect() function will initiate an active open to the remote peer configured - in current TCP instance if it is configured active. If the connection succeeds - or fails due to any error, the ConnectionToken->CompletionToken.Event will be - signaled and ConnectionToken->CompletionToken.Status will be updated accordingly. - This function can only be called for the TCP instance in Tcp4StateClosed state. - The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS. - If TCP three way handshake succeeds, its state will become Tcp4StateEstablished, - otherwise, the state will return to Tcp4StateClosed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ConnectionToken Pointer to the connection token to return when - the TCP three way handshake finishes. - - @retval EFI_SUCCESS The connection request is successfully initiated - and the state of this TCPv4 instance has - been changed to Tcp4StateSynSent. - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instance is not configured as an active one - or it is not in Tcp4StateClosed state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough resource to - initiate the active open. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - -**/ -EFI_STATUS -EFIAPI -Tcp4Connect ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken - ) -{ - SOCKET *Sock; - - if (NULL == This || - NULL == ConnectionToken || - NULL == ConnectionToken->CompletionToken.Event) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - return SockConnect (Sock, ConnectionToken); -} - - -/** - Listen on the passive instance to accept an incoming connection request. - - The Accept() function initiates an asynchronous accept request to wait for an - incoming connection on the passive TCP instance. If a remote peer successfully - establishes a connection with this instance, a new TCP instance will be created - and its handle will be returned in ListenToken->NewChildHandle. The newly created - instance is configured by inheriting the passive instance's configuration and is - ready for use upon return. The instance is in the Tcp4StateEstablished state. - The ListenToken->CompletionToken.Event will be signaled when a new connection - is accepted, user aborts the listen or connection is reset. This function only - can be called when current TCP instance is in Tcp4StateListen state. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ListenToken Pointer to the listen token to return when - operation finishes. - - @retval EFI_SUCCESS The listen token has been queued successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is not - in Tcp4StateListen state or a same listen token - has already existed in the listen token queue of - this TCP instance. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to finish - the operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Accept ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_LISTEN_TOKEN *ListenToken - ) -{ - SOCKET *Sock; - - if (NULL == This || - NULL == ListenToken || - NULL == ListenToken->CompletionToken.Event) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - return SockAccept (Sock, ListenToken); -} - - -/** - Queues outgoing data into the transmit queue. - - The Transmit() function queues a sending request to this TCPv4 instance along - with the user data. The status of the token is updated and the event in the token - will be signaled once the data is sent out or some error occurs. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param Token Pointer to the completion token to queue to the - transmit queue - - @retval EFI_SUCCESS The data has been queued for transmission. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A transmit completion token with the same - Token-> CompletionToken.Event was already in the - transmission queue. - * The current instance is in Tcp4StateClosed state - * The current instance is a passive one and - it is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_NOT_READY The completion token could not be queued because - the transmit queue is full. - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data because of - resource shortage. - @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or - address. - -**/ -EFI_STATUS -EFIAPI -Tcp4Transmit ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ) -{ - SOCKET *Sock; - EFI_STATUS Status; - - if (NULL == This || - NULL == Token || - NULL == Token->CompletionToken.Event || - NULL == Token->Packet.TxData || - 0 == Token->Packet.TxData->FragmentCount || - 0 == Token->Packet.TxData->DataLength - ) { - return EFI_INVALID_PARAMETER; - } - - Status = Tcp4ChkDataBuf ( - (UINT32) Token->Packet.TxData->DataLength, - (UINT32) Token->Packet.TxData->FragmentCount, - Token->Packet.TxData->FragmentTable - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Sock = SOCK_FROM_THIS (This); - - return SockSend (Sock, Token); - -} - - -/** - Place an asynchronous receive request into the receiving queue. - - The Receive() function places a completion token into the receive packet queue. - This function is always asynchronous. The caller must allocate the - Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also - must fill the DataLength which represents the whole length of all FragmentBuffer. - When the receive operation completes, the EFI TCPv4 Protocol driver updates the - Token->CompletionToken.Status and Token->Packet.RxData fields and the - Token->CompletionToken.Event is signaled. If got data the data and its length - will be copy into the FragmentTable, in the same time the full length of received - data will be recorded in the DataLength fields. Providing a proper notification - function and context for the event will enable the user to receive the notification - and receiving status. That notification function is guaranteed to not be re-entered. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that is associated with the - receive data descriptor. - - @retval EFI_SUCCESS The receive completion token was cached. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued - due to a lack of system resources. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - The EFI TCPv4 Protocol instance has been reset - to startup defaults. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A receive completion token with the same - Token->CompletionToken.Event was already in - the receive queue. - * The current instance is in Tcp4StateClosed state. - * The current instance is a passive one and it - is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_CONNECTION_FIN The communication peer has closed the connection - and there is no any buffered data in the receive - buffer of this instance. - @retval EFI_NOT_READY The receive request could not be queued because - the receive queue is full. - -**/ -EFI_STATUS -EFIAPI -Tcp4Receive ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ) -{ - SOCKET *Sock; - EFI_STATUS Status; - - if (NULL == This || - NULL == Token || - NULL == Token->CompletionToken.Event || - NULL == Token->Packet.RxData || - 0 == Token->Packet.RxData->FragmentCount || - 0 == Token->Packet.RxData->DataLength - ) { - return EFI_INVALID_PARAMETER; - } - - Status = Tcp4ChkDataBuf ( - (UINT32) Token->Packet.RxData->DataLength, - (UINT32) Token->Packet.RxData->FragmentCount, - Token->Packet.RxData->FragmentTable - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Sock = SOCK_FROM_THIS (This); - - return SockRcv (Sock, Token); - -} - - -/** - Disconnecting a TCP connection gracefully or reset a TCP connection. - - Initiate an asynchronous close token to TCP driver. After Close() is called, - any buffered transmission data will be sent by TCP driver and the current - instance will have a graceful close working flow described as RFC 793 if - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP - driver to fast disconnect this connection. When the close operation completes - successfully the TCP instance is in Tcp4StateClosed state, all pending - asynchronous operation is signaled and any buffers used for TCP network traffic - is flushed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param CloseToken Pointer to the close token to return when - operation finishes. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED One or more of the following are TRUE: - * Configure() has been called with TcpConfigData - set to NULL and this function has not returned. - * Previous Close() call on this instance has not - finished. - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to finish the - operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above - category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Close ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CLOSE_TOKEN *CloseToken - ) -{ - SOCKET *Sock; - - if (NULL == This || - NULL == CloseToken || - NULL == CloseToken->CompletionToken.Event) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - return SockClose (Sock, CloseToken, CloseToken->AbortOnClose); -} - - -/** - Abort an asynchronous connection, listen, transmission or receive request. - - The Cancel() function aborts a pending connection, listen, transmit or receive - request. If Token is not NULL and the token is in the connection, listen, - transmission or receive queue when it is being cancelled, its Token->Status - will be set to EFI_ABORTED and then Token->Event will be signaled. If the token - is not in one of the queues, which usually means that the asynchronous operation - has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token - issued by Connect(), Accept(), Transmit() and Receive()will be aborted. - NOTE: It has not been implemented currently. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that has been issued by - Connect(), Accept(), Transmit() or Receive(). If - NULL, all pending tokens issued by above four - functions will be aborted. - - @retval EFI_SUCCESS The asynchronous I/O request is aborted and Token->Event - is signaled. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_NOT_STARTED This instance hasn's been configured. - @retval EFI_NO_MAPPING When using the default address, configuration - (DHCP, BOOTP,RARP, etc.) hasn's finished yet. - @retval EFI_NOT_FOUND The asynchronous I/O request isn's found in the - transmission or receive queue. It has either - completed or wasn's issued by Transmit() and Receive(). - @retval EFI_UNSUPPORTED The operation is not supported in current - implementation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Cancel ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL - ) -{ - return EFI_UNSUPPORTED; -} - - -/** - Poll to receive incoming data and transmit outgoing segments. - - The Poll() function increases the rate that data is moved between the network - and application and can be called when the TCP instance is created successfully. - Its use is optional. In some implementations, the periodical timer in the MNP - driver may not poll the underlying communications device fast enough to avoid - drop packets. Drivers and applications that are experiencing packet loss should - try calling the Poll() function in a high frequency. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - - @retval EFI_SUCCESS Incoming or outgoing data was processed. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - @retval EFI_NOT_READY No incoming or outgoing data was processed. - @retval EFI_TIMEOUT Data was dropped out of the transmission or - receive queue. Consider increasing the polling - rate. - -**/ -EFI_STATUS -EFIAPI -Tcp4Poll ( - IN EFI_TCP4_PROTOCOL *This - ) -{ - SOCKET *Sock; - EFI_STATUS Status; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c deleted file mode 100644 index 7fd8bb1fbe09..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c +++ /dev/null @@ -1,940 +0,0 @@ -/** @file - Misc support routines for tcp. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Tcp4Main.h" - -#include <Library/DevicePathLib.h> - -LIST_ENTRY mTcpRunQue = { - &mTcpRunQue, - &mTcpRunQue -}; - -LIST_ENTRY mTcpListenQue = { - &mTcpListenQue, - &mTcpListenQue -}; - -TCP_SEQNO mTcpGlobalIss = 0x4d7e980b; - -CHAR16 *mTcpStateName[] = { - L"TCP_CLOSED", - L"TCP_LISTEN", - L"TCP_SYN_SENT", - L"TCP_SYN_RCVD", - L"TCP_ESTABLISHED", - L"TCP_FIN_WAIT_1", - L"TCP_FIN_WAIT_2", - L"TCP_CLOSING", - L"TCP_TIME_WAIT", - L"TCP_CLOSE_WAIT", - L"TCP_LAST_ACK" -}; - - -/** - Initialize the Tcb local related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpInitTcbLocal ( - IN OUT TCP_CB *Tcb - ) -{ - // - // Compute the checksum of the fixed parts of pseudo header - // - Tcb->HeadSum = NetPseudoHeadChecksum ( - Tcb->LocalEnd.Ip, - Tcb->RemoteEnd.Ip, - 0x06, - 0 - ); - - Tcb->Iss = TcpGetIss (); - Tcb->SndUna = Tcb->Iss; - Tcb->SndNxt = Tcb->Iss; - - Tcb->SndWl2 = Tcb->Iss; - Tcb->SndWnd = 536; - - Tcb->RcvWnd = GET_RCV_BUFFSIZE (Tcb->Sk); - - // - // First window size is never scaled - // - Tcb->RcvWndScale = 0; - Tcb->RetxmitSeqMax = 0; - - Tcb->ProbeTimerOn = FALSE; -} - - -/** - Initialize the peer related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the segment that contains the peer's - intial info. - @param Opt Pointer to the options announced by the peer. - -**/ -VOID -TcpInitTcbPeer ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg, - IN TCP_OPTION *Opt - ) -{ - UINT16 RcvMss; - - ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL)); - ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)); - - Tcb->SndWnd = Seg->Wnd; - Tcb->SndWndMax = Tcb->SndWnd; - Tcb->SndWl1 = Seg->Seq; - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - Tcb->SndWl2 = Seg->Ack; - } else { - Tcb->SndWl2 = Tcb->Iss + 1; - } - - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) { - Tcb->SndMss = (UINT16) MAX (64, Opt->Mss); - - RcvMss = TcpGetRcvMss (Tcb->Sk); - if (Tcb->SndMss > RcvMss) { - Tcb->SndMss = RcvMss; - } - - } else { - // - // One end doesn't support MSS option, use default. - // - Tcb->RcvMss = 536; - } - - Tcb->CWnd = Tcb->SndMss; - - Tcb->Irs = Seg->Seq; - Tcb->RcvNxt = Tcb->Irs + 1; - - Tcb->RcvWl2 = Tcb->RcvNxt; - - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_WS) && - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)) { - - Tcb->SndWndScale = Opt->WndScale; - - Tcb->RcvWndScale = TcpComputeScale (Tcb); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS); - - } else { - // - // One end doesn't support window scale option. use zero. - // - Tcb->RcvWndScale = 0; - } - - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_TS) && - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)) { - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_TS); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS); - - Tcb->TsRecent = Opt->TSVal; - - // - // Compute the effective SndMss per RFC1122 - // section 4.2.2.6. If timestamp option is - // enabled, it will always occupy 12 bytes. - // - Tcb->SndMss -= TCP_OPTION_TS_ALIGNED_LEN; - } -} - - -/** - Locate a listen TCB that matchs the Local and Remote. - - @param Local Pointer to the local (IP, Port). - @param Remote Pointer to the remote (IP, Port). - - @return Pointer to the TCP_CB with the least number of wildcard, - if NULL no match is found. - -**/ -TCP_CB * -TcpLocateListenTcb ( - IN TCP_PEER *Local, - IN TCP_PEER *Remote - ) -{ - LIST_ENTRY *Entry; - TCP_CB *Node; - TCP_CB *Match; - INTN Last; - INTN Cur; - - Last = 4; - Match = NULL; - - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if ((Local->Port != Node->LocalEnd.Port) || - !TCP_PEER_MATCH (Remote, &Node->RemoteEnd) || - !TCP_PEER_MATCH (Local, &Node->LocalEnd)) { - - continue; - } - - // - // Compute the number of wildcard - // - Cur = 0; - if (Node->RemoteEnd.Ip == 0) { - Cur++; - } - - if (Node->RemoteEnd.Port == 0) { - Cur++; - } - - if (Node->LocalEnd.Ip == 0) { - Cur++; - } - - if (Cur < Last) { - if (Cur == 0) { - return Node; - } - - Last = Cur; - Match = Node; - } - } - - return Match; -} - - -/** - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. - - @param Addr Pointer to the IP address needs to match. - @param Port The port number needs to match. - - @return The Tcb which matches the <Addr Port> paire exists or not. - -**/ -BOOLEAN -TcpFindTcbByPeer ( - IN EFI_IPv4_ADDRESS *Addr, - IN TCP_PORTNO Port - ) -{ - TCP_PORTNO LocalPort; - LIST_ENTRY *Entry; - TCP_CB *Tcb; - - ASSERT ((Addr != NULL) && (Port != 0)); - - LocalPort = HTONS (Port); - - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && - (LocalPort == Tcb->LocalEnd.Port)) { - - return TRUE; - } - } - - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && - (LocalPort == Tcb->LocalEnd.Port)) { - - return TRUE; - } - } - - return FALSE; -} - - -/** - Locate the TCP_CB related to the socket pair. - - @param LocalPort The local port number. - @param LocalIp The local IP address. - @param RemotePort The remote port number. - @param RemoteIp The remote IP address. - @param Syn Whether to search the listen sockets, if TRUE, the - listen sockets are searched. - - @return Pointer to the related TCP_CB, if NULL no match is found. - -**/ -TCP_CB * -TcpLocateTcb ( - IN TCP_PORTNO LocalPort, - IN UINT32 LocalIp, - IN TCP_PORTNO RemotePort, - IN UINT32 RemoteIp, - IN BOOLEAN Syn - ) -{ - TCP_PEER Local; - TCP_PEER Remote; - LIST_ENTRY *Entry; - TCP_CB *Tcb; - - Local.Port = LocalPort; - Local.Ip = LocalIp; - - Remote.Port = RemotePort; - Remote.Ip = RemoteIp; - - // - // First check for exact match. - // - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) && - TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) { - - RemoveEntryList (&Tcb->List); - InsertHeadList (&mTcpRunQue, &Tcb->List); - - return Tcb; - } - } - - // - // Only check listen queue when SYN flag is on - // - if (Syn) { - return TcpLocateListenTcb (&Local, &Remote); - } - - return NULL; -} - - -/** - Insert a Tcb into the proper queue. - - @param Tcb Pointer to the TCP_CB to be inserted. - - @retval 0 The Tcb is inserted successfully. - @retval -1 Error condition occurred. - -**/ -INTN -TcpInsertTcb ( - IN TCP_CB *Tcb - ) -{ - LIST_ENTRY *Entry; - LIST_ENTRY *Head; - TCP_CB *Node; - - ASSERT ( - (Tcb != NULL) && - ((Tcb->State == TCP_LISTEN) || - (Tcb->State == TCP_SYN_SENT) || - (Tcb->State == TCP_SYN_RCVD) || - (Tcb->State == TCP_CLOSED)) - ); - - if (Tcb->LocalEnd.Port == 0) { - return -1; - } - - Head = &mTcpRunQue; - - if (Tcb->State == TCP_LISTEN) { - Head = &mTcpListenQue; - } - - // - // Check that Tcb isn't already on the list. - // - NET_LIST_FOR_EACH (Entry, Head) { - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (TCP_PEER_EQUAL (&Tcb->LocalEnd, &Node->LocalEnd) && - TCP_PEER_EQUAL (&Tcb->RemoteEnd, &Node->RemoteEnd)) { - - return -1; - } - } - - InsertHeadList (Head, &Tcb->List); - - return 0; -} - - -/** - Clone a TCB_CB from Tcb. - - @param Tcb Pointer to the TCP_CB to be cloned. - - @return Pointer to the new cloned TCP_CB, if NULL error condition occurred. - -**/ -TCP_CB * -TcpCloneTcb ( - IN TCP_CB *Tcb - ) -{ - TCP_CB *Clone; - - Clone = AllocatePool (sizeof (TCP_CB)); - - if (Clone == NULL) { - return NULL; - - } - - CopyMem (Clone, Tcb, sizeof (TCP_CB)); - - // - // Increate the reference count of the shared IpInfo. - // - NET_GET_REF (Tcb->IpInfo); - - InitializeListHead (&Clone->List); - InitializeListHead (&Clone->SndQue); - InitializeListHead (&Clone->RcvQue); - - Clone->Sk = SockClone (Tcb->Sk); - if (Clone->Sk == NULL) { - DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n")); - FreePool (Clone); - return NULL; - } - - ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone; - - return Clone; -} - - -/** - Compute an ISS to be used by a new connection. - - @return The result ISS. - -**/ -TCP_SEQNO -TcpGetIss ( - VOID - ) -{ - mTcpGlobalIss += 2048; - return mTcpGlobalIss; -} - - -/** - Get the local mss. - - @param Sock Pointer to the socket to get mss - - @return The mss size. - -**/ -UINT16 -TcpGetRcvMss ( - IN SOCKET *Sock - ) -{ - EFI_IP4_MODE_DATA Ip4Mode; - TCP4_PROTO_DATA *TcpProto; - EFI_IP4_PROTOCOL *Ip; - - ASSERT (Sock != NULL); - - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - Ip = TcpProto->TcpService->IpIo->Ip.Ip4; - ASSERT (Ip != NULL); - - Ip->GetModeData (Ip, &Ip4Mode, NULL, NULL); - - return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD)); -} - - -/** - Set the Tcb's state. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param State The state to be set. - -**/ -VOID -TcpSetState ( - IN OUT TCP_CB *Tcb, - IN UINT8 State - ) -{ - ASSERT (Tcb->State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); - ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); - - DEBUG ( - (EFI_D_NET, - "Tcb (%p) state %s --> %s\n", - Tcb, - mTcpStateName[Tcb->State], - mTcpStateName[State]) - ); - - Tcb->State = State; - - switch (State) { - case TCP_ESTABLISHED: - - SockConnEstablished (Tcb->Sk); - - if (Tcb->Parent != NULL) { - // - // A new connection is accepted by a listening socket, install - // the device path. - // - TcpInstallDevicePath (Tcb->Sk); - } - - break; - - case TCP_CLOSED: - - SockConnClosed (Tcb->Sk); - - break; - default: - break; - } -} - - -/** - Compute the TCP segment's checksum. - - @param Nbuf Pointer to the buffer that contains the TCP - segment. - @param HeadSum The checksum value of the fixed part of pseudo - header. - - @return The checksum value. - -**/ -UINT16 -TcpChecksum ( - IN NET_BUF *Nbuf, - IN UINT16 HeadSum - ) -{ - UINT16 Checksum; - - Checksum = NetbufChecksum (Nbuf); - Checksum = NetAddChecksum (Checksum, HeadSum); - - Checksum = NetAddChecksum ( - Checksum, - HTONS ((UINT16) Nbuf->TotalSize) - ); - - return (UINT16) ~Checksum; -} - -/** - Translate the information from the head of the received TCP - segment Nbuf contains and fill it into a TCP_SEG structure. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer contains the TCP segment. - - @return Pointer to the TCP_SEG that contains the translated TCP head information. - -**/ -TCP_SEG * -TcpFormatNetbuf ( - IN TCP_CB *Tcb, - IN OUT NET_BUF *Nbuf - ) -{ - TCP_SEG *Seg; - TCP_HEAD *Head; - - Seg = TCPSEG_NETBUF (Nbuf); - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); - ASSERT (Head != NULL); - Nbuf->Tcp = Head; - - Seg->Seq = NTOHL (Head->Seq); - Seg->Ack = NTOHL (Head->Ack); - Seg->End = Seg->Seq + (Nbuf->TotalSize - (Head->HeadLen << 2)); - - Seg->Urg = NTOHS (Head->Urg); - Seg->Wnd = (NTOHS (Head->Wnd) << Tcb->SndWndScale); - Seg->Flag = Head->Flag; - - // - // SYN and FIN flag occupy one sequence space each. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - // - // RFC requires that initial window not be scaled - // - Seg->Wnd = NTOHS (Head->Wnd); - Seg->End++; - } - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - Seg->End++; - } - - return Seg; -} - - -/** - Reset the connection related with Tcb. - - @param Tcb Pointer to the TCP_CB of the connection to be - reset. - -**/ -VOID -TcpResetConnection ( - IN TCP_CB *Tcb - ) -{ - NET_BUF *Nbuf; - TCP_HEAD *Nhead; - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return ; - } - - Nhead = (TCP_HEAD *) NetbufAllocSpace ( - Nbuf, - sizeof (TCP_HEAD), - NET_BUF_TAIL - ); - - ASSERT (Nhead != NULL); - - Nbuf->Tcp = Nhead; - - Nhead->Flag = TCP_FLG_RST; - Nhead->Seq = HTONL (Tcb->SndNxt); - Nhead->Ack = HTONL (Tcb->RcvNxt); - Nhead->SrcPort = Tcb->LocalEnd.Port; - Nhead->DstPort = Tcb->RemoteEnd.Port; - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); - Nhead->Res = 0; - Nhead->Wnd = HTONS (0xFFFF); - Nhead->Checksum = 0; - Nhead->Urg = 0; - Nhead->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); - - TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip); - - NetbufFree (Nbuf); -} - - -/** - Initialize an active connection. - - @param Tcb Pointer to the TCP_CB that wants to initiate a - connection. - -**/ -VOID -TcpOnAppConnect ( - IN OUT TCP_CB *Tcb - ) -{ - TcpInitTcbLocal (Tcb); - TcpSetState (Tcb, TCP_SYN_SENT); - - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); - TcpToSendData (Tcb, 1); -} - - -/** - Initiate the connection close procedure, called when - applications want to close the connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppClose ( - IN OUT TCP_CB *Tcb - ) -{ - ASSERT (Tcb != NULL); - - if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk) != 0) { - - DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset " - "because data is lost for TCB %p\n", Tcb)); - - TcpResetConnection (Tcb); - TcpClose (Tcb); - return; - } - - switch (Tcb->State) { - case TCP_CLOSED: - case TCP_LISTEN: - case TCP_SYN_SENT: - TcpSetState (Tcb, TCP_CLOSED); - break; - - case TCP_SYN_RCVD: - case TCP_ESTABLISHED: - TcpSetState (Tcb, TCP_FIN_WAIT_1); - break; - - case TCP_CLOSE_WAIT: - TcpSetState (Tcb, TCP_LAST_ACK); - break; - default: - break; - } - - TcpToSendData (Tcb, 1); -} - - -/** - Check whether the application's newly delivered data can be sent out. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 Whether the data is sent out or is buffered for - further sending. - @retval -1 The Tcb is not in a state that data is permitted to - be sent out. - -**/ -INTN -TcpOnAppSend ( - IN OUT TCP_CB *Tcb - ) -{ - - switch (Tcb->State) { - case TCP_CLOSED: - return -1; - - case TCP_LISTEN: - return -1; - - case TCP_SYN_SENT: - case TCP_SYN_RCVD: - return 0; - - case TCP_ESTABLISHED: - case TCP_CLOSE_WAIT: - TcpToSendData (Tcb, 0); - return 0; - - case TCP_FIN_WAIT_1: - case TCP_FIN_WAIT_2: - case TCP_CLOSING: - case TCP_LAST_ACK: - case TCP_TIME_WAIT: - return -1; - - default: - break; - } - - return 0; -} - - -/** - Application has consumed some data, check whether - to send a window updata ack or a delayed ack. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppConsume ( - IN TCP_CB *Tcb - ) -{ - UINT32 TcpOld; - - switch (Tcb->State) { - case TCP_CLOSED: - return; - - case TCP_LISTEN: - return; - - case TCP_SYN_SENT: - case TCP_SYN_RCVD: - return; - - case TCP_ESTABLISHED: - TcpOld = TcpRcvWinOld (Tcb); - if (TcpRcvWinNow (Tcb) > TcpOld) { - - if (TcpOld < Tcb->RcvMss) { - - DEBUG ((EFI_D_NET, "TcpOnAppConsume: send a window" - " update for a window closed Tcb %p\n", Tcb)); - - TcpSendAck (Tcb); - } else if (Tcb->DelayedAck == 0) { - - DEBUG ((EFI_D_NET, "TcpOnAppConsume: scheduled a delayed" - " ACK to update window for Tcb %p\n", Tcb)); - - Tcb->DelayedAck = 1; - } - } - - break; - - case TCP_CLOSE_WAIT: - return; - - case TCP_FIN_WAIT_1: - case TCP_FIN_WAIT_2: - case TCP_CLOSING: - case TCP_LAST_ACK: - case TCP_TIME_WAIT: - return; - - default: - break; - } -} - - -/** - Abort the connection by sending a reset segment, called - when the application wants to abort the connection. - - @param Tcb Pointer to the TCP_CB of the TCP instance. - -**/ -VOID -TcpOnAppAbort ( - IN TCP_CB *Tcb - ) -{ - DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset " - "issued by application for TCB %p\n", Tcb)); - - switch (Tcb->State) { - case TCP_SYN_RCVD: - case TCP_ESTABLISHED: - case TCP_FIN_WAIT_1: - case TCP_FIN_WAIT_2: - case TCP_CLOSE_WAIT: - TcpResetConnection (Tcb); - break; - default: - break; - } - - TcpSetState (Tcb, TCP_CLOSED); -} - -/** - Install the device path protocol on the TCP instance. - - @param Sock Pointer to the socket representing the TCP instance. - - @retval EFI_SUCCESS The device path protocol is installed. - @retval other Failed to install the device path protocol. - -**/ -EFI_STATUS -TcpInstallDevicePath ( - IN SOCKET *Sock - ) -{ - TCP4_PROTO_DATA *TcpProto; - TCP4_SERVICE_DATA *TcpService; - TCP_CB *Tcb; - IPv4_DEVICE_PATH Ip4DPathNode; - EFI_STATUS Status; - TCP_PORTNO LocalPort; - TCP_PORTNO RemotePort; - - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - TcpService = TcpProto->TcpService; - Tcb = TcpProto->TcpPcb; - - LocalPort = NTOHS (Tcb->LocalEnd.Port); - RemotePort = NTOHS (Tcb->RemoteEnd.Port); - NetLibCreateIPv4DPathNode ( - &Ip4DPathNode, - TcpService->ControllerHandle, - Tcb->LocalEnd.Ip, - LocalPort, - Tcb->RemoteEnd.Ip, - RemotePort, - EFI_IP_PROTO_TCP, - Tcb->UseDefaultAddr - ); - - IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask); - - Sock->DevicePath = AppendDevicePathNode ( - Sock->ParentDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode - ); - if (Sock->DevicePath == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = gBS->InstallProtocolInterface ( - &Sock->SockHandle, - &gEfiDevicePathProtocolGuid, - EFI_NATIVE_INTERFACE, - Sock->DevicePath - ); - if (EFI_ERROR (Status)) { - FreePool (Sock->DevicePath); - } - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c deleted file mode 100644 index e84310f6c693..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c +++ /dev/null @@ -1,352 +0,0 @@ -/** @file - Routines to process TCP option. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -/** - Get a UINT16 value from buffer. - - @param Buf Pointer to input buffer. - - @return The UINT16 value get from buffer. - -**/ -UINT16 -TcpGetUint16 ( - IN UINT8 *Buf - ) -{ - UINT16 Value; - CopyMem (&Value, Buf, sizeof (UINT16)); - return NTOHS (Value); -} - -/** - Get a UINT32 value from buffer. - - @param Buf Pointer to input buffer. - - @return The UINT32 value get from buffer. - -**/ -UINT32 -TcpGetUint32 ( - IN UINT8 *Buf - ) -{ - UINT32 Value; - CopyMem (&Value, Buf, sizeof (UINT32)); - return NTOHL (Value); -} - -/** - Put a UINT32 value in buffer. - - @param Buf Pointer to the buffer. - @param Data The UINT32 Date to put in buffer - -**/ -VOID -TcpPutUint32 ( - OUT UINT8 *Buf, - IN UINT32 Data - ) -{ - Data = HTONL (Data); - CopyMem (Buf, &Data, sizeof (UINT32)); -} - - -/** - Compute the window scale value according to the given buffer size. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The scale value. - -**/ -UINT8 -TcpComputeScale ( - IN TCP_CB *Tcb - ) -{ - UINT8 Scale; - UINT32 BufSize; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - BufSize = GET_RCV_BUFFSIZE (Tcb->Sk); - - Scale = 0; - while ((Scale < TCP_OPTION_MAX_WS) && - ((UINT32) (TCP_OPTION_MAX_WIN << Scale) < BufSize)) { - - Scale++; - } - - return Scale; -} - - -/** - Build the TCP option in three-way handshake. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpSynBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - UINT8 *Data; - UINT16 Len; - - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); - - Len = 0; - - // - // Add timestamp option if not disabled by application - // and it is the first SYN segment or the peer has sent - // us its timestamp. - // - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS) && - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS))) { - - Data = NetbufAllocSpace ( - Nbuf, - TCP_OPTION_TS_ALIGNED_LEN, - NET_BUF_HEAD - ); - - ASSERT (Data != NULL); - Len += TCP_OPTION_TS_ALIGNED_LEN; - - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); - TcpPutUint32 (Data + 4, mTcpTick); - TcpPutUint32 (Data + 8, 0); - } - - // - // Build window scale option, only when are configured - // to send WS option, and either we are doing active - // open or we have received WS option from peer. - // - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS) && - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS))) { - - Data = NetbufAllocSpace ( - Nbuf, - TCP_OPTION_WS_ALIGNED_LEN, - NET_BUF_HEAD - ); - - ASSERT (Data != NULL); - - Len += TCP_OPTION_WS_ALIGNED_LEN; - TcpPutUint32 (Data, TCP_OPTION_WS_FAST | TcpComputeScale (Tcb)); - } - - // - // Build MSS option - // - Data = NetbufAllocSpace (Nbuf, TCP_OPTION_MSS_LEN, 1); - ASSERT (Data != NULL); - - Len += TCP_OPTION_MSS_LEN; - TcpPutUint32 (Data, TCP_OPTION_MSS_FAST | Tcb->RcvMss); - - return Len; -} - - -/** - Build the TCP option in synchronized states. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - UINT8 *Data; - UINT16 Len; - - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); - Len = 0; - - // - // Build Timestamp option - // - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_TS) && - !TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_RST)) { - - Data = NetbufAllocSpace ( - Nbuf, - TCP_OPTION_TS_ALIGNED_LEN, - NET_BUF_HEAD - ); - - ASSERT (Data != NULL); - Len += TCP_OPTION_TS_ALIGNED_LEN; - - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); - TcpPutUint32 (Data + 4, mTcpTick); - TcpPutUint32 (Data + 8, Tcb->TsRecent); - } - - return Len; -} - - -/** - Parse the supported options. - - @param Tcp Pointer to the TCP_CB of this TCP instance. - @param Option Pointer to the TCP_OPTION used to store the successfully pasrsed - options. - - @retval 0 The options are successfully pasrsed. - @retval -1 Ilegal option was found. - -**/ -INTN -TcpParseOption ( - IN TCP_HEAD *Tcp, - IN OUT TCP_OPTION *Option - ) -{ - UINT8 *Head; - UINT8 TotalLen; - UINT8 Cur; - UINT8 Type; - UINT8 Len; - - ASSERT ((Tcp != NULL) && (Option != NULL)); - - Option->Flag = 0; - - TotalLen = (UINT8) ((Tcp->HeadLen << 2) - sizeof (TCP_HEAD)); - if (TotalLen <= 0) { - return 0; - } - - Head = (UINT8 *) (Tcp + 1); - - // - // Fast process of timestamp option - // - if ((TotalLen == TCP_OPTION_TS_ALIGNED_LEN) && - (TcpGetUint32 (Head) == TCP_OPTION_TS_FAST)) { - - Option->TSVal = TcpGetUint32 (Head + 4); - Option->TSEcr = TcpGetUint32 (Head + 8); - Option->Flag = TCP_OPTION_RCVD_TS; - - return 0; - } - - // - // Slow path to process the options. - // - Cur = 0; - - while (Cur < TotalLen) { - Type = Head[Cur]; - - switch (Type) { - case TCP_OPTION_MSS: - Len = Head[Cur + 1]; - - if ((Len != TCP_OPTION_MSS_LEN) || - (TotalLen - Cur < TCP_OPTION_MSS_LEN)) { - - return -1; - } - - Option->Mss = TcpGetUint16 (&Head[Cur + 2]); - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_MSS); - - Cur += TCP_OPTION_MSS_LEN; - break; - - case TCP_OPTION_WS: - Len = Head[Cur + 1]; - - if ((Len != TCP_OPTION_WS_LEN) || - (TotalLen - Cur < TCP_OPTION_WS_LEN)) { - - return -1; - } - - Option->WndScale = (UINT8) MIN (14, Head[Cur + 2]); - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_WS); - - Cur += TCP_OPTION_WS_LEN; - break; - - case TCP_OPTION_TS: - Len = Head[Cur + 1]; - - if ((Len != TCP_OPTION_TS_LEN) || - (TotalLen - Cur < TCP_OPTION_TS_LEN)) { - - return -1; - } - - Option->TSVal = TcpGetUint32 (&Head[Cur + 2]); - Option->TSEcr = TcpGetUint32 (&Head[Cur + 6]); - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_TS); - - Cur += TCP_OPTION_TS_LEN; - break; - - case TCP_OPTION_NOP: - Cur++; - break; - - case TCP_OPTION_EOP: - Cur = TotalLen; - break; - - default: - Len = Head[Cur + 1]; - - if ((TotalLen - Cur) < Len || Len < 2) { - return -1; - } - - Cur = (UINT8) (Cur + Len); - break; - } - - } - - return 0; -} - - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c deleted file mode 100644 index 760b09a1eda1..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c +++ /dev/null @@ -1,1238 +0,0 @@ -/** @file - TCP output process routines. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -UINT8 mTcpOutFlag[] = { - 0, // TCP_CLOSED - 0, // TCP_LISTEN - TCP_FLG_SYN, // TCP_SYN_SENT - TCP_FLG_SYN | TCP_FLG_ACK, // TCP_SYN_RCVD - TCP_FLG_ACK, // TCP_ESTABLISHED - TCP_FLG_FIN | TCP_FLG_ACK, // TCP_FIN_WAIT_1 - TCP_FLG_ACK, // TCP_FIN_WAIT_2 - TCP_FLG_ACK | TCP_FLG_FIN, // TCP_CLOSING - TCP_FLG_ACK, // TCP_TIME_WAIT - TCP_FLG_ACK, // TCP_CLOSE_WAIT - TCP_FLG_FIN | TCP_FLG_ACK // TCP_LAST_ACK -}; - - -/** - Compute the sequence space left in the old receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence space left in the old receive window. - -**/ -UINT32 -TcpRcvWinOld ( - IN TCP_CB *Tcb - ) -{ - UINT32 OldWin; - - OldWin = 0; - - if (TCP_SEQ_GT (Tcb->RcvWl2 + Tcb->RcvWnd, Tcb->RcvNxt)) { - - OldWin = TCP_SUB_SEQ ( - Tcb->RcvWl2 + Tcb->RcvWnd, - Tcb->RcvNxt - ); - } - - return OldWin; -} - - -/** - Compute the current receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The size of the current receive window, in bytes. - -**/ -UINT32 -TcpRcvWinNow ( - IN TCP_CB *Tcb - ) -{ - SOCKET *Sk; - UINT32 Win; - UINT32 Increase; - UINT32 OldWin; - - Sk = Tcb->Sk; - ASSERT (Sk != NULL); - - OldWin = TcpRcvWinOld (Tcb); - - Win = SockGetFreeSpace (Sk, SOCK_RCV_BUF); - - Increase = 0; - if (Win > OldWin) { - Increase = Win - OldWin; - } - - // - // Receiver's SWS: don't advertise a bigger window - // unless it can be increased by at least one Mss or - // half of the receive buffer. - // - if ((Increase > Tcb->SndMss) || - (2 * Increase >= GET_RCV_BUFFSIZE (Sk))) { - - return Win; - } - - return OldWin; -} - - -/** - Compute the value to fill in the window size field of the outgoing segment. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Syn The flag to indicate whether the outgoing segment is a SYN - segment. - - @return The value of the local receive window size used to fill the outing segment. - -**/ -UINT16 -TcpComputeWnd ( - IN OUT TCP_CB *Tcb, - IN BOOLEAN Syn - ) -{ - UINT32 Wnd; - - // - // RFC requires that initial window not be scaled - // - if (Syn) { - - Wnd = GET_RCV_BUFFSIZE (Tcb->Sk); - } else { - - Wnd = TcpRcvWinNow (Tcb); - - Tcb->RcvWnd = Wnd; - } - - Wnd = MIN (Wnd >> Tcb->RcvWndScale, 0xffff); - return NTOHS ((UINT16) Wnd); -} - - -/** - Get the maximum SndNxt. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence number of the maximum SndNxt. - -**/ -TCP_SEQNO -TcpGetMaxSndNxt ( - IN TCP_CB *Tcb - ) -{ - LIST_ENTRY *Entry; - NET_BUF *Nbuf; - - if (IsListEmpty (&Tcb->SndQue)) { - return Tcb->SndNxt; - } - - Entry = Tcb->SndQue.BackLink; - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - - ASSERT (TCP_SEQ_GEQ (TCPSEG_NETBUF (Nbuf)->End, Tcb->SndNxt)); - return TCPSEG_NETBUF (Nbuf)->End; -} - - -/** - Compute how much data to send. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The length of the data can be sent, if 0, no data can be sent. - -**/ -UINT32 -TcpDataToSend ( - IN TCP_CB *Tcb, - IN INTN Force - ) -{ - SOCKET *Sk; - UINT32 Win; - UINT32 Len; - UINT32 Left; - UINT32 Limit; - - Sk = Tcb->Sk; - ASSERT (Sk != NULL); - - // - // TCP should NOT send data beyond the send window - // and congestion window. The right edge of send - // window is defined as SND.WL2 + SND.WND. The right - // edge of congestion window is defined as SND.UNA + - // CWND. - // - Win = 0; - Limit = Tcb->SndWl2 + Tcb->SndWnd; - - if (TCP_SEQ_GT (Limit, Tcb->SndUna + Tcb->CWnd)) { - - Limit = Tcb->SndUna + Tcb->CWnd; - } - - if (TCP_SEQ_GT (Limit, Tcb->SndNxt)) { - Win = TCP_SUB_SEQ (Limit, Tcb->SndNxt); - } - - // - // The data to send contains two parts: the data on the - // socket send queue, and the data on the TCB's send - // buffer. The later can be non-zero if the peer shrinks - // its advertised window. - // - Left = GET_SND_DATASIZE (Sk) + - TCP_SUB_SEQ (TcpGetMaxSndNxt (Tcb), Tcb->SndNxt); - - Len = MIN (Win, Left); - - if (Len > Tcb->SndMss) { - Len = Tcb->SndMss; - } - - if ((Force != 0)|| (Len == 0 && Left == 0)) { - return Len; - } - - if (Len == 0 && Left != 0) { - goto SetPersistTimer; - } - - // - // Sender's SWS avoidance: Don't send a small segment unless - // a)A full-sized segment can be sent, - // b)at least one-half of the maximum sized windows that - // the other end has ever advertised. - // c)It can send everything it has and either it isn't - // expecting an ACK or the Nagle algorithm is disabled. - // - if ((Len == Tcb->SndMss) || (2 * Len >= Tcb->SndWndMax)) { - - return Len; - } - - if ((Len == Left) && - ((Tcb->SndNxt == Tcb->SndUna) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE))) { - - return Len; - } - - // - // RFC1122 suggests to set a timer when SWSA forbids TCP - // sending more data, and combine it with probe timer. - // -SetPersistTimer: - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { - - DEBUG ( - (EFI_D_WARN, - "TcpDataToSend: enter persistent state for TCB %p\n", - Tcb) - ); - - if (!Tcb->ProbeTimerOn) { - TcpSetProbeTimer (Tcb); - } - } - - return 0; -} - - -/** - Build the TCP header of the TCP segment and transmit the segment by IP. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer containing the segment to be sent out. - - @retval 0 The segment is sent out successfully. - @retval other Error condition occurred. - -**/ -INTN -TcpTransmitSegment ( - IN OUT TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - UINT16 Len; - TCP_HEAD *Head; - TCP_SEG *Seg; - BOOLEAN Syn; - UINT32 DataLen; - - ASSERT ((Nbuf != NULL) && (Nbuf->Tcp == NULL) && (TcpVerifySegment (Nbuf) != 0)); - - DataLen = Nbuf->TotalSize; - - Seg = TCPSEG_NETBUF (Nbuf); - Syn = TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN); - - if (Syn) { - - Len = TcpSynBuildOption (Tcb, Nbuf); - } else { - - Len = TcpBuildOption (Tcb, Nbuf); - } - - ASSERT ((Len % 4 == 0) && (Len <= 40)); - - Len += sizeof (TCP_HEAD); - - Head = (TCP_HEAD *) NetbufAllocSpace ( - Nbuf, - sizeof (TCP_HEAD), - NET_BUF_HEAD - ); - - ASSERT (Head != NULL); - - Nbuf->Tcp = Head; - - Head->SrcPort = Tcb->LocalEnd.Port; - Head->DstPort = Tcb->RemoteEnd.Port; - Head->Seq = NTOHL (Seg->Seq); - Head->Ack = NTOHL (Tcb->RcvNxt); - Head->HeadLen = (UINT8) (Len >> 2); - Head->Res = 0; - Head->Wnd = TcpComputeWnd (Tcb, Syn); - Head->Checksum = 0; - - // - // Check whether to set the PSH flag. - // - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_PSH); - - if (DataLen != 0) { - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_PSH) && - TCP_SEQ_BETWEEN (Seg->Seq, Tcb->SndPsh, Seg->End)) { - - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); - - } else if ((Seg->End == Tcb->SndNxt) && - (GET_SND_DATASIZE (Tcb->Sk) == 0)) { - - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); - } - } - - // - // Check whether to set the URG flag and the urgent pointer. - // - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && - TCP_SEQ_LEQ (Seg->Seq, Tcb->SndUp)) { - - TCP_SET_FLG (Seg->Flag, TCP_FLG_URG); - - if (TCP_SEQ_LT (Tcb->SndUp, Seg->End)) { - - Seg->Urg = (UINT16) TCP_SUB_SEQ (Tcb->SndUp, Seg->Seq); - } else { - - Seg->Urg = (UINT16) MIN ( - TCP_SUB_SEQ (Tcb->SndUp, - Seg->Seq), - 0xffff - ); - } - } - - Head->Flag = Seg->Flag; - Head->Urg = NTOHS (Seg->Urg); - Head->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); - - // - // update the TCP session's control information - // - Tcb->RcvWl2 = Tcb->RcvNxt; - if (Syn) { - Tcb->RcvWnd = NTOHS (Head->Wnd); - } - - // - // clear delayedack flag - // - Tcb->DelayedAck = 0; - - return TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip); -} - - -/** - Get a segment from the Tcb's SndQue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ) -{ - LIST_ENTRY *Head; - LIST_ENTRY *Cur; - NET_BUF *Node; - TCP_SEG *Seg; - NET_BUF *Nbuf; - TCP_SEQNO End; - UINT8 *Data; - UINT8 Flag; - INT32 Offset; - INT32 CopyLen; - - ASSERT ((Tcb != NULL) && TCP_SEQ_LEQ (Seq, Tcb->SndNxt) && (Len > 0)); - - // - // Find the segment that contains the Seq. - // - Head = &Tcb->SndQue; - - Node = NULL; - Seg = NULL; - - NET_LIST_FOR_EACH (Cur, Head) { - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - Seg = TCPSEG_NETBUF (Node); - - if (TCP_SEQ_LT (Seq, Seg->End) && TCP_SEQ_LEQ (Seg->Seq, Seq)) { - - break; - } - } - - ASSERT (Cur != Head); - ASSERT (Node != NULL); - ASSERT (Seg != NULL); - - // - // Return the buffer if it can be returned without - // adjustment: - // - if ((Seg->Seq == Seq) && - TCP_SEQ_LEQ (Seg->End, Seg->Seq + Len) && - !NET_BUF_SHARED (Node)) { - - NET_GET_REF (Node); - return Node; - } - - // - // Create a new buffer and copy data there. - // - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return NULL; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - Flag = Seg->Flag; - End = Seg->End; - - if (TCP_SEQ_LT (Seq + Len, Seg->End)) { - End = Seq + Len; - } - - CopyLen = TCP_SUB_SEQ (End, Seq); - Offset = TCP_SUB_SEQ (Seq, Seg->Seq); - - // - // If SYN is set and out of the range, clear the flag. - // Because the sequence of the first byte is SEG.SEQ+1, - // adjust Offset by -1. If SYN is in the range, copy - // one byte less. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - - if (TCP_SEQ_LT (Seg->Seq, Seq)) { - - TCP_CLEAR_FLG (Flag, TCP_FLG_SYN); - Offset--; - } else { - - CopyLen--; - } - } - - // - // If FIN is set and in the range, copy one byte less, - // and if it is out of the range, clear the flag. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - - if (Seg->End == End) { - - CopyLen--; - } else { - - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); - } - } - - ASSERT (CopyLen >= 0); - - // - // copy data to the segment - // - if (CopyLen != 0) { - Data = NetbufAllocSpace (Nbuf, CopyLen, NET_BUF_TAIL); - ASSERT (Data != NULL); - - if ((INT32) NetbufCopy (Node, Offset, CopyLen, Data) != CopyLen) { - goto OnError; - } - } - - CopyMem (TCPSEG_NETBUF (Nbuf), Seg, sizeof (TCP_SEG)); - - TCPSEG_NETBUF (Nbuf)->Seq = Seq; - TCPSEG_NETBUF (Nbuf)->End = End; - TCPSEG_NETBUF (Nbuf)->Flag = Flag; - - return Nbuf; - -OnError: - NetbufFree (Nbuf); - return NULL; -} - - -/** - Get a segment from the Tcb's socket buffer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSock ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ) -{ - NET_BUF *Nbuf; - UINT8 *Data; - UINT32 DataGet; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); - - if (Nbuf == NULL) { - DEBUG ((EFI_D_ERROR, "TcpGetSegmentSock: failed to allocate " - "a netbuf for TCB %p\n",Tcb)); - - return NULL; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - DataGet = 0; - - if (Len != 0) { - // - // copy data to the segment. - // - Data = NetbufAllocSpace (Nbuf, Len, NET_BUF_TAIL); - ASSERT (Data != NULL); - - DataGet = SockGetDataToSend (Tcb->Sk, 0, Len, Data); - } - - NET_GET_REF (Nbuf); - - TCPSEG_NETBUF (Nbuf)->Seq = Seq; - TCPSEG_NETBUF (Nbuf)->End = Seq + Len; - - InsertTailList (&(Tcb->SndQue), &(Nbuf->List)); - - if (DataGet != 0) { - - SockDataSent (Tcb->Sk, DataGet); - } - - return Nbuf; -} - - -/** - Get a segment starting from sequence Seq of a maximum - length of Len. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegment ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ) -{ - NET_BUF *Nbuf; - - ASSERT (Tcb != NULL); - - // - // Compare the SndNxt with the max sequence number sent. - // - if ((Len != 0) && TCP_SEQ_LT (Seq, TcpGetMaxSndNxt (Tcb))) { - - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); - } else { - - Nbuf = TcpGetSegmentSock (Tcb, Seq, Len); - } - - ASSERT (TcpVerifySegment (Nbuf) != 0); - return Nbuf; -} - - -/** - Retransmit the segment from sequence Seq. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment to be retransmitted. - - @retval 0 Retransmission succeeded. - @retval -1 Error condition occurred. - -**/ -INTN -TcpRetransmit ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq - ) -{ - NET_BUF *Nbuf; - UINT32 Len; - - // - // Compute the maxium length of retransmission. It is - // limited by three factors: - // 1. Less than SndMss - // 2. must in the current send window - // 3. will not change the boundaries of queued segments. - // - - // - // Handle the Window Retraction if TCP window scale is enabled according to RFC7323: - // On first retransmission, or if the sequence number is out of - // window by less than 2^Rcv.Wind.Shift, then do normal - // retransmission(s) without regard to the receiver window as long - // as the original segment was in window when it was sent. - // - if ((Tcb->SndWndScale != 0) && - (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax) || TCP_SEQ_BETWEEN (Tcb->SndWl2 + Tcb->SndWnd, Seq, Tcb->SndWl2 + Tcb->SndWnd + (1 << Tcb->SndWndScale)))) { - Len = TCP_SUB_SEQ (Tcb->SndNxt, Seq); - DEBUG ( - (EFI_D_WARN, - "TcpRetransmit: retransmission without regard to the receiver window for TCB %p\n", - Tcb) - ); - - } else if (TCP_SEQ_GEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq)) { - Len = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq); - - } else { - DEBUG ( - (EFI_D_WARN, - "TcpRetransmit: retransmission cancelled because send window too small for TCB %p\n", - Tcb) - ); - - return 0; - } - - Len = MIN (Len, Tcb->SndMss); - - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); - if (Nbuf == NULL) { - return -1; - } - - ASSERT (TcpVerifySegment (Nbuf) != 0); - - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { - goto OnError; - } - - if (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax)) { - Tcb->RetxmitSeqMax = Seq; - } - - // - // The retransmitted buffer may be on the SndQue, - // trim TCP head because all the buffer on SndQue - // are headless. - // - ASSERT (Nbuf->Tcp != NULL); - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - NetbufFree (Nbuf); - return 0; - -OnError: - if (Nbuf != NULL) { - NetbufFree (Nbuf); - } - - return -1; -} - - -/** - Check whether to send data/SYN/FIN and piggy back an ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The number of bytes sent. - -**/ -INTN -TcpToSendData ( - IN OUT TCP_CB *Tcb, - IN INTN Force - ) -{ - UINT32 Len; - INTN Sent; - UINT8 Flag; - NET_BUF *Nbuf; - TCP_SEG *Seg; - TCP_SEQNO Seq; - TCP_SEQNO End; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL) && (Tcb->State != TCP_LISTEN)); - - Sent = 0; - - if ((Tcb->State == TCP_CLOSED) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT)) { - - return 0; - } - -SEND_AGAIN: - // - // compute how much data can be sent - // - Len = TcpDataToSend (Tcb, Force); - Seq = Tcb->SndNxt; - - ASSERT ((Tcb->State) < (ARRAY_SIZE (mTcpOutFlag))); - Flag = mTcpOutFlag[Tcb->State]; - - if ((Flag & TCP_FLG_SYN) != 0) { - - Seq = Tcb->Iss; - Len = 0; - } - - // - // only send a segment without data if SYN or - // FIN is set. - // - if ((Len == 0) && - ((Flag & (TCP_FLG_SYN | TCP_FLG_FIN)) == 0)) { - return Sent; - } - - Nbuf = TcpGetSegment (Tcb, Seq, Len); - - if (Nbuf == NULL) { - DEBUG ( - (EFI_D_ERROR, - "TcpToSendData: failed to get a segment for TCB %p\n", - Tcb) - ); - - goto OnError; - } - - Seg = TCPSEG_NETBUF (Nbuf); - - // - // Set the TcpSeg in Nbuf. - // - Len = Nbuf->TotalSize; - End = Seq + Len; - if (TCP_FLG_ON (Flag, TCP_FLG_SYN)) { - End++; - } - - if ((Flag & TCP_FLG_FIN) != 0) { - // - // Send FIN if all data is sent, and FIN is - // in the window - // - if ((TcpGetMaxSndNxt (Tcb) == Tcb->SndNxt) && - (GET_SND_DATASIZE (Tcb->Sk) == 0) && - TCP_SEQ_LT (End + 1, Tcb->SndWnd + Tcb->SndWl2)) { - - DEBUG ( - (EFI_D_NET, - "TcpToSendData: send FIN " - "to peer for TCB %p in state %s\n", - Tcb, - mTcpStateName[Tcb->State]) - ); - - End++; - } else { - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); - } - } - - Seg->Seq = Seq; - Seg->End = End; - Seg->Flag = Flag; - - ASSERT (TcpVerifySegment (Nbuf) != 0); - ASSERT (TcpCheckSndQue (&Tcb->SndQue) != 0); - - // - // don't send an empty segment here. - // - if (Seg->End == Seg->Seq) { - DEBUG ((EFI_D_WARN, "TcpToSendData: created a empty" - " segment for TCB %p, free it now\n", Tcb)); - - NetbufFree (Nbuf); - return Sent; - } - - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - if ((Flag & TCP_FLG_FIN) != 0) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); - } - - goto OnError; - } - - Sent += TCP_SUB_SEQ (End, Seq); - - // - // All the buffer in the SndQue is headless - // - ASSERT (Nbuf->Tcp != NULL); - - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - NetbufFree (Nbuf); - - // - // update status in TCB - // - Tcb->DelayedAck = 0; - - if ((Flag & TCP_FLG_FIN) != 0) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); - } - - if (TCP_SEQ_GT (End, Tcb->SndNxt)) { - Tcb->SndNxt = End; - } - - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); - } - - // - // Enable RTT measurement only if not in retransmit. - // Karn's algorithm reqires not to update RTT when in loss. - // - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - - DEBUG ((EFI_D_NET, "TcpToSendData: set RTT measure " - "sequence %d for TCB %p\n", Seq, Tcb)); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - Tcb->RttSeq = Seq; - Tcb->RttMeasure = 0; - } - - if (Len == Tcb->SndMss) { - goto SEND_AGAIN; - } - - return Sent; - -OnError: - if (Nbuf != NULL) { - NetbufFree (Nbuf); - } - - return Sent; -} - - -/** - Send an ACK immediately. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSendAck ( - IN OUT TCP_CB *Tcb - ) -{ - NET_BUF *Nbuf; - TCP_SEG *Seg; - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - Seg = TCPSEG_NETBUF (Nbuf); - Seg->Seq = Tcb->SndNxt; - Seg->End = Tcb->SndNxt; - Seg->Flag = TCP_FLG_ACK; - - if (TcpTransmitSegment (Tcb, Nbuf) == 0) { - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - Tcb->DelayedAck = 0; - } - - NetbufFree (Nbuf); -} - - -/** - Send a zero probe segment. It can be used by keepalive and zero window probe. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 The zero probe segment was sent out successfully. - @retval other Error condition occurred. - -**/ -INTN -TcpSendZeroProbe ( - IN OUT TCP_CB *Tcb - ) -{ - NET_BUF *Nbuf; - TCP_SEG *Seg; - INTN Result; - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return -1; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - // - // SndNxt-1 is out of window. The peer should respond - // with an ACK. - // - Seg = TCPSEG_NETBUF (Nbuf); - Seg->Seq = Tcb->SndNxt - 1; - Seg->End = Tcb->SndNxt - 1; - Seg->Flag = TCP_FLG_ACK; - - Result = TcpTransmitSegment (Tcb, Nbuf); - NetbufFree (Nbuf); - - return Result; -} - - -/** - Check whether to send an ACK or delayed ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpToSendAck ( - IN OUT TCP_CB *Tcb - ) -{ - UINT32 TcpNow; - - TcpNow = TcpRcvWinNow (Tcb); - // - // Generally, TCP should send a delayed ACK unless: - // 1. ACK at least every other FULL sized segment received, - // 2. Packets received out of order - // 3. Receiving window is open - // - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || - (Tcb->DelayedAck >= 1) || - (TcpNow > TcpRcvWinOld (Tcb))) { - TcpSendAck (Tcb); - return; - } - - DEBUG ((EFI_D_NET, "TcpToSendAck: scheduled a delayed" - " ACK for TCB %p\n", Tcb)); - - // - // schedule a delayed ACK - // - Tcb->DelayedAck++; -} - - -/** - Send a RESET segment in response to the segment received. - - @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL. - @param Head TCP header of the segment that triggers the reset. - @param Len Length of the segment that triggers the reset. - @param Local Local IP address. - @param Remote Remote peer's IP address. - - @retval 0 A reset is sent or no need to send it. - @retval -1 No reset is sent. - -**/ -INTN -TcpSendReset ( - IN TCP_CB *Tcb, - IN TCP_HEAD *Head, - IN INT32 Len, - IN UINT32 Local, - IN UINT32 Remote - ) -{ - NET_BUF *Nbuf; - TCP_HEAD *Nhead; - UINT16 HeadSum; - - // - // Don't respond to a Reset with reset - // - if ((Head->Flag & TCP_FLG_RST) != 0) { - return 0; - } - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return -1; - } - - Nhead = (TCP_HEAD *) NetbufAllocSpace ( - Nbuf, - sizeof (TCP_HEAD), - NET_BUF_TAIL - ); - - ASSERT (Nhead != NULL); - - Nbuf->Tcp = Nhead; - Nhead->Flag = TCP_FLG_RST; - - // - // Derive Seq/ACK from the segment if no TCB - // associated with it, otherwise from the Tcb - // - if (Tcb == NULL) { - - if (TCP_FLG_ON (Head->Flag, TCP_FLG_ACK)) { - Nhead->Seq = Head->Ack; - Nhead->Ack = 0; - } else { - Nhead->Seq = 0; - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); - Nhead->Ack = HTONL (NTOHL (Head->Seq) + Len); - } - } else { - - Nhead->Seq = HTONL (Tcb->SndNxt); - Nhead->Ack = HTONL (Tcb->RcvNxt); - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); - } - - Nhead->SrcPort = Head->DstPort; - Nhead->DstPort = Head->SrcPort; - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); - Nhead->Res = 0; - Nhead->Wnd = HTONS (0xFFFF); - Nhead->Checksum = 0; - Nhead->Urg = 0; - - HeadSum = NetPseudoHeadChecksum (Local, Remote, 6, 0); - Nhead->Checksum = TcpChecksum (Nbuf, HeadSum); - - TcpSendIpPacket (Tcb, Nbuf, Local, Remote); - - NetbufFree (Nbuf); - return 0; -} - - -/** - Verify that the segment is in good shape. - - @param Nbuf Buffer that contains the segment to be checked. - - @retval 0 The segment is broken. - @retval 1 The segment is in good shape. - -**/ -INTN -TcpVerifySegment ( - IN NET_BUF *Nbuf - ) -{ - TCP_HEAD *Head; - TCP_SEG *Seg; - UINT32 Len; - - if (Nbuf == NULL) { - return 1; - } - - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); - - Seg = TCPSEG_NETBUF (Nbuf); - Len = Nbuf->TotalSize; - Head = Nbuf->Tcp; - - if (Head != NULL) { - if (Head->Flag != Seg->Flag) { - return 0; - } - - Len -= (Head->HeadLen << 2); - } - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - Len++; - } - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - Len++; - } - - if (Seg->Seq + Len != Seg->End) { - return 0; - } - - return 1; -} - - -/** - Verify that all the segments in SndQue are in good shape. - - @param Head Pointer to the head node of the SndQue. - - @retval 0 At least one segment is broken. - @retval 1 All segments in the specific queue are in good shape. - -**/ -INTN -TcpCheckSndQue ( - IN LIST_ENTRY *Head - ) -{ - LIST_ENTRY *Entry; - NET_BUF *Nbuf; - TCP_SEQNO Seq; - - if (IsListEmpty (Head)) { - return 1; - } - // - // Initialize the Seq - // - Entry = Head->ForwardLink; - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - Seq = TCPSEG_NETBUF (Nbuf)->Seq; - - NET_LIST_FOR_EACH (Entry, Head) { - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - - if (TcpVerifySegment (Nbuf) == 0) { - return 0; - } - - // - // All the node in the SndQue should has: - // SEG.SEQ = LAST_SEG.END - // - if (Seq != TCPSEG_NETBUF (Nbuf)->Seq) { - return 0; - } - - Seq = TCPSEG_NETBUF (Nbuf)->End; - } - - return 1; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c deleted file mode 100644 index 4cb0ee7b5e6f..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c +++ /dev/null @@ -1,584 +0,0 @@ -/** @file - TCP timer related functions. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -UINT32 mTcpTick = 1000; - -/** - Connect timeout handler. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpConnectTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for TCP retransmission timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpRexmitTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for window probe timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpProbeTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for keepalive timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpKeepaliveTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for FIN_WAIT_2 timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpFinwait2Timeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for 2MSL timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -Tcp2MSLTimeout ( - IN OUT TCP_CB *Tcb - ); - -TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = { - TcpConnectTimeout, - TcpRexmitTimeout, - TcpProbeTimeout, - TcpKeepaliveTimeout, - TcpFinwait2Timeout, - Tcp2MSLTimeout, -}; - -/** - Close the TCP connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClose ( - IN OUT TCP_CB *Tcb - ) -{ - NetbufFreeList (&Tcb->SndQue); - NetbufFreeList (&Tcb->RcvQue); - - TcpSetState (Tcb, TCP_CLOSED); -} - - -/** - Connect timeout handler. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpConnectTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - if (!TCP_CONNECTED (Tcb->State)) { - DEBUG ((EFI_D_ERROR, "TcpConnectTimeout: connection closed " - "because conenction timer timeout for TCB %p\n", Tcb)); - - if (EFI_ABORTED == Tcb->Sk->SockError) { - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); - } - - if (TCP_SYN_RCVD == Tcb->State) { - DEBUG ((EFI_D_WARN, "TcpConnectTimeout: send reset because " - "connection timer timeout for TCB %p\n", Tcb)); - - TcpResetConnection (Tcb); - - } - - TcpClose (Tcb); - } -} - - -/** - Timeout handler for TCP retransmission timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpRexmitTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - UINT32 FlightSize; - - DEBUG ((EFI_D_WARN, "TcpRexmitTimeout: transmission " - "timeout for TCB %p\n", Tcb)); - - // - // Set the congestion window. FlightSize is the - // amount of data that has been sent but not - // yet ACKed. - // - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); - Tcb->Ssthresh = MAX ((UINT32) (2 * Tcb->SndMss), FlightSize / 2); - - Tcb->CWnd = Tcb->SndMss; - Tcb->LossRecover = Tcb->SndNxt; - - Tcb->LossTimes++; - if ((Tcb->LossTimes > Tcb->MaxRexmit) && - !TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_CONNECT)) { - - DEBUG ((EFI_D_ERROR, "TcpRexmitTimeout: connection closed " - "because too many timeouts for TCB %p\n", Tcb)); - - if (EFI_ABORTED == Tcb->Sk->SockError) { - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); - } - - TcpClose (Tcb); - return ; - } - - TcpBackoffRto (Tcb); - TcpRetransmit (Tcb, Tcb->SndUna); - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); - - Tcb->CongestState = TCP_CONGEST_LOSS; - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); -} - - -/** - Timeout handler for window probe timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpProbeTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - // - // This is the timer for sender's SWSA. RFC1122 requires - // a timer set for sender's SWSA, and suggest combine it - // with window probe timer. If data is sent, don't set - // the probe timer, since retransmit timer is on. - // - if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) { - - ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0); - Tcb->ProbeTimerOn = FALSE; - return ; - } - - TcpSendZeroProbe (Tcb); - TcpSetProbeTimer (Tcb); -} - - -/** - Timeout handler for keepalive timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpKeepaliveTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - Tcb->KeepAliveProbes++; - - // - // Too many Keep-alive probes, drop the connection - // - if (Tcb->KeepAliveProbes > Tcb->MaxKeepAlive) { - - if (EFI_ABORTED == Tcb->Sk->SockError) { - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); - } - - TcpClose (Tcb); - return ; - } - - TcpSendZeroProbe (Tcb); - TcpSetKeepaliveTimer (Tcb); -} - - -/** - Timeout handler for FIN_WAIT_2 timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpFinwait2Timeout ( - IN OUT TCP_CB *Tcb - ) -{ - DEBUG ((EFI_D_WARN, "TcpFinwait2Timeout: connection closed " - "because FIN_WAIT2 timer timeouts for TCB %p\n", Tcb)); - - TcpClose (Tcb); -} - - -/** - Timeout handler for 2MSL timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -Tcp2MSLTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - DEBUG ((EFI_D_WARN, "Tcp2MSLTimeout: connection closed " - "because TIME_WAIT timer timeouts for TCB %p\n", Tcb)); - - TcpClose (Tcb); -} - - -/** - Update the timer status and the next expire time according to the timers - to expire in a specific future time slot. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpUpdateTimer ( - IN OUT TCP_CB *Tcb - ) -{ - UINT16 Index; - - // - // Don't use a too large value to init NextExpire - // since mTcpTick wraps around as sequence no does. - // - Tcb->NextExpire = 65535; - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); - - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { - - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && - TCP_TIME_LT (Tcb->Timer[Index], mTcpTick + Tcb->NextExpire)) { - - Tcb->NextExpire = TCP_SUB_TIME (Tcb->Timer[Index], mTcpTick); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); - } - } -} - - -/** - Enable a TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be enabled. - @param TimeOut The timeout value of this timer. - -**/ -VOID -TcpSetTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer, - IN UINT32 TimeOut - ) -{ - TCP_SET_TIMER (Tcb->EnabledTimer, Timer); - Tcb->Timer[Timer] = mTcpTick + TimeOut; - - TcpUpdateTimer (Tcb); -} - - -/** - Clear one TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be cleared. - -**/ -VOID -TcpClearTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer - ) -{ - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Timer); - TcpUpdateTimer (Tcb); -} - - -/** - Clear all TCP timers. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClearAllTimer ( - IN OUT TCP_CB *Tcb - ) -{ - Tcb->EnabledTimer = 0; - TcpUpdateTimer (Tcb); -} - - -/** - Enable the window prober timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetProbeTimer ( - IN OUT TCP_CB *Tcb - ) -{ - if (!Tcb->ProbeTimerOn) { - Tcb->ProbeTime = Tcb->Rto; - Tcb->ProbeTimerOn = TRUE; - - } else { - Tcb->ProbeTime <<= 1; - } - - if (Tcb->ProbeTime < TCP_RTO_MIN) { - - Tcb->ProbeTime = TCP_RTO_MIN; - } else if (Tcb->ProbeTime > TCP_RTO_MAX) { - - Tcb->ProbeTime = TCP_RTO_MAX; - } - - TcpSetTimer (Tcb, TCP_TIMER_PROBE, Tcb->ProbeTime); -} - - -/** - Enable the keepalive timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetKeepaliveTimer ( - IN OUT TCP_CB *Tcb - ) -{ - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE)) { - return ; - - } - - // - // Set the timer to KeepAliveIdle if either - // 1. the keepalive timer is off - // 2. The keepalive timer is on, but the idle - // is less than KeepAliveIdle, that means the - // connection is alive since our last probe. - // - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_KEEPALIVE) || - (Tcb->Idle < Tcb->KeepAliveIdle)) { - - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAliveIdle); - Tcb->KeepAliveProbes = 0; - - } else { - - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAlivePeriod); - } -} - - -/** - Backoff the RTO. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpBackoffRto ( - IN OUT TCP_CB *Tcb - ) -{ - // - // Fold the RTT estimate if too many times, the estimate - // may be wrong, fold it. So the next time a valid - // measurement is sampled, we can start fresh. - // - if ((Tcb->LossTimes >= TCP_FOLD_RTT) && (Tcb->SRtt != 0)) { - Tcb->RttVar += Tcb->SRtt >> 2; - Tcb->SRtt = 0; - } - - Tcb->Rto <<= 1; - - if (Tcb->Rto < TCP_RTO_MIN) { - - Tcb->Rto = TCP_RTO_MIN; - } else if (Tcb->Rto > TCP_RTO_MAX) { - - Tcb->Rto = TCP_RTO_MAX; - } -} - - -/** - Heart beat timer handler. - - @param Context Context of the timer event, ignored. - -**/ -VOID -EFIAPI -TcpTickingDpc ( - IN VOID *Context - ) -{ - LIST_ENTRY *Entry; - LIST_ENTRY *Next; - TCP_CB *Tcb; - INT16 Index; - - mTcpTick++; - mTcpGlobalIss += 100; - - // - // Don't use LIST_FOR_EACH, which isn't delete safe. - // - for (Entry = mTcpRunQue.ForwardLink; Entry != &mTcpRunQue; Entry = Next) { - - Next = Entry->ForwardLink; - - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (Tcb->State == TCP_CLOSED) { - continue; - } - // - // The connection is doing RTT measurement. - // - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - Tcb->RttMeasure++; - } - - Tcb->Idle++; - - if (Tcb->DelayedAck != 0) { - TcpSendAck (Tcb); - } - - // - // No timer is active or no timer expired - // - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON) || - ((--Tcb->NextExpire) > 0)) { - - continue; - } - - // - // Call the timeout handler for each expired timer. - // - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { - - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && - TCP_TIME_LEQ (Tcb->Timer[Index], mTcpTick)) { - // - // disable the timer before calling the handler - // in case the handler enables it again. - // - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Index); - mTcpTimerHandler[Index](Tcb); - - // - // The Tcb may have been deleted by the timer, or - // no other timer is set. - // - if ((Next->BackLink != Entry) || - (Tcb->EnabledTimer == 0)) { - break; - } - } - } - - // - // If the Tcb still exist or some timer is set, update the timer - // - if (Index == TCP_TIMER_NUMBER) { - TcpUpdateTimer (Tcb); - } - } -} - -/** - Heart beat timer handler, queues the DPC at TPL_CALLBACK. - - @param Event Timer event signaled, ignored. - @param Context Context of the timer event, ignored. - -**/ -VOID -EFIAPI -TcpTicking ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - QueueDpc (TPL_CALLBACK, TcpTickingDpc, Context); -} - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c deleted file mode 100644 index a085ef61f341..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c +++ /dev/null @@ -1,365 +0,0 @@ -/** @file - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -// -// EFI Component Name Functions -// -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName = { - PxeBcComponentNameGetDriverName, - PxeBcComponentNameGetControllerName, - "eng" -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeBcComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeBcComponentNameGetControllerName, - "en" -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcDriverNameTable[] = { - { - "eng;en", - L"UEFI PXE Base Code Driver" - }, - { - NULL, - NULL - } -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcControllerNameTable[] = { - { - "eng;en", - L"PXE Controller" - }, - { - NULL, - NULL - } -}; - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mPxeBcDriverNameTable, - DriverName, - (BOOLEAN)(This == &gPxeBcComponentName) - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_HANDLE NicHandle; - EFI_STATUS Status; - - if (ControllerHandle == NULL || ChildHandle != NULL) { - return EFI_UNSUPPORTED; - } - - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid); - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid); - - if (NicHandle == NULL) { - return EFI_UNSUPPORTED; - } - } - } - } - } - - Status = gBS->OpenProtocol ( - NicHandle, - &gEfiPxeBaseCodeProtocolGuid, - (VOID **) &PxeBc, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mPxeBcControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gPxeBcComponentName) - ); -} diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c deleted file mode 100644 index f7b975f2997f..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c +++ /dev/null @@ -1,1999 +0,0 @@ -/** @file - Support for PxeBc dhcp functions. - -Copyright (c) 2013, Red Hat, Inc. -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -// -// This is a map from the interested DHCP4 option tags' index to the tag value. -// -UINT8 mInterestedDhcp4Tags[PXEBC_DHCP4_TAG_INDEX_MAX] = { - DHCP4_TAG_BOOTFILE_LEN, - DHCP4_TAG_VENDOR, - DHCP4_TAG_OVERLOAD, - DHCP4_TAG_MSG_TYPE, - DHCP4_TAG_SERVER_ID, - DHCP4_TAG_VENDOR_CLASS_ID, - DHCP4_TAG_BOOTFILE -}; - - -/** - This function initialize the DHCP4 message instance. - - This function will pad each item of dhcp4 message packet. - - @param Seed Pointer to the message instance of the DHCP4 packet. - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - -**/ -VOID -PxeBcInitSeedPacket ( - IN EFI_DHCP4_PACKET *Seed, - IN EFI_UDP4_PROTOCOL *Udp4 - ) -{ - EFI_SIMPLE_NETWORK_MODE Mode; - EFI_DHCP4_HEADER *Header; - - Udp4->GetModeData (Udp4, NULL, NULL, NULL, &Mode); - - Seed->Size = sizeof (EFI_DHCP4_PACKET); - Seed->Length = sizeof (Seed->Dhcp4); - - Header = &Seed->Dhcp4.Header; - - ZeroMem (Header, sizeof (EFI_DHCP4_HEADER)); - Header->OpCode = PXEBC_DHCP4_OPCODE_REQUEST; - Header->HwType = Mode.IfType; - Header->HwAddrLen = (UINT8) Mode.HwAddressSize; - CopyMem (Header->ClientHwAddr, &Mode.CurrentAddress, Header->HwAddrLen); - - Seed->Dhcp4.Magik = PXEBC_DHCP4_MAGIC; - Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP; -} - - -/** - Copy the DCHP4 packet from srouce to destination. - - @param[in] Dst Pointer to the cache buffer for DHCPv4 packet. - @param[in] Src Pointer to the DHCPv4 packet to be cached. - - @retval EFI_SUCCESS Packet is copied. - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold the packet. - -**/ -EFI_STATUS -PxeBcCopyEfiDhcp4Packet ( - IN EFI_DHCP4_PACKET *Dst, - IN EFI_DHCP4_PACKET *Src - ) -{ - if (Dst->Size < Src->Length) { - return EFI_BUFFER_TOO_SMALL; - } - - CopyMem (&Dst->Dhcp4, &Src->Dhcp4, Src->Length); - Dst->Length = Src->Length; - return EFI_SUCCESS; -} - - -/** - Copy the dhcp4 packet to the PxeBc private data and parse the dhcp4 packet. - - @param Private Pointer to PxeBc private data. - @param OfferIndex Index of cached packets as complements of pxe mode data, - the index is maximum offer number. - - @retval EFI_SUCCESS Cache and parse the packet successfully. - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold the packet. - -**/ -EFI_STATUS -PxeBcCopyProxyOffer ( - IN PXEBC_PRIVATE_DATA *Private, - IN UINT32 OfferIndex - ) -{ - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PACKET *Offer; - EFI_STATUS Status; - - ASSERT (OfferIndex < Private->NumOffers); - ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM); - - Mode = Private->PxeBc.Mode; - Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer; - - Status = PxeBcCopyEfiDhcp4Packet (&Private->ProxyOffer.Packet.Offer, Offer); - if (EFI_ERROR(Status)) { - return Status; - } - CopyMem (&Mode->ProxyOffer, &Offer->Dhcp4, Offer->Length); - Mode->ProxyOfferReceived = TRUE; - - PxeBcParseCachedDhcpPacket (&Private->ProxyOffer); - return EFI_SUCCESS; -} - - -/** - Parse the cached dhcp packet. - - @param CachedPacket Pointer to cached dhcp packet. - - @retval TRUE Succeed to parse and validation. - @retval FALSE Fail to parse or validation. - -**/ -BOOLEAN -PxeBcParseCachedDhcpPacket ( - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket - ) -{ - EFI_DHCP4_PACKET *Offer; - EFI_DHCP4_PACKET_OPTION **Options; - EFI_DHCP4_PACKET_OPTION *Option; - UINT8 OfferType; - UINTN Index; - UINT8 *Ptr8; - - CachedPacket->IsPxeOffer = FALSE; - ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket->Dhcp4Option)); - ZeroMem (&CachedPacket->PxeVendorOption, sizeof (CachedPacket->PxeVendorOption)); - - Offer = &CachedPacket->Packet.Offer; - Options = CachedPacket->Dhcp4Option; - - // - // Parse interested dhcp options and store their pointers in CachedPacket->Dhcp4Option. - // First, try to parse DHCPv4 options from the DHCP optional parameters field. - // - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { - Options[Index] = PxeBcParseExtendOptions ( - Offer->Dhcp4.Option, - GET_OPTION_BUFFER_LEN (Offer), - mInterestedDhcp4Tags[Index] - ); - } - // - // Second, Check if bootfilename and serverhostname is overloaded to carry DHCP options refers to rfc-2132. - // If yes, try to parse options from the BootFileName field, then ServerName field. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]; - if (Option != NULL) { - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) != 0) { - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { - if (Options[Index] == NULL) { - Options[Index] = PxeBcParseExtendOptions ( - (UINT8 *) Offer->Dhcp4.Header.BootFileName, - sizeof (Offer->Dhcp4.Header.BootFileName), - mInterestedDhcp4Tags[Index] - ); - } - } - } - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_SERVER_NAME) != 0) { - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { - if (Options[Index] == NULL) { - Options[Index] = PxeBcParseExtendOptions ( - (UINT8 *) Offer->Dhcp4.Header.ServerName, - sizeof (Offer->Dhcp4.Header.ServerName), - mInterestedDhcp4Tags[Index] - ); - } - } - } - } - - // - // Check whether is an offer with PXEClient or not. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_CLASS_ID]; - if ((Option != NULL) && (Option->Length >= 9) && - (CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 9) == 0)) { - - CachedPacket->IsPxeOffer = TRUE; - } - - // - // Parse pxe vendor options and store their content/pointers in CachedPacket->PxeVendorOption. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_VENDOR]; - if (CachedPacket->IsPxeOffer && (Option != NULL)) { - - if (!PxeBcParseVendorOptions (Option, &CachedPacket->PxeVendorOption)) { - return FALSE; - } - } - - - // - // Parse PXE boot file name: - // According to PXE spec, boot file name should be read from DHCP option 67 (bootfile name) if present. - // Otherwise, read from boot file field in DHCP header. - // - if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { - // - // RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is null - // terminated string. So force to append null terminated character at the end of string. - // - Ptr8 = (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data[0]; - Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length; - if (*(Ptr8 - 1) != '\0') { - *Ptr8 = '\0'; - } - } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) { - // - // If the bootfile is not present and bootfilename is present in dhcp packet, just parse it. - // And do not count dhcp option header, or else will destroy the serverhostname. - // - // Make sure "BootFileName" is not overloaded. - // - if (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD] == NULL || - (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) == 0) { - Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] = (EFI_DHCP4_PACKET_OPTION *) (&Offer->Dhcp4.Header.BootFileName[0] - - OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0])); - } - } - - // - // Determine offer type of the dhcp packet. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_MSG_TYPE]; - if ((Option == NULL) || (Option->Data[0] == 0)) { - // - // It's a bootp offer - // - Option = CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]; - if (Option == NULL) { - // - // bootp offer without bootfilename, discard it. - // - return FALSE; - } - - OfferType = DHCP4_PACKET_TYPE_BOOTP; - - } else { - - if (IS_VALID_DISCOVER_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) { - // - // It's a pxe10 offer with PXEClient and discover vendor option. - // - OfferType = DHCP4_PACKET_TYPE_PXE10; - } else if (IS_VALID_MTFTP_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) { - // - // It's a wfm11a offer with PXEClient and mtftp vendor option, and - // return false since mtftp not supported currently. - // - return FALSE; - } else { - // - // If the binl offer with only PXEClient. - // - OfferType = (UINT8) ((CachedPacket->IsPxeOffer) ? DHCP4_PACKET_TYPE_BINL : DHCP4_PACKET_TYPE_DHCP_ONLY); - } - } - - CachedPacket->OfferType = OfferType; - - return TRUE; -} - - -/** - Offer dhcp service with a BINL dhcp offer. - - @param Private Pointer to PxeBc private data. - @param Index Index of cached packets as complements of pxe mode data, - the index is maximum offer number. - - @retval TRUE Offer the service successfully under priority BINL. - @retval FALSE Boot Service failed, parse cached dhcp packet failed or this - BINL ack cannot find options set or bootfile name specified. - -**/ -BOOLEAN -PxeBcTryBinl ( - IN PXEBC_PRIVATE_DATA *Private, - IN UINT32 Index - ) -{ - EFI_DHCP4_PACKET *Offer; - EFI_IP_ADDRESS ServerIp; - EFI_STATUS Status; - PXEBC_CACHED_DHCP4_PACKET *CachedPacket; - EFI_DHCP4_PACKET *Reply; - - ASSERT (Index < PXEBC_MAX_OFFER_NUM); - ASSERT (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL); - - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; - - // - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier) - // in DHCPOFFER packet. - // (It does not comply with PXE Spec, Ver2.1) - // - if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, &mZeroIp4Addr)) { - CopyMem ( - &ServerIp.Addr[0], - Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data, - sizeof (EFI_IPv4_ADDRESS) - ); - } else { - CopyMem ( - &ServerIp.Addr[0], - &Offer->Dhcp4.Header.ServerAddr, - sizeof (EFI_IPv4_ADDRESS) - ); - } - if (ServerIp.Addr[0] == 0) { - return FALSE; - } - - CachedPacket = &Private->ProxyOffer; - Reply = &CachedPacket->Packet.Offer; - - Status = PxeBcDiscvBootService ( - Private, - 0, - NULL, - FALSE, - &ServerIp, - 0, - NULL, - FALSE, - Reply - ); - if (EFI_ERROR (Status)) { - return FALSE; - } - - if (!PxeBcParseCachedDhcpPacket (CachedPacket)) { - return FALSE; - } - - if ((CachedPacket->OfferType != DHCP4_PACKET_TYPE_PXE10) && - (CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL)) { - // - // This BINL ack doesn't have discovery options set or bootfile name - // specified. - // - return FALSE; - } - - Private->PxeBc.Mode->ProxyOfferReceived = TRUE; - CopyMem (&Private->PxeBc.Mode->ProxyOffer, &Reply->Dhcp4, Reply->Length); - - return TRUE; -} - - -/** - Offer dhcp service for each proxy with a BINL dhcp offer. - - @param Private Pointer to PxeBc private data - @param OfferIndex Pointer to the index of cached packets as complements of - pxe mode data, the index is maximum offer number. - - @return If there is no service needed offer return FALSE, otherwise TRUE. - -**/ -BOOLEAN -PxeBcTryBinlProxy ( - IN PXEBC_PRIVATE_DATA *Private, - OUT UINT32 *OfferIndex - ) -{ - UINT32 Index; - - for (Index = 0; Index < Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]; Index++) { - - *OfferIndex = Private->BinlIndex[Index]; - // - // Try this BINL proxy offer - // - if (PxeBcTryBinl (Private, *OfferIndex)) { - return TRUE; - } - } - - return FALSE; -} - - -/** - This function is to check the selected proxy offer (include BINL dhcp offer and - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code - mode structure. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Operational successful. - @retval EFI_NO_RESPONSE Offer dhcp service failed. - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base code mode. - -**/ -EFI_STATUS -PxeBcCheckSelectedOffer ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - PXEBC_CACHED_DHCP4_PACKET *SelectedOffer; - EFI_DHCP4_PACKET_OPTION **Options; - UINT32 Index; - EFI_DHCP4_PACKET *Offer; - UINT32 ProxyOfferIndex; - EFI_STATUS Status; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PACKET *Ack; - - ASSERT (Private->SelectedOffer != 0); - - Status = EFI_SUCCESS; - SelectedOffer = &Private->Dhcp4Offers[Private->SelectedOffer - 1]; - Options = SelectedOffer->Dhcp4Option; - - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BINL) { - // - // The addresses are acquired from a BINL dhcp offer, try BINL to get - // the bootfile name - // - if (!PxeBcTryBinl (Private, Private->SelectedOffer - 1)) { - Status = EFI_NO_RESPONSE; - } - } else if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) { - // - // The selected offer to finish the D.O.R.A. is a DHCP only offer, we need - // try proxy offers if there are some, othewise the bootfile name must be - // set in this DHCP only offer. - // - if (Private->GotProxyOffer) { - // - // Get rid of the compiler warning. - // - ProxyOfferIndex = 0; - if (Private->SortOffers) { - // - // The offers are sorted before selecting, the proxy offer type must be - // already determined. - // - ASSERT (Private->ProxyIndex[Private->ProxyOfferType] > 0); - - if (Private->ProxyOfferType == DHCP4_PACKET_TYPE_BINL) { - // - // We buffer all received BINL proxy offers, try them all one by one - // - if (!PxeBcTryBinlProxy (Private, &ProxyOfferIndex)) { - Status = EFI_NO_RESPONSE; - } - } else { - // - // For other types, only one proxy offer is buffered. - // - ProxyOfferIndex = Private->ProxyIndex[Private->ProxyOfferType] - 1; - } - } else { - // - // The proxy offer type is not determined, choose proxy offer in the - // received order. - // - Status = EFI_NO_RESPONSE; - - ASSERT (Private->NumOffers < PXEBC_MAX_OFFER_NUM); - for (Index = 0; Index < Private->NumOffers; Index++) { - - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; - if (!IS_PROXY_DHCP_OFFER (Offer)) { - // - // Skip non proxy dhcp offers. - // - continue; - } - - if (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL) { - // - // Try BINL - // - if (!PxeBcTryBinl (Private, Index)) { - // - // Failed, skip to the next offer - // - continue; - } - } - - Private->ProxyOfferType = Private->Dhcp4Offers[Index].OfferType; - ProxyOfferIndex = Index; - Status = EFI_SUCCESS; - break; - } - } - - if (!EFI_ERROR (Status) && (Private->ProxyOfferType != DHCP4_PACKET_TYPE_BINL)) { - // - // Copy the proxy offer to Mode and set the flag - // - Status = PxeBcCopyProxyOffer (Private, ProxyOfferIndex); - } - } else { - // - // No proxy offer is received, the bootfile name MUST be set. - // - ASSERT (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL); - } - } - - if (!EFI_ERROR (Status)) { - // - // Everything is OK, set the flag and copy the DHCP packets. - // - Mode = Private->PxeBc.Mode; - Offer = &SelectedOffer->Packet.Offer; - - // - // The discover packet is already copied, just set flag here. - // - Mode->DhcpDiscoverValid = TRUE; - - Ack = &Private->Dhcp4Ack.Packet.Ack; - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BOOTP) { - // - // Other type of ACK is already cached. Bootp is special that we should - // use the bootp reply as the ACK and put it into the DHCP_ONLY buffer. - // - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Offer); - } - - PxeBcParseCachedDhcpPacket (&Private->Dhcp4Ack); - - Mode->DhcpAckReceived = TRUE; - - // - // Copy the dhcp ack. - // - CopyMem (&Mode->DhcpAck, &Ack->Dhcp4, Ack->Length); - } - - return Status; -} - - -/** - Cache the Dhcp4 packet offer, Parse and validate each option of the packet. - - @param Private Pointer to PxeBc private data. - @param RcvdOffer Pointer to the received Dhcp proxy offer packet. - - @retval EFI_SUCCESS Cache and parse the packet successfully. - @retval Others Operation failed. - -**/ -EFI_STATUS -PxeBcCacheDhcpOffer ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_DHCP4_PACKET *RcvdOffer - ) -{ - PXEBC_CACHED_DHCP4_PACKET *CachedOffer; - EFI_DHCP4_PACKET *Offer; - UINT8 OfferType; - EFI_STATUS Status; - - CachedOffer = &Private->Dhcp4Offers[Private->NumOffers]; - Offer = &CachedOffer->Packet.Offer; - - // - // Cache the orignal dhcp packet - // - Status = PxeBcCopyEfiDhcp4Packet (Offer, RcvdOffer); - if (EFI_ERROR(Status)) { - return Status; - } - - // - // Parse and validate the options (including dhcp option and vendor option) - // - if (!PxeBcParseCachedDhcpPacket (CachedOffer)) { - return EFI_ABORTED; - } - - OfferType = CachedOffer->OfferType; - if (OfferType >= DHCP4_PACKET_TYPE_MAX) { - return EFI_ABORTED; - } - - if (OfferType == DHCP4_PACKET_TYPE_BOOTP) { - - if (Private->BootpIndex != 0) { - // - // Only cache the first bootp offer, discard others. - // - return EFI_ABORTED; - } else { - // - // Take as a dhcp only offer, but record index specifically. - // - Private->BootpIndex = Private->NumOffers + 1; - } - } else { - - if (IS_PROXY_DHCP_OFFER (Offer)) { - // - // It's a proxy dhcp offer with no your address, including pxe10, wfm11a or binl offer. - // - Private->GotProxyOffer = TRUE; - - if (OfferType == DHCP4_PACKET_TYPE_BINL) { - // - // Cache all binl offers. - // - Private->BinlIndex[Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]] = Private->NumOffers; - Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]++; - } else if (Private->ProxyIndex[OfferType] != 0) { - // - // Only cache the first pxe10/wfm11a offers each, discard the others. - // - return EFI_ABORTED; - } else { - // - // Record index of the proxy dhcp offer with type other than binl. - // - Private->ProxyIndex[OfferType] = Private->NumOffers + 1; - } - } else { - // - // It's a dhcp offer with your address. - // - ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM); - Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] = Private->NumOffers; - Private->ServerCount[OfferType]++; - } - } - - // - // Count the accepted offers. - // - Private->NumOffers++; - - return EFI_SUCCESS; -} - -/** - Switch the Ip4 policy to static. - - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. - - @retval EFI_SUCCESS The policy is already configured to static. - @retval Others Other error as indicated.. - -**/ -EFI_STATUS -PxeBcSetIp4Policy ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - EFI_STATUS Status; - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; - EFI_IP4_CONFIG2_POLICY Policy; - UINTN DataSize; - - Ip4Config2 = Private->Ip4Config2; - DataSize = sizeof (EFI_IP4_CONFIG2_POLICY); - Status = Ip4Config2->GetData ( - Ip4Config2, - Ip4Config2DataTypePolicy, - &DataSize, - &Policy - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (Policy != Ip4Config2PolicyStatic) { - Policy = Ip4Config2PolicyStatic; - Status= Ip4Config2->SetData ( - Ip4Config2, - Ip4Config2DataTypePolicy, - sizeof (EFI_IP4_CONFIG2_POLICY), - &Policy - ); - if (EFI_ERROR (Status)) { - return Status; - } - } - - return EFI_SUCCESS; -} - - -/** - Select the specified proxy offer, such as BINL, DHCP_ONLY and so on. - If the proxy does not exist, try offers with bootfile. - - @param Private Pointer to PxeBc private data. - -**/ -VOID -PxeBcSelectOffer ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - UINT32 Index; - UINT32 OfferIndex; - EFI_DHCP4_PACKET *Offer; - - Private->SelectedOffer = 0; - - if (Private->SortOffers) { - // - // Select offer according to the priority - // - if (Private->ServerCount[DHCP4_PACKET_TYPE_PXE10] > 0) { - // - // DHCP with PXE10 - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_PXE10][0] + 1; - - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_WFM11A] > 0) { - // - // DHCP with WfM - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_WFM11A][0] + 1; - - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_PXE10] > 0) && - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) - ) { - // - // DHCP only and proxy DHCP with PXE10 - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; - Private->ProxyOfferType = DHCP4_PACKET_TYPE_PXE10; - - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_WFM11A] > 0) && - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) - ) { - // - // DHCP only and proxy DHCP with WfM - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; - Private->ProxyOfferType = DHCP4_PACKET_TYPE_WFM11A; - - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_BINL] > 0) { - // - // DHCP with BINL - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_BINL][0] + 1; - - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL] > 0) && - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) - ) { - // - // DHCP only and proxy DHCP with BINL - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; - Private->ProxyOfferType = DHCP4_PACKET_TYPE_BINL; - - } else { - // - // Try offers with bootfile - // - for (Index = 0; Index < Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY]; Index++) { - // - // Select the first DHCP only offer with bootfile - // - OfferIndex = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][Index]; - if (Private->Dhcp4Offers[OfferIndex].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { - Private->SelectedOffer = OfferIndex + 1; - break; - } - } - - if (Private->SelectedOffer == 0) { - // - // Select the Bootp reply with bootfile if any - // - Private->SelectedOffer = Private->BootpIndex; - } - } - } else { - // - // Try the offers in the received order. - // - for (Index = 0; Index < Private->NumOffers; Index++) { - - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; - - if (IS_PROXY_DHCP_OFFER (Offer)) { - // - // Skip proxy offers - // - continue; - } - - if ((Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) && - ((!Private->GotProxyOffer) && (Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL))) { - // - // DHCP only offer but no proxy offer received and no bootfile option in this offer - // - continue; - } - - Private->SelectedOffer = Index + 1; - break; - } - } -} - - -/** - Callback routine. - - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver - to intercept events that occurred in the configuration process. This structure - provides advanced control of each state transition of the DHCP process. The - returned status code determines the behavior of the EFI DHCPv4 Protocol driver. - There are three possible returned values, which are described in the following - table. - - @param This Pointer to the EFI DHCPv4 Protocol instance that is used to - configure this callback function. - @param Context Pointer to the context that is initialized by - EFI_DHCP4_PROTOCOL.Configure(). - @param CurrentState The current operational state of the EFI DHCPv4 Protocol - driver. - @param Dhcp4Event The event that occurs in the current state, which usually means a - state transition. - @param Packet The DHCP packet that is going to be sent or already received. - @param NewPacket The packet that is used to replace the above Packet. - - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue the DHCP process. - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol - driver will continue to wait for more DHCPOFFER packets until the retry - timeout expires. - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and - return to the Dhcp4Init or Dhcp4InitReboot state. - -**/ -EFI_STATUS -EFIAPI -PxeBcDhcpCallBack ( - IN EFI_DHCP4_PROTOCOL * This, - IN VOID *Context, - IN EFI_DHCP4_STATE CurrentState, - IN EFI_DHCP4_EVENT Dhcp4Event, - IN EFI_DHCP4_PACKET * Packet OPTIONAL, - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; - EFI_DHCP4_PACKET_OPTION *MaxMsgSize; - UINT16 Value; - EFI_STATUS Status; - BOOLEAN Received; - EFI_DHCP4_HEADER *DhcpHeader; - - if ((Dhcp4Event != Dhcp4RcvdOffer) && - (Dhcp4Event != Dhcp4SelectOffer) && - (Dhcp4Event != Dhcp4SendDiscover) && - (Dhcp4Event != Dhcp4RcvdAck) && - (Dhcp4Event != Dhcp4SendRequest)) { - return EFI_SUCCESS; - } - - Private = (PXEBC_PRIVATE_DATA *) Context; - Mode = Private->PxeBc.Mode; - Callback = Private->PxeBcCallback; - - // - // Override the Maximum DHCP Message Size. - // - MaxMsgSize = PxeBcParseExtendOptions ( - Packet->Dhcp4.Option, - GET_OPTION_BUFFER_LEN (Packet), - DHCP4_TAG_MAXMSG - ); - if (MaxMsgSize != NULL) { - Value = HTONS (PXEBC_DHCP4_MAX_PACKET_SIZE); - CopyMem (MaxMsgSize->Data, &Value, sizeof (Value)); - } - - if ((Dhcp4Event != Dhcp4SelectOffer) && (Callback != NULL)) { - Received = (BOOLEAN) ((Dhcp4Event == Dhcp4RcvdOffer) || (Dhcp4Event == Dhcp4RcvdAck)); - Status = Callback->Callback ( - Callback, - Private->Function, - Received, - Packet->Length, - (EFI_PXE_BASE_CODE_PACKET *) &Packet->Dhcp4 - ); - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { - return EFI_ABORTED; - } - } - - Status = EFI_SUCCESS; - - switch (Dhcp4Event) { - - case Dhcp4SendDiscover: - case Dhcp4SendRequest: - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { - // - // If the to be sent packet exceeds the maximum length, abort the DHCP process. - // - Status = EFI_ABORTED; - break; - } - - if (Mode->SendGUID) { - // - // send the system GUID instead of the MAC address as the hardware address - // in the DHCP packet header. - // - DhcpHeader = &Packet->Dhcp4.Header; - - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) { - // - // GUID not yet set - send all 0xff's to show programable (via SetVariable) - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff); - // GUID not yet set - send all 0's to show not programable - // - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n")); - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); - } - - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); - } - - if (Dhcp4Event == Dhcp4SendDiscover) { - // - // Cache the dhcp discover packet, of which some information will be used later. - // - CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet->Length); - } - - break; - - case Dhcp4RcvdOffer: - Status = EFI_NOT_READY; - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { - // - // Ignore the incoming Offers which exceed the maximum length. - // - break; - } - - if (Private->NumOffers < PXEBC_MAX_OFFER_NUM) { - // - // Cache the dhcp offers in Private->Dhcp4Offers[] - // If error happens, just ignore this packet and continue to wait more offer. - // - PxeBcCacheDhcpOffer (Private, Packet); - } - - break; - - case Dhcp4SelectOffer: - // - // Select an offer, if succeeded, Private->SelectedOffer points to - // the index of the selected one. - // - PxeBcSelectOffer (Private); - - if (Private->SelectedOffer == 0) { - Status = EFI_ABORTED; - } else { - *NewPacket = &Private->Dhcp4Offers[Private->SelectedOffer - 1].Packet.Offer; - } - - break; - - case Dhcp4RcvdAck: - // - // Cache Ack - // - ASSERT (Private->SelectedOffer != 0); - - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Packet); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - break; - - default: - break; - } - - return Status; -} - - -/** - Initialize the DHCP options and build the option list. - - @param Private Pointer to PxeBc private data. - @param OptList Pointer to a DHCP option list. - - @param IsDhcpDiscover Discover dhcp option or not. - - @return The index item number of the option list. - -**/ -UINT32 -PxeBcBuildDhcpOptions ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_DHCP4_PACKET_OPTION **OptList, - IN BOOLEAN IsDhcpDiscover - ) -{ - UINT32 Index; - PXEBC_DHCP4_OPTION_ENTRY OptEnt; - UINT16 Value; - - Index = 0; - OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer; - - if (!IsDhcpDiscover) { - // - // Append message type. - // - OptList[Index]->OpCode = DHCP4_TAG_MSG_TYPE; - OptList[Index]->Length = 1; - OptEnt.Mesg = (PXEBC_DHCP4_OPTION_MESG *) OptList[Index]->Data; - OptEnt.Mesg->Type = PXEBC_DHCP4_MSG_TYPE_REQUEST; - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append max message size. - // - OptList[Index]->OpCode = DHCP4_TAG_MAXMSG; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE); - OptEnt.MaxMesgSize = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *) OptList[Index]->Data; - Value = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE); - CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16)); - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - } - // - // Parameter request list option. - // - OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST; - OptList[Index]->Length = 35; - OptEnt.Para = (PXEBC_DHCP4_OPTION_PARA *) OptList[Index]->Data; - OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK; - OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET; - OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER; - OptEnt.Para->ParaList[3] = DHCP4_TAG_TIME_SERVER; - OptEnt.Para->ParaList[4] = DHCP4_TAG_NAME_SERVER; - OptEnt.Para->ParaList[5] = DHCP4_TAG_DNS_SERVER; - OptEnt.Para->ParaList[6] = DHCP4_TAG_HOSTNAME; - OptEnt.Para->ParaList[7] = DHCP4_TAG_BOOTFILE_LEN; - OptEnt.Para->ParaList[8] = DHCP4_TAG_DOMAINNAME; - OptEnt.Para->ParaList[9] = DHCP4_TAG_ROOTPATH; - OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH; - OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU; - OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL; - OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST; - OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN; - OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER; - OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER; - OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR; - OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP; - OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE; - OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID; - OptEnt.Para->ParaList[21] = DHCP4_TAG_T1; - OptEnt.Para->ParaList[22] = DHCP4_TAG_T2; - OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID; - OptEnt.Para->ParaList[24] = DHCP4_TAG_TFTP; - OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE; - OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID; - OptEnt.Para->ParaList[27] = 0x80; - OptEnt.Para->ParaList[28] = 0x81; - OptEnt.Para->ParaList[29] = 0x82; - OptEnt.Para->ParaList[30] = 0x83; - OptEnt.Para->ParaList[31] = 0x84; - OptEnt.Para->ParaList[32] = 0x85; - OptEnt.Para->ParaList[33] = 0x86; - OptEnt.Para->ParaList[34] = 0x87; - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append UUID/Guid-based client identifier option - // - OptList[Index]->OpCode = DHCP4_TAG_UUID; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID); - OptEnt.Uuid = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]->Data; - OptEnt.Uuid->Type = 0; - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) { - // - // GUID not yet set - send all 0xff's to show programable (via SetVariable) - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff); - // GUID not yet set - send all 0's to show not programable - // - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n")); - ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID)); - } - - // - // Append client network device interface option - // - OptList[Index]->OpCode = DHCP4_TAG_UNDI; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI); - OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]->Data; - if (Private->Nii != NULL) { - OptEnt.Undi->Type = Private->Nii->Type; - OptEnt.Undi->MajorVer = Private->Nii->MajorVer; - OptEnt.Undi->MinorVer = Private->Nii->MinorVer; - } else { - OptEnt.Undi->Type = DEFAULT_UNDI_TYPE; - OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR; - OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR; - } - - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append client system architecture option - // - OptList[Index]->OpCode = DHCP4_TAG_ARCH; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH); - OptEnt.Arch = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]->Data; - Value = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE); - CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16)); - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append client system architecture option - // - OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID); - OptEnt.Clid = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]->Data; - CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof (PXEBC_DHCP4_OPTION_CLID)); - CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid->ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType)); - - if (Private->Nii != NULL) { - // - // If NII protocol exists, update DHCP option data - // - CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof (OptEnt.Clid->InterfaceName)); - CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof (OptEnt.Clid->UndiMajor)); - CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof (OptEnt.Clid->UndiMinor)); - } - - Index++; - - return Index; -} - - -/** - Discover the boot of service and initialize the vendor option if exists. - - @param Private Pointer to PxeBc private data. - @param Type PxeBc option boot item type - @param Layer PxeBc option boot item layer - @param UseBis Use BIS or not - @param DestIp Ip address for server - @param IpCount The total count of the server ip address - @param SrvList Server list - @param IsDiscv Discover the vendor or not - @param Reply The dhcp4 packet of Pxe reply - - @retval EFI_SUCCESS Operation succeeds. - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. - @retval EFI_NOT_FOUND There is no vendor option exists. - @retval EFI_TIMEOUT Send Pxe Discover time out. - -**/ -EFI_STATUS -PxeBcDiscvBootService ( - IN PXEBC_PRIVATE_DATA * Private, - IN UINT16 Type, - IN UINT16 *Layer, - IN BOOLEAN UseBis, - IN EFI_IP_ADDRESS * DestIp, - IN UINT16 IpCount, - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, - IN BOOLEAN IsDiscv, - OUT EFI_DHCP4_PACKET * Reply OPTIONAL - ) -{ - EFI_PXE_BASE_CODE_UDP_PORT Sport; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; - BOOLEAN IsBCast; - EFI_STATUS Status; - UINT16 RepIndex; - UINT16 SrvIndex; - UINT16 TryIndex; - EFI_DHCP4_LISTEN_POINT ListenPoint; - EFI_DHCP4_PACKET *Response; - EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; - UINT32 OptCount; - EFI_DHCP4_PACKET_OPTION *PxeOpt; - PXEBC_OPTION_BOOT_ITEM *PxeBootItem; - UINT8 VendorOptLen; - EFI_DHCP4_HEADER *DhcpHeader; - UINT32 Xid; - - Mode = Private->PxeBc.Mode; - Dhcp4 = Private->Dhcp4; - Status = EFI_SUCCESS; - - ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN)); - - if (DestIp == NULL) { - Sport = PXEBC_DHCP4_S_PORT; - IsBCast = TRUE; - } else { - Sport = PXEBC_BS_DISCOVER_PORT; - IsBCast = FALSE; - } - - if (!UseBis && Layer != NULL) { - *Layer &= EFI_PXE_BASE_CODE_BOOT_LAYER_MASK; - } - - OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE); - - if (IsDiscv) { - ASSERT (Layer != NULL); - // - // Add vendor option of PXE_BOOT_ITEM - // - VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 + sizeof (PXEBC_OPTION_BOOT_ITEM) + 1); - OptList[OptCount] = AllocatePool (VendorOptLen); - if (OptList[OptCount] == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - OptList[OptCount]->OpCode = DHCP4_TAG_VENDOR; - OptList[OptCount]->Length = (UINT8) (VendorOptLen - 2); - PxeOpt = (EFI_DHCP4_PACKET_OPTION *) OptList[OptCount]->Data; - PxeOpt->OpCode = PXEBC_VENDOR_TAG_BOOT_ITEM; - PxeOpt->Length = (UINT8) sizeof (PXEBC_OPTION_BOOT_ITEM); - PxeBootItem = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt->Data; - PxeBootItem->Type = HTONS (Type); - PxeBootItem->Layer = HTONS (*Layer); - PxeOpt->Data[PxeOpt->Length] = DHCP4_TAG_EOP; - - OptCount++; - } - - Status = Dhcp4->Build (Dhcp4, &Private->SeedPacket, 0, NULL, OptCount, OptList, &Token.Packet); - - if (IsDiscv) { - FreePool (OptList[OptCount - 1]); - } - - if (EFI_ERROR (Status)) { - return Status; - } - - DhcpHeader = &Token.Packet->Dhcp4.Header; - if (Mode->SendGUID) { - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) { - // - // GUID not yet set - send all 0's to show not programable - // - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n")); - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); - } - - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); - } - - Xid = NET_RANDOM (NetRandomInitSeed ()); - Token.Packet->Dhcp4.Header.Xid = HTONL(Xid); - Token.Packet->Dhcp4.Header.Reserved = HTONS((UINT16) ((IsBCast) ? 0x8000 : 0)); - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - - Token.RemotePort = Sport; - - if (IsBCast) { - SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff); - } else { - CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS)); - } - - CopyMem (&Token.GatewayAddress, &Private->GatewayIp, sizeof (EFI_IPv4_ADDRESS)); - - if (!IsBCast) { - Token.ListenPointCount = 1; - Token.ListenPoints = &ListenPoint; - Token.ListenPoints[0].ListenPort = PXEBC_BS_DISCOVER_PORT; - CopyMem (&Token.ListenPoints[0].ListenAddress, &Private->StationIp, sizeof(EFI_IPv4_ADDRESS)); - CopyMem (&Token.ListenPoints[0].SubnetMask, &Private->SubnetMask, sizeof(EFI_IPv4_ADDRESS)); - } - // - // Send Pxe Discover - // - for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; TryIndex++) { - - Token.TimeoutValue = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex); - Token.Packet->Dhcp4.Header.Seconds = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1)); - - Status = Dhcp4->TransmitReceive (Dhcp4, &Token); - - if (Token.Status != EFI_TIMEOUT) { - break; - } - } - - if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) { - // - // No server response our PXE request - // - Status = EFI_TIMEOUT; - } - - if (!EFI_ERROR (Status)) { - // - // Find Pxe Reply - // - RepIndex = 0; - SrvIndex = 0; - Response = Token.ResponseList; - - while (RepIndex < Token.ResponseCount) { - if (Response->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { - SrvIndex = 0; - RepIndex++; - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size); - continue; - } - - while (SrvIndex < IpCount) { - - if (SrvList[SrvIndex].AcceptAnyResponse) { - break; - } - - if ((SrvList[SrvIndex].Type == Type) && EFI_IP4_EQUAL (&(Response->Dhcp4.Header.ServerAddr), &(Private->ServerIp))) { - break; - } - - SrvIndex++; - } - - if ((IpCount != SrvIndex) || (IpCount == 0)) { - break; - } - - SrvIndex = 0; - RepIndex++; - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size); - } - - if (RepIndex < Token.ResponseCount) { - - if (Reply != NULL) { - Status = PxeBcCopyEfiDhcp4Packet (Reply, Response); - if (EFI_ERROR(Status)) { - goto ON_EXIT; - } - } - - if (IsDiscv) { - CopyMem (&(Mode->PxeDiscover), &(Token.Packet->Dhcp4), Token.Packet->Length); - Mode->PxeDiscoverValid = TRUE; - - CopyMem (Mode->PxeReply.Raw, &Response->Dhcp4, Response->Length); - Mode->PxeReplyReceived = TRUE; - } - } else { - Status = EFI_NOT_FOUND; - } - } - -ON_EXIT: - // - // free the responselist - // - if (Token.ResponseList != NULL) { - FreePool (Token.ResponseList); - } - // - // Free the dhcp packet - // - if (Token.Packet != NULL) { - FreePool (Token.Packet); - } - - return Status; -} - - -/** - Parse interested dhcp options. - - @param Buffer Pointer to the dhcp options packet. - @param Length The length of the dhcp options. - @param OptTag The option OpCode. - - @return NULL if the buffer length is 0 and OpCode is not - DHCP4_TAG_EOP, or the pointer to the buffer. - -**/ -EFI_DHCP4_PACKET_OPTION * -PxeBcParseExtendOptions ( - IN UINT8 *Buffer, - IN UINT32 Length, - IN UINT8 OptTag - ) -{ - EFI_DHCP4_PACKET_OPTION *Option; - UINT32 Offset; - - Option = (EFI_DHCP4_PACKET_OPTION *) Buffer; - Offset = 0; - - while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) { - - if (Option->OpCode == OptTag) { - - return Option; - } - - if (Option->OpCode == DHCP4_TAG_PAD) { - Offset++; - } else { - Offset += Option->Length + 2; - } - - Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset); - } - - return NULL; -} - - -/** - This function is to parse and check vendor options. - - @param Dhcp4Option Pointer to dhcp options - @param VendorOption Pointer to vendor options - - @return TRUE if valid for vendor options, or FALSE. - -**/ -BOOLEAN -PxeBcParseVendorOptions ( - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, - IN PXEBC_VENDOR_OPTION *VendorOption - ) -{ - UINT32 *BitMap; - UINT8 VendorOptionLen; - EFI_DHCP4_PACKET_OPTION *PxeOption; - UINT8 Offset; - - BitMap = VendorOption->BitMap; - VendorOptionLen = Dhcp4Option->Length; - PxeOption = (EFI_DHCP4_PACKET_OPTION *) &Dhcp4Option->Data[0]; - Offset = 0; - - while ((Offset < VendorOptionLen) && (PxeOption->OpCode != DHCP4_TAG_EOP)) { - // - // Parse every Vendor Option and set its BitMap - // - switch (PxeOption->OpCode) { - - case PXEBC_VENDOR_TAG_MTFTP_IP: - - CopyMem (&VendorOption->MtftpIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS)); - break; - - case PXEBC_VENDOR_TAG_MTFTP_CPORT: - - CopyMem (&VendorOption->MtftpCPort, PxeOption->Data, sizeof (VendorOption->MtftpCPort)); - break; - - case PXEBC_VENDOR_TAG_MTFTP_SPORT: - - CopyMem (&VendorOption->MtftpSPort, PxeOption->Data, sizeof (VendorOption->MtftpSPort)); - break; - - case PXEBC_VENDOR_TAG_MTFTP_TIMEOUT: - - VendorOption->MtftpTimeout = *PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_MTFTP_DELAY: - - VendorOption->MtftpDelay = *PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_DISCOVER_CTRL: - - VendorOption->DiscoverCtrl = *PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_DISCOVER_MCAST: - - CopyMem (&VendorOption->DiscoverMcastIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS)); - break; - - case PXEBC_VENDOR_TAG_BOOT_SERVERS: - - VendorOption->BootSvrLen = PxeOption->Length; - VendorOption->BootSvr = (PXEBC_BOOT_SVR_ENTRY *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_BOOT_MENU: - - VendorOption->BootMenuLen = PxeOption->Length; - VendorOption->BootMenu = (PXEBC_BOOT_MENU_ENTRY *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_MENU_PROMPT: - - VendorOption->MenuPromptLen = PxeOption->Length; - VendorOption->MenuPrompt = (PXEBC_MENU_PROMPT *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_MCAST_ALLOC: - - CopyMem (&VendorOption->McastIpBase, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&VendorOption->McastIpBlock, PxeOption->Data + 4, sizeof (VendorOption->McastIpBlock)); - CopyMem (&VendorOption->McastIpRange, PxeOption->Data + 6, sizeof (VendorOption->McastIpRange)); - break; - - case PXEBC_VENDOR_TAG_CREDENTIAL_TYPES: - - VendorOption->CredTypeLen = PxeOption->Length; - VendorOption->CredType = (UINT32 *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_BOOT_ITEM: - - CopyMem (&VendorOption->BootSrvType, PxeOption->Data, sizeof (VendorOption->BootSrvType)); - CopyMem (&VendorOption->BootSrvLayer, PxeOption->Data + 2, sizeof (VendorOption->BootSrvLayer)); - break; - } - - SET_VENDOR_OPTION_BIT_MAP (BitMap, PxeOption->OpCode); - - if (PxeOption->OpCode == DHCP4_TAG_PAD) { - Offset++; - } else { - Offset = (UINT8) (Offset + PxeOption->Length + 2); - } - - PxeOption = (EFI_DHCP4_PACKET_OPTION *) (Dhcp4Option->Data + Offset); - } - - // - // FixMe, return falas if invalid of any vendor option - // - - return TRUE; -} - - -/** - This function display boot item detail. - - If the length of the boot item string over 70 Char, just display 70 Char. - - @param Str Pointer to a string (boot item string). - @param Len The length of string. - -**/ -VOID -PxeBcDisplayBootItem ( - IN UINT8 *Str, - IN UINT8 Len - ) -{ - UINT8 Tmp; - - Len = (UINT8) MIN (70, Len); - Tmp = Str[Len]; - Str[Len] = 0; - AsciiPrint ("%a \n", Str); - Str[Len] = Tmp; -} - - -/** - Choose the boot prompt. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Select boot prompt done. - @retval EFI_TIMEOUT Select boot prompt time out. - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. - @retval EFI_ABORTED User cancel the operation. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootPrompt ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - PXEBC_CACHED_DHCP4_PACKET *Packet; - PXEBC_VENDOR_OPTION *VendorOpt; - EFI_EVENT TimeoutEvent; - EFI_EVENT DescendEvent; - EFI_INPUT_KEY InputKey; - EFI_STATUS Status; - UINT8 Timeout; - UINT8 *Prompt; - UINT8 PromptLen; - INT32 SecCol; - INT32 SecRow; - - TimeoutEvent = NULL; - DescendEvent = NULL; - - if (Private->PxeBc.Mode->ProxyOfferReceived) { - - Packet = &Private->ProxyOffer; - } else { - - Packet = &Private->Dhcp4Ack; - } - - if (Packet->OfferType != DHCP4_PACKET_TYPE_PXE10) { - return EFI_NOT_FOUND; - } - - VendorOpt = &Packet->PxeVendorOption; - // - // According to the PXE specification 2.1, Table 2-1 PXE DHCP Options (Full - // List), we must not consider a boot prompt or boot menu if all of the - // following hold: - // - the PXE_DISCOVERY_CONTROL PXE tag is present inside the Vendor Options - // (=43) DHCP tag, and - // - the PXE_DISCOVERY_CONTROL PXE tag has bit 3 set, and - // - a boot file name has been presented with DHCP option 67. - // - if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) && - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { - return EFI_ABORTED; - } - - if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) { - return EFI_SUCCESS; - } - - Timeout = VendorOpt->MenuPrompt->Timeout; - Prompt = VendorOpt->MenuPrompt->Prompt; - PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1); - - if (Timeout == 0) { - return EFI_SUCCESS; - } - - if (Timeout == 255) { - return EFI_TIMEOUT; - } - - Status = gBS->CreateEvent ( - EVT_TIMER, - TPL_CALLBACK, - NULL, - NULL, - &TimeoutEvent - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->SetTimer ( - TimeoutEvent, - TimerRelative, - MultU64x32 (Timeout, TICKS_PER_SECOND) - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = gBS->CreateEvent ( - EVT_TIMER, - TPL_CALLBACK, - NULL, - NULL, - &DescendEvent - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = gBS->SetTimer ( - DescendEvent, - TimerPeriodic, - TICKS_PER_SECOND - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - SecCol = gST->ConOut->Mode->CursorColumn; - SecRow = gST->ConOut->Mode->CursorRow; - - PxeBcDisplayBootItem (Prompt, PromptLen); - - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow); - AsciiPrint ("(%d) ", Timeout--); - - while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { - - if (!EFI_ERROR (gBS->CheckEvent (DescendEvent))) { - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow); - AsciiPrint ("(%d) ", Timeout--); - } - - if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) { - - gBS->Stall (10 * TICKS_PER_MS); - continue; - } - - if (InputKey.ScanCode == 0) { - - switch (InputKey.UnicodeChar) { - case CTRL ('c'): - Status = EFI_ABORTED; - break; - - case CTRL ('m'): - case 'm': - case 'M': - Status = EFI_TIMEOUT; - break; - - default: - continue; - } - } else { - - switch (InputKey.ScanCode) { - case SCAN_F8: - Status = EFI_TIMEOUT; - break; - - case SCAN_ESC: - Status = EFI_ABORTED; - break; - - default: - continue; - } - } - - break; - } - - gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1); - -ON_EXIT: - - if (DescendEvent != NULL) { - gBS->CloseEvent (DescendEvent); - } - - if (TimeoutEvent != NULL) { - gBS->CloseEvent (TimeoutEvent); - } - - return Status; -} - - -/** - Select the boot menu. - - @param Private Pointer to PxeBc private data. - @param Type The type of the menu. - @param UseDefaultItem Use default item or not. - - @retval EFI_ABORTED User cancel operation. - @retval EFI_SUCCESS Select the boot menu success. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootMenu ( - IN PXEBC_PRIVATE_DATA *Private, - OUT UINT16 *Type, - IN BOOLEAN UseDefaultItem - ) -{ - PXEBC_CACHED_DHCP4_PACKET *Packet; - PXEBC_VENDOR_OPTION *VendorOpt; - EFI_INPUT_KEY InputKey; - UINT8 MenuSize; - UINT8 MenuNum; - INT32 TopRow; - UINT16 Select; - UINT16 LastSelect; - UINT8 Index; - BOOLEAN Finish; - CHAR8 Blank[70]; - PXEBC_BOOT_MENU_ENTRY *MenuItem; - PXEBC_BOOT_MENU_ENTRY *MenuArray[PXEBC_MAX_MENU_NUM]; - - Finish = FALSE; - Select = 0; - Index = 0; - *Type = 0; - - if (Private->PxeBc.Mode->ProxyOfferReceived) { - - Packet = &Private->ProxyOffer; - } else { - - Packet = &Private->Dhcp4Ack; - } - - ASSERT (Packet->OfferType == DHCP4_PACKET_TYPE_PXE10); - - VendorOpt = &Packet->PxeVendorOption; - - if (!IS_VALID_BOOT_MENU (VendorOpt->BitMap)) { - return EFI_SUCCESS; - } - - SetMem (Blank, sizeof(Blank), ' '); - - MenuSize = VendorOpt->BootMenuLen; - MenuItem = VendorOpt->BootMenu; - - if (MenuSize == 0) { - return EFI_NOT_READY; - } - - while (MenuSize > 0) { - MenuArray[Index++] = MenuItem; - MenuSize = (UINT8) (MenuSize - (MenuItem->DescLen + 3)); - MenuItem = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + MenuItem->DescLen + 3); - if (Index >= PXEBC_MAX_MENU_NUM) { - break; - } - } - - if (UseDefaultItem) { - *Type = MenuArray[0]->Type; - *Type = NTOHS (*Type); - return EFI_SUCCESS; - } - - MenuNum = Index; - - for (Index = 0; Index < MenuNum; Index++) { - PxeBcDisplayBootItem (MenuArray[Index]->DescStr, MenuArray[Index]->DescLen); - } - - TopRow = gST->ConOut->Mode->CursorRow - MenuNum; - - do { - ASSERT (Select < PXEBC_MAX_MENU_NUM); - // - // highlight selected row - // - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY)); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Select); - Blank[MenuArray[Select]->DescLen] = 0; - AsciiPrint ("%a\r", Blank); - PxeBcDisplayBootItem (MenuArray[Select]->DescStr, MenuArray[Select]->DescLen); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); - LastSelect = Select; - - while (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) { - gBS->Stall (10 * TICKS_PER_MS); - } - - if (InputKey.ScanCode == 0) { - switch (InputKey.UnicodeChar) { - case CTRL ('c'): - InputKey.ScanCode = SCAN_ESC; - break; - - case CTRL ('j'): /* linefeed */ - case CTRL ('m'): /* return */ - Finish = TRUE; - break; - - case CTRL ('i'): /* tab */ - case ' ': - case 'd': - case 'D': - InputKey.ScanCode = SCAN_DOWN; - break; - - case CTRL ('h'): /* backspace */ - case 'u': - case 'U': - InputKey.ScanCode = SCAN_UP; - break; - - default: - InputKey.ScanCode = 0; - } - } - - switch (InputKey.ScanCode) { - case SCAN_LEFT: - case SCAN_UP: - if (Select > 0) { - --Select; - } - - break; - - case SCAN_DOWN: - case SCAN_RIGHT: - if (++Select == MenuNum) { - --Select; - } - - break; - - case SCAN_PAGE_UP: - case SCAN_HOME: - Select = 0; - break; - - case SCAN_PAGE_DOWN: - case SCAN_END: - Select = (UINT16) (MenuNum - 1); - break; - - case SCAN_ESC: - return EFI_ABORTED; - } - - /* unhighlight last selected row */ - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + LastSelect); - Blank[MenuArray[LastSelect]->DescLen] = 0; - AsciiPrint ("%a\r", Blank); - PxeBcDisplayBootItem (MenuArray[LastSelect]->DescStr, MenuArray[LastSelect]->DescLen); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); - } while (!Finish); - - ASSERT (Select < PXEBC_MAX_MENU_NUM); - - // - // Swap the byte order - // - CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16)); - *Type = NTOHS (*Type); - - return EFI_SUCCESS; -} - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c deleted file mode 100644 index 76c140d8e3ff..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c +++ /dev/null @@ -1,665 +0,0 @@ -/** @file - The driver binding for UEFI PXEBC protocol. - -Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = { - PxeBcDriverBindingSupported, - PxeBcDriverBindingStart, - PxeBcDriverBindingStop, - 0xa, - NULL, - NULL -}; - -/** - This is the declaration of an EFI image entry point. This entry point is - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including - both device drivers and bus drivers. - - @param ImageHandle The firmware allocated handle for the UEFI image. - @param SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - return EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gPxeBcDriverBinding, - ImageHandle, - &gPxeBcComponentName, - &gPxeBcComponentName2 - ); -} - - -/** - Test to see if this driver supports ControllerHandle. This service - is called by the EFI boot service ConnectController(). In - order to make drivers as small as possible, there are a few calling - restrictions for this service. ConnectController() must - follow these calling restrictions. If any other agent wishes to call - Supported() it must also follow these calling restrictions. - PxeBc requires DHCP4 and MTFTP4 protocols. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to test - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver supports this device - @retval EFI_ALREADY_STARTED This driver is already running on this device - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ) -{ - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_STATUS Status; - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiPxeBaseCodeProtocolGuid, - (VOID **) &PxeBc, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (!EFI_ERROR (Status)) { - return EFI_ALREADY_STARTED; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - - if (!EFI_ERROR (Status)) { - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - - } - - return Status; -} - - -/** - Start this driver on ControllerHandle. This service is called by the - EFI boot service ConnectController(). In order to make - drivers as small as possible, there are a few calling restrictions for - this service. ConnectController() must follow these - calling restrictions. If any other agent wishes to call Start() it - must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to bind driver to - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver is added to ControllerHandle - @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - UINTN Index; - EFI_STATUS Status; - EFI_IP4_MODE_DATA Ip4ModeData; - - Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA)); - if (Private == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE; - Private->Controller = ControllerHandle; - Private->Image = This->DriverBindingHandle; - CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc)); - Private->PxeBc.Mode = &Private->Mode; - CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile)); - - Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - - for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) { - Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - } - - // - // Get the NII interface if it exists. - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiNetworkInterfaceIdentifierProtocolGuid_31, - (VOID **) &Private->Nii, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - Private->Nii = NULL; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiArpServiceBindingProtocolGuid, - &Private->ArpChild - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->ArpChild, - &gEfiArpProtocolGuid, - (VOID **) &Private->Arp, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - &Private->Dhcp4Child - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Dhcp4Child, - &gEfiDhcp4ProtocolGuid, - (VOID **) &Private->Dhcp4, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiIp4ServiceBindingProtocolGuid, - &Private->Ip4Child - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Ip4Child, - &gEfiIp4ProtocolGuid, - (VOID **) &Private->Ip4, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Get max packet size from Ip4 to calculate block size for Tftp later. - // - Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize; - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - &Private->Mtftp4Child - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Mtftp4Child, - &gEfiMtftp4ProtocolGuid, - (VOID **) &Private->Mtftp4, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - &Private->Udp4ReadChild - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // The UDP instance for EfiPxeBcUdpRead - // - Status = gBS->OpenProtocol ( - Private->Udp4ReadChild, - &gEfiUdp4ProtocolGuid, - (VOID **) &Private->Udp4Read, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // The UDP instance for EfiPxeBcUdpWrite - // - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - &Private->Udp4WriteChild - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Udp4WriteChild, - &gEfiUdp4ProtocolGuid, - (VOID **) &Private->Udp4Write, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA)); - Private->Udp4CfgData.AcceptBroadcast = FALSE; - Private->Udp4CfgData.AcceptPromiscuous = FALSE; - Private->Udp4CfgData.AcceptAnyPort = TRUE; - Private->Udp4CfgData.AllowDuplicatePort = TRUE; - Private->Udp4CfgData.TypeOfService = DEFAULT_ToS; - Private->Udp4CfgData.TimeToLive = DEFAULT_TTL; - Private->Udp4CfgData.DoNotFragment = FALSE; - Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; - Private->Udp4CfgData.UseDefaultAddress = FALSE; - - PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read); - Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen; - CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen); - - - ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA)); - Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP; - Private->Ip4ConfigData.AcceptIcmpErrors = TRUE; - Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS; - Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL; - Private->Ip4ConfigData.DoNotFragment = FALSE; - Private->Ip4ConfigData.RawData = FALSE; - - Status = gBS->InstallMultipleProtocolInterfaces ( - &ControllerHandle, - &gEfiPxeBaseCodeProtocolGuid, - &Private->PxeBc, - &gEfiLoadFileProtocolGuid, - &Private->LoadFile, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - // - // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy. - // - Status = gBS->HandleProtocol ( - ControllerHandle, - &gEfiIp4Config2ProtocolGuid, - (VOID **) &Private->Ip4Config2 - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - return EFI_SUCCESS; - -ON_ERROR: - - if (Private->Udp4WriteChild != NULL) { - gBS->CloseProtocol ( - Private->Udp4WriteChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4WriteChild - ); - } - - if (Private->Udp4ReadChild != NULL) { - gBS->CloseProtocol ( - Private->Udp4ReadChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4ReadChild - ); - } - - if (Private->Mtftp4Child != NULL) { - gBS->CloseProtocol ( - Private->Mtftp4Child, - &gEfiMtftp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - Private->Mtftp4Child - ); - } - - if (Private->Ip4Child != NULL) { - gBS->CloseProtocol ( - Private->Ip4Child, - &gEfiIp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiIp4ServiceBindingProtocolGuid, - Private->Ip4Child - ); - } - - if (Private->Dhcp4Child != NULL) { - gBS->CloseProtocol ( - Private->Dhcp4Child, - &gEfiDhcp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - Private->Dhcp4Child - ); - } - - if (Private->ArpChild != NULL) { - gBS->CloseProtocol ( - Private->ArpChild, - &gEfiArpProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiArpServiceBindingProtocolGuid, - Private->ArpChild - ); - } - - FreePool (Private); - - return Status; -} - - -/** - Stop this driver on ControllerHandle. This service is called by the - EFI boot service DisconnectController(). In order to - make drivers as small as possible, there are a few calling - restrictions for this service. DisconnectController() - must follow these calling restrictions. If any other agent wishes - to call Stop() it must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed ControllerHandle - @retval other This driver was not removed from this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_HANDLE NicHandle; - EFI_STATUS Status; - - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid); - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid); - - if (NicHandle == NULL) { - return EFI_SUCCESS; - } - } - } - } - } - - Status = gBS->OpenProtocol ( - NicHandle, - &gEfiPxeBaseCodeProtocolGuid, - (VOID **) &PxeBc, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Stop functionality of PXE Base Code protocol - // - Status = PxeBc->Stop (PxeBc); - if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) { - return Status; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc); - - Status = gBS->UninstallMultipleProtocolInterfaces ( - NicHandle, - &gEfiPxeBaseCodeProtocolGuid, - &Private->PxeBc, - &gEfiLoadFileProtocolGuid, - &Private->LoadFile, - NULL - ); - - if (!EFI_ERROR (Status)) { - - gBS->CloseProtocol ( - Private->Udp4WriteChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4WriteChild - ); - - gBS->CloseProtocol ( - Private->Udp4ReadChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4ReadChild - ); - - gBS->CloseProtocol ( - Private->Dhcp4Child, - &gEfiDhcp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - Private->Dhcp4Child - ); - - gBS->CloseProtocol ( - Private->Mtftp4Child, - &gEfiMtftp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - Private->Mtftp4Child - ); - - gBS->CloseProtocol ( - Private->Ip4Child, - &gEfiIp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiIp4ServiceBindingProtocolGuid, - Private->Ip4Child - ); - - gBS->CloseProtocol ( - Private->ArpChild, - &gEfiArpProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiArpServiceBindingProtocolGuid, - Private->ArpChild - ); - - FreePool (Private); - } - - return Status; -} - - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c deleted file mode 100644 index 3fa3be99c178..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c +++ /dev/null @@ -1,2989 +0,0 @@ -/** @file - Interface routines for PxeBc. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -UINT32 mPxeDhcpTimeout[4] = { 4, 8, 16, 32 }; - -/** - Get and record the arp cache. - - @param This Pointer to EFI_PXE_BC_PROTOCOL - - @retval EFI_SUCCESS Arp cache updated successfully - @retval others If error occurs when getting arp cache - -**/ -EFI_STATUS -UpdateArpCache ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - UINT32 EntryLength; - UINT32 EntryCount; - EFI_ARP_FIND_DATA *Entries; - UINT32 Index; - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - Status = Private->Arp->Find ( - Private->Arp, - TRUE, - NULL, - &EntryLength, - &EntryCount, - &Entries, - TRUE - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Mode->ArpCacheEntries = MIN ( - EntryCount, - EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES - ); - for (Index = 0; Index < Mode->ArpCacheEntries; Index ++) { - CopyMem ( - &Mode->ArpCache[Index].IpAddr, - Entries + 1, - Entries->SwAddressLength - ); - CopyMem ( - &Mode->ArpCache[Index].MacAddr, - (UINT8 *) (Entries + 1) + Entries->SwAddressLength, - Entries->HwAddressLength - ); - // - // Slip to the next FindData. - // - Entries = (EFI_ARP_FIND_DATA *) ((UINT8 *) Entries + EntryLength); - } - - return EFI_SUCCESS; -} - -/** - Timeout routine to update arp cache. - - @param Event Pointer to EFI_PXE_BC_PROTOCOL - @param Context Context of the timer event - -**/ -VOID -EFIAPI -ArpCacheUpdateTimeout ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - UpdateArpCache ((EFI_PXE_BASE_CODE_PROTOCOL *) Context); -} - -/** - Do arp resolution from arp cache in PxeBcMode. - - @param PxeBcMode The PXE BC mode to look into. - @param Ip4Addr The Ip4 address for resolution. - @param MacAddress The resoluted MAC address if the resolution is successful. - The value is undefined if resolution fails. - - @retval TRUE The resolution is successful. - @retval FALSE Otherwise. - -**/ -BOOLEAN -FindInArpCache ( - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, - IN EFI_IPv4_ADDRESS *Ip4Addr, - OUT EFI_MAC_ADDRESS *MacAddress - ) -{ - UINT32 Index; - - for (Index = 0; Index < PxeBcMode->ArpCacheEntries; Index ++) { - if (EFI_IP4_EQUAL (&PxeBcMode->ArpCache[Index].IpAddr.v4, Ip4Addr)) { - CopyMem ( - MacAddress, - &PxeBcMode->ArpCache[Index].MacAddr, - sizeof (EFI_MAC_ADDRESS) - ); - return TRUE; - } - } - - return FALSE; -} - -/** - Notify function for the ICMP receive token, used to process - the received ICMP packets. - - @param Context The PXEBC private data. - -**/ -VOID -EFIAPI -IcmpErrorListenHandlerDpc ( - IN VOID *Context - ) -{ - EFI_STATUS Status; - EFI_IP4_RECEIVE_DATA *RxData; - EFI_IP4_PROTOCOL *Ip4; - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - UINTN Index; - UINT32 CopiedLen; - UINT8 *CopiedPointer; - - Private = (PXEBC_PRIVATE_DATA *) Context; - Mode = &Private->Mode; - Status = Private->IcmpErrorRcvToken.Status; - RxData = Private->IcmpErrorRcvToken.Packet.RxData; - Ip4 = Private->Ip4; - - if (Status == EFI_ABORTED) { - // - // The reception is actively aborted by the consumer, directly return. - // - return; - } - - if (RxData == NULL) { - goto Resume; - } - - if (Status != EFI_ICMP_ERROR) { - // - // The return status should be recognized as EFI_ICMP_ERROR. - // - goto CleanUp; - } - - if (EFI_IP4 (RxData->Header->SourceAddress) != 0 && - (NTOHL (Mode->SubnetMask.Addr[0]) != 0) && - IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) && - !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0]))) { - // - // The source address is not zero and it's not a unicast IP address, discard it. - // - goto CleanUp; - } - - if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v4)) { - // - // The dest address is not equal to Station Ip address, discard it. - // - goto CleanUp; - } - - // - // Constructor ICMP error packet - // - CopiedLen = 0; - CopiedPointer = (UINT8 *) &Mode->IcmpError; - - for (Index = 0; Index < RxData->FragmentCount; Index ++) { - CopiedLen += RxData->FragmentTable[Index].FragmentLength; - if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) { - CopyMem ( - CopiedPointer, - RxData->FragmentTable[Index].FragmentBuffer, - RxData->FragmentTable[Index].FragmentLength - ); - } else { - CopyMem ( - CopiedPointer, - RxData->FragmentTable[Index].FragmentBuffer, - CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR) - ); - } - CopiedPointer += CopiedLen; - } - -CleanUp: - gBS->SignalEvent (RxData->RecycleSignal); - -Resume: - Ip4->Receive (Ip4, &(Private->IcmpErrorRcvToken)); -} - -/** - Request IcmpErrorListenHandlerDpc as a DPC at TPL_CALLBACK - - @param Event The event signaled. - @param Context The context passed in by the event notifier. - -**/ -VOID -EFIAPI -IcmpErrorListenHandler ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - // - // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK - // - QueueDpc (TPL_CALLBACK, IcmpErrorListenHandlerDpc, Context); -} - -/** - Enables the use of the PXE Base Code Protocol functions. - - This function enables the use of the PXE Base Code Protocol functions. If the - Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE, then - EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6 formatted - addresses will be used in this session. If UseIpv6 is FALSE, then IPv4 formatted - addresses will be used in this session. If UseIpv6 is TRUE, and the Ipv6Supported - field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then EFI_UNSUPPORTED will - be returned. If there is not enough memory or other resources to start the PXE - Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned. Otherwise, the - PXE Base Code Protocol will be started, and all of the fields of the EFI_PXE_BASE_CODE_MODE - structure will be initialized as follows: - StartedSet to TRUE. - Ipv6SupportedUnchanged. - Ipv6AvailableUnchanged. - UsingIpv6Set to UseIpv6. - BisSupportedUnchanged. - BisDetectedUnchanged. - AutoArpSet to TRUE. - SendGUIDSet to FALSE. - TTLSet to DEFAULT_TTL. - ToSSet to DEFAULT_ToS. - DhcpCompletedSet to FALSE. - ProxyOfferReceivedSet to FALSE. - StationIpSet to an address of all zeros. - SubnetMaskSet to a subnet mask of all zeros. - DhcpDiscoverZero-filled. - DhcpAckZero-filled. - ProxyOfferZero-filled. - PxeDiscoverValidSet to FALSE. - PxeDiscoverZero-filled. - PxeReplyValidSet to FALSE. - PxeReplyZero-filled. - PxeBisReplyValidSet to FALSE. - PxeBisReplyZero-filled. - IpFilterSet the Filters field to 0 and the IpCnt field to 0. - ArpCacheEntriesSet to 0. - ArpCacheZero-filled. - RouteTableEntriesSet to 0. - RouteTableZero-filled. - IcmpErrorReceivedSet to FALSE. - IcmpErrorZero-filled. - TftpErroReceivedSet to FALSE. - TftpErrorZero-filled. - MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is available. - Set to FALSE if the PXE Base Code Callback Protocol is not available. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param UseIpv6 Specifies the type of IP addresses that are to be used during the session - that is being started. Set to TRUE for IPv6 addresses, and FALSE for - IPv4 addresses. - - @retval EFI_SUCCESS The PXE Base Code Protocol was started. - @retval EFI_DEVICE_ERROR The network device encountered an error during this oper - @retval EFI_UNSUPPORTED UseIpv6 is TRUE, but the Ipv6Supported field of the - EFI_PXE_BASE_CODE_MODE structure is FALSE. - @retval EFI_ALREADY_STARTED The PXE Base Code Protocol is already in the started state. - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid - EFI_PXE_BASE_CODE_PROTOCOL structure. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory or other resources to start the - PXE Base Code Protocol. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcStart ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN UseIpv6 - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (Mode->Started) { - return EFI_ALREADY_STARTED; - } - - if (UseIpv6) { - // - // IPv6 is not supported now. - // - return EFI_UNSUPPORTED; - } - - AsciiPrint ("\n>>Start PXE over IPv4"); - - // - // Configure the udp4 instance to let it receive data - // - Status = Private->Udp4Read->Configure ( - Private->Udp4Read, - &Private->Udp4CfgData - ); - if (EFI_ERROR (Status)) { - return Status; - } - - - // - // Configure block size for TFTP as a default value to handle all link layers. - // - Private->BlockSize = MIN (Private->Ip4MaxPacketSize, PXEBC_DEFAULT_PACKET_SIZE) - - PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE; - // - // If PcdTftpBlockSize is set to non-zero, override the default value. - // - if (PcdGet64 (PcdTftpBlockSize) != 0) { - Private->BlockSize = (UINTN) PcdGet64 (PcdTftpBlockSize); - } - - Private->AddressIsOk = FALSE; - - ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE)); - - Mode->Started = TRUE; - Mode->TTL = DEFAULT_TTL; - Mode->ToS = DEFAULT_ToS; - Mode->AutoArp = TRUE; - - // - // Create the event for Arp Cache checking. - // - Status = gBS->CreateEvent ( - EVT_TIMER | EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - ArpCacheUpdateTimeout, - This, - &Private->GetArpCacheEvent - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Start the timeout timer event. - // - Status = gBS->SetTimer ( - Private->GetArpCacheEvent, - TimerPeriodic, - TICKS_PER_SECOND - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Create ICMP error receiving event - // - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - IcmpErrorListenHandler, - Private, - &(Private->IcmpErrorRcvToken.Event) - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - //DHCP4 service allows only one of its children to be configured in - //the active state, If the DHCP4 D.O.R.A started by IP4 auto - //configuration and has not been completed, the Dhcp4 state machine - //will not be in the right state for the PXE to start a new round D.O.R.A. - //so we need to switch it's policy to static. - // - Status = PxeBcSetIp4Policy (Private); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // start to listen incoming packet - // - Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken); - if (!EFI_ERROR (Status)) { - return Status; - } - -ON_EXIT: - Private->Ip4->Configure (Private->Ip4, NULL); - - if (Private->IcmpErrorRcvToken.Event != NULL) { - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); - } - - if (Private->GetArpCacheEvent != NULL) { - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); - gBS->CloseEvent (Private->GetArpCacheEvent); - } - - Mode->Started = FALSE; - Mode->TTL = 0; - Mode->ToS = 0; - Mode->AutoArp = FALSE; - - return Status; -} - - -/** - Disables the use of the PXE Base Code Protocol functions. - - This function stops all activity on the network device. All the resources allocated - in Start() are released, the Started field of the EFI_PXE_BASE_CODE_MODE structure is - set to FALSE and EFI_SUCCESS is returned. If the Started field of the EFI_PXE_BASE_CODE_MODE - structure is already FALSE, then EFI_NOT_STARTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - - @retval EFI_SUCCESS The PXE Base Code Protocol was stopped. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is already in the stopped state. - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid - EFI_PXE_BASE_CODE_PROTOCOL structure. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcStop ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - Private->Ip4->Cancel (Private->Ip4, NULL); - // - // Dispatch the DPCs queued by the NotifyFunction of the canceled rx token's - // events. - // - DispatchDpc (); - - Private->Ip4->Configure (Private->Ip4, NULL); - - // - // Close the ICMP error receiving event. - // - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); - - // - // Cancel the TimeoutEvent timer. - // - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); - - // - // Close the TimeoutEvent event. - // - gBS->CloseEvent (Private->GetArpCacheEvent); - - Mode->Started = FALSE; - - Private->CurrentUdpSrcPort = 0; - Private->Udp4Write->Configure (Private->Udp4Write, NULL); - Private->Udp4Read->Groups (Private->Udp4Read, FALSE, NULL); - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - Private->Dhcp4->Stop (Private->Dhcp4); - Private->Dhcp4->Configure (Private->Dhcp4, NULL); - - Private->FileSize = 0; - - return EFI_SUCCESS; -} - - -/** - Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request / acknowledge) or DHCPv6 - S.A.R.R (solicit / advertise / request / reply) sequence. - - This function attempts to complete the DHCP sequence. If this sequence is completed, - then EFI_SUCCESS is returned, and the DhcpCompleted, ProxyOfferReceived, StationIp, - SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the EFI_PXE_BASE_CODE_MODE - structure are filled in. - If SortOffers is TRUE, then the cached DHCP offer packets will be sorted before - they are tried. If SortOffers is FALSE, then the cached DHCP offer packets will - be tried in the order in which they are received. Please see the Preboot Execution - Environment (PXE) Specification for additional details on the implementation of DHCP. - This function can take at least 31 seconds to timeout and return control to the - caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will be returned. - If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then the DHCP sequence will be stopped and EFI_ABORTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param SortOffers TRUE if the offers received should be sorted. Set to FALSE to try the - offers in the order that they are received. - - @retval EFI_SUCCESS Valid DHCP has completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid - EFI_PXE_BASE_CODE_PROTOCOL structure. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to complete the DHCP Protocol. - @retval EFI_ABORTED The callback function aborted the DHCP Protocol. - @retval EFI_TIMEOUT The DHCP Protocol timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the DHCP session. - @retval EFI_NO_RESPONSE Valid PXE offer was not received. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcDhcp ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN SortOffers - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_DHCP4_CONFIG_DATA Dhcp4CfgData; - EFI_DHCP4_MODE_DATA Dhcp4Mode; - EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; - UINT32 OptCount; - EFI_STATUS Status; - EFI_ARP_CONFIG_DATA ArpConfigData; - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Status = EFI_SUCCESS; - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - Dhcp4 = Private->Dhcp4; - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DHCP; - Private->SortOffers = SortOffers; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - Mode->IcmpErrorReceived = FALSE; - - // - // Stop Udp4Read instance - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - // - // Initialize the DHCP options and build the option list - // - OptCount = PxeBcBuildDhcpOptions (Private, OptList, TRUE); - - // - // Set the DHCP4 config data. - // The four discovery timeouts are 4, 8, 16, 32 seconds respectively. - // - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); - Dhcp4CfgData.OptionCount = OptCount; - Dhcp4CfgData.OptionList = OptList; - Dhcp4CfgData.Dhcp4Callback = PxeBcDhcpCallBack; - Dhcp4CfgData.CallbackContext = Private; - Dhcp4CfgData.DiscoverTryCount = 4; - Dhcp4CfgData.DiscoverTimeout = mPxeDhcpTimeout; - - Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Zero those arrays to record the varies numbers of DHCP OFFERS. - // - Private->GotProxyOffer = FALSE; - Private->NumOffers = 0; - Private->BootpIndex = 0; - ZeroMem (Private->ServerCount, sizeof (Private->ServerCount)); - ZeroMem (Private->ProxyIndex, sizeof (Private->ProxyIndex)); - - Status = Dhcp4->Start (Dhcp4, NULL); - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - goto ON_EXIT; - } - - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - ASSERT (Dhcp4Mode.State == Dhcp4Bound); - - CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof (EFI_IPv4_ADDRESS)); - - CopyMem (&Mode->StationIp, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - - // - // Check the selected offer to see whether BINL is required, if no or BINL is - // finished, set the various Mode members. - // - Status = PxeBcCheckSelectedOffer (Private); - - AsciiPrint ("\n Station IP address is "); - - PxeBcShowIp4Addr (&Private->StationIp.v4); - AsciiPrint ("\n"); - -ON_EXIT: - if (EFI_ERROR (Status)) { - Dhcp4->Stop (Dhcp4); - Dhcp4->Configure (Dhcp4, NULL); - } else { - // - // Remove the previously configured option list and callback function - // - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); - Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); - - Private->AddressIsOk = TRUE; - - if (!Mode->UsingIpv6) { - // - // If in IPv4 mode, configure the corresponding ARP with this new - // station IP address. - // - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); - - ArpConfigData.SwAddressType = 0x0800; - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); - ArpConfigData.StationAddress = &Private->StationIp.v4; - - Private->Arp->Configure (Private->Arp, NULL); - Private->Arp->Configure (Private->Arp, &ArpConfigData); - - // - // Updated the route table. Fill the first entry. - // - Mode->RouteTableEntries = 1; - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].GwAddr.Addr[0] = 0; - - // - // Create the default route entry if there is a default router. - // - if (Private->GatewayIp.Addr[0] != 0) { - Mode->RouteTableEntries = 2; - Mode->RouteTable[1].IpAddr.Addr[0] = 0; - Mode->RouteTable[1].SubnetMask.Addr[0] = 0; - Mode->RouteTable[1].GwAddr.Addr[0] = Private->GatewayIp.Addr[0]; - } - - // - // Flush new station IP address into Udp4CfgData and Ip4ConfigData - // - CopyMem (&Private->Udp4CfgData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->Udp4CfgData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->Ip4ConfigData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - - // - // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address. - // - Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken); - Private->Ip4->Configure (Private->Ip4, NULL); - - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - } - - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData); - - // - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP - // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - // - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; - This->SetIpFilter (This, &IpFilter); - - return Status; -} - - -/** - Attempts to complete the PXE Boot Server and/or boot image discovery sequence. - - This function attempts to complete the PXE Boot Server and/or boot image discovery - sequence. If this sequence is completed, then EFI_SUCCESS is returned, and the - PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields of the - EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, then the - PxeBisReplyReceived and PxeBisReply fields of the EFI_PXE_BASE_CODE_MODE structure - will also be filled in. If UseBis is FALSE, then PxeBisReplyValid will be set to FALSE. - In the structure referenced by parameter Info, the PXE Boot Server list, SrvList[], - has two uses: It is the Boot Server IP address list used for unicast discovery - (if the UseUCast field is TRUE), and it is the list used for Boot Server verification - (if the MustUseList field is TRUE). Also, if the MustUseList field in that structure - is TRUE and the AcceptAnyResponse field in the SrvList[] array is TRUE, any Boot - Server reply of that type will be accepted. If the AcceptAnyResponse field is - FALSE, only responses from Boot Servers with matching IP addresses will be accepted. - This function can take at least 10 seconds to timeout and return control to the - caller. If the Discovery sequence does not complete, then EFI_TIMEOUT will be - returned. Please see the Preboot Execution Environment (PXE) Specification for - additional details on the implementation of the Discovery sequence. - If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then the Discovery sequence is stopped and EFI_ABORTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param Type The type of bootstrap to perform. - @param Layer Pointer to the boot server layer number to discover, which must be - PXE_BOOT_LAYER_INITIAL when a new server type is being - discovered. - @param UseBis TRUE if Boot Integrity Services are to be used. FALSE otherwise. - @param Info Pointer to a data structure that contains additional information on the - type of discovery operation that is to be performed. - - @retval EFI_SUCCESS The Discovery sequence has been completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to complete Discovery. - @retval EFI_ABORTED The callback function aborted the Discovery sequence. - @retval EFI_TIMEOUT The Discovery sequence timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the PXE discovery - session. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcDiscover ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 Type, - IN UINT16 *Layer, - IN BOOLEAN UseBis, - IN EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo; - EFI_PXE_BASE_CODE_DISCOVER_INFO *CreatedInfo; - EFI_PXE_BASE_CODE_SRVLIST *SrvList; - EFI_PXE_BASE_CODE_SRVLIST DefaultSrvList; - PXEBC_CACHED_DHCP4_PACKET *Packet; - PXEBC_VENDOR_OPTION *VendorOpt; - UINT16 Index; - EFI_STATUS Status; - PXEBC_BOOT_SVR_ENTRY *BootSvrEntry; - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - BootSvrEntry = NULL; - SrvList = NULL; - CreatedInfo = NULL; - Status = EFI_DEVICE_ERROR; - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER; - - if (!Private->AddressIsOk) { - return EFI_INVALID_PARAMETER; - } - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - // - // Stop Udp4Read instance - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - Mode->IcmpErrorReceived = FALSE; - - // - // If layer isn't EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL, - // use the previous setting; - // If info isn't offered, - // use the cached DhcpAck and ProxyOffer packets. - // - ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO)); - if (*Layer != EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL) { - - if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - DefaultInfo.IpCnt = 1; - DefaultInfo.UseUCast = TRUE; - - DefaultSrvList.Type = Type; - DefaultSrvList.AcceptAnyResponse = FALSE; - DefaultSrvList.IpAddr.Addr[0] = Private->ServerIp.Addr[0]; - - SrvList = &DefaultSrvList; - Info = &DefaultInfo; - } else if (Info == NULL) { - // - // Create info by the cached packet before - // - Packet = (Mode->ProxyOfferReceived) ? &Private->ProxyOffer : &Private->Dhcp4Ack; - VendorOpt = &Packet->PxeVendorOption; - - if (!Mode->DhcpAckReceived || !IS_VALID_DISCOVER_VENDOR_OPTION (VendorOpt->BitMap)) { - // - // Address is not acquired or no discovery options. - // - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - DefaultInfo.UseMCast = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER (VendorOpt->DiscoverCtrl); - DefaultInfo.UseBCast = (BOOLEAN)!IS_DISABLE_BCAST_DISCOVER (VendorOpt->DiscoverCtrl); - DefaultInfo.MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST (VendorOpt->DiscoverCtrl); - DefaultInfo.UseUCast = DefaultInfo.MustUseList; - - if (DefaultInfo.UseMCast) { - // - // Get the multicast discover ip address from vendor option. - // - CopyMem ( - &DefaultInfo.ServerMCastIp.Addr, - &VendorOpt->DiscoverMcastIp, - sizeof (EFI_IPv4_ADDRESS) - ); - } - - DefaultInfo.IpCnt = 0; - Info = &DefaultInfo; - SrvList = Info->SrvList; - - if (DefaultInfo.MustUseList) { - BootSvrEntry = VendorOpt->BootSvr; - Status = EFI_INVALID_PARAMETER; - - while (((UINT8) (BootSvrEntry - VendorOpt->BootSvr)) < VendorOpt->BootSvrLen) { - - if (BootSvrEntry->Type == HTONS (Type)) { - Status = EFI_SUCCESS; - break; - } - - BootSvrEntry = GET_NEXT_BOOT_SVR_ENTRY (BootSvrEntry); - } - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - DefaultInfo.IpCnt = BootSvrEntry->IpCnt; - - if (DefaultInfo.IpCnt >= 1) { - CreatedInfo = AllocatePool (sizeof (DefaultInfo) + (DefaultInfo.IpCnt - 1) * sizeof (*SrvList)); - if (CreatedInfo == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - - } - - CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo)); - Info = CreatedInfo; - SrvList = Info->SrvList; - } - - for (Index = 0; Index < DefaultInfo.IpCnt; Index++) { - CopyMem (&SrvList[Index].IpAddr, &BootSvrEntry->IpAddr[Index], sizeof (EFI_IPv4_ADDRESS)); - SrvList[Index].AcceptAnyResponse = FALSE; - SrvList[Index].Type = BootSvrEntry->Type; - } - } - - } else { - - SrvList = Info->SrvList; - - if (!SrvList[0].AcceptAnyResponse) { - - for (Index = 1; Index < Info->IpCnt; Index++) { - if (SrvList[Index].AcceptAnyResponse) { - break; - } - } - - if (Index != Info->IpCnt) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - } - } - - if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info->MustUseList && Info->IpCnt == 0)) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Execute discover by UniCast/BroadCast/MultiCast - // - if (Info->UseUCast) { - - for (Index = 0; Index < Info->IpCnt; Index++) { - - if (BootSvrEntry == NULL) { - Private->ServerIp.Addr[0] = SrvList[Index].IpAddr.Addr[0]; - } else { - CopyMem ( - &Private->ServerIp, - &BootSvrEntry->IpAddr[Index], - sizeof (EFI_IPv4_ADDRESS) - ); - } - - Status = PxeBcDiscvBootService ( - Private, - Type, - Layer, - UseBis, - &SrvList[Index].IpAddr, - 0, - NULL, - TRUE, - &Private->PxeReply.Packet.Ack - ); - if (!EFI_ERROR (Status)) { - break; - } - } - - } else if (Info->UseMCast) { - - Status = PxeBcDiscvBootService ( - Private, - Type, - Layer, - UseBis, - &Info->ServerMCastIp, - 0, - NULL, - TRUE, - &Private->PxeReply.Packet.Ack - ); - - } else if (Info->UseBCast) { - - Status = PxeBcDiscvBootService ( - Private, - Type, - Layer, - UseBis, - NULL, - Info->IpCnt, - SrvList, - TRUE, - &Private->PxeReply.Packet.Ack - ); - } - - if (EFI_ERROR (Status) || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } else { - Status = EFI_DEVICE_ERROR; - } - goto ON_EXIT; - } else { - PxeBcParseCachedDhcpPacket (&Private->PxeReply); - } - - if (Mode->PxeBisReplyReceived) { - CopyMem ( - &Private->ServerIp, - &Mode->PxeReply.Dhcpv4.BootpSiAddr, - sizeof (EFI_IPv4_ADDRESS) - ); - } - - if (CreatedInfo != NULL) { - FreePool (CreatedInfo); - } - -ON_EXIT: - - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData); - - // - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP - // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - // - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; - This->SetIpFilter (This, &IpFilter); - - return Status; -} - - -/** - Used to perform TFTP and MTFTP services. - - This function is used to perform TFTP and MTFTP services. This includes the - TFTP operations to get the size of a file, read a directory, read a file, and - write a file. It also includes the MTFTP operations to get the size of a file, - read a directory, and read a file. The type of operation is specified by Operation. - If the callback function that is invoked during the TFTP/MTFTP operation does - not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will - be returned. - For read operations, the return data will be placed in the buffer specified by - BufferPtr. If BufferSize is too small to contain the entire downloaded file, - then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set to zero - or the size of the requested file (the size of the requested file is only returned - if the TFTP server supports TFTP options). If BufferSize is large enough for the - read operation, then BufferSize will be set to the size of the downloaded file, - and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() services - should use the get-file-size operations to determine the size of the downloaded - file prior to using the read-file operations-especially when downloading large - (greater than 64 MB) files-instead of making two calls to the read-file operation. - Following this recommendation will save time if the file is larger than expected - and the TFTP server does not support TFTP option extensions. Without TFTP option - extension support, the client has to download the entire file, counting and discarding - the received packets, to determine the file size. - For write operations, the data to be sent is in the buffer specified by BufferPtr. - BufferSize specifies the number of bytes to send. If the write operation completes - successfully, then EFI_SUCCESS will be returned. - For TFTP "get file size" operations, the size of the requested file or directory - is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP server - does not support options, the file will be downloaded into a bit bucket and the - length of the downloaded file will be returned. For MTFTP "get file size" operations, - if the MTFTP server does not support the "get file size" option, EFI_UNSUPPORTED - will be returned. - This function can take up to 10 seconds to timeout and return control to the caller. - If the TFTP sequence does not complete, EFI_TIMEOUT will be returned. - If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then the TFTP sequence is stopped and EFI_ABORTED will be returned. - The format of the data returned from a TFTP read directory operation is a null-terminated - filename followed by a null-terminated information string, of the form - "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - note that - the seconds field can be a decimal number), where the date and time are UTC. For - an MTFTP read directory command, there is additionally a null-terminated multicast - IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The final - entry is itself null-terminated, so that the final information string is terminated - with two null octets. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param Operation The type of operation to perform. - @param BufferPtr A pointer to the data buffer. - @param Overwrite Only used on write file operations. TRUE if a file on a remote server can - be overwritten. - @param BufferSize For get-file-size operations, *BufferSize returns the size of the - requested file. - @param BlockSize The requested block size to be used during a TFTP transfer. - @param ServerIp The TFTP / MTFTP server IP address. - @param Filename A Null-terminated ASCII string that specifies a directory name or a file - name. - @param Info Pointer to the MTFTP information. - @param DontUseBuffer Set to FALSE for normal TFTP and MTFTP read file operation. - - @retval EFI_SUCCESS The TFTP/MTFTP operation was completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_BUFFER_TOO_SMALL The buffer is not large enough to complete the read operation. - @retval EFI_ABORTED The callback function aborted the TFTP/MTFTP operation. - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the MTFTP session. - @retval EFI_TFTP_ERROR A TFTP error packet was received during the MTFTP session. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcMtftp ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, - IN OUT VOID *BufferPtr, - IN BOOLEAN Overwrite, - IN OUT UINT64 *BufferSize, - IN UINTN *BlockSize OPTIONAL, - IN EFI_IP_ADDRESS *ServerIp, - IN UINT8 *Filename, - IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL, - IN BOOLEAN DontUseBuffer - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_MTFTP4_CONFIG_DATA Mtftp4Config; - EFI_STATUS Status; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_MAC_ADDRESS TempMacAddr; - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; - - if ((This == NULL) || - (Filename == NULL) || - (BufferSize == NULL) || - ((ServerIp == NULL) || - (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) || - IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0])))) || - ((BufferPtr == NULL) && DontUseBuffer) || - ((BlockSize != NULL) && (*BlockSize < 512))) { - - return EFI_INVALID_PARAMETER; - } - - Status = EFI_DEVICE_ERROR; - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = &Private->Mode; - - if (!Mode->AutoArp) { - // - // If AutoArp is set false, check arp cache - // - UpdateArpCache (This); - if (!FindInArpCache (Mode, &ServerIp->v4, &TempMacAddr)) { - return EFI_DEVICE_ERROR; - } - } - - // - // Stop Udp4Read instance - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - Mode->TftpErrorReceived = FALSE; - Mode->IcmpErrorReceived = FALSE; - - Mtftp4Config.UseDefaultSetting = FALSE; - Mtftp4Config.TimeoutValue = PXEBC_MTFTP_TIMEOUT; - Mtftp4Config.TryCount = PXEBC_MTFTP_RETRIES; - - CopyMem ( - &Mtftp4Config.StationIp, - &Private->StationIp, - sizeof (EFI_IPv4_ADDRESS) - ); - CopyMem ( - &Mtftp4Config.SubnetMask, - &Private->SubnetMask, - sizeof (EFI_IPv4_ADDRESS) - ); - CopyMem ( - &Mtftp4Config.GatewayIp, - &Private->GatewayIp, - sizeof (EFI_IPv4_ADDRESS) - ); - CopyMem ( - &Mtftp4Config.ServerIp, - ServerIp, - sizeof (EFI_IPv4_ADDRESS) - ); - - switch (Operation) { - - case EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE: - - Status = PxeBcTftpGetFileSize ( - Private, - &Mtftp4Config, - Filename, - BlockSize, - BufferSize - ); - - break; - - case EFI_PXE_BASE_CODE_TFTP_READ_FILE: - - Status = PxeBcTftpReadFile ( - Private, - &Mtftp4Config, - Filename, - BlockSize, - BufferPtr, - BufferSize, - DontUseBuffer - ); - - break; - - case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE: - - Status = PxeBcTftpWriteFile ( - Private, - &Mtftp4Config, - Filename, - Overwrite, - BlockSize, - BufferPtr, - BufferSize - ); - - break; - - case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY: - - Status = PxeBcTftpReadDirectory ( - Private, - &Mtftp4Config, - Filename, - BlockSize, - BufferPtr, - BufferSize, - DontUseBuffer - ); - - break; - - case EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE: - case EFI_PXE_BASE_CODE_MTFTP_READ_FILE: - case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY: - Status = EFI_UNSUPPORTED; - break; - - default: - - Status = EFI_INVALID_PARAMETER; - break; - } - - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - -ON_EXIT: - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData); - // - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP - // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - // - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; - This->SetIpFilter (This, &IpFilter); - - return Status; -} - - -/** - Writes a UDP packet to the network interface. - - This function writes a UDP packet specified by the (optional HeaderPtr and) - BufferPtr parameters to the network interface. The UDP header is automatically - built by this routine. It uses the parameters OpFlags, DestIp, DestPort, GatewayIp, - SrcIp, and SrcPort to build this header. If the packet is successfully built and - transmitted through the network interface, then EFI_SUCCESS will be returned. - If a timeout occurs during the transmission of the packet, then EFI_TIMEOUT will - be returned. If an ICMP error occurs during the transmission of the packet, then - the IcmpErrorReceived field is set to TRUE, the IcmpError field is filled in and - EFI_ICMP_ERROR will be returned. If the Callback Protocol does not return - EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param OpFlags The UDP operation flags. - @param DestIp The destination IP address. - @param DestPort The destination UDP port number. - @param GatewayIp The gateway IP address. - @param SrcIp The source IP address. - @param SrcPort The source UDP port number. - @param HeaderSize An optional field which may be set to the length of a header at - HeaderPtr to be prefixed to the data at BufferPtr. - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to be prefixed to the - data at BufferPtr. - @param BufferSize A pointer to the size of the data at BufferPtr. - @param BufferPtr A pointer to the data to be written. - - @retval EFI_SUCCESS The UDP Write operation was completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_BAD_BUFFER_SIZE The buffer is too long to be transmitted. - @retval EFI_ABORTED The callback function aborted the UDP Write operation. - @retval EFI_TIMEOUT The UDP Write operation timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the UDP write session. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcUdpWrite ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN EFI_IP_ADDRESS *DestIp, - IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, - IN EFI_IP_ADDRESS *GatewayIp OPTIONAL, - IN EFI_IP_ADDRESS *SrcIp OPTIONAL, - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, - IN UINTN *HeaderSize OPTIONAL, - IN VOID *HeaderPtr OPTIONAL, - IN UINTN *BufferSize, - IN VOID *BufferPtr - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_UDP4_PROTOCOL *Udp4; - EFI_UDP4_COMPLETION_TOKEN Token; - EFI_UDP4_TRANSMIT_DATA *Udp4TxData; - UINT32 FragCount; - UINT32 DataLength; - EFI_UDP4_SESSION_DATA Udp4Session; - EFI_STATUS Status; - BOOLEAN IsDone; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_MAC_ADDRESS TempMacAddr; - - IsDone = FALSE; - - if ((This == NULL) || (DestIp == NULL) || (DestPort == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if ((GatewayIp != NULL) && (IP4_IS_UNSPECIFIED (NTOHL (GatewayIp->Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (GatewayIp->Addr[0])))) { - // - // Gateway is provided but it's not a unicast IP address. - // - return EFI_INVALID_PARAMETER; - } - - if ((HeaderSize != NULL) && ((*HeaderSize == 0) || (HeaderPtr == NULL))) { - // - // The HeaderSize ptr isn't NULL and: 1. the value is zero; or 2. the HeaderPtr - // is NULL. - // - return EFI_INVALID_PARAMETER; - } - - if ((BufferSize == NULL) || ((*BufferSize != 0) && (BufferPtr == NULL))) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Udp4 = Private->Udp4Write; - Mode = &Private->Mode; - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (!Private->AddressIsOk && (SrcIp == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if (!Mode->AutoArp) { - // - // If AutoArp is set false, check arp cache - // - UpdateArpCache (This); - if (!FindInArpCache (Mode, &DestIp->v4, &TempMacAddr)) { - return EFI_DEVICE_ERROR; - } - } - - Mode->IcmpErrorReceived = FALSE; - - if ((Private->CurrentUdpSrcPort == 0) || - ((SrcPort != NULL) && (*SrcPort != Private->CurrentUdpSrcPort))) { - // - // Port is changed, (re)configure the Udp4Write instance - // - if (SrcPort != NULL) { - Private->CurrentUdpSrcPort = *SrcPort; - } - } - - Status = PxeBcConfigureUdpWriteInstance ( - Udp4, - &Private->StationIp.v4, - &Private->SubnetMask.v4, - &Private->GatewayIp.v4, - &Private->CurrentUdpSrcPort, - Private->Mode.TTL, - Private->Mode.ToS - ); - if (EFI_ERROR (Status)) { - Private->CurrentUdpSrcPort = 0; - return EFI_INVALID_PARAMETER; - } - - ZeroMem (&Token, sizeof (EFI_UDP4_COMPLETION_TOKEN)); - ZeroMem (&Udp4Session, sizeof (EFI_UDP4_SESSION_DATA)); - - CopyMem (&Udp4Session.DestinationAddress, DestIp, sizeof (EFI_IPv4_ADDRESS)); - Udp4Session.DestinationPort = *DestPort; - if (SrcIp != NULL) { - CopyMem (&Udp4Session.SourceAddress, SrcIp, sizeof (EFI_IPv4_ADDRESS)); - } - if (SrcPort != NULL) { - Udp4Session.SourcePort = *SrcPort; - } - - FragCount = (HeaderSize != NULL) ? 2 : 1; - Udp4TxData = (EFI_UDP4_TRANSMIT_DATA *) AllocateZeroPool (sizeof (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof (EFI_UDP4_FRAGMENT_DATA)); - if (Udp4TxData == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Udp4TxData->FragmentCount = FragCount; - Udp4TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) *BufferSize; - Udp4TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr; - DataLength = (UINT32) *BufferSize; - - if (FragCount == 2) { - - Udp4TxData->FragmentTable[0].FragmentLength = (UINT32) *HeaderSize; - Udp4TxData->FragmentTable[0].FragmentBuffer = HeaderPtr; - DataLength += (UINT32) *HeaderSize; - } - - if (GatewayIp != NULL) { - Udp4TxData->GatewayAddress = (EFI_IPv4_ADDRESS *) GatewayIp; - } - Udp4TxData->UdpSessionData = &Udp4Session; - Udp4TxData->DataLength = DataLength; - Token.Packet.TxData = Udp4TxData; - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - PxeBcCommonNotify, - &IsDone, - &Token.Event - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Udp4->Transmit (Udp4, &Token); - if (EFI_ERROR (Status)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - goto ON_EXIT; - } - - while (!IsDone) { - - Udp4->Poll (Udp4); - } - - Status = Token.Status; - -ON_EXIT: - - if (Token.Event != NULL) { - gBS->CloseEvent (Token.Event); - } - - FreePool (Udp4TxData); - - // - // Reset the instance. - // - Udp4->Configure (Udp4, NULL); - return Status; -} - -/** - Decide whether the incoming UDP packet is acceptable per IP filter settings - in provided PxeBcMode. - - @param PxeBcMode Pointer to EFI_PXE_BASE_CODE_MODE. - @param Session Received UDP session. - - @retval TRUE The UDP package matches IP filters. - @retval FALSE The UDP package doesn't matches IP filters. - -**/ -BOOLEAN -CheckIpByFilter ( - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, - IN EFI_UDP4_SESSION_DATA *Session - ) -{ - UINTN Index; - EFI_IPv4_ADDRESS Ip4Address; - EFI_IPv4_ADDRESS DestIp4Address; - - if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) { - return TRUE; - } - - CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof (DestIp4Address)); - if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) && - IP4_IS_MULTICAST (EFI_NTOHL (DestIp4Address)) - ) { - return TRUE; - } - - if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) && - IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address)) - ) { - return TRUE; - } - - CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address)); - if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) && - EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address) - ) { - return TRUE; - } - - ASSERT (PxeBcMode->IpFilter.IpCnt < EFI_PXE_BASE_CODE_MAX_IPCNT); - - for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; Index++) { - CopyMem ( - &Ip4Address, - &PxeBcMode->IpFilter.IpList[Index].v4, - sizeof (Ip4Address) - ); - if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) { - return TRUE; - } - } - - return FALSE; -} - -/** - Reads a UDP packet from the network interface. - - This function reads a UDP packet from a network interface. The data contents - are returned in (the optional HeaderPtr and) BufferPtr, and the size of the - buffer received is returned in BufferSize . If the input BufferSize is smaller - than the UDP packet received (less optional HeaderSize), it will be set to the - required size, and EFI_BUFFER_TOO_SMALL will be returned. In this case, the - contents of BufferPtr are undefined, and the packet is lost. If a UDP packet is - successfully received, then EFI_SUCCESS will be returned, and the information - from the UDP header will be returned in DestIp, DestPort, SrcIp, and SrcPort if - they are not NULL. Depending on the values of OpFlags and the DestIp, DestPort, - SrcIp, and SrcPort input values, different types of UDP packet receive filtering - will be performed. The following tables summarize these receive filter operations. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param OpFlags The UDP operation flags. - @param DestIp The destination IP address. - @param DestPort The destination UDP port number. - @param SrcIp The source IP address. - @param SrcPort The source UDP port number. - @param HeaderSize An optional field which may be set to the length of a header at - HeaderPtr to be prefixed to the data at BufferPtr. - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to be prefixed to the - data at BufferPtr. - @param BufferSize A pointer to the size of the data at BufferPtr. - @param BufferPtr A pointer to the data to be read. - - @retval EFI_SUCCESS The UDP Read operation was completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_BUFFER_TOO_SMALL The packet is larger than Buffer can hold. - @retval EFI_ABORTED The callback function aborted the UDP Read operation. - @retval EFI_TIMEOUT The UDP Read operation timed out. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcUdpRead ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, - IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, - IN UINTN *HeaderSize OPTIONAL, - IN VOID *HeaderPtr OPTIONAL, - IN OUT UINTN *BufferSize, - IN VOID *BufferPtr - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_UDP4_PROTOCOL *Udp4; - EFI_UDP4_COMPLETION_TOKEN Token; - EFI_UDP4_RECEIVE_DATA *RxData; - EFI_UDP4_SESSION_DATA *Session; - EFI_STATUS Status; - BOOLEAN IsDone; - BOOLEAN Matched; - UINTN CopiedLen; - UINTN HeaderLen; - UINTN HeaderCopiedLen; - UINTN BufferCopiedLen; - UINT32 FragmentLength; - UINTN FragmentIndex; - UINT8 *FragmentBuffer; - - if (This == NULL || DestIp == NULL || DestPort == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (DestPort == NULL)) || - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (SrcIp == NULL)) || - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) == 0 && (SrcPort == NULL))) { - return EFI_INVALID_PARAMETER; - } - - if (((HeaderSize != NULL) && (*HeaderSize == 0)) || ((HeaderSize != NULL) && (HeaderPtr == NULL))) { - return EFI_INVALID_PARAMETER; - } - - if ((BufferSize == NULL) || (BufferPtr == NULL)) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - Udp4 = Private->Udp4Read; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - Mode->IcmpErrorReceived = FALSE; - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - PxeBcCommonNotify, - &IsDone, - &Token.Event - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - -TRY_AGAIN: - - IsDone = FALSE; - Status = Udp4->Receive (Udp4, &Token); - if (EFI_ERROR (Status)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - goto ON_EXIT; - } - - Udp4->Poll (Udp4); - - if (!IsDone) { - Status = EFI_TIMEOUT; - } else { - - // - // check whether this packet matches the filters - // - if (EFI_ERROR (Token.Status)){ - goto ON_EXIT; - } - - RxData = Token.Packet.RxData; - Session = &RxData->UdpSession; - - Matched = TRUE; - - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) { - Matched = FALSE; - // - // Check UDP package by IP filter settings - // - if (CheckIpByFilter (Mode, Session)) { - Matched = TRUE; - } - } - - if (Matched) { - Matched = FALSE; - - // - // Match the destination ip of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) { - Matched = TRUE; - - if (DestIp != NULL) { - CopyMem (DestIp, &Session->DestinationAddress, sizeof (EFI_IPv4_ADDRESS)); - } - } else { - if (DestIp != NULL) { - if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) { - Matched = TRUE; - } - } else { - if (EFI_IP4_EQUAL (&Private->StationIp, &Session->DestinationAddress)) { - Matched = TRUE; - } - } - } - } - - if (Matched) { - // - // Match the destination port of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0) { - - if (DestPort != NULL) { - *DestPort = Session->DestinationPort; - } - } else { - - if (*DestPort != Session->DestinationPort) { - Matched = FALSE; - } - } - } - - if (Matched) { - // - // Match the source ip of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) { - - if (SrcIp != NULL) { - CopyMem (SrcIp, &Session->SourceAddress, sizeof (EFI_IPv4_ADDRESS)); - } - } else { - - if (!EFI_IP4_EQUAL (SrcIp, &Session->SourceAddress)) { - Matched = FALSE; - } - } - } - - if (Matched) { - // - // Match the source port of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != 0) { - - if (SrcPort != NULL) { - *SrcPort = Session->SourcePort; - } - } else { - - if (*SrcPort != Session->SourcePort) { - Matched = FALSE; - } - } - } - - if (Matched) { - ASSERT (RxData != NULL); - - HeaderLen = 0; - if (HeaderSize != NULL) { - HeaderLen = MIN (*HeaderSize, RxData->DataLength); - } - - if (RxData->DataLength - HeaderLen > *BufferSize) { - Status = EFI_BUFFER_TOO_SMALL; - } else { - *HeaderSize = HeaderLen; - *BufferSize = RxData->DataLength - HeaderLen; - - HeaderCopiedLen = 0; - BufferCopiedLen = 0; - for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; FragmentIndex++) { - FragmentLength = RxData->FragmentTable[FragmentIndex].FragmentLength; - FragmentBuffer = RxData->FragmentTable[FragmentIndex].FragmentBuffer; - if (HeaderCopiedLen + FragmentLength < HeaderLen) { - // - // Copy the header part of received data. - // - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, FragmentLength); - HeaderCopiedLen += FragmentLength; - } else if (HeaderCopiedLen < HeaderLen) { - // - // Copy the header part of received data. - // - CopiedLen = HeaderLen - HeaderCopiedLen; - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, CopiedLen); - HeaderCopiedLen += CopiedLen; - - // - // Copy the other part of received data. - // - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer + CopiedLen, FragmentLength - CopiedLen); - BufferCopiedLen += (FragmentLength - CopiedLen); - } else { - // - // Copy the other part of received data. - // - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer, FragmentLength); - BufferCopiedLen += FragmentLength; - } - } - } - } else { - - Status = EFI_TIMEOUT; - } - - // - // Recycle the RxData - // - gBS->SignalEvent (RxData->RecycleSignal); - - if (!Matched) { - goto TRY_AGAIN; - } - } - -ON_EXIT: - - Udp4->Cancel (Udp4, &Token); - - gBS->CloseEvent (Token.Event); - - return Status; -} - -/** - Updates the IP receive filters of a network device and enables software filtering. - - The NewFilter field is used to modify the network device's current IP receive - filter settings and to enable a software filter. This function updates the IpFilter - field of the EFI_PXE_BASE_CODE_MODE structure with the contents of NewIpFilter. - The software filter is used when the USE_FILTER in OpFlags is set to UdpRead(). - The current hardware filter remains in effect no matter what the settings of OpFlags - are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() is from those - packets whose reception is enabled in hardware-physical NIC address (unicast), - broadcast address, logical address or addresses (multicast), or all (promiscuous). - UdpRead() does not modify the IP filter settings. - Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP receive - filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - If an application or driver wishes to preserve the IP receive filter settings, - it will have to preserve the IP receive filter settings before these calls, and - use SetIpFilter() to restore them after the calls. If incompatible filtering is - requested (for example, PROMISCUOUS with anything else) or if the device does not - support a requested filter setting and it cannot be accommodated in software - (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER will be returned. - The IPlist field is used to enable IPs other than the StationIP. They may be - multicast or unicast. If IPcnt is set as well as EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP, - then both the StationIP and the IPs from the IPlist will be used. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewFilter Pointer to the new set of IP receive filters. - - @retval EFI_SUCCESS The IP receive filter settings were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetIpFilter ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter - ) -{ - EFI_STATUS Status; - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - UINTN Index; - EFI_UDP4_CONFIG_DATA *Udp4Cfg; - BOOLEAN PromiscuousNeed; - BOOLEAN AcceptPromiscuous; - BOOLEAN AcceptBroadcast; - BOOLEAN MultiCastUpdate; - - if (This == NULL) { - DEBUG ((EFI_D_ERROR, "This == NULL.\n")); - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (NewFilter == NULL) { - DEBUG ((EFI_D_ERROR, "NewFilter == NULL.\n")); - return EFI_INVALID_PARAMETER; - } - - if (NewFilter->IpCnt > EFI_PXE_BASE_CODE_MAX_IPCNT) { - DEBUG ((EFI_D_ERROR, "NewFilter->IpCnt > %d.\n", EFI_PXE_BASE_CODE_MAX_IPCNT)); - return EFI_INVALID_PARAMETER; - } - - if (!Mode->Started) { - DEBUG ((EFI_D_ERROR, "BC was not started.\n")); - return EFI_NOT_STARTED; - } - - if (Mode->UsingIpv6) { - DEBUG ((EFI_D_ERROR, "This driver is PXE for IPv4 Only.\n")); - return EFI_INVALID_PARAMETER; - } - - PromiscuousNeed = FALSE; - - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { - if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) { - // - // The IP is a broadcast address. - // - DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n")); - return EFI_INVALID_PARAMETER; - } - if ((EFI_NTOHL(Mode->StationIp) != 0) && - (EFI_NTOHL(Mode->SubnetMask) != 0) && - IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) && - NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) && - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0)) { - // - // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is in IpList, - // promiscuous mode is needed. - // - PromiscuousNeed = TRUE; - } - } - - AcceptPromiscuous = FALSE; - AcceptBroadcast = FALSE; - MultiCastUpdate = FALSE; - - if (PromiscuousNeed || - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) || - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) - ) { - // - // Configure the udp4 filter to receive all packages. - // - AcceptPromiscuous = TRUE; - } else if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) { - // - // Configure the udp4 filter to receive all broadcast packages. - // - AcceptBroadcast = TRUE; - } - - // - // In multicast condition when Promiscuous FALSE and IpCnt no-zero. - // Here check if there is any update of the multicast ip address. If yes, - // we need leave the old multicast group (by Config UDP instance to NULL), - // and join the new multicast group. - // - if (!AcceptPromiscuous) { - if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) { - if (Mode->IpFilter.IpCnt != NewFilter->IpCnt) { - MultiCastUpdate = TRUE; - } else if (CompareMem (Mode->IpFilter.IpList, NewFilter->IpList, NewFilter->IpCnt * sizeof (EFI_IP_ADDRESS)) != 0 ) { - MultiCastUpdate = TRUE; - } - } - } - - // - // Check whether we need reconfigure the UDP instance. - // - Udp4Cfg = &Private->Udp4CfgData; - if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous) || - (AcceptBroadcast != Udp4Cfg->AcceptBroadcast) || MultiCastUpdate) { - // - // Clear the UDP instance configuration, all joined groups will be left - // during the operation. - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - // - // Configure the UDP instance with the new configuration. - // - Udp4Cfg->AcceptPromiscuous = AcceptPromiscuous; - Udp4Cfg->AcceptBroadcast = AcceptBroadcast; - Status = Private->Udp4Read->Configure (Private->Udp4Read, Udp4Cfg); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // In not Promiscuous mode, need to join the new multicast group. - // - if (!AcceptPromiscuous) { - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { - if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) { - // - // Join the mutilcast group. - // - Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE, &NewFilter->IpList[Index].v4); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - } - } - - - // - // Save the new filter. - // - CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter)); - - return EFI_SUCCESS; -} - - -/** - Uses the ARP protocol to resolve a MAC address. - - This function uses the ARP protocol to resolve a MAC address. The UsingIpv6 field - of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 or IPv6 - addresses are being used. The IP address specified by IpAddr is used to resolve - a MAC address. If the ARP protocol succeeds in resolving the specified address, - then the ArpCacheEntries and ArpCache fields of the EFI_PXE_BASE_CODE_MODE structure - are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the resolved - MAC address is placed there as well. If the PXE Base Code protocol is in the - stopped state, then EFI_NOT_STARTED is returned. If the ARP protocol encounters - a timeout condition while attempting to resolve an address, then EFI_TIMEOUT is - returned. If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then EFI_ABORTED is returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param IpAddr Pointer to the IP address that is used to resolve a MAC address. - @param MacAddr If not NULL, a pointer to the MAC address that was resolved with the - ARP protocol. - - @retval EFI_SUCCESS The IP or MAC address was resolved. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_ICMP_ERROR Something error occur with the ICMP packet message. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcArp ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN EFI_IP_ADDRESS * IpAddr, - IN EFI_MAC_ADDRESS * MacAddr OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - EFI_MAC_ADDRESS TempMacAddr; - - if (This == NULL || IpAddr == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (!Private->AddressIsOk || Mode->UsingIpv6) { - // - // We can't resolve the IP address if we don't have a local address now. - // Don't have ARP for IPv6. - // - return EFI_INVALID_PARAMETER; - } - - Mode->IcmpErrorReceived = FALSE; - - if (!Mode->AutoArp) { - // - // If AutoArp is set false, check arp cache - // - UpdateArpCache (This); - if (!FindInArpCache (Mode, &IpAddr->v4, &TempMacAddr)) { - return EFI_DEVICE_ERROR; - } - } else { - Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL, &TempMacAddr); - if (EFI_ERROR (Status)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - return Status; - } - } - - if (MacAddr != NULL) { - CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS)); - } - - return EFI_SUCCESS; -} - -/** - Updates the parameters that affect the operation of the PXE Base Code Protocol. - - This function sets parameters that affect the operation of the PXE Base Code Protocol. - The parameter specified by NewAutoArp is used to control the generation of ARP - protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets will be generated - as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, then no ARP - Protocol packets will be generated. In this case, the only mappings that are - available are those stored in the ArpCache of the EFI_PXE_BASE_CODE_MODE structure. - If there are not enough mappings in the ArpCache to perform a PXE Base Code Protocol - service, then the service will fail. This function updates the AutoArp field of - the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp. - The SetParameters() call must be invoked after a Callback Protocol is installed - to enable the use of callbacks. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewAutoArp If not NULL, a pointer to a value that specifies whether to replace the - current value of AutoARP. - @param NewSendGUID If not NULL, a pointer to a value that specifies whether to replace the - current value of SendGUID. - @param NewTTL If not NULL, a pointer to be used in place of the current value of TTL, - the "time to live" field of the IP header. - @param NewToS If not NULL, a pointer to be used in place of the current value of ToS, - the "type of service" field of the IP header. - @param NewMakeCallback If not NULL, a pointer to a value that specifies whether to replace the - current value of the MakeCallback field of the Mode structure. - - @retval EFI_SUCCESS The new parameters values were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetParameters ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN *NewAutoArp OPTIONAL, - IN BOOLEAN *NewSendGUID OPTIONAL, - IN UINT8 *NewTTL OPTIONAL, - IN UINT8 *NewToS OPTIONAL, - IN BOOLEAN *NewMakeCallback // OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - - Status = EFI_SUCCESS; - - if (This == NULL) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (NewSendGUID != NULL && *NewSendGUID) { - // - // FixMe, cann't locate SendGuid - // - } - - if (NewMakeCallback != NULL && *NewMakeCallback) { - - Status = gBS->HandleProtocol ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - (VOID **) &Private->PxeBcCallback - ); - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - } - - if (!Mode->Started) { - Status = EFI_NOT_STARTED; - goto ON_EXIT; - } - - if (NewMakeCallback != NULL) { - - if (*NewMakeCallback) { - // - // Update the Callback protocol. - // - Status = gBS->HandleProtocol ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - (VOID **) &Private->PxeBcCallback - ); - - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - } else { - Private->PxeBcCallback = NULL; - } - - Mode->MakeCallbacks = *NewMakeCallback; - } - - if (NewAutoArp != NULL) { - Mode->AutoArp = *NewAutoArp; - } - - if (NewSendGUID != NULL) { - Mode->SendGUID = *NewSendGUID; - } - - if (NewTTL != NULL) { - Mode->TTL = *NewTTL; - } - - if (NewToS != NULL) { - Mode->ToS = *NewToS; - } - -ON_EXIT: - return Status; -} - -/** - Updates the station IP address and/or subnet mask values of a network device. - - This function updates the station IP address and/or subnet mask values of a network - device. The NewStationIp field is used to modify the network device's current IP address. - If NewStationIP is NULL, then the current IP address will not be modified. Otherwise, - this function updates the StationIp field of the EFI_PXE_BASE_CODE_MODE structure - with NewStationIp. The NewSubnetMask field is used to modify the network device's current subnet - mask. If NewSubnetMask is NULL, then the current subnet mask will not be modified. - Otherwise, this function updates the SubnetMask field of the EFI_PXE_BASE_CODE_MODE - structure with NewSubnetMask. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewStationIp Pointer to the new IP address to be used by the network device. - @param NewSubnetMask Pointer to the new subnet mask to be used by the network device. - - @retval EFI_SUCCESS The new station IP address and/or subnet mask were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetStationIP ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN EFI_IP_ADDRESS * NewStationIp OPTIONAL, - IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_ARP_CONFIG_DATA ArpConfigData; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL (NewSubnetMask->Addr[0]))) { - return EFI_INVALID_PARAMETER; - } - - if (NewStationIp != NULL) { - if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) || - IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) || - (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0 && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0])))) { - return EFI_INVALID_PARAMETER; - } - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (NewStationIp != NULL) { - CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS)); - CopyMem (&Private->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS)); - } - - if (NewSubnetMask != NULL) { - CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof (EFI_IP_ADDRESS)); - CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof (EFI_IP_ADDRESS)); - } - - Private->AddressIsOk = TRUE; - - if (!Mode->UsingIpv6) { - // - // If in IPv4 mode, configure the corresponding ARP with this new - // station IP address. - // - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); - - ArpConfigData.SwAddressType = 0x0800; - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); - ArpConfigData.StationAddress = &Private->StationIp.v4; - - Private->Arp->Configure (Private->Arp, NULL); - Private->Arp->Configure (Private->Arp, &ArpConfigData); - - // - // Update the route table. - // - Mode->RouteTableEntries = 1; - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].GwAddr.Addr[0] = 0; - } - - return EFI_SUCCESS; -} - -/** - Updates the contents of the cached DHCP and Discover packets. - - The pointers to the new packets are used to update the contents of the cached - packets in the EFI_PXE_BASE_CODE_MODE structure. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewDhcpDiscoverValid Pointer to a value that will replace the current - DhcpDiscoverValid field. - @param NewDhcpAckReceived Pointer to a value that will replace the current - DhcpAckReceived field. - @param NewProxyOfferReceived Pointer to a value that will replace the current - ProxyOfferReceived field. - @param NewPxeDiscoverValid Pointer to a value that will replace the current - ProxyOfferReceived field. - @param NewPxeReplyReceived Pointer to a value that will replace the current - PxeReplyReceived field. - @param NewPxeBisReplyReceived Pointer to a value that will replace the current - PxeBisReplyReceived field. - @param NewDhcpDiscover Pointer to the new cached DHCP Discover packet contents. - @param NewDhcpAck Pointer to the new cached DHCP Ack packet contents. - @param NewProxyOffer Pointer to the new cached Proxy Offer packet contents. - @param NewPxeDiscover Pointer to the new cached PXE Discover packet contents. - @param NewPxeReply Pointer to the new cached PXE Reply packet contents. - @param NewPxeBisReply Pointer to the new cached PXE BIS Reply packet contents. - - @retval EFI_SUCCESS The cached packet contents were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER This is NULL or not point to a valid EFI_PXE_BASE_CODE_PROTOCOL structure. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetPackets ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN BOOLEAN * NewDhcpDiscoverValid OPTIONAL, - IN BOOLEAN * NewDhcpAckReceived OPTIONAL, - IN BOOLEAN * NewProxyOfferReceived OPTIONAL, - IN BOOLEAN * NewPxeDiscoverValid OPTIONAL, - IN BOOLEAN * NewPxeReplyReceived OPTIONAL, - IN BOOLEAN * NewPxeBisReplyReceived OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (NewDhcpDiscoverValid != NULL) { - Mode->DhcpDiscoverValid = *NewDhcpDiscoverValid; - } - - if (NewDhcpAckReceived != NULL) { - Mode->DhcpAckReceived = *NewDhcpAckReceived; - } - - if (NewProxyOfferReceived != NULL) { - Mode->ProxyOfferReceived = *NewProxyOfferReceived; - } - - if (NewPxeDiscoverValid != NULL) { - Mode->PxeDiscoverValid = *NewPxeDiscoverValid; - } - - if (NewPxeReplyReceived != NULL) { - Mode->PxeReplyReceived = *NewPxeReplyReceived; - } - - if (NewPxeBisReplyReceived != NULL) { - Mode->PxeBisReplyReceived = *NewPxeBisReplyReceived; - } - - if (NewDhcpDiscover != NULL) { - CopyMem (&Mode->DhcpDiscover, NewDhcpDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewDhcpAck != NULL) { - CopyMem (&Mode->DhcpAck, NewDhcpAck, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewProxyOffer != NULL) { - CopyMem (&Mode->ProxyOffer, NewProxyOffer, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewPxeDiscover != NULL) { - CopyMem (&Mode->PxeDiscover, NewPxeDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewPxeReply != NULL) { - CopyMem (&Mode->PxeReply, NewPxeReply, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewPxeBisReply != NULL) { - CopyMem (&Mode->PxeBisReply, NewPxeBisReply, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - return EFI_SUCCESS; -} - -EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate = { - EFI_PXE_BASE_CODE_PROTOCOL_REVISION, - EfiPxeBcStart, - EfiPxeBcStop, - EfiPxeBcDhcp, - EfiPxeBcDiscover, - EfiPxeBcMtftp, - EfiPxeBcUdpWrite, - EfiPxeBcUdpRead, - EfiPxeBcSetIpFilter, - EfiPxeBcArp, - EfiPxeBcSetParameters, - EfiPxeBcSetStationIP, - EfiPxeBcSetPackets, - NULL -}; - -/** - Callback function that is invoked when the PXE Base Code Protocol is about to transmit, has - received, or is waiting to receive a packet. - - This function is invoked when the PXE Base Code Protocol is about to transmit, has received, - or is waiting to receive a packet. Parameters Function and Received specify the type of event. - Parameters PacketLen and Packet specify the packet that generated the event. If these fields - are zero and NULL respectively, then this is a status update callback. If the operation specified - by Function is to continue, then CALLBACK_STATUS_CONTINUE should be returned. If the operation - specified by Function should be aborted, then CALLBACK_STATUS_ABORT should be returned. Due to - the polling nature of UEFI device drivers, a callback function should not execute for more than 5 ms. - The SetParameters() function must be called after a Callback Protocol is installed to enable the - use of callbacks. - - @param This Pointer to the EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL instance. - @param Function The PXE Base Code Protocol function that is waiting for an event. - @param Received TRUE if the callback is being invoked due to a receive event. FALSE if - the callback is being invoked due to a transmit event. - @param PacketLength The length, in bytes, of Packet. This field will have a value of zero if - this is a wait for receive event. - @param PacketPtr If Received is TRUE, a pointer to the packet that was just received; - otherwise a pointer to the packet that is about to be transmitted. - - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE if Function specifies a continue operation - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT if Function specifies an abort operation - -**/ -EFI_PXE_BASE_CODE_CALLBACK_STATUS -EFIAPI -EfiPxeLoadFileCallback ( - IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL * This, - IN EFI_PXE_BASE_CODE_FUNCTION Function, - IN BOOLEAN Received, - IN UINT32 PacketLength, - IN EFI_PXE_BASE_CODE_PACKET * PacketPtr OPTIONAL - ) -{ - EFI_INPUT_KEY Key; - EFI_STATUS Status; - - // - // Catch Ctrl-C or ESC to abort. - // - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - - if (!EFI_ERROR (Status)) { - - if (Key.ScanCode == SCAN_ESC || Key.UnicodeChar == (0x1F & 'c')) { - - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT; - } - } - // - // No print if receive packet - // - if (Received) { - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; - } - // - // Print only for three functions - // - switch (Function) { - - case EFI_PXE_BASE_CODE_FUNCTION_MTFTP: - // - // Print only for open MTFTP packets, not every MTFTP packets - // - if (PacketLength != 0 && PacketPtr != NULL) { - if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) { - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; - } - } - break; - - case EFI_PXE_BASE_CODE_FUNCTION_DHCP: - case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER: - break; - - default: - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; - } - - if (PacketLength != 0 && PacketPtr != NULL) { - // - // Print '.' when transmit a packet - // - AsciiPrint ("."); - - } - - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; -} - -EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL mPxeBcCallBackTemplate = { - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION, - EfiPxeLoadFileCallback -}; - - -/** - Find the boot file. - - @param Private Pointer to PxeBc private data. - @param BufferSize Pointer to buffer size. - @param Buffer Pointer to buffer. - - @retval EFI_SUCCESS Discover the boot file successfully. - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. - @retval EFI_ABORTED PXE bootstrap server, so local boot need abort. - @retval EFI_BUFFER_TOO_SMALL The buffer is too small to load the boot file. - -**/ -EFI_STATUS -DiscoverBootFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN OUT UINT64 *BufferSize, - IN VOID *Buffer - ) -{ - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - UINT16 Type; - UINT16 Layer; - BOOLEAN UseBis; - PXEBC_CACHED_DHCP4_PACKET *Packet; - UINT16 Value; - - PxeBc = &Private->PxeBc; - Mode = PxeBc->Mode; - Type = EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP; - Layer = EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL; - - // - // do DHCP. - // - Status = PxeBc->Dhcp (PxeBc, TRUE); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Select a boot server - // - Status = PxeBcSelectBootPrompt (Private); - - if (Status == EFI_SUCCESS) { - Status = PxeBcSelectBootMenu (Private, &Type, TRUE); - } else if (Status == EFI_TIMEOUT) { - Status = PxeBcSelectBootMenu (Private, &Type, FALSE); - } - - if (!EFI_ERROR (Status)) { - - if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) { - // - // Local boot(PXE bootstrap server) need abort - // - return EFI_ABORTED; - } - - UseBis = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected); - Status = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL); - if (EFI_ERROR (Status)) { - return Status; - } - } - - *BufferSize = 0; - - // - // Get bootfile name and (m)tftp server ip addresss - // - if (Mode->PxeReplyReceived) { - Packet = &Private->PxeReply; - } else if (Mode->ProxyOfferReceived) { - Packet = &Private->ProxyOffer; - } else { - Packet = &Private->Dhcp4Ack; - } - - // - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier) - // in DHCPOFFER packet. - // (It does not comply with PXE Spec, Ver2.1) - // - if (EFI_IP4_EQUAL (&Packet->Packet.Offer.Dhcp4.Header.ServerAddr, &mZeroIp4Addr)) { - CopyMem ( - &Private->ServerIp, - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data, - sizeof (EFI_IPv4_ADDRESS) - ); - } else { - CopyMem ( - &Private->ServerIp, - &Packet->Packet.Offer.Dhcp4.Header.ServerAddr, - sizeof (EFI_IPv4_ADDRESS) - ); - } - if (Private->ServerIp.Addr[0] == 0) { - return EFI_DEVICE_ERROR; - } - - ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL); - - // - // bootlfile name - // - Private->BootFileName = (CHAR8 *) (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data); - - if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != NULL) { - // - // Already have the bootfile length option, compute the file size - // - CopyMem (&Value, Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof (Value)); - Value = NTOHS (Value); - *BufferSize = 512 * Value; - Status = EFI_BUFFER_TOO_SMALL; - } else { - // - // Get the bootfile size from tftp - // - Status = PxeBc->Mtftp ( - PxeBc, - EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, - Buffer, - FALSE, - BufferSize, - &Private->BlockSize, - &Private->ServerIp, - (UINT8 *) Private->BootFileName, - NULL, - FALSE - ); - } - - Private->FileSize = (UINTN) *BufferSize; - - // - // Display all the information: boot server address, boot file name and boot file size. - // - AsciiPrint ("\n Server IP address is "); - PxeBcShowIp4Addr (&Private->ServerIp.v4); - AsciiPrint ("\n NBP filename is %a", Private->BootFileName); - AsciiPrint ("\n NBP filesize is %d Bytes", Private->FileSize); - - return Status; -} - -/** - Causes the driver to load a specified file. - - @param This Protocol instance pointer. - @param FilePath The device specific path of the file to load. - @param BootPolicy If TRUE, indicates that the request originates from the - boot manager is attempting to load FilePath as a boot - selection. If FALSE, then FilePath must match as exact file - to be loaded. - @param BufferSize On input the size of Buffer in bytes. On output with a return - code of EFI_SUCCESS, the amount of data transferred to - Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, - the size of Buffer required to retrieve the requested file. - @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in - BufferSize. - - @retval EFI_SUCCESS The file was loaded. - @retval EFI_UNSUPPORTED The device does not support the provided BootPolicy - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or - BufferSize is NULL. - @retval EFI_NO_MEDIA No medium was present to load the file. - @retval EFI_DEVICE_ERROR The file was not loaded due to a device error. - @retval EFI_NO_RESPONSE The remote system did not respond. - @retval EFI_NOT_FOUND The file was not found. - @retval EFI_ABORTED The file load process was manually cancelled. - -**/ -EFI_STATUS -EFIAPI -EfiPxeLoadFile ( - IN EFI_LOAD_FILE_PROTOCOL * This, - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, - IN BOOLEAN BootPolicy, - IN OUT UINTN *BufferSize, - IN VOID *Buffer OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - BOOLEAN NewMakeCallback; - EFI_STATUS Status; - UINT64 TmpBufSize; - EFI_STATUS MediaStatus; - - if (FilePath == NULL || !IsDevicePathEnd (FilePath)) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This); - PxeBc = &Private->PxeBc; - NewMakeCallback = FALSE; - Status = EFI_DEVICE_ERROR; - - if (This == NULL || BufferSize == NULL) { - - return EFI_INVALID_PARAMETER; - } - - // - // Only support BootPolicy - // - if (!BootPolicy) { - return EFI_UNSUPPORTED; - } - - // - // Check media status before PXE start - // - MediaStatus = EFI_SUCCESS; - NetLibDetectMediaWaitTimeout (Private->Controller, PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus); - if (MediaStatus != EFI_SUCCESS) { - return EFI_NO_MEDIA; - } - - Status = PxeBc->Start (PxeBc, FALSE); - if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { - return Status; - } - - Status = gBS->HandleProtocol ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - (VOID **) &Private->PxeBcCallback - ); - if (Status == EFI_UNSUPPORTED) { - - CopyMem (&Private->LoadFileCallback, &mPxeBcCallBackTemplate, sizeof (Private->LoadFileCallback)); - - Status = gBS->InstallProtocolInterface ( - &Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - EFI_NATIVE_INTERFACE, - &Private->LoadFileCallback - ); - - NewMakeCallback = (BOOLEAN) (Status == EFI_SUCCESS); - - Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback); - if (EFI_ERROR (Status)) { - PxeBc->Stop (PxeBc); - return Status; - } - } - - if (Private->FileSize == 0) { - TmpBufSize = 0; - Status = DiscoverBootFile (Private, &TmpBufSize, Buffer); - - if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) { - Status = EFI_DEVICE_ERROR; - } else if (TmpBufSize > 0 && *BufferSize >= (UINTN) TmpBufSize && Buffer != NULL) { - AsciiPrint ("\n Downloading NBP file...\n"); - *BufferSize = (UINTN) TmpBufSize; - Status = PxeBc->Mtftp ( - PxeBc, - EFI_PXE_BASE_CODE_TFTP_READ_FILE, - Buffer, - FALSE, - &TmpBufSize, - &Private->BlockSize, - &Private->ServerIp, - (UINT8 *) Private->BootFileName, - NULL, - FALSE - ); - } else if (TmpBufSize > 0) { - *BufferSize = (UINTN) TmpBufSize; - Status = EFI_BUFFER_TOO_SMALL; - } - } else if (Buffer == NULL || Private->FileSize > *BufferSize) { - *BufferSize = Private->FileSize; - Status = EFI_BUFFER_TOO_SMALL; - } else { - // - // Download the file. - // - AsciiPrint ("\n Downloading NBP file...\n"); - TmpBufSize = (UINT64) (*BufferSize); - Status = PxeBc->Mtftp ( - PxeBc, - EFI_PXE_BASE_CODE_TFTP_READ_FILE, - Buffer, - FALSE, - &TmpBufSize, - &Private->BlockSize, - &Private->ServerIp, - (UINT8 *) Private->BootFileName, - NULL, - FALSE - ); - } - // - // If we added a callback protocol, now is the time to remove it. - // - if (NewMakeCallback) { - - NewMakeCallback = FALSE; - - PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback); - - gBS->UninstallProtocolInterface ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - &Private->LoadFileCallback - ); - } - - // - // Check download status - // - if (Status == EFI_SUCCESS) { - AsciiPrint ("\n NBP file downloaded successfully.\n"); - // - // The DHCP4 can have only one configured child instance so we need to stop - // reset the DHCP4 child before we return. Otherwise the other programs which - // also need to use DHCP4 will be impacted. - // The functionality of PXE Base Code protocol will not be stopped, - // when downloading is successfully. - // - Private->Dhcp4->Stop (Private->Dhcp4); - Private->Dhcp4->Configure (Private->Dhcp4, NULL); - return EFI_SUCCESS; - - } else if (Status == EFI_BUFFER_TOO_SMALL) { - if (Buffer != NULL) { - AsciiPrint ("PXE-E05: Download buffer is smaller than requested file.\n"); - } else { - // - // The functionality of PXE Base Code protocol will not be stopped. - // - return Status; - } - - } else if (Status == EFI_DEVICE_ERROR) { - AsciiPrint ("PXE-E07: Network device error.\n"); - - } else if (Status == EFI_OUT_OF_RESOURCES) { - AsciiPrint ("PXE-E09: Could not allocate I/O buffers.\n"); - - } else if (Status == EFI_NO_MEDIA) { - AsciiPrint ("PXE-E12: Could not detect network connection.\n"); - - } else if (Status == EFI_NO_RESPONSE) { - AsciiPrint ("PXE-E16: No offer received.\n"); - - } else if (Status == EFI_TIMEOUT) { - AsciiPrint ("PXE-E18: Server response timeout.\n"); - - } else if (Status == EFI_ABORTED) { - AsciiPrint ("PXE-E21: Remote boot cancelled.\n"); - - } else if (Status == EFI_ICMP_ERROR) { - AsciiPrint ("PXE-E22: Client received ICMP error from server.\n"); - - } else if (Status == EFI_TFTP_ERROR) { - AsciiPrint ("PXE-E23: Client received TFTP error from server.\n"); - - } else { - AsciiPrint ("PXE-E99: Unexpected network error.\n"); - } - - PxeBc->Stop (PxeBc); - - return Status; -} - -EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate = { EfiPxeLoadFile }; - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c deleted file mode 100644 index 88767c8394ab..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c +++ /dev/null @@ -1,454 +0,0 @@ -/** @file - PxeBc MTFTP functions. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "PxeBcImpl.h" - -CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = { - "blksize", - "timeout", - "tsize", - "multicast" -}; - - -/** - This is a callback function when packets received/transmitted in Mtftp driver. - - A callback function that is provided by the caller to intercept - the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the - EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept - EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to - EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory(). - - @param This Pointer to Mtftp protocol instance - @param Token Pointer to Mtftp token - @param PacketLen Length of Mtftp packet - @param Packet Pointer to Mtftp packet - - @retval EFI_SUCCESS Operation sucess - @retval EFI_ABORTED Abort transfer process - -**/ -EFI_STATUS -EFIAPI -PxeBcCheckPacket ( - IN EFI_MTFTP4_PROTOCOL *This, - IN EFI_MTFTP4_TOKEN *Token, - IN UINT16 PacketLen, - IN EFI_MTFTP4_PACKET *Packet - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; - EFI_STATUS Status; - - Private = (PXEBC_PRIVATE_DATA *) Token->Context; - Callback = Private->PxeBcCallback; - Status = EFI_SUCCESS; - - if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) { - Private->Mode.TftpErrorReceived = TRUE; - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode; - AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet->Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1); - Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; - } - - if (Callback != NULL) { - - Status = Callback->Callback ( - Callback, - Private->Function, - TRUE, - PacketLen, - (EFI_PXE_BASE_CODE_PACKET *) Packet - ); - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { - - Status = EFI_ABORTED; - } else { - - Status = EFI_SUCCESS; - } - } - - return Status; -} - - -/** - This function is to get size of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Get the size of file success - @retval EFI_NOT_FOUND Parse the tftp ptions failed. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval Other Has not get the size of the file. - -**/ -EFI_STATUS -PxeBcTftpGetFileSize ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN OUT UINT64 *BufferSize - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_OPTION ReqOpt[2]; - EFI_MTFTP4_PACKET *Packet; - EFI_MTFTP4_OPTION *Option; - UINT32 PktLen; - UINT8 OptBuf[128]; - UINT32 OptCnt; - EFI_STATUS Status; - - *BufferSize = 0; - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - Packet = NULL; - Option = NULL; - PktLen = 0; - OptCnt = 1; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - ReqOpt[0].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX]; - UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - ReqOpt[0].ValueStr = OptBuf; - - if (BlockSize != NULL) { - ReqOpt[1].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1)); - OptCnt++; - } - - Status = Mtftp4->GetInfo ( - Mtftp4, - NULL, - Filename, - NULL, - (UINT8) OptCnt, - ReqOpt, - &PktLen, - &Packet - ); - - if (EFI_ERROR (Status)) { - if (Status == EFI_TFTP_ERROR) { - Private->Mode.TftpErrorReceived = TRUE; - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode; - AsciiStrnCpyS ( - Private->Mode.TftpError.ErrorString, - PXE_MTFTP_ERROR_STRING_LENGTH, - (CHAR8 *) Packet->Error.ErrorMessage, - PXE_MTFTP_ERROR_STRING_LENGTH - 1 - ); - Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; - } - goto ON_ERROR; - } - - OptCnt = 0; - - Status = Mtftp4->ParseOptions ( - Mtftp4, - PktLen, - Packet, - (UINT32 *) &OptCnt, - &Option - ); - - if (EFI_ERROR (Status)) { - - goto ON_ERROR; - } - - Status = EFI_NOT_FOUND; - - while (OptCnt != 0) { - - if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) { - - *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr); - Status = EFI_SUCCESS; - } - - OptCnt--; - } - - FreePool (Option); - -ON_ERROR: - - if (Packet != NULL) { - FreePool (Packet); - } - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - - -/** - This function is to get data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - @param DontUseBuffer Indicate whether with a receive buffer - - @retval EFI_SUCCESS Read the data success from the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Read data from file failed. - -**/ -EFI_STATUS -PxeBcTftpReadFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_TOKEN Token; - EFI_MTFTP4_OPTION ReqOpt[1]; - UINT32 OptCnt; - UINT8 OptBuf[128]; - EFI_STATUS Status; - - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - OptCnt = 0; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - if (BlockSize != NULL) { - - ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[0].ValueStr = OptBuf; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - OptCnt++; - } - - Token.Event = NULL; - Token.OverrideData = NULL; - Token.Filename = Filename; - Token.ModeStr = NULL; - Token.OptionCount = OptCnt; - Token.OptionList = ReqOpt; - Token.Context = Private; - - if (DontUseBuffer) { - Token.BufferSize = 0; - Token.Buffer = NULL; - } else { - Token.BufferSize = *BufferSize; - Token.Buffer = BufferPtr; - } - - Token.CheckPacket = PxeBcCheckPacket; - Token.TimeoutCallback = NULL; - Token.PacketNeeded = NULL; - - Status = Mtftp4->ReadFile (Mtftp4, &Token); - - *BufferSize = Token.BufferSize; - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - - -/** - This function is put data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param Overwrite Indicate whether with overwrite attribute - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Write the data success into the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Write data into file failed. - -**/ -EFI_STATUS -PxeBcTftpWriteFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN BOOLEAN Overwrite, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_TOKEN Token; - EFI_MTFTP4_OPTION ReqOpt[1]; - UINT32 OptCnt; - UINT8 OptBuf[128]; - EFI_STATUS Status; - - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - OptCnt = 0; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - if (BlockSize != NULL) { - - ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[0].ValueStr = OptBuf; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - OptCnt++; - } - - Token.Event = NULL; - Token.OverrideData = NULL; - Token.Filename = Filename; - Token.ModeStr = NULL; - Token.OptionCount = OptCnt; - Token.OptionList = ReqOpt; - Token.BufferSize = *BufferSize; - Token.Buffer = BufferPtr; - Token.CheckPacket = PxeBcCheckPacket; - Token.TimeoutCallback = NULL; - Token.PacketNeeded = NULL; - - Status = Mtftp4->WriteFile (Mtftp4, &Token); - *BufferSize = Token.BufferSize; - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - - -/** - This function is to get data(file) from a directory(may be a server) by Tftp. - - @param Private Pointer to PxeBc private data. - @param Config Pointer to Mtftp configuration data. - @param Filename Pointer to file name. - @param BlockSize Pointer to block size. - @param BufferPtr Pointer to buffer. - @param BufferSize Pointer to buffer size. - @param DontUseBuffer Indicate whether with a receive buffer. - - @retval EFI_SUCCES Get the data from the file included in directory success. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Operation failed. - -**/ -EFI_STATUS -PxeBcTftpReadDirectory ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_TOKEN Token; - EFI_MTFTP4_OPTION ReqOpt[1]; - UINT32 OptCnt; - UINT8 OptBuf[128]; - EFI_STATUS Status; - - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - OptCnt = 0; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - if (BlockSize != NULL) { - - ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[0].ValueStr = OptBuf; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - OptCnt++; - } - - Token.Event = NULL; - Token.OverrideData = NULL; - Token.Filename = Filename; - Token.ModeStr = NULL; - Token.OptionCount = OptCnt; - Token.OptionList = ReqOpt; - Token.Context = Private; - - if (DontUseBuffer) { - Token.BufferSize = 0; - Token.Buffer = NULL; - } else { - Token.BufferSize = *BufferSize; - Token.Buffer = BufferPtr; - } - - Token.CheckPacket = PxeBcCheckPacket; - Token.TimeoutCallback = NULL; - Token.PacketNeeded = NULL; - - Status = Mtftp4->ReadDirectory (Mtftp4, &Token); - - *BufferSize = Token.BufferSize; - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c deleted file mode 100644 index 1401ca5ec2fd..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c +++ /dev/null @@ -1,221 +0,0 @@ -/** @file - Support routines for PxeBc. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - - -/** - The common notify function associated with various PxeBc events. - - @param Event The event signaled. - @param Context The context. - -**/ -VOID -EFIAPI -PxeBcCommonNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - *((BOOLEAN *) Context) = TRUE; -} - - -/** - This function initialize(or configure) the Udp4Write instance. - - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - @param StationIp Pointer to the station ip address. - @param SubnetMask Pointer to the subnetmask of the station ip address. - @param Gateway Pointer to the gateway ip address. - @param SrcPort Pointer to the srouce port of the station. - @param Ttl The time to live field of the IP header. - @param ToS The type of service field of the IP header. - - @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration (DHCP, BOOTP, - RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE: - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already started/configured - and must be stopped/reset before it can be reconfigured. - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE - and UdpConfigData.StationPort is already used by - other instance. - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot allocate memory for this - EFI UDPv4 Protocol instance. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance - was not opened. - @retval Others Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. - -**/ -EFI_STATUS -PxeBcConfigureUdpWriteInstance ( - IN EFI_UDP4_PROTOCOL *Udp4, - IN EFI_IPv4_ADDRESS *StationIp, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *Gateway, - IN OUT UINT16 *SrcPort, - IN UINT8 Ttl, - IN UINT8 ToS - ) -{ - EFI_UDP4_CONFIG_DATA Udp4CfgData; - EFI_STATUS Status; - - ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData)); - - Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; - Udp4CfgData.TypeOfService = ToS; - Udp4CfgData.TimeToLive = Ttl; - Udp4CfgData.AllowDuplicatePort = TRUE; - - CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp)); - CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask)); - - Udp4CfgData.StationPort = *SrcPort; - - // - // Reset the instance. - // - Udp4->Configure (Udp4, NULL); - - Status = Udp4->Configure (Udp4, &Udp4CfgData); - if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) { - // - // basic configuration OK, need to add the default route entry - // - Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway); - if (EFI_ERROR (Status)) { - // - // roll back - // - Udp4->Configure (Udp4, NULL); - } - } - - if (!EFI_ERROR (Status) && (*SrcPort == 0)) { - Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL); - *SrcPort = Udp4CfgData.StationPort; - } - - return Status; -} - -/** - This function is to display the IPv4 address. - - @param[in] Ip The pointer to the IPv4 address. - -**/ -VOID -PxeBcShowIp4Addr ( - IN EFI_IPv4_ADDRESS *Ip - ) -{ - UINTN Index; - - for (Index = 0; Index < 4; Index++) { - AsciiPrint ("%d", Ip->Addr[Index]); - if (Index < 3) { - AsciiPrint ("."); - } - } -} - -/** - Convert number to ASCII value. - - @param Number Numeric value to convert to decimal ASCII value. - @param Buffer Buffer to place ASCII version of the Number. - @param Length Length of Buffer. - -**/ -VOID -CvtNum ( - IN UINTN Number, - IN UINT8 *Buffer, - IN UINTN Length - ) -{ - UINTN Remainder; - - for (; Length > 0; Length--) { - Remainder = Number % 10; - Number /= 10; - Buffer[Length - 1] = (UINT8) ('0' + Remainder); - } -} - - -/** - Convert unsigned int number to decimal number. - - @param Number The unsigned int number will be converted. - @param Buffer Pointer to the buffer to store the decimal number after transform. - @param[in] BufferSize The maxsize of the buffer. - - @return the length of the number after transform. - -**/ -UINTN -UtoA10 ( - IN UINTN Number, - IN CHAR8 *Buffer, - IN UINTN BufferSize - ) -{ - UINTN Index; - CHAR8 TempStr[64]; - - Index = 63; - TempStr[Index] = 0; - - do { - Index--; - TempStr[Index] = (CHAR8) ('0' + (Number % 10)); - Number = Number / 10; - } while (Number != 0); - - AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]); - - return AsciiStrLen (Buffer); -} - - -/** - Convert ASCII numeric string to a UINTN value. - - @param Buffer Pointer to the 8-byte unsigned int value. - - @return UINTN value of the ASCII string. - -**/ -UINT64 -AtoU64 ( - IN UINT8 *Buffer - ) -{ - UINT64 Value; - UINT8 Character; - - Value = 0; - while ((Character = *Buffer++) != '\0') { - Value = MultU64x32 (Value, 10) + (Character - '0'); - } - - return Value; -} - diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 2465d39fd744..5d042be3a862 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -354,12 +354,10 @@ [Components] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/PcatSingleSegmentPciCfg2Pei.inf @@ -422,7 +420,6 @@ [Components] MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf [Components.IA32, Components.X64, Components.AARCH64] - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf MdeModulePkg/Universal/EbcDxe/EbcDxe.inf MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h deleted file mode 100644 index ee371d26744c..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h +++ /dev/null @@ -1,165 +0,0 @@ -/** @file - The header file of UEFI Component Name(2) protocol. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _COMPONENT_NAME_H_ -#define _COMPONENT_NAME_H_ - -#include <Protocol/ComponentName.h> -#include <Protocol/ComponentName2.h> - -extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2; -extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName; - -// -// EFI Component Name Protocol for iSCSI driver. -// - -/** - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] Language A pointer to a three characters ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - @param[out] DriverName A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER DriverName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. Currently not implemented. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] ControllerHandle The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - @param[in] ChildHandle The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - @param[in] Language A pointer to a three characters ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - @param[out] ControllerName A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - -// -// EFI iSCSI Initiator Name Protocol for IScsi driver. -// - -/** - Retrieves the current set value of iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the - variable data buffer. - @param[out] Buffer Pointer to the buffer for data to be read. - - @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the - BufferSize was sufficient to handle the iSCSI initiator name - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiGetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -/** - Sets the iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. - @param[in] Buffer Pointer to the buffer for data to be written. - - @retval EFI_SUCCESS Data was successfully stored by the protocol. - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written. - Currently not implemented. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit. - @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data. - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720 - (and other related protocols) - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiSetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni deleted file mode 100644 index d3c020e45d3b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni +++ /dev/null @@ -1,25 +0,0 @@ -// /** @file -// This module produces EFI iSCSI Initiator Name Protocol. -// -// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol -// and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI -// data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide -// one way to configurate the iSCSI setting. -// -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI iSCSI Initiator Name Protocol" - -#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way to configure the iSCSI setting." - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni deleted file mode 100644 index 5ec75820a605..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// IScsi4Dxe Localized Strings and Content -// -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"iSCSI DXE Driver" - - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h deleted file mode 100644 index 14a5658f754b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h +++ /dev/null @@ -1,106 +0,0 @@ -/** @file - The header file of CHAP configuration. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_CHAP_H_ -#define _ISCSI_CHAP_H_ - -#define ISCSI_AUTH_METHOD_CHAP "CHAP" - -#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A" -#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I" -#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C" -#define ISCSI_KEY_CHAP_NAME "CHAP_N" -#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R" - -#define ISCSI_CHAP_ALGORITHM_MD5 5 - -#define ISCSI_CHAP_AUTH_MAX_LEN 1024 -/// -/// MD5_HASHSIZE -/// -#define ISCSI_CHAP_RSP_LEN 16 - -#define ISCSI_CHAP_INITIAL 0 -#define ISCSI_CHAP_STEP_ONE 1 -#define ISCSI_CHAP_STEP_TWO 2 -#define ISCSI_CHAP_STEP_THREE 3 -#define ISCSI_CHAP_STEP_FOUR 4 - -#pragma pack(1) - -typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA { - UINT8 CHAPType; - CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; - CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; -} ISCSI_CHAP_AUTH_CONFIG_NVDATA; - -#pragma pack() - -/// -/// ISCSI CHAP Authentication Data -/// -typedef struct _ISCSI_CHAP_AUTH_DATA { - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig; - UINT32 InIdentifier; - UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; - UINT32 InChallengeLength; - // - // Calculated CHAP Response (CHAP_R) value - // - UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN]; - - // - // Auth-data to be sent out for mutual authentication - // - UINT32 OutIdentifier; - UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; - UINT32 OutChallengeLength; -} ISCSI_CHAP_AUTH_DATA; - -/** - This function checks the received iSCSI Login Response during the security - negotiation stage. - - @param[in] Conn The iSCSI connection. - - @retval EFI_SUCCESS The Login Response passed the CHAP validation. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPOnRspReceived ( - IN ISCSI_CONNECTION *Conn - ); -/** - This function fills the CHAP authentication information into the login PDU - during the security negotiation stage in the iSCSI connection login. - - @param[in] Conn The iSCSI connection. - @param[in, out] Pdu The PDU to send out. - - @retval EFI_SUCCESS All check passed and the phase-related CHAP - authentication info is filled into the iSCSI PDU. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. -**/ -EFI_STATUS -IScsiCHAPToSendReq ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h deleted file mode 100644 index 650c68d53bab..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h +++ /dev/null @@ -1,22 +0,0 @@ -/** @file - The common header file of Iscsi. - -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_COMMON_H_ -#define _ISCSI_COMMON_H_ - -typedef struct _ISCSI_SESSION ISCSI_SESSION; -typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION; -typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA; - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h deleted file mode 100644 index c3d07f6f4859..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h +++ /dev/null @@ -1,166 +0,0 @@ -/** @file - The header file of IScsiConfig.c. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_CONFIG_H_ -#define _ISCSI_CONFIG_H_ - -#include <Guid/MdeModuleHii.h> -#include <Protocol/HiiConfigRouting.h> -#include <Library/HiiLib.h> -#include <Library/DevicePathLib.h> -#include <Library/DebugLib.h> -#include <Library/BaseLib.h> -#include <Library/NetLib.h> - -extern UINT8 IScsiConfigDxeBin[]; -extern UINT8 IScsi4DxeStrings[]; - -#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME" - -#define ISCSI_CONFIG_VAR_ATTR (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE) - -#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', 'c', 'i') - - - -/** - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear, - then this macro return a pointer to a data structure ISCSI_FORM_CALLBACK_INFO. - - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, - The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO - is compared to TestSignature. If the signatures match, then a pointer - to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned. - If the signatures do not match, then DebugAssert() is called with a description - of "CR has a bad signature" and Callback is returned. - - If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain the field - specified by Callback, then the module will not compile. - - If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field called Signature, - then the module will not compile. - - @param Callback Pointer to the specified field within the data - structure ISCSI_FORM_CALLBACK_INFO. - @return A pointer to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO. - @retval Others Some unexpected error happened. -**/ - -#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) \ - CR ( \ - Callback, \ - ISCSI_FORM_CALLBACK_INFO, \ - ConfigAccess, \ - ISCSI_FORM_CALLBACK_INFO_SIGNATURE \ - ) - -#pragma pack(1) - -typedef struct _ISCSI_MAC_INFO { - EFI_MAC_ADDRESS Mac; - UINT8 Len; - UINT16 VlanId; -} ISCSI_MAC_INFO; - -typedef struct _ISCSI_DEVICE_LIST { - UINT8 NumDevice; - ISCSI_MAC_INFO MacInfo[1]; -} ISCSI_DEVICE_LIST; - -#pragma pack() - -typedef struct _ISCSI_CONFIG_FORM_ENTRY { - LIST_ENTRY Link; - EFI_HANDLE Controller; - CHAR16 MacString[95]; - EFI_STRING_ID PortTitleToken; - EFI_STRING_ID PortTitleHelpToken; - - ISCSI_SESSION_CONFIG_NVDATA SessionConfigData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData; -} ISCSI_CONFIG_FORM_ENTRY; - -typedef struct _ISCSI_FORM_CALLBACK_INFO { - UINTN Signature; - EFI_HANDLE DriverHandle; - EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess; - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; - EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting; - UINT16 *KeyList; - VOID *FormBuffer; - EFI_HII_HANDLE RegisteredHandle; - ISCSI_CONFIG_FORM_ENTRY *Current; -} ISCSI_FORM_CALLBACK_INFO; - -#pragma pack(1) - -/// -/// HII specific Vendor Device Path definition. -/// -typedef struct { - VENDOR_DEVICE_PATH VendorDevicePath; - EFI_DEVICE_PATH_PROTOCOL End; -} HII_VENDOR_DEVICE_PATH; - -#pragma pack() - -/** - Updates the iSCSI configuration form to add/delete an entry for the iSCSI - device specified by the Controller. - - @param[in] DriverBindingHandle The driverbinding handle. - @param[in] Controller The controller handle of the iSCSI device. - @param[in] AddForm Whether to add or delete a form entry. - - @retval EFI_SUCCESS The iSCSI configuration form is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigUpdateForm ( - IN EFI_HANDLE DriverBindingHandle, - IN EFI_HANDLE Controller, - IN BOOLEAN AddForm - ); - -/** - Initialize the iSCSI configuration form. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is initialized. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigFormInit ( - VOID - ); - -/** - Unload the iSCSI configuration form, this includes: delete all the iSCSI - device configuration entries, uninstall the form callback protocol and - free the resources used. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is unloaded. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiConfigFormUnload ( - IN EFI_HANDLE DriverBindingHandle - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr deleted file mode 100644 index 9e28d81fb40d..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr +++ /dev/null @@ -1,219 +0,0 @@ -/** @file - Vfr file for iSCSI config. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "IScsiConfigNVDataStruc.h" -#define EFI_NETWORK_DEVICE_CLASS 0x04 - -formset - guid = IP4_ISCSI_CONFIG_GUID, - title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE), - help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP), - - varstore ISCSI_CONFIG_IFR_NVDATA, - name = ISCSI_CONFIG_IFR_NVDATA, - guid = IP4_ISCSI_CONFIG_GUID; - form formid = FORMID_MAIN_FORM, - title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE); - - string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName, - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME), - help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP), - flags = INTERACTIVE, - key = KEY_INITIATOR_NAME, - minsize = ISCSI_NAME_IFR_MIN_SIZE, - maxsize = ISCSI_NAME_IFR_MAX_SIZE, - endstring; - - label DEVICE_ENTRY_LABEL; - label LABEL_END; - - endform; - - form formid = FORMID_DEVICE_FORM, - title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE); - - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled, - prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE), - help = STRING_TOKEN(STR_NULL), - flags = 0, - endcheckbox; - - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp, - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), - flags = INTERACTIVE, - key = KEY_DHCP_ENABLE, - endcheckbox; - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x01; - string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp, - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_LOCAL_IP, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask, - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_SUBNET_MASK, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway, - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_GATE_WAY, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x00; - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp, - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), - flags = 0, - endcheckbox; - endif; - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01; - - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName, - prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME), - help = STRING_TOKEN(STR_ISCSI_TARGET_NAME), - flags = INTERACTIVE, - key = KEY_TARGET_NAME, - minsize = ISCSI_NAME_IFR_MIN_SIZE, - maxsize = ISCSI_NAME_IFR_MAX_SIZE, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp, - prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_TARGET_IP, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - - numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort, - prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT), - help = STRING_TOKEN(STR_ISCSI_TARGET_PORT), - flags = 0, - minimum = TARGET_PORT_MIN_NUM, - maximum = TARGET_PORT_MAX_NUM, - step = 0, - endnumeric; - - string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun, - prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN), - help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP), - flags = INTERACTIVE, - key = KEY_BOOT_LUN, - minsize = LUN_MIN_SIZE, - maxsize = LUN_MAX_SIZE, - endstring; - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType, - prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT), - help = STRING_TOKEN(STR_CHAP_TYPE_HELP), - option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value = ISCSI_CHAP_NONE, flags = DEFAULT; - option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value = ISCSI_CHAP_UNI, flags = 0; - option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = ISCSI_CHAP_MUTUAL, flags = 0; - endoneof; - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_NONE; - - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName, - prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME), - help = STRING_TOKEN(STR_ISCSI_CHAP_NAME), - flags = INTERACTIVE, - key = KEY_CHAP_NAME, - minsize = 0, - maxsize = ISCSI_CHAP_NAME_MAX_LEN, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret, - prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET), - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), - flags = INTERACTIVE, - key = KEY_CHAP_SECRET, - minsize = ISCSI_CHAP_SECRET_MIN_LEN, - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, - endstring; - - endif; - - suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_MUTUAL; - - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName, - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), - help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), - flags = INTERACTIVE, - key = KEY_REVERSE_CHAP_NAME, - minsize = 0, - maxsize = ISCSI_CHAP_NAME_MAX_LEN, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret, - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET), - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), - flags = INTERACTIVE, - key = KEY_REVERSE_CHAP_SECRET, - minsize = ISCSI_CHAP_SECRET_MIN_LEN, - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, - endstring; - - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - string varid = ISCSI_CONFIG_IFR_NVDATA.IsId, - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID), - help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP), - flags = INTERACTIVE, - key = KEY_CONFIG_ISID, - minsize = ISID_CONFIGURABLE_MIN_LEN, - maxsize = ISID_CONFIGURABLE_MAX_LEN, - endstring; - - subtitle text = STRING_TOKEN(STR_NULL); - - text - help = STRING_TOKEN (STR_SAVE_CHANGES), - text = STRING_TOKEN (STR_SAVE_CHANGES), - flags = INTERACTIVE, - key = KEY_SAVE_CHANGES; - - goto FORMID_MAIN_FORM, - prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM), - help = STRING_TOKEN (STR_RETURN_MAIN_FORM), - flags = 0; - - endform; - -endformset; - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni deleted file mode 100644 index 729c74ebfc1b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni +++ /dev/null @@ -1,62 +0,0 @@ -// *++ -// -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// Module Name: -// -// IScsiConfigStrings.uni -// -// Abstract: -// -// String definitions for iSCSI configuration. -// -// Revision History: -// -// --*/ - - -/=# - -#langdef en-US "English" - -#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI Configuration" -#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the iSCSI parameters." -#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI Configuration" -#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI Initiator Name" -#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The worldwide unique name of the initiator. Only iqn. format is accepted." -#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US "" -#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI" -#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP Address" -#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator Subnet Mask" -#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway" -#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP address in dotted-decimal notation." -#string STR_ISCSI_TARGET_NAME #language en-US " Target Name" -#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP Address" -#string STR_ISCSI_TARGET_PORT #language en-US " Target Port" -#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN" -#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-9-156f-127, 4186-9" -#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP" -#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target info via DHCP" -#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type" -#string STR_CHAP_TYPE_HELP #language en-US "None, One way CHAP or mutual CHAP" -#string STR_CHAP_TYPE_NONE #language en-US "None" -#string STR_CHAP_TYPE_UNI #language en-US "One way" -#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual" -#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name" -#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret" -#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum length is 12 bytes and the maximum length is 16 bytes." -#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse CHAP Name" -#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse CHAP Secret" -#string STR_ISCSI_CONFIG_ISID #language en-US "ISID" -#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format ISID in 6 bytes, default value are derived from MAC address. Only last 3 bytes are configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input F07901." -#string STR_RETURN_MAIN_FORM #language en-US "Back to Previous Page" -#string STR_SAVE_CHANGES #language en-US "Save Changes" -#string STR_NULL #language en-US "" - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h deleted file mode 100644 index 7c2e4e65fa8e..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h +++ /dev/null @@ -1,109 +0,0 @@ -/** @file - Define NVData structures used by the iSCSI configuration component - -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_NVDATASTRUC_H_ -#define _ISCSI_NVDATASTRUC_H_ - -#include <Guid/Ip4IScsiConfigHii.h> - -#define VAR_EQ_TEST_NAME 0x100 - -#define FORMID_MAIN_FORM 1 -#define FORMID_DEVICE_FORM 2 - -#define ISCSI_NAME_MAX_SIZE 224 - -// -// Vfr has a limit on the size, it's 255 bytes. -// -#define ISCSI_NAME_IFR_MIN_SIZE 4 -#define ISCSI_NAME_IFR_MAX_SIZE 223 - -#define IP_MIN_SIZE 7 -#define IP_MAX_SIZE 15 -#define IP4_STR_MAX_SIZE 16 - -#define LUN_MIN_SIZE 1 -#define LUN_MAX_SIZE 20 - -#define ISCSI_CHAP_NONE 0 -#define ISCSI_CHAP_UNI 1 -#define ISCSI_CHAP_MUTUAL 2 - -#define TARGET_PORT_MIN_NUM 0 -#define TARGET_PORT_MAX_NUM 65535 - -#define DEVICE_ENTRY_LABEL 0x1234 -#define LABEL_END 0xffff - -#define KEY_INITIATOR_NAME 0x101 -#define KEY_DHCP_ENABLE 0x102 -#define KEY_LOCAL_IP 0x103 -#define KEY_SUBNET_MASK 0x104 -#define KEY_GATE_WAY 0x105 -#define KEY_TARGET_IP 0x106 -#define KEY_CHAP_NAME 0x107 -#define KEY_CHAP_SECRET 0x108 -#define KEY_REVERSE_CHAP_NAME 0x109 -#define KEY_REVERSE_CHAP_SECRET 0x10a -#define KEY_SAVE_CHANGES 0x10b -#define KEY_TARGET_NAME 0x10c -#define KEY_BOOT_LUN 0x10d -#define KEY_CONFIG_ISID 0x10e - -#define KEY_DEVICE_ENTRY_BASE 0x1000 - -#define ISCSI_LUN_STR_MAX_LEN 21 -#define ISCSI_CHAP_SECRET_MIN_LEN 12 -#define ISCSI_CHAP_SECRET_MAX_LEN 16 -// -// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator) -// -#define ISCSI_CHAP_SECRET_STORAGE 17 - -#define ISCSI_CHAP_NAME_MAX_LEN 126 -#define ISCSI_CHAP_NAME_STORAGE 127 - -#define ISID_CONFIGURABLE_MIN_LEN 6 -#define ISID_CONFIGURABLE_MAX_LEN 12 -#define ISID_CONFIGURABLE_STORAGE 13 - -#pragma pack(1) -typedef struct { - CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE]; - - UINT8 Enabled; - - UINT8 InitiatorInfoFromDhcp; - CHAR16 LocalIp[IP4_STR_MAX_SIZE]; - CHAR16 SubnetMask[IP4_STR_MAX_SIZE]; - CHAR16 Gateway[IP4_STR_MAX_SIZE]; - - CHAR16 TargetName[ISCSI_NAME_MAX_SIZE]; - CHAR16 TargetIp[IP4_STR_MAX_SIZE]; - UINT16 TargetPort; - CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN]; - UINT8 TargetInfoFromDhcp; - - UINT8 CHAPType; - CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; - CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; - - CHAR16 IsId[ISID_CONFIGURABLE_STORAGE]; -} ISCSI_CONFIG_IFR_NVDATA; -#pragma pack() - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h deleted file mode 100644 index 4c4dcaa8f68d..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h +++ /dev/null @@ -1,55 +0,0 @@ -/** @file - The header file of IScsiDhcp. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_DHCP_H_ -#define _ISCSI_DHCP_H_ - -#include <Protocol/Dhcp4.h> - -#define ISCSI_ROOT_PATH_ID "iscsi:" -#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':' - -#define RP_FIELD_IDX_SERVERNAME 0 -#define RP_FIELD_IDX_PROTOCOL 1 -#define RP_FIELD_IDX_PORT 2 -#define RP_FIELD_IDX_LUN 3 -#define RP_FIELD_IDX_TARGETNAME 4 -#define RP_FIELD_IDX_MAX 5 - -typedef struct _ISCSI_ROOT_PATH_FIELD { - CHAR8 *Str; - UINT8 Len; -} ISCSI_ROOT_PATH_FIELD; - -/** - Parse the DHCP ACK to get the address configuration and DNS information. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller; - @param[in, out] ConfigData The session configuration data. - - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiDoDhcp ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h deleted file mode 100644 index d6a619f00fc0..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h +++ /dev/null @@ -1,140 +0,0 @@ -/** @file - The header file of IScsiDriver.c. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_DRIVER_H_ -#define _ISCSI_DRIVER_H_ - -#include <Uefi.h> -#include <Protocol/DevicePath.h> -#include <Protocol/LoadedImage.h> -#include <Protocol/HiiConfigAccess.h> -#include <Protocol/HiiDatabase.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> -#include <Library/DevicePathLib.h> -#include <Protocol/DriverBinding.h> -#include <Protocol/ScsiPassThruExt.h> - -#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME" - -typedef struct _ISCSI_PRIVATE_PROTOCOL { - UINT32 Reserved; -} ISCSI_PRIVATE_PROTOCOL; - -// -// EFI Driver Binding Protocol for iSCSI driver. -// - -/** - Tests to see if this driver supports a given controller. If a child device is provided, - it further tests to see if this driver supports creating a handle for the specified child device. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by the driver - specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a different - driver or an application that requires exclusive acces. - Currently not implemented. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver specified by This. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Start this driver on ControllerHandle. The Start() function is designed to be - invoked from the EFI boot service ConnectController(). As a result, much of - the error checking on the parameters to Start() has been moved into this - common boot service. It is legal to call Start() from other locations, - but the following calling restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned - EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified by This must - have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_DEVICE_ERROR The device could not be started due to a device error. - Currently not implemented. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval Others The driver failded to start the device. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Stop this driver on ControllerHandle. - - Release the control of this controller and remove the IScsi functions. The Stop() - function is designed to be invoked from the EFI boot service DisconnectController(). - As a result, much of the error checking on the parameters to Stop() has been moved - into this common boot service. It is legal to call Stop() from other locations, - but the following calling restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this - same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this driver's - Start() function, and the Start() function must have called OpenProtocol() on - ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used. - @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL - if NumberOfChildren is 0.Not used. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf deleted file mode 100644 index 48729e3029f7..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf +++ /dev/null @@ -1,134 +0,0 @@ -## @file -# This module produces EFI iSCSI Initiator Name Protocol. -# -# This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol -# and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI -# data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide -# one way to configurate the iSCSI setting. This driver only supports IPv4 network -# stack. -# -# Notes: -# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg. -# 2) This driver might have some issues that have been fixed in the IScsiDxe driver -# in NetworkPkg. -# 3) This driver supports fewer features than the IScsiDxe driver in NetworkPkg -# (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword support). -# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of this one even -# though both of them can be used. -# -# Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = IScsi4Dxe - MODULE_UNI_FILE = IScsi4Dxe.uni - FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7 - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = IScsiDriverEntryPoint - UNLOAD_IMAGE = EfiIScsiUnload - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC -# -# DRIVER_BINDING = gIScsiDriverBinding -# COMPONENT_NAME = gIScsiComponentName -# COMPONENT_NAME2 = gIScsiComponentName2 -# - -[Sources] - IScsiTcp4Io.h - IScsiProto.h - IScsiMisc.h - IScsiIbft.h - IScsiExtScsiPassThru.h - IScsiDriver.h - IScsiDhcp.h - IScsiCommon.h - IScsiCHAP.h - IScsiInitiatorName.h - ComponentName.h - Md5.h - IScsiTcp4Io.c - IScsiProto.c - IScsiMisc.c - IScsiInitiatorName.c - IScsiIbft.c - IScsiExtScsiPassThru.c - IScsiDriver.c - IScsiDhcp.c - IScsiCHAP.c - ComponentName.c - Md5.c - IScsiConfigDxeStrings.uni - IScsiConfigDxe.vfr - IScsiConfig.c - IScsiConfig.h - IScsiImpl.h - IScsiConfigNVDataStruc.h - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - UefiDriverEntryPoint - UefiLib - BaseLib - UefiBootServicesTableLib - UefiRuntimeServicesTableLib - BaseMemoryLib - MemoryAllocationLib - DevicePathLib - DebugLib - PrintLib - HiiLib - NetLib - -[Protocols] - ## PRODUCES - ## UNDEFINED # Variable - gEfiIScsiInitiatorNameProtocolGuid - gEfiExtScsiPassThruProtocolGuid ## BY_START - gEfiTcp4ProtocolGuid ## TO_START - gEfiTcp4ServiceBindingProtocolGuid ## TO_START - gEfiDhcp4ProtocolGuid ## TO_START - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START - ## TO_START - ## PRODUCES - gEfiDevicePathProtocolGuid - gEfiHiiConfigAccessProtocolGuid ## PRODUCES - gEfiHiiDatabaseProtocolGuid ## CONSUMES - gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES - gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES - -[Guids] - gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## Event - gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED - gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ## SystemTable - gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ## SystemTable - ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList" - ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList" - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch mVendorStorageName - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr mVendorStorageName - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData mVendorStorageName - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData mVendorStorageName - ## SOMETIMES_CONSUMES ## HII - gIp4IScsiConfigGuid - ## SOMETIMES_PRODUCES ## Variable - ## SOMETIMES_CONSUMES ## Variable - gIScsiCHAPAuthInfoGuid - -[UserExtensions.TianoCore."ExtraFiles"] - IScsi4DxeExtra.uni diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h deleted file mode 100644 index e635e47b9292..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h +++ /dev/null @@ -1,22 +0,0 @@ -/** @file - The header file of IScsiExtScsiPassThru.c. - -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_ -#define _ISCSI_EXT_SCSI_PASS_THRU_H_ - -#include <Protocol/ScsiPassThruExt.h> - -extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate; - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h deleted file mode 100644 index 4f3828db63c6..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h +++ /dev/null @@ -1,38 +0,0 @@ -/** @file - Some extra definitions for iBFT. - -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_IBFT_H_ -#define _ISCSI_IBFT_H_ - -#include <IndustryStandard/Acpi.h> -#include <IndustryStandard/IScsiBootFirmwareTable.h> -#include <Protocol/AcpiTable.h> -#include <Protocol/PciIo.h> - -#define IBFT_TABLE_VAR_NAME L"iBFT" -#define IBFT_MAX_SIZE 4096 -#define IBFT_HEAP_OFFSET 2048 - -#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT) - -/** - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI - session status. -**/ -VOID -IScsiPublishIbft ( - VOID - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h deleted file mode 100644 index 8a5ee2149eb2..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h +++ /dev/null @@ -1,168 +0,0 @@ -/** @file - The header file of IScsiImpl.c. - -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_IMPL_H_ -#define _ISCSI_IMPL_H_ - -#include <Uefi.h> - -#include <IndustryStandard/Dhcp.h> - -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/NetLib.h> -#include <Library/PrintLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> - -#include <Guid/EventGroup.h> - -#include "IScsiCommon.h" -#include "IScsiDriver.h" -#include "IScsiInitiatorName.h" -#include "ComponentName.h" -#include "IScsiConfigNVDataStruc.h" -#include "IScsiExtScsiPassThru.h" -#include "IScsiProto.h" -#include "IScsiMisc.h" -#include "IScsiCHAP.h" -#include "IScsiConfig.h" -#include "IScsiDhcp.h" -#include "IScsiTcp4Io.h" -#include "IScsiIbft.h" - - -#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N') - -struct _ISCSI_SESSION { - UINT32 Signature; - - ISCSI_SESSION_CONFIG_DATA ConfigData; - ISCSI_CHAP_AUTH_DATA AuthData; - - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; - UINTN InitiatorNameLength; - UINT8 State; - - UINT8 Isid[6]; - UINT16 Tsih; - - UINT32 CmdSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - - UINT32 InitiatorTaskTag; - UINT16 NextCid; - - LIST_ENTRY Conns; - UINT32 NumConns; - - LIST_ENTRY TcbList; - - // - // session-wide parameters - // - UINT16 TargetPortalGroupTag; - UINT32 MaxConnections; - BOOLEAN InitialR2T; - BOOLEAN ImmediateData; - UINT32 MaxBurstLength; - UINT32 FirstBurstLength; - UINT32 DefaultTime2Wait; - UINT32 DefaultTime2Retain; - UINT16 MaxOutstandingR2T; - BOOLEAN DataPDUInOrder; - BOOLEAN DataSequenceInOrder; - UINT8 ErrorRecoveryLevel; -}; - -#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N') - -struct _ISCSI_CONNECTION { - UINT32 Signature; - LIST_ENTRY Link; - - EFI_EVENT TimeoutEvent; - - ISCSI_SESSION *Session; - - UINT8 State; - UINT8 CurrentStage; - UINT8 NextStage; - - UINT8 CHAPStep; - - BOOLEAN PartialReqSent; - BOOLEAN PartialRspRcvd; - - BOOLEAN TransitInitiated; - - UINT16 Cid; - UINT32 ExpStatSN; - - // - // queues... - // - NET_BUF_QUEUE RspQue; - - TCP4_IO Tcp4Io; - - // - // connection-only parameters - // - UINT32 MaxRecvDataSegmentLength; - ISCSI_DIGEST_TYPE HeaderDigest; - ISCSI_DIGEST_TYPE DataDigest; -}; - -#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A') - -#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \ - CR ( \ - PassThru, \ - ISCSI_DRIVER_DATA, \ - IScsiExtScsiPassThru, \ - ISCSI_DRIVER_DATA_SIGNATURE \ - ) -#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \ - CR ( \ - Identifier, \ - ISCSI_DRIVER_DATA, \ - IScsiIdentifier, \ - ISCSI_DRIVER_DATA_SIGNATURE \ - ) -#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \ - CR ( \ - s, \ - ISCSI_DRIVER_DATA, \ - Session, \ - ISCSI_DRIVER_DATA_SIGNATURE \ - ) - -struct _ISCSI_DRIVER_DATA { - UINT32 Signature; - EFI_HANDLE Image; - EFI_HANDLE Controller; - ISCSI_PRIVATE_PROTOCOL IScsiIdentifier; - EFI_HANDLE ChildHandle; - EFI_EVENT ExitBootServiceEvent; - - EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru; - EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode; - EFI_HANDLE ExtScsiPassThruHandle; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - ISCSI_SESSION Session; -}; - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h deleted file mode 100644 index f967fb383095..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h +++ /dev/null @@ -1,74 +0,0 @@ -/** @file - The header file for EFI iSCSI Initiator Name Protocol. - -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_INITIATOR_NAME_H_ -#define _ISCSI_INITIATOR_NAME_H_ - -#include <Protocol/IScsiInitiatorName.h> - -extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName; - -// -// EFI iSCSI Initiator Name Protocol for IScsi driver. -// - -/** - Retrieves the current set value of iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the - variable data buffer. - @param[out] Buffer Pointer to the buffer for data to be read. - - @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the - BufferSize was sufficient to handle the iSCSI initiator name. - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiGetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -/** - Sets the iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. - @param[in] Buffer Pointer to the buffer for data to be written. - - @retval EFI_SUCCESS Data was successfully stored by the protocol. - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written. - Currently not implemented. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit. - @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data. - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720 - (and other related protocols). - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiSetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h deleted file mode 100644 index 500e00373b25..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h +++ /dev/null @@ -1,317 +0,0 @@ -/** @file - Miscellaneous definitions for iSCSI driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_MISC_H_ -#define _ISCSI_MISC_H_ - -#include <Library/BaseLib.h> - -typedef struct _ISCSI_SESSION_CONFIG_DATA ISCSI_SESSION_CONFIG_DATA; - -/// -/// IPv4 Device Path Node Length -/// -#define IP4_NODE_LEN_NEW_VERSIONS 27 - -#pragma pack(1) -typedef struct { - BOOLEAN Enabled; - - BOOLEAN InitiatorInfoFromDhcp; - EFI_IPv4_ADDRESS LocalIp; - EFI_IPv4_ADDRESS SubnetMask; - EFI_IPv4_ADDRESS Gateway; - - BOOLEAN TargetInfoFromDhcp; - CHAR8 TargetName[ISCSI_NAME_MAX_SIZE]; - EFI_IPv4_ADDRESS TargetIp; - UINT16 TargetPort; - UINT8 BootLun[8]; - - UINT8 IsId[6]; -} ISCSI_SESSION_CONFIG_NVDATA; -#pragma pack() - -struct _ISCSI_SESSION_CONFIG_DATA { - ISCSI_SESSION_CONFIG_NVDATA NvData; - - EFI_IPv4_ADDRESS PrimaryDns; - EFI_IPv4_ADDRESS SecondaryDns; - EFI_IPv4_ADDRESS DhcpServer; -}; - -/** - Calculate the prefix length of the IPv4 subnet mask. - - @param[in] SubnetMask The IPv4 subnet mask. - - @return The prefix length of the subnet mask. - @retval 0 Other errors as indicated. -**/ -UINT8 -IScsiGetSubnetMaskPrefixLength ( - IN EFI_IPv4_ADDRESS *SubnetMask - ); - -/** - Convert the hexadecimal encoded LUN string into the 64-bit LUN. - - @param[in] Str The hexadecimal encoded LUN string. - @param[out] Lun Storage to return the 64-bit LUN. - - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. - @retval EFI_INVALID_PARAMETER The string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToLun ( - IN CHAR8 *Str, - OUT UINT8 *Lun - ); - -/** - Convert the 64-bit LUN into the hexadecimal encoded LUN string. - - @param[in] Lun The 64-bit LUN. - @param[out] Str The storage to return the hexadecimal encoded LUN string. -**/ -VOID -IScsiLunToUnicodeStr ( - IN UINT8 *Lun, - OUT CHAR16 *Str - ); - -/** - Convert the ASCII string into a UNICODE string. - - @param[in] Source The ASCII string. - @param[out] Destination The storage to return the UNICODE string. - - @return CHAR16 * Pointer to the UNICODE string. -**/ -CHAR16 * -IScsiAsciiStrToUnicodeStr ( - IN CHAR8 *Source, - OUT CHAR16 *Destination - ); - -/** - Convert the UNICODE string into an ASCII string. - - @param[in] Source The UNICODE string. - @param[out] Destination The storage to return the ASCII string. - - @return CHAR8 * Pointer to the ASCII string. -**/ -CHAR8 * -IScsiUnicodeStrToAsciiStr ( - IN CHAR16 *Source, - OUT CHAR8 *Destination - ); - -/** - Convert the mac address into a hexadecimal encoded "-" seperated string. - - @param[in] Mac The mac address. - @param[in] Len Length in bytes of the mac address. - @param[in] VlanId VLAN ID of the network device. - @param[out] Str The storage to return the mac string. -**/ -VOID -IScsiMacAddrToStr ( - IN EFI_MAC_ADDRESS *Mac, - IN UINT32 Len, - IN UINT16 VlanId, - OUT CHAR16 *Str - ); - -/** - Convert the decimal dotted IPv4 address into the binary IPv4 address. - - @param[in] Str The UNICODE string. - @param[out] Ip The storage to return the ASCII string. - - @retval EFI_SUCCESS The binary IP address is returned in Ip. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToIp ( - IN CHAR8 *Str, - OUT EFI_IPv4_ADDRESS *Ip - ); - -/** - Convert the binary encoded buffer into a hexadecimal encoded string. - - @param[in] BinBuffer The buffer containing the binary data. - @param[in] BinLength Length of the binary buffer. - @param[in, out] HexStr Pointer to the string. - @param[in, out] HexLength The length of the string. - - @retval EFI_SUCCESS The binary data is converted to the hexadecimal string - and the length of the string is updated. - @retval EFI_BUFFER_TOO_SMALL The string is too small. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiBinToHex ( - IN UINT8 *BinBuffer, - IN UINT32 BinLength, - IN OUT CHAR8 *HexStr, - IN OUT UINT32 *HexLength - ); - -/** - Convert the hexadecimal string into a binary encoded buffer. - - @param[in, out] BinBuffer The binary buffer. - @param[in, out] BinLength Length of the binary buffer. - @param[in] HexStr The hexadecimal string. - - @retval EFI_SUCCESS The hexadecimal string is converted into a binary - encoded buffer. - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data. -**/ -EFI_STATUS -IScsiHexToBin ( - IN OUT UINT8 *BinBuffer, - IN OUT UINT32 *BinLength, - IN CHAR8 *HexStr - ); - -/** - Generate random numbers. - - @param[in, out] Rand The buffer to contain random numbers. - @param[in] RandLength The length of the Rand buffer. -**/ -VOID -IScsiGenRandom ( - IN OUT UINT8 *Rand, - IN UINTN RandLength - ); - -/** - Create the iSCSI driver data.. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - - @return The iSCSI driver data created. - @retval NULL Other errors as indicated. -**/ -ISCSI_DRIVER_DATA * -IScsiCreateDriverData ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller - ); - -/** - Clean the iSCSI driver data. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCES The clean operation is successful. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCleanDriverData ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Check wheather the Controller is configured to use DHCP protocol. - - @param[in] Controller The handle of the controller. - - @retval TRUE The handle of the controller need the Dhcp protocol. - @retval FALSE The handle of the controller does not need the Dhcp protocol. - -**/ -BOOLEAN -IScsiDhcpIsConfigured ( - IN EFI_HANDLE Controller - ); - -/** - Get the various configuration data of this iSCSI instance. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The configuration of this instance is got. - @retval EFI_ABORTED The operation was aborted. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiGetConfigData ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Get the device path of the iSCSI tcp connection and update it. - - @param[in] Private The iSCSI driver data. - - @return The updated device path. - @retval NULL Other errors as indicated. -**/ -EFI_DEVICE_PATH_PROTOCOL * -IScsiGetTcpConnDevicePath ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Abort the session when the transition from BS to RT is initiated. - - @param[in] Event The event signaled. - @param[in] Context The iSCSI driver data. -**/ -VOID -EFIAPI -IScsiOnExitBootService ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - Tests whether a controller handle is being managed by IScsi driver. - - This function tests whether the driver specified by DriverBindingHandle is - currently managing the controller specified by ControllerHandle. This test - is performed by evaluating if the the protocol specified by ProtocolGuid is - present on ControllerHandle and is was opened by DriverBindingHandle and Nic - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. - If ProtocolGuid is NULL, then ASSERT(). - - @param ControllerHandle A handle for a controller to test. - @param DriverBindingHandle Specifies the driver binding handle for the - driver. - @param ProtocolGuid Specifies the protocol that the driver specified - by DriverBindingHandle opens in its Start() - function. - - @retval EFI_SUCCESS ControllerHandle is managed by the driver - specified by DriverBindingHandle. - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver - specified by DriverBindingHandle. - -**/ -EFI_STATUS -EFIAPI -IScsiTestManagedDevice ( - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE DriverBindingHandle, - IN EFI_GUID *ProtocolGuid - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h deleted file mode 100644 index 6469df0434a1..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h +++ /dev/null @@ -1,1005 +0,0 @@ -/** @file - The header file of iSCSI Protocol that defines many specific data structures. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_PROTO_H_ -#define _ISCSI_PROTO_H_ - -#include <Protocol/ScsiPassThruExt.h> - -// -// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32 -// -#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2)) -#define ISCSI_SEQ_LT(s1, s2) \ - ( \ - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \ - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \ - ) -#define ISCSI_SEQ_GT(s1, s2) \ - ( \ - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \ - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \ - ) - -#define ISCSI_WELL_KNOWN_PORT 3260 -#define ISCSI_MAX_CONNS_PER_SESSION 1 - -#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192 -#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536 -#define DEFAULT_MAX_OUTSTANDING_R2T 1 - -#define ISCSI_VERSION_MAX 0x00 -#define ISCSI_VERSION_MIN 0x00 - -#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) -#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) - -#define ISCSI_KEY_AUTH_METHOD "AuthMethod" -#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest" -#define ISCSI_KEY_DATA_DIGEST "DataDigest" -#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections" -#define ISCSI_KEY_TARGET_NAME "TargetName" -#define ISCSI_KEY_INITIATOR_NAME "InitiatorName" -#define ISCSI_KEY_TARGET_ALIAS "TargetAlias" -#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias" -#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress" -#define ISCSI_KEY_INITIAL_R2T "InitialR2T" -#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData" -#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG "TargetPortalGroupTag" -#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength" -#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength" -#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait" -#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain" -#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T" -#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder" -#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER "DataSequenceInOrder" -#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel" -#define ISCSI_KEY_SESSION_TYPE "SessionType" -#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH "MaxRecvDataSegmentLength" - -#define ISCSI_KEY_VALUE_NONE "None" - -/// -/// connection state for initiator -/// - -#define CONN_STATE_FREE 0 -#define CONN_STATE_XPT_WAIT 1 -#define CONN_STATE_IN_LOGIN 2 -#define CONN_STATE_LOGGED_IN 3 -#define CONN_STATE_IN_LOGOUT 4 -#define CONN_STATE_LOGOUT_REQUESTED 5 -#define CONN_STATE_CLEANUP_WAIT 6 -#define CONN_STATE_IN_CLEANUP 7 - -/// -/// session state for initiator -/// -#define SESSION_STATE_FREE 0 -#define SESSION_STATE_LOGGED_IN 1 -#define SESSION_STATE_FAILED 2 - -typedef enum { - DataIn = 0, - DataOut = 1, - DataBi = 2 -} DATA_DIRECTION; - -#define ISCSI_RESERVED_TAG 0xffffffff - -#define ISCSI_REQ_IMMEDIATE 0x40 -#define ISCSI_OPCODE_MASK 0x3F - -#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs))) -#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK) -#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) & ISCSI_OPCODE_MASK) == (Op)) -#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode & ISCSI_REQ_IMMEDIATE) -#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags |= (BOOLEAN)(Flag)) -#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags &= ~(Flag)) -#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *) (PduHdr))->Flags & (Flag)) == (Flag)) -#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8) ((PduHdr)->Flags | ((Cur) << 2 | (Nxt)))) -#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & 0x3) -#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3) - -#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3) -#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3)) - -#define HTON24(Dst, Src) \ - do { \ - (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \ - (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \ - (Dst)[2] = (UINT8) ((Src) & 0xFF); \ - } while (0); - -#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2])) - -#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength) -#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len)) - -// -// initiator opcodes -// -#define ISCSI_OPCODE_NOP_OUT 0x00 -#define ISCSI_OPCODE_SCSI_CMD 0x01 -#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02 -#define ISCSI_OPCODE_LOGIN_REQ 0x03 -#define ISCSI_OPCODE_TEXT_REQ 0x04 -#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05 -#define ISCSI_OPCODE_LOGOUT_REQ 0x06 -#define ISCSI_OPCODE_SNACK_REQ 0x10 -#define ISCSI_OPCODE_VENDOR_I0 0x1c -#define ISCSI_OPCODE_VENDOR_I1 0x1d -#define ISCSI_OPCODE_VENDOR_I2 0x1e - -// -// target opcodes -// -#define ISCSI_OPCODE_NOP_IN 0x20 -#define ISCSI_OPCODE_SCSI_RSP 0x21 -#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22 -#define ISCSI_OPCODE_LOGIN_RSP 0x23 -#define ISCSI_OPCODE_TEXT_RSP 0x24 -#define ISCSI_OPCODE_SCSI_DATA_IN 0x25 -#define ISCSI_OPCODE_LOGOUT_RSP 0x26 -#define ISCSI_OPCODE_R2T 0x31 -#define ISCSI_OPCODE_ASYNC_MSG 0x32 -#define ISCSI_OPCODE_VENDOR_T0 0x3c -#define ISCSI_OPCODE_VENDOR_T1 0x3d -#define ISCSI_OPCODE_VENDOR_T2 0x3e -#define ISCSI_OPCODE_REJECT 0x3f - -#define ISCSI_BHS_FLAG_FINAL 0x80 - -/// -/// iSCSI Basic Header Segment -/// -typedef struct _ISCSI_BASIC_HEADER { - UINT8 OpCode; - UINT8 Flags; - UINT16 OpCodeSpecific1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 OpCodeSpecific2[7]; -} ISCSI_BASIC_HEADER; - -// -// Defined AHS types, others are reserved. -// -#define ISCSI_AHS_TYPE_EXT_CDB 0x1 -#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2 - -typedef struct _ISCSI_ADDTIONAL_HEADER { - UINT16 Length; - UINT8 Type; - UINT8 TypeSpecific[1]; -} ISCSI_ADDITIONAL_HEADER; - -typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS { - UINT16 Length; - UINT8 Type; - UINT8 Reserved; - UINT32 ExpReadDataLength; -} ISCSI_BI_EXP_READ_DATA_LEN_AHS; - -#define SCSI_CMD_PDU_FLAG_READ 0x40 -#define SCSI_CMD_PDU_FLAG_WRITE 0x20 - -#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07 - -// -// task attributes -// -#define ISCSI_TASK_ATTR_UNTAGGED 0x00 -#define ISCSI_TASK_ATTR_SIMPLE 0x01 -#define ISCSI_TASK_ATTR_ORDERD 0x02 -#define ISCSI_TASK_ATTR_HOQ 0x03 -#define ISCSI_TASK_ATTR_ACA 0x04 - -/// -/// SCSI Command -/// -typedef struct _SCSI_COMMAND { - UINT8 OpCode; - UINT8 Flags; - UINT16 Reserved; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 ExpDataXferLength; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT8 Cdb[16]; -} SCSI_COMMAND; - -// -// flag bit definitions in SCSI response -// -#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10 -#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08 -#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04 -#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02 - -// -// iSCSI service response codes -// -#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00 -#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01 - -/// -/// SCSI Response -/// -typedef struct _SCSI_RESPONSE { - UINT8 OpCode; - UINT8 Flags; - UINT8 Response; - UINT8 Status; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Reserved[8]; - UINT32 InitiatorTaskTag; - UINT32 SNACKTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 ExpDataSN; - UINT32 BiReadResidualCount; - UINT32 ResidualCount; -} SCSI_RESPONSE; - -typedef struct _ISCSI_SENSE_DATA { - UINT16 Length; - UINT8 Data[2]; -} ISCSI_SENSE_DATA; - -/// -/// iSCSI Task Managment Function Request -/// -typedef struct _ISCSI_TMF_REQUEST { - UINT8 OpCode; - UINT8 Fuction; - UINT16 Reserved1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 ReferencedTaskTag; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 RefCmdSN; - UINT32 ExpDataSN; - UINT32 Reserved2[2]; -} ISCSI_TMF_REQUEST; - -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0 -#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1 -#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2 -#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3 -#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4 -#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5 -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6 -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255 - -/// -/// iSCSI Task Management Function Response -/// -typedef struct _ISCSI_TMF_RESPONSE { - UINT8 OpCode; - UINT8 Reserved1; - UINT8 Response; - UINT8 Reserved2; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserver3[2]; - UINT32 InitiatorTaskTag; - UINT32 Reserved4; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 Reserved[3]; -} ISCSI_TMF_RESPONSE; - -/// -/// SCSI Data-Out -/// -typedef struct _ISCSI_SCSI_DATA_OUT { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 Reserved2; - UINT32 ExpStatSN; - UINT32 Reserved3; - UINT32 DataSN; - UINT32 BufferOffset; - UINT32 Reserved4; -} ISCSI_SCSI_DATA_OUT; - -#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40 -#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW SCSI_RSP_PDU_FLAG_OVERFLOW -#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW SCSI_RSP_PDU_FLAG_UNDERFLOW -#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01 - -/// -/// SCSI Data-In -/// -typedef struct _ISCSI_SCSI_DATA_IN { - UINT8 OpCode; - UINT8 Flags; - UINT8 Reserved1; - UINT8 Status; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 DataSN; - UINT32 BufferOffset; - UINT32 ResidualCount; -} ISCSI_SCSI_DATA_IN; - -#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset) - -/// -/// Ready To Transfer -/// -typedef struct _ISCSI_READY_TO_TRANSFER { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 R2TSeqNum; - UINT32 BufferOffset; - UINT32 DesiredDataTransferLength; -} ISCSI_READY_TO_TRANSFER; - -typedef struct _ISCSI_ASYNC_MESSAGE { - UINT8 OpCode; - UINT8 Reserved1[8]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 Reserved2; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT8 AsyncEvent; - UINT8 AsyncVCode; - UINT16 Parameter1; - UINT16 Parameter2; - UINT16 Parameter3; - UINT32 Reserved3; -} ISCSI_ASYNC_MESSAGE; - -#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80 -#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40 - -/// -/// Login Request -/// -typedef struct _ISCSI_LOGIN_REQUEST { - UINT8 OpCode; - UINT8 Flags; - UINT8 VersionMax; - UINT8 VersionMin; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Isid[6]; - UINT16 Tsih; - UINT32 InitiatorTaskTag; - UINT16 Cid; - UINT16 Reserved1; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 Reserved2[4]; -} ISCSI_LOGIN_REQUEST; - -#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT -#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE - -#define ISCSI_LOGIN_STATUS_SUCCESS 0 -#define ISCSI_LOGIN_STATUS_REDIRECTION 1 -#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2 -#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3 - -/// -/// Login Response -/// -typedef struct _ISCSI_LOGIN_RESPONSE { - UINT8 OpCode; - UINT8 Flags; - UINT8 VersionMax; - UINT8 VersionActive; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Isid[6]; - UINT16 Tsih; - UINT32 InitiatorTaskTag; - UINT32 Reserved1; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT8 StatusClass; - UINT8 StatusDetail; - UINT8 Reserved2[10]; -} ISCSI_LOGIN_RESPONSE; - -#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0 -#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1 -#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY 2 - -/// -/// Logout Request -/// -typedef struct _ISCSI_LOGOUT_REQUEST { - UINT8 OpCode; - UINT8 ReasonCode; - UINT16 Reserved1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserved2[2]; - UINT32 InitiatorTaskTag; - UINT16 Cid; - UINT16 Reserved3; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 Reserved4[4]; -} ISCSI_LOGOUT_REQUEST; - -#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0 -#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1 -#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2 -#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3 - -/// -/// Logout Response -/// -typedef struct _ISCSI_LOGOUT_RESPONSE { - UINT8 OpCode; - UINT8 Reserved1; - UINT8 Response; - UINT8 Reserved2; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserved3[2]; - UINT32 InitiatorTaskTag; - UINT32 Reserved4; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 Reserved5; - UINT16 Time2Wait; - UINT16 Time2Retain; - UINT32 Reserved6; -} ISCSI_LOGOUT_RESPONSE; - -#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0 -#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1 -#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2 -#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3 - -/// -/// SNACK Request -/// -typedef struct _ISCSI_SNACK_REQUEST { - UINT8 OpCode; - UINT8 Type; - UINT16 Reserved1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 Reserved2; - UINT32 ExpStatSN; - UINT32 Reserved[2]; - UINT32 BegRun; - UINT32 RunLength; -} ISCSI_SNACK_REQUEST; - -/// -/// Reject -/// -typedef struct _ISCSI_REJECT { - UINT8 OpCode; - UINT8 Reserved1; - UINT8 Reason; - UINT8 Reserved2; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserved3[2]; - UINT32 InitiatorTaskTag; - UINT32 Reserved4; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 DataSN; - UINT32 Reserved5[2]; -} ISCSI_REJECT; - -/// -/// NOP-Out -/// -typedef struct _ISCSI_NOP_OUT { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 Reserved2[4]; -} ISCSI_NOP_OUT; - -/// -/// NOP-In -/// -typedef struct _ISCSI_NOP_IN { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 Reserved2[3]; -} ISCSI_NOP_IN; - -#define ISCSI_SECURITY_NEGOTIATION 0 -#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1 -#define ISCSI_FULL_FEATURE_PHASE 3 - -typedef enum { - IScsiDigestNone, - IScsiDigestCRC32 -} ISCSI_DIGEST_TYPE; - -typedef struct _ISCSI_XFER_CONTEXT { - UINT32 TargetTransferTag; - UINT32 Offset; - UINT32 DesiredLength; - UINT32 ExpDataSN; -} ISCSI_XFER_CONTEXT; - -typedef struct _ISCSI_IN_BUFFER_CONTEXT { - UINT8 *InData; - UINT32 InDataLen; -} ISCSI_IN_BUFFER_CONTEXT; - -typedef struct _ISCSI_TCB { - LIST_ENTRY Link; - - BOOLEAN SoFarInOrder; - UINT32 ExpDataSN; - BOOLEAN FbitReceived; - BOOLEAN StatusXferd; - UINT32 ActiveR2Ts; - UINT32 Response; - CHAR8 *Reason; - UINT32 InitiatorTaskTag; - UINT32 CmdSN; - UINT32 SNACKTag; - - ISCSI_XFER_CONTEXT XferContext; - - ISCSI_CONNECTION *Conn; -} ISCSI_TCB; - -typedef struct _ISCSI_KEY_VALUE_PAIR { - LIST_ENTRY List; - - CHAR8 *Key; - CHAR8 *Value; -} ISCSI_KEY_VALUE_PAIR; - -/** - Attach the iSCSI connection to the iSCSI session. - - @param[in, out] Session The iSCSI session. - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiAttatchConnection ( - IN OUT ISCSI_SESSION *Session, - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Detach the iSCSI connection from the session it belongs to. - - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiDetatchConnection ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - This function does the iSCSI connection login. - - @param[in, out] Conn The iSCSI connection to login. - - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target. - @retval EFI_TIMEOUT Timeout happened during the login procedure. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConnLogin ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Create a TCP connection for the iSCSI session. - - @param[in] Private The iSCSI driver data. - @param[in] Session Maximum CmdSN from the target. - - @return The newly created iSCSI connection. -**/ -ISCSI_CONNECTION * -IScsiCreateConnection ( - IN ISCSI_DRIVER_DATA *Private, - IN ISCSI_SESSION *Session - ); - -/** - Destroy an iSCSI connection. - - @param[in] Conn The connection to destroy. -**/ -VOID -IScsiDestroyConnection ( - IN ISCSI_CONNECTION *Conn - ); - -/** - Login the iSCSI session. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The iSCSI session login procedure finished. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiSessionLogin ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Build and send the iSCSI login request to the iSCSI target according to - the current login stage. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this - connection. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_DEVICE_ERROR Some kind of device error happened. -**/ -EFI_STATUS -IScsiSendLoginReq ( - IN ISCSI_CONNECTION *Conn - ); - -/** - Receive and process the iSCSI login response. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login response PDU is received and processed. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceiveLoginRsp ( - IN ISCSI_CONNECTION *Conn - ); - -/** - Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU. - The DataSegmentLength and the actual size of the net buffer containing this PDU will be - updated. - - @param[in, out] Pdu The iSCSI PDU whose data segment the key-value pair will - be added to. - @param[in] Key The key name string. - @param[in] Value The value string. - - @retval EFI_SUCCESS The key-valu pair is added to the PDU's datasegment and - the correspondence length fields are updated. - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value - pair. -**/ -EFI_STATUS -IScsiAddKeyValuePair ( - IN OUT NET_BUF *Pdu, - IN CHAR8 *Key, - IN CHAR8 *Value - ); - -/** - Prepare the iSCSI login request to be sent according to the current login status. - - @param[in, out] Conn The connection in the iSCSI login phase. - - @return The pointer to the net buffer containing the iSCSI login request built. - @retval Others Other errors as indicated. -**/ -NET_BUF * -IScsiPrepareLoginReq ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Process the iSCSI Login Response. - - @param[in, out] Conn The connection on which the iSCSI login response is received. - @param[in, out] Pdu The iSCSI login response PDU. - - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all check are passed. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_MEDIA_CHANGED Target is redirected. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiProcessLoginRsp ( - IN OUT ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ); - -/** - Updated the target information according the data received in the iSCSI - login response with an target redirection status. - - @param[in, out] Session The iSCSI session. - @param[in] Data The data segment which should contain the - TargetAddress key-value list. - @param[in] Len Length of the data. - - @retval EFI_SUCCESS The target address is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_FOUND The TargetAddress key is not found. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiUpdateTargetAddress ( - IN OUT ISCSI_SESSION *Session, - IN CHAR8 *Data, - IN UINT32 Len - ); - -/** - The callback function to free the net buffer list. - - @param[in] Arg The opaque parameter. -**/ -VOID -EFIAPI -IScsiFreeNbufList ( - VOID *Arg - ); - -/** - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and - an optional data segment. The two parts will be put into two blocks of buffers in the - net buffer. The digest check will be conducted in this function if needed and the digests - will be trimmed from the PDU buffer. - - @param[in] Conn The iSCSI connection to receive data from. - @param[out] Pdu The received iSCSI pdu. - @param[in] Context The context used to describe information on the caller provided - buffer to receive data segment of the iSCSI pdu, it's optional. - @param[in] HeaderDigest Whether there will be header digest received. - @param[in] DataDigest Whether there will be data digest. - @param[in] TimeoutEvent The timeout event, it's optional. - - @retval EFI_SUCCESS An iSCSI pdu is received. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceivePdu ( - IN ISCSI_CONNECTION *Conn, - OUT NET_BUF **Pdu, - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL - IN BOOLEAN HeaderDigest, - IN BOOLEAN DataDigest, - IN EFI_EVENT TimeoutEvent OPTIONAL - ); - -/** - Check and get the result of the prameter negotiation. - - @param[in, out] Conn The connection in iSCSI login. - - @retval EFI_SUCCESS The parmeter check is passed and negotiation is finished. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiCheckOpParams ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Fill the oprational prameters. - - @param[in] Conn The connection in iSCSI login. - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters. - - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request PDU. -**/ -EFI_STATUS -IScsiFillOpParams ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ); - -/** - Pad the iSCSI AHS or data segment to an integer number of 4 byte words. - - @param[in, out] Pdu The iSCSI pdu which contains segments to pad. - @param[in] Len The length of the last semgnet in the PDU. - - @retval EFI_SUCCESS The segment is padded or no need to pad it. - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the - padding bytes. -**/ -EFI_STATUS -IScsiPadSegment ( - IN OUT NET_BUF *Pdu, - IN UINT32 Len - ); - -/** - Build a key-value list from the data segment. - - @param[in] Data The data segment containing the key-value pairs. - @param[in] Len Length of the data segment. - - @return The key-value list. - @retval NULL Other errors as indicated. -**/ -LIST_ENTRY * -IScsiBuildKeyValueList ( - IN CHAR8 *Data, - IN UINT32 Len - ); - -/** - Get the value string by the key name from the key-value list. If found, - the key-value entry will be removed from the list. - - @param[in, out] KeyValueList The key-value list. - @param[in] Key The key name to find. - - @return The value string. -**/ -CHAR8 * -IScsiGetValueByKeyFromList ( - IN OUT LIST_ENTRY *KeyValueList, - IN CHAR8 *Key - ); - -/** - Free the key-value list. - - @param[in] KeyValueList The key-value list. -**/ -VOID -IScsiFreeKeyValueList ( - IN LIST_ENTRY *KeyValueList - ); - -/** - Normalize the iSCSI name according to RFC. - - @param[in, out] Name The iSCSI name. - @param[in] Len length of the iSCSI name. - - @retval EFI_SUCCESS The iSCSI name is valid and normalized. - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format. -**/ -EFI_STATUS -IScsiNormalizeName ( - IN OUT CHAR8 *Name, - IN UINTN Len - ); - -/** - Execute the SCSI command issued through the EXT SCSI PASS THRU protocol. - - @param[in] PassThru The EXT SCSI PASS THRU protocol. - @param[in] Target The target ID. - @param[in] Lun The LUN. - @param[in, out] Packet The request packet containing IO request, SCSI command - buffer and buffers to read/write. - - @retval EFI_SUCCES The SCSI command is executed and the result is updated to - the Packet. - @retval EFI_DEVICE_ERROR Session state was not as required. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_READY The target can not accept new commands. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiExecuteScsiCommand ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ); - -/** - Reinstate the session on some error. - - @param[in, out] Private The iSCSI driver data. - - @retval EFI_SUCCES The session is reinstated from some error. - @retval Other Reinstatement failed. -**/ -EFI_STATUS -IScsiSessionReinstatement ( - IN OUT ISCSI_DRIVER_DATA *Private - ); - -/** - Initialize some session parameters before login. - - @param[in, out] Session The iSCSI session. - @param[in] Recovery Whether the request is from a fresh new start or recovery. -**/ -VOID -IScsiSessionInit ( - IN OUT ISCSI_SESSION *Session, - IN BOOLEAN Recovery - ); - -/** - Abort the iSCSI session, that is, reset all the connection and free the - resources. - - @param[in, out] Session The iSCSI session. - - @retval EFI_SUCCES The session is aborted. -**/ -EFI_STATUS -IScsiSessionAbort ( - IN OUT ISCSI_SESSION *Session - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h deleted file mode 100644 index 9e0f1e0f02c2..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h +++ /dev/null @@ -1,142 +0,0 @@ -/** @file - iSCSI Tcp4 IO related definitions. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_TCP4_IO_H_ -#define _ISCSI_TCP4_IO_H_ - -#include <Library/NetLib.h> -#include <Protocol/Tcp4.h> - -typedef struct _TCP4_IO_CONFIG_DATA { - EFI_IPv4_ADDRESS LocalIp; - EFI_IPv4_ADDRESS SubnetMask; - EFI_IPv4_ADDRESS Gateway; - - EFI_IPv4_ADDRESS RemoteIp; - UINT16 RemotePort; -} TCP4_IO_CONFIG_DATA; - -typedef struct _TCP4_IO { - EFI_HANDLE Image; - EFI_HANDLE Controller; - - EFI_HANDLE Handle; - EFI_TCP4_PROTOCOL *Tcp4; - - EFI_TCP4_CONNECTION_TOKEN ConnToken; - EFI_TCP4_IO_TOKEN TxToken; - EFI_TCP4_IO_TOKEN RxToken; - EFI_TCP4_CLOSE_TOKEN CloseToken; - - BOOLEAN IsConnDone; - BOOLEAN IsTxDone; - BOOLEAN IsRxDone; - BOOLEAN IsCloseDone; -} TCP4_IO; - -/** - Create a TCP socket with the specified configuration data. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - @param[in] ConfigData The Tcp4 configuration data. - @param[in] Tcp4Io The Tcp4Io. - - @retval EFI_SUCCESS The TCP socket is created and configured. - @retval Others Failed to create the TCP socket or configure it. -**/ -EFI_STATUS -Tcp4IoCreateSocket ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN TCP4_IO_CONFIG_DATA *ConfigData, - IN TCP4_IO *Tcp4Io - ); - -/** - Destroy the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. -**/ -VOID -Tcp4IoDestroySocket ( - IN TCP4_IO *Tcp4Io - ); - -/** - Connect to the other endpoint of the TCP socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Timeout The time to wait for connection done. - - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully. - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoConnect ( - IN OUT TCP4_IO *Tcp4Io, - IN EFI_EVENT Timeout - ); - -/** - Reset the socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. -**/ -VOID -Tcp4IoReset ( - IN OUT TCP4_IO *Tcp4Io - ); - -/** - Transmit the Packet to the other endpoint of the socket. - - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Packet The packet to transmit. - - @retval EFI_SUCCESS The packet is trasmitted. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoTransmit ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet - ); - -/** - Receive data from the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed. - @param[in] Packet The buffer to hold the data copy from the soket rx buffer. - @param[in] AsyncMode Is this receive asyncronous or not. - @param[in] Timeout The time to wait for receiving the amount of data the Packet - can hold. - - @retval EFI_SUCCESS The required amount of data is received from the socket. - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. - @retval EFI_TIMEOUT Failed to receive the required amount of data in the - specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoReceive ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet, - IN BOOLEAN AsyncMode, - IN EFI_EVENT Timeout - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h deleted file mode 100644 index 1541b2d8ece1..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h +++ /dev/null @@ -1,80 +0,0 @@ -/** @file - Header file for Md5. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _MD5_H_ -#define _MD5_H_ - -#include <Uefi.h> -#include <Library/BaseLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/NetLib.h> - -#define MD5_HASHSIZE 16 - -typedef struct _MD5_CTX { - EFI_STATUS Status; - UINT64 Length; - UINT32 States[MD5_HASHSIZE / sizeof (UINT32)]; - UINT8 M[64]; - UINTN Count; -} MD5_CTX; - -/** - Initialize four 32-bits chaining variables and use them to do the Md5 transform. - - @param[out] Md5Ctx The data structure of Md5. - - @retval EFI_SUCCESS Initialization is ok. -**/ -EFI_STATUS -MD5Init ( - OUT MD5_CTX *Md5Ctx - ); - -/** - the external interface of Md5 algorithm - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[in] Data The data wanted to be transformed. - @param[in] DataLen The length of data. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Update ( - IN OUT MD5_CTX *Md5Ctx, - IN VOID *Data, - IN UINTN DataLen - ); - -/** - Accumulate the MD5 value of every data segment and generate the finial - result according to MD5 algorithm. - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[out] HashVal The final 128-bits output. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Final ( - IN OUT MD5_CTX *Md5Ctx, - OUT UINT8 *HashVal - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h deleted file mode 100644 index bea7479eb222..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h +++ /dev/null @@ -1,131 +0,0 @@ -/** @file - Socket implementation header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _SOCK_IMPL_H_ -#define _SOCK_IMPL_H_ - -#include "Socket.h" -#include "Tcp4Main.h" - -/** - Signal a event with the given status. - - @param Token The token's event is to be signaled. - @param TokenStatus The status to be sent with the event. - -**/ -#define SIGNAL_TOKEN(Token, TokenStatus) \ - do { \ - (Token)->Status = (TokenStatus); \ - gBS->SignalEvent ((Token)->Event); \ - } while (0) - - -/** - Supporting function for both SockImpl and SockInterface. - - @param Event The Event this notify function registered to, ignored. - -**/ -VOID -EFIAPI -SockFreeFoo ( - IN EFI_EVENT Event - ); - -/** - Process the TCP send data, buffer the tcp txdata and append - the buffer to socket send buffer,then try to send it. - - @param Sock Pointer to the socket. - @param TcpTxData Pointer to the tcp txdata. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -SockProcessTcpSndData ( - IN SOCKET *Sock, - IN VOID *TcpTxData - ); - -/** - Copy data from socket buffer to application provided receive buffer. - - @param Sock Pointer to the socket. - @param TcpRxData Pointer to the application provided receive buffer. - @param RcvdBytes The maximum length of the data can be copied. - @param IsOOB If TRUE the data is OOB, else the data is normal. - -**/ -VOID -SockSetTcpRxData ( - IN SOCKET *Sock, - IN VOID *TcpRxData, - IN UINT32 RcvdBytes, - IN BOOLEAN IsOOB - ); - -/** - Get received data from the socket layer to the receive token. - - @param Sock Pointer to the socket. - @param RcvToken Pointer to the application provided receive token. - - @return The length of data received in this token. - -**/ -UINT32 -SockProcessRcvToken ( - IN SOCKET *Sock, - IN OUT SOCK_IO_TOKEN *RcvToken - ); - -/** - Flush the socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockConnFlush ( - IN OUT SOCKET *Sock - ); - -/** - Create a socket with initial data SockInitData. - - @param SockInitData Pointer to the initial data of the socket. - - @return Pointer to the newly created socket. - -**/ -SOCKET * -SockCreate ( - IN SOCK_INIT_DATA *SockInitData - ); - -/** - Destroy a socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockDestroy ( - IN OUT SOCKET *Sock - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h deleted file mode 100644 index 650a7dd8651f..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h +++ /dev/null @@ -1,954 +0,0 @@ -/** @file - Socket header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -#include <Uefi.h> - -#include <Protocol/Ip4.h> -#include <Protocol/Tcp4.h> -#include <Protocol/Udp4.h> - -#include <Library/NetLib.h> -#include <Library/DebugLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/UefiLib.h> -#include <Library/DpcLib.h> -#include <Library/PrintLib.h> - -#define SOCK_SND_BUF 0 -#define SOCK_RCV_BUF 1 - -#define SOCK_BUFF_LOW_WATER (2 * 1024) -#define SOCK_RCV_BUFF_SIZE (8 * 1024) -#define SOCK_SND_BUFF_SIZE (8 * 1024) -#define SOCK_BACKLOG 5 - -#define PROTO_RESERVED_LEN 20 - -#define SO_NO_MORE_DATA 0x0001 - -// -// -// -// When a socket is created it enters into SO_UNCONFIGURED, -// no actions can be taken on this socket, only after calling -// SockConfigure. The state transition diagram of socket is -// as following: -// -// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING -// ^ | | -// | ---> SO_LISTENING | -// | | -// |------------------SO_DISCONNECTING<-- SO_CONNECTED -// -// A passive socket can only go into SO_LISTENING and -// SO_UNCONFIGURED state. SO_XXXING state is a middle state -// when a socket is undergoing a protocol procedure such -// as requesting a TCP connection. -// -// -// - -/// -/// Socket state -/// -#define SO_CLOSED 0 -#define SO_LISTENING 1 -#define SO_CONNECTING 2 -#define SO_CONNECTED 3 -#define SO_DISCONNECTING 4 - -/// -/// Socket configure state -/// -#define SO_UNCONFIGURED 0 -#define SO_CONFIGURED_ACTIVE 1 -#define SO_CONFIGURED_PASSIVE 2 -#define SO_NO_MAPPING 3 - -/** - Set socket SO_NO_MORE_DATA flag. - - @param Sock Pointer to the socket - -**/ -#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= SO_NO_MORE_DATA) - -/** - Check whether the socket is unconfigured. - - @param Sock Pointer to the socket - - @retval True The socket is unconfigued - @retval False The socket is not unconfigued - -**/ -#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == SO_UNCONFIGURED) - -/** - Check whether the socket is configured. - - @param Sock Pointer to the socket - - @retval True The socket is configued - @retval False The socket is not configued - -**/ -#define SOCK_IS_CONFIGURED(Sock) \ - (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \ - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)) - -/** - Check whether the socket is configured to active mode. - - @param Sock Pointer to the socket - - @retval True The socket is configued to active mode - @retval False The socket is not configued to active mode - -**/ -#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \ - ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) - -/** - Check whether the socket is configured to passive mode. - - @param Sock Pointer to the socket - - @retval True The socket is configued to passive mode - @retval False The socket is not configued to passive mode - -**/ -#define SOCK_IS_CONNECTED_PASSIVE(Sock) \ - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE) - -/** - Check whether the socket is mapped. - - @param Sock Pointer to the socket - - @retval True The socket is no mapping - @retval False The socket is mapped - -**/ -#define SOCK_IS_NO_MAPPING(Sock) \ - ((Sock)->ConfigureState == SO_NO_MAPPING) - -/** - Check whether the socket is closed. - - @param Sock Pointer to the socket - - @retval True The socket is closed - @retval False The socket is not closed - -**/ -#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED) - -/** - Check whether the socket is listening. - - @param Sock Pointer to the socket - - @retval True The socket is listening - @retval False The socket is not listening - -**/ -#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING) - -/** - Check whether the socket is connecting. - - @param Sock Pointer to the socket - - @retval True The socket is connecting - @retval False The socket is not connecting - -**/ -#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == SO_CONNECTING) - -/** - Check whether the socket has connected. - - @param Sock Pointer to the socket - - @retval True The socket has connected - @retval False The socket has not connected - -**/ -#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED) - -/** - Check whether the socket is disconnecting. - - @param Sock Pointer to the socket - - @retval True The socket is disconnecting - @retval False The socket is not disconnecting - -**/ -#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == SO_DISCONNECTING) - -/** - Check whether the socket is no more data. - - @param Sock Pointer to the socket - - @retval True The socket is no more data - @retval False The socket still has data - -**/ -#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA)) - -/** - Set the size of the receive buffer. - - @param Sock Pointer to the socket - @param Size The size to set - -**/ -#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = (Size)) - -/** - Get the size of the receive buffer. - - @param Sock Pointer to the socket - - @return The receive buffer size - -**/ -#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater) - -/** - Get the size of the receive data. - - @param Sock Pointer to the socket - - @return The received data size - -**/ -#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)->BufSize) - -/** - Set the size of the send buffer. - - @param Sock Pointer to the socket - @param Size The size to set - -**/ -#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = (Size)) - -/** - Get the size of the send buffer. - - @param Sock Pointer to the socket - - @return The send buffer size - -**/ -#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater) - -/** - Get the size of the send data. - - @param Sock Pointer to the socket - - @return The send data size - -**/ -#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)->BufSize) - -/** - Set the backlog value of the socket. - - @param Sock Pointer to the socket - @param Value The value to set - -**/ -#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value)) - -/** - Get the backlog value of the socket. - - @param Sock Pointer to the socket - - @return The backlog value - -**/ -#define GET_BACKLOG(Sock) ((Sock)->BackLog) - -/** - Set the socket with error state. - - @param Sock Pointer to the socket - @param Error The error state - -**/ -#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error)) - -#define SND_BUF_HDR_LEN(Sock) \ - ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize) - -#define RCV_BUF_HDR_LEN(Sock) \ - ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize) - -#define SOCK_SIGNATURE SIGNATURE_32 ('S', 'O', 'C', 'K') - -#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE) - -#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock) - -#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \ - ((Type *) (((SOCK_TOKEN *) (SockToken))->Token)) - -typedef struct _SOCKET SOCKET; - -/// -/// Socket completion token -/// -typedef struct _SOCK_COMPLETION_TOKEN { - EFI_EVENT Event; ///< The event to be issued - EFI_STATUS Status; ///< The status to be issued -} SOCK_COMPLETION_TOKEN; - -typedef union { - VOID *RxData; - VOID *TxData; -} SOCK_IO_DATA; - -/// -/// The application token with data packet -/// -typedef struct _SOCK_IO_TOKEN { - SOCK_COMPLETION_TOKEN Token; - SOCK_IO_DATA Packet; -} SOCK_IO_TOKEN; - -/// -/// The request issued from socket layer to protocol layer. -/// -#define SOCK_ATTACH 0 ///< Attach current socket to a new PCB -#define SOCK_DETACH 1 ///< Detach current socket from the PCB -#define SOCK_CONFIGURE 2 ///< Configure attached PCB -#define SOCK_FLUSH 3 ///< Flush attached PCB -#define SOCK_SND 4 ///< Need protocol to send something -#define SOCK_SNDPUSH 5 ///< Need protocol to send pushed data -#define SOCK_SNDURG 6 ///< Need protocol to send urgent data -#define SOCK_CONSUMED 7 ///< Application has retrieved data from socket -#define SOCK_CONNECT 8 ///< Need to connect to a peer -#define SOCK_CLOSE 9 ///< Need to close the protocol process -#define SOCK_ABORT 10 ///< Need to reset the protocol process -#define SOCK_POLL 11 ///< Need to poll to the protocol layer -#define SOCK_ROUTE 12 ///< Need to add a route information -#define SOCK_MODE 13 ///< Need to get the mode data of the protocol -#define SOCK_GROUP 14 ///< Need to join a mcast group - -/// -/// The socket type. -/// -typedef enum { - SockDgram, ///< This socket providing datagram service - SockStream ///< This socket providing stream service -} SOCK_TYPE; - -/// -/// The buffer structure of rcvd data and send data used by socket. -/// -typedef struct _SOCK_BUFFER { - UINT32 HighWater; ///< The buffersize upper limit of sock_buffer - UINT32 LowWater; ///< The low water mark of sock_buffer - NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data -} SOCK_BUFFER; - -/** - The handler of protocol for request from socket. - - @param Socket The socket issuing the request to protocol - @param Request The request issued by socket - @param RequestData The request related data - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -typedef -EFI_STATUS -(*SOCK_PROTO_HANDLER) ( - IN SOCKET *Socket, - IN UINT8 Request, - IN VOID *RequestData - ); - - -// -// Socket provided oprerations for low layer protocol -// - -// -// Socket provided operations for user interface -// - -/** - Set the state of the socket. - - @param Sock Pointer to the socket. - @param State The new socket state to be set. - -**/ -VOID -SockSetState ( - IN OUT SOCKET *Sock, - IN UINT8 State - ); - -/** - Called by the low layer protocol to indicate the socket a connection is - established. - - This function just changes the socket's state to SO_CONNECTED - and signals the token used for connection establishment. - - @param Sock Pointer to the socket associated with the - established connection. - -**/ -VOID -SockConnEstablished ( - IN SOCKET *Sock - ); - -/** - Called by the low layer protocol to indicate the connection is closed. - - This function flushes the socket, sets the state to SO_CLOSED and signals - the close token. - - @param Sock Pointer to the socket associated with the closed - connection. - -**/ -VOID -SockConnClosed ( - IN OUT SOCKET *Sock - ); - -/** - Called by low layer protocol to indicate that some data is sent or processed. - - This function trims the sent data in the socket send buffer, signals the data - token if proper. - - @param Sock Pointer to the socket. - @param Count The length of the data processed or sent, in bytes. - -**/ -VOID -SockDataSent ( - IN SOCKET *Sock, - IN UINT32 Count - ); - -/** - Called by the low layer protocol to copy some data in socket send - buffer starting from the specific offset to a buffer provided by - the caller. - - @param Sock Pointer to the socket. - @param Offset The start point of the data to be copied. - @param Len The length of the data to be copied. - @param Dest Pointer to the destination to copy the data. - - @return The data size copied. - -**/ -UINT32 -SockGetDataToSend ( - IN SOCKET *Sock, - IN UINT32 Offset, - IN UINT32 Len, - IN UINT8 *Dest - ); - -/** - Called by the low layer protocol to indicate that there - will be no more data from the communication peer. - - This function set the socket's state to SO_NO_MORE_DATA and - signal all queued IO tokens with the error status EFI_CONNECTION_FIN. - - @param Sock Pointer to the socket. - -**/ -VOID -SockNoMoreData ( - IN OUT SOCKET *Sock - ); - -/** - Called by the low layer protocol to deliver received data to socket layer. - - This function will append the data to the socket receive buffer, set ther - urgent data length and then check if any receive token can be signaled. - - @param Sock Pointer to the socket. - @param NetBuffer Pointer to the buffer that contains the received - data. - @param UrgLen The length of the urgent data in the received data. - -**/ -VOID -SockDataRcvd ( - IN SOCKET *Sock, - IN OUT NET_BUF *NetBuffer, - IN UINT32 UrgLen - ); - -/** - Get the length of the free space of the specific socket buffer. - - @param Sock Pointer to the socket. - @param Which Flag to indicate which socket buffer to check, - either send buffer or receive buffer. - - @return The length of the free space, in bytes. - -**/ -UINT32 -SockGetFreeSpace ( - IN SOCKET *Sock, - IN UINT32 Which - ); - -/** - Clone a new socket including its associated protocol control block. - - @param Sock Pointer to the socket to be cloned. - - @return Pointer to the newly cloned socket. If NULL, error condition occurred. - -**/ -SOCKET * -SockClone ( - IN SOCKET *Sock - ); - - -/// -/// Proto type of the create callback -/// -typedef -EFI_STATUS -(*SOCK_CREATE_CALLBACK) ( - IN SOCKET *This, - IN VOID *Context - ); - -/// -/// Proto type of the destroy callback -/// -typedef -VOID -(*SOCK_DESTROY_CALLBACK) ( - IN SOCKET *This, - IN VOID *Context - ); - -/// -/// The initialize data for create a new socket. -/// -typedef struct _SOCK_INIT_DATA { - SOCK_TYPE Type; - UINT8 State; - - SOCKET *Parent; ///< The parent of this socket - UINT32 BackLog; ///< The connection limit for listening socket - UINT32 SndBufferSize; ///< The high water mark of send buffer - UINT32 RcvBufferSize; ///< The high water mark of receive buffer - VOID *Protocol; ///< The pointer to protocol function template - ///< wanted to install on socket - - // - // Callbacks after socket is created and before socket is to be destroyed. - // - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied - VOID *Context; ///< The context of the callback - - // - // Opaque protocol data. - // - VOID *ProtoData; - UINT32 DataSize; - - SOCK_PROTO_HANDLER ProtoHandler; ///< The handler of protocol for socket request - - EFI_HANDLE DriverBinding; ///< The driver binding handle -} SOCK_INIT_DATA; - -/// -/// The union type of TCP and UDP protocol. -/// -typedef union _NET_PROTOCOL { - EFI_TCP4_PROTOCOL TcpProtocol; ///< Tcp protocol - EFI_UDP4_PROTOCOL UdpProtocol; ///< Udp protocol -} NET_PROTOCOL; - -/// -/// The socket structure representing a network service access point -/// -struct _SOCKET { - - // - // Socket description information - // - UINT32 Signature; ///< Signature of the socket - EFI_HANDLE SockHandle; ///< The virtual handle of the socket - EFI_HANDLE DriverBinding; ///< Socket's driver binding protocol - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - LIST_ENTRY Link; - UINT8 ConfigureState; - SOCK_TYPE Type; - UINT8 State; - UINT16 Flag; - EFI_LOCK Lock; ///< The lock of socket - SOCK_BUFFER SndBuffer; ///< Send buffer of application's data - SOCK_BUFFER RcvBuffer; ///< Receive buffer of received data - EFI_STATUS SockError; ///< The error returned by low layer protocol - BOOLEAN InDestroy; - - // - // Fields used to manage the connection request - // - UINT32 BackLog; ///< the limit of connection to this socket - UINT32 ConnCnt; ///< the current count of connections to it - SOCKET *Parent; ///< listening parent that accept the connection - LIST_ENTRY ConnectionList; ///< the connections maintained by this socket - - // - // The queue to buffer application's asynchronous token - // - LIST_ENTRY ListenTokenList; - LIST_ENTRY RcvTokenList; - LIST_ENTRY SndTokenList; - LIST_ENTRY ProcessingSndTokenList; - - SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal if connected - SOCK_COMPLETION_TOKEN *CloseToken; ///< app's token to signal if closed - - // - // Interface for low level protocol - // - SOCK_PROTO_HANDLER ProtoHandler; ///< The request handler of protocol - UINT8 ProtoReserved[PROTO_RESERVED_LEN]; ///< Data fields reserved for protocol - NET_PROTOCOL NetProtocol; ///< TCP or UDP protocol socket used - - // - // Callbacks after socket is created and before socket is to be destroyed. - // - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied - VOID *Context; ///< The context of the callback -}; - -/// -/// The token structure buffered in socket layer. -/// -typedef struct _SOCK_TOKEN { - LIST_ENTRY TokenList; ///< The entry to add in the token list - SOCK_COMPLETION_TOKEN *Token; ///< The application's token - UINT32 RemainDataLen; ///< Unprocessed data length - SOCKET *Sock; ///< The poninter to the socket this token - ///< belongs to -} SOCK_TOKEN; - -/// -/// Reserved data to access the NET_BUF delivered by UDP driver. -/// -typedef struct _UDP_RSV_DATA { - EFI_TIME TimeStamp; - EFI_UDP4_SESSION_DATA Session; -} UDP_RSV_DATA; - -/// -/// Reserved data to access the NET_BUF delivered by TCP driver. -/// -typedef struct _TCP_RSV_DATA { - UINT32 UrgLen; -} TCP_RSV_DATA; - -/** - Create a socket and its associated protocol control block - with the intial data SockInitData and protocol specific - data ProtoData. - - @param SockInitData Inital data to setting the socket. - - @return Pointer to the newly created socket. If NULL, error condition occured. - -**/ -SOCKET * -SockCreateChild ( - IN SOCK_INIT_DATA *SockInitData - ); - -/** - Destroy the socket Sock and its associated protocol control block. - - @param Sock The socket to be destroyed. - - @retval EFI_SUCCESS The socket Sock is destroyed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockDestroyChild ( - IN SOCKET *Sock - ); - -/** - Configure the specific socket Sock using configuration data ConfigData. - - @param Sock Pointer to the socket to be configured. - @param ConfigData Pointer to the configuration data. - - @retval EFI_SUCCESS The socket is configured successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or the - socket is already configured. - -**/ -EFI_STATUS -SockConfigure ( - IN SOCKET *Sock, - IN VOID *ConfigData - ); - -/** - Initiate a connection establishment process. - - @param Sock Pointer to the socket to initiate the initate the - connection. - @param Token Pointer to the token used for the connection - operation. - - @retval EFI_SUCCESS The connection is initialized successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be an active one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockConnect ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Issue a listen token to get an existed connected network instance - or wait for a connection if there is none. - - @param Sock Pointer to the socket to accept connections. - @param Token The token to accept a connection. - - @retval EFI_SUCCESS Either a connection is accpeted or the Token is - buffered for further acception. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be a passive one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limit. - -**/ -EFI_STATUS -SockAccept ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Issue a token with data to the socket to send out. - - @param Sock Pointer to the socket to process the token with - data. - @param Token The token with data that needs to send out. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockSend ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Issue a token to get data from the socket. - - @param Sock Pointer to the socket to get data from. - @param Token The token to store the received data from the - socket. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_CONNECTION_FIN The connection is closed and there is no more data. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockRcv ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Reset the socket and its associated protocol control block. - - @param Sock Pointer to the socket to be flushed. - - @retval EFI_SUCCESS The socket is flushed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockFlush ( - IN SOCKET *Sock - ); - -/** - Close or abort the socket associated connection. - - @param Sock Pointer to the socket of the connection to close or - abort. - @param Token The token for close operation. - @param OnAbort TRUE for aborting the connection, FALSE to close it. - - @retval EFI_SUCCESS The close or abort operation is initialized - successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockClose ( - IN SOCKET *Sock, - IN VOID *Token, - IN BOOLEAN OnAbort - ); - -/** - Get the mode data of the low layer protocol. - - @param Sock Pointer to the socket to get mode data from. - @param Mode Pointer to the data to store the low layer mode - information. - - @retval EFI_SUCCESS The mode data is got successfully. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockGetMode ( - IN SOCKET *Sock, - IN OUT VOID *Mode - ); - -/** - Add or remove route information in IP route table associated - with this socket. - - @param Sock Pointer to the socket associated with the IP route - table to operate on. - @param RouteInfo Pointer to the route information to be processed. - - @retval EFI_SUCCESS The route table is updated successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockRoute ( - IN SOCKET *Sock, - IN VOID *RouteInfo - ); - -// -// Supporting function to operate on socket buffer -// - -/** - Get the first buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - - @return Pointer to the first buffer in the queue. NULL if the queue is empty. - -**/ -NET_BUF * -SockBufFirst ( - IN SOCK_BUFFER *Sockbuf - ); - -/** - Get the next buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - @param SockEntry Pointer to the buffer block prior to the required - one. - - @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is - the tail or head entry. - -**/ -NET_BUF * -SockBufNext ( - IN SOCK_BUFFER *Sockbuf, - IN NET_BUF *SockEntry - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h deleted file mode 100644 index 368f49c4ddb1..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h +++ /dev/null @@ -1,342 +0,0 @@ -/** @file - Tcp driver function header. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_DRIVER_H_ -#define _TCP4_DRIVER_H_ - -#include <Protocol/ServiceBinding.h> -#include <Library/IpIoLib.h> - -#define TCP4_DRIVER_SIGNATURE SIGNATURE_32 ('T', 'C', 'P', '4') - -#define TCP4_PORT_KNOWN 1024 -#define TCP4_PORT_USER_RESERVED 65535 - -#define TCP4_FROM_THIS(a) \ - CR ( \ - (a), \ - TCP4_SERVICE_DATA, \ - Tcp4ServiceBinding, \ - TCP4_DRIVER_SIGNATURE \ - ) - -/// -/// TCP heartbeat tick timer. -/// -typedef struct _TCP4_HEARTBEAT_TIMER { - EFI_EVENT TimerEvent; ///< The event assoiated with the timer - INTN RefCnt; ///< Number of reference -} TCP4_HEARTBEAT_TIMER; - -/// -/// TCP service data -/// -typedef struct _TCP4_SERVICE_DATA { - UINT32 Signature; - EFI_HANDLE ControllerHandle; - IP_IO *IpIo; // IP Io consumed by TCP4 - EFI_SERVICE_BINDING_PROTOCOL Tcp4ServiceBinding; - EFI_HANDLE DriverBindingHandle; - LIST_ENTRY SocketList; -} TCP4_SERVICE_DATA; - -/// -/// TCP protocol data -/// -typedef struct _TCP4_PROTO_DATA { - TCP4_SERVICE_DATA *TcpService; - TCP_CB *TcpPcb; -} TCP4_PROTO_DATA; - - -/** - Packet receive callback function provided to IP_IO, used to call - the proper function to handle the packet received by IP. - - @param Status Status of the received packet. - @param IcmpErr ICMP error number. - @param NetSession Pointer to the net session of this packet. - @param Pkt Pointer to the recieved packet. - @param Context Pointer to the context configured in IpIoOpen(), not used - now. - - @return None - -**/ -VOID -EFIAPI -Tcp4RxCallback ( - IN EFI_STATUS Status, - IN UINT8 IcmpErr, - IN EFI_NET_SESSION_DATA *NetSession, - IN NET_BUF *Pkt, - IN VOID *Context OPTIONAL - ); - -/** - Send the segment to IP via IpIo function. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the TCP segment to be sent. - @param Src Source address of the TCP segment. - @param Dest Destination address of the TCP segment. - - @retval 0 The segment was sent out successfully. - @retval -1 The segment was failed to send. - -**/ -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dest - ); - -/** - The procotol handler provided to the socket layer, used to - dispatch the socket level requests by calling the corresponding - TCP layer functions. - - @param Sock Pointer to the socket of this TCP instance. - @param Request The code of this operation request. - @param Data Pointer to the operation specific data passed in - together with the operation request. - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN UINT8 Request, - IN VOID *Data OPTIONAL - ); - - -/** - The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle. - - @param ImageHandle The firmware allocated handle for this - driver image. - @param SystemTable Pointer to the EFI system table. - - @retval EFI_SUCCESS Driver loaded. - @retval other Driver not loaded. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - - -/** - Tests to see if this driver supports a given controller. - - If a child device is provided, it further tests to see if this driver supports - creating a handle for the specified child device. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver - specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by - the driver specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a - different driver or an application that requires - exclusive access. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver - specified by This. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Start this driver on ControllerHandle. - - The Start() function is designed to be invoked from the EFI boot service - ConnectController(). As a result, much of the error checking on the parameters - to Start() has been moved into this common boot service. It is legal to call - Start() from other locations, but the following calling restrictions must be - followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally - aligned EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified - by This must have been called with the same calling parameters, and Supported() - must have returned EFI_SUCCESS. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is - optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_ALREADY_STARTED The device could not be started due to a device error. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack - of resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Stop this driver on ControllerHandle. - - The Stop() function is designed to be invoked from the EFI boot service - DisconnectController(). As a result, much of the error checking on the parameters - to Stop() has been moved into this common boot service. It is legal to call Stop() - from other locations, but the following calling restrictions must be followed - or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call - to this same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this - driver's Start() function, and the Start() function must have called OpenProtocol() - on ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param NumberOfChildren The number of child device handles in ChildHandleBuffer. - @param ChildHandleBuffer An array of child handles to be freed. May be NULL if - NumberOfChildren is 0. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -/** - Open Ip4 and device path protocols for a created socket, and insert it in - socket list. - - @param This Pointer to the socket just created - @param Context Context of the socket - - @retval EFI_SUCCESS This protocol is installed successfully. - @retval other Some error occured. - -**/ -EFI_STATUS -Tcp4CreateSocketCallback ( - IN SOCKET *This, - IN VOID *Context - ); - -/** - Close Ip4 and device path protocols for a socket, and remove it from socket list. - - @param This Pointer to the socket to be removed - @param Context Context of the socket - -**/ -VOID -Tcp4DestroySocketCallback ( - IN SOCKET *This, - IN VOID *Context - ); - -/** - Creates a child handle and installs a protocol. - - The CreateChild() function installs a protocol on ChildHandle. If ChildHandle - is a pointer to NULL, then a new handle is created and returned in ChildHandle. - If ChildHandle is not a pointer to NULL, then the protocol installs on the existing - ChildHandle. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Pointer to the handle of the child to create. If it is NULL, then - a new handle is created. If it is a pointer to an existing UEFI - handle, then the protocol is added to the existing UEFI handle. - - @retval EFI_SUCCES The protocol was added to ChildHandle. - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. - @retval EFI_OUT_OF_RESOURCES There are not enough resources available to create - the child. - @retval other The child handle was not created. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN OUT EFI_HANDLE *ChildHandle - ); - -/** - Destroys a child handle with a protocol installed on it. - - The DestroyChild() function does the opposite of CreateChild(). It removes a protocol - that was installed by CreateChild() from ChildHandle. If the removed protocol is the - last protocol on ChildHandle, then ChildHandle is destroyed. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Handle of the child to destroy - - @retval EFI_SUCCES The protocol was removed from ChildHandle. - @retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is - being removed. - @retval EFI_INVALID_PARAMETER Child handle is NULL. - @retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle - because its services are being used. - @retval other The child handle was not destroyed. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf deleted file mode 100644 index 7c0504770b48..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf +++ /dev/null @@ -1,94 +0,0 @@ -## @file -# This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol. -# -# This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol -# upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. This driver only -# supports IPv4 network stack. -# -# Notes: -# 1) This driver can't co-work with the TcpDxe driver in NetworkPkg. -# 2) This driver might have some issues that have been fixed in the TcpDxe driver -# in NetworkPkg. -# 3) This driver supports fewer features than the TcpDxe driver in NetworkPkg (e.g. IPv6, -# TCP Cancel function). -# 4) TcpDxe driver in NetworkPkg is recommended for use instead of this one even though -# both of them can be used. -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = Tcp4Dxe - MODULE_UNI_FILE = Tcp4Dxe.uni - FILE_GUID = 6d6963ab-906d-4a65-a7ca-bd40e5d6af4d - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = Tcp4DriverEntryPoint - UNLOAD_IMAGE = NetLibDefaultUnload -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC -# -# DRIVER_BINDING = mTcp4DriverBinding -# COMPONENT_NAME = gTcp4ComponentName -# COMPONENT_NAME2 = gTcp4ComponentName2 -# - -[Sources] - SockImpl.c - SockInterface.c - Tcp4Proto.h - Tcp4Main.h - SockImpl.h - Tcp4Output.c - Tcp4Timer.c - Tcp4Option.h - Tcp4Dispatcher.c - Tcp4Input.c - Tcp4Misc.c - Tcp4Main.c - Socket.h - ComponentName.c - Tcp4Driver.h - Tcp4Io.c - Tcp4Driver.c - Tcp4Func.h - Tcp4Option.c - - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - UefiLib - UefiBootServicesTableLib - UefiDriverEntryPoint - UefiRuntimeServicesTableLib - BaseMemoryLib - MemoryAllocationLib - DebugLib - NetLib - IpIoLib - DevicePathLib - DpcLib - -[Protocols] - gEfiTcp4ServiceBindingProtocolGuid ## BY_START - gEfiIp4ServiceBindingProtocolGuid ## TO_START - gEfiTcp4ProtocolGuid ## BY_START - gEfiIp4ProtocolGuid ## TO_START - -[UserExtensions.TianoCore."ExtraFiles"] - Tcp4DxeExtra.uni diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni deleted file mode 100644 index 1514a3917766..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni +++ /dev/null @@ -1,23 +0,0 @@ -// /** @file -// This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol. -// -// This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol -// upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. -// -// Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol" - -#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol upon EFI IPv4 Protocol to provide basic TCPv4 I/O services." - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni deleted file mode 100644 index 0e6d2f2896f3..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// Tcp4Dxe Localized Strings and Content -// -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"TCP v4 DXE Driver" - - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h deleted file mode 100644 index 53b7aac8ae98..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h +++ /dev/null @@ -1,781 +0,0 @@ -/** @file - Tcp function header file. - -Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_FUNC_H_ -#define _TCP4_FUNC_H_ - -// -// Declaration of all the functions in TCP -// protocol. It is intended to keep tcp.h -// clear. -// - -// -// Functions in tcp.c -// - -/** - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. - - @param Addr Pointer to the IP address needs to match. - @param Port The port number needs to match. - - @return The Tcb which matches the <Addr Port> paire exists or not. - -**/ -BOOLEAN -TcpFindTcbByPeer ( - IN EFI_IPv4_ADDRESS *Addr, - IN TCP_PORTNO Port - ); - -/** - Locate the TCP_CB related to the socket pair. - - @param LocalPort The local port number. - @param LocalIp The local IP address. - @param RemotePort The remote port number. - @param RemoteIp The remote IP address. - @param Syn Whether to search the listen sockets, if TRUE, the - listen sockets are searched. - - @return Pointer to the related TCP_CB, if NULL no match is found. - -**/ -TCP_CB * -TcpLocateTcb ( - IN TCP_PORTNO LocalPort, - IN UINT32 LocalIp, - IN TCP_PORTNO RemotePort, - IN UINT32 RemoteIp, - IN BOOLEAN Syn - ); - -/** - Insert a Tcb into the proper queue. - - @param Tcb Pointer to the TCP_CB to be inserted. - - @retval 0 The Tcb is inserted successfully. - @retval -1 Error condition occurred. - -**/ -INTN -TcpInsertTcb ( - IN TCP_CB *Tcb - ); - -/** - Clone a TCP_CB from Tcb. - - @param Tcb Pointer to the TCP_CB to be cloned. - - @return Pointer to the new cloned TCP_CB, if NULL error condition occurred. - -**/ -TCP_CB * -TcpCloneTcb ( - IN TCP_CB *Tcb - ); - -/** - Compute an ISS to be used by a new connection. - - @return The result ISS. - -**/ -TCP_SEQNO -TcpGetIss ( - VOID - ); - -/** - Initialize the Tcb local related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpInitTcbLocal ( - IN OUT TCP_CB *Tcb - ); - -/** - Initialize the peer related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the segment that contains the peer's - intial info. - @param Opt Pointer to the options announced by the peer. - -**/ -VOID -TcpInitTcbPeer ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg, - IN TCP_OPTION *Opt - ); - -/** - Get the local mss. - - @param Sock Pointer to the socket to get mss - - @return The mss size. - -**/ -UINT16 -TcpGetRcvMss ( - IN SOCKET *Sock - ); - -/** - Set the Tcb's state. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param State The state to be set. - -**/ -VOID -TcpSetState ( - IN OUT TCP_CB *Tcb, - IN UINT8 State - ); - -// -// Functions in Tcp4Output.c -// -/** - Send the segment to IP via IpIo function. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the TCP segment to be sent. - @param Src Source address of the TCP segment. - @param Dest Destination address of the TCP segment. - - @retval 0 The segment was sent out successfully. - @retval -1 The segment was failed to send. - -**/ -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dest - ); - -/** - Check whether to send data/SYN/FIN and piggy back an ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The number of bytes sent. - -**/ -INTN -TcpToSendData ( - IN OUT TCP_CB *Tcb, - IN INTN Force - ); - -/** - Check whether to send an ACK or delayed ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpToSendAck ( - IN OUT TCP_CB *Tcb - ); - -/** - Send an ACK immediately. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSendAck ( - IN OUT TCP_CB *Tcb - ); - -/** - Send a zero probe segment. It can be used by keepalive and zero window probe. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 The zero probe segment was sent out successfully. - @retval other Error condition occurred. - -**/ -INTN -TcpSendZeroProbe ( - IN OUT TCP_CB *Tcb - ); - -/** - Process the data and FIN flag, check whether to deliver - data to the socket layer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 No error occurred to deliver data. - @retval -1 Error condition occurred. Proper response is to reset the - connection. - -**/ -INTN -TcpDeliverData ( - IN OUT TCP_CB *Tcb - ); - -/** - Send a RESET segment in response to the segment received. - - @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL. - @param Head TCP header of the segment that triggers the reset. - @param Len Length of the segment that triggers the reset. - @param Local Local IP address. - @param Remote Remote peer's IP address. - - @retval 0 A reset is sent or no need to send it. - @retval -1 No reset is sent. - -**/ -INTN -TcpSendReset ( - IN TCP_CB *Tcb, - IN TCP_HEAD *Head, - IN INT32 Len, - IN UINT32 Local, - IN UINT32 Remote - ); - -/** - Compute the sequence space left in the old receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence space left in the old receive window. - -**/ -UINT32 -TcpRcvWinOld ( - IN TCP_CB *Tcb - ); - -/** - Compute the current receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The size of the current receive window, in bytes. - -**/ -UINT32 -TcpRcvWinNow ( - IN TCP_CB *Tcb - ); - -/** - Retransmit the segment from sequence Seq. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment to be retransmitted. - - @retval 0 Retransmission succeeded. - @retval -1 Error condition occurred. - -**/ -INTN -TcpRetransmit ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq - ); - -/** - Compute how much data to send. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The length of the data can be sent, if 0, no data can be sent. - -**/ -UINT32 -TcpDataToSend ( - IN TCP_CB *Tcb, - IN INTN Force - ); - -/** - Verify that the segment is in good shape. - - @param Nbuf Buffer that contains the segment to be checked. - - @retval 0 The segment is broken. - @retval 1 The segment is in good shape. - -**/ -INTN -TcpVerifySegment ( - IN NET_BUF *Nbuf - ); - -/** - Verify that all the segments in SndQue are in good shape. - - @param Head Pointer to the head node of the SndQue. - - @retval 0 At least one segment is broken. - @retval 1 All segments in the specific queue are in good shape. - -**/ -INTN -TcpCheckSndQue ( - IN LIST_ENTRY *Head - ); - -/** - Get a segment from the Tcb's SndQue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -/** - Get a segment from the Tcb's socket buffer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSock ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -/** - Get a segment starting from sequence Seq of a maximum - length of Len. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegment ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -/** - Get the maximum SndNxt. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence number of the maximum SndNxt. - -**/ -TCP_SEQNO -TcpGetMaxSndNxt ( - IN TCP_CB *Tcb - ); - -// -// Functions from Tcp4Input.c -// -/** - Process the received ICMP error messages for TCP. - - @param Nbuf Buffer that contains part of the TCP segment without IP header - truncated from the ICMP error packet. - @param IcmpErr The ICMP error code interpreted from ICMP error packet. - @param Src Source address of the ICMP error message. - @param Dst Destination address of the ICMP error message. - -**/ -VOID -TcpIcmpInput ( - IN NET_BUF *Nbuf, - IN UINT8 IcmpErr, - IN UINT32 Src, - IN UINT32 Dst - ); - -/** - Process the received TCP segments. - - @param Nbuf Buffer that contains received TCP segment without IP header. - @param Src Source address of the segment, or the peer's IP address. - @param Dst Destination address of the segment, or the local end's IP - address. - - @retval 0 Segment is processed successfully. It is either accepted or - discarded. But no connection is reset by the segment. - @retval -1 A connection is reset by the segment. - -**/ -INTN -TcpInput ( - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dst - ); - -/** - Check whether the sequence number of the incoming segment is acceptable. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the incoming segment. - - @retval 1 The sequence number is acceptable. - @retval 0 The sequence number is not acceptable. - -**/ -INTN -TcpSeqAcceptable ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -/** - NewReno fast recovery, RFC3782. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast recovery. - -**/ -VOID -TcpFastRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -/** - NewReno fast loss recovery, RFC3792. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast loss recovery. - -**/ -VOID -TcpFastLossRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -/** - Compute the RTT as specified in RFC2988. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Measure Currently measured RTT in heart beats. - -**/ -VOID -TcpComputeRtt ( - IN OUT TCP_CB *Tcb, - IN UINT32 Measure - ); - -/** - Trim off the data outside the tcb's receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the NET_BUF containing the received tcp segment. - -**/ -VOID -TcpTrimInWnd ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Store the data into the reassemble queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer containing the data to be queued. - -**/ -VOID -TcpQueueData ( - IN OUT TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Ajust the send queue or the retransmit queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Ack The acknowledge seuqence number of the received segment. - -**/ -VOID -TcpAdjustSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Ack - ); - -// -// Functions from Tcp4Misc.c -// -/** - Compute the TCP segment's checksum. - - @param Nbuf Pointer to the buffer that contains the TCP - segment. - @param HeadSum The checksum value of the fixed part of pseudo - header. - - @return The checksum value. - -**/ -UINT16 -TcpChecksum ( - IN NET_BUF *Nbuf, - IN UINT16 HeadSum - ); - -/** - Translate the information from the head of the received TCP - segment Nbuf contains and fill it into a TCP_SEG structure. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer contains the TCP segment. - - @return Pointer to the TCP_SEG that contains the translated TCP head information. - -**/ -TCP_SEG * -TcpFormatNetbuf ( - IN TCP_CB *Tcb, - IN OUT NET_BUF *Nbuf - ); - -/** - Initialize an active connection. - - @param Tcb Pointer to the TCP_CB that wants to initiate a - connection. - -**/ -VOID -TcpOnAppConnect ( - IN OUT TCP_CB *Tcb - ); - -/** - Application has consumed some data, check whether - to send a window updata ack or a delayed ack. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppConsume ( - IN TCP_CB *Tcb - ); - -/** - Initiate the connection close procedure, called when - applications want to close the connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppClose ( - IN OUT TCP_CB *Tcb - ); - -/** - Check whether the application's newly delivered data can be sent out. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 Whether the data is sent out or is buffered for - further sending. - @retval -1 The Tcb is not in a state that data is permitted to - be sent out. - -**/ -INTN -TcpOnAppSend ( - IN OUT TCP_CB *Tcb - ); - -/** - Abort the connection by sending a reset segment, called - when the application wants to abort the connection. - - @param Tcb Pointer to the TCP_CB of the TCP instance. - -**/ -VOID -TcpOnAppAbort ( - IN TCP_CB *Tcb - ); - -/** - Reset the connection related with Tcb. - - @param Tcb Pointer to the TCP_CB of the connection to be - reset. - -**/ -VOID -TcpResetConnection ( - IN TCP_CB *Tcb - ); - -// -// Functions in Tcp4Timer.c -// -/** - Close the TCP connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClose ( - IN OUT TCP_CB *Tcb - ); - -/** - Heart beat timer handler, queues the DPC at TPL_CALLBACK. - - @param Event Timer event signaled, ignored. - @param Context Context of the timer event, ignored. - -**/ -VOID -EFIAPI -TcpTicking ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - Enable a TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be enabled. - @param TimeOut The timeout value of this timer. - -**/ -VOID -TcpSetTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer, - IN UINT32 TimeOut - ); - -/** - Clear one TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be cleared. - -**/ -VOID -TcpClearTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer - ); - -/** - Clear all TCP timers. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClearAllTimer ( - IN OUT TCP_CB *Tcb - ); - -/** - Enable the window prober timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetProbeTimer ( - IN OUT TCP_CB *Tcb - ); - -/** - Enable the keepalive timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetKeepaliveTimer ( - IN OUT TCP_CB *Tcb - ); - -/** - Backoff the RTO. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpBackoffRto ( - IN OUT TCP_CB *Tcb - ); - -/** - Install the device path protocol on the TCP instance. - - @param Sock Pointer to the socket representing the TCP instance. - - @retval EFI_SUCCESS The device path protocol is installed. - @retval other Failed to install the device path protocol. - -**/ -EFI_STATUS -TcpInstallDevicePath ( - IN SOCKET *Sock - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h deleted file mode 100644 index c898a7ee2dd0..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h +++ /dev/null @@ -1,494 +0,0 @@ -/** @file - TCP4 protocol services header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_MAIN_H_ -#define _TCP4_MAIN_H_ - -#include "Socket.h" - -#include "Tcp4Proto.h" -#include "Tcp4Func.h" -#include "Tcp4Driver.h" - - -extern UINT16 mTcp4RandomPort; -extern CHAR16 *mTcpStateName[]; - -// -// Driver Produced Protocol Prototypes -// - -// -// Function prototype for the Tcp4 socket request handler -// -/** - The procotol handler provided to the socket layer, used to - dispatch the socket level requests by calling the corresponding - TCP layer functions. - - @param Sock Pointer to the socket of this TCP instance. - @param Request The code of this operation request. - @param Data Pointer to the operation specific data passed in - together with the operation request. - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN UINT8 Request, - IN VOID *Data OPTIONAL - ); - -/// -/// TCP mode data -/// -typedef struct _TCP4_MODE_DATA { - EFI_TCP4_CONNECTION_STATE *Tcp4State; - EFI_TCP4_CONFIG_DATA *Tcp4ConfigData; - EFI_IP4_MODE_DATA *Ip4ModeData; - EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData; - EFI_SIMPLE_NETWORK_MODE *SnpModeData; -} TCP4_MODE_DATA; - -/// -/// TCP route infomation data -/// -typedef struct _TCP4_ROUTE_INFO { - BOOLEAN DeleteRoute; - EFI_IPv4_ADDRESS *SubnetAddress; - EFI_IPv4_ADDRESS *SubnetMask; - EFI_IPv4_ADDRESS *GatewayAddress; -} TCP4_ROUTE_INFO; - -typedef struct { - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; - UINTN NumberOfChildren; - EFI_HANDLE *ChildHandleBuffer; -} TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT; - -/** - Get the current operational status of a TCP instance. - - The GetModeData() function copies the current operational settings of this - EFI TCPv4 Protocol instance into user-supplied buffers. This function can - also be used to retrieve the operational setting of underlying drivers - such as IPv4, MNP, or SNP. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Tcp4State Pointer to the buffer to receive the current TCP - state. - @param Tcp4ConfigData Pointer to the buffer to receive the current TCP - configuration. - @param Ip4ModeData Pointer to the buffer to receive the current IPv4 - configuration data used by the TCPv4 instance. - @param MnpConfigData Pointer to the buffer to receive the current MNP - configuration data indirectly used by the TCPv4 - Instance. - @param SnpModeData Pointer to the buffer to receive the current SNP - configuration data indirectly used by the TCPv4 - Instance. - - @retval EFI_SUCCESS The mode data was read. - @retval EFI_NOT_STARTED No configuration data is available because this - instance hasn't been started. - @retval EFI_INVALID_PARAMETER This is NULL. - -**/ -EFI_STATUS -EFIAPI -Tcp4GetModeData ( - IN EFI_TCP4_PROTOCOL *This, - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL - ); - - -/** - Initialize or brutally reset the operational parameters for - this EFI TCPv4 instance. - - The Configure() function does the following: - * Initialize this EFI TCPv4 instance, i.e., initialize the communication end - setting, specify active open or passive open for an instance. - * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous - tokens, flush transmission and receiving buffer directly without informing - the communication peer. - No other TCPv4 Protocol operation can be executed by this instance - until it is configured properly. For an active TCP4 instance, after a proper - configuration it may call Connect() to initiates the three-way handshake. - For a passive TCP4 instance, its state will transit to Tcp4StateListen after - configuration, and Accept() may be called to listen the incoming TCP connection - request. If TcpConfigData is set to NULL, the instance is reset. Resetting - process will be done brutally, the state machine will be set to Tcp4StateClosed - directly, the receive queue and transmit queue will be flushed, and no traffic is - allowed through this instance. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param TcpConfigData Pointer to the configure data to configure the - instance. - - @retval EFI_SUCCESS The operational settings are set, changed, or - reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is already - configured. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred. - @retval EFI_UNSUPPORTED One or more of the control options are not - supported in the implementation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4Configure ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL - ); - -/** - Add or delete routing entries. - - The Routes() function adds or deletes a route from the instance's routing table. - The most specific route is selected by comparing the SubnetAddress with the - destination IP address's arithmetical AND to the SubnetMask. - The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0. - The default route matches all destination IP addresses if there is no more specific route. - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to - the destination host if its address can be found in the Address Resolution Protocol (ARP) - cache or it is on the local subnet. If the instance is configured to use default - address, a direct route to the local network will be added automatically. - Each TCP instance has its own independent routing table. Instance that uses the - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table. - The copy will be updated automatically whenever the IP driver reconfigures its - instance. As a result, the previous modification to the instance's local copy - will be lost. The priority of checking the route table is specific with IP - implementation and every IP implementation must comply with RFC 1122. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param DeleteRoute If TRUE, delete the specified route from routing - table; if FALSE, add the specified route to - routing table. - DestinationAddress and SubnetMask are used as - the keywords to search route entry. - @param SubnetAddress The destination network. - @param SubnetMask The subnet mask for the destination network. - @param GatewayAddress The gateway address for this route. - It must be on the same subnet with the station - address unless a direct route is specified. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to add the - entry to the routing table. - @retval EFI_NOT_FOUND This route is not in the routing table. - @retval EFI_ACCESS_DENIED This route is already in the routing table. - @retval EFI_UNSUPPORTED The TCP driver does not support this operation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Routes ( - IN EFI_TCP4_PROTOCOL *This, - IN BOOLEAN DeleteRoute, - IN EFI_IPv4_ADDRESS *SubnetAddress, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *GatewayAddress - ); - -/** - Initiate a nonblocking TCP connection request for an active TCP instance. - - The Connect() function will initiate an active open to the remote peer configured - in current TCP instance if it is configured active. If the connection succeeds - or fails due to any error, the ConnectionToken->CompletionToken.Event will be - signaled and ConnectionToken->CompletionToken.Status will be updated accordingly. - This function can only be called for the TCP instance in Tcp4StateClosed state. - The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS. - If TCP three way handshake succeeds, its state will become Tcp4StateEstablished, - otherwise, the state will return to Tcp4StateClosed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ConnectionToken Pointer to the connection token to return when - the TCP three way handshake finishes. - - @retval EFI_SUCCESS The connection request is successfully initiated - and the state of this TCPv4 instance has - been changed to Tcp4StateSynSent. - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instance is not configured as an active one - or it is not in Tcp4StateClosed state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough resource to - initiate the active open. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - -**/ -EFI_STATUS -EFIAPI -Tcp4Connect ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken - ); - -/** - Listen on the passive instance to accept an incoming connection request. - - The Accept() function initiates an asynchronous accept request to wait for an - incoming connection on the passive TCP instance. If a remote peer successfully - establishes a connection with this instance, a new TCP instance will be created - and its handle will be returned in ListenToken->NewChildHandle. The newly created - instance is configured by inheriting the passive instance's configuration and is - ready for use upon return. The instance is in the Tcp4StateEstablished state. - The ListenToken->CompletionToken.Event will be signaled when a new connection - is accepted, user aborts the listen or connection is reset. This function only - can be called when current TCP instance is in Tcp4StateListen state. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ListenToken Pointer to the listen token to return when - operation finishes. - - @retval EFI_SUCCESS The listen token has been queued successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is not - in Tcp4StateListen state or a same listen token - has already existed in the listen token queue of - this TCP instance. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to finish - the operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Accept ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_LISTEN_TOKEN *ListenToken - ); - -/** - Queues outgoing data into the transmit queue. - - The Transmit() function queues a sending request to this TCPv4 instance along - with the user data. The status of the token is updated and the event in the token - will be signaled once the data is sent out or some error occurs. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param Token Pointer to the completion token to queue to the - transmit queue - - @retval EFI_SUCCESS The data has been queued for transmission. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A transmit completion token with the same - Token-> CompletionToken.Event was already in the - transmission queue. - * The current instance is in Tcp4StateClosed state - * The current instance is a passive one and - it is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_NOT_READY The completion token could not be queued because - the transmit queue is full. - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data because of - resource shortage. - @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or - address. - -**/ -EFI_STATUS -EFIAPI -Tcp4Transmit ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ); - -/** - Place an asynchronous receive request into the receiving queue. - - The Receive() function places a completion token into the receive packet queue. - This function is always asynchronous. The caller must allocate the - Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also - must fill the DataLength which represents the whole length of all FragmentBuffer. - When the receive operation completes, the EFI TCPv4 Protocol driver updates the - Token->CompletionToken.Status and Token->Packet.RxData fields and the - Token->CompletionToken.Event is signaled. If got data the data and its length - will be copy into the FragmentTable, in the same time the full length of received - data will be recorded in the DataLength fields. Providing a proper notification - function and context for the event will enable the user to receive the notification - and receiving status. That notification function is guaranteed to not be re-entered. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that is associated with the - receive data descriptor. - - @retval EFI_SUCCESS The receive completion token was cached. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued - due to a lack of system resources. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - The EFI TCPv4 Protocol instance has been reset - to startup defaults. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A receive completion token with the same - Token->CompletionToken.Event was already in - the receive queue. - * The current instance is in Tcp4StateClosed state. - * The current instance is a passive one and it - is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_CONNECTION_FIN The communication peer has closed the connection - and there is no any buffered data in the receive - buffer of this instance. - @retval EFI_NOT_READY The receive request could not be queued because - the receive queue is full. - -**/ -EFI_STATUS -EFIAPI -Tcp4Receive ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ); - -/** - Disconnecting a TCP connection gracefully or reset a TCP connection. - - Initiate an asynchronous close token to TCP driver. After Close() is called, - any buffered transmission data will be sent by TCP driver and the current - instance will have a graceful close working flow described as RFC 793 if - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP - driver to fast disconnect this connection. When the close operation completes - successfully the TCP instance is in Tcp4StateClosed state, all pending - asynchronous operation is signaled and any buffers used for TCP network traffic - is flushed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param CloseToken Pointer to the close token to return when - operation finishes. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED One or more of the following are TRUE: - * Configure() has been called with TcpConfigData - set to NULL and this function has not returned. - * Previous Close() call on this instance has not - finished. - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to finish the - operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above - category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Close ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CLOSE_TOKEN *CloseToken - ); - -/** - Abort an asynchronous connection, listen, transmission or receive request. - - The Cancel() function aborts a pending connection, listen, transmit or receive - request. If Token is not NULL and the token is in the connection, listen, - transmission or receive queue when it is being cancelled, its Token->Status - will be set to EFI_ABORTED and then Token->Event will be signaled. If the token - is not in one of the queues, which usually means that the asynchronous operation - has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token - issued by Connect(), Accept(), Transmit() and Receive()will be aborted. - NOTE: It has not been implemented currently. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that has been issued by - Connect(), Accept(), Transmit() or Receive(). If - NULL, all pending tokens issued by above four - functions will be aborted. - - @retval EFI_SUCCESS The asynchronous I/O request is aborted and Token->Event - is signaled. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_NOT_STARTED This instance hasn's been configured. - @retval EFI_NO_MAPPING When using the default address, configuration - (DHCP, BOOTP,RARP, etc.) hasn's finished yet. - @retval EFI_NOT_FOUND The asynchronous I/O request isn's found in the - transmission or receive queue. It has either - completed or wasn's issued by Transmit() and Receive(). - @retval EFI_UNSUPPORTED The operation is not supported in current - implementation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Cancel ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL - ); - -/** - Poll to receive incoming data and transmit outgoing segments. - - The Poll() function increases the rate that data is moved between the network - and application and can be called when the TCP instance is created successfully. - Its use is optional. In some implementations, the periodical timer in the MNP - driver may not poll the underlying communications device fast enough to avoid - drop packets. Drivers and applications that are experiencing packet loss should - try calling the Poll() function in a high frequency. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - - @retval EFI_SUCCESS Incoming or outgoing data was processed. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - @retval EFI_NOT_READY No incoming or outgoing data was processed. - @retval EFI_TIMEOUT Data was dropped out of the transmission or - receive queue. Consider increasing the polling - rate. - -**/ -EFI_STATUS -EFIAPI -Tcp4Poll ( - IN EFI_TCP4_PROTOCOL *This - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h deleted file mode 100644 index f9782cb59801..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h +++ /dev/null @@ -1,130 +0,0 @@ -/** @file - Tcp option's routine header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_OPTION_H_ -#define _TCP4_OPTION_H_ - -/// -/// The structure to store the parse option value. -/// ParseOption only parse the options, don't process them. -/// -typedef struct _TCP_OPTION { - UINT8 Flag; ///< Flag such as TCP_OPTION_RCVD_MSS - UINT8 WndScale; ///< The WndScale received - UINT16 Mss; ///< The Mss received - UINT32 TSVal; ///< The TSVal field in a timestamp option - UINT32 TSEcr; ///< The TSEcr field in a timestamp option -} TCP_OPTION; - -// -// supported TCP option type and their length -// -#define TCP_OPTION_EOP 0 ///< End Of oPtion -#define TCP_OPTION_NOP 1 ///< No-Option. -#define TCP_OPTION_MSS 2 ///< Maximum Segment Size -#define TCP_OPTION_WS 3 ///< Window scale -#define TCP_OPTION_TS 8 ///< Timestamp -#define TCP_OPTION_MSS_LEN 4 ///< Length of MSS option -#define TCP_OPTION_WS_LEN 3 ///< Length of window scale option -#define TCP_OPTION_TS_LEN 10 ///< Length of timestamp option -#define TCP_OPTION_WS_ALIGNED_LEN 4 ///< Length of window scale option, aligned -#define TCP_OPTION_TS_ALIGNED_LEN 12 ///< Length of timestamp option, aligned - -// -// recommend format of timestamp window scale -// option for fast process. -// -#define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \ - (TCP_OPTION_NOP << 16) | \ - (TCP_OPTION_TS << 8) | \ - (TCP_OPTION_TS_LEN)) - -#define TCP_OPTION_WS_FAST ((TCP_OPTION_NOP << 24) | \ - (TCP_OPTION_WS << 16) | \ - (TCP_OPTION_WS_LEN << 8)) - -#define TCP_OPTION_MSS_FAST ((TCP_OPTION_MSS << 24) | (TCP_OPTION_MSS_LEN << 16)) - -// -// Other misc definations -// -#define TCP_OPTION_RCVD_MSS 0x01 -#define TCP_OPTION_RCVD_WS 0x02 -#define TCP_OPTION_RCVD_TS 0x04 -#define TCP_OPTION_MAX_WS 14 ///< Maxium window scale value -#define TCP_OPTION_MAX_WIN 0xffff ///< Max window size in TCP header - - -/** - Compute the window scale value according to the given buffer size. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The scale value. - -**/ -UINT8 -TcpComputeScale ( - IN TCP_CB *Tcb - ); - -/** - Build the TCP option in three-way handshake. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpSynBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Build the TCP option in synchronized states. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Parse the supported options. - - @param Tcp Pointer to the TCP_CB of this TCP instance. - @param Option Pointer to the TCP_OPTION used to store the successfully pasrsed - options. - - @retval 0 The options are successfully pasrsed. - @retval -1 Ilegal option was found. - -**/ -INTN -TcpParseOption ( - IN TCP_HEAD *Tcp, - IN OUT TCP_OPTION *Option - ); - - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h deleted file mode 100644 index 37191fe65112..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h +++ /dev/null @@ -1,357 +0,0 @@ -/** @file - Tcp Protocol header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_PROTO_H_ -#define _TCP4_PROTO_H_ - -typedef struct _TCP_CB TCP_CB; - -#include "Tcp4Driver.h" -#include "Socket.h" -#include "Tcp4Option.h" - - - -/// -/// Tcp states, Don't change their order, it is used as -/// index to mTcpOutFlag and other macros -/// -#define TCP_CLOSED 0 -#define TCP_LISTEN 1 -#define TCP_SYN_SENT 2 -#define TCP_SYN_RCVD 3 -#define TCP_ESTABLISHED 4 -#define TCP_FIN_WAIT_1 5 -#define TCP_FIN_WAIT_2 6 -#define TCP_CLOSING 7 -#define TCP_TIME_WAIT 8 -#define TCP_CLOSE_WAIT 9 -#define TCP_LAST_ACK 10 - - -/// -/// Flags in the TCP header -/// -#define TCP_FLG_FIN 0x01 -#define TCP_FLG_SYN 0x02 -#define TCP_FLG_RST 0x04 -#define TCP_FLG_PSH 0x08 -#define TCP_FLG_ACK 0x10 -#define TCP_FLG_URG 0x20 - - // - // mask for all the flags - // -#define TCP_FLG_FLAG 0x3F - - -#define TCP_CONNECT_REFUSED (-1) ///< TCP error status -#define TCP_CONNECT_RESET (-2) ///< TCP error status -#define TCP_CONNECT_CLOSED (-3) ///< TCP error status - -// -// Current congestion status as suggested by RFC3782. -// -#define TCP_CONGEST_RECOVER 1 ///< During the NewReno fast recovery -#define TCP_CONGEST_LOSS 2 ///< Retxmit because of retxmit time out -#define TCP_CONGEST_OPEN 3 ///< TCP is opening its congestion window - -// -// TCP control flags -// -#define TCP_CTRL_NO_NAGLE 0x0001 ///< Disable Nagle algorithm -#define TCP_CTRL_NO_KEEPALIVE 0x0002 ///< Disable keepalive timer -#define TCP_CTRL_NO_WS 0x0004 ///< Disable window scale option -#define TCP_CTRL_RCVD_WS 0x0008 ///< Received a wnd scale option in syn -#define TCP_CTRL_NO_TS 0x0010 ///< Disable Timestamp option -#define TCP_CTRL_RCVD_TS 0x0020 ///< Received a Timestamp option in syn -#define TCP_CTRL_SND_TS 0x0040 ///< Send Timestamp option to remote -#define TCP_CTRL_SND_URG 0x0080 ///< In urgent send mode -#define TCP_CTRL_RCVD_URG 0x0100 ///< In urgent receive mode -#define TCP_CTRL_SND_PSH 0x0200 ///< In PUSH send mode -#define TCP_CTRL_FIN_SENT 0x0400 ///< FIN is sent -#define TCP_CTRL_FIN_ACKED 0x0800 ///< FIN is ACKed. -#define TCP_CTRL_TIMER_ON 0x1000 ///< At least one of the timer is on -#define TCP_CTRL_RTT_ON 0x2000 ///< The RTT measurement is on -#define TCP_CTRL_ACK_NOW 0x4000 ///< Send the ACK now, don't delay - -// -// Timer related values -// -#define TCP_TIMER_CONNECT 0 ///< Connection establishment timer -#define TCP_TIMER_REXMIT 1 ///< Retransmit timer -#define TCP_TIMER_PROBE 2 ///< Window probe timer -#define TCP_TIMER_KEEPALIVE 3 ///< Keepalive timer -#define TCP_TIMER_FINWAIT2 4 ///< FIN_WAIT_2 timer -#define TCP_TIMER_2MSL 5 ///< TIME_WAIT tiemr -#define TCP_TIMER_NUMBER 6 ///< The total number of TCP timer. -#define TCP_TICK 200 ///< Every TCP tick is 200ms -#define TCP_TICK_HZ 5 ///< The frequence of TCP tick -#define TCP_RTT_SHIFT 3 ///< SRTT & RTTVAR scaled by 8 -#define TCP_RTO_MIN TCP_TICK_HZ ///< The minium value of RTO -#define TCP_RTO_MAX (TCP_TICK_HZ * 60) ///< The maxium value of RTO -#define TCP_FOLD_RTT 4 ///< Timeout threshod to fold RTT - -// -// Default values for some timers -// -#define TCP_MAX_LOSS 12 ///< Default max times to retxmit -#define TCP_KEEPALIVE_IDLE_MIN (TCP_TICK_HZ * 60 * 60 * 2) ///< First keep alive -#define TCP_KEEPALIVE_PERIOD (TCP_TICK_HZ * 60) -#define TCP_MAX_KEEPALIVE 8 -#define TCP_FIN_WAIT2_TIME (2 * TCP_TICK_HZ) -#define TCP_TIME_WAIT_TIME (2 * TCP_TICK_HZ) -#define TCP_PAWS_24DAY (24 * 24 * 60 * 60 * TCP_TICK_HZ) -#define TCP_CONNECT_TIME (75 * TCP_TICK_HZ) - -// -// The header space to be reserved before TCP data to accomodate : -// 60byte IP head + 60byte TCP head + link layer head -// -#define TCP_MAX_HEAD 192 - -// -// Value ranges for some control option -// -#define TCP_RCV_BUF_SIZE (2 * 1024 * 1024) -#define TCP_RCV_BUF_SIZE_MIN (8 * 1024) -#define TCP_SND_BUF_SIZE (2 * 1024 * 1024) -#define TCP_SND_BUF_SIZE_MIN (8 * 1024) -#define TCP_BACKLOG 10 -#define TCP_BACKLOG_MIN 5 -#define TCP_MAX_LOSS_MIN 6 -#define TCP_CONNECT_TIME_MIN (60 * TCP_TICK_HZ) -#define TCP_MAX_KEEPALIVE_MIN 4 -#define TCP_KEEPALIVE_IDLE_MAX (TCP_TICK_HZ * 60 * 60 * 4) -#define TCP_KEEPALIVE_PERIOD_MIN (TCP_TICK_HZ * 30) -#define TCP_FIN_WAIT2_TIME_MAX (4 * TCP_TICK_HZ) -#define TCP_TIME_WAIT_TIME_MAX (60 * TCP_TICK_HZ) - -/// -/// TCP segmentation data -/// -typedef struct _TCP_SEG { - TCP_SEQNO Seq; ///< Starting sequence number - TCP_SEQNO End; ///< The sequence of the last byte + 1, include SYN/FIN. End-Seq = SEG.LEN - TCP_SEQNO Ack; ///< ACK field in the segment - UINT8 Flag; ///< TCP header flags - UINT16 Urg; ///< Valid if URG flag is set. - UINT32 Wnd; ///< TCP window size field -} TCP_SEG; - -/// -/// Network endpoint, IP+Port structure -/// -typedef struct _TCP_PEER { - UINT32 Ip; ///< IP address, network byte order - TCP_PORTNO Port; ///< Port number, network byte order -} TCP_PEER; - -/// -/// TCP control block, it includes various states -/// -struct _TCP_CB { - LIST_ENTRY List; ///< Back and forward link entry - TCP_CB *Parent; ///< The parent TCP_CB structure - - SOCKET *Sk; ///< The socket it controled. - TCP_PEER LocalEnd; ///< Local endpoint - TCP_PEER RemoteEnd;///< Remote endpoint - - LIST_ENTRY SndQue; ///< Retxmission queue - LIST_ENTRY RcvQue; ///< Reassemble queue - UINT32 CtrlFlag; ///< Control flags, such as NO_NAGLE - INT32 Error; ///< Soft error status, such as TCP_CONNECT_RESET - - // - // RFC793 and RFC1122 defined variables - // - UINT8 State; ///< TCP state, such as SYN_SENT, LISTEN - UINT8 DelayedAck; ///< Number of delayed ACKs - UINT16 HeadSum; ///< Checksum of the fixed parts of pesudo - ///< header: Src IP, Dst IP, 0, Protocol, - ///< not include the TCP length. - - TCP_SEQNO Iss; ///< Initial Sending Sequence - TCP_SEQNO SndUna; ///< First unacknowledged data - TCP_SEQNO SndNxt; ///< Next data sequence to send. - TCP_SEQNO SndPsh; ///< Send PUSH point - TCP_SEQNO SndUp; ///< Send urgent point - UINT32 SndWnd; ///< Window advertised by the remote peer - UINT32 SndWndMax; ///< Max send window advertised by the peer - TCP_SEQNO SndWl1; ///< Seq number used for last window update - TCP_SEQNO SndWl2; ///< Ack no of last window update - UINT16 SndMss; ///< Max send segment size - TCP_SEQNO RcvNxt; ///< Next sequence no to receive - UINT32 RcvWnd; ///< Window advertised by the local peer - TCP_SEQNO RcvWl2; ///< The RcvNxt (or ACK) of last window update. - ///< It is necessary because of delayed ACK - - TCP_SEQNO RcvUp; ///< Urgent point; - TCP_SEQNO Irs; ///< Initial Receiving Sequence - UINT16 RcvMss; ///< Max receive segment size - UINT16 EnabledTimer; ///< Which timer is currently enabled - UINT32 Timer[TCP_TIMER_NUMBER]; ///< When the timer will expire - INT32 NextExpire; ///< Count down offset for the nearest timer - UINT32 Idle; ///< How long the connection is in idle - UINT32 ProbeTime; ///< The time out value for current window prober - BOOLEAN ProbeTimerOn;///< If TRUE, the probe time is on. - - // - // RFC1323 defined variables, about window scale, - // timestamp and PAWS - // - UINT8 SndWndScale; ///< Wndscale received from the peer - UINT8 RcvWndScale; ///< Wndscale used to scale local buffer - UINT32 TsRecent; ///< TsRecent to echo to the remote peer - UINT32 TsRecentAge; ///< When this TsRecent is updated - - // - // RFC2988 defined variables. about RTT measurement - // - TCP_SEQNO RttSeq; ///< The seq of measured segment now - UINT32 RttMeasure; ///< Currently measured RTT in heart beats - UINT32 SRtt; ///< Smoothed RTT, scaled by 8 - UINT32 RttVar; ///< RTT variance, scaled by 8 - UINT32 Rto; ///< Current RTO, not scaled - - // - // RFC2581, and 3782 variables. - // Congestion control + NewReno fast recovery. - // - UINT32 CWnd; ///< Sender's congestion window - UINT32 Ssthresh; ///< Slow start threshold. - TCP_SEQNO Recover; ///< Recover point for NewReno - UINT16 DupAck; ///< Number of duplicate ACKs - UINT8 CongestState; ///< The current congestion state(RFC3782) - UINT8 LossTimes; ///< Number of retxmit timeouts in a row - TCP_SEQNO LossRecover; ///< Recover point for retxmit - - // - // configuration parameters, for EFI_TCP4_PROTOCOL specification - // - UINT32 KeepAliveIdle; ///< Idle time before sending first probe - UINT32 KeepAlivePeriod; ///< Interval for subsequent keep alive probe - UINT8 MaxKeepAlive; ///< Maxium keep alive probe times. - UINT8 KeepAliveProbes; ///< The number of keep alive probe. - UINT16 MaxRexmit; ///< The maxium number of retxmit before abort - UINT32 FinWait2Timeout; ///< The FIN_WAIT_2 time out - UINT32 TimeWaitTimeout; ///< The TIME_WAIT time out - UINT32 ConnectTimeout; ///< The connect establishment time out - - // - // RFC7323 - // Addressing Window Retraction for TCP Window Scale Option. - // - TCP_SEQNO RetxmitSeqMax; ///< Max Seq number in previous retransmission. - - // - // configuration for tcp provided by user - // - BOOLEAN UseDefaultAddr; - UINT8 Tos; - UINT8 Ttl; - EFI_IPv4_ADDRESS SubnetMask; - - IP_IO_IP_INFO *IpInfo; ///<pointer reference to Ip used to send pkt -}; - -extern LIST_ENTRY mTcpRunQue; -extern LIST_ENTRY mTcpListenQue; -extern TCP_SEQNO mTcpGlobalIss; -extern UINT32 mTcpTick; - -/// -/// TCP_CONNECTED: both ends have synchronized their ISN. -/// -#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD) - -#define TCP_FIN_RCVD(State) \ - (((State) == TCP_CLOSE_WAIT) || \ - ((State) == TCP_LAST_ACK) || \ - ((State) == TCP_CLOSING) || \ - ((State) == TCP_TIME_WAIT)) - -#define TCP_LOCAL_CLOSED(State) \ - (((State) == TCP_FIN_WAIT_1) || \ - ((State) == TCP_FIN_WAIT_2) || \ - ((State) == TCP_CLOSING) || \ - ((State) == TCP_TIME_WAIT) || \ - ((State) == TCP_LAST_ACK)) - -// -// Get the TCP_SEG point from a net buffer's ProtoData -// -#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData)) - -// -// macros to compare sequence no -// -#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0) -#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0) -#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0) -#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0) - -// -// TCP_SEQ_BETWEEN return whether b <= m <= e -// -#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b)) - -// -// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2 -// -#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2))) - -// -// Check whether Flag is on -// -#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != 0)) - -// -// Set and Clear operation on a Flag -// -#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag)) -#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag)) - -// -// Test whether two peers are equal -// -#define TCP_PEER_EQUAL(Pa, Pb) \ - (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port)) - -// -// Test whether Pa matches Pb, or Pa is more specific -// than pb. Zero means wildcard. -// -#define TCP_PEER_MATCH(Pa, Pb) \ - ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \ - (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port))) - -#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer))) -#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 << (Timer)))) -#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 << (Timer))))) - -#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0) -#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0) -#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb))) - -#define TCP_MAX_WIN 0xFFFFU - -typedef -VOID -(*TCP_TIMER_HANDLER) ( - IN OUT TCP_CB *Tcb - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h deleted file mode 100644 index d8336c5e82e9..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h +++ /dev/null @@ -1,502 +0,0 @@ -/** @file - Dhcp and Discover routines for PxeBc. - -Copyright (c) 2013, Red Hat, Inc. -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_DHCP_H__ -#define __EFI_PXEBC_DHCP_H__ - -#define PXEBC_DHCP4_MAX_OPTION_NUM 16 -#define PXEBC_DHCP4_MAX_OPTION_SIZE 312 -#define PXEBC_DHCP4_MAX_PACKET_SIZE (sizeof (EFI_PXE_BASE_CODE_PACKET)) - -#define PXEBC_DHCP4_S_PORT 67 -#define PXEBC_DHCP4_C_PORT 68 -#define PXEBC_BS_DOWNLOAD_PORT 69 -#define PXEBC_BS_DISCOVER_PORT 4011 - -#define PXEBC_DHCP4_OPCODE_REQUEST 1 -#define PXEBC_DHCP4_OPCODE_REPLY 2 -#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3 -#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order - -// -// Sub-Options in Dhcp Vendor Option -// -#define PXEBC_VENDOR_TAG_MTFTP_IP 1 -#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2 -#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3 -#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4 -#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5 -#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6 -#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7 -#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8 -#define PXEBC_VENDOR_TAG_BOOT_MENU 9 -#define PXEBC_VENDOR_TAG_MENU_PROMPT 10 -#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11 -#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12 -#define PXEBC_VENDOR_TAG_BOOT_ITEM 71 - -#define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT 4 -#define PXEBC_DHCP4_DISCOVER_RETRIES 4 - -#define PXEBC_MAX_MENU_NUM 24 -#define PXEBC_MAX_OFFER_NUM 16 - -#define PXEBC_BOOT_REQUEST_TIMEOUT 1 -#define PXEBC_BOOT_REQUEST_RETRIES 4 - -#define PXEBC_DHCP4_OVERLOAD_FILE 1 -#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2 - -// -// The array index of the DHCP4 option tag interested -// -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0 -#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1 -#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2 -#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3 -#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4 -#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5 -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6 -#define PXEBC_DHCP4_TAG_INDEX_MAX 7 - -// -// The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority. -// -#define DHCP4_PACKET_TYPE_PXE10 0 -#define DHCP4_PACKET_TYPE_WFM11A 1 -#define DHCP4_PACKET_TYPE_BINL 2 -#define DHCP4_PACKET_TYPE_DHCP_ONLY 3 -#define DHCP4_PACKET_TYPE_BOOTP 4 -#define DHCP4_PACKET_TYPE_MAX 5 - -#define BIT(x) (1 << x) -#define CTRL(x) (0x1F & (x)) - -// -// WfM11a options -// -#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY)) -// -// Discoverty options -// -#define DISCOVER_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \ - BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \ - BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \ - BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \ - BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) - -#define IS_VALID_BOOT_PROMPT(x) \ - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) - -#define IS_VALID_BOOT_MENU(x) \ - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) - -#define IS_VALID_MTFTP_VENDOR_OPTION(x) \ - (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == MTFTP_VENDOR_OPTION_BIT_MAP) - -#define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0) - -#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \ - (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) - -#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \ - (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \ - == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) - -#define IS_DISABLE_BCAST_DISCOVER(x) (((x) & BIT (0)) == BIT (0)) -#define IS_DISABLE_MCAST_DISCOVER(x) (((x) & BIT (1)) == BIT (1)) -#define IS_ENABLE_USE_SERVER_LIST(x) (((x) & BIT (2)) == BIT (2)) -#define IS_DISABLE_PROMPT_MENU(x) (((x) & BIT (3)) == BIT (3)) - -#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) / 32]) | BIT ((y) % 32)) - -#pragma pack(1) -typedef struct { - UINT8 ParaList[135]; -} PXEBC_DHCP4_OPTION_PARA; - -typedef struct { - UINT16 Size; -} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE; - -typedef struct { - UINT8 Type; - UINT8 MajorVer; - UINT8 MinorVer; -} PXEBC_DHCP4_OPTION_UNDI; - -typedef struct { - UINT8 Type; -} PXEBC_DHCP4_OPTION_MESG; - -typedef struct { - UINT16 Type; -} PXEBC_DHCP4_OPTION_ARCH; - -#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000" -#define DEFAULT_UNDI_TYPE 1 -#define DEFAULT_UNDI_MAJOR 3 -#define DEFAULT_UNDI_MINOR 0 - -typedef struct { - UINT8 ClassIdentifier[10]; - UINT8 ArchitecturePrefix[5]; - UINT8 ArchitectureType[5]; - UINT8 Lit3[1]; - UINT8 InterfaceName[4]; - UINT8 Lit4[1]; - UINT8 UndiMajor[3]; - UINT8 UndiMinor[3]; -} PXEBC_DHCP4_OPTION_CLID; - -typedef struct { - UINT8 Type; - UINT8 Guid[16]; -} PXEBC_DHCP4_OPTION_UUID; - -typedef struct { - UINT16 Type; - UINT16 Layer; -} PXEBC_OPTION_BOOT_ITEM; - -#pragma pack() - -typedef union { - PXEBC_DHCP4_OPTION_PARA *Para; - PXEBC_DHCP4_OPTION_UNDI *Undi; - PXEBC_DHCP4_OPTION_ARCH *Arch; - PXEBC_DHCP4_OPTION_CLID *Clid; - PXEBC_DHCP4_OPTION_UUID *Uuid; - PXEBC_DHCP4_OPTION_MESG *Mesg; - PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize; -} PXEBC_DHCP4_OPTION_ENTRY; - -typedef struct { - UINT16 Type; - UINT8 IpCnt; - EFI_IPv4_ADDRESS IpAddr[1]; -} PXEBC_BOOT_SVR_ENTRY; - -typedef struct { - UINT16 Type; - UINT8 DescLen; - UINT8 DescStr[1]; -} PXEBC_BOOT_MENU_ENTRY; - -typedef struct { - UINT8 Timeout; - UINT8 Prompt[1]; -} PXEBC_MENU_PROMPT; - -typedef struct { - UINT32 BitMap[8]; - EFI_IPv4_ADDRESS MtftpIp; - UINT16 MtftpCPort; - UINT16 MtftpSPort; - UINT8 MtftpTimeout; - UINT8 MtftpDelay; - UINT8 DiscoverCtrl; - EFI_IPv4_ADDRESS DiscoverMcastIp; - EFI_IPv4_ADDRESS McastIpBase; - UINT16 McastIpBlock; - UINT16 McastIpRange; - UINT16 BootSrvType; - UINT16 BootSrvLayer; - PXEBC_BOOT_SVR_ENTRY *BootSvr; - UINT8 BootSvrLen; - PXEBC_BOOT_MENU_ENTRY *BootMenu; - UINT8 BootMenuLen; - PXEBC_MENU_PROMPT *MenuPrompt; - UINT8 MenuPromptLen; - UINT32 *CredType; - UINT8 CredTypeLen; -} PXEBC_VENDOR_OPTION; - -#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE) - -typedef union { - EFI_DHCP4_PACKET Offer; - EFI_DHCP4_PACKET Ack; - UINT8 Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE]; -} PXEBC_DHCP4_PACKET; - -typedef struct { - PXEBC_DHCP4_PACKET Packet; - BOOLEAN IsPxeOffer; - UINT8 OfferType; - EFI_DHCP4_PACKET_OPTION *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX]; - PXEBC_VENDOR_OPTION PxeVendorOption; -} PXEBC_CACHED_DHCP4_PACKET; - -#define GET_NEXT_DHCP_OPTION(Opt) \ - (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1) - -#define GET_OPTION_BUFFER_LEN(Pkt) ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4) -#define IS_PROXY_DHCP_OFFER(Offer) EFI_IP4_EQUAL (&((Offer)->Dhcp4.Header.YourAddr), &mZeroIp4Addr) - -#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \ - (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS)) - - -/** - This function initialize the DHCP4 message instance. - - This function will pad each item of dhcp4 message packet. - - @param Seed Pointer to the message instance of the DHCP4 packet. - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - -**/ -VOID -PxeBcInitSeedPacket ( - IN EFI_DHCP4_PACKET *Seed, - IN EFI_UDP4_PROTOCOL *Udp4 - ); - - -/** - Parse the cached dhcp packet. - - @param CachedPacket Pointer to cached dhcp packet. - - @retval TRUE Succeed to parse and validation. - @retval FALSE Fail to parse or validation. - -**/ -BOOLEAN -PxeBcParseCachedDhcpPacket ( - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket - ); - -/** - This function is to check the selected proxy offer (include BINL dhcp offer and - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code - mode structure. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Operational successful. - @retval EFI_NO_RESPONSE Offer dhcp service failed. - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base code mode. - -**/ -EFI_STATUS -PxeBcCheckSelectedOffer ( - IN PXEBC_PRIVATE_DATA *Private - ); - - -/** - Callback routine. - - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver - to intercept events that occurred in the configuration process. This structure - provides advanced control of each state transition of the DHCP process. The - returned status code determines the behavior of the EFI DHCPv4 Protocol driver. - There are three possible returned values, which are described in the following - table. - - @param This Pointer to the EFI DHCPv4 Protocol instance that is used to - configure this callback function. - @param Context Pointer to the context that is initialized by - EFI_DHCP4_PROTOCOL.Configure(). - @param CurrentState The current operational state of the EFI DHCPv4 Protocol - driver. - @param Dhcp4Event The event that occurs in the current state, which usually means a - state transition. - @param Packet The DHCP packet that is going to be sent or already received. - @param NewPacket The packet that is used to replace the above Packet. - - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue the DHCP process. - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol - driver will continue to wait for more DHCPOFFER packets until the retry - timeout expires. - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and - return to the Dhcp4Init or Dhcp4InitReboot state. - -**/ -EFI_STATUS -EFIAPI -PxeBcDhcpCallBack ( - IN EFI_DHCP4_PROTOCOL * This, - IN VOID *Context, - IN EFI_DHCP4_STATE CurrentState, - IN EFI_DHCP4_EVENT Dhcp4Event, - IN EFI_DHCP4_PACKET * Packet OPTIONAL, - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL - ); - -/** - Switch the Ip4 policy to static. - - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. - - @retval EFI_SUCCESS The policy is already configured to static. - @retval Others Other error as indicated.. - -**/ -EFI_STATUS -PxeBcSetIp4Policy ( - IN PXEBC_PRIVATE_DATA *Private - ); - -/** - Discover the boot of service and initialize the vendor option if exists. - - @param Private Pointer to PxeBc private data. - @param Type PxeBc option boot item type - @param Layer PxeBc option boot item layer - @param UseBis Use BIS or not - @param DestIp Ip address for server - @param IpCount The total count of the server ip address - @param SrvList Server list - @param IsDiscv Discover the vendor or not - @param Reply The dhcp4 packet of Pxe reply - - @retval EFI_SUCCESS Operation succeeds. - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. - @retval EFI_NOT_FOUND There is no vendor option exists. - @retval EFI_TIMEOUT Send Pxe Discover time out. - -**/ -EFI_STATUS -PxeBcDiscvBootService ( - IN PXEBC_PRIVATE_DATA * Private, - IN UINT16 Type, - IN UINT16 *Layer, - IN BOOLEAN UseBis, - IN EFI_IP_ADDRESS * DestIp, - IN UINT16 IpCount, - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, - IN BOOLEAN IsDiscv, - OUT EFI_DHCP4_PACKET * Reply OPTIONAL - ); - - -/** - Initialize the DHCP options and build the option list. - - @param Private Pointer to PxeBc private data. - @param OptList Pointer to a DHCP option list. - - @param IsDhcpDiscover Discover dhcp option or not. - - @return The index item number of the option list. - -**/ -UINT32 -PxeBcBuildDhcpOptions ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_DHCP4_PACKET_OPTION **OptList, - IN BOOLEAN IsDhcpDiscover - ); - - -/** - Create the boot options. - - @param OptList Pointer to the list of the options - @param Type the type of option - @param Layer the layer of the boot options - @param OptLen length of opotion - -**/ -VOID -PxeBcCreateBootOptions ( - IN EFI_DHCP4_PACKET_OPTION *OptList, - IN UINT16 Type, - IN UINT16 *Layer, - OUT UINT32 *OptLen - ); - - -/** - Parse interested dhcp options. - - @param Buffer Pointer to the dhcp options packet. - @param Length The length of the dhcp options. - @param OptTag The option OpCode. - - @return NULL if the buffer length is 0 and OpCode is not - DHCP4_TAG_EOP, or the pointer to the buffer. - -**/ -EFI_DHCP4_PACKET_OPTION * -PxeBcParseExtendOptions ( - IN UINT8 *Buffer, - IN UINT32 Length, - IN UINT8 OptTag - ); - - -/** - This function is to parse and check vendor options. - - @param Dhcp4Option Pointer to dhcp options - @param VendorOption Pointer to vendor options - - @return TRUE if valid for vendor options, or FALSE. - -**/ -BOOLEAN -PxeBcParseVendorOptions ( - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, - IN PXEBC_VENDOR_OPTION *VendorOption - ); - - -/** - Choose the boot prompt. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Select boot prompt done. - @retval EFI_TIMEOUT Select boot prompt time out. - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. - @retval EFI_ABORTED User cancel the operation. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootPrompt ( - IN PXEBC_PRIVATE_DATA *Private - ); - - -/** - Select the boot menu. - - @param Private Pointer to PxeBc private data. - @param Type The type of the menu. - @param UseDefaultItem Use default item or not. - - @retval EFI_ABORTED User cancel operation. - @retval EFI_SUCCESS Select the boot menu success. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootMenu ( - IN PXEBC_PRIVATE_DATA *Private, - OUT UINT16 *Type, - IN BOOLEAN UseDefaultItem - ); - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h deleted file mode 100644 index b7bf069dd637..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h +++ /dev/null @@ -1,102 +0,0 @@ -/** @file - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_DRIVER_H__ -#define __EFI_PXEBC_DRIVER_H__ - -/** - Test to see if this driver supports ControllerHandle. This service - is called by the EFI boot service ConnectController(). In - order to make drivers as small as possible, there are a few calling - restrictions for this service. ConnectController() must - follow these calling restrictions. If any other agent wishes to call - Supported() it must also follow these calling restrictions. - PxeBc requires DHCP4 and MTFTP4 protocols. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to test - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver supports this device - @retval EFI_ALREADY_STARTED This driver is already running on this device - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -/** - Start this driver on ControllerHandle. This service is called by the - EFI boot service ConnectController(). In order to make - drivers as small as possible, there are a few calling restrictions for - this service. ConnectController() must follow these - calling restrictions. If any other agent wishes to call Start() it - must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to bind driver to - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver is added to ControllerHandle - @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -/** - Stop this driver on ControllerHandle. This service is called by the - EFI boot service DisconnectController(). In order to - make drivers as small as possible, there are a few calling - restrictions for this service. DisconnectController() - must follow these calling restrictions. If any other agent wishes - to call Stop() it must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed ControllerHandle - @retval other This driver was not removed from this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2; -extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName; -extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding; - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h deleted file mode 100644 index e96b6f2c5d14..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h +++ /dev/null @@ -1,189 +0,0 @@ -/** @file - -Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_IMPL_H__ -#define __EFI_PXEBC_IMPL_H__ - - -typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA; - -#include <Uefi.h> - -#include <Guid/SmBios.h> -#include <IndustryStandard/SmBios.h> -#include <IndustryStandard/Dhcp.h> -#include <Protocol/Dhcp4.h> -#include <Protocol/PxeBaseCode.h> -#include <Protocol/Mtftp4.h> -#include <Protocol/Udp4.h> -#include <Protocol/LoadFile.h> -#include <Protocol/NetworkInterfaceIdentifier.h> -#include <Protocol/PxeBaseCodeCallBack.h> -#include <Protocol/Arp.h> -#include <Protocol/Ip4.h> -#include <Protocol/Ip4Config2.h> - -#include <Library/DebugLib.h> -#include <Library/DevicePathLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> -#include <Library/BaseLib.h> -#include <Library/NetLib.h> -#include <Library/DpcLib.h> -#include <Library/PcdLib.h> - -#include "PxeBcDriver.h" -#include "PxeBcDhcp.h" -#include "PxeBcMtftp.h" -#include "PxeBcSupport.h" - -#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P') -#define PXEBC_MTFTP_TIMEOUT 4 -#define PXEBC_MTFTP_RETRIES 6 -#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE 8 -#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE 4 -#define PXEBC_DEFAULT_PACKET_SIZE 1480 -#define PXEBC_DEFAULT_LIFETIME 50000 // 50ms, unit is microsecond -#define PXEBC_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) - -struct _PXEBC_PRIVATE_DATA { - UINT32 Signature; - EFI_HANDLE Controller; - EFI_HANDLE Image; - EFI_HANDLE ArpChild; - EFI_HANDLE Dhcp4Child; - EFI_HANDLE Ip4Child; - EFI_HANDLE Mtftp4Child; - EFI_HANDLE Udp4ReadChild; - EFI_HANDLE Udp4WriteChild; - - EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii; - - EFI_PXE_BASE_CODE_PROTOCOL PxeBc; - EFI_LOAD_FILE_PROTOCOL LoadFile; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback; - EFI_ARP_PROTOCOL *Arp; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_IP4_PROTOCOL *Ip4; - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; - EFI_IP4_CONFIG_DATA Ip4ConfigData; - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_UDP4_PROTOCOL *Udp4Read; - EFI_UDP4_PROTOCOL *Udp4Write; - UINT16 CurrentUdpSrcPort; - EFI_UDP4_CONFIG_DATA Udp4CfgData; - - - EFI_PXE_BASE_CODE_MODE Mode; - EFI_PXE_BASE_CODE_FUNCTION Function; - - CHAR8 *BootFileName; - - EFI_IP_ADDRESS StationIp; - EFI_IP_ADDRESS SubnetMask; - EFI_IP_ADDRESS GatewayIp; - EFI_IP_ADDRESS ServerIp; - BOOLEAN AddressIsOk; - UINT32 Ip4MaxPacketSize; - UINTN BlockSize; - UINTN FileSize; - - UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE]; - EFI_DHCP4_PACKET SeedPacket; - EFI_MAC_ADDRESS Mac; - UINT8 MacLen; - - BOOLEAN SortOffers; - BOOLEAN GotProxyOffer; - UINT32 NumOffers; - UINT32 SelectedOffer; - UINT32 ProxyOfferType; - - // - // Cached packets as complements of pxe mode data - // - PXEBC_CACHED_DHCP4_PACKET ProxyOffer; - PXEBC_CACHED_DHCP4_PACKET Dhcp4Ack; - PXEBC_CACHED_DHCP4_PACKET PxeReply; - PXEBC_CACHED_DHCP4_PACKET Dhcp4Offers[PXEBC_MAX_OFFER_NUM]; - - // - // Arrays for different types of offers: - // ServerCount records the count of the servers we got the offers, - // OfferIndex records the index of the offer sent by the server indexed by ServerCount. - // - UINT32 ServerCount[DHCP4_PACKET_TYPE_MAX]; - UINT32 OfferIndex[DHCP4_PACKET_TYPE_MAX][PXEBC_MAX_OFFER_NUM]; - UINT32 BootpIndex; - UINT32 ProxyIndex[DHCP4_PACKET_TYPE_MAX]; - UINT32 BinlIndex[PXEBC_MAX_OFFER_NUM]; - - EFI_EVENT GetArpCacheEvent; - // - // token and event used to get ICMP error data from IP - // - EFI_IP4_COMPLETION_TOKEN IcmpErrorRcvToken; -}; - -#define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a, PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE) - -#define PXEBC_PRIVATE_DATA_FROM_LOADFILE(a) CR (a, PXEBC_PRIVATE_DATA, LoadFile, PXEBC_PRIVATE_DATA_SIGNATURE) - -#define PXEBC_PRIVATE_DATA_FROM_PXEBCCALLBACK(a) CR (a, PXEBC_PRIVATE_DATA, PxeBcCallback, PXEBC_PRIVATE_DATA_SIGNATURE) - -extern EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate; -extern EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate; - -/** - Causes the driver to load a specified file. - - @param This Protocol instance pointer. - @param FilePath The device specific path of the file to load. - @param BootPolicy If TRUE, indicates that the request originates from the - boot manager is attempting to load FilePath as a boot - selection. If FALSE, then FilePath must match as exact file - to be loaded. - @param BufferSize On input the size of Buffer in bytes. On output with a return - code of EFI_SUCCESS, the amount of data transferred to - Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, - the size of Buffer required to retrieve the requested file. - @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in - BufferSize. - - @retval EFI_SUCCESS The file was loaded. - @retval EFI_UNSUPPORTED The device does not support the provided BootPolicy - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or - BufferSize is NULL. - @retval EFI_NO_MEDIA No medium was present to load the file. - @retval EFI_DEVICE_ERROR The file was not loaded due to a device error. - @retval EFI_NO_RESPONSE The remote system did not respond. - @retval EFI_NOT_FOUND The file was not found. - @retval EFI_ABORTED The file load process was manually cancelled. - -**/ -EFI_STATUS -EFIAPI -EfiPxeLoadFile ( - IN EFI_LOAD_FILE_PROTOCOL * This, - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, - IN BOOLEAN BootPolicy, - IN OUT UINTN *BufferSize, - IN VOID *Buffer OPTIONAL - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h deleted file mode 100644 index 903dd4fbb69a..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h +++ /dev/null @@ -1,137 +0,0 @@ -/** @file - Mtftp routines for PxeBc. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_MTFTP_H__ -#define __EFI_PXEBC_MTFTP_H__ - -#define PXE_MTFTP_OPTION_BLKSIZE_INDEX 0 -#define PXE_MTFTP_OPTION_TIMEOUT_INDEX 1 -#define PXE_MTFTP_OPTION_TSIZE_INDEX 2 -#define PXE_MTFTP_OPTION_MULTICAST_INDEX 3 -#define PXE_MTFTP_OPTION_MAXIMUM_INDEX 4 - -#define PXE_MTFTP_ERROR_STRING_LENGTH 127 -#define PXE_MTFTP_OPTBUF_MAXNUM_INDEX 128 - - -/** - This function is to get size of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Get the size of file success - @retval EFI_NOT_FOUND Parse the tftp ptions failed. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval Other Has not get the size of the file. - -**/ -EFI_STATUS -PxeBcTftpGetFileSize ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN OUT UINT64 *BufferSize - ); - - -/** - This function is to get data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - @param DontUseBuffer Indicate whether with a receive buffer - - @retval EFI_SUCCESS Read the data success from the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Read data from file failed. - -**/ -EFI_STATUS -PxeBcTftpReadFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ); - - -/** - This function is put data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param Overwrite Indicate whether with overwrite attribute - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Write the data success into the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Write data into file failed. - -**/ -EFI_STATUS -PxeBcTftpWriteFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN BOOLEAN Overwrite, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize - ); - - -/** - This function is to get data(file) from a directory(may be a server) by Tftp. - - @param Private Pointer to PxeBc private data. - @param Config Pointer to Mtftp configuration data. - @param Filename Pointer to file name. - @param BlockSize Pointer to block size. - @param BufferPtr Pointer to buffer. - @param BufferSize Pointer to buffer size. - @param DontUseBuffer Indicate whether with a receive buffer. - - @retval EFI_SUCCES Get the data from the file included in directory success. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Operation failed. - -**/ -EFI_STATUS -PxeBcTftpReadDirectory ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ); - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h deleted file mode 100644 index a28c9740c171..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h +++ /dev/null @@ -1,134 +0,0 @@ -/** @file - Support routines for PxeBc. -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_SUPPORT_H__ -#define __EFI_PXEBC_SUPPORT_H__ - - -/** - The common notify function associated with various PxeBc events. - - @param Event The event signaled. - @param Context The context. - -**/ -VOID -EFIAPI -PxeBcCommonNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ); - - -/** - This function initialize(or configure) the Udp4Write instance. - - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - @param StationIp Pointer to the station ip address. - @param SubnetMask Pointer to the subnetmask of the station ip address. - @param Gateway Pointer to the gateway ip address. - @param SrcPort Pointer to the srouce port of the station. - @param Ttl The time to live field of the IP header. - @param ToS The type of service field of the IP header. - - @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration (DHCP, BOOTP, - RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE: - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already started/configured - and must be stopped/reset before it can be reconfigured. - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE - and UdpConfigData.StationPort is already used by - other instance. - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot allocate memory for this - EFI UDPv4 Protocol instance. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance - was not opened. - @retval Others Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. - -**/ -EFI_STATUS -PxeBcConfigureUdpWriteInstance ( - IN EFI_UDP4_PROTOCOL *Udp4, - IN EFI_IPv4_ADDRESS *StationIp, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *Gateway, - IN OUT UINT16 *SrcPort, - IN UINT8 Ttl, - IN UINT8 ToS - ); - - -/** - This function is to display the IPv4 address. - - @param[in] Ip The pointer to the IPv4 address. - -**/ -VOID -PxeBcShowIp4Addr ( - IN EFI_IPv4_ADDRESS *Ip - ); - - -/** - Convert number to ASCII value. - - @param Number Numeric value to convert to decimal ASCII value. - @param Buffer Buffer to place ASCII version of the Number. - @param Length Length of Buffer. - -**/ -VOID -CvtNum ( - IN UINTN Number, - IN UINT8 *Buffer, - IN UINTN Length - ); - - -/** - Convert unsigned int number to decimal number. - - @param Number The unsigned int number will be converted. - @param Buffer Pointer to the buffer to store the decimal number after transform. - @param[in] BufferSize The maxsize of the buffer. - - @return the length of the number after transform. - -**/ -UINTN -UtoA10 ( - IN UINTN Number, - IN CHAR8 *Buffer, - IN UINTN BufferSize - - ); - - -/** - Convert ASCII numeric string to a UINTN value. - - @param Buffer Pointer to the 8-byte unsigned int value. - - @return UINTN value of the ASCII string. - -**/ -UINT64 -AtoU64 ( - IN UINT8 *Buffer - ); - - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni deleted file mode 100644 index e97c3cadd973..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni +++ /dev/null @@ -1,25 +0,0 @@ -// /** @file -// This module produces EFI Preboot Execution Environment (PXE) Base Code Protocol. -// -// This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and IPv4 -// network stack, used to control PXE-compatible devices. It produces EFI Load File -// Protocol to provide one clean way to otain control from the boot manager if the -// boot patch is from the remote device. -// -// Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI Preboot Execution Environment (PXE) Base Code Protocol" - -#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI PXE Base Code Protocol upon the EFI MMP Protocol and the IPv4 network stack, and is used to control PXE-compatible devices. It produces the EFI Load File Protocol to provide a clean method to obtain control from the boot manager if the boot patch is from the remote device." - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni deleted file mode 100644 index 2c1bda1a8bd2..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// UefiPxe4BcDxe Localized Strings and Content -// -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"UEFI PXE Base Code DXE Driver" - - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf deleted file mode 100644 index 042401992945..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf +++ /dev/null @@ -1,102 +0,0 @@ -## @file -# This module produces EFI Preboot Execution Environment (PXE) Base Code Protocol. -# -# This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and IPv4 -# network stack, used to control PXE-compatible devices. It produces EFI Load File -# Protocol to provide one clean way to otain control from the boot manager if the -# boot patch is from the remote device. This driver only supports IPv4 network stack. -# -# Notes: -# 1) This driver can't co-work with the UefiPxeBcDxe driver in NetworkPkg. -# 2) This driver might have some issues that have been fixed in the UefiPxeBcDxe -# driver in NetworkPkg. -# 3) This driver supports fewer features than the UefiPxeBcDxe driver in NetworkPkg -# (e.g. IPv6, MTFTP windowsize). -# 4) UefiPxeBcDxe driver in NetworkPkg is recommended for use instead of this one even -# though both of them can be used. -# -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# -## - - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = UefiPxe4BcDxe - MODULE_UNI_FILE = UefiPxe4BcDxe.uni - FILE_GUID = 3B1DEAB5-C75D-442e-9238-8E2FFB62B0BB - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = PxeBcDriverEntryPoint - UNLOAD_IMAGE = NetLibDefaultUnload - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 -# -# DRIVER_BINDING = gPxeBcDriverBinding -# COMPONENT_NAME = gPxeBcComponentName -# COMPONENT_NAME2 = gPxeBcComponentName2 -# - -[Sources] - PxeBcMtftp.c - PxeBcSupport.h - PxeBcSupport.c - PxeBcDriver.c - PxeBcDhcp.h - ComponentName.c - PxeBcImpl.c - PxeBcImpl.h - PxeBcDhcp.c - PxeBcMtftp.h - PxeBcDriver.h - - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - BaseLib - UefiLib - UefiBootServicesTableLib - UefiDriverEntryPoint - BaseMemoryLib - MemoryAllocationLib - DebugLib - NetLib - DpcLib - PcdLib - -[Protocols] - gEfiPxeBaseCodeCallbackProtocolGuid ## SOMETIMES_PRODUCES - gEfiPxeBaseCodeProtocolGuid ## BY_START - gEfiLoadFileProtocolGuid ## BY_START - gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## SOMETIMES_CONSUMES - gEfiArpServiceBindingProtocolGuid ## TO_START - gEfiArpProtocolGuid ## TO_START - gEfiMtftp4ServiceBindingProtocolGuid ## TO_START - gEfiMtftp4ProtocolGuid ## TO_START - gEfiUdp4ServiceBindingProtocolGuid ## TO_START - gEfiUdp4ProtocolGuid ## TO_START - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START - gEfiDhcp4ProtocolGuid ## TO_START - gEfiIp4ServiceBindingProtocolGuid ## TO_START - gEfiIp4ProtocolGuid ## TO_START - gEfiIp4Config2ProtocolGuid ## TO_START - -[Pcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize ## SOMETIMES_CONSUMES - -[UserExtensions.TianoCore."ExtraFiles"] - UefiPxe4BcDxeExtra.uni -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. 2018-10-30 7:33 ` [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg Fu Siyuan @ 2018-10-31 8:23 ` Ni, Ruiyu 2018-10-31 8:37 ` Fu, Siyuan 2018-11-01 3:08 ` Zeng, Star 1 sibling, 1 reply; 29+ messages in thread From: Ni, Ruiyu @ 2018-10-31 8:23 UTC (permalink / raw) To: Fu, Siyuan, edk2-devel@lists.01.org; +Cc: Wu, Jiaxin, Zeng, Star Siyuan, In BmBootDescription.c: BmGetNetworkDescription() contains below comments: // // The PXE device path is like: // ....../Mac(...)[/Vlan(...)][/Wi-Fi(...)] // ....../Mac(...)[/Vlan(...)][/Wi-Fi(...)]/IPv4(...) // ....../Mac(...)[/Vlan(...)][/Wi-Fi(...)]/IPv6(...) // After the PxeBcDxe driver in MdeModulePkg is removed, there won't be PXD device path like "....../Mac(...)[/Vlan(...)][/Wi-Fi(...)]". So the code block "Locate the IP node" should expect IP node always exists. Could you please change this function after this patch is commit? Thanks/Ray > -----Original Message----- > From: edk2-devel <edk2-devel-bounces@lists.01.org> On Behalf Of Fu > Siyuan > Sent: Tuesday, October 30, 2018 3:33 PM > To: edk2-devel@lists.01.org > Cc: Wu, Jiaxin <jiaxin.wu@intel.com>; Zeng, Star <star.zeng@intel.com> > Subject: [edk2] [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI > drivers in MdeModulePkg. > > This patch is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe drivers > in MdeModulePkg. These drivers will not be maintained and can't co-work > with the dual-stack drivers in NetworkPkg. > > People should use below NetworkPkg drivers instead: > NetworkPkg/IScsiDxe/IScsiDxe.inf > NetworkPkg/TcpDxe/TcpDxe.inf > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > These drivers are actively maintained with more bug fixes and new feature > support. > > Cc: Star Zeng <star.zeng@intel.com> > Cc: Jian J Wang <jian.j.wang@intel.com> > Cc: Jiaxin Wu <jiaxin.wu@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> > --- > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c | > 283 -- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ----- > ---- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c | 472 ---- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c | 676 ----- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 > --- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c | 539 ---- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c | 116 > - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ > - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c | 2799 ----- > ------------- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 ---- > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 --- > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c | > 433 --- > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ---- > ---- > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c | 990 -- > ----- > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 - > ---- > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ---- > - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --- > ------- > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- > - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ---- > -- > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 --- > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 -- > ------ > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > | 365 --- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c | > 1999 ------------- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c | > 665 ----- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c | > 2989 -------------------- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c | > 454 --- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c | > 221 -- > MdeModulePkg/MdeModulePkg.dsc | 3 - > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h | > 165 -- > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h | 22 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h | 166 -- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr | 219 - > - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni | > 62 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h | > 109 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h | 140 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 > - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h | 38 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h | 168 -- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h | 74 - > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h | 317 --- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h | 1005 ----- > -- > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h | 131 - > MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h | 954 ------ > - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 --- > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ---- > - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- > - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 --- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h | > 502 ---- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h | > 102 - > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h | 189 > -- > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h | > 137 - > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h | > 134 - > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | > 25 - > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni > | 20 - > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | > 102 - > 69 files changed, 32598 deletions(-) > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > deleted file mode 100644 > index 3f561e93439d..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > +++ /dev/null > @@ -1,283 +0,0 @@ > -/** @file > - UEFI Component Name(2) protocol implementation for iSCSI. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -// > -// EFI Component Name Protocol > -// > -GLOBAL_REMOVE_IF_UNREFERENCED > EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = { > - IScsiComponentNameGetDriverName, > - IScsiComponentNameGetControllerName, > - "eng" > -}; > - > -// > -// EFI Component Name 2 Protocol > -// > -GLOBAL_REMOVE_IF_UNREFERENCED > EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = { > - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) > IScsiComponentNameGetDriverName, > - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) > IScsiComponentNameGetControllerName, > - "en" > -}; > - > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > mIScsiDriverNameTable[] = { > - {"eng;en", L"iSCSI Driver"}, > - {NULL, NULL} > -}; > - > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > *mIScsiControllerNameTable = NULL; > - > -/** > - Retrieves a Unicode string that is the user readable name of the EFI Driver. > - > - This function retrieves the user readable name of a driver in the form of a > - Unicode string. If the driver specified by This has a user readable name in > - the language specified by Language, then a pointer to the driver name is > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > specified > - by This does not support the language specified by Language, > - then EFI_UNSUPPORTED is returned. > - > - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL > instance. > - @param[in] Language A pointer to a three character ISO 639-2 language > identifier. > - This is the language of the driver name that that the caller > - is requesting, and it must match one of the languages specified > - in SupportedLanguages. The number of languages supported > by a > - driver is up to the driver writer. > - @param[out] DriverName A pointer to the Unicode string to return. This > Unicode string > - is the name of the driver specified by This in the language > - specified by Language. > - > - @retval EFI_SUCCESS The Unicode string for the Driver specified by > This > - and the language specified by Language was returned > - in DriverName. > - @retval EFI_INVALID_PARAMETER Language is NULL. > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > - @retval EFI_UNSUPPORTED The driver specified by This does not > support the > - language specified by Language. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiComponentNameGetDriverName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN CHAR8 *Language, > - OUT CHAR16 **DriverName > - ) > -{ > - return LookupUnicodeString2 ( > - Language, > - This->SupportedLanguages, > - mIScsiDriverNameTable, > - DriverName, > - (BOOLEAN)(This == &gIScsiComponentName) > - ); > -} > - > -/** > - Update the component name for the iSCSI instance. > - > - @param[in] IScsiExtScsiPassThru A pointer to the > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > - > - @retval EFI_SUCCESS Update the ControllerNameTable of this > instance successfully. > - @retval EFI_INVALID_PARAMETER The input parameter is invalid. > - @retval EFI_UNSUPPORTED Can't get the corresponding NIC info from > the Controller handle. > - > -**/ > -EFI_STATUS > -UpdateName ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru > - ) > -{ > - EFI_STATUS Status; > - CHAR16 HandleName[150]; > - ISCSI_DRIVER_DATA *Private; > - EFI_MAC_ADDRESS MacAddress; > - UINTN HwAddressSize; > - UINT16 VlanId; > - CHAR16 MacString[70]; > - > - if (IScsiExtScsiPassThru == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU > (IScsiExtScsiPassThru); > - > - // > - // Get the mac string, it's the name of various variable > - // > - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, > &HwAddressSize); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - VlanId = NetLibGetVlanId (Private->Controller); > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > MacString); > - > - UnicodeSPrint ( > - HandleName, > - sizeof (HandleName), > - L"iSCSI IPv4 (MacString=%s)", > - MacString > - ); > - > - if (mIScsiControllerNameTable != NULL) { > - FreeUnicodeStringTable (mIScsiControllerNameTable); > - mIScsiControllerNameTable = NULL; > - } > - > - Status = AddUnicodeString2 ( > - "eng", > - gIScsiComponentName.SupportedLanguages, > - &mIScsiControllerNameTable, > - HandleName, > - TRUE > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - return AddUnicodeString2 ( > - "en", > - gIScsiComponentName2.SupportedLanguages, > - &mIScsiControllerNameTable, > - HandleName, > - FALSE > - ); > -} > - > -/** > - Retrieves a Unicode string that is the user readable name of the controller > - that is being managed by an EFI Driver.Currently not implemented. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME_PROTOCOL instance. > - @param[in] ControllerHandle The handle of a controller that the driver > specified by > - This is managing. This handle specifies the controller > - whose name is to be returned. > - @param[in] ChildHandle The handle of the child controller to retrieve > the name > - of. This is an optional parameter that may be NULL. It > - will be NULL for device drivers. It will also be NULL > - for a bus drivers that wish to retrieve the name of the > - bus controller. It will not be NULL for a bus driver > - that wishes to retrieve the name of a child controller. > - @param[in] Language A pointer to a three character ISO 639-2 > language > - identifier. This is the language of the controller name > - that that the caller is requesting, and it must match one > - of the languages specified in SupportedLanguages. The > - number of languages supported by a driver is up to the > - driver writer. > - @param[out] ControllerName A pointer to the Unicode string to return. > This Unicode > - string is the name of the controller specified by > - ControllerHandle and ChildHandle in the language specified > - by Language from the point of view of the driver specified > - by This. > - > - @retval EFI_SUCCESS The Unicode string for the user readable name > in the > - language specified by Language for the driver > - specified by This was returned in DriverName. > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid EFI_HANDLE. > - @retval EFI_INVALID_PARAMETER Language is NULL. > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > - @retval EFI_UNSUPPORTED The driver specified by This is not currently > managing > - the controller specified by ControllerHandle and > - ChildHandle. > - @retval EFI_UNSUPPORTED The driver specified by This does not > support the > - language specified by Language. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiComponentNameGetControllerName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE ChildHandle OPTIONAL, > - IN CHAR8 *Language, > - OUT CHAR16 **ControllerName > - ) > -{ > - EFI_STATUS Status; > - > - EFI_HANDLE IScsiController; > - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; > - > - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru; > - > - if (ControllerHandle == NULL) { > - return EFI_UNSUPPORTED; > - } > - > - // > - // Get the handle of the controller we are controling. > - // > - IScsiController = NetLibGetNicHandle (ControllerHandle, > &gEfiTcp4ProtocolGuid); > - if (IScsiController == NULL) { > - return EFI_UNSUPPORTED; > - } > - > - Status = gBS->OpenProtocol ( > - IScsiController, > - &gEfiCallerIdGuid, > - (VOID **)&IScsiIdentifier, > - NULL, > - NULL, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - if (ChildHandle != NULL) { > - // > - // Make sure this driver produced ChildHandle > - // > - Status = EfiTestChildHandle ( > - ControllerHandle, > - ChildHandle, > - &gEfiTcp4ProtocolGuid > - ); > - if (!EFI_ERROR (Status)) { > - // > - // Retrieve an instance of a produced protocol from ChildHandle > - // > - Status = gBS->OpenProtocol ( > - ChildHandle, > - &gEfiExtScsiPassThruProtocolGuid, > - (VOID **)&IScsiExtScsiPassThru, > - NULL, > - NULL, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // Update the component name for this child handle. > - // > - Status = UpdateName (IScsiExtScsiPassThru); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - } else { > - return Status; > - } > - } > - > - return LookupUnicodeString2 ( > - Language, > - This->SupportedLanguages, > - mIScsiControllerNameTable, > - ControllerName, > - (BOOLEAN)(This == &gIScsiComponentName) > - ); > -} > - > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > deleted file mode 100644 > index 6307684ff05b..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > +++ /dev/null > @@ -1,430 +0,0 @@ > -/** @file > - This file is for Challenge-Handshake Authentication Protocol (CHAP) > Configuration. > - > -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > -#include "Md5.h" > - > -/** > - Initator calculates its own expected hash value. > - > - @param[in] ChapIdentifier iSCSI CHAP identifier sent by authenticator. > - @param[in] ChapSecret iSCSI CHAP secret of the authenticator. > - @param[in] SecretLength The length of iSCSI CHAP secret. > - @param[in] ChapChallenge The challenge message sent by > authenticator. > - @param[in] ChallengeLength The length of iSCSI CHAP challenge > message. > - @param[out] ChapResponse The calculation of the expected hash > value. > - > - @retval EFI_SUCCESS The expected hash value was calculatedly > successfully. > - @retval EFI_PROTOCOL_ERROR The length of the secret should be at > least the > - length of the hash value for the hashing algorithm chosen. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiCHAPCalculateResponse ( > - IN UINT32 ChapIdentifier, > - IN CHAR8 *ChapSecret, > - IN UINT32 SecretLength, > - IN UINT8 *ChapChallenge, > - IN UINT32 ChallengeLength, > - OUT UINT8 *ChapResponse > - ) > -{ > - MD5_CTX Md5Ctx; > - CHAR8 IdByte[1]; > - EFI_STATUS Status; > - > - Status = MD5Init (&Md5Ctx); > - > - // > - // Hash Identifier - Only calculate 1 byte data (RFC1994) > - // > - IdByte[0] = (CHAR8) ChapIdentifier; > - MD5Update (&Md5Ctx, IdByte, 1); > - > - // > - // Hash Secret > - // > - if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) { > - return EFI_PROTOCOL_ERROR; > - } > - > - MD5Update (&Md5Ctx, ChapSecret, SecretLength); > - > - // > - // Hash Challenge received from Target > - // > - MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength); > - > - Status = MD5Final (&Md5Ctx, ChapResponse); > - > - return Status; > -} > - > -/** > - The initator checks the CHAP response replied by target against its own > - calculation of the expected hash value. > - > - @param[in] AuthData iSCSI CHAP authentication data. > - @param[in] TargetResponse The response from target. > - > - @retval EFI_SUCCESS The response from target passed > authentication. > - @retval EFI_SECURITY_VIOLATION The response from target was not > expected value. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiCHAPAuthTarget ( > - IN ISCSI_CHAP_AUTH_DATA *AuthData, > - IN UINT8 *TargetResponse > - ) > -{ > - EFI_STATUS Status; > - UINT32 SecretSize; > - UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN]; > - > - Status = EFI_SUCCESS; > - > - SecretSize = (UINT32) AsciiStrLen (AuthData- > >AuthConfig.ReverseCHAPSecret); > - Status = IScsiCHAPCalculateResponse ( > - AuthData->OutIdentifier, > - AuthData->AuthConfig.ReverseCHAPSecret, > - SecretSize, > - AuthData->OutChallenge, > - AuthData->OutChallengeLength, > - VerifyRsp > - ); > - > - if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) > { > - Status = EFI_SECURITY_VIOLATION; > - } > - > - return Status; > -} > - > -/** > - This function checks the received iSCSI Login Response during the security > - negotiation stage. > - > - @param[in] Conn The iSCSI connection. > - > - @retval EFI_SUCCESS The Login Response passed the CHAP validation. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiCHAPOnRspReceived ( > - IN ISCSI_CONNECTION *Conn > - ) > -{ > - EFI_STATUS Status; > - ISCSI_SESSION *Session; > - ISCSI_CHAP_AUTH_DATA *AuthData; > - CHAR8 *Value; > - UINT8 *Data; > - UINT32 Len; > - LIST_ENTRY *KeyValueList; > - UINTN Algorithm; > - CHAR8 *Identifier; > - CHAR8 *Challenge; > - CHAR8 *Name; > - CHAR8 *Response; > - UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN]; > - UINT32 RspLen; > - > - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); > - ASSERT (Conn->RspQue.BufNum != 0); > - > - Session = Conn->Session; > - AuthData = &Session->AuthData; > - > - Len = Conn->RspQue.BufSize; > - Data = AllocatePool (Len); > - if (Data == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - // > - // Copy the data in case the data spans over multiple PDUs. > - // > - NetbufQueCopy (&Conn->RspQue, 0, Len, Data); > - > - // > - // Build the key-value list from the data segment of the Login Response. > - // > - KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len); > - if (KeyValueList == NULL) { > - FreePool (Data); > - return EFI_OUT_OF_RESOURCES; > - } > - > - Status = EFI_PROTOCOL_ERROR; > - > - switch (Conn->CHAPStep) { > - case ISCSI_CHAP_INITIAL: > - // > - // The first Login Response. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); > - if (Value == NULL) { > - goto ON_EXIT; > - } > - > - Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn > (Value); > - > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_AUTH_METHOD); > - if (Value == NULL) { > - goto ON_EXIT; > - } > - // > - // Initiator mandates CHAP authentication but target replies without > "CHAP" or > - // initiator suggets "None" but target replies with some kind of auth > method. > - // > - if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) { > - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { > - goto ON_EXIT; > - } > - } else { > - if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) { > - goto ON_EXIT; > - } > - } > - // > - // Transit to CHAP step one. > - // > - Conn->CHAPStep = ISCSI_CHAP_STEP_ONE; > - Status = EFI_SUCCESS; > - break; > - > - case ISCSI_CHAP_STEP_TWO: > - // > - // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C> > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_CHAP_ALGORITHM); > - if (Value == NULL) { > - goto ON_EXIT; > - } > - > - Algorithm = AsciiStrDecimalToUintn (Value); > - if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) { > - // > - // Unsupported algorithm is chosen by target. > - // > - goto ON_EXIT; > - } > - > - Identifier = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_CHAP_IDENTIFIER); > - if (Identifier == NULL) { > - goto ON_EXIT; > - } > - > - Challenge = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_CHAP_CHALLENGE); > - if (Challenge == NULL) { > - goto ON_EXIT; > - } > - // > - // Process the CHAP identifier and CHAP Challenge from Target > - // Calculate Response value > - // > - AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn (Identifier); > - AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN; > - IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData- > >InChallengeLength, Challenge); > - Status = IScsiCHAPCalculateResponse ( > - AuthData->InIdentifier, > - AuthData->AuthConfig.CHAPSecret, > - (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret), > - AuthData->InChallenge, > - AuthData->InChallengeLength, > - AuthData->CHAPResponse > - ); > - > - // > - // Transit to next step. > - // > - Conn->CHAPStep = ISCSI_CHAP_STEP_THREE; > - break; > - > - case ISCSI_CHAP_STEP_THREE: > - // > - // one way CHAP authentication and the target would like to > - // authenticate us. > - // > - Status = EFI_SUCCESS; > - break; > - > - case ISCSI_CHAP_STEP_FOUR: > - ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL); > - // > - // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target. > - // > - Name = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_CHAP_NAME); > - if (Name == NULL) { > - goto ON_EXIT; > - } > - > - Response = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_CHAP_RESPONSE); > - if (Response == NULL) { > - goto ON_EXIT; > - } > - > - RspLen = ISCSI_CHAP_RSP_LEN; > - IScsiHexToBin (TargetRsp, &RspLen, Response); > - > - // > - // Check the CHAP Response replied by Target. > - // > - Status = IScsiCHAPAuthTarget (AuthData, TargetRsp); > - break; > - > - default: > - break; > - } > - > -ON_EXIT: > - > - IScsiFreeKeyValueList (KeyValueList); > - > - FreePool (Data); > - > - return Status; > -} > - > -/** > - This function fills the CHAP authentication information into the login PDU > - during the security negotiation stage in the iSCSI connection login. > - > - @param[in] Conn The iSCSI connection. > - @param[in, out] Pdu The PDU to send out. > - > - @retval EFI_SUCCESS All check passed and the phase-related CHAP > - authentication info is filled into the iSCSI PDU. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > -**/ > -EFI_STATUS > -IScsiCHAPToSendReq ( > - IN ISCSI_CONNECTION *Conn, > - IN OUT NET_BUF *Pdu > - ) > -{ > - EFI_STATUS Status; > - ISCSI_SESSION *Session; > - ISCSI_LOGIN_REQUEST *LoginReq; > - ISCSI_CHAP_AUTH_DATA *AuthData; > - CHAR8 *Value; > - CHAR8 ValueStr[256]; > - CHAR8 *Response; > - UINT32 RspLen; > - CHAR8 *Challenge; > - UINT32 ChallengeLen; > - > - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); > - > - Session = Conn->Session; > - AuthData = &Session->AuthData; > - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0); > - if (LoginReq == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - Status = EFI_SUCCESS; > - > - RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3; > - Response = AllocatePool (RspLen); > - if (Response == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3; > - Challenge = AllocatePool (ChallengeLen); > - if (Challenge == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - switch (Conn->CHAPStep) { > - case ISCSI_CHAP_INITIAL: > - // > - // It's the initial Login Request. Fill in the key=value pairs mandatory > - // for the initial Login Request. > - // > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session- > >InitiatorName); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal"); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session- > >ConfigData.NvData.TargetName); > - > - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { > - Value = ISCSI_KEY_VALUE_NONE; > - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > - } else { > - Value = ISCSI_AUTH_METHOD_CHAP; > - } > - > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value); > - > - break; > - > - case ISCSI_CHAP_STEP_ONE: > - // > - // First step, send the Login Request with CHAP_A=<A1,A2...> key-value > pair. > - // > - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", > ISCSI_CHAP_ALGORITHM_MD5); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr); > - > - Conn->CHAPStep = ISCSI_CHAP_STEP_TWO; > - break; > - > - case ISCSI_CHAP_STEP_THREE: > - // > - // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or > - // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target > ahtentication is > - // required too. > - // > - // CHAP_N=<N> > - // > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) > &AuthData->AuthConfig.CHAPName); > - // > - // CHAP_R=<R> > - // > - IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, > ISCSI_CHAP_RSP_LEN, Response, &RspLen); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response); > - > - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) { > - // > - // CHAP_I=<I> > - // > - IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1); > - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); > - // > - // CHAP_C=<C> > - // > - IScsiGenRandom ((UINT8 *) AuthData->OutChallenge, > ISCSI_CHAP_RSP_LEN); > - AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN; > - IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, > ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge); > - > - Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR; > - } > - // > - // set the stage transition flag. > - // > - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > - break; > - > - default: > - Status = EFI_PROTOCOL_ERROR; > - break; > - } > - > - FreePool (Response); > - FreePool (Challenge); > - > - return Status; > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > deleted file mode 100644 > index cb1eff1b690c..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > +++ /dev/null > @@ -1,1264 +0,0 @@ > -/** @file > - Helper functions for configuring or getting the parameters relating to iSCSI. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA"; > -BOOLEAN mIScsiDeviceListUpdated = FALSE; > -UINTN mNumberOfIScsiDevices = 0; > -ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL; > - > -LIST_ENTRY mIScsiConfigFormList = { > - &mIScsiConfigFormList, > - &mIScsiConfigFormList > -}; > - > -HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = { > - { > - { > - HARDWARE_DEVICE_PATH, > - HW_VENDOR_DP, > - { > - (UINT8) (sizeof (VENDOR_DEVICE_PATH)), > - (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) > - } > - }, > - IP4_ISCSI_CONFIG_GUID > - }, > - { > - END_DEVICE_PATH_TYPE, > - END_ENTIRE_DEVICE_PATH_SUBTYPE, > - { > - (UINT8) (END_DEVICE_PATH_LENGTH), > - (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) > - } > - } > -}; > - > -/** > - Convert the IPv4 address into a dotted string. > - > - @param[in] Ip The IPv4 address. > - @param[out] Str The dotted IP string. > -**/ > -VOID > -IScsiIpToStr ( > - IN EFI_IPv4_ADDRESS *Ip, > - OUT CHAR16 *Str > - ) > -{ > - UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], > Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]); > -} > - > - > -/** > - Parse IsId in string format and convert it to binary. > - > - @param[in] String The buffer of the string to be parsed. > - @param[in, out] IsId The buffer to store IsId. > - > - @retval EFI_SUCCESS The operation finished successfully. > - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > - > -**/ > -EFI_STATUS > -IScsiParseIsIdFromString ( > - IN CONST CHAR16 *String, > - IN OUT UINT8 *IsId > - ) > -{ > - UINT8 Index; > - CHAR16 *IsIdStr; > - CHAR16 TempStr[3]; > - UINTN NodeVal; > - CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE]; > - EFI_INPUT_KEY Key; > - > - if ((String == NULL) || (IsId == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - IsIdStr = (CHAR16 *) String; > - > - if (StrLen (IsIdStr) != 6) { > - UnicodeSPrint ( > - PortString, > - (UINTN) sizeof (PortString), > - L"Error! Input is incorrect, please input 6 hex numbers!\n" > - ); > - > - CreatePopUp ( > - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, > - &Key, > - PortString, > - NULL > - ); > - > - return EFI_INVALID_PARAMETER; > - } > - > - for (Index = 3; Index < 6; Index++) { > - CopyMem (TempStr, IsIdStr, sizeof (TempStr)); > - TempStr[2] = L'\0'; > - > - // > - // Convert the string to IsId. StrHexToUintn stops at the first character > - // that is not a valid hex character, '\0' here. > - // > - NodeVal = StrHexToUintn (TempStr); > - > - IsId[Index] = (UINT8) NodeVal; > - > - IsIdStr = IsIdStr + 2; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Convert IsId from binary to string format. > - > - @param[out] String The buffer to store the converted string. > - @param[in] IsId The buffer to store IsId. > - > - @retval EFI_SUCCESS The string converted successfully. > - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > - > -**/ > -EFI_STATUS > -IScsiConvertIsIdToString ( > - OUT CHAR16 *String, > - IN UINT8 *IsId > - ) > -{ > - UINT8 Index; > - UINTN Number; > - > - if ((String == NULL) || (IsId == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - for (Index = 0; Index < 6; Index++) { > - if (IsId[Index] <= 0xF) { > - Number = UnicodeSPrint ( > - String, > - 2 * ISID_CONFIGURABLE_STORAGE, > - L"0%X", > - (UINTN) IsId[Index] > - ); > - } else { > - Number = UnicodeSPrint ( > - String, > - 2 * ISID_CONFIGURABLE_STORAGE, > - L"%X", > - (UINTN) IsId[Index] > - ); > - > - } > - > - String = String + Number; > - } > - > - *String = L'\0'; > - > - return EFI_SUCCESS; > -} > - > - > -/** > - Update the list of iSCSI devices the iSCSI driver is controlling. > - > - @retval EFI_SUCCESS The callback successfully handled the action. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiUpdateDeviceList ( > - VOID > - ) > -{ > - EFI_STATUS Status; > - ISCSI_DEVICE_LIST *DeviceList; > - UINTN DataSize; > - UINTN NumHandles; > - EFI_HANDLE *Handles; > - UINTN HandleIndex; > - UINTN Index; > - UINTN LastDeviceIndex; > - EFI_MAC_ADDRESS MacAddress; > - UINTN HwAddressSize; > - UINT16 VlanId; > - ISCSI_MAC_INFO *CurMacInfo; > - ISCSI_MAC_INFO TempMacInfo; > - CHAR16 MacString[70]; > - UINTN DeviceListSize; > - > - // > - // Dump all the handles the Managed Network Service Binding Protocol is > installed on. > - // > - Status = gBS->LocateHandleBuffer ( > - ByProtocol, > - &gEfiManagedNetworkServiceBindingProtocolGuid, > - NULL, > - &NumHandles, > - &Handles > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - DataSize = 0; > - Status = gRT->GetVariable ( > - L"iSCSIDeviceList", > - &gIp4IScsiConfigGuid, > - NULL, > - &DataSize, > - NULL > - ); > - if (Status == EFI_BUFFER_TOO_SMALL) { > - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize); > - ASSERT (DeviceList != NULL); > - > - gRT->GetVariable ( > - L"iSCSIDeviceList", > - &gIp4IScsiConfigGuid, > - NULL, > - &DataSize, > - DeviceList > - ); > - > - LastDeviceIndex = 0; > - > - for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) { > - Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress, > &HwAddressSize); > - ASSERT (Status == EFI_SUCCESS); > - VlanId = NetLibGetVlanId (Handles[HandleIndex]); > - > - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) { > - CurMacInfo = &DeviceList->MacInfo[Index]; > - if ((CurMacInfo->Len == HwAddressSize) && > - (CurMacInfo->VlanId == VlanId) && > - (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr, > HwAddressSize)) > - ) { > - // > - // The previous configured NIC is still here. > - // > - if (Index != LastDeviceIndex) { > - // > - // Swap the current MAC address entry with the one indexed by > - // LastDeviceIndex. > - // > - CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO)); > - CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex], > sizeof (ISCSI_MAC_INFO)); > - CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo, > sizeof (ISCSI_MAC_INFO)); > - } > - > - LastDeviceIndex++; > - } > - } > - > - if (LastDeviceIndex == DeviceList->NumDevice) { > - break; > - } > - } > - > - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) { > - // > - // delete the variables > - // > - CurMacInfo = &DeviceList->MacInfo[Index]; > - IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo- > >VlanId, MacString); > - gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0, > NULL); > - gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL); > - } > - > - FreePool (DeviceList); > - } else if (Status != EFI_NOT_FOUND) { > - FreePool (Handles); > - return Status; > - } > - // > - // Construct the new iSCSI device list. > - // > - DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof > (ISCSI_MAC_INFO); > - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize); > - ASSERT (DeviceList != NULL); > - DeviceList->NumDevice = (UINT8) NumHandles; > - > - for (Index = 0; Index < NumHandles; Index++) { > - NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize); > - > - CurMacInfo = &DeviceList->MacInfo[Index]; > - CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize); > - CurMacInfo->Len = (UINT8) HwAddressSize; > - CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]); > - } > - > - gRT->SetVariable ( > - L"iSCSIDeviceList", > - &gIp4IScsiConfigGuid, > - ISCSI_CONFIG_VAR_ATTR, > - DeviceListSize, > - DeviceList > - ); > - > - FreePool (DeviceList); > - FreePool (Handles); > - > - return Status; > -} > - > -/** > - Get the iSCSI configuration form entry by the index of the goto opcode > actived. > - > - @param[in] Index The 0-based index of the goto opcode actived. > - > - @return The iSCSI configuration form entry found. > -**/ > -ISCSI_CONFIG_FORM_ENTRY * > -IScsiGetConfigFormEntryByIndex ( > - IN UINT32 Index > - ) > -{ > - UINT32 CurrentIndex; > - LIST_ENTRY *Entry; > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > - > - CurrentIndex = 0; > - ConfigFormEntry = NULL; > - > - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { > - if (CurrentIndex == Index) { > - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, > ISCSI_CONFIG_FORM_ENTRY, Link); > - break; > - } > - > - CurrentIndex++; > - } > - > - return ConfigFormEntry; > -} > - > -/** > - Convert the iSCSI configuration data into the IFR data. > - > - @param[in] ConfigFormEntry The iSCSI configuration form entry. > - @param[out] IfrNvData The IFR nv data. > - > -**/ > -VOID > -IScsiConvertDeviceConfigDataToIfrNvData ( > - IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry, > - OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData > - ) > -{ > - ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData; > - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData; > - > - // > - // Normal session configuration parameters. > - // > - SessionConfigData = &ConfigFormEntry->SessionConfigData; > - IfrNvData->Enabled = SessionConfigData->Enabled; > - > - IfrNvData->InitiatorInfoFromDhcp = SessionConfigData- > >InitiatorInfoFromDhcp; > - IfrNvData->TargetInfoFromDhcp = SessionConfigData- > >TargetInfoFromDhcp; > - IfrNvData->TargetPort = SessionConfigData->TargetPort; > - > - IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp); > - IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask); > - IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway); > - IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp); > - > - IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData- > >TargetName); > - > - IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun); > - > - IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId); > - > - // > - // CHAP authentication parameters. > - // > - AuthConfigData = &ConfigFormEntry->AuthConfigData; > - > - IfrNvData->CHAPType = AuthConfigData->CHAPType; > - > - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData- > >CHAPName); > - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData- > >CHAPSecret); > - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName, > IfrNvData->ReverseCHAPName); > - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, > IfrNvData->ReverseCHAPSecret); > -} > - > -/** > - This function allows the caller to request the current > - configuration for one or more named elements. The resulting > - string is in <ConfigAltResp> format. Any and all alternative > - configuration strings shall also be appended to the end of the > - current configuration string. If they are, they must appear > - after the current configuration. They must contain the same > - routing (GUID, NAME, PATH) as the current configuration string. > - They must have an additional description indicating the type of > - alternative configuration the string represents, > - "ALTCFG=<StringToken>". That <StringToken> (when > - converted from Hex UNICODE to binary) is a reference to a > - string in the associated string pack. > - > - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. > - @param[in] Request A null-terminated Unicode string in > - <ConfigRequest> format. Note that this > - includes the routing information as well as > - the configurable name / value pairs. It is > - invalid for this string to be in > - <MultiConfigRequest> format. > - @param[out] Progress On return, points to a character in the > - Request string. Points to the string's null > - terminator if request was successful. Points > - to the most recent "&" before the first > - failing name / value pair (or the beginning > - of the string if the failure is in the first > - name / value pair) if the request was not > - successful. > - @param[out] Results A null-terminated Unicode string in > - <ConfigAltResp> format which has all values > - filled in for the names in the Request string. > - String to be allocated by the called function. > - > - @retval EFI_SUCCESS The Results string is filled with the > - values corresponding to all requested > - names. > - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the > - parts of the results that must be > - stored awaiting possible future > - protocols. > - @retval EFI_INVALID_PARAMETER For example, passing in a NULL > - for the Request parameter > - would result in this type of > - error. In this case, the > - Progress parameter would be > - set to NULL. > - @retval EFI_NOT_FOUND Routing data doesn't match any > - known driver. Progress set to the > - first character in the routing header. > - Note: There is no requirement that the > - driver validate the routing data. It > - must skip the <ConfigHdr> in order to > - process the names. > - @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set > - to most recent & before the > - error or the beginning of the > - string. > - @retval EFI_INVALID_PARAMETER Unknown name. Progress points > - to the & before the name in > - question.Currently not implemented. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiFormExtractConfig ( > - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, > - IN CONST EFI_STRING Request, > - OUT EFI_STRING *Progress, > - OUT EFI_STRING *Results > - ) > -{ > - EFI_STATUS Status; > - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; > - UINTN BufferSize; > - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; > - ISCSI_FORM_CALLBACK_INFO *Private; > - EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; > - EFI_STRING ConfigRequestHdr; > - EFI_STRING ConfigRequest; > - BOOLEAN AllocatedRequest; > - UINTN Size; > - > - if (Progress == NULL || Results == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - *Progress = Request; > - if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, > &gIp4IScsiConfigGuid, mVendorStorageName)) { > - return EFI_NOT_FOUND; > - } > - > - ConfigRequestHdr = NULL; > - ConfigRequest = NULL; > - AllocatedRequest = FALSE; > - Size = 0; > - > - if (!mIScsiDeviceListUpdated) { > - // > - // Update the device list. > - // > - IScsiUpdateDeviceList (); > - mIScsiDeviceListUpdated = TRUE; > - } > - > - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); > - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); > - ASSERT (IfrNvData != NULL); > - if (Private->Current != NULL) { > - IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData); > - } > - > - BufferSize = ISCSI_NAME_MAX_SIZE; > - Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, > InitiatorName); > - if (EFI_ERROR (Status)) { > - IfrNvData->InitiatorName[0] = L'\0'; > - } else { > - IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName); > - } > - > - // > - // Convert buffer data to <ConfigResp> by helper function BlockToConfig() > - // > - HiiConfigRouting = Private->ConfigRouting; > - BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA); > - ConfigRequest = Request; > - if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) { > - // > - // Request has no request element, construct full request string. > - // Allocate and fill a buffer large enough to hold the <ConfigHdr> template > - // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" > followed by a Null-terminator > - // > - ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid, > mVendorStorageName, Private->DriverHandle); > - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); > - ConfigRequest = AllocateZeroPool (Size); > - ASSERT (ConfigRequest != NULL); > - AllocatedRequest = TRUE; > - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", > ConfigRequestHdr, (UINT64)BufferSize); > - FreePool (ConfigRequestHdr); > - } > - Status = HiiConfigRouting->BlockToConfig ( > - HiiConfigRouting, > - ConfigRequest, > - (UINT8 *) IfrNvData, > - BufferSize, > - Results, > - Progress > - ); > - FreePool (IfrNvData); > - // > - // Free the allocated config request string. > - // > - if (AllocatedRequest) { > - FreePool (ConfigRequest); > - ConfigRequest = NULL; > - } > - > - // > - // Set Progress string to the original request string. > - // > - if (Request == NULL) { > - *Progress = NULL; > - } else if (StrStr (Request, L"OFFSET") == NULL) { > - *Progress = Request + StrLen (Request); > - } > - > - return Status; > -} > - > -/** > - This function applies changes in a driver's configuration. > - Input is a Configuration, which has the routing data for this > - driver followed by name / value configuration pairs. The driver > - must apply those pairs to its configurable storage. If the > - driver's configuration is stored in a linear block of data > - and the driver's name / value pairs are in <BlockConfig> > - format, it may use the ConfigToBlock helper function (above) to > - simplify the job. Currently not implemented. > - > - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. > - @param[in] Configuration A null-terminated Unicode string in > - <ConfigString> format. > - @param[out] Progress A pointer to a string filled in with the > - offset of the most recent '&' before the > - first failing name / value pair (or the > - beginn ing of the string if the failure > - is in the first name / value pair) or > - the terminating NULL if all was > - successful. > - > - @retval EFI_SUCCESS The results have been distributed or are > - awaiting distribution. > - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the > - parts of the results that must be > - stored awaiting possible future > - protocols. > - @retval EFI_INVALID_PARAMETERS Passing in a NULL for the > - Results parameter would result > - in this type of error. > - @retval EFI_NOT_FOUND Target for the specified routing data > - was not found. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiFormRouteConfig ( > - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, > - IN CONST EFI_STRING Configuration, > - OUT EFI_STRING *Progress > - ) > -{ > - if (Configuration == NULL || Progress == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Check routing data in <ConfigHdr>. > - // Note: if only one Storage is used, then this checking could be skipped. > - // > - if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid, > mVendorStorageName)) { > - *Progress = Configuration; > - return EFI_NOT_FOUND; > - } > - > - *Progress = Configuration + StrLen (Configuration); > - return EFI_SUCCESS; > -} > - > -/** > - This function is called to provide results data to the driver. > - This data consists of a unique key that is used to identify > - which data is either being passed back or being asked for. > - > - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. > - @param[in] Action Specifies the type of action taken by the browser. > - @param[in] QuestionId A unique value which is sent to the original > - exporting driver so that it can identify the type > - of data to expect. The format of the data tends to > - vary based on the opcode that enerated the callback. > - @param[in] Type The type of value for the question. > - @param[in] Value A pointer to the data being sent to the original > - exporting driver. > - @param[out] ActionRequest On return, points to the action requested > by the > - callback function. > - > - @retval EFI_SUCCESS The callback successfully handled the action. > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > the > - variable and its data. > - @retval EFI_DEVICE_ERROR The variable could not be saved. > - @retval EFI_UNSUPPORTED The specified Action is not supported by > the > - callback.Currently not implemented. > - @retval EFI_INVALID_PARAMETERS Passing in wrong parameter. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiFormCallback ( > - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, > - IN EFI_BROWSER_ACTION Action, > - IN EFI_QUESTION_ID QuestionId, > - IN UINT8 Type, > - IN EFI_IFR_TYPE_VALUE *Value, > - OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest > - ) > -{ > - ISCSI_FORM_CALLBACK_INFO *Private; > - UINTN BufferSize; > - CHAR8 IScsiName[ISCSI_NAME_MAX_SIZE]; > - CHAR16 PortString[128]; > - CHAR8 Ip4String[IP4_STR_MAX_SIZE]; > - CHAR8 LunString[ISCSI_LUN_STR_MAX_LEN]; > - UINT64 Lun; > - EFI_STRING_ID DeviceFormTitleToken; > - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > - EFI_IP_ADDRESS HostIp; > - EFI_IP_ADDRESS SubnetMask; > - EFI_IP_ADDRESS Gateway; > - EFI_STATUS Status; > - EFI_INPUT_KEY Key; > - > - if (Action != EFI_BROWSER_ACTION_CHANGING && Action != > EFI_BROWSER_ACTION_CHANGED) { > - return EFI_UNSUPPORTED; > - } > - > - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); > - // > - // Retrieve uncommitted data from Browser > - // > - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); > - ASSERT (IfrNvData != NULL); > - if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, > sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) { > - FreePool (IfrNvData); > - return EFI_NOT_FOUND; > - } > - Status = EFI_SUCCESS; > - > - if (Action == EFI_BROWSER_ACTION_CHANGING) { > - if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < > (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) { > - // > - // In case goto the device configuration form, update the device form > title. > - // > - ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) > (QuestionId - KEY_DEVICE_ENTRY_BASE)); > - ASSERT (ConfigFormEntry != NULL); > - > - UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s", > ConfigFormEntry->MacString); > - DeviceFormTitleToken = (EFI_STRING_ID) > STR_ISCSI_DEVICE_FORM_TITLE; > - HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, > PortString, NULL); > - > - IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData); > - > - Private->Current = ConfigFormEntry; > - } > - } else if (Action == EFI_BROWSER_ACTION_CHANGED) { > - switch (QuestionId) { > - case KEY_INITIATOR_NAME: > - IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName); > - BufferSize = AsciiStrSize (IScsiName); > - > - Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, > IScsiName); > - if (EFI_ERROR (Status)) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid iSCSI Name!", NULL); > - } > - > - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; > - break; > - > - case KEY_LOCAL_IP: > - IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String); > - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); > - if (EFI_ERROR (Status) || > - ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && > - !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private- > >Current->SessionConfigData.SubnetMask.Addr)))) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid IP address!", NULL); > - Status = EFI_INVALID_PARAMETER; > - } else { > - CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, > sizeof (HostIp.v4)); > - } > - > - break; > - > - case KEY_SUBNET_MASK: > - IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String); > - Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4); > - if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && > (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid Subnet Mask!", NULL); > - Status = EFI_INVALID_PARAMETER; > - } else { > - CopyMem (&Private->Current->SessionConfigData.SubnetMask, > &SubnetMask.v4, sizeof (SubnetMask.v4)); > - } > - > - break; > - > - case KEY_GATE_WAY: > - IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String); > - Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4); > - if (EFI_ERROR (Status) || > - ((Gateway.Addr[0] != 0) && > - (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && > - !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), > NTOHL(*(UINT32*)Private->Current- > >SessionConfigData.SubnetMask.Addr)))) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid Gateway!", NULL); > - Status = EFI_INVALID_PARAMETER; > - } else { > - CopyMem (&Private->Current->SessionConfigData.Gateway, > &Gateway.v4, sizeof (Gateway.v4)); > - } > - > - break; > - > - case KEY_TARGET_IP: > - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String); > - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); > - if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST > (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid IP address!", NULL); > - Status = EFI_INVALID_PARAMETER; > - } else { > - CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, > sizeof (HostIp.v4)); > - } > - > - break; > - > - case KEY_TARGET_NAME: > - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName); > - Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName)); > - if (EFI_ERROR (Status)) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid iSCSI Name!", NULL); > - } else { > - AsciiStrCpyS (Private->Current->SessionConfigData.TargetName, > ISCSI_NAME_MAX_SIZE, IScsiName); > - } > - > - break; > - > - case KEY_DHCP_ENABLE: > - if (IfrNvData->InitiatorInfoFromDhcp == 0) { > - IfrNvData->TargetInfoFromDhcp = 0; > - } > - > - break; > - > - case KEY_BOOT_LUN: > - IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString); > - Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun); > - if (EFI_ERROR (Status)) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Invalid LUN string!", NULL); > - } else { > - CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof > (Lun)); > - } > - > - break; > - > - case KEY_CHAP_NAME: > - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current- > >AuthConfigData.CHAPName); > - break; > - > - case KEY_CHAP_SECRET: > - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current- > >AuthConfigData.CHAPSecret); > - break; > - > - case KEY_REVERSE_CHAP_NAME: > - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private- > >Current->AuthConfigData.ReverseCHAPName); > - break; > - > - case KEY_REVERSE_CHAP_SECRET: > - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private- > >Current->AuthConfigData.ReverseCHAPSecret); > - break; > - > - case KEY_CONFIG_ISID: > - IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current- > >SessionConfigData.IsId); > - IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current- > >SessionConfigData.IsId); > - > - break; > - > - case KEY_SAVE_CHANGES: > - // > - // First, update those fields which don't have INTERACTIVE set. > - // > - Private->Current->SessionConfigData.Enabled = IfrNvData- > >Enabled; > - Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData- > >InitiatorInfoFromDhcp; > - Private->Current->SessionConfigData.TargetPort = IfrNvData- > >TargetPort; > - if (Private->Current->SessionConfigData.TargetPort == 0) { > - Private->Current->SessionConfigData.TargetPort = > ISCSI_WELL_KNOWN_PORT; > - } > - > - Private->Current->SessionConfigData.TargetInfoFromDhcp = IfrNvData- > >TargetInfoFromDhcp; > - Private->Current->AuthConfigData.CHAPType = IfrNvData- > >CHAPType; > - > - // > - // Only do full parameter validation if iSCSI is enabled on this device. > - // > - if (Private->Current->SessionConfigData.Enabled) { > - // > - // Validate the address configuration of the Initiator if DHCP isn't > - // deployed. > - // > - if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) { > - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp, > sizeof (HostIp.v4)); > - CopyMem (&SubnetMask.v4, &Private->Current- > >SessionConfigData.SubnetMask, sizeof (SubnetMask.v4)); > - CopyMem (&Gateway.v4, &Private->Current- > >SessionConfigData.Gateway, sizeof (Gateway.v4)); > - > - if ((Gateway.Addr[0] != 0)) { > - if (SubnetMask.Addr[0] == 0) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Gateway address is set but subnet mask is zero.", NULL); > - Status = EFI_INVALID_PARAMETER; > - break; > - } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], > SubnetMask.Addr[0])) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Local IP and Gateway are not in the same subnet.", NULL); > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - } > - } > - // > - // Validate target configuration if DHCP isn't deployed. > - // > - if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) { > - CopyMem (&HostIp.v4, &Private->Current- > >SessionConfigData.TargetIp, sizeof (HostIp.v4)); > - if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || > IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Target IP is invalid!", NULL); > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - > - // > - // Validate iSCSI target name configuration again: > - // The format of iSCSI target name is already verified when user input > the name; > - // here we only check the case user does not input the name. > - // > - if (Private->Current->SessionConfigData.TargetName[0] == '\0') { > - CreatePopUp ( > - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, > - &Key, > - L"iSCSI target name is NULL!", > - NULL > - ); > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - > - } > - > - if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) { > - if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == > '\0')) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"CHAP Name or CHAP Secret is invalid!", NULL); > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - > - if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) && > - ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData- > >ReverseCHAPSecret[0] == '\0')) > - ) { > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL); > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - } > - } > - > - BufferSize = sizeof (Private->Current->SessionConfigData); > - gRT->SetVariable ( > - Private->Current->MacString, > - &gEfiIScsiInitiatorNameProtocolGuid, > - ISCSI_CONFIG_VAR_ATTR, > - BufferSize, > - &Private->Current->SessionConfigData > - ); > - > - BufferSize = sizeof (Private->Current->AuthConfigData); > - gRT->SetVariable ( > - Private->Current->MacString, > - &gIScsiCHAPAuthInfoGuid, > - ISCSI_CONFIG_VAR_ATTR, > - BufferSize, > - &Private->Current->AuthConfigData > - ); > - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; > - break; > - > - default: > - break; > - } > - } > - > - if (!EFI_ERROR (Status)) { > - // > - // Pass changed uncommitted data back to Form Browser > - // > - HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof > (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL); > - } > - > - FreePool (IfrNvData); > - > - return Status; > -} > - > -/** > - Updates the iSCSI configuration form to add/delete an entry for the iSCSI > - device specified by the Controller. > - > - @param[in] DriverBindingHandle The driverbinding handle. > - @param[in] Controller The controller handle of the iSCSI device. > - @param[in] AddForm Whether to add or delete a form entry. > - > - @retval EFI_SUCCESS The iSCSI configuration form is updated. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiConfigUpdateForm ( > - IN EFI_HANDLE DriverBindingHandle, > - IN EFI_HANDLE Controller, > - IN BOOLEAN AddForm > - ) > -{ > - LIST_ENTRY *Entry; > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > - BOOLEAN EntryExisted; > - EFI_STATUS Status; > - EFI_MAC_ADDRESS MacAddress; > - UINTN HwAddressSize; > - UINT16 VlanId; > - CHAR16 PortString[128]; > - UINT16 FormIndex; > - UINTN BufferSize; > - VOID *StartOpCodeHandle; > - VOID *EndOpCodeHandle; > - EFI_IFR_GUID_LABEL *StartLabel; > - EFI_IFR_GUID_LABEL *EndLabel; > - > - ConfigFormEntry = NULL; > - EntryExisted = FALSE; > - > - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { > - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, > ISCSI_CONFIG_FORM_ENTRY, Link); > - > - if (ConfigFormEntry->Controller == Controller) { > - EntryExisted = TRUE; > - break; > - } > - } > - > - if (AddForm) { > - if (EntryExisted) { > - return EFI_SUCCESS; > - } else { > - // > - // Add a new form. > - // > - ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool > (sizeof (ISCSI_CONFIG_FORM_ENTRY)); > - if (ConfigFormEntry == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - InitializeListHead (&ConfigFormEntry->Link); > - ConfigFormEntry->Controller = Controller; > - > - // > - // Get the MAC address and convert it into the formatted string. > - // > - Status = NetLibGetMacAddress (Controller, &MacAddress, > &HwAddressSize); > - ASSERT (Status == EFI_SUCCESS); > - VlanId = NetLibGetVlanId (Controller); > - > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > ConfigFormEntry->MacString); > - > - // > - // Get the normal session configuration data. > - // > - BufferSize = sizeof (ConfigFormEntry->SessionConfigData); > - Status = gRT->GetVariable ( > - ConfigFormEntry->MacString, > - &gEfiIScsiInitiatorNameProtocolGuid, > - NULL, > - &BufferSize, > - &ConfigFormEntry->SessionConfigData > - ); > - if (EFI_ERROR (Status)) { > - ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof > (ConfigFormEntry->SessionConfigData)); > - > - // > - // Generate OUI-format ISID based on MAC address. > - // > - CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6); > - ConfigFormEntry->SessionConfigData.IsId[0] = > - (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F); > - } > - // > - // Get the CHAP authentication configuration data. > - // > - BufferSize = sizeof (ConfigFormEntry->AuthConfigData); > - Status = gRT->GetVariable ( > - ConfigFormEntry->MacString, > - &gIScsiCHAPAuthInfoGuid, > - NULL, > - &BufferSize, > - &ConfigFormEntry->AuthConfigData > - ); > - if (EFI_ERROR (Status)) { > - ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof > (ConfigFormEntry->AuthConfigData)); > - } > - // > - // Compose the Port string and create a new EFI_STRING_ID. > - // > - UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", > ConfigFormEntry->MacString); > - ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo- > >RegisteredHandle, 0, PortString, NULL); > - > - // > - // Compose the help string of this port and create a new EFI_STRING_ID. > - // > - UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters > on port %s", ConfigFormEntry->MacString); > - ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo- > >RegisteredHandle, 0, PortString, NULL); > - > - InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link); > - mNumberOfIScsiDevices++; > - } > - } else { > - ASSERT (EntryExisted); > - > - mNumberOfIScsiDevices--; > - RemoveEntryList (&ConfigFormEntry->Link); > - FreePool (ConfigFormEntry); > - mCallbackInfo->Current = NULL; > - } > - // > - // Allocate space for creation of Buffer > - // > - > - // > - // Init OpCode Handle > - // > - StartOpCodeHandle = HiiAllocateOpCodeHandle (); > - ASSERT (StartOpCodeHandle != NULL); > - > - EndOpCodeHandle = HiiAllocateOpCodeHandle (); > - ASSERT (EndOpCodeHandle != NULL); > - > - // > - // Create Hii Extend Label OpCode as the start opcode > - // > - StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode > (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof > (EFI_IFR_GUID_LABEL)); > - StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; > - StartLabel->Number = DEVICE_ENTRY_LABEL; > - > - // > - // Create Hii Extend Label OpCode as the end opcode > - // > - EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode > (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); > - EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; > - EndLabel->Number = LABEL_END; > - > - FormIndex = 0; > - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { > - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, > ISCSI_CONFIG_FORM_ENTRY, Link); > - > - HiiCreateGotoOpCode ( > - StartOpCodeHandle, // Container for dynamic created > opcodes > - FORMID_DEVICE_FORM, // Target Form ID > - ConfigFormEntry->PortTitleToken, // Prompt text > - ConfigFormEntry->PortTitleHelpToken, // Help text > - EFI_IFR_FLAG_CALLBACK, // Question flag > - (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID > - ); > - > - FormIndex++; > - } > - > - HiiUpdateForm ( > - mCallbackInfo->RegisteredHandle, > - &gIp4IScsiConfigGuid, > - FORMID_MAIN_FORM, > - StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL > - EndOpCodeHandle // LABEL_END > - ); > - > - HiiFreeOpCodeHandle (StartOpCodeHandle); > - HiiFreeOpCodeHandle (EndOpCodeHandle); > - > - return EFI_SUCCESS; > -} > - > -/** > - Initialize the iSCSI configuration form. > - > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > - > - @retval EFI_SUCCESS The iSCSI configuration form is initialized. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiConfigFormInit ( > - VOID > - ) > -{ > - EFI_STATUS Status; > - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; > - ISCSI_FORM_CALLBACK_INFO *CallbackInfo; > - > - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID > **)&HiiDatabase); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof > (ISCSI_FORM_CALLBACK_INFO)); > - if (CallbackInfo == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - CallbackInfo->Signature = ISCSI_FORM_CALLBACK_INFO_SIGNATURE; > - CallbackInfo->HiiDatabase = HiiDatabase; > - CallbackInfo->Current = NULL; > - > - CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig; > - CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig; > - CallbackInfo->ConfigAccess.Callback = IScsiFormCallback; > - > - Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, > (VOID **)&CallbackInfo->ConfigRouting); > - if (EFI_ERROR (Status)) { > - FreePool(CallbackInfo); > - return Status; > - } > - > - // > - // Install Device Path Protocol and Config Access protocol to driver handle > - // > - Status = gBS->InstallMultipleProtocolInterfaces ( > - &CallbackInfo->DriverHandle, > - &gEfiDevicePathProtocolGuid, > - &mIScsiHiiVendorDevicePath, > - &gEfiHiiConfigAccessProtocolGuid, > - &CallbackInfo->ConfigAccess, > - NULL > - ); > - ASSERT_EFI_ERROR (Status); > - > - // > - // Publish our HII data > - // > - CallbackInfo->RegisteredHandle = HiiAddPackages ( > - &gIp4IScsiConfigGuid, > - CallbackInfo->DriverHandle, > - IScsi4DxeStrings, > - IScsiConfigDxeBin, > - NULL > - ); > - if (CallbackInfo->RegisteredHandle == NULL) { > - FreePool(CallbackInfo); > - return EFI_OUT_OF_RESOURCES; > - } > - > - mCallbackInfo = CallbackInfo; > - > - return Status; > -} > - > -/** > - Unload the iSCSI configuration form, this includes: delete all the iSCSI > - device configuration entries, uninstall the form callback protocol and > - free the resources used. > - > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > - > - @retval EFI_SUCCESS The iSCSI configuration form is unloaded. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > -**/ > -EFI_STATUS > -IScsiConfigFormUnload ( > - IN EFI_HANDLE DriverBindingHandle > - ) > -{ > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > - > - while (!IsListEmpty (&mIScsiConfigFormList)) { > - // > - // Uninstall the device forms as the iSCSI driver instance may fail to > - // control the controller but still install the device configuration form. > - // In such case, upon driver unloading, the driver instance's driverbinding. > - // stop () won't be called, so we have to take this chance here to uninstall > - // the device form. > - // > - ConfigFormEntry = NET_LIST_USER_STRUCT > (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link); > - IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry- > >Controller, FALSE); > - } > - > - // > - // Remove HII package list > - // > - mCallbackInfo->HiiDatabase->RemovePackageList ( > - mCallbackInfo->HiiDatabase, > - mCallbackInfo->RegisteredHandle > - ); > - > - // > - // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL > - // > - gBS->UninstallMultipleProtocolInterfaces ( > - mCallbackInfo->DriverHandle, > - &gEfiDevicePathProtocolGuid, > - &mIScsiHiiVendorDevicePath, > - &gEfiHiiConfigAccessProtocolGuid, > - &mCallbackInfo->ConfigAccess, > - NULL > - ); > - FreePool (mCallbackInfo); > - > - return EFI_SUCCESS; > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > deleted file mode 100644 > index 6a876c8b69dd..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > +++ /dev/null > @@ -1,472 +0,0 @@ > -/** @file > - iSCSI DHCP related configuration routines. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -/** > - Extract the Root Path option and get the required target information. > - > - @param[in] RootPath The RootPath. > - @param[in] Length Length of the RootPath option payload. > - @param[in, out] ConfigNvData The iSCSI session configuration data read > from nonvolatile device. > - > - @retval EFI_SUCCESS All required information is extracted from the > RootPath option. > - @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted. > -**/ > -EFI_STATUS > -IScsiDhcpExtractRootPath ( > - IN CHAR8 *RootPath, > - IN UINT8 Length, > - IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData > - ) > -{ > - EFI_STATUS Status; > - UINT8 IScsiRootPathIdLen; > - CHAR8 *TmpStr; > - ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX]; > - ISCSI_ROOT_PATH_FIELD *Field; > - UINT32 FieldIndex; > - UINT8 Index; > - > - // > - // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname> > - // > - IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID); > - > - if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, > ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) { > - return EFI_NOT_FOUND; > - } > - // > - // Skip the iSCSI RootPath ID "iscsi:". > - // > - RootPath += IScsiRootPathIdLen; > - Length = (UINT8) (Length - IScsiRootPathIdLen); > - > - TmpStr = (CHAR8 *) AllocatePool (Length + 1); > - if (TmpStr == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - CopyMem (TmpStr, RootPath, Length); > - TmpStr[Length] = '\0'; > - > - Index = 0; > - FieldIndex = RP_FIELD_IDX_SERVERNAME; > - ZeroMem (&Fields[0], sizeof (Fields)); > - > - // > - // Extract the fields in the Root Path option string. > - // > - for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < > RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) { > - if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) { > - Fields[FieldIndex].Str = &TmpStr[Index]; > - } > - > - while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index > < Length)) { > - Index++; > - } > - > - if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) { > - if (FieldIndex != RP_FIELD_IDX_TARGETNAME) { > - TmpStr[Index] = '\0'; > - Index++; > - } > - > - if (Fields[FieldIndex].Str != NULL) { > - Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str); > - } > - } > - } > - > - if (FieldIndex != RP_FIELD_IDX_MAX) { > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - > - if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) || > - (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) || > - (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1) > - ) { > - > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - // > - // Get the IP address of the target. > - // > - Field = &Fields[RP_FIELD_IDX_SERVERNAME]; > - Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - // > - // Check the protocol type. > - // > - Field = &Fields[RP_FIELD_IDX_PROTOCOL]; > - if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) { > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - // > - // Get the port of the iSCSI target. > - // > - Field = &Fields[RP_FIELD_IDX_PORT]; > - if (Field->Str != NULL) { > - ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str); > - } else { > - ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT; > - } > - // > - // Get the LUN. > - // > - Field = &Fields[RP_FIELD_IDX_LUN]; > - if (Field->Str != NULL) { > - Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - } else { > - ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun)); > - } > - // > - // Get the target iSCSI Name. > - // > - Field = &Fields[RP_FIELD_IDX_TARGETNAME]; > - > - if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) { > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - // > - // Validate the iSCSI name. > - // > - Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str)); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field- > >Str); > - > -ON_EXIT: > - > - FreePool (TmpStr); > - > - return Status; > -} > - > -/** > - The callback function registerd to the DHCP4 instance which is used to > select > - the qualified DHCP OFFER. > - > - @param[in] This The DHCP4 protocol. > - @param[in] Context The context set when configuring the DHCP4 > protocol. > - @param[in] CurrentState The current state of the DHCP4 protocol. > - @param[in] Dhcp4Event The event occurs in the current state. > - @param[in] Packet The DHCP packet that is to be sent or already > received. > - @param[out] NewPacket The packet used to replace the above Packet. > - > - @retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're not > intereseted > - in the Dhcp4Event. > - @retval EFI_NOT_READY The DHCP OFFER packet doesn't match our > requirements. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDhcpSelectOffer ( > - IN EFI_DHCP4_PROTOCOL * This, > - IN VOID *Context, > - IN EFI_DHCP4_STATE CurrentState, > - IN EFI_DHCP4_EVENT Dhcp4Event, > - IN EFI_DHCP4_PACKET * Packet, OPTIONAL > - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL > - ) > -{ > - EFI_STATUS Status; > - UINT32 OptionCount; > - EFI_DHCP4_PACKET_OPTION **OptionList; > - UINT32 Index; > - > - if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) > { > - return EFI_SUCCESS; > - } > - > - OptionCount = 0; > - > - Status = This->Parse (This, Packet, &OptionCount, NULL); > - if (Status != EFI_BUFFER_TOO_SMALL) { > - return EFI_NOT_READY; > - } > - > - OptionList = AllocatePool (OptionCount * sizeof > (EFI_DHCP4_PACKET_OPTION *)); > - if (OptionList == NULL) { > - return EFI_NOT_READY; > - } > - > - Status = This->Parse (This, Packet, &OptionCount, OptionList); > - if (EFI_ERROR (Status)) { > - FreePool (OptionList); > - return EFI_NOT_READY; > - } > - > - for (Index = 0; Index < OptionCount; Index++) { > - if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) { > - continue; > - } > - > - Status = IScsiDhcpExtractRootPath ( > - (CHAR8 *) &OptionList[Index]->Data[0], > - OptionList[Index]->Length, > - (ISCSI_SESSION_CONFIG_NVDATA *) Context > - ); > - > - break; > - } > - > - if (Index == OptionCount) { > - Status = EFI_NOT_READY; > - } > - > - FreePool (OptionList); > - > - return Status; > -} > - > -/** > - Parse the DHCP ACK to get the address configuration and DNS information. > - > - @param[in] Dhcp4 The DHCP4 protocol. > - @param[in, out] ConfigData The session configuration data. > - > - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. > - @retval EFI_NO_MAPPING DHCP failed to acquire address and other > information. > - @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal- > formatted. > - @retval EFI_DEVICE_ERROR Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiParseDhcpAck ( > - IN EFI_DHCP4_PROTOCOL *Dhcp4, > - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData > - ) > -{ > - EFI_STATUS Status; > - EFI_DHCP4_MODE_DATA Dhcp4ModeData; > - UINT32 OptionCount; > - EFI_DHCP4_PACKET_OPTION **OptionList; > - UINT32 Index; > - > - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - if (Dhcp4ModeData.State != Dhcp4Bound) { > - return EFI_NO_MAPPING; > - } > - > - CopyMem (&ConfigData->NvData.LocalIp, > &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&ConfigData->NvData.SubnetMask, > &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&ConfigData->NvData.Gateway, > &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS)); > - > - OptionCount = 0; > - OptionList = NULL; > - > - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, > &OptionCount, OptionList); > - if (Status != EFI_BUFFER_TOO_SMALL) { > - return EFI_DEVICE_ERROR; > - } > - > - OptionList = AllocatePool (OptionCount * sizeof > (EFI_DHCP4_PACKET_OPTION *)); > - if (OptionList == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, > &OptionCount, OptionList); > - if (EFI_ERROR (Status)) { > - FreePool (OptionList); > - return EFI_DEVICE_ERROR; > - } > - > - for (Index = 0; Index < OptionCount; Index++) { > - // > - // Get DNS server addresses and DHCP server address from this offer. > - // > - if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) { > - > - if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]- > >Length == 0)) { > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - // > - // Primary DNS server address. > - // > - CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], > sizeof (EFI_IPv4_ADDRESS)); > - > - if (OptionList[Index]->Length > 4) { > - // > - // Secondary DNS server address > - // > - CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4], > sizeof (EFI_IPv4_ADDRESS)); > - } > - } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) { > - if (OptionList[Index]->Length != 4) { > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - > - CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], > sizeof (EFI_IPv4_ADDRESS)); > - } > - } > - > - FreePool (OptionList); > - > - return Status; > -} > - > -/** > - Parse the DHCP ACK to get the address configuration and DNS information. > - > - @param[in] Image The handle of the driver image. > - @param[in] Controller The handle of the controller; > - @param[in, out] ConfigData The session configuration data. > - > - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NO_MEDIA There was a media error. > - @retval Others Other errors as indicated. > - > -**/ > -EFI_STATUS > -IScsiDoDhcp ( > - IN EFI_HANDLE Image, > - IN EFI_HANDLE Controller, > - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData > - ) > -{ > - EFI_HANDLE Dhcp4Handle; > - EFI_DHCP4_PROTOCOL *Dhcp4; > - EFI_STATUS Status; > - EFI_DHCP4_PACKET_OPTION *ParaList; > - EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData; > - EFI_STATUS MediaStatus; > - UINT8 *Data; > - > - Dhcp4Handle = NULL; > - Dhcp4 = NULL; > - ParaList = NULL; > - > - // > - // Check media status before do DHCP > - // > - MediaStatus = EFI_SUCCESS; > - NetLibDetectMediaWaitTimeout (Controller, > ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus); > - if (MediaStatus != EFI_SUCCESS) { > - return EFI_NO_MEDIA; > - } > - > - // > - // Create a DHCP4 child instance and get the protocol. > - // > - Status = NetLibCreateServiceChild ( > - Controller, > - Image, > - &gEfiDhcp4ServiceBindingProtocolGuid, > - &Dhcp4Handle > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Status = gBS->OpenProtocol ( > - Dhcp4Handle, > - &gEfiDhcp4ProtocolGuid, > - (VOID **)&Dhcp4, > - Image, > - Controller, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3); > - if (ParaList == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ON_EXIT; > - } > - // > - // Ask the server to reply with Netmask, Router, DNS and RootPath options. > - // > - ParaList->OpCode = DHCP4_TAG_PARA_LIST; > - ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 : > 3); > - Data = &ParaList->Data[0]; > - Data[0] = DHCP4_TAG_NETMASK; > - Data[1] = DHCP4_TAG_ROUTER; > - Data[2] = DHCP4_TAG_DNS_SERVER; > - Data[3] = DHCP4_TAG_ROOTPATH; > - > - ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA)); > - Dhcp4ConfigData.OptionCount = 1; > - Dhcp4ConfigData.OptionList = &ParaList; > - > - if (ConfigData->NvData.TargetInfoFromDhcp) { > - // > - // Use callback to select an offer which contains target information. > - // > - Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer; > - Dhcp4ConfigData.CallbackContext = &ConfigData->NvData; > - } > - > - Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - Status = Dhcp4->Start (Dhcp4, NULL); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - // > - // Parse the ACK to get required information. > - // > - Status = IScsiParseDhcpAck (Dhcp4, ConfigData); > - > -ON_EXIT: > - > - if (ParaList != NULL) { > - FreePool (ParaList); > - } > - > - if (Dhcp4 != NULL) { > - Dhcp4->Stop (Dhcp4); > - Dhcp4->Configure (Dhcp4, NULL); > - > - gBS->CloseProtocol ( > - Dhcp4Handle, > - &gEfiDhcp4ProtocolGuid, > - Image, > - Controller > - ); > - } > - > - NetLibDestroyServiceChild ( > - Controller, > - Image, > - &gEfiDhcp4ServiceBindingProtocolGuid, > - Dhcp4Handle > - ); > - > - return Status; > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > deleted file mode 100644 > index 730f3e506bbc..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > +++ /dev/null > @@ -1,676 +0,0 @@ > -/** @file > - The entry point of IScsi driver. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = { > - IScsiDriverBindingSupported, > - IScsiDriverBindingStart, > - IScsiDriverBindingStop, > - 0xa, > - NULL, > - NULL > -}; > - > -/** > - Tests to see if this driver supports the RemainingDevicePath. > - > - @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. This > - parameter is ignored by device drivers, and is optional for > bus > - drivers. For bus drivers, if this parameter is not NULL, then > - the bus driver must determine if the bus controller > specified > - by ControllerHandle and the child controller specified > - by RemainingDevicePath are both supported by this > - bus driver. > - > - @retval EFI_SUCCESS The RemainingDevicePath is supported or > NULL. > - @retval EFI_UNSUPPORTED The device specified by ControllerHandle > and > - RemainingDevicePath is not supported by the driver > specified by This. > -**/ > -EFI_STATUS > -IScsiIsDevicePathSupported ( > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ) > -{ > - EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath; > - > - CurrentDevicePath = RemainingDevicePath; > - if (CurrentDevicePath != NULL) { > - while (!IsDevicePathEnd (CurrentDevicePath)) { > - if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && > (CurrentDevicePath->SubType == MSG_ISCSI_DP)) { > - return EFI_SUCCESS; > - } > - > - CurrentDevicePath = NextDevicePathNode (CurrentDevicePath); > - } > - > - return EFI_UNSUPPORTED; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Tests to see if this driver supports a given controller. If a child device is > provided, > - it further tests to see if this driver supports creating a handle for the > specified child device. > - > - @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > - @param[in] ControllerHandle The handle of the controller to test. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is optional > for bus drivers. > - > - > - @retval EFI_SUCCESS The device specified by ControllerHandle and > - RemainingDevicePath is supported by the driver specified > by This. > - @retval EFI_ALREADY_STARTED The device specified by > ControllerHandle and > - RemainingDevicePath is already being managed by the > driver > - specified by This. > - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > and > - RemainingDevicePath is already being managed by a > different > - driver or an application that requires exclusive acces. > - Currently not implemented. > - @retval EFI_UNSUPPORTED The device specified by ControllerHandle > and > - RemainingDevicePath is not supported by the driver > specified by This. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDriverBindingSupported ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ) > -{ > - EFI_STATUS Status; > - > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiCallerIdGuid, > - NULL, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > - ); > - if (!EFI_ERROR (Status)) { > - return EFI_ALREADY_STARTED; > - } > - > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiTcp4ServiceBindingProtocolGuid, > - NULL, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - return EFI_UNSUPPORTED; > - } > - > - Status = IScsiIsDevicePathSupported (RemainingDevicePath); > - if (EFI_ERROR (Status)) { > - return EFI_UNSUPPORTED; > - } > - > - if (IScsiDhcpIsConfigured (ControllerHandle)) { > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiDhcp4ServiceBindingProtocolGuid, > - NULL, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - return EFI_UNSUPPORTED; > - } > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Start this driver on ControllerHandle. > - > - The Start() function is designed to be invoked from the EFI boot service > ConnectController(). > - As a result, much of the error checking on the parameters to Start() has > been moved into this > - common boot service. It is legal to call Start() from other locations, but the > following calling > - restrictions must be followed or the system behavior will not be > deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE. > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > naturally aligned > - EFI_DEVICE_PATH_PROTOCOL. > - 3. Prior to calling Start(), the Supported() function for the driver specified > by This must > - have been called with the same calling parameters, and Supported() must > have returned EFI_SUCCESS. > - > - @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > - @param[in] ControllerHandle The handle of the controller to start. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is optional > for bus drivers. > - > - @retval EFI_SUCCESS The device was started. > - @retval EFI_DEVICE_ERROR The device could not be started due to a > device error. > - Currently not implemented. > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > due to a lack of resources. > - @retval Others The driver failded to start the device. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDriverBindingStart ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ) > -{ > - EFI_STATUS Status; > - ISCSI_DRIVER_DATA *Private; > - VOID *Interface; > - > - Private = IScsiCreateDriverData (This->DriverBindingHandle, > ControllerHandle); > - if (Private == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Create a underlayer child instance, but not need to configure it. Just > open ChildHandle > - // via BY_DRIVER. That is, establishing the relationship between > ControllerHandle and ChildHandle. > - // Therefore, when DisconnectController(), especially VLAN virtual > controller handle, > - // IScsiDriverBindingStop() will be called. > - // > - Status = NetLibCreateServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiTcp4ServiceBindingProtocolGuid, > - &Private->ChildHandle > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->OpenProtocol ( > - Private->ChildHandle, > - &gEfiTcp4ProtocolGuid, > - &Interface, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - // > - // Always install private protocol no matter what happens later. We need > to > - // keep the relationship between ControllerHandle and ChildHandle. > - // > - Status = gBS->InstallProtocolInterface ( > - &ControllerHandle, > - &gEfiCallerIdGuid, > - EFI_NATIVE_INTERFACE, > - &Private->IScsiIdentifier > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - // > - // Try to add a port configuration page for this controller. > - // > - IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, > TRUE); > - > - // > - // Get the iSCSI configuration data of this controller. > - // > - Status = IScsiGetConfigData (Private); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - // > - // Try to login and create an iSCSI session according to the configuration. > - // > - Status = IScsiSessionLogin (Private); > - if (Status == EFI_MEDIA_CHANGED) { > - // > - // The specified target is not available and the redirection information is > - // got, login the session again with the updated target address. > - // > - Status = IScsiSessionLogin (Private); > - } > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - // > - // Duplicate the Session's tcp connection device path. The source port field > - // will be set to zero as one iSCSI session is comprised of several iSCSI > - // connections. > - // > - Private->DevicePath = IScsiGetTcpConnDevicePath (Private); > - if (Private->DevicePath == NULL) { > - goto ON_ERROR; > - } > - // > - // Install the updated device path onto the ExtScsiPassThruHandle. > - // > - Status = gBS->InstallProtocolInterface ( > - &Private->ExtScsiPassThruHandle, > - &gEfiDevicePathProtocolGuid, > - EFI_NATIVE_INTERFACE, > - Private->DevicePath > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - // > - // ISCSI children should share the default Tcp child, just open the default > Tcp child via BY_CHILD_CONTROLLER. > - // > - Status = gBS->OpenProtocol ( > - Private->ChildHandle, /// Default Tcp child > - &gEfiTcp4ProtocolGuid, > - &Interface, > - This->DriverBindingHandle, > - Private->ExtScsiPassThruHandle, > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > - ); > - if (EFI_ERROR (Status)) { > - gBS->UninstallMultipleProtocolInterfaces ( > - Private->ExtScsiPassThruHandle, > - &gEfiExtScsiPassThruProtocolGuid, > - &Private->IScsiExtScsiPassThru, > - &gEfiDevicePathProtocolGuid, > - Private->DevicePath, > - NULL > - ); > - > - goto ON_ERROR; > - } > - > - // > - // Update/Publish the iSCSI Boot Firmware Table. > - // > - IScsiPublishIbft (); > - > - return EFI_SUCCESS; > - > -ON_ERROR: > - > - IScsiSessionAbort (&Private->Session); > - > - return Status; > -} > - > -/** > - Stop this driver on ControllerHandle. > - > - Release the control of this controller and remove the IScsi functions. The > Stop() > - function is designed to be invoked from the EFI boot service > DisconnectController(). > - As a result, much of the error checking on the parameters to Stop() has > been moved > - into this common boot service. It is legal to call Stop() from other locations, > - but the following calling restrictions must be followed or the system > behavior will not be deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > previous call to this > - same driver's Start() function. > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a > valid > - EFI_HANDLE. In addition, all of these handles must have been created in > this driver's > - Start() function, and the Start() function must have called OpenProtocol() > on > - ControllerHandle with an Attribute of > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > - > - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param[in] ControllerHandle A handle to the device being stopped. The > handle must > - support a bus specific I/O protocol for the driver > - to use to stop the device. > - @param[in] NumberOfChildren The number of child device handles in > ChildHandleBuffer.Not used. > - @param[in] ChildHandleBuffer An array of child handles to be freed. May > be NULL > - if NumberOfChildren is 0.Not used. > - > - @retval EFI_SUCCESS The device was stopped. > - @retval EFI_DEVICE_ERROR The device could not be stopped due to a > device error. > - @retval EFI_INVALID_PARAMETER Child handle is NULL. > - @retval EFI_ACCESS_DENIED The protocol could not be removed from > the Handle > - because its interfaces are being used. > - > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDriverBindingStop ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN UINTN NumberOfChildren, > - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL > - ) > -{ > - EFI_HANDLE IScsiController; > - EFI_STATUS Status; > - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; > - ISCSI_DRIVER_DATA *Private; > - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru; > - ISCSI_CONNECTION *Conn; > - > - if (NumberOfChildren != 0) { > - // > - // We should have only one child. > - // > - Status = gBS->OpenProtocol ( > - ChildHandleBuffer[0], > - &gEfiExtScsiPassThruProtocolGuid, > - (VOID **) &PassThru, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - return EFI_DEVICE_ERROR; > - } > - > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); > - Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, > Link); > - > - // > - // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just > close > - // the protocol here but not uninstall the device path protocol and > - // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle. > - // > - gBS->CloseProtocol ( > - Private->ChildHandle, > - &gEfiTcp4ProtocolGuid, > - Private->Image, > - Private->ExtScsiPassThruHandle > - ); > - > - gBS->CloseProtocol ( > - Conn->Tcp4Io.Handle, > - &gEfiTcp4ProtocolGuid, > - Private->Image, > - Private->ExtScsiPassThruHandle > - ); > - > - return EFI_SUCCESS; > - } > - // > - // Get the handle of the controller we are controling. > - // > - IScsiController = NetLibGetNicHandle (ControllerHandle, > &gEfiTcp4ProtocolGuid); > - > - Status = gBS->OpenProtocol ( > - IScsiController, > - &gEfiCallerIdGuid, > - (VOID **)&IScsiIdentifier, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - return EFI_DEVICE_ERROR; > - } > - > - Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); > - > - if (Private->ChildHandle != NULL) { > - Status = gBS->CloseProtocol ( > - Private->ChildHandle, > - &gEfiTcp4ProtocolGuid, > - This->DriverBindingHandle, > - IScsiController > - ); > - > - ASSERT (!EFI_ERROR (Status)); > - > - Status = NetLibDestroyServiceChild ( > - IScsiController, > - This->DriverBindingHandle, > - &gEfiTcp4ServiceBindingProtocolGuid, > - Private->ChildHandle > - ); > - ASSERT (!EFI_ERROR (Status)); > - } > - > - IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE); > - > - // > - // Uninstall the private protocol. > - // > - gBS->UninstallProtocolInterface ( > - IScsiController, > - &gEfiCallerIdGuid, > - &Private->IScsiIdentifier > - ); > - > - // > - // Update the iSCSI Boot Firware Table. > - // > - IScsiPublishIbft (); > - > - IScsiSessionAbort (&Private->Session); > - Status = IScsiCleanDriverData (Private); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Unloads an image(the iSCSI driver). > - > - @param[in] ImageHandle Handle that identifies the image to be > unloaded. > - > - @retval EFI_SUCCESS The image has been unloaded. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -EfiIScsiUnload ( > - IN EFI_HANDLE ImageHandle > - ) > -{ > - EFI_STATUS Status; > - UINTN DeviceHandleCount; > - EFI_HANDLE *DeviceHandleBuffer; > - UINTN Index; > - EFI_COMPONENT_NAME_PROTOCOL *ComponentName; > - EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; > - > - // > - // Try to disonnect the driver from the devices it's controlling. > - // > - Status = gBS->LocateHandleBuffer ( > - AllHandles, > - NULL, > - NULL, > - &DeviceHandleCount, > - &DeviceHandleBuffer > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - for (Index = 0; Index < DeviceHandleCount; Index++) { > - Status = IScsiTestManagedDevice ( > - DeviceHandleBuffer[Index], > - gIScsiDriverBinding.DriverBindingHandle, > - &gEfiTcp4ProtocolGuid > - ); > - if (EFI_ERROR (Status)) { > - continue; > - } > - Status = gBS->DisconnectController ( > - DeviceHandleBuffer[Index], > - gIScsiDriverBinding.DriverBindingHandle, > - NULL > - ); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - } > - > - // > - // Unload the iSCSI configuration form. > - // > - Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - // > - // Uninstall the ComponentName and ComponentName2 protocol from > iSCSI4 driver binding handle > - // if it has been installed. > - // > - Status = gBS->HandleProtocol ( > - gIScsiDriverBinding.DriverBindingHandle, > - &gEfiComponentNameProtocolGuid, > - (VOID **) &ComponentName > - ); > - if (!EFI_ERROR (Status)) { > - Status = gBS->UninstallMultipleProtocolInterfaces ( > - gIScsiDriverBinding.DriverBindingHandle, > - &gEfiComponentNameProtocolGuid, > - ComponentName, > - NULL > - ); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - } > - > - Status = gBS->HandleProtocol ( > - gIScsiDriverBinding.DriverBindingHandle, > - &gEfiComponentName2ProtocolGuid, > - (VOID **) &ComponentName2 > - ); > - if (!EFI_ERROR (Status)) { > - gBS->UninstallMultipleProtocolInterfaces ( > - gIScsiDriverBinding.DriverBindingHandle, > - &gEfiComponentName2ProtocolGuid, > - ComponentName2, > - NULL > - ); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - } > - > - Status = gBS->UninstallMultipleProtocolInterfaces ( > - ImageHandle, > - &gEfiDriverBindingProtocolGuid, > - &gIScsiDriverBinding, > - &gEfiIScsiInitiatorNameProtocolGuid, > - &gIScsiInitiatorName, > - NULL > - ); > -ON_EXIT: > - > - if (DeviceHandleBuffer != NULL) { > - FreePool (DeviceHandleBuffer); > - } > - > - return Status; > -} > - > -/** > - This is the declaration of an EFI image entry point. This entry point is > - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including > - both device drivers and bus drivers. It initialize the global variables and > - publish the driver binding protocol. > - > - @param[in] ImageHandle The firmware allocated handle for the UEFI > image. > - @param[in] SystemTable A pointer to the EFI System Table. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL > was installed unexpectedly. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDriverEntryPoint ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - EFI_STATUS Status; > - EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName; > - > - // > - // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL. > - // > - Status = gBS->LocateProtocol ( > - &gEfiIScsiInitiatorNameProtocolGuid, > - NULL, > - (VOID**) &IScsiInitiatorName > - ); > - > - if (!EFI_ERROR (Status)) { > - return EFI_ACCESS_DENIED; > - } > - > - // > - // Initialize the EFI Driver Library > - // > - Status = EfiLibInstallDriverBindingComponentName2 ( > - ImageHandle, > - SystemTable, > - &gIScsiDriverBinding, > - ImageHandle, > - &gIScsiComponentName, > - &gIScsiComponentName2 > - ); > - > - if (!EFI_ERROR (Status)) { > - // > - // Install the iSCSI Initiator Name Protocol. > - // > - Status = gBS->InstallProtocolInterface ( > - &ImageHandle, > - &gEfiIScsiInitiatorNameProtocolGuid, > - EFI_NATIVE_INTERFACE, > - &gIScsiInitiatorName > - ); > - if (EFI_ERROR (Status)) { > - gBS->UninstallMultipleProtocolInterfaces ( > - ImageHandle, > - &gEfiDriverBindingProtocolGuid, > - &gIScsiDriverBinding, > - &gEfiComponentName2ProtocolGuid, > - &gIScsiComponentName2, > - &gEfiComponentNameProtocolGuid, > - &gIScsiComponentName, > - NULL > - ); > - return Status; > - } > - > - // > - // Initialize the configuration form of iSCSI. > - // > - Status = IScsiConfigFormInit (); > - if (EFI_ERROR (Status)) { > - gBS->UninstallMultipleProtocolInterfaces ( > - ImageHandle, > - &gEfiDriverBindingProtocolGuid, > - &gIScsiDriverBinding, > - &gEfiComponentName2ProtocolGuid, > - &gIScsiComponentName2, > - &gEfiComponentNameProtocolGuid, > - &gIScsiComponentName, > - &gEfiIScsiInitiatorNameProtocolGuid, > - &gIScsiInitiatorName, > - NULL > - ); > - } > - } > - return Status; > -} > - > diff --git > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > deleted file mode 100644 > index db2d6d19366e..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > +++ /dev/null > @@ -1,412 +0,0 @@ > -/** @file > - The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -/** > - Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI > channel. This function > - supports both blocking I/O and nonblocking I/O. The blocking I/O > functionality is required, and the > - nonblocking I/O functionality is optional. > - > - @param[in] This A pointer to the > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > - @param[in] Target The Target is an array of size TARGET_MAX_BYTES > and it represents > - the id of the SCSI device to send the SCSI Request Packet. Each > - transport driver may chose to utilize a subset of this size to suit > the needs > - of transport target representation. For example, a Fibre > Channel driver > - may use only 8 bytes (WWN) to represent an FC target. > - @param[in] Lun The LUN of the SCSI device to send the SCSI Request > Packet. > - @param[in, out] Packet A pointer to the SCSI Request Packet to send to > the SCSI device > - specified by Target and Lun. > - @param[in] Event If nonblocking I/O is not supported then Event is > ignored, and blocking > - I/O is performed. If Event is NULL, then blocking I/O is > performed. If > - Event is not NULL and non blocking I/O is supported, then > - nonblocking I/O is performed, and Event will be signaled when > the > - SCSI Request Packet completes. > - > - @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. > For bi-directional > - commands, InTransferLength bytes were transferred from > - InDataBuffer. For write and bi-directional commands, > - OutTransferLength bytes were transferred by > - OutDataBuffer. > - @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not > executed. The number of bytes that > - could be transferred is returned in InTransferLength. For > write > - and bi-directional commands, OutTransferLength bytes > were > - transferred by OutDataBuffer. Currently not implemeted. > - @retval EFI_NOT_READY The SCSI Request Packet could not be sent > because there are too many > - SCSI Request Packets already queued. The caller may retry > again later. > - @retval EFI_DEVICE_ERROR A device error occurred while attempting to > send the SCSI Request > - Packet. > - @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of > ScsiRequestPacket are invalid. > - @retval EFI_UNSUPPORTED The command described by the SCSI > Request Packet is not supported > - by the host adapter. This includes the case of Bi-directional > SCSI > - commands not supported by the implementation. The SCSI > Request > - Packet was not sent, so no additional status information is > available. > - Currently not implemeted. > - @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI > Request Packet to execute. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiExtScsiPassThruFunction ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > - IN UINT8 *Target, > - IN UINT64 Lun, > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, > - IN EFI_EVENT Event OPTIONAL > - ) > -{ > - ISCSI_DRIVER_DATA *Private; > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > - EFI_STATUS Status; > - > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > - ConfigNvData = &Private->Session.ConfigData.NvData; > - > - if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof > (UINT64)) != 0)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if ((Packet == NULL) || (Packet->Cdb == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); > - if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) { > - // > - // Try to reinstate the session and re-execute the Scsi command. > - // > - if (EFI_ERROR (IScsiSessionReinstatement (Private))) { > - return EFI_DEVICE_ERROR; > - } > - > - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); > - } > - > - return Status; > -} > - > -/** > - Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a > SCSI channel. These > - can either be the list SCSI devices that are actually present on the SCSI > channel, or the list of legal > - Target Ids and LUNs for the SCSI channel. Regardless, the caller of this > function must probe the > - Target ID and LUN returned to see if a SCSI device is actually present at that > location on the SCSI > - channel. > - > - @param[in] This A pointer to the > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > - @param[in, out] Target On input, a pointer to the Target ID (an array of > size > - TARGET_MAX_BYTES) of a SCSI device present on the SCSI > channel. > - On output, a pointer to the Target ID (an array of > - TARGET_MAX_BYTES) of the next SCSI device present on a > SCSI > - channel. An input value of 0xF(all bytes in the array are 0xF) in > the > - Target array retrieves the Target ID of the first SCSI device > present on a > - SCSI channel. > - @param[in, out] Lun On input, a pointer to the LUN of a SCSI device > present on the SCSI > - channel. On output, a pointer to the LUN of the next SCSI > device present > - on a SCSI channel. > - > - @retval EFI_SUCCESS The Target ID and LUN of the next SCSI device > on the SCSI > - channel was returned in Target and Lun. > - @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target > and Lun were > - not returned on a previous call to GetNextTargetLun(). > - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI > channel. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiExtScsiPassThruGetNextTargetLun ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > - IN OUT UINT8 **Target, > - IN OUT UINT64 *Lun > - ) > -{ > - ISCSI_DRIVER_DATA *Private; > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > - UINT8 TargetId[TARGET_MAX_BYTES]; > - > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > - ConfigNvData = &Private->Session.ConfigData.NvData; > - > - if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, > sizeof (UINT64)) == 0)) { > - // > - // Only one <Target, Lun> pair per iSCSI Driver instance. > - // > - return EFI_NOT_FOUND; > - } > - > - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); > - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { > - (*Target)[0] = 0; > - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); > - > - return EFI_SUCCESS; > - } > - > - return EFI_INVALID_PARAMETER; > -} > - > -/** > - Used to allocate and build a device path node for a SCSI device on a SCSI > channel. > - > - @param[in] This A pointer to the > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > - @param[in] Target The Target is an array of size TARGET_MAX_BYTES > and it specifies the > - Target ID of the SCSI device for which a device path node is to > be > - allocated and built. Transport drivers may chose to utilize a > subset of > - this size to suit the representation of targets. For example, a > Fibre > - Channel driver may use only 8 bytes (WWN) in the array to > represent a > - FC target. > - @param[in] Lun The LUN of the SCSI device for which a device path > node is to be > - allocated and built. > - @param[in, out] DevicePath A pointer to a single device path node that > describes the SCSI device > - specified by Target and Lun. This function is responsible for > - allocating the buffer DevicePath with the boot service > - AllocatePool(). It is the caller's responsibility to free > - DevicePath when the caller is finished with DevicePath. > - > - @retval EFI_SUCCESS The device path node that describes the SCSI > device specified by > - Target and Lun was allocated and returned in > - DevicePath. > - @retval EFI_INVALID_PARAMETER DevicePath is NULL. > - @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun > does not exist > - on the SCSI channel. > - @retval EFI_OUT_OF_RESOURCES There are not enough resources to > allocate DevicePath. > - > -**/ > -EFI_STATUS > -EFIAPI > -IScsiExtScsiPassThruBuildDevicePath ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > - IN UINT8 *Target, > - IN UINT64 Lun, > - IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath > - ) > -{ > - ISCSI_DRIVER_DATA *Private; > - ISCSI_SESSION *Session; > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; > - EFI_DEV_PATH *Node; > - UINTN DevPathNodeLen; > - > - if (DevicePath == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (Target[0] != 0) { > - return EFI_NOT_FOUND; > - } > - > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > - Session = &Private->Session; > - ConfigNvData = &Session->ConfigData.NvData; > - AuthConfig = &Session->AuthData.AuthConfig; > - > - if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) { > - return EFI_NOT_FOUND; > - } > - > - DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen > (ConfigNvData->TargetName) + 1; > - Node = AllocatePool (DevPathNodeLen); > - if (Node == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Node->DevPath.Type = MESSAGING_DEVICE_PATH; > - Node->DevPath.SubType = MSG_ISCSI_DP; > - SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen); > - > - // > - // 0 for TCP, others are reserved. > - // > - Node->Iscsi.NetworkProtocol = 0; > - > - Node->Iscsi.LoginOption = 0; > - switch (AuthConfig->CHAPType) { > - case ISCSI_CHAP_NONE: > - Node->Iscsi.LoginOption |= 0x0800; > - break; > - > - case ISCSI_CHAP_UNI: > - Node->Iscsi.LoginOption |= 0x1000; > - break; > - > - default: > - break; > - } > - > - CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64)); > - Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag; > - AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen > (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName); > - > - *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node; > - > - return EFI_SUCCESS; > -} > - > -/** > - Used to translate a device path node to a Target ID and LUN. > - > - @param[in] This A pointer to the > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > - @param[in] DevicePath A pointer to a single device path node that > describes the SCSI device > - on the SCSI channel. > - @param[out] Target A pointer to the Target Array which represents the > ID of a SCSI device > - on the SCSI channel. > - @param[out] Lun A pointer to the LUN of a SCSI device on the SCSI > channel. > - > - @retval EFI_SUCCESS DevicePath was successfully translated to a > Target ID and > - LUN, and they were returned in Target and Lun. > - @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL. > - @retval EFI_NOT_FOUND A valid translation from DevicePath to a > Target ID and LUN > - does not exist.Currently not implemented. > - @retval EFI_UNSUPPORTED This driver does not support the device > path node type in > - DevicePath. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiExtScsiPassThruGetTargetLun ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, > - OUT UINT8 **Target, > - OUT UINT64 *Lun > - ) > -{ > - ISCSI_DRIVER_DATA *Private; > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > - > - if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if ((DevicePath->Type != MESSAGING_DEVICE_PATH) || > - (DevicePath->SubType != MSG_ISCSI_DP) || > - (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH)) > - ) { > - return EFI_UNSUPPORTED; > - } > - > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > - ConfigNvData = &Private->Session.ConfigData.NvData; > - > - SetMem (*Target, TARGET_MAX_BYTES, 0xFF); > - (*Target)[0] = 0; > - > - if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + > sizeof (ISCSI_DEVICE_PATH)) != 0) { > - return EFI_UNSUPPORTED; > - } > - > - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); > - > - return EFI_SUCCESS; > -} > - > -/** > - Resets a SCSI channel. This operation resets all the SCSI devices connected > to the SCSI channel. > - Currently not implemented. > - > - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL > instance. > - > - @retval EFI_SUCCESS The SCSI channel was reset. > - @retval EFI_DEVICE_ERROR A device error occurred while attempting to > reset the SCSI channel. > - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the > SCSI channel. > - @retval EFI_UNSUPPORTED The SCSI channel does not support a channel > reset operation. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiExtScsiPassThruResetChannel ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This > - ) > -{ > - return EFI_UNSUPPORTED; > -} > - > -/** > - Resets a SCSI logical unit that is connected to a SCSI channel. Currently not > implemented. > - > - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL > instance. > - @param[in] Target The Target is an array of size TARGET_MAX_BYTE and it > represents the > - target port ID of the SCSI device containing the SCSI logical unit to > - reset. Transport drivers may chose to utilize a subset of this array > to suit > - the representation of their targets. > - @param[in] Lun The LUN of the SCSI device to reset. > - > - @retval EFI_SUCCESS The SCSI device specified by Target and Lun was > reset. > - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. > - @retval EFI_TIMEOUT A timeout occurred while attempting to reset > the SCSI device > - specified by Target and Lun. > - @retval EFI_UNSUPPORTED The SCSI channel does not support a target > reset operation. > - @retval EFI_DEVICE_ERROR A device error occurred while attempting to > reset the SCSI device > - specified by Target and Lun. > - > -**/ > -EFI_STATUS > -EFIAPI > -IScsiExtScsiPassThruResetTargetLun ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > - IN UINT8 *Target, > - IN UINT64 Lun > - ) > -{ > - return EFI_UNSUPPORTED; > -} > - > -/** > - Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI > channel. These can either > - be the list SCSI devices that are actually present on the SCSI channel, or the > list of legal Target IDs > - for the SCSI channel. Regardless, the caller of this function must probe the > Target ID returned to > - see if a SCSI device is actually present at that location on the SCSI channel. > - > - @param[in] This A pointer to the > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > - @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present > on the SCSI channel. > - On output, a pointer to the Target ID (an array of > - TARGET_MAX_BYTES) of the next SCSI device present on a > SCSI > - channel. An input value of 0xF(all bytes in the array are 0xF) in > the > - Target array retrieves the Target ID of the first SCSI device > present on a > - SCSI channel. > - > - @retval EFI_SUCCESS The Target ID of the next SCSI device on the > SCSI > - channel was returned in Target. > - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. > - @retval EFI_TIMEOUT Target array is not all 0xF, and Target were not > - returned on a previous call to GetNextTarget(). > - Currently not implemented. > - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI > channel. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiExtScsiPassThruGetNextTarget ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > - IN OUT UINT8 **Target > - ) > -{ > - UINT8 TargetId[TARGET_MAX_BYTES]; > - > - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); > - > - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { > - (*Target)[0] = 0; > - return EFI_SUCCESS; > - } else if ((*Target)[0] == 0) { > - return EFI_NOT_FOUND; > - } else { > - return EFI_INVALID_PARAMETER; > - } > -} > - > -EFI_EXT_SCSI_PASS_THRU_PROTOCOL > gIScsiExtScsiPassThruProtocolTemplate = { > - NULL, > - IScsiExtScsiPassThruFunction, > - IScsiExtScsiPassThruGetNextTargetLun, > - IScsiExtScsiPassThruBuildDevicePath, > - IScsiExtScsiPassThruGetTargetLun, > - IScsiExtScsiPassThruResetChannel, > - IScsiExtScsiPassThruResetTargetLun, > - IScsiExtScsiPassThruGetNextTarget > -}; > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > deleted file mode 100644 > index 58c5447dcbd1..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > +++ /dev/null > @@ -1,539 +0,0 @@ > -/** @file > - Implementation for iSCSI Boot Firmware Table publication. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -BOOLEAN mIbftInstalled = FALSE; > -UINTN mTableKey; > - > -/** > - Initialize the header of the iSCSI Boot Firmware Table. > - > - @param[out] Header The header of the iSCSI Boot Firmware Table. > - @param[in] OemId The OEM ID. > - @param[in] OemTableId The OEM table ID for the iBFT. > -**/ > -VOID > -IScsiInitIbfTableHeader ( > - OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header, > - IN UINT8 *OemId, > - IN UINT64 *OemTableId > - ) > -{ > - ZeroMem (Header, sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER)); > - > - Header->Signature = > EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE; > - Header->Length = IBFT_HEAP_OFFSET; > - Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION; > - Header->Checksum = 0; > - > - CopyMem (Header->OemId, OemId, sizeof (Header->OemId)); > - CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64)); > -} > - > -/** > - Initialize the control section of the iSCSI Boot Firmware Table. > - > - @param[in] Table The ACPI table. > - @param[in] HandleCount The number of the handles associated with iSCSI > sessions, it's > - equal to the number of iSCSI sessions. > -**/ > -VOID > -IScsiInitControlSection ( > - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, > - IN UINTN HandleCount > - ) > -{ > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE > *Control; > - UINTN NumOffset; > - > - Control = > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table > + 1); > - > - ZeroMem (Control, sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE)); > - > - Control->Header.StructureId = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID; > - Control->Header.Version = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION; > - Control->Header.Length = (UINT16) sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE); > - > - // > - // Each session occupies two offsets, one for the NIC section, > - // the other for the Target section. > - // > - NumOffset = 2 * HandleCount; > - if (NumOffset > 4) { > - // > - // Need expand the control section if more than 2 NIC/Target sections > - // exist. > - // > - Control->Header.Length = (UINT16) (Control->Header.Length + > (NumOffset - 4) * sizeof (UINT16)); > - } > -} > - > -/** > - Add one item into the heap. > - > - @param[in, out] Heap On input, the current address of the heap; On > output, the address of > - the heap after the item is added. > - @param[in] Data The data to add into the heap. > - @param[in] Len Length of the Data in byte. > -**/ > -VOID > -IScsiAddHeapItem ( > - IN OUT UINT8 **Heap, > - IN VOID *Data, > - IN UINTN Len > - ) > -{ > - // > - // Add one byte for the NULL delimiter. > - // > - *Heap -= Len + 1; > - > - CopyMem (*Heap, Data, Len); > - *(*Heap + Len) = 0; > -} > - > -/** > - Fill the Initiator section of the iSCSI Boot Firmware Table. > - > - @param[in] Table The ACPI table. > - @param[in, out] Heap The heap. > - @param[in] Handle The handle associated with the iSCSI session. > -**/ > -VOID > -IScsiFillInitiatorSection ( > - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, > - IN OUT UINT8 **Heap, > - IN EFI_HANDLE Handle > - ) > -{ > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE > *Control; > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE > *Initiator; > - ISCSI_DRIVER_DATA *DriverData; > - ISCSI_SESSION *Session; > - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; > - EFI_STATUS Status; > - > - Control = > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table > + 1); > - > - // > - // Initiator section immediately follows the control section. > - // > - Initiator = > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) > ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length)); > - > - Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table); > - > - ZeroMem (Initiator, sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)); > - > - Initiator->Header.StructureId = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID; > - Initiator->Header.Version = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSIO > N; > - Initiator->Header.Length = (UINT16) sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE); > - Initiator->Header.Flags = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B > LOCK_VALID | > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B > OOT_SELECTED; > - > - // > - // Get the identifier from the handle. > - // > - Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) > &IScsiIdentifier); > - if (EFI_ERROR (Status)) { > - ASSERT (FALSE); > - return ; > - } > - > - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); > - Session = &DriverData->Session; > - > - // > - // Fill the iSCSI Initiator Name into the heap. > - // > - IScsiAddHeapItem (Heap, Session->InitiatorName, Session- > >InitiatorNameLength - 1); > - > - Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1); > - Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); > -} > - > -/** > - Map the v4 IP address into v6 IP address. > - > - @param[in] V4 The v4 IP address. > - @param[out] V6 The v6 IP address. > -**/ > -VOID > -IScsiMapV4ToV6Addr ( > - IN EFI_IPv4_ADDRESS *V4, > - OUT EFI_IPv6_ADDRESS *V6 > - ) > -{ > - UINTN Index; > - > - ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS)); > - > - V6->Addr[10] = 0xff; > - V6->Addr[11] = 0xff; > - > - for (Index = 0; Index < 4; Index++) { > - V6->Addr[12 + Index] = V4->Addr[Index]; > - } > -} > - > -/** > - Get the NIC's PCI location and return it according to the composited > - format defined in iSCSI Boot Firmware Table. > - > - @param[in] Controller The handle of the controller. > - > - @return UINT16 The composited representation of the NIC PCI > location. > - @retval 0 Other errors as indicated. > -**/ > -UINT16 > -IScsiGetNICPciLocation ( > - IN EFI_HANDLE Controller > - ) > -{ > - EFI_STATUS Status; > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > - EFI_HANDLE PciIoHandle; > - EFI_PCI_IO_PROTOCOL *PciIo; > - UINTN Segment; > - UINTN Bus; > - UINTN Device; > - UINTN Function; > - > - Status = gBS->HandleProtocol ( > - Controller, > - &gEfiDevicePathProtocolGuid, > - (VOID **)&DevicePath > - ); > - if (EFI_ERROR (Status)) { > - return 0; > - } > - > - Status = gBS->LocateDevicePath ( > - &gEfiPciIoProtocolGuid, > - &DevicePath, > - &PciIoHandle > - ); > - if (EFI_ERROR (Status)) { > - return 0; > - } > - > - Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID > **)&PciIo); > - if (EFI_ERROR (Status)) { > - return 0; > - } > - > - Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function); > - if (EFI_ERROR (Status)) { > - return 0; > - } > - > - return (UINT16) ((Bus << 8) | (Device << 3) | Function); > -} > - > -/** > - Fill the NIC and target sections in iSCSI Boot Firmware Table. > - > - @param[in] Table The buffer of the ACPI table. > - @param[in, out] Heap The heap buffer used to store the variable > length parameters such as iSCSI name. > - @param[in] HandleCount Count The number of handles having iSCSI > private protocol installed. > - @param[in] Handles The handle buffer. > -**/ > -VOID > -IScsiFillNICAndTargetSections ( > - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, > - IN OUT UINT8 **Heap, > - IN UINTN HandleCount, > - IN EFI_HANDLE *Handles > - ) > -{ > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE > *Control; > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic; > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target; > - ISCSI_DRIVER_DATA *DriverData; > - ISCSI_SESSION_CONFIG_DATA *SessionConfigData; > - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; > - UINT16 *SectionOffset; > - UINTN Index; > - UINT16 Length; > - EFI_MAC_ADDRESS MacAddress; > - UINTN HwAddressSize; > - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; > - EFI_STATUS Status; > - > - // > - // Get the offset of the first Nic and Target section. > - // > - Control = > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table > + 1); > - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) > ((UINTN) Table + > - Control->InitiatorOffset + IBFT_ROUNDUP (sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE))); > - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE > *) ((UINTN) Nic + > - IBFT_ROUNDUP (sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); > - > - SectionOffset = &Control->NIC0Offset; > - > - for (Index = 0; Index < HandleCount; Index++) { > - Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID > **)&IScsiIdentifier); > - if (EFI_ERROR (Status)) { > - ASSERT (FALSE); > - return ; > - } > - > - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); > - SessionConfigData = &DriverData->Session.ConfigData; > - AuthConfig = &DriverData->Session.AuthData.AuthConfig; > - > - // > - // Fill the Nic section. > - // > - ZeroMem (Nic, sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)); > - > - Nic->Header.StructureId = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID; > - Nic->Header.Version = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION; > - Nic->Header.Length = (UINT16) sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE); > - Nic->Header.Index = (UINT8) Index; > - Nic->Header.Flags = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_ > VALID | > - > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_S > ELECTED | > - > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL; > - > - // > - // Get the subnet mask prefix length. > - // > - Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength > (&SessionConfigData->NvData.SubnetMask); > - > - if (SessionConfigData->NvData.InitiatorInfoFromDhcp) { > - Nic->Origin = IpPrefixOriginDhcp; > - } else { > - Nic->Origin = IpPrefixOriginManual; > - } > - // > - // Map the various v4 addresses into v6 addresses. > - // > - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip); > - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic- > >Gateway); > - IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic- > >PrimaryDns); > - IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic- > >SecondaryDns); > - IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic- > >DhcpServer); > - > - Nic->VLanTag = NetLibGetVlanId (DriverData->Controller); > - > - Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, > &HwAddressSize); > - ASSERT (Status == EFI_SUCCESS); > - CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac)); > - > - // > - // Get the PCI location of the Nic. > - // > - Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller); > - > - *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table); > - SectionOffset++; > - > - // > - // Fill the Target section. > - // > - ZeroMem (Target, sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)); > - > - Target->Header.StructureId = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID; > - Target->Header.Version = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION; > - Target->Header.Length = (UINT16) sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE); > - Target->Header.Index = (UINT8) Index; > - Target->Header.Flags = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLO > CK_VALID | > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOO > T_SELECTED; > - Target->Port = SessionConfigData->NvData.TargetPort; > - Target->NicIndex = (UINT8) Index; > - > - if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) { > - Target->CHAPType = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > E_NO_CHAP; > - } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) { > - Target->CHAPType = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > E_CHAP; > - } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) { > - Target->CHAPType = > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > E_MUTUAL_CHAP; > - } > - > - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target- > >Ip); > - CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof > (Target->BootLun)); > - > - // > - // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret. > - // > - Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName); > - IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, > Length); > - > - Target->IScsiNameLength = Length; > - Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); > - > - if (Target->CHAPType != > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > E_NO_CHAP) { > - // > - // CHAP Name > - // > - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName); > - IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length); > - Target->CHAPNameLength = Length; > - Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); > - > - // > - // CHAP Secret > - // > - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret); > - IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length); > - Target->CHAPSecretLength = Length; > - Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); > - > - if (Target->CHAPType == > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > E_MUTUAL_CHAP) { > - // > - // Reverse CHAP Name > - // > - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName); > - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length); > - Target->ReverseCHAPNameLength = Length; > - Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) > Table); > - > - // > - // Reverse CHAP Secret > - // > - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret); > - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length); > - Target->ReverseCHAPSecretLength = Length; > - Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - > (UINTN) Table); > - } > - } > - > - *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table); > - SectionOffset++; > - > - // > - // Advance to the next NIC/Target pair > - // > - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) > ((UINTN) Target + > - IBFT_ROUNDUP (sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE))); > - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE > *) ((UINTN) Nic + > - IBFT_ROUNDUP (sizeof > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); > - } > -} > - > -/** > - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI > - session status. > -**/ > -VOID > -IScsiPublishIbft ( > - VOID > - ) > -{ > - EFI_STATUS Status; > - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table; > - UINTN HandleCount; > - EFI_HANDLE *HandleBuffer; > - UINT8 *Heap; > - UINT8 Checksum; > - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; > - EFI_ACPI_DESCRIPTION_HEADER *Rsdt; > - EFI_ACPI_DESCRIPTION_HEADER *Xsdt; > - > - Rsdt = NULL; > - Xsdt = NULL; > - > - Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID > **)&AcpiTableProtocol); > - if (EFI_ERROR (Status)) { > - return ; > - } > - > - > - // > - // Find ACPI table RSD_PTR from system table > - // > - Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) > &Rsdp); > - if (EFI_ERROR (Status)) { > - Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID > **) &Rsdp); > - } > - > - if (EFI_ERROR (Status) || (Rsdp == NULL)) { > - return ; > - } else if (Rsdp->Revision >= > EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp- > >XsdtAddress != 0) { > - Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress; > - } else if (Rsdp->RsdtAddress != 0) { > - Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress; > - } > - > - if ((Xsdt == NULL) && (Rsdt == NULL)) { > - return ; > - } > - > - if (mIbftInstalled) { > - Status = AcpiTableProtocol->UninstallAcpiTable ( > - AcpiTableProtocol, > - mTableKey > - ); > - if (EFI_ERROR (Status)) { > - return ; > - } > - mIbftInstalled = FALSE; > - } > - > - // > - // Get all iSCSI private protocols. > - // > - Status = gBS->LocateHandleBuffer ( > - ByProtocol, > - &gEfiCallerIdGuid, > - NULL, > - &HandleCount, > - &HandleBuffer > - ); > - if (EFI_ERROR (Status)) { > - return ; > - } > - // > - // Allocate 4k bytes to hold the ACPI table. > - // > - Table = AllocateZeroPool (IBFT_MAX_SIZE); > - if (Table == NULL) { > - return ; > - } > - > - Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET; > - > - // > - // Fill in the various section of the iSCSI Boot Firmware Table. > - // > - if (Rsdp->Revision >= > EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) { > - IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId); > - } else { > - IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId); > - } > - > - IScsiInitControlSection (Table, HandleCount); > - IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]); > - IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer); > - > - Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length); > - Table->Checksum = Checksum; > - > - FreePool (HandleBuffer); > - > - // > - // Install or update the iBFT table. > - // > - Status = AcpiTableProtocol->InstallAcpiTable ( > - AcpiTableProtocol, > - Table, > - Table->Length, > - &mTableKey > - ); > - if (EFI_ERROR(Status)) { > - return; > - } > - > - mIbftInstalled = TRUE; > - FreePool (Table); > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > deleted file mode 100644 > index e753d9eebdbe..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > +++ /dev/null > @@ -1,116 +0,0 @@ > -/** @file > - Implementation for EFI iSCSI Initiator Name Protocol. > - > -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = { > - IScsiGetInitiatorName, > - IScsiSetInitiatorName > -}; > - > -/** > - Retrieves the current set value of iSCSI Initiator Name. > - > - @param[in] This Pointer to the > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer > / Actual size of the > - variable data buffer. > - @param[out] Buffer Pointer to the buffer for data to be read. The data > is a null-terminated UTF-8 encoded string. > - The maximum length is 223 characters, including the null- > terminator. > - > - @retval EFI_SUCCESS Data was successfully retrieved into the > provided buffer and the > - BufferSize was sufficient to handle the iSCSI initiator name. > - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. > - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be > retrieved due to a hardware error. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiGetInitiatorName ( > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > - IN OUT UINTN *BufferSize, > - OUT VOID *Buffer > - ) > -{ > - EFI_STATUS Status; > - > - if ((BufferSize == NULL) || (Buffer == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - Status = gRT->GetVariable ( > - ISCSI_INITIATOR_NAME_VAR_NAME, > - &gEfiIScsiInitiatorNameProtocolGuid, > - NULL, > - BufferSize, > - Buffer > - ); > - > - return Status; > -} > - > -/** > - Sets the iSCSI Initiator Name. > - > - @param[in] This Pointer to the > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. > - @param[in] Buffer Pointer to the buffer for data to be written. The > data is a null-terminated UTF-8 encoded string. > - The maximum length is 223 characters, including the null- > terminator. > - > - @retval EFI_SUCCESS Data was successfully stored by the protocol. > - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be > written. > - Currently not implemented. > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or > BufferSize exceeds the maximum allowed limit. > - @retval EFI_DEVICE_ERROR The data could not be stored due to a > hardware error. > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > the data. > - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not > adhere to RFC 3720 > - (and other related protocols). > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiSetInitiatorName ( > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > - IN OUT UINTN *BufferSize, > - IN VOID *Buffer > - ) > -{ > - EFI_STATUS Status; > - > - if ((BufferSize == NULL) || (Buffer == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (*BufferSize > ISCSI_NAME_MAX_SIZE) { > - *BufferSize = ISCSI_NAME_MAX_SIZE; > - return EFI_INVALID_PARAMETER; > - } > - // > - // only support iqn iSCSI names. > - // > - Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Status = gRT->SetVariable ( > - ISCSI_INITIATOR_NAME_VAR_NAME, > - &gEfiIScsiInitiatorNameProtocolGuid, > - EFI_VARIABLE_NON_VOLATILE | > EFI_VARIABLE_BOOTSERVICE_ACCESS, > - *BufferSize, > - Buffer > - ); > - > - return Status; > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > deleted file mode 100644 > index d924a8b82427..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > +++ /dev/null > @@ -1,948 +0,0 @@ > -/** @file > - Miscellaneous routines for iSCSI driver. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] = > "0123456789ABCDEFabcdef"; > - > -/** > - Removes (trims) specified leading and trailing characters from a string. > - > - @param[in, out] Str Pointer to the null-terminated string to be trimmed. > On return, > - Str will hold the trimmed string. > - > - @param[in] CharC Character will be trimmed from str. > -**/ > -VOID > -StrTrim ( > - IN OUT CHAR16 *Str, > - IN CHAR16 CharC > - ) > -{ > - CHAR16 *Pointer1; > - CHAR16 *Pointer2; > - > - if (*Str == 0) { > - return; > - } > - > - // > - // Trim off the leading and trailing characters c > - // > - for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) { > - ; > - } > - > - Pointer2 = Str; > - if (Pointer2 == Pointer1) { > - while (*Pointer1 != 0) { > - Pointer2++; > - Pointer1++; > - } > - } else { > - while (*Pointer1 != 0) { > - *Pointer2 = *Pointer1; > - Pointer1++; > - Pointer2++; > - } > - *Pointer2 = 0; > - } > - > - > - for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; > Pointer1--) { > - ; > - } > - if (Pointer1 != Str + StrLen(Str) - 1) { > - *(Pointer1 + 1) = 0; > - } > -} > - > -/** > - Calculate the prefix length of the IPv4 subnet mask. > - > - @param[in] SubnetMask The IPv4 subnet mask. > - > - @return The prefix length of the subnet mask. > - @retval 0 Other errors as indicated. > -**/ > -UINT8 > -IScsiGetSubnetMaskPrefixLength ( > - IN EFI_IPv4_ADDRESS *SubnetMask > - ) > -{ > - UINT8 Len; > - UINT32 ReverseMask; > - > - // > - // The SubnetMask is in network byte order. > - // > - ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << > 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]); > - > - // > - // Reverse it. > - // > - ReverseMask = ~ReverseMask; > - > - if ((ReverseMask & (ReverseMask + 1)) != 0) { > - return 0; > - } > - > - Len = 0; > - > - while (ReverseMask != 0) { > - ReverseMask = ReverseMask >> 1; > - Len++; > - } > - > - return (UINT8) (32 - Len); > -} > - > -/** > - Convert the hexadecimal encoded LUN string into the 64-bit LUN. > - > - @param[in] Str The hexadecimal encoded LUN string. > - @param[out] Lun Storage to return the 64-bit LUN. > - > - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. > - @retval EFI_INVALID_PARAMETER The string is malformatted. > -**/ > -EFI_STATUS > -IScsiAsciiStrToLun ( > - IN CHAR8 *Str, > - OUT UINT8 *Lun > - ) > -{ > - UINTN Index, IndexValue, IndexNum, SizeStr; > - CHAR8 TemStr[2]; > - UINT8 TemValue; > - UINT16 Value[4]; > - > - ZeroMem (Lun, 8); > - ZeroMem (TemStr, 2); > - ZeroMem ((UINT8 *) Value, sizeof (Value)); > - SizeStr = AsciiStrLen (Str); > - IndexValue = 0; > - IndexNum = 0; > - > - for (Index = 0; Index < SizeStr; Index ++) { > - TemStr[0] = Str[Index]; > - TemValue = (UINT8) AsciiStrHexToUint64 (TemStr); > - if (TemValue == 0 && TemStr[0] != '0') { > - if ((TemStr[0] != '-') || (IndexNum == 0)) { > - // > - // Invalid Lun Char > - // > - return EFI_INVALID_PARAMETER; > - } > - } > - > - if ((TemValue == 0) && (TemStr[0] == '-')) { > - // > - // Next Lun value > - // > - if (++IndexValue >= 4) { > - // > - // Max 4 Lun value > - // > - return EFI_INVALID_PARAMETER; > - } > - // > - // Restart str index for the next lun value > - // > - IndexNum = 0; > - continue; > - } > - > - if (++IndexNum > 4) { > - // > - // Each Lun Str can't exceed size 4, because it will be as UINT16 value > - // > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Combine UINT16 value > - // > - Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue); > - } > - > - for (Index = 0; Index <= IndexValue; Index ++) { > - *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]); > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Convert the 64-bit LUN into the hexadecimal encoded LUN string. > - > - @param[in] Lun The 64-bit LUN. > - @param[out] Str The storage to return the hexadecimal encoded LUN > string. > -**/ > -VOID > -IScsiLunToUnicodeStr ( > - IN UINT8 *Lun, > - OUT CHAR16 *Str > - ) > -{ > - UINTN Index; > - CHAR16 *TempStr; > - > - TempStr = Str; > - > - for (Index = 0; Index < 4; Index++) { > - > - if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) { > - CopyMem(TempStr, L"0-", sizeof (L"0-")); > - } else { > - TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4]; > - TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F]; > - TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4]; > - TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F]; > - TempStr[4] = L'-'; > - TempStr[5] = 0; > - > - StrTrim (TempStr, L'0'); > - } > - > - TempStr += StrLen (TempStr); > - } > - > - ASSERT (StrLen(Str) >= 1); > - Str[StrLen (Str) - 1] = 0; > - > - for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) { > - if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) { > - Str[Index - 1] = 0; > - } else { > - break; > - } > - } > -} > - > -/** > - Convert the ASCII string into a UNICODE string. > - > - @param[in] Source The ASCII string. > - @param[out] Destination The storage to return the UNICODE string. > - > - @return CHAR16 * Pointer to the UNICODE string. > -**/ > -CHAR16 * > -IScsiAsciiStrToUnicodeStr ( > - IN CHAR8 *Source, > - OUT CHAR16 *Destination > - ) > -{ > - ASSERT (Destination != NULL); > - ASSERT (Source != NULL); > - > - while (*Source != '\0') { > - *(Destination++) = (CHAR16) *(Source++); > - } > - > - *Destination = '\0'; > - > - return Destination; > -} > - > -/** > - Convert the UNICODE string into an ASCII string. > - > - @param[in] Source The UNICODE string. > - @param[out] Destination The storage to return the ASCII string. > - > - @return CHAR8 * Pointer to the ASCII string. > -**/ > -CHAR8 * > -IScsiUnicodeStrToAsciiStr ( > - IN CHAR16 *Source, > - OUT CHAR8 *Destination > - ) > -{ > - ASSERT (Destination != NULL); > - ASSERT (Source != NULL); > - > - while (*Source != '\0') { > - // > - // If any Unicode characters in Source contain > - // non-zero value in the upper 8 bits, then ASSERT(). > - // > - ASSERT (*Source < 0x100); > - *(Destination++) = (CHAR8) *(Source++); > - } > - > - *Destination = '\0'; > - > - return Destination; > -} > - > -/** > - Convert the decimal dotted IPv4 address into the binary IPv4 address. > - > - @param[in] Str The UNICODE string. > - @param[out] Ip The storage to return the ASCII string. > - > - @retval EFI_SUCCESS The binary IP address is returned in Ip. > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > -**/ > -EFI_STATUS > -IScsiAsciiStrToIp ( > - IN CHAR8 *Str, > - OUT EFI_IPv4_ADDRESS *Ip > - ) > -{ > - UINTN Index; > - UINTN Number; > - > - Index = 0; > - > - while (*Str != 0) { > - > - if (Index > 3) { > - return EFI_INVALID_PARAMETER; > - } > - > - Number = 0; > - while (NET_IS_DIGIT (*Str)) { > - Number = Number * 10 + (*Str - '0'); > - Str++; > - } > - > - if (Number > 0xFF) { > - return EFI_INVALID_PARAMETER; > - } > - > - Ip->Addr[Index] = (UINT8) Number; > - > - if ((*Str != '\0') && (*Str != '.')) { > - // > - // The current character should be either the NULL terminator or > - // the dot delimiter. > - // > - return EFI_INVALID_PARAMETER; > - } > - > - if (*Str == '.') { > - // > - // Skip the delimiter. > - // > - Str++; > - } > - > - Index++; > - } > - > - if (Index != 4) { > - return EFI_INVALID_PARAMETER; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Convert the mac address into a hexadecimal encoded "-" seperated string. > - > - @param[in] Mac The mac address. > - @param[in] Len Length in bytes of the mac address. > - @param[in] VlanId VLAN ID of the network device. > - @param[out] Str The storage to return the mac string. > -**/ > -VOID > -IScsiMacAddrToStr ( > - IN EFI_MAC_ADDRESS *Mac, > - IN UINT32 Len, > - IN UINT16 VlanId, > - OUT CHAR16 *Str > - ) > -{ > - UINT32 Index; > - CHAR16 *String; > - > - for (Index = 0; Index < Len; Index++) { > - Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & > 0x0F]; > - Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F]; > - Str[3 * Index + 2] = L'-'; > - } > - > - String = &Str[3 * Index - 1] ; > - if (VlanId != 0) { > - String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) > VlanId); > - } > - > - *String = L'\0'; > -} > - > -/** > - Convert the binary encoded buffer into a hexadecimal encoded string. > - > - @param[in] BinBuffer The buffer containing the binary data. > - @param[in] BinLength Length of the binary buffer. > - @param[in, out] HexStr Pointer to the string. > - @param[in, out] HexLength The length of the string. > - > - @retval EFI_SUCCESS The binary data is converted to the hexadecimal > string > - and the length of the string is updated. > - @retval EFI_BUFFER_TOO_SMALL The string is too small. > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > -**/ > -EFI_STATUS > -IScsiBinToHex ( > - IN UINT8 *BinBuffer, > - IN UINT32 BinLength, > - IN OUT CHAR8 *HexStr, > - IN OUT UINT32 *HexLength > - ) > -{ > - UINTN Index; > - > - if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (((*HexLength) - 3) < BinLength * 2) { > - *HexLength = BinLength * 2 + 3; > - return EFI_BUFFER_TOO_SMALL; > - } > - > - *HexLength = BinLength * 2 + 3; > - // > - // Prefix for Hex String > - // > - HexStr[0] = '0'; > - HexStr[1] = 'x'; > - > - for (Index = 0; Index < BinLength; Index++) { > - HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4]; > - HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F]; > - } > - > - HexStr[Index * 2 + 2] = '\0'; > - > - return EFI_SUCCESS; > -} > - > -/** > - Convert the hexadecimal string into a binary encoded buffer. > - > - @param[in, out] BinBuffer The binary buffer. > - @param[in, out] BinLength Length of the binary buffer. > - @param[in] HexStr The hexadecimal string. > - > - @retval EFI_SUCCESS The hexadecimal string is converted into a binary > - encoded buffer. > - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the > converted data. > -**/ > -EFI_STATUS > -IScsiHexToBin ( > - IN OUT UINT8 *BinBuffer, > - IN OUT UINT32 *BinLength, > - IN CHAR8 *HexStr > - ) > -{ > - UINTN Index; > - UINTN Length; > - UINT8 Digit; > - CHAR8 TemStr[2]; > - > - ZeroMem (TemStr, sizeof (TemStr)); > - > - // > - // Find out how many hex characters the string has. > - // > - if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) { > - HexStr += 2; > - } > - > - Length = AsciiStrLen (HexStr); > - > - for (Index = 0; Index < Length; Index ++) { > - TemStr[0] = HexStr[Index]; > - Digit = (UINT8) AsciiStrHexToUint64 (TemStr); > - if (Digit == 0 && TemStr[0] != '0') { > - // > - // Invalid Lun Char > - // > - break; > - } > - if ((Index & 1) == 0) { > - BinBuffer [Index/2] = Digit; > - } else { > - BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit); > - } > - } > - > - *BinLength = (UINT32) ((Index + 1)/2); > - > - return EFI_SUCCESS; > -} > - > -/** > - Generate random numbers. > - > - @param[in, out] Rand The buffer to contain random numbers. > - @param[in] RandLength The length of the Rand buffer. > -**/ > -VOID > -IScsiGenRandom ( > - IN OUT UINT8 *Rand, > - IN UINTN RandLength > - ) > -{ > - UINT32 Random; > - > - while (RandLength > 0) { > - Random = NET_RANDOM (NetRandomInitSeed ()); > - *Rand++ = (UINT8) (Random); > - RandLength--; > - } > -} > - > -/** > - Create the iSCSI driver data.. > - > - @param[in] Image The handle of the driver image. > - @param[in] Controller The handle of the controller. > - > - @return The iSCSI driver data created. > - @retval NULL Other errors as indicated. > -**/ > -ISCSI_DRIVER_DATA * > -IScsiCreateDriverData ( > - IN EFI_HANDLE Image, > - IN EFI_HANDLE Controller > - ) > -{ > - ISCSI_DRIVER_DATA *Private; > - EFI_STATUS Status; > - > - Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA)); > - if (Private == NULL) { > - return NULL; > - } > - > - Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE; > - Private->Image = Image; > - Private->Controller = Controller; > - > - // > - // Create an event to be signal when the BS to RT transition is triggerd so > - // as to abort the iSCSI session. > - // > - Status = gBS->CreateEventEx ( > - EVT_NOTIFY_SIGNAL, > - TPL_CALLBACK, > - IScsiOnExitBootService, > - Private, > - &gEfiEventExitBootServicesGuid, > - &Private->ExitBootServiceEvent > - ); > - if (EFI_ERROR (Status)) { > - FreePool (Private); > - return NULL; > - } > - > - CopyMem(&Private->IScsiExtScsiPassThru, > &gIScsiExtScsiPassThruProtocolTemplate, > sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL)); > - > - // > - // 0 is designated to the TargetId, so use another value for the AdapterId. > - // > - Private->ExtScsiPassThruMode.AdapterId = 2; > - Private->ExtScsiPassThruMode.Attributes = > EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | > EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL; > - Private->ExtScsiPassThruMode.IoAlign = 4; > - Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode; > - > - // > - // Install the Ext SCSI PASS THRU protocol. > - // > - Status = gBS->InstallProtocolInterface ( > - &Private->ExtScsiPassThruHandle, > - &gEfiExtScsiPassThruProtocolGuid, > - EFI_NATIVE_INTERFACE, > - &Private->IScsiExtScsiPassThru > - ); > - if (EFI_ERROR (Status)) { > - gBS->CloseEvent (Private->ExitBootServiceEvent); > - FreePool (Private); > - > - return NULL; > - } > - > - IScsiSessionInit (&Private->Session, FALSE); > - > - return Private; > -} > - > -/** > - Clean the iSCSI driver data. > - > - @param[in] Private The iSCSI driver data. > - > - @retval EFI_SUCCESS The clean operation is successful. > - @retval Others Other errors as indicated. > - > -**/ > -EFI_STATUS > -IScsiCleanDriverData ( > - IN ISCSI_DRIVER_DATA *Private > - ) > -{ > - EFI_STATUS Status; > - > - Status = EFI_SUCCESS; > - > - if (Private->DevicePath != NULL) { > - Status = gBS->UninstallProtocolInterface ( > - Private->ExtScsiPassThruHandle, > - &gEfiDevicePathProtocolGuid, > - Private->DevicePath > - ); > - if (EFI_ERROR (Status)) { > - goto EXIT; > - } > - > - FreePool (Private->DevicePath); > - } > - > - if (Private->ExtScsiPassThruHandle != NULL) { > - Status = gBS->UninstallProtocolInterface ( > - Private->ExtScsiPassThruHandle, > - &gEfiExtScsiPassThruProtocolGuid, > - &Private->IScsiExtScsiPassThru > - ); > - } > - > -EXIT: > - if (Private->ExitBootServiceEvent != NULL) { > - gBS->CloseEvent (Private->ExitBootServiceEvent); > - } > - > - FreePool (Private); > - return Status; > -} > - > -/** > - Check wheather the Controller is configured to use DHCP protocol. > - > - @param[in] Controller The handle of the controller. > - > - @retval TRUE The handle of the controller need the Dhcp > protocol. > - @retval FALSE The handle of the controller does not need the > Dhcp protocol. > - > -**/ > -BOOLEAN > -IScsiDhcpIsConfigured ( > - IN EFI_HANDLE Controller > - ) > -{ > - EFI_STATUS Status; > - EFI_MAC_ADDRESS MacAddress; > - UINTN HwAddressSize; > - UINT16 VlanId; > - CHAR16 MacString[70]; > - ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp; > - > - // > - // Get the mac string, it's the name of various variable > - // > - Status = NetLibGetMacAddress (Controller, &MacAddress, > &HwAddressSize); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - VlanId = NetLibGetVlanId (Controller); > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > MacString); > - > - // > - // Get the normal configuration. > - // > - Status = GetVariable2 ( > - MacString, > - &gEfiIScsiInitiatorNameProtocolGuid, > - (VOID**)&ConfigDataTmp, > - NULL > - ); > - if (ConfigDataTmp == NULL || EFI_ERROR (Status)) { > - return FALSE; > - } > - > - if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) { > - FreePool (ConfigDataTmp); > - return TRUE; > - } > - > - FreePool (ConfigDataTmp); > - return FALSE; > -} > - > -/** > - Get the various configuration data of this iSCSI instance. > - > - @param[in] Private The iSCSI driver data. > - > - @retval EFI_SUCCESS The configuration of this instance is got. > - @retval EFI_ABORTED The operation was aborted. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiGetConfigData ( > - IN ISCSI_DRIVER_DATA *Private > - ) > -{ > - EFI_STATUS Status; > - ISCSI_SESSION *Session; > - UINTN BufferSize; > - EFI_MAC_ADDRESS MacAddress; > - UINTN HwAddressSize; > - UINT16 VlanId; > - CHAR16 MacString[70]; > - > - // > - // get the iSCSI Initiator Name > - // > - Session = &Private->Session; > - Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE; > - Status = gIScsiInitiatorName.Get ( > - &gIScsiInitiatorName, > - &Session->InitiatorNameLength, > - Session->InitiatorName > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // Get the mac string, it's the name of various variable > - // > - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, > &HwAddressSize); > - ASSERT (Status == EFI_SUCCESS); > - VlanId = NetLibGetVlanId (Private->Controller); > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > MacString); > - > - // > - // Get the normal configuration. > - // > - BufferSize = sizeof (Session->ConfigData.NvData); > - Status = gRT->GetVariable ( > - MacString, > - &gEfiIScsiInitiatorNameProtocolGuid, > - NULL, > - &BufferSize, > - &Session->ConfigData.NvData > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - if (!Session->ConfigData.NvData.Enabled) { > - return EFI_ABORTED; > - } > - // > - // Get the CHAP Auth information. > - // > - BufferSize = sizeof (Session->AuthData.AuthConfig); > - Status = gRT->GetVariable ( > - MacString, > - &gIScsiCHAPAuthInfoGuid, > - NULL, > - &BufferSize, > - &Session->AuthData.AuthConfig > - ); > - > - if (!EFI_ERROR (Status) && Session- > >ConfigData.NvData.InitiatorInfoFromDhcp) { > - // > - // Start dhcp. > - // > - Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session- > >ConfigData); > - } > - > - return Status; > -} > - > -/** > - Get the device path of the iSCSI tcp connection and update it. > - > - @param[in] Private The iSCSI driver data. > - > - @return The updated device path. > - @retval NULL Other errors as indicated. > -**/ > -EFI_DEVICE_PATH_PROTOCOL * > -IScsiGetTcpConnDevicePath ( > - IN ISCSI_DRIVER_DATA *Private > - ) > -{ > - ISCSI_SESSION *Session; > - ISCSI_CONNECTION *Conn; > - TCP4_IO *Tcp4Io; > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > - EFI_STATUS Status; > - EFI_DEV_PATH *DPathNode; > - > - Session = &Private->Session; > - if (Session->State != SESSION_STATE_LOGGED_IN) { > - return NULL; > - } > - > - Conn = NET_LIST_USER_STRUCT_S ( > - Session->Conns.ForwardLink, > - ISCSI_CONNECTION, > - Link, > - ISCSI_CONNECTION_SIGNATURE > - ); > - Tcp4Io = &Conn->Tcp4Io; > - > - Status = gBS->HandleProtocol ( > - Tcp4Io->Handle, > - &gEfiDevicePathProtocolGuid, > - (VOID **)&DevicePath > - ); > - if (EFI_ERROR (Status)) { > - return NULL; > - } > - // > - // Duplicate it. > - // > - DevicePath = DuplicateDevicePath (DevicePath); > - if (DevicePath == NULL) { > - return NULL; > - } > - > - DPathNode = (EFI_DEV_PATH *) DevicePath; > - > - while (!IsDevicePathEnd (&DPathNode->DevPath)) { > - if ((DevicePathType (&DPathNode->DevPath) == > MESSAGING_DEVICE_PATH) && > - (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP) > - ) { > - > - DPathNode->Ipv4.LocalPort = 0; > - DPathNode->Ipv4.StaticIpAddress = > - (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp); > - > - // > - // Add a judgement here to support previous versions of > IPv4_DEVICE_PATH. > - // In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and > SubnetMask > - // do not exist. > - // In new version of IPv4_DEVICE_PATH, structcure length is 27. > - // > - if (DevicePathNodeLength (&DPathNode->Ipv4) == > IP4_NODE_LEN_NEW_VERSIONS) { > - > - IP4_COPY_ADDRESS ( > - &DPathNode->Ipv4.GatewayIpAddress, > - &Session->ConfigData.NvData.Gateway > - ); > - > - IP4_COPY_ADDRESS ( > - &DPathNode->Ipv4.SubnetMask, > - &Session->ConfigData.NvData.SubnetMask > - ); > - } > - > - break; > - } > - > - DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode- > >DevPath); > - } > - > - return DevicePath; > -} > - > -/** > - Abort the session when the transition from BS to RT is initiated. > - > - @param[in] Event The event signaled. > - @param[in] Context The iSCSI driver data. > -**/ > -VOID > -EFIAPI > -IScsiOnExitBootService ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - ISCSI_DRIVER_DATA *Private; > - > - Private = (ISCSI_DRIVER_DATA *) Context; > - > - gBS->CloseEvent (Private->ExitBootServiceEvent); > - Private->ExitBootServiceEvent = NULL; > - > - IScsiSessionAbort (&Private->Session); > -} > - > -/** > - Tests whether a controller handle is being managed by IScsi driver. > - > - This function tests whether the driver specified by DriverBindingHandle is > - currently managing the controller specified by ControllerHandle. This test > - is performed by evaluating if the the protocol specified by ProtocolGuid is > - present on ControllerHandle and is was opened by DriverBindingHandle > and Nic > - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. > - If ProtocolGuid is NULL, then ASSERT(). > - > - @param ControllerHandle A handle for a controller to test. > - @param DriverBindingHandle Specifies the driver binding handle for the > - driver. > - @param ProtocolGuid Specifies the protocol that the driver specified > - by DriverBindingHandle opens in its Start() > - function. > - > - @retval EFI_SUCCESS ControllerHandle is managed by the driver > - specified by DriverBindingHandle. > - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the > driver > - specified by DriverBindingHandle. > - > -**/ > -EFI_STATUS > -EFIAPI > -IScsiTestManagedDevice ( > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE DriverBindingHandle, > - IN EFI_GUID *ProtocolGuid > - ) > -{ > - EFI_STATUS Status; > - VOID *ManagedInterface; > - EFI_HANDLE NicControllerHandle; > - > - ASSERT (ProtocolGuid != NULL); > - > - NicControllerHandle = NetLibGetNicHandle (ControllerHandle, > ProtocolGuid); > - if (NicControllerHandle == NULL) { > - return EFI_UNSUPPORTED; > - } > - > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - (EFI_GUID *) ProtocolGuid, > - &ManagedInterface, > - DriverBindingHandle, > - NicControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (!EFI_ERROR (Status)) { > - gBS->CloseProtocol ( > - ControllerHandle, > - (EFI_GUID *) ProtocolGuid, > - DriverBindingHandle, > - NicControllerHandle > - ); > - return EFI_UNSUPPORTED; > - } > - > - if (Status != EFI_ALREADY_STARTED) { > - return EFI_UNSUPPORTED; > - } > - > - return EFI_SUCCESS; > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > deleted file mode 100644 > index b4a5c2d02413..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > +++ /dev/null > @@ -1,2799 +0,0 @@ > -/** @file > - The implementation of iSCSI protocol based on RFC3720. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -UINT32 mDataSegPad = 0; > - > -/** > - Attach the iSCSI connection to the iSCSI session. > - > - @param[in, out] Session The iSCSI session. > - @param[in, out] Conn The iSCSI connection. > -**/ > -VOID > -IScsiAttatchConnection ( > - IN OUT ISCSI_SESSION *Session, > - IN OUT ISCSI_CONNECTION *Conn > - ) > -{ > - InsertTailList (&Session->Conns, &Conn->Link); > - Conn->Session = Session; > - Session->NumConns++; > -} > - > -/** > - Detach the iSCSI connection from the session it belongs to. > - > - @param[in, out] Conn The iSCSI connection. > -**/ > -VOID > -IScsiDetatchConnection ( > - IN OUT ISCSI_CONNECTION *Conn > - ) > -{ > - RemoveEntryList (&Conn->Link); > - Conn->Session->NumConns--; > - Conn->Session = NULL; > -} > - > -/** > - Check the sequence number according to RFC3720. > - > - @param[in, out] ExpSN The currently expected sequence number. > - @param[in] NewSN The sequence number to check. > - > - @retval EFI_SUCCESS The check passed and the ExpSN is increased. > - @retval EFI_NOT_READY Response was sent due to a retransmission > request. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > happened. > -**/ > -EFI_STATUS > -IScsiCheckSN ( > - IN OUT UINT32 *ExpSN, > - IN UINT32 NewSN > - ) > -{ > - if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) { > - if (ISCSI_SEQ_LT (NewSN, *ExpSN)) { > - // > - // Duplicate > - // > - return EFI_NOT_READY; > - } else { > - return EFI_PROTOCOL_ERROR; > - } > - } else { > - // > - // Advance the ExpSN > - // > - (*ExpSN)++; > - return EFI_SUCCESS; > - } > -} > - > -/** > - Update the sequence numbers for the iSCSI command. > - > - @param[in, out] Session The iSCSI session. > - @param[in] MaxCmdSN Maximum CmdSN from the target. > - @param[in] ExpCmdSN Next expected CmdSN from the target. > -**/ > -VOID > -IScsiUpdateCmdSN ( > - IN OUT ISCSI_SESSION *Session, > - IN UINT32 MaxCmdSN, > - IN UINT32 ExpCmdSN > - ) > -{ > - if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) { > - return ; > - } > - > - if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) { > - Session->MaxCmdSN = MaxCmdSN; > - } > - > - if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) { > - Session->ExpCmdSN = ExpCmdSN; > - } > -} > - > -/** > - This function does the iSCSI connection login. > - > - @param[in, out] Conn The iSCSI connection to login. > - > - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI > target. > - @retval EFI_TIMEOUT Timeout happened during the login procedure. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiConnLogin ( > - IN OUT ISCSI_CONNECTION *Conn > - ) > -{ > - EFI_STATUS Status; > - > - // > - // Start the timer, wait 16 seconds to establish the TCP connection. > - // > - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 * > TICKS_PER_SECOND); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - // > - // try to establish the tcp connection > - // > - Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0); > - Conn->State = CONN_STATE_IN_LOGIN; > - > - // > - // connection is established, start the iSCSI Login > - // > - do { > - Status = IScsiSendLoginReq (Conn); > - if (EFI_ERROR (Status)) { > - break; > - } > - > - Status = IScsiReceiveLoginRsp (Conn); > - if (EFI_ERROR (Status)) { > - break; > - } > - } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE); > - > - return Status; > -} > - > -/** > - Reset the iSCSI connection. > - > - @param[in, out] Conn The iSCSI connection to reset. > -**/ > -VOID > -IScsiConnReset ( > - IN OUT ISCSI_CONNECTION *Conn > - ) > -{ > - Tcp4IoReset (&Conn->Tcp4Io); > -} > - > -/** > - Create a TCP connection for the iSCSI session. > - > - @param[in] Private The iSCSI driver data. > - @param[in] Session Maximum CmdSN from the target. > - > - @return The newly created iSCSI connection. > -**/ > -ISCSI_CONNECTION * > -IScsiCreateConnection ( > - IN ISCSI_DRIVER_DATA *Private, > - IN ISCSI_SESSION *Session > - ) > -{ > - ISCSI_CONNECTION *Conn; > - TCP4_IO_CONFIG_DATA Tcp4IoConfig; > - EFI_STATUS Status; > - > - Conn = AllocatePool (sizeof (ISCSI_CONNECTION)); > - if (Conn == NULL) { > - return NULL; > - } > - > - Conn->Signature = ISCSI_CONNECTION_SIGNATURE; > - Conn->State = CONN_STATE_FREE; > - Conn->CurrentStage = ISCSI_SECURITY_NEGOTIATION; > - Conn->NextStage = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION; > - Conn->CHAPStep = ISCSI_CHAP_INITIAL; > - Conn->ExpStatSN = 0; > - Conn->PartialReqSent = FALSE; > - Conn->PartialRspRcvd = FALSE; > - Conn->Cid = Session->NextCid++; > - > - Status = gBS->CreateEvent ( > - EVT_TIMER, > - TPL_CALLBACK, > - NULL, > - NULL, > - &Conn->TimeoutEvent > - ); > - if (EFI_ERROR (Status)) { > - FreePool (Conn); > - return NULL; > - } > - > - NetbufQueInit (&Conn->RspQue); > - > - // > - // set the default connection-only parameters > - // > - Conn->MaxRecvDataSegmentLength = > DEFAULT_MAX_RECV_DATA_SEG_LEN; > - Conn->HeaderDigest = IScsiDigestNone; > - Conn->DataDigest = IScsiDigestNone; > - > - CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp, > sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Tcp4IoConfig.SubnetMask, &Session- > >ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Tcp4IoConfig.Gateway, &Session- > >ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Tcp4IoConfig.RemoteIp, &Session- > >ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS)); > - > - Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort; > - > - // > - // Create the tcp4 IO for this connection > - // > - Status = Tcp4IoCreateSocket ( > - Private->Image, > - Private->Controller, > - &Tcp4IoConfig, > - &Conn->Tcp4Io > - ); > - if (EFI_ERROR (Status)) { > - gBS->CloseEvent (Conn->TimeoutEvent); > - FreePool (Conn); > - Conn = NULL; > - } > - > - return Conn; > -} > - > -/** > - Destroy an iSCSI connection. > - > - @param[in] Conn The connection to destroy. > -**/ > -VOID > -IScsiDestroyConnection ( > - IN ISCSI_CONNECTION *Conn > - ) > -{ > - Tcp4IoDestroySocket (&Conn->Tcp4Io); > - NetbufQueFlush (&Conn->RspQue); > - gBS->CloseEvent (Conn->TimeoutEvent); > - FreePool (Conn); > -} > - > -/** > - Login the iSCSI session. > - > - @param[in] Private The iSCSI driver data. > - > - @retval EFI_SUCCESS The iSCSI session login procedure finished. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NO_MEDIA There was a media error. > - @retval Others Other errors as indicated. > - > -**/ > -EFI_STATUS > -IScsiSessionLogin ( > - IN ISCSI_DRIVER_DATA *Private > - ) > -{ > - EFI_STATUS Status; > - ISCSI_SESSION *Session; > - ISCSI_CONNECTION *Conn; > - EFI_TCP4_PROTOCOL *Tcp4; > - EFI_STATUS MediaStatus; > - > - Session = &Private->Session; > - > - // > - // Check media status before session login > - // > - MediaStatus = EFI_SUCCESS; > - NetLibDetectMediaWaitTimeout (Private->Controller, > ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus); > - if (MediaStatus != EFI_SUCCESS) { > - return EFI_NO_MEDIA; > - } > - > - // > - // Set session identifier > - // > - CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6); > - > - // > - // Create a connection for the session. > - // > - Conn = IScsiCreateConnection (Private, Session); > - if (Conn == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - IScsiAttatchConnection (Session, Conn); > - > - // > - // Login througth the newly created connection. > - // > - Status = IScsiConnLogin (Conn); > - if (EFI_ERROR (Status)) { > - IScsiConnReset (Conn); > - IScsiDetatchConnection (Conn); > - IScsiDestroyConnection (Conn); > - } else { > - Session->State = SESSION_STATE_LOGGED_IN; > - > - gBS->OpenProtocol ( > - Conn->Tcp4Io.Handle, > - &gEfiTcp4ProtocolGuid, > - (VOID **)&Tcp4, > - Private->Image, > - Private->ExtScsiPassThruHandle, > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > - ); > - } > - > - return Status; > -} > - > -/** > - Build and send the iSCSI login request to the iSCSI target according to > - the current login stage. > - > - @param[in] Conn The connection in the iSCSI login phase. > - > - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on > this > - connection. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_DEVICE_ERROR Some kind of device error happened. > -**/ > -EFI_STATUS > -IScsiSendLoginReq ( > - IN ISCSI_CONNECTION *Conn > - ) > -{ > - NET_BUF *Pdu; > - EFI_STATUS Status; > - > - // > - // build the Login Request PDU > - // > - Pdu = IScsiPrepareLoginReq (Conn); > - if (Pdu == NULL) { > - return EFI_DEVICE_ERROR; > - } > - // > - // Send it to the iSCSI target. > - // > - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); > - > - NetbufFree (Pdu); > - > - return Status; > -} > - > -/** > - Receive and process the iSCSI login response. > - > - @param[in] Conn The connection in the iSCSI login phase. > - > - @retval EFI_SUCCESS The iSCSI login response PDU is received and > processed. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiReceiveLoginRsp ( > - IN ISCSI_CONNECTION *Conn > - ) > -{ > - EFI_STATUS Status; > - NET_BUF *Pdu; > - > - Pdu = NULL; > - > - // > - // Receive the iSCSI login response. > - // > - Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - // > - // A Login Response is received, process it. > - // > - ASSERT (Pdu != NULL); > - Status = IScsiProcessLoginRsp (Conn, Pdu); > - > - NetbufFree (Pdu); > - > - return Status; > -} > - > -/** > - Add an iSCSI key-value pair as a string into the data segment of the Login > Request PDU. > - The DataSegmentLength and the actual size of the net buffer containing > this PDU will be > - updated. > - > - @param[in, out] Pdu The iSCSI PDU whose data segment the key- > value pair will > - be added to. > - @param[in] Key The key name string. > - @param[in] Value The value string. > - > - @retval EFI_SUCCESS The key-valu pair is added to the PDU's > datasegment and > - the correspondence length fields are updated. > - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to > add the key-value > - pair. > -**/ > -EFI_STATUS > -IScsiAddKeyValuePair ( > - IN OUT NET_BUF *Pdu, > - IN CHAR8 *Key, > - IN CHAR8 *Value > - ) > -{ > - UINT32 DataSegLen; > - UINT32 KeyLen; > - UINT32 ValueLen; > - UINT32 TotalLen; > - ISCSI_LOGIN_REQUEST *LoginReq; > - CHAR8 *Data; > - > - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL); > - if (LoginReq == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - DataSegLen = NTOH24 (LoginReq->DataSegmentLength); > - > - KeyLen = (UINT32) AsciiStrLen (Key); > - ValueLen = (UINT32) AsciiStrLen (Value); > - > - // > - // 1 byte for the key value separator '=' and 1 byte for the null > - // delimiter after the value. > - // > - TotalLen = KeyLen + 1 + ValueLen + 1; > - > - // > - // Allocate the space for the key-value pair. > - // > - Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL); > - if (Data == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - // > - // Add the key. > - // > - CopyMem (Data, Key, KeyLen); > - Data += KeyLen; > - > - *Data = '='; > - Data++; > - > - // > - // Add the value. > - // > - CopyMem (Data, Value, ValueLen); > - Data += ValueLen; > - > - *Data = '\0'; > - > - // > - // update the DataSegmentLength > - // > - ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen); > - > - return EFI_SUCCESS; > -} > - > -/** > - Prepare the iSCSI login request to be sent according to the current login > status. > - > - @param[in, out] Conn The connection in the iSCSI login phase. > - > - @return The pointer to the net buffer containing the iSCSI login request > built. > - @retval Others Other errors as indicated. > -**/ > -NET_BUF * > -IScsiPrepareLoginReq ( > - IN OUT ISCSI_CONNECTION *Conn > - ) > -{ > - ISCSI_SESSION *Session; > - NET_BUF *Nbuf; > - ISCSI_LOGIN_REQUEST *LoginReq; > - EFI_STATUS Status; > - > - Session = Conn->Session; > - > - Nbuf = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) + > DEFAULT_MAX_RECV_DATA_SEG_LEN); > - if (Nbuf == NULL) { > - return NULL; > - } > - > - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof > (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL); > - ASSERT (LoginReq != NULL); > - ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST)); > - > - // > - // Init the login request pdu > - // > - ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ, > ISCSI_REQ_IMMEDIATE); > - ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage); > - LoginReq->VersionMax = ISCSI_VERSION_MAX; > - LoginReq->VersionMin = ISCSI_VERSION_MIN; > - LoginReq->Tsih = HTONS (Session->Tsih); > - LoginReq->InitiatorTaskTag = HTONL (Session->InitiatorTaskTag); > - LoginReq->Cid = HTONS (Conn->Cid); > - LoginReq->CmdSN = HTONL (Session->CmdSN); > - > - // > - // For the first Login Request on a coonection this is ExpStatSN for the > - // old connection and this field is only valid if the Login Request restarts > - // a connection. > - // For subsequent Login Requests it is used to acknowledge the Login > Responses > - // with their increasing StatSN values. > - // > - LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN); > - CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid)); > - > - if (Conn->PartialRspRcvd) { > - // > - // A partial response, initiator must send an empty Login Request. > - // > - return Nbuf; > - } > - > - switch (Conn->CurrentStage) { > - case ISCSI_SECURITY_NEGOTIATION: > - Status = IScsiCHAPToSendReq (Conn, Nbuf); > - break; > - > - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: > - Status = IScsiFillOpParams (Conn, Nbuf); > - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > - break; > - > - default: > - // > - // something error happens... > - // > - Status = EFI_DEVICE_ERROR; > - break; > - } > - > - if (EFI_ERROR (Status)) { > - NetbufFree (Nbuf); > - Nbuf = NULL; > - } else { > - // > - // Pad the data segment if needed. > - // > - IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq)); > - // > - // Check whether we will issue the stage transition signal? > - // > - Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq, > ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > - } > - > - return Nbuf; > -} > - > -/** > - Process the iSCSI Login Response. > - > - @param[in, out] Conn The connection on which the iSCSI login response is > received. > - @param[in, out] Pdu The iSCSI login response PDU. > - > - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all > check are passed. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > happened. > - @retval EFI_MEDIA_CHANGED Target is redirected. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiProcessLoginRsp ( > - IN OUT ISCSI_CONNECTION *Conn, > - IN OUT NET_BUF *Pdu > - ) > -{ > - EFI_STATUS Status; > - ISCSI_SESSION *Session; > - ISCSI_LOGIN_RESPONSE *LoginRsp; > - BOOLEAN Transit; > - BOOLEAN Continue; > - UINT8 CurrentStage; > - UINT8 NextStage; > - UINT8 *DataSeg; > - UINT32 DataSegLen; > - > - Session = Conn->Session; > - > - LoginRsp = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL); > - if (LoginRsp == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) { > - // > - // It's not a Login Response > - // > - return EFI_PROTOCOL_ERROR; > - } > - // > - // Get the data segment if any. > - // > - DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp); > - if (DataSegLen != 0) { > - DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL); > - } else { > - DataSeg = NULL; > - } > - // > - // Check the status class in the login response PDU. > - // > - switch (LoginRsp->StatusClass) { > - case ISCSI_LOGIN_STATUS_SUCCESS: > - // > - // Just break here, the response and the data segment will be processed > later. > - // > - break; > - > - case ISCSI_LOGIN_STATUS_REDIRECTION: > - // > - // The target may be moved to a different address > - // > - if (DataSeg == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - // > - // Process the TargetAddress key-value strings in the data segment to > update the > - // target address info. > - // > - Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg, > DataSegLen); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - // > - // Session will be restarted on this error status because the Target is > - // redirected by this Login Response. > - // > - return EFI_MEDIA_CHANGED; > - > - default: > - // > - // Initiator Error, Target Error, or any other undefined error code. > - // > - return EFI_PROTOCOL_ERROR; > - } > - // > - // The status is sucess, extract the wanted fields from the header segment. > - // > - Transit = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, > ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT); > - Continue = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, > ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE); > - > - CurrentStage = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp); > - NextStage = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp); > - > - LoginRsp->InitiatorTaskTag = NTOHL (LoginRsp->InitiatorTaskTag); > - > - if ((Transit && Continue) || > - (CurrentStage != Conn->CurrentStage) || > - (!Conn->TransitInitiated && Transit) || > - (Transit && (NextStage != Conn->NextStage)) || > - (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) != > 0) || > - (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag) > - ) { > - // > - // A Login Response with the C bit set to 1 MUST have the T bit set to 0; > - // The CSG in the Login Response MUST be the same with the I-end of this > connection; > - // The T bit can't be 1 if the last Login Response sent by the initiator > doesn't > - // initiate the transistion; > - // The NSG MUST be the same with the I-end of this connection if Transit > is required. > - // The ISID in the Login Response MUST be the same with this session. > - // > - return EFI_PROTOCOL_ERROR; > - } > - > - LoginRsp->StatSN = NTOHL (LoginRsp->StatSN); > - LoginRsp->ExpCmdSN = NTOHL (LoginRsp->ExpCmdSN); > - LoginRsp->MaxCmdSN = NTOHL (LoginRsp->MaxCmdSN); > - > - if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn- > >CHAPStep == ISCSI_CHAP_INITIAL)) { > - // > - // If the Login Request is a leading Login Request, the target MUST use > - // the value presented in CmdSN as the target value for ExpCmdSN. > - // > - if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN != > LoginRsp->ExpCmdSN)) { > - return EFI_PROTOCOL_ERROR; > - } > - > - // > - // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN > - // and ExpCmdSN. > - // > - Conn->ExpStatSN = LoginRsp->StatSN + 1; > - Session->MaxCmdSN = LoginRsp->MaxCmdSN; > - Session->ExpCmdSN = LoginRsp->ExpCmdSN; > - } else { > - // > - // Check the StatSN of this PDU > - // > - Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN); > - if (!EFI_ERROR (Status)) { > - // > - // Update the MaxCmdSN and ExpCmdSN > - // > - IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp- > >ExpCmdSN); > - } else { > - return Status; > - } > - } > - // > - // Trim off the header segment. > - // > - NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD); > - > - // > - // Queue this login response first in case it's a partial response so that > - // later when the full response list is received we can combine these > scattered > - // responses' data segment and then process it. > - // > - NET_GET_REF (Pdu); > - NetbufQueAppend (&Conn->RspQue, Pdu); > - > - Conn->PartialRspRcvd = Continue; > - if (Continue) { > - // > - // It's a partial response, have to wait for another or more > Request/Response > - // conversations to get the full response. > - // > - return EFI_SUCCESS; > - } > - > - switch (CurrentStage) { > - case ISCSI_SECURITY_NEGOTIATION: > - // > - // In security negotiation stage, let CHAP module handle it. > - // > - Status = IScsiCHAPOnRspReceived (Conn); > - break; > - > - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: > - // > - // Response received with negotiation resonse on iSCSI parameters, check > them. > - // > - Status = IScsiCheckOpParams (Conn); > - break; > - > - default: > - // > - // Should never get here. > - // > - Status = EFI_PROTOCOL_ERROR; > - break; > - } > - > - if (Transit && (Status == EFI_SUCCESS)) { > - // > - // Do the state transition. > - // > - Conn->CurrentStage = Conn->NextStage; > - > - if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) { > - Conn->NextStage = ISCSI_FULL_FEATURE_PHASE; > - } else { > - // > - // CurrentStage is iSCSI Full Feature, it's the Login-Final Response, > - // get the TSIH from the Login Response. > - // > - Session->Tsih = NTOHS (LoginRsp->Tsih); > - } > - } > - // > - // Flush the response(s) received. > - // > - NetbufQueFlush (&Conn->RspQue); > - > - return Status; > -} > - > -/** > - Updated the target information according the data received in the iSCSI > - login response with an target redirection status. > - > - @param[in, out] Session The iSCSI session. > - @param[in] Data The data segment which should contain the > - TargetAddress key-value list. > - @param[in] Len Length of the data. > - > - @retval EFI_SUCCESS The target address is updated. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NOT_FOUND The TargetAddress key is not found. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiUpdateTargetAddress ( > - IN OUT ISCSI_SESSION *Session, > - IN CHAR8 *Data, > - IN UINT32 Len > - ) > -{ > - LIST_ENTRY *KeyValueList; > - CHAR8 *TargetAddress; > - CHAR8 *IpStr; > - EFI_STATUS Status; > - UINTN Number; > - > - KeyValueList = IScsiBuildKeyValueList (Data, Len); > - if (KeyValueList == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Status = EFI_NOT_FOUND; > - > - while (TRUE) { > - TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_TARGET_ADDRESS); > - if (TargetAddress == NULL) { > - break; > - } > - > - if (!NET_IS_DIGIT (TargetAddress[0])) { > - // > - // The domainname of the target may be presented in three formats: a > DNS host name, > - // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only > accept dotted > - // IPv4 address. > - // > - continue; > - } > - > - IpStr = TargetAddress; > - > - while ((*TargetAddress != 0) && (*TargetAddress != ':') && > (*TargetAddress != ',')) { > - // > - // NULL, ':' or ',' ends the IPv4 string. > - // > - TargetAddress++; > - } > - > - if (*TargetAddress == ',') { > - // > - // Comma and the portal group tag MUST be ommitted if the > TargetAddress is sent > - // as the result of a redirection. > - // > - continue; > - } else if (*TargetAddress == ':') { > - *TargetAddress = '\0'; > - > - TargetAddress++; > - > - Number = AsciiStrDecimalToUintn (TargetAddress); > - if (Number > 0xFFFF) { > - continue; > - } else { > - Session->ConfigData.NvData.TargetPort = (UINT16) Number; > - } > - } else { > - // > - // The string only contains the IPv4 address. Use the well known port. > - // > - Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT; > - } > - // > - // Update the target IP address. > - // > - Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp); > - if (EFI_ERROR (Status)) { > - continue; > - } else { > - break; > - } > - } > - > - IScsiFreeKeyValueList (KeyValueList); > - > - return Status; > -} > - > -/** > - The callback function to free the net buffer list. > - > - @param[in] Arg The opaque parameter. > -**/ > -VOID > -EFIAPI > -IScsiFreeNbufList ( > - VOID *Arg > - ) > -{ > - ASSERT (Arg != NULL); > - > - NetbufFreeList ((LIST_ENTRY *) Arg); > - FreePool (Arg); > -} > - > -/** > - The callback function called in NetBufFree, it does nothing. > - > - @param[in] Arg The opaque parameter. > -**/ > -VOID > -EFIAPI > -IScsiNbufExtFree ( > - VOID *Arg > - ) > -{ > -} > - > -/** > - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI > PDU header and > - an optional data segment. The two parts will be put into two blocks of > buffers in the > - net buffer. The digest check will be conducted in this function if needed > and the digests > - will be trimmed from the PDU buffer. > - > - @param[in] Conn The iSCSI connection to receive data from. > - @param[out] Pdu The received iSCSI pdu. > - @param[in] Context The context used to describe information on the > caller provided > - buffer to receive data segment of the iSCSI pdu, it's optional. > - @param[in] HeaderDigest Whether there will be header digest received. > - @param[in] DataDigest Whether there will be data digest. > - @param[in] TimeoutEvent The timeout event, it's optional. > - > - @retval EFI_SUCCESS An iSCSI pdu is received. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > happened. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiReceivePdu ( > - IN ISCSI_CONNECTION *Conn, > - OUT NET_BUF **Pdu, > - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL > - IN BOOLEAN HeaderDigest, > - IN BOOLEAN DataDigest, > - IN EFI_EVENT TimeoutEvent OPTIONAL > - ) > -{ > - LIST_ENTRY *NbufList; > - UINT32 Len; > - NET_BUF *PduHdr; > - UINT8 *Header; > - EFI_STATUS Status; > - UINT32 PadLen; > - UINT32 InDataOffset; > - NET_FRAGMENT Fragment[2]; > - UINT32 FragmentCount; > - NET_BUF *DataSeg; > - UINT32 PadAndCRC32[2]; > - > - NbufList = AllocatePool (sizeof (LIST_ENTRY)); > - if (NbufList == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - InitializeListHead (NbufList); > - > - // > - // The header digest will be received together with the PDU header if > exists. > - // > - Len = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0); > - PduHdr = NetbufAlloc (Len); > - if (PduHdr == NULL) { > - FreePool (NbufList); > - return EFI_OUT_OF_RESOURCES; > - } > - > - Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL); > - ASSERT (Header != NULL); > - InsertTailList (NbufList, &PduHdr->List); > - > - // > - // First step, receive the BHS of the PDU. > - // > - Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - if (HeaderDigest) { > - // > - // TODO: check the header-digest. > - // > - // > - // Trim off the digest. > - // > - NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL); > - } > - > - Len = ISCSI_GET_DATASEG_LEN (Header); > - if (Len == 0) { > - // > - // No data segment.Form the pdu from a list of pdu segments. > - // > - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); > - if (*Pdu == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ON_EXIT; > - } > - return Status; > - } > - // > - // Get the length of the padding bytes of the data segment. > - // > - PadLen = ISCSI_GET_PAD_LEN (Len); > - > - switch (ISCSI_GET_OPCODE (Header)) { > - case ISCSI_OPCODE_SCSI_DATA_IN: > - // > - // Try to use the buffer described by Context if the PDU is an > - // iSCSI SCSI data in pdu so as to reduce memory copy overhead. > - // > - InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header); > - if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) { > - Status = EFI_PROTOCOL_ERROR; > - goto ON_EXIT; > - } > - > - Fragment[0].Len = Len; > - Fragment[0].Bulk = Context->InData + InDataOffset; > - > - if (DataDigest || (PadLen != 0)) { > - // > - // The data segment is padded, use two fragments to receive it. > - // The first to receive the useful data. The second to receive the padding. > - // > - Fragment[1].Len = PadLen + (DataDigest ? sizeof (UINT32) : 0); > - Fragment[1].Bulk = (UINT8 *)PadAndCRC32 + (4 - PadLen); > - FragmentCount = 2; > - } else { > - FragmentCount = 1; > - } > - > - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, > IScsiNbufExtFree, NULL); > - if (DataSeg == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ON_EXIT; > - } > - > - break; > - > - case ISCSI_OPCODE_SCSI_RSP: > - case ISCSI_OPCODE_NOP_IN: > - case ISCSI_OPCODE_LOGIN_RSP: > - case ISCSI_OPCODE_TEXT_RSP: > - case ISCSI_OPCODE_ASYNC_MSG: > - case ISCSI_OPCODE_REJECT: > - case ISCSI_OPCODE_VENDOR_T0: > - case ISCSI_OPCODE_VENDOR_T1: > - case ISCSI_OPCODE_VENDOR_T2: > - // > - // Allocate buffer to receive the data segment. > - // > - Len += PadLen + (DataDigest ? sizeof (UINT32) : 0); > - DataSeg = NetbufAlloc (Len); > - if (DataSeg == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ON_EXIT; > - } > - > - NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL); > - break; > - > - default: > - Status = EFI_PROTOCOL_ERROR; > - goto ON_EXIT; > - } > - > - InsertTailList (NbufList, &DataSeg->List); > - > - // > - // Receive the data segment with the data digest if any. > - // > - Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - if (DataDigest) { > - // > - // TODO: Check the data digest. > - // > - NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL); > - } > - > - if (PadLen != 0) { > - // > - // Trim off the padding bytes in the data segment. > - // > - NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL); > - } > - > - // > - // Form the pdu from a list of pdu segments. > - // > - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); > - if (*Pdu == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - } > - > -ON_EXIT: > - > - if (EFI_ERROR (Status)) { > - // > - // Free the Nbufs in this NbufList and the NbufList itself. > - // > - IScsiFreeNbufList (NbufList); > - } > - > - return Status; > -} > - > -/** > - Check and get the result of the prameter negotiation. > - > - @param[in, out] Conn The connection in iSCSI login. > - > - @retval EFI_SUCCESS The parmeter check is passed and negotiation is > finished. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > happened. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > -**/ > -EFI_STATUS > -IScsiCheckOpParams ( > - IN OUT ISCSI_CONNECTION *Conn > - ) > -{ > - EFI_STATUS Status; > - LIST_ENTRY *KeyValueList; > - CHAR8 *Data; > - UINT32 Len; > - ISCSI_SESSION *Session; > - CHAR8 *Value; > - UINTN NumericValue; > - > - ASSERT (Conn->RspQue.BufNum != 0); > - > - Session = Conn->Session; > - > - Len = Conn->RspQue.BufSize; > - Data = AllocatePool (Len); > - if (Data == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data); > - > - Status = EFI_PROTOCOL_ERROR; > - > - // > - // Extract the Key-Value pairs into a list. > - // > - KeyValueList = IScsiBuildKeyValueList (Data, Len); > - if (KeyValueList == NULL) { > - FreePool (Data); > - return Status; > - } > - // > - // HeaderDigest > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_HEADER_DIGEST); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - if (AsciiStrCmp (Value, "CRC32") == 0) { > - if (Conn->HeaderDigest != IScsiDigestCRC32) { > - goto ON_ERROR; > - } > - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { > - Conn->HeaderDigest = IScsiDigestNone; > - } else { > - goto ON_ERROR; > - } > - // > - // DataDigest > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_DATA_DIGEST); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - if (AsciiStrCmp (Value, "CRC32") == 0) { > - if (Conn->DataDigest != IScsiDigestCRC32) { > - goto ON_ERROR; > - } > - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { > - Conn->DataDigest = IScsiDigestNone; > - } else { > - goto ON_ERROR; > - } > - // > - // ErrorRecoveryLevel, result fuction is Minimum. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_ERROR_RECOVERY_LEVEL); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - NumericValue = AsciiStrDecimalToUintn (Value); > - if (NumericValue > 2) { > - goto ON_ERROR; > - } > - > - Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel, > NumericValue); > - > - // > - // InitialR2T, result function is OR. > - // > - if (!Session->InitialR2T) { > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_INITIAL_R2T); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); > - } > - > - // > - // ImmediateData, result function is AND. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_IMMEDIATE_DATA); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && > (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0)); > - > - // > - // MaxRecvDataSegmentLength is declarative. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH); > - if (Value != NULL) { > - Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn > (Value); > - } > - // > - // MaxBurstLength, result funtion is Mininum. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_MAX_BURST_LENGTH); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - NumericValue = AsciiStrDecimalToUintn (Value); > - Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength, > NumericValue); > - > - // > - // FirstBurstLength, result function is Minimum. Irrelevant when > InitialR2T=Yes and > - // ImmediateData=No. > - // This Key/Value is negotiation type. > - // > - if (!(Session->InitialR2T && !Session->ImmediateData)) { > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_FIRST_BURST_LENGTH); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - NumericValue = AsciiStrDecimalToUintn (Value); > - Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, > NumericValue); > - } > - > - // > - // MaxConnections, result function is Minimum. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_MAX_CONNECTIONS); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - NumericValue = AsciiStrDecimalToUintn (Value); > - if ((NumericValue == 0) || (NumericValue > 65535)) { > - goto ON_ERROR; > - } > - > - Session->MaxConnections = (UINT32) MIN (Session->MaxConnections, > NumericValue); > - > - // > - // DataPDUInOrder, result function is OR. > - // > - if (!Session->DataPDUInOrder) { > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_DATA_PDU_IN_ORDER); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); > - } > - > - // > - // DataSequenceInorder, result function is OR. > - // > - if (!Session->DataSequenceInOrder) { > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") > == 0); > - } > - > - // > - // DefaultTime2Wait, result function is Maximum. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_DEFAULT_TIME2WAIT); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - NumericValue = AsciiStrDecimalToUintn (Value); > - if (NumericValue == 0) { > - Session->DefaultTime2Wait = 0; > - } else if (NumericValue > 3600) { > - goto ON_ERROR; > - } else { > - Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait, > NumericValue); > - } > - // > - // DefaultTime2Retain, result function is Minimum. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_DEFAULT_TIME2RETAIN); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - NumericValue = AsciiStrDecimalToUintn (Value); > - if (NumericValue == 0) { > - Session->DefaultTime2Retain = 0; > - } else if (NumericValue > 3600) { > - goto ON_ERROR; > - } else { > - Session->DefaultTime2Retain = (UINT32) MIN (Session- > >DefaultTime2Retain, NumericValue); > - } > - // > - // MaxOutstandingR2T, result function is Minimum. > - // > - Value = IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_MAX_OUTSTANDING_R2T); > - if (Value == NULL) { > - goto ON_ERROR; > - } > - > - NumericValue = AsciiStrDecimalToUintn (Value); > - if ((NumericValue == 0) || (NumericValue > 65535)) { > - goto ON_ERROR; > - } > - > - Session->MaxOutstandingR2T = (UINT16) MIN (Session- > >MaxOutstandingR2T, NumericValue); > - > - // > - // Remove declarative key-value pairs, if any. > - // > - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE); > - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS); > - IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); > - // > - // Remove the key-value that may not needed for result function is OR. > - // > - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T); > - IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_DATA_PDU_IN_ORDER); > - IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); > - > - // > - // Remove irrelevant parameter, if any. > - // > - if (Session->InitialR2T && !Session->ImmediateData) { > - IScsiGetValueByKeyFromList (KeyValueList, > ISCSI_KEY_FIRST_BURST_LENGTH); > - } > - > - if (IsListEmpty (KeyValueList)) { > - // > - // Succeed if no more keys in the list. > - // > - Status = EFI_SUCCESS; > - } > - > -ON_ERROR: > - > - IScsiFreeKeyValueList (KeyValueList); > - > - FreePool (Data); > - > - return Status; > -} > - > -/** > - Fill the oprational prameters. > - > - @param[in] Conn The connection in iSCSI login. > - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters. > - > - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login > request PDU. > -**/ > -EFI_STATUS > -IScsiFillOpParams ( > - IN ISCSI_CONNECTION *Conn, > - IN OUT NET_BUF *Pdu > - ) > -{ > - ISCSI_SESSION *Session; > - CHAR8 Value[256]; > - > - Session = Conn->Session; > - > - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest == > IScsiDigestCRC32) ? "None,CRC32" : "None"); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest == > IScsiDigestCRC32) ? "None,CRC32" : "None"); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No"); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" : > "No"); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", > MAX_RECV_DATA_SEG_LEN_IN_FFP); > - IScsiAddKeyValuePair (Pdu, > ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" : > "No"); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ? > "Yes" : "No"); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER, > Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value); > - > - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value); > - > - return EFI_SUCCESS; > -} > - > -/** > - Pad the iSCSI AHS or data segment to an integer number of 4 byte words. > - > - @param[in, out] Pdu The iSCSI pdu which contains segments to pad. > - @param[in] Len The length of the last semgnet in the PDU. > - > - @retval EFI_SUCCESS The segment is padded or no need to pad it. > - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free > space to add the > - padding bytes. > -**/ > -EFI_STATUS > -IScsiPadSegment ( > - IN OUT NET_BUF *Pdu, > - IN UINT32 Len > - ) > -{ > - UINT32 PadLen; > - UINT8 *Data; > - > - PadLen = ISCSI_GET_PAD_LEN (Len); > - > - if (PadLen != 0) { > - Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL); > - if (Data == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - ZeroMem (Data, PadLen); > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Build a key-value list from the data segment. > - > - @param[in] Data The data segment containing the key-value pairs. > - @param[in] Len Length of the data segment. > - > - @return The key-value list. > - @retval NULL Other errors as indicated. > -**/ > -LIST_ENTRY * > -IScsiBuildKeyValueList ( > - IN CHAR8 *Data, > - IN UINT32 Len > - ) > -{ > - LIST_ENTRY *ListHead; > - ISCSI_KEY_VALUE_PAIR *KeyValuePair; > - > - ListHead = AllocatePool (sizeof (LIST_ENTRY)); > - if (ListHead == NULL) { > - return NULL; > - } > - > - InitializeListHead (ListHead); > - > - while (Len > 0) { > - KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR)); > - if (KeyValuePair == NULL) { > - goto ON_ERROR; > - } > - > - InitializeListHead (&KeyValuePair->List); > - > - KeyValuePair->Key = Data; > - > - while ((Len > 0) && (*Data != '=')) { > - Len--; > - Data++; > - } > - > - if (*Data == '=') { > - *Data = '\0'; > - > - Data++; > - Len--; > - } else { > - FreePool (KeyValuePair); > - goto ON_ERROR; > - } > - > - KeyValuePair->Value = Data; > - > - InsertTailList (ListHead, &KeyValuePair->List);; > - > - Data += AsciiStrLen (KeyValuePair->Value) + 1; > - Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1; > - } > - > - return ListHead; > - > -ON_ERROR: > - > - IScsiFreeKeyValueList (ListHead); > - > - return NULL; > -} > - > -/** > - Get the value string by the key name from the key-value list. If found, > - the key-value entry will be removed from the list. > - > - @param[in, out] KeyValueList The key-value list. > - @param[in] Key The key name to find. > - > - @return The value string. > -**/ > -CHAR8 * > -IScsiGetValueByKeyFromList ( > - IN OUT LIST_ENTRY *KeyValueList, > - IN CHAR8 *Key > - ) > -{ > - LIST_ENTRY *Entry; > - ISCSI_KEY_VALUE_PAIR *KeyValuePair; > - CHAR8 *Value; > - > - Value = NULL; > - > - NET_LIST_FOR_EACH (Entry, KeyValueList) { > - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, > List); > - > - if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) { > - Value = KeyValuePair->Value; > - > - RemoveEntryList (&KeyValuePair->List); > - FreePool (KeyValuePair); > - break; > - } > - } > - > - return Value; > -} > - > -/** > - Free the key-value list. > - > - @param[in] KeyValueList The key-value list. > -**/ > -VOID > -IScsiFreeKeyValueList ( > - IN LIST_ENTRY *KeyValueList > - ) > -{ > - LIST_ENTRY *Entry; > - ISCSI_KEY_VALUE_PAIR *KeyValuePair; > - > - while (!IsListEmpty (KeyValueList)) { > - Entry = NetListRemoveHead (KeyValueList); > - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, > List); > - > - FreePool (KeyValuePair); > - } > - > - FreePool (KeyValueList); > -} > - > -/** > - Normalize the iSCSI name according to RFC. > - > - @param[in, out] Name The iSCSI name. > - @param[in] Len length of the iSCSI name. > - > - @retval EFI_SUCCESS The iSCSI name is valid and normalized. > - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in > the IQN format. > -**/ > -EFI_STATUS > -IScsiNormalizeName ( > - IN OUT CHAR8 *Name, > - IN UINTN Len > - ) > -{ > - UINTN Index; > - > - for (Index = 0; Index < Len; Index++) { > - if (NET_IS_UPPER_CASE_CHAR (Name[Index])) { > - // > - // Convert the upper-case characters to lower-case ones > - // > - Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a'); > - } > - > - if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) && > - !NET_IS_DIGIT (Name[Index]) && > - (Name[Index] != '-') && > - (Name[Index] != '.') && > - (Name[Index] != ':') > - ) { > - // > - // ASCII dash, dot, colon lower-case characters and digit characters > - // are allowed. > - // > - return EFI_PROTOCOL_ERROR; > - } > - } > - > - if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) { > - // > - // Only IQN format is accepted now. > - // > - return EFI_PROTOCOL_ERROR; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Create an iSCSI task control block. > - > - @param[in] Conn The connection on which the task control block will > be created. > - @param[out] Tcb The newly created task control block. > - > - @retval EFI_SUCCESS The task control block is created. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NOT_READY The target can not accept new commands. > -**/ > -EFI_STATUS > -IScsiNewTcb ( > - IN ISCSI_CONNECTION *Conn, > - OUT ISCSI_TCB **Tcb > - ) > -{ > - ISCSI_SESSION *Session; > - ISCSI_TCB *NewTcb; > - > - ASSERT (Tcb != NULL); > - > - Session = Conn->Session; > - > - if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) { > - return EFI_NOT_READY; > - } > - > - NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB)); > - if (NewTcb == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - InitializeListHead (&NewTcb->Link); > - > - NewTcb->SoFarInOrder = TRUE; > - NewTcb->InitiatorTaskTag = Session->InitiatorTaskTag; > - NewTcb->CmdSN = Session->CmdSN; > - NewTcb->Conn = Conn; > - > - InsertTailList (&Session->TcbList, &NewTcb->Link); > - > - // > - // Advance the initiator task tag. > - // > - Session->InitiatorTaskTag++; > - Session->CmdSN++; > - > - *Tcb = NewTcb; > - > - return EFI_SUCCESS; > -} > - > -/** > - Delete the tcb from the connection and destroy it. > - > - @param[in] Tcb The tcb to delete. > -**/ > -VOID > -IScsiDelTcb ( > - IN ISCSI_TCB *Tcb > - ) > -{ > - RemoveEntryList (&Tcb->Link); > - > - FreePool (Tcb); > -} > - > - > -/** > - Create a data segment, pad it and calculate the CRC if needed. > - > - @param[in] Data The data to fill into the data segment. > - @param[in] Len Length of the data. > - @param[in] DataDigest Whether to calculate CRC for this data segment. > - > - @return The net buffer wrapping the data segment. > -**/ > -NET_BUF * > -IScsiNewDataSegment ( > - IN UINT8 *Data, > - IN UINT32 Len, > - IN BOOLEAN DataDigest > - ) > -{ > - NET_FRAGMENT Fragment[2]; > - UINT32 FragmentCount; > - UINT32 PadLen; > - NET_BUF *DataSeg; > - > - Fragment[0].Len = Len; > - Fragment[0].Bulk = Data; > - > - PadLen = ISCSI_GET_PAD_LEN (Len); > - if (PadLen != 0) { > - Fragment[1].Len = PadLen; > - Fragment[1].Bulk = (UINT8 *) &mDataSegPad; > - > - FragmentCount = 2; > - } else { > - FragmentCount = 1; > - } > - > - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, > IScsiNbufExtFree, NULL); > - > - return DataSeg; > -} > - > -/** > - Create a iSCSI SCSI command PDU to encapsulate the command issued > - by SCSI through the EXT SCSI PASS THRU Protocol. > - > - @param[in] Packet The EXT SCSI PASS THRU request packet containing the > SCSI command. > - @param[in] Lun The LUN. > - @param[in] Tcb The tcb associated with this SCSI command. > - > - @return The created iSCSI SCSI command PDU. > - @retval NULL Other errors as indicated. > -**/ > -NET_BUF * > -IScsiNewScsiCmdPdu ( > - IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, > - IN UINT64 Lun, > - IN ISCSI_TCB *Tcb > - ) > -{ > - LIST_ENTRY *NbufList; > - NET_BUF *Pdu; > - NET_BUF *PduHeader; > - NET_BUF *DataSeg; > - SCSI_COMMAND *ScsiCmd; > - UINT8 AHSLength; > - UINT32 Length; > - ISCSI_ADDITIONAL_HEADER *Header; > - ISCSI_BI_EXP_READ_DATA_LEN_AHS *BiExpReadDataLenAHS; > - ISCSI_SESSION *Session; > - UINT32 ImmediateDataLen; > - > - AHSLength = 0; > - > - if (Packet->DataDirection == DataBi) { > - // > - // Bi directional Read/Write command, the bidirectional expected > - // read data length AHS is required. > - // > - AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS); > - } > - > - if (Packet->CdbLength > 16) { > - // > - // The CDB exceeds 16 bytes, an extended CDB AHS is required. > - // > - AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet- > >CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER))); > - } > - > - Length = sizeof (SCSI_COMMAND) + AHSLength; > - PduHeader = NetbufAlloc (Length); > - if (PduHeader == NULL) { > - return NULL; > - } > - > - ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length, > NET_BUF_TAIL); > - if (ScsiCmd == NULL) { > - NetbufFree (PduHeader); > - return NULL; > - } > - Header = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1); > - > - ZeroMem (ScsiCmd, Length); > - > - ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0); > - ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE); > - > - // > - // Set the READ/WRITE flags according to the IO type of this request. > - // > - switch (Packet->DataDirection) { > - case DataIn: > - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ); > - ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength); > - break; > - > - case DataOut: > - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE); > - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); > - break; > - > - case DataBi: > - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ | > SCSI_CMD_PDU_FLAG_WRITE); > - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); > - > - // > - // Fill the bidirectional expected read data length AHS. > - // > - BiExpReadDataLenAHS = (ISCSI_BI_EXP_READ_DATA_LEN_AHS > *) Header; > - Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1); > - > - BiExpReadDataLenAHS->Length = NTOHS (5); > - BiExpReadDataLenAHS->Type = > ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN; > - BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet- > >InTransferLength); > - > - break; > - } > - > - ScsiCmd->TotalAHSLength = AHSLength; > - CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun)); > - ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag); > - ScsiCmd->CmdSN = NTOHL (Tcb->CmdSN); > - ScsiCmd->ExpStatSN = NTOHL (Tcb->Conn->ExpStatSN); > - > - CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb)); > - > - if (Packet->CdbLength > 16) { > - Header->Length = NTOHS ((UINT16) (Packet->CdbLength - 15)); > - Header->Type = ISCSI_AHS_TYPE_EXT_CDB; > - > - CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength - > 16); > - } > - > - Pdu = PduHeader; > - Session = Tcb->Conn->Session; > - ImmediateDataLen = 0; > - > - if (Session->ImmediateData && (Packet->OutTransferLength != 0)) { > - // > - // Send immediate data in this SCSI Command PDU. The length of the > immeidate > - // data is the minimum of FirstBurstLength, the data length to be xfered > and > - // the MaxRecvdataSegmentLength on this connection. > - // > - ImmediateDataLen = MIN (Session->FirstBurstLength, Packet- > >OutTransferLength); > - ImmediateDataLen = MIN (ImmediateDataLen, Tcb->Conn- > >MaxRecvDataSegmentLength); > - > - // > - // Update the data segment length in the PDU header. > - // > - ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen); > - > - // > - // Create the data segment. > - // > - DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer, > ImmediateDataLen, FALSE); > - if (DataSeg == NULL) { > - NetbufFree (PduHeader); > - Pdu = NULL; > - goto ON_EXIT; > - } > - > - NbufList = AllocatePool (sizeof (LIST_ENTRY)); > - if (NbufList == NULL) { > - NetbufFree (PduHeader); > - NetbufFree (DataSeg); > - > - Pdu = NULL; > - goto ON_EXIT; > - } > - > - InitializeListHead (NbufList); > - InsertTailList (NbufList, &PduHeader->List); > - InsertTailList (NbufList, &DataSeg->List); > - > - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); > - if (Pdu == NULL) { > - IScsiFreeNbufList (NbufList); > - } > - } > - > - if (Session->InitialR2T || > - (ImmediateDataLen == Session->FirstBurstLength) || > - (ImmediateDataLen == Packet->OutTransferLength) > - ) { > - // > - // Unsolicited data out sequence is not allowed, > - // or FirstBurstLength data is already sent out by immediate data > - // or all the OUT data accompany this SCSI packet is sent as > - // immediate data, the final flag should be set on this SCSI Command > - // PDU. > - // > - ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL); > - } > - > -ON_EXIT: > - > - return Pdu; > -} > - > -/** > - Create a new iSCSI SCSI Data Out PDU. > - > - @param[in] Data The data to put into the Data Out PDU. > - @param[in] Len Length of the data. > - @param[in] DataSN The DataSN of the Data Out PDU. > - @param[in] Tcb The task control block of this Data Out PDU. > - @param[in] Lun The LUN. > - > - @return The net buffer wrapping the Data Out PDU. > - @retval NULL Other errors as indicated. > -**/ > -NET_BUF * > -IScsiNewDataOutPdu ( > - IN UINT8 *Data, > - IN UINT32 Len, > - IN UINT32 DataSN, > - IN ISCSI_TCB *Tcb, > - IN UINT64 Lun > - ) > -{ > - LIST_ENTRY *NbufList; > - NET_BUF *PduHdr; > - NET_BUF *DataSeg; > - NET_BUF *Pdu; > - ISCSI_SCSI_DATA_OUT *DataOutHdr; > - ISCSI_XFER_CONTEXT *XferContext; > - > - NbufList = AllocatePool (sizeof (LIST_ENTRY)); > - if (NbufList == NULL) { > - return NULL; > - } > - > - InitializeListHead (NbufList); > - > - // > - // Allocate memory for the BHS. > - // > - PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT)); > - if (PduHdr == NULL) { > - FreePool (NbufList); > - return NULL; > - } > - // > - // Insert the BHS into the buffer list. > - // > - InsertTailList (NbufList, &PduHdr->List); > - > - DataOutHdr = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr, > sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL); > - ASSERT (DataOutHdr != NULL); > - XferContext = &Tcb->XferContext; > - > - ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT)); > - > - // > - // Set the flags and fields of the Data Out PDU BHS. > - // > - ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0); > - ISCSI_SET_DATASEG_LEN (DataOutHdr, Len); > - > - DataOutHdr->InitiatorTaskTag = HTONL (Tcb->InitiatorTaskTag); > - DataOutHdr->TargetTransferTag = HTONL (XferContext- > >TargetTransferTag); > - DataOutHdr->ExpStatSN = HTONL (Tcb->Conn->ExpStatSN); > - DataOutHdr->DataSN = HTONL (DataSN); > - DataOutHdr->BufferOffset = HTONL (XferContext->Offset); > - > - if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) { > - CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun)); > - } > - // > - // Build the data segment for this Data Out PDU. > - // > - DataSeg = IScsiNewDataSegment (Data, Len, FALSE); > - if (DataSeg == NULL) { > - IScsiFreeNbufList (NbufList); > - return NULL; > - } > - // > - // Put the data segment into the buffer list and combine it with the BHS > - // into a full Data Out PDU. > - // > - InsertTailList (NbufList, &DataSeg->List); > - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); > - if (Pdu == NULL) { > - IScsiFreeNbufList (NbufList); > - } > - > - return Pdu; > -} > - > -/** > - Generate a consecutive sequence of iSCSI SCSI Data Out PDUs. > - > - @param[in] Data The data which will be carried by the sequence of iSCSI > SCSI Data Out PDUs. > - @param[in] Tcb The task control block of the data to send out. > - @param[in] Lun The LUN the data will be sent to. > - > - @return A list of net buffers with each of them wraps an iSCSI SCSI Data > Out PDU. > - @retval NULL Other errors as indicated. > -**/ > -LIST_ENTRY * > -IScsiGenerateDataOutPduSequence ( > - IN UINT8 *Data, > - IN ISCSI_TCB *Tcb, > - IN UINT64 Lun > - ) > -{ > - LIST_ENTRY *PduList; > - UINT32 DataSN; > - UINT32 DataLen; > - NET_BUF *DataOutPdu; > - ISCSI_CONNECTION *Conn; > - ISCSI_XFER_CONTEXT *XferContext; > - UINT8 *DataOutPacket; > - > - PduList = AllocatePool (sizeof (LIST_ENTRY)); > - if (PduList == NULL) { > - return NULL; > - } > - > - InitializeListHead (PduList); > - > - DataSN = 0; > - Conn = Tcb->Conn; > - DataOutPdu = NULL; > - XferContext = &Tcb->XferContext; > - > - while (XferContext->DesiredLength > 0) { > - // > - // Determine the length of data this Data Out PDU can carry. > - // > - DataLen = MIN (XferContext->DesiredLength, Conn- > >MaxRecvDataSegmentLength); > - > - // > - // Create a Data Out PDU. > - // > - DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun); > - if (DataOutPdu == NULL) { > - IScsiFreeNbufList (PduList); > - PduList = NULL; > - > - goto ON_EXIT; > - } > - > - InsertTailList (PduList, &DataOutPdu->List); > - > - // > - // Update the context and DataSN. > - // > - XferContext->Offset += DataLen; > - XferContext->DesiredLength -= DataLen; > - DataSN++; > - Data += DataLen; > - } > - // > - // Set the F bit for the last data out PDU in this sequence. > - // > - DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL); > - if (DataOutPacket == NULL) { > - IScsiFreeNbufList (PduList); > - PduList = NULL; > - goto ON_EXIT; > - } > - > - ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL); > - > -ON_EXIT: > - > - return PduList; > -} > - > -/** > - Send the Data in a sequence of Data Out PDUs one by one. > - > - @param[in] Data The data to carry by Data Out PDUs. > - @param[in] Lun The LUN the data will be sent to. > - @param[in] Tcb The task control block. > - > - @retval EFI_SUCCES The data is sent out to the LUN. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiSendDataOutPduSequence ( > - IN UINT8 *Data, > - IN UINT64 Lun, > - IN ISCSI_TCB *Tcb > - ) > -{ > - LIST_ENTRY *DataOutPduList; > - LIST_ENTRY *Entry; > - NET_BUF *Pdu; > - EFI_STATUS Status; > - > - // > - // Generate the Data Out PDU sequence. > - // > - DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun); > - if (DataOutPduList == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Status = EFI_SUCCESS; > - > - // > - // Send the Data Out PDU's one by one. > - // > - NET_LIST_FOR_EACH (Entry, DataOutPduList) { > - Pdu = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > - > - Status = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu); > - if (EFI_ERROR (Status)) { > - break; > - } > - } > - > - IScsiFreeNbufList (DataOutPduList); > - > - return Status; > -} > - > -/** > - Process the received iSCSI SCSI Data In PDU. > - > - @param[in] Pdu The Data In PDU received. > - @param[in] Tcb The task control block. > - @param[in, out] Packet The EXT SCSI PASS THRU request packet. > - > - @retval EFI_SUCCES The check on the Data IN PDU is passed and > some update > - actions are taken. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > happened. > - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the > request. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiOnDataInRcvd ( > - IN NET_BUF *Pdu, > - IN ISCSI_TCB *Tcb, > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > - ) > -{ > - ISCSI_SCSI_DATA_IN *DataInHdr; > - EFI_STATUS Status; > - > - DataInHdr = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0, > NULL); > - if (DataInHdr == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - > - DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag); > - DataInHdr->ExpCmdSN = NTOHL (DataInHdr->ExpCmdSN); > - DataInHdr->MaxCmdSN = NTOHL (DataInHdr->MaxCmdSN); > - DataInHdr->DataSN = NTOHL (DataInHdr->DataSN); > - > - // > - // Check the DataSN. > - // > - Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { > - return EFI_PROTOCOL_ERROR; > - } > - // > - // Update the command related sequence numbers. > - // > - IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN, > DataInHdr->ExpCmdSN); > - > - if (ISCSI_FLAG_ON (DataInHdr, > SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) { > - if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) { > - // > - // The S bit is on but the F bit is off. > - // > - return EFI_PROTOCOL_ERROR; > - } > - > - Tcb->StatusXferd = TRUE; > - > - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW | > SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) { > - // > - // Underflow and Overflow are mutual flags. > - // > - return EFI_PROTOCOL_ERROR; > - } > - // > - // S bit is on, the StatSN is valid. > - // > - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr- > >StatSN)); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Packet->HostAdapterStatus = 0; > - Packet->TargetStatus = DataInHdr->Status; > - > - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { > - Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount); > - Status = EFI_BAD_BUFFER_SIZE; > - } > - > - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { > - Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount); > - } > - } > - > - return Status; > -} > - > -/** > - Process the received iSCSI R2T PDU. > - > - @param[in] Pdu The R2T PDU received. > - @param[in] Tcb The task control block. > - @param[in] Lun The Lun. > - @param[in, out] Packet The EXT SCSI PASS THRU request packet. > - > - @retval EFI_SUCCES The R2T PDU is valid and the solicited data is sent > out. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > happened. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiOnR2TRcvd ( > - IN NET_BUF *Pdu, > - IN ISCSI_TCB *Tcb, > - IN UINT64 Lun, > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > - ) > -{ > - ISCSI_READY_TO_TRANSFER *R2THdr; > - EFI_STATUS Status; > - ISCSI_XFER_CONTEXT *XferContext; > - UINT8 *Data; > - > - R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL); > - if (R2THdr == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - > - R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag); > - R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag); > - R2THdr->StatSN = NTOHL (R2THdr->StatSN); > - R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum); > - R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset); > - R2THdr->DesiredDataTransferLength = NTOHL (R2THdr- > >DesiredDataTransferLength); > - > - if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ > (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) { > - return EFI_PROTOCOL_ERROR;; > - } > - // > - // Check the sequence number. > - // > - Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - XferContext = &Tcb->XferContext; > - XferContext->TargetTransferTag = R2THdr->TargetTransferTag; > - XferContext->Offset = R2THdr->BufferOffset; > - XferContext->DesiredLength = R2THdr->DesiredDataTransferLength; > - > - if (((XferContext->Offset + XferContext->DesiredLength) > Packet- > >OutTransferLength) || > - (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength) > - ) { > - return EFI_PROTOCOL_ERROR; > - } > - // > - // Send the data solicited by this R2T. > - // > - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; > - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); > - > - return Status; > -} > - > -/** > - Process the received iSCSI SCSI Response PDU. > - > - @param[in] Pdu The Response PDU received. > - @param[in] Tcb The task control block. > - @param[in, out] Packet The EXT SCSI PASS THRU request packet. > - > - @retval EFI_SUCCES The Response PDU is processed. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > happened. > - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the > request. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiOnScsiRspRcvd ( > - IN NET_BUF *Pdu, > - IN ISCSI_TCB *Tcb, > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > - ) > -{ > - SCSI_RESPONSE *ScsiRspHdr; > - ISCSI_SENSE_DATA *SenseData; > - EFI_STATUS Status; > - UINT32 DataSegLen; > - > - ScsiRspHdr = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL); > - if (ScsiRspHdr == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - > - ScsiRspHdr->InitiatorTaskTag = NTOHL (ScsiRspHdr->InitiatorTaskTag); > - if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { > - return EFI_PROTOCOL_ERROR; > - } > - > - ScsiRspHdr->StatSN = NTOHL (ScsiRspHdr->StatSN); > - > - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr- > >StatSN); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - ScsiRspHdr->MaxCmdSN = NTOHL (ScsiRspHdr->MaxCmdSN); > - ScsiRspHdr->ExpCmdSN = NTOHL (ScsiRspHdr->ExpCmdSN); > - IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN, > ScsiRspHdr->ExpCmdSN); > - > - Tcb->StatusXferd = TRUE; > - > - Packet->HostAdapterStatus = ScsiRspHdr->Response; > - if (Packet->HostAdapterStatus != > ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) { > - return EFI_SUCCESS; > - } > - > - Packet->TargetStatus = ScsiRspHdr->Status; > - > - if (ISCSI_FLAG_ON (ScsiRspHdr, > SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW | > SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) || > - ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW | > SCSI_RSP_PDU_FLAG_UNDERFLOW) > - ) { > - return EFI_PROTOCOL_ERROR; > - } > - > - if (ISCSI_FLAG_ON (ScsiRspHdr, > SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) { > - Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount); > - Status = EFI_BAD_BUFFER_SIZE; > - } > - > - if (ISCSI_FLAG_ON (ScsiRspHdr, > SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) { > - Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount); > - } > - > - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { > - if (Packet->DataDirection == DataIn) { > - Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount); > - } else { > - Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount); > - } > - > - Status = EFI_BAD_BUFFER_SIZE; > - } > - > - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { > - if (Packet->DataDirection == DataIn) { > - Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); > - } else { > - Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); > - } > - } > - > - DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr); > - if (DataSegLen != 0) { > - SenseData = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof > (SCSI_RESPONSE), NULL); > - if (SenseData == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - > - SenseData->Length = NTOHS (SenseData->Length); > - > - Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet- > >SenseDataLength); > - if (Packet->SenseDataLength != 0) { > - CopyMem (Packet->SenseData, &SenseData->Data[0], Packet- > >SenseDataLength); > - } > - } else { > - Packet->SenseDataLength = 0; > - } > - > - return Status; > -} > - > -/** > - Process the received NOP In PDU. > - > - @param[in] Pdu The NOP In PDU received. > - @param[in] Tcb The task control block. > - > - @retval EFI_SUCCES The NOP In PDU is processed and the related > sequence > - numbers are updated. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > happened. > -**/ > -EFI_STATUS > -IScsiOnNopInRcvd ( > - IN NET_BUF *Pdu, > - IN ISCSI_TCB *Tcb > - ) > -{ > - ISCSI_NOP_IN *NopInHdr; > - EFI_STATUS Status; > - > - NopInHdr = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL); > - if (NopInHdr == NULL) { > - return EFI_PROTOCOL_ERROR; > - } > - > - NopInHdr->StatSN = NTOHL (NopInHdr->StatSN); > - NopInHdr->ExpCmdSN = NTOHL (NopInHdr->ExpCmdSN); > - NopInHdr->MaxCmdSN = NTOHL (NopInHdr->MaxCmdSN); > - > - if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) { > - if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) { > - return EFI_PROTOCOL_ERROR; > - } > - } else { > - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - } > - > - IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN, > NopInHdr->ExpCmdSN); > - > - return EFI_SUCCESS; > -} > - > -/** > - Execute the SCSI command issued through the EXT SCSI PASS THRU > protocol. > - > - @param[in] PassThru The EXT SCSI PASS THRU protocol. > - @param[in] Target The target ID. > - @param[in] Lun The LUN. > - @param[in, out] Packet The request packet containing IO request, SCSI > command > - buffer and buffers to read/write. > - > - @retval EFI_SUCCES The SCSI command is executed and the result is > updated to > - the Packet. > - @retval EFI_DEVICE_ERROR Session state was not as required. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NOT_READY The target can not accept new commands. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiExecuteScsiCommand ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, > - IN UINT8 *Target, > - IN UINT64 Lun, > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > - ) > -{ > - EFI_STATUS Status; > - ISCSI_DRIVER_DATA *Private; > - ISCSI_SESSION *Session; > - EFI_EVENT TimeoutEvent; > - ISCSI_CONNECTION *Conn; > - ISCSI_TCB *Tcb; > - NET_BUF *Pdu; > - ISCSI_XFER_CONTEXT *XferContext; > - UINT8 *Data; > - ISCSI_IN_BUFFER_CONTEXT InBufferContext; > - UINT64 Timeout; > - UINT8 *PduHdr; > - > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); > - Session = &Private->Session; > - Status = EFI_SUCCESS; > - Tcb = NULL; > - TimeoutEvent = NULL; > - Timeout = 0; > - > - if (Session->State != SESSION_STATE_LOGGED_IN) { > - Status = EFI_DEVICE_ERROR; > - goto ON_EXIT; > - } > - > - Conn = NET_LIST_USER_STRUCT_S ( > - Session->Conns.ForwardLink, > - ISCSI_CONNECTION, > - Link, > - ISCSI_CONNECTION_SIGNATURE > - ); > - > - if (Packet->Timeout != 0) { > - Timeout = MultU64x32 (Packet->Timeout, 2); > - } > - > - Status = IScsiNewTcb (Conn, &Tcb); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - // > - // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU. > - // > - Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb); > - if (Pdu == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ON_EXIT; > - } > - > - XferContext = &Tcb->XferContext; > - PduHdr = NetbufGetByte (Pdu, 0, NULL); > - if (PduHdr == NULL) { > - Status = EFI_PROTOCOL_ERROR; > - NetbufFree (Pdu); > - goto ON_EXIT; > - } > - XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr); > - > - // > - // Transmit the SCSI Command PDU. > - // > - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); > - > - NetbufFree (Pdu); > - > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - if (!Session->InitialR2T && > - (XferContext->Offset < Session->FirstBurstLength) && > - (XferContext->Offset < Packet->OutTransferLength) > - ) { > - // > - // Unsolicited Data-Out sequence is allowed, there is remaining SCSI > - // OUT data and the limit of FirstBurstLength is not reached. > - // > - XferContext->TargetTransferTag = ISCSI_RESERVED_TAG; > - XferContext->DesiredLength = MIN ( > - Session->FirstBurstLength, > - Packet->OutTransferLength - XferContext->Offset > - ); > - > - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; > - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - } > - > - InBufferContext.InData = (UINT8 *) Packet->InDataBuffer; > - InBufferContext.InDataLen = Packet->InTransferLength; > - > - while (!Tcb->StatusXferd) { > - // > - // Start the timeout timer. > - // > - if (Timeout != 0) { > - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - TimeoutEvent = Conn->TimeoutEvent; > - } > - // > - // try to receive PDU from target. > - // > - Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE, > TimeoutEvent); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - PduHdr = NetbufGetByte (Pdu, 0, NULL); > - if (PduHdr == NULL) { > - Status = EFI_PROTOCOL_ERROR; > - NetbufFree (Pdu); > - goto ON_EXIT; > - } > - switch (ISCSI_GET_OPCODE (PduHdr)) { > - case ISCSI_OPCODE_SCSI_DATA_IN: > - Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet); > - break; > - > - case ISCSI_OPCODE_R2T: > - Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet); > - break; > - > - case ISCSI_OPCODE_SCSI_RSP: > - Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet); > - break; > - > - case ISCSI_OPCODE_NOP_IN: > - Status = IScsiOnNopInRcvd (Pdu, Tcb); > - break; > - > - case ISCSI_OPCODE_VENDOR_T0: > - case ISCSI_OPCODE_VENDOR_T1: > - case ISCSI_OPCODE_VENDOR_T2: > - // > - // These messages are vendor specific, skip them. > - // > - break; > - > - default: > - Status = EFI_PROTOCOL_ERROR; > - break; > - } > - > - NetbufFree (Pdu); > - > - if (EFI_ERROR (Status)) { > - break; > - } > - } > - > -ON_EXIT: > - > - if (TimeoutEvent != NULL) { > - gBS->SetTimer (TimeoutEvent, TimerCancel, 0); > - } > - > - if (Tcb != NULL) { > - IScsiDelTcb (Tcb); > - } > - > - return Status; > -} > - > -/** > - Reinstate the session on some error. > - > - @param[in, out] Private The iSCSI driver data. > - > - @retval EFI_SUCCES The session is reinstated from some error. > - @retval Other Reinstatement failed. > -**/ > -EFI_STATUS > -IScsiSessionReinstatement ( > - IN OUT ISCSI_DRIVER_DATA *Private > - ) > -{ > - ISCSI_SESSION *Session; > - EFI_STATUS Status; > - > - Session = &Private->Session; > - ASSERT (Session->State != SESSION_STATE_FREE); > - > - // > - // Abort the session and re-init it. > - // > - IScsiSessionAbort (Session); > - IScsiSessionInit (Session, TRUE); > - > - // > - // Login again. > - // > - Status = IScsiSessionLogin (Private); > - > - return Status; > -} > - > -/** > - Initialize some session parameters before login. > - > - @param[in, out] Session The iSCSI session. > - @param[in] Recovery Whether the request is from a fresh new start or > recovery. > -**/ > -VOID > -IScsiSessionInit ( > - IN OUT ISCSI_SESSION *Session, > - IN BOOLEAN Recovery > - ) > -{ > - if (!Recovery) { > - Session->Signature = ISCSI_SESSION_SIGNATURE; > - Session->State = SESSION_STATE_FREE; > - > - InitializeListHead (&Session->Conns); > - InitializeListHead (&Session->TcbList); > - } > - > - Session->Tsih = 0; > - > - Session->CmdSN = 1; > - Session->InitiatorTaskTag = 1; > - Session->NextCid = 1; > - > - Session->TargetPortalGroupTag = 0; > - Session->MaxConnections = ISCSI_MAX_CONNS_PER_SESSION; > - Session->InitialR2T = FALSE; > - Session->ImmediateData = TRUE; > - Session->MaxBurstLength = 262144; > - Session->FirstBurstLength = MAX_RECV_DATA_SEG_LEN_IN_FFP; > - Session->DefaultTime2Wait = 2; > - Session->DefaultTime2Retain = 20; > - Session->MaxOutstandingR2T = DEFAULT_MAX_OUTSTANDING_R2T; > - Session->DataPDUInOrder = TRUE; > - Session->DataSequenceInOrder = TRUE; > - Session->ErrorRecoveryLevel = 0; > -} > - > -/** > - Abort the iSCSI session, that is, reset all the connection and free the > - resources. > - > - @param[in, out] Session The iSCSI session. > - > - @retval EFI_SUCCES The session is aborted. > -**/ > -EFI_STATUS > -IScsiSessionAbort ( > - IN OUT ISCSI_SESSION *Session > - ) > -{ > - ISCSI_DRIVER_DATA *Private; > - ISCSI_CONNECTION *Conn; > - > - if (Session->State != SESSION_STATE_LOGGED_IN) { > - return EFI_SUCCESS; > - } > - > - ASSERT (!IsListEmpty (&Session->Conns)); > - > - Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session); > - > - while (!IsListEmpty (&Session->Conns)) { > - Conn = NET_LIST_USER_STRUCT_S ( > - Session->Conns.ForwardLink, > - ISCSI_CONNECTION, > - Link, > - ISCSI_CONNECTION_SIGNATURE > - ); > - > - gBS->CloseProtocol ( > - Conn->Tcp4Io.Handle, > - &gEfiTcp4ProtocolGuid, > - Private->Image, > - Private->ExtScsiPassThruHandle > - ); > - > - IScsiConnReset (Conn); > - > - IScsiDetatchConnection (Conn); > - IScsiDestroyConnection (Conn); > - } > - > - Session->State = SESSION_STATE_FAILED; > - > - return EFI_SUCCESS; > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > deleted file mode 100644 > index 901b38e92fc0..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > +++ /dev/null > @@ -1,487 +0,0 @@ > -/** @file > - The wrap of TCP/IP Socket interface. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "IScsiImpl.h" > - > -/** > - The common notify function associated with various Tcp4Io events. > - > - @param[in] Event The event signaled. > - @param[in] Context The context. > -**/ > -VOID > -EFIAPI > -Tcp4IoCommonNotify ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - *((BOOLEAN *) Context) = TRUE; > -} > - > -/** > - Create a TCP socket with the specified configuration data. > - > - @param[in] Image The handle of the driver image. > - @param[in] Controller The handle of the controller. > - @param[in] ConfigData The Tcp4 configuration data. > - @param[in] Tcp4Io The Tcp4Io. > - > - @retval EFI_SUCCESS The TCP socket is created and configured. > - @retval Others Failed to create the TCP socket or configure it. > -**/ > -EFI_STATUS > -Tcp4IoCreateSocket ( > - IN EFI_HANDLE Image, > - IN EFI_HANDLE Controller, > - IN TCP4_IO_CONFIG_DATA *ConfigData, > - IN TCP4_IO *Tcp4Io > - ) > -{ > - EFI_STATUS Status; > - EFI_TCP4_PROTOCOL *Tcp4; > - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; > - EFI_TCP4_OPTION ControlOption; > - EFI_TCP4_ACCESS_POINT *AccessPoint; > - > - Tcp4Io->Handle = NULL; > - Tcp4Io->ConnToken.CompletionToken.Event = NULL; > - Tcp4Io->TxToken.CompletionToken.Event = NULL; > - Tcp4Io->RxToken.CompletionToken.Event = NULL; > - Tcp4Io->CloseToken.CompletionToken.Event = NULL; > - Tcp4 = NULL; > - > - // > - // Create the TCP4 child instance and get the TCP4 protocol. > - // > - Status = NetLibCreateServiceChild ( > - Controller, > - Image, > - &gEfiTcp4ServiceBindingProtocolGuid, > - &Tcp4Io->Handle > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Status = gBS->OpenProtocol ( > - Tcp4Io->Handle, > - &gEfiTcp4ProtocolGuid, > - (VOID **)&Tcp4Io->Tcp4, > - Image, > - Controller, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Tcp4Io->Image = Image; > - Tcp4Io->Controller = Controller; > - Tcp4 = Tcp4Io->Tcp4; > - > - // > - // Set the configuration parameters. > - // > - ControlOption.ReceiveBufferSize = 0x200000; > - ControlOption.SendBufferSize = 0x200000; > - ControlOption.MaxSynBackLog = 0; > - ControlOption.ConnectionTimeout = 0; > - ControlOption.DataRetries = 6; > - ControlOption.FinTimeout = 0; > - ControlOption.TimeWaitTimeout = 0; > - ControlOption.KeepAliveProbes = 4; > - ControlOption.KeepAliveTime = 0; > - ControlOption.KeepAliveInterval = 0; > - ControlOption.EnableNagle = FALSE; > - ControlOption.EnableTimeStamp = FALSE; > - ControlOption.EnableWindowScaling = TRUE; > - ControlOption.EnableSelectiveAck = FALSE; > - ControlOption.EnablePathMtuDiscovery = FALSE; > - > - Tcp4ConfigData.TypeOfService = 8; > - Tcp4ConfigData.TimeToLive = 255; > - Tcp4ConfigData.ControlOption = &ControlOption; > - > - AccessPoint = &Tcp4ConfigData.AccessPoint; > - > - AccessPoint->UseDefaultAddress = FALSE; > - AccessPoint->StationPort = 0; > - AccessPoint->RemotePort = ConfigData->RemotePort; > - AccessPoint->ActiveFlag = TRUE; > - > - CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof > (EFI_IPv4_ADDRESS)); > - CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, > sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, > sizeof (EFI_IPv4_ADDRESS)); > - > - // > - // Configure the TCP4 protocol. > - // > - Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) { > - // > - // the gateway is not zero, add the default route by hand > - // > - Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, > &ConfigData->Gateway); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - } > - // > - // Create events for variuos asynchronous operations. > - // > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - Tcp4IoCommonNotify, > - &Tcp4Io->IsConnDone, > - &Tcp4Io->ConnToken.CompletionToken.Event > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - Tcp4IoCommonNotify, > - &Tcp4Io->IsTxDone, > - &Tcp4Io->TxToken.CompletionToken.Event > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - Tcp4IoCommonNotify, > - &Tcp4Io->IsRxDone, > - &Tcp4Io->RxToken.CompletionToken.Event > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - Tcp4IoCommonNotify, > - &Tcp4Io->IsCloseDone, > - &Tcp4Io->CloseToken.CompletionToken.Event > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Tcp4Io->IsTxDone = FALSE; > - Tcp4Io->IsRxDone = FALSE; > - > - return EFI_SUCCESS; > - > -ON_ERROR: > - > - if (Tcp4Io->RxToken.CompletionToken.Event != NULL) { > - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); > - } > - > - if (Tcp4Io->TxToken.CompletionToken.Event != NULL) { > - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); > - } > - > - if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) { > - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); > - } > - > - if (Tcp4 != NULL) { > - Tcp4->Configure (Tcp4, NULL); > - > - gBS->CloseProtocol ( > - Tcp4Io->Handle, > - &gEfiTcp4ProtocolGuid, > - Image, > - Controller > - ); > - } > - > - NetLibDestroyServiceChild ( > - Controller, > - Image, > - &gEfiTcp4ServiceBindingProtocolGuid, > - Tcp4Io->Handle > - ); > - > - return Status; > -} > - > -/** > - Destroy the socket. > - > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. > -**/ > -VOID > -Tcp4IoDestroySocket ( > - IN TCP4_IO *Tcp4Io > - ) > -{ > - EFI_TCP4_PROTOCOL *Tcp4; > - > - Tcp4 = Tcp4Io->Tcp4; > - > - Tcp4->Configure (Tcp4, NULL); > - > - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); > - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); > - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); > - > - gBS->CloseProtocol ( > - Tcp4Io->Handle, > - &gEfiTcp4ProtocolGuid, > - Tcp4Io->Image, > - Tcp4Io->Controller > - ); > - > - NetLibDestroyServiceChild ( > - Tcp4Io->Controller, > - Tcp4Io->Image, > - &gEfiTcp4ServiceBindingProtocolGuid, > - Tcp4Io->Handle > - ); > -} > - > -/** > - Connect to the other endpoint of the TCP socket. > - > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > - @param[in] Timeout The time to wait for connection done. > - > - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket > successfully. > - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the > TCP socket in the specified time period. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -Tcp4IoConnect ( > - IN OUT TCP4_IO *Tcp4Io, > - IN EFI_EVENT Timeout > - ) > -{ > - EFI_TCP4_PROTOCOL *Tcp4; > - EFI_STATUS Status; > - > - Tcp4Io->IsConnDone = FALSE; > - Tcp4 = Tcp4Io->Tcp4; > - Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) > { > - Tcp4->Poll (Tcp4); > - } > - > - if (!Tcp4Io->IsConnDone) { > - Status = EFI_TIMEOUT; > - } else { > - Status = Tcp4Io->ConnToken.CompletionToken.Status; > - } > - > - return Status; > -} > - > -/** > - Reset the socket. > - > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > -**/ > -VOID > -Tcp4IoReset ( > - IN OUT TCP4_IO *Tcp4Io > - ) > -{ > - EFI_STATUS Status; > - EFI_TCP4_PROTOCOL *Tcp4; > - > - Tcp4Io->CloseToken.AbortOnClose = TRUE; > - Tcp4Io->IsCloseDone = FALSE; > - > - Tcp4 = Tcp4Io->Tcp4; > - Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken); > - if (EFI_ERROR (Status)) { > - return ; > - } > - > - while (!Tcp4Io->IsCloseDone) { > - Tcp4->Poll (Tcp4); > - } > -} > - > -/** > - Transmit the Packet to the other endpoint of the socket. > - > - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. > - @param[in] Packet The packet to transmit. > - > - @retval EFI_SUCCESS The packet is trasmitted. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -Tcp4IoTransmit ( > - IN TCP4_IO *Tcp4Io, > - IN NET_BUF *Packet > - ) > -{ > - EFI_TCP4_TRANSMIT_DATA *TxData; > - EFI_TCP4_PROTOCOL *Tcp4; > - EFI_STATUS Status; > - > - TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet- > >BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA)); > - if (TxData == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - TxData->Push = TRUE; > - TxData->Urgent = FALSE; > - TxData->DataLength = Packet->TotalSize; > - > - // > - // Build the fragment table. > - // > - TxData->FragmentCount = Packet->BlockOpNum; > - NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0], > &TxData->FragmentCount); > - > - Tcp4Io->TxToken.Packet.TxData = TxData; > - > - // > - // Trasnmit the packet. > - // > - Tcp4 = Tcp4Io->Tcp4; > - Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - while (!Tcp4Io->IsTxDone) { > - Tcp4->Poll (Tcp4); > - } > - > - Tcp4Io->IsTxDone = FALSE; > - > - Status = Tcp4Io->TxToken.CompletionToken.Status; > - > -ON_EXIT: > - > - FreePool (TxData); > - > - return Status; > -} > - > -/** > - Receive data from the socket. > - > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be > destroyed. > - @param[in] Packet The buffer to hold the data copy from the soket rx > buffer. > - @param[in] AsyncMode Is this receive asyncronous or not. > - @param[in] Timeout The time to wait for receiving the amount of data > the Packet > - can hold. > - > - @retval EFI_SUCCESS The required amount of data is received from > the socket. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. > - @retval EFI_TIMEOUT Failed to receive the required amount of data in > the > - specified time period. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -Tcp4IoReceive ( > - IN TCP4_IO *Tcp4Io, > - IN NET_BUF *Packet, > - IN BOOLEAN AsyncMode, > - IN EFI_EVENT Timeout > - ) > -{ > - EFI_TCP4_PROTOCOL *Tcp4; > - EFI_TCP4_RECEIVE_DATA RxData; > - EFI_STATUS Status; > - NET_FRAGMENT *Fragment; > - UINT32 FragmentCount; > - UINT32 CurrentFragment; > - > - FragmentCount = Packet->BlockOpNum; > - Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT)); > - if (Fragment == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - // > - // Build the fragment table. > - // > - NetbufBuildExt (Packet, Fragment, &FragmentCount); > - > - RxData.FragmentCount = 1; > - Tcp4Io->RxToken.Packet.RxData = &RxData; > - CurrentFragment = 0; > - Tcp4 = Tcp4Io->Tcp4; > - Status = EFI_SUCCESS; > - > - while (CurrentFragment < FragmentCount) { > - RxData.DataLength = Fragment[CurrentFragment].Len; > - RxData.FragmentTable[0].FragmentLength = > Fragment[CurrentFragment].Len; > - RxData.FragmentTable[0].FragmentBuffer = > Fragment[CurrentFragment].Bulk; > - > - Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS- > >CheckEvent (Timeout)))) { > - // > - // Poll until some data is received or something error happens. > - // > - Tcp4->Poll (Tcp4); > - } > - > - if (!Tcp4Io->IsRxDone) { > - // > - // Timeout occurs, cancel the receive request. > - // > - Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken); > - > - Status = EFI_TIMEOUT; > - goto ON_EXIT; > - } else { > - Tcp4Io->IsRxDone = FALSE; > - } > - > - if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) { > - Status = Tcp4Io->RxToken.CompletionToken.Status; > - goto ON_EXIT; > - } > - > - Fragment[CurrentFragment].Len -= > RxData.FragmentTable[0].FragmentLength; > - if (Fragment[CurrentFragment].Len == 0) { > - CurrentFragment++; > - } else { > - Fragment[CurrentFragment].Bulk += > RxData.FragmentTable[0].FragmentLength; > - } > - } > - > -ON_EXIT: > - Tcp4Io->RxToken.Packet.RxData = NULL; > - FreePool (Fragment); > - > - return Status; > -} > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > deleted file mode 100644 > index 3555f1a2ebe3..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > +++ /dev/null > @@ -1,350 +0,0 @@ > -/** @file > - Implementation of MD5 algorithm. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Md5.h" > - > -CONST UINT32 Md5_Data[][2] = { > - { 0, 1 }, > - { 1, 5 }, > - { 5, 3 }, > - { 0, 7 } > -}; > - > -CONST UINT32 Md5_S[][4] = { > - { 7, 22, 17, 12 }, > - { 5, 20, 14, 9 }, > - { 4, 23, 16 ,11 }, > - { 6, 21, 15, 10 }, > -}; > - > -CONST UINT32 Md5_T[] = { > - 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE, > - 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501, > - 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE, > - 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821, > - 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA, > - 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8, > - 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED, > - 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A, > - 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C, > - 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70, > - 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05, > - 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665, > - 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039, > - 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1, > - 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1, > - 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391 > -}; > - > -CONST UINT8 Md5HashPadding[] = > -{ > - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 > -}; > - > -// > -// ROTATE_LEFT rotates x left n bits. > -// > -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) > - > -#define SA MedStates[Index2 & 3] > -#define SB MedStates[(Index2 + 1) & 3] > -#define SC MedStates[(Index2 + 2) & 3] > -#define SD MedStates[(Index2 + 3) & 3] > - > -/** > - Tf1 is one basic MD5 transform function. > - > - @param[in] A A 32-bit quantity. > - @param[in] B A 32-bit quantity. > - @param[in] C A 32-bit quantity. > - > - @return Output was produced as a 32-bit quantity based on the > - three 32-bit input quantity. > -**/ > -UINT32 > -Tf1 ( > - IN UINT32 A, > - IN UINT32 B, > - IN UINT32 C > - ) > -{ > - return (A & B) | (~A & C); > -} > - > -/** > - Tf2 is one basic MD5 transform function. > - > - @param[in] A A 32-bit quantity. > - @param[in] B A 32-bit quantity. > - @param[in] C A 32-bit quantity. > - > - @return Output was produced as a 32-bit quantity based on the > - three 32-bit input quantity. > -**/ > -UINT32 > -Tf2 ( > - IN UINT32 A, > - IN UINT32 B, > - IN UINT32 C > - ) > -{ > - return (A & C) | (B & ~C); > -} > - > -/** > - Tf3 is one basic MD5 transform function. > - > - @param[in] A A 32-bit quantity. > - @param[in] B A 32-bit quantity. > - @param[in] C A 32-bit quantity. > - > - @return Output was produced as a 32-bit quantity based on the > - three 32-bit input quantity. > -**/ > -UINT32 > -Tf3 ( > - IN UINT32 A, > - IN UINT32 B, > - IN UINT32 C > - ) > -{ > - return A ^ B ^ C; > -} > - > -/** > - Tf4 is one basic MD5 transform function. > - > - @param[in] A A 32-bit quantity. > - @param[in] B A 32-bit quantity. > - @param[in] C A 32-bit quantity. > - > - @return Output was produced as a 32-bit quantity based on the > - three 32-bit input quantity. > -**/ > -UINT32 > -Tf4 ( > - IN UINT32 A, > - IN UINT32 B, > - IN UINT32 C > - ) > -{ > - return B ^ (A | ~C); > -} > - > -typedef > -UINT32 > -(*MD5_TRANSFORM_FUNC) ( > - IN UINT32 A, > - IN UINT32 B, > - IN UINT32 C > - ); > - > -CONST MD5_TRANSFORM_FUNC Md5_F[] = { > - Tf1, > - Tf2, > - Tf3, > - Tf4 > -}; > - > -/** > - Perform the MD5 transform on 64 bytes data segment. > - > - @param[in, out] Md5Ctx It includes the data segment for Md5 transform. > -**/ > -VOID > -MD5Transform ( > - IN OUT MD5_CTX *Md5Ctx > - ) > -{ > - UINT32 Index1; > - UINT32 Index2; > - UINT32 MedStates[MD5_HASHSIZE >> 2]; > - UINT32 *Data; > - UINT32 IndexD; > - UINT32 IndexT; > - > - Data = (UINT32 *) Md5Ctx->M; > - > - // > - // Copy MD5 states to MedStates > - // > - CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE); > - > - IndexT = 0; > - for (Index1 = 0; Index1 < 4; Index1++) { > - IndexD = Md5_Data[Index1][0]; > - for (Index2 = 16; Index2 > 0; Index2--) { > - SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT]; > - SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]); > - SA += SB; > - > - IndexD += Md5_Data[Index1][1]; > - IndexD &= 15; > - > - IndexT++; > - } > - } > - > - for (Index1 = 0; Index1 < 4; Index1++) { > - Md5Ctx->States[Index1] += MedStates[Index1]; > - } > -} > - > -/** > - Copy data segment into the M field of MD5_CTX structure for later > transform. > - If the length of data segment is larger than 64 bytes, then does the > transform > - immediately and the generated Md5 code is stored in the States field of > MD5_CTX > - data struct for later accumulation. > - All of Md5 code generated for the sequential 64-bytes data segaments are > be > - accumulated in MD5Final() function. > - > - @param[in, out] Md5Ctx The data structure of storing the original data > - segment and the final result. > - @param[in] Data The data wanted to be transformed. > - @param[in] DataLen The length of data. > -**/ > -VOID > -MD5UpdateBlock ( > - IN OUT MD5_CTX *Md5Ctx, > - IN CONST UINT8 *Data, > - IN UINTN DataLen > - ) > -{ > - UINTN Limit; > - > - for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) > { > - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit); > - MD5Transform (Md5Ctx); > - > - Md5Ctx->Count = 0; > - Data += Limit; > - DataLen -= Limit; > - } > - > - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen); > - Md5Ctx->Count += DataLen; > -} > - > -/** > - Initialize four 32-bits chaining variables and use them to do the Md5 > transform. > - > - @param[out] Md5Ctx The data structure of Md5. > - > - @retval EFI_SUCCESS Initialization is ok. > -**/ > -EFI_STATUS > -MD5Init ( > - OUT MD5_CTX *Md5Ctx > - ) > -{ > - ZeroMem (Md5Ctx, sizeof (*Md5Ctx)); > - > - // > - // Set magic initialization constants. > - // > - Md5Ctx->States[0] = 0x67452301; > - Md5Ctx->States[1] = 0xefcdab89; > - Md5Ctx->States[2] = 0x98badcfe; > - Md5Ctx->States[3] = 0x10325476; > - > - return EFI_SUCCESS; > -} > - > -/** > - the external interface of Md5 algorithm > - > - @param[in, out] Md5Ctx The data structure of storing the original data > - segment and the final result. > - @param[in] Data The data wanted to be transformed. > - @param[in] DataLen The length of data. > - > - @retval EFI_SUCCESS The transform is ok. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -MD5Update ( > - IN OUT MD5_CTX *Md5Ctx, > - IN VOID *Data, > - IN UINTN DataLen > - ) > -{ > - if (EFI_ERROR (Md5Ctx->Status)) { > - return Md5Ctx->Status; > - } > - > - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen); > - Md5Ctx->Length += DataLen; > - return EFI_SUCCESS; > -} > - > -/** > - Accumulate the MD5 value of every data segment and generate the finial > - result according to MD5 algorithm. > - > - @param[in, out] Md5Ctx The data structure of storing the original data > - segment and the final result. > - @param[out] HashVal The final 128-bits output. > - > - @retval EFI_SUCCESS The transform is ok. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -MD5Final ( > - IN OUT MD5_CTX *Md5Ctx, > - OUT UINT8 *HashVal > - ) > -{ > - UINTN PadLength; > - > - if (Md5Ctx->Status == EFI_ALREADY_STARTED) { > - // > - // Store Hashed value & Zeroize sensitive context information. > - // > - CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE); > - ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx)); > - > - return EFI_SUCCESS; > - } > - > - if (EFI_ERROR (Md5Ctx->Status)) { > - return Md5Ctx->Status; > - } > - > - PadLength = Md5Ctx->Count >= 56 ? 120 : 56; > - PadLength -= Md5Ctx->Count; > - MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength); > - Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3); > - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8); > - > - ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M)); > - Md5Ctx->Length = 0; > - Md5Ctx->Status = EFI_ALREADY_STARTED; > - return MD5Final (Md5Ctx, HashVal); > -} > - > diff --git > a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > deleted file mode 100644 > index f1227691ec21..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > +++ /dev/null > @@ -1,433 +0,0 @@ > -/** @file > - UEFI Component Name(2) protocol implementation for Tcp4Dxe driver. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Tcp4Main.h" > - > -/** > - Retrieves a Unicode string that is the user readable name of the driver. > - > - This function retrieves the user readable name of a driver in the form of a > - Unicode string. If the driver specified by This has a user readable name in > - the language specified by Language, then a pointer to the driver name is > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > specified > - by This does not support the language specified by Language, > - then EFI_UNSUPPORTED is returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified > - in RFC 4646 or ISO 639-2 language code format. > - > - @param[out] DriverName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - driver specified by This in the language > - specified by Language. > - > - @retval EFI_SUCCESS The Unicode string for the Driver specified by > - This and the language specified by Language was > - returned in DriverName. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -TcpComponentNameGetDriverName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN CHAR8 *Language, > - OUT CHAR16 **DriverName > - ); > - > - > -/** > - Retrieves a Unicode string that is the user readable name of the controller > - that is being managed by a driver. > - > - This function retrieves the user readable name of the controller specified > by > - ControllerHandle and ChildHandle in the form of a Unicode string. If the > - driver specified by This has a user readable name in the language specified > by > - Language, then a pointer to the controller name is returned in > ControllerName, > - and EFI_SUCCESS is returned. If the driver specified by This is not currently > - managing the controller specified by ControllerHandle and ChildHandle, > - then EFI_UNSUPPORTED is returned. If the driver specified by This does > not > - support the language specified by Language, then EFI_UNSUPPORTED is > returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] ControllerHandle The handle of a controller that the driver > - specified by This is managing. This handle > - specifies the controller whose name is to be > - returned. > - > - @param[in] ChildHandle The handle of the child controller to retrieve > - the name of. This is an optional parameter that > - may be NULL. It will be NULL for device > - drivers. It will also be NULL for a bus drivers > - that wish to retrieve the name of the bus > - controller. It will not be NULL for a bus > - driver that wishes to retrieve the name of a > - child controller. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified in > - RFC 4646 or ISO 639-2 language code format. > - > - @param[out] ControllerName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - controller specified by ControllerHandle and > - ChildHandle in the language specified by > - Language from the point of view of the driver > - specified by This. > - > - @retval EFI_SUCCESS The Unicode string for the user readable name > in > - the language specified by Language for the > - driver specified by This was returned in > - DriverName. > - > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > - > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid > - EFI_HANDLE. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This is not currently > - managing the controller specified by > - ControllerHandle and ChildHandle. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -TcpComponentNameGetControllerName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE ChildHandle OPTIONAL, > - IN CHAR8 *Language, > - OUT CHAR16 **ControllerName > - ); > - > - > -/// > -/// EFI Component Name Protocol > -/// > -GLOBAL_REMOVE_IF_UNREFERENCED > EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = { > - TcpComponentNameGetDriverName, > - TcpComponentNameGetControllerName, > - "eng" > -}; > - > -/// > -/// EFI Component Name 2 Protocol > -/// > -GLOBAL_REMOVE_IF_UNREFERENCED > EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = { > - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) > TcpComponentNameGetDriverName, > - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) > TcpComponentNameGetControllerName, > - "en" > -}; > - > - > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > mTcpDriverNameTable[] = { > - { > - "eng;en", > - L"Tcp Network Service Driver" > - }, > - { > - NULL, > - NULL > - } > -}; > - > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > *gTcpControllerNameTable = NULL; > - > -/** > - Retrieves a Unicode string that is the user readable name of the driver. > - > - This function retrieves the user readable name of a driver in the form of a > - Unicode string. If the driver specified by This has a user readable name in > - the language specified by Language, then a pointer to the driver name is > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > specified > - by This does not support the language specified by Language, > - then EFI_UNSUPPORTED is returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified > - in RFC 4646 or ISO 639-2 language code format. > - > - @param[out] DriverName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - driver specified by This in the language > - specified by Language. > - > - @retval EFI_SUCCESS The Unicode string for the Driver specified by > - This and the language specified by Language was > - returned in DriverName. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -TcpComponentNameGetDriverName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN CHAR8 *Language, > - OUT CHAR16 **DriverName > - ) > -{ > - return LookupUnicodeString2 ( > - Language, > - This->SupportedLanguages, > - mTcpDriverNameTable, > - DriverName, > - (BOOLEAN) (This == &gTcp4ComponentName) > - ); > -} > - > -/** > - Update the component name for the Tcp4 child handle. > - > - @param Tcp4[in] A pointer to the EFI_TCP4_PROTOCOL. > - > - > - @retval EFI_SUCCESS Update the ControllerNameTable of this > instance successfully. > - @retval EFI_INVALID_PARAMETER The input parameter is invalid. > - > -**/ > -EFI_STATUS > -UpdateName ( > - IN EFI_TCP4_PROTOCOL *Tcp4 > - ) > -{ > - EFI_STATUS Status; > - CHAR16 HandleName[80]; > - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; > - > - if (Tcp4 == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Format the child name into the string buffer as: > - // TCPv4 (SrcPort=59, DestPort=60, ActiveFlag=TRUE) > - // > - ZeroMem (&Tcp4ConfigData, sizeof (Tcp4ConfigData)); > - Status = Tcp4->GetModeData (Tcp4, NULL, &Tcp4ConfigData, NULL, NULL, > NULL); > - if (!EFI_ERROR (Status)) { > - UnicodeSPrint (HandleName, sizeof (HandleName), > - L"TCPv4 (SrcPort=%d, DestPort=%d, ActiveFlag=%s)", > - Tcp4ConfigData.AccessPoint.StationPort, > - Tcp4ConfigData.AccessPoint.RemotePort, > - (Tcp4ConfigData.AccessPoint.ActiveFlag ? L"TRUE" : L"FALSE") > - ); > - } else if (Status == EFI_NOT_STARTED) { > - UnicodeSPrint ( > - HandleName, > - sizeof (HandleName), > - L"TCPv4 (Not started)" > - ); > - } else { > - return Status; > - } > - > - if (gTcpControllerNameTable != NULL) { > - FreeUnicodeStringTable (gTcpControllerNameTable); > - gTcpControllerNameTable = NULL; > - } > - > - Status = AddUnicodeString2 ( > - "eng", > - gTcp4ComponentName.SupportedLanguages, > - &gTcpControllerNameTable, > - HandleName, > - TRUE > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - return AddUnicodeString2 ( > - "en", > - gTcp4ComponentName2.SupportedLanguages, > - &gTcpControllerNameTable, > - HandleName, > - FALSE > - ); > -} > - > -/** > - Retrieves a Unicode string that is the user readable name of the controller > - that is being managed by a driver. > - > - This function retrieves the user readable name of the controller specified > by > - ControllerHandle and ChildHandle in the form of a Unicode string. If the > - driver specified by This has a user readable name in the language specified > by > - Language, then a pointer to the controller name is returned in > ControllerName, > - and EFI_SUCCESS is returned. If the driver specified by This is not currently > - managing the controller specified by ControllerHandle and ChildHandle, > - then EFI_UNSUPPORTED is returned. If the driver specified by This does > not > - support the language specified by Language, then EFI_UNSUPPORTED is > returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] ControllerHandle The handle of a controller that the driver > - specified by This is managing. This handle > - specifies the controller whose name is to be > - returned. > - > - @param[in] ChildHandle The handle of the child controller to retrieve > - the name of. This is an optional parameter that > - may be NULL. It will be NULL for device > - drivers. It will also be NULL for a bus drivers > - that wish to retrieve the name of the bus > - controller. It will not be NULL for a bus > - driver that wishes to retrieve the name of a > - child controller. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified in > - RFC 4646 or ISO 639-2 language code format. > - > - @param[out] ControllerName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - controller specified by ControllerHandle and > - ChildHandle in the language specified by > - Language from the point of view of the driver > - specified by This. > - > - @retval EFI_SUCCESS The Unicode string for the user readable name > in > - the language specified by Language for the > - driver specified by This was returned in > - DriverName. > - > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > - > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid > - EFI_HANDLE. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This is not currently > - managing the controller specified by > - ControllerHandle and ChildHandle. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -TcpComponentNameGetControllerName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE ChildHandle OPTIONAL, > - IN CHAR8 *Language, > - OUT CHAR16 **ControllerName > - ) > -{ > - EFI_STATUS Status; > - EFI_TCP4_PROTOCOL *Tcp4; > - > - // > - // Only provide names for child handles. > - // > - if (ChildHandle == NULL) { > - return EFI_UNSUPPORTED; > - } > - > - // > - // Make sure this driver produced ChildHandle > - // > - Status = EfiTestChildHandle ( > - ControllerHandle, > - ChildHandle, > - &gEfiIp4ProtocolGuid > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // Retrieve an instance of a produced protocol from ChildHandle > - // > - Status = gBS->OpenProtocol ( > - ChildHandle, > - &gEfiTcp4ProtocolGuid, > - (VOID **)&Tcp4, > - NULL, > - NULL, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // Update the component name for this child handle. > - // > - Status = UpdateName (Tcp4); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - return LookupUnicodeString2 ( > - Language, > - This->SupportedLanguages, > - gTcpControllerNameTable, > - ControllerName, > - (BOOLEAN)(This == &gTcp4ComponentName) > - ); > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > deleted file mode 100644 > index adb5aa35cdf2..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > +++ /dev/null > @@ -1,1201 +0,0 @@ > -/** @file > - Implementation of the Socket. > - > -Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "SockImpl.h" > - > -/** > - Get the length of the data that can be retrieved from the socket > - receive buffer. > - > - @param SockBuffer Pointer to the socket receive buffer. > - @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is > - OOB. > - @param BufLen The maximum length of the data buffer to store > the > - received data in socket layer. > - > - @return The length of the data can be retreived. > - > -**/ > -UINT32 > -SockTcpDataToRcv ( > - IN SOCK_BUFFER *SockBuffer, > - OUT BOOLEAN *IsUrg, > - IN UINT32 BufLen > - ); > - > -/** > - Process the send token. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockProcessSndToken ( > - IN OUT SOCKET *Sock > - ); > - > -/** > - Supporting function for both SockImpl and SockInterface. > - > - @param Event The Event this notify function registered to, ignored. > - > -**/ > -VOID > -EFIAPI > -SockFreeFoo ( > - IN EFI_EVENT Event > - ) > -{ > - return ; > -} > - > - > -/** > - Get the length of the data that can be retrieved from the socket > - receive buffer. > - > - @param SockBuffer Pointer to the socket receive buffer. > - @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is > - OOB. > - @param BufLen The maximum length of the data buffer to store > the > - received data in socket layer. > - > - @return The length of the data can be retreived. > - > -**/ > -UINT32 > -SockTcpDataToRcv ( > - IN SOCK_BUFFER *SockBuffer, > - OUT BOOLEAN *IsUrg, > - IN UINT32 BufLen > - ) > -{ > - NET_BUF *RcvBufEntry; > - UINT32 DataLen; > - TCP_RSV_DATA *TcpRsvData; > - BOOLEAN Urg; > - ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0)); > - > - RcvBufEntry = SockBufFirst (SockBuffer); > - ASSERT (RcvBufEntry != NULL); > - > - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; > - > - *IsUrg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); > - > - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { > - > - DataLen = MIN (TcpRsvData->UrgLen, BufLen); > - > - if (DataLen < TcpRsvData->UrgLen) { > - TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen; > - } else { > - TcpRsvData->UrgLen = 0; > - } > - > - return DataLen; > - > - } > - > - DataLen = RcvBufEntry->TotalSize; > - > - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); > - > - while ((BufLen > DataLen) && (RcvBufEntry != NULL)) { > - > - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; > - > - Urg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); > - > - if (*IsUrg != Urg) { > - break; > - } > - > - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { > - > - if (TcpRsvData->UrgLen + DataLen < BufLen) { > - TcpRsvData->UrgLen = 0; > - } else { > - TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen); > - } > - > - return MIN (TcpRsvData->UrgLen + DataLen, BufLen); > - > - } > - > - DataLen += RcvBufEntry->TotalSize; > - > - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); > - } > - > - DataLen = MIN (BufLen, DataLen); > - return DataLen; > -} > - > - > -/** > - Copy data from socket buffer to application provided receive buffer. > - > - @param Sock Pointer to the socket. > - @param TcpRxData Pointer to the application provided receive > buffer. > - @param RcvdBytes The maximum length of the data can be copied. > - @param IsOOB If TRUE the data is OOB, FALSE the data is normal. > - > -**/ > -VOID > -SockSetTcpRxData ( > - IN SOCKET *Sock, > - IN VOID *TcpRxData, > - IN UINT32 RcvdBytes, > - IN BOOLEAN IsOOB > - ) > -{ > - UINT32 Index; > - UINT32 CopyBytes; > - UINT32 OffSet; > - EFI_TCP4_RECEIVE_DATA *RxData; > - EFI_TCP4_FRAGMENT_DATA *Fragment; > - > - RxData = (EFI_TCP4_RECEIVE_DATA *) TcpRxData; > - > - OffSet = 0; > - > - ASSERT (RxData->DataLength >= RcvdBytes); > - > - RxData->DataLength = RcvdBytes; > - RxData->UrgentFlag = IsOOB; > - > - for (Index = 0; (Index < RxData->FragmentCount) && (RcvdBytes > 0); > Index++) { > - > - Fragment = &RxData->FragmentTable[Index]; > - CopyBytes = MIN ((UINT32) (Fragment->FragmentLength), RcvdBytes); > - > - NetbufQueCopy ( > - Sock->RcvBuffer.DataQueue, > - OffSet, > - CopyBytes, > - Fragment->FragmentBuffer > - ); > - > - Fragment->FragmentLength = CopyBytes; > - RcvdBytes -= CopyBytes; > - OffSet += CopyBytes; > - } > -} > - > - > -/** > - Get received data from the socket layer to the receive token. > - > - @param Sock Pointer to the socket. > - @param RcvToken Pointer to the application provided receive token. > - > - @return The length of data received in this token. > - > -**/ > -UINT32 > -SockProcessRcvToken ( > - IN SOCKET *Sock, > - IN OUT SOCK_IO_TOKEN *RcvToken > - ) > -{ > - UINT32 TokenRcvdBytes; > - EFI_TCP4_RECEIVE_DATA *RxData; > - BOOLEAN IsUrg; > - > - ASSERT (Sock != NULL); > - > - ASSERT (SockStream == Sock->Type); > - > - RxData = RcvToken->Packet.RxData; > - > - TokenRcvdBytes = SockTcpDataToRcv ( > - &Sock->RcvBuffer, > - &IsUrg, > - (UINT32) RxData->DataLength > - ); > - > - // > - // Copy data from RcvBuffer of socket to user > - // provided RxData and set the fields in TCP RxData > - // > - SockSetTcpRxData (Sock, RxData, TokenRcvdBytes, IsUrg); > - > - NetbufQueTrim (Sock->RcvBuffer.DataQueue, TokenRcvdBytes); > - SIGNAL_TOKEN (&(RcvToken->Token), EFI_SUCCESS); > - > - return TokenRcvdBytes; > -} > - > - > -/** > - Process the TCP send data, buffer the tcp txdata and append > - the buffer to socket send buffer,then try to send it. > - > - @param Sock Pointer to the socket. > - @param TcpTxData Pointer to the application provided send buffer. > - > - @retval EFI_SUCCESS The operation is completed successfully. > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > - > -**/ > -EFI_STATUS > -SockProcessTcpSndData ( > - IN SOCKET *Sock, > - IN VOID *TcpTxData > - ) > -{ > - NET_BUF *SndData; > - EFI_STATUS Status; > - EFI_TCP4_TRANSMIT_DATA *TxData; > - > - TxData = (EFI_TCP4_TRANSMIT_DATA *) TcpTxData; > - > - // > - // transform this TxData into a NET_BUFFER > - // and insert it into Sock->SndBuffer > - // > - SndData = NetbufFromExt ( > - (NET_FRAGMENT *) TxData->FragmentTable, > - (UINT32) TxData->FragmentCount, > - 0, > - 0, > - SockFreeFoo, > - NULL > - ); > - > - if (NULL == SndData) { > - DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to" > - " call NetBufferFromExt\n")); > - > - return EFI_OUT_OF_RESOURCES; > - } > - > - NetbufQueAppend (Sock->SndBuffer.DataQueue, SndData); > - > - // > - // notify the low layer protocol to handle this send token > - // > - if (TxData->Urgent) { > - Status = Sock->ProtoHandler (Sock, SOCK_SNDURG, NULL); > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - } > - > - if (TxData->Push) { > - Status = Sock->ProtoHandler (Sock, SOCK_SNDPUSH, NULL); > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - } > - > - // > - // low layer protocol should really handle the sending > - // process when catching SOCK_SND request > - // > - Status = Sock->ProtoHandler (Sock, SOCK_SND, NULL); > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - return EFI_SUCCESS; > -} > - > - > -/** > - Flush the tokens in the specific token list. > - > - @param Sock Pointer to the socket. > - @param PendingTokenList Pointer to the token list to be flushed. > - > -**/ > -VOID > -SockFlushPendingToken ( > - IN SOCKET *Sock, > - IN LIST_ENTRY *PendingTokenList > - ) > -{ > - SOCK_TOKEN *SockToken; > - SOCK_COMPLETION_TOKEN *Token; > - > - ASSERT ((Sock != NULL) && (PendingTokenList != NULL)); > - > - while (!IsListEmpty (PendingTokenList)) { > - SockToken = NET_LIST_HEAD ( > - PendingTokenList, > - SOCK_TOKEN, > - TokenList > - ); > - > - Token = SockToken->Token; > - SIGNAL_TOKEN (Token, Sock->SockError); > - > - RemoveEntryList (&(SockToken->TokenList)); > - FreePool (SockToken); > - } > -} > - > - > -/** > - Wake up the connection token while the connection is successfully > established, > - then try to process any pending send token. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockWakeConnToken ( > - IN OUT SOCKET *Sock > - ) > -{ > - ASSERT (Sock->ConnectionToken != NULL); > - > - SIGNAL_TOKEN (Sock->ConnectionToken, EFI_SUCCESS); > - Sock->ConnectionToken = NULL; > - > - // > - // check to see if some pending send token existed? > - // > - SockProcessSndToken (Sock); > - return ; > -} > - > - > -/** > - Wake up the listen token while the connection is established successfully. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockWakeListenToken ( > - IN OUT SOCKET *Sock > - ) > -{ > - SOCKET *Parent; > - SOCK_TOKEN *SockToken; > - EFI_TCP4_LISTEN_TOKEN *ListenToken; > - > - Parent = Sock->Parent; > - > - ASSERT ((Parent != NULL) && SOCK_IS_LISTENING (Parent) && > SOCK_IS_CONNECTED (Sock)); > - > - if (!IsListEmpty (&Parent->ListenTokenList)) { > - SockToken = NET_LIST_HEAD ( > - &Parent->ListenTokenList, > - SOCK_TOKEN, > - TokenList > - ); > - > - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) SockToken->Token; > - ListenToken->NewChildHandle = Sock->SockHandle; > - > - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); > - > - RemoveEntryList (&SockToken->TokenList); > - FreePool (SockToken); > - > - RemoveEntryList (&Sock->ConnectionList); > - > - Parent->ConnCnt--; > - DEBUG ((EFI_D_NET, "SockWakeListenToken: accept a socket, now > conncnt is %d", Parent->ConnCnt)); > - > - Sock->Parent = NULL; > - } > -} > - > - > -/** > - Wake up the receive token while some data is received. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockWakeRcvToken ( > - IN SOCKET *Sock > - ) > -{ > - UINT32 RcvdBytes; > - UINT32 TokenRcvdBytes; > - SOCK_TOKEN *SockToken; > - SOCK_IO_TOKEN *RcvToken; > - > - ASSERT (Sock->RcvBuffer.DataQueue != NULL); > - > - RcvdBytes = (Sock->RcvBuffer.DataQueue)->BufSize; > - > - ASSERT (RcvdBytes > 0); > - > - while (RcvdBytes > 0 && !IsListEmpty (&Sock->RcvTokenList)) { > - > - SockToken = NET_LIST_HEAD ( > - &Sock->RcvTokenList, > - SOCK_TOKEN, > - TokenList > - ); > - > - RcvToken = (SOCK_IO_TOKEN *) SockToken->Token; > - TokenRcvdBytes = SockProcessRcvToken (Sock, RcvToken); > - > - if (0 == TokenRcvdBytes) { > - return ; > - } > - > - RemoveEntryList (&(SockToken->TokenList)); > - FreePool (SockToken); > - RcvdBytes -= TokenRcvdBytes; > - } > -} > - > - > -/** > - Process the send token. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockProcessSndToken ( > - IN OUT SOCKET *Sock > - ) > -{ > - UINT32 FreeSpace; > - SOCK_TOKEN *SockToken; > - UINT32 DataLen; > - SOCK_IO_TOKEN *SndToken; > - EFI_TCP4_TRANSMIT_DATA *TxData; > - EFI_STATUS Status; > - > - ASSERT ((Sock != NULL) && (SockStream == Sock->Type)); > - > - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); > - > - // > - // to determine if process a send token using > - // socket layer flow control policy > - // > - while ((FreeSpace >= Sock->SndBuffer.LowWater) && > - !IsListEmpty (&Sock->SndTokenList)) { > - > - SockToken = NET_LIST_HEAD ( > - &(Sock->SndTokenList), > - SOCK_TOKEN, > - TokenList > - ); > - > - // > - // process this token > - // > - RemoveEntryList (&(SockToken->TokenList)); > - InsertTailList ( > - &(Sock->ProcessingSndTokenList), > - &(SockToken->TokenList) > - ); > - > - // > - // Proceess it in the light of SockType > - // > - SndToken = (SOCK_IO_TOKEN *) SockToken->Token; > - TxData = SndToken->Packet.TxData; > - > - DataLen = (UINT32) TxData->DataLength; > - Status = SockProcessTcpSndData (Sock, TxData); > - > - if (EFI_ERROR (Status)) { > - goto OnError; > - } > - > - if (DataLen >= FreeSpace) { > - FreeSpace = 0; > - > - } else { > - FreeSpace -= DataLen; > - > - } > - } > - > - return ; > - > -OnError: > - > - RemoveEntryList (&SockToken->TokenList); > - SIGNAL_TOKEN (SockToken->Token, Status); > - FreePool (SockToken); > -} > - > - > -/** > - Create a socket with initial data SockInitData. > - > - @param SockInitData Pointer to the initial data of the socket. > - > - @return Pointer to the newly created socket, return NULL when exception > occured. > - > -**/ > -SOCKET * > -SockCreate ( > - IN SOCK_INIT_DATA *SockInitData > - ) > -{ > - SOCKET *Sock; > - SOCKET *Parent; > - EFI_STATUS Status; > - > - ASSERT ((SockInitData != NULL) && (SockInitData->ProtoHandler != NULL)); > - ASSERT (SockInitData->Type == SockStream); > - ASSERT ((SockInitData->ProtoData != NULL) && (SockInitData->DataSize <= > PROTO_RESERVED_LEN)); > - > - Parent = SockInitData->Parent; > - > - if ((Parent != NULL) && (Parent->ConnCnt == Parent->BackLog)) { > - DEBUG ( > - (EFI_D_ERROR, > - "SockCreate: Socket parent has " > - "reached its connection limit with %d ConnCnt and %d BackLog\n", > - Parent->ConnCnt, > - Parent->BackLog) > - ); > - > - return NULL; > - } > - > - Sock = AllocateZeroPool (sizeof (SOCKET)); > - if (NULL == Sock) { > - > - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to create a new > socket\n")); > - return NULL; > - } > - > - InitializeListHead (&Sock->Link); > - InitializeListHead (&Sock->ConnectionList); > - InitializeListHead (&Sock->ListenTokenList); > - InitializeListHead (&Sock->RcvTokenList); > - InitializeListHead (&Sock->SndTokenList); > - InitializeListHead (&Sock->ProcessingSndTokenList); > - > - EfiInitializeLock (&(Sock->Lock), TPL_CALLBACK); > - > - Sock->SndBuffer.DataQueue = NetbufQueAlloc (); > - if (NULL == Sock->SndBuffer.DataQueue) { > - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate" > - " SndBuffer for new socket\n")); > - > - goto OnError; > - } > - > - Sock->RcvBuffer.DataQueue = NetbufQueAlloc (); > - if (NULL == Sock->RcvBuffer.DataQueue) { > - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate " > - "RcvBuffer for new socket\n")); > - > - goto OnError; > - } > - > - Sock->Signature = SOCK_SIGNATURE; > - > - Sock->Parent = Parent; > - Sock->BackLog = SockInitData->BackLog; > - Sock->ProtoHandler = SockInitData->ProtoHandler; > - Sock->SndBuffer.HighWater = SockInitData->SndBufferSize; > - Sock->RcvBuffer.HighWater = SockInitData->RcvBufferSize; > - Sock->Type = SockInitData->Type; > - Sock->DriverBinding = SockInitData->DriverBinding; > - Sock->State = SockInitData->State; > - Sock->CreateCallback = SockInitData->CreateCallback; > - Sock->DestroyCallback = SockInitData->DestroyCallback; > - Sock->Context = SockInitData->Context; > - > - Sock->SockError = EFI_ABORTED; > - Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER; > - Sock->RcvBuffer.LowWater = SOCK_BUFF_LOW_WATER; > - > - // > - // Install protocol on Sock->SockHandle > - // > - CopyMem ( > - &(Sock->NetProtocol.TcpProtocol), > - SockInitData->Protocol, > - sizeof (EFI_TCP4_PROTOCOL) > - ); > - > - // > - // copy the protodata into socket > - // > - CopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData- > >DataSize); > - > - Status = gBS->InstallMultipleProtocolInterfaces ( > - &Sock->SockHandle, > - &gEfiTcp4ProtocolGuid, > - &(Sock->NetProtocol.TcpProtocol), > - NULL > - ); > - > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "SockCreate: Install TCP protocol in " > - "socket failed with %r\n", Status)); > - > - goto OnError; > - } > - > - if (Parent != NULL) { > - ASSERT (Parent->BackLog > 0); > - ASSERT (SOCK_IS_LISTENING (Parent)); > - > - // > - // need to add it into Parent->ConnectionList > - // if the Parent->ConnCnt < Parent->BackLog > - // > - Parent->ConnCnt++; > - > - DEBUG ( > - (EFI_D_NET, > - "SockCreate: Create a new socket and add to parent, now conncnt > is %d\n", > - Parent->ConnCnt) > - ); > - > - InsertTailList (&Parent->ConnectionList, &Sock->ConnectionList); > - } > - > - if (Sock->CreateCallback != NULL) { > - Status = Sock->CreateCallback (Sock, Sock->Context); > - if (EFI_ERROR (Status)) { > - goto OnError; > - } > - } > - > - return Sock; > - > -OnError: > - > - if (Sock->SockHandle != NULL) { > - gBS->UninstallMultipleProtocolInterfaces ( > - Sock->SockHandle, > - &gEfiTcp4ProtocolGuid, > - &(Sock->NetProtocol.TcpProtocol), > - NULL > - ); > - } > - > - if (NULL != Sock->SndBuffer.DataQueue) { > - NetbufQueFree (Sock->SndBuffer.DataQueue); > - } > - > - if (NULL != Sock->RcvBuffer.DataQueue) { > - NetbufQueFree (Sock->RcvBuffer.DataQueue); > - } > - > - FreePool (Sock); > - > - return NULL; > -} > - > - > -/** > - Destroy a socket. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockDestroy ( > - IN OUT SOCKET *Sock > - ) > -{ > - ASSERT (SockStream == Sock->Type); > - > - // > - // Flush the completion token buffered > - // by sock and rcv, snd buffer > - // > - if (!SOCK_IS_UNCONFIGURED (Sock)) { > - > - SockConnFlush (Sock); > - SockSetState (Sock, SO_CLOSED); > - Sock->ConfigureState = SO_UNCONFIGURED; > - > - } > - // > - // Destroy the RcvBuffer Queue and SendBuffer Queue > - // > - NetbufQueFree (Sock->RcvBuffer.DataQueue); > - NetbufQueFree (Sock->SndBuffer.DataQueue); > - > - // > - // Remove it from parent connection list if needed > - // > - if (Sock->Parent != NULL) { > - > - RemoveEntryList (&(Sock->ConnectionList)); > - (Sock->Parent->ConnCnt)--; > - > - DEBUG ( > - (EFI_D_NET, > - "SockDestroy: Delete a unaccepted socket from parent" > - "now conncnt is %d\n", > - Sock->Parent->ConnCnt) > - ); > - > - Sock->Parent = NULL; > - } > - > - FreePool (Sock); > - return ; > -} > - > - > -/** > - Flush the sndBuffer and rcvBuffer of socket. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockConnFlush ( > - IN OUT SOCKET *Sock > - ) > -{ > - SOCKET *Child; > - > - ASSERT (Sock != NULL); > - > - // > - // Clear the flag in this socket > - // > - Sock->Flag = 0; > - > - // > - // Flush the SndBuffer and RcvBuffer of Sock > - // > - NetbufQueFlush (Sock->SndBuffer.DataQueue); > - NetbufQueFlush (Sock->RcvBuffer.DataQueue); > - > - // > - // Signal the pending token > - // > - if (Sock->ConnectionToken != NULL) { > - SIGNAL_TOKEN (Sock->ConnectionToken, Sock->SockError); > - Sock->ConnectionToken = NULL; > - } > - > - if (Sock->CloseToken != NULL) { > - SIGNAL_TOKEN (Sock->CloseToken, Sock->SockError); > - Sock->CloseToken = NULL; > - } > - > - SockFlushPendingToken (Sock, &(Sock->ListenTokenList)); > - SockFlushPendingToken (Sock, &(Sock->RcvTokenList)); > - SockFlushPendingToken (Sock, &(Sock->SndTokenList)); > - SockFlushPendingToken (Sock, &(Sock->ProcessingSndTokenList)); > - > - // > - // Destroy the pending connection, if it is a listening socket > - // > - if (SOCK_IS_LISTENING (Sock)) { > - while (!IsListEmpty (&Sock->ConnectionList)) { > - Child = NET_LIST_HEAD ( > - &Sock->ConnectionList, > - SOCKET, > - ConnectionList > - ); > - > - SockDestroyChild (Child); > - } > - > - Sock->ConnCnt = 0; > - } > - > - return ; > -} > - > - > -/** > - Set the state of the socket. > - > - @param Sock Pointer to the socket. > - @param State The new socket state to be set. > - > -**/ > -VOID > -SockSetState ( > - IN OUT SOCKET *Sock, > - IN UINT8 State > - ) > -{ > - Sock->State = State; > -} > - > - > -/** > - Clone a new socket including its associated protocol control block. > - > - @param Sock Pointer to the socket to be cloned. > - > - @return Pointer to the newly cloned socket. If NULL, error condition > occurred. > - > -**/ > -SOCKET * > -SockClone ( > - IN SOCKET *Sock > - ) > -{ > - SOCKET *ClonedSock; > - SOCK_INIT_DATA InitData; > - > - InitData.BackLog = Sock->BackLog; > - InitData.Parent = Sock; > - InitData.State = Sock->State; > - InitData.ProtoHandler = Sock->ProtoHandler; > - InitData.Type = Sock->Type; > - InitData.RcvBufferSize = Sock->RcvBuffer.HighWater; > - InitData.SndBufferSize = Sock->SndBuffer.HighWater; > - InitData.DriverBinding = Sock->DriverBinding; > - InitData.Protocol = &(Sock->NetProtocol); > - InitData.CreateCallback = Sock->CreateCallback; > - InitData.DestroyCallback = Sock->DestroyCallback; > - InitData.Context = Sock->Context; > - InitData.ProtoData = Sock->ProtoReserved; > - InitData.DataSize = sizeof (Sock->ProtoReserved); > - > - ClonedSock = SockCreate (&InitData); > - > - if (NULL == ClonedSock) { > - DEBUG ((EFI_D_ERROR, "SockClone: no resource to create a cloned > sock\n")); > - return NULL; > - } > - > - SockSetState (ClonedSock, SO_CONNECTING); > - ClonedSock->ConfigureState = Sock->ConfigureState; > - > - return ClonedSock; > -} > - > - > -/** > - Called by the low layer protocol to indicate the socket a connection is > - established. > - > - This function just changes the socket's state to SO_CONNECTED > - and signals the token used for connection establishment. > - > - @param Sock Pointer to the socket associated with the > - established connection. > -**/ > -VOID > -SockConnEstablished ( > - IN SOCKET *Sock > - ) > -{ > - > - ASSERT (SO_CONNECTING == Sock->State); > - > - SockSetState (Sock, SO_CONNECTED); > - > - if (NULL == Sock->Parent) { > - SockWakeConnToken (Sock); > - } else { > - SockWakeListenToken (Sock); > - } > - > - return ; > -} > - > - > -/** > - Called by the low layer protocol to indicate the connection is closed. > - > - This function flushes the socket, sets the state to SO_CLOSED and signals > - the close token. > - > - @param Sock Pointer to the socket associated with the closed > - connection. > - > -**/ > -VOID > -SockConnClosed ( > - IN OUT SOCKET *Sock > - ) > -{ > - if (Sock->CloseToken != NULL) { > - SIGNAL_TOKEN (Sock->CloseToken, EFI_SUCCESS); > - Sock->CloseToken = NULL; > - } > - > - SockConnFlush (Sock); > - SockSetState (Sock, SO_CLOSED); > - > - if (Sock->Parent != NULL) { > - SockDestroyChild (Sock); > - } > - > -} > - > - > -/** > - Called by low layer protocol to indicate that some data is sent or processed. > - > - This function trims the sent data in the socket send buffer, signals the data > - token if proper. > - > - @param Sock Pointer to the socket. > - @param Count The length of the data processed or sent, in bytes. > - > -**/ > -VOID > -SockDataSent ( > - IN SOCKET *Sock, > - IN UINT32 Count > - ) > -{ > - SOCK_TOKEN *SockToken; > - SOCK_COMPLETION_TOKEN *SndToken; > - > - ASSERT (!IsListEmpty (&Sock->ProcessingSndTokenList)); > - ASSERT (Count <= (Sock->SndBuffer.DataQueue)->BufSize); > - > - NetbufQueTrim (Sock->SndBuffer.DataQueue, Count); > - > - // > - // To check if we can signal some snd token in this socket > - // > - while (Count > 0) { > - SockToken = NET_LIST_HEAD ( > - &(Sock->ProcessingSndTokenList), > - SOCK_TOKEN, > - TokenList > - ); > - > - SndToken = SockToken->Token; > - > - if (SockToken->RemainDataLen <= Count) { > - > - RemoveEntryList (&(SockToken->TokenList)); > - SIGNAL_TOKEN (SndToken, EFI_SUCCESS); > - Count -= SockToken->RemainDataLen; > - FreePool (SockToken); > - } else { > - > - SockToken->RemainDataLen -= Count; > - Count = 0; > - } > - } > - > - // > - // to judge if we can process some send token in > - // Sock->SndTokenList, if so process those send token > - // > - SockProcessSndToken (Sock); > - return ; > -} > - > - > -/** > - Called by the low layer protocol to copy some data in socket send > - buffer starting from the specific offset to a buffer provided by > - the caller. > - > - @param Sock Pointer to the socket. > - @param Offset The start point of the data to be copied. > - @param Len The length of the data to be copied. > - @param Dest Pointer to the destination to copy the data. > - > - @return The data size copied. > - > -**/ > -UINT32 > -SockGetDataToSend ( > - IN SOCKET *Sock, > - IN UINT32 Offset, > - IN UINT32 Len, > - IN UINT8 *Dest > - ) > -{ > - ASSERT ((Sock != NULL) && SockStream == Sock->Type); > - > - return NetbufQueCopy ( > - Sock->SndBuffer.DataQueue, > - Offset, > - Len, > - Dest > - ); > -} > - > - > -/** > - Called by the low layer protocol to deliver received data to socket layer. > - > - This function will append the data to the socket receive buffer, set ther > - urgent data length and then check if any receive token can be signaled. > - > - @param Sock Pointer to the socket. > - @param NetBuffer Pointer to the buffer that contains the received > - data. > - @param UrgLen The length of the urgent data in the received data. > - > -**/ > -VOID > -SockDataRcvd ( > - IN SOCKET *Sock, > - IN OUT NET_BUF *NetBuffer, > - IN UINT32 UrgLen > - ) > -{ > - ASSERT ((Sock != NULL) && (Sock->RcvBuffer.DataQueue != NULL) && > - UrgLen <= NetBuffer->TotalSize); > - > - NET_GET_REF (NetBuffer); > - > - ((TCP_RSV_DATA *) (NetBuffer->ProtoData))->UrgLen = UrgLen; > - > - NetbufQueAppend (Sock->RcvBuffer.DataQueue, NetBuffer); > - > - SockWakeRcvToken (Sock); > - return ; > -} > - > - > -/** > - Get the length of the free space of the specific socket buffer. > - > - @param Sock Pointer to the socket. > - @param Which Flag to indicate which socket buffer to check, > - either send buffer or receive buffer. > - > - @return The length of the free space, in bytes. > - > -**/ > -UINT32 > -SockGetFreeSpace ( > - IN SOCKET *Sock, > - IN UINT32 Which > - ) > -{ > - UINT32 BufferCC; > - SOCK_BUFFER *SockBuffer; > - > - ASSERT ((Sock != NULL) && ((SOCK_SND_BUF == Which) || > (SOCK_RCV_BUF == Which))); > - > - if (SOCK_SND_BUF == Which) { > - SockBuffer = &(Sock->SndBuffer); > - } else { > - SockBuffer = &(Sock->RcvBuffer); > - } > - > - BufferCC = (SockBuffer->DataQueue)->BufSize; > - > - if (BufferCC >= SockBuffer->HighWater) { > - > - return 0; > - } > - > - return SockBuffer->HighWater - BufferCC; > -} > - > - > - > -/** > - Called by the low layer protocol to indicate that there will be no more data > - from the communication peer. > - > - This function set the socket's state to SO_NO_MORE_DATA and signal all > queued > - IO tokens with the error status EFI_CONNECTION_FIN. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockNoMoreData ( > - IN OUT SOCKET *Sock > - ) > -{ > - EFI_STATUS Err; > - > - SOCK_NO_MORE_DATA (Sock); > - > - if (!IsListEmpty (&Sock->RcvTokenList)) { > - > - ASSERT (0 == GET_RCV_DATASIZE (Sock)); > - > - Err = Sock->SockError; > - > - SOCK_ERROR (Sock, EFI_CONNECTION_FIN); > - > - SockFlushPendingToken (Sock, &Sock->RcvTokenList); > - > - SOCK_ERROR (Sock, Err); > - > - } > - > -} > - > - > -/** > - Get the first buffer block in the specific socket buffer. > - > - @param Sockbuf Pointer to the socket buffer. > - > - @return Pointer to the first buffer in the queue. NULL if the queue is > empty. > - > -**/ > -NET_BUF * > -SockBufFirst ( > - IN SOCK_BUFFER *Sockbuf > - ) > -{ > - LIST_ENTRY *NetbufList; > - > - NetbufList = &(Sockbuf->DataQueue->BufList); > - > - if (IsListEmpty (NetbufList)) { > - return NULL; > - } > - > - return NET_LIST_HEAD (NetbufList, NET_BUF, List); > -} > - > - > -/** > - Get the next buffer block in the specific socket buffer. > - > - @param Sockbuf Pointer to the socket buffer. > - @param SockEntry Pointer to the buffer block prior to the required > - one. > - > - @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is > - the tail or head entry. > - > -**/ > -NET_BUF * > -SockBufNext ( > - IN SOCK_BUFFER *Sockbuf, > - IN NET_BUF *SockEntry > - ) > -{ > - LIST_ENTRY *NetbufList; > - > - NetbufList = &(Sockbuf->DataQueue->BufList); > - > - if ((SockEntry->List.ForwardLink == NetbufList) || > - (SockEntry->List.BackLink == &SockEntry->List) || > - (SockEntry->List.ForwardLink == &SockEntry->List)) { > - > - return NULL; > - } > - > - return NET_LIST_USER_STRUCT (SockEntry->List.ForwardLink, NET_BUF, > List); > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > deleted file mode 100644 > index cd20b8bcb2dd..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > +++ /dev/null > @@ -1,990 +0,0 @@ > -/** @file > - Interface function of the Socket. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "SockImpl.h" > - > - > -/** > - Check whether the Event is in the List. > - > - @param List Pointer to the token list to be searched. > - @param Event The event to be checked. > - > - @retval TRUE The specific Event exists in the List. > - @retval FALSE The specific Event is not in the List. > - > -**/ > -BOOLEAN > -SockTokenExistedInList ( > - IN LIST_ENTRY *List, > - IN EFI_EVENT Event > - ) > -{ > - LIST_ENTRY *ListEntry; > - SOCK_TOKEN *SockToken; > - > - NET_LIST_FOR_EACH (ListEntry, List) { > - SockToken = NET_LIST_USER_STRUCT ( > - ListEntry, > - SOCK_TOKEN, > - TokenList > - ); > - > - if (Event == SockToken->Token->Event) { > - return TRUE; > - } > - } > - > - return FALSE; > -} > - > - > -/** > - Call SockTokenExistedInList() to check whether the Event is > - in the related socket's lists. > - > - @param Sock Pointer to the instance's socket. > - @param Event The event to be checked. > - > - @retval TRUE The Event exists in related socket's lists. > - @retval FALSE The Event is not in related socket's lists. > - > -**/ > -BOOLEAN > -SockTokenExisted ( > - IN SOCKET *Sock, > - IN EFI_EVENT Event > - ) > -{ > - > - if (SockTokenExistedInList (&Sock->SndTokenList, Event) || > - SockTokenExistedInList (&Sock->ProcessingSndTokenList, Event) || > - SockTokenExistedInList (&Sock->RcvTokenList, Event) || > - SockTokenExistedInList (&Sock->ListenTokenList, Event)) { > - > - return TRUE; > - } > - > - if ((Sock->ConnectionToken != NULL) && > - (Sock->ConnectionToken->Event == Event)) { > - > - return TRUE; > - } > - > - if ((Sock->CloseToken != NULL) && (Sock->CloseToken->Event == Event)) { > - return TRUE; > - } > - > - return FALSE; > -} > - > - > -/** > - Buffer a token into the specific list of socket Sock. > - > - @param Sock Pointer to the instance's socket. > - @param List Pointer to the list to store the token. > - @param Token Pointer to the token to be buffered. > - @param DataLen The data length of the buffer contained in Token. > - > - @return Pointer to the token that wraps Token. If NULL, error condition > occurred. > - > -**/ > -SOCK_TOKEN * > -SockBufferToken ( > - IN SOCKET *Sock, > - IN LIST_ENTRY *List, > - IN VOID *Token, > - IN UINT32 DataLen > - ) > -{ > - SOCK_TOKEN *SockToken; > - > - SockToken = AllocatePool (sizeof (SOCK_TOKEN)); > - if (NULL == SockToken) { > - > - DEBUG ((EFI_D_ERROR, "SockBufferIOToken: No Memory " > - "to allocate SockToken\n")); > - > - return NULL; > - } > - > - SockToken->Sock = Sock; > - SockToken->Token = (SOCK_COMPLETION_TOKEN *) Token; > - SockToken->RemainDataLen = DataLen; > - InsertTailList (List, &SockToken->TokenList); > - > - return SockToken; > -} > - > - > -/** > - Destroy the socket Sock and its associated protocol control block. > - > - @param Sock The socket to be destroyed. > - > - @retval EFI_SUCCESS The socket Sock is destroyed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. > - > -**/ > -EFI_STATUS > -SockDestroyChild ( > - IN SOCKET *Sock > - ) > -{ > - EFI_STATUS Status; > - TCP4_PROTO_DATA *ProtoData; > - TCP_CB *Tcb; > - VOID *SockProtocol; > - > - ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL)); > - > - if (Sock->InDestroy) { > - return EFI_SUCCESS; > - } > - > - Sock->InDestroy = TRUE; > - > - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > - Tcb = ProtoData->TcpPcb; > - > - ASSERT (Tcb != NULL); > - > - // > - // Close the IP protocol. > - // > - gBS->CloseProtocol ( > - Tcb->IpInfo->ChildHandle, > - &gEfiIp4ProtocolGuid, > - ProtoData->TcpService->IpIo->Image, > - Sock->SockHandle > - ); > - > - if (Sock->DestroyCallback != NULL) { > - Sock->DestroyCallback (Sock, Sock->Context); > - } > - > - // > - // Retrieve the protocol installed on this sock > - // > - Status = gBS->OpenProtocol ( > - Sock->SockHandle, > - &gEfiTcp4ProtocolGuid, > - &SockProtocol, > - Sock->DriverBinding, > - Sock->SockHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Open protocol installed " > - "on socket failed with %r\n", Status)); > - } > - > - // > - // Uninstall the protocol installed on this sock > - // in the light of Sock->SockType > - // > - gBS->UninstallMultipleProtocolInterfaces ( > - Sock->SockHandle, > - &gEfiTcp4ProtocolGuid, > - SockProtocol, > - NULL > - ); > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Get the lock to " > - "access socket failed with %r\n", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - // > - // force protocol layer to detach the PCB > - // > - Status = Sock->ProtoHandler (Sock, SOCK_DETACH, NULL); > - > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Protocol detach socket" > - " failed with %r\n", Status)); > - > - Sock->InDestroy = FALSE; > - } else if (SOCK_IS_CONFIGURED (Sock)) { > - > - SockConnFlush (Sock); > - SockSetState (Sock, SO_CLOSED); > - > - Sock->ConfigureState = SO_UNCONFIGURED; > - } > - > - EfiReleaseLock (&(Sock->Lock)); > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - SockDestroy (Sock); > - return EFI_SUCCESS; > -} > - > - > -/** > - Create a socket and its associated protocol control block > - with the intial data SockInitData and protocol specific > - data ProtoData. > - > - @param SockInitData Inital data to setting the socket. > - > - @return Pointer to the newly created socket. If NULL, error condition > occured. > - > -**/ > -SOCKET * > -SockCreateChild ( > - IN SOCK_INIT_DATA *SockInitData > - ) > -{ > - SOCKET *Sock; > - VOID *SockProtocol; > - EFI_STATUS Status; > - > - // > - // create a new socket > - // > - Sock = SockCreate (SockInitData); > - if (NULL == Sock) { > - > - DEBUG ((EFI_D_ERROR, "SockCreateChild: No resource to " > - "create a new socket\n")); > - > - return NULL; > - } > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockCreateChild: Get the lock to " > - "access socket failed with %r\n", Status)); > - > - goto ERROR; > - } > - // > - // inform the protocol layer to attach the socket > - // with a new protocol control block > - // > - Status = Sock->ProtoHandler (Sock, SOCK_ATTACH, NULL); > - EfiReleaseLock (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockCreateChild: Protocol failed to" > - " attach a socket with %r\n", Status)); > - > - goto ERROR; > - } > - > - return Sock; > - > -ERROR: > - > - if (Sock->DestroyCallback != NULL) { > - Sock->DestroyCallback (Sock, Sock->Context); > - } > - > - gBS->OpenProtocol ( > - Sock->SockHandle, > - &gEfiTcp4ProtocolGuid, > - &SockProtocol, > - Sock->DriverBinding, > - Sock->SockHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - // > - // Uninstall the protocol installed on this sock > - // > - gBS->UninstallMultipleProtocolInterfaces ( > - Sock->SockHandle, > - &gEfiTcp4ProtocolGuid, > - SockProtocol, > - NULL > - ); > - SockDestroy (Sock); > - return NULL; > -} > - > - > -/** > - Configure the specific socket Sock using configuration data ConfigData. > - > - @param Sock Pointer to the socket to be configured. > - @param ConfigData Pointer to the configuration data. > - > - @retval EFI_SUCCESS The socket is configured successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or > the > - socket is already configured. > - > -**/ > -EFI_STATUS > -SockConfigure ( > - IN SOCKET *Sock, > - IN VOID *ConfigData > - ) > -{ > - EFI_STATUS Status; > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockConfigure: Get the access for " > - "socket failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (SOCK_IS_CONFIGURED (Sock)) { > - Status = EFI_ACCESS_DENIED; > - goto OnExit; > - } > - > - ASSERT (Sock->State == SO_CLOSED); > - > - Status = Sock->ProtoHandler (Sock, SOCK_CONFIGURE, ConfigData); > - > -OnExit: > - EfiReleaseLock (&(Sock->Lock)); > - > - return Status; > -} > - > - > -/** > - Initiate a connection establishment process. > - > - @param Sock Pointer to the socket to initiate the initate the > - connection. > - @param Token Pointer to the token used for the connection > - operation. > - > - @retval EFI_SUCCESS The connection is initialized successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not configured to > - be an active one, or the token is already in one of > - this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockConnect ( > - IN SOCKET *Sock, > - IN VOID *Token > - ) > -{ > - EFI_STATUS Status; > - EFI_EVENT Event; > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockConnect: Get the access for " > - "socket failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (SOCK_IS_NO_MAPPING (Sock)) { > - Status = EFI_NO_MAPPING; > - goto OnExit; > - } > - > - if (SOCK_IS_UNCONFIGURED (Sock)) { > - > - Status = EFI_NOT_STARTED; > - goto OnExit; > - } > - > - if (!SOCK_IS_CLOSED (Sock) || !SOCK_IS_CONFIGURED_ACTIVE (Sock)) { > - > - Status = EFI_ACCESS_DENIED; > - goto OnExit; > - } > - > - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; > - > - if (SockTokenExisted (Sock, Event)) { > - > - Status = EFI_ACCESS_DENIED; > - goto OnExit; > - } > - > - Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *) Token; > - SockSetState (Sock, SO_CONNECTING); > - Status = Sock->ProtoHandler (Sock, SOCK_CONNECT, NULL); > - > -OnExit: > - EfiReleaseLock (&(Sock->Lock)); > - return Status; > -} > - > - > -/** > - Issue a listen token to get an existed connected network instance > - or wait for a connection if there is none. > - > - @param Sock Pointer to the socket to accept connections. > - @param Token The token to accept a connection. > - > - @retval EFI_SUCCESS Either a connection is accpeted or the Token is > - buffered for further acception. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not configured to > - be a passive one, or the token is already in one of > - this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to > memory limit. > - > -**/ > -EFI_STATUS > -SockAccept ( > - IN SOCKET *Sock, > - IN VOID *Token > - ) > -{ > - EFI_TCP4_LISTEN_TOKEN *ListenToken; > - LIST_ENTRY *ListEntry; > - EFI_STATUS Status; > - SOCKET *Socket; > - EFI_EVENT Event; > - > - ASSERT (SockStream == Sock->Type); > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockAccept: Get the access for socket" > - " failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (SOCK_IS_NO_MAPPING (Sock)) { > - Status = EFI_NO_MAPPING; > - goto Exit; > - } > - > - if (SOCK_IS_UNCONFIGURED (Sock)) { > - > - Status = EFI_NOT_STARTED; > - goto Exit; > - } > - > - if (!SOCK_IS_LISTENING (Sock)) { > - > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; > - > - if (SockTokenExisted (Sock, Event)) { > - > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) Token; > - > - // > - // Check if a connection has already in this Sock->ConnectionList > - // > - NET_LIST_FOR_EACH (ListEntry, &Sock->ConnectionList) { > - > - Socket = NET_LIST_USER_STRUCT (ListEntry, SOCKET, ConnectionList); > - > - if (SOCK_IS_CONNECTED (Socket)) { > - ListenToken->NewChildHandle = Socket->SockHandle; > - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); > - > - RemoveEntryList (ListEntry); > - > - ASSERT (Socket->Parent != NULL); > - > - Socket->Parent->ConnCnt--; > - > - DEBUG ( > - (EFI_D_NET, > - "SockAccept: Accept a socket, now conncount is %d", > - Socket->Parent->ConnCnt) > - ); > - Socket->Parent = NULL; > - > - goto Exit; > - } > - } > - > - // > - // Buffer this token for latter incoming connection request > - // > - if (NULL == SockBufferToken (Sock, &(Sock->ListenTokenList), Token, 0)) { > - > - Status = EFI_OUT_OF_RESOURCES; > - } > - > -Exit: > - EfiReleaseLock (&(Sock->Lock)); > - > - return Status; > -} > - > - > -/** > - Issue a token with data to the socket to send out. > - > - @param Sock Pointer to the socket to process the token with > - data. > - @param Token The token with data that needs to send out. > - > - @retval EFI_SUCCESS The token is processed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not in a > - synchronized state , or the token is already in one > - of this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > memory limit. > - > -**/ > -EFI_STATUS > -SockSend ( > - IN SOCKET *Sock, > - IN VOID *Token > - ) > -{ > - SOCK_IO_TOKEN *SndToken; > - EFI_EVENT Event; > - UINT32 FreeSpace; > - EFI_TCP4_TRANSMIT_DATA *TxData; > - EFI_STATUS Status; > - SOCK_TOKEN *SockToken; > - UINT32 DataLen; > - > - ASSERT (SockStream == Sock->Type); > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockSend: Get the access for socket" > - " failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (SOCK_IS_NO_MAPPING (Sock)) { > - Status = EFI_NO_MAPPING; > - goto Exit; > - } > - > - SndToken = (SOCK_IO_TOKEN *) Token; > - TxData = (EFI_TCP4_TRANSMIT_DATA *) SndToken->Packet.TxData; > - > - if (SOCK_IS_UNCONFIGURED (Sock)) { > - Status = EFI_NOT_STARTED; > - goto Exit; > - } > - > - if (!(SOCK_IS_CONNECTING (Sock) || SOCK_IS_CONNECTED (Sock))) { > - > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - // > - // check if a token is already in the token buffer > - // > - Event = SndToken->Token.Event; > - > - if (SockTokenExisted (Sock, Event)) { > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - DataLen = (UINT32) TxData->DataLength; > - > - // > - // process this sending token now or buffer it only? > - // > - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); > - > - if ((FreeSpace < Sock->SndBuffer.LowWater) || !SOCK_IS_CONNECTED > (Sock)) { > - > - SockToken = SockBufferToken ( > - Sock, > - &Sock->SndTokenList, > - SndToken, > - DataLen > - ); > - > - if (NULL == SockToken) { > - Status = EFI_OUT_OF_RESOURCES; > - } > - } else { > - > - SockToken = SockBufferToken ( > - Sock, > - &Sock->ProcessingSndTokenList, > - SndToken, > - DataLen > - ); > - > - if (NULL == SockToken) { > - DEBUG ((EFI_D_ERROR, "SockSend: Failed to buffer IO token into" > - " socket processing SndToken List\n", Status)); > - > - Status = EFI_OUT_OF_RESOURCES; > - goto Exit; > - } > - > - Status = SockProcessTcpSndData (Sock, TxData); > - > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "SockSend: Failed to process " > - "Snd Data\n", Status)); > - > - RemoveEntryList (&(SockToken->TokenList)); > - FreePool (SockToken); > - } > - } > - > -Exit: > - EfiReleaseLock (&(Sock->Lock)); > - return Status; > -} > - > - > -/** > - Issue a token to get data from the socket. > - > - @param Sock Pointer to the socket to get data from. > - @param Token The token to store the received data from the > - socket. > - > - @retval EFI_SUCCESS The token is processed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not in a > - synchronized state , or the token is already in one > - of this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - @retval EFI_CONNECTION_FIN The connection is closed and there is no > more data. > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > memory limit. > - > -**/ > -EFI_STATUS > -SockRcv ( > - IN SOCKET *Sock, > - IN VOID *Token > - ) > -{ > - SOCK_IO_TOKEN *RcvToken; > - UINT32 RcvdBytes; > - EFI_STATUS Status; > - EFI_EVENT Event; > - > - ASSERT (SockStream == Sock->Type); > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockRcv: Get the access for socket" > - " failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (SOCK_IS_NO_MAPPING (Sock)) { > - > - Status = EFI_NO_MAPPING; > - goto Exit; > - } > - > - if (SOCK_IS_UNCONFIGURED (Sock)) { > - > - Status = EFI_NOT_STARTED; > - goto Exit; > - } > - > - if (!(SOCK_IS_CONNECTED (Sock) || SOCK_IS_CONNECTING (Sock))) { > - > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - RcvToken = (SOCK_IO_TOKEN *) Token; > - > - // > - // check if a token is already in the token buffer of this socket > - // > - Event = RcvToken->Token.Event; > - if (SockTokenExisted (Sock, Event)) { > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - RcvToken = (SOCK_IO_TOKEN *) Token; > - RcvdBytes = GET_RCV_DATASIZE (Sock); > - > - // > - // check whether an error has happened before > - // > - if (EFI_ABORTED != Sock->SockError) { > - > - SIGNAL_TOKEN (&(RcvToken->Token), Sock->SockError); > - Sock->SockError = EFI_ABORTED; > - goto Exit; > - } > - > - // > - // check whether can not receive and there is no any > - // data buffered in Sock->RcvBuffer > - // > - if (SOCK_IS_NO_MORE_DATA (Sock) && (0 == RcvdBytes)) { > - > - Status = EFI_CONNECTION_FIN; > - goto Exit; > - } > - > - if (RcvdBytes != 0) { > - SockProcessRcvToken (Sock, RcvToken); > - > - Status = Sock->ProtoHandler (Sock, SOCK_CONSUMED, NULL); > - } else { > - > - if (NULL == SockBufferToken (Sock, &Sock->RcvTokenList, RcvToken, 0)) { > - Status = EFI_OUT_OF_RESOURCES; > - } > - } > - > -Exit: > - EfiReleaseLock (&(Sock->Lock)); > - return Status; > -} > - > - > -/** > - Reset the socket and its associated protocol control block. > - > - @param Sock Pointer to the socket to be flushed. > - > - @retval EFI_SUCCESS The socket is flushed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. > - > -**/ > -EFI_STATUS > -SockFlush ( > - IN SOCKET *Sock > - ) > -{ > - EFI_STATUS Status; > - > - ASSERT (SockStream == Sock->Type); > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockFlush: Get the access for socket" > - " failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (!SOCK_IS_CONFIGURED (Sock)) { > - goto Exit; > - } > - > - Status = Sock->ProtoHandler (Sock, SOCK_FLUSH, NULL); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "SockFlush: Protocol failed handling" > - " SOCK_FLUSH with %r", Status)); > - > - goto Exit; > - } > - > - SOCK_ERROR (Sock, EFI_ABORTED); > - SockConnFlush (Sock); > - SockSetState (Sock, SO_CLOSED); > - > - Sock->ConfigureState = SO_UNCONFIGURED; > - > -Exit: > - EfiReleaseLock (&(Sock->Lock)); > - return Status; > -} > - > - > -/** > - Close or abort the socket associated connection. > - > - @param Sock Pointer to the socket of the connection to close or > - abort. > - @param Token The token for close operation. > - @param OnAbort TRUE for aborting the connection, FALSE to close it. > - > - @retval EFI_SUCCESS The close or abort operation is initialized > - successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not in a > - synchronized state , or the token is already in one > - of this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockClose ( > - IN SOCKET *Sock, > - IN VOID *Token, > - IN BOOLEAN OnAbort > - ) > -{ > - EFI_STATUS Status; > - EFI_EVENT Event; > - > - ASSERT (SockStream == Sock->Type); > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "SockClose: Get the access for socket" > - " failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (SOCK_IS_NO_MAPPING (Sock)) { > - Status = EFI_NO_MAPPING; > - goto Exit; > - } > - > - if (SOCK_IS_UNCONFIGURED (Sock)) { > - Status = EFI_NOT_STARTED; > - goto Exit; > - } > - > - if (SOCK_IS_DISCONNECTING (Sock)) { > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; > - > - if (SockTokenExisted (Sock, Event)) { > - Status = EFI_ACCESS_DENIED; > - goto Exit; > - } > - > - Sock->CloseToken = Token; > - SockSetState (Sock, SO_DISCONNECTING); > - > - if (OnAbort) { > - Status = Sock->ProtoHandler (Sock, SOCK_ABORT, NULL); > - } else { > - Status = Sock->ProtoHandler (Sock, SOCK_CLOSE, NULL); > - } > - > -Exit: > - EfiReleaseLock (&(Sock->Lock)); > - return Status; > -} > - > - > -/** > - Get the mode data of the low layer protocol. > - > - @param Sock Pointer to the socket to get mode data from. > - @param Mode Pointer to the data to store the low layer mode > - information. > - > - @retval EFI_SUCCESS The mode data is got successfully. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockGetMode ( > - IN SOCKET *Sock, > - IN OUT VOID *Mode > - ) > -{ > - return Sock->ProtoHandler (Sock, SOCK_MODE, Mode); > -} > - > - > - > - > - > -/** > - Add or remove route information in IP route table associated > - with this socket. > - > - @param Sock Pointer to the socket associated with the IP route > - table to operate on. > - @param RouteInfo Pointer to the route information to be processed. > - > - @retval EFI_SUCCESS The route table is updated successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockRoute ( > - IN SOCKET *Sock, > - IN VOID *RouteInfo > - ) > -{ > - EFI_STATUS Status; > - > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "SockRoute: Get the access for socket" > - " failed with %r", Status)); > - > - return EFI_ACCESS_DENIED; > - } > - > - if (SOCK_IS_NO_MAPPING (Sock)) { > - Status = EFI_NO_MAPPING; > - goto Exit; > - } > - > - if (SOCK_IS_UNCONFIGURED (Sock)) { > - Status = EFI_NOT_STARTED; > - goto Exit; > - } > - > - Status = Sock->ProtoHandler (Sock, SOCK_ROUTE, RouteInfo); > - > -Exit: > - EfiReleaseLock (&(Sock->Lock)); > - return Status; > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > deleted file mode 100644 > index a0f97d603171..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > +++ /dev/null > @@ -1,717 +0,0 @@ > -/** @file > - Tcp request dispatcher implementation. > - > -(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Tcp4Main.h" > - > -#define TCP_COMP_VAL(Min, Max, Default, Val) \ > - ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default)) > - > -/** > - Add or remove a route entry in the IP route table associated with this TCP > instance. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param RouteInfo Pointer to the route info to be processed. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval EFI_NOT_STARTED The driver instance has not been started. > - @retval EFI_NO_MAPPING When using the default address, > configuration(DHCP, > - BOOTP, RARP, etc.) is not finished yet. > - @retval EFI_OUT_OF_RESOURCES Could not add the entry to the routing > table. > - @retval EFI_NOT_FOUND This route is not in the routing table > - (when RouteInfo->DeleteRoute is TRUE). > - @retval EFI_ACCESS_DENIED The route is already defined in the routing > table > - (when RouteInfo->DeleteRoute is FALSE). > -**/ > -EFI_STATUS > -Tcp4Route ( > - IN TCP_CB *Tcb, > - IN TCP4_ROUTE_INFO *RouteInfo > - ) > -{ > - EFI_IP4_PROTOCOL *Ip4; > - > - Ip4 = Tcb->IpInfo->Ip.Ip4; > - > - ASSERT (Ip4 != NULL); > - > - return Ip4->Routes ( > - Ip4, > - RouteInfo->DeleteRoute, > - RouteInfo->SubnetAddress, > - RouteInfo->SubnetMask, > - RouteInfo->GatewayAddress > - ); > - > -} > - > - > -/** > - Get the operational settings of this TCP instance. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Mode Pointer to the buffer to store the operational > - settings. > - > - @retval EFI_SUCCESS The mode data is read. > - @retval EFI_NOT_STARTED No configuration data is available because > this > - instance hasn't been started. > - > -**/ > -EFI_STATUS > -Tcp4GetMode ( > - IN TCP_CB *Tcb, > - IN OUT TCP4_MODE_DATA *Mode > - ) > -{ > - SOCKET *Sock; > - EFI_TCP4_CONFIG_DATA *ConfigData; > - EFI_TCP4_ACCESS_POINT *AccessPoint; > - EFI_TCP4_OPTION *Option; > - EFI_IP4_PROTOCOL *Ip; > - > - Sock = Tcb->Sk; > - > - if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) { > - return EFI_NOT_STARTED; > - } > - > - if (Mode->Tcp4State != NULL) { > - *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State; > - } > - > - if (Mode->Tcp4ConfigData != NULL) { > - > - ConfigData = Mode->Tcp4ConfigData; > - AccessPoint = &(ConfigData->AccessPoint); > - Option = ConfigData->ControlOption; > - > - ConfigData->TypeOfService = Tcb->Tos; > - ConfigData->TimeToLive = Tcb->Ttl; > - > - AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr; > - > - IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip); > - IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask); > - AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port); > - > - IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb- > >RemoteEnd.Ip); > - AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port); > - AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != TCP_LISTEN); > - > - if (Option != NULL) { > - Option->ReceiveBufferSize = GET_RCV_BUFFSIZE (Tcb->Sk); > - Option->SendBufferSize = GET_SND_BUFFSIZE (Tcb->Sk); > - Option->MaxSynBackLog = GET_BACKLOG (Tcb->Sk); > - > - Option->ConnectionTimeout = Tcb->ConnectTimeout / TCP_TICK_HZ; > - Option->DataRetries = Tcb->MaxRexmit; > - Option->FinTimeout = Tcb->FinWait2Timeout / TCP_TICK_HZ; > - Option->TimeWaitTimeout = Tcb->TimeWaitTimeout / TCP_TICK_HZ; > - Option->KeepAliveProbes = Tcb->MaxKeepAlive; > - Option->KeepAliveTime = Tcb->KeepAliveIdle / TCP_TICK_HZ; > - Option->KeepAliveInterval = Tcb->KeepAlivePeriod / TCP_TICK_HZ; > - > - Option->EnableNagle = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, > TCP_CTRL_NO_NAGLE)); > - Option->EnableTimeStamp = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, > TCP_CTRL_NO_TS)); > - Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb- > >CtrlFlag, TCP_CTRL_NO_WS)); > - > - Option->EnableSelectiveAck = FALSE; > - Option->EnablePathMtuDiscovery = FALSE; > - } > - } > - > - Ip = Tcb->IpInfo->Ip.Ip4; > - ASSERT (Ip != NULL); > - > - return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode- > >MnpConfigData, Mode->SnpModeData); > -} > - > - > -/** > - If AP->StationPort isn't zero, check whether the access point > - is registered, else generate a random station port for this > - access point. > - > - @param AP Pointer to the access point. > - > - @retval EFI_SUCCESS The check is passed or the port is assigned. > - @retval EFI_INVALID_PARAMETER The non-zero station port is already > used. > - @retval EFI_OUT_OF_RESOURCES No port can be allocated. > - > -**/ > -EFI_STATUS > -Tcp4Bind ( > - IN EFI_TCP4_ACCESS_POINT *AP > - ) > -{ > - BOOLEAN Cycle; > - > - if (0 != AP->StationPort) { > - // > - // check if a same endpoint is bound > - // > - if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) { > - > - return EFI_INVALID_PARAMETER; > - } > - } else { > - // > - // generate a random port > - // > - Cycle = FALSE; > - > - if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) { > - mTcp4RandomPort = TCP4_PORT_KNOWN; > - } > - > - mTcp4RandomPort++; > - > - while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) { > - > - mTcp4RandomPort++; > - > - if (mTcp4RandomPort <= TCP4_PORT_KNOWN) { > - > - if (Cycle) { > - DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated " > - "for this pcb\n")); > - > - return EFI_OUT_OF_RESOURCES; > - } > - > - mTcp4RandomPort = TCP4_PORT_KNOWN + 1; > - > - Cycle = TRUE; > - } > - > - } > - > - AP->StationPort = mTcp4RandomPort; > - } > - > - return EFI_SUCCESS; > -} > - > - > -/** > - Flush the Tcb add its associated protocols. > - > - @param Tcb Pointer to the TCP_CB to be flushed. > - > -**/ > -VOID > -Tcp4FlushPcb ( > - IN TCP_CB *Tcb > - ) > -{ > - SOCKET *Sock; > - > - IpIoConfigIp (Tcb->IpInfo, NULL); > - > - Sock = Tcb->Sk; > - > - if (SOCK_IS_CONFIGURED (Sock)) { > - RemoveEntryList (&Tcb->List); > - > - // > - // Uninstall the device path protocol. > - // > - if (Sock->DevicePath != NULL) { > - gBS->UninstallProtocolInterface ( > - Sock->SockHandle, > - &gEfiDevicePathProtocolGuid, > - Sock->DevicePath > - ); > - FreePool (Sock->DevicePath); > - } > - } > - > - NetbufFreeList (&Tcb->SndQue); > - NetbufFreeList (&Tcb->RcvQue); > - Tcb->State = TCP_CLOSED; > -} > - > -/** > - Attach a Pcb to the socket. > - > - @param Sk Pointer to the socket of this TCP instance. > - > - @retval EFI_SUCCESS The operation is completed successfully. > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > - > -**/ > -EFI_STATUS > -Tcp4AttachPcb ( > - IN SOCKET *Sk > - ) > -{ > - TCP_CB *Tcb; > - TCP4_PROTO_DATA *ProtoData; > - IP_IO *IpIo; > - EFI_STATUS Status; > - VOID *Ip; > - > - Tcb = AllocateZeroPool (sizeof (TCP_CB)); > - > - if (Tcb == NULL) { > - > - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n")); > - > - return EFI_OUT_OF_RESOURCES; > - } > - > - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; > - IpIo = ProtoData->TcpService->IpIo; > - > - // > - // Create an IpInfo for this Tcb. > - // > - Tcb->IpInfo = IpIoAddIp (IpIo); > - if (Tcb->IpInfo == NULL) { > - > - FreePool (Tcb); > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Open the new created IP instance BY_CHILD. > - // > - Status = gBS->OpenProtocol ( > - Tcb->IpInfo->ChildHandle, > - &gEfiIp4ProtocolGuid, > - &Ip, > - IpIo->Image, > - Sk->SockHandle, > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > - ); > - if (EFI_ERROR (Status)) { > - IpIoRemoveIp (IpIo, Tcb->IpInfo); > - return Status; > - } > - > - InitializeListHead (&Tcb->List); > - InitializeListHead (&Tcb->SndQue); > - InitializeListHead (&Tcb->RcvQue); > - > - Tcb->State = TCP_CLOSED; > - Tcb->Sk = Sk; > - ProtoData->TcpPcb = Tcb; > - > - return EFI_SUCCESS; > -} > - > -/** > - Detach the Pcb of the socket. > - > - @param Sk Pointer to the socket of this TCP instance. > - > -**/ > -VOID > -Tcp4DetachPcb ( > - IN SOCKET *Sk > - ) > -{ > - TCP4_PROTO_DATA *ProtoData; > - TCP_CB *Tcb; > - > - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; > - Tcb = ProtoData->TcpPcb; > - > - ASSERT (Tcb != NULL); > - > - Tcp4FlushPcb (Tcb); > - > - IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo); > - > - FreePool (Tcb); > - > - ProtoData->TcpPcb = NULL; > -} > - > - > -/** > - Configure the Pcb using CfgData. > - > - @param Sk Pointer to the socket of this TCP instance. > - @param CfgData Pointer to the TCP configuration data. > - > - @retval EFI_SUCCESS The operation is completed successfully. > - @retval EFI_INVALID_PARAMETER A same access point has been > configured in > - another TCP instance. > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > - > -**/ > -EFI_STATUS > -Tcp4ConfigurePcb ( > - IN SOCKET *Sk, > - IN EFI_TCP4_CONFIG_DATA *CfgData > - ) > -{ > - EFI_IP4_CONFIG_DATA IpCfgData; > - EFI_STATUS Status; > - EFI_TCP4_OPTION *Option; > - TCP4_PROTO_DATA *TcpProto; > - TCP_CB *Tcb; > - > - ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != NULL)); > - > - TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved; > - Tcb = TcpProto->TcpPcb; > - > - ASSERT (Tcb != NULL); > - > - // > - // Add Ip for send pkt to the peer > - // > - CopyMem (&IpCfgData, &mIp4IoDefaultIpConfigData, sizeof (IpCfgData)); > - IpCfgData.DefaultProtocol = EFI_IP_PROTO_TCP; > - IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress; > - IpCfgData.StationAddress = CfgData->AccessPoint.StationAddress; > - IpCfgData.SubnetMask = CfgData->AccessPoint.SubnetMask; > - IpCfgData.ReceiveTimeout = (UINT32) (-1); > - > - // > - // Configure the IP instance this Tcb consumes. > - // > - Status = IpIoConfigIp (Tcb->IpInfo, &IpCfgData); > - if (EFI_ERROR (Status)) { > - goto OnExit; > - } > - > - // > - // Get the default address info if the instance is configured to use default > address. > - // > - if (CfgData->AccessPoint.UseDefaultAddress) { > - CfgData->AccessPoint.StationAddress = IpCfgData.StationAddress; > - CfgData->AccessPoint.SubnetMask = IpCfgData.SubnetMask; > - } > - > - // > - // check if we can bind this endpoint in CfgData > - // > - Status = Tcp4Bind (&(CfgData->AccessPoint)); > - > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed " > - "with %r\n", Status)); > - > - goto OnExit; > - } > - > - // > - // Initalize the operating information in this Tcb > - // > - ASSERT (Tcb->State == TCP_CLOSED && > - IsListEmpty (&Tcb->SndQue) && > - IsListEmpty (&Tcb->RcvQue)); > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); > - Tcb->State = TCP_CLOSED; > - > - Tcb->SndMss = 536; > - Tcb->RcvMss = TcpGetRcvMss (Sk); > - > - Tcb->SRtt = 0; > - Tcb->Rto = 3 * TCP_TICK_HZ; > - > - Tcb->CWnd = Tcb->SndMss; > - Tcb->Ssthresh = 0xffffffff; > - > - Tcb->CongestState = TCP_CONGEST_OPEN; > - > - Tcb->KeepAliveIdle = TCP_KEEPALIVE_IDLE_MIN; > - Tcb->KeepAlivePeriod = TCP_KEEPALIVE_PERIOD; > - Tcb->MaxKeepAlive = TCP_MAX_KEEPALIVE; > - Tcb->MaxRexmit = TCP_MAX_LOSS; > - Tcb->FinWait2Timeout = TCP_FIN_WAIT2_TIME; > - Tcb->TimeWaitTimeout = TCP_TIME_WAIT_TIME; > - Tcb->ConnectTimeout = TCP_CONNECT_TIME; > - > - // > - // initialize Tcb in the light of CfgData > - // > - Tcb->Ttl = CfgData->TimeToLive; > - Tcb->Tos = CfgData->TypeOfService; > - > - Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress; > - > - CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, > sizeof (IP4_ADDR)); > - Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort); > - IP4_COPY_ADDRESS (&Tcb->SubnetMask, &CfgData- > >AccessPoint.SubnetMask); > - > - if (CfgData->AccessPoint.ActiveFlag) { > - CopyMem (&Tcb->RemoteEnd.Ip, &CfgData- > >AccessPoint.RemoteAddress, sizeof (IP4_ADDR)); > - Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort); > - } else { > - Tcb->RemoteEnd.Ip = 0; > - Tcb->RemoteEnd.Port = 0; > - } > - > - Option = CfgData->ControlOption; > - > - if (Option != NULL) { > - SET_RCV_BUFFSIZE ( > - Sk, > - (UINT32) (TCP_COMP_VAL ( > - TCP_RCV_BUF_SIZE_MIN, > - TCP_RCV_BUF_SIZE, > - TCP_RCV_BUF_SIZE, > - Option->ReceiveBufferSize > - ) > - ) > - ); > - SET_SND_BUFFSIZE ( > - Sk, > - (UINT32) (TCP_COMP_VAL ( > - TCP_SND_BUF_SIZE_MIN, > - TCP_SND_BUF_SIZE, > - TCP_SND_BUF_SIZE, > - Option->SendBufferSize > - ) > - ) > - ); > - > - SET_BACKLOG ( > - Sk, > - (UINT32) (TCP_COMP_VAL ( > - TCP_BACKLOG_MIN, > - TCP_BACKLOG, > - TCP_BACKLOG, > - Option->MaxSynBackLog > - ) > - ) > - ); > - > - Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL ( > - TCP_MAX_LOSS_MIN, > - TCP_MAX_LOSS, > - TCP_MAX_LOSS, > - Option->DataRetries > - ); > - Tcb->FinWait2Timeout = TCP_COMP_VAL ( > - TCP_FIN_WAIT2_TIME, > - TCP_FIN_WAIT2_TIME_MAX, > - TCP_FIN_WAIT2_TIME, > - (UINT32) (Option->FinTimeout * TCP_TICK_HZ) > - ); > - > - if (Option->TimeWaitTimeout != 0) { > - Tcb->TimeWaitTimeout = TCP_COMP_VAL ( > - TCP_TIME_WAIT_TIME, > - TCP_TIME_WAIT_TIME_MAX, > - TCP_TIME_WAIT_TIME, > - (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ) > - ); > - } else { > - Tcb->TimeWaitTimeout = 0; > - } > - > - if (Option->KeepAliveProbes != 0) { > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); > - > - Tcb->MaxKeepAlive = (UINT8) TCP_COMP_VAL ( > - TCP_MAX_KEEPALIVE_MIN, > - TCP_MAX_KEEPALIVE, > - TCP_MAX_KEEPALIVE, > - Option->KeepAliveProbes > - ); > - Tcb->KeepAliveIdle = TCP_COMP_VAL ( > - TCP_KEEPALIVE_IDLE_MIN, > - TCP_KEEPALIVE_IDLE_MAX, > - TCP_KEEPALIVE_IDLE_MIN, > - (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ) > - ); > - Tcb->KeepAlivePeriod = TCP_COMP_VAL ( > - TCP_KEEPALIVE_PERIOD_MIN, > - TCP_KEEPALIVE_PERIOD, > - TCP_KEEPALIVE_PERIOD, > - (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ) > - ); > - } > - > - Tcb->ConnectTimeout = TCP_COMP_VAL ( > - TCP_CONNECT_TIME_MIN, > - TCP_CONNECT_TIME, > - TCP_CONNECT_TIME, > - (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ) > - ); > - > - if (!Option->EnableNagle) { > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE); > - } > - > - if (!Option->EnableTimeStamp) { > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS); > - } > - > - if (!Option->EnableWindowScaling) { > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS); > - } > - } > - > - // > - // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is > - // determined, construct the IP device path and install it. > - // > - Status = TcpInstallDevicePath (Sk); > - if (EFI_ERROR (Status)) { > - goto OnExit; > - } > - > - // > - // update state of Tcb and socket > - // > - if (!CfgData->AccessPoint.ActiveFlag) { > - > - TcpSetState (Tcb, TCP_LISTEN); > - SockSetState (Sk, SO_LISTENING); > - > - Sk->ConfigureState = SO_CONFIGURED_PASSIVE; > - } else { > - > - Sk->ConfigureState = SO_CONFIGURED_ACTIVE; > - } > - > - TcpInsertTcb (Tcb); > - > -OnExit: > - > - return Status; > -} > - > - > -/** > - The procotol handler provided to the socket layer, used to > - dispatch the socket level requests by calling the corresponding > - TCP layer functions. > - > - @param Sock Pointer to the socket of this TCP instance. > - @param Request The code of this operation request. > - @param Data Pointer to the operation specific data passed in > - together with the operation request. > - > - @retval EFI_SUCCESS The socket request is completed successfully. > - @retval other The error status returned by the corresponding TCP > - layer function. > - > -**/ > -EFI_STATUS > -Tcp4Dispatcher ( > - IN SOCKET *Sock, > - IN UINT8 Request, > - IN VOID *Data OPTIONAL > - ) > -{ > - TCP_CB *Tcb; > - TCP4_PROTO_DATA *ProtoData; > - EFI_IP4_PROTOCOL *Ip; > - > - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > - Tcb = ProtoData->TcpPcb; > - > - switch (Request) { > - case SOCK_POLL: > - Ip = ProtoData->TcpService->IpIo->Ip.Ip4; > - Ip->Poll (Ip); > - break; > - > - case SOCK_CONSUMED: > - // > - // After user received data from socket buffer, socket will > - // notify TCP using this message to give it a chance to send out > - // window update information > - // > - ASSERT (Tcb != NULL); > - TcpOnAppConsume (Tcb); > - break; > - > - case SOCK_SND: > - > - ASSERT (Tcb != NULL); > - TcpOnAppSend (Tcb); > - break; > - > - case SOCK_CLOSE: > - > - TcpOnAppClose (Tcb); > - > - break; > - > - case SOCK_ABORT: > - > - TcpOnAppAbort (Tcb); > - > - break; > - > - case SOCK_SNDPUSH: > - Tcb->SndPsh = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk); > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); > - > - break; > - > - case SOCK_SNDURG: > - Tcb->SndUp = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk) - > 1; > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); > - > - break; > - > - case SOCK_CONNECT: > - > - TcpOnAppConnect (Tcb); > - > - break; > - > - case SOCK_ATTACH: > - > - return Tcp4AttachPcb (Sock); > - > - case SOCK_FLUSH: > - > - Tcp4FlushPcb (Tcb); > - > - break; > - > - case SOCK_DETACH: > - > - Tcp4DetachPcb (Sock); > - > - break; > - > - case SOCK_CONFIGURE: > - > - return Tcp4ConfigurePcb ( > - Sock, > - (EFI_TCP4_CONFIG_DATA *) Data > - ); > - > - case SOCK_MODE: > - > - ASSERT ((Data != NULL) && (Tcb != NULL)); > - > - return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data); > - > - case SOCK_ROUTE: > - > - ASSERT ((Data != NULL) && (Tcb != NULL)); > - > - return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data); > - > - default: > - return EFI_UNSUPPORTED; > - } > - > - return EFI_SUCCESS; > - > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > deleted file mode 100644 > index 2ff8eee8693b..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > +++ /dev/null > @@ -1,782 +0,0 @@ > -/** @file > - Tcp driver function. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Tcp4Main.h" > - > - > -UINT16 mTcp4RandomPort; > -extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; > -extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2; > -extern EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable; > - > -TCP4_HEARTBEAT_TIMER mTcp4Timer = { > - NULL, > - 0 > -}; > - > -EFI_TCP4_PROTOCOL mTcp4ProtocolTemplate = { > - Tcp4GetModeData, > - Tcp4Configure, > - Tcp4Routes, > - Tcp4Connect, > - Tcp4Accept, > - Tcp4Transmit, > - Tcp4Receive, > - Tcp4Close, > - Tcp4Cancel, > - Tcp4Poll > -}; > - > -SOCK_INIT_DATA mTcp4DefaultSockData = { > - SockStream, > - 0, > - NULL, > - TCP_BACKLOG, > - TCP_SND_BUF_SIZE, > - TCP_RCV_BUF_SIZE, > - &mTcp4ProtocolTemplate, > - Tcp4CreateSocketCallback, > - Tcp4DestroySocketCallback, > - NULL, > - NULL, > - 0, > - Tcp4Dispatcher, > - NULL, > -}; > - > -EFI_DRIVER_BINDING_PROTOCOL mTcp4DriverBinding = { > - Tcp4DriverBindingSupported, > - Tcp4DriverBindingStart, > - Tcp4DriverBindingStop, > - 0xa, > - NULL, > - NULL > -}; > - > -EFI_SERVICE_BINDING_PROTOCOL mTcp4ServiceBinding = { > - Tcp4ServiceBindingCreateChild, > - Tcp4ServiceBindingDestroyChild > -}; > - > - > -/** > - Create and start the heartbeat timer for TCP driver. > - > - @retval EFI_SUCCESS The timer is successfully created and started. > - @retval other The timer is not created. > - > -**/ > -EFI_STATUS > -Tcp4CreateTimer ( > - VOID > - ) > -{ > - EFI_STATUS Status; > - > - Status = EFI_SUCCESS; > - > - if (mTcp4Timer.RefCnt == 0) { > - > - Status = gBS->CreateEvent ( > - EVT_TIMER | EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - TcpTicking, > - NULL, > - &mTcp4Timer.TimerEvent > - ); > - if (!EFI_ERROR (Status)) { > - > - Status = gBS->SetTimer ( > - mTcp4Timer.TimerEvent, > - TimerPeriodic, > - (UINT64) (TICKS_PER_SECOND / TCP_TICK_HZ) > - ); > - } > - } > - > - if (!EFI_ERROR (Status)) { > - > - mTcp4Timer.RefCnt++; > - } > - > - return Status; > -} > - > - > -/** > - Stop and destroy the heartbeat timer for TCP driver. > - > -**/ > -VOID > -Tcp4DestroyTimer ( > - VOID > - ) > -{ > - ASSERT (mTcp4Timer.RefCnt > 0); > - > - mTcp4Timer.RefCnt--; > - > - if (mTcp4Timer.RefCnt > 0) { > - return; > - } > - > - gBS->SetTimer (mTcp4Timer.TimerEvent, TimerCancel, 0); > - gBS->CloseEvent (mTcp4Timer.TimerEvent); > - mTcp4Timer.TimerEvent = NULL; > -} > - > -/** > - Callback function which provided by user to remove one node in > NetDestroyLinkList process. > - > - @param[in] Entry The entry to be removed. > - @param[in] Context Pointer to the callback context corresponds to > the Context in NetDestroyLinkList. > - > - @retval EFI_SUCCESS The entry has been removed successfully. > - @retval Others Fail to remove the entry. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DestroyChildEntryInHandleBuffer ( > - IN LIST_ENTRY *Entry, > - IN VOID *Context > - ) > -{ > - SOCKET *Sock; > - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; > - UINTN NumberOfChildren; > - EFI_HANDLE *ChildHandleBuffer; > - > - if (Entry == NULL || Context == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Sock = NET_LIST_USER_STRUCT_S (Entry, SOCKET, Link, SOCK_SIGNATURE); > - ServiceBinding = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) > Context)->ServiceBinding; > - NumberOfChildren = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT > *) Context)->NumberOfChildren; > - ChildHandleBuffer = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT > *) Context)->ChildHandleBuffer; > - > - if (!NetIsInHandleBuffer (Sock->SockHandle, NumberOfChildren, > ChildHandleBuffer)) { > - return EFI_SUCCESS; > - } > - > - return ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle); > -} > - > -/** > - The entry point for Tcp4 driver, used to install Tcp4 driver on the > ImageHandle. > - > - @param ImageHandle The firmware allocated handle for this > - driver image. > - @param SystemTable Pointer to the EFI system table. > - > - @retval EFI_SUCCESS Driver loaded. > - @retval other Driver not loaded. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverEntryPoint ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - EFI_STATUS Status; > - UINT32 Seed; > - > - // > - // Install the TCP4 Driver Binding Protocol > - // > - Status = EfiLibInstallDriverBindingComponentName2 ( > - ImageHandle, > - SystemTable, > - &mTcp4DriverBinding, > - ImageHandle, > - &gTcp4ComponentName, > - &gTcp4ComponentName2 > - ); > - ASSERT_EFI_ERROR (Status); > - // > - // Initialize ISS and random port. > - // > - Seed = NetRandomInitSeed (); > - mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; > - mTcp4RandomPort = (UINT16) (TCP4_PORT_KNOWN + > - (UINT16) (NET_RANDOM(Seed) % TCP4_PORT_KNOWN)); > - > - return Status; > -} > - > - > -/** > - Tests to see if this driver supports a given controller. > - > - If a child device is provided, it further tests to see if this driver supports > - creating a handle for the specified child device. > - > - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param ControllerHandle The handle of the controller to test. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is optional > for bus drivers. > - > - > - @retval EFI_SUCCESS The device specified by ControllerHandle and > - RemainingDevicePath is supported by the driver > - specified by This. > - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle > and > - RemainingDevicePath is already being managed by > - the driver specified by This. > - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > and > - RemainingDevicePath is already being managed by a > - different driver or an application that requires > - exclusive access. > - @retval EFI_UNSUPPORTED The device specified by ControllerHandle > and > - RemainingDevicePath is not supported by the driver > - specified by This. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverBindingSupported ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ) > -{ > - EFI_STATUS Status; > - > - // > - // Test for the Tcp4ServiceBinding Protocol > - // > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiTcp4ServiceBindingProtocolGuid, > - NULL, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > - ); > - if (!EFI_ERROR (Status)) { > - return EFI_ALREADY_STARTED; > - } > - > - // > - // Test for the Ip4 Protocol > - // > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiIp4ServiceBindingProtocolGuid, > - NULL, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > - ); > - > - return Status; > -} > - > - > -/** > - Start this driver on ControllerHandle. > - > - The Start() function is designed to be invoked from the EFI boot service > - ConnectController(). As a result, much of the error checking on the > parameters > - to Start() has been moved into this common boot service. It is legal to call > - Start() from other locations, but the following calling restrictions must be > - followed or the system behavior will not be deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE. > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > naturally > - aligned EFI_DEVICE_PATH_PROTOCOL. > - 3. Prior to calling Start(), the Supported() function for the driver specified > - by This must have been called with the same calling parameters, and > Supported() > - must have returned EFI_SUCCESS. > - > - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param ControllerHandle The handle of the controller to start. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is > - optional for bus drivers. > - > - @retval EFI_SUCCESS The device was started. > - @retval EFI_ALREADY_STARTED The device could not be started due to a > device error. > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > due to a lack > - of resources. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverBindingStart ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ) > -{ > - EFI_STATUS Status; > - TCP4_SERVICE_DATA *TcpServiceData; > - IP_IO_OPEN_DATA OpenData; > - > - TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA)); > - > - if (NULL == TcpServiceData) { > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" > - " resource to create a Tcp Servcie Data\n")); > - > - return EFI_OUT_OF_RESOURCES; > - } > - > - // > - // Create a new IP IO to Consume it > - // > - TcpServiceData->IpIo = IpIoCreate ( > - This->DriverBindingHandle, > - ControllerHandle, > - IP_VERSION_4 > - ); > - if (NULL == TcpServiceData->IpIo) { > - > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" > - " resource to create an Ip Io\n")); > - > - Status = EFI_OUT_OF_RESOURCES; > - goto ON_ERROR; > - } > - > - // > - // Configure and start IpIo. > - // > - ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA)); > - > - CopyMem ( > - &OpenData.IpConfigData.Ip4CfgData, > - &mIp4IoDefaultIpConfigData, > - sizeof (EFI_IP4_CONFIG_DATA) > - ); > - > - OpenData.IpConfigData.Ip4CfgData.DefaultProtocol = EFI_IP_PROTO_TCP; > - > - OpenData.PktRcvdNotify = Tcp4RxCallback; > - Status = IpIoOpen (TcpServiceData->IpIo, &OpenData); > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - // > - // Create the timer event used by TCP driver > - // > - Status = Tcp4CreateTimer (); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer" > - " Event failed with %r\n", Status)); > - > - goto ON_ERROR; > - } > - > - // > - // Install the Tcp4ServiceBinding Protocol on the > - // controller handle > - // > - TcpServiceData->Tcp4ServiceBinding = mTcp4ServiceBinding; > - > - Status = gBS->InstallMultipleProtocolInterfaces ( > - &ControllerHandle, > - &gEfiTcp4ServiceBindingProtocolGuid, > - &TcpServiceData->Tcp4ServiceBinding, > - NULL > - ); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service > Binding" > - " Protocol failed for %r\n", Status)); > - > - Tcp4DestroyTimer (); > - goto ON_ERROR; > - } > - > - // > - // Initialize member in TcpServiceData > - // > - TcpServiceData->ControllerHandle = ControllerHandle; > - TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE; > - TcpServiceData->DriverBindingHandle = This->DriverBindingHandle; > - > - InitializeListHead (&TcpServiceData->SocketList); > - > - return EFI_SUCCESS; > - > -ON_ERROR: > - > - if (TcpServiceData->IpIo != NULL) { > - IpIoDestroy (TcpServiceData->IpIo); > - TcpServiceData->IpIo = NULL; > - } > - > - FreePool (TcpServiceData); > - > - return Status; > -} > - > - > -/** > - Stop this driver on ControllerHandle. > - > - The Stop() function is designed to be invoked from the EFI boot service > - DisconnectController(). As a result, much of the error checking on the > parameters > - to Stop() has been moved into this common boot service. It is legal to call > Stop() > - from other locations, but the following calling restrictions must be followed > - or the system behavior will not be deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > previous call > - to this same driver's Start() function. > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a > valid > - EFI_HANDLE. In addition, all of these handles must have been created in > this > - driver's Start() function, and the Start() function must have called > OpenProtocol() > - on ControllerHandle with an Attribute of > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > - > - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param ControllerHandle A handle to the device being stopped. The > handle must > - support a bus specific I/O protocol for the driver > - to use to stop the device. > - @param NumberOfChildren The number of child device handles in > ChildHandleBuffer. > - @param ChildHandleBuffer An array of child handles to be freed. May be > NULL if > - NumberOfChildren is 0. > - > - @retval EFI_SUCCESS The device was stopped. > - @retval EFI_DEVICE_ERROR The device could not be stopped due to a > device error. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverBindingStop ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN UINTN NumberOfChildren, > - IN EFI_HANDLE *ChildHandleBuffer > - ) > -{ > - EFI_STATUS Status; > - EFI_HANDLE NicHandle; > - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; > - TCP4_SERVICE_DATA *TcpServiceData; > - LIST_ENTRY *List; > - TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context; > - > - // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed. > - // > - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); > - if (NicHandle == NULL) { > - return EFI_SUCCESS; > - } > - > - // > - // Retrieve the TCP driver Data Structure > - // > - Status = gBS->OpenProtocol ( > - NicHandle, > - &gEfiTcp4ServiceBindingProtocolGuid, > - (VOID **) &ServiceBinding, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service " > - " Binding Protocol failed with %r\n", Status)); > - > - return EFI_DEVICE_ERROR; > - } > - > - TcpServiceData = TCP4_FROM_THIS (ServiceBinding); > - > - if (NumberOfChildren != 0) { > - List = &TcpServiceData->SocketList; > - Context.ServiceBinding = ServiceBinding; > - Context.NumberOfChildren = NumberOfChildren; > - Context.ChildHandleBuffer = ChildHandleBuffer; > - Status = NetDestroyLinkList ( > - List, > - Tcp4DestroyChildEntryInHandleBuffer, > - &Context, > - NULL > - ); > - } else if (IsListEmpty (&TcpServiceData->SocketList)) { > - // > - // Uninstall TCP servicebinding protocol > - // > - gBS->UninstallMultipleProtocolInterfaces ( > - NicHandle, > - &gEfiTcp4ServiceBindingProtocolGuid, > - ServiceBinding, > - NULL > - ); > - > - // > - // Destroy the IpIO consumed by TCP driver > - // > - IpIoDestroy (TcpServiceData->IpIo); > - TcpServiceData->IpIo = NULL; > - > - // > - // Destroy the heartbeat timer. > - // > - Tcp4DestroyTimer (); > - > - if (gTcpControllerNameTable != NULL) { > - FreeUnicodeStringTable (gTcpControllerNameTable); > - gTcpControllerNameTable = NULL; > - } > - > - // > - // Release the TCP service data > - // > - FreePool (TcpServiceData); > - > - Status = EFI_SUCCESS; > - } > - > - return Status; > -} > - > -/** > - Open Ip4 and device path protocols for a created socket, and insert it in > - socket list. > - > - @param This Pointer to the socket just created > - @param Context Context of the socket > - > - @retval EFI_SUCCESS This protocol is installed successfully. > - @retval other Some error occured. > - > -**/ > -EFI_STATUS > -Tcp4CreateSocketCallback ( > - IN SOCKET *This, > - IN VOID *Context > - ) > -{ > - EFI_STATUS Status; > - TCP4_SERVICE_DATA *TcpServiceData; > - EFI_IP4_PROTOCOL *Ip4; > - > - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)- > >TcpService; > - > - // > - // Open the default Ip4 protocol of IP_IO BY_DRIVER. > - // > - Status = gBS->OpenProtocol ( > - TcpServiceData->IpIo->ChildHandle, > - &gEfiIp4ProtocolGuid, > - (VOID **) &Ip4, > - TcpServiceData->DriverBindingHandle, > - This->SockHandle, > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // Open the device path on the handle where service binding resides on. > - // > - Status = gBS->OpenProtocol ( > - TcpServiceData->ControllerHandle, > - &gEfiDevicePathProtocolGuid, > - (VOID **) &This->ParentDevicePath, > - TcpServiceData->DriverBindingHandle, > - This->SockHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - gBS->CloseProtocol ( > - TcpServiceData->IpIo->ChildHandle, > - &gEfiIp4ProtocolGuid, > - TcpServiceData->DriverBindingHandle, > - This->SockHandle > - ); > - } else { > - // > - // Insert this socket into the SocketList. > - // > - InsertTailList (&TcpServiceData->SocketList, &This->Link); > - } > - > - return Status; > -} > - > -/** > - Close Ip4 and device path protocols for a socket, and remove it from socket > list. > - > - @param This Pointer to the socket to be removed > - @param Context Context of the socket > - > -**/ > -VOID > -Tcp4DestroySocketCallback ( > - IN SOCKET *This, > - IN VOID *Context > - ) > -{ > - TCP4_SERVICE_DATA *TcpServiceData; > - > - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)- > >TcpService; > - > - // > - // Remove this node from the list. > - // > - RemoveEntryList (&This->Link); > - > - // > - // Close the Ip4 protocol. > - // > - gBS->CloseProtocol ( > - TcpServiceData->IpIo->ChildHandle, > - &gEfiIp4ProtocolGuid, > - TcpServiceData->DriverBindingHandle, > - This->SockHandle > - ); > -} > - > -/** > - Creates a child handle and installs a protocol. > - > - The CreateChild() function installs a protocol on ChildHandle. If ChildHandle > - is a pointer to NULL, then a new handle is created and returned in > ChildHandle. > - If ChildHandle is not a pointer to NULL, then the protocol installs on the > existing > - ChildHandle. > - > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > instance. > - @param ChildHandle Pointer to the handle of the child to create. If it is > NULL, then > - a new handle is created. If it is a pointer to an existing UEFI > - handle, then the protocol is added to the existing UEFI handle. > - > - @retval EFI_SUCCES The protocol was added to ChildHandle. > - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. > - @retval EFI_OUT_OF_RESOURCES There are not enough resources > available to create > - the child. > - @retval other The child handle was not created. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4ServiceBindingCreateChild ( > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > - IN OUT EFI_HANDLE *ChildHandle > - ) > -{ > - SOCKET *Sock; > - TCP4_SERVICE_DATA *TcpServiceData; > - TCP4_PROTO_DATA TcpProto; > - EFI_STATUS Status; > - EFI_TPL OldTpl; > - > - if (NULL == This || NULL == ChildHandle) { > - return EFI_INVALID_PARAMETER; > - } > - > - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); > - Status = EFI_SUCCESS; > - TcpServiceData = TCP4_FROM_THIS (This); > - TcpProto.TcpService = TcpServiceData; > - TcpProto.TcpPcb = NULL; > - > - // > - // Create a tcp instance with defualt Tcp default > - // sock init data and TcpProto > - // > - mTcp4DefaultSockData.ProtoData = &TcpProto; > - mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA); > - mTcp4DefaultSockData.DriverBinding = TcpServiceData- > >DriverBindingHandle; > - > - Sock = SockCreateChild (&mTcp4DefaultSockData); > - if (NULL == Sock) { > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: " > - "No resource to create a Tcp Child\n")); > - > - Status = EFI_OUT_OF_RESOURCES; > - } else { > - *ChildHandle = Sock->SockHandle; > - } > - > - mTcp4DefaultSockData.ProtoData = NULL; > - > - gBS->RestoreTPL (OldTpl); > - return Status; > -} > - > - > -/** > - Destroys a child handle with a protocol installed on it. > - > - The DestroyChild() function does the opposite of CreateChild(). It removes > a protocol > - that was installed by CreateChild() from ChildHandle. If the removed > protocol is the > - last protocol on ChildHandle, then ChildHandle is destroyed. > - > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > instance. > - @param ChildHandle Handle of the child to destroy > - > - @retval EFI_SUCCES The protocol was removed from ChildHandle. > - @retval EFI_UNSUPPORTED ChildHandle does not support the protocol > that is > - being removed. > - @retval EFI_INVALID_PARAMETER Child handle is NULL. > - @retval EFI_ACCESS_DENIED The protocol could not be removed from > the ChildHandle > - because its services are being used. > - @retval other The child handle was not destroyed. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4ServiceBindingDestroyChild ( > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ChildHandle > - ) > -{ > - EFI_STATUS Status; > - EFI_TCP4_PROTOCOL *Tcp4; > - SOCKET *Sock; > - > - if (NULL == This || NULL == ChildHandle) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // retrieve the Tcp4 protocol from ChildHandle > - // > - Status = gBS->OpenProtocol ( > - ChildHandle, > - &gEfiTcp4ProtocolGuid, > - (VOID **) &Tcp4, > - mTcp4DriverBinding.DriverBindingHandle, > - ChildHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - Status = EFI_UNSUPPORTED; > - } else { > - // > - // destroy this sock and related Tcp protocol control > - // block > - // > - Sock = SOCK_FROM_THIS (Tcp4); > - > - SockDestroyChild (Sock); > - } > - > - return Status; > -} > - > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > deleted file mode 100644 > index f48efdac7cd8..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > +++ /dev/null > @@ -1,1497 +0,0 @@ > -/** @file > - TCP input process routines. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "Tcp4Main.h" > - > - > -/** > - Check whether the sequence number of the incoming segment is > acceptable. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Pointer to the incoming segment. > - > - @retval 1 The sequence number is acceptable. > - @retval 0 The sequence number is not acceptable. > - > -**/ > -INTN > -TcpSeqAcceptable ( > - IN TCP_CB *Tcb, > - IN TCP_SEG *Seg > - ) > -{ > - return (TCP_SEQ_LEQ (Tcb->RcvNxt, Seg->End) && > - TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd)); > -} > - > - > -/** > - NewReno fast recovery, RFC3782. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Segment that triggers the fast recovery. > - > -**/ > -VOID > -TcpFastRecover ( > - IN OUT TCP_CB *Tcb, > - IN TCP_SEG *Seg > - ) > -{ > - UINT32 FlightSize; > - UINT32 Acked; > - > - // > - // Step 1: Three duplicate ACKs and not in fast recovery > - // > - if (Tcb->CongestState != TCP_CONGEST_RECOVER) { > - > - // > - // Step 1A: Invoking fast retransmission. > - // > - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); > - > - Tcb->Ssthresh = MAX (FlightSize >> 1, (UINT32) (2 * Tcb->SndMss)); > - Tcb->Recover = Tcb->SndNxt; > - > - Tcb->CongestState = TCP_CONGEST_RECOVER; > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > - > - // > - // Step 2: Entering fast retransmission > - // > - TcpRetransmit (Tcb, Tcb->SndUna); > - Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss; > - > - DEBUG ((EFI_D_NET, "TcpFastRecover: enter fast retransmission" > - " for TCB %p, recover point is %d\n", Tcb, Tcb->Recover)); > - return; > - } > - > - // > - // During fast recovery, execute Step 3, 4, 5 of RFC3782 > - // > - if (Seg->Ack == Tcb->SndUna) { > - > - // > - // Step 3: Fast Recovery, > - // If this is a duplicated ACK, increse Cwnd by SMSS. > - // > - > - // Step 4 is skipped here only to be executed later > - // by TcpToSendData > - // > - Tcb->CWnd += Tcb->SndMss; > - DEBUG ((EFI_D_NET, "TcpFastRecover: received another" > - " duplicated ACK (%d) for TCB %p\n", Seg->Ack, Tcb)); > - > - } else { > - > - // > - // New data is ACKed, check whether it is a > - // full ACK or partial ACK > - // > - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) { > - > - // > - // Step 5 - Full ACK: > - // deflate the congestion window, and exit fast recovery > - // > - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); > - > - Tcb->CWnd = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss); > - > - Tcb->CongestState = TCP_CONGEST_OPEN; > - DEBUG ((EFI_D_NET, "TcpFastRecover: received a full ACK(%d)" > - " for TCB %p, exit fast recovery\n", Seg->Ack, Tcb)); > - > - } else { > - > - // > - // Step 5 - Partial ACK: > - // fast retransmit the first unacknowledge field > - // , then deflate the CWnd > - // > - TcpRetransmit (Tcb, Seg->Ack); > - Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna); > - > - // > - // Deflate the CWnd by the amount of new data > - // ACKed by SEG.ACK. If more than one SMSS data > - // is ACKed, add back SMSS byte to CWnd after > - // > - if (Acked >= Tcb->SndMss) { > - Acked -= Tcb->SndMss; > - > - } > - > - Tcb->CWnd -= Acked; > - > - DEBUG ((EFI_D_NET, "TcpFastRecover: received a partial" > - " ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); > - > - } > - } > -} > - > - > -/** > - NewReno fast loss recovery, RFC3792. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Segment that triggers the fast loss recovery. > - > -**/ > -VOID > -TcpFastLossRecover ( > - IN OUT TCP_CB *Tcb, > - IN TCP_SEG *Seg > - ) > -{ > - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { > - > - // > - // New data is ACKed, check whether it is a > - // full ACK or partial ACK > - // > - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) { > - > - // > - // Full ACK: exit the loss recovery. > - // > - Tcb->LossTimes = 0; > - Tcb->CongestState = TCP_CONGEST_OPEN; > - > - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " > - "full ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); > - > - } else { > - > - // > - // Partial ACK: > - // fast retransmit the first unacknowledge field. > - // > - TcpRetransmit (Tcb, Seg->Ack); > - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " > - "partial ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); > - } > - } > -} > - > - > -/** > - Compute the RTT as specified in RFC2988. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Measure Currently measured RTT in heart beats. > - > -**/ > -VOID > -TcpComputeRtt ( > - IN OUT TCP_CB *Tcb, > - IN UINT32 Measure > - ) > -{ > - INT32 Var; > - > - // > - // Step 2.3: Compute the RTO for subsequent RTT measurement. > - // > - if (Tcb->SRtt != 0) { > - > - Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT); > - > - if (Var < 0) { > - Var = -Var; > - } > - > - Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2; > - Tcb->SRtt = 7 * (Tcb->SRtt >> 3) + Measure; > - > - } else { > - // > - // Step 2.2: compute the first RTT measure > - // > - Tcb->SRtt = Measure << TCP_RTT_SHIFT; > - Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1); > - } > - > - Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT; > - > - // > - // Step 2.4: Limit the RTO to at least 1 second > - // Step 2.5: Limit the RTO to a maxium value that > - // is at least 60 second > - // > - if (Tcb->Rto < TCP_RTO_MIN) { > - Tcb->Rto = TCP_RTO_MIN; > - > - } else if (Tcb->Rto > TCP_RTO_MAX) { > - Tcb->Rto = TCP_RTO_MAX; > - > - } > - > - DEBUG ((EFI_D_NET, "TcpComputeRtt: new RTT for TCB %p" > - " computed SRTT: %d RTTVAR: %d RTO: %d\n", > - Tcb, Tcb->SRtt, Tcb->RttVar, Tcb->Rto)); > - > -} > - > - > -/** > - Trim the data, SYN and FIN to fit into the window defined by Left and Right. > - > - @param Nbuf Buffer that contains received TCP segment without IP > header. > - @param Left The sequence number of the window's left edge. > - @param Right The sequence number of the window's right edge. > - > -**/ > -VOID > -TcpTrimSegment ( > - IN NET_BUF *Nbuf, > - IN TCP_SEQNO Left, > - IN TCP_SEQNO Right > - ) > -{ > - TCP_SEG *Seg; > - TCP_SEQNO Urg; > - UINT32 Drop; > - > - Seg = TCPSEG_NETBUF (Nbuf); > - > - // > - // If the segment is completely out of window, > - // truncate every thing, include SYN and FIN. > - // > - if (TCP_SEQ_LEQ (Seg->End, Left) || TCP_SEQ_LEQ (Right, Seg->Seq)) { > - > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); > - > - Seg->Seq = Seg->End; > - NetbufTrim (Nbuf, Nbuf->TotalSize, NET_BUF_HEAD); > - return; > - } > - > - // > - // Adjust the buffer header > - // > - if (TCP_SEQ_LT (Seg->Seq, Left)) { > - > - Drop = TCP_SUB_SEQ (Left, Seg->Seq); > - Urg = Seg->Seq + Seg->Urg; > - Seg->Seq = Left; > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); > - Drop--; > - } > - > - // > - // Adjust the urgent point > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG)) { > - > - if (TCP_SEQ_LT (Urg, Seg->Seq)) { > - > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); > - } else { > - Seg->Urg = (UINT16) TCP_SUB_SEQ (Urg, Seg->Seq); > - } > - } > - > - if (Drop != 0) { > - NetbufTrim (Nbuf, Drop, NET_BUF_HEAD); > - } > - } > - > - // > - // Adjust the buffer tail > - // > - if (TCP_SEQ_GT (Seg->End, Right)) { > - > - Drop = TCP_SUB_SEQ (Seg->End, Right); > - Seg->End = Right; > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); > - Drop--; > - } > - > - if (Drop != 0) { > - NetbufTrim (Nbuf, Drop, NET_BUF_TAIL); > - } > - } > - > - ASSERT (TcpVerifySegment (Nbuf) != 0); > -} > - > - > -/** > - Trim off the data outside the tcb's receive window. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the NET_BUF containing the received tcp > segment. > - > -**/ > -VOID > -TcpTrimInWnd ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ) > -{ > - TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd); > -} > - > - > -/** > - Process the data and FIN flag, check whether to deliver > - data to the socket layer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @retval 0 No error occurred to deliver data. > - @retval -1 Error condition occurred. Proper response is to reset the > - connection. > - > -**/ > -INTN > -TcpDeliverData ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - LIST_ENTRY *Entry; > - NET_BUF *Nbuf; > - TCP_SEQNO Seq; > - TCP_SEG *Seg; > - UINT32 Urgent; > - > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > - > - // > - // make sure there is some data queued, > - // and TCP is in a proper state > - // > - if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) { > - > - return 0; > - } > - > - // > - // Deliver data to the socket layer > - // > - Entry = Tcb->RcvQue.ForwardLink; > - Seq = Tcb->RcvNxt; > - > - while (Entry != &Tcb->RcvQue) { > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > - Seg = TCPSEG_NETBUF (Nbuf); > - > - ASSERT (TcpVerifySegment (Nbuf) != 0); > - ASSERT (Nbuf->Tcp == NULL); > - > - if (TCP_SEQ_GT (Seg->Seq, Seq)) { > - break; > - } > - > - Entry = Entry->ForwardLink; > - Seq = Seg->End; > - Tcb->RcvNxt = Seq; > - > - RemoveEntryList (&Nbuf->List); > - > - // > - // RFC793 Eighth step: process FIN in sequence > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > - > - // > - // The peer sends to us junky data after FIN, > - // reset the connection. > - // > - if (!IsListEmpty (&Tcb->RcvQue)) { > - DEBUG ((EFI_D_ERROR, "TcpDeliverData: data received after" > - " FIN from peer of TCB %p, reset connection\n", Tcb)); > - > - NetbufFree (Nbuf); > - return -1; > - } > - > - DEBUG ((EFI_D_NET, "TcpDeliverData: processing FIN " > - "from peer of TCB %p\n", Tcb)); > - > - switch (Tcb->State) { > - case TCP_SYN_RCVD: > - case TCP_ESTABLISHED: > - > - TcpSetState (Tcb, TCP_CLOSE_WAIT); > - break; > - > - case TCP_FIN_WAIT_1: > - > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > - > - TcpSetState (Tcb, TCP_CLOSING); > - break; > - } > - > - // > - // fall through > - // > - case TCP_FIN_WAIT_2: > - > - TcpSetState (Tcb, TCP_TIME_WAIT); > - TcpClearAllTimer (Tcb); > - > - if (Tcb->TimeWaitTimeout != 0) { > - > - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); > - } else { > - > - DEBUG ((EFI_D_WARN, "Connection closed immediately " > - "because app disables TIME_WAIT timer for %p\n", Tcb)); > - > - TcpSendAck (Tcb); > - TcpClose (Tcb); > - } > - break; > - > - case TCP_CLOSE_WAIT: > - case TCP_CLOSING: > - case TCP_LAST_ACK: > - case TCP_TIME_WAIT: > - // > - // The peer sends to us junk FIN byte. Discard > - // the buffer then reset the connection > - // > - NetbufFree (Nbuf); > - return -1; > - default: > - break; > - } > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > - > - Seg->End--; > - } > - > - // > - // Don't delay the ack if PUSH flag is on. > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_PSH)) { > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > - } > - > - if (Nbuf->TotalSize != 0) { > - Urgent = 0; > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && > - TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp)) { > - > - if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) { > - Urgent = Nbuf->TotalSize; > - } else { > - Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1; > - } > - } > - > - SockDataRcvd (Tcb->Sk, Nbuf, Urgent); > - } > - > - if (TCP_FIN_RCVD (Tcb->State)) { > - > - SockNoMoreData (Tcb->Sk); > - } > - > - NetbufFree (Nbuf); > - } > - > - return 0; > -} > - > - > -/** > - Store the data into the reassemble queue. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer containing the data to be queued. > - > -**/ > -VOID > -TcpQueueData ( > - IN OUT TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ) > -{ > - TCP_SEG *Seg; > - LIST_ENTRY *Head; > - LIST_ENTRY *Prev; > - LIST_ENTRY *Cur; > - NET_BUF *Node; > - > - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); > - > - NET_GET_REF (Nbuf); > - > - Seg = TCPSEG_NETBUF (Nbuf); > - Head = &Tcb->RcvQue; > - > - // > - // Fast path to process normal case. That is, > - // no out-of-order segments are received. > - // > - if (IsListEmpty (Head)) { > - > - InsertTailList (Head, &Nbuf->List); > - return; > - } > - > - // > - // Find the point to insert the buffer > - // > - for (Prev = Head, Cur = Head->ForwardLink; > - Cur != Head; > - Prev = Cur, Cur = Cur->ForwardLink) { > - > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > - > - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->Seq)) { > - break; > - } > - } > - > - // > - // Check whether the current segment overlaps with the > - // previous segment. > - // > - if (Prev != Head) { > - Node = NET_LIST_USER_STRUCT (Prev, NET_BUF, List); > - > - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->End)) { > - > - if (TCP_SEQ_LEQ (Seg->End, TCPSEG_NETBUF (Node)->End)) { > - > - NetbufFree (Nbuf); > - return; > - } > - > - TcpTrimSegment (Nbuf, TCPSEG_NETBUF (Node)->End, Seg->End); > - } > - } > - > - InsertHeadList (Prev, &Nbuf->List); > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > - > - // > - // Check the segments after the insert point. > - // > - while (Cur != Head) { > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > - > - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->End, Seg->End)) { > - > - Cur = Cur->ForwardLink; > - > - RemoveEntryList (&Node->List); > - NetbufFree (Node); > - continue; > - } > - > - if (TCP_SEQ_LT (TCPSEG_NETBUF (Node)->Seq, Seg->End)) { > - > - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->Seq, Seg->Seq)) { > - > - RemoveEntryList (&Nbuf->List); > - NetbufFree (Nbuf); > - return ; > - } > - > - TcpTrimSegment (Nbuf, Seg->Seq, TCPSEG_NETBUF (Node)->Seq); > - break; > - } > - > - Cur = Cur->ForwardLink; > - } > -} > - > - > -/** > - Ajust the send queue or the retransmit queue. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Ack The acknowledge seuqence number of the received > segment. > - > -**/ > -VOID > -TcpAdjustSndQue ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Ack > - ) > -{ > - LIST_ENTRY *Head; > - LIST_ENTRY *Cur; > - NET_BUF *Node; > - TCP_SEG *Seg; > - > - Head = &Tcb->SndQue; > - Cur = Head->ForwardLink; > - > - while (Cur != Head) { > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > - Seg = TCPSEG_NETBUF (Node); > - > - if (TCP_SEQ_GEQ (Seg->Seq, Ack)) { > - break; > - } > - > - // > - // Remove completely ACKed segments > - // > - if (TCP_SEQ_LEQ (Seg->End, Ack)) { > - Cur = Cur->ForwardLink; > - > - RemoveEntryList (&Node->List); > - NetbufFree (Node); > - continue; > - } > - > - TcpTrimSegment (Node, Ack, Seg->End); > - break; > - } > -} > - > - > -/** > - Process the received TCP segments. > - > - @param Nbuf Buffer that contains received TCP segment without IP > header. > - @param Src Source address of the segment, or the peer's IP address. > - @param Dst Destination address of the segment, or the local end's IP > - address. > - > - @retval 0 Segment is processed successfully. It is either accepted or > - discarded. But no connection is reset by the segment. > - @retval -1 A connection is reset by the segment. > - > -**/ > -INTN > -TcpInput ( > - IN NET_BUF *Nbuf, > - IN UINT32 Src, > - IN UINT32 Dst > - ) > -{ > - TCP_CB *Tcb; > - TCP_CB *Parent; > - TCP_OPTION Option; > - TCP_HEAD *Head; > - INT32 Len; > - TCP_SEG *Seg; > - TCP_SEQNO Right; > - TCP_SEQNO Urg; > - INT32 Usable; > - > - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); > - > - Parent = NULL; > - Tcb = NULL; > - > - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); > - ASSERT (Head != NULL); > - > - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { > - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); > - goto DISCARD; > - } > - > - Len = Nbuf->TotalSize - (Head->HeadLen << 2); > - > - if ((Head->HeadLen < 5) || (Len < 0) || > - (TcpChecksum (Nbuf, NetPseudoHeadChecksum (Src, Dst, 6, 0)) != 0)) { > - > - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); > - goto DISCARD; > - } > - > - if (TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)) { > - Len++; > - } > - > - if (TCP_FLG_ON (Head->Flag, TCP_FLG_FIN)) { > - Len++; > - } > - > - Tcb = TcpLocateTcb ( > - Head->DstPort, > - Dst, > - Head->SrcPort, > - Src, > - (BOOLEAN) TCP_FLG_ON (Head->Flag, TCP_FLG_SYN) > - ); > - > - if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) { > - DEBUG ((EFI_D_NET, "TcpInput: send reset because no TCB found\n")); > - > - Tcb = NULL; > - goto SEND_RESET; > - } > - > - Seg = TcpFormatNetbuf (Tcb, Nbuf); > - > - // > - // RFC1122 recommended reaction to illegal option > - // (in fact, an illegal option length) is reset. > - // > - if (TcpParseOption (Nbuf->Tcp, &Option) == -1) { > - DEBUG ((EFI_D_ERROR, "TcpInput: reset the peer because" > - " of malformed option for TCB %p\n", Tcb)); > - > - goto SEND_RESET; > - } > - > - // > - // From now on, the segment is headless > - // > - NetbufTrim (Nbuf, (Head->HeadLen << 2), NET_BUF_HEAD); > - Nbuf->Tcp = NULL; > - > - // > - // Process the segment in LISTEN state. > - // > - if (Tcb->State == TCP_LISTEN) { > - // > - // First step: Check RST > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " > - "for TCB %p in listening\n", Tcb)); > - > - goto DISCARD; > - } > - > - // > - // Second step: Check ACK. > - // Any ACK sent to TCP in LISTEN is reseted. > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" > - " segment with ACK for TCB %p in listening\n", Tcb)); > - > - goto SEND_RESET; > - } > - > - // > - // Third step: Check SYN > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > - // > - // create a child TCB to handle the data > - // > - Parent = Tcb; > - > - Tcb = TcpCloneTcb (Parent); > - if (Tcb == NULL) { > - DEBUG ((EFI_D_ERROR, "TcpInput: discard a segment because" > - " failed to clone a child for TCB %p\n", Tcb)); > - > - goto DISCARD; > - } > - > - DEBUG ((EFI_D_NET, "TcpInput: create a child for TCB %p" > - " in listening\n", Tcb)); > - > - // > - // init the TCB structure > - // > - Tcb->LocalEnd.Ip = Dst; > - Tcb->LocalEnd.Port = Head->DstPort; > - Tcb->RemoteEnd.Ip = Src; > - Tcb->RemoteEnd.Port = Head->SrcPort; > - > - TcpInitTcbLocal (Tcb); > - TcpInitTcbPeer (Tcb, Seg, &Option); > - > - TcpSetState (Tcb, TCP_SYN_RCVD); > - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); > - TcpTrimInWnd (Tcb, Nbuf); > - > - goto StepSix; > - } > - > - goto DISCARD; > - > - } else if (Tcb->State == TCP_SYN_SENT) { > - // > - // First step: Check ACK bit > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + 1)) > { > - > - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of " > - "wrong ACK received for TCB %p in SYN_SENT\n", Tcb)); > - > - goto SEND_RESET; > - } > - > - // > - // Second step: Check RST bit > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > - > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset by" > - " peer for TCB %p in SYN_SENT\n", Tcb)); > - > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); > - goto DROP_CONNECTION; > - } else { > - > - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " > - "because of no ACK for TCB %p in SYN_SENT\n", Tcb)); > - > - goto DISCARD; > - } > - } > - > - // > - // Third step: Check security and precedence. Skipped > - // > - > - // > - // Fourth step: Check SYN. Pay attention to simultaneous open > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > - > - TcpInitTcbPeer (Tcb, Seg, &Option); > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > - > - Tcb->SndUna = Seg->Ack; > - } > - > - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); > - > - if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) { > - > - TcpSetState (Tcb, TCP_ESTABLISHED); > - > - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); > - TcpDeliverData (Tcb); > - > - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > - > - TcpComputeRtt (Tcb, Tcb->RttMeasure); > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > - } > - > - TcpTrimInWnd (Tcb, Nbuf); > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > - > - DEBUG ((EFI_D_NET, "TcpInput: connection established" > - " for TCB %p in SYN_SENT\n", Tcb)); > - > - goto StepSix; > - } else { > - // > - // Received a SYN segment without ACK, simultaneous open. > - // > - TcpSetState (Tcb, TCP_SYN_RCVD); > - > - ASSERT (Tcb->SndNxt == Tcb->Iss + 1); > - TcpAdjustSndQue (Tcb, Tcb->SndNxt); > - > - TcpTrimInWnd (Tcb, Nbuf); > - > - DEBUG ((EFI_D_WARN, "TcpInput: simultaneous open " > - "for TCB %p in SYN_SENT\n", Tcb)); > - > - goto StepSix; > - } > - } > - > - goto DISCARD; > - } > - > - // > - // Process segment in SYN_RCVD or TCP_CONNECTED states > - // > - > - // > - // Clear probe timer since the RecvWindow is opened. > - // > - if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) { > - TcpClearTimer (Tcb, TCP_TIMER_PROBE); > - Tcb->ProbeTimerOn = FALSE; > - } > - > - // > - // First step: Check whether SEG.SEQ is acceptable > - // > - if (TcpSeqAcceptable (Tcb, Seg) == 0) { > - DEBUG ((EFI_D_WARN, "TcpInput: sequence acceptance" > - " test failed for segment of TCB %p\n", Tcb)); > - > - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > - TcpSendAck (Tcb); > - } > - > - goto DISCARD; > - } > - > - if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) && > - (Tcb->RcvWl2 == Seg->End) && > - !TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN | TCP_FLG_FIN)) { > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > - } > - > - // > - // Second step: Check the RST > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > - > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", Tcb)); > - > - if (Tcb->State == TCP_SYN_RCVD) { > - > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED); > - > - // > - // This TCB comes from either a LISTEN TCB, > - // or active open TCB with simultanous open. > - // Do NOT signal user CONNECTION refused > - // if it comes from a LISTEN TCB. > - // > - } else if ((Tcb->State == TCP_ESTABLISHED) || > - (Tcb->State == TCP_FIN_WAIT_1) || > - (Tcb->State == TCP_FIN_WAIT_2) || > - (Tcb->State == TCP_CLOSE_WAIT)) { > - > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); > - > - } else { > - > - } > - > - goto DROP_CONNECTION; > - } > - > - // > - // Trim the data and flags. > - // > - TcpTrimInWnd (Tcb, Nbuf); > - > - // > - // Third step: Check security and precedence, Ignored > - // > - > - // > - // Fourth step: Check the SYN bit. > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > - > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset " > - "because received extra SYN for TCB %p\n", Tcb)); > - > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); > - goto RESET_THEN_DROP; > - } > - > - // > - // Fifth step: Check the ACK > - // > - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > - DEBUG ((EFI_D_WARN, "TcpInput: segment discard because" > - " of no ACK for connected TCB %p\n", Tcb)); > - > - goto DISCARD; > - > - } > - > - if (Tcb->State == TCP_SYN_RCVD) { > - > - if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) && > - TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt)) { > - > - Tcb->SndWnd = Seg->Wnd; > - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); > - Tcb->SndWl1 = Seg->Seq; > - Tcb->SndWl2 = Seg->Ack; > - TcpSetState (Tcb, TCP_ESTABLISHED); > - > - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); > - TcpDeliverData (Tcb); > - > - DEBUG ((EFI_D_NET, "TcpInput: connection established " > - " for TCB %p in SYN_RCVD\n", Tcb)); > - > - // > - // Continue the process as ESTABLISHED state > - // > - } else { > - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" > - " wrong ACK for TCB %p in SYN_RCVD\n", Tcb)); > - > - goto SEND_RESET; > - } > - } > - > - if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) { > - > - DEBUG ((EFI_D_WARN, "TcpInput: ignore the out-of-data" > - " ACK for connected TCB %p\n", Tcb)); > - > - goto StepSix; > - > - } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) { > - > - DEBUG ((EFI_D_WARN, "TcpInput: discard segment for " > - "future ACK for connected TCB %p\n", Tcb)); > - > - TcpSendAck (Tcb); > - goto DISCARD; > - } > - > - // > - // From now on: SND.UNA <= SEG.ACK <= SND.NXT. > - // > - if (TCP_FLG_ON (Option.Flag, TCP_OPTION_RCVD_TS)) { > - // > - // update TsRecent as specified in page 16 RFC1323. > - // RcvWl2 equals to the variable "LastAckSent" > - // defined there. > - // > - if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) && > - TCP_SEQ_LT (Tcb->RcvWl2, Seg->End)) { > - > - Tcb->TsRecent = Option.TSVal; > - Tcb->TsRecentAge = mTcpTick; > - } > - > - TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr)); > - > - } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > - > - ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN); > - > - TcpComputeRtt (Tcb, Tcb->RttMeasure); > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > - } > - > - if (Seg->Ack == Tcb->SndNxt) { > - > - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); > - } else { > - > - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); > - } > - > - // > - // Count duplicate acks. > - // > - if ((Seg->Ack == Tcb->SndUna) && > - (Tcb->SndUna != Tcb->SndNxt) && > - (Seg->Wnd == Tcb->SndWnd) && > - (0 == Len)) { > - > - Tcb->DupAck++; > - } else { > - > - Tcb->DupAck = 0; > - } > - > - // > - // Congestion avoidance, fast recovery and fast retransmission. > - // > - if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) > || > - (Tcb->CongestState == TCP_CONGEST_LOSS)) { > - > - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { > - > - if (Tcb->CWnd < Tcb->Ssthresh) { > - > - Tcb->CWnd += Tcb->SndMss; > - } else { > - > - Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1); > - } > - > - Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale); > - } > - > - if (Tcb->CongestState == TCP_CONGEST_LOSS) { > - TcpFastLossRecover (Tcb, Seg); > - } > - } else { > - > - TcpFastRecover (Tcb, Seg); > - } > - > - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { > - > - TcpAdjustSndQue (Tcb, Seg->Ack); > - Tcb->SndUna = Seg->Ack; > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && > - TCP_SEQ_LT (Tcb->SndUp, Seg->Ack)) { > - > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); > - } > - } > - > - // > - // Update window info > - // > - if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) || > - ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg- > >Ack))) { > - > - Right = Seg->Ack + Seg->Wnd; > - > - if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) { > - > - if ((Tcb->SndWl1 == Seg->Seq) && > - (Tcb->SndWl2 == Seg->Ack) && > - (Len == 0)) { > - > - goto NO_UPDATE; > - } > - > - DEBUG ((EFI_D_WARN, "TcpInput: peer shrinks the" > - " window for connected TCB %p\n", Tcb)); > - > - if ((Tcb->CongestState == TCP_CONGEST_RECOVER) && > - (TCP_SEQ_LT (Right, Tcb->Recover))) { > - > - Tcb->Recover = Right; > - } > - > - if ((Tcb->CongestState == TCP_CONGEST_LOSS) && > - (TCP_SEQ_LT (Right, Tcb->LossRecover))) { > - > - Tcb->LossRecover = Right; > - } > - > - if (TCP_SEQ_LT (Right, Tcb->SndNxt)) { > - // > - // Check for Window Retraction in RFC7923 section 2.4. > - // The lower n bits of the peer's actual receive window is wiped out if > TCP > - // window scale is enabled, it will look like the peer is shrinking the > window. > - // Check whether the SndNxt is out of the advertised receive window > by more than > - // 2^Rcv.Wind.Shift before moving the SndNxt to the left. > - // > - DEBUG ( > - (EFI_D_WARN, > - "TcpInput: peer advise negative useable window for connected > TCB %p\n", > - Tcb) > - ); > - Usable = TCP_SUB_SEQ (Tcb->SndNxt, Right); > - if ((Usable >> Tcb->SndWndScale) > 0) { > - DEBUG ( > - (EFI_D_WARN, > - "TcpInput: SndNxt is out of window by more than window scale for > TCB %p\n", > - Tcb) > - ); > - Tcb->SndNxt = Right; > - } > - if (Right == Tcb->SndUna) { > - > - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); > - TcpSetProbeTimer (Tcb); > - } > - } > - } > - > - Tcb->SndWnd = Seg->Wnd; > - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); > - Tcb->SndWl1 = Seg->Seq; > - Tcb->SndWl2 = Seg->Ack; > - } > - > -NO_UPDATE: > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) && > - (Tcb->SndUna == Tcb->SndNxt)) { > - > - DEBUG ((EFI_D_NET, "TcpInput: local FIN is ACKed by" > - " peer for connected TCB %p\n", Tcb)); > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED); > - } > - > - // > - // Transit the state if proper. > - // > - switch (Tcb->State) { > - case TCP_FIN_WAIT_1: > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > - > - TcpSetState (Tcb, TCP_FIN_WAIT_2); > - > - TcpClearAllTimer (Tcb); > - TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout); > - } > - > - case TCP_FIN_WAIT_2: > - > - break; > - > - case TCP_CLOSE_WAIT: > - break; > - > - case TCP_CLOSING: > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > - > - TcpSetState (Tcb, TCP_TIME_WAIT); > - > - TcpClearAllTimer (Tcb); > - > - if (Tcb->TimeWaitTimeout != 0) { > - > - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); > - } else { > - > - DEBUG ((EFI_D_WARN, "Connection closed immediately " > - "because app disables TIME_WAIT timer for %p\n", Tcb)); > - > - TcpClose (Tcb); > - } > - } > - break; > - > - case TCP_LAST_ACK: > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > - > - TcpSetState (Tcb, TCP_CLOSED); > - } > - > - break; > - > - case TCP_TIME_WAIT: > - > - TcpSendAck (Tcb); > - > - if (Tcb->TimeWaitTimeout != 0) { > - > - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); > - } else { > - > - DEBUG ((EFI_D_WARN, "Connection closed immediately " > - "because app disables TIME_WAIT timer for %p\n", Tcb)); > - > - TcpClose (Tcb); > - } > - break; > - > - default: > - break; > - } > - > - // > - // Sixth step: Check the URG bit.update the Urg point > - // if in TCP_CAN_RECV, otherwise, leave the RcvUp intact. > - // > -StepSix: > - > - Tcb->Idle = 0; > - TcpSetKeepaliveTimer (Tcb); > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) && > - !TCP_FIN_RCVD (Tcb->State)) > - { > - > - DEBUG ((EFI_D_NET, "TcpInput: received urgent data " > - "from peer for connected TCB %p\n", Tcb)); > - > - Urg = Seg->Seq + Seg->Urg; > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && > - TCP_SEQ_GT (Urg, Tcb->RcvUp)) { > - > - Tcb->RcvUp = Urg; > - } else { > - > - Tcb->RcvUp = Urg; > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG); > - } > - } > - > - // > - // Seventh step: Process the segment data > - // > - if (Seg->End != Seg->Seq) { > - > - if (TCP_FIN_RCVD (Tcb->State)) { > - > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" > - " data is lost for connected TCB %p\n", Tcb)); > - > - goto RESET_THEN_DROP; > - } > - > - if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) { > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" > - " data is lost for connected TCB %p\n", Tcb)); > - > - goto RESET_THEN_DROP; > - } > - > - TcpQueueData (Tcb, Nbuf); > - if (TcpDeliverData (Tcb) == -1) { > - goto RESET_THEN_DROP; > - } > - > - if (!IsListEmpty (&Tcb->RcvQue)) { > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > - } > - } > - > - // > - // Eighth step: check the FIN. > - // This step is moved to TcpDeliverData. FIN will be > - // processed in sequence there. Check the comments in > - // the beginning of the file header for information. > - // > - > - // > - // Tcb is a new child of the listening Parent, > - // commit it. > - // > - if (Parent != NULL) { > - Tcb->Parent = Parent; > - TcpInsertTcb (Tcb); > - } > - > - if ((Tcb->State != TCP_CLOSED) && > - (TcpToSendData (Tcb, 0) == 0) && > - (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf- > >TotalSize != 0))) { > - > - TcpToSendAck (Tcb); > - } > - > - NetbufFree (Nbuf); > - return 0; > - > -RESET_THEN_DROP: > - TcpSendReset (Tcb, Head, Len, Dst, Src); > - > -DROP_CONNECTION: > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > - > - NetbufFree (Nbuf); > - TcpClose (Tcb); > - > - return -1; > - > -SEND_RESET: > - > - TcpSendReset (Tcb, Head, Len, Dst, Src); > - > -DISCARD: > - > - // > - // Tcb is a child of Parent, and it doesn't survive > - // > - DEBUG ((EFI_D_WARN, "Tcp4Input: Discard a packet\n")); > - NetbufFree (Nbuf); > - > - if ((Parent != NULL) && (Tcb != NULL)) { > - > - ASSERT (Tcb->Sk != NULL); > - TcpClose (Tcb); > - } > - > - return 0; > -} > - > - > -/** > - Process the received ICMP error messages for TCP. > - > - @param Nbuf Buffer that contains part of the TCP segment without IP > header > - truncated from the ICMP error packet. > - @param IcmpErr The ICMP error code interpreted from ICMP error packet. > - @param Src Source address of the ICMP error message. > - @param Dst Destination address of the ICMP error message. > - > -**/ > -VOID > -TcpIcmpInput ( > - IN NET_BUF *Nbuf, > - IN UINT8 IcmpErr, > - IN UINT32 Src, > - IN UINT32 Dst > - ) > -{ > - TCP_HEAD *Head; > - TCP_CB *Tcb; > - TCP_SEQNO Seq; > - EFI_STATUS IcmpErrStatus; > - BOOLEAN IcmpErrIsHard; > - BOOLEAN IcmpErrNotify; > - > - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { > - goto CLEAN_EXIT; > - } > - > - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); > - ASSERT (Head != NULL); > - Tcb = TcpLocateTcb ( > - Head->DstPort, > - Dst, > - Head->SrcPort, > - Src, > - FALSE > - ); > - if (Tcb == NULL || Tcb->State == TCP_CLOSED) { > - > - goto CLEAN_EXIT; > - } > - > - // > - // Validate the sequence number. > - // > - Seq = NTOHL (Head->Seq); > - if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb- > >SndNxt))) { > - > - goto CLEAN_EXIT; > - } > - > - IcmpErrStatus = IpIoGetIcmpErrStatus ( > - IcmpErr, > - IP_VERSION_4, > - &IcmpErrIsHard, > - &IcmpErrNotify > - ); > - > - if (IcmpErrNotify) { > - > - SOCK_ERROR (Tcb->Sk, IcmpErrStatus); > - } > - > - if (IcmpErrIsHard) { > - > - TcpClose (Tcb); > - } > - > -CLEAN_EXIT: > - NetbufFree (Nbuf); > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > deleted file mode 100644 > index b98d1e783a2f..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > +++ /dev/null > @@ -1,112 +0,0 @@ > -/** @file > - I/O interfaces between TCP and IpIo. > - > -Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Tcp4Main.h" > - > - > -/** > - Packet receive callback function provided to IP_IO, used to call > - the proper function to handle the packet received by IP. > - > - @param Status Status of the received packet. > - @param IcmpErr ICMP error number. > - @param NetSession Pointer to the net session of this packet. > - @param Pkt Pointer to the recieved packet. > - @param Context Pointer to the context configured in IpIoOpen(), not > used > - now. > - > -**/ > -VOID > -EFIAPI > -Tcp4RxCallback ( > - IN EFI_STATUS Status, > - IN UINT8 IcmpErr, > - IN EFI_NET_SESSION_DATA *NetSession, > - IN NET_BUF *Pkt, > - IN VOID *Context OPTIONAL > - ) > -{ > - if (EFI_SUCCESS == Status) { > - TcpInput (Pkt, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]); > - } else { > - TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession- > >Dest.Addr[0]); > - } > -} > - > - > -/** > - Send the segment to IP via IpIo function. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the TCP segment to be sent. > - @param Src Source address of the TCP segment. > - @param Dest Destination address of the TCP segment. > - > - @retval 0 The segment was sent out successfully. > - @retval -1 The segment was failed to send. > - > -**/ > -INTN > -TcpSendIpPacket ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf, > - IN UINT32 Src, > - IN UINT32 Dest > - ) > -{ > - EFI_STATUS Status; > - IP_IO *IpIo; > - IP_IO_OVERRIDE Override; > - SOCKET *Sock; > - VOID *IpSender; > - TCP4_PROTO_DATA *TcpProto; > - EFI_IP_ADDRESS Source; > - EFI_IP_ADDRESS Destination; > - > - Source.Addr[0] = Src; > - Destination.Addr[0] = Dest; > - > - if (NULL == Tcb) { > - > - IpIo = NULL; > - IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source); > - > - if (IpSender == NULL) { > - DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate > IpSender.\n")); > - return -1; > - } > - } else { > - > - Sock = Tcb->Sk; > - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > - IpIo = TcpProto->TcpService->IpIo; > - IpSender = Tcb->IpInfo; > - } > - > - Override.Ip4OverrideData.TypeOfService = 0; > - Override.Ip4OverrideData.TimeToLive = 255; > - Override.Ip4OverrideData.DoNotFragment = FALSE; > - Override.Ip4OverrideData.Protocol = EFI_IP_PROTO_TCP; > - ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof > (EFI_IPv4_ADDRESS)); > - CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof > (EFI_IPv4_ADDRESS)); > - > - Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, > &Override); > - > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status)); > - return -1; > - } > - > - return 0; > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > deleted file mode 100644 > index d8fc68c0a97d..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > +++ /dev/null > @@ -1,674 +0,0 @@ > -/** @file > - Implementation of TCP4 protocol services. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "Tcp4Main.h" > - > - > -/** > - Check the integrity of the data buffer. > - > - @param DataLen The total length of the data buffer. > - @param FragmentCount The fragment count of the fragment table. > - @param FragmentTable Pointer to the fragment table of the data > - buffer. > - > - @retval EFI_SUCCESS The integrity check is passed. > - @retval EFI_INVALID_PARAMETER The integrity check is failed. > - > -**/ > -EFI_STATUS > -Tcp4ChkDataBuf ( > - IN UINT32 DataLen, > - IN UINT32 FragmentCount, > - IN EFI_TCP4_FRAGMENT_DATA *FragmentTable > - ) > -{ > - UINT32 Index; > - > - UINT32 Len; > - > - for (Index = 0, Len = 0; Index < FragmentCount; Index++) { > - Len = Len + (UINT32) FragmentTable[Index].FragmentLength; > - } > - > - if (DataLen != Len) { > - return EFI_INVALID_PARAMETER; > - } > - > - return EFI_SUCCESS; > -} > - > - > -/** > - Get the current operational status. > - > - The GetModeData() function copies the current operational settings of this > - EFI TCPv4 Protocol instance into user-supplied buffers. This function can > - also be used to retrieve the operational setting of underlying drivers > - such as IPv4, MNP, or SNP. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param Tcp4State Pointer to the buffer to receive the current TCP > - state. > - @param Tcp4ConfigData Pointer to the buffer to receive the current > TCP > - configuration. > - @param Ip4ModeData Pointer to the buffer to receive the current > IPv4 > - configuration data used by the TCPv4 instance. > - @param MnpConfigData Pointer to the buffer to receive the current > MNP > - configuration data indirectly used by the TCPv4 > - Instance. > - @param SnpModeData Pointer to the buffer to receive the current > SNP > - configuration data indirectly used by the TCPv4 > - Instance. > - > - @retval EFI_SUCCESS The mode data was read. > - @retval EFI_NOT_STARTED No configuration data is available because > this > - instance hasn't been started. > - @retval EFI_INVALID_PARAMETER This is NULL. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4GetModeData ( > - IN EFI_TCP4_PROTOCOL *This, > - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, > - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, > - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, > - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData > OPTIONAL, > - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL > - ) > -{ > - TCP4_MODE_DATA TcpMode; > - SOCKET *Sock; > - > - if (NULL == This) { > - return EFI_INVALID_PARAMETER; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - TcpMode.Tcp4State = Tcp4State; > - TcpMode.Tcp4ConfigData = Tcp4ConfigData; > - TcpMode.Ip4ModeData = Ip4ModeData; > - TcpMode.MnpConfigData = MnpConfigData; > - TcpMode.SnpModeData = SnpModeData; > - > - return SockGetMode (Sock, &TcpMode); > -} > - > - > -/** > - Initialize or brutally reset the operational parameters for > - this EFI TCPv4 instance. > - > - The Configure() function does the following: > - * Initialize this EFI TCPv4 instance, i.e., initialize the communication end > - setting, specify active open or passive open for an instance. > - * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous > - tokens, flush transmission and receiving buffer directly without informing > - the communication peer. > - No other TCPv4 Protocol operation can be executed by this instance > - until it is configured properly. For an active TCP4 instance, after a proper > - configuration it may call Connect() to initiates the three-way handshake. > - For a passive TCP4 instance, its state will transit to Tcp4StateListen after > - configuration, and Accept() may be called to listen the incoming TCP > connection > - request. If TcpConfigData is set to NULL, the instance is reset. Resetting > - process will be done brutally, the state machine will be set to > Tcp4StateClosed > - directly, the receive queue and transmit queue will be flushed, and no > traffic is > - allowed through this instance. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param TcpConfigData Pointer to the configure data to configure the > - instance. > - > - @retval EFI_SUCCESS The operational settings are set, changed, or > - reset successfully. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (through DHCP, BOOTP, RARP, etc.) is not > - finished. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is > already > - configured. > - @retval EFI_DEVICE_ERROR An unexpected network or system error > occurred. > - @retval EFI_UNSUPPORTED One or more of the control options are > not > - supported in the implementation. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system > resources. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Configure ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL > - ) > -{ > - EFI_TCP4_OPTION *Option; > - SOCKET *Sock; > - EFI_STATUS Status; > - IP4_ADDR Ip; > - IP4_ADDR SubnetMask; > - > - if (NULL == This) { > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Tcp protocol related parameter check will be conducted here > - // > - if (NULL != TcpConfigData) { > - > - CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof > (IP4_ADDR)); > - if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (TcpConfigData->AccessPoint.ActiveFlag && > - (0 == TcpConfigData->AccessPoint.RemotePort || (Ip == 0))) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (!TcpConfigData->AccessPoint.UseDefaultAddress) { > - > - CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof > (IP4_ADDR)); > - CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, > sizeof (IP4_ADDR)); > - if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) || > - (SubnetMask != 0 && !NetIp4IsUnicast (NTOHL (Ip), NTOHL > (SubnetMask)))) { > - return EFI_INVALID_PARAMETER; > - } > - } > - > - Option = TcpConfigData->ControlOption; > - if ((NULL != Option) && > - (Option->EnableSelectiveAck || Option->EnablePathMtuDiscovery)) { > - return EFI_UNSUPPORTED; > - } > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - if (NULL == TcpConfigData) { > - return SockFlush (Sock); > - } > - > - Status = SockConfigure (Sock, TcpConfigData); > - > - if (EFI_NO_MAPPING == Status) { > - Sock->ConfigureState = SO_NO_MAPPING; > - } > - > - return Status; > -} > - > - > -/** > - Add or delete routing entries. > - > - The Routes() function adds or deletes a route from the instance's routing > table. > - The most specific route is selected by comparing the SubnetAddress with > the > - destination IP address's arithmetical AND to the SubnetMask. > - The default route is added with both SubnetAddress and SubnetMask set > to 0.0.0.0. > - The default route matches all destination IP addresses if there is no more > specific route. > - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent > to > - the destination host if its address can be found in the Address Resolution > Protocol (ARP) > - cache or it is on the local subnet. If the instance is configured to use default > - address, a direct route to the local network will be added automatically. > - Each TCP instance has its own independent routing table. Instance that > uses the > - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's > routing table. > - The copy will be updated automatically whenever the IP driver > reconfigures its > - instance. As a result, the previous modification to the instance's local copy > - will be lost. The priority of checking the route table is specific with IP > - implementation and every IP implementation must comply with RFC 1122. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param DeleteRoute If TRUE, delete the specified route from > routing > - table; if FALSE, add the specified route to > - routing table. > - DestinationAddress and SubnetMask are used as > - the keywords to search route entry. > - @param SubnetAddress The destination network. > - @param SubnetMask The subnet mask for the destination network. > - @param GatewayAddress The gateway address for this route. > - It must be on the same subnet with the station > - address unless a direct route is specified. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not > been > - configured. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (through DHCP, BOOTP, RARP, etc.) is not > - finished. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > to add the > - entry to the routing table. > - @retval EFI_NOT_FOUND This route is not in the routing table. > - @retval EFI_ACCESS_DENIED This route is already in the routing table. > - @retval EFI_UNSUPPORTED The TCP driver does not support this > operation. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Routes ( > - IN EFI_TCP4_PROTOCOL *This, > - IN BOOLEAN DeleteRoute, > - IN EFI_IPv4_ADDRESS *SubnetAddress, > - IN EFI_IPv4_ADDRESS *SubnetMask, > - IN EFI_IPv4_ADDRESS *GatewayAddress > - ) > -{ > - SOCKET *Sock; > - TCP4_ROUTE_INFO RouteInfo; > - > - if (NULL == This) { > - return EFI_INVALID_PARAMETER; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - RouteInfo.DeleteRoute = DeleteRoute; > - RouteInfo.SubnetAddress = SubnetAddress; > - RouteInfo.SubnetMask = SubnetMask; > - RouteInfo.GatewayAddress = GatewayAddress; > - > - return SockRoute (Sock, &RouteInfo); > -} > - > - > -/** > - Initiate a nonblocking TCP connection request for an active TCP instance. > - > - The Connect() function will initiate an active open to the remote peer > configured > - in current TCP instance if it is configured active. If the connection succeeds > - or fails due to any error, the ConnectionToken->CompletionToken.Event > will be > - signaled and ConnectionToken->CompletionToken.Status will be updated > accordingly. > - This function can only be called for the TCP instance in Tcp4StateClosed > state. > - The instance will transfer into Tcp4StateSynSent if the function returns > EFI_SUCCESS. > - If TCP three way handshake succeeds, its state will become > Tcp4StateEstablished, > - otherwise, the state will return to Tcp4StateClosed. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance > - @param ConnectionToken Pointer to the connection token to return > when > - the TCP three way handshake finishes. > - > - @retval EFI_SUCCESS The connection request is successfully initiated > - and the state of this TCPv4 instance has > - been changed to Tcp4StateSynSent. > - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_ACCESS_DENIED The instance is not configured as an active > one > - or it is not in Tcp4StateClosed state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough > resource to > - initiate the active open. > - @retval EFI_DEVICE_ERROR An unexpected system or network error > occurred. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Connect ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken > - ) > -{ > - SOCKET *Sock; > - > - if (NULL == This || > - NULL == ConnectionToken || > - NULL == ConnectionToken->CompletionToken.Event) { > - return EFI_INVALID_PARAMETER; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - return SockConnect (Sock, ConnectionToken); > -} > - > - > -/** > - Listen on the passive instance to accept an incoming connection request. > - > - The Accept() function initiates an asynchronous accept request to wait for > an > - incoming connection on the passive TCP instance. If a remote peer > successfully > - establishes a connection with this instance, a new TCP instance will be > created > - and its handle will be returned in ListenToken->NewChildHandle. The > newly created > - instance is configured by inheriting the passive instance's configuration and > is > - ready for use upon return. The instance is in the Tcp4StateEstablished state. > - The ListenToken->CompletionToken.Event will be signaled when a new > connection > - is accepted, user aborts the listen or connection is reset. This function only > - can be called when current TCP instance is in Tcp4StateListen state. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance > - @param ListenToken Pointer to the listen token to return when > - operation finishes. > - > - @retval EFI_SUCCESS The listen token has been queued successfully. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is > not > - in Tcp4StateListen state or a same listen token > - has already existed in the listen token queue of > - this TCP instance. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > to finish > - the operation. > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > above category error. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Accept ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_LISTEN_TOKEN *ListenToken > - ) > -{ > - SOCKET *Sock; > - > - if (NULL == This || > - NULL == ListenToken || > - NULL == ListenToken->CompletionToken.Event) { > - return EFI_INVALID_PARAMETER; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - return SockAccept (Sock, ListenToken); > -} > - > - > -/** > - Queues outgoing data into the transmit queue. > - > - The Transmit() function queues a sending request to this TCPv4 instance > along > - with the user data. The status of the token is updated and the event in the > token > - will be signaled once the data is sent out or some error occurs. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance > - @param Token Pointer to the completion token to queue to the > - transmit queue > - > - @retval EFI_SUCCESS The data has been queued for transmission. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (DHCP, BOOTP, RARP, etc.) is not finished yet. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_ACCESS_DENIED One or more of the following conditions is > TRUE: > - * A transmit completion token with the same > - Token-> CompletionToken.Event was already in the > - transmission queue. > - * The current instance is in Tcp4StateClosed state > - * The current instance is a passive one and > - it is in Tcp4StateListen state. > - * User has called Close() to disconnect this > - connection. > - @retval EFI_NOT_READY The completion token could not be queued > because > - the transmit queue is full. > - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data > because of > - resource shortage. > - @retval EFI_NETWORK_UNREACHABLE There is no route to the > destination network or > - address. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Transmit ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_IO_TOKEN *Token > - ) > -{ > - SOCKET *Sock; > - EFI_STATUS Status; > - > - if (NULL == This || > - NULL == Token || > - NULL == Token->CompletionToken.Event || > - NULL == Token->Packet.TxData || > - 0 == Token->Packet.TxData->FragmentCount || > - 0 == Token->Packet.TxData->DataLength > - ) { > - return EFI_INVALID_PARAMETER; > - } > - > - Status = Tcp4ChkDataBuf ( > - (UINT32) Token->Packet.TxData->DataLength, > - (UINT32) Token->Packet.TxData->FragmentCount, > - Token->Packet.TxData->FragmentTable > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - return SockSend (Sock, Token); > - > -} > - > - > -/** > - Place an asynchronous receive request into the receiving queue. > - > - The Receive() function places a completion token into the receive packet > queue. > - This function is always asynchronous. The caller must allocate the > - Token->CompletionToken.Event and the FragmentBuffer used to receive > data. He also > - must fill the DataLength which represents the whole length of all > FragmentBuffer. > - When the receive operation completes, the EFI TCPv4 Protocol driver > updates the > - Token->CompletionToken.Status and Token->Packet.RxData fields and the > - Token->CompletionToken.Event is signaled. If got data the data and its > length > - will be copy into the FragmentTable, in the same time the full length of > received > - data will be recorded in the DataLength fields. Providing a proper > notification > - function and context for the event will enable the user to receive the > notification > - and receiving status. That notification function is guaranteed to not be re- > entered. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param Token Pointer to a token that is associated with the > - receive data descriptor. > - > - @retval EFI_SUCCESS The receive completion token was cached. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (DHCP, BOOTP, RARP, etc.) is not finished yet. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES The receive completion token could > not be queued > - due to a lack of system resources. > - @retval EFI_DEVICE_ERROR An unexpected system or network error > occurred. > - The EFI TCPv4 Protocol instance has been reset > - to startup defaults. > - @retval EFI_ACCESS_DENIED One or more of the following conditions is > TRUE: > - * A receive completion token with the same > - Token->CompletionToken.Event was already in > - the receive queue. > - * The current instance is in Tcp4StateClosed state. > - * The current instance is a passive one and it > - is in Tcp4StateListen state. > - * User has called Close() to disconnect this > - connection. > - @retval EFI_CONNECTION_FIN The communication peer has closed the > connection > - and there is no any buffered data in the receive > - buffer of this instance. > - @retval EFI_NOT_READY The receive request could not be queued > because > - the receive queue is full. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Receive ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_IO_TOKEN *Token > - ) > -{ > - SOCKET *Sock; > - EFI_STATUS Status; > - > - if (NULL == This || > - NULL == Token || > - NULL == Token->CompletionToken.Event || > - NULL == Token->Packet.RxData || > - 0 == Token->Packet.RxData->FragmentCount || > - 0 == Token->Packet.RxData->DataLength > - ) { > - return EFI_INVALID_PARAMETER; > - } > - > - Status = Tcp4ChkDataBuf ( > - (UINT32) Token->Packet.RxData->DataLength, > - (UINT32) Token->Packet.RxData->FragmentCount, > - Token->Packet.RxData->FragmentTable > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - return SockRcv (Sock, Token); > - > -} > - > - > -/** > - Disconnecting a TCP connection gracefully or reset a TCP connection. > - > - Initiate an asynchronous close token to TCP driver. After Close() is called, > - any buffered transmission data will be sent by TCP driver and the current > - instance will have a graceful close working flow described as RFC 793 if > - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP > - driver to fast disconnect this connection. When the close operation > completes > - successfully the TCP instance is in Tcp4StateClosed state, all pending > - asynchronous operation is signaled and any buffers used for TCP network > traffic > - is flushed. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param CloseToken Pointer to the close token to return when > - operation finishes. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_ACCESS_DENIED One or more of the following are TRUE: > - * Configure() has been called with TcpConfigData > - set to NULL and this function has not returned. > - * Previous Close() call on this instance has not > - finished. > - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to > finish the > - operation. > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > above > - category error. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Close ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_CLOSE_TOKEN *CloseToken > - ) > -{ > - SOCKET *Sock; > - > - if (NULL == This || > - NULL == CloseToken || > - NULL == CloseToken->CompletionToken.Event) { > - return EFI_INVALID_PARAMETER; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - return SockClose (Sock, CloseToken, CloseToken->AbortOnClose); > -} > - > - > -/** > - Abort an asynchronous connection, listen, transmission or receive request. > - > - The Cancel() function aborts a pending connection, listen, transmit or > receive > - request. If Token is not NULL and the token is in the connection, listen, > - transmission or receive queue when it is being cancelled, its Token->Status > - will be set to EFI_ABORTED and then Token->Event will be signaled. If the > token > - is not in one of the queues, which usually means that the asynchronous > operation > - has completed, EFI_NOT_FOUND is returned. If Token is NULL all > asynchronous token > - issued by Connect(), Accept(), Transmit() and Receive()will be aborted. > - NOTE: It has not been implemented currently. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param Token Pointer to a token that has been issued by > - Connect(), Accept(), Transmit() or Receive(). If > - NULL, all pending tokens issued by above four > - functions will be aborted. > - > - @retval EFI_SUCCESS The asynchronous I/O request is aborted and > Token->Event > - is signaled. > - @retval EFI_INVALID_PARAMETER This is NULL. > - @retval EFI_NOT_STARTED This instance hasn's been configured. > - @retval EFI_NO_MAPPING When using the default address, > configuration > - (DHCP, BOOTP,RARP, etc.) hasn's finished yet. > - @retval EFI_NOT_FOUND The asynchronous I/O request isn's found > in the > - transmission or receive queue. It has either > - completed or wasn's issued by Transmit() and Receive(). > - @retval EFI_UNSUPPORTED The operation is not supported in current > - implementation. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Cancel ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL > - ) > -{ > - return EFI_UNSUPPORTED; > -} > - > - > -/** > - Poll to receive incoming data and transmit outgoing segments. > - > - The Poll() function increases the rate that data is moved between the > network > - and application and can be called when the TCP instance is created > successfully. > - Its use is optional. In some implementations, the periodical timer in the > MNP > - driver may not poll the underlying communications device fast enough to > avoid > - drop packets. Drivers and applications that are experiencing packet loss > should > - try calling the Poll() function in a high frequency. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - > - @retval EFI_SUCCESS Incoming or outgoing data was processed. > - @retval EFI_INVALID_PARAMETER This is NULL. > - @retval EFI_DEVICE_ERROR An unexpected system or network error > occurred. > - @retval EFI_NOT_READY No incoming or outgoing data was > processed. > - @retval EFI_TIMEOUT Data was dropped out of the transmission or > - receive queue. Consider increasing the polling > - rate. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Poll ( > - IN EFI_TCP4_PROTOCOL *This > - ) > -{ > - SOCKET *Sock; > - EFI_STATUS Status; > - > - if (NULL == This) { > - return EFI_INVALID_PARAMETER; > - } > - > - Sock = SOCK_FROM_THIS (This); > - > - Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL); > - > - return Status; > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > deleted file mode 100644 > index 7fd8bb1fbe09..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > +++ /dev/null > @@ -1,940 +0,0 @@ > -/** @file > - Misc support routines for tcp. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "Tcp4Main.h" > - > -#include <Library/DevicePathLib.h> > - > -LIST_ENTRY mTcpRunQue = { > - &mTcpRunQue, > - &mTcpRunQue > -}; > - > -LIST_ENTRY mTcpListenQue = { > - &mTcpListenQue, > - &mTcpListenQue > -}; > - > -TCP_SEQNO mTcpGlobalIss = 0x4d7e980b; > - > -CHAR16 *mTcpStateName[] = { > - L"TCP_CLOSED", > - L"TCP_LISTEN", > - L"TCP_SYN_SENT", > - L"TCP_SYN_RCVD", > - L"TCP_ESTABLISHED", > - L"TCP_FIN_WAIT_1", > - L"TCP_FIN_WAIT_2", > - L"TCP_CLOSING", > - L"TCP_TIME_WAIT", > - L"TCP_CLOSE_WAIT", > - L"TCP_LAST_ACK" > -}; > - > - > -/** > - Initialize the Tcb local related members. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpInitTcbLocal ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - // > - // Compute the checksum of the fixed parts of pseudo header > - // > - Tcb->HeadSum = NetPseudoHeadChecksum ( > - Tcb->LocalEnd.Ip, > - Tcb->RemoteEnd.Ip, > - 0x06, > - 0 > - ); > - > - Tcb->Iss = TcpGetIss (); > - Tcb->SndUna = Tcb->Iss; > - Tcb->SndNxt = Tcb->Iss; > - > - Tcb->SndWl2 = Tcb->Iss; > - Tcb->SndWnd = 536; > - > - Tcb->RcvWnd = GET_RCV_BUFFSIZE (Tcb->Sk); > - > - // > - // First window size is never scaled > - // > - Tcb->RcvWndScale = 0; > - Tcb->RetxmitSeqMax = 0; > - > - Tcb->ProbeTimerOn = FALSE; > -} > - > - > -/** > - Initialize the peer related members. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Pointer to the segment that contains the peer's > - intial info. > - @param Opt Pointer to the options announced by the peer. > - > -**/ > -VOID > -TcpInitTcbPeer ( > - IN OUT TCP_CB *Tcb, > - IN TCP_SEG *Seg, > - IN TCP_OPTION *Opt > - ) > -{ > - UINT16 RcvMss; > - > - ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL)); > - ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)); > - > - Tcb->SndWnd = Seg->Wnd; > - Tcb->SndWndMax = Tcb->SndWnd; > - Tcb->SndWl1 = Seg->Seq; > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > - Tcb->SndWl2 = Seg->Ack; > - } else { > - Tcb->SndWl2 = Tcb->Iss + 1; > - } > - > - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) { > - Tcb->SndMss = (UINT16) MAX (64, Opt->Mss); > - > - RcvMss = TcpGetRcvMss (Tcb->Sk); > - if (Tcb->SndMss > RcvMss) { > - Tcb->SndMss = RcvMss; > - } > - > - } else { > - // > - // One end doesn't support MSS option, use default. > - // > - Tcb->RcvMss = 536; > - } > - > - Tcb->CWnd = Tcb->SndMss; > - > - Tcb->Irs = Seg->Seq; > - Tcb->RcvNxt = Tcb->Irs + 1; > - > - Tcb->RcvWl2 = Tcb->RcvNxt; > - > - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_WS) && > - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)) { > - > - Tcb->SndWndScale = Opt->WndScale; > - > - Tcb->RcvWndScale = TcpComputeScale (Tcb); > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS); > - > - } else { > - // > - // One end doesn't support window scale option. use zero. > - // > - Tcb->RcvWndScale = 0; > - } > - > - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_TS) && > - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)) { > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_TS); > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS); > - > - Tcb->TsRecent = Opt->TSVal; > - > - // > - // Compute the effective SndMss per RFC1122 > - // section 4.2.2.6. If timestamp option is > - // enabled, it will always occupy 12 bytes. > - // > - Tcb->SndMss -= TCP_OPTION_TS_ALIGNED_LEN; > - } > -} > - > - > -/** > - Locate a listen TCB that matchs the Local and Remote. > - > - @param Local Pointer to the local (IP, Port). > - @param Remote Pointer to the remote (IP, Port). > - > - @return Pointer to the TCP_CB with the least number of wildcard, > - if NULL no match is found. > - > -**/ > -TCP_CB * > -TcpLocateListenTcb ( > - IN TCP_PEER *Local, > - IN TCP_PEER *Remote > - ) > -{ > - LIST_ENTRY *Entry; > - TCP_CB *Node; > - TCP_CB *Match; > - INTN Last; > - INTN Cur; > - > - Last = 4; > - Match = NULL; > - > - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { > - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > - > - if ((Local->Port != Node->LocalEnd.Port) || > - !TCP_PEER_MATCH (Remote, &Node->RemoteEnd) || > - !TCP_PEER_MATCH (Local, &Node->LocalEnd)) { > - > - continue; > - } > - > - // > - // Compute the number of wildcard > - // > - Cur = 0; > - if (Node->RemoteEnd.Ip == 0) { > - Cur++; > - } > - > - if (Node->RemoteEnd.Port == 0) { > - Cur++; > - } > - > - if (Node->LocalEnd.Ip == 0) { > - Cur++; > - } > - > - if (Cur < Last) { > - if (Cur == 0) { > - return Node; > - } > - > - Last = Cur; > - Match = Node; > - } > - } > - > - return Match; > -} > - > - > -/** > - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. > - > - @param Addr Pointer to the IP address needs to match. > - @param Port The port number needs to match. > - > - @return The Tcb which matches the <Addr Port> paire exists or not. > - > -**/ > -BOOLEAN > -TcpFindTcbByPeer ( > - IN EFI_IPv4_ADDRESS *Addr, > - IN TCP_PORTNO Port > - ) > -{ > - TCP_PORTNO LocalPort; > - LIST_ENTRY *Entry; > - TCP_CB *Tcb; > - > - ASSERT ((Addr != NULL) && (Port != 0)); > - > - LocalPort = HTONS (Port); > - > - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > - > - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && > - (LocalPort == Tcb->LocalEnd.Port)) { > - > - return TRUE; > - } > - } > - > - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > - > - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && > - (LocalPort == Tcb->LocalEnd.Port)) { > - > - return TRUE; > - } > - } > - > - return FALSE; > -} > - > - > -/** > - Locate the TCP_CB related to the socket pair. > - > - @param LocalPort The local port number. > - @param LocalIp The local IP address. > - @param RemotePort The remote port number. > - @param RemoteIp The remote IP address. > - @param Syn Whether to search the listen sockets, if TRUE, the > - listen sockets are searched. > - > - @return Pointer to the related TCP_CB, if NULL no match is found. > - > -**/ > -TCP_CB * > -TcpLocateTcb ( > - IN TCP_PORTNO LocalPort, > - IN UINT32 LocalIp, > - IN TCP_PORTNO RemotePort, > - IN UINT32 RemoteIp, > - IN BOOLEAN Syn > - ) > -{ > - TCP_PEER Local; > - TCP_PEER Remote; > - LIST_ENTRY *Entry; > - TCP_CB *Tcb; > - > - Local.Port = LocalPort; > - Local.Ip = LocalIp; > - > - Remote.Port = RemotePort; > - Remote.Ip = RemoteIp; > - > - // > - // First check for exact match. > - // > - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > - > - if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) && > - TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) { > - > - RemoveEntryList (&Tcb->List); > - InsertHeadList (&mTcpRunQue, &Tcb->List); > - > - return Tcb; > - } > - } > - > - // > - // Only check listen queue when SYN flag is on > - // > - if (Syn) { > - return TcpLocateListenTcb (&Local, &Remote); > - } > - > - return NULL; > -} > - > - > -/** > - Insert a Tcb into the proper queue. > - > - @param Tcb Pointer to the TCP_CB to be inserted. > - > - @retval 0 The Tcb is inserted successfully. > - @retval -1 Error condition occurred. > - > -**/ > -INTN > -TcpInsertTcb ( > - IN TCP_CB *Tcb > - ) > -{ > - LIST_ENTRY *Entry; > - LIST_ENTRY *Head; > - TCP_CB *Node; > - > - ASSERT ( > - (Tcb != NULL) && > - ((Tcb->State == TCP_LISTEN) || > - (Tcb->State == TCP_SYN_SENT) || > - (Tcb->State == TCP_SYN_RCVD) || > - (Tcb->State == TCP_CLOSED)) > - ); > - > - if (Tcb->LocalEnd.Port == 0) { > - return -1; > - } > - > - Head = &mTcpRunQue; > - > - if (Tcb->State == TCP_LISTEN) { > - Head = &mTcpListenQue; > - } > - > - // > - // Check that Tcb isn't already on the list. > - // > - NET_LIST_FOR_EACH (Entry, Head) { > - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > - > - if (TCP_PEER_EQUAL (&Tcb->LocalEnd, &Node->LocalEnd) && > - TCP_PEER_EQUAL (&Tcb->RemoteEnd, &Node->RemoteEnd)) { > - > - return -1; > - } > - } > - > - InsertHeadList (Head, &Tcb->List); > - > - return 0; > -} > - > - > -/** > - Clone a TCB_CB from Tcb. > - > - @param Tcb Pointer to the TCP_CB to be cloned. > - > - @return Pointer to the new cloned TCP_CB, if NULL error condition > occurred. > - > -**/ > -TCP_CB * > -TcpCloneTcb ( > - IN TCP_CB *Tcb > - ) > -{ > - TCP_CB *Clone; > - > - Clone = AllocatePool (sizeof (TCP_CB)); > - > - if (Clone == NULL) { > - return NULL; > - > - } > - > - CopyMem (Clone, Tcb, sizeof (TCP_CB)); > - > - // > - // Increate the reference count of the shared IpInfo. > - // > - NET_GET_REF (Tcb->IpInfo); > - > - InitializeListHead (&Clone->List); > - InitializeListHead (&Clone->SndQue); > - InitializeListHead (&Clone->RcvQue); > - > - Clone->Sk = SockClone (Tcb->Sk); > - if (Clone->Sk == NULL) { > - DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n")); > - FreePool (Clone); > - return NULL; > - } > - > - ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone; > - > - return Clone; > -} > - > - > -/** > - Compute an ISS to be used by a new connection. > - > - @return The result ISS. > - > -**/ > -TCP_SEQNO > -TcpGetIss ( > - VOID > - ) > -{ > - mTcpGlobalIss += 2048; > - return mTcpGlobalIss; > -} > - > - > -/** > - Get the local mss. > - > - @param Sock Pointer to the socket to get mss > - > - @return The mss size. > - > -**/ > -UINT16 > -TcpGetRcvMss ( > - IN SOCKET *Sock > - ) > -{ > - EFI_IP4_MODE_DATA Ip4Mode; > - TCP4_PROTO_DATA *TcpProto; > - EFI_IP4_PROTOCOL *Ip; > - > - ASSERT (Sock != NULL); > - > - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > - Ip = TcpProto->TcpService->IpIo->Ip.Ip4; > - ASSERT (Ip != NULL); > - > - Ip->GetModeData (Ip, &Ip4Mode, NULL, NULL); > - > - return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD)); > -} > - > - > -/** > - Set the Tcb's state. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param State The state to be set. > - > -**/ > -VOID > -TcpSetState ( > - IN OUT TCP_CB *Tcb, > - IN UINT8 State > - ) > -{ > - ASSERT (Tcb->State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); > - ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); > - > - DEBUG ( > - (EFI_D_NET, > - "Tcb (%p) state %s --> %s\n", > - Tcb, > - mTcpStateName[Tcb->State], > - mTcpStateName[State]) > - ); > - > - Tcb->State = State; > - > - switch (State) { > - case TCP_ESTABLISHED: > - > - SockConnEstablished (Tcb->Sk); > - > - if (Tcb->Parent != NULL) { > - // > - // A new connection is accepted by a listening socket, install > - // the device path. > - // > - TcpInstallDevicePath (Tcb->Sk); > - } > - > - break; > - > - case TCP_CLOSED: > - > - SockConnClosed (Tcb->Sk); > - > - break; > - default: > - break; > - } > -} > - > - > -/** > - Compute the TCP segment's checksum. > - > - @param Nbuf Pointer to the buffer that contains the TCP > - segment. > - @param HeadSum The checksum value of the fixed part of pseudo > - header. > - > - @return The checksum value. > - > -**/ > -UINT16 > -TcpChecksum ( > - IN NET_BUF *Nbuf, > - IN UINT16 HeadSum > - ) > -{ > - UINT16 Checksum; > - > - Checksum = NetbufChecksum (Nbuf); > - Checksum = NetAddChecksum (Checksum, HeadSum); > - > - Checksum = NetAddChecksum ( > - Checksum, > - HTONS ((UINT16) Nbuf->TotalSize) > - ); > - > - return (UINT16) ~Checksum; > -} > - > -/** > - Translate the information from the head of the received TCP > - segment Nbuf contains and fill it into a TCP_SEG structure. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer contains the TCP segment. > - > - @return Pointer to the TCP_SEG that contains the translated TCP head > information. > - > -**/ > -TCP_SEG * > -TcpFormatNetbuf ( > - IN TCP_CB *Tcb, > - IN OUT NET_BUF *Nbuf > - ) > -{ > - TCP_SEG *Seg; > - TCP_HEAD *Head; > - > - Seg = TCPSEG_NETBUF (Nbuf); > - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); > - ASSERT (Head != NULL); > - Nbuf->Tcp = Head; > - > - Seg->Seq = NTOHL (Head->Seq); > - Seg->Ack = NTOHL (Head->Ack); > - Seg->End = Seg->Seq + (Nbuf->TotalSize - (Head->HeadLen << 2)); > - > - Seg->Urg = NTOHS (Head->Urg); > - Seg->Wnd = (NTOHS (Head->Wnd) << Tcb->SndWndScale); > - Seg->Flag = Head->Flag; > - > - // > - // SYN and FIN flag occupy one sequence space each. > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > - // > - // RFC requires that initial window not be scaled > - // > - Seg->Wnd = NTOHS (Head->Wnd); > - Seg->End++; > - } > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > - Seg->End++; > - } > - > - return Seg; > -} > - > - > -/** > - Reset the connection related with Tcb. > - > - @param Tcb Pointer to the TCP_CB of the connection to be > - reset. > - > -**/ > -VOID > -TcpResetConnection ( > - IN TCP_CB *Tcb > - ) > -{ > - NET_BUF *Nbuf; > - TCP_HEAD *Nhead; > - > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > - > - if (Nbuf == NULL) { > - return ; > - } > - > - Nhead = (TCP_HEAD *) NetbufAllocSpace ( > - Nbuf, > - sizeof (TCP_HEAD), > - NET_BUF_TAIL > - ); > - > - ASSERT (Nhead != NULL); > - > - Nbuf->Tcp = Nhead; > - > - Nhead->Flag = TCP_FLG_RST; > - Nhead->Seq = HTONL (Tcb->SndNxt); > - Nhead->Ack = HTONL (Tcb->RcvNxt); > - Nhead->SrcPort = Tcb->LocalEnd.Port; > - Nhead->DstPort = Tcb->RemoteEnd.Port; > - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); > - Nhead->Res = 0; > - Nhead->Wnd = HTONS (0xFFFF); > - Nhead->Checksum = 0; > - Nhead->Urg = 0; > - Nhead->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); > - > - TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip); > - > - NetbufFree (Nbuf); > -} > - > - > -/** > - Initialize an active connection. > - > - @param Tcb Pointer to the TCP_CB that wants to initiate a > - connection. > - > -**/ > -VOID > -TcpOnAppConnect ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - TcpInitTcbLocal (Tcb); > - TcpSetState (Tcb, TCP_SYN_SENT); > - > - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); > - TcpToSendData (Tcb, 1); > -} > - > - > -/** > - Initiate the connection close procedure, called when > - applications want to close the connection. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpOnAppClose ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - ASSERT (Tcb != NULL); > - > - if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk) != 0) { > - > - DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset " > - "because data is lost for TCB %p\n", Tcb)); > - > - TcpResetConnection (Tcb); > - TcpClose (Tcb); > - return; > - } > - > - switch (Tcb->State) { > - case TCP_CLOSED: > - case TCP_LISTEN: > - case TCP_SYN_SENT: > - TcpSetState (Tcb, TCP_CLOSED); > - break; > - > - case TCP_SYN_RCVD: > - case TCP_ESTABLISHED: > - TcpSetState (Tcb, TCP_FIN_WAIT_1); > - break; > - > - case TCP_CLOSE_WAIT: > - TcpSetState (Tcb, TCP_LAST_ACK); > - break; > - default: > - break; > - } > - > - TcpToSendData (Tcb, 1); > -} > - > - > -/** > - Check whether the application's newly delivered data can be sent out. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @retval 0 Whether the data is sent out or is buffered for > - further sending. > - @retval -1 The Tcb is not in a state that data is permitted to > - be sent out. > - > -**/ > -INTN > -TcpOnAppSend ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - > - switch (Tcb->State) { > - case TCP_CLOSED: > - return -1; > - > - case TCP_LISTEN: > - return -1; > - > - case TCP_SYN_SENT: > - case TCP_SYN_RCVD: > - return 0; > - > - case TCP_ESTABLISHED: > - case TCP_CLOSE_WAIT: > - TcpToSendData (Tcb, 0); > - return 0; > - > - case TCP_FIN_WAIT_1: > - case TCP_FIN_WAIT_2: > - case TCP_CLOSING: > - case TCP_LAST_ACK: > - case TCP_TIME_WAIT: > - return -1; > - > - default: > - break; > - } > - > - return 0; > -} > - > - > -/** > - Application has consumed some data, check whether > - to send a window updata ack or a delayed ack. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpOnAppConsume ( > - IN TCP_CB *Tcb > - ) > -{ > - UINT32 TcpOld; > - > - switch (Tcb->State) { > - case TCP_CLOSED: > - return; > - > - case TCP_LISTEN: > - return; > - > - case TCP_SYN_SENT: > - case TCP_SYN_RCVD: > - return; > - > - case TCP_ESTABLISHED: > - TcpOld = TcpRcvWinOld (Tcb); > - if (TcpRcvWinNow (Tcb) > TcpOld) { > - > - if (TcpOld < Tcb->RcvMss) { > - > - DEBUG ((EFI_D_NET, "TcpOnAppConsume: send a window" > - " update for a window closed Tcb %p\n", Tcb)); > - > - TcpSendAck (Tcb); > - } else if (Tcb->DelayedAck == 0) { > - > - DEBUG ((EFI_D_NET, "TcpOnAppConsume: scheduled a delayed" > - " ACK to update window for Tcb %p\n", Tcb)); > - > - Tcb->DelayedAck = 1; > - } > - } > - > - break; > - > - case TCP_CLOSE_WAIT: > - return; > - > - case TCP_FIN_WAIT_1: > - case TCP_FIN_WAIT_2: > - case TCP_CLOSING: > - case TCP_LAST_ACK: > - case TCP_TIME_WAIT: > - return; > - > - default: > - break; > - } > -} > - > - > -/** > - Abort the connection by sending a reset segment, called > - when the application wants to abort the connection. > - > - @param Tcb Pointer to the TCP_CB of the TCP instance. > - > -**/ > -VOID > -TcpOnAppAbort ( > - IN TCP_CB *Tcb > - ) > -{ > - DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset " > - "issued by application for TCB %p\n", Tcb)); > - > - switch (Tcb->State) { > - case TCP_SYN_RCVD: > - case TCP_ESTABLISHED: > - case TCP_FIN_WAIT_1: > - case TCP_FIN_WAIT_2: > - case TCP_CLOSE_WAIT: > - TcpResetConnection (Tcb); > - break; > - default: > - break; > - } > - > - TcpSetState (Tcb, TCP_CLOSED); > -} > - > -/** > - Install the device path protocol on the TCP instance. > - > - @param Sock Pointer to the socket representing the TCP instance. > - > - @retval EFI_SUCCESS The device path protocol is installed. > - @retval other Failed to install the device path protocol. > - > -**/ > -EFI_STATUS > -TcpInstallDevicePath ( > - IN SOCKET *Sock > - ) > -{ > - TCP4_PROTO_DATA *TcpProto; > - TCP4_SERVICE_DATA *TcpService; > - TCP_CB *Tcb; > - IPv4_DEVICE_PATH Ip4DPathNode; > - EFI_STATUS Status; > - TCP_PORTNO LocalPort; > - TCP_PORTNO RemotePort; > - > - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > - TcpService = TcpProto->TcpService; > - Tcb = TcpProto->TcpPcb; > - > - LocalPort = NTOHS (Tcb->LocalEnd.Port); > - RemotePort = NTOHS (Tcb->RemoteEnd.Port); > - NetLibCreateIPv4DPathNode ( > - &Ip4DPathNode, > - TcpService->ControllerHandle, > - Tcb->LocalEnd.Ip, > - LocalPort, > - Tcb->RemoteEnd.Ip, > - RemotePort, > - EFI_IP_PROTO_TCP, > - Tcb->UseDefaultAddr > - ); > - > - IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask); > - > - Sock->DevicePath = AppendDevicePathNode ( > - Sock->ParentDevicePath, > - (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode > - ); > - if (Sock->DevicePath == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Status = gBS->InstallProtocolInterface ( > - &Sock->SockHandle, > - &gEfiDevicePathProtocolGuid, > - EFI_NATIVE_INTERFACE, > - Sock->DevicePath > - ); > - if (EFI_ERROR (Status)) { > - FreePool (Sock->DevicePath); > - } > - > - return Status; > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > deleted file mode 100644 > index e84310f6c693..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > +++ /dev/null > @@ -1,352 +0,0 @@ > -/** @file > - Routines to process TCP option. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Tcp4Main.h" > - > -/** > - Get a UINT16 value from buffer. > - > - @param Buf Pointer to input buffer. > - > - @return The UINT16 value get from buffer. > - > -**/ > -UINT16 > -TcpGetUint16 ( > - IN UINT8 *Buf > - ) > -{ > - UINT16 Value; > - CopyMem (&Value, Buf, sizeof (UINT16)); > - return NTOHS (Value); > -} > - > -/** > - Get a UINT32 value from buffer. > - > - @param Buf Pointer to input buffer. > - > - @return The UINT32 value get from buffer. > - > -**/ > -UINT32 > -TcpGetUint32 ( > - IN UINT8 *Buf > - ) > -{ > - UINT32 Value; > - CopyMem (&Value, Buf, sizeof (UINT32)); > - return NTOHL (Value); > -} > - > -/** > - Put a UINT32 value in buffer. > - > - @param Buf Pointer to the buffer. > - @param Data The UINT32 Date to put in buffer > - > -**/ > -VOID > -TcpPutUint32 ( > - OUT UINT8 *Buf, > - IN UINT32 Data > - ) > -{ > - Data = HTONL (Data); > - CopyMem (Buf, &Data, sizeof (UINT32)); > -} > - > - > -/** > - Compute the window scale value according to the given buffer size. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The scale value. > - > -**/ > -UINT8 > -TcpComputeScale ( > - IN TCP_CB *Tcb > - ) > -{ > - UINT8 Scale; > - UINT32 BufSize; > - > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > - > - BufSize = GET_RCV_BUFFSIZE (Tcb->Sk); > - > - Scale = 0; > - while ((Scale < TCP_OPTION_MAX_WS) && > - ((UINT32) (TCP_OPTION_MAX_WIN << Scale) < BufSize)) { > - > - Scale++; > - } > - > - return Scale; > -} > - > - > -/** > - Build the TCP option in three-way handshake. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer to store the options. > - > - @return The total length of the TCP option field. > - > -**/ > -UINT16 > -TcpSynBuildOption ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ) > -{ > - UINT8 *Data; > - UINT16 Len; > - > - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); > - > - Len = 0; > - > - // > - // Add timestamp option if not disabled by application > - // and it is the first SYN segment or the peer has sent > - // us its timestamp. > - // > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS) && > - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS))) { > - > - Data = NetbufAllocSpace ( > - Nbuf, > - TCP_OPTION_TS_ALIGNED_LEN, > - NET_BUF_HEAD > - ); > - > - ASSERT (Data != NULL); > - Len += TCP_OPTION_TS_ALIGNED_LEN; > - > - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); > - TcpPutUint32 (Data + 4, mTcpTick); > - TcpPutUint32 (Data + 8, 0); > - } > - > - // > - // Build window scale option, only when are configured > - // to send WS option, and either we are doing active > - // open or we have received WS option from peer. > - // > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS) && > - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS))) { > - > - Data = NetbufAllocSpace ( > - Nbuf, > - TCP_OPTION_WS_ALIGNED_LEN, > - NET_BUF_HEAD > - ); > - > - ASSERT (Data != NULL); > - > - Len += TCP_OPTION_WS_ALIGNED_LEN; > - TcpPutUint32 (Data, TCP_OPTION_WS_FAST | TcpComputeScale (Tcb)); > - } > - > - // > - // Build MSS option > - // > - Data = NetbufAllocSpace (Nbuf, TCP_OPTION_MSS_LEN, 1); > - ASSERT (Data != NULL); > - > - Len += TCP_OPTION_MSS_LEN; > - TcpPutUint32 (Data, TCP_OPTION_MSS_FAST | Tcb->RcvMss); > - > - return Len; > -} > - > - > -/** > - Build the TCP option in synchronized states. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer to store the options. > - > - @return The total length of the TCP option field. > - > -**/ > -UINT16 > -TcpBuildOption ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ) > -{ > - UINT8 *Data; > - UINT16 Len; > - > - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); > - Len = 0; > - > - // > - // Build Timestamp option > - // > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_TS) && > - !TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_RST)) { > - > - Data = NetbufAllocSpace ( > - Nbuf, > - TCP_OPTION_TS_ALIGNED_LEN, > - NET_BUF_HEAD > - ); > - > - ASSERT (Data != NULL); > - Len += TCP_OPTION_TS_ALIGNED_LEN; > - > - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); > - TcpPutUint32 (Data + 4, mTcpTick); > - TcpPutUint32 (Data + 8, Tcb->TsRecent); > - } > - > - return Len; > -} > - > - > -/** > - Parse the supported options. > - > - @param Tcp Pointer to the TCP_CB of this TCP instance. > - @param Option Pointer to the TCP_OPTION used to store the successfully > pasrsed > - options. > - > - @retval 0 The options are successfully pasrsed. > - @retval -1 Ilegal option was found. > - > -**/ > -INTN > -TcpParseOption ( > - IN TCP_HEAD *Tcp, > - IN OUT TCP_OPTION *Option > - ) > -{ > - UINT8 *Head; > - UINT8 TotalLen; > - UINT8 Cur; > - UINT8 Type; > - UINT8 Len; > - > - ASSERT ((Tcp != NULL) && (Option != NULL)); > - > - Option->Flag = 0; > - > - TotalLen = (UINT8) ((Tcp->HeadLen << 2) - sizeof (TCP_HEAD)); > - if (TotalLen <= 0) { > - return 0; > - } > - > - Head = (UINT8 *) (Tcp + 1); > - > - // > - // Fast process of timestamp option > - // > - if ((TotalLen == TCP_OPTION_TS_ALIGNED_LEN) && > - (TcpGetUint32 (Head) == TCP_OPTION_TS_FAST)) { > - > - Option->TSVal = TcpGetUint32 (Head + 4); > - Option->TSEcr = TcpGetUint32 (Head + 8); > - Option->Flag = TCP_OPTION_RCVD_TS; > - > - return 0; > - } > - > - // > - // Slow path to process the options. > - // > - Cur = 0; > - > - while (Cur < TotalLen) { > - Type = Head[Cur]; > - > - switch (Type) { > - case TCP_OPTION_MSS: > - Len = Head[Cur + 1]; > - > - if ((Len != TCP_OPTION_MSS_LEN) || > - (TotalLen - Cur < TCP_OPTION_MSS_LEN)) { > - > - return -1; > - } > - > - Option->Mss = TcpGetUint16 (&Head[Cur + 2]); > - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_MSS); > - > - Cur += TCP_OPTION_MSS_LEN; > - break; > - > - case TCP_OPTION_WS: > - Len = Head[Cur + 1]; > - > - if ((Len != TCP_OPTION_WS_LEN) || > - (TotalLen - Cur < TCP_OPTION_WS_LEN)) { > - > - return -1; > - } > - > - Option->WndScale = (UINT8) MIN (14, Head[Cur + 2]); > - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_WS); > - > - Cur += TCP_OPTION_WS_LEN; > - break; > - > - case TCP_OPTION_TS: > - Len = Head[Cur + 1]; > - > - if ((Len != TCP_OPTION_TS_LEN) || > - (TotalLen - Cur < TCP_OPTION_TS_LEN)) { > - > - return -1; > - } > - > - Option->TSVal = TcpGetUint32 (&Head[Cur + 2]); > - Option->TSEcr = TcpGetUint32 (&Head[Cur + 6]); > - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_TS); > - > - Cur += TCP_OPTION_TS_LEN; > - break; > - > - case TCP_OPTION_NOP: > - Cur++; > - break; > - > - case TCP_OPTION_EOP: > - Cur = TotalLen; > - break; > - > - default: > - Len = Head[Cur + 1]; > - > - if ((TotalLen - Cur) < Len || Len < 2) { > - return -1; > - } > - > - Cur = (UINT8) (Cur + Len); > - break; > - } > - > - } > - > - return 0; > -} > - > - > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > deleted file mode 100644 > index 760b09a1eda1..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > +++ /dev/null > @@ -1,1238 +0,0 @@ > -/** @file > - TCP output process routines. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Tcp4Main.h" > - > -UINT8 mTcpOutFlag[] = { > - 0, // TCP_CLOSED > - 0, // TCP_LISTEN > - TCP_FLG_SYN, // TCP_SYN_SENT > - TCP_FLG_SYN | TCP_FLG_ACK, // TCP_SYN_RCVD > - TCP_FLG_ACK, // TCP_ESTABLISHED > - TCP_FLG_FIN | TCP_FLG_ACK, // TCP_FIN_WAIT_1 > - TCP_FLG_ACK, // TCP_FIN_WAIT_2 > - TCP_FLG_ACK | TCP_FLG_FIN, // TCP_CLOSING > - TCP_FLG_ACK, // TCP_TIME_WAIT > - TCP_FLG_ACK, // TCP_CLOSE_WAIT > - TCP_FLG_FIN | TCP_FLG_ACK // TCP_LAST_ACK > -}; > - > - > -/** > - Compute the sequence space left in the old receive window. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The sequence space left in the old receive window. > - > -**/ > -UINT32 > -TcpRcvWinOld ( > - IN TCP_CB *Tcb > - ) > -{ > - UINT32 OldWin; > - > - OldWin = 0; > - > - if (TCP_SEQ_GT (Tcb->RcvWl2 + Tcb->RcvWnd, Tcb->RcvNxt)) { > - > - OldWin = TCP_SUB_SEQ ( > - Tcb->RcvWl2 + Tcb->RcvWnd, > - Tcb->RcvNxt > - ); > - } > - > - return OldWin; > -} > - > - > -/** > - Compute the current receive window. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The size of the current receive window, in bytes. > - > -**/ > -UINT32 > -TcpRcvWinNow ( > - IN TCP_CB *Tcb > - ) > -{ > - SOCKET *Sk; > - UINT32 Win; > - UINT32 Increase; > - UINT32 OldWin; > - > - Sk = Tcb->Sk; > - ASSERT (Sk != NULL); > - > - OldWin = TcpRcvWinOld (Tcb); > - > - Win = SockGetFreeSpace (Sk, SOCK_RCV_BUF); > - > - Increase = 0; > - if (Win > OldWin) { > - Increase = Win - OldWin; > - } > - > - // > - // Receiver's SWS: don't advertise a bigger window > - // unless it can be increased by at least one Mss or > - // half of the receive buffer. > - // > - if ((Increase > Tcb->SndMss) || > - (2 * Increase >= GET_RCV_BUFFSIZE (Sk))) { > - > - return Win; > - } > - > - return OldWin; > -} > - > - > -/** > - Compute the value to fill in the window size field of the outgoing segment. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Syn The flag to indicate whether the outgoing segment is a SYN > - segment. > - > - @return The value of the local receive window size used to fill the outing > segment. > - > -**/ > -UINT16 > -TcpComputeWnd ( > - IN OUT TCP_CB *Tcb, > - IN BOOLEAN Syn > - ) > -{ > - UINT32 Wnd; > - > - // > - // RFC requires that initial window not be scaled > - // > - if (Syn) { > - > - Wnd = GET_RCV_BUFFSIZE (Tcb->Sk); > - } else { > - > - Wnd = TcpRcvWinNow (Tcb); > - > - Tcb->RcvWnd = Wnd; > - } > - > - Wnd = MIN (Wnd >> Tcb->RcvWndScale, 0xffff); > - return NTOHS ((UINT16) Wnd); > -} > - > - > -/** > - Get the maximum SndNxt. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The sequence number of the maximum SndNxt. > - > -**/ > -TCP_SEQNO > -TcpGetMaxSndNxt ( > - IN TCP_CB *Tcb > - ) > -{ > - LIST_ENTRY *Entry; > - NET_BUF *Nbuf; > - > - if (IsListEmpty (&Tcb->SndQue)) { > - return Tcb->SndNxt; > - } > - > - Entry = Tcb->SndQue.BackLink; > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > - > - ASSERT (TCP_SEQ_GEQ (TCPSEG_NETBUF (Nbuf)->End, Tcb->SndNxt)); > - return TCPSEG_NETBUF (Nbuf)->End; > -} > - > - > -/** > - Compute how much data to send. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Force Whether to ignore the sender's SWS avoidance algorithm > and send > - out data by force. > - > - @return The length of the data can be sent, if 0, no data can be sent. > - > -**/ > -UINT32 > -TcpDataToSend ( > - IN TCP_CB *Tcb, > - IN INTN Force > - ) > -{ > - SOCKET *Sk; > - UINT32 Win; > - UINT32 Len; > - UINT32 Left; > - UINT32 Limit; > - > - Sk = Tcb->Sk; > - ASSERT (Sk != NULL); > - > - // > - // TCP should NOT send data beyond the send window > - // and congestion window. The right edge of send > - // window is defined as SND.WL2 + SND.WND. The right > - // edge of congestion window is defined as SND.UNA + > - // CWND. > - // > - Win = 0; > - Limit = Tcb->SndWl2 + Tcb->SndWnd; > - > - if (TCP_SEQ_GT (Limit, Tcb->SndUna + Tcb->CWnd)) { > - > - Limit = Tcb->SndUna + Tcb->CWnd; > - } > - > - if (TCP_SEQ_GT (Limit, Tcb->SndNxt)) { > - Win = TCP_SUB_SEQ (Limit, Tcb->SndNxt); > - } > - > - // > - // The data to send contains two parts: the data on the > - // socket send queue, and the data on the TCB's send > - // buffer. The later can be non-zero if the peer shrinks > - // its advertised window. > - // > - Left = GET_SND_DATASIZE (Sk) + > - TCP_SUB_SEQ (TcpGetMaxSndNxt (Tcb), Tcb->SndNxt); > - > - Len = MIN (Win, Left); > - > - if (Len > Tcb->SndMss) { > - Len = Tcb->SndMss; > - } > - > - if ((Force != 0)|| (Len == 0 && Left == 0)) { > - return Len; > - } > - > - if (Len == 0 && Left != 0) { > - goto SetPersistTimer; > - } > - > - // > - // Sender's SWS avoidance: Don't send a small segment unless > - // a)A full-sized segment can be sent, > - // b)at least one-half of the maximum sized windows that > - // the other end has ever advertised. > - // c)It can send everything it has and either it isn't > - // expecting an ACK or the Nagle algorithm is disabled. > - // > - if ((Len == Tcb->SndMss) || (2 * Len >= Tcb->SndWndMax)) { > - > - return Len; > - } > - > - if ((Len == Left) && > - ((Tcb->SndNxt == Tcb->SndUna) || > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE))) { > - > - return Len; > - } > - > - // > - // RFC1122 suggests to set a timer when SWSA forbids TCP > - // sending more data, and combine it with probe timer. > - // > -SetPersistTimer: > - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { > - > - DEBUG ( > - (EFI_D_WARN, > - "TcpDataToSend: enter persistent state for TCB %p\n", > - Tcb) > - ); > - > - if (!Tcb->ProbeTimerOn) { > - TcpSetProbeTimer (Tcb); > - } > - } > - > - return 0; > -} > - > - > -/** > - Build the TCP header of the TCP segment and transmit the segment by IP. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer containing the segment to be sent > out. > - > - @retval 0 The segment is sent out successfully. > - @retval other Error condition occurred. > - > -**/ > -INTN > -TcpTransmitSegment ( > - IN OUT TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ) > -{ > - UINT16 Len; > - TCP_HEAD *Head; > - TCP_SEG *Seg; > - BOOLEAN Syn; > - UINT32 DataLen; > - > - ASSERT ((Nbuf != NULL) && (Nbuf->Tcp == NULL) && (TcpVerifySegment > (Nbuf) != 0)); > - > - DataLen = Nbuf->TotalSize; > - > - Seg = TCPSEG_NETBUF (Nbuf); > - Syn = TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN); > - > - if (Syn) { > - > - Len = TcpSynBuildOption (Tcb, Nbuf); > - } else { > - > - Len = TcpBuildOption (Tcb, Nbuf); > - } > - > - ASSERT ((Len % 4 == 0) && (Len <= 40)); > - > - Len += sizeof (TCP_HEAD); > - > - Head = (TCP_HEAD *) NetbufAllocSpace ( > - Nbuf, > - sizeof (TCP_HEAD), > - NET_BUF_HEAD > - ); > - > - ASSERT (Head != NULL); > - > - Nbuf->Tcp = Head; > - > - Head->SrcPort = Tcb->LocalEnd.Port; > - Head->DstPort = Tcb->RemoteEnd.Port; > - Head->Seq = NTOHL (Seg->Seq); > - Head->Ack = NTOHL (Tcb->RcvNxt); > - Head->HeadLen = (UINT8) (Len >> 2); > - Head->Res = 0; > - Head->Wnd = TcpComputeWnd (Tcb, Syn); > - Head->Checksum = 0; > - > - // > - // Check whether to set the PSH flag. > - // > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_PSH); > - > - if (DataLen != 0) { > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_PSH) && > - TCP_SEQ_BETWEEN (Seg->Seq, Tcb->SndPsh, Seg->End)) { > - > - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); > - > - } else if ((Seg->End == Tcb->SndNxt) && > - (GET_SND_DATASIZE (Tcb->Sk) == 0)) { > - > - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); > - } > - } > - > - // > - // Check whether to set the URG flag and the urgent pointer. > - // > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); > - > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && > - TCP_SEQ_LEQ (Seg->Seq, Tcb->SndUp)) { > - > - TCP_SET_FLG (Seg->Flag, TCP_FLG_URG); > - > - if (TCP_SEQ_LT (Tcb->SndUp, Seg->End)) { > - > - Seg->Urg = (UINT16) TCP_SUB_SEQ (Tcb->SndUp, Seg->Seq); > - } else { > - > - Seg->Urg = (UINT16) MIN ( > - TCP_SUB_SEQ (Tcb->SndUp, > - Seg->Seq), > - 0xffff > - ); > - } > - } > - > - Head->Flag = Seg->Flag; > - Head->Urg = NTOHS (Seg->Urg); > - Head->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); > - > - // > - // update the TCP session's control information > - // > - Tcb->RcvWl2 = Tcb->RcvNxt; > - if (Syn) { > - Tcb->RcvWnd = NTOHS (Head->Wnd); > - } > - > - // > - // clear delayedack flag > - // > - Tcb->DelayedAck = 0; > - > - return TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip); > -} > - > - > -/** > - Get a segment from the Tcb's SndQue. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment. > - @param Len The maximum length of the segment. > - > - @return Pointer to the segment, if NULL some error occurred. > - > -**/ > -NET_BUF * > -TcpGetSegmentSndQue ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq, > - IN UINT32 Len > - ) > -{ > - LIST_ENTRY *Head; > - LIST_ENTRY *Cur; > - NET_BUF *Node; > - TCP_SEG *Seg; > - NET_BUF *Nbuf; > - TCP_SEQNO End; > - UINT8 *Data; > - UINT8 Flag; > - INT32 Offset; > - INT32 CopyLen; > - > - ASSERT ((Tcb != NULL) && TCP_SEQ_LEQ (Seq, Tcb->SndNxt) && (Len > 0)); > - > - // > - // Find the segment that contains the Seq. > - // > - Head = &Tcb->SndQue; > - > - Node = NULL; > - Seg = NULL; > - > - NET_LIST_FOR_EACH (Cur, Head) { > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > - Seg = TCPSEG_NETBUF (Node); > - > - if (TCP_SEQ_LT (Seq, Seg->End) && TCP_SEQ_LEQ (Seg->Seq, Seq)) { > - > - break; > - } > - } > - > - ASSERT (Cur != Head); > - ASSERT (Node != NULL); > - ASSERT (Seg != NULL); > - > - // > - // Return the buffer if it can be returned without > - // adjustment: > - // > - if ((Seg->Seq == Seq) && > - TCP_SEQ_LEQ (Seg->End, Seg->Seq + Len) && > - !NET_BUF_SHARED (Node)) { > - > - NET_GET_REF (Node); > - return Node; > - } > - > - // > - // Create a new buffer and copy data there. > - // > - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); > - > - if (Nbuf == NULL) { > - return NULL; > - } > - > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > - > - Flag = Seg->Flag; > - End = Seg->End; > - > - if (TCP_SEQ_LT (Seq + Len, Seg->End)) { > - End = Seq + Len; > - } > - > - CopyLen = TCP_SUB_SEQ (End, Seq); > - Offset = TCP_SUB_SEQ (Seq, Seg->Seq); > - > - // > - // If SYN is set and out of the range, clear the flag. > - // Because the sequence of the first byte is SEG.SEQ+1, > - // adjust Offset by -1. If SYN is in the range, copy > - // one byte less. > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > - > - if (TCP_SEQ_LT (Seg->Seq, Seq)) { > - > - TCP_CLEAR_FLG (Flag, TCP_FLG_SYN); > - Offset--; > - } else { > - > - CopyLen--; > - } > - } > - > - // > - // If FIN is set and in the range, copy one byte less, > - // and if it is out of the range, clear the flag. > - // > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > - > - if (Seg->End == End) { > - > - CopyLen--; > - } else { > - > - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); > - } > - } > - > - ASSERT (CopyLen >= 0); > - > - // > - // copy data to the segment > - // > - if (CopyLen != 0) { > - Data = NetbufAllocSpace (Nbuf, CopyLen, NET_BUF_TAIL); > - ASSERT (Data != NULL); > - > - if ((INT32) NetbufCopy (Node, Offset, CopyLen, Data) != CopyLen) { > - goto OnError; > - } > - } > - > - CopyMem (TCPSEG_NETBUF (Nbuf), Seg, sizeof (TCP_SEG)); > - > - TCPSEG_NETBUF (Nbuf)->Seq = Seq; > - TCPSEG_NETBUF (Nbuf)->End = End; > - TCPSEG_NETBUF (Nbuf)->Flag = Flag; > - > - return Nbuf; > - > -OnError: > - NetbufFree (Nbuf); > - return NULL; > -} > - > - > -/** > - Get a segment from the Tcb's socket buffer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment. > - @param Len The maximum length of the segment. > - > - @return Pointer to the segment, if NULL some error occurred. > - > -**/ > -NET_BUF * > -TcpGetSegmentSock ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq, > - IN UINT32 Len > - ) > -{ > - NET_BUF *Nbuf; > - UINT8 *Data; > - UINT32 DataGet; > - > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > - > - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); > - > - if (Nbuf == NULL) { > - DEBUG ((EFI_D_ERROR, "TcpGetSegmentSock: failed to allocate " > - "a netbuf for TCB %p\n",Tcb)); > - > - return NULL; > - } > - > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > - > - DataGet = 0; > - > - if (Len != 0) { > - // > - // copy data to the segment. > - // > - Data = NetbufAllocSpace (Nbuf, Len, NET_BUF_TAIL); > - ASSERT (Data != NULL); > - > - DataGet = SockGetDataToSend (Tcb->Sk, 0, Len, Data); > - } > - > - NET_GET_REF (Nbuf); > - > - TCPSEG_NETBUF (Nbuf)->Seq = Seq; > - TCPSEG_NETBUF (Nbuf)->End = Seq + Len; > - > - InsertTailList (&(Tcb->SndQue), &(Nbuf->List)); > - > - if (DataGet != 0) { > - > - SockDataSent (Tcb->Sk, DataGet); > - } > - > - return Nbuf; > -} > - > - > -/** > - Get a segment starting from sequence Seq of a maximum > - length of Len. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment. > - @param Len The maximum length of the segment. > - > - @return Pointer to the segment, if NULL some error occurred. > - > -**/ > -NET_BUF * > -TcpGetSegment ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq, > - IN UINT32 Len > - ) > -{ > - NET_BUF *Nbuf; > - > - ASSERT (Tcb != NULL); > - > - // > - // Compare the SndNxt with the max sequence number sent. > - // > - if ((Len != 0) && TCP_SEQ_LT (Seq, TcpGetMaxSndNxt (Tcb))) { > - > - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); > - } else { > - > - Nbuf = TcpGetSegmentSock (Tcb, Seq, Len); > - } > - > - ASSERT (TcpVerifySegment (Nbuf) != 0); > - return Nbuf; > -} > - > - > -/** > - Retransmit the segment from sequence Seq. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment to be retransmitted. > - > - @retval 0 Retransmission succeeded. > - @retval -1 Error condition occurred. > - > -**/ > -INTN > -TcpRetransmit ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq > - ) > -{ > - NET_BUF *Nbuf; > - UINT32 Len; > - > - // > - // Compute the maxium length of retransmission. It is > - // limited by three factors: > - // 1. Less than SndMss > - // 2. must in the current send window > - // 3. will not change the boundaries of queued segments. > - // > - > - // > - // Handle the Window Retraction if TCP window scale is enabled according > to RFC7323: > - // On first retransmission, or if the sequence number is out of > - // window by less than 2^Rcv.Wind.Shift, then do normal > - // retransmission(s) without regard to the receiver window as long > - // as the original segment was in window when it was sent. > - // > - if ((Tcb->SndWndScale != 0) && > - (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax) || TCP_SEQ_BETWEEN (Tcb- > >SndWl2 + Tcb->SndWnd, Seq, Tcb->SndWl2 + Tcb->SndWnd + (1 << Tcb- > >SndWndScale)))) { > - Len = TCP_SUB_SEQ (Tcb->SndNxt, Seq); > - DEBUG ( > - (EFI_D_WARN, > - "TcpRetransmit: retransmission without regard to the receiver window > for TCB %p\n", > - Tcb) > - ); > - > - } else if (TCP_SEQ_GEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq)) { > - Len = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq); > - > - } else { > - DEBUG ( > - (EFI_D_WARN, > - "TcpRetransmit: retransmission cancelled because send window too > small for TCB %p\n", > - Tcb) > - ); > - > - return 0; > - } > - > - Len = MIN (Len, Tcb->SndMss); > - > - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); > - if (Nbuf == NULL) { > - return -1; > - } > - > - ASSERT (TcpVerifySegment (Nbuf) != 0); > - > - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { > - goto OnError; > - } > - > - if (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax)) { > - Tcb->RetxmitSeqMax = Seq; > - } > - > - // > - // The retransmitted buffer may be on the SndQue, > - // trim TCP head because all the buffer on SndQue > - // are headless. > - // > - ASSERT (Nbuf->Tcp != NULL); > - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); > - Nbuf->Tcp = NULL; > - > - NetbufFree (Nbuf); > - return 0; > - > -OnError: > - if (Nbuf != NULL) { > - NetbufFree (Nbuf); > - } > - > - return -1; > -} > - > - > -/** > - Check whether to send data/SYN/FIN and piggy back an ACK. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Force Whether to ignore the sender's SWS avoidance algorithm > and send > - out data by force. > - > - @return The number of bytes sent. > - > -**/ > -INTN > -TcpToSendData ( > - IN OUT TCP_CB *Tcb, > - IN INTN Force > - ) > -{ > - UINT32 Len; > - INTN Sent; > - UINT8 Flag; > - NET_BUF *Nbuf; > - TCP_SEG *Seg; > - TCP_SEQNO Seq; > - TCP_SEQNO End; > - > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL) && (Tcb->State != > TCP_LISTEN)); > - > - Sent = 0; > - > - if ((Tcb->State == TCP_CLOSED) || > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT)) { > - > - return 0; > - } > - > -SEND_AGAIN: > - // > - // compute how much data can be sent > - // > - Len = TcpDataToSend (Tcb, Force); > - Seq = Tcb->SndNxt; > - > - ASSERT ((Tcb->State) < (ARRAY_SIZE (mTcpOutFlag))); > - Flag = mTcpOutFlag[Tcb->State]; > - > - if ((Flag & TCP_FLG_SYN) != 0) { > - > - Seq = Tcb->Iss; > - Len = 0; > - } > - > - // > - // only send a segment without data if SYN or > - // FIN is set. > - // > - if ((Len == 0) && > - ((Flag & (TCP_FLG_SYN | TCP_FLG_FIN)) == 0)) { > - return Sent; > - } > - > - Nbuf = TcpGetSegment (Tcb, Seq, Len); > - > - if (Nbuf == NULL) { > - DEBUG ( > - (EFI_D_ERROR, > - "TcpToSendData: failed to get a segment for TCB %p\n", > - Tcb) > - ); > - > - goto OnError; > - } > - > - Seg = TCPSEG_NETBUF (Nbuf); > - > - // > - // Set the TcpSeg in Nbuf. > - // > - Len = Nbuf->TotalSize; > - End = Seq + Len; > - if (TCP_FLG_ON (Flag, TCP_FLG_SYN)) { > - End++; > - } > - > - if ((Flag & TCP_FLG_FIN) != 0) { > - // > - // Send FIN if all data is sent, and FIN is > - // in the window > - // > - if ((TcpGetMaxSndNxt (Tcb) == Tcb->SndNxt) && > - (GET_SND_DATASIZE (Tcb->Sk) == 0) && > - TCP_SEQ_LT (End + 1, Tcb->SndWnd + Tcb->SndWl2)) { > - > - DEBUG ( > - (EFI_D_NET, > - "TcpToSendData: send FIN " > - "to peer for TCB %p in state %s\n", > - Tcb, > - mTcpStateName[Tcb->State]) > - ); > - > - End++; > - } else { > - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); > - } > - } > - > - Seg->Seq = Seq; > - Seg->End = End; > - Seg->Flag = Flag; > - > - ASSERT (TcpVerifySegment (Nbuf) != 0); > - ASSERT (TcpCheckSndQue (&Tcb->SndQue) != 0); > - > - // > - // don't send an empty segment here. > - // > - if (Seg->End == Seg->Seq) { > - DEBUG ((EFI_D_WARN, "TcpToSendData: created a empty" > - " segment for TCB %p, free it now\n", Tcb)); > - > - NetbufFree (Nbuf); > - return Sent; > - } > - > - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { > - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); > - Nbuf->Tcp = NULL; > - > - if ((Flag & TCP_FLG_FIN) != 0) { > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); > - } > - > - goto OnError; > - } > - > - Sent += TCP_SUB_SEQ (End, Seq); > - > - // > - // All the buffer in the SndQue is headless > - // > - ASSERT (Nbuf->Tcp != NULL); > - > - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); > - Nbuf->Tcp = NULL; > - > - NetbufFree (Nbuf); > - > - // > - // update status in TCB > - // > - Tcb->DelayedAck = 0; > - > - if ((Flag & TCP_FLG_FIN) != 0) { > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); > - } > - > - if (TCP_SEQ_GT (End, Tcb->SndNxt)) { > - Tcb->SndNxt = End; > - } > - > - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { > - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); > - } > - > - // > - // Enable RTT measurement only if not in retransmit. > - // Karn's algorithm reqires not to update RTT when in loss. > - // > - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && > - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > - > - DEBUG ((EFI_D_NET, "TcpToSendData: set RTT measure " > - "sequence %d for TCB %p\n", Seq, Tcb)); > - > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > - Tcb->RttSeq = Seq; > - Tcb->RttMeasure = 0; > - } > - > - if (Len == Tcb->SndMss) { > - goto SEND_AGAIN; > - } > - > - return Sent; > - > -OnError: > - if (Nbuf != NULL) { > - NetbufFree (Nbuf); > - } > - > - return Sent; > -} > - > - > -/** > - Send an ACK immediately. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpSendAck ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - NET_BUF *Nbuf; > - TCP_SEG *Seg; > - > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > - > - if (Nbuf == NULL) { > - return; > - } > - > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > - > - Seg = TCPSEG_NETBUF (Nbuf); > - Seg->Seq = Tcb->SndNxt; > - Seg->End = Tcb->SndNxt; > - Seg->Flag = TCP_FLG_ACK; > - > - if (TcpTransmitSegment (Tcb, Nbuf) == 0) { > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > - Tcb->DelayedAck = 0; > - } > - > - NetbufFree (Nbuf); > -} > - > - > -/** > - Send a zero probe segment. It can be used by keepalive and zero window > probe. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @retval 0 The zero probe segment was sent out successfully. > - @retval other Error condition occurred. > - > -**/ > -INTN > -TcpSendZeroProbe ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - NET_BUF *Nbuf; > - TCP_SEG *Seg; > - INTN Result; > - > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > - > - if (Nbuf == NULL) { > - return -1; > - } > - > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > - > - // > - // SndNxt-1 is out of window. The peer should respond > - // with an ACK. > - // > - Seg = TCPSEG_NETBUF (Nbuf); > - Seg->Seq = Tcb->SndNxt - 1; > - Seg->End = Tcb->SndNxt - 1; > - Seg->Flag = TCP_FLG_ACK; > - > - Result = TcpTransmitSegment (Tcb, Nbuf); > - NetbufFree (Nbuf); > - > - return Result; > -} > - > - > -/** > - Check whether to send an ACK or delayed ACK. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpToSendAck ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - UINT32 TcpNow; > - > - TcpNow = TcpRcvWinNow (Tcb); > - // > - // Generally, TCP should send a delayed ACK unless: > - // 1. ACK at least every other FULL sized segment received, > - // 2. Packets received out of order > - // 3. Receiving window is open > - // > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || > - (Tcb->DelayedAck >= 1) || > - (TcpNow > TcpRcvWinOld (Tcb))) { > - TcpSendAck (Tcb); > - return; > - } > - > - DEBUG ((EFI_D_NET, "TcpToSendAck: scheduled a delayed" > - " ACK for TCB %p\n", Tcb)); > - > - // > - // schedule a delayed ACK > - // > - Tcb->DelayedAck++; > -} > - > - > -/** > - Send a RESET segment in response to the segment received. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL. > - @param Head TCP header of the segment that triggers the reset. > - @param Len Length of the segment that triggers the reset. > - @param Local Local IP address. > - @param Remote Remote peer's IP address. > - > - @retval 0 A reset is sent or no need to send it. > - @retval -1 No reset is sent. > - > -**/ > -INTN > -TcpSendReset ( > - IN TCP_CB *Tcb, > - IN TCP_HEAD *Head, > - IN INT32 Len, > - IN UINT32 Local, > - IN UINT32 Remote > - ) > -{ > - NET_BUF *Nbuf; > - TCP_HEAD *Nhead; > - UINT16 HeadSum; > - > - // > - // Don't respond to a Reset with reset > - // > - if ((Head->Flag & TCP_FLG_RST) != 0) { > - return 0; > - } > - > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > - > - if (Nbuf == NULL) { > - return -1; > - } > - > - Nhead = (TCP_HEAD *) NetbufAllocSpace ( > - Nbuf, > - sizeof (TCP_HEAD), > - NET_BUF_TAIL > - ); > - > - ASSERT (Nhead != NULL); > - > - Nbuf->Tcp = Nhead; > - Nhead->Flag = TCP_FLG_RST; > - > - // > - // Derive Seq/ACK from the segment if no TCB > - // associated with it, otherwise from the Tcb > - // > - if (Tcb == NULL) { > - > - if (TCP_FLG_ON (Head->Flag, TCP_FLG_ACK)) { > - Nhead->Seq = Head->Ack; > - Nhead->Ack = 0; > - } else { > - Nhead->Seq = 0; > - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); > - Nhead->Ack = HTONL (NTOHL (Head->Seq) + Len); > - } > - } else { > - > - Nhead->Seq = HTONL (Tcb->SndNxt); > - Nhead->Ack = HTONL (Tcb->RcvNxt); > - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); > - } > - > - Nhead->SrcPort = Head->DstPort; > - Nhead->DstPort = Head->SrcPort; > - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); > - Nhead->Res = 0; > - Nhead->Wnd = HTONS (0xFFFF); > - Nhead->Checksum = 0; > - Nhead->Urg = 0; > - > - HeadSum = NetPseudoHeadChecksum (Local, Remote, 6, 0); > - Nhead->Checksum = TcpChecksum (Nbuf, HeadSum); > - > - TcpSendIpPacket (Tcb, Nbuf, Local, Remote); > - > - NetbufFree (Nbuf); > - return 0; > -} > - > - > -/** > - Verify that the segment is in good shape. > - > - @param Nbuf Buffer that contains the segment to be checked. > - > - @retval 0 The segment is broken. > - @retval 1 The segment is in good shape. > - > -**/ > -INTN > -TcpVerifySegment ( > - IN NET_BUF *Nbuf > - ) > -{ > - TCP_HEAD *Head; > - TCP_SEG *Seg; > - UINT32 Len; > - > - if (Nbuf == NULL) { > - return 1; > - } > - > - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); > - > - Seg = TCPSEG_NETBUF (Nbuf); > - Len = Nbuf->TotalSize; > - Head = Nbuf->Tcp; > - > - if (Head != NULL) { > - if (Head->Flag != Seg->Flag) { > - return 0; > - } > - > - Len -= (Head->HeadLen << 2); > - } > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > - Len++; > - } > - > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > - Len++; > - } > - > - if (Seg->Seq + Len != Seg->End) { > - return 0; > - } > - > - return 1; > -} > - > - > -/** > - Verify that all the segments in SndQue are in good shape. > - > - @param Head Pointer to the head node of the SndQue. > - > - @retval 0 At least one segment is broken. > - @retval 1 All segments in the specific queue are in good shape. > - > -**/ > -INTN > -TcpCheckSndQue ( > - IN LIST_ENTRY *Head > - ) > -{ > - LIST_ENTRY *Entry; > - NET_BUF *Nbuf; > - TCP_SEQNO Seq; > - > - if (IsListEmpty (Head)) { > - return 1; > - } > - // > - // Initialize the Seq > - // > - Entry = Head->ForwardLink; > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > - Seq = TCPSEG_NETBUF (Nbuf)->Seq; > - > - NET_LIST_FOR_EACH (Entry, Head) { > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > - > - if (TcpVerifySegment (Nbuf) == 0) { > - return 0; > - } > - > - // > - // All the node in the SndQue should has: > - // SEG.SEQ = LAST_SEG.END > - // > - if (Seq != TCPSEG_NETBUF (Nbuf)->Seq) { > - return 0; > - } > - > - Seq = TCPSEG_NETBUF (Nbuf)->End; > - } > - > - return 1; > -} > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > deleted file mode 100644 > index 4cb0ee7b5e6f..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > +++ /dev/null > @@ -1,584 +0,0 @@ > -/** @file > - TCP timer related functions. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "Tcp4Main.h" > - > -UINT32 mTcpTick = 1000; > - > -/** > - Connect timeout handler. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpConnectTimeout ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Timeout handler for TCP retransmission timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpRexmitTimeout ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Timeout handler for window probe timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpProbeTimeout ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Timeout handler for keepalive timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpKeepaliveTimeout ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Timeout handler for FIN_WAIT_2 timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpFinwait2Timeout ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Timeout handler for 2MSL timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -Tcp2MSLTimeout ( > - IN OUT TCP_CB *Tcb > - ); > - > -TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = { > - TcpConnectTimeout, > - TcpRexmitTimeout, > - TcpProbeTimeout, > - TcpKeepaliveTimeout, > - TcpFinwait2Timeout, > - Tcp2MSLTimeout, > -}; > - > -/** > - Close the TCP connection. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpClose ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - NetbufFreeList (&Tcb->SndQue); > - NetbufFreeList (&Tcb->RcvQue); > - > - TcpSetState (Tcb, TCP_CLOSED); > -} > - > - > -/** > - Connect timeout handler. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpConnectTimeout ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - if (!TCP_CONNECTED (Tcb->State)) { > - DEBUG ((EFI_D_ERROR, "TcpConnectTimeout: connection closed " > - "because conenction timer timeout for TCB %p\n", Tcb)); > - > - if (EFI_ABORTED == Tcb->Sk->SockError) { > - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); > - } > - > - if (TCP_SYN_RCVD == Tcb->State) { > - DEBUG ((EFI_D_WARN, "TcpConnectTimeout: send reset because " > - "connection timer timeout for TCB %p\n", Tcb)); > - > - TcpResetConnection (Tcb); > - > - } > - > - TcpClose (Tcb); > - } > -} > - > - > -/** > - Timeout handler for TCP retransmission timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpRexmitTimeout ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - UINT32 FlightSize; > - > - DEBUG ((EFI_D_WARN, "TcpRexmitTimeout: transmission " > - "timeout for TCB %p\n", Tcb)); > - > - // > - // Set the congestion window. FlightSize is the > - // amount of data that has been sent but not > - // yet ACKed. > - // > - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); > - Tcb->Ssthresh = MAX ((UINT32) (2 * Tcb->SndMss), FlightSize / 2); > - > - Tcb->CWnd = Tcb->SndMss; > - Tcb->LossRecover = Tcb->SndNxt; > - > - Tcb->LossTimes++; > - if ((Tcb->LossTimes > Tcb->MaxRexmit) && > - !TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_CONNECT)) { > - > - DEBUG ((EFI_D_ERROR, "TcpRexmitTimeout: connection closed " > - "because too many timeouts for TCB %p\n", Tcb)); > - > - if (EFI_ABORTED == Tcb->Sk->SockError) { > - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); > - } > - > - TcpClose (Tcb); > - return ; > - } > - > - TcpBackoffRto (Tcb); > - TcpRetransmit (Tcb, Tcb->SndUna); > - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); > - > - Tcb->CongestState = TCP_CONGEST_LOSS; > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > -} > - > - > -/** > - Timeout handler for window probe timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpProbeTimeout ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - // > - // This is the timer for sender's SWSA. RFC1122 requires > - // a timer set for sender's SWSA, and suggest combine it > - // with window probe timer. If data is sent, don't set > - // the probe timer, since retransmit timer is on. > - // > - if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) { > - > - ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0); > - Tcb->ProbeTimerOn = FALSE; > - return ; > - } > - > - TcpSendZeroProbe (Tcb); > - TcpSetProbeTimer (Tcb); > -} > - > - > -/** > - Timeout handler for keepalive timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpKeepaliveTimeout ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - Tcb->KeepAliveProbes++; > - > - // > - // Too many Keep-alive probes, drop the connection > - // > - if (Tcb->KeepAliveProbes > Tcb->MaxKeepAlive) { > - > - if (EFI_ABORTED == Tcb->Sk->SockError) { > - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); > - } > - > - TcpClose (Tcb); > - return ; > - } > - > - TcpSendZeroProbe (Tcb); > - TcpSetKeepaliveTimer (Tcb); > -} > - > - > -/** > - Timeout handler for FIN_WAIT_2 timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpFinwait2Timeout ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - DEBUG ((EFI_D_WARN, "TcpFinwait2Timeout: connection closed " > - "because FIN_WAIT2 timer timeouts for TCB %p\n", Tcb)); > - > - TcpClose (Tcb); > -} > - > - > -/** > - Timeout handler for 2MSL timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -Tcp2MSLTimeout ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - DEBUG ((EFI_D_WARN, "Tcp2MSLTimeout: connection closed " > - "because TIME_WAIT timer timeouts for TCB %p\n", Tcb)); > - > - TcpClose (Tcb); > -} > - > - > -/** > - Update the timer status and the next expire time according to the timers > - to expire in a specific future time slot. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpUpdateTimer ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - UINT16 Index; > - > - // > - // Don't use a too large value to init NextExpire > - // since mTcpTick wraps around as sequence no does. > - // > - Tcb->NextExpire = 65535; > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); > - > - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { > - > - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && > - TCP_TIME_LT (Tcb->Timer[Index], mTcpTick + Tcb->NextExpire)) { > - > - Tcb->NextExpire = TCP_SUB_TIME (Tcb->Timer[Index], mTcpTick); > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); > - } > - } > -} > - > - > -/** > - Enable a TCP timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Timer The index of the timer to be enabled. > - @param TimeOut The timeout value of this timer. > - > -**/ > -VOID > -TcpSetTimer ( > - IN OUT TCP_CB *Tcb, > - IN UINT16 Timer, > - IN UINT32 TimeOut > - ) > -{ > - TCP_SET_TIMER (Tcb->EnabledTimer, Timer); > - Tcb->Timer[Timer] = mTcpTick + TimeOut; > - > - TcpUpdateTimer (Tcb); > -} > - > - > -/** > - Clear one TCP timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Timer The index of the timer to be cleared. > - > -**/ > -VOID > -TcpClearTimer ( > - IN OUT TCP_CB *Tcb, > - IN UINT16 Timer > - ) > -{ > - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Timer); > - TcpUpdateTimer (Tcb); > -} > - > - > -/** > - Clear all TCP timers. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpClearAllTimer ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - Tcb->EnabledTimer = 0; > - TcpUpdateTimer (Tcb); > -} > - > - > -/** > - Enable the window prober timer and set the timeout value. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpSetProbeTimer ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - if (!Tcb->ProbeTimerOn) { > - Tcb->ProbeTime = Tcb->Rto; > - Tcb->ProbeTimerOn = TRUE; > - > - } else { > - Tcb->ProbeTime <<= 1; > - } > - > - if (Tcb->ProbeTime < TCP_RTO_MIN) { > - > - Tcb->ProbeTime = TCP_RTO_MIN; > - } else if (Tcb->ProbeTime > TCP_RTO_MAX) { > - > - Tcb->ProbeTime = TCP_RTO_MAX; > - } > - > - TcpSetTimer (Tcb, TCP_TIMER_PROBE, Tcb->ProbeTime); > -} > - > - > -/** > - Enable the keepalive timer and set the timeout value. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpSetKeepaliveTimer ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE)) { > - return ; > - > - } > - > - // > - // Set the timer to KeepAliveIdle if either > - // 1. the keepalive timer is off > - // 2. The keepalive timer is on, but the idle > - // is less than KeepAliveIdle, that means the > - // connection is alive since our last probe. > - // > - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_KEEPALIVE) || > - (Tcb->Idle < Tcb->KeepAliveIdle)) { > - > - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAliveIdle); > - Tcb->KeepAliveProbes = 0; > - > - } else { > - > - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAlivePeriod); > - } > -} > - > - > -/** > - Backoff the RTO. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpBackoffRto ( > - IN OUT TCP_CB *Tcb > - ) > -{ > - // > - // Fold the RTT estimate if too many times, the estimate > - // may be wrong, fold it. So the next time a valid > - // measurement is sampled, we can start fresh. > - // > - if ((Tcb->LossTimes >= TCP_FOLD_RTT) && (Tcb->SRtt != 0)) { > - Tcb->RttVar += Tcb->SRtt >> 2; > - Tcb->SRtt = 0; > - } > - > - Tcb->Rto <<= 1; > - > - if (Tcb->Rto < TCP_RTO_MIN) { > - > - Tcb->Rto = TCP_RTO_MIN; > - } else if (Tcb->Rto > TCP_RTO_MAX) { > - > - Tcb->Rto = TCP_RTO_MAX; > - } > -} > - > - > -/** > - Heart beat timer handler. > - > - @param Context Context of the timer event, ignored. > - > -**/ > -VOID > -EFIAPI > -TcpTickingDpc ( > - IN VOID *Context > - ) > -{ > - LIST_ENTRY *Entry; > - LIST_ENTRY *Next; > - TCP_CB *Tcb; > - INT16 Index; > - > - mTcpTick++; > - mTcpGlobalIss += 100; > - > - // > - // Don't use LIST_FOR_EACH, which isn't delete safe. > - // > - for (Entry = mTcpRunQue.ForwardLink; Entry != &mTcpRunQue; Entry = > Next) { > - > - Next = Entry->ForwardLink; > - > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > - > - if (Tcb->State == TCP_CLOSED) { > - continue; > - } > - // > - // The connection is doing RTT measurement. > - // > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > - Tcb->RttMeasure++; > - } > - > - Tcb->Idle++; > - > - if (Tcb->DelayedAck != 0) { > - TcpSendAck (Tcb); > - } > - > - // > - // No timer is active or no timer expired > - // > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON) || > - ((--Tcb->NextExpire) > 0)) { > - > - continue; > - } > - > - // > - // Call the timeout handler for each expired timer. > - // > - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { > - > - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && > - TCP_TIME_LEQ (Tcb->Timer[Index], mTcpTick)) { > - // > - // disable the timer before calling the handler > - // in case the handler enables it again. > - // > - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Index); > - mTcpTimerHandler[Index](Tcb); > - > - // > - // The Tcb may have been deleted by the timer, or > - // no other timer is set. > - // > - if ((Next->BackLink != Entry) || > - (Tcb->EnabledTimer == 0)) { > - break; > - } > - } > - } > - > - // > - // If the Tcb still exist or some timer is set, update the timer > - // > - if (Index == TCP_TIMER_NUMBER) { > - TcpUpdateTimer (Tcb); > - } > - } > -} > - > -/** > - Heart beat timer handler, queues the DPC at TPL_CALLBACK. > - > - @param Event Timer event signaled, ignored. > - @param Context Context of the timer event, ignored. > - > -**/ > -VOID > -EFIAPI > -TcpTicking ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - QueueDpc (TPL_CALLBACK, TcpTickingDpc, Context); > -} > - > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > deleted file mode 100644 > index a085ef61f341..000000000000 > --- > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > +++ /dev/null > @@ -1,365 +0,0 @@ > -/** @file > - > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "PxeBcImpl.h" > - > -// > -// EFI Component Name Functions > -// > -/** > - Retrieves a Unicode string that is the user readable name of the driver. > - > - This function retrieves the user readable name of a driver in the form of a > - Unicode string. If the driver specified by This has a user readable name in > - the language specified by Language, then a pointer to the driver name is > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > specified > - by This does not support the language specified by Language, > - then EFI_UNSUPPORTED is returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified > - in RFC 4646 or ISO 639-2 language code format. > - > - @param[out] DriverName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - driver specified by This in the language > - specified by Language. > - > - @retval EFI_SUCCESS The Unicode string for the Driver specified by > - This and the language specified by Language was > - returned in DriverName. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcComponentNameGetDriverName ( > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > - IN CHAR8 *Language, > - OUT CHAR16 **DriverName > - ); > - > -/** > - Retrieves a Unicode string that is the user readable name of the controller > - that is being managed by a driver. > - > - This function retrieves the user readable name of the controller specified > by > - ControllerHandle and ChildHandle in the form of a Unicode string. If the > - driver specified by This has a user readable name in the language specified > by > - Language, then a pointer to the controller name is returned in > ControllerName, > - and EFI_SUCCESS is returned. If the driver specified by This is not currently > - managing the controller specified by ControllerHandle and ChildHandle, > - then EFI_UNSUPPORTED is returned. If the driver specified by This does > not > - support the language specified by Language, then EFI_UNSUPPORTED is > returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] ControllerHandle The handle of a controller that the driver > - specified by This is managing. This handle > - specifies the controller whose name is to be > - returned. > - > - @param[in] ChildHandle The handle of the child controller to retrieve > - the name of. This is an optional parameter that > - may be NULL. It will be NULL for device > - drivers. It will also be NULL for a bus drivers > - that wish to retrieve the name of the bus > - controller. It will not be NULL for a bus > - driver that wishes to retrieve the name of a > - child controller. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified in > - RFC 4646 or ISO 639-2 language code format. > - > - @param[out] ControllerName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - controller specified by ControllerHandle and > - ChildHandle in the language specified by > - Language from the point of view of the driver > - specified by This. > - > - @retval EFI_SUCCESS The Unicode string for the user readable name > in > - the language specified by Language for the > - driver specified by This was returned in > - DriverName. > - > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > - > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid > - EFI_HANDLE. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This is not currently > - managing the controller specified by > - ControllerHandle and ChildHandle. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcComponentNameGetControllerName ( > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE ChildHandle OPTIONAL, > - IN CHAR8 *Language, > - OUT CHAR16 **ControllerName > - ); > - > -// > -// EFI Component Name Protocol > -// > -GLOBAL_REMOVE_IF_UNREFERENCED > EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName = { > - PxeBcComponentNameGetDriverName, > - PxeBcComponentNameGetControllerName, > - "eng" > -}; > - > -GLOBAL_REMOVE_IF_UNREFERENCED > EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2 = { > - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) > PxeBcComponentNameGetDriverName, > - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) > PxeBcComponentNameGetControllerName, > - "en" > -}; > - > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > mPxeBcDriverNameTable[] = { > - { > - "eng;en", > - L"UEFI PXE Base Code Driver" > - }, > - { > - NULL, > - NULL > - } > -}; > - > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > mPxeBcControllerNameTable[] = { > - { > - "eng;en", > - L"PXE Controller" > - }, > - { > - NULL, > - NULL > - } > -}; > - > -/** > - Retrieves a Unicode string that is the user readable name of the driver. > - > - This function retrieves the user readable name of a driver in the form of a > - Unicode string. If the driver specified by This has a user readable name in > - the language specified by Language, then a pointer to the driver name is > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > specified > - by This does not support the language specified by Language, > - then EFI_UNSUPPORTED is returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified > - in RFC 4646 or ISO 639-2 language code format. > - > - @param[out] DriverName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - driver specified by This in the language > - specified by Language. > - > - @retval EFI_SUCCESS The Unicode string for the Driver specified by > - This and the language specified by Language was > - returned in DriverName. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcComponentNameGetDriverName ( > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > - IN CHAR8 *Language, > - OUT CHAR16 **DriverName > - ) > -{ > - return LookupUnicodeString2 ( > - Language, > - This->SupportedLanguages, > - mPxeBcDriverNameTable, > - DriverName, > - (BOOLEAN)(This == &gPxeBcComponentName) > - ); > -} > - > -/** > - Retrieves a Unicode string that is the user readable name of the controller > - that is being managed by a driver. > - > - This function retrieves the user readable name of the controller specified > by > - ControllerHandle and ChildHandle in the form of a Unicode string. If the > - driver specified by This has a user readable name in the language specified > by > - Language, then a pointer to the controller name is returned in > ControllerName, > - and EFI_SUCCESS is returned. If the driver specified by This is not currently > - managing the controller specified by ControllerHandle and ChildHandle, > - then EFI_UNSUPPORTED is returned. If the driver specified by This does > not > - support the language specified by Language, then EFI_UNSUPPORTED is > returned. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME2_PROTOCOL or > - EFI_COMPONENT_NAME_PROTOCOL instance. > - > - @param[in] ControllerHandle The handle of a controller that the driver > - specified by This is managing. This handle > - specifies the controller whose name is to be > - returned. > - > - @param[in] ChildHandle The handle of the child controller to retrieve > - the name of. This is an optional parameter that > - may be NULL. It will be NULL for device > - drivers. It will also be NULL for a bus drivers > - that wish to retrieve the name of the bus > - controller. It will not be NULL for a bus > - driver that wishes to retrieve the name of a > - child controller. > - > - @param[in] Language A pointer to a Null-terminated ASCII string > - array indicating the language. This is the > - language of the driver name that the caller is > - requesting, and it must match one of the > - languages specified in SupportedLanguages. The > - number of languages supported by a driver is up > - to the driver writer. Language is specified in > - RFC 4646 or ISO 639-2 language code format. > - > - @param[out] ControllerName A pointer to the Unicode string to return. > - This Unicode string is the name of the > - controller specified by ControllerHandle and > - ChildHandle in the language specified by > - Language from the point of view of the driver > - specified by This. > - > - @retval EFI_SUCCESS The Unicode string for the user readable name > in > - the language specified by Language for the > - driver specified by This was returned in > - DriverName. > - > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > - > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid > - EFI_HANDLE. > - > - @retval EFI_INVALID_PARAMETER Language is NULL. > - > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > - > - @retval EFI_UNSUPPORTED The driver specified by This is not currently > - managing the controller specified by > - ControllerHandle and ChildHandle. > - > - @retval EFI_UNSUPPORTED The driver specified by This does not > support > - the language specified by Language. > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcComponentNameGetControllerName ( > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE ChildHandle OPTIONAL, > - IN CHAR8 *Language, > - OUT CHAR16 **ControllerName > - ) > -{ > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > - EFI_HANDLE NicHandle; > - EFI_STATUS Status; > - > - if (ControllerHandle == NULL || ChildHandle != NULL) { > - return EFI_UNSUPPORTED; > - } > - > - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid); > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiDhcp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiIp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiUdp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiMtftp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - return EFI_UNSUPPORTED; > - } > - } > - } > - } > - } > - > - Status = gBS->OpenProtocol ( > - NicHandle, > - &gEfiPxeBaseCodeProtocolGuid, > - (VOID **) &PxeBc, > - NULL, > - NULL, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - return LookupUnicodeString2 ( > - Language, > - This->SupportedLanguages, > - mPxeBcControllerNameTable, > - ControllerName, > - (BOOLEAN)(This == &gPxeBcComponentName) > - ); > -} > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > deleted file mode 100644 > index f7b975f2997f..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > +++ /dev/null > @@ -1,1999 +0,0 @@ > -/** @file > - Support for PxeBc dhcp functions. > - > -Copyright (c) 2013, Red Hat, Inc. > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "PxeBcImpl.h" > - > -// > -// This is a map from the interested DHCP4 option tags' index to the tag > value. > -// > -UINT8 mInterestedDhcp4Tags[PXEBC_DHCP4_TAG_INDEX_MAX] = { > - DHCP4_TAG_BOOTFILE_LEN, > - DHCP4_TAG_VENDOR, > - DHCP4_TAG_OVERLOAD, > - DHCP4_TAG_MSG_TYPE, > - DHCP4_TAG_SERVER_ID, > - DHCP4_TAG_VENDOR_CLASS_ID, > - DHCP4_TAG_BOOTFILE > -}; > - > - > -/** > - This function initialize the DHCP4 message instance. > - > - This function will pad each item of dhcp4 message packet. > - > - @param Seed Pointer to the message instance of the DHCP4 packet. > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > - > -**/ > -VOID > -PxeBcInitSeedPacket ( > - IN EFI_DHCP4_PACKET *Seed, > - IN EFI_UDP4_PROTOCOL *Udp4 > - ) > -{ > - EFI_SIMPLE_NETWORK_MODE Mode; > - EFI_DHCP4_HEADER *Header; > - > - Udp4->GetModeData (Udp4, NULL, NULL, NULL, &Mode); > - > - Seed->Size = sizeof (EFI_DHCP4_PACKET); > - Seed->Length = sizeof (Seed->Dhcp4); > - > - Header = &Seed->Dhcp4.Header; > - > - ZeroMem (Header, sizeof (EFI_DHCP4_HEADER)); > - Header->OpCode = PXEBC_DHCP4_OPCODE_REQUEST; > - Header->HwType = Mode.IfType; > - Header->HwAddrLen = (UINT8) Mode.HwAddressSize; > - CopyMem (Header->ClientHwAddr, &Mode.CurrentAddress, Header- > >HwAddrLen); > - > - Seed->Dhcp4.Magik = PXEBC_DHCP4_MAGIC; > - Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP; > -} > - > - > -/** > - Copy the DCHP4 packet from srouce to destination. > - > - @param[in] Dst Pointer to the cache buffer for DHCPv4 packet. > - @param[in] Src Pointer to the DHCPv4 packet to be cached. > - > - @retval EFI_SUCCESS Packet is copied. > - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to > hold the packet. > - > -**/ > -EFI_STATUS > -PxeBcCopyEfiDhcp4Packet ( > - IN EFI_DHCP4_PACKET *Dst, > - IN EFI_DHCP4_PACKET *Src > - ) > -{ > - if (Dst->Size < Src->Length) { > - return EFI_BUFFER_TOO_SMALL; > - } > - > - CopyMem (&Dst->Dhcp4, &Src->Dhcp4, Src->Length); > - Dst->Length = Src->Length; > - return EFI_SUCCESS; > -} > - > - > -/** > - Copy the dhcp4 packet to the PxeBc private data and parse the dhcp4 > packet. > - > - @param Private Pointer to PxeBc private data. > - @param OfferIndex Index of cached packets as complements of pxe > mode data, > - the index is maximum offer number. > - > - @retval EFI_SUCCESS Cache and parse the packet successfully. > - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to > hold the packet. > - > -**/ > -EFI_STATUS > -PxeBcCopyProxyOffer ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN UINT32 OfferIndex > - ) > -{ > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_DHCP4_PACKET *Offer; > - EFI_STATUS Status; > - > - ASSERT (OfferIndex < Private->NumOffers); > - ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM); > - > - Mode = Private->PxeBc.Mode; > - Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer; > - > - Status = PxeBcCopyEfiDhcp4Packet (&Private->ProxyOffer.Packet.Offer, > Offer); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - CopyMem (&Mode->ProxyOffer, &Offer->Dhcp4, Offer->Length); > - Mode->ProxyOfferReceived = TRUE; > - > - PxeBcParseCachedDhcpPacket (&Private->ProxyOffer); > - return EFI_SUCCESS; > -} > - > - > -/** > - Parse the cached dhcp packet. > - > - @param CachedPacket Pointer to cached dhcp packet. > - > - @retval TRUE Succeed to parse and validation. > - @retval FALSE Fail to parse or validation. > - > -**/ > -BOOLEAN > -PxeBcParseCachedDhcpPacket ( > - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket > - ) > -{ > - EFI_DHCP4_PACKET *Offer; > - EFI_DHCP4_PACKET_OPTION **Options; > - EFI_DHCP4_PACKET_OPTION *Option; > - UINT8 OfferType; > - UINTN Index; > - UINT8 *Ptr8; > - > - CachedPacket->IsPxeOffer = FALSE; > - ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket- > >Dhcp4Option)); > - ZeroMem (&CachedPacket->PxeVendorOption, sizeof (CachedPacket- > >PxeVendorOption)); > - > - Offer = &CachedPacket->Packet.Offer; > - Options = CachedPacket->Dhcp4Option; > - > - // > - // Parse interested dhcp options and store their pointers in CachedPacket- > >Dhcp4Option. > - // First, try to parse DHCPv4 options from the DHCP optional parameters > field. > - // > - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { > - Options[Index] = PxeBcParseExtendOptions ( > - Offer->Dhcp4.Option, > - GET_OPTION_BUFFER_LEN (Offer), > - mInterestedDhcp4Tags[Index] > - ); > - } > - // > - // Second, Check if bootfilename and serverhostname is overloaded to > carry DHCP options refers to rfc-2132. > - // If yes, try to parse options from the BootFileName field, then > ServerName field. > - // > - Option = Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]; > - if (Option != NULL) { > - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) != 0) { > - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { > - if (Options[Index] == NULL) { > - Options[Index] = PxeBcParseExtendOptions ( > - (UINT8 *) Offer->Dhcp4.Header.BootFileName, > - sizeof (Offer->Dhcp4.Header.BootFileName), > - mInterestedDhcp4Tags[Index] > - ); > - } > - } > - } > - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_SERVER_NAME) != 0) { > - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { > - if (Options[Index] == NULL) { > - Options[Index] = PxeBcParseExtendOptions ( > - (UINT8 *) Offer->Dhcp4.Header.ServerName, > - sizeof (Offer->Dhcp4.Header.ServerName), > - mInterestedDhcp4Tags[Index] > - ); > - } > - } > - } > - } > - > - // > - // Check whether is an offer with PXEClient or not. > - // > - Option = Options[PXEBC_DHCP4_TAG_INDEX_CLASS_ID]; > - if ((Option != NULL) && (Option->Length >= 9) && > - (CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 9) == 0)) { > - > - CachedPacket->IsPxeOffer = TRUE; > - } > - > - // > - // Parse pxe vendor options and store their content/pointers in > CachedPacket->PxeVendorOption. > - // > - Option = Options[PXEBC_DHCP4_TAG_INDEX_VENDOR]; > - if (CachedPacket->IsPxeOffer && (Option != NULL)) { > - > - if (!PxeBcParseVendorOptions (Option, &CachedPacket- > >PxeVendorOption)) { > - return FALSE; > - } > - } > - > - > - // > - // Parse PXE boot file name: > - // According to PXE spec, boot file name should be read from DHCP option > 67 (bootfile name) if present. > - // Otherwise, read from boot file field in DHCP header. > - // > - if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { > - // > - // RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is > null > - // terminated string. So force to append null terminated character at the > end of string. > - // > - Ptr8 = (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]- > >Data[0]; > - Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length; > - if (*(Ptr8 - 1) != '\0') { > - *Ptr8 = '\0'; > - } > - } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) { > - // > - // If the bootfile is not present and bootfilename is present in dhcp packet, > just parse it. > - // And do not count dhcp option header, or else will destroy the > serverhostname. > - // > - // Make sure "BootFileName" is not overloaded. > - // > - if (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD] == NULL || > - (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]->Data[0] & > PXEBC_DHCP4_OVERLOAD_FILE) == 0) { > - Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] = > (EFI_DHCP4_PACKET_OPTION *) (&Offer->Dhcp4.Header.BootFileName[0] - > - OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0])); > - } > - } > - > - // > - // Determine offer type of the dhcp packet. > - // > - Option = Options[PXEBC_DHCP4_TAG_INDEX_MSG_TYPE]; > - if ((Option == NULL) || (Option->Data[0] == 0)) { > - // > - // It's a bootp offer > - // > - Option = CachedPacket- > >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]; > - if (Option == NULL) { > - // > - // bootp offer without bootfilename, discard it. > - // > - return FALSE; > - } > - > - OfferType = DHCP4_PACKET_TYPE_BOOTP; > - > - } else { > - > - if (IS_VALID_DISCOVER_VENDOR_OPTION (CachedPacket- > >PxeVendorOption.BitMap)) { > - // > - // It's a pxe10 offer with PXEClient and discover vendor option. > - // > - OfferType = DHCP4_PACKET_TYPE_PXE10; > - } else if (IS_VALID_MTFTP_VENDOR_OPTION (CachedPacket- > >PxeVendorOption.BitMap)) { > - // > - // It's a wfm11a offer with PXEClient and mtftp vendor option, and > - // return false since mtftp not supported currently. > - // > - return FALSE; > - } else { > - // > - // If the binl offer with only PXEClient. > - // > - OfferType = (UINT8) ((CachedPacket->IsPxeOffer) ? > DHCP4_PACKET_TYPE_BINL : DHCP4_PACKET_TYPE_DHCP_ONLY); > - } > - } > - > - CachedPacket->OfferType = OfferType; > - > - return TRUE; > -} > - > - > -/** > - Offer dhcp service with a BINL dhcp offer. > - > - @param Private Pointer to PxeBc private data. > - @param Index Index of cached packets as complements of pxe mode > data, > - the index is maximum offer number. > - > - @retval TRUE Offer the service successfully under priority BINL. > - @retval FALSE Boot Service failed, parse cached dhcp packet failed or this > - BINL ack cannot find options set or bootfile name specified. > - > -**/ > -BOOLEAN > -PxeBcTryBinl ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN UINT32 Index > - ) > -{ > - EFI_DHCP4_PACKET *Offer; > - EFI_IP_ADDRESS ServerIp; > - EFI_STATUS Status; > - PXEBC_CACHED_DHCP4_PACKET *CachedPacket; > - EFI_DHCP4_PACKET *Reply; > - > - ASSERT (Index < PXEBC_MAX_OFFER_NUM); > - ASSERT (Private->Dhcp4Offers[Index].OfferType == > DHCP4_PACKET_TYPE_BINL); > - > - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; > - > - // > - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option > 54(server identifier) > - // in DHCPOFFER packet. > - // (It does not comply with PXE Spec, Ver2.1) > - // > - if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, > &mZeroIp4Addr)) { > - CopyMem ( > - &ServerIp.Addr[0], > - Private- > >Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID] > ->Data, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - } else { > - CopyMem ( > - &ServerIp.Addr[0], > - &Offer->Dhcp4.Header.ServerAddr, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - } > - if (ServerIp.Addr[0] == 0) { > - return FALSE; > - } > - > - CachedPacket = &Private->ProxyOffer; > - Reply = &CachedPacket->Packet.Offer; > - > - Status = PxeBcDiscvBootService ( > - Private, > - 0, > - NULL, > - FALSE, > - &ServerIp, > - 0, > - NULL, > - FALSE, > - Reply > - ); > - if (EFI_ERROR (Status)) { > - return FALSE; > - } > - > - if (!PxeBcParseCachedDhcpPacket (CachedPacket)) { > - return FALSE; > - } > - > - if ((CachedPacket->OfferType != DHCP4_PACKET_TYPE_PXE10) && > - (CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] > == NULL)) { > - // > - // This BINL ack doesn't have discovery options set or bootfile name > - // specified. > - // > - return FALSE; > - } > - > - Private->PxeBc.Mode->ProxyOfferReceived = TRUE; > - CopyMem (&Private->PxeBc.Mode->ProxyOffer, &Reply->Dhcp4, Reply- > >Length); > - > - return TRUE; > -} > - > - > -/** > - Offer dhcp service for each proxy with a BINL dhcp offer. > - > - @param Private Pointer to PxeBc private data > - @param OfferIndex Pointer to the index of cached packets as > complements of > - pxe mode data, the index is maximum offer number. > - > - @return If there is no service needed offer return FALSE, otherwise TRUE. > - > -**/ > -BOOLEAN > -PxeBcTryBinlProxy ( > - IN PXEBC_PRIVATE_DATA *Private, > - OUT UINT32 *OfferIndex > - ) > -{ > - UINT32 Index; > - > - for (Index = 0; Index < Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]; > Index++) { > - > - *OfferIndex = Private->BinlIndex[Index]; > - // > - // Try this BINL proxy offer > - // > - if (PxeBcTryBinl (Private, *OfferIndex)) { > - return TRUE; > - } > - } > - > - return FALSE; > -} > - > - > -/** > - This function is to check the selected proxy offer (include BINL dhcp offer > and > - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe > base code > - mode structure. > - > - @param Private Pointer to PxeBc private data. > - > - @retval EFI_SUCCESS Operational successful. > - @retval EFI_NO_RESPONSE Offer dhcp service failed. > - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base > code mode. > - > -**/ > -EFI_STATUS > -PxeBcCheckSelectedOffer ( > - IN PXEBC_PRIVATE_DATA *Private > - ) > -{ > - PXEBC_CACHED_DHCP4_PACKET *SelectedOffer; > - EFI_DHCP4_PACKET_OPTION **Options; > - UINT32 Index; > - EFI_DHCP4_PACKET *Offer; > - UINT32 ProxyOfferIndex; > - EFI_STATUS Status; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_DHCP4_PACKET *Ack; > - > - ASSERT (Private->SelectedOffer != 0); > - > - Status = EFI_SUCCESS; > - SelectedOffer = &Private->Dhcp4Offers[Private->SelectedOffer - 1]; > - Options = SelectedOffer->Dhcp4Option; > - > - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BINL) { > - // > - // The addresses are acquired from a BINL dhcp offer, try BINL to get > - // the bootfile name > - // > - if (!PxeBcTryBinl (Private, Private->SelectedOffer - 1)) { > - Status = EFI_NO_RESPONSE; > - } > - } else if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) > { > - // > - // The selected offer to finish the D.O.R.A. is a DHCP only offer, we need > - // try proxy offers if there are some, othewise the bootfile name must be > - // set in this DHCP only offer. > - // > - if (Private->GotProxyOffer) { > - // > - // Get rid of the compiler warning. > - // > - ProxyOfferIndex = 0; > - if (Private->SortOffers) { > - // > - // The offers are sorted before selecting, the proxy offer type must be > - // already determined. > - // > - ASSERT (Private->ProxyIndex[Private->ProxyOfferType] > 0); > - > - if (Private->ProxyOfferType == DHCP4_PACKET_TYPE_BINL) { > - // > - // We buffer all received BINL proxy offers, try them all one by one > - // > - if (!PxeBcTryBinlProxy (Private, &ProxyOfferIndex)) { > - Status = EFI_NO_RESPONSE; > - } > - } else { > - // > - // For other types, only one proxy offer is buffered. > - // > - ProxyOfferIndex = Private->ProxyIndex[Private->ProxyOfferType] - 1; > - } > - } else { > - // > - // The proxy offer type is not determined, choose proxy offer in the > - // received order. > - // > - Status = EFI_NO_RESPONSE; > - > - ASSERT (Private->NumOffers < PXEBC_MAX_OFFER_NUM); > - for (Index = 0; Index < Private->NumOffers; Index++) { > - > - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; > - if (!IS_PROXY_DHCP_OFFER (Offer)) { > - // > - // Skip non proxy dhcp offers. > - // > - continue; > - } > - > - if (Private->Dhcp4Offers[Index].OfferType == > DHCP4_PACKET_TYPE_BINL) { > - // > - // Try BINL > - // > - if (!PxeBcTryBinl (Private, Index)) { > - // > - // Failed, skip to the next offer > - // > - continue; > - } > - } > - > - Private->ProxyOfferType = Private->Dhcp4Offers[Index].OfferType; > - ProxyOfferIndex = Index; > - Status = EFI_SUCCESS; > - break; > - } > - } > - > - if (!EFI_ERROR (Status) && (Private->ProxyOfferType != > DHCP4_PACKET_TYPE_BINL)) { > - // > - // Copy the proxy offer to Mode and set the flag > - // > - Status = PxeBcCopyProxyOffer (Private, ProxyOfferIndex); > - } > - } else { > - // > - // No proxy offer is received, the bootfile name MUST be set. > - // > - ASSERT (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL); > - } > - } > - > - if (!EFI_ERROR (Status)) { > - // > - // Everything is OK, set the flag and copy the DHCP packets. > - // > - Mode = Private->PxeBc.Mode; > - Offer = &SelectedOffer->Packet.Offer; > - > - // > - // The discover packet is already copied, just set flag here. > - // > - Mode->DhcpDiscoverValid = TRUE; > - > - Ack = &Private->Dhcp4Ack.Packet.Ack; > - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BOOTP) { > - // > - // Other type of ACK is already cached. Bootp is special that we should > - // use the bootp reply as the ACK and put it into the DHCP_ONLY buffer. > - // > - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, > Offer); > - } > - > - PxeBcParseCachedDhcpPacket (&Private->Dhcp4Ack); > - > - Mode->DhcpAckReceived = TRUE; > - > - // > - // Copy the dhcp ack. > - // > - CopyMem (&Mode->DhcpAck, &Ack->Dhcp4, Ack->Length); > - } > - > - return Status; > -} > - > - > -/** > - Cache the Dhcp4 packet offer, Parse and validate each option of the packet. > - > - @param Private Pointer to PxeBc private data. > - @param RcvdOffer Pointer to the received Dhcp proxy offer packet. > - > - @retval EFI_SUCCESS Cache and parse the packet successfully. > - @retval Others Operation failed. > - > -**/ > -EFI_STATUS > -PxeBcCacheDhcpOffer ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_DHCP4_PACKET *RcvdOffer > - ) > -{ > - PXEBC_CACHED_DHCP4_PACKET *CachedOffer; > - EFI_DHCP4_PACKET *Offer; > - UINT8 OfferType; > - EFI_STATUS Status; > - > - CachedOffer = &Private->Dhcp4Offers[Private->NumOffers]; > - Offer = &CachedOffer->Packet.Offer; > - > - // > - // Cache the orignal dhcp packet > - // > - Status = PxeBcCopyEfiDhcp4Packet (Offer, RcvdOffer); > - if (EFI_ERROR(Status)) { > - return Status; > - } > - > - // > - // Parse and validate the options (including dhcp option and vendor option) > - // > - if (!PxeBcParseCachedDhcpPacket (CachedOffer)) { > - return EFI_ABORTED; > - } > - > - OfferType = CachedOffer->OfferType; > - if (OfferType >= DHCP4_PACKET_TYPE_MAX) { > - return EFI_ABORTED; > - } > - > - if (OfferType == DHCP4_PACKET_TYPE_BOOTP) { > - > - if (Private->BootpIndex != 0) { > - // > - // Only cache the first bootp offer, discard others. > - // > - return EFI_ABORTED; > - } else { > - // > - // Take as a dhcp only offer, but record index specifically. > - // > - Private->BootpIndex = Private->NumOffers + 1; > - } > - } else { > - > - if (IS_PROXY_DHCP_OFFER (Offer)) { > - // > - // It's a proxy dhcp offer with no your address, including pxe10, wfm11a > or binl offer. > - // > - Private->GotProxyOffer = TRUE; > - > - if (OfferType == DHCP4_PACKET_TYPE_BINL) { > - // > - // Cache all binl offers. > - // > - Private->BinlIndex[Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]] = > Private->NumOffers; > - Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]++; > - } else if (Private->ProxyIndex[OfferType] != 0) { > - // > - // Only cache the first pxe10/wfm11a offers each, discard the others. > - // > - return EFI_ABORTED; > - } else { > - // > - // Record index of the proxy dhcp offer with type other than binl. > - // > - Private->ProxyIndex[OfferType] = Private->NumOffers + 1; > - } > - } else { > - // > - // It's a dhcp offer with your address. > - // > - ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM); > - Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] = > Private->NumOffers; > - Private->ServerCount[OfferType]++; > - } > - } > - > - // > - // Count the accepted offers. > - // > - Private->NumOffers++; > - > - return EFI_SUCCESS; > -} > - > -/** > - Switch the Ip4 policy to static. > - > - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. > - > - @retval EFI_SUCCESS The policy is already configured to static. > - @retval Others Other error as indicated.. > - > -**/ > -EFI_STATUS > -PxeBcSetIp4Policy ( > - IN PXEBC_PRIVATE_DATA *Private > - ) > -{ > - EFI_STATUS Status; > - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; > - EFI_IP4_CONFIG2_POLICY Policy; > - UINTN DataSize; > - > - Ip4Config2 = Private->Ip4Config2; > - DataSize = sizeof (EFI_IP4_CONFIG2_POLICY); > - Status = Ip4Config2->GetData ( > - Ip4Config2, > - Ip4Config2DataTypePolicy, > - &DataSize, > - &Policy > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - if (Policy != Ip4Config2PolicyStatic) { > - Policy = Ip4Config2PolicyStatic; > - Status= Ip4Config2->SetData ( > - Ip4Config2, > - Ip4Config2DataTypePolicy, > - sizeof (EFI_IP4_CONFIG2_POLICY), > - &Policy > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - } > - > - return EFI_SUCCESS; > -} > - > - > -/** > - Select the specified proxy offer, such as BINL, DHCP_ONLY and so on. > - If the proxy does not exist, try offers with bootfile. > - > - @param Private Pointer to PxeBc private data. > - > -**/ > -VOID > -PxeBcSelectOffer ( > - IN PXEBC_PRIVATE_DATA *Private > - ) > -{ > - UINT32 Index; > - UINT32 OfferIndex; > - EFI_DHCP4_PACKET *Offer; > - > - Private->SelectedOffer = 0; > - > - if (Private->SortOffers) { > - // > - // Select offer according to the priority > - // > - if (Private->ServerCount[DHCP4_PACKET_TYPE_PXE10] > 0) { > - // > - // DHCP with PXE10 > - // > - Private->SelectedOffer = Private- > >OfferIndex[DHCP4_PACKET_TYPE_PXE10][0] + 1; > - > - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_WFM11A] > 0) { > - // > - // DHCP with WfM > - // > - Private->SelectedOffer = Private- > >OfferIndex[DHCP4_PACKET_TYPE_WFM11A][0] + 1; > - > - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_PXE10] > 0) && > - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) > - ) { > - // > - // DHCP only and proxy DHCP with PXE10 > - // > - Private->SelectedOffer = Private- > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; > - Private->ProxyOfferType = DHCP4_PACKET_TYPE_PXE10; > - > - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_WFM11A] > 0) && > - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) > - ) { > - // > - // DHCP only and proxy DHCP with WfM > - // > - Private->SelectedOffer = Private- > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; > - Private->ProxyOfferType = DHCP4_PACKET_TYPE_WFM11A; > - > - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_BINL] > 0) { > - // > - // DHCP with BINL > - // > - Private->SelectedOffer = Private- > >OfferIndex[DHCP4_PACKET_TYPE_BINL][0] + 1; > - > - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL] > 0) && > - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) > - ) { > - // > - // DHCP only and proxy DHCP with BINL > - // > - Private->SelectedOffer = Private- > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; > - Private->ProxyOfferType = DHCP4_PACKET_TYPE_BINL; > - > - } else { > - // > - // Try offers with bootfile > - // > - for (Index = 0; Index < Private- > >ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY]; Index++) { > - // > - // Select the first DHCP only offer with bootfile > - // > - OfferIndex = Private- > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][Index]; > - if (Private- > >Dhcp4Offers[OfferIndex].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTF > ILE] != NULL) { > - Private->SelectedOffer = OfferIndex + 1; > - break; > - } > - } > - > - if (Private->SelectedOffer == 0) { > - // > - // Select the Bootp reply with bootfile if any > - // > - Private->SelectedOffer = Private->BootpIndex; > - } > - } > - } else { > - // > - // Try the offers in the received order. > - // > - for (Index = 0; Index < Private->NumOffers; Index++) { > - > - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; > - > - if (IS_PROXY_DHCP_OFFER (Offer)) { > - // > - // Skip proxy offers > - // > - continue; > - } > - > - if ((Private->Dhcp4Offers[Index].OfferType == > DHCP4_PACKET_TYPE_DHCP_ONLY) && > - ((!Private->GotProxyOffer) && (Private- > >Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] > == NULL))) { > - // > - // DHCP only offer but no proxy offer received and no bootfile option in > this offer > - // > - continue; > - } > - > - Private->SelectedOffer = Index + 1; > - break; > - } > - } > -} > - > - > -/** > - Callback routine. > - > - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 > Protocol driver > - to intercept events that occurred in the configuration process. This > structure > - provides advanced control of each state transition of the DHCP process. > The > - returned status code determines the behavior of the EFI DHCPv4 Protocol > driver. > - There are three possible returned values, which are described in the > following > - table. > - > - @param This Pointer to the EFI DHCPv4 Protocol instance that is > used to > - configure this callback function. > - @param Context Pointer to the context that is initialized by > - EFI_DHCP4_PROTOCOL.Configure(). > - @param CurrentState The current operational state of the EFI DHCPv4 > Protocol > - driver. > - @param Dhcp4Event The event that occurs in the current state, > which usually means a > - state transition. > - @param Packet The DHCP packet that is going to be sent or already > received. > - @param NewPacket The packet that is used to replace the above > Packet. > - > - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue > the DHCP process. > - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI > DHCPv4 Protocol > - driver will continue to wait for more DHCPOFFER packets > until the retry > - timeout expires. > - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort > the current process and > - return to the Dhcp4Init or Dhcp4InitReboot state. > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDhcpCallBack ( > - IN EFI_DHCP4_PROTOCOL * This, > - IN VOID *Context, > - IN EFI_DHCP4_STATE CurrentState, > - IN EFI_DHCP4_EVENT Dhcp4Event, > - IN EFI_DHCP4_PACKET * Packet OPTIONAL, > - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; > - EFI_DHCP4_PACKET_OPTION *MaxMsgSize; > - UINT16 Value; > - EFI_STATUS Status; > - BOOLEAN Received; > - EFI_DHCP4_HEADER *DhcpHeader; > - > - if ((Dhcp4Event != Dhcp4RcvdOffer) && > - (Dhcp4Event != Dhcp4SelectOffer) && > - (Dhcp4Event != Dhcp4SendDiscover) && > - (Dhcp4Event != Dhcp4RcvdAck) && > - (Dhcp4Event != Dhcp4SendRequest)) { > - return EFI_SUCCESS; > - } > - > - Private = (PXEBC_PRIVATE_DATA *) Context; > - Mode = Private->PxeBc.Mode; > - Callback = Private->PxeBcCallback; > - > - // > - // Override the Maximum DHCP Message Size. > - // > - MaxMsgSize = PxeBcParseExtendOptions ( > - Packet->Dhcp4.Option, > - GET_OPTION_BUFFER_LEN (Packet), > - DHCP4_TAG_MAXMSG > - ); > - if (MaxMsgSize != NULL) { > - Value = HTONS (PXEBC_DHCP4_MAX_PACKET_SIZE); > - CopyMem (MaxMsgSize->Data, &Value, sizeof (Value)); > - } > - > - if ((Dhcp4Event != Dhcp4SelectOffer) && (Callback != NULL)) { > - Received = (BOOLEAN) ((Dhcp4Event == Dhcp4RcvdOffer) || (Dhcp4Event > == Dhcp4RcvdAck)); > - Status = Callback->Callback ( > - Callback, > - Private->Function, > - Received, > - Packet->Length, > - (EFI_PXE_BASE_CODE_PACKET *) &Packet->Dhcp4 > - ); > - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { > - return EFI_ABORTED; > - } > - } > - > - Status = EFI_SUCCESS; > - > - switch (Dhcp4Event) { > - > - case Dhcp4SendDiscover: > - case Dhcp4SendRequest: > - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { > - // > - // If the to be sent packet exceeds the maximum length, abort the DHCP > process. > - // > - Status = EFI_ABORTED; > - break; > - } > - > - if (Mode->SendGUID) { > - // > - // send the system GUID instead of the MAC address as the hardware > address > - // in the DHCP packet header. > - // > - DhcpHeader = &Packet->Dhcp4.Header; > - > - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader- > >ClientHwAddr))) { > - // > - // GUID not yet set - send all 0xff's to show programable (via SetVariable) > - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, > sizeof(EFI_GUID), 0xff); > - // GUID not yet set - send all 0's to show not programable > - // > - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the > smbios table!\n")); > - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); > - } > - > - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); > - } > - > - if (Dhcp4Event == Dhcp4SendDiscover) { > - // > - // Cache the dhcp discover packet, of which some information will be > used later. > - // > - CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet- > >Length); > - } > - > - break; > - > - case Dhcp4RcvdOffer: > - Status = EFI_NOT_READY; > - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { > - // > - // Ignore the incoming Offers which exceed the maximum length. > - // > - break; > - } > - > - if (Private->NumOffers < PXEBC_MAX_OFFER_NUM) { > - // > - // Cache the dhcp offers in Private->Dhcp4Offers[] > - // If error happens, just ignore this packet and continue to wait more > offer. > - // > - PxeBcCacheDhcpOffer (Private, Packet); > - } > - > - break; > - > - case Dhcp4SelectOffer: > - // > - // Select an offer, if succeeded, Private->SelectedOffer points to > - // the index of the selected one. > - // > - PxeBcSelectOffer (Private); > - > - if (Private->SelectedOffer == 0) { > - Status = EFI_ABORTED; > - } else { > - *NewPacket = &Private->Dhcp4Offers[Private->SelectedOffer - > 1].Packet.Offer; > - } > - > - break; > - > - case Dhcp4RcvdAck: > - // > - // Cache Ack > - // > - ASSERT (Private->SelectedOffer != 0); > - > - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, > Packet); > - if (EFI_ERROR (Status)) { > - return EFI_ABORTED; > - } > - break; > - > - default: > - break; > - } > - > - return Status; > -} > - > - > -/** > - Initialize the DHCP options and build the option list. > - > - @param Private Pointer to PxeBc private data. > - @param OptList Pointer to a DHCP option list. > - > - @param IsDhcpDiscover Discover dhcp option or not. > - > - @return The index item number of the option list. > - > -**/ > -UINT32 > -PxeBcBuildDhcpOptions ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_DHCP4_PACKET_OPTION **OptList, > - IN BOOLEAN IsDhcpDiscover > - ) > -{ > - UINT32 Index; > - PXEBC_DHCP4_OPTION_ENTRY OptEnt; > - UINT16 Value; > - > - Index = 0; > - OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer; > - > - if (!IsDhcpDiscover) { > - // > - // Append message type. > - // > - OptList[Index]->OpCode = DHCP4_TAG_MSG_TYPE; > - OptList[Index]->Length = 1; > - OptEnt.Mesg = (PXEBC_DHCP4_OPTION_MESG *) OptList[Index]- > >Data; > - OptEnt.Mesg->Type = PXEBC_DHCP4_MSG_TYPE_REQUEST; > - Index++; > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > - > - // > - // Append max message size. > - // > - OptList[Index]->OpCode = DHCP4_TAG_MAXMSG; > - OptList[Index]->Length = (UINT8) sizeof > (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE); > - OptEnt.MaxMesgSize = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *) > OptList[Index]->Data; > - Value = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE); > - CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16)); > - Index++; > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > - } > - // > - // Parameter request list option. > - // > - OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST; > - OptList[Index]->Length = 35; > - OptEnt.Para = (PXEBC_DHCP4_OPTION_PARA *) OptList[Index]- > >Data; > - OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK; > - OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET; > - OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER; > - OptEnt.Para->ParaList[3] = DHCP4_TAG_TIME_SERVER; > - OptEnt.Para->ParaList[4] = DHCP4_TAG_NAME_SERVER; > - OptEnt.Para->ParaList[5] = DHCP4_TAG_DNS_SERVER; > - OptEnt.Para->ParaList[6] = DHCP4_TAG_HOSTNAME; > - OptEnt.Para->ParaList[7] = DHCP4_TAG_BOOTFILE_LEN; > - OptEnt.Para->ParaList[8] = DHCP4_TAG_DOMAINNAME; > - OptEnt.Para->ParaList[9] = DHCP4_TAG_ROOTPATH; > - OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH; > - OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU; > - OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL; > - OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST; > - OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN; > - OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER; > - OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER; > - OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR; > - OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP; > - OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE; > - OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID; > - OptEnt.Para->ParaList[21] = DHCP4_TAG_T1; > - OptEnt.Para->ParaList[22] = DHCP4_TAG_T2; > - OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID; > - OptEnt.Para->ParaList[24] = DHCP4_TAG_TFTP; > - OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE; > - OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID; > - OptEnt.Para->ParaList[27] = 0x80; > - OptEnt.Para->ParaList[28] = 0x81; > - OptEnt.Para->ParaList[29] = 0x82; > - OptEnt.Para->ParaList[30] = 0x83; > - OptEnt.Para->ParaList[31] = 0x84; > - OptEnt.Para->ParaList[32] = 0x85; > - OptEnt.Para->ParaList[33] = 0x86; > - OptEnt.Para->ParaList[34] = 0x87; > - Index++; > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > - > - // > - // Append UUID/Guid-based client identifier option > - // > - OptList[Index]->OpCode = DHCP4_TAG_UUID; > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID); > - OptEnt.Uuid = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]- > >Data; > - OptEnt.Uuid->Type = 0; > - Index++; > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > - > - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) > { > - // > - // GUID not yet set - send all 0xff's to show programable (via SetVariable) > - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, > sizeof(EFI_GUID), 0xff); > - // GUID not yet set - send all 0's to show not programable > - // > - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios > table!\n")); > - ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID)); > - } > - > - // > - // Append client network device interface option > - // > - OptList[Index]->OpCode = DHCP4_TAG_UNDI; > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI); > - OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]- > >Data; > - if (Private->Nii != NULL) { > - OptEnt.Undi->Type = Private->Nii->Type; > - OptEnt.Undi->MajorVer = Private->Nii->MajorVer; > - OptEnt.Undi->MinorVer = Private->Nii->MinorVer; > - } else { > - OptEnt.Undi->Type = DEFAULT_UNDI_TYPE; > - OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR; > - OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR; > - } > - > - Index++; > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > - > - // > - // Append client system architecture option > - // > - OptList[Index]->OpCode = DHCP4_TAG_ARCH; > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH); > - OptEnt.Arch = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]- > >Data; > - Value = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE); > - CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16)); > - Index++; > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > - > - // > - // Append client system architecture option > - // > - OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID; > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID); > - OptEnt.Clid = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]->Data; > - CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof > (PXEBC_DHCP4_OPTION_CLID)); > - CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid- > >ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType)); > - > - if (Private->Nii != NULL) { > - // > - // If NII protocol exists, update DHCP option data > - // > - CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof > (OptEnt.Clid->InterfaceName)); > - CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof > (OptEnt.Clid->UndiMajor)); > - CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof > (OptEnt.Clid->UndiMinor)); > - } > - > - Index++; > - > - return Index; > -} > - > - > -/** > - Discover the boot of service and initialize the vendor option if exists. > - > - @param Private Pointer to PxeBc private data. > - @param Type PxeBc option boot item type > - @param Layer PxeBc option boot item layer > - @param UseBis Use BIS or not > - @param DestIp Ip address for server > - @param IpCount The total count of the server ip address > - @param SrvList Server list > - @param IsDiscv Discover the vendor or not > - @param Reply The dhcp4 packet of Pxe reply > - > - @retval EFI_SUCCESS Operation succeeds. > - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. > - @retval EFI_NOT_FOUND There is no vendor option exists. > - @retval EFI_TIMEOUT Send Pxe Discover time out. > - > -**/ > -EFI_STATUS > -PxeBcDiscvBootService ( > - IN PXEBC_PRIVATE_DATA * Private, > - IN UINT16 Type, > - IN UINT16 *Layer, > - IN BOOLEAN UseBis, > - IN EFI_IP_ADDRESS * DestIp, > - IN UINT16 IpCount, > - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, > - IN BOOLEAN IsDiscv, > - OUT EFI_DHCP4_PACKET * Reply OPTIONAL > - ) > -{ > - EFI_PXE_BASE_CODE_UDP_PORT Sport; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_DHCP4_PROTOCOL *Dhcp4; > - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; > - BOOLEAN IsBCast; > - EFI_STATUS Status; > - UINT16 RepIndex; > - UINT16 SrvIndex; > - UINT16 TryIndex; > - EFI_DHCP4_LISTEN_POINT ListenPoint; > - EFI_DHCP4_PACKET *Response; > - EFI_DHCP4_PACKET_OPTION > *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; > - UINT32 OptCount; > - EFI_DHCP4_PACKET_OPTION *PxeOpt; > - PXEBC_OPTION_BOOT_ITEM *PxeBootItem; > - UINT8 VendorOptLen; > - EFI_DHCP4_HEADER *DhcpHeader; > - UINT32 Xid; > - > - Mode = Private->PxeBc.Mode; > - Dhcp4 = Private->Dhcp4; > - Status = EFI_SUCCESS; > - > - ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN)); > - > - if (DestIp == NULL) { > - Sport = PXEBC_DHCP4_S_PORT; > - IsBCast = TRUE; > - } else { > - Sport = PXEBC_BS_DISCOVER_PORT; > - IsBCast = FALSE; > - } > - > - if (!UseBis && Layer != NULL) { > - *Layer &= EFI_PXE_BASE_CODE_BOOT_LAYER_MASK; > - } > - > - OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE); > - > - if (IsDiscv) { > - ASSERT (Layer != NULL); > - // > - // Add vendor option of PXE_BOOT_ITEM > - // > - VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 + > sizeof (PXEBC_OPTION_BOOT_ITEM) + 1); > - OptList[OptCount] = AllocatePool (VendorOptLen); > - if (OptList[OptCount] == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - OptList[OptCount]->OpCode = DHCP4_TAG_VENDOR; > - OptList[OptCount]->Length = (UINT8) (VendorOptLen - 2); > - PxeOpt = (EFI_DHCP4_PACKET_OPTION *) OptList[OptCount]- > >Data; > - PxeOpt->OpCode = PXEBC_VENDOR_TAG_BOOT_ITEM; > - PxeOpt->Length = (UINT8) sizeof (PXEBC_OPTION_BOOT_ITEM); > - PxeBootItem = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt->Data; > - PxeBootItem->Type = HTONS (Type); > - PxeBootItem->Layer = HTONS (*Layer); > - PxeOpt->Data[PxeOpt->Length] = DHCP4_TAG_EOP; > - > - OptCount++; > - } > - > - Status = Dhcp4->Build (Dhcp4, &Private->SeedPacket, 0, NULL, OptCount, > OptList, &Token.Packet); > - > - if (IsDiscv) { > - FreePool (OptList[OptCount - 1]); > - } > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - DhcpHeader = &Token.Packet->Dhcp4.Header; > - if (Mode->SendGUID) { > - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader- > >ClientHwAddr))) { > - // > - // GUID not yet set - send all 0's to show not programable > - // > - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the > smbios table!\n")); > - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); > - } > - > - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); > - } > - > - Xid = NET_RANDOM (NetRandomInitSeed ()); > - Token.Packet->Dhcp4.Header.Xid = HTONL(Xid); > - Token.Packet->Dhcp4.Header.Reserved = HTONS((UINT16) ((IsBCast) ? > 0x8000 : 0)); > - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private- > >StationIp, sizeof (EFI_IPv4_ADDRESS)); > - > - Token.RemotePort = Sport; > - > - if (IsBCast) { > - SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff); > - } else { > - CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS)); > - } > - > - CopyMem (&Token.GatewayAddress, &Private->GatewayIp, sizeof > (EFI_IPv4_ADDRESS)); > - > - if (!IsBCast) { > - Token.ListenPointCount = 1; > - Token.ListenPoints = &ListenPoint; > - Token.ListenPoints[0].ListenPort = PXEBC_BS_DISCOVER_PORT; > - CopyMem (&Token.ListenPoints[0].ListenAddress, &Private->StationIp, > sizeof(EFI_IPv4_ADDRESS)); > - CopyMem (&Token.ListenPoints[0].SubnetMask, &Private->SubnetMask, > sizeof(EFI_IPv4_ADDRESS)); > - } > - // > - // Send Pxe Discover > - // > - for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; > TryIndex++) { > - > - Token.TimeoutValue = (UINT16) > (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex); > - Token.Packet->Dhcp4.Header.Seconds = (UINT16) > (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1)); > - > - Status = Dhcp4->TransmitReceive (Dhcp4, &Token); > - > - if (Token.Status != EFI_TIMEOUT) { > - break; > - } > - } > - > - if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) { > - // > - // No server response our PXE request > - // > - Status = EFI_TIMEOUT; > - } > - > - if (!EFI_ERROR (Status)) { > - // > - // Find Pxe Reply > - // > - RepIndex = 0; > - SrvIndex = 0; > - Response = Token.ResponseList; > - > - while (RepIndex < Token.ResponseCount) { > - if (Response->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { > - SrvIndex = 0; > - RepIndex++; > - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response- > >Size); > - continue; > - } > - > - while (SrvIndex < IpCount) { > - > - if (SrvList[SrvIndex].AcceptAnyResponse) { > - break; > - } > - > - if ((SrvList[SrvIndex].Type == Type) && EFI_IP4_EQUAL (&(Response- > >Dhcp4.Header.ServerAddr), &(Private->ServerIp))) { > - break; > - } > - > - SrvIndex++; > - } > - > - if ((IpCount != SrvIndex) || (IpCount == 0)) { > - break; > - } > - > - SrvIndex = 0; > - RepIndex++; > - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response- > >Size); > - } > - > - if (RepIndex < Token.ResponseCount) { > - > - if (Reply != NULL) { > - Status = PxeBcCopyEfiDhcp4Packet (Reply, Response); > - if (EFI_ERROR(Status)) { > - goto ON_EXIT; > - } > - } > - > - if (IsDiscv) { > - CopyMem (&(Mode->PxeDiscover), &(Token.Packet->Dhcp4), > Token.Packet->Length); > - Mode->PxeDiscoverValid = TRUE; > - > - CopyMem (Mode->PxeReply.Raw, &Response->Dhcp4, Response- > >Length); > - Mode->PxeReplyReceived = TRUE; > - } > - } else { > - Status = EFI_NOT_FOUND; > - } > - } > - > -ON_EXIT: > - // > - // free the responselist > - // > - if (Token.ResponseList != NULL) { > - FreePool (Token.ResponseList); > - } > - // > - // Free the dhcp packet > - // > - if (Token.Packet != NULL) { > - FreePool (Token.Packet); > - } > - > - return Status; > -} > - > - > -/** > - Parse interested dhcp options. > - > - @param Buffer Pointer to the dhcp options packet. > - @param Length The length of the dhcp options. > - @param OptTag The option OpCode. > - > - @return NULL if the buffer length is 0 and OpCode is not > - DHCP4_TAG_EOP, or the pointer to the buffer. > - > -**/ > -EFI_DHCP4_PACKET_OPTION * > -PxeBcParseExtendOptions ( > - IN UINT8 *Buffer, > - IN UINT32 Length, > - IN UINT8 OptTag > - ) > -{ > - EFI_DHCP4_PACKET_OPTION *Option; > - UINT32 Offset; > - > - Option = (EFI_DHCP4_PACKET_OPTION *) Buffer; > - Offset = 0; > - > - while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) { > - > - if (Option->OpCode == OptTag) { > - > - return Option; > - } > - > - if (Option->OpCode == DHCP4_TAG_PAD) { > - Offset++; > - } else { > - Offset += Option->Length + 2; > - } > - > - Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset); > - } > - > - return NULL; > -} > - > - > -/** > - This function is to parse and check vendor options. > - > - @param Dhcp4Option Pointer to dhcp options > - @param VendorOption Pointer to vendor options > - > - @return TRUE if valid for vendor options, or FALSE. > - > -**/ > -BOOLEAN > -PxeBcParseVendorOptions ( > - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, > - IN PXEBC_VENDOR_OPTION *VendorOption > - ) > -{ > - UINT32 *BitMap; > - UINT8 VendorOptionLen; > - EFI_DHCP4_PACKET_OPTION *PxeOption; > - UINT8 Offset; > - > - BitMap = VendorOption->BitMap; > - VendorOptionLen = Dhcp4Option->Length; > - PxeOption = (EFI_DHCP4_PACKET_OPTION *) &Dhcp4Option->Data[0]; > - Offset = 0; > - > - while ((Offset < VendorOptionLen) && (PxeOption->OpCode != > DHCP4_TAG_EOP)) { > - // > - // Parse every Vendor Option and set its BitMap > - // > - switch (PxeOption->OpCode) { > - > - case PXEBC_VENDOR_TAG_MTFTP_IP: > - > - CopyMem (&VendorOption->MtftpIp, PxeOption->Data, sizeof > (EFI_IPv4_ADDRESS)); > - break; > - > - case PXEBC_VENDOR_TAG_MTFTP_CPORT: > - > - CopyMem (&VendorOption->MtftpCPort, PxeOption->Data, sizeof > (VendorOption->MtftpCPort)); > - break; > - > - case PXEBC_VENDOR_TAG_MTFTP_SPORT: > - > - CopyMem (&VendorOption->MtftpSPort, PxeOption->Data, sizeof > (VendorOption->MtftpSPort)); > - break; > - > - case PXEBC_VENDOR_TAG_MTFTP_TIMEOUT: > - > - VendorOption->MtftpTimeout = *PxeOption->Data; > - break; > - > - case PXEBC_VENDOR_TAG_MTFTP_DELAY: > - > - VendorOption->MtftpDelay = *PxeOption->Data; > - break; > - > - case PXEBC_VENDOR_TAG_DISCOVER_CTRL: > - > - VendorOption->DiscoverCtrl = *PxeOption->Data; > - break; > - > - case PXEBC_VENDOR_TAG_DISCOVER_MCAST: > - > - CopyMem (&VendorOption->DiscoverMcastIp, PxeOption->Data, sizeof > (EFI_IPv4_ADDRESS)); > - break; > - > - case PXEBC_VENDOR_TAG_BOOT_SERVERS: > - > - VendorOption->BootSvrLen = PxeOption->Length; > - VendorOption->BootSvr = (PXEBC_BOOT_SVR_ENTRY *) PxeOption- > >Data; > - break; > - > - case PXEBC_VENDOR_TAG_BOOT_MENU: > - > - VendorOption->BootMenuLen = PxeOption->Length; > - VendorOption->BootMenu = (PXEBC_BOOT_MENU_ENTRY *) > PxeOption->Data; > - break; > - > - case PXEBC_VENDOR_TAG_MENU_PROMPT: > - > - VendorOption->MenuPromptLen = PxeOption->Length; > - VendorOption->MenuPrompt = (PXEBC_MENU_PROMPT *) > PxeOption->Data; > - break; > - > - case PXEBC_VENDOR_TAG_MCAST_ALLOC: > - > - CopyMem (&VendorOption->McastIpBase, PxeOption->Data, sizeof > (EFI_IPv4_ADDRESS)); > - CopyMem (&VendorOption->McastIpBlock, PxeOption->Data + 4, sizeof > (VendorOption->McastIpBlock)); > - CopyMem (&VendorOption->McastIpRange, PxeOption->Data + 6, sizeof > (VendorOption->McastIpRange)); > - break; > - > - case PXEBC_VENDOR_TAG_CREDENTIAL_TYPES: > - > - VendorOption->CredTypeLen = PxeOption->Length; > - VendorOption->CredType = (UINT32 *) PxeOption->Data; > - break; > - > - case PXEBC_VENDOR_TAG_BOOT_ITEM: > - > - CopyMem (&VendorOption->BootSrvType, PxeOption->Data, sizeof > (VendorOption->BootSrvType)); > - CopyMem (&VendorOption->BootSrvLayer, PxeOption->Data + 2, sizeof > (VendorOption->BootSrvLayer)); > - break; > - } > - > - SET_VENDOR_OPTION_BIT_MAP (BitMap, PxeOption->OpCode); > - > - if (PxeOption->OpCode == DHCP4_TAG_PAD) { > - Offset++; > - } else { > - Offset = (UINT8) (Offset + PxeOption->Length + 2); > - } > - > - PxeOption = (EFI_DHCP4_PACKET_OPTION *) (Dhcp4Option->Data + > Offset); > - } > - > - // > - // FixMe, return falas if invalid of any vendor option > - // > - > - return TRUE; > -} > - > - > -/** > - This function display boot item detail. > - > - If the length of the boot item string over 70 Char, just display 70 Char. > - > - @param Str Pointer to a string (boot item string). > - @param Len The length of string. > - > -**/ > -VOID > -PxeBcDisplayBootItem ( > - IN UINT8 *Str, > - IN UINT8 Len > - ) > -{ > - UINT8 Tmp; > - > - Len = (UINT8) MIN (70, Len); > - Tmp = Str[Len]; > - Str[Len] = 0; > - AsciiPrint ("%a \n", Str); > - Str[Len] = Tmp; > -} > - > - > -/** > - Choose the boot prompt. > - > - @param Private Pointer to PxeBc private data. > - > - @retval EFI_SUCCESS Select boot prompt done. > - @retval EFI_TIMEOUT Select boot prompt time out. > - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. > - @retval EFI_ABORTED User cancel the operation. > - @retval EFI_NOT_READY Read the input key from the keybroad has not > finish. > - > -**/ > -EFI_STATUS > -PxeBcSelectBootPrompt ( > - IN PXEBC_PRIVATE_DATA *Private > - ) > -{ > - PXEBC_CACHED_DHCP4_PACKET *Packet; > - PXEBC_VENDOR_OPTION *VendorOpt; > - EFI_EVENT TimeoutEvent; > - EFI_EVENT DescendEvent; > - EFI_INPUT_KEY InputKey; > - EFI_STATUS Status; > - UINT8 Timeout; > - UINT8 *Prompt; > - UINT8 PromptLen; > - INT32 SecCol; > - INT32 SecRow; > - > - TimeoutEvent = NULL; > - DescendEvent = NULL; > - > - if (Private->PxeBc.Mode->ProxyOfferReceived) { > - > - Packet = &Private->ProxyOffer; > - } else { > - > - Packet = &Private->Dhcp4Ack; > - } > - > - if (Packet->OfferType != DHCP4_PACKET_TYPE_PXE10) { > - return EFI_NOT_FOUND; > - } > - > - VendorOpt = &Packet->PxeVendorOption; > - // > - // According to the PXE specification 2.1, Table 2-1 PXE DHCP Options (Full > - // List), we must not consider a boot prompt or boot menu if all of the > - // following hold: > - // - the PXE_DISCOVERY_CONTROL PXE tag is present inside the Vendor > Options > - // (=43) DHCP tag, and > - // - the PXE_DISCOVERY_CONTROL PXE tag has bit 3 set, and > - // - a boot file name has been presented with DHCP option 67. > - // > - if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) && > - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { > - return EFI_ABORTED; > - } > - > - if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) { > - return EFI_SUCCESS; > - } > - > - Timeout = VendorOpt->MenuPrompt->Timeout; > - Prompt = VendorOpt->MenuPrompt->Prompt; > - PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1); > - > - if (Timeout == 0) { > - return EFI_SUCCESS; > - } > - > - if (Timeout == 255) { > - return EFI_TIMEOUT; > - } > - > - Status = gBS->CreateEvent ( > - EVT_TIMER, > - TPL_CALLBACK, > - NULL, > - NULL, > - &TimeoutEvent > - ); > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Status = gBS->SetTimer ( > - TimeoutEvent, > - TimerRelative, > - MultU64x32 (Timeout, TICKS_PER_SECOND) > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - Status = gBS->CreateEvent ( > - EVT_TIMER, > - TPL_CALLBACK, > - NULL, > - NULL, > - &DescendEvent > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - Status = gBS->SetTimer ( > - DescendEvent, > - TimerPeriodic, > - TICKS_PER_SECOND > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - SecCol = gST->ConOut->Mode->CursorColumn; > - SecRow = gST->ConOut->Mode->CursorRow; > - > - PxeBcDisplayBootItem (Prompt, PromptLen); > - > - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, > SecRow); > - AsciiPrint ("(%d) ", Timeout--); > - > - while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { > - > - if (!EFI_ERROR (gBS->CheckEvent (DescendEvent))) { > - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, > SecRow); > - AsciiPrint ("(%d) ", Timeout--); > - } > - > - if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == > EFI_NOT_READY) { > - > - gBS->Stall (10 * TICKS_PER_MS); > - continue; > - } > - > - if (InputKey.ScanCode == 0) { > - > - switch (InputKey.UnicodeChar) { > - case CTRL ('c'): > - Status = EFI_ABORTED; > - break; > - > - case CTRL ('m'): > - case 'm': > - case 'M': > - Status = EFI_TIMEOUT; > - break; > - > - default: > - continue; > - } > - } else { > - > - switch (InputKey.ScanCode) { > - case SCAN_F8: > - Status = EFI_TIMEOUT; > - break; > - > - case SCAN_ESC: > - Status = EFI_ABORTED; > - break; > - > - default: > - continue; > - } > - } > - > - break; > - } > - > - gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1); > - > -ON_EXIT: > - > - if (DescendEvent != NULL) { > - gBS->CloseEvent (DescendEvent); > - } > - > - if (TimeoutEvent != NULL) { > - gBS->CloseEvent (TimeoutEvent); > - } > - > - return Status; > -} > - > - > -/** > - Select the boot menu. > - > - @param Private Pointer to PxeBc private data. > - @param Type The type of the menu. > - @param UseDefaultItem Use default item or not. > - > - @retval EFI_ABORTED User cancel operation. > - @retval EFI_SUCCESS Select the boot menu success. > - @retval EFI_NOT_READY Read the input key from the keybroad has not > finish. > - > -**/ > -EFI_STATUS > -PxeBcSelectBootMenu ( > - IN PXEBC_PRIVATE_DATA *Private, > - OUT UINT16 *Type, > - IN BOOLEAN UseDefaultItem > - ) > -{ > - PXEBC_CACHED_DHCP4_PACKET *Packet; > - PXEBC_VENDOR_OPTION *VendorOpt; > - EFI_INPUT_KEY InputKey; > - UINT8 MenuSize; > - UINT8 MenuNum; > - INT32 TopRow; > - UINT16 Select; > - UINT16 LastSelect; > - UINT8 Index; > - BOOLEAN Finish; > - CHAR8 Blank[70]; > - PXEBC_BOOT_MENU_ENTRY *MenuItem; > - PXEBC_BOOT_MENU_ENTRY *MenuArray[PXEBC_MAX_MENU_NUM]; > - > - Finish = FALSE; > - Select = 0; > - Index = 0; > - *Type = 0; > - > - if (Private->PxeBc.Mode->ProxyOfferReceived) { > - > - Packet = &Private->ProxyOffer; > - } else { > - > - Packet = &Private->Dhcp4Ack; > - } > - > - ASSERT (Packet->OfferType == DHCP4_PACKET_TYPE_PXE10); > - > - VendorOpt = &Packet->PxeVendorOption; > - > - if (!IS_VALID_BOOT_MENU (VendorOpt->BitMap)) { > - return EFI_SUCCESS; > - } > - > - SetMem (Blank, sizeof(Blank), ' '); > - > - MenuSize = VendorOpt->BootMenuLen; > - MenuItem = VendorOpt->BootMenu; > - > - if (MenuSize == 0) { > - return EFI_NOT_READY; > - } > - > - while (MenuSize > 0) { > - MenuArray[Index++] = MenuItem; > - MenuSize = (UINT8) (MenuSize - (MenuItem->DescLen + 3)); > - MenuItem = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + > MenuItem->DescLen + 3); > - if (Index >= PXEBC_MAX_MENU_NUM) { > - break; > - } > - } > - > - if (UseDefaultItem) { > - *Type = MenuArray[0]->Type; > - *Type = NTOHS (*Type); > - return EFI_SUCCESS; > - } > - > - MenuNum = Index; > - > - for (Index = 0; Index < MenuNum; Index++) { > - PxeBcDisplayBootItem (MenuArray[Index]->DescStr, MenuArray[Index]- > >DescLen); > - } > - > - TopRow = gST->ConOut->Mode->CursorRow - MenuNum; > - > - do { > - ASSERT (Select < PXEBC_MAX_MENU_NUM); > - // > - // highlight selected row > - // > - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, > EFI_LIGHTGRAY)); > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Select); > - Blank[MenuArray[Select]->DescLen] = 0; > - AsciiPrint ("%a\r", Blank); > - PxeBcDisplayBootItem (MenuArray[Select]->DescStr, MenuArray[Select]- > >DescLen); > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); > - LastSelect = Select; > - > - while (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == > EFI_NOT_READY) { > - gBS->Stall (10 * TICKS_PER_MS); > - } > - > - if (InputKey.ScanCode == 0) { > - switch (InputKey.UnicodeChar) { > - case CTRL ('c'): > - InputKey.ScanCode = SCAN_ESC; > - break; > - > - case CTRL ('j'): /* linefeed */ > - case CTRL ('m'): /* return */ > - Finish = TRUE; > - break; > - > - case CTRL ('i'): /* tab */ > - case ' ': > - case 'd': > - case 'D': > - InputKey.ScanCode = SCAN_DOWN; > - break; > - > - case CTRL ('h'): /* backspace */ > - case 'u': > - case 'U': > - InputKey.ScanCode = SCAN_UP; > - break; > - > - default: > - InputKey.ScanCode = 0; > - } > - } > - > - switch (InputKey.ScanCode) { > - case SCAN_LEFT: > - case SCAN_UP: > - if (Select > 0) { > - --Select; > - } > - > - break; > - > - case SCAN_DOWN: > - case SCAN_RIGHT: > - if (++Select == MenuNum) { > - --Select; > - } > - > - break; > - > - case SCAN_PAGE_UP: > - case SCAN_HOME: > - Select = 0; > - break; > - > - case SCAN_PAGE_DOWN: > - case SCAN_END: > - Select = (UINT16) (MenuNum - 1); > - break; > - > - case SCAN_ESC: > - return EFI_ABORTED; > - } > - > - /* unhighlight last selected row */ > - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR > (EFI_LIGHTGRAY, EFI_BLACK)); > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + LastSelect); > - Blank[MenuArray[LastSelect]->DescLen] = 0; > - AsciiPrint ("%a\r", Blank); > - PxeBcDisplayBootItem (MenuArray[LastSelect]->DescStr, > MenuArray[LastSelect]->DescLen); > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); > - } while (!Finish); > - > - ASSERT (Select < PXEBC_MAX_MENU_NUM); > - > - // > - // Swap the byte order > - // > - CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16)); > - *Type = NTOHS (*Type); > - > - return EFI_SUCCESS; > -} > - > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > deleted file mode 100644 > index 76c140d8e3ff..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > +++ /dev/null > @@ -1,665 +0,0 @@ > -/** @file > - The driver binding for UEFI PXEBC protocol. > - > -Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "PxeBcImpl.h" > - > -EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = { > - PxeBcDriverBindingSupported, > - PxeBcDriverBindingStart, > - PxeBcDriverBindingStop, > - 0xa, > - NULL, > - NULL > -}; > - > -/** > - This is the declaration of an EFI image entry point. This entry point is > - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including > - both device drivers and bus drivers. > - > - @param ImageHandle The firmware allocated handle for the UEFI > image. > - @param SystemTable A pointer to the EFI System Table. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > due to a lack of resources. > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDriverEntryPoint ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ) > -{ > - return EfiLibInstallDriverBindingComponentName2 ( > - ImageHandle, > - SystemTable, > - &gPxeBcDriverBinding, > - ImageHandle, > - &gPxeBcComponentName, > - &gPxeBcComponentName2 > - ); > -} > - > - > -/** > - Test to see if this driver supports ControllerHandle. This service > - is called by the EFI boot service ConnectController(). In > - order to make drivers as small as possible, there are a few calling > - restrictions for this service. ConnectController() must > - follow these calling restrictions. If any other agent wishes to call > - Supported() it must also follow these calling restrictions. > - PxeBc requires DHCP4 and MTFTP4 protocols. > - > - @param This Protocol instance pointer. > - @param ControllerHandle Handle of device to test > - @param RemainingDevicePath Optional parameter use to pick a specific > child > - device to start. > - > - @retval EFI_SUCCESS This driver supports this device > - @retval EFI_ALREADY_STARTED This driver is already running on this device > - @retval other This driver does not support this device > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDriverBindingSupported ( > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > - ) > -{ > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > - EFI_STATUS Status; > - > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiPxeBaseCodeProtocolGuid, > - (VOID **) &PxeBc, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - > - if (!EFI_ERROR (Status)) { > - return EFI_ALREADY_STARTED; > - } > - > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiDhcp4ServiceBindingProtocolGuid, > - NULL, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > - ); > - > - if (!EFI_ERROR (Status)) { > - > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiMtftp4ServiceBindingProtocolGuid, > - NULL, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > - ); > - > - } > - > - return Status; > -} > - > - > -/** > - Start this driver on ControllerHandle. This service is called by the > - EFI boot service ConnectController(). In order to make > - drivers as small as possible, there are a few calling restrictions for > - this service. ConnectController() must follow these > - calling restrictions. If any other agent wishes to call Start() it > - must also follow these calling restrictions. > - > - @param This Protocol instance pointer. > - @param ControllerHandle Handle of device to bind driver to > - @param RemainingDevicePath Optional parameter use to pick a specific > child > - device to start. > - > - @retval EFI_SUCCESS This driver is added to ControllerHandle > - @retval EFI_ALREADY_STARTED This driver is already running on > ControllerHandle > - @retval other This driver does not support this device > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDriverBindingStart ( > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - UINTN Index; > - EFI_STATUS Status; > - EFI_IP4_MODE_DATA Ip4ModeData; > - > - Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA)); > - if (Private == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE; > - Private->Controller = ControllerHandle; > - Private->Image = This->DriverBindingHandle; > - CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private- > >PxeBc)); > - Private->PxeBc.Mode = &Private->Mode; > - CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof > (Private->LoadFile)); > - > - Private->ProxyOffer.Packet.Offer.Size = > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > - Private->Dhcp4Ack.Packet.Ack.Size = > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > - Private->PxeReply.Packet.Ack.Size = > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > - > - for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) { > - Private->Dhcp4Offers[Index].Packet.Offer.Size = > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > - } > - > - // > - // Get the NII interface if it exists. > - // > - Status = gBS->OpenProtocol ( > - ControllerHandle, > - &gEfiNetworkInterfaceIdentifierProtocolGuid_31, > - (VOID **) &Private->Nii, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - if (EFI_ERROR (Status)) { > - Private->Nii = NULL; > - } > - > - Status = NetLibCreateServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiArpServiceBindingProtocolGuid, > - &Private->ArpChild > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->OpenProtocol ( > - Private->ArpChild, > - &gEfiArpProtocolGuid, > - (VOID **) &Private->Arp, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = NetLibCreateServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiDhcp4ServiceBindingProtocolGuid, > - &Private->Dhcp4Child > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->OpenProtocol ( > - Private->Dhcp4Child, > - &gEfiDhcp4ProtocolGuid, > - (VOID **) &Private->Dhcp4, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = NetLibCreateServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiIp4ServiceBindingProtocolGuid, > - &Private->Ip4Child > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->OpenProtocol ( > - Private->Ip4Child, > - &gEfiIp4ProtocolGuid, > - (VOID **) &Private->Ip4, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - // > - // Get max packet size from Ip4 to calculate block size for Tftp later. > - // > - Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, > NULL); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize; > - > - Status = NetLibCreateServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiMtftp4ServiceBindingProtocolGuid, > - &Private->Mtftp4Child > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->OpenProtocol ( > - Private->Mtftp4Child, > - &gEfiMtftp4ProtocolGuid, > - (VOID **) &Private->Mtftp4, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = NetLibCreateServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiUdp4ServiceBindingProtocolGuid, > - &Private->Udp4ReadChild > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - // > - // The UDP instance for EfiPxeBcUdpRead > - // > - Status = gBS->OpenProtocol ( > - Private->Udp4ReadChild, > - &gEfiUdp4ProtocolGuid, > - (VOID **) &Private->Udp4Read, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - // > - // The UDP instance for EfiPxeBcUdpWrite > - // > - Status = NetLibCreateServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiUdp4ServiceBindingProtocolGuid, > - &Private->Udp4WriteChild > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - Status = gBS->OpenProtocol ( > - Private->Udp4WriteChild, > - &gEfiUdp4ProtocolGuid, > - (VOID **) &Private->Udp4Write, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_BY_DRIVER > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA)); > - Private->Udp4CfgData.AcceptBroadcast = FALSE; > - Private->Udp4CfgData.AcceptPromiscuous = FALSE; > - Private->Udp4CfgData.AcceptAnyPort = TRUE; > - Private->Udp4CfgData.AllowDuplicatePort = TRUE; > - Private->Udp4CfgData.TypeOfService = DEFAULT_ToS; > - Private->Udp4CfgData.TimeToLive = DEFAULT_TTL; > - Private->Udp4CfgData.DoNotFragment = FALSE; > - Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; > - Private->Udp4CfgData.UseDefaultAddress = FALSE; > - > - PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read); > - Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen; > - CopyMem (&Private->Mac, &Private- > >SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen); > - > - > - ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA)); > - Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP; > - Private->Ip4ConfigData.AcceptIcmpErrors = TRUE; > - Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS; > - Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL; > - Private->Ip4ConfigData.DoNotFragment = FALSE; > - Private->Ip4ConfigData.RawData = FALSE; > - > - Status = gBS->InstallMultipleProtocolInterfaces ( > - &ControllerHandle, > - &gEfiPxeBaseCodeProtocolGuid, > - &Private->PxeBc, > - &gEfiLoadFileProtocolGuid, > - &Private->LoadFile, > - NULL > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - // > - // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy. > - // > - Status = gBS->HandleProtocol ( > - ControllerHandle, > - &gEfiIp4Config2ProtocolGuid, > - (VOID **) &Private->Ip4Config2 > - ); > - if (EFI_ERROR (Status)) { > - goto ON_ERROR; > - } > - > - return EFI_SUCCESS; > - > -ON_ERROR: > - > - if (Private->Udp4WriteChild != NULL) { > - gBS->CloseProtocol ( > - Private->Udp4WriteChild, > - &gEfiUdp4ProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - NetLibDestroyServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiUdp4ServiceBindingProtocolGuid, > - Private->Udp4WriteChild > - ); > - } > - > - if (Private->Udp4ReadChild != NULL) { > - gBS->CloseProtocol ( > - Private->Udp4ReadChild, > - &gEfiUdp4ProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - NetLibDestroyServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiUdp4ServiceBindingProtocolGuid, > - Private->Udp4ReadChild > - ); > - } > - > - if (Private->Mtftp4Child != NULL) { > - gBS->CloseProtocol ( > - Private->Mtftp4Child, > - &gEfiMtftp4ProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - > - NetLibDestroyServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiMtftp4ServiceBindingProtocolGuid, > - Private->Mtftp4Child > - ); > - } > - > - if (Private->Ip4Child != NULL) { > - gBS->CloseProtocol ( > - Private->Ip4Child, > - &gEfiIp4ProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - > - NetLibDestroyServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiIp4ServiceBindingProtocolGuid, > - Private->Ip4Child > - ); > - } > - > - if (Private->Dhcp4Child != NULL) { > - gBS->CloseProtocol ( > - Private->Dhcp4Child, > - &gEfiDhcp4ProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - > - NetLibDestroyServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiDhcp4ServiceBindingProtocolGuid, > - Private->Dhcp4Child > - ); > - } > - > - if (Private->ArpChild != NULL) { > - gBS->CloseProtocol ( > - Private->ArpChild, > - &gEfiArpProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - > - NetLibDestroyServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiArpServiceBindingProtocolGuid, > - Private->ArpChild > - ); > - } > - > - FreePool (Private); > - > - return Status; > -} > - > - > -/** > - Stop this driver on ControllerHandle. This service is called by the > - EFI boot service DisconnectController(). In order to > - make drivers as small as possible, there are a few calling > - restrictions for this service. DisconnectController() > - must follow these calling restrictions. If any other agent wishes > - to call Stop() it must also follow these calling restrictions. > - > - @param This Protocol instance pointer. > - @param ControllerHandle Handle of device to stop driver on > - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If > number of > - children is zero stop the entire bus driver. > - @param ChildHandleBuffer List of Child Handles to Stop. > - > - @retval EFI_SUCCESS This driver is removed ControllerHandle > - @retval other This driver was not removed from this device > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDriverBindingStop ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN UINTN NumberOfChildren, > - IN EFI_HANDLE *ChildHandleBuffer > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > - EFI_HANDLE NicHandle; > - EFI_STATUS Status; > - > - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid); > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiDhcp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiIp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiUdp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiMtftp4ProtocolGuid); > - > - if (NicHandle == NULL) { > - return EFI_SUCCESS; > - } > - } > - } > - } > - } > - > - Status = gBS->OpenProtocol ( > - NicHandle, > - &gEfiPxeBaseCodeProtocolGuid, > - (VOID **) &PxeBc, > - This->DriverBindingHandle, > - ControllerHandle, > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > - ); > - > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // Stop functionality of PXE Base Code protocol > - // > - Status = PxeBc->Stop (PxeBc); > - if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) { > - return Status; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc); > - > - Status = gBS->UninstallMultipleProtocolInterfaces ( > - NicHandle, > - &gEfiPxeBaseCodeProtocolGuid, > - &Private->PxeBc, > - &gEfiLoadFileProtocolGuid, > - &Private->LoadFile, > - NULL > - ); > - > - if (!EFI_ERROR (Status)) { > - > - gBS->CloseProtocol ( > - Private->Udp4WriteChild, > - &gEfiUdp4ProtocolGuid, > - This->DriverBindingHandle, > - NicHandle > - ); > - NetLibDestroyServiceChild ( > - ControllerHandle, > - This->DriverBindingHandle, > - &gEfiUdp4ServiceBindingProtocolGuid, > - Private->Udp4WriteChild > - ); > - > - gBS->CloseProtocol ( > - Private->Udp4ReadChild, > - &gEfiUdp4ProtocolGuid, > - This->DriverBindingHandle, > - NicHandle > - ); > - NetLibDestroyServiceChild ( > - NicHandle, > - This->DriverBindingHandle, > - &gEfiUdp4ServiceBindingProtocolGuid, > - Private->Udp4ReadChild > - ); > - > - gBS->CloseProtocol ( > - Private->Dhcp4Child, > - &gEfiDhcp4ProtocolGuid, > - This->DriverBindingHandle, > - NicHandle > - ); > - NetLibDestroyServiceChild ( > - NicHandle, > - This->DriverBindingHandle, > - &gEfiDhcp4ServiceBindingProtocolGuid, > - Private->Dhcp4Child > - ); > - > - gBS->CloseProtocol ( > - Private->Mtftp4Child, > - &gEfiMtftp4ProtocolGuid, > - This->DriverBindingHandle, > - NicHandle > - ); > - NetLibDestroyServiceChild ( > - NicHandle, > - This->DriverBindingHandle, > - &gEfiMtftp4ServiceBindingProtocolGuid, > - Private->Mtftp4Child > - ); > - > - gBS->CloseProtocol ( > - Private->Ip4Child, > - &gEfiIp4ProtocolGuid, > - This->DriverBindingHandle, > - NicHandle > - ); > - NetLibDestroyServiceChild ( > - NicHandle, > - This->DriverBindingHandle, > - &gEfiIp4ServiceBindingProtocolGuid, > - Private->Ip4Child > - ); > - > - gBS->CloseProtocol ( > - Private->ArpChild, > - &gEfiArpProtocolGuid, > - This->DriverBindingHandle, > - NicHandle > - ); > - NetLibDestroyServiceChild ( > - NicHandle, > - This->DriverBindingHandle, > - &gEfiArpServiceBindingProtocolGuid, > - Private->ArpChild > - ); > - > - FreePool (Private); > - } > - > - return Status; > -} > - > - > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > deleted file mode 100644 > index 3fa3be99c178..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > +++ /dev/null > @@ -1,2989 +0,0 @@ > -/** @file > - Interface routines for PxeBc. > - > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "PxeBcImpl.h" > - > -UINT32 mPxeDhcpTimeout[4] = { 4, 8, 16, 32 }; > - > -/** > - Get and record the arp cache. > - > - @param This Pointer to EFI_PXE_BC_PROTOCOL > - > - @retval EFI_SUCCESS Arp cache updated successfully > - @retval others If error occurs when getting arp cache > - > -**/ > -EFI_STATUS > -UpdateArpCache ( > - IN EFI_PXE_BASE_CODE_PROTOCOL * This > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_STATUS Status; > - UINT32 EntryLength; > - UINT32 EntryCount; > - EFI_ARP_FIND_DATA *Entries; > - UINT32 Index; > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - Status = Private->Arp->Find ( > - Private->Arp, > - TRUE, > - NULL, > - &EntryLength, > - &EntryCount, > - &Entries, > - TRUE > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - Mode->ArpCacheEntries = MIN ( > - EntryCount, > - EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES > - ); > - for (Index = 0; Index < Mode->ArpCacheEntries; Index ++) { > - CopyMem ( > - &Mode->ArpCache[Index].IpAddr, > - Entries + 1, > - Entries->SwAddressLength > - ); > - CopyMem ( > - &Mode->ArpCache[Index].MacAddr, > - (UINT8 *) (Entries + 1) + Entries->SwAddressLength, > - Entries->HwAddressLength > - ); > - // > - // Slip to the next FindData. > - // > - Entries = (EFI_ARP_FIND_DATA *) ((UINT8 *) Entries + EntryLength); > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Timeout routine to update arp cache. > - > - @param Event Pointer to EFI_PXE_BC_PROTOCOL > - @param Context Context of the timer event > - > -**/ > -VOID > -EFIAPI > -ArpCacheUpdateTimeout ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - UpdateArpCache ((EFI_PXE_BASE_CODE_PROTOCOL *) Context); > -} > - > -/** > - Do arp resolution from arp cache in PxeBcMode. > - > - @param PxeBcMode The PXE BC mode to look into. > - @param Ip4Addr The Ip4 address for resolution. > - @param MacAddress The resoluted MAC address if the resolution is > successful. > - The value is undefined if resolution fails. > - > - @retval TRUE The resolution is successful. > - @retval FALSE Otherwise. > - > -**/ > -BOOLEAN > -FindInArpCache ( > - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, > - IN EFI_IPv4_ADDRESS *Ip4Addr, > - OUT EFI_MAC_ADDRESS *MacAddress > - ) > -{ > - UINT32 Index; > - > - for (Index = 0; Index < PxeBcMode->ArpCacheEntries; Index ++) { > - if (EFI_IP4_EQUAL (&PxeBcMode->ArpCache[Index].IpAddr.v4, Ip4Addr)) > { > - CopyMem ( > - MacAddress, > - &PxeBcMode->ArpCache[Index].MacAddr, > - sizeof (EFI_MAC_ADDRESS) > - ); > - return TRUE; > - } > - } > - > - return FALSE; > -} > - > -/** > - Notify function for the ICMP receive token, used to process > - the received ICMP packets. > - > - @param Context The PXEBC private data. > - > -**/ > -VOID > -EFIAPI > -IcmpErrorListenHandlerDpc ( > - IN VOID *Context > - ) > -{ > - EFI_STATUS Status; > - EFI_IP4_RECEIVE_DATA *RxData; > - EFI_IP4_PROTOCOL *Ip4; > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - UINTN Index; > - UINT32 CopiedLen; > - UINT8 *CopiedPointer; > - > - Private = (PXEBC_PRIVATE_DATA *) Context; > - Mode = &Private->Mode; > - Status = Private->IcmpErrorRcvToken.Status; > - RxData = Private->IcmpErrorRcvToken.Packet.RxData; > - Ip4 = Private->Ip4; > - > - if (Status == EFI_ABORTED) { > - // > - // The reception is actively aborted by the consumer, directly return. > - // > - return; > - } > - > - if (RxData == NULL) { > - goto Resume; > - } > - > - if (Status != EFI_ICMP_ERROR) { > - // > - // The return status should be recognized as EFI_ICMP_ERROR. > - // > - goto CleanUp; > - } > - > - if (EFI_IP4 (RxData->Header->SourceAddress) != 0 && > - (NTOHL (Mode->SubnetMask.Addr[0]) != 0) && > - IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL > (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) > && > - !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL > (Mode->SubnetMask.Addr[0]))) { > - // > - // The source address is not zero and it's not a unicast IP address, discard it. > - // > - goto CleanUp; > - } > - > - if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode- > >StationIp.v4)) { > - // > - // The dest address is not equal to Station Ip address, discard it. > - // > - goto CleanUp; > - } > - > - // > - // Constructor ICMP error packet > - // > - CopiedLen = 0; > - CopiedPointer = (UINT8 *) &Mode->IcmpError; > - > - for (Index = 0; Index < RxData->FragmentCount; Index ++) { > - CopiedLen += RxData->FragmentTable[Index].FragmentLength; > - if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) { > - CopyMem ( > - CopiedPointer, > - RxData->FragmentTable[Index].FragmentBuffer, > - RxData->FragmentTable[Index].FragmentLength > - ); > - } else { > - CopyMem ( > - CopiedPointer, > - RxData->FragmentTable[Index].FragmentBuffer, > - CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR) > - ); > - } > - CopiedPointer += CopiedLen; > - } > - > -CleanUp: > - gBS->SignalEvent (RxData->RecycleSignal); > - > -Resume: > - Ip4->Receive (Ip4, &(Private->IcmpErrorRcvToken)); > -} > - > -/** > - Request IcmpErrorListenHandlerDpc as a DPC at TPL_CALLBACK > - > - @param Event The event signaled. > - @param Context The context passed in by the event notifier. > - > -**/ > -VOID > -EFIAPI > -IcmpErrorListenHandler ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - // > - // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK > - // > - QueueDpc (TPL_CALLBACK, IcmpErrorListenHandlerDpc, Context); > -} > - > -/** > - Enables the use of the PXE Base Code Protocol functions. > - > - This function enables the use of the PXE Base Code Protocol functions. If > the > - Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE, > then > - EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6 > formatted > - addresses will be used in this session. If UseIpv6 is FALSE, then IPv4 > formatted > - addresses will be used in this session. If UseIpv6 is TRUE, and the > Ipv6Supported > - field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then > EFI_UNSUPPORTED will > - be returned. If there is not enough memory or other resources to start the > PXE > - Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned. > Otherwise, the > - PXE Base Code Protocol will be started, and all of the fields of the > EFI_PXE_BASE_CODE_MODE > - structure will be initialized as follows: > - StartedSet to TRUE. > - Ipv6SupportedUnchanged. > - Ipv6AvailableUnchanged. > - UsingIpv6Set to UseIpv6. > - BisSupportedUnchanged. > - BisDetectedUnchanged. > - AutoArpSet to TRUE. > - SendGUIDSet to FALSE. > - TTLSet to DEFAULT_TTL. > - ToSSet to DEFAULT_ToS. > - DhcpCompletedSet to FALSE. > - ProxyOfferReceivedSet to FALSE. > - StationIpSet to an address of all zeros. > - SubnetMaskSet to a subnet mask of all zeros. > - DhcpDiscoverZero-filled. > - DhcpAckZero-filled. > - ProxyOfferZero-filled. > - PxeDiscoverValidSet to FALSE. > - PxeDiscoverZero-filled. > - PxeReplyValidSet to FALSE. > - PxeReplyZero-filled. > - PxeBisReplyValidSet to FALSE. > - PxeBisReplyZero-filled. > - IpFilterSet the Filters field to 0 and the IpCnt field to 0. > - ArpCacheEntriesSet to 0. > - ArpCacheZero-filled. > - RouteTableEntriesSet to 0. > - RouteTableZero-filled. > - IcmpErrorReceivedSet to FALSE. > - IcmpErrorZero-filled. > - TftpErroReceivedSet to FALSE. > - TftpErrorZero-filled. > - MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is > available. > - Set to FALSE if the PXE Base Code Callback Protocol is not available. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param UseIpv6 Specifies the type of IP addresses that are to be > used during the session > - that is being started. Set to TRUE for IPv6 addresses, and > FALSE for > - IPv4 addresses. > - > - @retval EFI_SUCCESS The PXE Base Code Protocol was started. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this oper > - @retval EFI_UNSUPPORTED UseIpv6 is TRUE, but the Ipv6Supported > field of the > - EFI_PXE_BASE_CODE_MODE structure is FALSE. > - @retval EFI_ALREADY_STARTED The PXE Base Code Protocol is already in > the started state. > - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not > point to a valid > - EFI_PXE_BASE_CODE_PROTOCOL structure. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory or > other resources to start the > - PXE Base Code Protocol. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcStart ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN BOOLEAN UseIpv6 > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_STATUS Status; > - > - if (This == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - if (Mode->Started) { > - return EFI_ALREADY_STARTED; > - } > - > - if (UseIpv6) { > - // > - // IPv6 is not supported now. > - // > - return EFI_UNSUPPORTED; > - } > - > - AsciiPrint ("\n>>Start PXE over IPv4"); > - > - // > - // Configure the udp4 instance to let it receive data > - // > - Status = Private->Udp4Read->Configure ( > - Private->Udp4Read, > - &Private->Udp4CfgData > - ); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - > - // > - // Configure block size for TFTP as a default value to handle all link layers. > - // > - Private->BlockSize = MIN (Private->Ip4MaxPacketSize, > PXEBC_DEFAULT_PACKET_SIZE) - > - PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - > PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE; > - // > - // If PcdTftpBlockSize is set to non-zero, override the default value. > - // > - if (PcdGet64 (PcdTftpBlockSize) != 0) { > - Private->BlockSize = (UINTN) PcdGet64 (PcdTftpBlockSize); > - } > - > - Private->AddressIsOk = FALSE; > - > - ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE)); > - > - Mode->Started = TRUE; > - Mode->TTL = DEFAULT_TTL; > - Mode->ToS = DEFAULT_ToS; > - Mode->AutoArp = TRUE; > - > - // > - // Create the event for Arp Cache checking. > - // > - Status = gBS->CreateEvent ( > - EVT_TIMER | EVT_NOTIFY_SIGNAL, > - TPL_CALLBACK, > - ArpCacheUpdateTimeout, > - This, > - &Private->GetArpCacheEvent > - ); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - // > - // Start the timeout timer event. > - // > - Status = gBS->SetTimer ( > - Private->GetArpCacheEvent, > - TimerPeriodic, > - TICKS_PER_SECOND > - ); > - > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - // > - // Create ICMP error receiving event > - // > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - IcmpErrorListenHandler, > - Private, > - &(Private->IcmpErrorRcvToken.Event) > - ); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - // > - //DHCP4 service allows only one of its children to be configured in > - //the active state, If the DHCP4 D.O.R.A started by IP4 auto > - //configuration and has not been completed, the Dhcp4 state machine > - //will not be in the right state for the PXE to start a new round D.O.R.A. > - //so we need to switch it's policy to static. > - // > - Status = PxeBcSetIp4Policy (Private); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - // > - // start to listen incoming packet > - // > - Status = Private->Ip4->Receive (Private->Ip4, &Private- > >IcmpErrorRcvToken); > - if (!EFI_ERROR (Status)) { > - return Status; > - } > - > -ON_EXIT: > - Private->Ip4->Configure (Private->Ip4, NULL); > - > - if (Private->IcmpErrorRcvToken.Event != NULL) { > - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); > - } > - > - if (Private->GetArpCacheEvent != NULL) { > - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); > - gBS->CloseEvent (Private->GetArpCacheEvent); > - } > - > - Mode->Started = FALSE; > - Mode->TTL = 0; > - Mode->ToS = 0; > - Mode->AutoArp = FALSE; > - > - return Status; > -} > - > - > -/** > - Disables the use of the PXE Base Code Protocol functions. > - > - This function stops all activity on the network device. All the resources > allocated > - in Start() are released, the Started field of the EFI_PXE_BASE_CODE_MODE > structure is > - set to FALSE and EFI_SUCCESS is returned. If the Started field of the > EFI_PXE_BASE_CODE_MODE > - structure is already FALSE, then EFI_NOT_STARTED will be returned. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - > - @retval EFI_SUCCESS The PXE Base Code Protocol was stopped. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is already in the > stopped state. > - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not > point to a valid > - EFI_PXE_BASE_CODE_PROTOCOL structure. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcStop ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - > - if (This == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - Private->Ip4->Cancel (Private->Ip4, NULL); > - // > - // Dispatch the DPCs queued by the NotifyFunction of the canceled rx > token's > - // events. > - // > - DispatchDpc (); > - > - Private->Ip4->Configure (Private->Ip4, NULL); > - > - // > - // Close the ICMP error receiving event. > - // > - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); > - > - // > - // Cancel the TimeoutEvent timer. > - // > - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); > - > - // > - // Close the TimeoutEvent event. > - // > - gBS->CloseEvent (Private->GetArpCacheEvent); > - > - Mode->Started = FALSE; > - > - Private->CurrentUdpSrcPort = 0; > - Private->Udp4Write->Configure (Private->Udp4Write, NULL); > - Private->Udp4Read->Groups (Private->Udp4Read, FALSE, NULL); > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > - > - Private->Dhcp4->Stop (Private->Dhcp4); > - Private->Dhcp4->Configure (Private->Dhcp4, NULL); > - > - Private->FileSize = 0; > - > - return EFI_SUCCESS; > -} > - > - > -/** > - Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request / > acknowledge) or DHCPv6 > - S.A.R.R (solicit / advertise / request / reply) sequence. > - > - This function attempts to complete the DHCP sequence. If this sequence is > completed, > - then EFI_SUCCESS is returned, and the DhcpCompleted, > ProxyOfferReceived, StationIp, > - SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the > EFI_PXE_BASE_CODE_MODE > - structure are filled in. > - If SortOffers is TRUE, then the cached DHCP offer packets will be sorted > before > - they are tried. If SortOffers is FALSE, then the cached DHCP offer packets > will > - be tried in the order in which they are received. Please see the Preboot > Execution > - Environment (PXE) Specification for additional details on the > implementation of DHCP. > - This function can take at least 31 seconds to timeout and return control to > the > - caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will be > returned. > - If the Callback Protocol does not return > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > - then the DHCP sequence will be stopped and EFI_ABORTED will be > returned. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param SortOffers TRUE if the offers received should be sorted. Set > to FALSE to try the > - offers in the order that they are received. > - > - @retval EFI_SUCCESS Valid DHCP has completed. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not > point to a valid > - EFI_PXE_BASE_CODE_PROTOCOL structure. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to > complete the DHCP Protocol. > - @retval EFI_ABORTED The callback function aborted the DHCP > Protocol. > - @retval EFI_TIMEOUT The DHCP Protocol timed out. > - @retval EFI_ICMP_ERROR An ICMP error packet was received during > the DHCP session. > - @retval EFI_NO_RESPONSE Valid PXE offer was not received. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcDhcp ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN BOOLEAN SortOffers > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_DHCP4_PROTOCOL *Dhcp4; > - EFI_DHCP4_CONFIG_DATA Dhcp4CfgData; > - EFI_DHCP4_MODE_DATA Dhcp4Mode; > - EFI_DHCP4_PACKET_OPTION > *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; > - UINT32 OptCount; > - EFI_STATUS Status; > - EFI_ARP_CONFIG_DATA ArpConfigData; > - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; > - > - if (This == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Status = EFI_SUCCESS; > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - Dhcp4 = Private->Dhcp4; > - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DHCP; > - Private->SortOffers = SortOffers; > - > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - Mode->IcmpErrorReceived = FALSE; > - > - // > - // Stop Udp4Read instance > - // > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > - > - // > - // Initialize the DHCP options and build the option list > - // > - OptCount = PxeBcBuildDhcpOptions (Private, OptList, TRUE); > - > - // > - // Set the DHCP4 config data. > - // The four discovery timeouts are 4, 8, 16, 32 seconds respectively. > - // > - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); > - Dhcp4CfgData.OptionCount = OptCount; > - Dhcp4CfgData.OptionList = OptList; > - Dhcp4CfgData.Dhcp4Callback = PxeBcDhcpCallBack; > - Dhcp4CfgData.CallbackContext = Private; > - Dhcp4CfgData.DiscoverTryCount = 4; > - Dhcp4CfgData.DiscoverTimeout = mPxeDhcpTimeout; > - > - Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - // > - // Zero those arrays to record the varies numbers of DHCP OFFERS. > - // > - Private->GotProxyOffer = FALSE; > - Private->NumOffers = 0; > - Private->BootpIndex = 0; > - ZeroMem (Private->ServerCount, sizeof (Private->ServerCount)); > - ZeroMem (Private->ProxyIndex, sizeof (Private->ProxyIndex)); > - > - Status = Dhcp4->Start (Dhcp4, NULL); > - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { > - if (Status == EFI_ICMP_ERROR) { > - Mode->IcmpErrorReceived = TRUE; > - } > - goto ON_EXIT; > - } > - > - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - ASSERT (Dhcp4Mode.State == Dhcp4Bound); > - > - CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof > (EFI_IPv4_ADDRESS)); > - CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof > (EFI_IPv4_ADDRESS)); > - CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof > (EFI_IPv4_ADDRESS)); > - > - CopyMem (&Mode->StationIp, &Private->StationIp, sizeof > (EFI_IPv4_ADDRESS)); > - CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof > (EFI_IPv4_ADDRESS)); > - > - // > - // Check the selected offer to see whether BINL is required, if no or BINL is > - // finished, set the various Mode members. > - // > - Status = PxeBcCheckSelectedOffer (Private); > - > - AsciiPrint ("\n Station IP address is "); > - > - PxeBcShowIp4Addr (&Private->StationIp.v4); > - AsciiPrint ("\n"); > - > -ON_EXIT: > - if (EFI_ERROR (Status)) { > - Dhcp4->Stop (Dhcp4); > - Dhcp4->Configure (Dhcp4, NULL); > - } else { > - // > - // Remove the previously configured option list and callback function > - // > - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); > - Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); > - > - Private->AddressIsOk = TRUE; > - > - if (!Mode->UsingIpv6) { > - // > - // If in IPv4 mode, configure the corresponding ARP with this new > - // station IP address. > - // > - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); > - > - ArpConfigData.SwAddressType = 0x0800; > - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); > - ArpConfigData.StationAddress = &Private->StationIp.v4; > - > - Private->Arp->Configure (Private->Arp, NULL); > - Private->Arp->Configure (Private->Arp, &ArpConfigData); > - > - // > - // Updated the route table. Fill the first entry. > - // > - Mode->RouteTableEntries = 1; > - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & > Private->SubnetMask.Addr[0]; > - Mode->RouteTable[0].SubnetMask.Addr[0] = Private- > >SubnetMask.Addr[0]; > - Mode->RouteTable[0].GwAddr.Addr[0] = 0; > - > - // > - // Create the default route entry if there is a default router. > - // > - if (Private->GatewayIp.Addr[0] != 0) { > - Mode->RouteTableEntries = 2; > - Mode->RouteTable[1].IpAddr.Addr[0] = 0; > - Mode->RouteTable[1].SubnetMask.Addr[0] = 0; > - Mode->RouteTable[1].GwAddr.Addr[0] = Private- > >GatewayIp.Addr[0]; > - } > - > - // > - // Flush new station IP address into Udp4CfgData and Ip4ConfigData > - // > - CopyMem (&Private->Udp4CfgData.StationAddress, &Private->StationIp, > sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Private->Udp4CfgData.SubnetMask, &Private- > >SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Private->Ip4ConfigData.StationAddress, &Private- > >StationIp, sizeof (EFI_IPv4_ADDRESS)); > - CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private- > >SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > - > - // > - // Reconfigure the Ip4 instance to capture background ICMP packets with > new station Ip address. > - // > - Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken); > - Private->Ip4->Configure (Private->Ip4, NULL); > - > - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - Status = Private->Ip4->Receive (Private->Ip4, &Private- > >IcmpErrorRcvToken); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - } > - } > - > - Private->Udp4Read->Configure (Private->Udp4Read, &Private- > >Udp4CfgData); > - > - // > - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP > - // receive filter list emptied and the filter set to > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > - // > - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); > - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; > - This->SetIpFilter (This, &IpFilter); > - > - return Status; > -} > - > - > -/** > - Attempts to complete the PXE Boot Server and/or boot image discovery > sequence. > - > - This function attempts to complete the PXE Boot Server and/or boot image > discovery > - sequence. If this sequence is completed, then EFI_SUCCESS is returned, > and the > - PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields of > the > - EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, then > the > - PxeBisReplyReceived and PxeBisReply fields of the > EFI_PXE_BASE_CODE_MODE structure > - will also be filled in. If UseBis is FALSE, then PxeBisReplyValid will be set to > FALSE. > - In the structure referenced by parameter Info, the PXE Boot Server list, > SrvList[], > - has two uses: It is the Boot Server IP address list used for unicast discovery > - (if the UseUCast field is TRUE), and it is the list used for Boot Server > verification > - (if the MustUseList field is TRUE). Also, if the MustUseList field in that > structure > - is TRUE and the AcceptAnyResponse field in the SrvList[] array is TRUE, any > Boot > - Server reply of that type will be accepted. If the AcceptAnyResponse field > is > - FALSE, only responses from Boot Servers with matching IP addresses will > be accepted. > - This function can take at least 10 seconds to timeout and return control to > the > - caller. If the Discovery sequence does not complete, then EFI_TIMEOUT > will be > - returned. Please see the Preboot Execution Environment (PXE) > Specification for > - additional details on the implementation of the Discovery sequence. > - If the Callback Protocol does not return > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > - then the Discovery sequence is stopped and EFI_ABORTED will be returned. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param Type The type of bootstrap to perform. > - @param Layer Pointer to the boot server layer number to discover, > which must be > - PXE_BOOT_LAYER_INITIAL when a new server type is being > - discovered. > - @param UseBis TRUE if Boot Integrity Services are to be used. > FALSE otherwise. > - @param Info Pointer to a data structure that contains additional > information on the > - type of discovery operation that is to be performed. > - > - @retval EFI_SUCCESS The Discovery sequence has been completed. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to > complete Discovery. > - @retval EFI_ABORTED The callback function aborted the Discovery > sequence. > - @retval EFI_TIMEOUT The Discovery sequence timed out. > - @retval EFI_ICMP_ERROR An ICMP error packet was received during > the PXE discovery > - session. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcDiscover ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN UINT16 Type, > - IN UINT16 *Layer, > - IN BOOLEAN UseBis, > - IN EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo; > - EFI_PXE_BASE_CODE_DISCOVER_INFO *CreatedInfo; > - EFI_PXE_BASE_CODE_SRVLIST *SrvList; > - EFI_PXE_BASE_CODE_SRVLIST DefaultSrvList; > - PXEBC_CACHED_DHCP4_PACKET *Packet; > - PXEBC_VENDOR_OPTION *VendorOpt; > - UINT16 Index; > - EFI_STATUS Status; > - PXEBC_BOOT_SVR_ENTRY *BootSvrEntry; > - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; > - > - if (This == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - BootSvrEntry = NULL; > - SrvList = NULL; > - CreatedInfo = NULL; > - Status = EFI_DEVICE_ERROR; > - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER; > - > - if (!Private->AddressIsOk) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - // > - // Stop Udp4Read instance > - // > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > - > - Mode->IcmpErrorReceived = FALSE; > - > - // > - // If layer isn't EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL, > - // use the previous setting; > - // If info isn't offered, > - // use the cached DhcpAck and ProxyOffer packets. > - // > - ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO)); > - if (*Layer != EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL) { > - > - if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode- > >PxeBisReplyReceived && UseBis)) { > - > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - > - DefaultInfo.IpCnt = 1; > - DefaultInfo.UseUCast = TRUE; > - > - DefaultSrvList.Type = Type; > - DefaultSrvList.AcceptAnyResponse = FALSE; > - DefaultSrvList.IpAddr.Addr[0] = Private->ServerIp.Addr[0]; > - > - SrvList = &DefaultSrvList; > - Info = &DefaultInfo; > - } else if (Info == NULL) { > - // > - // Create info by the cached packet before > - // > - Packet = (Mode->ProxyOfferReceived) ? &Private->ProxyOffer : > &Private->Dhcp4Ack; > - VendorOpt = &Packet->PxeVendorOption; > - > - if (!Mode->DhcpAckReceived || !IS_VALID_DISCOVER_VENDOR_OPTION > (VendorOpt->BitMap)) { > - // > - // Address is not acquired or no discovery options. > - // > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - > - DefaultInfo.UseMCast = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER > (VendorOpt->DiscoverCtrl); > - DefaultInfo.UseBCast = (BOOLEAN)!IS_DISABLE_BCAST_DISCOVER > (VendorOpt->DiscoverCtrl); > - DefaultInfo.MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST > (VendorOpt->DiscoverCtrl); > - DefaultInfo.UseUCast = DefaultInfo.MustUseList; > - > - if (DefaultInfo.UseMCast) { > - // > - // Get the multicast discover ip address from vendor option. > - // > - CopyMem ( > - &DefaultInfo.ServerMCastIp.Addr, > - &VendorOpt->DiscoverMcastIp, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - } > - > - DefaultInfo.IpCnt = 0; > - Info = &DefaultInfo; > - SrvList = Info->SrvList; > - > - if (DefaultInfo.MustUseList) { > - BootSvrEntry = VendorOpt->BootSvr; > - Status = EFI_INVALID_PARAMETER; > - > - while (((UINT8) (BootSvrEntry - VendorOpt->BootSvr)) < VendorOpt- > >BootSvrLen) { > - > - if (BootSvrEntry->Type == HTONS (Type)) { > - Status = EFI_SUCCESS; > - break; > - } > - > - BootSvrEntry = GET_NEXT_BOOT_SVR_ENTRY (BootSvrEntry); > - } > - > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - DefaultInfo.IpCnt = BootSvrEntry->IpCnt; > - > - if (DefaultInfo.IpCnt >= 1) { > - CreatedInfo = AllocatePool (sizeof (DefaultInfo) + (DefaultInfo.IpCnt - 1) > * sizeof (*SrvList)); > - if (CreatedInfo == NULL) { > - Status = EFI_OUT_OF_RESOURCES; > - goto ON_EXIT; > - > - } > - > - CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo)); > - Info = CreatedInfo; > - SrvList = Info->SrvList; > - } > - > - for (Index = 0; Index < DefaultInfo.IpCnt; Index++) { > - CopyMem (&SrvList[Index].IpAddr, &BootSvrEntry->IpAddr[Index], > sizeof (EFI_IPv4_ADDRESS)); > - SrvList[Index].AcceptAnyResponse = FALSE; > - SrvList[Index].Type = BootSvrEntry->Type; > - } > - } > - > - } else { > - > - SrvList = Info->SrvList; > - > - if (!SrvList[0].AcceptAnyResponse) { > - > - for (Index = 1; Index < Info->IpCnt; Index++) { > - if (SrvList[Index].AcceptAnyResponse) { > - break; > - } > - } > - > - if (Index != Info->IpCnt) { > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - } > - } > - > - if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info- > >MustUseList && Info->IpCnt == 0)) { > - > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - // > - // Execute discover by UniCast/BroadCast/MultiCast > - // > - if (Info->UseUCast) { > - > - for (Index = 0; Index < Info->IpCnt; Index++) { > - > - if (BootSvrEntry == NULL) { > - Private->ServerIp.Addr[0] = SrvList[Index].IpAddr.Addr[0]; > - } else { > - CopyMem ( > - &Private->ServerIp, > - &BootSvrEntry->IpAddr[Index], > - sizeof (EFI_IPv4_ADDRESS) > - ); > - } > - > - Status = PxeBcDiscvBootService ( > - Private, > - Type, > - Layer, > - UseBis, > - &SrvList[Index].IpAddr, > - 0, > - NULL, > - TRUE, > - &Private->PxeReply.Packet.Ack > - ); > - if (!EFI_ERROR (Status)) { > - break; > - } > - } > - > - } else if (Info->UseMCast) { > - > - Status = PxeBcDiscvBootService ( > - Private, > - Type, > - Layer, > - UseBis, > - &Info->ServerMCastIp, > - 0, > - NULL, > - TRUE, > - &Private->PxeReply.Packet.Ack > - ); > - > - } else if (Info->UseBCast) { > - > - Status = PxeBcDiscvBootService ( > - Private, > - Type, > - Layer, > - UseBis, > - NULL, > - Info->IpCnt, > - SrvList, > - TRUE, > - &Private->PxeReply.Packet.Ack > - ); > - } > - > - if (EFI_ERROR (Status) || !Mode->PxeReplyReceived || (!Mode- > >PxeBisReplyReceived && UseBis)) { > - if (Status == EFI_ICMP_ERROR) { > - Mode->IcmpErrorReceived = TRUE; > - } else { > - Status = EFI_DEVICE_ERROR; > - } > - goto ON_EXIT; > - } else { > - PxeBcParseCachedDhcpPacket (&Private->PxeReply); > - } > - > - if (Mode->PxeBisReplyReceived) { > - CopyMem ( > - &Private->ServerIp, > - &Mode->PxeReply.Dhcpv4.BootpSiAddr, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - } > - > - if (CreatedInfo != NULL) { > - FreePool (CreatedInfo); > - } > - > -ON_EXIT: > - > - Private->Udp4Read->Configure (Private->Udp4Read, &Private- > >Udp4CfgData); > - > - // > - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP > - // receive filter list emptied and the filter set to > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > - // > - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); > - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; > - This->SetIpFilter (This, &IpFilter); > - > - return Status; > -} > - > - > -/** > - Used to perform TFTP and MTFTP services. > - > - This function is used to perform TFTP and MTFTP services. This includes the > - TFTP operations to get the size of a file, read a directory, read a file, and > - write a file. It also includes the MTFTP operations to get the size of a file, > - read a directory, and read a file. The type of operation is specified by > Operation. > - If the callback function that is invoked during the TFTP/MTFTP operation > does > - not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then > EFI_ABORTED will > - be returned. > - For read operations, the return data will be placed in the buffer specified > by > - BufferPtr. If BufferSize is too small to contain the entire downloaded file, > - then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set > to zero > - or the size of the requested file (the size of the requested file is only > returned > - if the TFTP server supports TFTP options). If BufferSize is large enough for > the > - read operation, then BufferSize will be set to the size of the downloaded > file, > - and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() > services > - should use the get-file-size operations to determine the size of the > downloaded > - file prior to using the read-file operations-especially when downloading > large > - (greater than 64 MB) files-instead of making two calls to the read-file > operation. > - Following this recommendation will save time if the file is larger than > expected > - and the TFTP server does not support TFTP option extensions. Without > TFTP option > - extension support, the client has to download the entire file, counting and > discarding > - the received packets, to determine the file size. > - For write operations, the data to be sent is in the buffer specified by > BufferPtr. > - BufferSize specifies the number of bytes to send. If the write operation > completes > - successfully, then EFI_SUCCESS will be returned. > - For TFTP "get file size" operations, the size of the requested file or > directory > - is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP > server > - does not support options, the file will be downloaded into a bit bucket and > the > - length of the downloaded file will be returned. For MTFTP "get file size" > operations, > - if the MTFTP server does not support the "get file size" option, > EFI_UNSUPPORTED > - will be returned. > - This function can take up to 10 seconds to timeout and return control to the > caller. > - If the TFTP sequence does not complete, EFI_TIMEOUT will be returned. > - If the Callback Protocol does not return > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > - then the TFTP sequence is stopped and EFI_ABORTED will be returned. > - The format of the data returned from a TFTP read directory operation is a > null-terminated > - filename followed by a null-terminated information string, of the form > - "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - > note that > - the seconds field can be a decimal number), where the date and time are > UTC. For > - an MTFTP read directory command, there is additionally a null-terminated > multicast > - IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The > final > - entry is itself null-terminated, so that the final information string is > terminated > - with two null octets. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param Operation The type of operation to perform. > - @param BufferPtr A pointer to the data buffer. > - @param Overwrite Only used on write file operations. TRUE if a file > on a remote server can > - be overwritten. > - @param BufferSize For get-file-size operations, *BufferSize returns > the size of the > - requested file. > - @param BlockSize The requested block size to be used during a TFTP > transfer. > - @param ServerIp The TFTP / MTFTP server IP address. > - @param Filename A Null-terminated ASCII string that specifies a > directory name or a file > - name. > - @param Info Pointer to the MTFTP information. > - @param DontUseBuffer Set to FALSE for normal TFTP and MTFTP read > file operation. > - > - @retval EFI_SUCCESS The TFTP/MTFTP operation was completed. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval EFI_BUFFER_TOO_SMALL The buffer is not large enough to > complete the read operation. > - @retval EFI_ABORTED The callback function aborted the TFTP/MTFTP > operation. > - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. > - @retval EFI_ICMP_ERROR An ICMP error packet was received during > the MTFTP session. > - @retval EFI_TFTP_ERROR A TFTP error packet was received during the > MTFTP session. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcMtftp ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, > - IN OUT VOID *BufferPtr, > - IN BOOLEAN Overwrite, > - IN OUT UINT64 *BufferSize, > - IN UINTN *BlockSize OPTIONAL, > - IN EFI_IP_ADDRESS *ServerIp, > - IN UINT8 *Filename, > - IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL, > - IN BOOLEAN DontUseBuffer > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_MTFTP4_CONFIG_DATA Mtftp4Config; > - EFI_STATUS Status; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_MAC_ADDRESS TempMacAddr; > - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; > - > - if ((This == NULL) || > - (Filename == NULL) || > - (BufferSize == NULL) || > - ((ServerIp == NULL) || > - (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) || > - IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0])))) || > - ((BufferPtr == NULL) && DontUseBuffer) || > - ((BlockSize != NULL) && (*BlockSize < 512))) { > - > - return EFI_INVALID_PARAMETER; > - } > - > - Status = EFI_DEVICE_ERROR; > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = &Private->Mode; > - > - if (!Mode->AutoArp) { > - // > - // If AutoArp is set false, check arp cache > - // > - UpdateArpCache (This); > - if (!FindInArpCache (Mode, &ServerIp->v4, &TempMacAddr)) { > - return EFI_DEVICE_ERROR; > - } > - } > - > - // > - // Stop Udp4Read instance > - // > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > - > - Mode->TftpErrorReceived = FALSE; > - Mode->IcmpErrorReceived = FALSE; > - > - Mtftp4Config.UseDefaultSetting = FALSE; > - Mtftp4Config.TimeoutValue = PXEBC_MTFTP_TIMEOUT; > - Mtftp4Config.TryCount = PXEBC_MTFTP_RETRIES; > - > - CopyMem ( > - &Mtftp4Config.StationIp, > - &Private->StationIp, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - CopyMem ( > - &Mtftp4Config.SubnetMask, > - &Private->SubnetMask, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - CopyMem ( > - &Mtftp4Config.GatewayIp, > - &Private->GatewayIp, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - CopyMem ( > - &Mtftp4Config.ServerIp, > - ServerIp, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - > - switch (Operation) { > - > - case EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE: > - > - Status = PxeBcTftpGetFileSize ( > - Private, > - &Mtftp4Config, > - Filename, > - BlockSize, > - BufferSize > - ); > - > - break; > - > - case EFI_PXE_BASE_CODE_TFTP_READ_FILE: > - > - Status = PxeBcTftpReadFile ( > - Private, > - &Mtftp4Config, > - Filename, > - BlockSize, > - BufferPtr, > - BufferSize, > - DontUseBuffer > - ); > - > - break; > - > - case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE: > - > - Status = PxeBcTftpWriteFile ( > - Private, > - &Mtftp4Config, > - Filename, > - Overwrite, > - BlockSize, > - BufferPtr, > - BufferSize > - ); > - > - break; > - > - case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY: > - > - Status = PxeBcTftpReadDirectory ( > - Private, > - &Mtftp4Config, > - Filename, > - BlockSize, > - BufferPtr, > - BufferSize, > - DontUseBuffer > - ); > - > - break; > - > - case EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE: > - case EFI_PXE_BASE_CODE_MTFTP_READ_FILE: > - case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY: > - Status = EFI_UNSUPPORTED; > - break; > - > - default: > - > - Status = EFI_INVALID_PARAMETER; > - break; > - } > - > - if (Status == EFI_ICMP_ERROR) { > - Mode->IcmpErrorReceived = TRUE; > - } > - > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > -ON_EXIT: > - Private->Udp4Read->Configure (Private->Udp4Read, &Private- > >Udp4CfgData); > - // > - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP > - // receive filter list emptied and the filter set to > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > - // > - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); > - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; > - This->SetIpFilter (This, &IpFilter); > - > - return Status; > -} > - > - > -/** > - Writes a UDP packet to the network interface. > - > - This function writes a UDP packet specified by the (optional HeaderPtr and) > - BufferPtr parameters to the network interface. The UDP header is > automatically > - built by this routine. It uses the parameters OpFlags, DestIp, DestPort, > GatewayIp, > - SrcIp, and SrcPort to build this header. If the packet is successfully built and > - transmitted through the network interface, then EFI_SUCCESS will be > returned. > - If a timeout occurs during the transmission of the packet, then > EFI_TIMEOUT will > - be returned. If an ICMP error occurs during the transmission of the packet, > then > - the IcmpErrorReceived field is set to TRUE, the IcmpError field is filled in > and > - EFI_ICMP_ERROR will be returned. If the Callback Protocol does not return > - EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED > will be returned. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param OpFlags The UDP operation flags. > - @param DestIp The destination IP address. > - @param DestPort The destination UDP port number. > - @param GatewayIp The gateway IP address. > - @param SrcIp The source IP address. > - @param SrcPort The source UDP port number. > - @param HeaderSize An optional field which may be set to the length > of a header at > - HeaderPtr to be prefixed to the data at BufferPtr. > - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header > to be prefixed to the > - data at BufferPtr. > - @param BufferSize A pointer to the size of the data at BufferPtr. > - @param BufferPtr A pointer to the data to be written. > - > - @retval EFI_SUCCESS The UDP Write operation was completed. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_BAD_BUFFER_SIZE The buffer is too long to be transmitted. > - @retval EFI_ABORTED The callback function aborted the UDP Write > operation. > - @retval EFI_TIMEOUT The UDP Write operation timed out. > - @retval EFI_ICMP_ERROR An ICMP error packet was received during > the UDP write session. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcUdpWrite ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN UINT16 OpFlags, > - IN EFI_IP_ADDRESS *DestIp, > - IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, > - IN EFI_IP_ADDRESS *GatewayIp OPTIONAL, > - IN EFI_IP_ADDRESS *SrcIp OPTIONAL, > - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, > - IN UINTN *HeaderSize OPTIONAL, > - IN VOID *HeaderPtr OPTIONAL, > - IN UINTN *BufferSize, > - IN VOID *BufferPtr > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_UDP4_PROTOCOL *Udp4; > - EFI_UDP4_COMPLETION_TOKEN Token; > - EFI_UDP4_TRANSMIT_DATA *Udp4TxData; > - UINT32 FragCount; > - UINT32 DataLength; > - EFI_UDP4_SESSION_DATA Udp4Session; > - EFI_STATUS Status; > - BOOLEAN IsDone; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_MAC_ADDRESS TempMacAddr; > - > - IsDone = FALSE; > - > - if ((This == NULL) || (DestIp == NULL) || (DestPort == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if ((GatewayIp != NULL) && (IP4_IS_UNSPECIFIED (NTOHL (GatewayIp- > >Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (GatewayIp->Addr[0])))) { > - // > - // Gateway is provided but it's not a unicast IP address. > - // > - return EFI_INVALID_PARAMETER; > - } > - > - if ((HeaderSize != NULL) && ((*HeaderSize == 0) || (HeaderPtr == NULL))) { > - // > - // The HeaderSize ptr isn't NULL and: 1. the value is zero; or 2. the > HeaderPtr > - // is NULL. > - // > - return EFI_INVALID_PARAMETER; > - } > - > - if ((BufferSize == NULL) || ((*BufferSize != 0) && (BufferPtr == NULL))) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Udp4 = Private->Udp4Write; > - Mode = &Private->Mode; > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - if (!Private->AddressIsOk && (SrcIp == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (!Mode->AutoArp) { > - // > - // If AutoArp is set false, check arp cache > - // > - UpdateArpCache (This); > - if (!FindInArpCache (Mode, &DestIp->v4, &TempMacAddr)) { > - return EFI_DEVICE_ERROR; > - } > - } > - > - Mode->IcmpErrorReceived = FALSE; > - > - if ((Private->CurrentUdpSrcPort == 0) || > - ((SrcPort != NULL) && (*SrcPort != Private->CurrentUdpSrcPort))) { > - // > - // Port is changed, (re)configure the Udp4Write instance > - // > - if (SrcPort != NULL) { > - Private->CurrentUdpSrcPort = *SrcPort; > - } > - } > - > - Status = PxeBcConfigureUdpWriteInstance ( > - Udp4, > - &Private->StationIp.v4, > - &Private->SubnetMask.v4, > - &Private->GatewayIp.v4, > - &Private->CurrentUdpSrcPort, > - Private->Mode.TTL, > - Private->Mode.ToS > - ); > - if (EFI_ERROR (Status)) { > - Private->CurrentUdpSrcPort = 0; > - return EFI_INVALID_PARAMETER; > - } > - > - ZeroMem (&Token, sizeof (EFI_UDP4_COMPLETION_TOKEN)); > - ZeroMem (&Udp4Session, sizeof (EFI_UDP4_SESSION_DATA)); > - > - CopyMem (&Udp4Session.DestinationAddress, DestIp, sizeof > (EFI_IPv4_ADDRESS)); > - Udp4Session.DestinationPort = *DestPort; > - if (SrcIp != NULL) { > - CopyMem (&Udp4Session.SourceAddress, SrcIp, sizeof > (EFI_IPv4_ADDRESS)); > - } > - if (SrcPort != NULL) { > - Udp4Session.SourcePort = *SrcPort; > - } > - > - FragCount = (HeaderSize != NULL) ? 2 : 1; > - Udp4TxData = (EFI_UDP4_TRANSMIT_DATA *) AllocateZeroPool (sizeof > (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof > (EFI_UDP4_FRAGMENT_DATA)); > - if (Udp4TxData == NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Udp4TxData->FragmentCount = FragCount; > - Udp4TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) > *BufferSize; > - Udp4TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr; > - DataLength = (UINT32) *BufferSize; > - > - if (FragCount == 2) { > - > - Udp4TxData->FragmentTable[0].FragmentLength = (UINT32) *HeaderSize; > - Udp4TxData->FragmentTable[0].FragmentBuffer = HeaderPtr; > - DataLength += (UINT32) *HeaderSize; > - } > - > - if (GatewayIp != NULL) { > - Udp4TxData->GatewayAddress = (EFI_IPv4_ADDRESS *) GatewayIp; > - } > - Udp4TxData->UdpSessionData = &Udp4Session; > - Udp4TxData->DataLength = DataLength; > - Token.Packet.TxData = Udp4TxData; > - > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - PxeBcCommonNotify, > - &IsDone, > - &Token.Event > - ); > - if (EFI_ERROR (Status)) { > - goto ON_EXIT; > - } > - > - Status = Udp4->Transmit (Udp4, &Token); > - if (EFI_ERROR (Status)) { > - if (Status == EFI_ICMP_ERROR) { > - Mode->IcmpErrorReceived = TRUE; > - } > - goto ON_EXIT; > - } > - > - while (!IsDone) { > - > - Udp4->Poll (Udp4); > - } > - > - Status = Token.Status; > - > -ON_EXIT: > - > - if (Token.Event != NULL) { > - gBS->CloseEvent (Token.Event); > - } > - > - FreePool (Udp4TxData); > - > - // > - // Reset the instance. > - // > - Udp4->Configure (Udp4, NULL); > - return Status; > -} > - > -/** > - Decide whether the incoming UDP packet is acceptable per IP filter settings > - in provided PxeBcMode. > - > - @param PxeBcMode Pointer to EFI_PXE_BASE_CODE_MODE. > - @param Session Received UDP session. > - > - @retval TRUE The UDP package matches IP filters. > - @retval FALSE The UDP package doesn't matches IP filters. > - > -**/ > -BOOLEAN > -CheckIpByFilter ( > - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, > - IN EFI_UDP4_SESSION_DATA *Session > - ) > -{ > - UINTN Index; > - EFI_IPv4_ADDRESS Ip4Address; > - EFI_IPv4_ADDRESS DestIp4Address; > - > - if ((PxeBcMode->IpFilter.Filters & > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) { > - return TRUE; > - } > - > - CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof > (DestIp4Address)); > - if (((PxeBcMode->IpFilter.Filters & > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) && > - IP4_IS_MULTICAST (EFI_NTOHL (DestIp4Address)) > - ) { > - return TRUE; > - } > - > - if (((PxeBcMode->IpFilter.Filters & > EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) && > - IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address)) > - ) { > - return TRUE; > - } > - > - CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address)); > - if (((PxeBcMode->IpFilter.Filters & > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) && > - EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address) > - ) { > - return TRUE; > - } > - > - ASSERT (PxeBcMode->IpFilter.IpCnt < EFI_PXE_BASE_CODE_MAX_IPCNT); > - > - for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; Index++) { > - CopyMem ( > - &Ip4Address, > - &PxeBcMode->IpFilter.IpList[Index].v4, > - sizeof (Ip4Address) > - ); > - if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) { > - return TRUE; > - } > - } > - > - return FALSE; > -} > - > -/** > - Reads a UDP packet from the network interface. > - > - This function reads a UDP packet from a network interface. The data > contents > - are returned in (the optional HeaderPtr and) BufferPtr, and the size of the > - buffer received is returned in BufferSize . If the input BufferSize is smaller > - than the UDP packet received (less optional HeaderSize), it will be set to > the > - required size, and EFI_BUFFER_TOO_SMALL will be returned. In this case, > the > - contents of BufferPtr are undefined, and the packet is lost. If a UDP packet > is > - successfully received, then EFI_SUCCESS will be returned, and the > information > - from the UDP header will be returned in DestIp, DestPort, SrcIp, and > SrcPort if > - they are not NULL. Depending on the values of OpFlags and the DestIp, > DestPort, > - SrcIp, and SrcPort input values, different types of UDP packet receive > filtering > - will be performed. The following tables summarize these receive filter > operations. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param OpFlags The UDP operation flags. > - @param DestIp The destination IP address. > - @param DestPort The destination UDP port number. > - @param SrcIp The source IP address. > - @param SrcPort The source UDP port number. > - @param HeaderSize An optional field which may be set to the length > of a header at > - HeaderPtr to be prefixed to the data at BufferPtr. > - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header > to be prefixed to the > - data at BufferPtr. > - @param BufferSize A pointer to the size of the data at BufferPtr. > - @param BufferPtr A pointer to the data to be read. > - > - @retval EFI_SUCCESS The UDP Read operation was completed. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval EFI_BUFFER_TOO_SMALL The packet is larger than Buffer can hold. > - @retval EFI_ABORTED The callback function aborted the UDP Read > operation. > - @retval EFI_TIMEOUT The UDP Read operation timed out. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcUdpRead ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN UINT16 OpFlags, > - IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, > - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, > - IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, > - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, > - IN UINTN *HeaderSize OPTIONAL, > - IN VOID *HeaderPtr OPTIONAL, > - IN OUT UINTN *BufferSize, > - IN VOID *BufferPtr > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_UDP4_PROTOCOL *Udp4; > - EFI_UDP4_COMPLETION_TOKEN Token; > - EFI_UDP4_RECEIVE_DATA *RxData; > - EFI_UDP4_SESSION_DATA *Session; > - EFI_STATUS Status; > - BOOLEAN IsDone; > - BOOLEAN Matched; > - UINTN CopiedLen; > - UINTN HeaderLen; > - UINTN HeaderCopiedLen; > - UINTN BufferCopiedLen; > - UINT32 FragmentLength; > - UINTN FragmentIndex; > - UINT8 *FragmentBuffer; > - > - if (This == NULL || DestIp == NULL || DestPort == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == > 0 && (DestPort == NULL)) || > - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == > 0 && (SrcIp == NULL)) || > - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) == 0 > && (SrcPort == NULL))) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (((HeaderSize != NULL) && (*HeaderSize == 0)) || ((HeaderSize != NULL) > && (HeaderPtr == NULL))) { > - return EFI_INVALID_PARAMETER; > - } > - > - if ((BufferSize == NULL) || (BufferPtr == NULL)) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - Udp4 = Private->Udp4Read; > - > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - Mode->IcmpErrorReceived = FALSE; > - > - Status = gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - PxeBcCommonNotify, > - &IsDone, > - &Token.Event > - ); > - if (EFI_ERROR (Status)) { > - return EFI_OUT_OF_RESOURCES; > - } > - > -TRY_AGAIN: > - > - IsDone = FALSE; > - Status = Udp4->Receive (Udp4, &Token); > - if (EFI_ERROR (Status)) { > - if (Status == EFI_ICMP_ERROR) { > - Mode->IcmpErrorReceived = TRUE; > - } > - goto ON_EXIT; > - } > - > - Udp4->Poll (Udp4); > - > - if (!IsDone) { > - Status = EFI_TIMEOUT; > - } else { > - > - // > - // check whether this packet matches the filters > - // > - if (EFI_ERROR (Token.Status)){ > - goto ON_EXIT; > - } > - > - RxData = Token.Packet.RxData; > - Session = &RxData->UdpSession; > - > - Matched = TRUE; > - > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) { > - Matched = FALSE; > - // > - // Check UDP package by IP filter settings > - // > - if (CheckIpByFilter (Mode, Session)) { > - Matched = TRUE; > - } > - } > - > - if (Matched) { > - Matched = FALSE; > - > - // > - // Match the destination ip of the received udp dgram > - // > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) > { > - Matched = TRUE; > - > - if (DestIp != NULL) { > - CopyMem (DestIp, &Session->DestinationAddress, sizeof > (EFI_IPv4_ADDRESS)); > - } > - } else { > - if (DestIp != NULL) { > - if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) { > - Matched = TRUE; > - } > - } else { > - if (EFI_IP4_EQUAL (&Private->StationIp, &Session- > >DestinationAddress)) { > - Matched = TRUE; > - } > - } > - } > - } > - > - if (Matched) { > - // > - // Match the destination port of the received udp dgram > - // > - if ((OpFlags & > EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0) { > - > - if (DestPort != NULL) { > - *DestPort = Session->DestinationPort; > - } > - } else { > - > - if (*DestPort != Session->DestinationPort) { > - Matched = FALSE; > - } > - } > - } > - > - if (Matched) { > - // > - // Match the source ip of the received udp dgram > - // > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) { > - > - if (SrcIp != NULL) { > - CopyMem (SrcIp, &Session->SourceAddress, sizeof > (EFI_IPv4_ADDRESS)); > - } > - } else { > - > - if (!EFI_IP4_EQUAL (SrcIp, &Session->SourceAddress)) { > - Matched = FALSE; > - } > - } > - } > - > - if (Matched) { > - // > - // Match the source port of the received udp dgram > - // > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != > 0) { > - > - if (SrcPort != NULL) { > - *SrcPort = Session->SourcePort; > - } > - } else { > - > - if (*SrcPort != Session->SourcePort) { > - Matched = FALSE; > - } > - } > - } > - > - if (Matched) { > - ASSERT (RxData != NULL); > - > - HeaderLen = 0; > - if (HeaderSize != NULL) { > - HeaderLen = MIN (*HeaderSize, RxData->DataLength); > - } > - > - if (RxData->DataLength - HeaderLen > *BufferSize) { > - Status = EFI_BUFFER_TOO_SMALL; > - } else { > - *HeaderSize = HeaderLen; > - *BufferSize = RxData->DataLength - HeaderLen; > - > - HeaderCopiedLen = 0; > - BufferCopiedLen = 0; > - for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; > FragmentIndex++) { > - FragmentLength = RxData- > >FragmentTable[FragmentIndex].FragmentLength; > - FragmentBuffer = RxData- > >FragmentTable[FragmentIndex].FragmentBuffer; > - if (HeaderCopiedLen + FragmentLength < HeaderLen) { > - // > - // Copy the header part of received data. > - // > - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, > FragmentLength); > - HeaderCopiedLen += FragmentLength; > - } else if (HeaderCopiedLen < HeaderLen) { > - // > - // Copy the header part of received data. > - // > - CopiedLen = HeaderLen - HeaderCopiedLen; > - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, > CopiedLen); > - HeaderCopiedLen += CopiedLen; > - > - // > - // Copy the other part of received data. > - // > - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer + > CopiedLen, FragmentLength - CopiedLen); > - BufferCopiedLen += (FragmentLength - CopiedLen); > - } else { > - // > - // Copy the other part of received data. > - // > - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer, > FragmentLength); > - BufferCopiedLen += FragmentLength; > - } > - } > - } > - } else { > - > - Status = EFI_TIMEOUT; > - } > - > - // > - // Recycle the RxData > - // > - gBS->SignalEvent (RxData->RecycleSignal); > - > - if (!Matched) { > - goto TRY_AGAIN; > - } > - } > - > -ON_EXIT: > - > - Udp4->Cancel (Udp4, &Token); > - > - gBS->CloseEvent (Token.Event); > - > - return Status; > -} > - > -/** > - Updates the IP receive filters of a network device and enables software > filtering. > - > - The NewFilter field is used to modify the network device's current IP > receive > - filter settings and to enable a software filter. This function updates the > IpFilter > - field of the EFI_PXE_BASE_CODE_MODE structure with the contents of > NewIpFilter. > - The software filter is used when the USE_FILTER in OpFlags is set to > UdpRead(). > - The current hardware filter remains in effect no matter what the settings > of OpFlags > - are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() is > from those > - packets whose reception is enabled in hardware-physical NIC address > (unicast), > - broadcast address, logical address or addresses (multicast), or all > (promiscuous). > - UdpRead() does not modify the IP filter settings. > - Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP > receive > - filter list emptied and the filter set to > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > - If an application or driver wishes to preserve the IP receive filter settings, > - it will have to preserve the IP receive filter settings before these calls, and > - use SetIpFilter() to restore them after the calls. If incompatible filtering is > - requested (for example, PROMISCUOUS with anything else) or if the > device does not > - support a requested filter setting and it cannot be accommodated in > software > - (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER > will be returned. > - The IPlist field is used to enable IPs other than the StationIP. They may be > - multicast or unicast. If IPcnt is set as well as > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP, > - then both the StationIP and the IPs from the IPlist will be used. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param NewFilter Pointer to the new set of IP receive filters. > - > - @retval EFI_SUCCESS The IP receive filter settings were updated. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcSetIpFilter ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter > - ) > -{ > - EFI_STATUS Status; > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - UINTN Index; > - EFI_UDP4_CONFIG_DATA *Udp4Cfg; > - BOOLEAN PromiscuousNeed; > - BOOLEAN AcceptPromiscuous; > - BOOLEAN AcceptBroadcast; > - BOOLEAN MultiCastUpdate; > - > - if (This == NULL) { > - DEBUG ((EFI_D_ERROR, "This == NULL.\n")); > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - if (NewFilter == NULL) { > - DEBUG ((EFI_D_ERROR, "NewFilter == NULL.\n")); > - return EFI_INVALID_PARAMETER; > - } > - > - if (NewFilter->IpCnt > EFI_PXE_BASE_CODE_MAX_IPCNT) { > - DEBUG ((EFI_D_ERROR, "NewFilter->IpCnt > %d.\n", > EFI_PXE_BASE_CODE_MAX_IPCNT)); > - return EFI_INVALID_PARAMETER; > - } > - > - if (!Mode->Started) { > - DEBUG ((EFI_D_ERROR, "BC was not started.\n")); > - return EFI_NOT_STARTED; > - } > - > - if (Mode->UsingIpv6) { > - DEBUG ((EFI_D_ERROR, "This driver is PXE for IPv4 Only.\n")); > - return EFI_INVALID_PARAMETER; > - } > - > - PromiscuousNeed = FALSE; > - > - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { > - if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) { > - // > - // The IP is a broadcast address. > - // > - DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n")); > - return EFI_INVALID_PARAMETER; > - } > - if ((EFI_NTOHL(Mode->StationIp) != 0) && > - (EFI_NTOHL(Mode->SubnetMask) != 0) && > - IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter- > >IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) && > - NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), > EFI_NTOHL(Mode->SubnetMask)) && > - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != > 0)) { > - // > - // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address > is in IpList, > - // promiscuous mode is needed. > - // > - PromiscuousNeed = TRUE; > - } > - } > - > - AcceptPromiscuous = FALSE; > - AcceptBroadcast = FALSE; > - MultiCastUpdate = FALSE; > - > - if (PromiscuousNeed || > - ((NewFilter->Filters & > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) || > - ((NewFilter->Filters & > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) > - ) { > - // > - // Configure the udp4 filter to receive all packages. > - // > - AcceptPromiscuous = TRUE; > - } else if ((NewFilter->Filters & > EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) { > - // > - // Configure the udp4 filter to receive all broadcast packages. > - // > - AcceptBroadcast = TRUE; > - } > - > - // > - // In multicast condition when Promiscuous FALSE and IpCnt no-zero. > - // Here check if there is any update of the multicast ip address. If yes, > - // we need leave the old multicast group (by Config UDP instance to NULL), > - // and join the new multicast group. > - // > - if (!AcceptPromiscuous) { > - if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != > 0) { > - if (Mode->IpFilter.IpCnt != NewFilter->IpCnt) { > - MultiCastUpdate = TRUE; > - } else if (CompareMem (Mode->IpFilter.IpList, NewFilter->IpList, > NewFilter->IpCnt * sizeof (EFI_IP_ADDRESS)) != 0 ) { > - MultiCastUpdate = TRUE; > - } > - } > - } > - > - // > - // Check whether we need reconfigure the UDP instance. > - // > - Udp4Cfg = &Private->Udp4CfgData; > - if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous) || > - (AcceptBroadcast != Udp4Cfg->AcceptBroadcast) || MultiCastUpdate) > { > - // > - // Clear the UDP instance configuration, all joined groups will be left > - // during the operation. > - // > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > - > - // > - // Configure the UDP instance with the new configuration. > - // > - Udp4Cfg->AcceptPromiscuous = AcceptPromiscuous; > - Udp4Cfg->AcceptBroadcast = AcceptBroadcast; > - Status = Private->Udp4Read->Configure (Private->Udp4Read, Udp4Cfg); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // In not Promiscuous mode, need to join the new multicast group. > - // > - if (!AcceptPromiscuous) { > - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { > - if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) { > - // > - // Join the mutilcast group. > - // > - Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE, > &NewFilter->IpList[Index].v4); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - } > - } > - } > - } > - > - > - // > - // Save the new filter. > - // > - CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter)); > - > - return EFI_SUCCESS; > -} > - > - > -/** > - Uses the ARP protocol to resolve a MAC address. > - > - This function uses the ARP protocol to resolve a MAC address. The > UsingIpv6 field > - of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 > or IPv6 > - addresses are being used. The IP address specified by IpAddr is used to > resolve > - a MAC address. If the ARP protocol succeeds in resolving the specified > address, > - then the ArpCacheEntries and ArpCache fields of the > EFI_PXE_BASE_CODE_MODE structure > - are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the > resolved > - MAC address is placed there as well. If the PXE Base Code protocol is in the > - stopped state, then EFI_NOT_STARTED is returned. If the ARP protocol > encounters > - a timeout condition while attempting to resolve an address, then > EFI_TIMEOUT is > - returned. If the Callback Protocol does not return > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > - then EFI_ABORTED is returned. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param IpAddr Pointer to the IP address that is used to resolve a > MAC address. > - @param MacAddr If not NULL, a pointer to the MAC address that > was resolved with the > - ARP protocol. > - > - @retval EFI_SUCCESS The IP or MAC address was resolved. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval EFI_ICMP_ERROR Something error occur with the ICMP packet > message. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcArp ( > - IN EFI_PXE_BASE_CODE_PROTOCOL * This, > - IN EFI_IP_ADDRESS * IpAddr, > - IN EFI_MAC_ADDRESS * MacAddr OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_STATUS Status; > - EFI_MAC_ADDRESS TempMacAddr; > - > - if (This == NULL || IpAddr == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - if (!Private->AddressIsOk || Mode->UsingIpv6) { > - // > - // We can't resolve the IP address if we don't have a local address now. > - // Don't have ARP for IPv6. > - // > - return EFI_INVALID_PARAMETER; > - } > - > - Mode->IcmpErrorReceived = FALSE; > - > - if (!Mode->AutoArp) { > - // > - // If AutoArp is set false, check arp cache > - // > - UpdateArpCache (This); > - if (!FindInArpCache (Mode, &IpAddr->v4, &TempMacAddr)) { > - return EFI_DEVICE_ERROR; > - } > - } else { > - Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL, > &TempMacAddr); > - if (EFI_ERROR (Status)) { > - if (Status == EFI_ICMP_ERROR) { > - Mode->IcmpErrorReceived = TRUE; > - } > - return Status; > - } > - } > - > - if (MacAddr != NULL) { > - CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS)); > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Updates the parameters that affect the operation of the PXE Base Code > Protocol. > - > - This function sets parameters that affect the operation of the PXE Base > Code Protocol. > - The parameter specified by NewAutoArp is used to control the generation > of ARP > - protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets will be > generated > - as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, then > no ARP > - Protocol packets will be generated. In this case, the only mappings that are > - available are those stored in the ArpCache of the > EFI_PXE_BASE_CODE_MODE structure. > - If there are not enough mappings in the ArpCache to perform a PXE Base > Code Protocol > - service, then the service will fail. This function updates the AutoArp field of > - the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp. > - The SetParameters() call must be invoked after a Callback Protocol is > installed > - to enable the use of callbacks. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param NewAutoArp If not NULL, a pointer to a value that specifies > whether to replace the > - current value of AutoARP. > - @param NewSendGUID If not NULL, a pointer to a value that > specifies whether to replace the > - current value of SendGUID. > - @param NewTTL If not NULL, a pointer to be used in place of the > current value of TTL, > - the "time to live" field of the IP header. > - @param NewToS If not NULL, a pointer to be used in place of the > current value of ToS, > - the "type of service" field of the IP header. > - @param NewMakeCallback If not NULL, a pointer to a value that > specifies whether to replace the > - current value of the MakeCallback field of the Mode > structure. > - > - @retval EFI_SUCCESS The new parameters values were updated. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcSetParameters ( > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > - IN BOOLEAN *NewAutoArp OPTIONAL, > - IN BOOLEAN *NewSendGUID OPTIONAL, > - IN UINT8 *NewTTL OPTIONAL, > - IN UINT8 *NewToS OPTIONAL, > - IN BOOLEAN *NewMakeCallback // OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_STATUS Status; > - > - Status = EFI_SUCCESS; > - > - if (This == NULL) { > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - if (NewSendGUID != NULL && *NewSendGUID) { > - // > - // FixMe, cann't locate SendGuid > - // > - } > - > - if (NewMakeCallback != NULL && *NewMakeCallback) { > - > - Status = gBS->HandleProtocol ( > - Private->Controller, > - &gEfiPxeBaseCodeCallbackProtocolGuid, > - (VOID **) &Private->PxeBcCallback > - ); > - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) { > - > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - } > - > - if (!Mode->Started) { > - Status = EFI_NOT_STARTED; > - goto ON_EXIT; > - } > - > - if (NewMakeCallback != NULL) { > - > - if (*NewMakeCallback) { > - // > - // Update the Callback protocol. > - // > - Status = gBS->HandleProtocol ( > - Private->Controller, > - &gEfiPxeBaseCodeCallbackProtocolGuid, > - (VOID **) &Private->PxeBcCallback > - ); > - > - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) { > - Status = EFI_INVALID_PARAMETER; > - goto ON_EXIT; > - } > - } else { > - Private->PxeBcCallback = NULL; > - } > - > - Mode->MakeCallbacks = *NewMakeCallback; > - } > - > - if (NewAutoArp != NULL) { > - Mode->AutoArp = *NewAutoArp; > - } > - > - if (NewSendGUID != NULL) { > - Mode->SendGUID = *NewSendGUID; > - } > - > - if (NewTTL != NULL) { > - Mode->TTL = *NewTTL; > - } > - > - if (NewToS != NULL) { > - Mode->ToS = *NewToS; > - } > - > -ON_EXIT: > - return Status; > -} > - > -/** > - Updates the station IP address and/or subnet mask values of a network > device. > - > - This function updates the station IP address and/or subnet mask values of > a network > - device. The NewStationIp field is used to modify the network device's > current IP address. > - If NewStationIP is NULL, then the current IP address will not be modified. > Otherwise, > - this function updates the StationIp field of the > EFI_PXE_BASE_CODE_MODE structure > - with NewStationIp. The NewSubnetMask field is used to modify the > network device's current subnet > - mask. If NewSubnetMask is NULL, then the current subnet mask will not be > modified. > - Otherwise, this function updates the SubnetMask field of the > EFI_PXE_BASE_CODE_MODE > - structure with NewSubnetMask. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param NewStationIp Pointer to the new IP address to be used by > the network device. > - @param NewSubnetMask Pointer to the new subnet mask to be used > by the network device. > - > - @retval EFI_SUCCESS The new station IP address and/or subnet mask > were updated. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcSetStationIP ( > - IN EFI_PXE_BASE_CODE_PROTOCOL * This, > - IN EFI_IP_ADDRESS * NewStationIp OPTIONAL, > - IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_ARP_CONFIG_DATA ArpConfigData; > - > - if (This == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL > (NewSubnetMask->Addr[0]))) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (NewStationIp != NULL) { > - if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) || > - IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) || > - (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0 > && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL > (NewSubnetMask->Addr[0])))) { > - return EFI_INVALID_PARAMETER; > - } > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - if (NewStationIp != NULL) { > - CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS)); > - CopyMem (&Private->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS)); > - } > - > - if (NewSubnetMask != NULL) { > - CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof > (EFI_IP_ADDRESS)); > - CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof > (EFI_IP_ADDRESS)); > - } > - > - Private->AddressIsOk = TRUE; > - > - if (!Mode->UsingIpv6) { > - // > - // If in IPv4 mode, configure the corresponding ARP with this new > - // station IP address. > - // > - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); > - > - ArpConfigData.SwAddressType = 0x0800; > - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); > - ArpConfigData.StationAddress = &Private->StationIp.v4; > - > - Private->Arp->Configure (Private->Arp, NULL); > - Private->Arp->Configure (Private->Arp, &ArpConfigData); > - > - // > - // Update the route table. > - // > - Mode->RouteTableEntries = 1; > - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & > Private->SubnetMask.Addr[0]; > - Mode->RouteTable[0].SubnetMask.Addr[0] = Private- > >SubnetMask.Addr[0]; > - Mode->RouteTable[0].GwAddr.Addr[0] = 0; > - } > - > - return EFI_SUCCESS; > -} > - > -/** > - Updates the contents of the cached DHCP and Discover packets. > - > - The pointers to the new packets are used to update the contents of the > cached > - packets in the EFI_PXE_BASE_CODE_MODE structure. > - > - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL > instance. > - @param NewDhcpDiscoverValid Pointer to a value that will replace the > current > - DhcpDiscoverValid field. > - @param NewDhcpAckReceived Pointer to a value that will replace the > current > - DhcpAckReceived field. > - @param NewProxyOfferReceived Pointer to a value that will replace the > current > - ProxyOfferReceived field. > - @param NewPxeDiscoverValid Pointer to a value that will replace the > current > - ProxyOfferReceived field. > - @param NewPxeReplyReceived Pointer to a value that will replace the > current > - PxeReplyReceived field. > - @param NewPxeBisReplyReceived Pointer to a value that will replace the > current > - PxeBisReplyReceived field. > - @param NewDhcpDiscover Pointer to the new cached DHCP Discover > packet contents. > - @param NewDhcpAck Pointer to the new cached DHCP Ack packet > contents. > - @param NewProxyOffer Pointer to the new cached Proxy Offer > packet contents. > - @param NewPxeDiscover Pointer to the new cached PXE Discover > packet contents. > - @param NewPxeReply Pointer to the new cached PXE Reply packet > contents. > - @param NewPxeBisReply Pointer to the new cached PXE BIS Reply > packet contents. > - > - @retval EFI_SUCCESS The cached packet contents were updated. > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > stopped state. > - @retval EFI_INVALID_PARAMETER This is NULL or not point to a valid > EFI_PXE_BASE_CODE_PROTOCOL structure. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeBcSetPackets ( > - IN EFI_PXE_BASE_CODE_PROTOCOL * This, > - IN BOOLEAN * NewDhcpDiscoverValid OPTIONAL, > - IN BOOLEAN * NewDhcpAckReceived OPTIONAL, > - IN BOOLEAN * NewProxyOfferReceived OPTIONAL, > - IN BOOLEAN * NewPxeDiscoverValid OPTIONAL, > - IN BOOLEAN * NewPxeReplyReceived OPTIONAL, > - IN BOOLEAN * NewPxeBisReplyReceived OPTIONAL, > - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover OPTIONAL, > - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck OPTIONAL, > - IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer OPTIONAL, > - IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover OPTIONAL, > - IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply OPTIONAL, > - IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_MODE *Mode; > - > - if (This == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > - Mode = Private->PxeBc.Mode; > - > - if (!Mode->Started) { > - return EFI_NOT_STARTED; > - } > - > - if (NewDhcpDiscoverValid != NULL) { > - Mode->DhcpDiscoverValid = *NewDhcpDiscoverValid; > - } > - > - if (NewDhcpAckReceived != NULL) { > - Mode->DhcpAckReceived = *NewDhcpAckReceived; > - } > - > - if (NewProxyOfferReceived != NULL) { > - Mode->ProxyOfferReceived = *NewProxyOfferReceived; > - } > - > - if (NewPxeDiscoverValid != NULL) { > - Mode->PxeDiscoverValid = *NewPxeDiscoverValid; > - } > - > - if (NewPxeReplyReceived != NULL) { > - Mode->PxeReplyReceived = *NewPxeReplyReceived; > - } > - > - if (NewPxeBisReplyReceived != NULL) { > - Mode->PxeBisReplyReceived = *NewPxeBisReplyReceived; > - } > - > - if (NewDhcpDiscover != NULL) { > - CopyMem (&Mode->DhcpDiscover, NewDhcpDiscover, sizeof > (EFI_PXE_BASE_CODE_PACKET)); > - } > - > - if (NewDhcpAck != NULL) { > - CopyMem (&Mode->DhcpAck, NewDhcpAck, sizeof > (EFI_PXE_BASE_CODE_PACKET)); > - } > - > - if (NewProxyOffer != NULL) { > - CopyMem (&Mode->ProxyOffer, NewProxyOffer, sizeof > (EFI_PXE_BASE_CODE_PACKET)); > - } > - > - if (NewPxeDiscover != NULL) { > - CopyMem (&Mode->PxeDiscover, NewPxeDiscover, sizeof > (EFI_PXE_BASE_CODE_PACKET)); > - } > - > - if (NewPxeReply != NULL) { > - CopyMem (&Mode->PxeReply, NewPxeReply, sizeof > (EFI_PXE_BASE_CODE_PACKET)); > - } > - > - if (NewPxeBisReply != NULL) { > - CopyMem (&Mode->PxeBisReply, NewPxeBisReply, sizeof > (EFI_PXE_BASE_CODE_PACKET)); > - } > - > - return EFI_SUCCESS; > -} > - > -EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate = { > - EFI_PXE_BASE_CODE_PROTOCOL_REVISION, > - EfiPxeBcStart, > - EfiPxeBcStop, > - EfiPxeBcDhcp, > - EfiPxeBcDiscover, > - EfiPxeBcMtftp, > - EfiPxeBcUdpWrite, > - EfiPxeBcUdpRead, > - EfiPxeBcSetIpFilter, > - EfiPxeBcArp, > - EfiPxeBcSetParameters, > - EfiPxeBcSetStationIP, > - EfiPxeBcSetPackets, > - NULL > -}; > - > -/** > - Callback function that is invoked when the PXE Base Code Protocol is about > to transmit, has > - received, or is waiting to receive a packet. > - > - This function is invoked when the PXE Base Code Protocol is about to > transmit, has received, > - or is waiting to receive a packet. Parameters Function and Received specify > the type of event. > - Parameters PacketLen and Packet specify the packet that generated the > event. If these fields > - are zero and NULL respectively, then this is a status update callback. If the > operation specified > - by Function is to continue, then CALLBACK_STATUS_CONTINUE should be > returned. If the operation > - specified by Function should be aborted, then CALLBACK_STATUS_ABORT > should be returned. Due to > - the polling nature of UEFI device drivers, a callback function should not > execute for more than 5 ms. > - The SetParameters() function must be called after a Callback Protocol is > installed to enable the > - use of callbacks. > - > - @param This Pointer to the > EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL instance. > - @param Function The PXE Base Code Protocol function that is > waiting for an event. > - @param Received TRUE if the callback is being invoked due to a > receive event. FALSE if > - the callback is being invoked due to a transmit event. > - @param PacketLength The length, in bytes, of Packet. This field will > have a value of zero if > - this is a wait for receive event. > - @param PacketPtr If Received is TRUE, a pointer to the packet that > was just received; > - otherwise a pointer to the packet that is about to be > transmitted. > - > - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE if Function > specifies a continue operation > - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT if Function > specifies an abort operation > - > -**/ > -EFI_PXE_BASE_CODE_CALLBACK_STATUS > -EFIAPI > -EfiPxeLoadFileCallback ( > - IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL * This, > - IN EFI_PXE_BASE_CODE_FUNCTION Function, > - IN BOOLEAN Received, > - IN UINT32 PacketLength, > - IN EFI_PXE_BASE_CODE_PACKET * PacketPtr OPTIONAL > - ) > -{ > - EFI_INPUT_KEY Key; > - EFI_STATUS Status; > - > - // > - // Catch Ctrl-C or ESC to abort. > - // > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > - > - if (!EFI_ERROR (Status)) { > - > - if (Key.ScanCode == SCAN_ESC || Key.UnicodeChar == (0x1F & 'c')) { > - > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT; > - } > - } > - // > - // No print if receive packet > - // > - if (Received) { > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > - } > - // > - // Print only for three functions > - // > - switch (Function) { > - > - case EFI_PXE_BASE_CODE_FUNCTION_MTFTP: > - // > - // Print only for open MTFTP packets, not every MTFTP packets > - // > - if (PacketLength != 0 && PacketPtr != NULL) { > - if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) { > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > - } > - } > - break; > - > - case EFI_PXE_BASE_CODE_FUNCTION_DHCP: > - case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER: > - break; > - > - default: > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > - } > - > - if (PacketLength != 0 && PacketPtr != NULL) { > - // > - // Print '.' when transmit a packet > - // > - AsciiPrint ("."); > - > - } > - > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > -} > - > -EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL mPxeBcCallBackTemplate = { > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION, > - EfiPxeLoadFileCallback > -}; > - > - > -/** > - Find the boot file. > - > - @param Private Pointer to PxeBc private data. > - @param BufferSize Pointer to buffer size. > - @param Buffer Pointer to buffer. > - > - @retval EFI_SUCCESS Discover the boot file successfully. > - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. > - @retval EFI_ABORTED PXE bootstrap server, so local boot need abort. > - @retval EFI_BUFFER_TOO_SMALL The buffer is too small to load the boot > file. > - > -**/ > -EFI_STATUS > -DiscoverBootFile ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN OUT UINT64 *BufferSize, > - IN VOID *Buffer > - ) > -{ > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > - EFI_PXE_BASE_CODE_MODE *Mode; > - EFI_STATUS Status; > - UINT16 Type; > - UINT16 Layer; > - BOOLEAN UseBis; > - PXEBC_CACHED_DHCP4_PACKET *Packet; > - UINT16 Value; > - > - PxeBc = &Private->PxeBc; > - Mode = PxeBc->Mode; > - Type = EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP; > - Layer = EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL; > - > - // > - // do DHCP. > - // > - Status = PxeBc->Dhcp (PxeBc, TRUE); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - > - // > - // Select a boot server > - // > - Status = PxeBcSelectBootPrompt (Private); > - > - if (Status == EFI_SUCCESS) { > - Status = PxeBcSelectBootMenu (Private, &Type, TRUE); > - } else if (Status == EFI_TIMEOUT) { > - Status = PxeBcSelectBootMenu (Private, &Type, FALSE); > - } > - > - if (!EFI_ERROR (Status)) { > - > - if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) { > - // > - // Local boot(PXE bootstrap server) need abort > - // > - return EFI_ABORTED; > - } > - > - UseBis = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected); > - Status = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL); > - if (EFI_ERROR (Status)) { > - return Status; > - } > - } > - > - *BufferSize = 0; > - > - // > - // Get bootfile name and (m)tftp server ip addresss > - // > - if (Mode->PxeReplyReceived) { > - Packet = &Private->PxeReply; > - } else if (Mode->ProxyOfferReceived) { > - Packet = &Private->ProxyOffer; > - } else { > - Packet = &Private->Dhcp4Ack; > - } > - > - // > - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option > 54(server identifier) > - // in DHCPOFFER packet. > - // (It does not comply with PXE Spec, Ver2.1) > - // > - if (EFI_IP4_EQUAL (&Packet->Packet.Offer.Dhcp4.Header.ServerAddr, > &mZeroIp4Addr)) { > - CopyMem ( > - &Private->ServerIp, > - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - } else { > - CopyMem ( > - &Private->ServerIp, > - &Packet->Packet.Offer.Dhcp4.Header.ServerAddr, > - sizeof (EFI_IPv4_ADDRESS) > - ); > - } > - if (Private->ServerIp.Addr[0] == 0) { > - return EFI_DEVICE_ERROR; > - } > - > - ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != > NULL); > - > - // > - // bootlfile name > - // > - Private->BootFileName = (CHAR8 *) (Packet- > >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data); > - > - if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != > NULL) { > - // > - // Already have the bootfile length option, compute the file size > - // > - CopyMem (&Value, Packet- > >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof > (Value)); > - Value = NTOHS (Value); > - *BufferSize = 512 * Value; > - Status = EFI_BUFFER_TOO_SMALL; > - } else { > - // > - // Get the bootfile size from tftp > - // > - Status = PxeBc->Mtftp ( > - PxeBc, > - EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, > - Buffer, > - FALSE, > - BufferSize, > - &Private->BlockSize, > - &Private->ServerIp, > - (UINT8 *) Private->BootFileName, > - NULL, > - FALSE > - ); > - } > - > - Private->FileSize = (UINTN) *BufferSize; > - > - // > - // Display all the information: boot server address, boot file name and boot > file size. > - // > - AsciiPrint ("\n Server IP address is "); > - PxeBcShowIp4Addr (&Private->ServerIp.v4); > - AsciiPrint ("\n NBP filename is %a", Private->BootFileName); > - AsciiPrint ("\n NBP filesize is %d Bytes", Private->FileSize); > - > - return Status; > -} > - > -/** > - Causes the driver to load a specified file. > - > - @param This Protocol instance pointer. > - @param FilePath The device specific path of the file to load. > - @param BootPolicy If TRUE, indicates that the request originates > from the > - boot manager is attempting to load FilePath as a boot > - selection. If FALSE, then FilePath must match as exact file > - to be loaded. > - @param BufferSize On input the size of Buffer in bytes. On output > with a return > - code of EFI_SUCCESS, the amount of data transferred to > - Buffer. On output with a return code of > EFI_BUFFER_TOO_SMALL, > - the size of Buffer required to retrieve the requested file. > - @param Buffer The memory buffer to transfer the file to. IF Buffer > is NULL, > - then no the size of the requested file is returned in > - BufferSize. > - > - @retval EFI_SUCCESS The file was loaded. > - @retval EFI_UNSUPPORTED The device does not support the > provided BootPolicy > - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or > - BufferSize is NULL. > - @retval EFI_NO_MEDIA No medium was present to load the file. > - @retval EFI_DEVICE_ERROR The file was not loaded due to a device > error. > - @retval EFI_NO_RESPONSE The remote system did not respond. > - @retval EFI_NOT_FOUND The file was not found. > - @retval EFI_ABORTED The file load process was manually cancelled. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeLoadFile ( > - IN EFI_LOAD_FILE_PROTOCOL * This, > - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, > - IN BOOLEAN BootPolicy, > - IN OUT UINTN *BufferSize, > - IN VOID *Buffer OPTIONAL > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > - BOOLEAN NewMakeCallback; > - EFI_STATUS Status; > - UINT64 TmpBufSize; > - EFI_STATUS MediaStatus; > - > - if (FilePath == NULL || !IsDevicePathEnd (FilePath)) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This); > - PxeBc = &Private->PxeBc; > - NewMakeCallback = FALSE; > - Status = EFI_DEVICE_ERROR; > - > - if (This == NULL || BufferSize == NULL) { > - > - return EFI_INVALID_PARAMETER; > - } > - > - // > - // Only support BootPolicy > - // > - if (!BootPolicy) { > - return EFI_UNSUPPORTED; > - } > - > - // > - // Check media status before PXE start > - // > - MediaStatus = EFI_SUCCESS; > - NetLibDetectMediaWaitTimeout (Private->Controller, > PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus); > - if (MediaStatus != EFI_SUCCESS) { > - return EFI_NO_MEDIA; > - } > - > - Status = PxeBc->Start (PxeBc, FALSE); > - if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { > - return Status; > - } > - > - Status = gBS->HandleProtocol ( > - Private->Controller, > - &gEfiPxeBaseCodeCallbackProtocolGuid, > - (VOID **) &Private->PxeBcCallback > - ); > - if (Status == EFI_UNSUPPORTED) { > - > - CopyMem (&Private->LoadFileCallback, &mPxeBcCallBackTemplate, sizeof > (Private->LoadFileCallback)); > - > - Status = gBS->InstallProtocolInterface ( > - &Private->Controller, > - &gEfiPxeBaseCodeCallbackProtocolGuid, > - EFI_NATIVE_INTERFACE, > - &Private->LoadFileCallback > - ); > - > - NewMakeCallback = (BOOLEAN) (Status == EFI_SUCCESS); > - > - Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, > &NewMakeCallback); > - if (EFI_ERROR (Status)) { > - PxeBc->Stop (PxeBc); > - return Status; > - } > - } > - > - if (Private->FileSize == 0) { > - TmpBufSize = 0; > - Status = DiscoverBootFile (Private, &TmpBufSize, Buffer); > - > - if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) { > - Status = EFI_DEVICE_ERROR; > - } else if (TmpBufSize > 0 && *BufferSize >= (UINTN) TmpBufSize && > Buffer != NULL) { > - AsciiPrint ("\n Downloading NBP file...\n"); > - *BufferSize = (UINTN) TmpBufSize; > - Status = PxeBc->Mtftp ( > - PxeBc, > - EFI_PXE_BASE_CODE_TFTP_READ_FILE, > - Buffer, > - FALSE, > - &TmpBufSize, > - &Private->BlockSize, > - &Private->ServerIp, > - (UINT8 *) Private->BootFileName, > - NULL, > - FALSE > - ); > - } else if (TmpBufSize > 0) { > - *BufferSize = (UINTN) TmpBufSize; > - Status = EFI_BUFFER_TOO_SMALL; > - } > - } else if (Buffer == NULL || Private->FileSize > *BufferSize) { > - *BufferSize = Private->FileSize; > - Status = EFI_BUFFER_TOO_SMALL; > - } else { > - // > - // Download the file. > - // > - AsciiPrint ("\n Downloading NBP file...\n"); > - TmpBufSize = (UINT64) (*BufferSize); > - Status = PxeBc->Mtftp ( > - PxeBc, > - EFI_PXE_BASE_CODE_TFTP_READ_FILE, > - Buffer, > - FALSE, > - &TmpBufSize, > - &Private->BlockSize, > - &Private->ServerIp, > - (UINT8 *) Private->BootFileName, > - NULL, > - FALSE > - ); > - } > - // > - // If we added a callback protocol, now is the time to remove it. > - // > - if (NewMakeCallback) { > - > - NewMakeCallback = FALSE; > - > - PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, > &NewMakeCallback); > - > - gBS->UninstallProtocolInterface ( > - Private->Controller, > - &gEfiPxeBaseCodeCallbackProtocolGuid, > - &Private->LoadFileCallback > - ); > - } > - > - // > - // Check download status > - // > - if (Status == EFI_SUCCESS) { > - AsciiPrint ("\n NBP file downloaded successfully.\n"); > - // > - // The DHCP4 can have only one configured child instance so we need to > stop > - // reset the DHCP4 child before we return. Otherwise the other programs > which > - // also need to use DHCP4 will be impacted. > - // The functionality of PXE Base Code protocol will not be stopped, > - // when downloading is successfully. > - // > - Private->Dhcp4->Stop (Private->Dhcp4); > - Private->Dhcp4->Configure (Private->Dhcp4, NULL); > - return EFI_SUCCESS; > - > - } else if (Status == EFI_BUFFER_TOO_SMALL) { > - if (Buffer != NULL) { > - AsciiPrint ("PXE-E05: Download buffer is smaller than requested file.\n"); > - } else { > - // > - // The functionality of PXE Base Code protocol will not be stopped. > - // > - return Status; > - } > - > - } else if (Status == EFI_DEVICE_ERROR) { > - AsciiPrint ("PXE-E07: Network device error.\n"); > - > - } else if (Status == EFI_OUT_OF_RESOURCES) { > - AsciiPrint ("PXE-E09: Could not allocate I/O buffers.\n"); > - > - } else if (Status == EFI_NO_MEDIA) { > - AsciiPrint ("PXE-E12: Could not detect network connection.\n"); > - > - } else if (Status == EFI_NO_RESPONSE) { > - AsciiPrint ("PXE-E16: No offer received.\n"); > - > - } else if (Status == EFI_TIMEOUT) { > - AsciiPrint ("PXE-E18: Server response timeout.\n"); > - > - } else if (Status == EFI_ABORTED) { > - AsciiPrint ("PXE-E21: Remote boot cancelled.\n"); > - > - } else if (Status == EFI_ICMP_ERROR) { > - AsciiPrint ("PXE-E22: Client received ICMP error from server.\n"); > - > - } else if (Status == EFI_TFTP_ERROR) { > - AsciiPrint ("PXE-E23: Client received TFTP error from server.\n"); > - > - } else { > - AsciiPrint ("PXE-E99: Unexpected network error.\n"); > - } > - > - PxeBc->Stop (PxeBc); > - > - return Status; > -} > - > -EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate = { EfiPxeLoadFile }; > - > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > deleted file mode 100644 > index 88767c8394ab..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > +++ /dev/null > @@ -1,454 +0,0 @@ > -/** @file > - PxeBc MTFTP functions. > - > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#include "PxeBcImpl.h" > - > -CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = { > - "blksize", > - "timeout", > - "tsize", > - "multicast" > -}; > - > - > -/** > - This is a callback function when packets received/transmitted in Mtftp > driver. > - > - A callback function that is provided by the caller to intercept > - the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets > processed in the > - EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept > - EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets > during a call to > - EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory(). > - > - @param This Pointer to Mtftp protocol instance > - @param Token Pointer to Mtftp token > - @param PacketLen Length of Mtftp packet > - @param Packet Pointer to Mtftp packet > - > - @retval EFI_SUCCESS Operation sucess > - @retval EFI_ABORTED Abort transfer process > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcCheckPacket ( > - IN EFI_MTFTP4_PROTOCOL *This, > - IN EFI_MTFTP4_TOKEN *Token, > - IN UINT16 PacketLen, > - IN EFI_MTFTP4_PACKET *Packet > - ) > -{ > - PXEBC_PRIVATE_DATA *Private; > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; > - EFI_STATUS Status; > - > - Private = (PXEBC_PRIVATE_DATA *) Token->Context; > - Callback = Private->PxeBcCallback; > - Status = EFI_SUCCESS; > - > - if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) { > - Private->Mode.TftpErrorReceived = TRUE; > - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode; > - AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, > PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet- > >Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1); > - Private- > >Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; > - } > - > - if (Callback != NULL) { > - > - Status = Callback->Callback ( > - Callback, > - Private->Function, > - TRUE, > - PacketLen, > - (EFI_PXE_BASE_CODE_PACKET *) Packet > - ); > - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { > - > - Status = EFI_ABORTED; > - } else { > - > - Status = EFI_SUCCESS; > - } > - } > - > - return Status; > -} > - > - > -/** > - This function is to get size of a file by Tftp. > - > - @param Private Pointer to PxeBc private data > - @param Config Pointer to Mtftp configuration data > - @param Filename Pointer to file name > - @param BlockSize Pointer to block size > - @param BufferSize Pointer to buffer size > - > - @retval EFI_SUCCESS Get the size of file success > - @retval EFI_NOT_FOUND Parse the tftp ptions failed. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval Other Has not get the size of the file. > - > -**/ > -EFI_STATUS > -PxeBcTftpGetFileSize ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN UINTN *BlockSize, > - IN OUT UINT64 *BufferSize > - ) > -{ > - EFI_MTFTP4_PROTOCOL *Mtftp4; > - EFI_MTFTP4_OPTION ReqOpt[2]; > - EFI_MTFTP4_PACKET *Packet; > - EFI_MTFTP4_OPTION *Option; > - UINT32 PktLen; > - UINT8 OptBuf[128]; > - UINT32 OptCnt; > - EFI_STATUS Status; > - > - *BufferSize = 0; > - Status = EFI_DEVICE_ERROR; > - Mtftp4 = Private->Mtftp4; > - Packet = NULL; > - Option = NULL; > - PktLen = 0; > - OptCnt = 1; > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > - > - Status = Mtftp4->Configure (Mtftp4, Config); > - if (EFI_ERROR (Status)) { > - > - return Status; > - } > - > - ReqOpt[0].OptionStr = > (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX]; > - UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > - ReqOpt[0].ValueStr = OptBuf; > - > - if (BlockSize != NULL) { > - ReqOpt[1].OptionStr = > (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > - ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) > ReqOpt[0].ValueStr) + 1; > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, > PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) > ReqOpt[0].ValueStr) + 1)); > - OptCnt++; > - } > - > - Status = Mtftp4->GetInfo ( > - Mtftp4, > - NULL, > - Filename, > - NULL, > - (UINT8) OptCnt, > - ReqOpt, > - &PktLen, > - &Packet > - ); > - > - if (EFI_ERROR (Status)) { > - if (Status == EFI_TFTP_ERROR) { > - Private->Mode.TftpErrorReceived = TRUE; > - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode; > - AsciiStrnCpyS ( > - Private->Mode.TftpError.ErrorString, > - PXE_MTFTP_ERROR_STRING_LENGTH, > - (CHAR8 *) Packet->Error.ErrorMessage, > - PXE_MTFTP_ERROR_STRING_LENGTH - 1 > - ); > - Private- > >Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; > - } > - goto ON_ERROR; > - } > - > - OptCnt = 0; > - > - Status = Mtftp4->ParseOptions ( > - Mtftp4, > - PktLen, > - Packet, > - (UINT32 *) &OptCnt, > - &Option > - ); > - > - if (EFI_ERROR (Status)) { > - > - goto ON_ERROR; > - } > - > - Status = EFI_NOT_FOUND; > - > - while (OptCnt != 0) { > - > - if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) > { > - > - *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr); > - Status = EFI_SUCCESS; > - } > - > - OptCnt--; > - } > - > - FreePool (Option); > - > -ON_ERROR: > - > - if (Packet != NULL) { > - FreePool (Packet); > - } > - > - Mtftp4->Configure (Mtftp4, NULL); > - > - return Status; > -} > - > - > -/** > - This function is to get data of a file by Tftp. > - > - @param Private Pointer to PxeBc private data > - @param Config Pointer to Mtftp configuration data > - @param Filename Pointer to file name > - @param BlockSize Pointer to block size > - @param BufferPtr Pointer to buffer > - @param BufferSize Pointer to buffer size > - @param DontUseBuffer Indicate whether with a receive buffer > - > - @retval EFI_SUCCESS Read the data success from the special file. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval other Read data from file failed. > - > -**/ > -EFI_STATUS > -PxeBcTftpReadFile ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN UINTN *BlockSize, > - IN UINT8 *BufferPtr, > - IN OUT UINT64 *BufferSize, > - IN BOOLEAN DontUseBuffer > - ) > -{ > - EFI_MTFTP4_PROTOCOL *Mtftp4; > - EFI_MTFTP4_TOKEN Token; > - EFI_MTFTP4_OPTION ReqOpt[1]; > - UINT32 OptCnt; > - UINT8 OptBuf[128]; > - EFI_STATUS Status; > - > - Status = EFI_DEVICE_ERROR; > - Mtftp4 = Private->Mtftp4; > - OptCnt = 0; > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > - > - Status = Mtftp4->Configure (Mtftp4, Config); > - if (EFI_ERROR (Status)) { > - > - return Status; > - } > - > - if (BlockSize != NULL) { > - > - ReqOpt[0].OptionStr = (UINT8*) > mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > - ReqOpt[0].ValueStr = OptBuf; > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, > PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > - OptCnt++; > - } > - > - Token.Event = NULL; > - Token.OverrideData = NULL; > - Token.Filename = Filename; > - Token.ModeStr = NULL; > - Token.OptionCount = OptCnt; > - Token.OptionList = ReqOpt; > - Token.Context = Private; > - > - if (DontUseBuffer) { > - Token.BufferSize = 0; > - Token.Buffer = NULL; > - } else { > - Token.BufferSize = *BufferSize; > - Token.Buffer = BufferPtr; > - } > - > - Token.CheckPacket = PxeBcCheckPacket; > - Token.TimeoutCallback = NULL; > - Token.PacketNeeded = NULL; > - > - Status = Mtftp4->ReadFile (Mtftp4, &Token); > - > - *BufferSize = Token.BufferSize; > - > - Mtftp4->Configure (Mtftp4, NULL); > - > - return Status; > -} > - > - > -/** > - This function is put data of a file by Tftp. > - > - @param Private Pointer to PxeBc private data > - @param Config Pointer to Mtftp configuration data > - @param Filename Pointer to file name > - @param Overwrite Indicate whether with overwrite attribute > - @param BlockSize Pointer to block size > - @param BufferPtr Pointer to buffer > - @param BufferSize Pointer to buffer size > - > - @retval EFI_SUCCESS Write the data success into the special file. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval other Write data into file failed. > - > -**/ > -EFI_STATUS > -PxeBcTftpWriteFile ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN BOOLEAN Overwrite, > - IN UINTN *BlockSize, > - IN UINT8 *BufferPtr, > - IN OUT UINT64 *BufferSize > - ) > -{ > - EFI_MTFTP4_PROTOCOL *Mtftp4; > - EFI_MTFTP4_TOKEN Token; > - EFI_MTFTP4_OPTION ReqOpt[1]; > - UINT32 OptCnt; > - UINT8 OptBuf[128]; > - EFI_STATUS Status; > - > - Status = EFI_DEVICE_ERROR; > - Mtftp4 = Private->Mtftp4; > - OptCnt = 0; > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > - > - Status = Mtftp4->Configure (Mtftp4, Config); > - if (EFI_ERROR (Status)) { > - > - return Status; > - } > - > - if (BlockSize != NULL) { > - > - ReqOpt[0].OptionStr = (UINT8*) > mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > - ReqOpt[0].ValueStr = OptBuf; > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, > PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > - OptCnt++; > - } > - > - Token.Event = NULL; > - Token.OverrideData = NULL; > - Token.Filename = Filename; > - Token.ModeStr = NULL; > - Token.OptionCount = OptCnt; > - Token.OptionList = ReqOpt; > - Token.BufferSize = *BufferSize; > - Token.Buffer = BufferPtr; > - Token.CheckPacket = PxeBcCheckPacket; > - Token.TimeoutCallback = NULL; > - Token.PacketNeeded = NULL; > - > - Status = Mtftp4->WriteFile (Mtftp4, &Token); > - *BufferSize = Token.BufferSize; > - > - Mtftp4->Configure (Mtftp4, NULL); > - > - return Status; > -} > - > - > -/** > - This function is to get data(file) from a directory(may be a server) by Tftp. > - > - @param Private Pointer to PxeBc private data. > - @param Config Pointer to Mtftp configuration data. > - @param Filename Pointer to file name. > - @param BlockSize Pointer to block size. > - @param BufferPtr Pointer to buffer. > - @param BufferSize Pointer to buffer size. > - @param DontUseBuffer Indicate whether with a receive buffer. > - > - @retval EFI_SUCCES Get the data from the file included in directory > success. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval other Operation failed. > - > -**/ > -EFI_STATUS > -PxeBcTftpReadDirectory ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN UINTN *BlockSize, > - IN UINT8 *BufferPtr, > - IN OUT UINT64 *BufferSize, > - IN BOOLEAN DontUseBuffer > - ) > -{ > - EFI_MTFTP4_PROTOCOL *Mtftp4; > - EFI_MTFTP4_TOKEN Token; > - EFI_MTFTP4_OPTION ReqOpt[1]; > - UINT32 OptCnt; > - UINT8 OptBuf[128]; > - EFI_STATUS Status; > - > - Status = EFI_DEVICE_ERROR; > - Mtftp4 = Private->Mtftp4; > - OptCnt = 0; > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > - > - Status = Mtftp4->Configure (Mtftp4, Config); > - if (EFI_ERROR (Status)) { > - > - return Status; > - } > - > - if (BlockSize != NULL) { > - > - ReqOpt[0].OptionStr = (UINT8*) > mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > - ReqOpt[0].ValueStr = OptBuf; > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, > PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > - OptCnt++; > - } > - > - Token.Event = NULL; > - Token.OverrideData = NULL; > - Token.Filename = Filename; > - Token.ModeStr = NULL; > - Token.OptionCount = OptCnt; > - Token.OptionList = ReqOpt; > - Token.Context = Private; > - > - if (DontUseBuffer) { > - Token.BufferSize = 0; > - Token.Buffer = NULL; > - } else { > - Token.BufferSize = *BufferSize; > - Token.Buffer = BufferPtr; > - } > - > - Token.CheckPacket = PxeBcCheckPacket; > - Token.TimeoutCallback = NULL; > - Token.PacketNeeded = NULL; > - > - Status = Mtftp4->ReadDirectory (Mtftp4, &Token); > - > - *BufferSize = Token.BufferSize; > - > - Mtftp4->Configure (Mtftp4, NULL); > - > - return Status; > -} > - > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > deleted file mode 100644 > index 1401ca5ec2fd..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > +++ /dev/null > @@ -1,221 +0,0 @@ > -/** @file > - Support routines for PxeBc. > - > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "PxeBcImpl.h" > - > - > -/** > - The common notify function associated with various PxeBc events. > - > - @param Event The event signaled. > - @param Context The context. > - > -**/ > -VOID > -EFIAPI > -PxeBcCommonNotify ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ) > -{ > - *((BOOLEAN *) Context) = TRUE; > -} > - > - > -/** > - This function initialize(or configure) the Udp4Write instance. > - > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > - @param StationIp Pointer to the station ip address. > - @param SubnetMask Pointer to the subnetmask of the station ip address. > - @param Gateway Pointer to the gateway ip address. > - @param SrcPort Pointer to the srouce port of the station. > - @param Ttl The time to live field of the IP header. > - @param ToS The type of service field of the IP header. > - > - @retval EFI_SUCCESS The configuration settings were set, changed, or > reset successfully. > - @retval EFI_NO_MAPPING When using a default address, configuration > (DHCP, BOOTP, > - RARP, etc.) is not finished yet. > - @retval EFI_INVALID_PARAMETER One or more following conditions are > TRUE: > - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already > started/configured > - and must be stopped/reset before it can be reconfigured. > - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is > FALSE > - and UdpConfigData.StationPort is already used by > - other instance. > - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot > allocate memory for this > - EFI UDPv4 Protocol instance. > - @retval EFI_DEVICE_ERROR An unexpected network or system error > occurred and this instance > - was not opened. > - @retval Others Please examine the function Udp4->Routes(Udp4, > FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. > - > -**/ > -EFI_STATUS > -PxeBcConfigureUdpWriteInstance ( > - IN EFI_UDP4_PROTOCOL *Udp4, > - IN EFI_IPv4_ADDRESS *StationIp, > - IN EFI_IPv4_ADDRESS *SubnetMask, > - IN EFI_IPv4_ADDRESS *Gateway, > - IN OUT UINT16 *SrcPort, > - IN UINT8 Ttl, > - IN UINT8 ToS > - ) > -{ > - EFI_UDP4_CONFIG_DATA Udp4CfgData; > - EFI_STATUS Status; > - > - ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData)); > - > - Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; > - Udp4CfgData.TypeOfService = ToS; > - Udp4CfgData.TimeToLive = Ttl; > - Udp4CfgData.AllowDuplicatePort = TRUE; > - > - CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp)); > - CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof > (*SubnetMask)); > - > - Udp4CfgData.StationPort = *SrcPort; > - > - // > - // Reset the instance. > - // > - Udp4->Configure (Udp4, NULL); > - > - Status = Udp4->Configure (Udp4, &Udp4CfgData); > - if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) { > - // > - // basic configuration OK, need to add the default route entry > - // > - Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, > Gateway); > - if (EFI_ERROR (Status)) { > - // > - // roll back > - // > - Udp4->Configure (Udp4, NULL); > - } > - } > - > - if (!EFI_ERROR (Status) && (*SrcPort == 0)) { > - Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL); > - *SrcPort = Udp4CfgData.StationPort; > - } > - > - return Status; > -} > - > -/** > - This function is to display the IPv4 address. > - > - @param[in] Ip The pointer to the IPv4 address. > - > -**/ > -VOID > -PxeBcShowIp4Addr ( > - IN EFI_IPv4_ADDRESS *Ip > - ) > -{ > - UINTN Index; > - > - for (Index = 0; Index < 4; Index++) { > - AsciiPrint ("%d", Ip->Addr[Index]); > - if (Index < 3) { > - AsciiPrint ("."); > - } > - } > -} > - > -/** > - Convert number to ASCII value. > - > - @param Number Numeric value to convert to decimal ASCII value. > - @param Buffer Buffer to place ASCII version of the Number. > - @param Length Length of Buffer. > - > -**/ > -VOID > -CvtNum ( > - IN UINTN Number, > - IN UINT8 *Buffer, > - IN UINTN Length > - ) > -{ > - UINTN Remainder; > - > - for (; Length > 0; Length--) { > - Remainder = Number % 10; > - Number /= 10; > - Buffer[Length - 1] = (UINT8) ('0' + Remainder); > - } > -} > - > - > -/** > - Convert unsigned int number to decimal number. > - > - @param Number The unsigned int number will be converted. > - @param Buffer Pointer to the buffer to store the decimal number > after transform. > - @param[in] BufferSize The maxsize of the buffer. > - > - @return the length of the number after transform. > - > -**/ > -UINTN > -UtoA10 ( > - IN UINTN Number, > - IN CHAR8 *Buffer, > - IN UINTN BufferSize > - ) > -{ > - UINTN Index; > - CHAR8 TempStr[64]; > - > - Index = 63; > - TempStr[Index] = 0; > - > - do { > - Index--; > - TempStr[Index] = (CHAR8) ('0' + (Number % 10)); > - Number = Number / 10; > - } while (Number != 0); > - > - AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]); > - > - return AsciiStrLen (Buffer); > -} > - > - > -/** > - Convert ASCII numeric string to a UINTN value. > - > - @param Buffer Pointer to the 8-byte unsigned int value. > - > - @return UINTN value of the ASCII string. > - > -**/ > -UINT64 > -AtoU64 ( > - IN UINT8 *Buffer > - ) > -{ > - UINT64 Value; > - UINT8 Character; > - > - Value = 0; > - while ((Character = *Buffer++) != '\0') { > - Value = MultU64x32 (Value, 10) + (Character - '0'); > - } > - > - return Value; > -} > - > diff --git a/MdeModulePkg/MdeModulePkg.dsc > b/MdeModulePkg/MdeModulePkg.dsc > index 2465d39fd744..5d042be3a862 100644 > --- a/MdeModulePkg/MdeModulePkg.dsc > +++ b/MdeModulePkg/MdeModulePkg.dsc > @@ -354,12 +354,10 @@ [Components] > MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf > MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf > MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf > - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf > MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf > MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf > MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf > - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf > > > MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/PcatSingleSegmen > tPciCfg2Pei.inf > @@ -422,7 +420,6 @@ [Components] > MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf > > [Components.IA32, Components.X64, Components.AARCH64] > - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf > MdeModulePkg/Universal/EbcDxe/EbcDxe.inf > MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf > diff --git > a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > deleted file mode 100644 > index ee371d26744c..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > +++ /dev/null > @@ -1,165 +0,0 @@ > -/** @file > - The header file of UEFI Component Name(2) protocol. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _COMPONENT_NAME_H_ > -#define _COMPONENT_NAME_H_ > - > -#include <Protocol/ComponentName.h> > -#include <Protocol/ComponentName2.h> > - > -extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2; > -extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName; > - > -// > -// EFI Component Name Protocol for iSCSI driver. > -// > - > -/** > - Retrieves a Unicode string that is the user readable name of the EFI Driver. > - > - This function retrieves the user readable name of a driver in the form of a > - Unicode string. If the driver specified by This has a user readable name in > - the language specified by Language, then a pointer to the driver name is > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > specified > - by This does not support the language specified by Language, > - then EFI_UNSUPPORTED is returned. > - > - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL > instance. > - @param[in] Language A pointer to a three characters ISO 639-2 language > identifier. > - This is the language of the driver name that that the caller > - is requesting, and it must match one of the languages specified > - in SupportedLanguages. The number of languages supported > by a > - driver is up to the driver writer. > - @param[out] DriverName A pointer to the Unicode string to return. This > Unicode string > - is the name of the driver specified by This in the language > - specified by Language. > - > - @retval EFI_SUCCESS The Unicode string for the Driver specified by > This > - and the language specified by Language was returned > - in DriverName. > - @retval EFI_INVALID_PARAMETER Language is NULL. > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > - @retval EFI_UNSUPPORTED The driver specified by This does not > support the > - language specified by Language. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiComponentNameGetDriverName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN CHAR8 *Language, > - OUT CHAR16 **DriverName > - ); > - > -/** > - Retrieves a Unicode string that is the user readable name of the controller > - that is being managed by an EFI Driver. Currently not implemented. > - > - @param[in] This A pointer to the > EFI_COMPONENT_NAME_PROTOCOL instance. > - @param[in] ControllerHandle The handle of a controller that the driver > specified by > - This is managing. This handle specifies the controller > - whose name is to be returned. > - @param[in] ChildHandle The handle of the child controller to retrieve > the name > - of. This is an optional parameter that may be NULL. It > - will be NULL for device drivers. It will also be NULL > - for a bus drivers that wish to retrieve the name of the > - bus controller. It will not be NULL for a bus driver > - that wishes to retrieve the name of a child controller. > - @param[in] Language A pointer to a three characters ISO 639-2 > language > - identifier. This is the language of the controller name > - that that the caller is requesting, and it must match one > - of the languages specified in SupportedLanguages. The > - number of languages supported by a driver is up to the > - driver writer. > - @param[out] ControllerName A pointer to the Unicode string to return. > This Unicode > - string is the name of the controller specified by > - ControllerHandle and ChildHandle in the language specified > - by Language from the point of view of the driver specified > - by This. > - > - @retval EFI_SUCCESS The Unicode string for the user readable name > in the > - language specified by Language for the driver > - specified by This was returned in DriverName. > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > valid EFI_HANDLE. > - @retval EFI_INVALID_PARAMETER Language is NULL. > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > - @retval EFI_UNSUPPORTED The driver specified by This is not currently > managing > - the controller specified by ControllerHandle and > - ChildHandle. > - @retval EFI_UNSUPPORTED The driver specified by This does not > support the > - language specified by Language. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiComponentNameGetControllerName ( > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE ChildHandle OPTIONAL, > - IN CHAR8 *Language, > - OUT CHAR16 **ControllerName > - ); > - > -// > -// EFI iSCSI Initiator Name Protocol for IScsi driver. > -// > - > -/** > - Retrieves the current set value of iSCSI Initiator Name. > - > - @param[in] This Pointer to the > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer > / Actual size of the > - variable data buffer. > - @param[out] Buffer Pointer to the buffer for data to be read. > - > - @retval EFI_SUCCESS Data was successfully retrieved into the > provided buffer and the > - BufferSize was sufficient to handle the iSCSI initiator name > - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. > - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be > retrieved due to a hardware error. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiGetInitiatorName ( > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > - IN OUT UINTN *BufferSize, > - OUT VOID *Buffer > - ); > - > -/** > - Sets the iSCSI Initiator Name. > - > - @param[in] This Pointer to the > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. > - @param[in] Buffer Pointer to the buffer for data to be written. > - > - @retval EFI_SUCCESS Data was successfully stored by the protocol. > - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be > written. > - Currently not implemented. > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or > BufferSize exceeds the maximum allowed limit. > - @retval EFI_DEVICE_ERROR The data could not be stored due to a > hardware error. > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > the data. > - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not > adhere to RFC 3720 > - (and other related protocols) > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiSetInitiatorName ( > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > - IN OUT UINTN *BufferSize, > - IN VOID *Buffer > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > deleted file mode 100644 > index d3c020e45d3b..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > +++ /dev/null > @@ -1,25 +0,0 @@ > -// /** @file > -// This module produces EFI iSCSI Initiator Name Protocol. > -// > -// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 > Protocol > -// and EFI DHCPv4 Protocol, to provide the capability to do the transport for > SCSI > -// data over TCP/IP. It installs EFI HII Configuration Access Protocol to > provide > -// one way to configurate the iSCSI setting. > -// > -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the > BSD License > -// which accompanies this distribution. The full text of the license may be > found at > -// http://opensource.org/licenses/bsd-license.php > -// > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > - > -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI iSCSI > Initiator Name Protocol" > - > -#string STR_MODULE_DESCRIPTION #language en-US "This module > produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI > DHCPv4 Protocol, to provide the capability to do the transport for SCSI data > over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way > to configure the iSCSI setting." > - > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > deleted file mode 100644 > index 5ec75820a605..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > +++ /dev/null > @@ -1,20 +0,0 @@ > -// /** @file > -// IScsi4Dxe Localized Strings and Content > -// > -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the > BSD License > -// which accompanies this distribution. The full text of the license may be > found at > -// http://opensource.org/licenses/bsd-license.php > -// > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > -#string STR_PROPERTIES_MODULE_NAME > -#language en-US > -"iSCSI DXE Driver" > - > - > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > deleted file mode 100644 > index 14a5658f754b..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > +++ /dev/null > @@ -1,106 +0,0 @@ > -/** @file > - The header file of CHAP configuration. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_CHAP_H_ > -#define _ISCSI_CHAP_H_ > - > -#define ISCSI_AUTH_METHOD_CHAP "CHAP" > - > -#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A" > -#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I" > -#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C" > -#define ISCSI_KEY_CHAP_NAME "CHAP_N" > -#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R" > - > -#define ISCSI_CHAP_ALGORITHM_MD5 5 > - > -#define ISCSI_CHAP_AUTH_MAX_LEN 1024 > -/// > -/// MD5_HASHSIZE > -/// > -#define ISCSI_CHAP_RSP_LEN 16 > - > -#define ISCSI_CHAP_INITIAL 0 > -#define ISCSI_CHAP_STEP_ONE 1 > -#define ISCSI_CHAP_STEP_TWO 2 > -#define ISCSI_CHAP_STEP_THREE 3 > -#define ISCSI_CHAP_STEP_FOUR 4 > - > -#pragma pack(1) > - > -typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA { > - UINT8 CHAPType; > - CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE]; > - CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > - CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; > - CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > -} ISCSI_CHAP_AUTH_CONFIG_NVDATA; > - > -#pragma pack() > - > -/// > -/// ISCSI CHAP Authentication Data > -/// > -typedef struct _ISCSI_CHAP_AUTH_DATA { > - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig; > - UINT32 InIdentifier; > - UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; > - UINT32 InChallengeLength; > - // > - // Calculated CHAP Response (CHAP_R) value > - // > - UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN]; > - > - // > - // Auth-data to be sent out for mutual authentication > - // > - UINT32 OutIdentifier; > - UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; > - UINT32 OutChallengeLength; > -} ISCSI_CHAP_AUTH_DATA; > - > -/** > - This function checks the received iSCSI Login Response during the security > - negotiation stage. > - > - @param[in] Conn The iSCSI connection. > - > - @retval EFI_SUCCESS The Login Response passed the CHAP validation. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiCHAPOnRspReceived ( > - IN ISCSI_CONNECTION *Conn > - ); > -/** > - This function fills the CHAP authentication information into the login PDU > - during the security negotiation stage in the iSCSI connection login. > - > - @param[in] Conn The iSCSI connection. > - @param[in, out] Pdu The PDU to send out. > - > - @retval EFI_SUCCESS All check passed and the phase-related CHAP > - authentication info is filled into the iSCSI PDU. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > -**/ > -EFI_STATUS > -IScsiCHAPToSendReq ( > - IN ISCSI_CONNECTION *Conn, > - IN OUT NET_BUF *Pdu > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > deleted file mode 100644 > index 650c68d53bab..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > +++ /dev/null > @@ -1,22 +0,0 @@ > -/** @file > - The common header file of Iscsi. > - > -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_COMMON_H_ > -#define _ISCSI_COMMON_H_ > - > -typedef struct _ISCSI_SESSION ISCSI_SESSION; > -typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION; > -typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA; > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > deleted file mode 100644 > index c3d07f6f4859..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > +++ /dev/null > @@ -1,166 +0,0 @@ > -/** @file > - The header file of IScsiConfig.c. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_CONFIG_H_ > -#define _ISCSI_CONFIG_H_ > - > -#include <Guid/MdeModuleHii.h> > -#include <Protocol/HiiConfigRouting.h> > -#include <Library/HiiLib.h> > -#include <Library/DevicePathLib.h> > -#include <Library/DebugLib.h> > -#include <Library/BaseLib.h> > -#include <Library/NetLib.h> > - > -extern UINT8 IScsiConfigDxeBin[]; > -extern UINT8 IScsi4DxeStrings[]; > - > -#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME" > - > -#define ISCSI_CONFIG_VAR_ATTR > (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE) > - > -#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', > 'c', 'i') > - > - > - > -/** > - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of > PcdDebugProperyMask is clear, > - then this macro return a pointer to a data structure > ISCSI_FORM_CALLBACK_INFO. > - > - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of > PcdDebugProperyMask is set, > - The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO > - is compared to TestSignature. If the signatures match, then a pointer > - to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned. > - If the signatures do not match, then DebugAssert() is called with a > description > - of "CR has a bad signature" and Callback is returned. > - > - If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not > contain the field > - specified by Callback, then the module will not compile. > - > - If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field > called Signature, > - then the module will not compile. > - > - @param Callback Pointer to the specified field within the data > - structure ISCSI_FORM_CALLBACK_INFO. > - @return A pointer to the pointer to a data structure > ISCSI_FORM_CALLBACK_INFO. > - @retval Others Some unexpected error happened. > -**/ > - > -#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) > \ > - CR ( \ > - Callback, \ > - ISCSI_FORM_CALLBACK_INFO, \ > - ConfigAccess, \ > - ISCSI_FORM_CALLBACK_INFO_SIGNATURE \ > - ) > - > -#pragma pack(1) > - > -typedef struct _ISCSI_MAC_INFO { > - EFI_MAC_ADDRESS Mac; > - UINT8 Len; > - UINT16 VlanId; > -} ISCSI_MAC_INFO; > - > -typedef struct _ISCSI_DEVICE_LIST { > - UINT8 NumDevice; > - ISCSI_MAC_INFO MacInfo[1]; > -} ISCSI_DEVICE_LIST; > - > -#pragma pack() > - > -typedef struct _ISCSI_CONFIG_FORM_ENTRY { > - LIST_ENTRY Link; > - EFI_HANDLE Controller; > - CHAR16 MacString[95]; > - EFI_STRING_ID PortTitleToken; > - EFI_STRING_ID PortTitleHelpToken; > - > - ISCSI_SESSION_CONFIG_NVDATA SessionConfigData; > - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData; > -} ISCSI_CONFIG_FORM_ENTRY; > - > -typedef struct _ISCSI_FORM_CALLBACK_INFO { > - UINTN Signature; > - EFI_HANDLE DriverHandle; > - EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess; > - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; > - EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting; > - UINT16 *KeyList; > - VOID *FormBuffer; > - EFI_HII_HANDLE RegisteredHandle; > - ISCSI_CONFIG_FORM_ENTRY *Current; > -} ISCSI_FORM_CALLBACK_INFO; > - > -#pragma pack(1) > - > -/// > -/// HII specific Vendor Device Path definition. > -/// > -typedef struct { > - VENDOR_DEVICE_PATH VendorDevicePath; > - EFI_DEVICE_PATH_PROTOCOL End; > -} HII_VENDOR_DEVICE_PATH; > - > -#pragma pack() > - > -/** > - Updates the iSCSI configuration form to add/delete an entry for the iSCSI > - device specified by the Controller. > - > - @param[in] DriverBindingHandle The driverbinding handle. > - @param[in] Controller The controller handle of the iSCSI device. > - @param[in] AddForm Whether to add or delete a form entry. > - > - @retval EFI_SUCCESS The iSCSI configuration form is updated. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiConfigUpdateForm ( > - IN EFI_HANDLE DriverBindingHandle, > - IN EFI_HANDLE Controller, > - IN BOOLEAN AddForm > - ); > - > -/** > - Initialize the iSCSI configuration form. > - > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > - > - @retval EFI_SUCCESS The iSCSI configuration form is initialized. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiConfigFormInit ( > - VOID > - ); > - > -/** > - Unload the iSCSI configuration form, this includes: delete all the iSCSI > - device configuration entries, uninstall the form callback protocol and > - free the resources used. > - > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > - > - @retval EFI_SUCCESS The iSCSI configuration form is unloaded. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > -**/ > -EFI_STATUS > -IScsiConfigFormUnload ( > - IN EFI_HANDLE DriverBindingHandle > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > deleted file mode 100644 > index 9e28d81fb40d..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > +++ /dev/null > @@ -1,219 +0,0 @@ > -/** @file > - Vfr file for iSCSI config. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > - > -#include "IScsiConfigNVDataStruc.h" > -#define EFI_NETWORK_DEVICE_CLASS 0x04 > - > -formset > - guid = IP4_ISCSI_CONFIG_GUID, > - title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE), > - help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP), > - > - varstore ISCSI_CONFIG_IFR_NVDATA, > - name = ISCSI_CONFIG_IFR_NVDATA, > - guid = IP4_ISCSI_CONFIG_GUID; > - form formid = FORMID_MAIN_FORM, > - title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE); > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName, > - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME), > - help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP), > - flags = INTERACTIVE, > - key = KEY_INITIATOR_NAME, > - minsize = ISCSI_NAME_IFR_MIN_SIZE, > - maxsize = ISCSI_NAME_IFR_MAX_SIZE, > - endstring; > - > - label DEVICE_ENTRY_LABEL; > - label LABEL_END; > - > - endform; > - > - form formid = FORMID_DEVICE_FORM, > - title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE); > - > - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled, > - prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE), > - help = STRING_TOKEN(STR_NULL), > - flags = 0, > - endcheckbox; > - > - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp, > - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), > - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), > - flags = INTERACTIVE, > - key = KEY_DHCP_ENABLE, > - endcheckbox; > - > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == > 0x01; > - string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp, > - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS), > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > - flags = INTERACTIVE, > - key = KEY_LOCAL_IP, > - minsize = IP_MIN_SIZE, > - maxsize = IP_MAX_SIZE, > - endstring; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask, > - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK), > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > - flags = INTERACTIVE, > - key = KEY_SUBNET_MASK, > - minsize = IP_MIN_SIZE, > - maxsize = IP_MAX_SIZE, > - endstring; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway, > - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY), > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > - flags = INTERACTIVE, > - key = KEY_GATE_WAY, > - minsize = IP_MIN_SIZE, > - maxsize = IP_MAX_SIZE, > - endstring; > - endif; > - > - subtitle text = STRING_TOKEN(STR_NULL); > - > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == > 0x00; > - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp, > - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), > - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), > - flags = 0, > - endcheckbox; > - endif; > - > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == > 0x01; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName, > - prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME), > - help = STRING_TOKEN(STR_ISCSI_TARGET_NAME), > - flags = INTERACTIVE, > - key = KEY_TARGET_NAME, > - minsize = ISCSI_NAME_IFR_MIN_SIZE, > - maxsize = ISCSI_NAME_IFR_MAX_SIZE, > - endstring; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp, > - prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS), > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > - flags = INTERACTIVE, > - key = KEY_TARGET_IP, > - minsize = IP_MIN_SIZE, > - maxsize = IP_MAX_SIZE, > - endstring; > - > - numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort, > - prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT), > - help = STRING_TOKEN(STR_ISCSI_TARGET_PORT), > - flags = 0, > - minimum = TARGET_PORT_MIN_NUM, > - maximum = TARGET_PORT_MAX_NUM, > - step = 0, > - endnumeric; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun, > - prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN), > - help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP), > - flags = INTERACTIVE, > - key = KEY_BOOT_LUN, > - minsize = LUN_MIN_SIZE, > - maxsize = LUN_MAX_SIZE, > - endstring; > - endif; > - > - subtitle text = STRING_TOKEN(STR_NULL); > - > - oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType, > - prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT), > - help = STRING_TOKEN(STR_CHAP_TYPE_HELP), > - option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value = > ISCSI_CHAP_NONE, flags = DEFAULT; > - option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value = > ISCSI_CHAP_UNI, flags = 0; > - option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = > ISCSI_CHAP_MUTUAL, flags = 0; > - endoneof; > - > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == > ISCSI_CHAP_NONE; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName, > - prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME), > - help = STRING_TOKEN(STR_ISCSI_CHAP_NAME), > - flags = INTERACTIVE, > - key = KEY_CHAP_NAME, > - minsize = 0, > - maxsize = ISCSI_CHAP_NAME_MAX_LEN, > - endstring; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret, > - prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET), > - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), > - flags = INTERACTIVE, > - key = KEY_CHAP_SECRET, > - minsize = ISCSI_CHAP_SECRET_MIN_LEN, > - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, > - endstring; > - > - endif; > - > - suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == > ISCSI_CHAP_MUTUAL; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName, > - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), > - help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), > - flags = INTERACTIVE, > - key = KEY_REVERSE_CHAP_NAME, > - minsize = 0, > - maxsize = ISCSI_CHAP_NAME_MAX_LEN, > - endstring; > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret, > - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET), > - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), > - flags = INTERACTIVE, > - key = KEY_REVERSE_CHAP_SECRET, > - minsize = ISCSI_CHAP_SECRET_MIN_LEN, > - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, > - endstring; > - > - endif; > - > - subtitle text = STRING_TOKEN(STR_NULL); > - > - string varid = ISCSI_CONFIG_IFR_NVDATA.IsId, > - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID), > - help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP), > - flags = INTERACTIVE, > - key = KEY_CONFIG_ISID, > - minsize = ISID_CONFIGURABLE_MIN_LEN, > - maxsize = ISID_CONFIGURABLE_MAX_LEN, > - endstring; > - > - subtitle text = STRING_TOKEN(STR_NULL); > - > - text > - help = STRING_TOKEN (STR_SAVE_CHANGES), > - text = STRING_TOKEN (STR_SAVE_CHANGES), > - flags = INTERACTIVE, > - key = KEY_SAVE_CHANGES; > - > - goto FORMID_MAIN_FORM, > - prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM), > - help = STRING_TOKEN (STR_RETURN_MAIN_FORM), > - flags = 0; > - > - endform; > - > -endformset; > - > diff --git > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > deleted file mode 100644 > index 729c74ebfc1b..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > +++ /dev/null > @@ -1,62 +0,0 @@ > -// *++ > -// > -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the > BSD License > -// which accompanies this distribution. The full text of the license may be > found at > -// http://opensource.org/licenses/bsd-license.php > -// > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// Module Name: > -// > -// IScsiConfigStrings.uni > -// > -// Abstract: > -// > -// String definitions for iSCSI configuration. > -// > -// Revision History: > -// > -// --*/ > - > - > -/=# > - > -#langdef en-US "English" > - > -#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI > Configuration" > -#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the > iSCSI parameters." > -#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI > Configuration" > -#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI Initiator > Name" > -#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The > worldwide unique name of the initiator. Only iqn. format is accepted." > -#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US "" > -#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI" > -#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP > Address" > -#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator Subnet > Mask" > -#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway" > -#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP address > in dotted-decimal notation." > -#string STR_ISCSI_TARGET_NAME #language en-US " Target Name" > -#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP > Address" > -#string STR_ISCSI_TARGET_PORT #language en-US " Target Port" > -#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN" > -#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal > representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734- > 9-156f-127, 4186-9" > -#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP" > -#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target > info via DHCP" > -#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type" > -#string STR_CHAP_TYPE_HELP #language en-US "None, One way > CHAP or mutual CHAP" > -#string STR_CHAP_TYPE_NONE #language en-US "None" > -#string STR_CHAP_TYPE_UNI #language en-US "One way" > -#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual" > -#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name" > -#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret" > -#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum > length is 12 bytes and the maximum length is 16 bytes." > -#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse > CHAP Name" > -#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse > CHAP Secret" > -#string STR_ISCSI_CONFIG_ISID #language en-US "ISID" > -#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format ISID > in 6 bytes, default value are derived from MAC address. Only last 3 bytes are > configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input > F07901." > -#string STR_RETURN_MAIN_FORM #language en-US "Back to Previous > Page" > -#string STR_SAVE_CHANGES #language en-US "Save Changes" > -#string STR_NULL #language en-US "" > - > diff --git > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > deleted file mode 100644 > index 7c2e4e65fa8e..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > +++ /dev/null > @@ -1,109 +0,0 @@ > -/** @file > - Define NVData structures used by the iSCSI configuration component > - > -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_NVDATASTRUC_H_ > -#define _ISCSI_NVDATASTRUC_H_ > - > -#include <Guid/Ip4IScsiConfigHii.h> > - > -#define VAR_EQ_TEST_NAME 0x100 > - > -#define FORMID_MAIN_FORM 1 > -#define FORMID_DEVICE_FORM 2 > - > -#define ISCSI_NAME_MAX_SIZE 224 > - > -// > -// Vfr has a limit on the size, it's 255 bytes. > -// > -#define ISCSI_NAME_IFR_MIN_SIZE 4 > -#define ISCSI_NAME_IFR_MAX_SIZE 223 > - > -#define IP_MIN_SIZE 7 > -#define IP_MAX_SIZE 15 > -#define IP4_STR_MAX_SIZE 16 > - > -#define LUN_MIN_SIZE 1 > -#define LUN_MAX_SIZE 20 > - > -#define ISCSI_CHAP_NONE 0 > -#define ISCSI_CHAP_UNI 1 > -#define ISCSI_CHAP_MUTUAL 2 > - > -#define TARGET_PORT_MIN_NUM 0 > -#define TARGET_PORT_MAX_NUM 65535 > - > -#define DEVICE_ENTRY_LABEL 0x1234 > -#define LABEL_END 0xffff > - > -#define KEY_INITIATOR_NAME 0x101 > -#define KEY_DHCP_ENABLE 0x102 > -#define KEY_LOCAL_IP 0x103 > -#define KEY_SUBNET_MASK 0x104 > -#define KEY_GATE_WAY 0x105 > -#define KEY_TARGET_IP 0x106 > -#define KEY_CHAP_NAME 0x107 > -#define KEY_CHAP_SECRET 0x108 > -#define KEY_REVERSE_CHAP_NAME 0x109 > -#define KEY_REVERSE_CHAP_SECRET 0x10a > -#define KEY_SAVE_CHANGES 0x10b > -#define KEY_TARGET_NAME 0x10c > -#define KEY_BOOT_LUN 0x10d > -#define KEY_CONFIG_ISID 0x10e > - > -#define KEY_DEVICE_ENTRY_BASE 0x1000 > - > -#define ISCSI_LUN_STR_MAX_LEN 21 > -#define ISCSI_CHAP_SECRET_MIN_LEN 12 > -#define ISCSI_CHAP_SECRET_MAX_LEN 16 > -// > -// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof > (NULL-Terminator) > -// > -#define ISCSI_CHAP_SECRET_STORAGE 17 > - > -#define ISCSI_CHAP_NAME_MAX_LEN 126 > -#define ISCSI_CHAP_NAME_STORAGE 127 > - > -#define ISID_CONFIGURABLE_MIN_LEN 6 > -#define ISID_CONFIGURABLE_MAX_LEN 12 > -#define ISID_CONFIGURABLE_STORAGE 13 > - > -#pragma pack(1) > -typedef struct { > - CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE]; > - > - UINT8 Enabled; > - > - UINT8 InitiatorInfoFromDhcp; > - CHAR16 LocalIp[IP4_STR_MAX_SIZE]; > - CHAR16 SubnetMask[IP4_STR_MAX_SIZE]; > - CHAR16 Gateway[IP4_STR_MAX_SIZE]; > - > - CHAR16 TargetName[ISCSI_NAME_MAX_SIZE]; > - CHAR16 TargetIp[IP4_STR_MAX_SIZE]; > - UINT16 TargetPort; > - CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN]; > - UINT8 TargetInfoFromDhcp; > - > - UINT8 CHAPType; > - CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE]; > - CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > - CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; > - CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > - > - CHAR16 IsId[ISID_CONFIGURABLE_STORAGE]; > -} ISCSI_CONFIG_IFR_NVDATA; > -#pragma pack() > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > deleted file mode 100644 > index 4c4dcaa8f68d..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > +++ /dev/null > @@ -1,55 +0,0 @@ > -/** @file > - The header file of IScsiDhcp. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_DHCP_H_ > -#define _ISCSI_DHCP_H_ > - > -#include <Protocol/Dhcp4.h> > - > -#define ISCSI_ROOT_PATH_ID "iscsi:" > -#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':' > - > -#define RP_FIELD_IDX_SERVERNAME 0 > -#define RP_FIELD_IDX_PROTOCOL 1 > -#define RP_FIELD_IDX_PORT 2 > -#define RP_FIELD_IDX_LUN 3 > -#define RP_FIELD_IDX_TARGETNAME 4 > -#define RP_FIELD_IDX_MAX 5 > - > -typedef struct _ISCSI_ROOT_PATH_FIELD { > - CHAR8 *Str; > - UINT8 Len; > -} ISCSI_ROOT_PATH_FIELD; > - > -/** > - Parse the DHCP ACK to get the address configuration and DNS information. > - > - @param[in] Image The handle of the driver image. > - @param[in] Controller The handle of the controller; > - @param[in, out] ConfigData The session configuration data. > - > - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NO_MEDIA There was a media error. > - @retval Others Other errors as indicated. > - > -**/ > -EFI_STATUS > -IScsiDoDhcp ( > - IN EFI_HANDLE Image, > - IN EFI_HANDLE Controller, > - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > deleted file mode 100644 > index d6a619f00fc0..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > +++ /dev/null > @@ -1,140 +0,0 @@ > -/** @file > - The header file of IScsiDriver.c. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_DRIVER_H_ > -#define _ISCSI_DRIVER_H_ > - > -#include <Uefi.h> > -#include <Protocol/DevicePath.h> > -#include <Protocol/LoadedImage.h> > -#include <Protocol/HiiConfigAccess.h> > -#include <Protocol/HiiDatabase.h> > -#include <Library/UefiDriverEntryPoint.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiLib.h> > -#include <Library/DevicePathLib.h> > -#include <Protocol/DriverBinding.h> > -#include <Protocol/ScsiPassThruExt.h> > - > -#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME" > - > -typedef struct _ISCSI_PRIVATE_PROTOCOL { > - UINT32 Reserved; > -} ISCSI_PRIVATE_PROTOCOL; > - > -// > -// EFI Driver Binding Protocol for iSCSI driver. > -// > - > -/** > - Tests to see if this driver supports a given controller. If a child device is > provided, > - it further tests to see if this driver supports creating a handle for the > specified child device. > - > - @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > - @param[in] ControllerHandle The handle of the controller to test. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is optional > for bus drivers. > - > - > - @retval EFI_SUCCESS The device specified by ControllerHandle and > - RemainingDevicePath is supported by the driver specified > by This. > - @retval EFI_ALREADY_STARTED The device specified by > ControllerHandle and > - RemainingDevicePath is already being managed by the > driver > - specified by This. > - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > and > - RemainingDevicePath is already being managed by a > different > - driver or an application that requires exclusive acces. > - Currently not implemented. > - @retval EFI_UNSUPPORTED The device specified by ControllerHandle > and > - RemainingDevicePath is not supported by the driver > specified by This. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDriverBindingSupported ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ); > - > -/** > - Start this driver on ControllerHandle. The Start() function is designed to be > - invoked from the EFI boot service ConnectController(). As a result, much of > - the error checking on the parameters to Start() has been moved into this > - common boot service. It is legal to call Start() from other locations, > - but the following calling restrictions must be followed or the system > behavior will not be deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE. > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > naturally aligned > - EFI_DEVICE_PATH_PROTOCOL. > - 3. Prior to calling Start(), the Supported() function for the driver specified > by This must > - have been called with the same calling parameters, and Supported() must > have returned EFI_SUCCESS. > - > - @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL instance. > - @param[in] ControllerHandle The handle of the controller to start. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param[in] RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is optional > for bus drivers. > - > - @retval EFI_SUCCESS The device was started. > - @retval EFI_DEVICE_ERROR The device could not be started due to a > device error. > - Currently not implemented. > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > due to a lack of resources. > - @retval Others The driver failded to start the device. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDriverBindingStart ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ); > - > -/** > - Stop this driver on ControllerHandle. > - > - Release the control of this controller and remove the IScsi functions. The > Stop() > - function is designed to be invoked from the EFI boot service > DisconnectController(). > - As a result, much of the error checking on the parameters to Stop() has > been moved > - into this common boot service. It is legal to call Stop() from other locations, > - but the following calling restrictions must be followed or the system > behavior will not be deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > previous call to this > - same driver's Start() function. > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a > valid > - EFI_HANDLE. In addition, all of these handles must have been created in > this driver's > - Start() function, and the Start() function must have called OpenProtocol() > on > - ControllerHandle with an Attribute of > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > - > - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param[in] ControllerHandle A handle to the device being stopped. The > handle must > - support a bus specific I/O protocol for the driver > - to use to stop the device. > - @param[in] NumberOfChildren The number of child device handles in > ChildHandleBuffer.Not used. > - @param[in] ChildHandleBuffer An array of child handles to be freed. May > be NULL > - if NumberOfChildren is 0.Not used. > - > - @retval EFI_SUCCESS The device was stopped. > - @retval EFI_DEVICE_ERROR The device could not be stopped due to a > device error. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiDriverBindingStop ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN UINTN NumberOfChildren, > - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > deleted file mode 100644 > index 48729e3029f7..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > +++ /dev/null > @@ -1,134 +0,0 @@ > -## @file > -# This module produces EFI iSCSI Initiator Name Protocol. > -# > -# This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 > Protocol > -# and EFI DHCPv4 Protocol, to provide the capability to do the transport for > SCSI > -# data over TCP/IP. It installs EFI HII Configuration Access Protocol to > provide > -# one way to configurate the iSCSI setting. This driver only supports IPv4 > network > -# stack. > -# > -# Notes: > -# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg. > -# 2) This driver might have some issues that have been fixed in the IScsiDxe > driver > -# in NetworkPkg. > -# 3) This driver supports fewer features than the IScsiDxe driver in > NetworkPkg > -# (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword > support). > -# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of this > one even > -# though both of them can be used. > -# > -# Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -# This program and the accompanying materials > -# are licensed and made available under the terms and conditions of the > BSD License > -# which accompanies this distribution. The full text of the license may be > found at > -# http://opensource.org/licenses/bsd-license.php > -# > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -# > -## > - > -[Defines] > - INF_VERSION = 0x00010005 > - BASE_NAME = IScsi4Dxe > - MODULE_UNI_FILE = IScsi4Dxe.uni > - FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7 > - MODULE_TYPE = UEFI_DRIVER > - VERSION_STRING = 1.0 > - ENTRY_POINT = IScsiDriverEntryPoint > - UNLOAD_IMAGE = EfiIScsiUnload > - > -# > -# The following information is for reference only and not required by the > build tools. > -# > -# VALID_ARCHITECTURES = IA32 X64 EBC > -# > -# DRIVER_BINDING = gIScsiDriverBinding > -# COMPONENT_NAME = gIScsiComponentName > -# COMPONENT_NAME2 = gIScsiComponentName2 > -# > - > -[Sources] > - IScsiTcp4Io.h > - IScsiProto.h > - IScsiMisc.h > - IScsiIbft.h > - IScsiExtScsiPassThru.h > - IScsiDriver.h > - IScsiDhcp.h > - IScsiCommon.h > - IScsiCHAP.h > - IScsiInitiatorName.h > - ComponentName.h > - Md5.h > - IScsiTcp4Io.c > - IScsiProto.c > - IScsiMisc.c > - IScsiInitiatorName.c > - IScsiIbft.c > - IScsiExtScsiPassThru.c > - IScsiDriver.c > - IScsiDhcp.c > - IScsiCHAP.c > - ComponentName.c > - Md5.c > - IScsiConfigDxeStrings.uni > - IScsiConfigDxe.vfr > - IScsiConfig.c > - IScsiConfig.h > - IScsiImpl.h > - IScsiConfigNVDataStruc.h > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - > -[LibraryClasses] > - UefiDriverEntryPoint > - UefiLib > - BaseLib > - UefiBootServicesTableLib > - UefiRuntimeServicesTableLib > - BaseMemoryLib > - MemoryAllocationLib > - DevicePathLib > - DebugLib > - PrintLib > - HiiLib > - NetLib > - > -[Protocols] > - ## PRODUCES > - ## UNDEFINED # Variable > - gEfiIScsiInitiatorNameProtocolGuid > - gEfiExtScsiPassThruProtocolGuid ## BY_START > - gEfiTcp4ProtocolGuid ## TO_START > - gEfiTcp4ServiceBindingProtocolGuid ## TO_START > - gEfiDhcp4ProtocolGuid ## TO_START > - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START > - ## TO_START > - ## PRODUCES > - gEfiDevicePathProtocolGuid > - gEfiHiiConfigAccessProtocolGuid ## PRODUCES > - gEfiHiiDatabaseProtocolGuid ## CONSUMES > - gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES > - gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES > - > -[Guids] > - gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## > Event > - gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED > - gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ## > SystemTable > - gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ## > SystemTable > - ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList" > - ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList" > - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch > mVendorStorageName > - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr > mVendorStorageName > - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData > mVendorStorageName > - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData > mVendorStorageName > - ## SOMETIMES_CONSUMES ## HII > - gIp4IScsiConfigGuid > - ## SOMETIMES_PRODUCES ## Variable > - ## SOMETIMES_CONSUMES ## Variable > - gIScsiCHAPAuthInfoGuid > - > -[UserExtensions.TianoCore."ExtraFiles"] > - IScsi4DxeExtra.uni > diff --git > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > deleted file mode 100644 > index e635e47b9292..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > +++ /dev/null > @@ -1,22 +0,0 @@ > -/** @file > - The header file of IScsiExtScsiPassThru.c. > - > -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_ > -#define _ISCSI_EXT_SCSI_PASS_THRU_H_ > - > -#include <Protocol/ScsiPassThruExt.h> > - > -extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL > gIScsiExtScsiPassThruProtocolTemplate; > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > deleted file mode 100644 > index 4f3828db63c6..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > +++ /dev/null > @@ -1,38 +0,0 @@ > -/** @file > - Some extra definitions for iBFT. > - > -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_IBFT_H_ > -#define _ISCSI_IBFT_H_ > - > -#include <IndustryStandard/Acpi.h> > -#include <IndustryStandard/IScsiBootFirmwareTable.h> > -#include <Protocol/AcpiTable.h> > -#include <Protocol/PciIo.h> > - > -#define IBFT_TABLE_VAR_NAME L"iBFT" > -#define IBFT_MAX_SIZE 4096 > -#define IBFT_HEAP_OFFSET 2048 > - > -#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT) > - > -/** > - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI > - session status. > -**/ > -VOID > -IScsiPublishIbft ( > - VOID > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > deleted file mode 100644 > index 8a5ee2149eb2..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > +++ /dev/null > @@ -1,168 +0,0 @@ > -/** @file > - The header file of IScsiImpl.c. > - > -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_IMPL_H_ > -#define _ISCSI_IMPL_H_ > - > -#include <Uefi.h> > - > -#include <IndustryStandard/Dhcp.h> > - > -#include <Library/BaseMemoryLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/NetLib.h> > -#include <Library/PrintLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > - > -#include <Guid/EventGroup.h> > - > -#include "IScsiCommon.h" > -#include "IScsiDriver.h" > -#include "IScsiInitiatorName.h" > -#include "ComponentName.h" > -#include "IScsiConfigNVDataStruc.h" > -#include "IScsiExtScsiPassThru.h" > -#include "IScsiProto.h" > -#include "IScsiMisc.h" > -#include "IScsiCHAP.h" > -#include "IScsiConfig.h" > -#include "IScsiDhcp.h" > -#include "IScsiTcp4Io.h" > -#include "IScsiIbft.h" > - > - > -#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N') > - > -struct _ISCSI_SESSION { > - UINT32 Signature; > - > - ISCSI_SESSION_CONFIG_DATA ConfigData; > - ISCSI_CHAP_AUTH_DATA AuthData; > - > - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; > - UINTN InitiatorNameLength; > - UINT8 State; > - > - UINT8 Isid[6]; > - UINT16 Tsih; > - > - UINT32 CmdSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - > - UINT32 InitiatorTaskTag; > - UINT16 NextCid; > - > - LIST_ENTRY Conns; > - UINT32 NumConns; > - > - LIST_ENTRY TcbList; > - > - // > - // session-wide parameters > - // > - UINT16 TargetPortalGroupTag; > - UINT32 MaxConnections; > - BOOLEAN InitialR2T; > - BOOLEAN ImmediateData; > - UINT32 MaxBurstLength; > - UINT32 FirstBurstLength; > - UINT32 DefaultTime2Wait; > - UINT32 DefaultTime2Retain; > - UINT16 MaxOutstandingR2T; > - BOOLEAN DataPDUInOrder; > - BOOLEAN DataSequenceInOrder; > - UINT8 ErrorRecoveryLevel; > -}; > - > -#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N') > - > -struct _ISCSI_CONNECTION { > - UINT32 Signature; > - LIST_ENTRY Link; > - > - EFI_EVENT TimeoutEvent; > - > - ISCSI_SESSION *Session; > - > - UINT8 State; > - UINT8 CurrentStage; > - UINT8 NextStage; > - > - UINT8 CHAPStep; > - > - BOOLEAN PartialReqSent; > - BOOLEAN PartialRspRcvd; > - > - BOOLEAN TransitInitiated; > - > - UINT16 Cid; > - UINT32 ExpStatSN; > - > - // > - // queues... > - // > - NET_BUF_QUEUE RspQue; > - > - TCP4_IO Tcp4Io; > - > - // > - // connection-only parameters > - // > - UINT32 MaxRecvDataSegmentLength; > - ISCSI_DIGEST_TYPE HeaderDigest; > - ISCSI_DIGEST_TYPE DataDigest; > -}; > - > -#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A') > - > -#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \ > - CR ( \ > - PassThru, \ > - ISCSI_DRIVER_DATA, \ > - IScsiExtScsiPassThru, \ > - ISCSI_DRIVER_DATA_SIGNATURE \ > - ) > -#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \ > - CR ( \ > - Identifier, \ > - ISCSI_DRIVER_DATA, \ > - IScsiIdentifier, \ > - ISCSI_DRIVER_DATA_SIGNATURE \ > - ) > -#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \ > - CR ( \ > - s, \ > - ISCSI_DRIVER_DATA, \ > - Session, \ > - ISCSI_DRIVER_DATA_SIGNATURE \ > - ) > - > -struct _ISCSI_DRIVER_DATA { > - UINT32 Signature; > - EFI_HANDLE Image; > - EFI_HANDLE Controller; > - ISCSI_PRIVATE_PROTOCOL IScsiIdentifier; > - EFI_HANDLE ChildHandle; > - EFI_EVENT ExitBootServiceEvent; > - > - EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru; > - EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode; > - EFI_HANDLE ExtScsiPassThruHandle; > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > - > - ISCSI_SESSION Session; > -}; > - > -#endif > diff --git > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > deleted file mode 100644 > index f967fb383095..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > +++ /dev/null > @@ -1,74 +0,0 @@ > -/** @file > - The header file for EFI iSCSI Initiator Name Protocol. > - > -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_INITIATOR_NAME_H_ > -#define _ISCSI_INITIATOR_NAME_H_ > - > -#include <Protocol/IScsiInitiatorName.h> > - > -extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName; > - > -// > -// EFI iSCSI Initiator Name Protocol for IScsi driver. > -// > - > -/** > - Retrieves the current set value of iSCSI Initiator Name. > - > - @param[in] This Pointer to the > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer > / Actual size of the > - variable data buffer. > - @param[out] Buffer Pointer to the buffer for data to be read. > - > - @retval EFI_SUCCESS Data was successfully retrieved into the > provided buffer and the > - BufferSize was sufficient to handle the iSCSI initiator name. > - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. > - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be > retrieved due to a hardware error. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiGetInitiatorName ( > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > - IN OUT UINTN *BufferSize, > - OUT VOID *Buffer > - ); > - > -/** > - Sets the iSCSI Initiator Name. > - > - @param[in] This Pointer to the > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. > - @param[in] Buffer Pointer to the buffer for data to be written. > - > - @retval EFI_SUCCESS Data was successfully stored by the protocol. > - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be > written. > - Currently not implemented. > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or > BufferSize exceeds the maximum allowed limit. > - @retval EFI_DEVICE_ERROR The data could not be stored due to a > hardware error. > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > the data. > - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not > adhere to RFC 3720 > - (and other related protocols). > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -EFIAPI > -IScsiSetInitiatorName ( > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > - IN OUT UINTN *BufferSize, > - IN VOID *Buffer > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > deleted file mode 100644 > index 500e00373b25..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > +++ /dev/null > @@ -1,317 +0,0 @@ > -/** @file > - Miscellaneous definitions for iSCSI driver. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_MISC_H_ > -#define _ISCSI_MISC_H_ > - > -#include <Library/BaseLib.h> > - > -typedef struct _ISCSI_SESSION_CONFIG_DATA > ISCSI_SESSION_CONFIG_DATA; > - > -/// > -/// IPv4 Device Path Node Length > -/// > -#define IP4_NODE_LEN_NEW_VERSIONS 27 > - > -#pragma pack(1) > -typedef struct { > - BOOLEAN Enabled; > - > - BOOLEAN InitiatorInfoFromDhcp; > - EFI_IPv4_ADDRESS LocalIp; > - EFI_IPv4_ADDRESS SubnetMask; > - EFI_IPv4_ADDRESS Gateway; > - > - BOOLEAN TargetInfoFromDhcp; > - CHAR8 TargetName[ISCSI_NAME_MAX_SIZE]; > - EFI_IPv4_ADDRESS TargetIp; > - UINT16 TargetPort; > - UINT8 BootLun[8]; > - > - UINT8 IsId[6]; > -} ISCSI_SESSION_CONFIG_NVDATA; > -#pragma pack() > - > -struct _ISCSI_SESSION_CONFIG_DATA { > - ISCSI_SESSION_CONFIG_NVDATA NvData; > - > - EFI_IPv4_ADDRESS PrimaryDns; > - EFI_IPv4_ADDRESS SecondaryDns; > - EFI_IPv4_ADDRESS DhcpServer; > -}; > - > -/** > - Calculate the prefix length of the IPv4 subnet mask. > - > - @param[in] SubnetMask The IPv4 subnet mask. > - > - @return The prefix length of the subnet mask. > - @retval 0 Other errors as indicated. > -**/ > -UINT8 > -IScsiGetSubnetMaskPrefixLength ( > - IN EFI_IPv4_ADDRESS *SubnetMask > - ); > - > -/** > - Convert the hexadecimal encoded LUN string into the 64-bit LUN. > - > - @param[in] Str The hexadecimal encoded LUN string. > - @param[out] Lun Storage to return the 64-bit LUN. > - > - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. > - @retval EFI_INVALID_PARAMETER The string is malformatted. > -**/ > -EFI_STATUS > -IScsiAsciiStrToLun ( > - IN CHAR8 *Str, > - OUT UINT8 *Lun > - ); > - > -/** > - Convert the 64-bit LUN into the hexadecimal encoded LUN string. > - > - @param[in] Lun The 64-bit LUN. > - @param[out] Str The storage to return the hexadecimal encoded LUN > string. > -**/ > -VOID > -IScsiLunToUnicodeStr ( > - IN UINT8 *Lun, > - OUT CHAR16 *Str > - ); > - > -/** > - Convert the ASCII string into a UNICODE string. > - > - @param[in] Source The ASCII string. > - @param[out] Destination The storage to return the UNICODE string. > - > - @return CHAR16 * Pointer to the UNICODE string. > -**/ > -CHAR16 * > -IScsiAsciiStrToUnicodeStr ( > - IN CHAR8 *Source, > - OUT CHAR16 *Destination > - ); > - > -/** > - Convert the UNICODE string into an ASCII string. > - > - @param[in] Source The UNICODE string. > - @param[out] Destination The storage to return the ASCII string. > - > - @return CHAR8 * Pointer to the ASCII string. > -**/ > -CHAR8 * > -IScsiUnicodeStrToAsciiStr ( > - IN CHAR16 *Source, > - OUT CHAR8 *Destination > - ); > - > -/** > - Convert the mac address into a hexadecimal encoded "-" seperated string. > - > - @param[in] Mac The mac address. > - @param[in] Len Length in bytes of the mac address. > - @param[in] VlanId VLAN ID of the network device. > - @param[out] Str The storage to return the mac string. > -**/ > -VOID > -IScsiMacAddrToStr ( > - IN EFI_MAC_ADDRESS *Mac, > - IN UINT32 Len, > - IN UINT16 VlanId, > - OUT CHAR16 *Str > - ); > - > -/** > - Convert the decimal dotted IPv4 address into the binary IPv4 address. > - > - @param[in] Str The UNICODE string. > - @param[out] Ip The storage to return the ASCII string. > - > - @retval EFI_SUCCESS The binary IP address is returned in Ip. > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > -**/ > -EFI_STATUS > -IScsiAsciiStrToIp ( > - IN CHAR8 *Str, > - OUT EFI_IPv4_ADDRESS *Ip > - ); > - > -/** > - Convert the binary encoded buffer into a hexadecimal encoded string. > - > - @param[in] BinBuffer The buffer containing the binary data. > - @param[in] BinLength Length of the binary buffer. > - @param[in, out] HexStr Pointer to the string. > - @param[in, out] HexLength The length of the string. > - > - @retval EFI_SUCCESS The binary data is converted to the hexadecimal > string > - and the length of the string is updated. > - @retval EFI_BUFFER_TOO_SMALL The string is too small. > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > -**/ > -EFI_STATUS > -IScsiBinToHex ( > - IN UINT8 *BinBuffer, > - IN UINT32 BinLength, > - IN OUT CHAR8 *HexStr, > - IN OUT UINT32 *HexLength > - ); > - > -/** > - Convert the hexadecimal string into a binary encoded buffer. > - > - @param[in, out] BinBuffer The binary buffer. > - @param[in, out] BinLength Length of the binary buffer. > - @param[in] HexStr The hexadecimal string. > - > - @retval EFI_SUCCESS The hexadecimal string is converted into a binary > - encoded buffer. > - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the > converted data. > -**/ > -EFI_STATUS > -IScsiHexToBin ( > - IN OUT UINT8 *BinBuffer, > - IN OUT UINT32 *BinLength, > - IN CHAR8 *HexStr > - ); > - > -/** > - Generate random numbers. > - > - @param[in, out] Rand The buffer to contain random numbers. > - @param[in] RandLength The length of the Rand buffer. > -**/ > -VOID > -IScsiGenRandom ( > - IN OUT UINT8 *Rand, > - IN UINTN RandLength > - ); > - > -/** > - Create the iSCSI driver data.. > - > - @param[in] Image The handle of the driver image. > - @param[in] Controller The handle of the controller. > - > - @return The iSCSI driver data created. > - @retval NULL Other errors as indicated. > -**/ > -ISCSI_DRIVER_DATA * > -IScsiCreateDriverData ( > - IN EFI_HANDLE Image, > - IN EFI_HANDLE Controller > - ); > - > -/** > - Clean the iSCSI driver data. > - > - @param[in] Private The iSCSI driver data. > - > - @retval EFI_SUCCES The clean operation is successful. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiCleanDriverData ( > - IN ISCSI_DRIVER_DATA *Private > - ); > - > -/** > - Check wheather the Controller is configured to use DHCP protocol. > - > - @param[in] Controller The handle of the controller. > - > - @retval TRUE The handle of the controller need the Dhcp > protocol. > - @retval FALSE The handle of the controller does not need the > Dhcp protocol. > - > -**/ > -BOOLEAN > -IScsiDhcpIsConfigured ( > - IN EFI_HANDLE Controller > - ); > - > -/** > - Get the various configuration data of this iSCSI instance. > - > - @param[in] Private The iSCSI driver data. > - > - @retval EFI_SUCCESS The configuration of this instance is got. > - @retval EFI_ABORTED The operation was aborted. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiGetConfigData ( > - IN ISCSI_DRIVER_DATA *Private > - ); > - > -/** > - Get the device path of the iSCSI tcp connection and update it. > - > - @param[in] Private The iSCSI driver data. > - > - @return The updated device path. > - @retval NULL Other errors as indicated. > -**/ > -EFI_DEVICE_PATH_PROTOCOL * > -IScsiGetTcpConnDevicePath ( > - IN ISCSI_DRIVER_DATA *Private > - ); > - > -/** > - Abort the session when the transition from BS to RT is initiated. > - > - @param[in] Event The event signaled. > - @param[in] Context The iSCSI driver data. > -**/ > -VOID > -EFIAPI > -IScsiOnExitBootService ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ); > - > -/** > - Tests whether a controller handle is being managed by IScsi driver. > - > - This function tests whether the driver specified by DriverBindingHandle is > - currently managing the controller specified by ControllerHandle. This test > - is performed by evaluating if the the protocol specified by ProtocolGuid is > - present on ControllerHandle and is was opened by DriverBindingHandle > and Nic > - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. > - If ProtocolGuid is NULL, then ASSERT(). > - > - @param ControllerHandle A handle for a controller to test. > - @param DriverBindingHandle Specifies the driver binding handle for the > - driver. > - @param ProtocolGuid Specifies the protocol that the driver specified > - by DriverBindingHandle opens in its Start() > - function. > - > - @retval EFI_SUCCESS ControllerHandle is managed by the driver > - specified by DriverBindingHandle. > - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the > driver > - specified by DriverBindingHandle. > - > -**/ > -EFI_STATUS > -EFIAPI > -IScsiTestManagedDevice ( > - IN EFI_HANDLE ControllerHandle, > - IN EFI_HANDLE DriverBindingHandle, > - IN EFI_GUID *ProtocolGuid > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > deleted file mode 100644 > index 6469df0434a1..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > +++ /dev/null > @@ -1,1005 +0,0 @@ > -/** @file > - The header file of iSCSI Protocol that defines many specific data structures. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_PROTO_H_ > -#define _ISCSI_PROTO_H_ > - > -#include <Protocol/ScsiPassThruExt.h> > - > -// > -// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32 > -// > -#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2)) > -#define ISCSI_SEQ_LT(s1, s2) \ > - ( \ > - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \ > - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \ > - ) > -#define ISCSI_SEQ_GT(s1, s2) \ > - ( \ > - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \ > - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \ > - ) > - > -#define ISCSI_WELL_KNOWN_PORT 3260 > -#define ISCSI_MAX_CONNS_PER_SESSION 1 > - > -#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192 > -#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536 > -#define DEFAULT_MAX_OUTSTANDING_R2T 1 > - > -#define ISCSI_VERSION_MAX 0x00 > -#define ISCSI_VERSION_MIN 0x00 > - > -#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME > EFI_TIMER_PERIOD_SECONDS(20) > -#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME > EFI_TIMER_PERIOD_SECONDS(20) > - > -#define ISCSI_KEY_AUTH_METHOD "AuthMethod" > -#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest" > -#define ISCSI_KEY_DATA_DIGEST "DataDigest" > -#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections" > -#define ISCSI_KEY_TARGET_NAME "TargetName" > -#define ISCSI_KEY_INITIATOR_NAME "InitiatorName" > -#define ISCSI_KEY_TARGET_ALIAS "TargetAlias" > -#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias" > -#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress" > -#define ISCSI_KEY_INITIAL_R2T "InitialR2T" > -#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData" > -#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG > "TargetPortalGroupTag" > -#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength" > -#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength" > -#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait" > -#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain" > -#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T" > -#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder" > -#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER > "DataSequenceInOrder" > -#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel" > -#define ISCSI_KEY_SESSION_TYPE "SessionType" > -#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH > "MaxRecvDataSegmentLength" > - > -#define ISCSI_KEY_VALUE_NONE "None" > - > -/// > -/// connection state for initiator > -/// > - > -#define CONN_STATE_FREE 0 > -#define CONN_STATE_XPT_WAIT 1 > -#define CONN_STATE_IN_LOGIN 2 > -#define CONN_STATE_LOGGED_IN 3 > -#define CONN_STATE_IN_LOGOUT 4 > -#define CONN_STATE_LOGOUT_REQUESTED 5 > -#define CONN_STATE_CLEANUP_WAIT 6 > -#define CONN_STATE_IN_CLEANUP 7 > - > -/// > -/// session state for initiator > -/// > -#define SESSION_STATE_FREE 0 > -#define SESSION_STATE_LOGGED_IN 1 > -#define SESSION_STATE_FAILED 2 > - > -typedef enum { > - DataIn = 0, > - DataOut = 1, > - DataBi = 2 > -} DATA_DIRECTION; > - > -#define ISCSI_RESERVED_TAG 0xffffffff > - > -#define ISCSI_REQ_IMMEDIATE 0x40 > -#define ISCSI_OPCODE_MASK 0x3F > - > -#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) > (PduHdr))->OpCode) = ((Op) | (Flgs))) > -#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) > (PduHdr))->OpCode) & ISCSI_OPCODE_MASK) > -#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) & > ISCSI_OPCODE_MASK) == (Op)) > -#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode & > ISCSI_REQ_IMMEDIATE) > -#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) > (PduHdr))->Flags |= (BOOLEAN)(Flag)) > -#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) > (PduHdr))->Flags &= ~(Flag)) > -#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *) > (PduHdr))->Flags & (Flag)) == (Flag)) > -#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8) > ((PduHdr)->Flags | ((Cur) << 2 | (Nxt)))) > -#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & > 0x3) > -#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3) > - > -#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3) > -#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3)) > - > -#define HTON24(Dst, Src) \ > - do { \ > - (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \ > - (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \ > - (Dst)[2] = (UINT8) ((Src) & 0xFF); \ > - } while (0); > - > -#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2])) > - > -#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 > (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength) > -#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 > (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len)) > - > -// > -// initiator opcodes > -// > -#define ISCSI_OPCODE_NOP_OUT 0x00 > -#define ISCSI_OPCODE_SCSI_CMD 0x01 > -#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02 > -#define ISCSI_OPCODE_LOGIN_REQ 0x03 > -#define ISCSI_OPCODE_TEXT_REQ 0x04 > -#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05 > -#define ISCSI_OPCODE_LOGOUT_REQ 0x06 > -#define ISCSI_OPCODE_SNACK_REQ 0x10 > -#define ISCSI_OPCODE_VENDOR_I0 0x1c > -#define ISCSI_OPCODE_VENDOR_I1 0x1d > -#define ISCSI_OPCODE_VENDOR_I2 0x1e > - > -// > -// target opcodes > -// > -#define ISCSI_OPCODE_NOP_IN 0x20 > -#define ISCSI_OPCODE_SCSI_RSP 0x21 > -#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22 > -#define ISCSI_OPCODE_LOGIN_RSP 0x23 > -#define ISCSI_OPCODE_TEXT_RSP 0x24 > -#define ISCSI_OPCODE_SCSI_DATA_IN 0x25 > -#define ISCSI_OPCODE_LOGOUT_RSP 0x26 > -#define ISCSI_OPCODE_R2T 0x31 > -#define ISCSI_OPCODE_ASYNC_MSG 0x32 > -#define ISCSI_OPCODE_VENDOR_T0 0x3c > -#define ISCSI_OPCODE_VENDOR_T1 0x3d > -#define ISCSI_OPCODE_VENDOR_T2 0x3e > -#define ISCSI_OPCODE_REJECT 0x3f > - > -#define ISCSI_BHS_FLAG_FINAL 0x80 > - > -/// > -/// iSCSI Basic Header Segment > -/// > -typedef struct _ISCSI_BASIC_HEADER { > - UINT8 OpCode; > - UINT8 Flags; > - UINT16 OpCodeSpecific1; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 OpCodeSpecific2[7]; > -} ISCSI_BASIC_HEADER; > - > -// > -// Defined AHS types, others are reserved. > -// > -#define ISCSI_AHS_TYPE_EXT_CDB 0x1 > -#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2 > - > -typedef struct _ISCSI_ADDTIONAL_HEADER { > - UINT16 Length; > - UINT8 Type; > - UINT8 TypeSpecific[1]; > -} ISCSI_ADDITIONAL_HEADER; > - > -typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS { > - UINT16 Length; > - UINT8 Type; > - UINT8 Reserved; > - UINT32 ExpReadDataLength; > -} ISCSI_BI_EXP_READ_DATA_LEN_AHS; > - > -#define SCSI_CMD_PDU_FLAG_READ 0x40 > -#define SCSI_CMD_PDU_FLAG_WRITE 0x20 > - > -#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07 > - > -// > -// task attributes > -// > -#define ISCSI_TASK_ATTR_UNTAGGED 0x00 > -#define ISCSI_TASK_ATTR_SIMPLE 0x01 > -#define ISCSI_TASK_ATTR_ORDERD 0x02 > -#define ISCSI_TASK_ATTR_HOQ 0x03 > -#define ISCSI_TASK_ATTR_ACA 0x04 > - > -/// > -/// SCSI Command > -/// > -typedef struct _SCSI_COMMAND { > - UINT8 OpCode; > - UINT8 Flags; > - UINT16 Reserved; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 ExpDataXferLength; > - UINT32 CmdSN; > - UINT32 ExpStatSN; > - UINT8 Cdb[16]; > -} SCSI_COMMAND; > - > -// > -// flag bit definitions in SCSI response > -// > -#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10 > -#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08 > -#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04 > -#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02 > - > -// > -// iSCSI service response codes > -// > -#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00 > -#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01 > - > -/// > -/// SCSI Response > -/// > -typedef struct _SCSI_RESPONSE { > - UINT8 OpCode; > - UINT8 Flags; > - UINT8 Response; > - UINT8 Status; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Reserved[8]; > - UINT32 InitiatorTaskTag; > - UINT32 SNACKTag; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT32 ExpDataSN; > - UINT32 BiReadResidualCount; > - UINT32 ResidualCount; > -} SCSI_RESPONSE; > - > -typedef struct _ISCSI_SENSE_DATA { > - UINT16 Length; > - UINT8 Data[2]; > -} ISCSI_SENSE_DATA; > - > -/// > -/// iSCSI Task Managment Function Request > -/// > -typedef struct _ISCSI_TMF_REQUEST { > - UINT8 OpCode; > - UINT8 Fuction; > - UINT16 Reserved1; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 ReferencedTaskTag; > - UINT32 CmdSN; > - UINT32 ExpStatSN; > - UINT32 RefCmdSN; > - UINT32 ExpDataSN; > - UINT32 Reserved2[2]; > -} ISCSI_TMF_REQUEST; > - > -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0 > -#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1 > -#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2 > -#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3 > -#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4 > -#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5 > -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6 > -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255 > - > -/// > -/// iSCSI Task Management Function Response > -/// > -typedef struct _ISCSI_TMF_RESPONSE { > - UINT8 OpCode; > - UINT8 Reserved1; > - UINT8 Response; > - UINT8 Reserved2; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT32 Reserver3[2]; > - UINT32 InitiatorTaskTag; > - UINT32 Reserved4; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT32 Reserved[3]; > -} ISCSI_TMF_RESPONSE; > - > -/// > -/// SCSI Data-Out > -/// > -typedef struct _ISCSI_SCSI_DATA_OUT { > - UINT8 OpCode; > - UINT8 Reserved1[3]; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 TargetTransferTag; > - UINT32 Reserved2; > - UINT32 ExpStatSN; > - UINT32 Reserved3; > - UINT32 DataSN; > - UINT32 BufferOffset; > - UINT32 Reserved4; > -} ISCSI_SCSI_DATA_OUT; > - > -#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40 > -#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW > SCSI_RSP_PDU_FLAG_OVERFLOW > -#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW > SCSI_RSP_PDU_FLAG_UNDERFLOW > -#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01 > - > -/// > -/// SCSI Data-In > -/// > -typedef struct _ISCSI_SCSI_DATA_IN { > - UINT8 OpCode; > - UINT8 Flags; > - UINT8 Reserved1; > - UINT8 Status; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 TargetTransferTag; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT32 DataSN; > - UINT32 BufferOffset; > - UINT32 ResidualCount; > -} ISCSI_SCSI_DATA_IN; > - > -#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL > (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset) > - > -/// > -/// Ready To Transfer > -/// > -typedef struct _ISCSI_READY_TO_TRANSFER { > - UINT8 OpCode; > - UINT8 Reserved1[3]; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 TargetTransferTag; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT32 R2TSeqNum; > - UINT32 BufferOffset; > - UINT32 DesiredDataTransferLength; > -} ISCSI_READY_TO_TRANSFER; > - > -typedef struct _ISCSI_ASYNC_MESSAGE { > - UINT8 OpCode; > - UINT8 Reserved1[8]; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 Reserved2; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT8 AsyncEvent; > - UINT8 AsyncVCode; > - UINT16 Parameter1; > - UINT16 Parameter2; > - UINT16 Parameter3; > - UINT32 Reserved3; > -} ISCSI_ASYNC_MESSAGE; > - > -#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80 > -#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40 > - > -/// > -/// Login Request > -/// > -typedef struct _ISCSI_LOGIN_REQUEST { > - UINT8 OpCode; > - UINT8 Flags; > - UINT8 VersionMax; > - UINT8 VersionMin; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Isid[6]; > - UINT16 Tsih; > - UINT32 InitiatorTaskTag; > - UINT16 Cid; > - UINT16 Reserved1; > - UINT32 CmdSN; > - UINT32 ExpStatSN; > - UINT32 Reserved2[4]; > -} ISCSI_LOGIN_REQUEST; > - > -#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT > ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT > -#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE > ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE > - > -#define ISCSI_LOGIN_STATUS_SUCCESS 0 > -#define ISCSI_LOGIN_STATUS_REDIRECTION 1 > -#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2 > -#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3 > - > -/// > -/// Login Response > -/// > -typedef struct _ISCSI_LOGIN_RESPONSE { > - UINT8 OpCode; > - UINT8 Flags; > - UINT8 VersionMax; > - UINT8 VersionActive; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Isid[6]; > - UINT16 Tsih; > - UINT32 InitiatorTaskTag; > - UINT32 Reserved1; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT8 StatusClass; > - UINT8 StatusDetail; > - UINT8 Reserved2[10]; > -} ISCSI_LOGIN_RESPONSE; > - > -#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0 > -#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1 > -#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY > 2 > - > -/// > -/// Logout Request > -/// > -typedef struct _ISCSI_LOGOUT_REQUEST { > - UINT8 OpCode; > - UINT8 ReasonCode; > - UINT16 Reserved1; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT32 Reserved2[2]; > - UINT32 InitiatorTaskTag; > - UINT16 Cid; > - UINT16 Reserved3; > - UINT32 CmdSN; > - UINT32 ExpStatSN; > - UINT32 Reserved4[4]; > -} ISCSI_LOGOUT_REQUEST; > - > -#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0 > -#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1 > -#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2 > -#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3 > - > -/// > -/// Logout Response > -/// > -typedef struct _ISCSI_LOGOUT_RESPONSE { > - UINT8 OpCode; > - UINT8 Reserved1; > - UINT8 Response; > - UINT8 Reserved2; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT32 Reserved3[2]; > - UINT32 InitiatorTaskTag; > - UINT32 Reserved4; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT32 Reserved5; > - UINT16 Time2Wait; > - UINT16 Time2Retain; > - UINT32 Reserved6; > -} ISCSI_LOGOUT_RESPONSE; > - > -#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0 > -#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1 > -#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2 > -#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3 > - > -/// > -/// SNACK Request > -/// > -typedef struct _ISCSI_SNACK_REQUEST { > - UINT8 OpCode; > - UINT8 Type; > - UINT16 Reserved1; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 TargetTransferTag; > - UINT32 Reserved2; > - UINT32 ExpStatSN; > - UINT32 Reserved[2]; > - UINT32 BegRun; > - UINT32 RunLength; > -} ISCSI_SNACK_REQUEST; > - > -/// > -/// Reject > -/// > -typedef struct _ISCSI_REJECT { > - UINT8 OpCode; > - UINT8 Reserved1; > - UINT8 Reason; > - UINT8 Reserved2; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT32 Reserved3[2]; > - UINT32 InitiatorTaskTag; > - UINT32 Reserved4; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT32 DataSN; > - UINT32 Reserved5[2]; > -} ISCSI_REJECT; > - > -/// > -/// NOP-Out > -/// > -typedef struct _ISCSI_NOP_OUT { > - UINT8 OpCode; > - UINT8 Reserved1[3]; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 TargetTransferTag; > - UINT32 CmdSN; > - UINT32 ExpStatSN; > - UINT32 Reserved2[4]; > -} ISCSI_NOP_OUT; > - > -/// > -/// NOP-In > -/// > -typedef struct _ISCSI_NOP_IN { > - UINT8 OpCode; > - UINT8 Reserved1[3]; > - UINT8 TotalAHSLength; > - UINT8 DataSegmentLength[3]; > - UINT8 Lun[8]; > - UINT32 InitiatorTaskTag; > - UINT32 TargetTransferTag; > - UINT32 StatSN; > - UINT32 ExpCmdSN; > - UINT32 MaxCmdSN; > - UINT32 Reserved2[3]; > -} ISCSI_NOP_IN; > - > -#define ISCSI_SECURITY_NEGOTIATION 0 > -#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1 > -#define ISCSI_FULL_FEATURE_PHASE 3 > - > -typedef enum { > - IScsiDigestNone, > - IScsiDigestCRC32 > -} ISCSI_DIGEST_TYPE; > - > -typedef struct _ISCSI_XFER_CONTEXT { > - UINT32 TargetTransferTag; > - UINT32 Offset; > - UINT32 DesiredLength; > - UINT32 ExpDataSN; > -} ISCSI_XFER_CONTEXT; > - > -typedef struct _ISCSI_IN_BUFFER_CONTEXT { > - UINT8 *InData; > - UINT32 InDataLen; > -} ISCSI_IN_BUFFER_CONTEXT; > - > -typedef struct _ISCSI_TCB { > - LIST_ENTRY Link; > - > - BOOLEAN SoFarInOrder; > - UINT32 ExpDataSN; > - BOOLEAN FbitReceived; > - BOOLEAN StatusXferd; > - UINT32 ActiveR2Ts; > - UINT32 Response; > - CHAR8 *Reason; > - UINT32 InitiatorTaskTag; > - UINT32 CmdSN; > - UINT32 SNACKTag; > - > - ISCSI_XFER_CONTEXT XferContext; > - > - ISCSI_CONNECTION *Conn; > -} ISCSI_TCB; > - > -typedef struct _ISCSI_KEY_VALUE_PAIR { > - LIST_ENTRY List; > - > - CHAR8 *Key; > - CHAR8 *Value; > -} ISCSI_KEY_VALUE_PAIR; > - > -/** > - Attach the iSCSI connection to the iSCSI session. > - > - @param[in, out] Session The iSCSI session. > - @param[in, out] Conn The iSCSI connection. > -**/ > -VOID > -IScsiAttatchConnection ( > - IN OUT ISCSI_SESSION *Session, > - IN OUT ISCSI_CONNECTION *Conn > - ); > - > -/** > - Detach the iSCSI connection from the session it belongs to. > - > - @param[in, out] Conn The iSCSI connection. > -**/ > -VOID > -IScsiDetatchConnection ( > - IN OUT ISCSI_CONNECTION *Conn > - ); > - > -/** > - This function does the iSCSI connection login. > - > - @param[in, out] Conn The iSCSI connection to login. > - > - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI > target. > - @retval EFI_TIMEOUT Timeout happened during the login procedure. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiConnLogin ( > - IN OUT ISCSI_CONNECTION *Conn > - ); > - > -/** > - Create a TCP connection for the iSCSI session. > - > - @param[in] Private The iSCSI driver data. > - @param[in] Session Maximum CmdSN from the target. > - > - @return The newly created iSCSI connection. > -**/ > -ISCSI_CONNECTION * > -IScsiCreateConnection ( > - IN ISCSI_DRIVER_DATA *Private, > - IN ISCSI_SESSION *Session > - ); > - > -/** > - Destroy an iSCSI connection. > - > - @param[in] Conn The connection to destroy. > -**/ > -VOID > -IScsiDestroyConnection ( > - IN ISCSI_CONNECTION *Conn > - ); > - > -/** > - Login the iSCSI session. > - > - @param[in] Private The iSCSI driver data. > - > - @retval EFI_SUCCESS The iSCSI session login procedure finished. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NO_MEDIA There was a media error. > - @retval Others Other errors as indicated. > - > -**/ > -EFI_STATUS > -IScsiSessionLogin ( > - IN ISCSI_DRIVER_DATA *Private > - ); > - > -/** > - Build and send the iSCSI login request to the iSCSI target according to > - the current login stage. > - > - @param[in] Conn The connection in the iSCSI login phase. > - > - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on > this > - connection. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_DEVICE_ERROR Some kind of device error happened. > -**/ > -EFI_STATUS > -IScsiSendLoginReq ( > - IN ISCSI_CONNECTION *Conn > - ); > - > -/** > - Receive and process the iSCSI login response. > - > - @param[in] Conn The connection in the iSCSI login phase. > - > - @retval EFI_SUCCESS The iSCSI login response PDU is received and > processed. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiReceiveLoginRsp ( > - IN ISCSI_CONNECTION *Conn > - ); > - > -/** > - Add an iSCSI key-value pair as a string into the data segment of the Login > Request PDU. > - The DataSegmentLength and the actual size of the net buffer containing > this PDU will be > - updated. > - > - @param[in, out] Pdu The iSCSI PDU whose data segment the key- > value pair will > - be added to. > - @param[in] Key The key name string. > - @param[in] Value The value string. > - > - @retval EFI_SUCCESS The key-valu pair is added to the PDU's > datasegment and > - the correspondence length fields are updated. > - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to > add the key-value > - pair. > -**/ > -EFI_STATUS > -IScsiAddKeyValuePair ( > - IN OUT NET_BUF *Pdu, > - IN CHAR8 *Key, > - IN CHAR8 *Value > - ); > - > -/** > - Prepare the iSCSI login request to be sent according to the current login > status. > - > - @param[in, out] Conn The connection in the iSCSI login phase. > - > - @return The pointer to the net buffer containing the iSCSI login request > built. > - @retval Others Other errors as indicated. > -**/ > -NET_BUF * > -IScsiPrepareLoginReq ( > - IN OUT ISCSI_CONNECTION *Conn > - ); > - > -/** > - Process the iSCSI Login Response. > - > - @param[in, out] Conn The connection on which the iSCSI login response is > received. > - @param[in, out] Pdu The iSCSI login response PDU. > - > - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all > check are passed. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > happened. > - @retval EFI_MEDIA_CHANGED Target is redirected. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiProcessLoginRsp ( > - IN OUT ISCSI_CONNECTION *Conn, > - IN OUT NET_BUF *Pdu > - ); > - > -/** > - Updated the target information according the data received in the iSCSI > - login response with an target redirection status. > - > - @param[in, out] Session The iSCSI session. > - @param[in] Data The data segment which should contain the > - TargetAddress key-value list. > - @param[in] Len Length of the data. > - > - @retval EFI_SUCCESS The target address is updated. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NOT_FOUND The TargetAddress key is not found. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiUpdateTargetAddress ( > - IN OUT ISCSI_SESSION *Session, > - IN CHAR8 *Data, > - IN UINT32 Len > - ); > - > -/** > - The callback function to free the net buffer list. > - > - @param[in] Arg The opaque parameter. > -**/ > -VOID > -EFIAPI > -IScsiFreeNbufList ( > - VOID *Arg > - ); > - > -/** > - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI > PDU header and > - an optional data segment. The two parts will be put into two blocks of > buffers in the > - net buffer. The digest check will be conducted in this function if needed > and the digests > - will be trimmed from the PDU buffer. > - > - @param[in] Conn The iSCSI connection to receive data from. > - @param[out] Pdu The received iSCSI pdu. > - @param[in] Context The context used to describe information on the > caller provided > - buffer to receive data segment of the iSCSI pdu, it's optional. > - @param[in] HeaderDigest Whether there will be header digest received. > - @param[in] DataDigest Whether there will be data digest. > - @param[in] TimeoutEvent The timeout event, it's optional. > - > - @retval EFI_SUCCESS An iSCSI pdu is received. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > happened. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiReceivePdu ( > - IN ISCSI_CONNECTION *Conn, > - OUT NET_BUF **Pdu, > - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL > - IN BOOLEAN HeaderDigest, > - IN BOOLEAN DataDigest, > - IN EFI_EVENT TimeoutEvent OPTIONAL > - ); > - > -/** > - Check and get the result of the prameter negotiation. > - > - @param[in, out] Conn The connection in iSCSI login. > - > - @retval EFI_SUCCESS The parmeter check is passed and negotiation is > finished. > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > happened. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > -**/ > -EFI_STATUS > -IScsiCheckOpParams ( > - IN OUT ISCSI_CONNECTION *Conn > - ); > - > -/** > - Fill the oprational prameters. > - > - @param[in] Conn The connection in iSCSI login. > - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters. > - > - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login > request PDU. > -**/ > -EFI_STATUS > -IScsiFillOpParams ( > - IN ISCSI_CONNECTION *Conn, > - IN OUT NET_BUF *Pdu > - ); > - > -/** > - Pad the iSCSI AHS or data segment to an integer number of 4 byte words. > - > - @param[in, out] Pdu The iSCSI pdu which contains segments to pad. > - @param[in] Len The length of the last semgnet in the PDU. > - > - @retval EFI_SUCCESS The segment is padded or no need to pad it. > - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free > space to add the > - padding bytes. > -**/ > -EFI_STATUS > -IScsiPadSegment ( > - IN OUT NET_BUF *Pdu, > - IN UINT32 Len > - ); > - > -/** > - Build a key-value list from the data segment. > - > - @param[in] Data The data segment containing the key-value pairs. > - @param[in] Len Length of the data segment. > - > - @return The key-value list. > - @retval NULL Other errors as indicated. > -**/ > -LIST_ENTRY * > -IScsiBuildKeyValueList ( > - IN CHAR8 *Data, > - IN UINT32 Len > - ); > - > -/** > - Get the value string by the key name from the key-value list. If found, > - the key-value entry will be removed from the list. > - > - @param[in, out] KeyValueList The key-value list. > - @param[in] Key The key name to find. > - > - @return The value string. > -**/ > -CHAR8 * > -IScsiGetValueByKeyFromList ( > - IN OUT LIST_ENTRY *KeyValueList, > - IN CHAR8 *Key > - ); > - > -/** > - Free the key-value list. > - > - @param[in] KeyValueList The key-value list. > -**/ > -VOID > -IScsiFreeKeyValueList ( > - IN LIST_ENTRY *KeyValueList > - ); > - > -/** > - Normalize the iSCSI name according to RFC. > - > - @param[in, out] Name The iSCSI name. > - @param[in] Len length of the iSCSI name. > - > - @retval EFI_SUCCESS The iSCSI name is valid and normalized. > - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in > the IQN format. > -**/ > -EFI_STATUS > -IScsiNormalizeName ( > - IN OUT CHAR8 *Name, > - IN UINTN Len > - ); > - > -/** > - Execute the SCSI command issued through the EXT SCSI PASS THRU > protocol. > - > - @param[in] PassThru The EXT SCSI PASS THRU protocol. > - @param[in] Target The target ID. > - @param[in] Lun The LUN. > - @param[in, out] Packet The request packet containing IO request, SCSI > command > - buffer and buffers to read/write. > - > - @retval EFI_SUCCES The SCSI command is executed and the result is > updated to > - the Packet. > - @retval EFI_DEVICE_ERROR Session state was not as required. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval EFI_NOT_READY The target can not accept new commands. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -IScsiExecuteScsiCommand ( > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, > - IN UINT8 *Target, > - IN UINT64 Lun, > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > - ); > - > -/** > - Reinstate the session on some error. > - > - @param[in, out] Private The iSCSI driver data. > - > - @retval EFI_SUCCES The session is reinstated from some error. > - @retval Other Reinstatement failed. > -**/ > -EFI_STATUS > -IScsiSessionReinstatement ( > - IN OUT ISCSI_DRIVER_DATA *Private > - ); > - > -/** > - Initialize some session parameters before login. > - > - @param[in, out] Session The iSCSI session. > - @param[in] Recovery Whether the request is from a fresh new start or > recovery. > -**/ > -VOID > -IScsiSessionInit ( > - IN OUT ISCSI_SESSION *Session, > - IN BOOLEAN Recovery > - ); > - > -/** > - Abort the iSCSI session, that is, reset all the connection and free the > - resources. > - > - @param[in, out] Session The iSCSI session. > - > - @retval EFI_SUCCES The session is aborted. > -**/ > -EFI_STATUS > -IScsiSessionAbort ( > - IN OUT ISCSI_SESSION *Session > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > deleted file mode 100644 > index 9e0f1e0f02c2..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > +++ /dev/null > @@ -1,142 +0,0 @@ > -/** @file > - iSCSI Tcp4 IO related definitions. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _ISCSI_TCP4_IO_H_ > -#define _ISCSI_TCP4_IO_H_ > - > -#include <Library/NetLib.h> > -#include <Protocol/Tcp4.h> > - > -typedef struct _TCP4_IO_CONFIG_DATA { > - EFI_IPv4_ADDRESS LocalIp; > - EFI_IPv4_ADDRESS SubnetMask; > - EFI_IPv4_ADDRESS Gateway; > - > - EFI_IPv4_ADDRESS RemoteIp; > - UINT16 RemotePort; > -} TCP4_IO_CONFIG_DATA; > - > -typedef struct _TCP4_IO { > - EFI_HANDLE Image; > - EFI_HANDLE Controller; > - > - EFI_HANDLE Handle; > - EFI_TCP4_PROTOCOL *Tcp4; > - > - EFI_TCP4_CONNECTION_TOKEN ConnToken; > - EFI_TCP4_IO_TOKEN TxToken; > - EFI_TCP4_IO_TOKEN RxToken; > - EFI_TCP4_CLOSE_TOKEN CloseToken; > - > - BOOLEAN IsConnDone; > - BOOLEAN IsTxDone; > - BOOLEAN IsRxDone; > - BOOLEAN IsCloseDone; > -} TCP4_IO; > - > -/** > - Create a TCP socket with the specified configuration data. > - > - @param[in] Image The handle of the driver image. > - @param[in] Controller The handle of the controller. > - @param[in] ConfigData The Tcp4 configuration data. > - @param[in] Tcp4Io The Tcp4Io. > - > - @retval EFI_SUCCESS The TCP socket is created and configured. > - @retval Others Failed to create the TCP socket or configure it. > -**/ > -EFI_STATUS > -Tcp4IoCreateSocket ( > - IN EFI_HANDLE Image, > - IN EFI_HANDLE Controller, > - IN TCP4_IO_CONFIG_DATA *ConfigData, > - IN TCP4_IO *Tcp4Io > - ); > - > -/** > - Destroy the socket. > - > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. > -**/ > -VOID > -Tcp4IoDestroySocket ( > - IN TCP4_IO *Tcp4Io > - ); > - > -/** > - Connect to the other endpoint of the TCP socket. > - > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > - @param[in] Timeout The time to wait for connection done. > - > - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket > successfully. > - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the > TCP socket in the specified time period. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -Tcp4IoConnect ( > - IN OUT TCP4_IO *Tcp4Io, > - IN EFI_EVENT Timeout > - ); > - > -/** > - Reset the socket. > - > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > -**/ > -VOID > -Tcp4IoReset ( > - IN OUT TCP4_IO *Tcp4Io > - ); > - > -/** > - Transmit the Packet to the other endpoint of the socket. > - > - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. > - @param[in] Packet The packet to transmit. > - > - @retval EFI_SUCCESS The packet is trasmitted. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -Tcp4IoTransmit ( > - IN TCP4_IO *Tcp4Io, > - IN NET_BUF *Packet > - ); > - > -/** > - Receive data from the socket. > - > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be > destroyed. > - @param[in] Packet The buffer to hold the data copy from the soket rx > buffer. > - @param[in] AsyncMode Is this receive asyncronous or not. > - @param[in] Timeout The time to wait for receiving the amount of data > the Packet > - can hold. > - > - @retval EFI_SUCCESS The required amount of data is received from > the socket. > - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. > - @retval EFI_TIMEOUT Failed to receive the required amount of data in > the > - specified time period. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -Tcp4IoReceive ( > - IN TCP4_IO *Tcp4Io, > - IN NET_BUF *Packet, > - IN BOOLEAN AsyncMode, > - IN EFI_EVENT Timeout > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > deleted file mode 100644 > index 1541b2d8ece1..000000000000 > --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > +++ /dev/null > @@ -1,80 +0,0 @@ > -/** @file > - Header file for Md5. > - > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _MD5_H_ > -#define _MD5_H_ > - > -#include <Uefi.h> > -#include <Library/BaseLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/NetLib.h> > - > -#define MD5_HASHSIZE 16 > - > -typedef struct _MD5_CTX { > - EFI_STATUS Status; > - UINT64 Length; > - UINT32 States[MD5_HASHSIZE / sizeof (UINT32)]; > - UINT8 M[64]; > - UINTN Count; > -} MD5_CTX; > - > -/** > - Initialize four 32-bits chaining variables and use them to do the Md5 > transform. > - > - @param[out] Md5Ctx The data structure of Md5. > - > - @retval EFI_SUCCESS Initialization is ok. > -**/ > -EFI_STATUS > -MD5Init ( > - OUT MD5_CTX *Md5Ctx > - ); > - > -/** > - the external interface of Md5 algorithm > - > - @param[in, out] Md5Ctx The data structure of storing the original data > - segment and the final result. > - @param[in] Data The data wanted to be transformed. > - @param[in] DataLen The length of data. > - > - @retval EFI_SUCCESS The transform is ok. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -MD5Update ( > - IN OUT MD5_CTX *Md5Ctx, > - IN VOID *Data, > - IN UINTN DataLen > - ); > - > -/** > - Accumulate the MD5 value of every data segment and generate the finial > - result according to MD5 algorithm. > - > - @param[in, out] Md5Ctx The data structure of storing the original data > - segment and the final result. > - @param[out] HashVal The final 128-bits output. > - > - @retval EFI_SUCCESS The transform is ok. > - @retval Others Other errors as indicated. > -**/ > -EFI_STATUS > -MD5Final ( > - IN OUT MD5_CTX *Md5Ctx, > - OUT UINT8 *HashVal > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > deleted file mode 100644 > index bea7479eb222..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > +++ /dev/null > @@ -1,131 +0,0 @@ > -/** @file > - Socket implementation header file. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _SOCK_IMPL_H_ > -#define _SOCK_IMPL_H_ > - > -#include "Socket.h" > -#include "Tcp4Main.h" > - > -/** > - Signal a event with the given status. > - > - @param Token The token's event is to be signaled. > - @param TokenStatus The status to be sent with the event. > - > -**/ > -#define SIGNAL_TOKEN(Token, TokenStatus) \ > - do { \ > - (Token)->Status = (TokenStatus); \ > - gBS->SignalEvent ((Token)->Event); \ > - } while (0) > - > - > -/** > - Supporting function for both SockImpl and SockInterface. > - > - @param Event The Event this notify function registered to, ignored. > - > -**/ > -VOID > -EFIAPI > -SockFreeFoo ( > - IN EFI_EVENT Event > - ); > - > -/** > - Process the TCP send data, buffer the tcp txdata and append > - the buffer to socket send buffer,then try to send it. > - > - @param Sock Pointer to the socket. > - @param TcpTxData Pointer to the tcp txdata. > - > - @retval EFI_SUCCESS The operation is completed successfully. > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > - > -**/ > -EFI_STATUS > -SockProcessTcpSndData ( > - IN SOCKET *Sock, > - IN VOID *TcpTxData > - ); > - > -/** > - Copy data from socket buffer to application provided receive buffer. > - > - @param Sock Pointer to the socket. > - @param TcpRxData Pointer to the application provided receive > buffer. > - @param RcvdBytes The maximum length of the data can be copied. > - @param IsOOB If TRUE the data is OOB, else the data is normal. > - > -**/ > -VOID > -SockSetTcpRxData ( > - IN SOCKET *Sock, > - IN VOID *TcpRxData, > - IN UINT32 RcvdBytes, > - IN BOOLEAN IsOOB > - ); > - > -/** > - Get received data from the socket layer to the receive token. > - > - @param Sock Pointer to the socket. > - @param RcvToken Pointer to the application provided receive token. > - > - @return The length of data received in this token. > - > -**/ > -UINT32 > -SockProcessRcvToken ( > - IN SOCKET *Sock, > - IN OUT SOCK_IO_TOKEN *RcvToken > - ); > - > -/** > - Flush the socket. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockConnFlush ( > - IN OUT SOCKET *Sock > - ); > - > -/** > - Create a socket with initial data SockInitData. > - > - @param SockInitData Pointer to the initial data of the socket. > - > - @return Pointer to the newly created socket. > - > -**/ > -SOCKET * > -SockCreate ( > - IN SOCK_INIT_DATA *SockInitData > - ); > - > -/** > - Destroy a socket. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockDestroy ( > - IN OUT SOCKET *Sock > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > deleted file mode 100644 > index 650a7dd8651f..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > +++ /dev/null > @@ -1,954 +0,0 @@ > -/** @file > - Socket header file. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _SOCKET_H_ > -#define _SOCKET_H_ > - > -#include <Uefi.h> > - > -#include <Protocol/Ip4.h> > -#include <Protocol/Tcp4.h> > -#include <Protocol/Udp4.h> > - > -#include <Library/NetLib.h> > -#include <Library/DebugLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiDriverEntryPoint.h> > -#include <Library/UefiLib.h> > -#include <Library/DpcLib.h> > -#include <Library/PrintLib.h> > - > -#define SOCK_SND_BUF 0 > -#define SOCK_RCV_BUF 1 > - > -#define SOCK_BUFF_LOW_WATER (2 * 1024) > -#define SOCK_RCV_BUFF_SIZE (8 * 1024) > -#define SOCK_SND_BUFF_SIZE (8 * 1024) > -#define SOCK_BACKLOG 5 > - > -#define PROTO_RESERVED_LEN 20 > - > -#define SO_NO_MORE_DATA 0x0001 > - > -// > -// > -// > -// When a socket is created it enters into SO_UNCONFIGURED, > -// no actions can be taken on this socket, only after calling > -// SockConfigure. The state transition diagram of socket is > -// as following: > -// > -// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING > -// ^ | | > -// | ---> SO_LISTENING | > -// | | > -// |------------------SO_DISCONNECTING<-- SO_CONNECTED > -// > -// A passive socket can only go into SO_LISTENING and > -// SO_UNCONFIGURED state. SO_XXXING state is a middle state > -// when a socket is undergoing a protocol procedure such > -// as requesting a TCP connection. > -// > -// > -// > - > -/// > -/// Socket state > -/// > -#define SO_CLOSED 0 > -#define SO_LISTENING 1 > -#define SO_CONNECTING 2 > -#define SO_CONNECTED 3 > -#define SO_DISCONNECTING 4 > - > -/// > -/// Socket configure state > -/// > -#define SO_UNCONFIGURED 0 > -#define SO_CONFIGURED_ACTIVE 1 > -#define SO_CONFIGURED_PASSIVE 2 > -#define SO_NO_MAPPING 3 > - > -/** > - Set socket SO_NO_MORE_DATA flag. > - > - @param Sock Pointer to the socket > - > -**/ > -#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= > SO_NO_MORE_DATA) > - > -/** > - Check whether the socket is unconfigured. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is unconfigued > - @retval False The socket is not unconfigued > - > -**/ > -#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == > SO_UNCONFIGURED) > - > -/** > - Check whether the socket is configured. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is configued > - @retval False The socket is not configued > - > -**/ > -#define SOCK_IS_CONFIGURED(Sock) \ > - (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \ > - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)) > - > -/** > - Check whether the socket is configured to active mode. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is configued to active mode > - @retval False The socket is not configued to active mode > - > -**/ > -#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \ > - ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) > - > -/** > - Check whether the socket is configured to passive mode. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is configued to passive mode > - @retval False The socket is not configued to passive mode > - > -**/ > -#define SOCK_IS_CONNECTED_PASSIVE(Sock) \ > - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE) > - > -/** > - Check whether the socket is mapped. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is no mapping > - @retval False The socket is mapped > - > -**/ > -#define SOCK_IS_NO_MAPPING(Sock) \ > - ((Sock)->ConfigureState == SO_NO_MAPPING) > - > -/** > - Check whether the socket is closed. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is closed > - @retval False The socket is not closed > - > -**/ > -#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED) > - > -/** > - Check whether the socket is listening. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is listening > - @retval False The socket is not listening > - > -**/ > -#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING) > - > -/** > - Check whether the socket is connecting. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is connecting > - @retval False The socket is not connecting > - > -**/ > -#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == > SO_CONNECTING) > - > -/** > - Check whether the socket has connected. > - > - @param Sock Pointer to the socket > - > - @retval True The socket has connected > - @retval False The socket has not connected > - > -**/ > -#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED) > - > -/** > - Check whether the socket is disconnecting. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is disconnecting > - @retval False The socket is not disconnecting > - > -**/ > -#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == > SO_DISCONNECTING) > - > -/** > - Check whether the socket is no more data. > - > - @param Sock Pointer to the socket > - > - @retval True The socket is no more data > - @retval False The socket still has data > - > -**/ > -#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & > SO_NO_MORE_DATA)) > - > -/** > - Set the size of the receive buffer. > - > - @param Sock Pointer to the socket > - @param Size The size to set > - > -**/ > -#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = > (Size)) > - > -/** > - Get the size of the receive buffer. > - > - @param Sock Pointer to the socket > - > - @return The receive buffer size > - > -**/ > -#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater) > - > -/** > - Get the size of the receive data. > - > - @param Sock Pointer to the socket > - > - @return The received data size > - > -**/ > -#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)- > >BufSize) > - > -/** > - Set the size of the send buffer. > - > - @param Sock Pointer to the socket > - @param Size The size to set > - > -**/ > -#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = > (Size)) > - > -/** > - Get the size of the send buffer. > - > - @param Sock Pointer to the socket > - > - @return The send buffer size > - > -**/ > -#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater) > - > -/** > - Get the size of the send data. > - > - @param Sock Pointer to the socket > - > - @return The send data size > - > -**/ > -#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)- > >BufSize) > - > -/** > - Set the backlog value of the socket. > - > - @param Sock Pointer to the socket > - @param Value The value to set > - > -**/ > -#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value)) > - > -/** > - Get the backlog value of the socket. > - > - @param Sock Pointer to the socket > - > - @return The backlog value > - > -**/ > -#define GET_BACKLOG(Sock) ((Sock)->BackLog) > - > -/** > - Set the socket with error state. > - > - @param Sock Pointer to the socket > - @param Error The error state > - > -**/ > -#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error)) > - > -#define SND_BUF_HDR_LEN(Sock) \ > - ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize) > - > -#define RCV_BUF_HDR_LEN(Sock) \ > - ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize) > - > -#define SOCK_SIGNATURE SIGNATURE_32 ('S', 'O', 'C', 'K') > - > -#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, > SOCK_SIGNATURE) > - > -#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock) > - > -#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \ > - ((Type *) (((SOCK_TOKEN *) (SockToken))->Token)) > - > -typedef struct _SOCKET SOCKET; > - > -/// > -/// Socket completion token > -/// > -typedef struct _SOCK_COMPLETION_TOKEN { > - EFI_EVENT Event; ///< The event to be issued > - EFI_STATUS Status; ///< The status to be issued > -} SOCK_COMPLETION_TOKEN; > - > -typedef union { > - VOID *RxData; > - VOID *TxData; > -} SOCK_IO_DATA; > - > -/// > -/// The application token with data packet > -/// > -typedef struct _SOCK_IO_TOKEN { > - SOCK_COMPLETION_TOKEN Token; > - SOCK_IO_DATA Packet; > -} SOCK_IO_TOKEN; > - > -/// > -/// The request issued from socket layer to protocol layer. > -/// > -#define SOCK_ATTACH 0 ///< Attach current socket to a new PCB > -#define SOCK_DETACH 1 ///< Detach current socket from the PCB > -#define SOCK_CONFIGURE 2 ///< Configure attached PCB > -#define SOCK_FLUSH 3 ///< Flush attached PCB > -#define SOCK_SND 4 ///< Need protocol to send something > -#define SOCK_SNDPUSH 5 ///< Need protocol to send pushed data > -#define SOCK_SNDURG 6 ///< Need protocol to send urgent data > -#define SOCK_CONSUMED 7 ///< Application has retrieved data from > socket > -#define SOCK_CONNECT 8 ///< Need to connect to a peer > -#define SOCK_CLOSE 9 ///< Need to close the protocol process > -#define SOCK_ABORT 10 ///< Need to reset the protocol process > -#define SOCK_POLL 11 ///< Need to poll to the protocol layer > -#define SOCK_ROUTE 12 ///< Need to add a route information > -#define SOCK_MODE 13 ///< Need to get the mode data of the protocol > -#define SOCK_GROUP 14 ///< Need to join a mcast group > - > -/// > -/// The socket type. > -/// > -typedef enum { > - SockDgram, ///< This socket providing datagram service > - SockStream ///< This socket providing stream service > -} SOCK_TYPE; > - > -/// > -/// The buffer structure of rcvd data and send data used by socket. > -/// > -typedef struct _SOCK_BUFFER { > - UINT32 HighWater; ///< The buffersize upper limit of sock_buffer > - UINT32 LowWater; ///< The low water mark of sock_buffer > - NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data > -} SOCK_BUFFER; > - > -/** > - The handler of protocol for request from socket. > - > - @param Socket The socket issuing the request to protocol > - @param Request The request issued by socket > - @param RequestData The request related data > - > - @retval EFI_SUCCESS The socket request is completed successfully. > - @retval other The error status returned by the corresponding TCP > - layer function. > - > -**/ > -typedef > -EFI_STATUS > -(*SOCK_PROTO_HANDLER) ( > - IN SOCKET *Socket, > - IN UINT8 Request, > - IN VOID *RequestData > - ); > - > - > -// > -// Socket provided oprerations for low layer protocol > -// > - > -// > -// Socket provided operations for user interface > -// > - > -/** > - Set the state of the socket. > - > - @param Sock Pointer to the socket. > - @param State The new socket state to be set. > - > -**/ > -VOID > -SockSetState ( > - IN OUT SOCKET *Sock, > - IN UINT8 State > - ); > - > -/** > - Called by the low layer protocol to indicate the socket a connection is > - established. > - > - This function just changes the socket's state to SO_CONNECTED > - and signals the token used for connection establishment. > - > - @param Sock Pointer to the socket associated with the > - established connection. > - > -**/ > -VOID > -SockConnEstablished ( > - IN SOCKET *Sock > - ); > - > -/** > - Called by the low layer protocol to indicate the connection is closed. > - > - This function flushes the socket, sets the state to SO_CLOSED and signals > - the close token. > - > - @param Sock Pointer to the socket associated with the closed > - connection. > - > -**/ > -VOID > -SockConnClosed ( > - IN OUT SOCKET *Sock > - ); > - > -/** > - Called by low layer protocol to indicate that some data is sent or processed. > - > - This function trims the sent data in the socket send buffer, signals the data > - token if proper. > - > - @param Sock Pointer to the socket. > - @param Count The length of the data processed or sent, in bytes. > - > -**/ > -VOID > -SockDataSent ( > - IN SOCKET *Sock, > - IN UINT32 Count > - ); > - > -/** > - Called by the low layer protocol to copy some data in socket send > - buffer starting from the specific offset to a buffer provided by > - the caller. > - > - @param Sock Pointer to the socket. > - @param Offset The start point of the data to be copied. > - @param Len The length of the data to be copied. > - @param Dest Pointer to the destination to copy the data. > - > - @return The data size copied. > - > -**/ > -UINT32 > -SockGetDataToSend ( > - IN SOCKET *Sock, > - IN UINT32 Offset, > - IN UINT32 Len, > - IN UINT8 *Dest > - ); > - > -/** > - Called by the low layer protocol to indicate that there > - will be no more data from the communication peer. > - > - This function set the socket's state to SO_NO_MORE_DATA and > - signal all queued IO tokens with the error status EFI_CONNECTION_FIN. > - > - @param Sock Pointer to the socket. > - > -**/ > -VOID > -SockNoMoreData ( > - IN OUT SOCKET *Sock > - ); > - > -/** > - Called by the low layer protocol to deliver received data to socket layer. > - > - This function will append the data to the socket receive buffer, set ther > - urgent data length and then check if any receive token can be signaled. > - > - @param Sock Pointer to the socket. > - @param NetBuffer Pointer to the buffer that contains the received > - data. > - @param UrgLen The length of the urgent data in the received data. > - > -**/ > -VOID > -SockDataRcvd ( > - IN SOCKET *Sock, > - IN OUT NET_BUF *NetBuffer, > - IN UINT32 UrgLen > - ); > - > -/** > - Get the length of the free space of the specific socket buffer. > - > - @param Sock Pointer to the socket. > - @param Which Flag to indicate which socket buffer to check, > - either send buffer or receive buffer. > - > - @return The length of the free space, in bytes. > - > -**/ > -UINT32 > -SockGetFreeSpace ( > - IN SOCKET *Sock, > - IN UINT32 Which > - ); > - > -/** > - Clone a new socket including its associated protocol control block. > - > - @param Sock Pointer to the socket to be cloned. > - > - @return Pointer to the newly cloned socket. If NULL, error condition > occurred. > - > -**/ > -SOCKET * > -SockClone ( > - IN SOCKET *Sock > - ); > - > - > -/// > -/// Proto type of the create callback > -/// > -typedef > -EFI_STATUS > -(*SOCK_CREATE_CALLBACK) ( > - IN SOCKET *This, > - IN VOID *Context > - ); > - > -/// > -/// Proto type of the destroy callback > -/// > -typedef > -VOID > -(*SOCK_DESTROY_CALLBACK) ( > - IN SOCKET *This, > - IN VOID *Context > - ); > - > -/// > -/// The initialize data for create a new socket. > -/// > -typedef struct _SOCK_INIT_DATA { > - SOCK_TYPE Type; > - UINT8 State; > - > - SOCKET *Parent; ///< The parent of this socket > - UINT32 BackLog; ///< The connection limit for listening socket > - UINT32 SndBufferSize; ///< The high water mark of send buffer > - UINT32 RcvBufferSize; ///< The high water mark of receive buffer > - VOID *Protocol; ///< The pointer to protocol function template > - ///< wanted to install on socket > - > - // > - // Callbacks after socket is created and before socket is to be destroyed. > - // > - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created > - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before > destroied > - VOID *Context; ///< The context of the callback > - > - // > - // Opaque protocol data. > - // > - VOID *ProtoData; > - UINT32 DataSize; > - > - SOCK_PROTO_HANDLER ProtoHandler; ///< The handler of protocol for > socket request > - > - EFI_HANDLE DriverBinding; ///< The driver binding handle > -} SOCK_INIT_DATA; > - > -/// > -/// The union type of TCP and UDP protocol. > -/// > -typedef union _NET_PROTOCOL { > - EFI_TCP4_PROTOCOL TcpProtocol; ///< Tcp protocol > - EFI_UDP4_PROTOCOL UdpProtocol; ///< Udp protocol > -} NET_PROTOCOL; > - > -/// > -/// The socket structure representing a network service access point > -/// > -struct _SOCKET { > - > - // > - // Socket description information > - // > - UINT32 Signature; ///< Signature of the socket > - EFI_HANDLE SockHandle; ///< The virtual handle of the socket > - EFI_HANDLE DriverBinding; ///< Socket's driver binding protocol > - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > - LIST_ENTRY Link; > - UINT8 ConfigureState; > - SOCK_TYPE Type; > - UINT8 State; > - UINT16 Flag; > - EFI_LOCK Lock; ///< The lock of socket > - SOCK_BUFFER SndBuffer; ///< Send buffer of application's data > - SOCK_BUFFER RcvBuffer; ///< Receive buffer of received data > - EFI_STATUS SockError; ///< The error returned by low layer protocol > - BOOLEAN InDestroy; > - > - // > - // Fields used to manage the connection request > - // > - UINT32 BackLog; ///< the limit of connection to this socket > - UINT32 ConnCnt; ///< the current count of connections to it > - SOCKET *Parent; ///< listening parent that accept the connection > - LIST_ENTRY ConnectionList; ///< the connections maintained by this > socket > - > - // > - // The queue to buffer application's asynchronous token > - // > - LIST_ENTRY ListenTokenList; > - LIST_ENTRY RcvTokenList; > - LIST_ENTRY SndTokenList; > - LIST_ENTRY ProcessingSndTokenList; > - > - SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal > if connected > - SOCK_COMPLETION_TOKEN *CloseToken; ///< app's token to signal if > closed > - > - // > - // Interface for low level protocol > - // > - SOCK_PROTO_HANDLER ProtoHandler; ///< The request handler of > protocol > - UINT8 ProtoReserved[PROTO_RESERVED_LEN]; ///< Data fields reserved > for protocol > - NET_PROTOCOL NetProtocol; ///< TCP or UDP protocol socket used > - > - // > - // Callbacks after socket is created and before socket is to be destroyed. > - // > - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created > - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before > destroied > - VOID *Context; ///< The context of the callback > -}; > - > -/// > -/// The token structure buffered in socket layer. > -/// > -typedef struct _SOCK_TOKEN { > - LIST_ENTRY TokenList; ///< The entry to add in the token list > - SOCK_COMPLETION_TOKEN *Token; ///< The application's token > - UINT32 RemainDataLen; ///< Unprocessed data length > - SOCKET *Sock; ///< The poninter to the socket this token > - ///< belongs to > -} SOCK_TOKEN; > - > -/// > -/// Reserved data to access the NET_BUF delivered by UDP driver. > -/// > -typedef struct _UDP_RSV_DATA { > - EFI_TIME TimeStamp; > - EFI_UDP4_SESSION_DATA Session; > -} UDP_RSV_DATA; > - > -/// > -/// Reserved data to access the NET_BUF delivered by TCP driver. > -/// > -typedef struct _TCP_RSV_DATA { > - UINT32 UrgLen; > -} TCP_RSV_DATA; > - > -/** > - Create a socket and its associated protocol control block > - with the intial data SockInitData and protocol specific > - data ProtoData. > - > - @param SockInitData Inital data to setting the socket. > - > - @return Pointer to the newly created socket. If NULL, error condition > occured. > - > -**/ > -SOCKET * > -SockCreateChild ( > - IN SOCK_INIT_DATA *SockInitData > - ); > - > -/** > - Destroy the socket Sock and its associated protocol control block. > - > - @param Sock The socket to be destroyed. > - > - @retval EFI_SUCCESS The socket Sock is destroyed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. > - > -**/ > -EFI_STATUS > -SockDestroyChild ( > - IN SOCKET *Sock > - ); > - > -/** > - Configure the specific socket Sock using configuration data ConfigData. > - > - @param Sock Pointer to the socket to be configured. > - @param ConfigData Pointer to the configuration data. > - > - @retval EFI_SUCCESS The socket is configured successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or > the > - socket is already configured. > - > -**/ > -EFI_STATUS > -SockConfigure ( > - IN SOCKET *Sock, > - IN VOID *ConfigData > - ); > - > -/** > - Initiate a connection establishment process. > - > - @param Sock Pointer to the socket to initiate the initate the > - connection. > - @param Token Pointer to the token used for the connection > - operation. > - > - @retval EFI_SUCCESS The connection is initialized successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not configured to > - be an active one, or the token is already in one of > - this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockConnect ( > - IN SOCKET *Sock, > - IN VOID *Token > - ); > - > -/** > - Issue a listen token to get an existed connected network instance > - or wait for a connection if there is none. > - > - @param Sock Pointer to the socket to accept connections. > - @param Token The token to accept a connection. > - > - @retval EFI_SUCCESS Either a connection is accpeted or the Token is > - buffered for further acception. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not configured to > - be a passive one, or the token is already in one of > - this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to > memory limit. > - > -**/ > -EFI_STATUS > -SockAccept ( > - IN SOCKET *Sock, > - IN VOID *Token > - ); > - > -/** > - Issue a token with data to the socket to send out. > - > - @param Sock Pointer to the socket to process the token with > - data. > - @param Token The token with data that needs to send out. > - > - @retval EFI_SUCCESS The token is processed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not in a > - synchronized state , or the token is already in one > - of this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > memory limit. > - > -**/ > -EFI_STATUS > -SockSend ( > - IN SOCKET *Sock, > - IN VOID *Token > - ); > - > -/** > - Issue a token to get data from the socket. > - > - @param Sock Pointer to the socket to get data from. > - @param Token The token to store the received data from the > - socket. > - > - @retval EFI_SUCCESS The token is processed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not in a > - synchronized state , or the token is already in one > - of this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - @retval EFI_CONNECTION_FIN The connection is closed and there is no > more data. > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > memory limit. > - > -**/ > -EFI_STATUS > -SockRcv ( > - IN SOCKET *Sock, > - IN VOID *Token > - ); > - > -/** > - Reset the socket and its associated protocol control block. > - > - @param Sock Pointer to the socket to be flushed. > - > - @retval EFI_SUCCESS The socket is flushed successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. > - > -**/ > -EFI_STATUS > -SockFlush ( > - IN SOCKET *Sock > - ); > - > -/** > - Close or abort the socket associated connection. > - > - @param Sock Pointer to the socket of the connection to close or > - abort. > - @param Token The token for close operation. > - @param OnAbort TRUE for aborting the connection, FALSE to close it. > - > - @retval EFI_SUCCESS The close or abort operation is initialized > - successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, > or the > - socket is closed, or the socket is not in a > - synchronized state , or the token is already in one > - of this socket's lists. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockClose ( > - IN SOCKET *Sock, > - IN VOID *Token, > - IN BOOLEAN OnAbort > - ); > - > -/** > - Get the mode data of the low layer protocol. > - > - @param Sock Pointer to the socket to get mode data from. > - @param Mode Pointer to the data to store the low layer mode > - information. > - > - @retval EFI_SUCCESS The mode data is got successfully. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockGetMode ( > - IN SOCKET *Sock, > - IN OUT VOID *Mode > - ); > - > -/** > - Add or remove route information in IP route table associated > - with this socket. > - > - @param Sock Pointer to the socket associated with the IP route > - table to operate on. > - @param RouteInfo Pointer to the route information to be processed. > - > - @retval EFI_SUCCESS The route table is updated successfully. > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. > - @retval EFI_NO_MAPPING The IP address configuration operation is > not > - finished. > - @retval EFI_NOT_STARTED The socket is not configured. > - > -**/ > -EFI_STATUS > -SockRoute ( > - IN SOCKET *Sock, > - IN VOID *RouteInfo > - ); > - > -// > -// Supporting function to operate on socket buffer > -// > - > -/** > - Get the first buffer block in the specific socket buffer. > - > - @param Sockbuf Pointer to the socket buffer. > - > - @return Pointer to the first buffer in the queue. NULL if the queue is > empty. > - > -**/ > -NET_BUF * > -SockBufFirst ( > - IN SOCK_BUFFER *Sockbuf > - ); > - > -/** > - Get the next buffer block in the specific socket buffer. > - > - @param Sockbuf Pointer to the socket buffer. > - @param SockEntry Pointer to the buffer block prior to the required > - one. > - > - @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is > - the tail or head entry. > - > -**/ > -NET_BUF * > -SockBufNext ( > - IN SOCK_BUFFER *Sockbuf, > - IN NET_BUF *SockEntry > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > deleted file mode 100644 > index 368f49c4ddb1..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > +++ /dev/null > @@ -1,342 +0,0 @@ > -/** @file > - Tcp driver function header. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _TCP4_DRIVER_H_ > -#define _TCP4_DRIVER_H_ > - > -#include <Protocol/ServiceBinding.h> > -#include <Library/IpIoLib.h> > - > -#define TCP4_DRIVER_SIGNATURE SIGNATURE_32 ('T', 'C', 'P', '4') > - > -#define TCP4_PORT_KNOWN 1024 > -#define TCP4_PORT_USER_RESERVED 65535 > - > -#define TCP4_FROM_THIS(a) \ > - CR ( \ > - (a), \ > - TCP4_SERVICE_DATA, \ > - Tcp4ServiceBinding, \ > - TCP4_DRIVER_SIGNATURE \ > - ) > - > -/// > -/// TCP heartbeat tick timer. > -/// > -typedef struct _TCP4_HEARTBEAT_TIMER { > - EFI_EVENT TimerEvent; ///< The event assoiated with the timer > - INTN RefCnt; ///< Number of reference > -} TCP4_HEARTBEAT_TIMER; > - > -/// > -/// TCP service data > -/// > -typedef struct _TCP4_SERVICE_DATA { > - UINT32 Signature; > - EFI_HANDLE ControllerHandle; > - IP_IO *IpIo; // IP Io consumed by TCP4 > - EFI_SERVICE_BINDING_PROTOCOL Tcp4ServiceBinding; > - EFI_HANDLE DriverBindingHandle; > - LIST_ENTRY SocketList; > -} TCP4_SERVICE_DATA; > - > -/// > -/// TCP protocol data > -/// > -typedef struct _TCP4_PROTO_DATA { > - TCP4_SERVICE_DATA *TcpService; > - TCP_CB *TcpPcb; > -} TCP4_PROTO_DATA; > - > - > -/** > - Packet receive callback function provided to IP_IO, used to call > - the proper function to handle the packet received by IP. > - > - @param Status Status of the received packet. > - @param IcmpErr ICMP error number. > - @param NetSession Pointer to the net session of this packet. > - @param Pkt Pointer to the recieved packet. > - @param Context Pointer to the context configured in IpIoOpen(), not > used > - now. > - > - @return None > - > -**/ > -VOID > -EFIAPI > -Tcp4RxCallback ( > - IN EFI_STATUS Status, > - IN UINT8 IcmpErr, > - IN EFI_NET_SESSION_DATA *NetSession, > - IN NET_BUF *Pkt, > - IN VOID *Context OPTIONAL > - ); > - > -/** > - Send the segment to IP via IpIo function. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the TCP segment to be sent. > - @param Src Source address of the TCP segment. > - @param Dest Destination address of the TCP segment. > - > - @retval 0 The segment was sent out successfully. > - @retval -1 The segment was failed to send. > - > -**/ > -INTN > -TcpSendIpPacket ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf, > - IN UINT32 Src, > - IN UINT32 Dest > - ); > - > -/** > - The procotol handler provided to the socket layer, used to > - dispatch the socket level requests by calling the corresponding > - TCP layer functions. > - > - @param Sock Pointer to the socket of this TCP instance. > - @param Request The code of this operation request. > - @param Data Pointer to the operation specific data passed in > - together with the operation request. > - > - @retval EFI_SUCCESS The socket request is completed successfully. > - @retval other The error status returned by the corresponding TCP > - layer function. > - > -**/ > -EFI_STATUS > -Tcp4Dispatcher ( > - IN SOCKET *Sock, > - IN UINT8 Request, > - IN VOID *Data OPTIONAL > - ); > - > - > -/** > - The entry point for Tcp4 driver, used to install Tcp4 driver on the > ImageHandle. > - > - @param ImageHandle The firmware allocated handle for this > - driver image. > - @param SystemTable Pointer to the EFI system table. > - > - @retval EFI_SUCCESS Driver loaded. > - @retval other Driver not loaded. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverEntryPoint ( > - IN EFI_HANDLE ImageHandle, > - IN EFI_SYSTEM_TABLE *SystemTable > - ); > - > - > -/** > - Tests to see if this driver supports a given controller. > - > - If a child device is provided, it further tests to see if this driver supports > - creating a handle for the specified child device. > - > - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param ControllerHandle The handle of the controller to test. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is optional > for bus drivers. > - > - > - @retval EFI_SUCCESS The device specified by ControllerHandle and > - RemainingDevicePath is supported by the driver > - specified by This. > - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle > and > - RemainingDevicePath is already being managed by > - the driver specified by This. > - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > and > - RemainingDevicePath is already being managed by a > - different driver or an application that requires > - exclusive access. > - @retval EFI_UNSUPPORTED The device specified by ControllerHandle > and > - RemainingDevicePath is not supported by the driver > - specified by This. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverBindingSupported ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ); > - > -/** > - Start this driver on ControllerHandle. > - > - The Start() function is designed to be invoked from the EFI boot service > - ConnectController(). As a result, much of the error checking on the > parameters > - to Start() has been moved into this common boot service. It is legal to call > - Start() from other locations, but the following calling restrictions must be > - followed or the system behavior will not be deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE. > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > naturally > - aligned EFI_DEVICE_PATH_PROTOCOL. > - 3. Prior to calling Start(), the Supported() function for the driver specified > - by This must have been called with the same calling parameters, and > Supported() > - must have returned EFI_SUCCESS. > - > - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param ControllerHandle The handle of the controller to start. This > handle > - must support a protocol interface that supplies > - an I/O abstraction to the driver. > - @param RemainingDevicePath A pointer to the remaining portion of a > device path. > - This parameter is ignored by device drivers, and is > - optional for bus drivers. > - > - @retval EFI_SUCCESS The device was started. > - @retval EFI_ALREADY_STARTED The device could not be started due to a > device error. > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > due to a lack > - of resources. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverBindingStart ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > - ); > - > -/** > - Stop this driver on ControllerHandle. > - > - The Stop() function is designed to be invoked from the EFI boot service > - DisconnectController(). As a result, much of the error checking on the > parameters > - to Stop() has been moved into this common boot service. It is legal to call > Stop() > - from other locations, but the following calling restrictions must be followed > - or the system behavior will not be deterministic. > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > previous call > - to this same driver's Start() function. > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a > valid > - EFI_HANDLE. In addition, all of these handles must have been created in > this > - driver's Start() function, and the Start() function must have called > OpenProtocol() > - on ControllerHandle with an Attribute of > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > - > - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL > instance. > - @param ControllerHandle A handle to the device being stopped. The > handle must > - support a bus specific I/O protocol for the driver > - to use to stop the device. > - @param NumberOfChildren The number of child device handles in > ChildHandleBuffer. > - @param ChildHandleBuffer An array of child handles to be freed. May be > NULL if > - NumberOfChildren is 0. > - > - @retval EFI_SUCCESS The device was stopped. > - @retval EFI_DEVICE_ERROR The device could not be stopped due to a > device error. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4DriverBindingStop ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN UINTN NumberOfChildren, > - IN EFI_HANDLE *ChildHandleBuffer > - ); > - > -/** > - Open Ip4 and device path protocols for a created socket, and insert it in > - socket list. > - > - @param This Pointer to the socket just created > - @param Context Context of the socket > - > - @retval EFI_SUCCESS This protocol is installed successfully. > - @retval other Some error occured. > - > -**/ > -EFI_STATUS > -Tcp4CreateSocketCallback ( > - IN SOCKET *This, > - IN VOID *Context > - ); > - > -/** > - Close Ip4 and device path protocols for a socket, and remove it from socket > list. > - > - @param This Pointer to the socket to be removed > - @param Context Context of the socket > - > -**/ > -VOID > -Tcp4DestroySocketCallback ( > - IN SOCKET *This, > - IN VOID *Context > - ); > - > -/** > - Creates a child handle and installs a protocol. > - > - The CreateChild() function installs a protocol on ChildHandle. If ChildHandle > - is a pointer to NULL, then a new handle is created and returned in > ChildHandle. > - If ChildHandle is not a pointer to NULL, then the protocol installs on the > existing > - ChildHandle. > - > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > instance. > - @param ChildHandle Pointer to the handle of the child to create. If it is > NULL, then > - a new handle is created. If it is a pointer to an existing UEFI > - handle, then the protocol is added to the existing UEFI handle. > - > - @retval EFI_SUCCES The protocol was added to ChildHandle. > - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. > - @retval EFI_OUT_OF_RESOURCES There are not enough resources > available to create > - the child. > - @retval other The child handle was not created. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4ServiceBindingCreateChild ( > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > - IN OUT EFI_HANDLE *ChildHandle > - ); > - > -/** > - Destroys a child handle with a protocol installed on it. > - > - The DestroyChild() function does the opposite of CreateChild(). It removes > a protocol > - that was installed by CreateChild() from ChildHandle. If the removed > protocol is the > - last protocol on ChildHandle, then ChildHandle is destroyed. > - > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > instance. > - @param ChildHandle Handle of the child to destroy > - > - @retval EFI_SUCCES The protocol was removed from ChildHandle. > - @retval EFI_UNSUPPORTED ChildHandle does not support the protocol > that is > - being removed. > - @retval EFI_INVALID_PARAMETER Child handle is NULL. > - @retval EFI_ACCESS_DENIED The protocol could not be removed from > the ChildHandle > - because its services are being used. > - @retval other The child handle was not destroyed. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4ServiceBindingDestroyChild ( > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ChildHandle > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > deleted file mode 100644 > index 7c0504770b48..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > +++ /dev/null > @@ -1,94 +0,0 @@ > -## @file > -# This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding > Protocol. > -# > -# This module produces EFI TCPv4(Transmission Control Protocol version 4) > Protocol > -# upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. This driver > only > -# supports IPv4 network stack. > -# > -# Notes: > -# 1) This driver can't co-work with the TcpDxe driver in NetworkPkg. > -# 2) This driver might have some issues that have been fixed in the TcpDxe > driver > -# in NetworkPkg. > -# 3) This driver supports fewer features than the TcpDxe driver in > NetworkPkg (e.g. IPv6, > -# TCP Cancel function). > -# 4) TcpDxe driver in NetworkPkg is recommended for use instead of this > one even though > -# both of them can be used. > -# > -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > -# This program and the accompanying materials > -# are licensed and made available under the terms and conditions of the > BSD License > -# which accompanies this distribution. The full text of the license may be > found at > -# http://opensource.org/licenses/bsd-license.php > -# > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -# > -# > -## > - > -[Defines] > - INF_VERSION = 0x00010005 > - BASE_NAME = Tcp4Dxe > - MODULE_UNI_FILE = Tcp4Dxe.uni > - FILE_GUID = 6d6963ab-906d-4a65-a7ca-bd40e5d6af4d > - MODULE_TYPE = UEFI_DRIVER > - VERSION_STRING = 1.0 > - ENTRY_POINT = Tcp4DriverEntryPoint > - UNLOAD_IMAGE = NetLibDefaultUnload > -# > -# The following information is for reference only and not required by the > build tools. > -# > -# VALID_ARCHITECTURES = IA32 X64 EBC > -# > -# DRIVER_BINDING = mTcp4DriverBinding > -# COMPONENT_NAME = gTcp4ComponentName > -# COMPONENT_NAME2 = gTcp4ComponentName2 > -# > - > -[Sources] > - SockImpl.c > - SockInterface.c > - Tcp4Proto.h > - Tcp4Main.h > - SockImpl.h > - Tcp4Output.c > - Tcp4Timer.c > - Tcp4Option.h > - Tcp4Dispatcher.c > - Tcp4Input.c > - Tcp4Misc.c > - Tcp4Main.c > - Socket.h > - ComponentName.c > - Tcp4Driver.h > - Tcp4Io.c > - Tcp4Driver.c > - Tcp4Func.h > - Tcp4Option.c > - > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - > -[LibraryClasses] > - UefiLib > - UefiBootServicesTableLib > - UefiDriverEntryPoint > - UefiRuntimeServicesTableLib > - BaseMemoryLib > - MemoryAllocationLib > - DebugLib > - NetLib > - IpIoLib > - DevicePathLib > - DpcLib > - > -[Protocols] > - gEfiTcp4ServiceBindingProtocolGuid ## BY_START > - gEfiIp4ServiceBindingProtocolGuid ## TO_START > - gEfiTcp4ProtocolGuid ## BY_START > - gEfiIp4ProtocolGuid ## TO_START > - > -[UserExtensions.TianoCore."ExtraFiles"] > - Tcp4DxeExtra.uni > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > deleted file mode 100644 > index 1514a3917766..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > +++ /dev/null > @@ -1,23 +0,0 @@ > -// /** @file > -// This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding > Protocol. > -// > -// This module produces EFI TCPv4(Transmission Control Protocol version 4) > Protocol > -// upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. > -// > -// Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the > BSD License > -// which accompanies this distribution. The full text of the license may be > found at > -// http://opensource.org/licenses/bsd-license.php > -// > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > - > -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI > TCPv4 Protocol and EFI TCPv4 Service Binding Protocol" > - > -#string STR_MODULE_DESCRIPTION #language en-US "This module > produces EFI TCPv4(Transmission Control Protocol version 4) Protocol upon > EFI IPv4 Protocol to provide basic TCPv4 I/O services." > - > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > deleted file mode 100644 > index 0e6d2f2896f3..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > +++ /dev/null > @@ -1,20 +0,0 @@ > -// /** @file > -// Tcp4Dxe Localized Strings and Content > -// > -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the > BSD License > -// which accompanies this distribution. The full text of the license may be > found at > -// http://opensource.org/licenses/bsd-license.php > -// > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > -#string STR_PROPERTIES_MODULE_NAME > -#language en-US > -"TCP v4 DXE Driver" > - > - > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > deleted file mode 100644 > index 53b7aac8ae98..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > +++ /dev/null > @@ -1,781 +0,0 @@ > -/** @file > - Tcp function header file. > - > -Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _TCP4_FUNC_H_ > -#define _TCP4_FUNC_H_ > - > -// > -// Declaration of all the functions in TCP > -// protocol. It is intended to keep tcp.h > -// clear. > -// > - > -// > -// Functions in tcp.c > -// > - > -/** > - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. > - > - @param Addr Pointer to the IP address needs to match. > - @param Port The port number needs to match. > - > - @return The Tcb which matches the <Addr Port> paire exists or not. > - > -**/ > -BOOLEAN > -TcpFindTcbByPeer ( > - IN EFI_IPv4_ADDRESS *Addr, > - IN TCP_PORTNO Port > - ); > - > -/** > - Locate the TCP_CB related to the socket pair. > - > - @param LocalPort The local port number. > - @param LocalIp The local IP address. > - @param RemotePort The remote port number. > - @param RemoteIp The remote IP address. > - @param Syn Whether to search the listen sockets, if TRUE, the > - listen sockets are searched. > - > - @return Pointer to the related TCP_CB, if NULL no match is found. > - > -**/ > -TCP_CB * > -TcpLocateTcb ( > - IN TCP_PORTNO LocalPort, > - IN UINT32 LocalIp, > - IN TCP_PORTNO RemotePort, > - IN UINT32 RemoteIp, > - IN BOOLEAN Syn > - ); > - > -/** > - Insert a Tcb into the proper queue. > - > - @param Tcb Pointer to the TCP_CB to be inserted. > - > - @retval 0 The Tcb is inserted successfully. > - @retval -1 Error condition occurred. > - > -**/ > -INTN > -TcpInsertTcb ( > - IN TCP_CB *Tcb > - ); > - > -/** > - Clone a TCP_CB from Tcb. > - > - @param Tcb Pointer to the TCP_CB to be cloned. > - > - @return Pointer to the new cloned TCP_CB, if NULL error condition > occurred. > - > -**/ > -TCP_CB * > -TcpCloneTcb ( > - IN TCP_CB *Tcb > - ); > - > -/** > - Compute an ISS to be used by a new connection. > - > - @return The result ISS. > - > -**/ > -TCP_SEQNO > -TcpGetIss ( > - VOID > - ); > - > -/** > - Initialize the Tcb local related members. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpInitTcbLocal ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Initialize the peer related members. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Pointer to the segment that contains the peer's > - intial info. > - @param Opt Pointer to the options announced by the peer. > - > -**/ > -VOID > -TcpInitTcbPeer ( > - IN OUT TCP_CB *Tcb, > - IN TCP_SEG *Seg, > - IN TCP_OPTION *Opt > - ); > - > -/** > - Get the local mss. > - > - @param Sock Pointer to the socket to get mss > - > - @return The mss size. > - > -**/ > -UINT16 > -TcpGetRcvMss ( > - IN SOCKET *Sock > - ); > - > -/** > - Set the Tcb's state. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param State The state to be set. > - > -**/ > -VOID > -TcpSetState ( > - IN OUT TCP_CB *Tcb, > - IN UINT8 State > - ); > - > -// > -// Functions in Tcp4Output.c > -// > -/** > - Send the segment to IP via IpIo function. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the TCP segment to be sent. > - @param Src Source address of the TCP segment. > - @param Dest Destination address of the TCP segment. > - > - @retval 0 The segment was sent out successfully. > - @retval -1 The segment was failed to send. > - > -**/ > -INTN > -TcpSendIpPacket ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf, > - IN UINT32 Src, > - IN UINT32 Dest > - ); > - > -/** > - Check whether to send data/SYN/FIN and piggy back an ACK. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Force Whether to ignore the sender's SWS avoidance algorithm > and send > - out data by force. > - > - @return The number of bytes sent. > - > -**/ > -INTN > -TcpToSendData ( > - IN OUT TCP_CB *Tcb, > - IN INTN Force > - ); > - > -/** > - Check whether to send an ACK or delayed ACK. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpToSendAck ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Send an ACK immediately. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpSendAck ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Send a zero probe segment. It can be used by keepalive and zero window > probe. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @retval 0 The zero probe segment was sent out successfully. > - @retval other Error condition occurred. > - > -**/ > -INTN > -TcpSendZeroProbe ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Process the data and FIN flag, check whether to deliver > - data to the socket layer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @retval 0 No error occurred to deliver data. > - @retval -1 Error condition occurred. Proper response is to reset the > - connection. > - > -**/ > -INTN > -TcpDeliverData ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Send a RESET segment in response to the segment received. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL. > - @param Head TCP header of the segment that triggers the reset. > - @param Len Length of the segment that triggers the reset. > - @param Local Local IP address. > - @param Remote Remote peer's IP address. > - > - @retval 0 A reset is sent or no need to send it. > - @retval -1 No reset is sent. > - > -**/ > -INTN > -TcpSendReset ( > - IN TCP_CB *Tcb, > - IN TCP_HEAD *Head, > - IN INT32 Len, > - IN UINT32 Local, > - IN UINT32 Remote > - ); > - > -/** > - Compute the sequence space left in the old receive window. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The sequence space left in the old receive window. > - > -**/ > -UINT32 > -TcpRcvWinOld ( > - IN TCP_CB *Tcb > - ); > - > -/** > - Compute the current receive window. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The size of the current receive window, in bytes. > - > -**/ > -UINT32 > -TcpRcvWinNow ( > - IN TCP_CB *Tcb > - ); > - > -/** > - Retransmit the segment from sequence Seq. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment to be retransmitted. > - > - @retval 0 Retransmission succeeded. > - @retval -1 Error condition occurred. > - > -**/ > -INTN > -TcpRetransmit ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq > - ); > - > -/** > - Compute how much data to send. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Force Whether to ignore the sender's SWS avoidance algorithm > and send > - out data by force. > - > - @return The length of the data can be sent, if 0, no data can be sent. > - > -**/ > -UINT32 > -TcpDataToSend ( > - IN TCP_CB *Tcb, > - IN INTN Force > - ); > - > -/** > - Verify that the segment is in good shape. > - > - @param Nbuf Buffer that contains the segment to be checked. > - > - @retval 0 The segment is broken. > - @retval 1 The segment is in good shape. > - > -**/ > -INTN > -TcpVerifySegment ( > - IN NET_BUF *Nbuf > - ); > - > -/** > - Verify that all the segments in SndQue are in good shape. > - > - @param Head Pointer to the head node of the SndQue. > - > - @retval 0 At least one segment is broken. > - @retval 1 All segments in the specific queue are in good shape. > - > -**/ > -INTN > -TcpCheckSndQue ( > - IN LIST_ENTRY *Head > - ); > - > -/** > - Get a segment from the Tcb's SndQue. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment. > - @param Len The maximum length of the segment. > - > - @return Pointer to the segment, if NULL some error occurred. > - > -**/ > -NET_BUF * > -TcpGetSegmentSndQue ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq, > - IN UINT32 Len > - ); > - > -/** > - Get a segment from the Tcb's socket buffer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment. > - @param Len The maximum length of the segment. > - > - @return Pointer to the segment, if NULL some error occurred. > - > -**/ > -NET_BUF * > -TcpGetSegmentSock ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq, > - IN UINT32 Len > - ); > - > -/** > - Get a segment starting from sequence Seq of a maximum > - length of Len. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seq The sequence number of the segment. > - @param Len The maximum length of the segment. > - > - @return Pointer to the segment, if NULL some error occurred. > - > -**/ > -NET_BUF * > -TcpGetSegment ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Seq, > - IN UINT32 Len > - ); > - > -/** > - Get the maximum SndNxt. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The sequence number of the maximum SndNxt. > - > -**/ > -TCP_SEQNO > -TcpGetMaxSndNxt ( > - IN TCP_CB *Tcb > - ); > - > -// > -// Functions from Tcp4Input.c > -// > -/** > - Process the received ICMP error messages for TCP. > - > - @param Nbuf Buffer that contains part of the TCP segment without IP > header > - truncated from the ICMP error packet. > - @param IcmpErr The ICMP error code interpreted from ICMP error packet. > - @param Src Source address of the ICMP error message. > - @param Dst Destination address of the ICMP error message. > - > -**/ > -VOID > -TcpIcmpInput ( > - IN NET_BUF *Nbuf, > - IN UINT8 IcmpErr, > - IN UINT32 Src, > - IN UINT32 Dst > - ); > - > -/** > - Process the received TCP segments. > - > - @param Nbuf Buffer that contains received TCP segment without IP > header. > - @param Src Source address of the segment, or the peer's IP address. > - @param Dst Destination address of the segment, or the local end's IP > - address. > - > - @retval 0 Segment is processed successfully. It is either accepted or > - discarded. But no connection is reset by the segment. > - @retval -1 A connection is reset by the segment. > - > -**/ > -INTN > -TcpInput ( > - IN NET_BUF *Nbuf, > - IN UINT32 Src, > - IN UINT32 Dst > - ); > - > -/** > - Check whether the sequence number of the incoming segment is > acceptable. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Pointer to the incoming segment. > - > - @retval 1 The sequence number is acceptable. > - @retval 0 The sequence number is not acceptable. > - > -**/ > -INTN > -TcpSeqAcceptable ( > - IN TCP_CB *Tcb, > - IN TCP_SEG *Seg > - ); > - > -/** > - NewReno fast recovery, RFC3782. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Segment that triggers the fast recovery. > - > -**/ > -VOID > -TcpFastRecover ( > - IN OUT TCP_CB *Tcb, > - IN TCP_SEG *Seg > - ); > - > -/** > - NewReno fast loss recovery, RFC3792. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Seg Segment that triggers the fast loss recovery. > - > -**/ > -VOID > -TcpFastLossRecover ( > - IN OUT TCP_CB *Tcb, > - IN TCP_SEG *Seg > - ); > - > -/** > - Compute the RTT as specified in RFC2988. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Measure Currently measured RTT in heart beats. > - > -**/ > -VOID > -TcpComputeRtt ( > - IN OUT TCP_CB *Tcb, > - IN UINT32 Measure > - ); > - > -/** > - Trim off the data outside the tcb's receive window. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the NET_BUF containing the received tcp > segment. > - > -**/ > -VOID > -TcpTrimInWnd ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ); > - > -/** > - Store the data into the reassemble queue. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer containing the data to be queued. > - > -**/ > -VOID > -TcpQueueData ( > - IN OUT TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ); > - > -/** > - Ajust the send queue or the retransmit queue. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Ack The acknowledge seuqence number of the received > segment. > - > -**/ > -VOID > -TcpAdjustSndQue ( > - IN TCP_CB *Tcb, > - IN TCP_SEQNO Ack > - ); > - > -// > -// Functions from Tcp4Misc.c > -// > -/** > - Compute the TCP segment's checksum. > - > - @param Nbuf Pointer to the buffer that contains the TCP > - segment. > - @param HeadSum The checksum value of the fixed part of pseudo > - header. > - > - @return The checksum value. > - > -**/ > -UINT16 > -TcpChecksum ( > - IN NET_BUF *Nbuf, > - IN UINT16 HeadSum > - ); > - > -/** > - Translate the information from the head of the received TCP > - segment Nbuf contains and fill it into a TCP_SEG structure. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer contains the TCP segment. > - > - @return Pointer to the TCP_SEG that contains the translated TCP head > information. > - > -**/ > -TCP_SEG * > -TcpFormatNetbuf ( > - IN TCP_CB *Tcb, > - IN OUT NET_BUF *Nbuf > - ); > - > -/** > - Initialize an active connection. > - > - @param Tcb Pointer to the TCP_CB that wants to initiate a > - connection. > - > -**/ > -VOID > -TcpOnAppConnect ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Application has consumed some data, check whether > - to send a window updata ack or a delayed ack. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpOnAppConsume ( > - IN TCP_CB *Tcb > - ); > - > -/** > - Initiate the connection close procedure, called when > - applications want to close the connection. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpOnAppClose ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Check whether the application's newly delivered data can be sent out. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @retval 0 Whether the data is sent out or is buffered for > - further sending. > - @retval -1 The Tcb is not in a state that data is permitted to > - be sent out. > - > -**/ > -INTN > -TcpOnAppSend ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Abort the connection by sending a reset segment, called > - when the application wants to abort the connection. > - > - @param Tcb Pointer to the TCP_CB of the TCP instance. > - > -**/ > -VOID > -TcpOnAppAbort ( > - IN TCP_CB *Tcb > - ); > - > -/** > - Reset the connection related with Tcb. > - > - @param Tcb Pointer to the TCP_CB of the connection to be > - reset. > - > -**/ > -VOID > -TcpResetConnection ( > - IN TCP_CB *Tcb > - ); > - > -// > -// Functions in Tcp4Timer.c > -// > -/** > - Close the TCP connection. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpClose ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Heart beat timer handler, queues the DPC at TPL_CALLBACK. > - > - @param Event Timer event signaled, ignored. > - @param Context Context of the timer event, ignored. > - > -**/ > -VOID > -EFIAPI > -TcpTicking ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ); > - > -/** > - Enable a TCP timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Timer The index of the timer to be enabled. > - @param TimeOut The timeout value of this timer. > - > -**/ > -VOID > -TcpSetTimer ( > - IN OUT TCP_CB *Tcb, > - IN UINT16 Timer, > - IN UINT32 TimeOut > - ); > - > -/** > - Clear one TCP timer. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Timer The index of the timer to be cleared. > - > -**/ > -VOID > -TcpClearTimer ( > - IN OUT TCP_CB *Tcb, > - IN UINT16 Timer > - ); > - > -/** > - Clear all TCP timers. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpClearAllTimer ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Enable the window prober timer and set the timeout value. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpSetProbeTimer ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Enable the keepalive timer and set the timeout value. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpSetKeepaliveTimer ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Backoff the RTO. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > -**/ > -VOID > -TcpBackoffRto ( > - IN OUT TCP_CB *Tcb > - ); > - > -/** > - Install the device path protocol on the TCP instance. > - > - @param Sock Pointer to the socket representing the TCP instance. > - > - @retval EFI_SUCCESS The device path protocol is installed. > - @retval other Failed to install the device path protocol. > - > -**/ > -EFI_STATUS > -TcpInstallDevicePath ( > - IN SOCKET *Sock > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > deleted file mode 100644 > index c898a7ee2dd0..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > +++ /dev/null > @@ -1,494 +0,0 @@ > -/** @file > - TCP4 protocol services header file. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _TCP4_MAIN_H_ > -#define _TCP4_MAIN_H_ > - > -#include "Socket.h" > - > -#include "Tcp4Proto.h" > -#include "Tcp4Func.h" > -#include "Tcp4Driver.h" > - > - > -extern UINT16 mTcp4RandomPort; > -extern CHAR16 *mTcpStateName[]; > - > -// > -// Driver Produced Protocol Prototypes > -// > - > -// > -// Function prototype for the Tcp4 socket request handler > -// > -/** > - The procotol handler provided to the socket layer, used to > - dispatch the socket level requests by calling the corresponding > - TCP layer functions. > - > - @param Sock Pointer to the socket of this TCP instance. > - @param Request The code of this operation request. > - @param Data Pointer to the operation specific data passed in > - together with the operation request. > - > - @retval EFI_SUCCESS The socket request is completed successfully. > - @retval other The error status returned by the corresponding TCP > - layer function. > - > -**/ > -EFI_STATUS > -Tcp4Dispatcher ( > - IN SOCKET *Sock, > - IN UINT8 Request, > - IN VOID *Data OPTIONAL > - ); > - > -/// > -/// TCP mode data > -/// > -typedef struct _TCP4_MODE_DATA { > - EFI_TCP4_CONNECTION_STATE *Tcp4State; > - EFI_TCP4_CONFIG_DATA *Tcp4ConfigData; > - EFI_IP4_MODE_DATA *Ip4ModeData; > - EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData; > - EFI_SIMPLE_NETWORK_MODE *SnpModeData; > -} TCP4_MODE_DATA; > - > -/// > -/// TCP route infomation data > -/// > -typedef struct _TCP4_ROUTE_INFO { > - BOOLEAN DeleteRoute; > - EFI_IPv4_ADDRESS *SubnetAddress; > - EFI_IPv4_ADDRESS *SubnetMask; > - EFI_IPv4_ADDRESS *GatewayAddress; > -} TCP4_ROUTE_INFO; > - > -typedef struct { > - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; > - UINTN NumberOfChildren; > - EFI_HANDLE *ChildHandleBuffer; > -} TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT; > - > -/** > - Get the current operational status of a TCP instance. > - > - The GetModeData() function copies the current operational settings of this > - EFI TCPv4 Protocol instance into user-supplied buffers. This function can > - also be used to retrieve the operational setting of underlying drivers > - such as IPv4, MNP, or SNP. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param Tcp4State Pointer to the buffer to receive the current TCP > - state. > - @param Tcp4ConfigData Pointer to the buffer to receive the current > TCP > - configuration. > - @param Ip4ModeData Pointer to the buffer to receive the current > IPv4 > - configuration data used by the TCPv4 instance. > - @param MnpConfigData Pointer to the buffer to receive the current > MNP > - configuration data indirectly used by the TCPv4 > - Instance. > - @param SnpModeData Pointer to the buffer to receive the current > SNP > - configuration data indirectly used by the TCPv4 > - Instance. > - > - @retval EFI_SUCCESS The mode data was read. > - @retval EFI_NOT_STARTED No configuration data is available because > this > - instance hasn't been started. > - @retval EFI_INVALID_PARAMETER This is NULL. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4GetModeData ( > - IN EFI_TCP4_PROTOCOL *This, > - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, > - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, > - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, > - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData > OPTIONAL, > - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL > - ); > - > - > -/** > - Initialize or brutally reset the operational parameters for > - this EFI TCPv4 instance. > - > - The Configure() function does the following: > - * Initialize this EFI TCPv4 instance, i.e., initialize the communication end > - setting, specify active open or passive open for an instance. > - * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous > - tokens, flush transmission and receiving buffer directly without informing > - the communication peer. > - No other TCPv4 Protocol operation can be executed by this instance > - until it is configured properly. For an active TCP4 instance, after a proper > - configuration it may call Connect() to initiates the three-way handshake. > - For a passive TCP4 instance, its state will transit to Tcp4StateListen after > - configuration, and Accept() may be called to listen the incoming TCP > connection > - request. If TcpConfigData is set to NULL, the instance is reset. Resetting > - process will be done brutally, the state machine will be set to > Tcp4StateClosed > - directly, the receive queue and transmit queue will be flushed, and no > traffic is > - allowed through this instance. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param TcpConfigData Pointer to the configure data to configure the > - instance. > - > - @retval EFI_SUCCESS The operational settings are set, changed, or > - reset successfully. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (through DHCP, BOOTP, RARP, etc.) is not > - finished. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is > already > - configured. > - @retval EFI_DEVICE_ERROR An unexpected network or system error > occurred. > - @retval EFI_UNSUPPORTED One or more of the control options are > not > - supported in the implementation. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system > resources. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Configure ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL > - ); > - > -/** > - Add or delete routing entries. > - > - The Routes() function adds or deletes a route from the instance's routing > table. > - The most specific route is selected by comparing the SubnetAddress with > the > - destination IP address's arithmetical AND to the SubnetMask. > - The default route is added with both SubnetAddress and SubnetMask set > to 0.0.0.0. > - The default route matches all destination IP addresses if there is no more > specific route. > - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent > to > - the destination host if its address can be found in the Address Resolution > Protocol (ARP) > - cache or it is on the local subnet. If the instance is configured to use default > - address, a direct route to the local network will be added automatically. > - Each TCP instance has its own independent routing table. Instance that > uses the > - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's > routing table. > - The copy will be updated automatically whenever the IP driver > reconfigures its > - instance. As a result, the previous modification to the instance's local copy > - will be lost. The priority of checking the route table is specific with IP > - implementation and every IP implementation must comply with RFC 1122. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param DeleteRoute If TRUE, delete the specified route from > routing > - table; if FALSE, add the specified route to > - routing table. > - DestinationAddress and SubnetMask are used as > - the keywords to search route entry. > - @param SubnetAddress The destination network. > - @param SubnetMask The subnet mask for the destination network. > - @param GatewayAddress The gateway address for this route. > - It must be on the same subnet with the station > - address unless a direct route is specified. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not > been > - configured. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (through DHCP, BOOTP, RARP, etc.) is not > - finished. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > to add the > - entry to the routing table. > - @retval EFI_NOT_FOUND This route is not in the routing table. > - @retval EFI_ACCESS_DENIED This route is already in the routing table. > - @retval EFI_UNSUPPORTED The TCP driver does not support this > operation. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Routes ( > - IN EFI_TCP4_PROTOCOL *This, > - IN BOOLEAN DeleteRoute, > - IN EFI_IPv4_ADDRESS *SubnetAddress, > - IN EFI_IPv4_ADDRESS *SubnetMask, > - IN EFI_IPv4_ADDRESS *GatewayAddress > - ); > - > -/** > - Initiate a nonblocking TCP connection request for an active TCP instance. > - > - The Connect() function will initiate an active open to the remote peer > configured > - in current TCP instance if it is configured active. If the connection succeeds > - or fails due to any error, the ConnectionToken->CompletionToken.Event > will be > - signaled and ConnectionToken->CompletionToken.Status will be updated > accordingly. > - This function can only be called for the TCP instance in Tcp4StateClosed > state. > - The instance will transfer into Tcp4StateSynSent if the function returns > EFI_SUCCESS. > - If TCP three way handshake succeeds, its state will become > Tcp4StateEstablished, > - otherwise, the state will return to Tcp4StateClosed. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance > - @param ConnectionToken Pointer to the connection token to return > when > - the TCP three way handshake finishes. > - > - @retval EFI_SUCCESS The connection request is successfully initiated > - and the state of this TCPv4 instance has > - been changed to Tcp4StateSynSent. > - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_ACCESS_DENIED The instance is not configured as an active > one > - or it is not in Tcp4StateClosed state. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough > resource to > - initiate the active open. > - @retval EFI_DEVICE_ERROR An unexpected system or network error > occurred. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Connect ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken > - ); > - > -/** > - Listen on the passive instance to accept an incoming connection request. > - > - The Accept() function initiates an asynchronous accept request to wait for > an > - incoming connection on the passive TCP instance. If a remote peer > successfully > - establishes a connection with this instance, a new TCP instance will be > created > - and its handle will be returned in ListenToken->NewChildHandle. The > newly created > - instance is configured by inheriting the passive instance's configuration and > is > - ready for use upon return. The instance is in the Tcp4StateEstablished state. > - The ListenToken->CompletionToken.Event will be signaled when a new > connection > - is accepted, user aborts the listen or connection is reset. This function only > - can be called when current TCP instance is in Tcp4StateListen state. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance > - @param ListenToken Pointer to the listen token to return when > - operation finishes. > - > - @retval EFI_SUCCESS The listen token has been queued successfully. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is > not > - in Tcp4StateListen state or a same listen token > - has already existed in the listen token queue of > - this TCP instance. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > to finish > - the operation. > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > above category error. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Accept ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_LISTEN_TOKEN *ListenToken > - ); > - > -/** > - Queues outgoing data into the transmit queue. > - > - The Transmit() function queues a sending request to this TCPv4 instance > along > - with the user data. The status of the token is updated and the event in the > token > - will be signaled once the data is sent out or some error occurs. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance > - @param Token Pointer to the completion token to queue to the > - transmit queue > - > - @retval EFI_SUCCESS The data has been queued for transmission. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (DHCP, BOOTP, RARP, etc.) is not finished yet. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_ACCESS_DENIED One or more of the following conditions is > TRUE: > - * A transmit completion token with the same > - Token-> CompletionToken.Event was already in the > - transmission queue. > - * The current instance is in Tcp4StateClosed state > - * The current instance is a passive one and > - it is in Tcp4StateListen state. > - * User has called Close() to disconnect this > - connection. > - @retval EFI_NOT_READY The completion token could not be queued > because > - the transmit queue is full. > - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data > because of > - resource shortage. > - @retval EFI_NETWORK_UNREACHABLE There is no route to the > destination network or > - address. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Transmit ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_IO_TOKEN *Token > - ); > - > -/** > - Place an asynchronous receive request into the receiving queue. > - > - The Receive() function places a completion token into the receive packet > queue. > - This function is always asynchronous. The caller must allocate the > - Token->CompletionToken.Event and the FragmentBuffer used to receive > data. He also > - must fill the DataLength which represents the whole length of all > FragmentBuffer. > - When the receive operation completes, the EFI TCPv4 Protocol driver > updates the > - Token->CompletionToken.Status and Token->Packet.RxData fields and the > - Token->CompletionToken.Event is signaled. If got data the data and its > length > - will be copy into the FragmentTable, in the same time the full length of > received > - data will be recorded in the DataLength fields. Providing a proper > notification > - function and context for the event will enable the user to receive the > notification > - and receiving status. That notification function is guaranteed to not be re- > entered. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param Token Pointer to a token that is associated with the > - receive data descriptor. > - > - @retval EFI_SUCCESS The receive completion token was cached. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_NO_MAPPING When using a default address, > configuration > - (DHCP, BOOTP, RARP, etc.) is not finished yet. > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES The receive completion token could > not be queued > - due to a lack of system resources. > - @retval EFI_DEVICE_ERROR An unexpected system or network error > occurred. > - The EFI TCPv4 Protocol instance has been reset > - to startup defaults. > - @retval EFI_ACCESS_DENIED One or more of the following conditions is > TRUE: > - * A receive completion token with the same > - Token->CompletionToken.Event was already in > - the receive queue. > - * The current instance is in Tcp4StateClosed state. > - * The current instance is a passive one and it > - is in Tcp4StateListen state. > - * User has called Close() to disconnect this > - connection. > - @retval EFI_CONNECTION_FIN The communication peer has closed the > connection > - and there is no any buffered data in the receive > - buffer of this instance. > - @retval EFI_NOT_READY The receive request could not be queued > because > - the receive queue is full. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Receive ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_IO_TOKEN *Token > - ); > - > -/** > - Disconnecting a TCP connection gracefully or reset a TCP connection. > - > - Initiate an asynchronous close token to TCP driver. After Close() is called, > - any buffered transmission data will be sent by TCP driver and the current > - instance will have a graceful close working flow described as RFC 793 if > - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP > - driver to fast disconnect this connection. When the close operation > completes > - successfully the TCP instance is in Tcp4StateClosed state, all pending > - asynchronous operation is signaled and any buffers used for TCP network > traffic > - is flushed. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param CloseToken Pointer to the close token to return when > - operation finishes. > - > - @retval EFI_SUCCESS The operation completed successfully. > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't > been > - configured. > - @retval EFI_ACCESS_DENIED One or more of the following are TRUE: > - * Configure() has been called with TcpConfigData > - set to NULL and this function has not returned. > - * Previous Close() call on this instance has not > - finished. > - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to > finish the > - operation. > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > above > - category error. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Close ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_CLOSE_TOKEN *CloseToken > - ); > - > -/** > - Abort an asynchronous connection, listen, transmission or receive request. > - > - The Cancel() function aborts a pending connection, listen, transmit or > receive > - request. If Token is not NULL and the token is in the connection, listen, > - transmission or receive queue when it is being cancelled, its Token->Status > - will be set to EFI_ABORTED and then Token->Event will be signaled. If the > token > - is not in one of the queues, which usually means that the asynchronous > operation > - has completed, EFI_NOT_FOUND is returned. If Token is NULL all > asynchronous token > - issued by Connect(), Accept(), Transmit() and Receive()will be aborted. > - NOTE: It has not been implemented currently. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - @param Token Pointer to a token that has been issued by > - Connect(), Accept(), Transmit() or Receive(). If > - NULL, all pending tokens issued by above four > - functions will be aborted. > - > - @retval EFI_SUCCESS The asynchronous I/O request is aborted and > Token->Event > - is signaled. > - @retval EFI_INVALID_PARAMETER This is NULL. > - @retval EFI_NOT_STARTED This instance hasn's been configured. > - @retval EFI_NO_MAPPING When using the default address, > configuration > - (DHCP, BOOTP,RARP, etc.) hasn's finished yet. > - @retval EFI_NOT_FOUND The asynchronous I/O request isn's found > in the > - transmission or receive queue. It has either > - completed or wasn's issued by Transmit() and Receive(). > - @retval EFI_UNSUPPORTED The operation is not supported in current > - implementation. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Cancel ( > - IN EFI_TCP4_PROTOCOL *This, > - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL > - ); > - > -/** > - Poll to receive incoming data and transmit outgoing segments. > - > - The Poll() function increases the rate that data is moved between the > network > - and application and can be called when the TCP instance is created > successfully. > - Its use is optional. In some implementations, the periodical timer in the > MNP > - driver may not poll the underlying communications device fast enough to > avoid > - drop packets. Drivers and applications that are experiencing packet loss > should > - try calling the Poll() function in a high frequency. > - > - @param This Pointer to the EFI_TCP4_PROTOCOL instance. > - > - @retval EFI_SUCCESS Incoming or outgoing data was processed. > - @retval EFI_INVALID_PARAMETER This is NULL. > - @retval EFI_DEVICE_ERROR An unexpected system or network error > occurred. > - @retval EFI_NOT_READY No incoming or outgoing data was > processed. > - @retval EFI_TIMEOUT Data was dropped out of the transmission or > - receive queue. Consider increasing the polling > - rate. > - > -**/ > -EFI_STATUS > -EFIAPI > -Tcp4Poll ( > - IN EFI_TCP4_PROTOCOL *This > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > deleted file mode 100644 > index f9782cb59801..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > +++ /dev/null > @@ -1,130 +0,0 @@ > -/** @file > - Tcp option's routine header file. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _TCP4_OPTION_H_ > -#define _TCP4_OPTION_H_ > - > -/// > -/// The structure to store the parse option value. > -/// ParseOption only parse the options, don't process them. > -/// > -typedef struct _TCP_OPTION { > - UINT8 Flag; ///< Flag such as TCP_OPTION_RCVD_MSS > - UINT8 WndScale; ///< The WndScale received > - UINT16 Mss; ///< The Mss received > - UINT32 TSVal; ///< The TSVal field in a timestamp option > - UINT32 TSEcr; ///< The TSEcr field in a timestamp option > -} TCP_OPTION; > - > -// > -// supported TCP option type and their length > -// > -#define TCP_OPTION_EOP 0 ///< End Of oPtion > -#define TCP_OPTION_NOP 1 ///< No-Option. > -#define TCP_OPTION_MSS 2 ///< Maximum Segment Size > -#define TCP_OPTION_WS 3 ///< Window scale > -#define TCP_OPTION_TS 8 ///< Timestamp > -#define TCP_OPTION_MSS_LEN 4 ///< Length of MSS option > -#define TCP_OPTION_WS_LEN 3 ///< Length of window scale option > -#define TCP_OPTION_TS_LEN 10 ///< Length of timestamp option > -#define TCP_OPTION_WS_ALIGNED_LEN 4 ///< Length of window scale > option, aligned > -#define TCP_OPTION_TS_ALIGNED_LEN 12 ///< Length of timestamp > option, aligned > - > -// > -// recommend format of timestamp window scale > -// option for fast process. > -// > -#define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \ > - (TCP_OPTION_NOP << 16) | \ > - (TCP_OPTION_TS << 8) | \ > - (TCP_OPTION_TS_LEN)) > - > -#define TCP_OPTION_WS_FAST ((TCP_OPTION_NOP << 24) | \ > - (TCP_OPTION_WS << 16) | \ > - (TCP_OPTION_WS_LEN << 8)) > - > -#define TCP_OPTION_MSS_FAST ((TCP_OPTION_MSS << 24) | > (TCP_OPTION_MSS_LEN << 16)) > - > -// > -// Other misc definations > -// > -#define TCP_OPTION_RCVD_MSS 0x01 > -#define TCP_OPTION_RCVD_WS 0x02 > -#define TCP_OPTION_RCVD_TS 0x04 > -#define TCP_OPTION_MAX_WS 14 ///< Maxium window scale value > -#define TCP_OPTION_MAX_WIN 0xffff ///< Max window size in TCP > header > - > - > -/** > - Compute the window scale value according to the given buffer size. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - > - @return The scale value. > - > -**/ > -UINT8 > -TcpComputeScale ( > - IN TCP_CB *Tcb > - ); > - > -/** > - Build the TCP option in three-way handshake. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer to store the options. > - > - @return The total length of the TCP option field. > - > -**/ > -UINT16 > -TcpSynBuildOption ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ); > - > -/** > - Build the TCP option in synchronized states. > - > - @param Tcb Pointer to the TCP_CB of this TCP instance. > - @param Nbuf Pointer to the buffer to store the options. > - > - @return The total length of the TCP option field. > - > -**/ > -UINT16 > -TcpBuildOption ( > - IN TCP_CB *Tcb, > - IN NET_BUF *Nbuf > - ); > - > -/** > - Parse the supported options. > - > - @param Tcp Pointer to the TCP_CB of this TCP instance. > - @param Option Pointer to the TCP_OPTION used to store the successfully > pasrsed > - options. > - > - @retval 0 The options are successfully pasrsed. > - @retval -1 Ilegal option was found. > - > -**/ > -INTN > -TcpParseOption ( > - IN TCP_HEAD *Tcp, > - IN OUT TCP_OPTION *Option > - ); > - > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > deleted file mode 100644 > index 37191fe65112..000000000000 > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > +++ /dev/null > @@ -1,357 +0,0 @@ > -/** @file > - Tcp Protocol header file. > - > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php<BR> > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef _TCP4_PROTO_H_ > -#define _TCP4_PROTO_H_ > - > -typedef struct _TCP_CB TCP_CB; > - > -#include "Tcp4Driver.h" > -#include "Socket.h" > -#include "Tcp4Option.h" > - > - > - > -/// > -/// Tcp states, Don't change their order, it is used as > -/// index to mTcpOutFlag and other macros > -/// > -#define TCP_CLOSED 0 > -#define TCP_LISTEN 1 > -#define TCP_SYN_SENT 2 > -#define TCP_SYN_RCVD 3 > -#define TCP_ESTABLISHED 4 > -#define TCP_FIN_WAIT_1 5 > -#define TCP_FIN_WAIT_2 6 > -#define TCP_CLOSING 7 > -#define TCP_TIME_WAIT 8 > -#define TCP_CLOSE_WAIT 9 > -#define TCP_LAST_ACK 10 > - > - > -/// > -/// Flags in the TCP header > -/// > -#define TCP_FLG_FIN 0x01 > -#define TCP_FLG_SYN 0x02 > -#define TCP_FLG_RST 0x04 > -#define TCP_FLG_PSH 0x08 > -#define TCP_FLG_ACK 0x10 > -#define TCP_FLG_URG 0x20 > - > - // > - // mask for all the flags > - // > -#define TCP_FLG_FLAG 0x3F > - > - > -#define TCP_CONNECT_REFUSED (-1) ///< TCP error status > -#define TCP_CONNECT_RESET (-2) ///< TCP error status > -#define TCP_CONNECT_CLOSED (-3) ///< TCP error status > - > -// > -// Current congestion status as suggested by RFC3782. > -// > -#define TCP_CONGEST_RECOVER 1 ///< During the NewReno fast > recovery > -#define TCP_CONGEST_LOSS 2 ///< Retxmit because of retxmit time > out > -#define TCP_CONGEST_OPEN 3 ///< TCP is opening its congestion > window > - > -// > -// TCP control flags > -// > -#define TCP_CTRL_NO_NAGLE 0x0001 ///< Disable Nagle algorithm > -#define TCP_CTRL_NO_KEEPALIVE 0x0002 ///< Disable keepalive timer > -#define TCP_CTRL_NO_WS 0x0004 ///< Disable window scale option > -#define TCP_CTRL_RCVD_WS 0x0008 ///< Received a wnd scale option > in syn > -#define TCP_CTRL_NO_TS 0x0010 ///< Disable Timestamp option > -#define TCP_CTRL_RCVD_TS 0x0020 ///< Received a Timestamp option > in syn > -#define TCP_CTRL_SND_TS 0x0040 ///< Send Timestamp option to > remote > -#define TCP_CTRL_SND_URG 0x0080 ///< In urgent send mode > -#define TCP_CTRL_RCVD_URG 0x0100 ///< In urgent receive mode > -#define TCP_CTRL_SND_PSH 0x0200 ///< In PUSH send mode > -#define TCP_CTRL_FIN_SENT 0x0400 ///< FIN is sent > -#define TCP_CTRL_FIN_ACKED 0x0800 ///< FIN is ACKed. > -#define TCP_CTRL_TIMER_ON 0x1000 ///< At least one of the timer is on > -#define TCP_CTRL_RTT_ON 0x2000 ///< The RTT measurement is on > -#define TCP_CTRL_ACK_NOW 0x4000 ///< Send the ACK now, don't > delay > - > -// > -// Timer related values > -// > -#define TCP_TIMER_CONNECT 0 ///< Connection establishment > timer > -#define TCP_TIMER_REXMIT 1 ///< Retransmit timer > -#define TCP_TIMER_PROBE 2 ///< Window probe timer > -#define TCP_TIMER_KEEPALIVE 3 ///< Keepalive timer > -#define TCP_TIMER_FINWAIT2 4 ///< FIN_WAIT_2 timer > -#define TCP_TIMER_2MSL 5 ///< TIME_WAIT tiemr > -#define TCP_TIMER_NUMBER 6 ///< The total number of TCP > timer. > -#define TCP_TICK 200 ///< Every TCP tick is 200ms > -#define TCP_TICK_HZ 5 ///< The frequence of TCP tick > -#define TCP_RTT_SHIFT 3 ///< SRTT & RTTVAR scaled by 8 > -#define TCP_RTO_MIN TCP_TICK_HZ ///< The minium value of > RTO > -#define TCP_RTO_MAX (TCP_TICK_HZ * 60) ///< The maxium value > of RTO > -#define TCP_FOLD_RTT 4 ///< Timeout threshod to fold RTT > - > -// > -// Default values for some timers > -// > -#define TCP_MAX_LOSS 12 ///< Default max times to > retxmit > -#define TCP_KEEPALIVE_IDLE_MIN (TCP_TICK_HZ * 60 * 60 * 2) ///< First > keep alive > -#define TCP_KEEPALIVE_PERIOD (TCP_TICK_HZ * 60) > -#define TCP_MAX_KEEPALIVE 8 > -#define TCP_FIN_WAIT2_TIME (2 * TCP_TICK_HZ) > -#define TCP_TIME_WAIT_TIME (2 * TCP_TICK_HZ) > -#define TCP_PAWS_24DAY (24 * 24 * 60 * 60 * TCP_TICK_HZ) > -#define TCP_CONNECT_TIME (75 * TCP_TICK_HZ) > - > -// > -// The header space to be reserved before TCP data to accomodate : > -// 60byte IP head + 60byte TCP head + link layer head > -// > -#define TCP_MAX_HEAD 192 > - > -// > -// Value ranges for some control option > -// > -#define TCP_RCV_BUF_SIZE (2 * 1024 * 1024) > -#define TCP_RCV_BUF_SIZE_MIN (8 * 1024) > -#define TCP_SND_BUF_SIZE (2 * 1024 * 1024) > -#define TCP_SND_BUF_SIZE_MIN (8 * 1024) > -#define TCP_BACKLOG 10 > -#define TCP_BACKLOG_MIN 5 > -#define TCP_MAX_LOSS_MIN 6 > -#define TCP_CONNECT_TIME_MIN (60 * TCP_TICK_HZ) > -#define TCP_MAX_KEEPALIVE_MIN 4 > -#define TCP_KEEPALIVE_IDLE_MAX (TCP_TICK_HZ * 60 * 60 * 4) > -#define TCP_KEEPALIVE_PERIOD_MIN (TCP_TICK_HZ * 30) > -#define TCP_FIN_WAIT2_TIME_MAX (4 * TCP_TICK_HZ) > -#define TCP_TIME_WAIT_TIME_MAX (60 * TCP_TICK_HZ) > - > -/// > -/// TCP segmentation data > -/// > -typedef struct _TCP_SEG { > - TCP_SEQNO Seq; ///< Starting sequence number > - TCP_SEQNO End; ///< The sequence of the last byte + 1, include SYN/FIN. > End-Seq = SEG.LEN > - TCP_SEQNO Ack; ///< ACK field in the segment > - UINT8 Flag; ///< TCP header flags > - UINT16 Urg; ///< Valid if URG flag is set. > - UINT32 Wnd; ///< TCP window size field > -} TCP_SEG; > - > -/// > -/// Network endpoint, IP+Port structure > -/// > -typedef struct _TCP_PEER { > - UINT32 Ip; ///< IP address, network byte order > - TCP_PORTNO Port; ///< Port number, network byte order > -} TCP_PEER; > - > -/// > -/// TCP control block, it includes various states > -/// > -struct _TCP_CB { > - LIST_ENTRY List; ///< Back and forward link entry > - TCP_CB *Parent; ///< The parent TCP_CB structure > - > - SOCKET *Sk; ///< The socket it controled. > - TCP_PEER LocalEnd; ///< Local endpoint > - TCP_PEER RemoteEnd;///< Remote endpoint > - > - LIST_ENTRY SndQue; ///< Retxmission queue > - LIST_ENTRY RcvQue; ///< Reassemble queue > - UINT32 CtrlFlag; ///< Control flags, such as NO_NAGLE > - INT32 Error; ///< Soft error status, such as TCP_CONNECT_RESET > - > - // > - // RFC793 and RFC1122 defined variables > - // > - UINT8 State; ///< TCP state, such as SYN_SENT, LISTEN > - UINT8 DelayedAck; ///< Number of delayed ACKs > - UINT16 HeadSum; ///< Checksum of the fixed parts of pesudo > - ///< header: Src IP, Dst IP, 0, Protocol, > - ///< not include the TCP length. > - > - TCP_SEQNO Iss; ///< Initial Sending Sequence > - TCP_SEQNO SndUna; ///< First unacknowledged data > - TCP_SEQNO SndNxt; ///< Next data sequence to send. > - TCP_SEQNO SndPsh; ///< Send PUSH point > - TCP_SEQNO SndUp; ///< Send urgent point > - UINT32 SndWnd; ///< Window advertised by the remote peer > - UINT32 SndWndMax; ///< Max send window advertised by the peer > - TCP_SEQNO SndWl1; ///< Seq number used for last window update > - TCP_SEQNO SndWl2; ///< Ack no of last window update > - UINT16 SndMss; ///< Max send segment size > - TCP_SEQNO RcvNxt; ///< Next sequence no to receive > - UINT32 RcvWnd; ///< Window advertised by the local peer > - TCP_SEQNO RcvWl2; ///< The RcvNxt (or ACK) of last window update. > - ///< It is necessary because of delayed ACK > - > - TCP_SEQNO RcvUp; ///< Urgent point; > - TCP_SEQNO Irs; ///< Initial Receiving Sequence > - UINT16 RcvMss; ///< Max receive segment size > - UINT16 EnabledTimer; ///< Which timer is currently enabled > - UINT32 Timer[TCP_TIMER_NUMBER]; ///< When the timer will expire > - INT32 NextExpire; ///< Count down offset for the nearest timer > - UINT32 Idle; ///< How long the connection is in idle > - UINT32 ProbeTime; ///< The time out value for current window > prober > - BOOLEAN ProbeTimerOn;///< If TRUE, the probe time is on. > - > - // > - // RFC1323 defined variables, about window scale, > - // timestamp and PAWS > - // > - UINT8 SndWndScale; ///< Wndscale received from the peer > - UINT8 RcvWndScale; ///< Wndscale used to scale local buffer > - UINT32 TsRecent; ///< TsRecent to echo to the remote peer > - UINT32 TsRecentAge; ///< When this TsRecent is updated > - > - // > - // RFC2988 defined variables. about RTT measurement > - // > - TCP_SEQNO RttSeq; ///< The seq of measured segment now > - UINT32 RttMeasure; ///< Currently measured RTT in heart beats > - UINT32 SRtt; ///< Smoothed RTT, scaled by 8 > - UINT32 RttVar; ///< RTT variance, scaled by 8 > - UINT32 Rto; ///< Current RTO, not scaled > - > - // > - // RFC2581, and 3782 variables. > - // Congestion control + NewReno fast recovery. > - // > - UINT32 CWnd; ///< Sender's congestion window > - UINT32 Ssthresh; ///< Slow start threshold. > - TCP_SEQNO Recover; ///< Recover point for NewReno > - UINT16 DupAck; ///< Number of duplicate ACKs > - UINT8 CongestState; ///< The current congestion state(RFC3782) > - UINT8 LossTimes; ///< Number of retxmit timeouts in a row > - TCP_SEQNO LossRecover; ///< Recover point for retxmit > - > - // > - // configuration parameters, for EFI_TCP4_PROTOCOL specification > - // > - UINT32 KeepAliveIdle; ///< Idle time before sending first probe > - UINT32 KeepAlivePeriod; ///< Interval for subsequent keep alive > probe > - UINT8 MaxKeepAlive; ///< Maxium keep alive probe times. > - UINT8 KeepAliveProbes; ///< The number of keep alive probe. > - UINT16 MaxRexmit; ///< The maxium number of retxmit before > abort > - UINT32 FinWait2Timeout; ///< The FIN_WAIT_2 time out > - UINT32 TimeWaitTimeout; ///< The TIME_WAIT time out > - UINT32 ConnectTimeout; ///< The connect establishment time out > - > - // > - // RFC7323 > - // Addressing Window Retraction for TCP Window Scale Option. > - // > - TCP_SEQNO RetxmitSeqMax; ///< Max Seq number in previous > retransmission. > - > - // > - // configuration for tcp provided by user > - // > - BOOLEAN UseDefaultAddr; > - UINT8 Tos; > - UINT8 Ttl; > - EFI_IPv4_ADDRESS SubnetMask; > - > - IP_IO_IP_INFO *IpInfo; ///<pointer reference to Ip used to send pkt > -}; > - > -extern LIST_ENTRY mTcpRunQue; > -extern LIST_ENTRY mTcpListenQue; > -extern TCP_SEQNO mTcpGlobalIss; > -extern UINT32 mTcpTick; > - > -/// > -/// TCP_CONNECTED: both ends have synchronized their ISN. > -/// > -#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD) > - > -#define TCP_FIN_RCVD(State) \ > - (((State) == TCP_CLOSE_WAIT) || \ > - ((State) == TCP_LAST_ACK) || \ > - ((State) == TCP_CLOSING) || \ > - ((State) == TCP_TIME_WAIT)) > - > -#define TCP_LOCAL_CLOSED(State) \ > - (((State) == TCP_FIN_WAIT_1) || \ > - ((State) == TCP_FIN_WAIT_2) || \ > - ((State) == TCP_CLOSING) || \ > - ((State) == TCP_TIME_WAIT) || \ > - ((State) == TCP_LAST_ACK)) > - > -// > -// Get the TCP_SEG point from a net buffer's ProtoData > -// > -#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData)) > - > -// > -// macros to compare sequence no > -// > -#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0) > -#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0) > -#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0) > -#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0) > - > -// > -// TCP_SEQ_BETWEEN return whether b <= m <= e > -// > -#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b)) > - > -// > -// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2 > -// > -#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2))) > - > -// > -// Check whether Flag is on > -// > -#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != 0)) > - > -// > -// Set and Clear operation on a Flag > -// > -#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag)) > -#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag)) > - > -// > -// Test whether two peers are equal > -// > -#define TCP_PEER_EQUAL(Pa, Pb) \ > - (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port)) > - > -// > -// Test whether Pa matches Pb, or Pa is more specific > -// than pb. Zero means wildcard. > -// > -#define TCP_PEER_MATCH(Pa, Pb) \ > - ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \ > - (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port))) > - > -#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer))) > -#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 << > (Timer)))) > -#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 << > (Timer))))) > - > -#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0) > -#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0) > -#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb))) > - > -#define TCP_MAX_WIN 0xFFFFU > - > -typedef > -VOID > -(*TCP_TIMER_HANDLER) ( > - IN OUT TCP_CB *Tcb > - ); > - > -#endif > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > deleted file mode 100644 > index d8336c5e82e9..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > +++ /dev/null > @@ -1,502 +0,0 @@ > -/** @file > - Dhcp and Discover routines for PxeBc. > - > -Copyright (c) 2013, Red Hat, Inc. > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef __EFI_PXEBC_DHCP_H__ > -#define __EFI_PXEBC_DHCP_H__ > - > -#define PXEBC_DHCP4_MAX_OPTION_NUM 16 > -#define PXEBC_DHCP4_MAX_OPTION_SIZE 312 > -#define PXEBC_DHCP4_MAX_PACKET_SIZE (sizeof > (EFI_PXE_BASE_CODE_PACKET)) > - > -#define PXEBC_DHCP4_S_PORT 67 > -#define PXEBC_DHCP4_C_PORT 68 > -#define PXEBC_BS_DOWNLOAD_PORT 69 > -#define PXEBC_BS_DISCOVER_PORT 4011 > - > -#define PXEBC_DHCP4_OPCODE_REQUEST 1 > -#define PXEBC_DHCP4_OPCODE_REPLY 2 > -#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3 > -#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order > - > -// > -// Sub-Options in Dhcp Vendor Option > -// > -#define PXEBC_VENDOR_TAG_MTFTP_IP 1 > -#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2 > -#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3 > -#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4 > -#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5 > -#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6 > -#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7 > -#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8 > -#define PXEBC_VENDOR_TAG_BOOT_MENU 9 > -#define PXEBC_VENDOR_TAG_MENU_PROMPT 10 > -#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11 > -#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12 > -#define PXEBC_VENDOR_TAG_BOOT_ITEM 71 > - > -#define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT 4 > -#define PXEBC_DHCP4_DISCOVER_RETRIES 4 > - > -#define PXEBC_MAX_MENU_NUM 24 > -#define PXEBC_MAX_OFFER_NUM 16 > - > -#define PXEBC_BOOT_REQUEST_TIMEOUT 1 > -#define PXEBC_BOOT_REQUEST_RETRIES 4 > - > -#define PXEBC_DHCP4_OVERLOAD_FILE 1 > -#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2 > - > -// > -// The array index of the DHCP4 option tag interested > -// > -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0 > -#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1 > -#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2 > -#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3 > -#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4 > -#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5 > -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6 > -#define PXEBC_DHCP4_TAG_INDEX_MAX 7 > - > -// > -// The type of DHCP OFFER, arranged by priority, PXE10 has the highest > priority. > -// > -#define DHCP4_PACKET_TYPE_PXE10 0 > -#define DHCP4_PACKET_TYPE_WFM11A 1 > -#define DHCP4_PACKET_TYPE_BINL 2 > -#define DHCP4_PACKET_TYPE_DHCP_ONLY 3 > -#define DHCP4_PACKET_TYPE_BOOTP 4 > -#define DHCP4_PACKET_TYPE_MAX 5 > - > -#define BIT(x) (1 << x) > -#define CTRL(x) (0x1F & (x)) > - > -// > -// WfM11a options > -// > -#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT > (PXEBC_VENDOR_TAG_MTFTP_IP) | \ > - BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \ > - BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \ > - BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \ > - BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY)) > -// > -// Discoverty options > -// > -#define DISCOVER_VENDOR_OPTION_BIT_MAP (BIT > (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \ > - BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \ > - BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \ > - BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \ > - BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) > - > -#define IS_VALID_BOOT_PROMPT(x) \ > - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT > (PXEBC_VENDOR_TAG_MENU_PROMPT)) > - > -#define IS_VALID_BOOT_MENU(x) \ > - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT > (PXEBC_VENDOR_TAG_BOOT_MENU)) > - > -#define IS_VALID_MTFTP_VENDOR_OPTION(x) \ > - (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == > MTFTP_VENDOR_OPTION_BIT_MAP) > - > -#define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) & > DISCOVER_VENDOR_OPTION_BIT_MAP) != 0) > - > -#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \ > - (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == > BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) > - > -#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \ > - (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT > (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \ > - == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) > - > -#define IS_DISABLE_BCAST_DISCOVER(x) (((x) & BIT (0)) == BIT (0)) > -#define IS_DISABLE_MCAST_DISCOVER(x) (((x) & BIT (1)) == BIT (1)) > -#define IS_ENABLE_USE_SERVER_LIST(x) (((x) & BIT (2)) == BIT (2)) > -#define IS_DISABLE_PROMPT_MENU(x) (((x) & BIT (3)) == BIT (3)) > - > -#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) > ((x)[(y) / 32]) | BIT ((y) % 32)) > - > -#pragma pack(1) > -typedef struct { > - UINT8 ParaList[135]; > -} PXEBC_DHCP4_OPTION_PARA; > - > -typedef struct { > - UINT16 Size; > -} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE; > - > -typedef struct { > - UINT8 Type; > - UINT8 MajorVer; > - UINT8 MinorVer; > -} PXEBC_DHCP4_OPTION_UNDI; > - > -typedef struct { > - UINT8 Type; > -} PXEBC_DHCP4_OPTION_MESG; > - > -typedef struct { > - UINT16 Type; > -} PXEBC_DHCP4_OPTION_ARCH; > - > -#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000" > -#define DEFAULT_UNDI_TYPE 1 > -#define DEFAULT_UNDI_MAJOR 3 > -#define DEFAULT_UNDI_MINOR 0 > - > -typedef struct { > - UINT8 ClassIdentifier[10]; > - UINT8 ArchitecturePrefix[5]; > - UINT8 ArchitectureType[5]; > - UINT8 Lit3[1]; > - UINT8 InterfaceName[4]; > - UINT8 Lit4[1]; > - UINT8 UndiMajor[3]; > - UINT8 UndiMinor[3]; > -} PXEBC_DHCP4_OPTION_CLID; > - > -typedef struct { > - UINT8 Type; > - UINT8 Guid[16]; > -} PXEBC_DHCP4_OPTION_UUID; > - > -typedef struct { > - UINT16 Type; > - UINT16 Layer; > -} PXEBC_OPTION_BOOT_ITEM; > - > -#pragma pack() > - > -typedef union { > - PXEBC_DHCP4_OPTION_PARA *Para; > - PXEBC_DHCP4_OPTION_UNDI *Undi; > - PXEBC_DHCP4_OPTION_ARCH *Arch; > - PXEBC_DHCP4_OPTION_CLID *Clid; > - PXEBC_DHCP4_OPTION_UUID *Uuid; > - PXEBC_DHCP4_OPTION_MESG *Mesg; > - PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize; > -} PXEBC_DHCP4_OPTION_ENTRY; > - > -typedef struct { > - UINT16 Type; > - UINT8 IpCnt; > - EFI_IPv4_ADDRESS IpAddr[1]; > -} PXEBC_BOOT_SVR_ENTRY; > - > -typedef struct { > - UINT16 Type; > - UINT8 DescLen; > - UINT8 DescStr[1]; > -} PXEBC_BOOT_MENU_ENTRY; > - > -typedef struct { > - UINT8 Timeout; > - UINT8 Prompt[1]; > -} PXEBC_MENU_PROMPT; > - > -typedef struct { > - UINT32 BitMap[8]; > - EFI_IPv4_ADDRESS MtftpIp; > - UINT16 MtftpCPort; > - UINT16 MtftpSPort; > - UINT8 MtftpTimeout; > - UINT8 MtftpDelay; > - UINT8 DiscoverCtrl; > - EFI_IPv4_ADDRESS DiscoverMcastIp; > - EFI_IPv4_ADDRESS McastIpBase; > - UINT16 McastIpBlock; > - UINT16 McastIpRange; > - UINT16 BootSrvType; > - UINT16 BootSrvLayer; > - PXEBC_BOOT_SVR_ENTRY *BootSvr; > - UINT8 BootSvrLen; > - PXEBC_BOOT_MENU_ENTRY *BootMenu; > - UINT8 BootMenuLen; > - PXEBC_MENU_PROMPT *MenuPrompt; > - UINT8 MenuPromptLen; > - UINT32 *CredType; > - UINT8 CredTypeLen; > -} PXEBC_VENDOR_OPTION; > - > -#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF > (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE) > - > -typedef union { > - EFI_DHCP4_PACKET Offer; > - EFI_DHCP4_PACKET Ack; > - UINT8 Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE]; > -} PXEBC_DHCP4_PACKET; > - > -typedef struct { > - PXEBC_DHCP4_PACKET Packet; > - BOOLEAN IsPxeOffer; > - UINT8 OfferType; > - EFI_DHCP4_PACKET_OPTION > *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX]; > - PXEBC_VENDOR_OPTION PxeVendorOption; > -} PXEBC_CACHED_DHCP4_PACKET; > - > -#define GET_NEXT_DHCP_OPTION(Opt) \ > - (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof > (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1) > - > -#define GET_OPTION_BUFFER_LEN(Pkt) ((Pkt)->Length - sizeof > (EFI_DHCP4_HEADER) - 4) > -#define IS_PROXY_DHCP_OFFER(Offer) EFI_IP4_EQUAL (&((Offer)- > >Dhcp4.Header.YourAddr), &mZeroIp4Addr) > - > -#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \ > - (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)- > >IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS)) > - > - > -/** > - This function initialize the DHCP4 message instance. > - > - This function will pad each item of dhcp4 message packet. > - > - @param Seed Pointer to the message instance of the DHCP4 packet. > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > - > -**/ > -VOID > -PxeBcInitSeedPacket ( > - IN EFI_DHCP4_PACKET *Seed, > - IN EFI_UDP4_PROTOCOL *Udp4 > - ); > - > - > -/** > - Parse the cached dhcp packet. > - > - @param CachedPacket Pointer to cached dhcp packet. > - > - @retval TRUE Succeed to parse and validation. > - @retval FALSE Fail to parse or validation. > - > -**/ > -BOOLEAN > -PxeBcParseCachedDhcpPacket ( > - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket > - ); > - > -/** > - This function is to check the selected proxy offer (include BINL dhcp offer > and > - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe > base code > - mode structure. > - > - @param Private Pointer to PxeBc private data. > - > - @retval EFI_SUCCESS Operational successful. > - @retval EFI_NO_RESPONSE Offer dhcp service failed. > - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base > code mode. > - > -**/ > -EFI_STATUS > -PxeBcCheckSelectedOffer ( > - IN PXEBC_PRIVATE_DATA *Private > - ); > - > - > -/** > - Callback routine. > - > - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 > Protocol driver > - to intercept events that occurred in the configuration process. This > structure > - provides advanced control of each state transition of the DHCP process. > The > - returned status code determines the behavior of the EFI DHCPv4 Protocol > driver. > - There are three possible returned values, which are described in the > following > - table. > - > - @param This Pointer to the EFI DHCPv4 Protocol instance that is > used to > - configure this callback function. > - @param Context Pointer to the context that is initialized by > - EFI_DHCP4_PROTOCOL.Configure(). > - @param CurrentState The current operational state of the EFI DHCPv4 > Protocol > - driver. > - @param Dhcp4Event The event that occurs in the current state, > which usually means a > - state transition. > - @param Packet The DHCP packet that is going to be sent or already > received. > - @param NewPacket The packet that is used to replace the above > Packet. > - > - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue > the DHCP process. > - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI > DHCPv4 Protocol > - driver will continue to wait for more DHCPOFFER packets > until the retry > - timeout expires. > - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort > the current process and > - return to the Dhcp4Init or Dhcp4InitReboot state. > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDhcpCallBack ( > - IN EFI_DHCP4_PROTOCOL * This, > - IN VOID *Context, > - IN EFI_DHCP4_STATE CurrentState, > - IN EFI_DHCP4_EVENT Dhcp4Event, > - IN EFI_DHCP4_PACKET * Packet OPTIONAL, > - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL > - ); > - > -/** > - Switch the Ip4 policy to static. > - > - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. > - > - @retval EFI_SUCCESS The policy is already configured to static. > - @retval Others Other error as indicated.. > - > -**/ > -EFI_STATUS > -PxeBcSetIp4Policy ( > - IN PXEBC_PRIVATE_DATA *Private > - ); > - > -/** > - Discover the boot of service and initialize the vendor option if exists. > - > - @param Private Pointer to PxeBc private data. > - @param Type PxeBc option boot item type > - @param Layer PxeBc option boot item layer > - @param UseBis Use BIS or not > - @param DestIp Ip address for server > - @param IpCount The total count of the server ip address > - @param SrvList Server list > - @param IsDiscv Discover the vendor or not > - @param Reply The dhcp4 packet of Pxe reply > - > - @retval EFI_SUCCESS Operation succeeds. > - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. > - @retval EFI_NOT_FOUND There is no vendor option exists. > - @retval EFI_TIMEOUT Send Pxe Discover time out. > - > -**/ > -EFI_STATUS > -PxeBcDiscvBootService ( > - IN PXEBC_PRIVATE_DATA * Private, > - IN UINT16 Type, > - IN UINT16 *Layer, > - IN BOOLEAN UseBis, > - IN EFI_IP_ADDRESS * DestIp, > - IN UINT16 IpCount, > - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, > - IN BOOLEAN IsDiscv, > - OUT EFI_DHCP4_PACKET * Reply OPTIONAL > - ); > - > - > -/** > - Initialize the DHCP options and build the option list. > - > - @param Private Pointer to PxeBc private data. > - @param OptList Pointer to a DHCP option list. > - > - @param IsDhcpDiscover Discover dhcp option or not. > - > - @return The index item number of the option list. > - > -**/ > -UINT32 > -PxeBcBuildDhcpOptions ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_DHCP4_PACKET_OPTION **OptList, > - IN BOOLEAN IsDhcpDiscover > - ); > - > - > -/** > - Create the boot options. > - > - @param OptList Pointer to the list of the options > - @param Type the type of option > - @param Layer the layer of the boot options > - @param OptLen length of opotion > - > -**/ > -VOID > -PxeBcCreateBootOptions ( > - IN EFI_DHCP4_PACKET_OPTION *OptList, > - IN UINT16 Type, > - IN UINT16 *Layer, > - OUT UINT32 *OptLen > - ); > - > - > -/** > - Parse interested dhcp options. > - > - @param Buffer Pointer to the dhcp options packet. > - @param Length The length of the dhcp options. > - @param OptTag The option OpCode. > - > - @return NULL if the buffer length is 0 and OpCode is not > - DHCP4_TAG_EOP, or the pointer to the buffer. > - > -**/ > -EFI_DHCP4_PACKET_OPTION * > -PxeBcParseExtendOptions ( > - IN UINT8 *Buffer, > - IN UINT32 Length, > - IN UINT8 OptTag > - ); > - > - > -/** > - This function is to parse and check vendor options. > - > - @param Dhcp4Option Pointer to dhcp options > - @param VendorOption Pointer to vendor options > - > - @return TRUE if valid for vendor options, or FALSE. > - > -**/ > -BOOLEAN > -PxeBcParseVendorOptions ( > - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, > - IN PXEBC_VENDOR_OPTION *VendorOption > - ); > - > - > -/** > - Choose the boot prompt. > - > - @param Private Pointer to PxeBc private data. > - > - @retval EFI_SUCCESS Select boot prompt done. > - @retval EFI_TIMEOUT Select boot prompt time out. > - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. > - @retval EFI_ABORTED User cancel the operation. > - @retval EFI_NOT_READY Read the input key from the keybroad has not > finish. > - > -**/ > -EFI_STATUS > -PxeBcSelectBootPrompt ( > - IN PXEBC_PRIVATE_DATA *Private > - ); > - > - > -/** > - Select the boot menu. > - > - @param Private Pointer to PxeBc private data. > - @param Type The type of the menu. > - @param UseDefaultItem Use default item or not. > - > - @retval EFI_ABORTED User cancel operation. > - @retval EFI_SUCCESS Select the boot menu success. > - @retval EFI_NOT_READY Read the input key from the keybroad has not > finish. > - > -**/ > -EFI_STATUS > -PxeBcSelectBootMenu ( > - IN PXEBC_PRIVATE_DATA *Private, > - OUT UINT16 *Type, > - IN BOOLEAN UseDefaultItem > - ); > - > -#endif > - > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > deleted file mode 100644 > index b7bf069dd637..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > +++ /dev/null > @@ -1,102 +0,0 @@ > -/** @file > - > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef __EFI_PXEBC_DRIVER_H__ > -#define __EFI_PXEBC_DRIVER_H__ > - > -/** > - Test to see if this driver supports ControllerHandle. This service > - is called by the EFI boot service ConnectController(). In > - order to make drivers as small as possible, there are a few calling > - restrictions for this service. ConnectController() must > - follow these calling restrictions. If any other agent wishes to call > - Supported() it must also follow these calling restrictions. > - PxeBc requires DHCP4 and MTFTP4 protocols. > - > - @param This Protocol instance pointer. > - @param ControllerHandle Handle of device to test > - @param RemainingDevicePath Optional parameter use to pick a specific > child > - device to start. > - > - @retval EFI_SUCCESS This driver supports this device > - @retval EFI_ALREADY_STARTED This driver is already running on this device > - @retval other This driver does not support this device > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDriverBindingSupported ( > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > - ); > - > -/** > - Start this driver on ControllerHandle. This service is called by the > - EFI boot service ConnectController(). In order to make > - drivers as small as possible, there are a few calling restrictions for > - this service. ConnectController() must follow these > - calling restrictions. If any other agent wishes to call Start() it > - must also follow these calling restrictions. > - > - @param This Protocol instance pointer. > - @param ControllerHandle Handle of device to bind driver to > - @param RemainingDevicePath Optional parameter use to pick a specific > child > - device to start. > - > - @retval EFI_SUCCESS This driver is added to ControllerHandle > - @retval EFI_ALREADY_STARTED This driver is already running on > ControllerHandle > - @retval other This driver does not support this device > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDriverBindingStart ( > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > - IN EFI_HANDLE ControllerHandle, > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > - ); > - > -/** > - Stop this driver on ControllerHandle. This service is called by the > - EFI boot service DisconnectController(). In order to > - make drivers as small as possible, there are a few calling > - restrictions for this service. DisconnectController() > - must follow these calling restrictions. If any other agent wishes > - to call Stop() it must also follow these calling restrictions. > - > - @param This Protocol instance pointer. > - @param ControllerHandle Handle of device to stop driver on > - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If > number of > - children is zero stop the entire bus driver. > - @param ChildHandleBuffer List of Child Handles to Stop. > - > - @retval EFI_SUCCESS This driver is removed ControllerHandle > - @retval other This driver was not removed from this device > - > -**/ > -EFI_STATUS > -EFIAPI > -PxeBcDriverBindingStop ( > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > - IN EFI_HANDLE ControllerHandle, > - IN UINTN NumberOfChildren, > - IN EFI_HANDLE *ChildHandleBuffer > - ); > - > -extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2; > -extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName; > -extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding; > - > -#endif > - > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > deleted file mode 100644 > index e96b6f2c5d14..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > +++ /dev/null > @@ -1,189 +0,0 @@ > -/** @file > - > -Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef __EFI_PXEBC_IMPL_H__ > -#define __EFI_PXEBC_IMPL_H__ > - > - > -typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA; > - > -#include <Uefi.h> > - > -#include <Guid/SmBios.h> > -#include <IndustryStandard/SmBios.h> > -#include <IndustryStandard/Dhcp.h> > -#include <Protocol/Dhcp4.h> > -#include <Protocol/PxeBaseCode.h> > -#include <Protocol/Mtftp4.h> > -#include <Protocol/Udp4.h> > -#include <Protocol/LoadFile.h> > -#include <Protocol/NetworkInterfaceIdentifier.h> > -#include <Protocol/PxeBaseCodeCallBack.h> > -#include <Protocol/Arp.h> > -#include <Protocol/Ip4.h> > -#include <Protocol/Ip4Config2.h> > - > -#include <Library/DebugLib.h> > -#include <Library/DevicePathLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/MemoryAllocationLib.h> > -#include <Library/UefiDriverEntryPoint.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Library/UefiLib.h> > -#include <Library/BaseLib.h> > -#include <Library/NetLib.h> > -#include <Library/DpcLib.h> > -#include <Library/PcdLib.h> > - > -#include "PxeBcDriver.h" > -#include "PxeBcDhcp.h" > -#include "PxeBcMtftp.h" > -#include "PxeBcSupport.h" > - > -#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P') > -#define PXEBC_MTFTP_TIMEOUT 4 > -#define PXEBC_MTFTP_RETRIES 6 > -#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE 8 > -#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE 4 > -#define PXEBC_DEFAULT_PACKET_SIZE 1480 > -#define PXEBC_DEFAULT_LIFETIME 50000 // 50ms, unit is > microsecond > -#define PXEBC_CHECK_MEDIA_WAITING_TIME > EFI_TIMER_PERIOD_SECONDS(20) > - > -struct _PXEBC_PRIVATE_DATA { > - UINT32 Signature; > - EFI_HANDLE Controller; > - EFI_HANDLE Image; > - EFI_HANDLE ArpChild; > - EFI_HANDLE Dhcp4Child; > - EFI_HANDLE Ip4Child; > - EFI_HANDLE Mtftp4Child; > - EFI_HANDLE Udp4ReadChild; > - EFI_HANDLE Udp4WriteChild; > - > - EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii; > - > - EFI_PXE_BASE_CODE_PROTOCOL PxeBc; > - EFI_LOAD_FILE_PROTOCOL LoadFile; > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback; > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback; > - EFI_ARP_PROTOCOL *Arp; > - EFI_DHCP4_PROTOCOL *Dhcp4; > - EFI_IP4_PROTOCOL *Ip4; > - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; > - EFI_IP4_CONFIG_DATA Ip4ConfigData; > - EFI_MTFTP4_PROTOCOL *Mtftp4; > - EFI_UDP4_PROTOCOL *Udp4Read; > - EFI_UDP4_PROTOCOL *Udp4Write; > - UINT16 CurrentUdpSrcPort; > - EFI_UDP4_CONFIG_DATA Udp4CfgData; > - > - > - EFI_PXE_BASE_CODE_MODE Mode; > - EFI_PXE_BASE_CODE_FUNCTION Function; > - > - CHAR8 *BootFileName; > - > - EFI_IP_ADDRESS StationIp; > - EFI_IP_ADDRESS SubnetMask; > - EFI_IP_ADDRESS GatewayIp; > - EFI_IP_ADDRESS ServerIp; > - BOOLEAN AddressIsOk; > - UINT32 Ip4MaxPacketSize; > - UINTN BlockSize; > - UINTN FileSize; > - > - UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE]; > - EFI_DHCP4_PACKET SeedPacket; > - EFI_MAC_ADDRESS Mac; > - UINT8 MacLen; > - > - BOOLEAN SortOffers; > - BOOLEAN GotProxyOffer; > - UINT32 NumOffers; > - UINT32 SelectedOffer; > - UINT32 ProxyOfferType; > - > - // > - // Cached packets as complements of pxe mode data > - // > - PXEBC_CACHED_DHCP4_PACKET ProxyOffer; > - PXEBC_CACHED_DHCP4_PACKET Dhcp4Ack; > - PXEBC_CACHED_DHCP4_PACKET PxeReply; > - PXEBC_CACHED_DHCP4_PACKET > Dhcp4Offers[PXEBC_MAX_OFFER_NUM]; > - > - // > - // Arrays for different types of offers: > - // ServerCount records the count of the servers we got the offers, > - // OfferIndex records the index of the offer sent by the server indexed by > ServerCount. > - // > - UINT32 ServerCount[DHCP4_PACKET_TYPE_MAX]; > - UINT32 > OfferIndex[DHCP4_PACKET_TYPE_MAX][PXEBC_MAX_OFFER_NUM]; > - UINT32 BootpIndex; > - UINT32 ProxyIndex[DHCP4_PACKET_TYPE_MAX]; > - UINT32 BinlIndex[PXEBC_MAX_OFFER_NUM]; > - > - EFI_EVENT GetArpCacheEvent; > - // > - // token and event used to get ICMP error data from IP > - // > - EFI_IP4_COMPLETION_TOKEN IcmpErrorRcvToken; > -}; > - > -#define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a, > PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE) > - > -#define PXEBC_PRIVATE_DATA_FROM_LOADFILE(a) CR (a, > PXEBC_PRIVATE_DATA, LoadFile, PXEBC_PRIVATE_DATA_SIGNATURE) > - > -#define PXEBC_PRIVATE_DATA_FROM_PXEBCCALLBACK(a) CR (a, > PXEBC_PRIVATE_DATA, PxeBcCallback, PXEBC_PRIVATE_DATA_SIGNATURE) > - > -extern EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate; > -extern EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate; > - > -/** > - Causes the driver to load a specified file. > - > - @param This Protocol instance pointer. > - @param FilePath The device specific path of the file to load. > - @param BootPolicy If TRUE, indicates that the request originates > from the > - boot manager is attempting to load FilePath as a boot > - selection. If FALSE, then FilePath must match as exact file > - to be loaded. > - @param BufferSize On input the size of Buffer in bytes. On output > with a return > - code of EFI_SUCCESS, the amount of data transferred to > - Buffer. On output with a return code of > EFI_BUFFER_TOO_SMALL, > - the size of Buffer required to retrieve the requested file. > - @param Buffer The memory buffer to transfer the file to. IF Buffer > is NULL, > - then no the size of the requested file is returned in > - BufferSize. > - > - @retval EFI_SUCCESS The file was loaded. > - @retval EFI_UNSUPPORTED The device does not support the > provided BootPolicy > - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or > - BufferSize is NULL. > - @retval EFI_NO_MEDIA No medium was present to load the file. > - @retval EFI_DEVICE_ERROR The file was not loaded due to a device > error. > - @retval EFI_NO_RESPONSE The remote system did not respond. > - @retval EFI_NOT_FOUND The file was not found. > - @retval EFI_ABORTED The file load process was manually cancelled. > - > -**/ > -EFI_STATUS > -EFIAPI > -EfiPxeLoadFile ( > - IN EFI_LOAD_FILE_PROTOCOL * This, > - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, > - IN BOOLEAN BootPolicy, > - IN OUT UINTN *BufferSize, > - IN VOID *Buffer OPTIONAL > - ); > - > -#endif > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > deleted file mode 100644 > index 903dd4fbb69a..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > +++ /dev/null > @@ -1,137 +0,0 @@ > -/** @file > - Mtftp routines for PxeBc. > - > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef __EFI_PXEBC_MTFTP_H__ > -#define __EFI_PXEBC_MTFTP_H__ > - > -#define PXE_MTFTP_OPTION_BLKSIZE_INDEX 0 > -#define PXE_MTFTP_OPTION_TIMEOUT_INDEX 1 > -#define PXE_MTFTP_OPTION_TSIZE_INDEX 2 > -#define PXE_MTFTP_OPTION_MULTICAST_INDEX 3 > -#define PXE_MTFTP_OPTION_MAXIMUM_INDEX 4 > - > -#define PXE_MTFTP_ERROR_STRING_LENGTH 127 > -#define PXE_MTFTP_OPTBUF_MAXNUM_INDEX 128 > - > - > -/** > - This function is to get size of a file by Tftp. > - > - @param Private Pointer to PxeBc private data > - @param Config Pointer to Mtftp configuration data > - @param Filename Pointer to file name > - @param BlockSize Pointer to block size > - @param BufferSize Pointer to buffer size > - > - @retval EFI_SUCCESS Get the size of file success > - @retval EFI_NOT_FOUND Parse the tftp ptions failed. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval Other Has not get the size of the file. > - > -**/ > -EFI_STATUS > -PxeBcTftpGetFileSize ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN UINTN *BlockSize, > - IN OUT UINT64 *BufferSize > - ); > - > - > -/** > - This function is to get data of a file by Tftp. > - > - @param Private Pointer to PxeBc private data > - @param Config Pointer to Mtftp configuration data > - @param Filename Pointer to file name > - @param BlockSize Pointer to block size > - @param BufferPtr Pointer to buffer > - @param BufferSize Pointer to buffer size > - @param DontUseBuffer Indicate whether with a receive buffer > - > - @retval EFI_SUCCESS Read the data success from the special file. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval other Read data from file failed. > - > -**/ > -EFI_STATUS > -PxeBcTftpReadFile ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN UINTN *BlockSize, > - IN UINT8 *BufferPtr, > - IN OUT UINT64 *BufferSize, > - IN BOOLEAN DontUseBuffer > - ); > - > - > -/** > - This function is put data of a file by Tftp. > - > - @param Private Pointer to PxeBc private data > - @param Config Pointer to Mtftp configuration data > - @param Filename Pointer to file name > - @param Overwrite Indicate whether with overwrite attribute > - @param BlockSize Pointer to block size > - @param BufferPtr Pointer to buffer > - @param BufferSize Pointer to buffer size > - > - @retval EFI_SUCCESS Write the data success into the special file. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval other Write data into file failed. > - > -**/ > -EFI_STATUS > -PxeBcTftpWriteFile ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN BOOLEAN Overwrite, > - IN UINTN *BlockSize, > - IN UINT8 *BufferPtr, > - IN OUT UINT64 *BufferSize > - ); > - > - > -/** > - This function is to get data(file) from a directory(may be a server) by Tftp. > - > - @param Private Pointer to PxeBc private data. > - @param Config Pointer to Mtftp configuration data. > - @param Filename Pointer to file name. > - @param BlockSize Pointer to block size. > - @param BufferPtr Pointer to buffer. > - @param BufferSize Pointer to buffer size. > - @param DontUseBuffer Indicate whether with a receive buffer. > - > - @retval EFI_SUCCES Get the data from the file included in directory > success. > - @retval EFI_DEVICE_ERROR The network device encountered an error > during this operation. > - @retval other Operation failed. > - > -**/ > -EFI_STATUS > -PxeBcTftpReadDirectory ( > - IN PXEBC_PRIVATE_DATA *Private, > - IN EFI_MTFTP4_CONFIG_DATA *Config, > - IN UINT8 *Filename, > - IN UINTN *BlockSize, > - IN UINT8 *BufferPtr, > - IN OUT UINT64 *BufferSize, > - IN BOOLEAN DontUseBuffer > - ); > - > -#endif > - > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > deleted file mode 100644 > index a28c9740c171..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > +++ /dev/null > @@ -1,134 +0,0 @@ > -/** @file > - Support routines for PxeBc. > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BSD > License > -which accompanies this distribution. The full text of the license may be > found at > -http://opensource.org/licenses/bsd-license.php > - > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > - > -**/ > - > -#ifndef __EFI_PXEBC_SUPPORT_H__ > -#define __EFI_PXEBC_SUPPORT_H__ > - > - > -/** > - The common notify function associated with various PxeBc events. > - > - @param Event The event signaled. > - @param Context The context. > - > -**/ > -VOID > -EFIAPI > -PxeBcCommonNotify ( > - IN EFI_EVENT Event, > - IN VOID *Context > - ); > - > - > -/** > - This function initialize(or configure) the Udp4Write instance. > - > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > - @param StationIp Pointer to the station ip address. > - @param SubnetMask Pointer to the subnetmask of the station ip address. > - @param Gateway Pointer to the gateway ip address. > - @param SrcPort Pointer to the srouce port of the station. > - @param Ttl The time to live field of the IP header. > - @param ToS The type of service field of the IP header. > - > - @retval EFI_SUCCESS The configuration settings were set, changed, or > reset successfully. > - @retval EFI_NO_MAPPING When using a default address, configuration > (DHCP, BOOTP, > - RARP, etc.) is not finished yet. > - @retval EFI_INVALID_PARAMETER One or more following conditions are > TRUE: > - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already > started/configured > - and must be stopped/reset before it can be reconfigured. > - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is > FALSE > - and UdpConfigData.StationPort is already used by > - other instance. > - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot > allocate memory for this > - EFI UDPv4 Protocol instance. > - @retval EFI_DEVICE_ERROR An unexpected network or system error > occurred and this instance > - was not opened. > - @retval Others Please examine the function Udp4->Routes(Udp4, > FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. > - > -**/ > -EFI_STATUS > -PxeBcConfigureUdpWriteInstance ( > - IN EFI_UDP4_PROTOCOL *Udp4, > - IN EFI_IPv4_ADDRESS *StationIp, > - IN EFI_IPv4_ADDRESS *SubnetMask, > - IN EFI_IPv4_ADDRESS *Gateway, > - IN OUT UINT16 *SrcPort, > - IN UINT8 Ttl, > - IN UINT8 ToS > - ); > - > - > -/** > - This function is to display the IPv4 address. > - > - @param[in] Ip The pointer to the IPv4 address. > - > -**/ > -VOID > -PxeBcShowIp4Addr ( > - IN EFI_IPv4_ADDRESS *Ip > - ); > - > - > -/** > - Convert number to ASCII value. > - > - @param Number Numeric value to convert to decimal ASCII value. > - @param Buffer Buffer to place ASCII version of the Number. > - @param Length Length of Buffer. > - > -**/ > -VOID > -CvtNum ( > - IN UINTN Number, > - IN UINT8 *Buffer, > - IN UINTN Length > - ); > - > - > -/** > - Convert unsigned int number to decimal number. > - > - @param Number The unsigned int number will be converted. > - @param Buffer Pointer to the buffer to store the decimal number > after transform. > - @param[in] BufferSize The maxsize of the buffer. > - > - @return the length of the number after transform. > - > -**/ > -UINTN > -UtoA10 ( > - IN UINTN Number, > - IN CHAR8 *Buffer, > - IN UINTN BufferSize > - > - ); > - > - > -/** > - Convert ASCII numeric string to a UINTN value. > - > - @param Buffer Pointer to the 8-byte unsigned int value. > - > - @return UINTN value of the ASCII string. > - > -**/ > -UINT64 > -AtoU64 ( > - IN UINT8 *Buffer > - ); > - > - > -#endif > - > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > deleted file mode 100644 > index e97c3cadd973..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > +++ /dev/null > @@ -1,25 +0,0 @@ > -// /** @file > -// This module produces EFI Preboot Execution Environment (PXE) Base > Code Protocol. > -// > -// This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl > and IPv4 > -// network stack, used to control PXE-compatible devices. It produces EFI > Load File > -// Protocol to provide one clean way to otain control from the boot manager > if the > -// boot patch is from the remote device. > -// > -// Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the > BSD License > -// which accompanies this distribution. The full text of the license may be > found at > -// http://opensource.org/licenses/bsd-license.php > -// > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > - > -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI > Preboot Execution Environment (PXE) Base Code Protocol" > - > -#string STR_MODULE_DESCRIPTION #language en-US "This module > produces EFI PXE Base Code Protocol upon the EFI MMP Protocol and the > IPv4 network stack, and is used to control PXE-compatible devices. It > produces the EFI Load File Protocol to provide a clean method to obtain > control from the boot manager if the boot patch is from the remote device." > - > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra. > uni > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra. > uni > deleted file mode 100644 > index 2c1bda1a8bd2..000000000000 > --- > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra. > uni > +++ /dev/null > @@ -1,20 +0,0 @@ > -// /** @file > -// UefiPxe4BcDxe Localized Strings and Content > -// > -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> > -// > -// This program and the accompanying materials > -// are licensed and made available under the terms and conditions of the > BSD License > -// which accompanies this distribution. The full text of the license may be > found at > -// http://opensource.org/licenses/bsd-license.php > -// > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -// > -// **/ > - > -#string STR_PROPERTIES_MODULE_NAME > -#language en-US > -"UEFI PXE Base Code DXE Driver" > - > - > diff --git > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > deleted file mode 100644 > index 042401992945..000000000000 > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > +++ /dev/null > @@ -1,102 +0,0 @@ > -## @file > -# This module produces EFI Preboot Execution Environment (PXE) Base > Code Protocol. > -# > -# This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl > and IPv4 > -# network stack, used to control PXE-compatible devices. It produces EFI > Load File > -# Protocol to provide one clean way to otain control from the boot manager > if the > -# boot patch is from the remote device. This driver only supports IPv4 > network stack. > -# > -# Notes: > -# 1) This driver can't co-work with the UefiPxeBcDxe driver in NetworkPkg. > -# 2) This driver might have some issues that have been fixed in the > UefiPxeBcDxe > -# driver in NetworkPkg. > -# 3) This driver supports fewer features than the UefiPxeBcDxe driver in > NetworkPkg > -# (e.g. IPv6, MTFTP windowsize). > -# 4) UefiPxeBcDxe driver in NetworkPkg is recommended for use instead of > this one even > -# though both of them can be used. > -# > -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > -# This program and the accompanying materials > -# are licensed and made available under the terms and conditions of the > BSD License > -# which accompanies this distribution. The full text of the license may be > found at > -# http://opensource.org/licenses/bsd-license.php > -# > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > BASIS, > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > -# > -# > -## > - > - > -[Defines] > - INF_VERSION = 0x00010005 > - BASE_NAME = UefiPxe4BcDxe > - MODULE_UNI_FILE = UefiPxe4BcDxe.uni > - FILE_GUID = 3B1DEAB5-C75D-442e-9238-8E2FFB62B0BB > - MODULE_TYPE = UEFI_DRIVER > - VERSION_STRING = 1.0 > - ENTRY_POINT = PxeBcDriverEntryPoint > - UNLOAD_IMAGE = NetLibDefaultUnload > - > -# > -# The following information is for reference only and not required by the > build tools. > -# > -# VALID_ARCHITECTURES = IA32 X64 > -# > -# DRIVER_BINDING = gPxeBcDriverBinding > -# COMPONENT_NAME = gPxeBcComponentName > -# COMPONENT_NAME2 = gPxeBcComponentName2 > -# > - > -[Sources] > - PxeBcMtftp.c > - PxeBcSupport.h > - PxeBcSupport.c > - PxeBcDriver.c > - PxeBcDhcp.h > - ComponentName.c > - PxeBcImpl.c > - PxeBcImpl.h > - PxeBcDhcp.c > - PxeBcMtftp.h > - PxeBcDriver.h > - > - > -[Packages] > - MdePkg/MdePkg.dec > - MdeModulePkg/MdeModulePkg.dec > - > -[LibraryClasses] > - BaseLib > - UefiLib > - UefiBootServicesTableLib > - UefiDriverEntryPoint > - BaseMemoryLib > - MemoryAllocationLib > - DebugLib > - NetLib > - DpcLib > - PcdLib > - > -[Protocols] > - gEfiPxeBaseCodeCallbackProtocolGuid ## SOMETIMES_PRODUCES > - gEfiPxeBaseCodeProtocolGuid ## BY_START > - gEfiLoadFileProtocolGuid ## BY_START > - gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## > SOMETIMES_CONSUMES > - gEfiArpServiceBindingProtocolGuid ## TO_START > - gEfiArpProtocolGuid ## TO_START > - gEfiMtftp4ServiceBindingProtocolGuid ## TO_START > - gEfiMtftp4ProtocolGuid ## TO_START > - gEfiUdp4ServiceBindingProtocolGuid ## TO_START > - gEfiUdp4ProtocolGuid ## TO_START > - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START > - gEfiDhcp4ProtocolGuid ## TO_START > - gEfiIp4ServiceBindingProtocolGuid ## TO_START > - gEfiIp4ProtocolGuid ## TO_START > - gEfiIp4Config2ProtocolGuid ## TO_START > - > -[Pcd] > - gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize ## > SOMETIMES_CONSUMES > - > -[UserExtensions.TianoCore."ExtraFiles"] > - UefiPxe4BcDxeExtra.uni > -- > 2.18.0.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. 2018-10-31 8:23 ` Ni, Ruiyu @ 2018-10-31 8:37 ` Fu, Siyuan 0 siblings, 0 replies; 29+ messages in thread From: Fu, Siyuan @ 2018-10-31 8:37 UTC (permalink / raw) To: Ni, Ruiyu, edk2-devel@lists.01.org; +Cc: Wu, Jiaxin, Zeng, Star Hi, Ray Thanks for reminder, I will follow up this issue. BestRegards Fu Siyuan > -----Original Message----- > From: Ni, Ruiyu > Sent: Wednesday, October 31, 2018 4:24 PM > To: Fu, Siyuan <siyuan.fu@intel.com>; edk2-devel@lists.01.org > Cc: Wu, Jiaxin <jiaxin.wu@intel.com>; Zeng, Star <star.zeng@intel.com> > Subject: RE: [edk2] [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI > drivers in MdeModulePkg. > > Siyuan, > In BmBootDescription.c: BmGetNetworkDescription() contains below comments: > // > // The PXE device path is like: > // ....../Mac(...)[/Vlan(...)][/Wi-Fi(...)] > // ....../Mac(...)[/Vlan(...)][/Wi-Fi(...)]/IPv4(...) > // ....../Mac(...)[/Vlan(...)][/Wi-Fi(...)]/IPv6(...) > // > > After the PxeBcDxe driver in MdeModulePkg is removed, there won't be PXD > device path > like "....../Mac(...)[/Vlan(...)][/Wi-Fi(...)]". > > So the code block "Locate the IP node" should expect IP node always exists. > > Could you please change this function after this patch is commit? > > Thanks/Ray > > > -----Original Message----- > > From: edk2-devel <edk2-devel-bounces@lists.01.org> On Behalf Of Fu > > Siyuan > > Sent: Tuesday, October 30, 2018 3:33 PM > > To: edk2-devel@lists.01.org > > Cc: Wu, Jiaxin <jiaxin.wu@intel.com>; Zeng, Star <star.zeng@intel.com> > > Subject: [edk2] [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI > > drivers in MdeModulePkg. > > > > This patch is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe drivers > > in MdeModulePkg. These drivers will not be maintained and can't co-work > > with the dual-stack drivers in NetworkPkg. > > > > People should use below NetworkPkg drivers instead: > > NetworkPkg/IScsiDxe/IScsiDxe.inf > > NetworkPkg/TcpDxe/TcpDxe.inf > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > > These drivers are actively maintained with more bug fixes and new > feature > > support. > > > > Cc: Star Zeng <star.zeng@intel.com> > > Cc: Jian J Wang <jian.j.wang@intel.com> > > Cc: Jiaxin Wu <jiaxin.wu@intel.com> > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> > > --- > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c | > > 283 -- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c | > 430 --- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c | > 1264 ----- > > ---- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c | > 472 ---- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c | > 676 ----- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c | > 412 > > --- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c | > 539 ---- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c | > 116 > > - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c | > 948 ------ > > - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c | > 2799 ----- > > ------------- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c | > 487 ---- > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | > 350 --- > > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c | > > 433 --- > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c | > 1201 ---- > > ---- > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c | > 990 -- > > ----- > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c | > 717 - > > ---- > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c | > 782 ---- > > - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c | > 1497 --- > > ------- > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c | > 112 - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c | > 674 ---- > > - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c | > 940 ---- > > -- > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c | > 352 --- > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c | > 1238 -- > > ------ > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c | > 584 ---- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > > | 365 --- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c | > > 1999 ------------- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c | > > 665 ----- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c | > > 2989 -------------------- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c | > > 454 --- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c | > > 221 -- > > MdeModulePkg/MdeModulePkg.dsc | > 3 - > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h | > > 165 -- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni | > 25 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni | > 20 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h | > 106 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h | > 22 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h | > 166 -- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr | > 219 - > > - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni | > > 62 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h | > > 109 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h | > 55 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h | > 140 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf | > 134 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h | > 22 > > - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h | > 38 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h | > 168 -- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h | > 74 - > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h | > 317 --- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h | > 1005 ----- > > -- > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h | > 142 - > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | > 80 - > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h | > 131 - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h | > 954 ------ > > - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h | > 342 --- > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | > 94 - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | > 23 - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni | > 20 - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h | > 781 ---- > > - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h | > 494 --- > > - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h | > 130 - > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h | > 357 --- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h | > > 502 ---- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h | > > 102 - > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h | > 189 > > -- > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h | > > 137 - > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h | > > 134 - > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | > > 25 - > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni > > | 20 - > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | > > 102 - > > 69 files changed, 32598 deletions(-) > > > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > deleted file mode 100644 > > index 3f561e93439d..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > +++ /dev/null > > @@ -1,283 +0,0 @@ > > -/** @file > > - UEFI Component Name(2) protocol implementation for iSCSI. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -// > > -// EFI Component Name Protocol > > -// > > -GLOBAL_REMOVE_IF_UNREFERENCED > > EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = { > > - IScsiComponentNameGetDriverName, > > - IScsiComponentNameGetControllerName, > > - "eng" > > -}; > > - > > -// > > -// EFI Component Name 2 Protocol > > -// > > -GLOBAL_REMOVE_IF_UNREFERENCED > > EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = { > > - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) > > IScsiComponentNameGetDriverName, > > - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) > > IScsiComponentNameGetControllerName, > > - "en" > > -}; > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > > mIScsiDriverNameTable[] = { > > - {"eng;en", L"iSCSI Driver"}, > > - {NULL, NULL} > > -}; > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > > *mIScsiControllerNameTable = NULL; > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the EFI > Driver. > > - > > - This function retrieves the user readable name of a driver in the > form of a > > - Unicode string. If the driver specified by This has a user readable > name in > > - the language specified by Language, then a pointer to the driver name > is > > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > > specified > > - by This does not support the language specified by Language, > > - then EFI_UNSUPPORTED is returned. > > - > > - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL > > instance. > > - @param[in] Language A pointer to a three character ISO 639-2 > language > > identifier. > > - This is the language of the driver name that > that the caller > > - is requesting, and it must match one of the > languages specified > > - in SupportedLanguages. The number of > languages supported > > by a > > - driver is up to the driver writer. > > - @param[out] DriverName A pointer to the Unicode string to return. > This > > Unicode string > > - is the name of the driver specified by This > in the language > > - specified by Language. > > - > > - @retval EFI_SUCCESS The Unicode string for the Driver > specified by > > This > > - and the language specified by Language > was returned > > - in DriverName. > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support the > > - language specified by Language. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiComponentNameGetDriverName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN CHAR8 *Language, > > - OUT CHAR16 **DriverName > > - ) > > -{ > > - return LookupUnicodeString2 ( > > - Language, > > - This->SupportedLanguages, > > - mIScsiDriverNameTable, > > - DriverName, > > - (BOOLEAN)(This == &gIScsiComponentName) > > - ); > > -} > > - > > -/** > > - Update the component name for the iSCSI instance. > > - > > - @param[in] IScsiExtScsiPassThru A pointer to the > > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > > - > > - @retval EFI_SUCCESS Update the ControllerNameTable of > this > > instance successfully. > > - @retval EFI_INVALID_PARAMETER The input parameter is invalid. > > - @retval EFI_UNSUPPORTED Can't get the corresponding NIC > info from > > the Controller handle. > > - > > -**/ > > -EFI_STATUS > > -UpdateName ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru > > - ) > > -{ > > - EFI_STATUS Status; > > - CHAR16 HandleName[150]; > > - ISCSI_DRIVER_DATA *Private; > > - EFI_MAC_ADDRESS MacAddress; > > - UINTN HwAddressSize; > > - UINT16 VlanId; > > - CHAR16 MacString[70]; > > - > > - if (IScsiExtScsiPassThru == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU > > (IScsiExtScsiPassThru); > > - > > - // > > - // Get the mac string, it's the name of various variable > > - // > > - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, > > &HwAddressSize); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - VlanId = NetLibGetVlanId (Private->Controller); > > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > > MacString); > > - > > - UnicodeSPrint ( > > - HandleName, > > - sizeof (HandleName), > > - L"iSCSI IPv4 (MacString=%s)", > > - MacString > > - ); > > - > > - if (mIScsiControllerNameTable != NULL) { > > - FreeUnicodeStringTable (mIScsiControllerNameTable); > > - mIScsiControllerNameTable = NULL; > > - } > > - > > - Status = AddUnicodeString2 ( > > - "eng", > > - gIScsiComponentName.SupportedLanguages, > > - &mIScsiControllerNameTable, > > - HandleName, > > - TRUE > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - return AddUnicodeString2 ( > > - "en", > > - gIScsiComponentName2.SupportedLanguages, > > - &mIScsiControllerNameTable, > > - HandleName, > > - FALSE > > - ); > > -} > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > controller > > - that is being managed by an EFI Driver.Currently not implemented. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME_PROTOCOL instance. > > - @param[in] ControllerHandle The handle of a controller that the > driver > > specified by > > - This is managing. This handle specifies > the controller > > - whose name is to be returned. > > - @param[in] ChildHandle The handle of the child controller to > retrieve > > the name > > - of. This is an optional parameter that > may be NULL. It > > - will be NULL for device drivers. It > will also be NULL > > - for a bus drivers that wish to retrieve > the name of the > > - bus controller. It will not be NULL for > a bus driver > > - that wishes to retrieve the name of a > child controller. > > - @param[in] Language A pointer to a three character ISO 639-2 > > language > > - identifier. This is the language of the > controller name > > - that that the caller is requesting, and > it must match one > > - of the languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up to the > > - driver writer. > > - @param[out] ControllerName A pointer to the Unicode string to > return. > > This Unicode > > - string is the name of the controller > specified by > > - ControllerHandle and ChildHandle in the > language specified > > - by Language from the point of view of > the driver specified > > - by This. > > - > > - @retval EFI_SUCCESS The Unicode string for the user > readable name > > in the > > - language specified by Language for the > driver > > - specified by This was returned in > DriverName. > > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > > valid EFI_HANDLE. > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > > - @retval EFI_UNSUPPORTED The driver specified by This is not > currently > > managing > > - the controller specified by > ControllerHandle and > > - ChildHandle. > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support the > > - language specified by Language. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiComponentNameGetControllerName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE ChildHandle OPTIONAL, > > - IN CHAR8 *Language, > > - OUT CHAR16 **ControllerName > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - EFI_HANDLE IScsiController; > > - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; > > - > > - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru; > > - > > - if (ControllerHandle == NULL) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - // > > - // Get the handle of the controller we are controling. > > - // > > - IScsiController = NetLibGetNicHandle (ControllerHandle, > > &gEfiTcp4ProtocolGuid); > > - if (IScsiController == NULL) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - IScsiController, > > - &gEfiCallerIdGuid, > > - (VOID **)&IScsiIdentifier, > > - NULL, > > - NULL, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - if (ChildHandle != NULL) { > > - // > > - // Make sure this driver produced ChildHandle > > - // > > - Status = EfiTestChildHandle ( > > - ControllerHandle, > > - ChildHandle, > > - &gEfiTcp4ProtocolGuid > > - ); > > - if (!EFI_ERROR (Status)) { > > - // > > - // Retrieve an instance of a produced protocol from ChildHandle > > - // > > - Status = gBS->OpenProtocol ( > > - ChildHandle, > > - &gEfiExtScsiPassThruProtocolGuid, > > - (VOID **)&IScsiExtScsiPassThru, > > - NULL, > > - NULL, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // Update the component name for this child handle. > > - // > > - Status = UpdateName (IScsiExtScsiPassThru); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - } else { > > - return Status; > > - } > > - } > > - > > - return LookupUnicodeString2 ( > > - Language, > > - This->SupportedLanguages, > > - mIScsiControllerNameTable, > > - ControllerName, > > - (BOOLEAN)(This == &gIScsiComponentName) > > - ); > > -} > > - > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > deleted file mode 100644 > > index 6307684ff05b..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > +++ /dev/null > > @@ -1,430 +0,0 @@ > > -/** @file > > - This file is for Challenge-Handshake Authentication Protocol (CHAP) > > Configuration. > > - > > -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > -#include "Md5.h" > > - > > -/** > > - Initator calculates its own expected hash value. > > - > > - @param[in] ChapIdentifier iSCSI CHAP identifier sent by > authenticator. > > - @param[in] ChapSecret iSCSI CHAP secret of the > authenticator. > > - @param[in] SecretLength The length of iSCSI CHAP secret. > > - @param[in] ChapChallenge The challenge message sent by > > authenticator. > > - @param[in] ChallengeLength The length of iSCSI CHAP challenge > > message. > > - @param[out] ChapResponse The calculation of the expected hash > > value. > > - > > - @retval EFI_SUCCESS The expected hash value was > calculatedly > > successfully. > > - @retval EFI_PROTOCOL_ERROR The length of the secret should be at > > least the > > - length of the hash value for the > hashing algorithm chosen. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiCHAPCalculateResponse ( > > - IN UINT32 ChapIdentifier, > > - IN CHAR8 *ChapSecret, > > - IN UINT32 SecretLength, > > - IN UINT8 *ChapChallenge, > > - IN UINT32 ChallengeLength, > > - OUT UINT8 *ChapResponse > > - ) > > -{ > > - MD5_CTX Md5Ctx; > > - CHAR8 IdByte[1]; > > - EFI_STATUS Status; > > - > > - Status = MD5Init (&Md5Ctx); > > - > > - // > > - // Hash Identifier - Only calculate 1 byte data (RFC1994) > > - // > > - IdByte[0] = (CHAR8) ChapIdentifier; > > - MD5Update (&Md5Ctx, IdByte, 1); > > - > > - // > > - // Hash Secret > > - // > > - if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - MD5Update (&Md5Ctx, ChapSecret, SecretLength); > > - > > - // > > - // Hash Challenge received from Target > > - // > > - MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength); > > - > > - Status = MD5Final (&Md5Ctx, ChapResponse); > > - > > - return Status; > > -} > > - > > -/** > > - The initator checks the CHAP response replied by target against its > own > > - calculation of the expected hash value. > > - > > - @param[in] AuthData iSCSI CHAP authentication data. > > - @param[in] TargetResponse The response from target. > > - > > - @retval EFI_SUCCESS The response from target passed > > authentication. > > - @retval EFI_SECURITY_VIOLATION The response from target was not > > expected value. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiCHAPAuthTarget ( > > - IN ISCSI_CHAP_AUTH_DATA *AuthData, > > - IN UINT8 *TargetResponse > > - ) > > -{ > > - EFI_STATUS Status; > > - UINT32 SecretSize; > > - UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN]; > > - > > - Status = EFI_SUCCESS; > > - > > - SecretSize = (UINT32) AsciiStrLen (AuthData- > > >AuthConfig.ReverseCHAPSecret); > > - Status = IScsiCHAPCalculateResponse ( > > - AuthData->OutIdentifier, > > - AuthData->AuthConfig.ReverseCHAPSecret, > > - SecretSize, > > - AuthData->OutChallenge, > > - AuthData->OutChallengeLength, > > - VerifyRsp > > - ); > > - > > - if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) > > { > > - Status = EFI_SECURITY_VIOLATION; > > - } > > - > > - return Status; > > -} > > - > > -/** > > - This function checks the received iSCSI Login Response during the > security > > - negotiation stage. > > - > > - @param[in] Conn The iSCSI connection. > > - > > - @retval EFI_SUCCESS The Login Response passed the CHAP > validation. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiCHAPOnRspReceived ( > > - IN ISCSI_CONNECTION *Conn > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_SESSION *Session; > > - ISCSI_CHAP_AUTH_DATA *AuthData; > > - CHAR8 *Value; > > - UINT8 *Data; > > - UINT32 Len; > > - LIST_ENTRY *KeyValueList; > > - UINTN Algorithm; > > - CHAR8 *Identifier; > > - CHAR8 *Challenge; > > - CHAR8 *Name; > > - CHAR8 *Response; > > - UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN]; > > - UINT32 RspLen; > > - > > - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); > > - ASSERT (Conn->RspQue.BufNum != 0); > > - > > - Session = Conn->Session; > > - AuthData = &Session->AuthData; > > - > > - Len = Conn->RspQue.BufSize; > > - Data = AllocatePool (Len); > > - if (Data == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - // > > - // Copy the data in case the data spans over multiple PDUs. > > - // > > - NetbufQueCopy (&Conn->RspQue, 0, Len, Data); > > - > > - // > > - // Build the key-value list from the data segment of the Login > Response. > > - // > > - KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len); > > - if (KeyValueList == NULL) { > > - FreePool (Data); > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Status = EFI_PROTOCOL_ERROR; > > - > > - switch (Conn->CHAPStep) { > > - case ISCSI_CHAP_INITIAL: > > - // > > - // The first Login Response. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); > > - if (Value == NULL) { > > - goto ON_EXIT; > > - } > > - > > - Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn > > (Value); > > - > > - Value = IScsiGetValueByKeyFromList > (KeyValueList, > > ISCSI_KEY_AUTH_METHOD); > > - if (Value == NULL) { > > - goto ON_EXIT; > > - } > > - // > > - // Initiator mandates CHAP authentication but target replies > without > > "CHAP" or > > - // initiator suggets "None" but target replies with some kind of > auth > > method. > > - // > > - if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) { > > - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { > > - goto ON_EXIT; > > - } > > - } else { > > - if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) { > > - goto ON_EXIT; > > - } > > - } > > - // > > - // Transit to CHAP step one. > > - // > > - Conn->CHAPStep = ISCSI_CHAP_STEP_ONE; > > - Status = EFI_SUCCESS; > > - break; > > - > > - case ISCSI_CHAP_STEP_TWO: > > - // > > - // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C> > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_CHAP_ALGORITHM); > > - if (Value == NULL) { > > - goto ON_EXIT; > > - } > > - > > - Algorithm = AsciiStrDecimalToUintn (Value); > > - if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) { > > - // > > - // Unsupported algorithm is chosen by target. > > - // > > - goto ON_EXIT; > > - } > > - > > - Identifier = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_CHAP_IDENTIFIER); > > - if (Identifier == NULL) { > > - goto ON_EXIT; > > - } > > - > > - Challenge = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_CHAP_CHALLENGE); > > - if (Challenge == NULL) { > > - goto ON_EXIT; > > - } > > - // > > - // Process the CHAP identifier and CHAP Challenge from Target > > - // Calculate Response value > > - // > > - AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn > (Identifier); > > - AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN; > > - IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData- > > >InChallengeLength, Challenge); > > - Status = IScsiCHAPCalculateResponse ( > > - AuthData->InIdentifier, > > - AuthData->AuthConfig.CHAPSecret, > > - (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret), > > - AuthData->InChallenge, > > - AuthData->InChallengeLength, > > - AuthData->CHAPResponse > > - ); > > - > > - // > > - // Transit to next step. > > - // > > - Conn->CHAPStep = ISCSI_CHAP_STEP_THREE; > > - break; > > - > > - case ISCSI_CHAP_STEP_THREE: > > - // > > - // one way CHAP authentication and the target would like to > > - // authenticate us. > > - // > > - Status = EFI_SUCCESS; > > - break; > > - > > - case ISCSI_CHAP_STEP_FOUR: > > - ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL); > > - // > > - // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target. > > - // > > - Name = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_CHAP_NAME); > > - if (Name == NULL) { > > - goto ON_EXIT; > > - } > > - > > - Response = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_CHAP_RESPONSE); > > - if (Response == NULL) { > > - goto ON_EXIT; > > - } > > - > > - RspLen = ISCSI_CHAP_RSP_LEN; > > - IScsiHexToBin (TargetRsp, &RspLen, Response); > > - > > - // > > - // Check the CHAP Response replied by Target. > > - // > > - Status = IScsiCHAPAuthTarget (AuthData, TargetRsp); > > - break; > > - > > - default: > > - break; > > - } > > - > > -ON_EXIT: > > - > > - IScsiFreeKeyValueList (KeyValueList); > > - > > - FreePool (Data); > > - > > - return Status; > > -} > > - > > -/** > > - This function fills the CHAP authentication information into the > login PDU > > - during the security negotiation stage in the iSCSI connection login. > > - > > - @param[in] Conn The iSCSI connection. > > - @param[in, out] Pdu The PDU to send out. > > - > > - @retval EFI_SUCCESS All check passed and the phase-related > CHAP > > - authentication info is filled into the > iSCSI PDU. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > > -**/ > > -EFI_STATUS > > -IScsiCHAPToSendReq ( > > - IN ISCSI_CONNECTION *Conn, > > - IN OUT NET_BUF *Pdu > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_SESSION *Session; > > - ISCSI_LOGIN_REQUEST *LoginReq; > > - ISCSI_CHAP_AUTH_DATA *AuthData; > > - CHAR8 *Value; > > - CHAR8 ValueStr[256]; > > - CHAR8 *Response; > > - UINT32 RspLen; > > - CHAR8 *Challenge; > > - UINT32 ChallengeLen; > > - > > - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); > > - > > - Session = Conn->Session; > > - AuthData = &Session->AuthData; > > - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0); > > - if (LoginReq == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - Status = EFI_SUCCESS; > > - > > - RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3; > > - Response = AllocatePool (RspLen); > > - if (Response == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3; > > - Challenge = AllocatePool (ChallengeLen); > > - if (Challenge == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - switch (Conn->CHAPStep) { > > - case ISCSI_CHAP_INITIAL: > > - // > > - // It's the initial Login Request. Fill in the key=value pairs > mandatory > > - // for the initial Login Request. > > - // > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session- > > >InitiatorName); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal"); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session- > > >ConfigData.NvData.TargetName); > > - > > - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { > > - Value = ISCSI_KEY_VALUE_NONE; > > - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > > - } else { > > - Value = ISCSI_AUTH_METHOD_CHAP; > > - } > > - > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value); > > - > > - break; > > - > > - case ISCSI_CHAP_STEP_ONE: > > - // > > - // First step, send the Login Request with CHAP_A=<A1,A2...> key- > value > > pair. > > - // > > - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", > > ISCSI_CHAP_ALGORITHM_MD5); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr); > > - > > - Conn->CHAPStep = ISCSI_CHAP_STEP_TWO; > > - break; > > - > > - case ISCSI_CHAP_STEP_THREE: > > - // > > - // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or > > - // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target > > ahtentication is > > - // required too. > > - // > > - // CHAP_N=<N> > > - // > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) > > &AuthData->AuthConfig.CHAPName); > > - // > > - // CHAP_R=<R> > > - // > > - IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, > > ISCSI_CHAP_RSP_LEN, Response, &RspLen); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response); > > - > > - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) { > > - // > > - // CHAP_I=<I> > > - // > > - IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1); > > - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData- > >OutIdentifier); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); > > - // > > - // CHAP_C=<C> > > - // > > - IScsiGenRandom ((UINT8 *) AuthData->OutChallenge, > > ISCSI_CHAP_RSP_LEN); > > - AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN; > > - IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, > > ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge); > > - > > - Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR; > > - } > > - // > > - // set the stage transition flag. > > - // > > - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > > - break; > > - > > - default: > > - Status = EFI_PROTOCOL_ERROR; > > - break; > > - } > > - > > - FreePool (Response); > > - FreePool (Challenge); > > - > > - return Status; > > -} > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > deleted file mode 100644 > > index cb1eff1b690c..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > +++ /dev/null > > @@ -1,1264 +0,0 @@ > > -/** @file > > - Helper functions for configuring or getting the parameters relating > to iSCSI. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA"; > > -BOOLEAN mIScsiDeviceListUpdated = FALSE; > > -UINTN mNumberOfIScsiDevices = 0; > > -ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL; > > - > > -LIST_ENTRY mIScsiConfigFormList = { > > - &mIScsiConfigFormList, > > - &mIScsiConfigFormList > > -}; > > - > > -HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = { > > - { > > - { > > - HARDWARE_DEVICE_PATH, > > - HW_VENDOR_DP, > > - { > > - (UINT8) (sizeof (VENDOR_DEVICE_PATH)), > > - (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) > > - } > > - }, > > - IP4_ISCSI_CONFIG_GUID > > - }, > > - { > > - END_DEVICE_PATH_TYPE, > > - END_ENTIRE_DEVICE_PATH_SUBTYPE, > > - { > > - (UINT8) (END_DEVICE_PATH_LENGTH), > > - (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) > > - } > > - } > > -}; > > - > > -/** > > - Convert the IPv4 address into a dotted string. > > - > > - @param[in] Ip The IPv4 address. > > - @param[out] Str The dotted IP string. > > -**/ > > -VOID > > -IScsiIpToStr ( > > - IN EFI_IPv4_ADDRESS *Ip, > > - OUT CHAR16 *Str > > - ) > > -{ > > - UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip- > >Addr[0], > > Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]); > > -} > > - > > - > > -/** > > - Parse IsId in string format and convert it to binary. > > - > > - @param[in] String The buffer of the string to be parsed. > > - @param[in, out] IsId The buffer to store IsId. > > - > > - @retval EFI_SUCCESS The operation finished successfully. > > - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > > - > > -**/ > > -EFI_STATUS > > -IScsiParseIsIdFromString ( > > - IN CONST CHAR16 *String, > > - IN OUT UINT8 *IsId > > - ) > > -{ > > - UINT8 Index; > > - CHAR16 *IsIdStr; > > - CHAR16 TempStr[3]; > > - UINTN NodeVal; > > - CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE]; > > - EFI_INPUT_KEY Key; > > - > > - if ((String == NULL) || (IsId == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - IsIdStr = (CHAR16 *) String; > > - > > - if (StrLen (IsIdStr) != 6) { > > - UnicodeSPrint ( > > - PortString, > > - (UINTN) sizeof (PortString), > > - L"Error! Input is incorrect, please input 6 hex numbers!\n" > > - ); > > - > > - CreatePopUp ( > > - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, > > - &Key, > > - PortString, > > - NULL > > - ); > > - > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - for (Index = 3; Index < 6; Index++) { > > - CopyMem (TempStr, IsIdStr, sizeof (TempStr)); > > - TempStr[2] = L'\0'; > > - > > - // > > - // Convert the string to IsId. StrHexToUintn stops at the first > character > > - // that is not a valid hex character, '\0' here. > > - // > > - NodeVal = StrHexToUintn (TempStr); > > - > > - IsId[Index] = (UINT8) NodeVal; > > - > > - IsIdStr = IsIdStr + 2; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Convert IsId from binary to string format. > > - > > - @param[out] String The buffer to store the converted string. > > - @param[in] IsId The buffer to store IsId. > > - > > - @retval EFI_SUCCESS The string converted successfully. > > - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. > > - > > -**/ > > -EFI_STATUS > > -IScsiConvertIsIdToString ( > > - OUT CHAR16 *String, > > - IN UINT8 *IsId > > - ) > > -{ > > - UINT8 Index; > > - UINTN Number; > > - > > - if ((String == NULL) || (IsId == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - for (Index = 0; Index < 6; Index++) { > > - if (IsId[Index] <= 0xF) { > > - Number = UnicodeSPrint ( > > - String, > > - 2 * ISID_CONFIGURABLE_STORAGE, > > - L"0%X", > > - (UINTN) IsId[Index] > > - ); > > - } else { > > - Number = UnicodeSPrint ( > > - String, > > - 2 * ISID_CONFIGURABLE_STORAGE, > > - L"%X", > > - (UINTN) IsId[Index] > > - ); > > - > > - } > > - > > - String = String + Number; > > - } > > - > > - *String = L'\0'; > > - > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Update the list of iSCSI devices the iSCSI driver is controlling. > > - > > - @retval EFI_SUCCESS The callback successfully handled the > action. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiUpdateDeviceList ( > > - VOID > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_DEVICE_LIST *DeviceList; > > - UINTN DataSize; > > - UINTN NumHandles; > > - EFI_HANDLE *Handles; > > - UINTN HandleIndex; > > - UINTN Index; > > - UINTN LastDeviceIndex; > > - EFI_MAC_ADDRESS MacAddress; > > - UINTN HwAddressSize; > > - UINT16 VlanId; > > - ISCSI_MAC_INFO *CurMacInfo; > > - ISCSI_MAC_INFO TempMacInfo; > > - CHAR16 MacString[70]; > > - UINTN DeviceListSize; > > - > > - // > > - // Dump all the handles the Managed Network Service Binding Protocol > is > > installed on. > > - // > > - Status = gBS->LocateHandleBuffer ( > > - ByProtocol, > > - &gEfiManagedNetworkServiceBindingProtocolGuid, > > - NULL, > > - &NumHandles, > > - &Handles > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - DataSize = 0; > > - Status = gRT->GetVariable ( > > - L"iSCSIDeviceList", > > - &gIp4IScsiConfigGuid, > > - NULL, > > - &DataSize, > > - NULL > > - ); > > - if (Status == EFI_BUFFER_TOO_SMALL) { > > - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize); > > - ASSERT (DeviceList != NULL); > > - > > - gRT->GetVariable ( > > - L"iSCSIDeviceList", > > - &gIp4IScsiConfigGuid, > > - NULL, > > - &DataSize, > > - DeviceList > > - ); > > - > > - LastDeviceIndex = 0; > > - > > - for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) { > > - Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress, > > &HwAddressSize); > > - ASSERT (Status == EFI_SUCCESS); > > - VlanId = NetLibGetVlanId (Handles[HandleIndex]); > > - > > - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; > Index++) { > > - CurMacInfo = &DeviceList->MacInfo[Index]; > > - if ((CurMacInfo->Len == HwAddressSize) && > > - (CurMacInfo->VlanId == VlanId) && > > - (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr, > > HwAddressSize)) > > - ) { > > - // > > - // The previous configured NIC is still here. > > - // > > - if (Index != LastDeviceIndex) { > > - // > > - // Swap the current MAC address entry with the one indexed > by > > - // LastDeviceIndex. > > - // > > - CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO)); > > - CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex], > > sizeof (ISCSI_MAC_INFO)); > > - CopyMem (&DeviceList->MacInfo[LastDeviceIndex], > &TempMacInfo, > > sizeof (ISCSI_MAC_INFO)); > > - } > > - > > - LastDeviceIndex++; > > - } > > - } > > - > > - if (LastDeviceIndex == DeviceList->NumDevice) { > > - break; > > - } > > - } > > - > > - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; > Index++) { > > - // > > - // delete the variables > > - // > > - CurMacInfo = &DeviceList->MacInfo[Index]; > > - IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo- > > >VlanId, MacString); > > - gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, > 0, 0, > > NULL); > > - gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL); > > - } > > - > > - FreePool (DeviceList); > > - } else if (Status != EFI_NOT_FOUND) { > > - FreePool (Handles); > > - return Status; > > - } > > - // > > - // Construct the new iSCSI device list. > > - // > > - DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) > * sizeof > > (ISCSI_MAC_INFO); > > - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool > (DeviceListSize); > > - ASSERT (DeviceList != NULL); > > - DeviceList->NumDevice = (UINT8) NumHandles; > > - > > - for (Index = 0; Index < NumHandles; Index++) { > > - NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize); > > - > > - CurMacInfo = &DeviceList->MacInfo[Index]; > > - CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize); > > - CurMacInfo->Len = (UINT8) HwAddressSize; > > - CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]); > > - } > > - > > - gRT->SetVariable ( > > - L"iSCSIDeviceList", > > - &gIp4IScsiConfigGuid, > > - ISCSI_CONFIG_VAR_ATTR, > > - DeviceListSize, > > - DeviceList > > - ); > > - > > - FreePool (DeviceList); > > - FreePool (Handles); > > - > > - return Status; > > -} > > - > > -/** > > - Get the iSCSI configuration form entry by the index of the goto > opcode > > actived. > > - > > - @param[in] Index The 0-based index of the goto opcode actived. > > - > > - @return The iSCSI configuration form entry found. > > -**/ > > -ISCSI_CONFIG_FORM_ENTRY * > > -IScsiGetConfigFormEntryByIndex ( > > - IN UINT32 Index > > - ) > > -{ > > - UINT32 CurrentIndex; > > - LIST_ENTRY *Entry; > > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > > - > > - CurrentIndex = 0; > > - ConfigFormEntry = NULL; > > - > > - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { > > - if (CurrentIndex == Index) { > > - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, > > ISCSI_CONFIG_FORM_ENTRY, Link); > > - break; > > - } > > - > > - CurrentIndex++; > > - } > > - > > - return ConfigFormEntry; > > -} > > - > > -/** > > - Convert the iSCSI configuration data into the IFR data. > > - > > - @param[in] ConfigFormEntry The iSCSI configuration form entry. > > - @param[out] IfrNvData The IFR nv data. > > - > > -**/ > > -VOID > > -IScsiConvertDeviceConfigDataToIfrNvData ( > > - IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry, > > - OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData > > - ) > > -{ > > - ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData; > > - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData; > > - > > - // > > - // Normal session configuration parameters. > > - // > > - SessionConfigData = &ConfigFormEntry- > >SessionConfigData; > > - IfrNvData->Enabled = SessionConfigData->Enabled; > > - > > - IfrNvData->InitiatorInfoFromDhcp = SessionConfigData- > > >InitiatorInfoFromDhcp; > > - IfrNvData->TargetInfoFromDhcp = SessionConfigData- > > >TargetInfoFromDhcp; > > - IfrNvData->TargetPort = SessionConfigData->TargetPort; > > - > > - IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp); > > - IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask); > > - IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway); > > - IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp); > > - > > - IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData- > > >TargetName); > > - > > - IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun); > > - > > - IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId); > > - > > - // > > - // CHAP authentication parameters. > > - // > > - AuthConfigData = &ConfigFormEntry->AuthConfigData; > > - > > - IfrNvData->CHAPType = AuthConfigData->CHAPType; > > - > > - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData- > > >CHAPName); > > - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData- > > >CHAPSecret); > > - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName, > > IfrNvData->ReverseCHAPName); > > - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, > > IfrNvData->ReverseCHAPSecret); > > -} > > - > > -/** > > - This function allows the caller to request the current > > - configuration for one or more named elements. The resulting > > - string is in <ConfigAltResp> format. Any and all alternative > > - configuration strings shall also be appended to the end of the > > - current configuration string. If they are, they must appear > > - after the current configuration. They must contain the same > > - routing (GUID, NAME, PATH) as the current configuration string. > > - They must have an additional description indicating the type of > > - alternative configuration the string represents, > > - "ALTCFG=<StringToken>". That <StringToken> (when > > - converted from Hex UNICODE to binary) is a reference to a > > - string in the associated string pack. > > - > > - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. > > - @param[in] Request A null-terminated Unicode string in > > - <ConfigRequest> format. Note that this > > - includes the routing information as well as > > - the configurable name / value pairs. It is > > - invalid for this string to be in > > - <MultiConfigRequest> format. > > - @param[out] Progress On return, points to a character in the > > - Request string. Points to the string's null > > - terminator if request was successful. Points > > - to the most recent "&" before the first > > - failing name / value pair (or the beginning > > - of the string if the failure is in the first > > - name / value pair) if the request was not > > - successful. > > - @param[out] Results A null-terminated Unicode string in > > - <ConfigAltResp> format which has all values > > - filled in for the names in the Request string. > > - String to be allocated by the called function. > > - > > - @retval EFI_SUCCESS The Results string is filled with the > > - values corresponding to all requested > > - names. > > - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the > > - parts of the results that must be > > - stored awaiting possible future > > - protocols. > > - @retval EFI_INVALID_PARAMETER For example, passing in a NULL > > - for the Request parameter > > - would result in this type of > > - error. In this case, the > > - Progress parameter would be > > - set to NULL. > > - @retval EFI_NOT_FOUND Routing data doesn't match any > > - known driver. Progress set to the > > - first character in the routing header. > > - Note: There is no requirement that > the > > - driver validate the routing data. It > > - must skip the <ConfigHdr> in order to > > - process the names. > > - @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set > > - to most recent & before the > > - error or the beginning of the > > - string. > > - @retval EFI_INVALID_PARAMETER Unknown name. Progress points > > - to the & before the name in > > - question.Currently not implemented. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiFormExtractConfig ( > > - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, > > - IN CONST EFI_STRING Request, > > - OUT EFI_STRING *Progress, > > - OUT EFI_STRING *Results > > - ) > > -{ > > - EFI_STATUS Status; > > - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; > > - UINTN BufferSize; > > - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; > > - ISCSI_FORM_CALLBACK_INFO *Private; > > - EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; > > - EFI_STRING ConfigRequestHdr; > > - EFI_STRING ConfigRequest; > > - BOOLEAN AllocatedRequest; > > - UINTN Size; > > - > > - if (Progress == NULL || Results == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - *Progress = Request; > > - if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, > > &gIp4IScsiConfigGuid, mVendorStorageName)) { > > - return EFI_NOT_FOUND; > > - } > > - > > - ConfigRequestHdr = NULL; > > - ConfigRequest = NULL; > > - AllocatedRequest = FALSE; > > - Size = 0; > > - > > - if (!mIScsiDeviceListUpdated) { > > - // > > - // Update the device list. > > - // > > - IScsiUpdateDeviceList (); > > - mIScsiDeviceListUpdated = TRUE; > > - } > > - > > - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); > > - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); > > - ASSERT (IfrNvData != NULL); > > - if (Private->Current != NULL) { > > - IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, > IfrNvData); > > - } > > - > > - BufferSize = ISCSI_NAME_MAX_SIZE; > > - Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, > &BufferSize, > > InitiatorName); > > - if (EFI_ERROR (Status)) { > > - IfrNvData->InitiatorName[0] = L'\0'; > > - } else { > > - IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName); > > - } > > - > > - // > > - // Convert buffer data to <ConfigResp> by helper function > BlockToConfig() > > - // > > - HiiConfigRouting = Private->ConfigRouting; > > - BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA); > > - ConfigRequest = Request; > > - if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) { > > - // > > - // Request has no request element, construct full request string. > > - // Allocate and fill a buffer large enough to hold the <ConfigHdr> > template > > - // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" > > followed by a Null-terminator > > - // > > - ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid, > > mVendorStorageName, Private->DriverHandle); > > - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); > > - ConfigRequest = AllocateZeroPool (Size); > > - ASSERT (ConfigRequest != NULL); > > - AllocatedRequest = TRUE; > > - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", > > ConfigRequestHdr, (UINT64)BufferSize); > > - FreePool (ConfigRequestHdr); > > - } > > - Status = HiiConfigRouting->BlockToConfig ( > > - HiiConfigRouting, > > - ConfigRequest, > > - (UINT8 *) IfrNvData, > > - BufferSize, > > - Results, > > - Progress > > - ); > > - FreePool (IfrNvData); > > - // > > - // Free the allocated config request string. > > - // > > - if (AllocatedRequest) { > > - FreePool (ConfigRequest); > > - ConfigRequest = NULL; > > - } > > - > > - // > > - // Set Progress string to the original request string. > > - // > > - if (Request == NULL) { > > - *Progress = NULL; > > - } else if (StrStr (Request, L"OFFSET") == NULL) { > > - *Progress = Request + StrLen (Request); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - This function applies changes in a driver's configuration. > > - Input is a Configuration, which has the routing data for this > > - driver followed by name / value configuration pairs. The driver > > - must apply those pairs to its configurable storage. If the > > - driver's configuration is stored in a linear block of data > > - and the driver's name / value pairs are in <BlockConfig> > > - format, it may use the ConfigToBlock helper function (above) to > > - simplify the job. Currently not implemented. > > - > > - @param[in] This Points to the > EFI_HII_CONFIG_ACCESS_PROTOCOL. > > - @param[in] Configuration A null-terminated Unicode string in > > - <ConfigString> format. > > - @param[out] Progress A pointer to a string filled in with the > > - offset of the most recent '&' before the > > - first failing name / value pair (or the > > - beginn ing of the string if the failure > > - is in the first name / value pair) or > > - the terminating NULL if all was > > - successful. > > - > > - @retval EFI_SUCCESS The results have been distributed or > are > > - awaiting distribution. > > - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the > > - parts of the results that must be > > - stored awaiting possible future > > - protocols. > > - @retval EFI_INVALID_PARAMETERS Passing in a NULL for the > > - Results parameter would result > > - in this type of error. > > - @retval EFI_NOT_FOUND Target for the specified routing data > > - was not found. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiFormRouteConfig ( > > - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, > > - IN CONST EFI_STRING Configuration, > > - OUT EFI_STRING *Progress > > - ) > > -{ > > - if (Configuration == NULL || Progress == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // > > - // Check routing data in <ConfigHdr>. > > - // Note: if only one Storage is used, then this checking could be > skipped. > > - // > > - if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid, > > mVendorStorageName)) { > > - *Progress = Configuration; > > - return EFI_NOT_FOUND; > > - } > > - > > - *Progress = Configuration + StrLen (Configuration); > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - This function is called to provide results data to the driver. > > - This data consists of a unique key that is used to identify > > - which data is either being passed back or being asked for. > > - > > - @param[in] This Points to the > EFI_HII_CONFIG_ACCESS_PROTOCOL. > > - @param[in] Action Specifies the type of action taken by > the browser. > > - @param[in] QuestionId A unique value which is sent to the > original > > - exporting driver so that it can > identify the type > > - of data to expect. The format of the > data tends to > > - vary based on the opcode that enerated > the callback. > > - @param[in] Type The type of value for the question. > > - @param[in] Value A pointer to the data being sent to > the original > > - exporting driver. > > - @param[out] ActionRequest On return, points to the action > requested > > by the > > - callback function. > > - > > - @retval EFI_SUCCESS The callback successfully handled the > action. > > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to > hold > > the > > - variable and its data. > > - @retval EFI_DEVICE_ERROR The variable could not be saved. > > - @retval EFI_UNSUPPORTED The specified Action is not supported > by > > the > > - callback.Currently not implemented. > > - @retval EFI_INVALID_PARAMETERS Passing in wrong parameter. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiFormCallback ( > > - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, > > - IN EFI_BROWSER_ACTION Action, > > - IN EFI_QUESTION_ID QuestionId, > > - IN UINT8 Type, > > - IN EFI_IFR_TYPE_VALUE *Value, > > - OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest > > - ) > > -{ > > - ISCSI_FORM_CALLBACK_INFO *Private; > > - UINTN BufferSize; > > - CHAR8 IScsiName[ISCSI_NAME_MAX_SIZE]; > > - CHAR16 PortString[128]; > > - CHAR8 Ip4String[IP4_STR_MAX_SIZE]; > > - CHAR8 LunString[ISCSI_LUN_STR_MAX_LEN]; > > - UINT64 Lun; > > - EFI_STRING_ID DeviceFormTitleToken; > > - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; > > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > > - EFI_IP_ADDRESS HostIp; > > - EFI_IP_ADDRESS SubnetMask; > > - EFI_IP_ADDRESS Gateway; > > - EFI_STATUS Status; > > - EFI_INPUT_KEY Key; > > - > > - if (Action != EFI_BROWSER_ACTION_CHANGING && Action != > > EFI_BROWSER_ACTION_CHANGED) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); > > - // > > - // Retrieve uncommitted data from Browser > > - // > > - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); > > - ASSERT (IfrNvData != NULL); > > - if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, > > sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) { > > - FreePool (IfrNvData); > > - return EFI_NOT_FOUND; > > - } > > - Status = EFI_SUCCESS; > > - > > - if (Action == EFI_BROWSER_ACTION_CHANGING) { > > - if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < > > (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) { > > - // > > - // In case goto the device configuration form, update the device > form > > title. > > - // > > - ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) > > (QuestionId - KEY_DEVICE_ENTRY_BASE)); > > - ASSERT (ConfigFormEntry != NULL); > > - > > - UnicodeSPrint (PortString, (UINTN) sizeof (PortString), > L"Port %s", > > ConfigFormEntry->MacString); > > - DeviceFormTitleToken = (EFI_STRING_ID) > > STR_ISCSI_DEVICE_FORM_TITLE; > > - HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, > > PortString, NULL); > > - > > - IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, > IfrNvData); > > - > > - Private->Current = ConfigFormEntry; > > - } > > - } else if (Action == EFI_BROWSER_ACTION_CHANGED) { > > - switch (QuestionId) { > > - case KEY_INITIATOR_NAME: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName); > > - BufferSize = AsciiStrSize (IScsiName); > > - > > - Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, > &BufferSize, > > IScsiName); > > - if (EFI_ERROR (Status)) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Invalid iSCSI Name!", NULL); > > - } > > - > > - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; > > - break; > > - > > - case KEY_LOCAL_IP: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String); > > - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); > > - if (EFI_ERROR (Status) || > > - ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) > && > > - !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), > NTOHL(*(UINT32*)Private- > > >Current->SessionConfigData.SubnetMask.Addr)))) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Invalid IP address!", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - } else { > > - CopyMem (&Private->Current->SessionConfigData.LocalIp, > &HostIp.v4, > > sizeof (HostIp.v4)); > > - } > > - > > - break; > > - > > - case KEY_SUBNET_MASK: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String); > > - Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4); > > - if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && > > (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Invalid Subnet Mask!", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - } else { > > - CopyMem (&Private->Current->SessionConfigData.SubnetMask, > > &SubnetMask.v4, sizeof (SubnetMask.v4)); > > - } > > - > > - break; > > - > > - case KEY_GATE_WAY: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String); > > - Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4); > > - if (EFI_ERROR (Status) || > > - ((Gateway.Addr[0] != 0) && > > - (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) > && > > - !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), > > NTOHL(*(UINT32*)Private->Current- > > >SessionConfigData.SubnetMask.Addr)))) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Invalid Gateway!", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - } else { > > - CopyMem (&Private->Current->SessionConfigData.Gateway, > > &Gateway.v4, sizeof (Gateway.v4)); > > - } > > - > > - break; > > - > > - case KEY_TARGET_IP: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String); > > - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); > > - if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST > > (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Invalid IP address!", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - } else { > > - CopyMem (&Private->Current->SessionConfigData.TargetIp, > &HostIp.v4, > > sizeof (HostIp.v4)); > > - } > > - > > - break; > > - > > - case KEY_TARGET_NAME: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName); > > - Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName)); > > - if (EFI_ERROR (Status)) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Invalid iSCSI Name!", NULL); > > - } else { > > - AsciiStrCpyS (Private->Current->SessionConfigData.TargetName, > > ISCSI_NAME_MAX_SIZE, IScsiName); > > - } > > - > > - break; > > - > > - case KEY_DHCP_ENABLE: > > - if (IfrNvData->InitiatorInfoFromDhcp == 0) { > > - IfrNvData->TargetInfoFromDhcp = 0; > > - } > > - > > - break; > > - > > - case KEY_BOOT_LUN: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString); > > - Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun); > > - if (EFI_ERROR (Status)) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Invalid LUN string!", NULL); > > - } else { > > - CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, > sizeof > > (Lun)); > > - } > > - > > - break; > > - > > - case KEY_CHAP_NAME: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current- > > >AuthConfigData.CHAPName); > > - break; > > - > > - case KEY_CHAP_SECRET: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private- > >Current- > > >AuthConfigData.CHAPSecret); > > - break; > > - > > - case KEY_REVERSE_CHAP_NAME: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private- > > >Current->AuthConfigData.ReverseCHAPName); > > - break; > > - > > - case KEY_REVERSE_CHAP_SECRET: > > - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private- > > >Current->AuthConfigData.ReverseCHAPSecret); > > - break; > > - > > - case KEY_CONFIG_ISID: > > - IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current- > > >SessionConfigData.IsId); > > - IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current- > > >SessionConfigData.IsId); > > - > > - break; > > - > > - case KEY_SAVE_CHANGES: > > - // > > - // First, update those fields which don't have INTERACTIVE set. > > - // > > - Private->Current->SessionConfigData.Enabled = > IfrNvData- > > >Enabled; > > - Private->Current->SessionConfigData.InitiatorInfoFromDhcp = > IfrNvData- > > >InitiatorInfoFromDhcp; > > - Private->Current->SessionConfigData.TargetPort = > IfrNvData- > > >TargetPort; > > - if (Private->Current->SessionConfigData.TargetPort == 0) { > > - Private->Current->SessionConfigData.TargetPort = > > ISCSI_WELL_KNOWN_PORT; > > - } > > - > > - Private->Current->SessionConfigData.TargetInfoFromDhcp = > IfrNvData- > > >TargetInfoFromDhcp; > > - Private->Current->AuthConfigData.CHAPType = > IfrNvData- > > >CHAPType; > > - > > - // > > - // Only do full parameter validation if iSCSI is enabled on this > device. > > - // > > - if (Private->Current->SessionConfigData.Enabled) { > > - // > > - // Validate the address configuration of the Initiator if DHCP > isn't > > - // deployed. > > - // > > - if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) > { > > - CopyMem (&HostIp.v4, &Private->Current- > >SessionConfigData.LocalIp, > > sizeof (HostIp.v4)); > > - CopyMem (&SubnetMask.v4, &Private->Current- > > >SessionConfigData.SubnetMask, sizeof (SubnetMask.v4)); > > - CopyMem (&Gateway.v4, &Private->Current- > > >SessionConfigData.Gateway, sizeof (Gateway.v4)); > > - > > - if ((Gateway.Addr[0] != 0)) { > > - if (SubnetMask.Addr[0] == 0) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Gateway address is set but subnet mask is zero.", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], > > SubnetMask.Addr[0])) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Local IP and Gateway are not in the same subnet.", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - } > > - } > > - // > > - // Validate target configuration if DHCP isn't deployed. > > - // > > - if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) { > > - CopyMem (&HostIp.v4, &Private->Current- > > >SessionConfigData.TargetIp, sizeof (HostIp.v4)); > > - if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || > > IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Target IP is invalid!", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - > > - // > > - // Validate iSCSI target name configuration again: > > - // The format of iSCSI target name is already verified when > user input > > the name; > > - // here we only check the case user does not input the name. > > - // > > - if (Private->Current->SessionConfigData.TargetName[0] == '\0') > { > > - CreatePopUp ( > > - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, > > - &Key, > > - L"iSCSI target name is NULL!", > > - NULL > > - ); > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - > > - } > > - > > - if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) { > > - if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData- > >CHAPSecret[0] == > > '\0')) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"CHAP Name or CHAP Secret is invalid!", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - > > - if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) && > > - ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData- > > >ReverseCHAPSecret[0] == '\0')) > > - ) { > > - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, > > L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL); > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - } > > - } > > - > > - BufferSize = sizeof (Private->Current->SessionConfigData); > > - gRT->SetVariable ( > > - Private->Current->MacString, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - ISCSI_CONFIG_VAR_ATTR, > > - BufferSize, > > - &Private->Current->SessionConfigData > > - ); > > - > > - BufferSize = sizeof (Private->Current->AuthConfigData); > > - gRT->SetVariable ( > > - Private->Current->MacString, > > - &gIScsiCHAPAuthInfoGuid, > > - ISCSI_CONFIG_VAR_ATTR, > > - BufferSize, > > - &Private->Current->AuthConfigData > > - ); > > - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; > > - break; > > - > > - default: > > - break; > > - } > > - } > > - > > - if (!EFI_ERROR (Status)) { > > - // > > - // Pass changed uncommitted data back to Form Browser > > - // > > - HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof > > (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL); > > - } > > - > > - FreePool (IfrNvData); > > - > > - return Status; > > -} > > - > > -/** > > - Updates the iSCSI configuration form to add/delete an entry for the > iSCSI > > - device specified by the Controller. > > - > > - @param[in] DriverBindingHandle The driverbinding handle. > > - @param[in] Controller The controller handle of the iSCSI > device. > > - @param[in] AddForm Whether to add or delete a form entry. > > - > > - @retval EFI_SUCCESS The iSCSI configuration form is > updated. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiConfigUpdateForm ( > > - IN EFI_HANDLE DriverBindingHandle, > > - IN EFI_HANDLE Controller, > > - IN BOOLEAN AddForm > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > > - BOOLEAN EntryExisted; > > - EFI_STATUS Status; > > - EFI_MAC_ADDRESS MacAddress; > > - UINTN HwAddressSize; > > - UINT16 VlanId; > > - CHAR16 PortString[128]; > > - UINT16 FormIndex; > > - UINTN BufferSize; > > - VOID *StartOpCodeHandle; > > - VOID *EndOpCodeHandle; > > - EFI_IFR_GUID_LABEL *StartLabel; > > - EFI_IFR_GUID_LABEL *EndLabel; > > - > > - ConfigFormEntry = NULL; > > - EntryExisted = FALSE; > > - > > - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { > > - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, > > ISCSI_CONFIG_FORM_ENTRY, Link); > > - > > - if (ConfigFormEntry->Controller == Controller) { > > - EntryExisted = TRUE; > > - break; > > - } > > - } > > - > > - if (AddForm) { > > - if (EntryExisted) { > > - return EFI_SUCCESS; > > - } else { > > - // > > - // Add a new form. > > - // > > - ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool > > (sizeof (ISCSI_CONFIG_FORM_ENTRY)); > > - if (ConfigFormEntry == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - InitializeListHead (&ConfigFormEntry->Link); > > - ConfigFormEntry->Controller = Controller; > > - > > - // > > - // Get the MAC address and convert it into the formatted string. > > - // > > - Status = NetLibGetMacAddress (Controller, &MacAddress, > > &HwAddressSize); > > - ASSERT (Status == EFI_SUCCESS); > > - VlanId = NetLibGetVlanId (Controller); > > - > > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > > ConfigFormEntry->MacString); > > - > > - // > > - // Get the normal session configuration data. > > - // > > - BufferSize = sizeof (ConfigFormEntry->SessionConfigData); > > - Status = gRT->GetVariable ( > > - ConfigFormEntry->MacString, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - NULL, > > - &BufferSize, > > - &ConfigFormEntry->SessionConfigData > > - ); > > - if (EFI_ERROR (Status)) { > > - ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof > > (ConfigFormEntry->SessionConfigData)); > > - > > - // > > - // Generate OUI-format ISID based on MAC address. > > - // > > - CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, > 6); > > - ConfigFormEntry->SessionConfigData.IsId[0] = > > - (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F); > > - } > > - // > > - // Get the CHAP authentication configuration data. > > - // > > - BufferSize = sizeof (ConfigFormEntry->AuthConfigData); > > - Status = gRT->GetVariable ( > > - ConfigFormEntry->MacString, > > - &gIScsiCHAPAuthInfoGuid, > > - NULL, > > - &BufferSize, > > - &ConfigFormEntry->AuthConfigData > > - ); > > - if (EFI_ERROR (Status)) { > > - ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof > > (ConfigFormEntry->AuthConfigData)); > > - } > > - // > > - // Compose the Port string and create a new EFI_STRING_ID. > > - // > > - UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", > > ConfigFormEntry->MacString); > > - ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo- > > >RegisteredHandle, 0, PortString, NULL); > > - > > - // > > - // Compose the help string of this port and create a new > EFI_STRING_ID. > > - // > > - UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI > parameters > > on port %s", ConfigFormEntry->MacString); > > - ConfigFormEntry->PortTitleHelpToken = HiiSetString > (mCallbackInfo- > > >RegisteredHandle, 0, PortString, NULL); > > - > > - InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link); > > - mNumberOfIScsiDevices++; > > - } > > - } else { > > - ASSERT (EntryExisted); > > - > > - mNumberOfIScsiDevices--; > > - RemoveEntryList (&ConfigFormEntry->Link); > > - FreePool (ConfigFormEntry); > > - mCallbackInfo->Current = NULL; > > - } > > - // > > - // Allocate space for creation of Buffer > > - // > > - > > - // > > - // Init OpCode Handle > > - // > > - StartOpCodeHandle = HiiAllocateOpCodeHandle (); > > - ASSERT (StartOpCodeHandle != NULL); > > - > > - EndOpCodeHandle = HiiAllocateOpCodeHandle (); > > - ASSERT (EndOpCodeHandle != NULL); > > - > > - // > > - // Create Hii Extend Label OpCode as the start opcode > > - // > > - StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode > > (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof > > (EFI_IFR_GUID_LABEL)); > > - StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; > > - StartLabel->Number = DEVICE_ENTRY_LABEL; > > - > > - // > > - // Create Hii Extend Label OpCode as the end opcode > > - // > > - EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode > > (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); > > - EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; > > - EndLabel->Number = LABEL_END; > > - > > - FormIndex = 0; > > - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { > > - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, > > ISCSI_CONFIG_FORM_ENTRY, Link); > > - > > - HiiCreateGotoOpCode ( > > - StartOpCodeHandle, // Container for > dynamic created > > opcodes > > - FORMID_DEVICE_FORM, // Target Form ID > > - ConfigFormEntry->PortTitleToken, // Prompt text > > - ConfigFormEntry->PortTitleHelpToken, // Help text > > - EFI_IFR_FLAG_CALLBACK, // Question flag > > - (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID > > - ); > > - > > - FormIndex++; > > - } > > - > > - HiiUpdateForm ( > > - mCallbackInfo->RegisteredHandle, > > - &gIp4IScsiConfigGuid, > > - FORMID_MAIN_FORM, > > - StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL > > - EndOpCodeHandle // LABEL_END > > - ); > > - > > - HiiFreeOpCodeHandle (StartOpCodeHandle); > > - HiiFreeOpCodeHandle (EndOpCodeHandle); > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Initialize the iSCSI configuration form. > > - > > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > > - > > - @retval EFI_SUCCESS The iSCSI configuration form is > initialized. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiConfigFormInit ( > > - VOID > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; > > - ISCSI_FORM_CALLBACK_INFO *CallbackInfo; > > - > > - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, > (VOID > > **)&HiiDatabase); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof > > (ISCSI_FORM_CALLBACK_INFO)); > > - if (CallbackInfo == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - CallbackInfo->Signature = ISCSI_FORM_CALLBACK_INFO_SIGNATURE; > > - CallbackInfo->HiiDatabase = HiiDatabase; > > - CallbackInfo->Current = NULL; > > - > > - CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig; > > - CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig; > > - CallbackInfo->ConfigAccess.Callback = IScsiFormCallback; > > - > > - Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, > > (VOID **)&CallbackInfo->ConfigRouting); > > - if (EFI_ERROR (Status)) { > > - FreePool(CallbackInfo); > > - return Status; > > - } > > - > > - // > > - // Install Device Path Protocol and Config Access protocol to driver > handle > > - // > > - Status = gBS->InstallMultipleProtocolInterfaces ( > > - &CallbackInfo->DriverHandle, > > - &gEfiDevicePathProtocolGuid, > > - &mIScsiHiiVendorDevicePath, > > - &gEfiHiiConfigAccessProtocolGuid, > > - &CallbackInfo->ConfigAccess, > > - NULL > > - ); > > - ASSERT_EFI_ERROR (Status); > > - > > - // > > - // Publish our HII data > > - // > > - CallbackInfo->RegisteredHandle = HiiAddPackages ( > > - &gIp4IScsiConfigGuid, > > - CallbackInfo->DriverHandle, > > - IScsi4DxeStrings, > > - IScsiConfigDxeBin, > > - NULL > > - ); > > - if (CallbackInfo->RegisteredHandle == NULL) { > > - FreePool(CallbackInfo); > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - mCallbackInfo = CallbackInfo; > > - > > - return Status; > > -} > > - > > -/** > > - Unload the iSCSI configuration form, this includes: delete all the > iSCSI > > - device configuration entries, uninstall the form callback protocol > and > > - free the resources used. > > - > > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > > - > > - @retval EFI_SUCCESS The iSCSI configuration form is > unloaded. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > -**/ > > -EFI_STATUS > > -IScsiConfigFormUnload ( > > - IN EFI_HANDLE DriverBindingHandle > > - ) > > -{ > > - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; > > - > > - while (!IsListEmpty (&mIScsiConfigFormList)) { > > - // > > - // Uninstall the device forms as the iSCSI driver instance may fail > to > > - // control the controller but still install the device > configuration form. > > - // In such case, upon driver unloading, the driver instance's > driverbinding. > > - // stop () won't be called, so we have to take this chance here to > uninstall > > - // the device form. > > - // > > - ConfigFormEntry = NET_LIST_USER_STRUCT > > (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link); > > - IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry- > > >Controller, FALSE); > > - } > > - > > - // > > - // Remove HII package list > > - // > > - mCallbackInfo->HiiDatabase->RemovePackageList ( > > - mCallbackInfo->HiiDatabase, > > - mCallbackInfo->RegisteredHandle > > - ); > > - > > - // > > - // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL > > - // > > - gBS->UninstallMultipleProtocolInterfaces ( > > - mCallbackInfo->DriverHandle, > > - &gEfiDevicePathProtocolGuid, > > - &mIScsiHiiVendorDevicePath, > > - &gEfiHiiConfigAccessProtocolGuid, > > - &mCallbackInfo->ConfigAccess, > > - NULL > > - ); > > - FreePool (mCallbackInfo); > > - > > - return EFI_SUCCESS; > > -} > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > deleted file mode 100644 > > index 6a876c8b69dd..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > +++ /dev/null > > @@ -1,472 +0,0 @@ > > -/** @file > > - iSCSI DHCP related configuration routines. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -/** > > - Extract the Root Path option and get the required target information. > > - > > - @param[in] RootPath The RootPath. > > - @param[in] Length Length of the RootPath option > payload. > > - @param[in, out] ConfigNvData The iSCSI session configuration > data read > > from nonvolatile device. > > - > > - @retval EFI_SUCCESS All required information is extracted > from the > > RootPath option. > > - @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted. > > -**/ > > -EFI_STATUS > > -IScsiDhcpExtractRootPath ( > > - IN CHAR8 *RootPath, > > - IN UINT8 Length, > > - IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData > > - ) > > -{ > > - EFI_STATUS Status; > > - UINT8 IScsiRootPathIdLen; > > - CHAR8 *TmpStr; > > - ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX]; > > - ISCSI_ROOT_PATH_FIELD *Field; > > - UINT32 FieldIndex; > > - UINT8 Index; > > - > > - // > > - // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname> > > - // > > - IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID); > > - > > - if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, > > ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) { > > - return EFI_NOT_FOUND; > > - } > > - // > > - // Skip the iSCSI RootPath ID "iscsi:". > > - // > > - RootPath += IScsiRootPathIdLen; > > - Length = (UINT8) (Length - IScsiRootPathIdLen); > > - > > - TmpStr = (CHAR8 *) AllocatePool (Length + 1); > > - if (TmpStr == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - CopyMem (TmpStr, RootPath, Length); > > - TmpStr[Length] = '\0'; > > - > > - Index = 0; > > - FieldIndex = RP_FIELD_IDX_SERVERNAME; > > - ZeroMem (&Fields[0], sizeof (Fields)); > > - > > - // > > - // Extract the fields in the Root Path option string. > > - // > > - for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < > > RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) { > > - if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) { > > - Fields[FieldIndex].Str = &TmpStr[Index]; > > - } > > - > > - while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index > > < Length)) { > > - Index++; > > - } > > - > > - if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) { > > - if (FieldIndex != RP_FIELD_IDX_TARGETNAME) { > > - TmpStr[Index] = '\0'; > > - Index++; > > - } > > - > > - if (Fields[FieldIndex].Str != NULL) { > > - Fields[FieldIndex].Len = (UINT8) AsciiStrLen > (Fields[FieldIndex].Str); > > - } > > - } > > - } > > - > > - if (FieldIndex != RP_FIELD_IDX_MAX) { > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - > > - if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) || > > - (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) || > > - (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1) > > - ) { > > - > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - // > > - // Get the IP address of the target. > > - // > > - Field = &Fields[RP_FIELD_IDX_SERVERNAME]; > > - Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - // > > - // Check the protocol type. > > - // > > - Field = &Fields[RP_FIELD_IDX_PROTOCOL]; > > - if ((Field->Str != NULL) && ((*(Field->Str) - '0') != > EFI_IP_PROTO_TCP)) { > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - // > > - // Get the port of the iSCSI target. > > - // > > - Field = &Fields[RP_FIELD_IDX_PORT]; > > - if (Field->Str != NULL) { > > - ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field- > >Str); > > - } else { > > - ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT; > > - } > > - // > > - // Get the LUN. > > - // > > - Field = &Fields[RP_FIELD_IDX_LUN]; > > - if (Field->Str != NULL) { > > - Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - } else { > > - ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun)); > > - } > > - // > > - // Get the target iSCSI Name. > > - // > > - Field = &Fields[RP_FIELD_IDX_TARGETNAME]; > > - > > - if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) { > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - // > > - // Validate the iSCSI name. > > - // > > - Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str)); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field- > > >Str); > > - > > -ON_EXIT: > > - > > - FreePool (TmpStr); > > - > > - return Status; > > -} > > - > > -/** > > - The callback function registerd to the DHCP4 instance which is used > to > > select > > - the qualified DHCP OFFER. > > - > > - @param[in] This The DHCP4 protocol. > > - @param[in] Context The context set when configuring the DHCP4 > > protocol. > > - @param[in] CurrentState The current state of the DHCP4 protocol. > > - @param[in] Dhcp4Event The event occurs in the current state. > > - @param[in] Packet The DHCP packet that is to be sent or > already > > received. > > - @param[out] NewPacket The packet used to replace the above Packet. > > - > > - @retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're > not > > intereseted > > - in the Dhcp4Event. > > - @retval EFI_NOT_READY The DHCP OFFER packet doesn't match our > > requirements. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDhcpSelectOffer ( > > - IN EFI_DHCP4_PROTOCOL * This, > > - IN VOID *Context, > > - IN EFI_DHCP4_STATE CurrentState, > > - IN EFI_DHCP4_EVENT Dhcp4Event, > > - IN EFI_DHCP4_PACKET * Packet, OPTIONAL > > - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL > > - ) > > -{ > > - EFI_STATUS Status; > > - UINT32 OptionCount; > > - EFI_DHCP4_PACKET_OPTION **OptionList; > > - UINT32 Index; > > - > > - if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != > Dhcp4SelectOffer)) > > { > > - return EFI_SUCCESS; > > - } > > - > > - OptionCount = 0; > > - > > - Status = This->Parse (This, Packet, &OptionCount, NULL); > > - if (Status != EFI_BUFFER_TOO_SMALL) { > > - return EFI_NOT_READY; > > - } > > - > > - OptionList = AllocatePool (OptionCount * sizeof > > (EFI_DHCP4_PACKET_OPTION *)); > > - if (OptionList == NULL) { > > - return EFI_NOT_READY; > > - } > > - > > - Status = This->Parse (This, Packet, &OptionCount, OptionList); > > - if (EFI_ERROR (Status)) { > > - FreePool (OptionList); > > - return EFI_NOT_READY; > > - } > > - > > - for (Index = 0; Index < OptionCount; Index++) { > > - if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) { > > - continue; > > - } > > - > > - Status = IScsiDhcpExtractRootPath ( > > - (CHAR8 *) &OptionList[Index]->Data[0], > > - OptionList[Index]->Length, > > - (ISCSI_SESSION_CONFIG_NVDATA *) Context > > - ); > > - > > - break; > > - } > > - > > - if (Index == OptionCount) { > > - Status = EFI_NOT_READY; > > - } > > - > > - FreePool (OptionList); > > - > > - return Status; > > -} > > - > > -/** > > - Parse the DHCP ACK to get the address configuration and DNS > information. > > - > > - @param[in] Dhcp4 The DHCP4 protocol. > > - @param[in, out] ConfigData The session configuration data. > > - > > - @retval EFI_SUCCESS The DNS information is got from the > DHCP ACK. > > - @retval EFI_NO_MAPPING DHCP failed to acquire address and > other > > information. > > - @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal- > > formatted. > > - @retval EFI_DEVICE_ERROR Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiParseDhcpAck ( > > - IN EFI_DHCP4_PROTOCOL *Dhcp4, > > - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_DHCP4_MODE_DATA Dhcp4ModeData; > > - UINT32 OptionCount; > > - EFI_DHCP4_PACKET_OPTION **OptionList; > > - UINT32 Index; > > - > > - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - if (Dhcp4ModeData.State != Dhcp4Bound) { > > - return EFI_NO_MAPPING; > > - } > > - > > - CopyMem (&ConfigData->NvData.LocalIp, > > &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&ConfigData->NvData.SubnetMask, > > &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&ConfigData->NvData.Gateway, > > &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS)); > > - > > - OptionCount = 0; > > - OptionList = NULL; > > - > > - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, > > &OptionCount, OptionList); > > - if (Status != EFI_BUFFER_TOO_SMALL) { > > - return EFI_DEVICE_ERROR; > > - } > > - > > - OptionList = AllocatePool (OptionCount * sizeof > > (EFI_DHCP4_PACKET_OPTION *)); > > - if (OptionList == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, > > &OptionCount, OptionList); > > - if (EFI_ERROR (Status)) { > > - FreePool (OptionList); > > - return EFI_DEVICE_ERROR; > > - } > > - > > - for (Index = 0; Index < OptionCount; Index++) { > > - // > > - // Get DNS server addresses and DHCP server address from this offer. > > - // > > - if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) { > > - > > - if (((OptionList[Index]->Length & 0x3) != 0) || > (OptionList[Index]- > > >Length == 0)) { > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - // > > - // Primary DNS server address. > > - // > > - CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], > > sizeof (EFI_IPv4_ADDRESS)); > > - > > - if (OptionList[Index]->Length > 4) { > > - // > > - // Secondary DNS server address > > - // > > - CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4], > > sizeof (EFI_IPv4_ADDRESS)); > > - } > > - } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) { > > - if (OptionList[Index]->Length != 4) { > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - > > - CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], > > sizeof (EFI_IPv4_ADDRESS)); > > - } > > - } > > - > > - FreePool (OptionList); > > - > > - return Status; > > -} > > - > > -/** > > - Parse the DHCP ACK to get the address configuration and DNS > information. > > - > > - @param[in] Image The handle of the driver image. > > - @param[in] Controller The handle of the controller; > > - @param[in, out] ConfigData The session configuration data. > > - > > - @retval EFI_SUCCESS The DNS information is got from the > DHCP ACK. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NO_MEDIA There was a media error. > > - @retval Others Other errors as indicated. > > - > > -**/ > > -EFI_STATUS > > -IScsiDoDhcp ( > > - IN EFI_HANDLE Image, > > - IN EFI_HANDLE Controller, > > - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData > > - ) > > -{ > > - EFI_HANDLE Dhcp4Handle; > > - EFI_DHCP4_PROTOCOL *Dhcp4; > > - EFI_STATUS Status; > > - EFI_DHCP4_PACKET_OPTION *ParaList; > > - EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData; > > - EFI_STATUS MediaStatus; > > - UINT8 *Data; > > - > > - Dhcp4Handle = NULL; > > - Dhcp4 = NULL; > > - ParaList = NULL; > > - > > - // > > - // Check media status before do DHCP > > - // > > - MediaStatus = EFI_SUCCESS; > > - NetLibDetectMediaWaitTimeout (Controller, > > ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus); > > - if (MediaStatus != EFI_SUCCESS) { > > - return EFI_NO_MEDIA; > > - } > > - > > - // > > - // Create a DHCP4 child instance and get the protocol. > > - // > > - Status = NetLibCreateServiceChild ( > > - Controller, > > - Image, > > - &gEfiDhcp4ServiceBindingProtocolGuid, > > - &Dhcp4Handle > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Dhcp4Handle, > > - &gEfiDhcp4ProtocolGuid, > > - (VOID **)&Dhcp4, > > - Image, > > - Controller, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3); > > - if (ParaList == NULL) { > > - Status = EFI_OUT_OF_RESOURCES; > > - goto ON_EXIT; > > - } > > - // > > - // Ask the server to reply with Netmask, Router, DNS and RootPath > options. > > - // > > - ParaList->OpCode = DHCP4_TAG_PARA_LIST; > > - ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? > 4 : > > 3); > > - Data = &ParaList->Data[0]; > > - Data[0] = DHCP4_TAG_NETMASK; > > - Data[1] = DHCP4_TAG_ROUTER; > > - Data[2] = DHCP4_TAG_DNS_SERVER; > > - Data[3] = DHCP4_TAG_ROOTPATH; > > - > > - ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA)); > > - Dhcp4ConfigData.OptionCount = 1; > > - Dhcp4ConfigData.OptionList = &ParaList; > > - > > - if (ConfigData->NvData.TargetInfoFromDhcp) { > > - // > > - // Use callback to select an offer which contains target > information. > > - // > > - Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer; > > - Dhcp4ConfigData.CallbackContext = &ConfigData->NvData; > > - } > > - > > - Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - Status = Dhcp4->Start (Dhcp4, NULL); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - // > > - // Parse the ACK to get required information. > > - // > > - Status = IScsiParseDhcpAck (Dhcp4, ConfigData); > > - > > -ON_EXIT: > > - > > - if (ParaList != NULL) { > > - FreePool (ParaList); > > - } > > - > > - if (Dhcp4 != NULL) { > > - Dhcp4->Stop (Dhcp4); > > - Dhcp4->Configure (Dhcp4, NULL); > > - > > - gBS->CloseProtocol ( > > - Dhcp4Handle, > > - &gEfiDhcp4ProtocolGuid, > > - Image, > > - Controller > > - ); > > - } > > - > > - NetLibDestroyServiceChild ( > > - Controller, > > - Image, > > - &gEfiDhcp4ServiceBindingProtocolGuid, > > - Dhcp4Handle > > - ); > > - > > - return Status; > > -} > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > deleted file mode 100644 > > index 730f3e506bbc..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > +++ /dev/null > > @@ -1,676 +0,0 @@ > > -/** @file > > - The entry point of IScsi driver. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = { > > - IScsiDriverBindingSupported, > > - IScsiDriverBindingStart, > > - IScsiDriverBindingStop, > > - 0xa, > > - NULL, > > - NULL > > -}; > > - > > -/** > > - Tests to see if this driver supports the RemainingDevicePath. > > - > > - @param[in] RemainingDevicePath A pointer to the remaining portion > of a > > device path. This > > - parameter is ignored by device > drivers, and is optional for > > bus > > - drivers. For bus drivers, if this > parameter is not NULL, then > > - the bus driver must determine if the > bus controller > > specified > > - by ControllerHandle and the child > controller specified > > - by RemainingDevicePath are both > supported by this > > - bus driver. > > - > > - @retval EFI_SUCCESS The RemainingDevicePath is supported > or > > NULL. > > - @retval EFI_UNSUPPORTED The device specified by > ControllerHandle > > and > > - RemainingDevicePath is not supported > by the driver > > specified by This. > > -**/ > > -EFI_STATUS > > -IScsiIsDevicePathSupported ( > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ) > > -{ > > - EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath; > > - > > - CurrentDevicePath = RemainingDevicePath; > > - if (CurrentDevicePath != NULL) { > > - while (!IsDevicePathEnd (CurrentDevicePath)) { > > - if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && > > (CurrentDevicePath->SubType == MSG_ISCSI_DP)) { > > - return EFI_SUCCESS; > > - } > > - > > - CurrentDevicePath = NextDevicePathNode (CurrentDevicePath); > > - } > > - > > - return EFI_UNSUPPORTED; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Tests to see if this driver supports a given controller. If a child > device is > > provided, > > - it further tests to see if this driver supports creating a handle for > the > > specified child device. > > - > > - @param[in] This A pointer to the > > EFI_DRIVER_BINDING_PROTOCOL instance. > > - @param[in] ControllerHandle The handle of the controller to test. > This > > handle > > - must support a protocol interface > that supplies > > - an I/O abstraction to the driver. > > - @param[in] RemainingDevicePath A pointer to the remaining portion > of a > > device path. > > - This parameter is ignored by device > drivers, and is optional > > for bus drivers. > > - > > - > > - @retval EFI_SUCCESS The device specified by > ControllerHandle and > > - RemainingDevicePath is supported by > the driver specified > > by This. > > - @retval EFI_ALREADY_STARTED The device specified by > > ControllerHandle and > > - RemainingDevicePath is already being > managed by the > > driver > > - specified by This. > > - @retval EFI_ACCESS_DENIED The device specified by > ControllerHandle > > and > > - RemainingDevicePath is already being > managed by a > > different > > - driver or an application that > requires exclusive acces. > > - Currently not implemented. > > - @retval EFI_UNSUPPORTED The device specified by > ControllerHandle > > and > > - RemainingDevicePath is not supported > by the driver > > specified by This. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDriverBindingSupported ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiCallerIdGuid, > > - NULL, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > - ); > > - if (!EFI_ERROR (Status)) { > > - return EFI_ALREADY_STARTED; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - NULL, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - Status = IScsiIsDevicePathSupported (RemainingDevicePath); > > - if (EFI_ERROR (Status)) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - if (IScsiDhcpIsConfigured (ControllerHandle)) { > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiDhcp4ServiceBindingProtocolGuid, > > - NULL, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - return EFI_UNSUPPORTED; > > - } > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Start this driver on ControllerHandle. > > - > > - The Start() function is designed to be invoked from the EFI boot > service > > ConnectController(). > > - As a result, much of the error checking on the parameters to Start() > has > > been moved into this > > - common boot service. It is legal to call Start() from other locations, > but the > > following calling > > - restrictions must be followed or the system behavior will not be > > deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE. > > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > > naturally aligned > > - EFI_DEVICE_PATH_PROTOCOL. > > - 3. Prior to calling Start(), the Supported() function for the driver > specified > > by This must > > - have been called with the same calling parameters, and Supported() > must > > have returned EFI_SUCCESS. > > - > > - @param[in] This A pointer to the > > EFI_DRIVER_BINDING_PROTOCOL instance. > > - @param[in] ControllerHandle The handle of the controller to > start. This > > handle > > - must support a protocol interface > that supplies > > - an I/O abstraction to the driver. > > - @param[in] RemainingDevicePath A pointer to the remaining portion > of a > > device path. > > - This parameter is ignored by device > drivers, and is optional > > for bus drivers. > > - > > - @retval EFI_SUCCESS The device was started. > > - @retval EFI_DEVICE_ERROR The device could not be started due > to a > > device error. > > - Currently not implemented. > > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > > due to a lack of resources. > > - @retval Others The driver failded to start the > device. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDriverBindingStart ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_DRIVER_DATA *Private; > > - VOID *Interface; > > - > > - Private = IScsiCreateDriverData (This->DriverBindingHandle, > > ControllerHandle); > > - if (Private == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - // > > - // Create a underlayer child instance, but not need to configure it. > Just > > open ChildHandle > > - // via BY_DRIVER. That is, establishing the relationship between > > ControllerHandle and ChildHandle. > > - // Therefore, when DisconnectController(), especially VLAN virtual > > controller handle, > > - // IScsiDriverBindingStop() will be called. > > - // > > - Status = NetLibCreateServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - &Private->ChildHandle > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Private->ChildHandle, > > - &gEfiTcp4ProtocolGuid, > > - &Interface, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - // > > - // Always install private protocol no matter what happens later. We > need > > to > > - // keep the relationship between ControllerHandle and ChildHandle. > > - // > > - Status = gBS->InstallProtocolInterface ( > > - &ControllerHandle, > > - &gEfiCallerIdGuid, > > - EFI_NATIVE_INTERFACE, > > - &Private->IScsiIdentifier > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - // > > - // Try to add a port configuration page for this controller. > > - // > > - IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, > > TRUE); > > - > > - // > > - // Get the iSCSI configuration data of this controller. > > - // > > - Status = IScsiGetConfigData (Private); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - // > > - // Try to login and create an iSCSI session according to the > configuration. > > - // > > - Status = IScsiSessionLogin (Private); > > - if (Status == EFI_MEDIA_CHANGED) { > > - // > > - // The specified target is not available and the redirection > information is > > - // got, login the session again with the updated target address. > > - // > > - Status = IScsiSessionLogin (Private); > > - } > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - // > > - // Duplicate the Session's tcp connection device path. The source > port field > > - // will be set to zero as one iSCSI session is comprised of several > iSCSI > > - // connections. > > - // > > - Private->DevicePath = IScsiGetTcpConnDevicePath (Private); > > - if (Private->DevicePath == NULL) { > > - goto ON_ERROR; > > - } > > - // > > - // Install the updated device path onto the ExtScsiPassThruHandle. > > - // > > - Status = gBS->InstallProtocolInterface ( > > - &Private->ExtScsiPassThruHandle, > > - &gEfiDevicePathProtocolGuid, > > - EFI_NATIVE_INTERFACE, > > - Private->DevicePath > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - // > > - // ISCSI children should share the default Tcp child, just open the > default > > Tcp child via BY_CHILD_CONTROLLER. > > - // > > - Status = gBS->OpenProtocol ( > > - Private->ChildHandle, /// Default Tcp child > > - &gEfiTcp4ProtocolGuid, > > - &Interface, > > - This->DriverBindingHandle, > > - Private->ExtScsiPassThruHandle, > > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > > - ); > > - if (EFI_ERROR (Status)) { > > - gBS->UninstallMultipleProtocolInterfaces ( > > - Private->ExtScsiPassThruHandle, > > - &gEfiExtScsiPassThruProtocolGuid, > > - &Private->IScsiExtScsiPassThru, > > - &gEfiDevicePathProtocolGuid, > > - Private->DevicePath, > > - NULL > > - ); > > - > > - goto ON_ERROR; > > - } > > - > > - // > > - // Update/Publish the iSCSI Boot Firmware Table. > > - // > > - IScsiPublishIbft (); > > - > > - return EFI_SUCCESS; > > - > > -ON_ERROR: > > - > > - IScsiSessionAbort (&Private->Session); > > - > > - return Status; > > -} > > - > > -/** > > - Stop this driver on ControllerHandle. > > - > > - Release the control of this controller and remove the IScsi functions. > The > > Stop() > > - function is designed to be invoked from the EFI boot service > > DisconnectController(). > > - As a result, much of the error checking on the parameters to Stop() > has > > been moved > > - into this common boot service. It is legal to call Stop() from other > locations, > > - but the following calling restrictions must be followed or the system > > behavior will not be deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > > previous call to this > > - same driver's Start() function. > > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all > be a > > valid > > - EFI_HANDLE. In addition, all of these handles must have been > created in > > this driver's > > - Start() function, and the Start() function must have called > OpenProtocol() > > on > > - ControllerHandle with an Attribute of > > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > > - > > - @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param[in] ControllerHandle A handle to the device being stopped. > The > > handle must > > - support a bus specific I/O protocol for > the driver > > - to use to stop the device. > > - @param[in] NumberOfChildren The number of child device handles in > > ChildHandleBuffer.Not used. > > - @param[in] ChildHandleBuffer An array of child handles to be freed. > May > > be NULL > > - if NumberOfChildren is 0.Not used. > > - > > - @retval EFI_SUCCESS The device was stopped. > > - @retval EFI_DEVICE_ERROR The device could not be stopped due to > a > > device error. > > - @retval EFI_INVALID_PARAMETER Child handle is NULL. > > - @retval EFI_ACCESS_DENIED The protocol could not be removed from > > the Handle > > - because its interfaces are being used. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDriverBindingStop ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN UINTN NumberOfChildren, > > - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL > > - ) > > -{ > > - EFI_HANDLE IScsiController; > > - EFI_STATUS Status; > > - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; > > - ISCSI_DRIVER_DATA *Private; > > - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru; > > - ISCSI_CONNECTION *Conn; > > - > > - if (NumberOfChildren != 0) { > > - // > > - // We should have only one child. > > - // > > - Status = gBS->OpenProtocol ( > > - ChildHandleBuffer[0], > > - &gEfiExtScsiPassThruProtocolGuid, > > - (VOID **) &PassThru, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - return EFI_DEVICE_ERROR; > > - } > > - > > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); > > - Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, > > Link); > > - > > - // > > - // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just > > close > > - // the protocol here but not uninstall the device path protocol and > > - // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle. > > - // > > - gBS->CloseProtocol ( > > - Private->ChildHandle, > > - &gEfiTcp4ProtocolGuid, > > - Private->Image, > > - Private->ExtScsiPassThruHandle > > - ); > > - > > - gBS->CloseProtocol ( > > - Conn->Tcp4Io.Handle, > > - &gEfiTcp4ProtocolGuid, > > - Private->Image, > > - Private->ExtScsiPassThruHandle > > - ); > > - > > - return EFI_SUCCESS; > > - } > > - // > > - // Get the handle of the controller we are controling. > > - // > > - IScsiController = NetLibGetNicHandle (ControllerHandle, > > &gEfiTcp4ProtocolGuid); > > - > > - Status = gBS->OpenProtocol ( > > - IScsiController, > > - &gEfiCallerIdGuid, > > - (VOID **)&IScsiIdentifier, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - return EFI_DEVICE_ERROR; > > - } > > - > > - Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); > > - > > - if (Private->ChildHandle != NULL) { > > - Status = gBS->CloseProtocol ( > > - Private->ChildHandle, > > - &gEfiTcp4ProtocolGuid, > > - This->DriverBindingHandle, > > - IScsiController > > - ); > > - > > - ASSERT (!EFI_ERROR (Status)); > > - > > - Status = NetLibDestroyServiceChild ( > > - IScsiController, > > - This->DriverBindingHandle, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - Private->ChildHandle > > - ); > > - ASSERT (!EFI_ERROR (Status)); > > - } > > - > > - IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, > FALSE); > > - > > - // > > - // Uninstall the private protocol. > > - // > > - gBS->UninstallProtocolInterface ( > > - IScsiController, > > - &gEfiCallerIdGuid, > > - &Private->IScsiIdentifier > > - ); > > - > > - // > > - // Update the iSCSI Boot Firware Table. > > - // > > - IScsiPublishIbft (); > > - > > - IScsiSessionAbort (&Private->Session); > > - Status = IScsiCleanDriverData (Private); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Unloads an image(the iSCSI driver). > > - > > - @param[in] ImageHandle Handle that identifies the image to be > > unloaded. > > - > > - @retval EFI_SUCCESS The image has been unloaded. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiIScsiUnload ( > > - IN EFI_HANDLE ImageHandle > > - ) > > -{ > > - EFI_STATUS Status; > > - UINTN DeviceHandleCount; > > - EFI_HANDLE *DeviceHandleBuffer; > > - UINTN Index; > > - EFI_COMPONENT_NAME_PROTOCOL *ComponentName; > > - EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; > > - > > - // > > - // Try to disonnect the driver from the devices it's controlling. > > - // > > - Status = gBS->LocateHandleBuffer ( > > - AllHandles, > > - NULL, > > - NULL, > > - &DeviceHandleCount, > > - &DeviceHandleBuffer > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - for (Index = 0; Index < DeviceHandleCount; Index++) { > > - Status = IScsiTestManagedDevice ( > > - DeviceHandleBuffer[Index], > > - gIScsiDriverBinding.DriverBindingHandle, > > - &gEfiTcp4ProtocolGuid > > - ); > > - if (EFI_ERROR (Status)) { > > - continue; > > - } > > - Status = gBS->DisconnectController ( > > - DeviceHandleBuffer[Index], > > - gIScsiDriverBinding.DriverBindingHandle, > > - NULL > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - } > > - > > - // > > - // Unload the iSCSI configuration form. > > - // > > - Status = IScsiConfigFormUnload > (gIScsiDriverBinding.DriverBindingHandle); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - // > > - // Uninstall the ComponentName and ComponentName2 protocol from > > iSCSI4 driver binding handle > > - // if it has been installed. > > - // > > - Status = gBS->HandleProtocol ( > > - gIScsiDriverBinding.DriverBindingHandle, > > - &gEfiComponentNameProtocolGuid, > > - (VOID **) &ComponentName > > - ); > > - if (!EFI_ERROR (Status)) { > > - Status = gBS->UninstallMultipleProtocolInterfaces ( > > - gIScsiDriverBinding.DriverBindingHandle, > > - &gEfiComponentNameProtocolGuid, > > - ComponentName, > > - NULL > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - } > > - > > - Status = gBS->HandleProtocol ( > > - gIScsiDriverBinding.DriverBindingHandle, > > - &gEfiComponentName2ProtocolGuid, > > - (VOID **) &ComponentName2 > > - ); > > - if (!EFI_ERROR (Status)) { > > - gBS->UninstallMultipleProtocolInterfaces ( > > - gIScsiDriverBinding.DriverBindingHandle, > > - &gEfiComponentName2ProtocolGuid, > > - ComponentName2, > > - NULL > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - } > > - > > - Status = gBS->UninstallMultipleProtocolInterfaces ( > > - ImageHandle, > > - &gEfiDriverBindingProtocolGuid, > > - &gIScsiDriverBinding, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - &gIScsiInitiatorName, > > - NULL > > - ); > > -ON_EXIT: > > - > > - if (DeviceHandleBuffer != NULL) { > > - FreePool (DeviceHandleBuffer); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - This is the declaration of an EFI image entry point. This entry point > is > > - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers > including > > - both device drivers and bus drivers. It initialize the global > variables and > > - publish the driver binding protocol. > > - > > - @param[in] ImageHandle The firmware allocated handle for the > UEFI > > image. > > - @param[in] SystemTable A pointer to the EFI System Table. > > - > > - @retval EFI_SUCCESS The operation completed successfully. > > - @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL > > was installed unexpectedly. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDriverEntryPoint ( > > - IN EFI_HANDLE ImageHandle, > > - IN EFI_SYSTEM_TABLE *SystemTable > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName; > > - > > - // > > - // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL. > > - // > > - Status = gBS->LocateProtocol ( > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - NULL, > > - (VOID**) &IScsiInitiatorName > > - ); > > - > > - if (!EFI_ERROR (Status)) { > > - return EFI_ACCESS_DENIED; > > - } > > - > > - // > > - // Initialize the EFI Driver Library > > - // > > - Status = EfiLibInstallDriverBindingComponentName2 ( > > - ImageHandle, > > - SystemTable, > > - &gIScsiDriverBinding, > > - ImageHandle, > > - &gIScsiComponentName, > > - &gIScsiComponentName2 > > - ); > > - > > - if (!EFI_ERROR (Status)) { > > - // > > - // Install the iSCSI Initiator Name Protocol. > > - // > > - Status = gBS->InstallProtocolInterface ( > > - &ImageHandle, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - EFI_NATIVE_INTERFACE, > > - &gIScsiInitiatorName > > - ); > > - if (EFI_ERROR (Status)) { > > - gBS->UninstallMultipleProtocolInterfaces ( > > - ImageHandle, > > - &gEfiDriverBindingProtocolGuid, > > - &gIScsiDriverBinding, > > - &gEfiComponentName2ProtocolGuid, > > - &gIScsiComponentName2, > > - &gEfiComponentNameProtocolGuid, > > - &gIScsiComponentName, > > - NULL > > - ); > > - return Status; > > - } > > - > > - // > > - // Initialize the configuration form of iSCSI. > > - // > > - Status = IScsiConfigFormInit (); > > - if (EFI_ERROR (Status)) { > > - gBS->UninstallMultipleProtocolInterfaces ( > > - ImageHandle, > > - &gEfiDriverBindingProtocolGuid, > > - &gIScsiDriverBinding, > > - &gEfiComponentName2ProtocolGuid, > > - &gIScsiComponentName2, > > - &gEfiComponentNameProtocolGuid, > > - &gIScsiComponentName, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - &gIScsiInitiatorName, > > - NULL > > - ); > > - } > > - } > > - return Status; > > -} > > - > > diff --git > > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > > deleted file mode 100644 > > index db2d6d19366e..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > > +++ /dev/null > > @@ -1,412 +0,0 @@ > > -/** @file > > - The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -/** > > - Sends a SCSI Request Packet to a SCSI device that is attached to the > SCSI > > channel. This function > > - supports both blocking I/O and nonblocking I/O. The blocking I/O > > functionality is required, and the > > - nonblocking I/O functionality is optional. > > - > > - @param[in] This A pointer to the > > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > > - @param[in] Target The Target is an array of size > TARGET_MAX_BYTES > > and it represents > > - the id of the SCSI device to send the SCSI > Request Packet. Each > > - transport driver may chose to utilize a > subset of this size to suit > > the needs > > - of transport target representation. For > example, a Fibre > > Channel driver > > - may use only 8 bytes (WWN) to represent an FC > target. > > - @param[in] Lun The LUN of the SCSI device to send the SCSI > Request > > Packet. > > - @param[in, out] Packet A pointer to the SCSI Request Packet to send > to > > the SCSI device > > - specified by Target and Lun. > > - @param[in] Event If nonblocking I/O is not supported then > Event is > > ignored, and blocking > > - I/O is performed. If Event is NULL, then > blocking I/O is > > performed. If > > - Event is not NULL and non blocking I/O is > supported, then > > - nonblocking I/O is performed, and Event will > be signaled when > > the > > - SCSI Request Packet completes. > > - > > - @retval EFI_SUCCESS The SCSI Request Packet was sent by the > host. > > For bi-directional > > - commands, InTransferLength bytes were > transferred from > > - InDataBuffer. For write and bi- > directional commands, > > - OutTransferLength bytes were > transferred by > > - OutDataBuffer. > > - @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not > > executed. The number of bytes that > > - could be transferred is returned in > InTransferLength. For > > write > > - and bi-directional commands, > OutTransferLength bytes > > were > > - transferred by OutDataBuffer. Currently > not implemeted. > > - @retval EFI_NOT_READY The SCSI Request Packet could not be > sent > > because there are too many > > - SCSI Request Packets already queued. > The caller may retry > > again later. > > - @retval EFI_DEVICE_ERROR A device error occurred while > attempting to > > send the SCSI Request > > - Packet. > > - @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of > > ScsiRequestPacket are invalid. > > - @retval EFI_UNSUPPORTED The command described by the SCSI > > Request Packet is not supported > > - by the host adapter. This includes the > case of Bi-directional > > SCSI > > - commands not supported by the > implementation. The SCSI > > Request > > - Packet was not sent, so no additional > status information is > > available. > > - Currently not implemeted. > > - @retval EFI_TIMEOUT A timeout occurred while waiting for > the SCSI > > Request Packet to execute. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiExtScsiPassThruFunction ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > > - IN UINT8 *Target, > > - IN UINT64 Lun, > > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, > > - IN EFI_EVENT Event > OPTIONAL > > - ) > > -{ > > - ISCSI_DRIVER_DATA *Private; > > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > > - EFI_STATUS Status; > > - > > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > > - ConfigNvData = &Private->Session.ConfigData.NvData; > > - > > - if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, > sizeof > > (UINT64)) != 0)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if ((Packet == NULL) || (Packet->Cdb == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); > > - if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) { > > - // > > - // Try to reinstate the session and re-execute the Scsi command. > > - // > > - if (EFI_ERROR (IScsiSessionReinstatement (Private))) { > > - return EFI_DEVICE_ERROR; > > - } > > - > > - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Used to retrieve the list of legal Target IDs and LUNs for SCSI > devices on a > > SCSI channel. These > > - can either be the list SCSI devices that are actually present on the > SCSI > > channel, or the list of legal > > - Target Ids and LUNs for the SCSI channel. Regardless, the caller of > this > > function must probe the > > - Target ID and LUN returned to see if a SCSI device is actually > present at that > > location on the SCSI > > - channel. > > - > > - @param[in] This A pointer to the > > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > > - @param[in, out] Target On input, a pointer to the Target ID (an > array of > > size > > - TARGET_MAX_BYTES) of a SCSI device present > on the SCSI > > channel. > > - On output, a pointer to the Target ID (an > array of > > - TARGET_MAX_BYTES) of the next SCSI device > present on a > > SCSI > > - channel. An input value of 0xF(all bytes in > the array are 0xF) in > > the > > - Target array retrieves the Target ID of the > first SCSI device > > present on a > > - SCSI channel. > > - @param[in, out] Lun On input, a pointer to the LUN of a SCSI > device > > present on the SCSI > > - channel. On output, a pointer to the LUN of > the next SCSI > > device present > > - on a SCSI channel. > > - > > - @retval EFI_SUCCESS The Target ID and LUN of the next SCSI > device > > on the SCSI > > - channel was returned in Target and Lun. > > - @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target > > and Lun were > > - not returned on a previous call to > GetNextTargetLun(). > > - @retval EFI_NOT_FOUND There are no more SCSI devices on this > SCSI > > channel. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiExtScsiPassThruGetNextTargetLun ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > > - IN OUT UINT8 **Target, > > - IN OUT UINT64 *Lun > > - ) > > -{ > > - ISCSI_DRIVER_DATA *Private; > > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > > - UINT8 TargetId[TARGET_MAX_BYTES]; > > - > > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > > - ConfigNvData = &Private->Session.ConfigData.NvData; > > - > > - if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, > > sizeof (UINT64)) == 0)) { > > - // > > - // Only one <Target, Lun> pair per iSCSI Driver instance. > > - // > > - return EFI_NOT_FOUND; > > - } > > - > > - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); > > - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { > > - (*Target)[0] = 0; > > - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); > > - > > - return EFI_SUCCESS; > > - } > > - > > - return EFI_INVALID_PARAMETER; > > -} > > - > > -/** > > - Used to allocate and build a device path node for a SCSI device on a > SCSI > > channel. > > - > > - @param[in] This A pointer to the > > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > > - @param[in] Target The Target is an array of size > TARGET_MAX_BYTES > > and it specifies the > > - Target ID of the SCSI device for which a > device path node is to > > be > > - allocated and built. Transport drivers > may chose to utilize a > > subset of > > - this size to suit the representation of > targets. For example, a > > Fibre > > - Channel driver may use only 8 bytes (WWN) > in the array to > > represent a > > - FC target. > > - @param[in] Lun The LUN of the SCSI device for which a > device path > > node is to be > > - allocated and built. > > - @param[in, out] DevicePath A pointer to a single device path node > that > > describes the SCSI device > > - specified by Target and Lun. This > function is responsible for > > - allocating the buffer DevicePath with the > boot service > > - AllocatePool(). It is the caller's > responsibility to free > > - DevicePath when the caller is finished > with DevicePath. > > - > > - @retval EFI_SUCCESS The device path node that describes the > SCSI > > device specified by > > - Target and Lun was allocated and > returned in > > - DevicePath. > > - @retval EFI_INVALID_PARAMETER DevicePath is NULL. > > - @retval EFI_NOT_FOUND The SCSI devices specified by Target > and Lun > > does not exist > > - on the SCSI channel. > > - @retval EFI_OUT_OF_RESOURCES There are not enough resources to > > allocate DevicePath. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiExtScsiPassThruBuildDevicePath ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > > - IN UINT8 *Target, > > - IN UINT64 Lun, > > - IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath > > - ) > > -{ > > - ISCSI_DRIVER_DATA *Private; > > - ISCSI_SESSION *Session; > > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > > - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; > > - EFI_DEV_PATH *Node; > > - UINTN DevPathNodeLen; > > - > > - if (DevicePath == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (Target[0] != 0) { > > - return EFI_NOT_FOUND; > > - } > > - > > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > > - Session = &Private->Session; > > - ConfigNvData = &Session->ConfigData.NvData; > > - AuthConfig = &Session->AuthData.AuthConfig; > > - > > - if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) { > > - return EFI_NOT_FOUND; > > - } > > - > > - DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen > > (ConfigNvData->TargetName) + 1; > > - Node = AllocatePool (DevPathNodeLen); > > - if (Node == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Node->DevPath.Type = MESSAGING_DEVICE_PATH; > > - Node->DevPath.SubType = MSG_ISCSI_DP; > > - SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen); > > - > > - // > > - // 0 for TCP, others are reserved. > > - // > > - Node->Iscsi.NetworkProtocol = 0; > > - > > - Node->Iscsi.LoginOption = 0; > > - switch (AuthConfig->CHAPType) { > > - case ISCSI_CHAP_NONE: > > - Node->Iscsi.LoginOption |= 0x0800; > > - break; > > - > > - case ISCSI_CHAP_UNI: > > - Node->Iscsi.LoginOption |= 0x1000; > > - break; > > - > > - default: > > - break; > > - } > > - > > - CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64)); > > - Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag; > > - AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), > AsciiStrLen > > (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName); > > - > > - *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node; > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Used to translate a device path node to a Target ID and LUN. > > - > > - @param[in] This A pointer to the > > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > > - @param[in] DevicePath A pointer to a single device path node that > > describes the SCSI device > > - on the SCSI channel. > > - @param[out] Target A pointer to the Target Array which represents > the > > ID of a SCSI device > > - on the SCSI channel. > > - @param[out] Lun A pointer to the LUN of a SCSI device on the > SCSI > > channel. > > - > > - @retval EFI_SUCCESS DevicePath was successfully translated > to a > > Target ID and > > - LUN, and they were returned in Target > and Lun. > > - @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL. > > - @retval EFI_NOT_FOUND A valid translation from DevicePath to > a > > Target ID and LUN > > - does not exist.Currently not > implemented. > > - @retval EFI_UNSUPPORTED This driver does not support the device > > path node type in > > - DevicePath. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiExtScsiPassThruGetTargetLun ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > > - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, > > - OUT UINT8 **Target, > > - OUT UINT64 *Lun > > - ) > > -{ > > - ISCSI_DRIVER_DATA *Private; > > - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; > > - > > - if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if ((DevicePath->Type != MESSAGING_DEVICE_PATH) || > > - (DevicePath->SubType != MSG_ISCSI_DP) || > > - (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH)) > > - ) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); > > - ConfigNvData = &Private->Session.ConfigData.NvData; > > - > > - SetMem (*Target, TARGET_MAX_BYTES, 0xFF); > > - (*Target)[0] = 0; > > - > > - if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + > > sizeof (ISCSI_DEVICE_PATH)) != 0) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Resets a SCSI channel. This operation resets all the SCSI devices > connected > > to the SCSI channel. > > - Currently not implemented. > > - > > - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL > > instance. > > - > > - @retval EFI_SUCCESS The SCSI channel was reset. > > - @retval EFI_DEVICE_ERROR A device error occurred while attempting to > > reset the SCSI channel. > > - @retval EFI_TIMEOUT A timeout occurred while attempting to reset > the > > SCSI channel. > > - @retval EFI_UNSUPPORTED The SCSI channel does not support a channel > > reset operation. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiExtScsiPassThruResetChannel ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This > > - ) > > -{ > > - return EFI_UNSUPPORTED; > > -} > > - > > -/** > > - Resets a SCSI logical unit that is connected to a SCSI channel. > Currently not > > implemented. > > - > > - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL > > instance. > > - @param[in] Target The Target is an array of size TARGET_MAX_BYTE and > it > > represents the > > - target port ID of the SCSI device containing the > SCSI logical unit to > > - reset. Transport drivers may chose to utilize a > subset of this array > > to suit > > - the representation of their targets. > > - @param[in] Lun The LUN of the SCSI device to reset. > > - > > - @retval EFI_SUCCESS The SCSI device specified by Target and > Lun was > > reset. > > - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. > > - @retval EFI_TIMEOUT A timeout occurred while attempting to > reset > > the SCSI device > > - specified by Target and Lun. > > - @retval EFI_UNSUPPORTED The SCSI channel does not support a > target > > reset operation. > > - @retval EFI_DEVICE_ERROR A device error occurred while > attempting to > > reset the SCSI device > > - specified by Target and Lun. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiExtScsiPassThruResetTargetLun ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > > - IN UINT8 *Target, > > - IN UINT64 Lun > > - ) > > -{ > > - return EFI_UNSUPPORTED; > > -} > > - > > -/** > > - Used to retrieve the list of legal Target IDs for SCSI devices on a > SCSI > > channel. These can either > > - be the list SCSI devices that are actually present on the SCSI > channel, or the > > list of legal Target IDs > > - for the SCSI channel. Regardless, the caller of this function must > probe the > > Target ID returned to > > - see if a SCSI device is actually present at that location on the SCSI > channel. > > - > > - @param[in] This A pointer to the > > EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. > > - @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present > > on the SCSI channel. > > - On output, a pointer to the Target ID (an > array of > > - TARGET_MAX_BYTES) of the next SCSI device > present on a > > SCSI > > - channel. An input value of 0xF(all bytes in > the array are 0xF) in > > the > > - Target array retrieves the Target ID of the > first SCSI device > > present on a > > - SCSI channel. > > - > > - @retval EFI_SUCCESS The Target ID of the next SCSI device > on the > > SCSI > > - channel was returned in Target. > > - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. > > - @retval EFI_TIMEOUT Target array is not all 0xF, and Target > were not > > - returned on a previous call to > GetNextTarget(). > > - Currently not implemented. > > - @retval EFI_NOT_FOUND There are no more SCSI devices on this > SCSI > > channel. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiExtScsiPassThruGetNextTarget ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, > > - IN OUT UINT8 **Target > > - ) > > -{ > > - UINT8 TargetId[TARGET_MAX_BYTES]; > > - > > - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); > > - > > - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { > > - (*Target)[0] = 0; > > - return EFI_SUCCESS; > > - } else if ((*Target)[0] == 0) { > > - return EFI_NOT_FOUND; > > - } else { > > - return EFI_INVALID_PARAMETER; > > - } > > -} > > - > > -EFI_EXT_SCSI_PASS_THRU_PROTOCOL > > gIScsiExtScsiPassThruProtocolTemplate = { > > - NULL, > > - IScsiExtScsiPassThruFunction, > > - IScsiExtScsiPassThruGetNextTargetLun, > > - IScsiExtScsiPassThruBuildDevicePath, > > - IScsiExtScsiPassThruGetTargetLun, > > - IScsiExtScsiPassThruResetChannel, > > - IScsiExtScsiPassThruResetTargetLun, > > - IScsiExtScsiPassThruGetNextTarget > > -}; > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > deleted file mode 100644 > > index 58c5447dcbd1..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > +++ /dev/null > > @@ -1,539 +0,0 @@ > > -/** @file > > - Implementation for iSCSI Boot Firmware Table publication. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -BOOLEAN mIbftInstalled = FALSE; > > -UINTN mTableKey; > > - > > -/** > > - Initialize the header of the iSCSI Boot Firmware Table. > > - > > - @param[out] Header The header of the iSCSI Boot Firmware Table. > > - @param[in] OemId The OEM ID. > > - @param[in] OemTableId The OEM table ID for the iBFT. > > -**/ > > -VOID > > -IScsiInitIbfTableHeader ( > > - OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header, > > - IN UINT8 *OemId, > > - IN UINT64 *OemTableId > > - ) > > -{ > > - ZeroMem (Header, sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER)); > > - > > - Header->Signature = > > EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE; > > - Header->Length = IBFT_HEAP_OFFSET; > > - Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION; > > - Header->Checksum = 0; > > - > > - CopyMem (Header->OemId, OemId, sizeof (Header->OemId)); > > - CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64)); > > -} > > - > > -/** > > - Initialize the control section of the iSCSI Boot Firmware Table. > > - > > - @param[in] Table The ACPI table. > > - @param[in] HandleCount The number of the handles associated with > iSCSI > > sessions, it's > > - equal to the number of iSCSI sessions. > > -**/ > > -VOID > > -IScsiInitControlSection ( > > - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, > > - IN UINTN HandleCount > > - ) > > -{ > > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE > > *Control; > > - UINTN NumOffset; > > - > > - Control = > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table > > + 1); > > - > > - ZeroMem (Control, sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE)); > > - > > - Control->Header.StructureId = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID; > > - Control->Header.Version = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION; > > - Control->Header.Length = (UINT16) sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE); > > - > > - // > > - // Each session occupies two offsets, one for the NIC section, > > - // the other for the Target section. > > - // > > - NumOffset = 2 * HandleCount; > > - if (NumOffset > 4) { > > - // > > - // Need expand the control section if more than 2 NIC/Target > sections > > - // exist. > > - // > > - Control->Header.Length = (UINT16) (Control->Header.Length + > > (NumOffset - 4) * sizeof (UINT16)); > > - } > > -} > > - > > -/** > > - Add one item into the heap. > > - > > - @param[in, out] Heap On input, the current address of the heap; On > > output, the address of > > - the heap after the item is added. > > - @param[in] Data The data to add into the heap. > > - @param[in] Len Length of the Data in byte. > > -**/ > > -VOID > > -IScsiAddHeapItem ( > > - IN OUT UINT8 **Heap, > > - IN VOID *Data, > > - IN UINTN Len > > - ) > > -{ > > - // > > - // Add one byte for the NULL delimiter. > > - // > > - *Heap -= Len + 1; > > - > > - CopyMem (*Heap, Data, Len); > > - *(*Heap + Len) = 0; > > -} > > - > > -/** > > - Fill the Initiator section of the iSCSI Boot Firmware Table. > > - > > - @param[in] Table The ACPI table. > > - @param[in, out] Heap The heap. > > - @param[in] Handle The handle associated with the iSCSI > session. > > -**/ > > -VOID > > -IScsiFillInitiatorSection ( > > - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, > > - IN OUT UINT8 **Heap, > > - IN EFI_HANDLE Handle > > - ) > > -{ > > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE > > *Control; > > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE > > *Initiator; > > - ISCSI_DRIVER_DATA *DriverData; > > - ISCSI_SESSION *Session; > > - ISCSI_PRIVATE_PROTOCOL > *IScsiIdentifier; > > - EFI_STATUS Status; > > - > > - Control = > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table > > + 1); > > - > > - // > > - // Initiator section immediately follows the control section. > > - // > > - Initiator = > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) > > ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length)); > > - > > - Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) > Table); > > - > > - ZeroMem (Initiator, sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)); > > - > > - Initiator->Header.StructureId = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID; > > - Initiator->Header.Version = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSIO > > N; > > - Initiator->Header.Length = (UINT16) sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE); > > - Initiator->Header.Flags = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B > > LOCK_VALID | > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B > > OOT_SELECTED; > > - > > - // > > - // Get the identifier from the handle. > > - // > > - Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) > > &IScsiIdentifier); > > - if (EFI_ERROR (Status)) { > > - ASSERT (FALSE); > > - return ; > > - } > > - > > - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); > > - Session = &DriverData->Session; > > - > > - // > > - // Fill the iSCSI Initiator Name into the heap. > > - // > > - IScsiAddHeapItem (Heap, Session->InitiatorName, Session- > > >InitiatorNameLength - 1); > > - > > - Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength > - 1); > > - Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) > Table); > > -} > > - > > -/** > > - Map the v4 IP address into v6 IP address. > > - > > - @param[in] V4 The v4 IP address. > > - @param[out] V6 The v6 IP address. > > -**/ > > -VOID > > -IScsiMapV4ToV6Addr ( > > - IN EFI_IPv4_ADDRESS *V4, > > - OUT EFI_IPv6_ADDRESS *V6 > > - ) > > -{ > > - UINTN Index; > > - > > - ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS)); > > - > > - V6->Addr[10] = 0xff; > > - V6->Addr[11] = 0xff; > > - > > - for (Index = 0; Index < 4; Index++) { > > - V6->Addr[12 + Index] = V4->Addr[Index]; > > - } > > -} > > - > > -/** > > - Get the NIC's PCI location and return it according to the composited > > - format defined in iSCSI Boot Firmware Table. > > - > > - @param[in] Controller The handle of the controller. > > - > > - @return UINT16 The composited representation of the NIC PCI > > location. > > - @retval 0 Other errors as indicated. > > -**/ > > -UINT16 > > -IScsiGetNICPciLocation ( > > - IN EFI_HANDLE Controller > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > > - EFI_HANDLE PciIoHandle; > > - EFI_PCI_IO_PROTOCOL *PciIo; > > - UINTN Segment; > > - UINTN Bus; > > - UINTN Device; > > - UINTN Function; > > - > > - Status = gBS->HandleProtocol ( > > - Controller, > > - &gEfiDevicePathProtocolGuid, > > - (VOID **)&DevicePath > > - ); > > - if (EFI_ERROR (Status)) { > > - return 0; > > - } > > - > > - Status = gBS->LocateDevicePath ( > > - &gEfiPciIoProtocolGuid, > > - &DevicePath, > > - &PciIoHandle > > - ); > > - if (EFI_ERROR (Status)) { > > - return 0; > > - } > > - > > - Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, > (VOID > > **)&PciIo); > > - if (EFI_ERROR (Status)) { > > - return 0; > > - } > > - > > - Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, > &Function); > > - if (EFI_ERROR (Status)) { > > - return 0; > > - } > > - > > - return (UINT16) ((Bus << 8) | (Device << 3) | Function); > > -} > > - > > -/** > > - Fill the NIC and target sections in iSCSI Boot Firmware Table. > > - > > - @param[in] Table The buffer of the ACPI table. > > - @param[in, out] Heap The heap buffer used to store the > variable > > length parameters such as iSCSI name. > > - @param[in] HandleCount Count The number of handles having iSCSI > > private protocol installed. > > - @param[in] Handles The handle buffer. > > -**/ > > -VOID > > -IScsiFillNICAndTargetSections ( > > - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, > > - IN OUT UINT8 **Heap, > > - IN UINTN HandleCount, > > - IN EFI_HANDLE *Handles > > - ) > > -{ > > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE > > *Control; > > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic; > > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target; > > - ISCSI_DRIVER_DATA *DriverData; > > - ISCSI_SESSION_CONFIG_DATA > *SessionConfigData; > > - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; > > - UINT16 *SectionOffset; > > - UINTN Index; > > - UINT16 Length; > > - EFI_MAC_ADDRESS MacAddress; > > - UINTN HwAddressSize; > > - ISCSI_PRIVATE_PROTOCOL > *IScsiIdentifier; > > - EFI_STATUS Status; > > - > > - // > > - // Get the offset of the first Nic and Target section. > > - // > > - Control = > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table > > + 1); > > - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) > > ((UINTN) Table + > > - Control->InitiatorOffset + IBFT_ROUNDUP (sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE))); > > - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE > > *) ((UINTN) Nic + > > - IBFT_ROUNDUP (sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); > > - > > - SectionOffset = &Control->NIC0Offset; > > - > > - for (Index = 0; Index < HandleCount; Index++) { > > - Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, > (VOID > > **)&IScsiIdentifier); > > - if (EFI_ERROR (Status)) { > > - ASSERT (FALSE); > > - return ; > > - } > > - > > - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER > (IScsiIdentifier); > > - SessionConfigData = &DriverData->Session.ConfigData; > > - AuthConfig = &DriverData->Session.AuthData.AuthConfig; > > - > > - // > > - // Fill the Nic section. > > - // > > - ZeroMem (Nic, sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)); > > - > > - Nic->Header.StructureId = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID; > > - Nic->Header.Version = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION; > > - Nic->Header.Length = (UINT16) sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE); > > - Nic->Header.Index = (UINT8) Index; > > - Nic->Header.Flags = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_ > > VALID | > > - > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_S > > ELECTED | > > - > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL; > > - > > - // > > - // Get the subnet mask prefix length. > > - // > > - Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength > > (&SessionConfigData->NvData.SubnetMask); > > - > > - if (SessionConfigData->NvData.InitiatorInfoFromDhcp) { > > - Nic->Origin = IpPrefixOriginDhcp; > > - } else { > > - Nic->Origin = IpPrefixOriginManual; > > - } > > - // > > - // Map the various v4 addresses into v6 addresses. > > - // > > - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip); > > - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic- > > >Gateway); > > - IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic- > > >PrimaryDns); > > - IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic- > > >SecondaryDns); > > - IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic- > > >DhcpServer); > > - > > - Nic->VLanTag = NetLibGetVlanId (DriverData->Controller); > > - > > - Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, > > &HwAddressSize); > > - ASSERT (Status == EFI_SUCCESS); > > - CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac)); > > - > > - // > > - // Get the PCI location of the Nic. > > - // > > - Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller); > > - > > - *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table); > > - SectionOffset++; > > - > > - // > > - // Fill the Target section. > > - // > > - ZeroMem (Target, sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)); > > - > > - Target->Header.StructureId = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID; > > - Target->Header.Version = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION; > > - Target->Header.Length = (UINT16) sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE); > > - Target->Header.Index = (UINT8) Index; > > - Target->Header.Flags = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLO > > CK_VALID | > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOO > > T_SELECTED; > > - Target->Port = SessionConfigData->NvData.TargetPort; > > - Target->NicIndex = (UINT8) Index; > > - > > - if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) { > > - Target->CHAPType = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > > E_NO_CHAP; > > - } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) { > > - Target->CHAPType = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > > E_CHAP; > > - } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) { > > - Target->CHAPType = > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > > E_MUTUAL_CHAP; > > - } > > - > > - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target- > > >Ip); > > - CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof > > (Target->BootLun)); > > - > > - // > > - // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret. > > - // > > - Length = (UINT16) AsciiStrLen (SessionConfigData- > >NvData.TargetName); > > - IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, > > Length); > > - > > - Target->IScsiNameLength = Length; > > - Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); > > - > > - if (Target->CHAPType != > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > > E_NO_CHAP) { > > - // > > - // CHAP Name > > - // > > - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName); > > - IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length); > > - Target->CHAPNameLength = Length; > > - Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) > Table); > > - > > - // > > - // CHAP Secret > > - // > > - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret); > > - IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length); > > - Target->CHAPSecretLength = Length; > > - Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) > Table); > > - > > - if (Target->CHAPType == > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP > > E_MUTUAL_CHAP) { > > - // > > - // Reverse CHAP Name > > - // > > - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName); > > - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length); > > - Target->ReverseCHAPNameLength = Length; > > - Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - > (UINTN) > > Table); > > - > > - // > > - // Reverse CHAP Secret > > - // > > - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret); > > - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length); > > - Target->ReverseCHAPSecretLength = Length; > > - Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - > > (UINTN) Table); > > - } > > - } > > - > > - *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table); > > - SectionOffset++; > > - > > - // > > - // Advance to the next NIC/Target pair > > - // > > - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) > > ((UINTN) Target + > > - IBFT_ROUNDUP (sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE))); > > - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE > > *) ((UINTN) Nic + > > - IBFT_ROUNDUP (sizeof > > (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); > > - } > > -} > > - > > -/** > > - Publish and remove the iSCSI Boot Firmware Table according to the > iSCSI > > - session status. > > -**/ > > -VOID > > -IScsiPublishIbft ( > > - VOID > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; > > - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table; > > - UINTN HandleCount; > > - EFI_HANDLE *HandleBuffer; > > - UINT8 *Heap; > > - UINT8 Checksum; > > - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; > > - EFI_ACPI_DESCRIPTION_HEADER *Rsdt; > > - EFI_ACPI_DESCRIPTION_HEADER *Xsdt; > > - > > - Rsdt = NULL; > > - Xsdt = NULL; > > - > > - Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID > > **)&AcpiTableProtocol); > > - if (EFI_ERROR (Status)) { > > - return ; > > - } > > - > > - > > - // > > - // Find ACPI table RSD_PTR from system table > > - // > > - Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) > > &Rsdp); > > - if (EFI_ERROR (Status)) { > > - Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, > (VOID > > **) &Rsdp); > > - } > > - > > - if (EFI_ERROR (Status) || (Rsdp == NULL)) { > > - return ; > > - } else if (Rsdp->Revision >= > > EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp- > > >XsdtAddress != 0) { > > - Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress; > > - } else if (Rsdp->RsdtAddress != 0) { > > - Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress; > > - } > > - > > - if ((Xsdt == NULL) && (Rsdt == NULL)) { > > - return ; > > - } > > - > > - if (mIbftInstalled) { > > - Status = AcpiTableProtocol->UninstallAcpiTable ( > > - AcpiTableProtocol, > > - mTableKey > > - ); > > - if (EFI_ERROR (Status)) { > > - return ; > > - } > > - mIbftInstalled = FALSE; > > - } > > - > > - // > > - // Get all iSCSI private protocols. > > - // > > - Status = gBS->LocateHandleBuffer ( > > - ByProtocol, > > - &gEfiCallerIdGuid, > > - NULL, > > - &HandleCount, > > - &HandleBuffer > > - ); > > - if (EFI_ERROR (Status)) { > > - return ; > > - } > > - // > > - // Allocate 4k bytes to hold the ACPI table. > > - // > > - Table = AllocateZeroPool (IBFT_MAX_SIZE); > > - if (Table == NULL) { > > - return ; > > - } > > - > > - Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET; > > - > > - // > > - // Fill in the various section of the iSCSI Boot Firmware Table. > > - // > > - if (Rsdp->Revision >= > > EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) { > > - IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId); > > - } else { > > - IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId); > > - } > > - > > - IScsiInitControlSection (Table, HandleCount); > > - IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]); > > - IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, > HandleBuffer); > > - > > - Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length); > > - Table->Checksum = Checksum; > > - > > - FreePool (HandleBuffer); > > - > > - // > > - // Install or update the iBFT table. > > - // > > - Status = AcpiTableProtocol->InstallAcpiTable ( > > - AcpiTableProtocol, > > - Table, > > - Table->Length, > > - &mTableKey > > - ); > > - if (EFI_ERROR(Status)) { > > - return; > > - } > > - > > - mIbftInstalled = TRUE; > > - FreePool (Table); > > -} > > diff --git > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > > deleted file mode 100644 > > index e753d9eebdbe..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > > +++ /dev/null > > @@ -1,116 +0,0 @@ > > -/** @file > > - Implementation for EFI iSCSI Initiator Name Protocol. > > - > > -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = { > > - IScsiGetInitiatorName, > > - IScsiSetInitiatorName > > -}; > > - > > -/** > > - Retrieves the current set value of iSCSI Initiator Name. > > - > > - @param[in] This Pointer to the > > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by > Buffer > > / Actual size of the > > - variable data buffer. > > - @param[out] Buffer Pointer to the buffer for data to be read. > The data > > is a null-terminated UTF-8 encoded string. > > - The maximum length is 223 characters, > including the null- > > terminator. > > - > > - @retval EFI_SUCCESS Data was successfully retrieved into > the > > provided buffer and the > > - BufferSize was sufficient to handle the > iSCSI initiator name. > > - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. > > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. > > - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be > > retrieved due to a hardware error. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiGetInitiatorName ( > > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > > - IN OUT UINTN *BufferSize, > > - OUT VOID *Buffer > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - if ((BufferSize == NULL) || (Buffer == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Status = gRT->GetVariable ( > > - ISCSI_INITIATOR_NAME_VAR_NAME, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - NULL, > > - BufferSize, > > - Buffer > > - ); > > - > > - return Status; > > -} > > - > > -/** > > - Sets the iSCSI Initiator Name. > > - > > - @param[in] This Pointer to the > > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by > Buffer. > > - @param[in] Buffer Pointer to the buffer for data to be > written. The > > data is a null-terminated UTF-8 encoded string. > > - The maximum length is 223 characters, > including the null- > > terminator. > > - > > - @retval EFI_SUCCESS Data was successfully stored by the > protocol. > > - @retval EFI_UNSUPPORTED Platform policies do not allow for data > to be > > written. > > - Currently not implemented. > > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or > > BufferSize exceeds the maximum allowed limit. > > - @retval EFI_DEVICE_ERROR The data could not be stored due to a > > hardware error. > > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > > the data. > > - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not > > adhere to RFC 3720 > > - (and other related protocols). > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiSetInitiatorName ( > > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > > - IN OUT UINTN *BufferSize, > > - IN VOID *Buffer > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - if ((BufferSize == NULL) || (Buffer == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (*BufferSize > ISCSI_NAME_MAX_SIZE) { > > - *BufferSize = ISCSI_NAME_MAX_SIZE; > > - return EFI_INVALID_PARAMETER; > > - } > > - // > > - // only support iqn iSCSI names. > > - // > > - Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Status = gRT->SetVariable ( > > - ISCSI_INITIATOR_NAME_VAR_NAME, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - EFI_VARIABLE_NON_VOLATILE | > > EFI_VARIABLE_BOOTSERVICE_ACCESS, > > - *BufferSize, > > - Buffer > > - ); > > - > > - return Status; > > -} > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > deleted file mode 100644 > > index d924a8b82427..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > +++ /dev/null > > @@ -1,948 +0,0 @@ > > -/** @file > > - Miscellaneous routines for iSCSI driver. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] = > > "0123456789ABCDEFabcdef"; > > - > > -/** > > - Removes (trims) specified leading and trailing characters from a > string. > > - > > - @param[in, out] Str Pointer to the null-terminated string to be > trimmed. > > On return, > > - Str will hold the trimmed string. > > - > > - @param[in] CharC Character will be trimmed from str. > > -**/ > > -VOID > > -StrTrim ( > > - IN OUT CHAR16 *Str, > > - IN CHAR16 CharC > > - ) > > -{ > > - CHAR16 *Pointer1; > > - CHAR16 *Pointer2; > > - > > - if (*Str == 0) { > > - return; > > - } > > - > > - // > > - // Trim off the leading and trailing characters c > > - // > > - for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); > Pointer1++) { > > - ; > > - } > > - > > - Pointer2 = Str; > > - if (Pointer2 == Pointer1) { > > - while (*Pointer1 != 0) { > > - Pointer2++; > > - Pointer1++; > > - } > > - } else { > > - while (*Pointer1 != 0) { > > - *Pointer2 = *Pointer1; > > - Pointer1++; > > - Pointer2++; > > - } > > - *Pointer2 = 0; > > - } > > - > > - > > - for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 > == CharC; > > Pointer1--) { > > - ; > > - } > > - if (Pointer1 != Str + StrLen(Str) - 1) { > > - *(Pointer1 + 1) = 0; > > - } > > -} > > - > > -/** > > - Calculate the prefix length of the IPv4 subnet mask. > > - > > - @param[in] SubnetMask The IPv4 subnet mask. > > - > > - @return The prefix length of the subnet mask. > > - @retval 0 Other errors as indicated. > > -**/ > > -UINT8 > > -IScsiGetSubnetMaskPrefixLength ( > > - IN EFI_IPv4_ADDRESS *SubnetMask > > - ) > > -{ > > - UINT8 Len; > > - UINT32 ReverseMask; > > - > > - // > > - // The SubnetMask is in network byte order. > > - // > > - ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << > > 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]); > > - > > - // > > - // Reverse it. > > - // > > - ReverseMask = ~ReverseMask; > > - > > - if ((ReverseMask & (ReverseMask + 1)) != 0) { > > - return 0; > > - } > > - > > - Len = 0; > > - > > - while (ReverseMask != 0) { > > - ReverseMask = ReverseMask >> 1; > > - Len++; > > - } > > - > > - return (UINT8) (32 - Len); > > -} > > - > > -/** > > - Convert the hexadecimal encoded LUN string into the 64-bit LUN. > > - > > - @param[in] Str The hexadecimal encoded LUN string. > > - @param[out] Lun Storage to return the 64-bit LUN. > > - > > - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. > > - @retval EFI_INVALID_PARAMETER The string is malformatted. > > -**/ > > -EFI_STATUS > > -IScsiAsciiStrToLun ( > > - IN CHAR8 *Str, > > - OUT UINT8 *Lun > > - ) > > -{ > > - UINTN Index, IndexValue, IndexNum, SizeStr; > > - CHAR8 TemStr[2]; > > - UINT8 TemValue; > > - UINT16 Value[4]; > > - > > - ZeroMem (Lun, 8); > > - ZeroMem (TemStr, 2); > > - ZeroMem ((UINT8 *) Value, sizeof (Value)); > > - SizeStr = AsciiStrLen (Str); > > - IndexValue = 0; > > - IndexNum = 0; > > - > > - for (Index = 0; Index < SizeStr; Index ++) { > > - TemStr[0] = Str[Index]; > > - TemValue = (UINT8) AsciiStrHexToUint64 (TemStr); > > - if (TemValue == 0 && TemStr[0] != '0') { > > - if ((TemStr[0] != '-') || (IndexNum == 0)) { > > - // > > - // Invalid Lun Char > > - // > > - return EFI_INVALID_PARAMETER; > > - } > > - } > > - > > - if ((TemValue == 0) && (TemStr[0] == '-')) { > > - // > > - // Next Lun value > > - // > > - if (++IndexValue >= 4) { > > - // > > - // Max 4 Lun value > > - // > > - return EFI_INVALID_PARAMETER; > > - } > > - // > > - // Restart str index for the next lun value > > - // > > - IndexNum = 0; > > - continue; > > - } > > - > > - if (++IndexNum > 4) { > > - // > > - // Each Lun Str can't exceed size 4, because it will be as UINT16 > value > > - // > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // > > - // Combine UINT16 value > > - // > > - Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue); > > - } > > - > > - for (Index = 0; Index <= IndexValue; Index ++) { > > - *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]); > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Convert the 64-bit LUN into the hexadecimal encoded LUN string. > > - > > - @param[in] Lun The 64-bit LUN. > > - @param[out] Str The storage to return the hexadecimal encoded LUN > > string. > > -**/ > > -VOID > > -IScsiLunToUnicodeStr ( > > - IN UINT8 *Lun, > > - OUT CHAR16 *Str > > - ) > > -{ > > - UINTN Index; > > - CHAR16 *TempStr; > > - > > - TempStr = Str; > > - > > - for (Index = 0; Index < 4; Index++) { > > - > > - if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) { > > - CopyMem(TempStr, L"0-", sizeof (L"0-")); > > - } else { > > - TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4]; > > - TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F]; > > - TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4]; > > - TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F]; > > - TempStr[4] = L'-'; > > - TempStr[5] = 0; > > - > > - StrTrim (TempStr, L'0'); > > - } > > - > > - TempStr += StrLen (TempStr); > > - } > > - > > - ASSERT (StrLen(Str) >= 1); > > - Str[StrLen (Str) - 1] = 0; > > - > > - for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) { > > - if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) { > > - Str[Index - 1] = 0; > > - } else { > > - break; > > - } > > - } > > -} > > - > > -/** > > - Convert the ASCII string into a UNICODE string. > > - > > - @param[in] Source The ASCII string. > > - @param[out] Destination The storage to return the UNICODE string. > > - > > - @return CHAR16 * Pointer to the UNICODE string. > > -**/ > > -CHAR16 * > > -IScsiAsciiStrToUnicodeStr ( > > - IN CHAR8 *Source, > > - OUT CHAR16 *Destination > > - ) > > -{ > > - ASSERT (Destination != NULL); > > - ASSERT (Source != NULL); > > - > > - while (*Source != '\0') { > > - *(Destination++) = (CHAR16) *(Source++); > > - } > > - > > - *Destination = '\0'; > > - > > - return Destination; > > -} > > - > > -/** > > - Convert the UNICODE string into an ASCII string. > > - > > - @param[in] Source The UNICODE string. > > - @param[out] Destination The storage to return the ASCII string. > > - > > - @return CHAR8 * Pointer to the ASCII string. > > -**/ > > -CHAR8 * > > -IScsiUnicodeStrToAsciiStr ( > > - IN CHAR16 *Source, > > - OUT CHAR8 *Destination > > - ) > > -{ > > - ASSERT (Destination != NULL); > > - ASSERT (Source != NULL); > > - > > - while (*Source != '\0') { > > - // > > - // If any Unicode characters in Source contain > > - // non-zero value in the upper 8 bits, then ASSERT(). > > - // > > - ASSERT (*Source < 0x100); > > - *(Destination++) = (CHAR8) *(Source++); > > - } > > - > > - *Destination = '\0'; > > - > > - return Destination; > > -} > > - > > -/** > > - Convert the decimal dotted IPv4 address into the binary IPv4 address. > > - > > - @param[in] Str The UNICODE string. > > - @param[out] Ip The storage to return the ASCII string. > > - > > - @retval EFI_SUCCESS The binary IP address is returned in Ip. > > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > > -**/ > > -EFI_STATUS > > -IScsiAsciiStrToIp ( > > - IN CHAR8 *Str, > > - OUT EFI_IPv4_ADDRESS *Ip > > - ) > > -{ > > - UINTN Index; > > - UINTN Number; > > - > > - Index = 0; > > - > > - while (*Str != 0) { > > - > > - if (Index > 3) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Number = 0; > > - while (NET_IS_DIGIT (*Str)) { > > - Number = Number * 10 + (*Str - '0'); > > - Str++; > > - } > > - > > - if (Number > 0xFF) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Ip->Addr[Index] = (UINT8) Number; > > - > > - if ((*Str != '\0') && (*Str != '.')) { > > - // > > - // The current character should be either the NULL terminator or > > - // the dot delimiter. > > - // > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (*Str == '.') { > > - // > > - // Skip the delimiter. > > - // > > - Str++; > > - } > > - > > - Index++; > > - } > > - > > - if (Index != 4) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Convert the mac address into a hexadecimal encoded "-" seperated > string. > > - > > - @param[in] Mac The mac address. > > - @param[in] Len Length in bytes of the mac address. > > - @param[in] VlanId VLAN ID of the network device. > > - @param[out] Str The storage to return the mac string. > > -**/ > > -VOID > > -IScsiMacAddrToStr ( > > - IN EFI_MAC_ADDRESS *Mac, > > - IN UINT32 Len, > > - IN UINT16 VlanId, > > - OUT CHAR16 *Str > > - ) > > -{ > > - UINT32 Index; > > - CHAR16 *String; > > - > > - for (Index = 0; Index < Len; Index++) { > > - Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> > 4) & > > 0x0F]; > > - Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & > 0x0F]; > > - Str[3 * Index + 2] = L'-'; > > - } > > - > > - String = &Str[3 * Index - 1] ; > > - if (VlanId != 0) { > > - String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", > (UINTN) > > VlanId); > > - } > > - > > - *String = L'\0'; > > -} > > - > > -/** > > - Convert the binary encoded buffer into a hexadecimal encoded string. > > - > > - @param[in] BinBuffer The buffer containing the binary data. > > - @param[in] BinLength Length of the binary buffer. > > - @param[in, out] HexStr Pointer to the string. > > - @param[in, out] HexLength The length of the string. > > - > > - @retval EFI_SUCCESS The binary data is converted to the > hexadecimal > > string > > - and the length of the string is updated. > > - @retval EFI_BUFFER_TOO_SMALL The string is too small. > > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > > -**/ > > -EFI_STATUS > > -IScsiBinToHex ( > > - IN UINT8 *BinBuffer, > > - IN UINT32 BinLength, > > - IN OUT CHAR8 *HexStr, > > - IN OUT UINT32 *HexLength > > - ) > > -{ > > - UINTN Index; > > - > > - if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (((*HexLength) - 3) < BinLength * 2) { > > - *HexLength = BinLength * 2 + 3; > > - return EFI_BUFFER_TOO_SMALL; > > - } > > - > > - *HexLength = BinLength * 2 + 3; > > - // > > - // Prefix for Hex String > > - // > > - HexStr[0] = '0'; > > - HexStr[1] = 'x'; > > - > > - for (Index = 0; Index < BinLength; Index++) { > > - HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4]; > > - HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F]; > > - } > > - > > - HexStr[Index * 2 + 2] = '\0'; > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Convert the hexadecimal string into a binary encoded buffer. > > - > > - @param[in, out] BinBuffer The binary buffer. > > - @param[in, out] BinLength Length of the binary buffer. > > - @param[in] HexStr The hexadecimal string. > > - > > - @retval EFI_SUCCESS The hexadecimal string is converted into > a binary > > - encoded buffer. > > - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold > the > > converted data. > > -**/ > > -EFI_STATUS > > -IScsiHexToBin ( > > - IN OUT UINT8 *BinBuffer, > > - IN OUT UINT32 *BinLength, > > - IN CHAR8 *HexStr > > - ) > > -{ > > - UINTN Index; > > - UINTN Length; > > - UINT8 Digit; > > - CHAR8 TemStr[2]; > > - > > - ZeroMem (TemStr, sizeof (TemStr)); > > - > > - // > > - // Find out how many hex characters the string has. > > - // > > - if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) > { > > - HexStr += 2; > > - } > > - > > - Length = AsciiStrLen (HexStr); > > - > > - for (Index = 0; Index < Length; Index ++) { > > - TemStr[0] = HexStr[Index]; > > - Digit = (UINT8) AsciiStrHexToUint64 (TemStr); > > - if (Digit == 0 && TemStr[0] != '0') { > > - // > > - // Invalid Lun Char > > - // > > - break; > > - } > > - if ((Index & 1) == 0) { > > - BinBuffer [Index/2] = Digit; > > - } else { > > - BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + > Digit); > > - } > > - } > > - > > - *BinLength = (UINT32) ((Index + 1)/2); > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Generate random numbers. > > - > > - @param[in, out] Rand The buffer to contain random numbers. > > - @param[in] RandLength The length of the Rand buffer. > > -**/ > > -VOID > > -IScsiGenRandom ( > > - IN OUT UINT8 *Rand, > > - IN UINTN RandLength > > - ) > > -{ > > - UINT32 Random; > > - > > - while (RandLength > 0) { > > - Random = NET_RANDOM (NetRandomInitSeed ()); > > - *Rand++ = (UINT8) (Random); > > - RandLength--; > > - } > > -} > > - > > -/** > > - Create the iSCSI driver data.. > > - > > - @param[in] Image The handle of the driver image. > > - @param[in] Controller The handle of the controller. > > - > > - @return The iSCSI driver data created. > > - @retval NULL Other errors as indicated. > > -**/ > > -ISCSI_DRIVER_DATA * > > -IScsiCreateDriverData ( > > - IN EFI_HANDLE Image, > > - IN EFI_HANDLE Controller > > - ) > > -{ > > - ISCSI_DRIVER_DATA *Private; > > - EFI_STATUS Status; > > - > > - Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA)); > > - if (Private == NULL) { > > - return NULL; > > - } > > - > > - Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE; > > - Private->Image = Image; > > - Private->Controller = Controller; > > - > > - // > > - // Create an event to be signal when the BS to RT transition is > triggerd so > > - // as to abort the iSCSI session. > > - // > > - Status = gBS->CreateEventEx ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_CALLBACK, > > - IScsiOnExitBootService, > > - Private, > > - &gEfiEventExitBootServicesGuid, > > - &Private->ExitBootServiceEvent > > - ); > > - if (EFI_ERROR (Status)) { > > - FreePool (Private); > > - return NULL; > > - } > > - > > - CopyMem(&Private->IScsiExtScsiPassThru, > > &gIScsiExtScsiPassThruProtocolTemplate, > > sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL)); > > - > > - // > > - // 0 is designated to the TargetId, so use another value for the > AdapterId. > > - // > > - Private->ExtScsiPassThruMode.AdapterId = 2; > > - Private->ExtScsiPassThruMode.Attributes = > > EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | > > EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL; > > - Private->ExtScsiPassThruMode.IoAlign = 4; > > - Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode; > > - > > - // > > - // Install the Ext SCSI PASS THRU protocol. > > - // > > - Status = gBS->InstallProtocolInterface ( > > - &Private->ExtScsiPassThruHandle, > > - &gEfiExtScsiPassThruProtocolGuid, > > - EFI_NATIVE_INTERFACE, > > - &Private->IScsiExtScsiPassThru > > - ); > > - if (EFI_ERROR (Status)) { > > - gBS->CloseEvent (Private->ExitBootServiceEvent); > > - FreePool (Private); > > - > > - return NULL; > > - } > > - > > - IScsiSessionInit (&Private->Session, FALSE); > > - > > - return Private; > > -} > > - > > -/** > > - Clean the iSCSI driver data. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCESS The clean operation is successful. > > - @retval Others Other errors as indicated. > > - > > -**/ > > -EFI_STATUS > > -IScsiCleanDriverData ( > > - IN ISCSI_DRIVER_DATA *Private > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - Status = EFI_SUCCESS; > > - > > - if (Private->DevicePath != NULL) { > > - Status = gBS->UninstallProtocolInterface ( > > - Private->ExtScsiPassThruHandle, > > - &gEfiDevicePathProtocolGuid, > > - Private->DevicePath > > - ); > > - if (EFI_ERROR (Status)) { > > - goto EXIT; > > - } > > - > > - FreePool (Private->DevicePath); > > - } > > - > > - if (Private->ExtScsiPassThruHandle != NULL) { > > - Status = gBS->UninstallProtocolInterface ( > > - Private->ExtScsiPassThruHandle, > > - &gEfiExtScsiPassThruProtocolGuid, > > - &Private->IScsiExtScsiPassThru > > - ); > > - } > > - > > -EXIT: > > - if (Private->ExitBootServiceEvent != NULL) { > > - gBS->CloseEvent (Private->ExitBootServiceEvent); > > - } > > - > > - FreePool (Private); > > - return Status; > > -} > > - > > -/** > > - Check wheather the Controller is configured to use DHCP protocol. > > - > > - @param[in] Controller The handle of the controller. > > - > > - @retval TRUE The handle of the controller need > the Dhcp > > protocol. > > - @retval FALSE The handle of the controller does > not need the > > Dhcp protocol. > > - > > -**/ > > -BOOLEAN > > -IScsiDhcpIsConfigured ( > > - IN EFI_HANDLE Controller > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_MAC_ADDRESS MacAddress; > > - UINTN HwAddressSize; > > - UINT16 VlanId; > > - CHAR16 MacString[70]; > > - ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp; > > - > > - // > > - // Get the mac string, it's the name of various variable > > - // > > - Status = NetLibGetMacAddress (Controller, &MacAddress, > > &HwAddressSize); > > - if (EFI_ERROR (Status)) { > > - return FALSE; > > - } > > - VlanId = NetLibGetVlanId (Controller); > > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > > MacString); > > - > > - // > > - // Get the normal configuration. > > - // > > - Status = GetVariable2 ( > > - MacString, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - (VOID**)&ConfigDataTmp, > > - NULL > > - ); > > - if (ConfigDataTmp == NULL || EFI_ERROR (Status)) { > > - return FALSE; > > - } > > - > > - if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) { > > - FreePool (ConfigDataTmp); > > - return TRUE; > > - } > > - > > - FreePool (ConfigDataTmp); > > - return FALSE; > > -} > > - > > -/** > > - Get the various configuration data of this iSCSI instance. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCESS The configuration of this instance is got. > > - @retval EFI_ABORTED The operation was aborted. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiGetConfigData ( > > - IN ISCSI_DRIVER_DATA *Private > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_SESSION *Session; > > - UINTN BufferSize; > > - EFI_MAC_ADDRESS MacAddress; > > - UINTN HwAddressSize; > > - UINT16 VlanId; > > - CHAR16 MacString[70]; > > - > > - // > > - // get the iSCSI Initiator Name > > - // > > - Session = &Private->Session; > > - Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE; > > - Status = gIScsiInitiatorName.Get ( > > - &gIScsiInitiatorName, > > - &Session->InitiatorNameLength, > > - Session->InitiatorName > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // Get the mac string, it's the name of various variable > > - // > > - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, > > &HwAddressSize); > > - ASSERT (Status == EFI_SUCCESS); > > - VlanId = NetLibGetVlanId (Private->Controller); > > - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, > > MacString); > > - > > - // > > - // Get the normal configuration. > > - // > > - BufferSize = sizeof (Session->ConfigData.NvData); > > - Status = gRT->GetVariable ( > > - MacString, > > - &gEfiIScsiInitiatorNameProtocolGuid, > > - NULL, > > - &BufferSize, > > - &Session->ConfigData.NvData > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - if (!Session->ConfigData.NvData.Enabled) { > > - return EFI_ABORTED; > > - } > > - // > > - // Get the CHAP Auth information. > > - // > > - BufferSize = sizeof (Session->AuthData.AuthConfig); > > - Status = gRT->GetVariable ( > > - MacString, > > - &gIScsiCHAPAuthInfoGuid, > > - NULL, > > - &BufferSize, > > - &Session->AuthData.AuthConfig > > - ); > > - > > - if (!EFI_ERROR (Status) && Session- > > >ConfigData.NvData.InitiatorInfoFromDhcp) { > > - // > > - // Start dhcp. > > - // > > - Status = IScsiDoDhcp (Private->Image, Private->Controller, > &Session- > > >ConfigData); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Get the device path of the iSCSI tcp connection and update it. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @return The updated device path. > > - @retval NULL Other errors as indicated. > > -**/ > > -EFI_DEVICE_PATH_PROTOCOL * > > -IScsiGetTcpConnDevicePath ( > > - IN ISCSI_DRIVER_DATA *Private > > - ) > > -{ > > - ISCSI_SESSION *Session; > > - ISCSI_CONNECTION *Conn; > > - TCP4_IO *Tcp4Io; > > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > > - EFI_STATUS Status; > > - EFI_DEV_PATH *DPathNode; > > - > > - Session = &Private->Session; > > - if (Session->State != SESSION_STATE_LOGGED_IN) { > > - return NULL; > > - } > > - > > - Conn = NET_LIST_USER_STRUCT_S ( > > - Session->Conns.ForwardLink, > > - ISCSI_CONNECTION, > > - Link, > > - ISCSI_CONNECTION_SIGNATURE > > - ); > > - Tcp4Io = &Conn->Tcp4Io; > > - > > - Status = gBS->HandleProtocol ( > > - Tcp4Io->Handle, > > - &gEfiDevicePathProtocolGuid, > > - (VOID **)&DevicePath > > - ); > > - if (EFI_ERROR (Status)) { > > - return NULL; > > - } > > - // > > - // Duplicate it. > > - // > > - DevicePath = DuplicateDevicePath (DevicePath); > > - if (DevicePath == NULL) { > > - return NULL; > > - } > > - > > - DPathNode = (EFI_DEV_PATH *) DevicePath; > > - > > - while (!IsDevicePathEnd (&DPathNode->DevPath)) { > > - if ((DevicePathType (&DPathNode->DevPath) == > > MESSAGING_DEVICE_PATH) && > > - (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP) > > - ) { > > - > > - DPathNode->Ipv4.LocalPort = 0; > > - DPathNode->Ipv4.StaticIpAddress = > > - (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp); > > - > > - // > > - // Add a judgement here to support previous versions of > > IPv4_DEVICE_PATH. > > - // In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress > and > > SubnetMask > > - // do not exist. > > - // In new version of IPv4_DEVICE_PATH, structcure length is 27. > > - // > > - if (DevicePathNodeLength (&DPathNode->Ipv4) == > > IP4_NODE_LEN_NEW_VERSIONS) { > > - > > - IP4_COPY_ADDRESS ( > > - &DPathNode->Ipv4.GatewayIpAddress, > > - &Session->ConfigData.NvData.Gateway > > - ); > > - > > - IP4_COPY_ADDRESS ( > > - &DPathNode->Ipv4.SubnetMask, > > - &Session->ConfigData.NvData.SubnetMask > > - ); > > - } > > - > > - break; > > - } > > - > > - DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode- > > >DevPath); > > - } > > - > > - return DevicePath; > > -} > > - > > -/** > > - Abort the session when the transition from BS to RT is initiated. > > - > > - @param[in] Event The event signaled. > > - @param[in] Context The iSCSI driver data. > > -**/ > > -VOID > > -EFIAPI > > -IScsiOnExitBootService ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ) > > -{ > > - ISCSI_DRIVER_DATA *Private; > > - > > - Private = (ISCSI_DRIVER_DATA *) Context; > > - > > - gBS->CloseEvent (Private->ExitBootServiceEvent); > > - Private->ExitBootServiceEvent = NULL; > > - > > - IScsiSessionAbort (&Private->Session); > > -} > > - > > -/** > > - Tests whether a controller handle is being managed by IScsi driver. > > - > > - This function tests whether the driver specified by > DriverBindingHandle is > > - currently managing the controller specified by ControllerHandle. > This test > > - is performed by evaluating if the the protocol specified by > ProtocolGuid is > > - present on ControllerHandle and is was opened by DriverBindingHandle > > and Nic > > - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. > > - If ProtocolGuid is NULL, then ASSERT(). > > - > > - @param ControllerHandle A handle for a controller to test. > > - @param DriverBindingHandle Specifies the driver binding handle for > the > > - driver. > > - @param ProtocolGuid Specifies the protocol that the driver > specified > > - by DriverBindingHandle opens in its > Start() > > - function. > > - > > - @retval EFI_SUCCESS ControllerHandle is managed by the > driver > > - specified by DriverBindingHandle. > > - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the > > driver > > - specified by DriverBindingHandle. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiTestManagedDevice ( > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE DriverBindingHandle, > > - IN EFI_GUID *ProtocolGuid > > - ) > > -{ > > - EFI_STATUS Status; > > - VOID *ManagedInterface; > > - EFI_HANDLE NicControllerHandle; > > - > > - ASSERT (ProtocolGuid != NULL); > > - > > - NicControllerHandle = NetLibGetNicHandle (ControllerHandle, > > ProtocolGuid); > > - if (NicControllerHandle == NULL) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - (EFI_GUID *) ProtocolGuid, > > - &ManagedInterface, > > - DriverBindingHandle, > > - NicControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (!EFI_ERROR (Status)) { > > - gBS->CloseProtocol ( > > - ControllerHandle, > > - (EFI_GUID *) ProtocolGuid, > > - DriverBindingHandle, > > - NicControllerHandle > > - ); > > - return EFI_UNSUPPORTED; > > - } > > - > > - if (Status != EFI_ALREADY_STARTED) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - return EFI_SUCCESS; > > -} > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > deleted file mode 100644 > > index b4a5c2d02413..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > +++ /dev/null > > @@ -1,2799 +0,0 @@ > > -/** @file > > - The implementation of iSCSI protocol based on RFC3720. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -UINT32 mDataSegPad = 0; > > - > > -/** > > - Attach the iSCSI connection to the iSCSI session. > > - > > - @param[in, out] Session The iSCSI session. > > - @param[in, out] Conn The iSCSI connection. > > -**/ > > -VOID > > -IScsiAttatchConnection ( > > - IN OUT ISCSI_SESSION *Session, > > - IN OUT ISCSI_CONNECTION *Conn > > - ) > > -{ > > - InsertTailList (&Session->Conns, &Conn->Link); > > - Conn->Session = Session; > > - Session->NumConns++; > > -} > > - > > -/** > > - Detach the iSCSI connection from the session it belongs to. > > - > > - @param[in, out] Conn The iSCSI connection. > > -**/ > > -VOID > > -IScsiDetatchConnection ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ) > > -{ > > - RemoveEntryList (&Conn->Link); > > - Conn->Session->NumConns--; > > - Conn->Session = NULL; > > -} > > - > > -/** > > - Check the sequence number according to RFC3720. > > - > > - @param[in, out] ExpSN The currently expected sequence number. > > - @param[in] NewSN The sequence number to check. > > - > > - @retval EFI_SUCCESS The check passed and the ExpSN is > increased. > > - @retval EFI_NOT_READY Response was sent due to a retransmission > > request. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > > happened. > > -**/ > > -EFI_STATUS > > -IScsiCheckSN ( > > - IN OUT UINT32 *ExpSN, > > - IN UINT32 NewSN > > - ) > > -{ > > - if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) { > > - if (ISCSI_SEQ_LT (NewSN, *ExpSN)) { > > - // > > - // Duplicate > > - // > > - return EFI_NOT_READY; > > - } else { > > - return EFI_PROTOCOL_ERROR; > > - } > > - } else { > > - // > > - // Advance the ExpSN > > - // > > - (*ExpSN)++; > > - return EFI_SUCCESS; > > - } > > -} > > - > > -/** > > - Update the sequence numbers for the iSCSI command. > > - > > - @param[in, out] Session The iSCSI session. > > - @param[in] MaxCmdSN Maximum CmdSN from the target. > > - @param[in] ExpCmdSN Next expected CmdSN from the target. > > -**/ > > -VOID > > -IScsiUpdateCmdSN ( > > - IN OUT ISCSI_SESSION *Session, > > - IN UINT32 MaxCmdSN, > > - IN UINT32 ExpCmdSN > > - ) > > -{ > > - if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) { > > - return ; > > - } > > - > > - if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) { > > - Session->MaxCmdSN = MaxCmdSN; > > - } > > - > > - if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) { > > - Session->ExpCmdSN = ExpCmdSN; > > - } > > -} > > - > > -/** > > - This function does the iSCSI connection login. > > - > > - @param[in, out] Conn The iSCSI connection to login. > > - > > - @retval EFI_SUCCESS The iSCSI connection is logged into the > iSCSI > > target. > > - @retval EFI_TIMEOUT Timeout happened during the login > procedure. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiConnLogin ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - // > > - // Start the timer, wait 16 seconds to establish the TCP connection. > > - // > > - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 * > > TICKS_PER_SECOND); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - // > > - // try to establish the tcp connection > > - // > > - Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0); > > - Conn->State = CONN_STATE_IN_LOGIN; > > - > > - // > > - // connection is established, start the iSCSI Login > > - // > > - do { > > - Status = IScsiSendLoginReq (Conn); > > - if (EFI_ERROR (Status)) { > > - break; > > - } > > - > > - Status = IScsiReceiveLoginRsp (Conn); > > - if (EFI_ERROR (Status)) { > > - break; > > - } > > - } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE); > > - > > - return Status; > > -} > > - > > -/** > > - Reset the iSCSI connection. > > - > > - @param[in, out] Conn The iSCSI connection to reset. > > -**/ > > -VOID > > -IScsiConnReset ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ) > > -{ > > - Tcp4IoReset (&Conn->Tcp4Io); > > -} > > - > > -/** > > - Create a TCP connection for the iSCSI session. > > - > > - @param[in] Private The iSCSI driver data. > > - @param[in] Session Maximum CmdSN from the target. > > - > > - @return The newly created iSCSI connection. > > -**/ > > -ISCSI_CONNECTION * > > -IScsiCreateConnection ( > > - IN ISCSI_DRIVER_DATA *Private, > > - IN ISCSI_SESSION *Session > > - ) > > -{ > > - ISCSI_CONNECTION *Conn; > > - TCP4_IO_CONFIG_DATA Tcp4IoConfig; > > - EFI_STATUS Status; > > - > > - Conn = AllocatePool (sizeof (ISCSI_CONNECTION)); > > - if (Conn == NULL) { > > - return NULL; > > - } > > - > > - Conn->Signature = ISCSI_CONNECTION_SIGNATURE; > > - Conn->State = CONN_STATE_FREE; > > - Conn->CurrentStage = ISCSI_SECURITY_NEGOTIATION; > > - Conn->NextStage = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION; > > - Conn->CHAPStep = ISCSI_CHAP_INITIAL; > > - Conn->ExpStatSN = 0; > > - Conn->PartialReqSent = FALSE; > > - Conn->PartialRspRcvd = FALSE; > > - Conn->Cid = Session->NextCid++; > > - > > - Status = gBS->CreateEvent ( > > - EVT_TIMER, > > - TPL_CALLBACK, > > - NULL, > > - NULL, > > - &Conn->TimeoutEvent > > - ); > > - if (EFI_ERROR (Status)) { > > - FreePool (Conn); > > - return NULL; > > - } > > - > > - NetbufQueInit (&Conn->RspQue); > > - > > - // > > - // set the default connection-only parameters > > - // > > - Conn->MaxRecvDataSegmentLength = > > DEFAULT_MAX_RECV_DATA_SEG_LEN; > > - Conn->HeaderDigest = IScsiDigestNone; > > - Conn->DataDigest = IScsiDigestNone; > > - > > - CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp, > > sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&Tcp4IoConfig.SubnetMask, &Session- > > >ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&Tcp4IoConfig.Gateway, &Session- > > >ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&Tcp4IoConfig.RemoteIp, &Session- > > >ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS)); > > - > > - Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort; > > - > > - // > > - // Create the tcp4 IO for this connection > > - // > > - Status = Tcp4IoCreateSocket ( > > - Private->Image, > > - Private->Controller, > > - &Tcp4IoConfig, > > - &Conn->Tcp4Io > > - ); > > - if (EFI_ERROR (Status)) { > > - gBS->CloseEvent (Conn->TimeoutEvent); > > - FreePool (Conn); > > - Conn = NULL; > > - } > > - > > - return Conn; > > -} > > - > > -/** > > - Destroy an iSCSI connection. > > - > > - @param[in] Conn The connection to destroy. > > -**/ > > -VOID > > -IScsiDestroyConnection ( > > - IN ISCSI_CONNECTION *Conn > > - ) > > -{ > > - Tcp4IoDestroySocket (&Conn->Tcp4Io); > > - NetbufQueFlush (&Conn->RspQue); > > - gBS->CloseEvent (Conn->TimeoutEvent); > > - FreePool (Conn); > > -} > > - > > -/** > > - Login the iSCSI session. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCESS The iSCSI session login procedure > finished. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NO_MEDIA There was a media error. > > - @retval Others Other errors as indicated. > > - > > -**/ > > -EFI_STATUS > > -IScsiSessionLogin ( > > - IN ISCSI_DRIVER_DATA *Private > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_SESSION *Session; > > - ISCSI_CONNECTION *Conn; > > - EFI_TCP4_PROTOCOL *Tcp4; > > - EFI_STATUS MediaStatus; > > - > > - Session = &Private->Session; > > - > > - // > > - // Check media status before session login > > - // > > - MediaStatus = EFI_SUCCESS; > > - NetLibDetectMediaWaitTimeout (Private->Controller, > > ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus); > > - if (MediaStatus != EFI_SUCCESS) { > > - return EFI_NO_MEDIA; > > - } > > - > > - // > > - // Set session identifier > > - // > > - CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6); > > - > > - // > > - // Create a connection for the session. > > - // > > - Conn = IScsiCreateConnection (Private, Session); > > - if (Conn == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - IScsiAttatchConnection (Session, Conn); > > - > > - // > > - // Login througth the newly created connection. > > - // > > - Status = IScsiConnLogin (Conn); > > - if (EFI_ERROR (Status)) { > > - IScsiConnReset (Conn); > > - IScsiDetatchConnection (Conn); > > - IScsiDestroyConnection (Conn); > > - } else { > > - Session->State = SESSION_STATE_LOGGED_IN; > > - > > - gBS->OpenProtocol ( > > - Conn->Tcp4Io.Handle, > > - &gEfiTcp4ProtocolGuid, > > - (VOID **)&Tcp4, > > - Private->Image, > > - Private->ExtScsiPassThruHandle, > > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > > - ); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Build and send the iSCSI login request to the iSCSI target according > to > > - the current login stage. > > - > > - @param[in] Conn The connection in the iSCSI login phase. > > - > > - @retval EFI_SUCCESS The iSCSI login request PDU is built and > sent on > > this > > - connection. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_DEVICE_ERROR Some kind of device error happened. > > -**/ > > -EFI_STATUS > > -IScsiSendLoginReq ( > > - IN ISCSI_CONNECTION *Conn > > - ) > > -{ > > - NET_BUF *Pdu; > > - EFI_STATUS Status; > > - > > - // > > - // build the Login Request PDU > > - // > > - Pdu = IScsiPrepareLoginReq (Conn); > > - if (Pdu == NULL) { > > - return EFI_DEVICE_ERROR; > > - } > > - // > > - // Send it to the iSCSI target. > > - // > > - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); > > - > > - NetbufFree (Pdu); > > - > > - return Status; > > -} > > - > > -/** > > - Receive and process the iSCSI login response. > > - > > - @param[in] Conn The connection in the iSCSI login phase. > > - > > - @retval EFI_SUCCESS The iSCSI login response PDU is received > and > > processed. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiReceiveLoginRsp ( > > - IN ISCSI_CONNECTION *Conn > > - ) > > -{ > > - EFI_STATUS Status; > > - NET_BUF *Pdu; > > - > > - Pdu = NULL; > > - > > - // > > - // Receive the iSCSI login response. > > - // > > - Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - // > > - // A Login Response is received, process it. > > - // > > - ASSERT (Pdu != NULL); > > - Status = IScsiProcessLoginRsp (Conn, Pdu); > > - > > - NetbufFree (Pdu); > > - > > - return Status; > > -} > > - > > -/** > > - Add an iSCSI key-value pair as a string into the data segment of the > Login > > Request PDU. > > - The DataSegmentLength and the actual size of the net buffer > containing > > this PDU will be > > - updated. > > - > > - @param[in, out] Pdu The iSCSI PDU whose data segment the > key- > > value pair will > > - be added to. > > - @param[in] Key The key name string. > > - @param[in] Value The value string. > > - > > - @retval EFI_SUCCESS The key-valu pair is added to the PDU's > > datasegment and > > - the correspondence length fields are > updated. > > - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to > > add the key-value > > - pair. > > -**/ > > -EFI_STATUS > > -IScsiAddKeyValuePair ( > > - IN OUT NET_BUF *Pdu, > > - IN CHAR8 *Key, > > - IN CHAR8 *Value > > - ) > > -{ > > - UINT32 DataSegLen; > > - UINT32 KeyLen; > > - UINT32 ValueLen; > > - UINT32 TotalLen; > > - ISCSI_LOGIN_REQUEST *LoginReq; > > - CHAR8 *Data; > > - > > - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL); > > - if (LoginReq == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - DataSegLen = NTOH24 (LoginReq->DataSegmentLength); > > - > > - KeyLen = (UINT32) AsciiStrLen (Key); > > - ValueLen = (UINT32) AsciiStrLen (Value); > > - > > - // > > - // 1 byte for the key value separator '=' and 1 byte for the null > > - // delimiter after the value. > > - // > > - TotalLen = KeyLen + 1 + ValueLen + 1; > > - > > - // > > - // Allocate the space for the key-value pair. > > - // > > - Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL); > > - if (Data == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - // > > - // Add the key. > > - // > > - CopyMem (Data, Key, KeyLen); > > - Data += KeyLen; > > - > > - *Data = '='; > > - Data++; > > - > > - // > > - // Add the value. > > - // > > - CopyMem (Data, Value, ValueLen); > > - Data += ValueLen; > > - > > - *Data = '\0'; > > - > > - // > > - // update the DataSegmentLength > > - // > > - ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen); > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Prepare the iSCSI login request to be sent according to the current > login > > status. > > - > > - @param[in, out] Conn The connection in the iSCSI login phase. > > - > > - @return The pointer to the net buffer containing the iSCSI login > request > > built. > > - @retval Others Other errors as indicated. > > -**/ > > -NET_BUF * > > -IScsiPrepareLoginReq ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ) > > -{ > > - ISCSI_SESSION *Session; > > - NET_BUF *Nbuf; > > - ISCSI_LOGIN_REQUEST *LoginReq; > > - EFI_STATUS Status; > > - > > - Session = Conn->Session; > > - > > - Nbuf = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) + > > DEFAULT_MAX_RECV_DATA_SEG_LEN); > > - if (Nbuf == NULL) { > > - return NULL; > > - } > > - > > - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof > > (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL); > > - ASSERT (LoginReq != NULL); > > - ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST)); > > - > > - // > > - // Init the login request pdu > > - // > > - ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ, > > ISCSI_REQ_IMMEDIATE); > > - ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage); > > - LoginReq->VersionMax = ISCSI_VERSION_MAX; > > - LoginReq->VersionMin = ISCSI_VERSION_MIN; > > - LoginReq->Tsih = HTONS (Session->Tsih); > > - LoginReq->InitiatorTaskTag = HTONL (Session->InitiatorTaskTag); > > - LoginReq->Cid = HTONS (Conn->Cid); > > - LoginReq->CmdSN = HTONL (Session->CmdSN); > > - > > - // > > - // For the first Login Request on a coonection this is ExpStatSN for > the > > - // old connection and this field is only valid if the Login Request > restarts > > - // a connection. > > - // For subsequent Login Requests it is used to acknowledge the Login > > Responses > > - // with their increasing StatSN values. > > - // > > - LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN); > > - CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid)); > > - > > - if (Conn->PartialRspRcvd) { > > - // > > - // A partial response, initiator must send an empty Login Request. > > - // > > - return Nbuf; > > - } > > - > > - switch (Conn->CurrentStage) { > > - case ISCSI_SECURITY_NEGOTIATION: > > - Status = IScsiCHAPToSendReq (Conn, Nbuf); > > - break; > > - > > - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: > > - Status = IScsiFillOpParams (Conn, Nbuf); > > - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > > - break; > > - > > - default: > > - // > > - // something error happens... > > - // > > - Status = EFI_DEVICE_ERROR; > > - break; > > - } > > - > > - if (EFI_ERROR (Status)) { > > - NetbufFree (Nbuf); > > - Nbuf = NULL; > > - } else { > > - // > > - // Pad the data segment if needed. > > - // > > - IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq)); > > - // > > - // Check whether we will issue the stage transition signal? > > - // > > - Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq, > > ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); > > - } > > - > > - return Nbuf; > > -} > > - > > -/** > > - Process the iSCSI Login Response. > > - > > - @param[in, out] Conn The connection on which the iSCSI login > response is > > received. > > - @param[in, out] Pdu The iSCSI login response PDU. > > - > > - @retval EFI_SUCCESS The iSCSI login response PDU is processed > and all > > check are passed. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > > happened. > > - @retval EFI_MEDIA_CHANGED Target is redirected. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiProcessLoginRsp ( > > - IN OUT ISCSI_CONNECTION *Conn, > > - IN OUT NET_BUF *Pdu > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_SESSION *Session; > > - ISCSI_LOGIN_RESPONSE *LoginRsp; > > - BOOLEAN Transit; > > - BOOLEAN Continue; > > - UINT8 CurrentStage; > > - UINT8 NextStage; > > - UINT8 *DataSeg; > > - UINT32 DataSegLen; > > - > > - Session = Conn->Session; > > - > > - LoginRsp = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL); > > - if (LoginRsp == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) { > > - // > > - // It's not a Login Response > > - // > > - return EFI_PROTOCOL_ERROR; > > - } > > - // > > - // Get the data segment if any. > > - // > > - DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp); > > - if (DataSegLen != 0) { > > - DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL); > > - } else { > > - DataSeg = NULL; > > - } > > - // > > - // Check the status class in the login response PDU. > > - // > > - switch (LoginRsp->StatusClass) { > > - case ISCSI_LOGIN_STATUS_SUCCESS: > > - // > > - // Just break here, the response and the data segment will be > processed > > later. > > - // > > - break; > > - > > - case ISCSI_LOGIN_STATUS_REDIRECTION: > > - // > > - // The target may be moved to a different address > > - // > > - if (DataSeg == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - // > > - // Process the TargetAddress key-value strings in the data segment > to > > update the > > - // target address info. > > - // > > - Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg, > > DataSegLen); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - // > > - // Session will be restarted on this error status because the > Target is > > - // redirected by this Login Response. > > - // > > - return EFI_MEDIA_CHANGED; > > - > > - default: > > - // > > - // Initiator Error, Target Error, or any other undefined error code. > > - // > > - return EFI_PROTOCOL_ERROR; > > - } > > - // > > - // The status is sucess, extract the wanted fields from the header > segment. > > - // > > - Transit = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, > > ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT); > > - Continue = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, > > ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE); > > - > > - CurrentStage = (UINT8) ISCSI_GET_CURRENT_STAGE > (LoginRsp); > > - NextStage = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp); > > - > > - LoginRsp->InitiatorTaskTag = NTOHL (LoginRsp->InitiatorTaskTag); > > - > > - if ((Transit && Continue) || > > - (CurrentStage != Conn->CurrentStage) || > > - (!Conn->TransitInitiated && Transit) || > > - (Transit && (NextStage != Conn->NextStage)) || > > - (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp- > >Isid)) != > > 0) || > > - (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag) > > - ) { > > - // > > - // A Login Response with the C bit set to 1 MUST have the T bit set > to 0; > > - // The CSG in the Login Response MUST be the same with the I-end of > this > > connection; > > - // The T bit can't be 1 if the last Login Response sent by the > initiator > > doesn't > > - // initiate the transistion; > > - // The NSG MUST be the same with the I-end of this connection if > Transit > > is required. > > - // The ISID in the Login Response MUST be the same with this > session. > > - // > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - LoginRsp->StatSN = NTOHL (LoginRsp->StatSN); > > - LoginRsp->ExpCmdSN = NTOHL (LoginRsp->ExpCmdSN); > > - LoginRsp->MaxCmdSN = NTOHL (LoginRsp->MaxCmdSN); > > - > > - if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn- > > >CHAPStep == ISCSI_CHAP_INITIAL)) { > > - // > > - // If the Login Request is a leading Login Request, the target MUST > use > > - // the value presented in CmdSN as the target value for ExpCmdSN. > > - // > > - if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN != > > LoginRsp->ExpCmdSN)) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - // > > - // It's the initial Login Response, initialize the local ExpStatSN, > MaxCmdSN > > - // and ExpCmdSN. > > - // > > - Conn->ExpStatSN = LoginRsp->StatSN + 1; > > - Session->MaxCmdSN = LoginRsp->MaxCmdSN; > > - Session->ExpCmdSN = LoginRsp->ExpCmdSN; > > - } else { > > - // > > - // Check the StatSN of this PDU > > - // > > - Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN); > > - if (!EFI_ERROR (Status)) { > > - // > > - // Update the MaxCmdSN and ExpCmdSN > > - // > > - IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp- > > >ExpCmdSN); > > - } else { > > - return Status; > > - } > > - } > > - // > > - // Trim off the header segment. > > - // > > - NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD); > > - > > - // > > - // Queue this login response first in case it's a partial response so > that > > - // later when the full response list is received we can combine these > > scattered > > - // responses' data segment and then process it. > > - // > > - NET_GET_REF (Pdu); > > - NetbufQueAppend (&Conn->RspQue, Pdu); > > - > > - Conn->PartialRspRcvd = Continue; > > - if (Continue) { > > - // > > - // It's a partial response, have to wait for another or more > > Request/Response > > - // conversations to get the full response. > > - // > > - return EFI_SUCCESS; > > - } > > - > > - switch (CurrentStage) { > > - case ISCSI_SECURITY_NEGOTIATION: > > - // > > - // In security negotiation stage, let CHAP module handle it. > > - // > > - Status = IScsiCHAPOnRspReceived (Conn); > > - break; > > - > > - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: > > - // > > - // Response received with negotiation resonse on iSCSI parameters, > check > > them. > > - // > > - Status = IScsiCheckOpParams (Conn); > > - break; > > - > > - default: > > - // > > - // Should never get here. > > - // > > - Status = EFI_PROTOCOL_ERROR; > > - break; > > - } > > - > > - if (Transit && (Status == EFI_SUCCESS)) { > > - // > > - // Do the state transition. > > - // > > - Conn->CurrentStage = Conn->NextStage; > > - > > - if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) { > > - Conn->NextStage = ISCSI_FULL_FEATURE_PHASE; > > - } else { > > - // > > - // CurrentStage is iSCSI Full Feature, it's the Login-Final > Response, > > - // get the TSIH from the Login Response. > > - // > > - Session->Tsih = NTOHS (LoginRsp->Tsih); > > - } > > - } > > - // > > - // Flush the response(s) received. > > - // > > - NetbufQueFlush (&Conn->RspQue); > > - > > - return Status; > > -} > > - > > -/** > > - Updated the target information according the data received in the > iSCSI > > - login response with an target redirection status. > > - > > - @param[in, out] Session The iSCSI session. > > - @param[in] Data The data segment which should contain > the > > - TargetAddress key-value list. > > - @param[in] Len Length of the data. > > - > > - @retval EFI_SUCCESS The target address is updated. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NOT_FOUND The TargetAddress key is not found. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiUpdateTargetAddress ( > > - IN OUT ISCSI_SESSION *Session, > > - IN CHAR8 *Data, > > - IN UINT32 Len > > - ) > > -{ > > - LIST_ENTRY *KeyValueList; > > - CHAR8 *TargetAddress; > > - CHAR8 *IpStr; > > - EFI_STATUS Status; > > - UINTN Number; > > - > > - KeyValueList = IScsiBuildKeyValueList (Data, Len); > > - if (KeyValueList == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Status = EFI_NOT_FOUND; > > - > > - while (TRUE) { > > - TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_TARGET_ADDRESS); > > - if (TargetAddress == NULL) { > > - break; > > - } > > - > > - if (!NET_IS_DIGIT (TargetAddress[0])) { > > - // > > - // The domainname of the target may be presented in three formats: > a > > DNS host name, > > - // a dotted-decimal IPv4 address, or a bracketed IPv6 address. > Only > > accept dotted > > - // IPv4 address. > > - // > > - continue; > > - } > > - > > - IpStr = TargetAddress; > > - > > - while ((*TargetAddress != 0) && (*TargetAddress != ':') && > > (*TargetAddress != ',')) { > > - // > > - // NULL, ':' or ',' ends the IPv4 string. > > - // > > - TargetAddress++; > > - } > > - > > - if (*TargetAddress == ',') { > > - // > > - // Comma and the portal group tag MUST be ommitted if the > > TargetAddress is sent > > - // as the result of a redirection. > > - // > > - continue; > > - } else if (*TargetAddress == ':') { > > - *TargetAddress = '\0'; > > - > > - TargetAddress++; > > - > > - Number = AsciiStrDecimalToUintn (TargetAddress); > > - if (Number > 0xFFFF) { > > - continue; > > - } else { > > - Session->ConfigData.NvData.TargetPort = (UINT16) Number; > > - } > > - } else { > > - // > > - // The string only contains the IPv4 address. Use the well known > port. > > - // > > - Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT; > > - } > > - // > > - // Update the target IP address. > > - // > > - Status = IScsiAsciiStrToIp (IpStr, &Session- > >ConfigData.NvData.TargetIp); > > - if (EFI_ERROR (Status)) { > > - continue; > > - } else { > > - break; > > - } > > - } > > - > > - IScsiFreeKeyValueList (KeyValueList); > > - > > - return Status; > > -} > > - > > -/** > > - The callback function to free the net buffer list. > > - > > - @param[in] Arg The opaque parameter. > > -**/ > > -VOID > > -EFIAPI > > -IScsiFreeNbufList ( > > - VOID *Arg > > - ) > > -{ > > - ASSERT (Arg != NULL); > > - > > - NetbufFreeList ((LIST_ENTRY *) Arg); > > - FreePool (Arg); > > -} > > - > > -/** > > - The callback function called in NetBufFree, it does nothing. > > - > > - @param[in] Arg The opaque parameter. > > -**/ > > -VOID > > -EFIAPI > > -IScsiNbufExtFree ( > > - VOID *Arg > > - ) > > -{ > > -} > > - > > -/** > > - Receive an iSCSI response PDU. An iSCSI response PDU contains an > iSCSI > > PDU header and > > - an optional data segment. The two parts will be put into two blocks > of > > buffers in the > > - net buffer. The digest check will be conducted in this function if > needed > > and the digests > > - will be trimmed from the PDU buffer. > > - > > - @param[in] Conn The iSCSI connection to receive data from. > > - @param[out] Pdu The received iSCSI pdu. > > - @param[in] Context The context used to describe information on > the > > caller provided > > - buffer to receive data segment of the iSCSI > pdu, it's optional. > > - @param[in] HeaderDigest Whether there will be header digest received. > > - @param[in] DataDigest Whether there will be data digest. > > - @param[in] TimeoutEvent The timeout event, it's optional. > > - > > - @retval EFI_SUCCESS An iSCSI pdu is received. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > > happened. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiReceivePdu ( > > - IN ISCSI_CONNECTION *Conn, > > - OUT NET_BUF **Pdu, > > - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL > > - IN BOOLEAN HeaderDigest, > > - IN BOOLEAN DataDigest, > > - IN EFI_EVENT TimeoutEvent OPTIONAL > > - ) > > -{ > > - LIST_ENTRY *NbufList; > > - UINT32 Len; > > - NET_BUF *PduHdr; > > - UINT8 *Header; > > - EFI_STATUS Status; > > - UINT32 PadLen; > > - UINT32 InDataOffset; > > - NET_FRAGMENT Fragment[2]; > > - UINT32 FragmentCount; > > - NET_BUF *DataSeg; > > - UINT32 PadAndCRC32[2]; > > - > > - NbufList = AllocatePool (sizeof (LIST_ENTRY)); > > - if (NbufList == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - InitializeListHead (NbufList); > > - > > - // > > - // The header digest will be received together with the PDU header if > > exists. > > - // > > - Len = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof > (UINT32) : 0); > > - PduHdr = NetbufAlloc (Len); > > - if (PduHdr == NULL) { > > - FreePool (NbufList); > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL); > > - ASSERT (Header != NULL); > > - InsertTailList (NbufList, &PduHdr->List); > > - > > - // > > - // First step, receive the BHS of the PDU. > > - // > > - Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - if (HeaderDigest) { > > - // > > - // TODO: check the header-digest. > > - // > > - // > > - // Trim off the digest. > > - // > > - NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL); > > - } > > - > > - Len = ISCSI_GET_DATASEG_LEN (Header); > > - if (Len == 0) { > > - // > > - // No data segment.Form the pdu from a list of pdu segments. > > - // > > - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, > NbufList); > > - if (*Pdu == NULL) { > > - Status = EFI_OUT_OF_RESOURCES; > > - goto ON_EXIT; > > - } > > - return Status; > > - } > > - // > > - // Get the length of the padding bytes of the data segment. > > - // > > - PadLen = ISCSI_GET_PAD_LEN (Len); > > - > > - switch (ISCSI_GET_OPCODE (Header)) { > > - case ISCSI_OPCODE_SCSI_DATA_IN: > > - // > > - // Try to use the buffer described by Context if the PDU is an > > - // iSCSI SCSI data in pdu so as to reduce memory copy overhead. > > - // > > - InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header); > > - if ((Context == NULL) || ((InDataOffset + Len) > Context- > >InDataLen)) { > > - Status = EFI_PROTOCOL_ERROR; > > - goto ON_EXIT; > > - } > > - > > - Fragment[0].Len = Len; > > - Fragment[0].Bulk = Context->InData + InDataOffset; > > - > > - if (DataDigest || (PadLen != 0)) { > > - // > > - // The data segment is padded, use two fragments to receive it. > > - // The first to receive the useful data. The second to receive > the padding. > > - // > > - Fragment[1].Len = PadLen + (DataDigest ? sizeof (UINT32) : 0); > > - Fragment[1].Bulk = (UINT8 *)PadAndCRC32 + (4 - PadLen); > > - FragmentCount = 2; > > - } else { > > - FragmentCount = 1; > > - } > > - > > - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, > > IScsiNbufExtFree, NULL); > > - if (DataSeg == NULL) { > > - Status = EFI_OUT_OF_RESOURCES; > > - goto ON_EXIT; > > - } > > - > > - break; > > - > > - case ISCSI_OPCODE_SCSI_RSP: > > - case ISCSI_OPCODE_NOP_IN: > > - case ISCSI_OPCODE_LOGIN_RSP: > > - case ISCSI_OPCODE_TEXT_RSP: > > - case ISCSI_OPCODE_ASYNC_MSG: > > - case ISCSI_OPCODE_REJECT: > > - case ISCSI_OPCODE_VENDOR_T0: > > - case ISCSI_OPCODE_VENDOR_T1: > > - case ISCSI_OPCODE_VENDOR_T2: > > - // > > - // Allocate buffer to receive the data segment. > > - // > > - Len += PadLen + (DataDigest ? sizeof (UINT32) : 0); > > - DataSeg = NetbufAlloc (Len); > > - if (DataSeg == NULL) { > > - Status = EFI_OUT_OF_RESOURCES; > > - goto ON_EXIT; > > - } > > - > > - NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL); > > - break; > > - > > - default: > > - Status = EFI_PROTOCOL_ERROR; > > - goto ON_EXIT; > > - } > > - > > - InsertTailList (NbufList, &DataSeg->List); > > - > > - // > > - // Receive the data segment with the data digest if any. > > - // > > - Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - if (DataDigest) { > > - // > > - // TODO: Check the data digest. > > - // > > - NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL); > > - } > > - > > - if (PadLen != 0) { > > - // > > - // Trim off the padding bytes in the data segment. > > - // > > - NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL); > > - } > > - > > - // > > - // Form the pdu from a list of pdu segments. > > - // > > - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, > NbufList); > > - if (*Pdu == NULL) { > > - Status = EFI_OUT_OF_RESOURCES; > > - } > > - > > -ON_EXIT: > > - > > - if (EFI_ERROR (Status)) { > > - // > > - // Free the Nbufs in this NbufList and the NbufList itself. > > - // > > - IScsiFreeNbufList (NbufList); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Check and get the result of the prameter negotiation. > > - > > - @param[in, out] Conn The connection in iSCSI login. > > - > > - @retval EFI_SUCCESS The parmeter check is passed and > negotiation is > > finished. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > > happened. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > -**/ > > -EFI_STATUS > > -IScsiCheckOpParams ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ) > > -{ > > - EFI_STATUS Status; > > - LIST_ENTRY *KeyValueList; > > - CHAR8 *Data; > > - UINT32 Len; > > - ISCSI_SESSION *Session; > > - CHAR8 *Value; > > - UINTN NumericValue; > > - > > - ASSERT (Conn->RspQue.BufNum != 0); > > - > > - Session = Conn->Session; > > - > > - Len = Conn->RspQue.BufSize; > > - Data = AllocatePool (Len); > > - if (Data == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data); > > - > > - Status = EFI_PROTOCOL_ERROR; > > - > > - // > > - // Extract the Key-Value pairs into a list. > > - // > > - KeyValueList = IScsiBuildKeyValueList (Data, Len); > > - if (KeyValueList == NULL) { > > - FreePool (Data); > > - return Status; > > - } > > - // > > - // HeaderDigest > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_HEADER_DIGEST); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - if (AsciiStrCmp (Value, "CRC32") == 0) { > > - if (Conn->HeaderDigest != IScsiDigestCRC32) { > > - goto ON_ERROR; > > - } > > - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { > > - Conn->HeaderDigest = IScsiDigestNone; > > - } else { > > - goto ON_ERROR; > > - } > > - // > > - // DataDigest > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_DATA_DIGEST); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - if (AsciiStrCmp (Value, "CRC32") == 0) { > > - if (Conn->DataDigest != IScsiDigestCRC32) { > > - goto ON_ERROR; > > - } > > - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { > > - Conn->DataDigest = IScsiDigestNone; > > - } else { > > - goto ON_ERROR; > > - } > > - // > > - // ErrorRecoveryLevel, result fuction is Minimum. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_ERROR_RECOVERY_LEVEL); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - NumericValue = AsciiStrDecimalToUintn (Value); > > - if (NumericValue > 2) { > > - goto ON_ERROR; > > - } > > - > > - Session->ErrorRecoveryLevel = (UINT8) MIN (Session- > >ErrorRecoveryLevel, > > NumericValue); > > - > > - // > > - // InitialR2T, result function is OR. > > - // > > - if (!Session->InitialR2T) { > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_INITIAL_R2T); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); > > - } > > - > > - // > > - // ImmediateData, result function is AND. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_IMMEDIATE_DATA); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && > > (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0)); > > - > > - // > > - // MaxRecvDataSegmentLength is declarative. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH); > > - if (Value != NULL) { > > - Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn > > (Value); > > - } > > - // > > - // MaxBurstLength, result funtion is Mininum. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_MAX_BURST_LENGTH); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - NumericValue = AsciiStrDecimalToUintn (Value); > > - Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength, > > NumericValue); > > - > > - // > > - // FirstBurstLength, result function is Minimum. Irrelevant when > > InitialR2T=Yes and > > - // ImmediateData=No. > > - // This Key/Value is negotiation type. > > - // > > - if (!(Session->InitialR2T && !Session->ImmediateData)) { > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_FIRST_BURST_LENGTH); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - NumericValue = AsciiStrDecimalToUintn (Value); > > - Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, > > NumericValue); > > - } > > - > > - // > > - // MaxConnections, result function is Minimum. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_MAX_CONNECTIONS); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - NumericValue = AsciiStrDecimalToUintn (Value); > > - if ((NumericValue == 0) || (NumericValue > 65535)) { > > - goto ON_ERROR; > > - } > > - > > - Session->MaxConnections = (UINT32) MIN (Session->MaxConnections, > > NumericValue); > > - > > - // > > - // DataPDUInOrder, result function is OR. > > - // > > - if (!Session->DataPDUInOrder) { > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_DATA_PDU_IN_ORDER); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == > 0); > > - } > > - > > - // > > - // DataSequenceInorder, result function is OR. > > - // > > - if (!Session->DataSequenceInOrder) { > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") > > == 0); > > - } > > - > > - // > > - // DefaultTime2Wait, result function is Maximum. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_DEFAULT_TIME2WAIT); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - NumericValue = AsciiStrDecimalToUintn (Value); > > - if (NumericValue == 0) { > > - Session->DefaultTime2Wait = 0; > > - } else if (NumericValue > 3600) { > > - goto ON_ERROR; > > - } else { > > - Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait, > > NumericValue); > > - } > > - // > > - // DefaultTime2Retain, result function is Minimum. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_DEFAULT_TIME2RETAIN); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - NumericValue = AsciiStrDecimalToUintn (Value); > > - if (NumericValue == 0) { > > - Session->DefaultTime2Retain = 0; > > - } else if (NumericValue > 3600) { > > - goto ON_ERROR; > > - } else { > > - Session->DefaultTime2Retain = (UINT32) MIN (Session- > > >DefaultTime2Retain, NumericValue); > > - } > > - // > > - // MaxOutstandingR2T, result function is Minimum. > > - // > > - Value = IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_MAX_OUTSTANDING_R2T); > > - if (Value == NULL) { > > - goto ON_ERROR; > > - } > > - > > - NumericValue = AsciiStrDecimalToUintn (Value); > > - if ((NumericValue == 0) || (NumericValue > 65535)) { > > - goto ON_ERROR; > > - } > > - > > - Session->MaxOutstandingR2T = (UINT16) MIN (Session- > > >MaxOutstandingR2T, NumericValue); > > - > > - // > > - // Remove declarative key-value pairs, if any. > > - // > > - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE); > > - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS); > > - IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); > > - // > > - // Remove the key-value that may not needed for result function is OR. > > - // > > - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T); > > - IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_DATA_PDU_IN_ORDER); > > - IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); > > - > > - // > > - // Remove irrelevant parameter, if any. > > - // > > - if (Session->InitialR2T && !Session->ImmediateData) { > > - IScsiGetValueByKeyFromList (KeyValueList, > > ISCSI_KEY_FIRST_BURST_LENGTH); > > - } > > - > > - if (IsListEmpty (KeyValueList)) { > > - // > > - // Succeed if no more keys in the list. > > - // > > - Status = EFI_SUCCESS; > > - } > > - > > -ON_ERROR: > > - > > - IScsiFreeKeyValueList (KeyValueList); > > - > > - FreePool (Data); > > - > > - return Status; > > -} > > - > > -/** > > - Fill the oprational prameters. > > - > > - @param[in] Conn The connection in iSCSI login. > > - @param[in, out] Pdu The iSCSI login request PDU to fill the > parameters. > > - > > - @retval EFI_SUCCESS The parmeters are filled into the iSCSI > login > > request PDU. > > -**/ > > -EFI_STATUS > > -IScsiFillOpParams ( > > - IN ISCSI_CONNECTION *Conn, > > - IN OUT NET_BUF *Pdu > > - ) > > -{ > > - ISCSI_SESSION *Session; > > - CHAR8 Value[256]; > > - > > - Session = Conn->Session; > > - > > - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest == > > IScsiDigestCRC32) ? "None,CRC32" : "None"); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest == > > IScsiDigestCRC32) ? "None,CRC32" : "None"); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", Session- > >ErrorRecoveryLevel); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? > "Yes" : "No"); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? > "Yes" : > > "No"); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", > > MAX_RECV_DATA_SEG_LEN_IN_FFP); > > - IScsiAddKeyValuePair (Pdu, > > ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? > "Yes" : > > "No"); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%a", Session- > >DataSequenceInOrder ? > > "Yes" : "No"); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER, > > Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", Session- > >DefaultTime2Retain); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value); > > - > > - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T); > > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value); > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Pad the iSCSI AHS or data segment to an integer number of 4 byte > words. > > - > > - @param[in, out] Pdu The iSCSI pdu which contains segments to > pad. > > - @param[in] Len The length of the last semgnet in the > PDU. > > - > > - @retval EFI_SUCCESS The segment is padded or no need to pad > it. > > - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free > > space to add the > > - padding bytes. > > -**/ > > -EFI_STATUS > > -IScsiPadSegment ( > > - IN OUT NET_BUF *Pdu, > > - IN UINT32 Len > > - ) > > -{ > > - UINT32 PadLen; > > - UINT8 *Data; > > - > > - PadLen = ISCSI_GET_PAD_LEN (Len); > > - > > - if (PadLen != 0) { > > - Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL); > > - if (Data == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - ZeroMem (Data, PadLen); > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Build a key-value list from the data segment. > > - > > - @param[in] Data The data segment containing the key-value pairs. > > - @param[in] Len Length of the data segment. > > - > > - @return The key-value list. > > - @retval NULL Other errors as indicated. > > -**/ > > -LIST_ENTRY * > > -IScsiBuildKeyValueList ( > > - IN CHAR8 *Data, > > - IN UINT32 Len > > - ) > > -{ > > - LIST_ENTRY *ListHead; > > - ISCSI_KEY_VALUE_PAIR *KeyValuePair; > > - > > - ListHead = AllocatePool (sizeof (LIST_ENTRY)); > > - if (ListHead == NULL) { > > - return NULL; > > - } > > - > > - InitializeListHead (ListHead); > > - > > - while (Len > 0) { > > - KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR)); > > - if (KeyValuePair == NULL) { > > - goto ON_ERROR; > > - } > > - > > - InitializeListHead (&KeyValuePair->List); > > - > > - KeyValuePair->Key = Data; > > - > > - while ((Len > 0) && (*Data != '=')) { > > - Len--; > > - Data++; > > - } > > - > > - if (*Data == '=') { > > - *Data = '\0'; > > - > > - Data++; > > - Len--; > > - } else { > > - FreePool (KeyValuePair); > > - goto ON_ERROR; > > - } > > - > > - KeyValuePair->Value = Data; > > - > > - InsertTailList (ListHead, &KeyValuePair->List);; > > - > > - Data += AsciiStrLen (KeyValuePair->Value) + 1; > > - Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1; > > - } > > - > > - return ListHead; > > - > > -ON_ERROR: > > - > > - IScsiFreeKeyValueList (ListHead); > > - > > - return NULL; > > -} > > - > > -/** > > - Get the value string by the key name from the key-value list. If > found, > > - the key-value entry will be removed from the list. > > - > > - @param[in, out] KeyValueList The key-value list. > > - @param[in] Key The key name to find. > > - > > - @return The value string. > > -**/ > > -CHAR8 * > > -IScsiGetValueByKeyFromList ( > > - IN OUT LIST_ENTRY *KeyValueList, > > - IN CHAR8 *Key > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - ISCSI_KEY_VALUE_PAIR *KeyValuePair; > > - CHAR8 *Value; > > - > > - Value = NULL; > > - > > - NET_LIST_FOR_EACH (Entry, KeyValueList) { > > - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, > > List); > > - > > - if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) { > > - Value = KeyValuePair->Value; > > - > > - RemoveEntryList (&KeyValuePair->List); > > - FreePool (KeyValuePair); > > - break; > > - } > > - } > > - > > - return Value; > > -} > > - > > -/** > > - Free the key-value list. > > - > > - @param[in] KeyValueList The key-value list. > > -**/ > > -VOID > > -IScsiFreeKeyValueList ( > > - IN LIST_ENTRY *KeyValueList > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - ISCSI_KEY_VALUE_PAIR *KeyValuePair; > > - > > - while (!IsListEmpty (KeyValueList)) { > > - Entry = NetListRemoveHead (KeyValueList); > > - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, > > List); > > - > > - FreePool (KeyValuePair); > > - } > > - > > - FreePool (KeyValueList); > > -} > > - > > -/** > > - Normalize the iSCSI name according to RFC. > > - > > - @param[in, out] Name The iSCSI name. > > - @param[in] Len length of the iSCSI name. > > - > > - @retval EFI_SUCCESS The iSCSI name is valid and normalized. > > - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in > > the IQN format. > > -**/ > > -EFI_STATUS > > -IScsiNormalizeName ( > > - IN OUT CHAR8 *Name, > > - IN UINTN Len > > - ) > > -{ > > - UINTN Index; > > - > > - for (Index = 0; Index < Len; Index++) { > > - if (NET_IS_UPPER_CASE_CHAR (Name[Index])) { > > - // > > - // Convert the upper-case characters to lower-case ones > > - // > > - Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a'); > > - } > > - > > - if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) && > > - !NET_IS_DIGIT (Name[Index]) && > > - (Name[Index] != '-') && > > - (Name[Index] != '.') && > > - (Name[Index] != ':') > > - ) { > > - // > > - // ASCII dash, dot, colon lower-case characters and digit > characters > > - // are allowed. > > - // > > - return EFI_PROTOCOL_ERROR; > > - } > > - } > > - > > - if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) { > > - // > > - // Only IQN format is accepted now. > > - // > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Create an iSCSI task control block. > > - > > - @param[in] Conn The connection on which the task control > block will > > be created. > > - @param[out] Tcb The newly created task control block. > > - > > - @retval EFI_SUCCESS The task control block is created. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NOT_READY The target can not accept new commands. > > -**/ > > -EFI_STATUS > > -IScsiNewTcb ( > > - IN ISCSI_CONNECTION *Conn, > > - OUT ISCSI_TCB **Tcb > > - ) > > -{ > > - ISCSI_SESSION *Session; > > - ISCSI_TCB *NewTcb; > > - > > - ASSERT (Tcb != NULL); > > - > > - Session = Conn->Session; > > - > > - if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) { > > - return EFI_NOT_READY; > > - } > > - > > - NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB)); > > - if (NewTcb == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - InitializeListHead (&NewTcb->Link); > > - > > - NewTcb->SoFarInOrder = TRUE; > > - NewTcb->InitiatorTaskTag = Session->InitiatorTaskTag; > > - NewTcb->CmdSN = Session->CmdSN; > > - NewTcb->Conn = Conn; > > - > > - InsertTailList (&Session->TcbList, &NewTcb->Link); > > - > > - // > > - // Advance the initiator task tag. > > - // > > - Session->InitiatorTaskTag++; > > - Session->CmdSN++; > > - > > - *Tcb = NewTcb; > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Delete the tcb from the connection and destroy it. > > - > > - @param[in] Tcb The tcb to delete. > > -**/ > > -VOID > > -IScsiDelTcb ( > > - IN ISCSI_TCB *Tcb > > - ) > > -{ > > - RemoveEntryList (&Tcb->Link); > > - > > - FreePool (Tcb); > > -} > > - > > - > > -/** > > - Create a data segment, pad it and calculate the CRC if needed. > > - > > - @param[in] Data The data to fill into the data segment. > > - @param[in] Len Length of the data. > > - @param[in] DataDigest Whether to calculate CRC for this data segment. > > - > > - @return The net buffer wrapping the data segment. > > -**/ > > -NET_BUF * > > -IScsiNewDataSegment ( > > - IN UINT8 *Data, > > - IN UINT32 Len, > > - IN BOOLEAN DataDigest > > - ) > > -{ > > - NET_FRAGMENT Fragment[2]; > > - UINT32 FragmentCount; > > - UINT32 PadLen; > > - NET_BUF *DataSeg; > > - > > - Fragment[0].Len = Len; > > - Fragment[0].Bulk = Data; > > - > > - PadLen = ISCSI_GET_PAD_LEN (Len); > > - if (PadLen != 0) { > > - Fragment[1].Len = PadLen; > > - Fragment[1].Bulk = (UINT8 *) &mDataSegPad; > > - > > - FragmentCount = 2; > > - } else { > > - FragmentCount = 1; > > - } > > - > > - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, > > IScsiNbufExtFree, NULL); > > - > > - return DataSeg; > > -} > > - > > -/** > > - Create a iSCSI SCSI command PDU to encapsulate the command issued > > - by SCSI through the EXT SCSI PASS THRU Protocol. > > - > > - @param[in] Packet The EXT SCSI PASS THRU request packet containing > the > > SCSI command. > > - @param[in] Lun The LUN. > > - @param[in] Tcb The tcb associated with this SCSI command. > > - > > - @return The created iSCSI SCSI command PDU. > > - @retval NULL Other errors as indicated. > > -**/ > > -NET_BUF * > > -IScsiNewScsiCmdPdu ( > > - IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, > > - IN UINT64 Lun, > > - IN ISCSI_TCB *Tcb > > - ) > > -{ > > - LIST_ENTRY *NbufList; > > - NET_BUF *Pdu; > > - NET_BUF *PduHeader; > > - NET_BUF *DataSeg; > > - SCSI_COMMAND *ScsiCmd; > > - UINT8 AHSLength; > > - UINT32 Length; > > - ISCSI_ADDITIONAL_HEADER *Header; > > - ISCSI_BI_EXP_READ_DATA_LEN_AHS *BiExpReadDataLenAHS; > > - ISCSI_SESSION *Session; > > - UINT32 ImmediateDataLen; > > - > > - AHSLength = 0; > > - > > - if (Packet->DataDirection == DataBi) { > > - // > > - // Bi directional Read/Write command, the bidirectional expected > > - // read data length AHS is required. > > - // > > - AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS); > > - } > > - > > - if (Packet->CdbLength > 16) { > > - // > > - // The CDB exceeds 16 bytes, an extended CDB AHS is required. > > - // > > - AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet- > > >CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER))); > > - } > > - > > - Length = sizeof (SCSI_COMMAND) + AHSLength; > > - PduHeader = NetbufAlloc (Length); > > - if (PduHeader == NULL) { > > - return NULL; > > - } > > - > > - ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length, > > NET_BUF_TAIL); > > - if (ScsiCmd == NULL) { > > - NetbufFree (PduHeader); > > - return NULL; > > - } > > - Header = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1); > > - > > - ZeroMem (ScsiCmd, Length); > > - > > - ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0); > > - ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE); > > - > > - // > > - // Set the READ/WRITE flags according to the IO type of this request. > > - // > > - switch (Packet->DataDirection) { > > - case DataIn: > > - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ); > > - ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength); > > - break; > > - > > - case DataOut: > > - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE); > > - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); > > - break; > > - > > - case DataBi: > > - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ | > > SCSI_CMD_PDU_FLAG_WRITE); > > - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); > > - > > - // > > - // Fill the bidirectional expected read data length AHS. > > - // > > - BiExpReadDataLenAHS = > (ISCSI_BI_EXP_READ_DATA_LEN_AHS > > *) Header; > > - Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1); > > - > > - BiExpReadDataLenAHS->Length = NTOHS (5); > > - BiExpReadDataLenAHS->Type = > > ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN; > > - BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet- > > >InTransferLength); > > - > > - break; > > - } > > - > > - ScsiCmd->TotalAHSLength = AHSLength; > > - CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun)); > > - ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag); > > - ScsiCmd->CmdSN = NTOHL (Tcb->CmdSN); > > - ScsiCmd->ExpStatSN = NTOHL (Tcb->Conn->ExpStatSN); > > - > > - CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb)); > > - > > - if (Packet->CdbLength > 16) { > > - Header->Length = NTOHS ((UINT16) (Packet->CdbLength - 15)); > > - Header->Type = ISCSI_AHS_TYPE_EXT_CDB; > > - > > - CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength > - > > 16); > > - } > > - > > - Pdu = PduHeader; > > - Session = Tcb->Conn->Session; > > - ImmediateDataLen = 0; > > - > > - if (Session->ImmediateData && (Packet->OutTransferLength != 0)) { > > - // > > - // Send immediate data in this SCSI Command PDU. The length of the > > immeidate > > - // data is the minimum of FirstBurstLength, the data length to be > xfered > > and > > - // the MaxRecvdataSegmentLength on this connection. > > - // > > - ImmediateDataLen = MIN (Session->FirstBurstLength, Packet- > > >OutTransferLength); > > - ImmediateDataLen = MIN (ImmediateDataLen, Tcb->Conn- > > >MaxRecvDataSegmentLength); > > - > > - // > > - // Update the data segment length in the PDU header. > > - // > > - ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen); > > - > > - // > > - // Create the data segment. > > - // > > - DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer, > > ImmediateDataLen, FALSE); > > - if (DataSeg == NULL) { > > - NetbufFree (PduHeader); > > - Pdu = NULL; > > - goto ON_EXIT; > > - } > > - > > - NbufList = AllocatePool (sizeof (LIST_ENTRY)); > > - if (NbufList == NULL) { > > - NetbufFree (PduHeader); > > - NetbufFree (DataSeg); > > - > > - Pdu = NULL; > > - goto ON_EXIT; > > - } > > - > > - InitializeListHead (NbufList); > > - InsertTailList (NbufList, &PduHeader->List); > > - InsertTailList (NbufList, &DataSeg->List); > > - > > - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, > NbufList); > > - if (Pdu == NULL) { > > - IScsiFreeNbufList (NbufList); > > - } > > - } > > - > > - if (Session->InitialR2T || > > - (ImmediateDataLen == Session->FirstBurstLength) || > > - (ImmediateDataLen == Packet->OutTransferLength) > > - ) { > > - // > > - // Unsolicited data out sequence is not allowed, > > - // or FirstBurstLength data is already sent out by immediate data > > - // or all the OUT data accompany this SCSI packet is sent as > > - // immediate data, the final flag should be set on this SCSI > Command > > - // PDU. > > - // > > - ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL); > > - } > > - > > -ON_EXIT: > > - > > - return Pdu; > > -} > > - > > -/** > > - Create a new iSCSI SCSI Data Out PDU. > > - > > - @param[in] Data The data to put into the Data Out PDU. > > - @param[in] Len Length of the data. > > - @param[in] DataSN The DataSN of the Data Out PDU. > > - @param[in] Tcb The task control block of this Data Out PDU. > > - @param[in] Lun The LUN. > > - > > - @return The net buffer wrapping the Data Out PDU. > > - @retval NULL Other errors as indicated. > > -**/ > > -NET_BUF * > > -IScsiNewDataOutPdu ( > > - IN UINT8 *Data, > > - IN UINT32 Len, > > - IN UINT32 DataSN, > > - IN ISCSI_TCB *Tcb, > > - IN UINT64 Lun > > - ) > > -{ > > - LIST_ENTRY *NbufList; > > - NET_BUF *PduHdr; > > - NET_BUF *DataSeg; > > - NET_BUF *Pdu; > > - ISCSI_SCSI_DATA_OUT *DataOutHdr; > > - ISCSI_XFER_CONTEXT *XferContext; > > - > > - NbufList = AllocatePool (sizeof (LIST_ENTRY)); > > - if (NbufList == NULL) { > > - return NULL; > > - } > > - > > - InitializeListHead (NbufList); > > - > > - // > > - // Allocate memory for the BHS. > > - // > > - PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT)); > > - if (PduHdr == NULL) { > > - FreePool (NbufList); > > - return NULL; > > - } > > - // > > - // Insert the BHS into the buffer list. > > - // > > - InsertTailList (NbufList, &PduHdr->List); > > - > > - DataOutHdr = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr, > > sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL); > > - ASSERT (DataOutHdr != NULL); > > - XferContext = &Tcb->XferContext; > > - > > - ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT)); > > - > > - // > > - // Set the flags and fields of the Data Out PDU BHS. > > - // > > - ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0); > > - ISCSI_SET_DATASEG_LEN (DataOutHdr, Len); > > - > > - DataOutHdr->InitiatorTaskTag = HTONL (Tcb->InitiatorTaskTag); > > - DataOutHdr->TargetTransferTag = HTONL (XferContext- > > >TargetTransferTag); > > - DataOutHdr->ExpStatSN = HTONL (Tcb->Conn->ExpStatSN); > > - DataOutHdr->DataSN = HTONL (DataSN); > > - DataOutHdr->BufferOffset = HTONL (XferContext->Offset); > > - > > - if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) { > > - CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun)); > > - } > > - // > > - // Build the data segment for this Data Out PDU. > > - // > > - DataSeg = IScsiNewDataSegment (Data, Len, FALSE); > > - if (DataSeg == NULL) { > > - IScsiFreeNbufList (NbufList); > > - return NULL; > > - } > > - // > > - // Put the data segment into the buffer list and combine it with the > BHS > > - // into a full Data Out PDU. > > - // > > - InsertTailList (NbufList, &DataSeg->List); > > - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); > > - if (Pdu == NULL) { > > - IScsiFreeNbufList (NbufList); > > - } > > - > > - return Pdu; > > -} > > - > > -/** > > - Generate a consecutive sequence of iSCSI SCSI Data Out PDUs. > > - > > - @param[in] Data The data which will be carried by the sequence of > iSCSI > > SCSI Data Out PDUs. > > - @param[in] Tcb The task control block of the data to send out. > > - @param[in] Lun The LUN the data will be sent to. > > - > > - @return A list of net buffers with each of them wraps an iSCSI SCSI > Data > > Out PDU. > > - @retval NULL Other errors as indicated. > > -**/ > > -LIST_ENTRY * > > -IScsiGenerateDataOutPduSequence ( > > - IN UINT8 *Data, > > - IN ISCSI_TCB *Tcb, > > - IN UINT64 Lun > > - ) > > -{ > > - LIST_ENTRY *PduList; > > - UINT32 DataSN; > > - UINT32 DataLen; > > - NET_BUF *DataOutPdu; > > - ISCSI_CONNECTION *Conn; > > - ISCSI_XFER_CONTEXT *XferContext; > > - UINT8 *DataOutPacket; > > - > > - PduList = AllocatePool (sizeof (LIST_ENTRY)); > > - if (PduList == NULL) { > > - return NULL; > > - } > > - > > - InitializeListHead (PduList); > > - > > - DataSN = 0; > > - Conn = Tcb->Conn; > > - DataOutPdu = NULL; > > - XferContext = &Tcb->XferContext; > > - > > - while (XferContext->DesiredLength > 0) { > > - // > > - // Determine the length of data this Data Out PDU can carry. > > - // > > - DataLen = MIN (XferContext->DesiredLength, Conn- > > >MaxRecvDataSegmentLength); > > - > > - // > > - // Create a Data Out PDU. > > - // > > - DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun); > > - if (DataOutPdu == NULL) { > > - IScsiFreeNbufList (PduList); > > - PduList = NULL; > > - > > - goto ON_EXIT; > > - } > > - > > - InsertTailList (PduList, &DataOutPdu->List); > > - > > - // > > - // Update the context and DataSN. > > - // > > - XferContext->Offset += DataLen; > > - XferContext->DesiredLength -= DataLen; > > - DataSN++; > > - Data += DataLen; > > - } > > - // > > - // Set the F bit for the last data out PDU in this sequence. > > - // > > - DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL); > > - if (DataOutPacket == NULL) { > > - IScsiFreeNbufList (PduList); > > - PduList = NULL; > > - goto ON_EXIT; > > - } > > - > > - ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL); > > - > > -ON_EXIT: > > - > > - return PduList; > > -} > > - > > -/** > > - Send the Data in a sequence of Data Out PDUs one by one. > > - > > - @param[in] Data The data to carry by Data Out PDUs. > > - @param[in] Lun The LUN the data will be sent to. > > - @param[in] Tcb The task control block. > > - > > - @retval EFI_SUCCES The data is sent out to the LUN. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiSendDataOutPduSequence ( > > - IN UINT8 *Data, > > - IN UINT64 Lun, > > - IN ISCSI_TCB *Tcb > > - ) > > -{ > > - LIST_ENTRY *DataOutPduList; > > - LIST_ENTRY *Entry; > > - NET_BUF *Pdu; > > - EFI_STATUS Status; > > - > > - // > > - // Generate the Data Out PDU sequence. > > - // > > - DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun); > > - if (DataOutPduList == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Status = EFI_SUCCESS; > > - > > - // > > - // Send the Data Out PDU's one by one. > > - // > > - NET_LIST_FOR_EACH (Entry, DataOutPduList) { > > - Pdu = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > > - > > - Status = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu); > > - if (EFI_ERROR (Status)) { > > - break; > > - } > > - } > > - > > - IScsiFreeNbufList (DataOutPduList); > > - > > - return Status; > > -} > > - > > -/** > > - Process the received iSCSI SCSI Data In PDU. > > - > > - @param[in] Pdu The Data In PDU received. > > - @param[in] Tcb The task control block. > > - @param[in, out] Packet The EXT SCSI PASS THRU request packet. > > - > > - @retval EFI_SUCCES The check on the Data IN PDU is passed > and > > some update > > - actions are taken. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > > happened. > > - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for > the > > request. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiOnDataInRcvd ( > > - IN NET_BUF *Pdu, > > - IN ISCSI_TCB *Tcb, > > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > > - ) > > -{ > > - ISCSI_SCSI_DATA_IN *DataInHdr; > > - EFI_STATUS Status; > > - > > - DataInHdr = (ISCSI_SCSI_DATA_IN *) NetbufGetByte > (Pdu, 0, > > NULL); > > - if (DataInHdr == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag); > > - DataInHdr->ExpCmdSN = NTOHL (DataInHdr->ExpCmdSN); > > - DataInHdr->MaxCmdSN = NTOHL (DataInHdr->MaxCmdSN); > > - DataInHdr->DataSN = NTOHL (DataInHdr->DataSN); > > - > > - // > > - // Check the DataSN. > > - // > > - Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - // > > - // Update the command related sequence numbers. > > - // > > - IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN, > > DataInHdr->ExpCmdSN); > > - > > - if (ISCSI_FLAG_ON (DataInHdr, > > SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) { > > - if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) { > > - // > > - // The S bit is on but the F bit is off. > > - // > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - Tcb->StatusXferd = TRUE; > > - > > - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW | > > SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) { > > - // > > - // Underflow and Overflow are mutual flags. > > - // > > - return EFI_PROTOCOL_ERROR; > > - } > > - // > > - // S bit is on, the StatSN is valid. > > - // > > - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr- > > >StatSN)); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Packet->HostAdapterStatus = 0; > > - Packet->TargetStatus = DataInHdr->Status; > > - > > - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { > > - Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount); > > - Status = EFI_BAD_BUFFER_SIZE; > > - } > > - > > - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { > > - Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount); > > - } > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Process the received iSCSI R2T PDU. > > - > > - @param[in] Pdu The R2T PDU received. > > - @param[in] Tcb The task control block. > > - @param[in] Lun The Lun. > > - @param[in, out] Packet The EXT SCSI PASS THRU request packet. > > - > > - @retval EFI_SUCCES The R2T PDU is valid and the solicited > data is sent > > out. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > > happened. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiOnR2TRcvd ( > > - IN NET_BUF *Pdu, > > - IN ISCSI_TCB *Tcb, > > - IN UINT64 Lun, > > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > > - ) > > -{ > > - ISCSI_READY_TO_TRANSFER *R2THdr; > > - EFI_STATUS Status; > > - ISCSI_XFER_CONTEXT *XferContext; > > - UINT8 *Data; > > - > > - R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL); > > - if (R2THdr == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag); > > - R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag); > > - R2THdr->StatSN = NTOHL (R2THdr->StatSN); > > - R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum); > > - R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset); > > - R2THdr->DesiredDataTransferLength = NTOHL (R2THdr- > > >DesiredDataTransferLength); > > - > > - if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) > || !ISCSI_SEQ_EQ > > (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) { > > - return EFI_PROTOCOL_ERROR;; > > - } > > - // > > - // Check the sequence number. > > - // > > - Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - XferContext = &Tcb->XferContext; > > - XferContext->TargetTransferTag = R2THdr->TargetTransferTag; > > - XferContext->Offset = R2THdr->BufferOffset; > > - XferContext->DesiredLength = R2THdr->DesiredDataTransferLength; > > - > > - if (((XferContext->Offset + XferContext->DesiredLength) > Packet- > > >OutTransferLength) || > > - (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength) > > - ) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - // > > - // Send the data solicited by this R2T. > > - // > > - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; > > - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); > > - > > - return Status; > > -} > > - > > -/** > > - Process the received iSCSI SCSI Response PDU. > > - > > - @param[in] Pdu The Response PDU received. > > - @param[in] Tcb The task control block. > > - @param[in, out] Packet The EXT SCSI PASS THRU request packet. > > - > > - @retval EFI_SUCCES The Response PDU is processed. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > > happened. > > - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for > the > > request. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiOnScsiRspRcvd ( > > - IN NET_BUF *Pdu, > > - IN ISCSI_TCB *Tcb, > > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > > - ) > > -{ > > - SCSI_RESPONSE *ScsiRspHdr; > > - ISCSI_SENSE_DATA *SenseData; > > - EFI_STATUS Status; > > - UINT32 DataSegLen; > > - > > - ScsiRspHdr = (SCSI_RESPONSE *) NetbufGetByte (Pdu, > 0, NULL); > > - if (ScsiRspHdr == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - ScsiRspHdr->InitiatorTaskTag = NTOHL (ScsiRspHdr->InitiatorTaskTag); > > - if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - ScsiRspHdr->StatSN = NTOHL (ScsiRspHdr->StatSN); > > - > > - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, > ScsiRspHdr- > > >StatSN); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - ScsiRspHdr->MaxCmdSN = NTOHL (ScsiRspHdr->MaxCmdSN); > > - ScsiRspHdr->ExpCmdSN = NTOHL (ScsiRspHdr->ExpCmdSN); > > - IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN, > > ScsiRspHdr->ExpCmdSN); > > - > > - Tcb->StatusXferd = TRUE; > > - > > - Packet->HostAdapterStatus = ScsiRspHdr->Response; > > - if (Packet->HostAdapterStatus != > > ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) { > > - return EFI_SUCCESS; > > - } > > - > > - Packet->TargetStatus = ScsiRspHdr->Status; > > - > > - if (ISCSI_FLAG_ON (ScsiRspHdr, > > SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW | > > SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) || > > - ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW | > > SCSI_RSP_PDU_FLAG_UNDERFLOW) > > - ) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - if (ISCSI_FLAG_ON (ScsiRspHdr, > > SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) { > > - Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount); > > - Status = EFI_BAD_BUFFER_SIZE; > > - } > > - > > - if (ISCSI_FLAG_ON (ScsiRspHdr, > > SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) { > > - Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount); > > - } > > - > > - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { > > - if (Packet->DataDirection == DataIn) { > > - Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount); > > - } else { > > - Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount); > > - } > > - > > - Status = EFI_BAD_BUFFER_SIZE; > > - } > > - > > - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { > > - if (Packet->DataDirection == DataIn) { > > - Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); > > - } else { > > - Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); > > - } > > - } > > - > > - DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr); > > - if (DataSegLen != 0) { > > - SenseData = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, > sizeof > > (SCSI_RESPONSE), NULL); > > - if (SenseData == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - SenseData->Length = NTOHS (SenseData->Length); > > - > > - Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet- > > >SenseDataLength); > > - if (Packet->SenseDataLength != 0) { > > - CopyMem (Packet->SenseData, &SenseData->Data[0], Packet- > > >SenseDataLength); > > - } > > - } else { > > - Packet->SenseDataLength = 0; > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Process the received NOP In PDU. > > - > > - @param[in] Pdu The NOP In PDU received. > > - @param[in] Tcb The task control block. > > - > > - @retval EFI_SUCCES The NOP In PDU is processed and the > related > > sequence > > - numbers are updated. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror > > happened. > > -**/ > > -EFI_STATUS > > -IScsiOnNopInRcvd ( > > - IN NET_BUF *Pdu, > > - IN ISCSI_TCB *Tcb > > - ) > > -{ > > - ISCSI_NOP_IN *NopInHdr; > > - EFI_STATUS Status; > > - > > - NopInHdr = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL); > > - if (NopInHdr == NULL) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - > > - NopInHdr->StatSN = NTOHL (NopInHdr->StatSN); > > - NopInHdr->ExpCmdSN = NTOHL (NopInHdr->ExpCmdSN); > > - NopInHdr->MaxCmdSN = NTOHL (NopInHdr->MaxCmdSN); > > - > > - if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) { > > - if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) { > > - return EFI_PROTOCOL_ERROR; > > - } > > - } else { > > - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - } > > - > > - IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN, > > NopInHdr->ExpCmdSN); > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Execute the SCSI command issued through the EXT SCSI PASS THRU > > protocol. > > - > > - @param[in] PassThru The EXT SCSI PASS THRU protocol. > > - @param[in] Target The target ID. > > - @param[in] Lun The LUN. > > - @param[in, out] Packet The request packet containing IO request, > SCSI > > command > > - buffer and buffers to read/write. > > - > > - @retval EFI_SUCCES The SCSI command is executed and the > result is > > updated to > > - the Packet. > > - @retval EFI_DEVICE_ERROR Session state was not as required. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NOT_READY The target can not accept new commands. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiExecuteScsiCommand ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, > > - IN UINT8 *Target, > > - IN UINT64 Lun, > > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > > - ) > > -{ > > - EFI_STATUS Status; > > - ISCSI_DRIVER_DATA *Private; > > - ISCSI_SESSION *Session; > > - EFI_EVENT TimeoutEvent; > > - ISCSI_CONNECTION *Conn; > > - ISCSI_TCB *Tcb; > > - NET_BUF *Pdu; > > - ISCSI_XFER_CONTEXT *XferContext; > > - UINT8 *Data; > > - ISCSI_IN_BUFFER_CONTEXT InBufferContext; > > - UINT64 Timeout; > > - UINT8 *PduHdr; > > - > > - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); > > - Session = &Private->Session; > > - Status = EFI_SUCCESS; > > - Tcb = NULL; > > - TimeoutEvent = NULL; > > - Timeout = 0; > > - > > - if (Session->State != SESSION_STATE_LOGGED_IN) { > > - Status = EFI_DEVICE_ERROR; > > - goto ON_EXIT; > > - } > > - > > - Conn = NET_LIST_USER_STRUCT_S ( > > - Session->Conns.ForwardLink, > > - ISCSI_CONNECTION, > > - Link, > > - ISCSI_CONNECTION_SIGNATURE > > - ); > > - > > - if (Packet->Timeout != 0) { > > - Timeout = MultU64x32 (Packet->Timeout, 2); > > - } > > - > > - Status = IScsiNewTcb (Conn, &Tcb); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - // > > - // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU. > > - // > > - Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb); > > - if (Pdu == NULL) { > > - Status = EFI_OUT_OF_RESOURCES; > > - goto ON_EXIT; > > - } > > - > > - XferContext = &Tcb->XferContext; > > - PduHdr = NetbufGetByte (Pdu, 0, NULL); > > - if (PduHdr == NULL) { > > - Status = EFI_PROTOCOL_ERROR; > > - NetbufFree (Pdu); > > - goto ON_EXIT; > > - } > > - XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr); > > - > > - // > > - // Transmit the SCSI Command PDU. > > - // > > - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); > > - > > - NetbufFree (Pdu); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - if (!Session->InitialR2T && > > - (XferContext->Offset < Session->FirstBurstLength) && > > - (XferContext->Offset < Packet->OutTransferLength) > > - ) { > > - // > > - // Unsolicited Data-Out sequence is allowed, there is remaining > SCSI > > - // OUT data and the limit of FirstBurstLength is not reached. > > - // > > - XferContext->TargetTransferTag = ISCSI_RESERVED_TAG; > > - XferContext->DesiredLength = MIN ( > > - Session->FirstBurstLength, > > - Packet->OutTransferLength - > XferContext->Offset > > - ); > > - > > - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; > > - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - } > > - > > - InBufferContext.InData = (UINT8 *) Packet->InDataBuffer; > > - InBufferContext.InDataLen = Packet->InTransferLength; > > - > > - while (!Tcb->StatusXferd) { > > - // > > - // Start the timeout timer. > > - // > > - if (Timeout != 0) { > > - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, > Timeout); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - TimeoutEvent = Conn->TimeoutEvent; > > - } > > - // > > - // try to receive PDU from target. > > - // > > - Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, > FALSE, > > TimeoutEvent); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - PduHdr = NetbufGetByte (Pdu, 0, NULL); > > - if (PduHdr == NULL) { > > - Status = EFI_PROTOCOL_ERROR; > > - NetbufFree (Pdu); > > - goto ON_EXIT; > > - } > > - switch (ISCSI_GET_OPCODE (PduHdr)) { > > - case ISCSI_OPCODE_SCSI_DATA_IN: > > - Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet); > > - break; > > - > > - case ISCSI_OPCODE_R2T: > > - Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet); > > - break; > > - > > - case ISCSI_OPCODE_SCSI_RSP: > > - Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet); > > - break; > > - > > - case ISCSI_OPCODE_NOP_IN: > > - Status = IScsiOnNopInRcvd (Pdu, Tcb); > > - break; > > - > > - case ISCSI_OPCODE_VENDOR_T0: > > - case ISCSI_OPCODE_VENDOR_T1: > > - case ISCSI_OPCODE_VENDOR_T2: > > - // > > - // These messages are vendor specific, skip them. > > - // > > - break; > > - > > - default: > > - Status = EFI_PROTOCOL_ERROR; > > - break; > > - } > > - > > - NetbufFree (Pdu); > > - > > - if (EFI_ERROR (Status)) { > > - break; > > - } > > - } > > - > > -ON_EXIT: > > - > > - if (TimeoutEvent != NULL) { > > - gBS->SetTimer (TimeoutEvent, TimerCancel, 0); > > - } > > - > > - if (Tcb != NULL) { > > - IScsiDelTcb (Tcb); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Reinstate the session on some error. > > - > > - @param[in, out] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCES The session is reinstated from some error. > > - @retval Other Reinstatement failed. > > -**/ > > -EFI_STATUS > > -IScsiSessionReinstatement ( > > - IN OUT ISCSI_DRIVER_DATA *Private > > - ) > > -{ > > - ISCSI_SESSION *Session; > > - EFI_STATUS Status; > > - > > - Session = &Private->Session; > > - ASSERT (Session->State != SESSION_STATE_FREE); > > - > > - // > > - // Abort the session and re-init it. > > - // > > - IScsiSessionAbort (Session); > > - IScsiSessionInit (Session, TRUE); > > - > > - // > > - // Login again. > > - // > > - Status = IScsiSessionLogin (Private); > > - > > - return Status; > > -} > > - > > -/** > > - Initialize some session parameters before login. > > - > > - @param[in, out] Session The iSCSI session. > > - @param[in] Recovery Whether the request is from a fresh new > start or > > recovery. > > -**/ > > -VOID > > -IScsiSessionInit ( > > - IN OUT ISCSI_SESSION *Session, > > - IN BOOLEAN Recovery > > - ) > > -{ > > - if (!Recovery) { > > - Session->Signature = ISCSI_SESSION_SIGNATURE; > > - Session->State = SESSION_STATE_FREE; > > - > > - InitializeListHead (&Session->Conns); > > - InitializeListHead (&Session->TcbList); > > - } > > - > > - Session->Tsih = 0; > > - > > - Session->CmdSN = 1; > > - Session->InitiatorTaskTag = 1; > > - Session->NextCid = 1; > > - > > - Session->TargetPortalGroupTag = 0; > > - Session->MaxConnections = ISCSI_MAX_CONNS_PER_SESSION; > > - Session->InitialR2T = FALSE; > > - Session->ImmediateData = TRUE; > > - Session->MaxBurstLength = 262144; > > - Session->FirstBurstLength = MAX_RECV_DATA_SEG_LEN_IN_FFP; > > - Session->DefaultTime2Wait = 2; > > - Session->DefaultTime2Retain = 20; > > - Session->MaxOutstandingR2T = DEFAULT_MAX_OUTSTANDING_R2T; > > - Session->DataPDUInOrder = TRUE; > > - Session->DataSequenceInOrder = TRUE; > > - Session->ErrorRecoveryLevel = 0; > > -} > > - > > -/** > > - Abort the iSCSI session, that is, reset all the connection and free > the > > - resources. > > - > > - @param[in, out] Session The iSCSI session. > > - > > - @retval EFI_SUCCES The session is aborted. > > -**/ > > -EFI_STATUS > > -IScsiSessionAbort ( > > - IN OUT ISCSI_SESSION *Session > > - ) > > -{ > > - ISCSI_DRIVER_DATA *Private; > > - ISCSI_CONNECTION *Conn; > > - > > - if (Session->State != SESSION_STATE_LOGGED_IN) { > > - return EFI_SUCCESS; > > - } > > - > > - ASSERT (!IsListEmpty (&Session->Conns)); > > - > > - Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session); > > - > > - while (!IsListEmpty (&Session->Conns)) { > > - Conn = NET_LIST_USER_STRUCT_S ( > > - Session->Conns.ForwardLink, > > - ISCSI_CONNECTION, > > - Link, > > - ISCSI_CONNECTION_SIGNATURE > > - ); > > - > > - gBS->CloseProtocol ( > > - Conn->Tcp4Io.Handle, > > - &gEfiTcp4ProtocolGuid, > > - Private->Image, > > - Private->ExtScsiPassThruHandle > > - ); > > - > > - IScsiConnReset (Conn); > > - > > - IScsiDetatchConnection (Conn); > > - IScsiDestroyConnection (Conn); > > - } > > - > > - Session->State = SESSION_STATE_FAILED; > > - > > - return EFI_SUCCESS; > > -} > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > deleted file mode 100644 > > index 901b38e92fc0..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > +++ /dev/null > > @@ -1,487 +0,0 @@ > > -/** @file > > - The wrap of TCP/IP Socket interface. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "IScsiImpl.h" > > - > > -/** > > - The common notify function associated with various Tcp4Io events. > > - > > - @param[in] Event The event signaled. > > - @param[in] Context The context. > > -**/ > > -VOID > > -EFIAPI > > -Tcp4IoCommonNotify ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ) > > -{ > > - *((BOOLEAN *) Context) = TRUE; > > -} > > - > > -/** > > - Create a TCP socket with the specified configuration data. > > - > > - @param[in] Image The handle of the driver image. > > - @param[in] Controller The handle of the controller. > > - @param[in] ConfigData The Tcp4 configuration data. > > - @param[in] Tcp4Io The Tcp4Io. > > - > > - @retval EFI_SUCCESS The TCP socket is created and configured. > > - @retval Others Failed to create the TCP socket or configure > it. > > -**/ > > -EFI_STATUS > > -Tcp4IoCreateSocket ( > > - IN EFI_HANDLE Image, > > - IN EFI_HANDLE Controller, > > - IN TCP4_IO_CONFIG_DATA *ConfigData, > > - IN TCP4_IO *Tcp4Io > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_TCP4_PROTOCOL *Tcp4; > > - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; > > - EFI_TCP4_OPTION ControlOption; > > - EFI_TCP4_ACCESS_POINT *AccessPoint; > > - > > - Tcp4Io->Handle = NULL; > > - Tcp4Io->ConnToken.CompletionToken.Event = NULL; > > - Tcp4Io->TxToken.CompletionToken.Event = NULL; > > - Tcp4Io->RxToken.CompletionToken.Event = NULL; > > - Tcp4Io->CloseToken.CompletionToken.Event = NULL; > > - Tcp4 = NULL; > > - > > - // > > - // Create the TCP4 child instance and get the TCP4 protocol. > > - // > > - Status = NetLibCreateServiceChild ( > > - Controller, > > - Image, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - &Tcp4Io->Handle > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Tcp4Io->Handle, > > - &gEfiTcp4ProtocolGuid, > > - (VOID **)&Tcp4Io->Tcp4, > > - Image, > > - Controller, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Tcp4Io->Image = Image; > > - Tcp4Io->Controller = Controller; > > - Tcp4 = Tcp4Io->Tcp4; > > - > > - // > > - // Set the configuration parameters. > > - // > > - ControlOption.ReceiveBufferSize = 0x200000; > > - ControlOption.SendBufferSize = 0x200000; > > - ControlOption.MaxSynBackLog = 0; > > - ControlOption.ConnectionTimeout = 0; > > - ControlOption.DataRetries = 6; > > - ControlOption.FinTimeout = 0; > > - ControlOption.TimeWaitTimeout = 0; > > - ControlOption.KeepAliveProbes = 4; > > - ControlOption.KeepAliveTime = 0; > > - ControlOption.KeepAliveInterval = 0; > > - ControlOption.EnableNagle = FALSE; > > - ControlOption.EnableTimeStamp = FALSE; > > - ControlOption.EnableWindowScaling = TRUE; > > - ControlOption.EnableSelectiveAck = FALSE; > > - ControlOption.EnablePathMtuDiscovery = FALSE; > > - > > - Tcp4ConfigData.TypeOfService = 8; > > - Tcp4ConfigData.TimeToLive = 255; > > - Tcp4ConfigData.ControlOption = &ControlOption; > > - > > - AccessPoint = &Tcp4ConfigData.AccessPoint; > > - > > - AccessPoint->UseDefaultAddress = FALSE; > > - AccessPoint->StationPort = 0; > > - AccessPoint->RemotePort = ConfigData->RemotePort; > > - AccessPoint->ActiveFlag = TRUE; > > - > > - CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof > > (EFI_IPv4_ADDRESS)); > > - CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, > > sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, > > sizeof (EFI_IPv4_ADDRESS)); > > - > > - // > > - // Configure the TCP4 protocol. > > - // > > - Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) { > > - // > > - // the gateway is not zero, add the default route by hand > > - // > > - Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, > > &ConfigData->Gateway); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - } > > - // > > - // Create events for variuos asynchronous operations. > > - // > > - Status = gBS->CreateEvent ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - Tcp4IoCommonNotify, > > - &Tcp4Io->IsConnDone, > > - &Tcp4Io->ConnToken.CompletionToken.Event > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->CreateEvent ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - Tcp4IoCommonNotify, > > - &Tcp4Io->IsTxDone, > > - &Tcp4Io->TxToken.CompletionToken.Event > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->CreateEvent ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - Tcp4IoCommonNotify, > > - &Tcp4Io->IsRxDone, > > - &Tcp4Io->RxToken.CompletionToken.Event > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->CreateEvent ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - Tcp4IoCommonNotify, > > - &Tcp4Io->IsCloseDone, > > - &Tcp4Io->CloseToken.CompletionToken.Event > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Tcp4Io->IsTxDone = FALSE; > > - Tcp4Io->IsRxDone = FALSE; > > - > > - return EFI_SUCCESS; > > - > > -ON_ERROR: > > - > > - if (Tcp4Io->RxToken.CompletionToken.Event != NULL) { > > - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); > > - } > > - > > - if (Tcp4Io->TxToken.CompletionToken.Event != NULL) { > > - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); > > - } > > - > > - if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) { > > - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); > > - } > > - > > - if (Tcp4 != NULL) { > > - Tcp4->Configure (Tcp4, NULL); > > - > > - gBS->CloseProtocol ( > > - Tcp4Io->Handle, > > - &gEfiTcp4ProtocolGuid, > > - Image, > > - Controller > > - ); > > - } > > - > > - NetLibDestroyServiceChild ( > > - Controller, > > - Image, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - Tcp4Io->Handle > > - ); > > - > > - return Status; > > -} > > - > > -/** > > - Destroy the socket. > > - > > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. > > -**/ > > -VOID > > -Tcp4IoDestroySocket ( > > - IN TCP4_IO *Tcp4Io > > - ) > > -{ > > - EFI_TCP4_PROTOCOL *Tcp4; > > - > > - Tcp4 = Tcp4Io->Tcp4; > > - > > - Tcp4->Configure (Tcp4, NULL); > > - > > - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); > > - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); > > - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); > > - > > - gBS->CloseProtocol ( > > - Tcp4Io->Handle, > > - &gEfiTcp4ProtocolGuid, > > - Tcp4Io->Image, > > - Tcp4Io->Controller > > - ); > > - > > - NetLibDestroyServiceChild ( > > - Tcp4Io->Controller, > > - Tcp4Io->Image, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - Tcp4Io->Handle > > - ); > > -} > > - > > -/** > > - Connect to the other endpoint of the TCP socket. > > - > > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > > - @param[in] Timeout The time to wait for connection done. > > - > > - @retval EFI_SUCCESS Connect to the other endpoint of the TCP > socket > > successfully. > > - @retval EFI_TIMEOUT Failed to connect to the other endpoint > of the > > TCP socket in the specified time period. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -Tcp4IoConnect ( > > - IN OUT TCP4_IO *Tcp4Io, > > - IN EFI_EVENT Timeout > > - ) > > -{ > > - EFI_TCP4_PROTOCOL *Tcp4; > > - EFI_STATUS Status; > > - > > - Tcp4Io->IsConnDone = FALSE; > > - Tcp4 = Tcp4Io->Tcp4; > > - Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) > > { > > - Tcp4->Poll (Tcp4); > > - } > > - > > - if (!Tcp4Io->IsConnDone) { > > - Status = EFI_TIMEOUT; > > - } else { > > - Status = Tcp4Io->ConnToken.CompletionToken.Status; > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Reset the socket. > > - > > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > > -**/ > > -VOID > > -Tcp4IoReset ( > > - IN OUT TCP4_IO *Tcp4Io > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_TCP4_PROTOCOL *Tcp4; > > - > > - Tcp4Io->CloseToken.AbortOnClose = TRUE; > > - Tcp4Io->IsCloseDone = FALSE; > > - > > - Tcp4 = Tcp4Io->Tcp4; > > - Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken); > > - if (EFI_ERROR (Status)) { > > - return ; > > - } > > - > > - while (!Tcp4Io->IsCloseDone) { > > - Tcp4->Poll (Tcp4); > > - } > > -} > > - > > -/** > > - Transmit the Packet to the other endpoint of the socket. > > - > > - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. > > - @param[in] Packet The packet to transmit. > > - > > - @retval EFI_SUCCESS The packet is trasmitted. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -Tcp4IoTransmit ( > > - IN TCP4_IO *Tcp4Io, > > - IN NET_BUF *Packet > > - ) > > -{ > > - EFI_TCP4_TRANSMIT_DATA *TxData; > > - EFI_TCP4_PROTOCOL *Tcp4; > > - EFI_STATUS Status; > > - > > - TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet- > > >BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA)); > > - if (TxData == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - TxData->Push = TRUE; > > - TxData->Urgent = FALSE; > > - TxData->DataLength = Packet->TotalSize; > > - > > - // > > - // Build the fragment table. > > - // > > - TxData->FragmentCount = Packet->BlockOpNum; > > - NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0], > > &TxData->FragmentCount); > > - > > - Tcp4Io->TxToken.Packet.TxData = TxData; > > - > > - // > > - // Trasnmit the packet. > > - // > > - Tcp4 = Tcp4Io->Tcp4; > > - Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - while (!Tcp4Io->IsTxDone) { > > - Tcp4->Poll (Tcp4); > > - } > > - > > - Tcp4Io->IsTxDone = FALSE; > > - > > - Status = Tcp4Io->TxToken.CompletionToken.Status; > > - > > -ON_EXIT: > > - > > - FreePool (TxData); > > - > > - return Status; > > -} > > - > > -/** > > - Receive data from the socket. > > - > > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be > > destroyed. > > - @param[in] Packet The buffer to hold the data copy from > the soket rx > > buffer. > > - @param[in] AsyncMode Is this receive asyncronous or not. > > - @param[in] Timeout The time to wait for receiving the > amount of data > > the Packet > > - can hold. > > - > > - @retval EFI_SUCCESS The required amount of data is received > from > > the socket. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. > > - @retval EFI_TIMEOUT Failed to receive the required amount of > data in > > the > > - specified time period. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -Tcp4IoReceive ( > > - IN TCP4_IO *Tcp4Io, > > - IN NET_BUF *Packet, > > - IN BOOLEAN AsyncMode, > > - IN EFI_EVENT Timeout > > - ) > > -{ > > - EFI_TCP4_PROTOCOL *Tcp4; > > - EFI_TCP4_RECEIVE_DATA RxData; > > - EFI_STATUS Status; > > - NET_FRAGMENT *Fragment; > > - UINT32 FragmentCount; > > - UINT32 CurrentFragment; > > - > > - FragmentCount = Packet->BlockOpNum; > > - Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT)); > > - if (Fragment == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - // > > - // Build the fragment table. > > - // > > - NetbufBuildExt (Packet, Fragment, &FragmentCount); > > - > > - RxData.FragmentCount = 1; > > - Tcp4Io->RxToken.Packet.RxData = &RxData; > > - CurrentFragment = 0; > > - Tcp4 = Tcp4Io->Tcp4; > > - Status = EFI_SUCCESS; > > - > > - while (CurrentFragment < FragmentCount) { > > - RxData.DataLength = > Fragment[CurrentFragment].Len; > > - RxData.FragmentTable[0].FragmentLength = > > Fragment[CurrentFragment].Len; > > - RxData.FragmentTable[0].FragmentBuffer = > > Fragment[CurrentFragment].Bulk; > > - > > - Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS- > > >CheckEvent (Timeout)))) { > > - // > > - // Poll until some data is received or something error happens. > > - // > > - Tcp4->Poll (Tcp4); > > - } > > - > > - if (!Tcp4Io->IsRxDone) { > > - // > > - // Timeout occurs, cancel the receive request. > > - // > > - Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken); > > - > > - Status = EFI_TIMEOUT; > > - goto ON_EXIT; > > - } else { > > - Tcp4Io->IsRxDone = FALSE; > > - } > > - > > - if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) { > > - Status = Tcp4Io->RxToken.CompletionToken.Status; > > - goto ON_EXIT; > > - } > > - > > - Fragment[CurrentFragment].Len -= > > RxData.FragmentTable[0].FragmentLength; > > - if (Fragment[CurrentFragment].Len == 0) { > > - CurrentFragment++; > > - } else { > > - Fragment[CurrentFragment].Bulk += > > RxData.FragmentTable[0].FragmentLength; > > - } > > - } > > - > > -ON_EXIT: > > - Tcp4Io->RxToken.Packet.RxData = NULL; > > - FreePool (Fragment); > > - > > - return Status; > > -} > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > deleted file mode 100644 > > index 3555f1a2ebe3..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > +++ /dev/null > > @@ -1,350 +0,0 @@ > > -/** @file > > - Implementation of MD5 algorithm. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Md5.h" > > - > > -CONST UINT32 Md5_Data[][2] = { > > - { 0, 1 }, > > - { 1, 5 }, > > - { 5, 3 }, > > - { 0, 7 } > > -}; > > - > > -CONST UINT32 Md5_S[][4] = { > > - { 7, 22, 17, 12 }, > > - { 5, 20, 14, 9 }, > > - { 4, 23, 16 ,11 }, > > - { 6, 21, 15, 10 }, > > -}; > > - > > -CONST UINT32 Md5_T[] = { > > - 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE, > > - 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501, > > - 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE, > > - 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821, > > - 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA, > > - 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8, > > - 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED, > > - 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A, > > - 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C, > > - 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70, > > - 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05, > > - 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665, > > - 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039, > > - 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1, > > - 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1, > > - 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391 > > -}; > > - > > -CONST UINT8 Md5HashPadding[] = > > -{ > > - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > > - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 > > -}; > > - > > -// > > -// ROTATE_LEFT rotates x left n bits. > > -// > > -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) > > - > > -#define SA MedStates[Index2 & 3] > > -#define SB MedStates[(Index2 + 1) & 3] > > -#define SC MedStates[(Index2 + 2) & 3] > > -#define SD MedStates[(Index2 + 3) & 3] > > - > > -/** > > - Tf1 is one basic MD5 transform function. > > - > > - @param[in] A A 32-bit quantity. > > - @param[in] B A 32-bit quantity. > > - @param[in] C A 32-bit quantity. > > - > > - @return Output was produced as a 32-bit quantity based on > the > > - three 32-bit input quantity. > > -**/ > > -UINT32 > > -Tf1 ( > > - IN UINT32 A, > > - IN UINT32 B, > > - IN UINT32 C > > - ) > > -{ > > - return (A & B) | (~A & C); > > -} > > - > > -/** > > - Tf2 is one basic MD5 transform function. > > - > > - @param[in] A A 32-bit quantity. > > - @param[in] B A 32-bit quantity. > > - @param[in] C A 32-bit quantity. > > - > > - @return Output was produced as a 32-bit quantity based on > the > > - three 32-bit input quantity. > > -**/ > > -UINT32 > > -Tf2 ( > > - IN UINT32 A, > > - IN UINT32 B, > > - IN UINT32 C > > - ) > > -{ > > - return (A & C) | (B & ~C); > > -} > > - > > -/** > > - Tf3 is one basic MD5 transform function. > > - > > - @param[in] A A 32-bit quantity. > > - @param[in] B A 32-bit quantity. > > - @param[in] C A 32-bit quantity. > > - > > - @return Output was produced as a 32-bit quantity based on > the > > - three 32-bit input quantity. > > -**/ > > -UINT32 > > -Tf3 ( > > - IN UINT32 A, > > - IN UINT32 B, > > - IN UINT32 C > > - ) > > -{ > > - return A ^ B ^ C; > > -} > > - > > -/** > > - Tf4 is one basic MD5 transform function. > > - > > - @param[in] A A 32-bit quantity. > > - @param[in] B A 32-bit quantity. > > - @param[in] C A 32-bit quantity. > > - > > - @return Output was produced as a 32-bit quantity based on > the > > - three 32-bit input quantity. > > -**/ > > -UINT32 > > -Tf4 ( > > - IN UINT32 A, > > - IN UINT32 B, > > - IN UINT32 C > > - ) > > -{ > > - return B ^ (A | ~C); > > -} > > - > > -typedef > > -UINT32 > > -(*MD5_TRANSFORM_FUNC) ( > > - IN UINT32 A, > > - IN UINT32 B, > > - IN UINT32 C > > - ); > > - > > -CONST MD5_TRANSFORM_FUNC Md5_F[] = { > > - Tf1, > > - Tf2, > > - Tf3, > > - Tf4 > > -}; > > - > > -/** > > - Perform the MD5 transform on 64 bytes data segment. > > - > > - @param[in, out] Md5Ctx It includes the data segment for Md5 > transform. > > -**/ > > -VOID > > -MD5Transform ( > > - IN OUT MD5_CTX *Md5Ctx > > - ) > > -{ > > - UINT32 Index1; > > - UINT32 Index2; > > - UINT32 MedStates[MD5_HASHSIZE >> 2]; > > - UINT32 *Data; > > - UINT32 IndexD; > > - UINT32 IndexT; > > - > > - Data = (UINT32 *) Md5Ctx->M; > > - > > - // > > - // Copy MD5 states to MedStates > > - // > > - CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE); > > - > > - IndexT = 0; > > - for (Index1 = 0; Index1 < 4; Index1++) { > > - IndexD = Md5_Data[Index1][0]; > > - for (Index2 = 16; Index2 > 0; Index2--) { > > - SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + > Md5_T[IndexT]; > > - SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]); > > - SA += SB; > > - > > - IndexD += Md5_Data[Index1][1]; > > - IndexD &= 15; > > - > > - IndexT++; > > - } > > - } > > - > > - for (Index1 = 0; Index1 < 4; Index1++) { > > - Md5Ctx->States[Index1] += MedStates[Index1]; > > - } > > -} > > - > > -/** > > - Copy data segment into the M field of MD5_CTX structure for later > > transform. > > - If the length of data segment is larger than 64 bytes, then does the > > transform > > - immediately and the generated Md5 code is stored in the States field > of > > MD5_CTX > > - data struct for later accumulation. > > - All of Md5 code generated for the sequential 64-bytes data segaments > are > > be > > - accumulated in MD5Final() function. > > - > > - @param[in, out] Md5Ctx The data structure of storing the original > data > > - segment and the final result. > > - @param[in] Data The data wanted to be transformed. > > - @param[in] DataLen The length of data. > > -**/ > > -VOID > > -MD5UpdateBlock ( > > - IN OUT MD5_CTX *Md5Ctx, > > - IN CONST UINT8 *Data, > > - IN UINTN DataLen > > - ) > > -{ > > - UINTN Limit; > > - > > - for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit > = 64) > > { > > - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit); > > - MD5Transform (Md5Ctx); > > - > > - Md5Ctx->Count = 0; > > - Data += Limit; > > - DataLen -= Limit; > > - } > > - > > - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen); > > - Md5Ctx->Count += DataLen; > > -} > > - > > -/** > > - Initialize four 32-bits chaining variables and use them to do the Md5 > > transform. > > - > > - @param[out] Md5Ctx The data structure of Md5. > > - > > - @retval EFI_SUCCESS Initialization is ok. > > -**/ > > -EFI_STATUS > > -MD5Init ( > > - OUT MD5_CTX *Md5Ctx > > - ) > > -{ > > - ZeroMem (Md5Ctx, sizeof (*Md5Ctx)); > > - > > - // > > - // Set magic initialization constants. > > - // > > - Md5Ctx->States[0] = 0x67452301; > > - Md5Ctx->States[1] = 0xefcdab89; > > - Md5Ctx->States[2] = 0x98badcfe; > > - Md5Ctx->States[3] = 0x10325476; > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - the external interface of Md5 algorithm > > - > > - @param[in, out] Md5Ctx The data structure of storing the original > data > > - segment and the final result. > > - @param[in] Data The data wanted to be transformed. > > - @param[in] DataLen The length of data. > > - > > - @retval EFI_SUCCESS The transform is ok. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -MD5Update ( > > - IN OUT MD5_CTX *Md5Ctx, > > - IN VOID *Data, > > - IN UINTN DataLen > > - ) > > -{ > > - if (EFI_ERROR (Md5Ctx->Status)) { > > - return Md5Ctx->Status; > > - } > > - > > - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen); > > - Md5Ctx->Length += DataLen; > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Accumulate the MD5 value of every data segment and generate the > finial > > - result according to MD5 algorithm. > > - > > - @param[in, out] Md5Ctx The data structure of storing the original > data > > - segment and the final result. > > - @param[out] HashVal The final 128-bits output. > > - > > - @retval EFI_SUCCESS The transform is ok. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -MD5Final ( > > - IN OUT MD5_CTX *Md5Ctx, > > - OUT UINT8 *HashVal > > - ) > > -{ > > - UINTN PadLength; > > - > > - if (Md5Ctx->Status == EFI_ALREADY_STARTED) { > > - // > > - // Store Hashed value & Zeroize sensitive context information. > > - // > > - CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE); > > - ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx)); > > - > > - return EFI_SUCCESS; > > - } > > - > > - if (EFI_ERROR (Md5Ctx->Status)) { > > - return Md5Ctx->Status; > > - } > > - > > - PadLength = Md5Ctx->Count >= 56 ? 120 : 56; > > - PadLength -= Md5Ctx->Count; > > - MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength); > > - Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3); > > - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8); > > - > > - ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M)); > > - Md5Ctx->Length = 0; > > - Md5Ctx->Status = EFI_ALREADY_STARTED; > > - return MD5Final (Md5Ctx, HashVal); > > -} > > - > > diff --git > > a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > deleted file mode 100644 > > index f1227691ec21..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > +++ /dev/null > > @@ -1,433 +0,0 @@ > > -/** @file > > - UEFI Component Name(2) protocol implementation for Tcp4Dxe driver. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Tcp4Main.h" > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > driver. > > - > > - This function retrieves the user readable name of a driver in the > form of a > > - Unicode string. If the driver specified by This has a user readable > name in > > - the language specified by Language, then a pointer to the driver name > is > > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > > specified > > - by This does not support the language specified by Language, > > - then EFI_UNSUPPORTED is returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified > > - in RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] DriverName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - driver specified by This in the > language > > - specified by Language. > > - > > - @retval EFI_SUCCESS The Unicode string for the Driver > specified by > > - This and the language specified by > Language was > > - returned in DriverName. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -TcpComponentNameGetDriverName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN CHAR8 *Language, > > - OUT CHAR16 **DriverName > > - ); > > - > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > controller > > - that is being managed by a driver. > > - > > - This function retrieves the user readable name of the controller > specified > > by > > - ControllerHandle and ChildHandle in the form of a Unicode string. If > the > > - driver specified by This has a user readable name in the language > specified > > by > > - Language, then a pointer to the controller name is returned in > > ControllerName, > > - and EFI_SUCCESS is returned. If the driver specified by This is not > currently > > - managing the controller specified by ControllerHandle and ChildHandle, > > - then EFI_UNSUPPORTED is returned. If the driver specified by This > does > > not > > - support the language specified by Language, then EFI_UNSUPPORTED is > > returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] ControllerHandle The handle of a controller that the > driver > > - specified by This is managing. This > handle > > - specifies the controller whose name is > to be > > - returned. > > - > > - @param[in] ChildHandle The handle of the child controller to > retrieve > > - the name of. This is an optional > parameter that > > - may be NULL. It will be NULL for > device > > - drivers. It will also be NULL for a > bus drivers > > - that wish to retrieve the name of the > bus > > - controller. It will not be NULL for a > bus > > - driver that wishes to retrieve the name > of a > > - child controller. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified in > > - RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] ControllerName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - controller specified by > ControllerHandle and > > - ChildHandle in the language specified > by > > - Language from the point of view of the > driver > > - specified by This. > > - > > - @retval EFI_SUCCESS The Unicode string for the user > readable name > > in > > - the language specified by Language for > the > > - driver specified by This was returned > in > > - DriverName. > > - > > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > > valid > > - EFI_HANDLE. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This is not > currently > > - managing the controller specified by > > - ControllerHandle and ChildHandle. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -TcpComponentNameGetControllerName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE ChildHandle OPTIONAL, > > - IN CHAR8 *Language, > > - OUT CHAR16 **ControllerName > > - ); > > - > > - > > -/// > > -/// EFI Component Name Protocol > > -/// > > -GLOBAL_REMOVE_IF_UNREFERENCED > > EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = { > > - TcpComponentNameGetDriverName, > > - TcpComponentNameGetControllerName, > > - "eng" > > -}; > > - > > -/// > > -/// EFI Component Name 2 Protocol > > -/// > > -GLOBAL_REMOVE_IF_UNREFERENCED > > EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = { > > - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) > > TcpComponentNameGetDriverName, > > - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) > > TcpComponentNameGetControllerName, > > - "en" > > -}; > > - > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > > mTcpDriverNameTable[] = { > > - { > > - "eng;en", > > - L"Tcp Network Service Driver" > > - }, > > - { > > - NULL, > > - NULL > > - } > > -}; > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > > *gTcpControllerNameTable = NULL; > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > driver. > > - > > - This function retrieves the user readable name of a driver in the > form of a > > - Unicode string. If the driver specified by This has a user readable > name in > > - the language specified by Language, then a pointer to the driver name > is > > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > > specified > > - by This does not support the language specified by Language, > > - then EFI_UNSUPPORTED is returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified > > - in RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] DriverName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - driver specified by This in the > language > > - specified by Language. > > - > > - @retval EFI_SUCCESS The Unicode string for the Driver > specified by > > - This and the language specified by > Language was > > - returned in DriverName. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -TcpComponentNameGetDriverName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN CHAR8 *Language, > > - OUT CHAR16 **DriverName > > - ) > > -{ > > - return LookupUnicodeString2 ( > > - Language, > > - This->SupportedLanguages, > > - mTcpDriverNameTable, > > - DriverName, > > - (BOOLEAN) (This == &gTcp4ComponentName) > > - ); > > -} > > - > > -/** > > - Update the component name for the Tcp4 child handle. > > - > > - @param Tcp4[in] A pointer to the EFI_TCP4_PROTOCOL. > > - > > - > > - @retval EFI_SUCCESS Update the ControllerNameTable of > this > > instance successfully. > > - @retval EFI_INVALID_PARAMETER The input parameter is invalid. > > - > > -**/ > > -EFI_STATUS > > -UpdateName ( > > - IN EFI_TCP4_PROTOCOL *Tcp4 > > - ) > > -{ > > - EFI_STATUS Status; > > - CHAR16 HandleName[80]; > > - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; > > - > > - if (Tcp4 == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // > > - // Format the child name into the string buffer as: > > - // TCPv4 (SrcPort=59, DestPort=60, ActiveFlag=TRUE) > > - // > > - ZeroMem (&Tcp4ConfigData, sizeof (Tcp4ConfigData)); > > - Status = Tcp4->GetModeData (Tcp4, NULL, &Tcp4ConfigData, NULL, NULL, > > NULL); > > - if (!EFI_ERROR (Status)) { > > - UnicodeSPrint (HandleName, sizeof (HandleName), > > - L"TCPv4 (SrcPort=%d, DestPort=%d, ActiveFlag=%s)", > > - Tcp4ConfigData.AccessPoint.StationPort, > > - Tcp4ConfigData.AccessPoint.RemotePort, > > - (Tcp4ConfigData.AccessPoint.ActiveFlag ? L"TRUE" : L"FALSE") > > - ); > > - } else if (Status == EFI_NOT_STARTED) { > > - UnicodeSPrint ( > > - HandleName, > > - sizeof (HandleName), > > - L"TCPv4 (Not started)" > > - ); > > - } else { > > - return Status; > > - } > > - > > - if (gTcpControllerNameTable != NULL) { > > - FreeUnicodeStringTable (gTcpControllerNameTable); > > - gTcpControllerNameTable = NULL; > > - } > > - > > - Status = AddUnicodeString2 ( > > - "eng", > > - gTcp4ComponentName.SupportedLanguages, > > - &gTcpControllerNameTable, > > - HandleName, > > - TRUE > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - return AddUnicodeString2 ( > > - "en", > > - gTcp4ComponentName2.SupportedLanguages, > > - &gTcpControllerNameTable, > > - HandleName, > > - FALSE > > - ); > > -} > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > controller > > - that is being managed by a driver. > > - > > - This function retrieves the user readable name of the controller > specified > > by > > - ControllerHandle and ChildHandle in the form of a Unicode string. If > the > > - driver specified by This has a user readable name in the language > specified > > by > > - Language, then a pointer to the controller name is returned in > > ControllerName, > > - and EFI_SUCCESS is returned. If the driver specified by This is not > currently > > - managing the controller specified by ControllerHandle and ChildHandle, > > - then EFI_UNSUPPORTED is returned. If the driver specified by This > does > > not > > - support the language specified by Language, then EFI_UNSUPPORTED is > > returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] ControllerHandle The handle of a controller that the > driver > > - specified by This is managing. This > handle > > - specifies the controller whose name is > to be > > - returned. > > - > > - @param[in] ChildHandle The handle of the child controller to > retrieve > > - the name of. This is an optional > parameter that > > - may be NULL. It will be NULL for > device > > - drivers. It will also be NULL for a > bus drivers > > - that wish to retrieve the name of the > bus > > - controller. It will not be NULL for a > bus > > - driver that wishes to retrieve the name > of a > > - child controller. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified in > > - RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] ControllerName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - controller specified by > ControllerHandle and > > - ChildHandle in the language specified > by > > - Language from the point of view of the > driver > > - specified by This. > > - > > - @retval EFI_SUCCESS The Unicode string for the user > readable name > > in > > - the language specified by Language for > the > > - driver specified by This was returned > in > > - DriverName. > > - > > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > > valid > > - EFI_HANDLE. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This is not > currently > > - managing the controller specified by > > - ControllerHandle and ChildHandle. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -TcpComponentNameGetControllerName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE ChildHandle OPTIONAL, > > - IN CHAR8 *Language, > > - OUT CHAR16 **ControllerName > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_TCP4_PROTOCOL *Tcp4; > > - > > - // > > - // Only provide names for child handles. > > - // > > - if (ChildHandle == NULL) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - // > > - // Make sure this driver produced ChildHandle > > - // > > - Status = EfiTestChildHandle ( > > - ControllerHandle, > > - ChildHandle, > > - &gEfiIp4ProtocolGuid > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // Retrieve an instance of a produced protocol from ChildHandle > > - // > > - Status = gBS->OpenProtocol ( > > - ChildHandle, > > - &gEfiTcp4ProtocolGuid, > > - (VOID **)&Tcp4, > > - NULL, > > - NULL, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // Update the component name for this child handle. > > - // > > - Status = UpdateName (Tcp4); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - return LookupUnicodeString2 ( > > - Language, > > - This->SupportedLanguages, > > - gTcpControllerNameTable, > > - ControllerName, > > - (BOOLEAN)(This == &gTcp4ComponentName) > > - ); > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > deleted file mode 100644 > > index adb5aa35cdf2..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > +++ /dev/null > > @@ -1,1201 +0,0 @@ > > -/** @file > > - Implementation of the Socket. > > - > > -Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "SockImpl.h" > > - > > -/** > > - Get the length of the data that can be retrieved from the socket > > - receive buffer. > > - > > - @param SockBuffer Pointer to the socket receive buffer. > > - @param IsUrg Pointer to a BOOLEAN variable. If TRUE > the data is > > - OOB. > > - @param BufLen The maximum length of the data buffer > to store > > the > > - received data in socket layer. > > - > > - @return The length of the data can be retreived. > > - > > -**/ > > -UINT32 > > -SockTcpDataToRcv ( > > - IN SOCK_BUFFER *SockBuffer, > > - OUT BOOLEAN *IsUrg, > > - IN UINT32 BufLen > > - ); > > - > > -/** > > - Process the send token. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockProcessSndToken ( > > - IN OUT SOCKET *Sock > > - ); > > - > > -/** > > - Supporting function for both SockImpl and SockInterface. > > - > > - @param Event The Event this notify function registered to, > ignored. > > - > > -**/ > > -VOID > > -EFIAPI > > -SockFreeFoo ( > > - IN EFI_EVENT Event > > - ) > > -{ > > - return ; > > -} > > - > > - > > -/** > > - Get the length of the data that can be retrieved from the socket > > - receive buffer. > > - > > - @param SockBuffer Pointer to the socket receive buffer. > > - @param IsUrg Pointer to a BOOLEAN variable. If TRUE > the data is > > - OOB. > > - @param BufLen The maximum length of the data buffer > to store > > the > > - received data in socket layer. > > - > > - @return The length of the data can be retreived. > > - > > -**/ > > -UINT32 > > -SockTcpDataToRcv ( > > - IN SOCK_BUFFER *SockBuffer, > > - OUT BOOLEAN *IsUrg, > > - IN UINT32 BufLen > > - ) > > -{ > > - NET_BUF *RcvBufEntry; > > - UINT32 DataLen; > > - TCP_RSV_DATA *TcpRsvData; > > - BOOLEAN Urg; > > - ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0)); > > - > > - RcvBufEntry = SockBufFirst (SockBuffer); > > - ASSERT (RcvBufEntry != NULL); > > - > > - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; > > - > > - *IsUrg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); > > - > > - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { > > - > > - DataLen = MIN (TcpRsvData->UrgLen, BufLen); > > - > > - if (DataLen < TcpRsvData->UrgLen) { > > - TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen; > > - } else { > > - TcpRsvData->UrgLen = 0; > > - } > > - > > - return DataLen; > > - > > - } > > - > > - DataLen = RcvBufEntry->TotalSize; > > - > > - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); > > - > > - while ((BufLen > DataLen) && (RcvBufEntry != NULL)) { > > - > > - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; > > - > > - Urg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); > > - > > - if (*IsUrg != Urg) { > > - break; > > - } > > - > > - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { > > - > > - if (TcpRsvData->UrgLen + DataLen < BufLen) { > > - TcpRsvData->UrgLen = 0; > > - } else { > > - TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen); > > - } > > - > > - return MIN (TcpRsvData->UrgLen + DataLen, BufLen); > > - > > - } > > - > > - DataLen += RcvBufEntry->TotalSize; > > - > > - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); > > - } > > - > > - DataLen = MIN (BufLen, DataLen); > > - return DataLen; > > -} > > - > > - > > -/** > > - Copy data from socket buffer to application provided receive buffer. > > - > > - @param Sock Pointer to the socket. > > - @param TcpRxData Pointer to the application provided > receive > > buffer. > > - @param RcvdBytes The maximum length of the data can be > copied. > > - @param IsOOB If TRUE the data is OOB, FALSE the data > is normal. > > - > > -**/ > > -VOID > > -SockSetTcpRxData ( > > - IN SOCKET *Sock, > > - IN VOID *TcpRxData, > > - IN UINT32 RcvdBytes, > > - IN BOOLEAN IsOOB > > - ) > > -{ > > - UINT32 Index; > > - UINT32 CopyBytes; > > - UINT32 OffSet; > > - EFI_TCP4_RECEIVE_DATA *RxData; > > - EFI_TCP4_FRAGMENT_DATA *Fragment; > > - > > - RxData = (EFI_TCP4_RECEIVE_DATA *) TcpRxData; > > - > > - OffSet = 0; > > - > > - ASSERT (RxData->DataLength >= RcvdBytes); > > - > > - RxData->DataLength = RcvdBytes; > > - RxData->UrgentFlag = IsOOB; > > - > > - for (Index = 0; (Index < RxData->FragmentCount) && (RcvdBytes > 0); > > Index++) { > > - > > - Fragment = &RxData->FragmentTable[Index]; > > - CopyBytes = MIN ((UINT32) (Fragment->FragmentLength), RcvdBytes); > > - > > - NetbufQueCopy ( > > - Sock->RcvBuffer.DataQueue, > > - OffSet, > > - CopyBytes, > > - Fragment->FragmentBuffer > > - ); > > - > > - Fragment->FragmentLength = CopyBytes; > > - RcvdBytes -= CopyBytes; > > - OffSet += CopyBytes; > > - } > > -} > > - > > - > > -/** > > - Get received data from the socket layer to the receive token. > > - > > - @param Sock Pointer to the socket. > > - @param RcvToken Pointer to the application provided > receive token. > > - > > - @return The length of data received in this token. > > - > > -**/ > > -UINT32 > > -SockProcessRcvToken ( > > - IN SOCKET *Sock, > > - IN OUT SOCK_IO_TOKEN *RcvToken > > - ) > > -{ > > - UINT32 TokenRcvdBytes; > > - EFI_TCP4_RECEIVE_DATA *RxData; > > - BOOLEAN IsUrg; > > - > > - ASSERT (Sock != NULL); > > - > > - ASSERT (SockStream == Sock->Type); > > - > > - RxData = RcvToken->Packet.RxData; > > - > > - TokenRcvdBytes = SockTcpDataToRcv ( > > - &Sock->RcvBuffer, > > - &IsUrg, > > - (UINT32) RxData->DataLength > > - ); > > - > > - // > > - // Copy data from RcvBuffer of socket to user > > - // provided RxData and set the fields in TCP RxData > > - // > > - SockSetTcpRxData (Sock, RxData, TokenRcvdBytes, IsUrg); > > - > > - NetbufQueTrim (Sock->RcvBuffer.DataQueue, TokenRcvdBytes); > > - SIGNAL_TOKEN (&(RcvToken->Token), EFI_SUCCESS); > > - > > - return TokenRcvdBytes; > > -} > > - > > - > > -/** > > - Process the TCP send data, buffer the tcp txdata and append > > - the buffer to socket send buffer,then try to send it. > > - > > - @param Sock Pointer to the socket. > > - @param TcpTxData Pointer to the application provided > send buffer. > > - > > - @retval EFI_SUCCESS The operation is completed successfully. > > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > > - > > -**/ > > -EFI_STATUS > > -SockProcessTcpSndData ( > > - IN SOCKET *Sock, > > - IN VOID *TcpTxData > > - ) > > -{ > > - NET_BUF *SndData; > > - EFI_STATUS Status; > > - EFI_TCP4_TRANSMIT_DATA *TxData; > > - > > - TxData = (EFI_TCP4_TRANSMIT_DATA *) TcpTxData; > > - > > - // > > - // transform this TxData into a NET_BUFFER > > - // and insert it into Sock->SndBuffer > > - // > > - SndData = NetbufFromExt ( > > - (NET_FRAGMENT *) TxData->FragmentTable, > > - (UINT32) TxData->FragmentCount, > > - 0, > > - 0, > > - SockFreeFoo, > > - NULL > > - ); > > - > > - if (NULL == SndData) { > > - DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to" > > - " call NetBufferFromExt\n")); > > - > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - NetbufQueAppend (Sock->SndBuffer.DataQueue, SndData); > > - > > - // > > - // notify the low layer protocol to handle this send token > > - // > > - if (TxData->Urgent) { > > - Status = Sock->ProtoHandler (Sock, SOCK_SNDURG, NULL); > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - } > > - > > - if (TxData->Push) { > > - Status = Sock->ProtoHandler (Sock, SOCK_SNDPUSH, NULL); > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - } > > - > > - // > > - // low layer protocol should really handle the sending > > - // process when catching SOCK_SND request > > - // > > - Status = Sock->ProtoHandler (Sock, SOCK_SND, NULL); > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Flush the tokens in the specific token list. > > - > > - @param Sock Pointer to the socket. > > - @param PendingTokenList Pointer to the token list to be flushed. > > - > > -**/ > > -VOID > > -SockFlushPendingToken ( > > - IN SOCKET *Sock, > > - IN LIST_ENTRY *PendingTokenList > > - ) > > -{ > > - SOCK_TOKEN *SockToken; > > - SOCK_COMPLETION_TOKEN *Token; > > - > > - ASSERT ((Sock != NULL) && (PendingTokenList != NULL)); > > - > > - while (!IsListEmpty (PendingTokenList)) { > > - SockToken = NET_LIST_HEAD ( > > - PendingTokenList, > > - SOCK_TOKEN, > > - TokenList > > - ); > > - > > - Token = SockToken->Token; > > - SIGNAL_TOKEN (Token, Sock->SockError); > > - > > - RemoveEntryList (&(SockToken->TokenList)); > > - FreePool (SockToken); > > - } > > -} > > - > > - > > -/** > > - Wake up the connection token while the connection is successfully > > established, > > - then try to process any pending send token. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockWakeConnToken ( > > - IN OUT SOCKET *Sock > > - ) > > -{ > > - ASSERT (Sock->ConnectionToken != NULL); > > - > > - SIGNAL_TOKEN (Sock->ConnectionToken, EFI_SUCCESS); > > - Sock->ConnectionToken = NULL; > > - > > - // > > - // check to see if some pending send token existed? > > - // > > - SockProcessSndToken (Sock); > > - return ; > > -} > > - > > - > > -/** > > - Wake up the listen token while the connection is established > successfully. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockWakeListenToken ( > > - IN OUT SOCKET *Sock > > - ) > > -{ > > - SOCKET *Parent; > > - SOCK_TOKEN *SockToken; > > - EFI_TCP4_LISTEN_TOKEN *ListenToken; > > - > > - Parent = Sock->Parent; > > - > > - ASSERT ((Parent != NULL) && SOCK_IS_LISTENING (Parent) && > > SOCK_IS_CONNECTED (Sock)); > > - > > - if (!IsListEmpty (&Parent->ListenTokenList)) { > > - SockToken = NET_LIST_HEAD ( > > - &Parent->ListenTokenList, > > - SOCK_TOKEN, > > - TokenList > > - ); > > - > > - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) SockToken->Token; > > - ListenToken->NewChildHandle = Sock->SockHandle; > > - > > - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); > > - > > - RemoveEntryList (&SockToken->TokenList); > > - FreePool (SockToken); > > - > > - RemoveEntryList (&Sock->ConnectionList); > > - > > - Parent->ConnCnt--; > > - DEBUG ((EFI_D_NET, "SockWakeListenToken: accept a socket, now > > conncnt is %d", Parent->ConnCnt)); > > - > > - Sock->Parent = NULL; > > - } > > -} > > - > > - > > -/** > > - Wake up the receive token while some data is received. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockWakeRcvToken ( > > - IN SOCKET *Sock > > - ) > > -{ > > - UINT32 RcvdBytes; > > - UINT32 TokenRcvdBytes; > > - SOCK_TOKEN *SockToken; > > - SOCK_IO_TOKEN *RcvToken; > > - > > - ASSERT (Sock->RcvBuffer.DataQueue != NULL); > > - > > - RcvdBytes = (Sock->RcvBuffer.DataQueue)->BufSize; > > - > > - ASSERT (RcvdBytes > 0); > > - > > - while (RcvdBytes > 0 && !IsListEmpty (&Sock->RcvTokenList)) { > > - > > - SockToken = NET_LIST_HEAD ( > > - &Sock->RcvTokenList, > > - SOCK_TOKEN, > > - TokenList > > - ); > > - > > - RcvToken = (SOCK_IO_TOKEN *) SockToken->Token; > > - TokenRcvdBytes = SockProcessRcvToken (Sock, RcvToken); > > - > > - if (0 == TokenRcvdBytes) { > > - return ; > > - } > > - > > - RemoveEntryList (&(SockToken->TokenList)); > > - FreePool (SockToken); > > - RcvdBytes -= TokenRcvdBytes; > > - } > > -} > > - > > - > > -/** > > - Process the send token. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockProcessSndToken ( > > - IN OUT SOCKET *Sock > > - ) > > -{ > > - UINT32 FreeSpace; > > - SOCK_TOKEN *SockToken; > > - UINT32 DataLen; > > - SOCK_IO_TOKEN *SndToken; > > - EFI_TCP4_TRANSMIT_DATA *TxData; > > - EFI_STATUS Status; > > - > > - ASSERT ((Sock != NULL) && (SockStream == Sock->Type)); > > - > > - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); > > - > > - // > > - // to determine if process a send token using > > - // socket layer flow control policy > > - // > > - while ((FreeSpace >= Sock->SndBuffer.LowWater) && > > - !IsListEmpty (&Sock->SndTokenList)) { > > - > > - SockToken = NET_LIST_HEAD ( > > - &(Sock->SndTokenList), > > - SOCK_TOKEN, > > - TokenList > > - ); > > - > > - // > > - // process this token > > - // > > - RemoveEntryList (&(SockToken->TokenList)); > > - InsertTailList ( > > - &(Sock->ProcessingSndTokenList), > > - &(SockToken->TokenList) > > - ); > > - > > - // > > - // Proceess it in the light of SockType > > - // > > - SndToken = (SOCK_IO_TOKEN *) SockToken->Token; > > - TxData = SndToken->Packet.TxData; > > - > > - DataLen = (UINT32) TxData->DataLength; > > - Status = SockProcessTcpSndData (Sock, TxData); > > - > > - if (EFI_ERROR (Status)) { > > - goto OnError; > > - } > > - > > - if (DataLen >= FreeSpace) { > > - FreeSpace = 0; > > - > > - } else { > > - FreeSpace -= DataLen; > > - > > - } > > - } > > - > > - return ; > > - > > -OnError: > > - > > - RemoveEntryList (&SockToken->TokenList); > > - SIGNAL_TOKEN (SockToken->Token, Status); > > - FreePool (SockToken); > > -} > > - > > - > > -/** > > - Create a socket with initial data SockInitData. > > - > > - @param SockInitData Pointer to the initial data of the > socket. > > - > > - @return Pointer to the newly created socket, return NULL when > exception > > occured. > > - > > -**/ > > -SOCKET * > > -SockCreate ( > > - IN SOCK_INIT_DATA *SockInitData > > - ) > > -{ > > - SOCKET *Sock; > > - SOCKET *Parent; > > - EFI_STATUS Status; > > - > > - ASSERT ((SockInitData != NULL) && (SockInitData->ProtoHandler != > NULL)); > > - ASSERT (SockInitData->Type == SockStream); > > - ASSERT ((SockInitData->ProtoData != NULL) && (SockInitData->DataSize > <= > > PROTO_RESERVED_LEN)); > > - > > - Parent = SockInitData->Parent; > > - > > - if ((Parent != NULL) && (Parent->ConnCnt == Parent->BackLog)) { > > - DEBUG ( > > - (EFI_D_ERROR, > > - "SockCreate: Socket parent has " > > - "reached its connection limit with %d ConnCnt and %d BackLog\n", > > - Parent->ConnCnt, > > - Parent->BackLog) > > - ); > > - > > - return NULL; > > - } > > - > > - Sock = AllocateZeroPool (sizeof (SOCKET)); > > - if (NULL == Sock) { > > - > > - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to create a new > > socket\n")); > > - return NULL; > > - } > > - > > - InitializeListHead (&Sock->Link); > > - InitializeListHead (&Sock->ConnectionList); > > - InitializeListHead (&Sock->ListenTokenList); > > - InitializeListHead (&Sock->RcvTokenList); > > - InitializeListHead (&Sock->SndTokenList); > > - InitializeListHead (&Sock->ProcessingSndTokenList); > > - > > - EfiInitializeLock (&(Sock->Lock), TPL_CALLBACK); > > - > > - Sock->SndBuffer.DataQueue = NetbufQueAlloc (); > > - if (NULL == Sock->SndBuffer.DataQueue) { > > - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate" > > - " SndBuffer for new socket\n")); > > - > > - goto OnError; > > - } > > - > > - Sock->RcvBuffer.DataQueue = NetbufQueAlloc (); > > - if (NULL == Sock->RcvBuffer.DataQueue) { > > - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate " > > - "RcvBuffer for new socket\n")); > > - > > - goto OnError; > > - } > > - > > - Sock->Signature = SOCK_SIGNATURE; > > - > > - Sock->Parent = Parent; > > - Sock->BackLog = SockInitData->BackLog; > > - Sock->ProtoHandler = SockInitData->ProtoHandler; > > - Sock->SndBuffer.HighWater = SockInitData->SndBufferSize; > > - Sock->RcvBuffer.HighWater = SockInitData->RcvBufferSize; > > - Sock->Type = SockInitData->Type; > > - Sock->DriverBinding = SockInitData->DriverBinding; > > - Sock->State = SockInitData->State; > > - Sock->CreateCallback = SockInitData->CreateCallback; > > - Sock->DestroyCallback = SockInitData->DestroyCallback; > > - Sock->Context = SockInitData->Context; > > - > > - Sock->SockError = EFI_ABORTED; > > - Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER; > > - Sock->RcvBuffer.LowWater = SOCK_BUFF_LOW_WATER; > > - > > - // > > - // Install protocol on Sock->SockHandle > > - // > > - CopyMem ( > > - &(Sock->NetProtocol.TcpProtocol), > > - SockInitData->Protocol, > > - sizeof (EFI_TCP4_PROTOCOL) > > - ); > > - > > - // > > - // copy the protodata into socket > > - // > > - CopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData- > > >DataSize); > > - > > - Status = gBS->InstallMultipleProtocolInterfaces ( > > - &Sock->SockHandle, > > - &gEfiTcp4ProtocolGuid, > > - &(Sock->NetProtocol.TcpProtocol), > > - NULL > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - DEBUG ((EFI_D_ERROR, "SockCreate: Install TCP protocol in " > > - "socket failed with %r\n", Status)); > > - > > - goto OnError; > > - } > > - > > - if (Parent != NULL) { > > - ASSERT (Parent->BackLog > 0); > > - ASSERT (SOCK_IS_LISTENING (Parent)); > > - > > - // > > - // need to add it into Parent->ConnectionList > > - // if the Parent->ConnCnt < Parent->BackLog > > - // > > - Parent->ConnCnt++; > > - > > - DEBUG ( > > - (EFI_D_NET, > > - "SockCreate: Create a new socket and add to parent, now conncnt > > is %d\n", > > - Parent->ConnCnt) > > - ); > > - > > - InsertTailList (&Parent->ConnectionList, &Sock->ConnectionList); > > - } > > - > > - if (Sock->CreateCallback != NULL) { > > - Status = Sock->CreateCallback (Sock, Sock->Context); > > - if (EFI_ERROR (Status)) { > > - goto OnError; > > - } > > - } > > - > > - return Sock; > > - > > -OnError: > > - > > - if (Sock->SockHandle != NULL) { > > - gBS->UninstallMultipleProtocolInterfaces ( > > - Sock->SockHandle, > > - &gEfiTcp4ProtocolGuid, > > - &(Sock->NetProtocol.TcpProtocol), > > - NULL > > - ); > > - } > > - > > - if (NULL != Sock->SndBuffer.DataQueue) { > > - NetbufQueFree (Sock->SndBuffer.DataQueue); > > - } > > - > > - if (NULL != Sock->RcvBuffer.DataQueue) { > > - NetbufQueFree (Sock->RcvBuffer.DataQueue); > > - } > > - > > - FreePool (Sock); > > - > > - return NULL; > > -} > > - > > - > > -/** > > - Destroy a socket. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockDestroy ( > > - IN OUT SOCKET *Sock > > - ) > > -{ > > - ASSERT (SockStream == Sock->Type); > > - > > - // > > - // Flush the completion token buffered > > - // by sock and rcv, snd buffer > > - // > > - if (!SOCK_IS_UNCONFIGURED (Sock)) { > > - > > - SockConnFlush (Sock); > > - SockSetState (Sock, SO_CLOSED); > > - Sock->ConfigureState = SO_UNCONFIGURED; > > - > > - } > > - // > > - // Destroy the RcvBuffer Queue and SendBuffer Queue > > - // > > - NetbufQueFree (Sock->RcvBuffer.DataQueue); > > - NetbufQueFree (Sock->SndBuffer.DataQueue); > > - > > - // > > - // Remove it from parent connection list if needed > > - // > > - if (Sock->Parent != NULL) { > > - > > - RemoveEntryList (&(Sock->ConnectionList)); > > - (Sock->Parent->ConnCnt)--; > > - > > - DEBUG ( > > - (EFI_D_NET, > > - "SockDestroy: Delete a unaccepted socket from parent" > > - "now conncnt is %d\n", > > - Sock->Parent->ConnCnt) > > - ); > > - > > - Sock->Parent = NULL; > > - } > > - > > - FreePool (Sock); > > - return ; > > -} > > - > > - > > -/** > > - Flush the sndBuffer and rcvBuffer of socket. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockConnFlush ( > > - IN OUT SOCKET *Sock > > - ) > > -{ > > - SOCKET *Child; > > - > > - ASSERT (Sock != NULL); > > - > > - // > > - // Clear the flag in this socket > > - // > > - Sock->Flag = 0; > > - > > - // > > - // Flush the SndBuffer and RcvBuffer of Sock > > - // > > - NetbufQueFlush (Sock->SndBuffer.DataQueue); > > - NetbufQueFlush (Sock->RcvBuffer.DataQueue); > > - > > - // > > - // Signal the pending token > > - // > > - if (Sock->ConnectionToken != NULL) { > > - SIGNAL_TOKEN (Sock->ConnectionToken, Sock->SockError); > > - Sock->ConnectionToken = NULL; > > - } > > - > > - if (Sock->CloseToken != NULL) { > > - SIGNAL_TOKEN (Sock->CloseToken, Sock->SockError); > > - Sock->CloseToken = NULL; > > - } > > - > > - SockFlushPendingToken (Sock, &(Sock->ListenTokenList)); > > - SockFlushPendingToken (Sock, &(Sock->RcvTokenList)); > > - SockFlushPendingToken (Sock, &(Sock->SndTokenList)); > > - SockFlushPendingToken (Sock, &(Sock->ProcessingSndTokenList)); > > - > > - // > > - // Destroy the pending connection, if it is a listening socket > > - // > > - if (SOCK_IS_LISTENING (Sock)) { > > - while (!IsListEmpty (&Sock->ConnectionList)) { > > - Child = NET_LIST_HEAD ( > > - &Sock->ConnectionList, > > - SOCKET, > > - ConnectionList > > - ); > > - > > - SockDestroyChild (Child); > > - } > > - > > - Sock->ConnCnt = 0; > > - } > > - > > - return ; > > -} > > - > > - > > -/** > > - Set the state of the socket. > > - > > - @param Sock Pointer to the socket. > > - @param State The new socket state to be set. > > - > > -**/ > > -VOID > > -SockSetState ( > > - IN OUT SOCKET *Sock, > > - IN UINT8 State > > - ) > > -{ > > - Sock->State = State; > > -} > > - > > - > > -/** > > - Clone a new socket including its associated protocol control block. > > - > > - @param Sock Pointer to the socket to be cloned. > > - > > - @return Pointer to the newly cloned socket. If NULL, error condition > > occurred. > > - > > -**/ > > -SOCKET * > > -SockClone ( > > - IN SOCKET *Sock > > - ) > > -{ > > - SOCKET *ClonedSock; > > - SOCK_INIT_DATA InitData; > > - > > - InitData.BackLog = Sock->BackLog; > > - InitData.Parent = Sock; > > - InitData.State = Sock->State; > > - InitData.ProtoHandler = Sock->ProtoHandler; > > - InitData.Type = Sock->Type; > > - InitData.RcvBufferSize = Sock->RcvBuffer.HighWater; > > - InitData.SndBufferSize = Sock->SndBuffer.HighWater; > > - InitData.DriverBinding = Sock->DriverBinding; > > - InitData.Protocol = &(Sock->NetProtocol); > > - InitData.CreateCallback = Sock->CreateCallback; > > - InitData.DestroyCallback = Sock->DestroyCallback; > > - InitData.Context = Sock->Context; > > - InitData.ProtoData = Sock->ProtoReserved; > > - InitData.DataSize = sizeof (Sock->ProtoReserved); > > - > > - ClonedSock = SockCreate (&InitData); > > - > > - if (NULL == ClonedSock) { > > - DEBUG ((EFI_D_ERROR, "SockClone: no resource to create a cloned > > sock\n")); > > - return NULL; > > - } > > - > > - SockSetState (ClonedSock, SO_CONNECTING); > > - ClonedSock->ConfigureState = Sock->ConfigureState; > > - > > - return ClonedSock; > > -} > > - > > - > > -/** > > - Called by the low layer protocol to indicate the socket a connection > is > > - established. > > - > > - This function just changes the socket's state to SO_CONNECTED > > - and signals the token used for connection establishment. > > - > > - @param Sock Pointer to the socket associated with > the > > - established connection. > > -**/ > > -VOID > > -SockConnEstablished ( > > - IN SOCKET *Sock > > - ) > > -{ > > - > > - ASSERT (SO_CONNECTING == Sock->State); > > - > > - SockSetState (Sock, SO_CONNECTED); > > - > > - if (NULL == Sock->Parent) { > > - SockWakeConnToken (Sock); > > - } else { > > - SockWakeListenToken (Sock); > > - } > > - > > - return ; > > -} > > - > > - > > -/** > > - Called by the low layer protocol to indicate the connection is closed. > > - > > - This function flushes the socket, sets the state to SO_CLOSED and > signals > > - the close token. > > - > > - @param Sock Pointer to the socket associated with > the closed > > - connection. > > - > > -**/ > > -VOID > > -SockConnClosed ( > > - IN OUT SOCKET *Sock > > - ) > > -{ > > - if (Sock->CloseToken != NULL) { > > - SIGNAL_TOKEN (Sock->CloseToken, EFI_SUCCESS); > > - Sock->CloseToken = NULL; > > - } > > - > > - SockConnFlush (Sock); > > - SockSetState (Sock, SO_CLOSED); > > - > > - if (Sock->Parent != NULL) { > > - SockDestroyChild (Sock); > > - } > > - > > -} > > - > > - > > -/** > > - Called by low layer protocol to indicate that some data is sent or > processed. > > - > > - This function trims the sent data in the socket send buffer, signals > the data > > - token if proper. > > - > > - @param Sock Pointer to the socket. > > - @param Count The length of the data processed or > sent, in bytes. > > - > > -**/ > > -VOID > > -SockDataSent ( > > - IN SOCKET *Sock, > > - IN UINT32 Count > > - ) > > -{ > > - SOCK_TOKEN *SockToken; > > - SOCK_COMPLETION_TOKEN *SndToken; > > - > > - ASSERT (!IsListEmpty (&Sock->ProcessingSndTokenList)); > > - ASSERT (Count <= (Sock->SndBuffer.DataQueue)->BufSize); > > - > > - NetbufQueTrim (Sock->SndBuffer.DataQueue, Count); > > - > > - // > > - // To check if we can signal some snd token in this socket > > - // > > - while (Count > 0) { > > - SockToken = NET_LIST_HEAD ( > > - &(Sock->ProcessingSndTokenList), > > - SOCK_TOKEN, > > - TokenList > > - ); > > - > > - SndToken = SockToken->Token; > > - > > - if (SockToken->RemainDataLen <= Count) { > > - > > - RemoveEntryList (&(SockToken->TokenList)); > > - SIGNAL_TOKEN (SndToken, EFI_SUCCESS); > > - Count -= SockToken->RemainDataLen; > > - FreePool (SockToken); > > - } else { > > - > > - SockToken->RemainDataLen -= Count; > > - Count = 0; > > - } > > - } > > - > > - // > > - // to judge if we can process some send token in > > - // Sock->SndTokenList, if so process those send token > > - // > > - SockProcessSndToken (Sock); > > - return ; > > -} > > - > > - > > -/** > > - Called by the low layer protocol to copy some data in socket send > > - buffer starting from the specific offset to a buffer provided by > > - the caller. > > - > > - @param Sock Pointer to the socket. > > - @param Offset The start point of the data to be > copied. > > - @param Len The length of the data to be copied. > > - @param Dest Pointer to the destination to copy the > data. > > - > > - @return The data size copied. > > - > > -**/ > > -UINT32 > > -SockGetDataToSend ( > > - IN SOCKET *Sock, > > - IN UINT32 Offset, > > - IN UINT32 Len, > > - IN UINT8 *Dest > > - ) > > -{ > > - ASSERT ((Sock != NULL) && SockStream == Sock->Type); > > - > > - return NetbufQueCopy ( > > - Sock->SndBuffer.DataQueue, > > - Offset, > > - Len, > > - Dest > > - ); > > -} > > - > > - > > -/** > > - Called by the low layer protocol to deliver received data to socket > layer. > > - > > - This function will append the data to the socket receive buffer, set > ther > > - urgent data length and then check if any receive token can be > signaled. > > - > > - @param Sock Pointer to the socket. > > - @param NetBuffer Pointer to the buffer that contains the > received > > - data. > > - @param UrgLen The length of the urgent data in the > received data. > > - > > -**/ > > -VOID > > -SockDataRcvd ( > > - IN SOCKET *Sock, > > - IN OUT NET_BUF *NetBuffer, > > - IN UINT32 UrgLen > > - ) > > -{ > > - ASSERT ((Sock != NULL) && (Sock->RcvBuffer.DataQueue != NULL) && > > - UrgLen <= NetBuffer->TotalSize); > > - > > - NET_GET_REF (NetBuffer); > > - > > - ((TCP_RSV_DATA *) (NetBuffer->ProtoData))->UrgLen = UrgLen; > > - > > - NetbufQueAppend (Sock->RcvBuffer.DataQueue, NetBuffer); > > - > > - SockWakeRcvToken (Sock); > > - return ; > > -} > > - > > - > > -/** > > - Get the length of the free space of the specific socket buffer. > > - > > - @param Sock Pointer to the socket. > > - @param Which Flag to indicate which socket buffer to > check, > > - either send buffer or receive buffer. > > - > > - @return The length of the free space, in bytes. > > - > > -**/ > > -UINT32 > > -SockGetFreeSpace ( > > - IN SOCKET *Sock, > > - IN UINT32 Which > > - ) > > -{ > > - UINT32 BufferCC; > > - SOCK_BUFFER *SockBuffer; > > - > > - ASSERT ((Sock != NULL) && ((SOCK_SND_BUF == Which) || > > (SOCK_RCV_BUF == Which))); > > - > > - if (SOCK_SND_BUF == Which) { > > - SockBuffer = &(Sock->SndBuffer); > > - } else { > > - SockBuffer = &(Sock->RcvBuffer); > > - } > > - > > - BufferCC = (SockBuffer->DataQueue)->BufSize; > > - > > - if (BufferCC >= SockBuffer->HighWater) { > > - > > - return 0; > > - } > > - > > - return SockBuffer->HighWater - BufferCC; > > -} > > - > > - > > - > > -/** > > - Called by the low layer protocol to indicate that there will be no > more data > > - from the communication peer. > > - > > - This function set the socket's state to SO_NO_MORE_DATA and signal > all > > queued > > - IO tokens with the error status EFI_CONNECTION_FIN. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockNoMoreData ( > > - IN OUT SOCKET *Sock > > - ) > > -{ > > - EFI_STATUS Err; > > - > > - SOCK_NO_MORE_DATA (Sock); > > - > > - if (!IsListEmpty (&Sock->RcvTokenList)) { > > - > > - ASSERT (0 == GET_RCV_DATASIZE (Sock)); > > - > > - Err = Sock->SockError; > > - > > - SOCK_ERROR (Sock, EFI_CONNECTION_FIN); > > - > > - SockFlushPendingToken (Sock, &Sock->RcvTokenList); > > - > > - SOCK_ERROR (Sock, Err); > > - > > - } > > - > > -} > > - > > - > > -/** > > - Get the first buffer block in the specific socket buffer. > > - > > - @param Sockbuf Pointer to the socket buffer. > > - > > - @return Pointer to the first buffer in the queue. NULL if the queue > is > > empty. > > - > > -**/ > > -NET_BUF * > > -SockBufFirst ( > > - IN SOCK_BUFFER *Sockbuf > > - ) > > -{ > > - LIST_ENTRY *NetbufList; > > - > > - NetbufList = &(Sockbuf->DataQueue->BufList); > > - > > - if (IsListEmpty (NetbufList)) { > > - return NULL; > > - } > > - > > - return NET_LIST_HEAD (NetbufList, NET_BUF, List); > > -} > > - > > - > > -/** > > - Get the next buffer block in the specific socket buffer. > > - > > - @param Sockbuf Pointer to the socket buffer. > > - @param SockEntry Pointer to the buffer block prior to > the required > > - one. > > - > > - @return Pointer to the buffer block next to SockEntry. NULL if > SockEntry is > > - the tail or head entry. > > - > > -**/ > > -NET_BUF * > > -SockBufNext ( > > - IN SOCK_BUFFER *Sockbuf, > > - IN NET_BUF *SockEntry > > - ) > > -{ > > - LIST_ENTRY *NetbufList; > > - > > - NetbufList = &(Sockbuf->DataQueue->BufList); > > - > > - if ((SockEntry->List.ForwardLink == NetbufList) || > > - (SockEntry->List.BackLink == &SockEntry->List) || > > - (SockEntry->List.ForwardLink == &SockEntry->List)) { > > - > > - return NULL; > > - } > > - > > - return NET_LIST_USER_STRUCT (SockEntry->List.ForwardLink, NET_BUF, > > List); > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > deleted file mode 100644 > > index cd20b8bcb2dd..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > +++ /dev/null > > @@ -1,990 +0,0 @@ > > -/** @file > > - Interface function of the Socket. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "SockImpl.h" > > - > > - > > -/** > > - Check whether the Event is in the List. > > - > > - @param List Pointer to the token list to be searched. > > - @param Event The event to be checked. > > - > > - @retval TRUE The specific Event exists in the List. > > - @retval FALSE The specific Event is not in the List. > > - > > -**/ > > -BOOLEAN > > -SockTokenExistedInList ( > > - IN LIST_ENTRY *List, > > - IN EFI_EVENT Event > > - ) > > -{ > > - LIST_ENTRY *ListEntry; > > - SOCK_TOKEN *SockToken; > > - > > - NET_LIST_FOR_EACH (ListEntry, List) { > > - SockToken = NET_LIST_USER_STRUCT ( > > - ListEntry, > > - SOCK_TOKEN, > > - TokenList > > - ); > > - > > - if (Event == SockToken->Token->Event) { > > - return TRUE; > > - } > > - } > > - > > - return FALSE; > > -} > > - > > - > > -/** > > - Call SockTokenExistedInList() to check whether the Event is > > - in the related socket's lists. > > - > > - @param Sock Pointer to the instance's socket. > > - @param Event The event to be checked. > > - > > - @retval TRUE The Event exists in related socket's > lists. > > - @retval FALSE The Event is not in related socket's > lists. > > - > > -**/ > > -BOOLEAN > > -SockTokenExisted ( > > - IN SOCKET *Sock, > > - IN EFI_EVENT Event > > - ) > > -{ > > - > > - if (SockTokenExistedInList (&Sock->SndTokenList, Event) || > > - SockTokenExistedInList (&Sock->ProcessingSndTokenList, Event) || > > - SockTokenExistedInList (&Sock->RcvTokenList, Event) || > > - SockTokenExistedInList (&Sock->ListenTokenList, Event)) { > > - > > - return TRUE; > > - } > > - > > - if ((Sock->ConnectionToken != NULL) && > > - (Sock->ConnectionToken->Event == Event)) { > > - > > - return TRUE; > > - } > > - > > - if ((Sock->CloseToken != NULL) && (Sock->CloseToken->Event == Event)) > { > > - return TRUE; > > - } > > - > > - return FALSE; > > -} > > - > > - > > -/** > > - Buffer a token into the specific list of socket Sock. > > - > > - @param Sock Pointer to the instance's socket. > > - @param List Pointer to the list to store the token. > > - @param Token Pointer to the token to be buffered. > > - @param DataLen The data length of the buffer contained > in Token. > > - > > - @return Pointer to the token that wraps Token. If NULL, error > condition > > occurred. > > - > > -**/ > > -SOCK_TOKEN * > > -SockBufferToken ( > > - IN SOCKET *Sock, > > - IN LIST_ENTRY *List, > > - IN VOID *Token, > > - IN UINT32 DataLen > > - ) > > -{ > > - SOCK_TOKEN *SockToken; > > - > > - SockToken = AllocatePool (sizeof (SOCK_TOKEN)); > > - if (NULL == SockToken) { > > - > > - DEBUG ((EFI_D_ERROR, "SockBufferIOToken: No Memory " > > - "to allocate SockToken\n")); > > - > > - return NULL; > > - } > > - > > - SockToken->Sock = Sock; > > - SockToken->Token = (SOCK_COMPLETION_TOKEN *) Token; > > - SockToken->RemainDataLen = DataLen; > > - InsertTailList (List, &SockToken->TokenList); > > - > > - return SockToken; > > -} > > - > > - > > -/** > > - Destroy the socket Sock and its associated protocol control block. > > - > > - @param Sock The socket to be destroyed. > > - > > - @retval EFI_SUCCESS The socket Sock is destroyed > successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket. > > - > > -**/ > > -EFI_STATUS > > -SockDestroyChild ( > > - IN SOCKET *Sock > > - ) > > -{ > > - EFI_STATUS Status; > > - TCP4_PROTO_DATA *ProtoData; > > - TCP_CB *Tcb; > > - VOID *SockProtocol; > > - > > - ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL)); > > - > > - if (Sock->InDestroy) { > > - return EFI_SUCCESS; > > - } > > - > > - Sock->InDestroy = TRUE; > > - > > - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > > - Tcb = ProtoData->TcpPcb; > > - > > - ASSERT (Tcb != NULL); > > - > > - // > > - // Close the IP protocol. > > - // > > - gBS->CloseProtocol ( > > - Tcb->IpInfo->ChildHandle, > > - &gEfiIp4ProtocolGuid, > > - ProtoData->TcpService->IpIo->Image, > > - Sock->SockHandle > > - ); > > - > > - if (Sock->DestroyCallback != NULL) { > > - Sock->DestroyCallback (Sock, Sock->Context); > > - } > > - > > - // > > - // Retrieve the protocol installed on this sock > > - // > > - Status = gBS->OpenProtocol ( > > - Sock->SockHandle, > > - &gEfiTcp4ProtocolGuid, > > - &SockProtocol, > > - Sock->DriverBinding, > > - Sock->SockHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Open protocol installed " > > - "on socket failed with %r\n", Status)); > > - } > > - > > - // > > - // Uninstall the protocol installed on this sock > > - // in the light of Sock->SockType > > - // > > - gBS->UninstallMultipleProtocolInterfaces ( > > - Sock->SockHandle, > > - &gEfiTcp4ProtocolGuid, > > - SockProtocol, > > - NULL > > - ); > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Get the lock to " > > - "access socket failed with %r\n", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - // > > - // force protocol layer to detach the PCB > > - // > > - Status = Sock->ProtoHandler (Sock, SOCK_DETACH, NULL); > > - > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Protocol detach socket" > > - " failed with %r\n", Status)); > > - > > - Sock->InDestroy = FALSE; > > - } else if (SOCK_IS_CONFIGURED (Sock)) { > > - > > - SockConnFlush (Sock); > > - SockSetState (Sock, SO_CLOSED); > > - > > - Sock->ConfigureState = SO_UNCONFIGURED; > > - } > > - > > - EfiReleaseLock (&(Sock->Lock)); > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - SockDestroy (Sock); > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Create a socket and its associated protocol control block > > - with the intial data SockInitData and protocol specific > > - data ProtoData. > > - > > - @param SockInitData Inital data to setting the socket. > > - > > - @return Pointer to the newly created socket. If NULL, error condition > > occured. > > - > > -**/ > > -SOCKET * > > -SockCreateChild ( > > - IN SOCK_INIT_DATA *SockInitData > > - ) > > -{ > > - SOCKET *Sock; > > - VOID *SockProtocol; > > - EFI_STATUS Status; > > - > > - // > > - // create a new socket > > - // > > - Sock = SockCreate (SockInitData); > > - if (NULL == Sock) { > > - > > - DEBUG ((EFI_D_ERROR, "SockCreateChild: No resource to " > > - "create a new socket\n")); > > - > > - return NULL; > > - } > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockCreateChild: Get the lock to " > > - "access socket failed with %r\n", Status)); > > - > > - goto ERROR; > > - } > > - // > > - // inform the protocol layer to attach the socket > > - // with a new protocol control block > > - // > > - Status = Sock->ProtoHandler (Sock, SOCK_ATTACH, NULL); > > - EfiReleaseLock (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockCreateChild: Protocol failed to" > > - " attach a socket with %r\n", Status)); > > - > > - goto ERROR; > > - } > > - > > - return Sock; > > - > > -ERROR: > > - > > - if (Sock->DestroyCallback != NULL) { > > - Sock->DestroyCallback (Sock, Sock->Context); > > - } > > - > > - gBS->OpenProtocol ( > > - Sock->SockHandle, > > - &gEfiTcp4ProtocolGuid, > > - &SockProtocol, > > - Sock->DriverBinding, > > - Sock->SockHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - // > > - // Uninstall the protocol installed on this sock > > - // > > - gBS->UninstallMultipleProtocolInterfaces ( > > - Sock->SockHandle, > > - &gEfiTcp4ProtocolGuid, > > - SockProtocol, > > - NULL > > - ); > > - SockDestroy (Sock); > > - return NULL; > > -} > > - > > - > > -/** > > - Configure the specific socket Sock using configuration data > ConfigData. > > - > > - @param Sock Pointer to the socket to be configured. > > - @param ConfigData Pointer to the configuration data. > > - > > - @retval EFI_SUCCESS The socket is configured successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket or > > the > > - socket is already configured. > > - > > -**/ > > -EFI_STATUS > > -SockConfigure ( > > - IN SOCKET *Sock, > > - IN VOID *ConfigData > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockConfigure: Get the access for " > > - "socket failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (SOCK_IS_CONFIGURED (Sock)) { > > - Status = EFI_ACCESS_DENIED; > > - goto OnExit; > > - } > > - > > - ASSERT (Sock->State == SO_CLOSED); > > - > > - Status = Sock->ProtoHandler (Sock, SOCK_CONFIGURE, ConfigData); > > - > > -OnExit: > > - EfiReleaseLock (&(Sock->Lock)); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Initiate a connection establishment process. > > - > > - @param Sock Pointer to the socket to initiate the > initate the > > - connection. > > - @param Token Pointer to the token used for the > connection > > - operation. > > - > > - @retval EFI_SUCCESS The connection is initialized > successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > configured to > > - be an active one, or the token is > already in one of > > - this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockConnect ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_EVENT Event; > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockConnect: Get the access for " > > - "socket failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (SOCK_IS_NO_MAPPING (Sock)) { > > - Status = EFI_NO_MAPPING; > > - goto OnExit; > > - } > > - > > - if (SOCK_IS_UNCONFIGURED (Sock)) { > > - > > - Status = EFI_NOT_STARTED; > > - goto OnExit; > > - } > > - > > - if (!SOCK_IS_CLOSED (Sock) || !SOCK_IS_CONFIGURED_ACTIVE (Sock)) { > > - > > - Status = EFI_ACCESS_DENIED; > > - goto OnExit; > > - } > > - > > - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; > > - > > - if (SockTokenExisted (Sock, Event)) { > > - > > - Status = EFI_ACCESS_DENIED; > > - goto OnExit; > > - } > > - > > - Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *) Token; > > - SockSetState (Sock, SO_CONNECTING); > > - Status = Sock->ProtoHandler (Sock, SOCK_CONNECT, NULL); > > - > > -OnExit: > > - EfiReleaseLock (&(Sock->Lock)); > > - return Status; > > -} > > - > > - > > -/** > > - Issue a listen token to get an existed connected network instance > > - or wait for a connection if there is none. > > - > > - @param Sock Pointer to the socket to accept > connections. > > - @param Token The token to accept a connection. > > - > > - @retval EFI_SUCCESS Either a connection is accpeted or the > Token is > > - buffered for further acception. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > configured to > > - be a passive one, or the token is > already in one of > > - this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to > > memory limit. > > - > > -**/ > > -EFI_STATUS > > -SockAccept ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ) > > -{ > > - EFI_TCP4_LISTEN_TOKEN *ListenToken; > > - LIST_ENTRY *ListEntry; > > - EFI_STATUS Status; > > - SOCKET *Socket; > > - EFI_EVENT Event; > > - > > - ASSERT (SockStream == Sock->Type); > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockAccept: Get the access for socket" > > - " failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (SOCK_IS_NO_MAPPING (Sock)) { > > - Status = EFI_NO_MAPPING; > > - goto Exit; > > - } > > - > > - if (SOCK_IS_UNCONFIGURED (Sock)) { > > - > > - Status = EFI_NOT_STARTED; > > - goto Exit; > > - } > > - > > - if (!SOCK_IS_LISTENING (Sock)) { > > - > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; > > - > > - if (SockTokenExisted (Sock, Event)) { > > - > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) Token; > > - > > - // > > - // Check if a connection has already in this Sock->ConnectionList > > - // > > - NET_LIST_FOR_EACH (ListEntry, &Sock->ConnectionList) { > > - > > - Socket = NET_LIST_USER_STRUCT (ListEntry, SOCKET, ConnectionList); > > - > > - if (SOCK_IS_CONNECTED (Socket)) { > > - ListenToken->NewChildHandle = Socket->SockHandle; > > - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); > > - > > - RemoveEntryList (ListEntry); > > - > > - ASSERT (Socket->Parent != NULL); > > - > > - Socket->Parent->ConnCnt--; > > - > > - DEBUG ( > > - (EFI_D_NET, > > - "SockAccept: Accept a socket, now conncount is %d", > > - Socket->Parent->ConnCnt) > > - ); > > - Socket->Parent = NULL; > > - > > - goto Exit; > > - } > > - } > > - > > - // > > - // Buffer this token for latter incoming connection request > > - // > > - if (NULL == SockBufferToken (Sock, &(Sock->ListenTokenList), Token, > 0)) { > > - > > - Status = EFI_OUT_OF_RESOURCES; > > - } > > - > > -Exit: > > - EfiReleaseLock (&(Sock->Lock)); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Issue a token with data to the socket to send out. > > - > > - @param Sock Pointer to the socket to process the > token with > > - data. > > - @param Token The token with data that needs to send > out. > > - > > - @retval EFI_SUCCESS The token is processed successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > in a > > - synchronized state , or the token is > already in one > > - of this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > > memory limit. > > - > > -**/ > > -EFI_STATUS > > -SockSend ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ) > > -{ > > - SOCK_IO_TOKEN *SndToken; > > - EFI_EVENT Event; > > - UINT32 FreeSpace; > > - EFI_TCP4_TRANSMIT_DATA *TxData; > > - EFI_STATUS Status; > > - SOCK_TOKEN *SockToken; > > - UINT32 DataLen; > > - > > - ASSERT (SockStream == Sock->Type); > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockSend: Get the access for socket" > > - " failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (SOCK_IS_NO_MAPPING (Sock)) { > > - Status = EFI_NO_MAPPING; > > - goto Exit; > > - } > > - > > - SndToken = (SOCK_IO_TOKEN *) Token; > > - TxData = (EFI_TCP4_TRANSMIT_DATA *) SndToken->Packet.TxData; > > - > > - if (SOCK_IS_UNCONFIGURED (Sock)) { > > - Status = EFI_NOT_STARTED; > > - goto Exit; > > - } > > - > > - if (!(SOCK_IS_CONNECTING (Sock) || SOCK_IS_CONNECTED (Sock))) { > > - > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - // > > - // check if a token is already in the token buffer > > - // > > - Event = SndToken->Token.Event; > > - > > - if (SockTokenExisted (Sock, Event)) { > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - DataLen = (UINT32) TxData->DataLength; > > - > > - // > > - // process this sending token now or buffer it only? > > - // > > - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); > > - > > - if ((FreeSpace < Sock->SndBuffer.LowWater) || !SOCK_IS_CONNECTED > > (Sock)) { > > - > > - SockToken = SockBufferToken ( > > - Sock, > > - &Sock->SndTokenList, > > - SndToken, > > - DataLen > > - ); > > - > > - if (NULL == SockToken) { > > - Status = EFI_OUT_OF_RESOURCES; > > - } > > - } else { > > - > > - SockToken = SockBufferToken ( > > - Sock, > > - &Sock->ProcessingSndTokenList, > > - SndToken, > > - DataLen > > - ); > > - > > - if (NULL == SockToken) { > > - DEBUG ((EFI_D_ERROR, "SockSend: Failed to buffer IO token into" > > - " socket processing SndToken List\n", Status)); > > - > > - Status = EFI_OUT_OF_RESOURCES; > > - goto Exit; > > - } > > - > > - Status = SockProcessTcpSndData (Sock, TxData); > > - > > - if (EFI_ERROR (Status)) { > > - DEBUG ((EFI_D_ERROR, "SockSend: Failed to process " > > - "Snd Data\n", Status)); > > - > > - RemoveEntryList (&(SockToken->TokenList)); > > - FreePool (SockToken); > > - } > > - } > > - > > -Exit: > > - EfiReleaseLock (&(Sock->Lock)); > > - return Status; > > -} > > - > > - > > -/** > > - Issue a token to get data from the socket. > > - > > - @param Sock Pointer to the socket to get data from. > > - @param Token The token to store the received data > from the > > - socket. > > - > > - @retval EFI_SUCCESS The token is processed successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > in a > > - synchronized state , or the token is > already in one > > - of this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - @retval EFI_CONNECTION_FIN The connection is closed and there is no > > more data. > > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > > memory limit. > > - > > -**/ > > -EFI_STATUS > > -SockRcv ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ) > > -{ > > - SOCK_IO_TOKEN *RcvToken; > > - UINT32 RcvdBytes; > > - EFI_STATUS Status; > > - EFI_EVENT Event; > > - > > - ASSERT (SockStream == Sock->Type); > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockRcv: Get the access for socket" > > - " failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (SOCK_IS_NO_MAPPING (Sock)) { > > - > > - Status = EFI_NO_MAPPING; > > - goto Exit; > > - } > > - > > - if (SOCK_IS_UNCONFIGURED (Sock)) { > > - > > - Status = EFI_NOT_STARTED; > > - goto Exit; > > - } > > - > > - if (!(SOCK_IS_CONNECTED (Sock) || SOCK_IS_CONNECTING (Sock))) { > > - > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - RcvToken = (SOCK_IO_TOKEN *) Token; > > - > > - // > > - // check if a token is already in the token buffer of this socket > > - // > > - Event = RcvToken->Token.Event; > > - if (SockTokenExisted (Sock, Event)) { > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - RcvToken = (SOCK_IO_TOKEN *) Token; > > - RcvdBytes = GET_RCV_DATASIZE (Sock); > > - > > - // > > - // check whether an error has happened before > > - // > > - if (EFI_ABORTED != Sock->SockError) { > > - > > - SIGNAL_TOKEN (&(RcvToken->Token), Sock->SockError); > > - Sock->SockError = EFI_ABORTED; > > - goto Exit; > > - } > > - > > - // > > - // check whether can not receive and there is no any > > - // data buffered in Sock->RcvBuffer > > - // > > - if (SOCK_IS_NO_MORE_DATA (Sock) && (0 == RcvdBytes)) { > > - > > - Status = EFI_CONNECTION_FIN; > > - goto Exit; > > - } > > - > > - if (RcvdBytes != 0) { > > - SockProcessRcvToken (Sock, RcvToken); > > - > > - Status = Sock->ProtoHandler (Sock, SOCK_CONSUMED, NULL); > > - } else { > > - > > - if (NULL == SockBufferToken (Sock, &Sock->RcvTokenList, RcvToken, > 0)) { > > - Status = EFI_OUT_OF_RESOURCES; > > - } > > - } > > - > > -Exit: > > - EfiReleaseLock (&(Sock->Lock)); > > - return Status; > > -} > > - > > - > > -/** > > - Reset the socket and its associated protocol control block. > > - > > - @param Sock Pointer to the socket to be flushed. > > - > > - @retval EFI_SUCCESS The socket is flushed successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket. > > - > > -**/ > > -EFI_STATUS > > -SockFlush ( > > - IN SOCKET *Sock > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - ASSERT (SockStream == Sock->Type); > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockFlush: Get the access for socket" > > - " failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (!SOCK_IS_CONFIGURED (Sock)) { > > - goto Exit; > > - } > > - > > - Status = Sock->ProtoHandler (Sock, SOCK_FLUSH, NULL); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "SockFlush: Protocol failed handling" > > - " SOCK_FLUSH with %r", Status)); > > - > > - goto Exit; > > - } > > - > > - SOCK_ERROR (Sock, EFI_ABORTED); > > - SockConnFlush (Sock); > > - SockSetState (Sock, SO_CLOSED); > > - > > - Sock->ConfigureState = SO_UNCONFIGURED; > > - > > -Exit: > > - EfiReleaseLock (&(Sock->Lock)); > > - return Status; > > -} > > - > > - > > -/** > > - Close or abort the socket associated connection. > > - > > - @param Sock Pointer to the socket of the connection > to close or > > - abort. > > - @param Token The token for close operation. > > - @param OnAbort TRUE for aborting the connection, FALSE > to close it. > > - > > - @retval EFI_SUCCESS The close or abort operation is > initialized > > - successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > in a > > - synchronized state , or the token is > already in one > > - of this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockClose ( > > - IN SOCKET *Sock, > > - IN VOID *Token, > > - IN BOOLEAN OnAbort > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_EVENT Event; > > - > > - ASSERT (SockStream == Sock->Type); > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - DEBUG ((EFI_D_ERROR, "SockClose: Get the access for socket" > > - " failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (SOCK_IS_NO_MAPPING (Sock)) { > > - Status = EFI_NO_MAPPING; > > - goto Exit; > > - } > > - > > - if (SOCK_IS_UNCONFIGURED (Sock)) { > > - Status = EFI_NOT_STARTED; > > - goto Exit; > > - } > > - > > - if (SOCK_IS_DISCONNECTING (Sock)) { > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; > > - > > - if (SockTokenExisted (Sock, Event)) { > > - Status = EFI_ACCESS_DENIED; > > - goto Exit; > > - } > > - > > - Sock->CloseToken = Token; > > - SockSetState (Sock, SO_DISCONNECTING); > > - > > - if (OnAbort) { > > - Status = Sock->ProtoHandler (Sock, SOCK_ABORT, NULL); > > - } else { > > - Status = Sock->ProtoHandler (Sock, SOCK_CLOSE, NULL); > > - } > > - > > -Exit: > > - EfiReleaseLock (&(Sock->Lock)); > > - return Status; > > -} > > - > > - > > -/** > > - Get the mode data of the low layer protocol. > > - > > - @param Sock Pointer to the socket to get mode data > from. > > - @param Mode Pointer to the data to store the low > layer mode > > - information. > > - > > - @retval EFI_SUCCESS The mode data is got successfully. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockGetMode ( > > - IN SOCKET *Sock, > > - IN OUT VOID *Mode > > - ) > > -{ > > - return Sock->ProtoHandler (Sock, SOCK_MODE, Mode); > > -} > > - > > - > > - > > - > > - > > -/** > > - Add or remove route information in IP route table associated > > - with this socket. > > - > > - @param Sock Pointer to the socket associated with > the IP route > > - table to operate on. > > - @param RouteInfo Pointer to the route information to be > processed. > > - > > - @retval EFI_SUCCESS The route table is updated successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockRoute ( > > - IN SOCKET *Sock, > > - IN VOID *RouteInfo > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - Status = EfiAcquireLockOrFail (&(Sock->Lock)); > > - if (EFI_ERROR (Status)) { > > - DEBUG ((EFI_D_ERROR, "SockRoute: Get the access for socket" > > - " failed with %r", Status)); > > - > > - return EFI_ACCESS_DENIED; > > - } > > - > > - if (SOCK_IS_NO_MAPPING (Sock)) { > > - Status = EFI_NO_MAPPING; > > - goto Exit; > > - } > > - > > - if (SOCK_IS_UNCONFIGURED (Sock)) { > > - Status = EFI_NOT_STARTED; > > - goto Exit; > > - } > > - > > - Status = Sock->ProtoHandler (Sock, SOCK_ROUTE, RouteInfo); > > - > > -Exit: > > - EfiReleaseLock (&(Sock->Lock)); > > - return Status; > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > deleted file mode 100644 > > index a0f97d603171..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > +++ /dev/null > > @@ -1,717 +0,0 @@ > > -/** @file > > - Tcp request dispatcher implementation. > > - > > -(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Tcp4Main.h" > > - > > -#define TCP_COMP_VAL(Min, Max, Default, Val) \ > > - ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default)) > > - > > -/** > > - Add or remove a route entry in the IP route table associated with > this TCP > > instance. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param RouteInfo Pointer to the route info to be > processed. > > - > > - @retval EFI_SUCCESS The operation completed successfully. > > - @retval EFI_NOT_STARTED The driver instance has not been > started. > > - @retval EFI_NO_MAPPING When using the default address, > > configuration(DHCP, > > - BOOTP, RARP, etc.) is not finished yet. > > - @retval EFI_OUT_OF_RESOURCES Could not add the entry to the routing > > table. > > - @retval EFI_NOT_FOUND This route is not in the routing table > > - (when RouteInfo->DeleteRoute is TRUE). > > - @retval EFI_ACCESS_DENIED The route is already defined in the > routing > > table > > - (when RouteInfo->DeleteRoute is FALSE). > > -**/ > > -EFI_STATUS > > -Tcp4Route ( > > - IN TCP_CB *Tcb, > > - IN TCP4_ROUTE_INFO *RouteInfo > > - ) > > -{ > > - EFI_IP4_PROTOCOL *Ip4; > > - > > - Ip4 = Tcb->IpInfo->Ip.Ip4; > > - > > - ASSERT (Ip4 != NULL); > > - > > - return Ip4->Routes ( > > - Ip4, > > - RouteInfo->DeleteRoute, > > - RouteInfo->SubnetAddress, > > - RouteInfo->SubnetMask, > > - RouteInfo->GatewayAddress > > - ); > > - > > -} > > - > > - > > -/** > > - Get the operational settings of this TCP instance. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param Mode Pointer to the buffer to store the > operational > > - settings. > > - > > - @retval EFI_SUCCESS The mode data is read. > > - @retval EFI_NOT_STARTED No configuration data is available > because > > this > > - instance hasn't been started. > > - > > -**/ > > -EFI_STATUS > > -Tcp4GetMode ( > > - IN TCP_CB *Tcb, > > - IN OUT TCP4_MODE_DATA *Mode > > - ) > > -{ > > - SOCKET *Sock; > > - EFI_TCP4_CONFIG_DATA *ConfigData; > > - EFI_TCP4_ACCESS_POINT *AccessPoint; > > - EFI_TCP4_OPTION *Option; > > - EFI_IP4_PROTOCOL *Ip; > > - > > - Sock = Tcb->Sk; > > - > > - if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) { > > - return EFI_NOT_STARTED; > > - } > > - > > - if (Mode->Tcp4State != NULL) { > > - *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State; > > - } > > - > > - if (Mode->Tcp4ConfigData != NULL) { > > - > > - ConfigData = Mode->Tcp4ConfigData; > > - AccessPoint = &(ConfigData->AccessPoint); > > - Option = ConfigData->ControlOption; > > - > > - ConfigData->TypeOfService = Tcb->Tos; > > - ConfigData->TimeToLive = Tcb->Ttl; > > - > > - AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr; > > - > > - IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip); > > - IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask); > > - AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port); > > - > > - IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb- > > >RemoteEnd.Ip); > > - AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port); > > - AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != > TCP_LISTEN); > > - > > - if (Option != NULL) { > > - Option->ReceiveBufferSize = GET_RCV_BUFFSIZE (Tcb->Sk); > > - Option->SendBufferSize = GET_SND_BUFFSIZE (Tcb->Sk); > > - Option->MaxSynBackLog = GET_BACKLOG (Tcb->Sk); > > - > > - Option->ConnectionTimeout = Tcb->ConnectTimeout / > TCP_TICK_HZ; > > - Option->DataRetries = Tcb->MaxRexmit; > > - Option->FinTimeout = Tcb->FinWait2Timeout / > TCP_TICK_HZ; > > - Option->TimeWaitTimeout = Tcb->TimeWaitTimeout / > TCP_TICK_HZ; > > - Option->KeepAliveProbes = Tcb->MaxKeepAlive; > > - Option->KeepAliveTime = Tcb->KeepAliveIdle / > TCP_TICK_HZ; > > - Option->KeepAliveInterval = Tcb->KeepAlivePeriod / > TCP_TICK_HZ; > > - > > - Option->EnableNagle = (BOOLEAN) (!TCP_FLG_ON (Tcb- > >CtrlFlag, > > TCP_CTRL_NO_NAGLE)); > > - Option->EnableTimeStamp = (BOOLEAN) (!TCP_FLG_ON (Tcb- > >CtrlFlag, > > TCP_CTRL_NO_TS)); > > - Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb- > > >CtrlFlag, TCP_CTRL_NO_WS)); > > - > > - Option->EnableSelectiveAck = FALSE; > > - Option->EnablePathMtuDiscovery = FALSE; > > - } > > - } > > - > > - Ip = Tcb->IpInfo->Ip.Ip4; > > - ASSERT (Ip != NULL); > > - > > - return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode- > > >MnpConfigData, Mode->SnpModeData); > > -} > > - > > - > > -/** > > - If AP->StationPort isn't zero, check whether the access point > > - is registered, else generate a random station port for this > > - access point. > > - > > - @param AP Pointer to the access point. > > - > > - @retval EFI_SUCCESS The check is passed or the port is > assigned. > > - @retval EFI_INVALID_PARAMETER The non-zero station port is already > > used. > > - @retval EFI_OUT_OF_RESOURCES No port can be allocated. > > - > > -**/ > > -EFI_STATUS > > -Tcp4Bind ( > > - IN EFI_TCP4_ACCESS_POINT *AP > > - ) > > -{ > > - BOOLEAN Cycle; > > - > > - if (0 != AP->StationPort) { > > - // > > - // check if a same endpoint is bound > > - // > > - if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) { > > - > > - return EFI_INVALID_PARAMETER; > > - } > > - } else { > > - // > > - // generate a random port > > - // > > - Cycle = FALSE; > > - > > - if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) { > > - mTcp4RandomPort = TCP4_PORT_KNOWN; > > - } > > - > > - mTcp4RandomPort++; > > - > > - while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) { > > - > > - mTcp4RandomPort++; > > - > > - if (mTcp4RandomPort <= TCP4_PORT_KNOWN) { > > - > > - if (Cycle) { > > - DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated " > > - "for this pcb\n")); > > - > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - mTcp4RandomPort = TCP4_PORT_KNOWN + 1; > > - > > - Cycle = TRUE; > > - } > > - > > - } > > - > > - AP->StationPort = mTcp4RandomPort; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Flush the Tcb add its associated protocols. > > - > > - @param Tcb Pointer to the TCP_CB to be flushed. > > - > > -**/ > > -VOID > > -Tcp4FlushPcb ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - SOCKET *Sock; > > - > > - IpIoConfigIp (Tcb->IpInfo, NULL); > > - > > - Sock = Tcb->Sk; > > - > > - if (SOCK_IS_CONFIGURED (Sock)) { > > - RemoveEntryList (&Tcb->List); > > - > > - // > > - // Uninstall the device path protocol. > > - // > > - if (Sock->DevicePath != NULL) { > > - gBS->UninstallProtocolInterface ( > > - Sock->SockHandle, > > - &gEfiDevicePathProtocolGuid, > > - Sock->DevicePath > > - ); > > - FreePool (Sock->DevicePath); > > - } > > - } > > - > > - NetbufFreeList (&Tcb->SndQue); > > - NetbufFreeList (&Tcb->RcvQue); > > - Tcb->State = TCP_CLOSED; > > -} > > - > > -/** > > - Attach a Pcb to the socket. > > - > > - @param Sk Pointer to the socket of this TCP > instance. > > - > > - @retval EFI_SUCCESS The operation is completed > successfully. > > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > > - > > -**/ > > -EFI_STATUS > > -Tcp4AttachPcb ( > > - IN SOCKET *Sk > > - ) > > -{ > > - TCP_CB *Tcb; > > - TCP4_PROTO_DATA *ProtoData; > > - IP_IO *IpIo; > > - EFI_STATUS Status; > > - VOID *Ip; > > - > > - Tcb = AllocateZeroPool (sizeof (TCP_CB)); > > - > > - if (Tcb == NULL) { > > - > > - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a > TCB\n")); > > - > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; > > - IpIo = ProtoData->TcpService->IpIo; > > - > > - // > > - // Create an IpInfo for this Tcb. > > - // > > - Tcb->IpInfo = IpIoAddIp (IpIo); > > - if (Tcb->IpInfo == NULL) { > > - > > - FreePool (Tcb); > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - // > > - // Open the new created IP instance BY_CHILD. > > - // > > - Status = gBS->OpenProtocol ( > > - Tcb->IpInfo->ChildHandle, > > - &gEfiIp4ProtocolGuid, > > - &Ip, > > - IpIo->Image, > > - Sk->SockHandle, > > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > > - ); > > - if (EFI_ERROR (Status)) { > > - IpIoRemoveIp (IpIo, Tcb->IpInfo); > > - return Status; > > - } > > - > > - InitializeListHead (&Tcb->List); > > - InitializeListHead (&Tcb->SndQue); > > - InitializeListHead (&Tcb->RcvQue); > > - > > - Tcb->State = TCP_CLOSED; > > - Tcb->Sk = Sk; > > - ProtoData->TcpPcb = Tcb; > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Detach the Pcb of the socket. > > - > > - @param Sk Pointer to the socket of this TCP > instance. > > - > > -**/ > > -VOID > > -Tcp4DetachPcb ( > > - IN SOCKET *Sk > > - ) > > -{ > > - TCP4_PROTO_DATA *ProtoData; > > - TCP_CB *Tcb; > > - > > - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; > > - Tcb = ProtoData->TcpPcb; > > - > > - ASSERT (Tcb != NULL); > > - > > - Tcp4FlushPcb (Tcb); > > - > > - IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo); > > - > > - FreePool (Tcb); > > - > > - ProtoData->TcpPcb = NULL; > > -} > > - > > - > > -/** > > - Configure the Pcb using CfgData. > > - > > - @param Sk Pointer to the socket of this TCP > instance. > > - @param CfgData Pointer to the TCP configuration data. > > - > > - @retval EFI_SUCCESS The operation is completed > successfully. > > - @retval EFI_INVALID_PARAMETER A same access point has been > > configured in > > - another TCP instance. > > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > > - > > -**/ > > -EFI_STATUS > > -Tcp4ConfigurePcb ( > > - IN SOCKET *Sk, > > - IN EFI_TCP4_CONFIG_DATA *CfgData > > - ) > > -{ > > - EFI_IP4_CONFIG_DATA IpCfgData; > > - EFI_STATUS Status; > > - EFI_TCP4_OPTION *Option; > > - TCP4_PROTO_DATA *TcpProto; > > - TCP_CB *Tcb; > > - > > - ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != > NULL)); > > - > > - TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved; > > - Tcb = TcpProto->TcpPcb; > > - > > - ASSERT (Tcb != NULL); > > - > > - // > > - // Add Ip for send pkt to the peer > > - // > > - CopyMem (&IpCfgData, &mIp4IoDefaultIpConfigData, sizeof (IpCfgData)); > > - IpCfgData.DefaultProtocol = EFI_IP_PROTO_TCP; > > - IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress; > > - IpCfgData.StationAddress = CfgData->AccessPoint.StationAddress; > > - IpCfgData.SubnetMask = CfgData->AccessPoint.SubnetMask; > > - IpCfgData.ReceiveTimeout = (UINT32) (-1); > > - > > - // > > - // Configure the IP instance this Tcb consumes. > > - // > > - Status = IpIoConfigIp (Tcb->IpInfo, &IpCfgData); > > - if (EFI_ERROR (Status)) { > > - goto OnExit; > > - } > > - > > - // > > - // Get the default address info if the instance is configured to use > default > > address. > > - // > > - if (CfgData->AccessPoint.UseDefaultAddress) { > > - CfgData->AccessPoint.StationAddress = IpCfgData.StationAddress; > > - CfgData->AccessPoint.SubnetMask = IpCfgData.SubnetMask; > > - } > > - > > - // > > - // check if we can bind this endpoint in CfgData > > - // > > - Status = Tcp4Bind (&(CfgData->AccessPoint)); > > - > > - if (EFI_ERROR (Status)) { > > - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed " > > - "with %r\n", Status)); > > - > > - goto OnExit; > > - } > > - > > - // > > - // Initalize the operating information in this Tcb > > - // > > - ASSERT (Tcb->State == TCP_CLOSED && > > - IsListEmpty (&Tcb->SndQue) && > > - IsListEmpty (&Tcb->RcvQue)); > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); > > - Tcb->State = TCP_CLOSED; > > - > > - Tcb->SndMss = 536; > > - Tcb->RcvMss = TcpGetRcvMss (Sk); > > - > > - Tcb->SRtt = 0; > > - Tcb->Rto = 3 * TCP_TICK_HZ; > > - > > - Tcb->CWnd = Tcb->SndMss; > > - Tcb->Ssthresh = 0xffffffff; > > - > > - Tcb->CongestState = TCP_CONGEST_OPEN; > > - > > - Tcb->KeepAliveIdle = TCP_KEEPALIVE_IDLE_MIN; > > - Tcb->KeepAlivePeriod = TCP_KEEPALIVE_PERIOD; > > - Tcb->MaxKeepAlive = TCP_MAX_KEEPALIVE; > > - Tcb->MaxRexmit = TCP_MAX_LOSS; > > - Tcb->FinWait2Timeout = TCP_FIN_WAIT2_TIME; > > - Tcb->TimeWaitTimeout = TCP_TIME_WAIT_TIME; > > - Tcb->ConnectTimeout = TCP_CONNECT_TIME; > > - > > - // > > - // initialize Tcb in the light of CfgData > > - // > > - Tcb->Ttl = CfgData->TimeToLive; > > - Tcb->Tos = CfgData->TypeOfService; > > - > > - Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress; > > - > > - CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, > > sizeof (IP4_ADDR)); > > - Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort); > > - IP4_COPY_ADDRESS (&Tcb->SubnetMask, &CfgData- > > >AccessPoint.SubnetMask); > > - > > - if (CfgData->AccessPoint.ActiveFlag) { > > - CopyMem (&Tcb->RemoteEnd.Ip, &CfgData- > > >AccessPoint.RemoteAddress, sizeof (IP4_ADDR)); > > - Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort); > > - } else { > > - Tcb->RemoteEnd.Ip = 0; > > - Tcb->RemoteEnd.Port = 0; > > - } > > - > > - Option = CfgData->ControlOption; > > - > > - if (Option != NULL) { > > - SET_RCV_BUFFSIZE ( > > - Sk, > > - (UINT32) (TCP_COMP_VAL ( > > - TCP_RCV_BUF_SIZE_MIN, > > - TCP_RCV_BUF_SIZE, > > - TCP_RCV_BUF_SIZE, > > - Option->ReceiveBufferSize > > - ) > > - ) > > - ); > > - SET_SND_BUFFSIZE ( > > - Sk, > > - (UINT32) (TCP_COMP_VAL ( > > - TCP_SND_BUF_SIZE_MIN, > > - TCP_SND_BUF_SIZE, > > - TCP_SND_BUF_SIZE, > > - Option->SendBufferSize > > - ) > > - ) > > - ); > > - > > - SET_BACKLOG ( > > - Sk, > > - (UINT32) (TCP_COMP_VAL ( > > - TCP_BACKLOG_MIN, > > - TCP_BACKLOG, > > - TCP_BACKLOG, > > - Option->MaxSynBackLog > > - ) > > - ) > > - ); > > - > > - Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL ( > > - TCP_MAX_LOSS_MIN, > > - TCP_MAX_LOSS, > > - TCP_MAX_LOSS, > > - Option->DataRetries > > - ); > > - Tcb->FinWait2Timeout = TCP_COMP_VAL ( > > - TCP_FIN_WAIT2_TIME, > > - TCP_FIN_WAIT2_TIME_MAX, > > - TCP_FIN_WAIT2_TIME, > > - (UINT32) (Option->FinTimeout * > TCP_TICK_HZ) > > - ); > > - > > - if (Option->TimeWaitTimeout != 0) { > > - Tcb->TimeWaitTimeout = TCP_COMP_VAL ( > > - TCP_TIME_WAIT_TIME, > > - TCP_TIME_WAIT_TIME_MAX, > > - TCP_TIME_WAIT_TIME, > > - (UINT32) (Option->TimeWaitTimeout * > TCP_TICK_HZ) > > - ); > > - } else { > > - Tcb->TimeWaitTimeout = 0; > > - } > > - > > - if (Option->KeepAliveProbes != 0) { > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); > > - > > - Tcb->MaxKeepAlive = (UINT8) TCP_COMP_VAL ( > > - TCP_MAX_KEEPALIVE_MIN, > > - TCP_MAX_KEEPALIVE, > > - TCP_MAX_KEEPALIVE, > > - Option->KeepAliveProbes > > - ); > > - Tcb->KeepAliveIdle = TCP_COMP_VAL ( > > - TCP_KEEPALIVE_IDLE_MIN, > > - TCP_KEEPALIVE_IDLE_MAX, > > - TCP_KEEPALIVE_IDLE_MIN, > > - (UINT32) (Option->KeepAliveTime * > TCP_TICK_HZ) > > - ); > > - Tcb->KeepAlivePeriod = TCP_COMP_VAL ( > > - TCP_KEEPALIVE_PERIOD_MIN, > > - TCP_KEEPALIVE_PERIOD, > > - TCP_KEEPALIVE_PERIOD, > > - (UINT32) (Option->KeepAliveInterval * > TCP_TICK_HZ) > > - ); > > - } > > - > > - Tcb->ConnectTimeout = TCP_COMP_VAL ( > > - TCP_CONNECT_TIME_MIN, > > - TCP_CONNECT_TIME, > > - TCP_CONNECT_TIME, > > - (UINT32) (Option->ConnectionTimeout * > TCP_TICK_HZ) > > - ); > > - > > - if (!Option->EnableNagle) { > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE); > > - } > > - > > - if (!Option->EnableTimeStamp) { > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS); > > - } > > - > > - if (!Option->EnableWindowScaling) { > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS); > > - } > > - } > > - > > - // > > - // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is > > - // determined, construct the IP device path and install it. > > - // > > - Status = TcpInstallDevicePath (Sk); > > - if (EFI_ERROR (Status)) { > > - goto OnExit; > > - } > > - > > - // > > - // update state of Tcb and socket > > - // > > - if (!CfgData->AccessPoint.ActiveFlag) { > > - > > - TcpSetState (Tcb, TCP_LISTEN); > > - SockSetState (Sk, SO_LISTENING); > > - > > - Sk->ConfigureState = SO_CONFIGURED_PASSIVE; > > - } else { > > - > > - Sk->ConfigureState = SO_CONFIGURED_ACTIVE; > > - } > > - > > - TcpInsertTcb (Tcb); > > - > > -OnExit: > > - > > - return Status; > > -} > > - > > - > > -/** > > - The procotol handler provided to the socket layer, used to > > - dispatch the socket level requests by calling the corresponding > > - TCP layer functions. > > - > > - @param Sock Pointer to the socket of this TCP > instance. > > - @param Request The code of this operation request. > > - @param Data Pointer to the operation specific data > passed in > > - together with the operation request. > > - > > - @retval EFI_SUCCESS The socket request is completed > successfully. > > - @retval other The error status returned by the > corresponding TCP > > - layer function. > > - > > -**/ > > -EFI_STATUS > > -Tcp4Dispatcher ( > > - IN SOCKET *Sock, > > - IN UINT8 Request, > > - IN VOID *Data OPTIONAL > > - ) > > -{ > > - TCP_CB *Tcb; > > - TCP4_PROTO_DATA *ProtoData; > > - EFI_IP4_PROTOCOL *Ip; > > - > > - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > > - Tcb = ProtoData->TcpPcb; > > - > > - switch (Request) { > > - case SOCK_POLL: > > - Ip = ProtoData->TcpService->IpIo->Ip.Ip4; > > - Ip->Poll (Ip); > > - break; > > - > > - case SOCK_CONSUMED: > > - // > > - // After user received data from socket buffer, socket will > > - // notify TCP using this message to give it a chance to send out > > - // window update information > > - // > > - ASSERT (Tcb != NULL); > > - TcpOnAppConsume (Tcb); > > - break; > > - > > - case SOCK_SND: > > - > > - ASSERT (Tcb != NULL); > > - TcpOnAppSend (Tcb); > > - break; > > - > > - case SOCK_CLOSE: > > - > > - TcpOnAppClose (Tcb); > > - > > - break; > > - > > - case SOCK_ABORT: > > - > > - TcpOnAppAbort (Tcb); > > - > > - break; > > - > > - case SOCK_SNDPUSH: > > - Tcb->SndPsh = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk); > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); > > - > > - break; > > - > > - case SOCK_SNDURG: > > - Tcb->SndUp = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk) - > > 1; > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); > > - > > - break; > > - > > - case SOCK_CONNECT: > > - > > - TcpOnAppConnect (Tcb); > > - > > - break; > > - > > - case SOCK_ATTACH: > > - > > - return Tcp4AttachPcb (Sock); > > - > > - case SOCK_FLUSH: > > - > > - Tcp4FlushPcb (Tcb); > > - > > - break; > > - > > - case SOCK_DETACH: > > - > > - Tcp4DetachPcb (Sock); > > - > > - break; > > - > > - case SOCK_CONFIGURE: > > - > > - return Tcp4ConfigurePcb ( > > - Sock, > > - (EFI_TCP4_CONFIG_DATA *) Data > > - ); > > - > > - case SOCK_MODE: > > - > > - ASSERT ((Data != NULL) && (Tcb != NULL)); > > - > > - return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data); > > - > > - case SOCK_ROUTE: > > - > > - ASSERT ((Data != NULL) && (Tcb != NULL)); > > - > > - return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data); > > - > > - default: > > - return EFI_UNSUPPORTED; > > - } > > - > > - return EFI_SUCCESS; > > - > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > deleted file mode 100644 > > index 2ff8eee8693b..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > +++ /dev/null > > @@ -1,782 +0,0 @@ > > -/** @file > > - Tcp driver function. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Tcp4Main.h" > > - > > - > > -UINT16 mTcp4RandomPort; > > -extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; > > -extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2; > > -extern EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable; > > - > > -TCP4_HEARTBEAT_TIMER mTcp4Timer = { > > - NULL, > > - 0 > > -}; > > - > > -EFI_TCP4_PROTOCOL mTcp4ProtocolTemplate = { > > - Tcp4GetModeData, > > - Tcp4Configure, > > - Tcp4Routes, > > - Tcp4Connect, > > - Tcp4Accept, > > - Tcp4Transmit, > > - Tcp4Receive, > > - Tcp4Close, > > - Tcp4Cancel, > > - Tcp4Poll > > -}; > > - > > -SOCK_INIT_DATA mTcp4DefaultSockData = { > > - SockStream, > > - 0, > > - NULL, > > - TCP_BACKLOG, > > - TCP_SND_BUF_SIZE, > > - TCP_RCV_BUF_SIZE, > > - &mTcp4ProtocolTemplate, > > - Tcp4CreateSocketCallback, > > - Tcp4DestroySocketCallback, > > - NULL, > > - NULL, > > - 0, > > - Tcp4Dispatcher, > > - NULL, > > -}; > > - > > -EFI_DRIVER_BINDING_PROTOCOL mTcp4DriverBinding = { > > - Tcp4DriverBindingSupported, > > - Tcp4DriverBindingStart, > > - Tcp4DriverBindingStop, > > - 0xa, > > - NULL, > > - NULL > > -}; > > - > > -EFI_SERVICE_BINDING_PROTOCOL mTcp4ServiceBinding = { > > - Tcp4ServiceBindingCreateChild, > > - Tcp4ServiceBindingDestroyChild > > -}; > > - > > - > > -/** > > - Create and start the heartbeat timer for TCP driver. > > - > > - @retval EFI_SUCCESS The timer is successfully created and > started. > > - @retval other The timer is not created. > > - > > -**/ > > -EFI_STATUS > > -Tcp4CreateTimer ( > > - VOID > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - Status = EFI_SUCCESS; > > - > > - if (mTcp4Timer.RefCnt == 0) { > > - > > - Status = gBS->CreateEvent ( > > - EVT_TIMER | EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - TcpTicking, > > - NULL, > > - &mTcp4Timer.TimerEvent > > - ); > > - if (!EFI_ERROR (Status)) { > > - > > - Status = gBS->SetTimer ( > > - mTcp4Timer.TimerEvent, > > - TimerPeriodic, > > - (UINT64) (TICKS_PER_SECOND / TCP_TICK_HZ) > > - ); > > - } > > - } > > - > > - if (!EFI_ERROR (Status)) { > > - > > - mTcp4Timer.RefCnt++; > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - Stop and destroy the heartbeat timer for TCP driver. > > - > > -**/ > > -VOID > > -Tcp4DestroyTimer ( > > - VOID > > - ) > > -{ > > - ASSERT (mTcp4Timer.RefCnt > 0); > > - > > - mTcp4Timer.RefCnt--; > > - > > - if (mTcp4Timer.RefCnt > 0) { > > - return; > > - } > > - > > - gBS->SetTimer (mTcp4Timer.TimerEvent, TimerCancel, 0); > > - gBS->CloseEvent (mTcp4Timer.TimerEvent); > > - mTcp4Timer.TimerEvent = NULL; > > -} > > - > > -/** > > - Callback function which provided by user to remove one node in > > NetDestroyLinkList process. > > - > > - @param[in] Entry The entry to be removed. > > - @param[in] Context Pointer to the callback context > corresponds to > > the Context in NetDestroyLinkList. > > - > > - @retval EFI_SUCCESS The entry has been removed successfully. > > - @retval Others Fail to remove the entry. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DestroyChildEntryInHandleBuffer ( > > - IN LIST_ENTRY *Entry, > > - IN VOID *Context > > - ) > > -{ > > - SOCKET *Sock; > > - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; > > - UINTN NumberOfChildren; > > - EFI_HANDLE *ChildHandleBuffer; > > - > > - if (Entry == NULL || Context == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Sock = NET_LIST_USER_STRUCT_S (Entry, SOCKET, Link, SOCK_SIGNATURE); > > - ServiceBinding = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) > > Context)->ServiceBinding; > > - NumberOfChildren = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT > > *) Context)->NumberOfChildren; > > - ChildHandleBuffer = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT > > *) Context)->ChildHandleBuffer; > > - > > - if (!NetIsInHandleBuffer (Sock->SockHandle, NumberOfChildren, > > ChildHandleBuffer)) { > > - return EFI_SUCCESS; > > - } > > - > > - return ServiceBinding->DestroyChild (ServiceBinding, Sock- > >SockHandle); > > -} > > - > > -/** > > - The entry point for Tcp4 driver, used to install Tcp4 driver on the > > ImageHandle. > > - > > - @param ImageHandle The firmware allocated handle for this > > - driver image. > > - @param SystemTable Pointer to the EFI system table. > > - > > - @retval EFI_SUCCESS Driver loaded. > > - @retval other Driver not loaded. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverEntryPoint ( > > - IN EFI_HANDLE ImageHandle, > > - IN EFI_SYSTEM_TABLE *SystemTable > > - ) > > -{ > > - EFI_STATUS Status; > > - UINT32 Seed; > > - > > - // > > - // Install the TCP4 Driver Binding Protocol > > - // > > - Status = EfiLibInstallDriverBindingComponentName2 ( > > - ImageHandle, > > - SystemTable, > > - &mTcp4DriverBinding, > > - ImageHandle, > > - &gTcp4ComponentName, > > - &gTcp4ComponentName2 > > - ); > > - ASSERT_EFI_ERROR (Status); > > - // > > - // Initialize ISS and random port. > > - // > > - Seed = NetRandomInitSeed (); > > - mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; > > - mTcp4RandomPort = (UINT16) (TCP4_PORT_KNOWN + > > - (UINT16) (NET_RANDOM(Seed) % TCP4_PORT_KNOWN)); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Tests to see if this driver supports a given controller. > > - > > - If a child device is provided, it further tests to see if this driver > supports > > - creating a handle for the specified child device. > > - > > - @param This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param ControllerHandle The handle of the controller to test. > This > > handle > > - must support a protocol interface that > supplies > > - an I/O abstraction to the driver. > > - @param RemainingDevicePath A pointer to the remaining portion of a > > device path. > > - This parameter is ignored by device > drivers, and is optional > > for bus drivers. > > - > > - > > - @retval EFI_SUCCESS The device specified by ControllerHandle > and > > - RemainingDevicePath is supported by the > driver > > - specified by This. > > - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle > > and > > - RemainingDevicePath is already being > managed by > > - the driver specified by This. > > - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > > and > > - RemainingDevicePath is already being > managed by a > > - different driver or an application that > requires > > - exclusive access. > > - @retval EFI_UNSUPPORTED The device specified by ControllerHandle > > and > > - RemainingDevicePath is not supported by > the driver > > - specified by This. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverBindingSupported ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ) > > -{ > > - EFI_STATUS Status; > > - > > - // > > - // Test for the Tcp4ServiceBinding Protocol > > - // > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - NULL, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > - ); > > - if (!EFI_ERROR (Status)) { > > - return EFI_ALREADY_STARTED; > > - } > > - > > - // > > - // Test for the Ip4 Protocol > > - // > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiIp4ServiceBindingProtocolGuid, > > - NULL, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > - ); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Start this driver on ControllerHandle. > > - > > - The Start() function is designed to be invoked from the EFI boot > service > > - ConnectController(). As a result, much of the error checking on the > > parameters > > - to Start() has been moved into this common boot service. It is legal > to call > > - Start() from other locations, but the following calling restrictions > must be > > - followed or the system behavior will not be deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE. > > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > > naturally > > - aligned EFI_DEVICE_PATH_PROTOCOL. > > - 3. Prior to calling Start(), the Supported() function for the driver > specified > > - by This must have been called with the same calling parameters, > and > > Supported() > > - must have returned EFI_SUCCESS. > > - > > - @param This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param ControllerHandle The handle of the controller to start. > This > > handle > > - must support a protocol interface that > supplies > > - an I/O abstraction to the driver. > > - @param RemainingDevicePath A pointer to the remaining portion of a > > device path. > > - This parameter is ignored by device > drivers, and is > > - optional for bus drivers. > > - > > - @retval EFI_SUCCESS The device was started. > > - @retval EFI_ALREADY_STARTED The device could not be started due to a > > device error. > > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > > due to a lack > > - of resources. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverBindingStart ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ) > > -{ > > - EFI_STATUS Status; > > - TCP4_SERVICE_DATA *TcpServiceData; > > - IP_IO_OPEN_DATA OpenData; > > - > > - TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA)); > > - > > - if (NULL == TcpServiceData) { > > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" > > - " resource to create a Tcp Servcie Data\n")); > > - > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - // > > - // Create a new IP IO to Consume it > > - // > > - TcpServiceData->IpIo = IpIoCreate ( > > - This->DriverBindingHandle, > > - ControllerHandle, > > - IP_VERSION_4 > > - ); > > - if (NULL == TcpServiceData->IpIo) { > > - > > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" > > - " resource to create an Ip Io\n")); > > - > > - Status = EFI_OUT_OF_RESOURCES; > > - goto ON_ERROR; > > - } > > - > > - // > > - // Configure and start IpIo. > > - // > > - ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA)); > > - > > - CopyMem ( > > - &OpenData.IpConfigData.Ip4CfgData, > > - &mIp4IoDefaultIpConfigData, > > - sizeof (EFI_IP4_CONFIG_DATA) > > - ); > > - > > - OpenData.IpConfigData.Ip4CfgData.DefaultProtocol = EFI_IP_PROTO_TCP; > > - > > - OpenData.PktRcvdNotify = Tcp4RxCallback; > > - Status = IpIoOpen (TcpServiceData->IpIo, &OpenData); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - // > > - // Create the timer event used by TCP driver > > - // > > - Status = Tcp4CreateTimer (); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer" > > - " Event failed with %r\n", Status)); > > - > > - goto ON_ERROR; > > - } > > - > > - // > > - // Install the Tcp4ServiceBinding Protocol on the > > - // controller handle > > - // > > - TcpServiceData->Tcp4ServiceBinding = mTcp4ServiceBinding; > > - > > - Status = gBS->InstallMultipleProtocolInterfaces ( > > - &ControllerHandle, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - &TcpServiceData->Tcp4ServiceBinding, > > - NULL > > - ); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service > > Binding" > > - " Protocol failed for %r\n", Status)); > > - > > - Tcp4DestroyTimer (); > > - goto ON_ERROR; > > - } > > - > > - // > > - // Initialize member in TcpServiceData > > - // > > - TcpServiceData->ControllerHandle = ControllerHandle; > > - TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE; > > - TcpServiceData->DriverBindingHandle = This->DriverBindingHandle; > > - > > - InitializeListHead (&TcpServiceData->SocketList); > > - > > - return EFI_SUCCESS; > > - > > -ON_ERROR: > > - > > - if (TcpServiceData->IpIo != NULL) { > > - IpIoDestroy (TcpServiceData->IpIo); > > - TcpServiceData->IpIo = NULL; > > - } > > - > > - FreePool (TcpServiceData); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Stop this driver on ControllerHandle. > > - > > - The Stop() function is designed to be invoked from the EFI boot > service > > - DisconnectController(). As a result, much of the error checking on > the > > parameters > > - to Stop() has been moved into this common boot service. It is legal > to call > > Stop() > > - from other locations, but the following calling restrictions must be > followed > > - or the system behavior will not be deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > > previous call > > - to this same driver's Start() function. > > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all > be a > > valid > > - EFI_HANDLE. In addition, all of these handles must have been > created in > > this > > - driver's Start() function, and the Start() function must have > called > > OpenProtocol() > > - on ControllerHandle with an Attribute of > > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > > - > > - @param This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param ControllerHandle A handle to the device being stopped. The > > handle must > > - support a bus specific I/O protocol for the > driver > > - to use to stop the device. > > - @param NumberOfChildren The number of child device handles in > > ChildHandleBuffer. > > - @param ChildHandleBuffer An array of child handles to be freed. May > be > > NULL if > > - NumberOfChildren is 0. > > - > > - @retval EFI_SUCCESS The device was stopped. > > - @retval EFI_DEVICE_ERROR The device could not be stopped due to a > > device error. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverBindingStop ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN UINTN NumberOfChildren, > > - IN EFI_HANDLE *ChildHandleBuffer > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_HANDLE NicHandle; > > - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; > > - TCP4_SERVICE_DATA *TcpServiceData; > > - LIST_ENTRY *List; > > - TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context; > > - > > - // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed. > > - // > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiIp4ProtocolGuid); > > - if (NicHandle == NULL) { > > - return EFI_SUCCESS; > > - } > > - > > - // > > - // Retrieve the TCP driver Data Structure > > - // > > - Status = gBS->OpenProtocol ( > > - NicHandle, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - (VOID **) &ServiceBinding, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - > > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service " > > - " Binding Protocol failed with %r\n", Status)); > > - > > - return EFI_DEVICE_ERROR; > > - } > > - > > - TcpServiceData = TCP4_FROM_THIS (ServiceBinding); > > - > > - if (NumberOfChildren != 0) { > > - List = &TcpServiceData->SocketList; > > - Context.ServiceBinding = ServiceBinding; > > - Context.NumberOfChildren = NumberOfChildren; > > - Context.ChildHandleBuffer = ChildHandleBuffer; > > - Status = NetDestroyLinkList ( > > - List, > > - Tcp4DestroyChildEntryInHandleBuffer, > > - &Context, > > - NULL > > - ); > > - } else if (IsListEmpty (&TcpServiceData->SocketList)) { > > - // > > - // Uninstall TCP servicebinding protocol > > - // > > - gBS->UninstallMultipleProtocolInterfaces ( > > - NicHandle, > > - &gEfiTcp4ServiceBindingProtocolGuid, > > - ServiceBinding, > > - NULL > > - ); > > - > > - // > > - // Destroy the IpIO consumed by TCP driver > > - // > > - IpIoDestroy (TcpServiceData->IpIo); > > - TcpServiceData->IpIo = NULL; > > - > > - // > > - // Destroy the heartbeat timer. > > - // > > - Tcp4DestroyTimer (); > > - > > - if (gTcpControllerNameTable != NULL) { > > - FreeUnicodeStringTable (gTcpControllerNameTable); > > - gTcpControllerNameTable = NULL; > > - } > > - > > - // > > - // Release the TCP service data > > - // > > - FreePool (TcpServiceData); > > - > > - Status = EFI_SUCCESS; > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Open Ip4 and device path protocols for a created socket, and insert > it in > > - socket list. > > - > > - @param This Pointer to the socket just created > > - @param Context Context of the socket > > - > > - @retval EFI_SUCCESS This protocol is installed successfully. > > - @retval other Some error occured. > > - > > -**/ > > -EFI_STATUS > > -Tcp4CreateSocketCallback ( > > - IN SOCKET *This, > > - IN VOID *Context > > - ) > > -{ > > - EFI_STATUS Status; > > - TCP4_SERVICE_DATA *TcpServiceData; > > - EFI_IP4_PROTOCOL *Ip4; > > - > > - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)- > > >TcpService; > > - > > - // > > - // Open the default Ip4 protocol of IP_IO BY_DRIVER. > > - // > > - Status = gBS->OpenProtocol ( > > - TcpServiceData->IpIo->ChildHandle, > > - &gEfiIp4ProtocolGuid, > > - (VOID **) &Ip4, > > - TcpServiceData->DriverBindingHandle, > > - This->SockHandle, > > - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // Open the device path on the handle where service binding resides > on. > > - // > > - Status = gBS->OpenProtocol ( > > - TcpServiceData->ControllerHandle, > > - &gEfiDevicePathProtocolGuid, > > - (VOID **) &This->ParentDevicePath, > > - TcpServiceData->DriverBindingHandle, > > - This->SockHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - gBS->CloseProtocol ( > > - TcpServiceData->IpIo->ChildHandle, > > - &gEfiIp4ProtocolGuid, > > - TcpServiceData->DriverBindingHandle, > > - This->SockHandle > > - ); > > - } else { > > - // > > - // Insert this socket into the SocketList. > > - // > > - InsertTailList (&TcpServiceData->SocketList, &This->Link); > > - } > > - > > - return Status; > > -} > > - > > -/** > > - Close Ip4 and device path protocols for a socket, and remove it from > socket > > list. > > - > > - @param This Pointer to the socket to be removed > > - @param Context Context of the socket > > - > > -**/ > > -VOID > > -Tcp4DestroySocketCallback ( > > - IN SOCKET *This, > > - IN VOID *Context > > - ) > > -{ > > - TCP4_SERVICE_DATA *TcpServiceData; > > - > > - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)- > > >TcpService; > > - > > - // > > - // Remove this node from the list. > > - // > > - RemoveEntryList (&This->Link); > > - > > - // > > - // Close the Ip4 protocol. > > - // > > - gBS->CloseProtocol ( > > - TcpServiceData->IpIo->ChildHandle, > > - &gEfiIp4ProtocolGuid, > > - TcpServiceData->DriverBindingHandle, > > - This->SockHandle > > - ); > > -} > > - > > -/** > > - Creates a child handle and installs a protocol. > > - > > - The CreateChild() function installs a protocol on ChildHandle. If > ChildHandle > > - is a pointer to NULL, then a new handle is created and returned in > > ChildHandle. > > - If ChildHandle is not a pointer to NULL, then the protocol installs > on the > > existing > > - ChildHandle. > > - > > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > > instance. > > - @param ChildHandle Pointer to the handle of the child to create. If > it is > > NULL, then > > - a new handle is created. If it is a pointer to an > existing UEFI > > - handle, then the protocol is added to the > existing UEFI handle. > > - > > - @retval EFI_SUCCES The protocol was added to ChildHandle. > > - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. > > - @retval EFI_OUT_OF_RESOURCES There are not enough resources > > available to create > > - the child. > > - @retval other The child handle was not created. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4ServiceBindingCreateChild ( > > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > > - IN OUT EFI_HANDLE *ChildHandle > > - ) > > -{ > > - SOCKET *Sock; > > - TCP4_SERVICE_DATA *TcpServiceData; > > - TCP4_PROTO_DATA TcpProto; > > - EFI_STATUS Status; > > - EFI_TPL OldTpl; > > - > > - if (NULL == This || NULL == ChildHandle) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); > > - Status = EFI_SUCCESS; > > - TcpServiceData = TCP4_FROM_THIS (This); > > - TcpProto.TcpService = TcpServiceData; > > - TcpProto.TcpPcb = NULL; > > - > > - // > > - // Create a tcp instance with defualt Tcp default > > - // sock init data and TcpProto > > - // > > - mTcp4DefaultSockData.ProtoData = &TcpProto; > > - mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA); > > - mTcp4DefaultSockData.DriverBinding = TcpServiceData- > > >DriverBindingHandle; > > - > > - Sock = SockCreateChild (&mTcp4DefaultSockData); > > - if (NULL == Sock) { > > - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: " > > - "No resource to create a Tcp Child\n")); > > - > > - Status = EFI_OUT_OF_RESOURCES; > > - } else { > > - *ChildHandle = Sock->SockHandle; > > - } > > - > > - mTcp4DefaultSockData.ProtoData = NULL; > > - > > - gBS->RestoreTPL (OldTpl); > > - return Status; > > -} > > - > > - > > -/** > > - Destroys a child handle with a protocol installed on it. > > - > > - The DestroyChild() function does the opposite of CreateChild(). It > removes > > a protocol > > - that was installed by CreateChild() from ChildHandle. If the removed > > protocol is the > > - last protocol on ChildHandle, then ChildHandle is destroyed. > > - > > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > > instance. > > - @param ChildHandle Handle of the child to destroy > > - > > - @retval EFI_SUCCES The protocol was removed from > ChildHandle. > > - @retval EFI_UNSUPPORTED ChildHandle does not support the > protocol > > that is > > - being removed. > > - @retval EFI_INVALID_PARAMETER Child handle is NULL. > > - @retval EFI_ACCESS_DENIED The protocol could not be removed from > > the ChildHandle > > - because its services are being used. > > - @retval other The child handle was not destroyed. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4ServiceBindingDestroyChild ( > > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ChildHandle > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_TCP4_PROTOCOL *Tcp4; > > - SOCKET *Sock; > > - > > - if (NULL == This || NULL == ChildHandle) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // > > - // retrieve the Tcp4 protocol from ChildHandle > > - // > > - Status = gBS->OpenProtocol ( > > - ChildHandle, > > - &gEfiTcp4ProtocolGuid, > > - (VOID **) &Tcp4, > > - mTcp4DriverBinding.DriverBindingHandle, > > - ChildHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - Status = EFI_UNSUPPORTED; > > - } else { > > - // > > - // destroy this sock and related Tcp protocol control > > - // block > > - // > > - Sock = SOCK_FROM_THIS (Tcp4); > > - > > - SockDestroyChild (Sock); > > - } > > - > > - return Status; > > -} > > - > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > deleted file mode 100644 > > index f48efdac7cd8..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > +++ /dev/null > > @@ -1,1497 +0,0 @@ > > -/** @file > > - TCP input process routines. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "Tcp4Main.h" > > - > > - > > -/** > > - Check whether the sequence number of the incoming segment is > > acceptable. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seg Pointer to the incoming segment. > > - > > - @retval 1 The sequence number is acceptable. > > - @retval 0 The sequence number is not acceptable. > > - > > -**/ > > -INTN > > -TcpSeqAcceptable ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEG *Seg > > - ) > > -{ > > - return (TCP_SEQ_LEQ (Tcb->RcvNxt, Seg->End) && > > - TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd)); > > -} > > - > > - > > -/** > > - NewReno fast recovery, RFC3782. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seg Segment that triggers the fast recovery. > > - > > -**/ > > -VOID > > -TcpFastRecover ( > > - IN OUT TCP_CB *Tcb, > > - IN TCP_SEG *Seg > > - ) > > -{ > > - UINT32 FlightSize; > > - UINT32 Acked; > > - > > - // > > - // Step 1: Three duplicate ACKs and not in fast recovery > > - // > > - if (Tcb->CongestState != TCP_CONGEST_RECOVER) { > > - > > - // > > - // Step 1A: Invoking fast retransmission. > > - // > > - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); > > - > > - Tcb->Ssthresh = MAX (FlightSize >> 1, (UINT32) (2 * Tcb- > >SndMss)); > > - Tcb->Recover = Tcb->SndNxt; > > - > > - Tcb->CongestState = TCP_CONGEST_RECOVER; > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > > - > > - // > > - // Step 2: Entering fast retransmission > > - // > > - TcpRetransmit (Tcb, Tcb->SndUna); > > - Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss; > > - > > - DEBUG ((EFI_D_NET, "TcpFastRecover: enter fast retransmission" > > - " for TCB %p, recover point is %d\n", Tcb, Tcb->Recover)); > > - return; > > - } > > - > > - // > > - // During fast recovery, execute Step 3, 4, 5 of RFC3782 > > - // > > - if (Seg->Ack == Tcb->SndUna) { > > - > > - // > > - // Step 3: Fast Recovery, > > - // If this is a duplicated ACK, increse Cwnd by SMSS. > > - // > > - > > - // Step 4 is skipped here only to be executed later > > - // by TcpToSendData > > - // > > - Tcb->CWnd += Tcb->SndMss; > > - DEBUG ((EFI_D_NET, "TcpFastRecover: received another" > > - " duplicated ACK (%d) for TCB %p\n", Seg->Ack, Tcb)); > > - > > - } else { > > - > > - // > > - // New data is ACKed, check whether it is a > > - // full ACK or partial ACK > > - // > > - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) { > > - > > - // > > - // Step 5 - Full ACK: > > - // deflate the congestion window, and exit fast recovery > > - // > > - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); > > - > > - Tcb->CWnd = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss); > > - > > - Tcb->CongestState = TCP_CONGEST_OPEN; > > - DEBUG ((EFI_D_NET, "TcpFastRecover: received a full ACK(%d)" > > - " for TCB %p, exit fast recovery\n", Seg->Ack, Tcb)); > > - > > - } else { > > - > > - // > > - // Step 5 - Partial ACK: > > - // fast retransmit the first unacknowledge field > > - // , then deflate the CWnd > > - // > > - TcpRetransmit (Tcb, Seg->Ack); > > - Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna); > > - > > - // > > - // Deflate the CWnd by the amount of new data > > - // ACKed by SEG.ACK. If more than one SMSS data > > - // is ACKed, add back SMSS byte to CWnd after > > - // > > - if (Acked >= Tcb->SndMss) { > > - Acked -= Tcb->SndMss; > > - > > - } > > - > > - Tcb->CWnd -= Acked; > > - > > - DEBUG ((EFI_D_NET, "TcpFastRecover: received a partial" > > - " ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); > > - > > - } > > - } > > -} > > - > > - > > -/** > > - NewReno fast loss recovery, RFC3792. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seg Segment that triggers the fast loss recovery. > > - > > -**/ > > -VOID > > -TcpFastLossRecover ( > > - IN OUT TCP_CB *Tcb, > > - IN TCP_SEG *Seg > > - ) > > -{ > > - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { > > - > > - // > > - // New data is ACKed, check whether it is a > > - // full ACK or partial ACK > > - // > > - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) { > > - > > - // > > - // Full ACK: exit the loss recovery. > > - // > > - Tcb->LossTimes = 0; > > - Tcb->CongestState = TCP_CONGEST_OPEN; > > - > > - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " > > - "full ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); > > - > > - } else { > > - > > - // > > - // Partial ACK: > > - // fast retransmit the first unacknowledge field. > > - // > > - TcpRetransmit (Tcb, Seg->Ack); > > - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " > > - "partial ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); > > - } > > - } > > -} > > - > > - > > -/** > > - Compute the RTT as specified in RFC2988. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Measure Currently measured RTT in heart beats. > > - > > -**/ > > -VOID > > -TcpComputeRtt ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT32 Measure > > - ) > > -{ > > - INT32 Var; > > - > > - // > > - // Step 2.3: Compute the RTO for subsequent RTT measurement. > > - // > > - if (Tcb->SRtt != 0) { > > - > > - Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT); > > - > > - if (Var < 0) { > > - Var = -Var; > > - } > > - > > - Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2; > > - Tcb->SRtt = 7 * (Tcb->SRtt >> 3) + Measure; > > - > > - } else { > > - // > > - // Step 2.2: compute the first RTT measure > > - // > > - Tcb->SRtt = Measure << TCP_RTT_SHIFT; > > - Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1); > > - } > > - > > - Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT; > > - > > - // > > - // Step 2.4: Limit the RTO to at least 1 second > > - // Step 2.5: Limit the RTO to a maxium value that > > - // is at least 60 second > > - // > > - if (Tcb->Rto < TCP_RTO_MIN) { > > - Tcb->Rto = TCP_RTO_MIN; > > - > > - } else if (Tcb->Rto > TCP_RTO_MAX) { > > - Tcb->Rto = TCP_RTO_MAX; > > - > > - } > > - > > - DEBUG ((EFI_D_NET, "TcpComputeRtt: new RTT for TCB %p" > > - " computed SRTT: %d RTTVAR: %d RTO: %d\n", > > - Tcb, Tcb->SRtt, Tcb->RttVar, Tcb->Rto)); > > - > > -} > > - > > - > > -/** > > - Trim the data, SYN and FIN to fit into the window defined by Left and > Right. > > - > > - @param Nbuf Buffer that contains received TCP segment without IP > > header. > > - @param Left The sequence number of the window's left edge. > > - @param Right The sequence number of the window's right edge. > > - > > -**/ > > -VOID > > -TcpTrimSegment ( > > - IN NET_BUF *Nbuf, > > - IN TCP_SEQNO Left, > > - IN TCP_SEQNO Right > > - ) > > -{ > > - TCP_SEG *Seg; > > - TCP_SEQNO Urg; > > - UINT32 Drop; > > - > > - Seg = TCPSEG_NETBUF (Nbuf); > > - > > - // > > - // If the segment is completely out of window, > > - // truncate every thing, include SYN and FIN. > > - // > > - if (TCP_SEQ_LEQ (Seg->End, Left) || TCP_SEQ_LEQ (Right, Seg->Seq)) { > > - > > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); > > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); > > - > > - Seg->Seq = Seg->End; > > - NetbufTrim (Nbuf, Nbuf->TotalSize, NET_BUF_HEAD); > > - return; > > - } > > - > > - // > > - // Adjust the buffer header > > - // > > - if (TCP_SEQ_LT (Seg->Seq, Left)) { > > - > > - Drop = TCP_SUB_SEQ (Left, Seg->Seq); > > - Urg = Seg->Seq + Seg->Urg; > > - Seg->Seq = Left; > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); > > - Drop--; > > - } > > - > > - // > > - // Adjust the urgent point > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG)) { > > - > > - if (TCP_SEQ_LT (Urg, Seg->Seq)) { > > - > > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); > > - } else { > > - Seg->Urg = (UINT16) TCP_SUB_SEQ (Urg, Seg->Seq); > > - } > > - } > > - > > - if (Drop != 0) { > > - NetbufTrim (Nbuf, Drop, NET_BUF_HEAD); > > - } > > - } > > - > > - // > > - // Adjust the buffer tail > > - // > > - if (TCP_SEQ_GT (Seg->End, Right)) { > > - > > - Drop = TCP_SUB_SEQ (Seg->End, Right); > > - Seg->End = Right; > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); > > - Drop--; > > - } > > - > > - if (Drop != 0) { > > - NetbufTrim (Nbuf, Drop, NET_BUF_TAIL); > > - } > > - } > > - > > - ASSERT (TcpVerifySegment (Nbuf) != 0); > > -} > > - > > - > > -/** > > - Trim off the data outside the tcb's receive window. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the NET_BUF containing the received tcp > > segment. > > - > > -**/ > > -VOID > > -TcpTrimInWnd ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ) > > -{ > > - TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd); > > -} > > - > > - > > -/** > > - Process the data and FIN flag, check whether to deliver > > - data to the socket layer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @retval 0 No error occurred to deliver data. > > - @retval -1 Error condition occurred. Proper response is to > reset the > > - connection. > > - > > -**/ > > -INTN > > -TcpDeliverData ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - NET_BUF *Nbuf; > > - TCP_SEQNO Seq; > > - TCP_SEG *Seg; > > - UINT32 Urgent; > > - > > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > > - > > - // > > - // make sure there is some data queued, > > - // and TCP is in a proper state > > - // > > - if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) { > > - > > - return 0; > > - } > > - > > - // > > - // Deliver data to the socket layer > > - // > > - Entry = Tcb->RcvQue.ForwardLink; > > - Seq = Tcb->RcvNxt; > > - > > - while (Entry != &Tcb->RcvQue) { > > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > > - Seg = TCPSEG_NETBUF (Nbuf); > > - > > - ASSERT (TcpVerifySegment (Nbuf) != 0); > > - ASSERT (Nbuf->Tcp == NULL); > > - > > - if (TCP_SEQ_GT (Seg->Seq, Seq)) { > > - break; > > - } > > - > > - Entry = Entry->ForwardLink; > > - Seq = Seg->End; > > - Tcb->RcvNxt = Seq; > > - > > - RemoveEntryList (&Nbuf->List); > > - > > - // > > - // RFC793 Eighth step: process FIN in sequence > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > > - > > - // > > - // The peer sends to us junky data after FIN, > > - // reset the connection. > > - // > > - if (!IsListEmpty (&Tcb->RcvQue)) { > > - DEBUG ((EFI_D_ERROR, "TcpDeliverData: data received after" > > - " FIN from peer of TCB %p, reset connection\n", Tcb)); > > - > > - NetbufFree (Nbuf); > > - return -1; > > - } > > - > > - DEBUG ((EFI_D_NET, "TcpDeliverData: processing FIN " > > - "from peer of TCB %p\n", Tcb)); > > - > > - switch (Tcb->State) { > > - case TCP_SYN_RCVD: > > - case TCP_ESTABLISHED: > > - > > - TcpSetState (Tcb, TCP_CLOSE_WAIT); > > - break; > > - > > - case TCP_FIN_WAIT_1: > > - > > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > > - > > - TcpSetState (Tcb, TCP_CLOSING); > > - break; > > - } > > - > > - // > > - // fall through > > - // > > - case TCP_FIN_WAIT_2: > > - > > - TcpSetState (Tcb, TCP_TIME_WAIT); > > - TcpClearAllTimer (Tcb); > > - > > - if (Tcb->TimeWaitTimeout != 0) { > > - > > - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); > > - } else { > > - > > - DEBUG ((EFI_D_WARN, "Connection closed immediately " > > - "because app disables TIME_WAIT timer for %p\n", Tcb)); > > - > > - TcpSendAck (Tcb); > > - TcpClose (Tcb); > > - } > > - break; > > - > > - case TCP_CLOSE_WAIT: > > - case TCP_CLOSING: > > - case TCP_LAST_ACK: > > - case TCP_TIME_WAIT: > > - // > > - // The peer sends to us junk FIN byte. Discard > > - // the buffer then reset the connection > > - // > > - NetbufFree (Nbuf); > > - return -1; > > - default: > > - break; > > - } > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > > - > > - Seg->End--; > > - } > > - > > - // > > - // Don't delay the ack if PUSH flag is on. > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_PSH)) { > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > > - } > > - > > - if (Nbuf->TotalSize != 0) { > > - Urgent = 0; > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && > > - TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp)) { > > - > > - if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) { > > - Urgent = Nbuf->TotalSize; > > - } else { > > - Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1; > > - } > > - } > > - > > - SockDataRcvd (Tcb->Sk, Nbuf, Urgent); > > - } > > - > > - if (TCP_FIN_RCVD (Tcb->State)) { > > - > > - SockNoMoreData (Tcb->Sk); > > - } > > - > > - NetbufFree (Nbuf); > > - } > > - > > - return 0; > > -} > > - > > - > > -/** > > - Store the data into the reassemble queue. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the buffer containing the data to be > queued. > > - > > -**/ > > -VOID > > -TcpQueueData ( > > - IN OUT TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ) > > -{ > > - TCP_SEG *Seg; > > - LIST_ENTRY *Head; > > - LIST_ENTRY *Prev; > > - LIST_ENTRY *Cur; > > - NET_BUF *Node; > > - > > - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); > > - > > - NET_GET_REF (Nbuf); > > - > > - Seg = TCPSEG_NETBUF (Nbuf); > > - Head = &Tcb->RcvQue; > > - > > - // > > - // Fast path to process normal case. That is, > > - // no out-of-order segments are received. > > - // > > - if (IsListEmpty (Head)) { > > - > > - InsertTailList (Head, &Nbuf->List); > > - return; > > - } > > - > > - // > > - // Find the point to insert the buffer > > - // > > - for (Prev = Head, Cur = Head->ForwardLink; > > - Cur != Head; > > - Prev = Cur, Cur = Cur->ForwardLink) { > > - > > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > > - > > - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->Seq)) { > > - break; > > - } > > - } > > - > > - // > > - // Check whether the current segment overlaps with the > > - // previous segment. > > - // > > - if (Prev != Head) { > > - Node = NET_LIST_USER_STRUCT (Prev, NET_BUF, List); > > - > > - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->End)) { > > - > > - if (TCP_SEQ_LEQ (Seg->End, TCPSEG_NETBUF (Node)->End)) { > > - > > - NetbufFree (Nbuf); > > - return; > > - } > > - > > - TcpTrimSegment (Nbuf, TCPSEG_NETBUF (Node)->End, Seg->End); > > - } > > - } > > - > > - InsertHeadList (Prev, &Nbuf->List); > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > > - > > - // > > - // Check the segments after the insert point. > > - // > > - while (Cur != Head) { > > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > > - > > - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->End, Seg->End)) { > > - > > - Cur = Cur->ForwardLink; > > - > > - RemoveEntryList (&Node->List); > > - NetbufFree (Node); > > - continue; > > - } > > - > > - if (TCP_SEQ_LT (TCPSEG_NETBUF (Node)->Seq, Seg->End)) { > > - > > - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->Seq, Seg->Seq)) { > > - > > - RemoveEntryList (&Nbuf->List); > > - NetbufFree (Nbuf); > > - return ; > > - } > > - > > - TcpTrimSegment (Nbuf, Seg->Seq, TCPSEG_NETBUF (Node)->Seq); > > - break; > > - } > > - > > - Cur = Cur->ForwardLink; > > - } > > -} > > - > > - > > -/** > > - Ajust the send queue or the retransmit queue. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Ack The acknowledge seuqence number of the received > > segment. > > - > > -**/ > > -VOID > > -TcpAdjustSndQue ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Ack > > - ) > > -{ > > - LIST_ENTRY *Head; > > - LIST_ENTRY *Cur; > > - NET_BUF *Node; > > - TCP_SEG *Seg; > > - > > - Head = &Tcb->SndQue; > > - Cur = Head->ForwardLink; > > - > > - while (Cur != Head) { > > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > > - Seg = TCPSEG_NETBUF (Node); > > - > > - if (TCP_SEQ_GEQ (Seg->Seq, Ack)) { > > - break; > > - } > > - > > - // > > - // Remove completely ACKed segments > > - // > > - if (TCP_SEQ_LEQ (Seg->End, Ack)) { > > - Cur = Cur->ForwardLink; > > - > > - RemoveEntryList (&Node->List); > > - NetbufFree (Node); > > - continue; > > - } > > - > > - TcpTrimSegment (Node, Ack, Seg->End); > > - break; > > - } > > -} > > - > > - > > -/** > > - Process the received TCP segments. > > - > > - @param Nbuf Buffer that contains received TCP segment without IP > > header. > > - @param Src Source address of the segment, or the peer's IP > address. > > - @param Dst Destination address of the segment, or the local > end's IP > > - address. > > - > > - @retval 0 Segment is processed successfully. It is either > accepted or > > - discarded. But no connection is reset by the segment. > > - @retval -1 A connection is reset by the segment. > > - > > -**/ > > -INTN > > -TcpInput ( > > - IN NET_BUF *Nbuf, > > - IN UINT32 Src, > > - IN UINT32 Dst > > - ) > > -{ > > - TCP_CB *Tcb; > > - TCP_CB *Parent; > > - TCP_OPTION Option; > > - TCP_HEAD *Head; > > - INT32 Len; > > - TCP_SEG *Seg; > > - TCP_SEQNO Right; > > - TCP_SEQNO Urg; > > - INT32 Usable; > > - > > - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); > > - > > - Parent = NULL; > > - Tcb = NULL; > > - > > - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); > > - ASSERT (Head != NULL); > > - > > - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { > > - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); > > - goto DISCARD; > > - } > > - > > - Len = Nbuf->TotalSize - (Head->HeadLen << 2); > > - > > - if ((Head->HeadLen < 5) || (Len < 0) || > > - (TcpChecksum (Nbuf, NetPseudoHeadChecksum (Src, Dst, 6, 0)) != 0)) > { > > - > > - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); > > - goto DISCARD; > > - } > > - > > - if (TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)) { > > - Len++; > > - } > > - > > - if (TCP_FLG_ON (Head->Flag, TCP_FLG_FIN)) { > > - Len++; > > - } > > - > > - Tcb = TcpLocateTcb ( > > - Head->DstPort, > > - Dst, > > - Head->SrcPort, > > - Src, > > - (BOOLEAN) TCP_FLG_ON (Head->Flag, TCP_FLG_SYN) > > - ); > > - > > - if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) { > > - DEBUG ((EFI_D_NET, "TcpInput: send reset because no TCB found\n")); > > - > > - Tcb = NULL; > > - goto SEND_RESET; > > - } > > - > > - Seg = TcpFormatNetbuf (Tcb, Nbuf); > > - > > - // > > - // RFC1122 recommended reaction to illegal option > > - // (in fact, an illegal option length) is reset. > > - // > > - if (TcpParseOption (Nbuf->Tcp, &Option) == -1) { > > - DEBUG ((EFI_D_ERROR, "TcpInput: reset the peer because" > > - " of malformed option for TCB %p\n", Tcb)); > > - > > - goto SEND_RESET; > > - } > > - > > - // > > - // From now on, the segment is headless > > - // > > - NetbufTrim (Nbuf, (Head->HeadLen << 2), NET_BUF_HEAD); > > - Nbuf->Tcp = NULL; > > - > > - // > > - // Process the segment in LISTEN state. > > - // > > - if (Tcb->State == TCP_LISTEN) { > > - // > > - // First step: Check RST > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > > - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " > > - "for TCB %p in listening\n", Tcb)); > > - > > - goto DISCARD; > > - } > > - > > - // > > - // Second step: Check ACK. > > - // Any ACK sent to TCP in LISTEN is reseted. > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > > - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" > > - " segment with ACK for TCB %p in listening\n", Tcb)); > > - > > - goto SEND_RESET; > > - } > > - > > - // > > - // Third step: Check SYN > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > > - // > > - // create a child TCB to handle the data > > - // > > - Parent = Tcb; > > - > > - Tcb = TcpCloneTcb (Parent); > > - if (Tcb == NULL) { > > - DEBUG ((EFI_D_ERROR, "TcpInput: discard a segment because" > > - " failed to clone a child for TCB %p\n", Tcb)); > > - > > - goto DISCARD; > > - } > > - > > - DEBUG ((EFI_D_NET, "TcpInput: create a child for TCB %p" > > - " in listening\n", Tcb)); > > - > > - // > > - // init the TCB structure > > - // > > - Tcb->LocalEnd.Ip = Dst; > > - Tcb->LocalEnd.Port = Head->DstPort; > > - Tcb->RemoteEnd.Ip = Src; > > - Tcb->RemoteEnd.Port = Head->SrcPort; > > - > > - TcpInitTcbLocal (Tcb); > > - TcpInitTcbPeer (Tcb, Seg, &Option); > > - > > - TcpSetState (Tcb, TCP_SYN_RCVD); > > - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); > > - TcpTrimInWnd (Tcb, Nbuf); > > - > > - goto StepSix; > > - } > > - > > - goto DISCARD; > > - > > - } else if (Tcb->State == TCP_SYN_SENT) { > > - // > > - // First step: Check ACK bit > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + > 1)) > > { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of " > > - "wrong ACK received for TCB %p in SYN_SENT\n", Tcb)); > > - > > - goto SEND_RESET; > > - } > > - > > - // > > - // Second step: Check RST bit > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset by" > > - " peer for TCB %p in SYN_SENT\n", Tcb)); > > - > > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); > > - goto DROP_CONNECTION; > > - } else { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " > > - "because of no ACK for TCB %p in SYN_SENT\n", Tcb)); > > - > > - goto DISCARD; > > - } > > - } > > - > > - // > > - // Third step: Check security and precedence. Skipped > > - // > > - > > - // > > - // Fourth step: Check SYN. Pay attention to simultaneous open > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > > - > > - TcpInitTcbPeer (Tcb, Seg, &Option); > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > > - > > - Tcb->SndUna = Seg->Ack; > > - } > > - > > - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); > > - > > - if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) { > > - > > - TcpSetState (Tcb, TCP_ESTABLISHED); > > - > > - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); > > - TcpDeliverData (Tcb); > > - > > - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && > > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > > - > > - TcpComputeRtt (Tcb, Tcb->RttMeasure); > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > > - } > > - > > - TcpTrimInWnd (Tcb, Nbuf); > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > > - > > - DEBUG ((EFI_D_NET, "TcpInput: connection established" > > - " for TCB %p in SYN_SENT\n", Tcb)); > > - > > - goto StepSix; > > - } else { > > - // > > - // Received a SYN segment without ACK, simultaneous open. > > - // > > - TcpSetState (Tcb, TCP_SYN_RCVD); > > - > > - ASSERT (Tcb->SndNxt == Tcb->Iss + 1); > > - TcpAdjustSndQue (Tcb, Tcb->SndNxt); > > - > > - TcpTrimInWnd (Tcb, Nbuf); > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: simultaneous open " > > - "for TCB %p in SYN_SENT\n", Tcb)); > > - > > - goto StepSix; > > - } > > - } > > - > > - goto DISCARD; > > - } > > - > > - // > > - // Process segment in SYN_RCVD or TCP_CONNECTED states > > - // > > - > > - // > > - // Clear probe timer since the RecvWindow is opened. > > - // > > - if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) { > > - TcpClearTimer (Tcb, TCP_TIMER_PROBE); > > - Tcb->ProbeTimerOn = FALSE; > > - } > > - > > - // > > - // First step: Check whether SEG.SEQ is acceptable > > - // > > - if (TcpSeqAcceptable (Tcb, Seg) == 0) { > > - DEBUG ((EFI_D_WARN, "TcpInput: sequence acceptance" > > - " test failed for segment of TCB %p\n", Tcb)); > > - > > - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > > - TcpSendAck (Tcb); > > - } > > - > > - goto DISCARD; > > - } > > - > > - if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) && > > - (Tcb->RcvWl2 == Seg->End) && > > - !TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN | TCP_FLG_FIN)) { > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > > - } > > - > > - // > > - // Second step: Check the RST > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", > Tcb)); > > - > > - if (Tcb->State == TCP_SYN_RCVD) { > > - > > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED); > > - > > - // > > - // This TCB comes from either a LISTEN TCB, > > - // or active open TCB with simultanous open. > > - // Do NOT signal user CONNECTION refused > > - // if it comes from a LISTEN TCB. > > - // > > - } else if ((Tcb->State == TCP_ESTABLISHED) || > > - (Tcb->State == TCP_FIN_WAIT_1) || > > - (Tcb->State == TCP_FIN_WAIT_2) || > > - (Tcb->State == TCP_CLOSE_WAIT)) { > > - > > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); > > - > > - } else { > > - > > - } > > - > > - goto DROP_CONNECTION; > > - } > > - > > - // > > - // Trim the data and flags. > > - // > > - TcpTrimInWnd (Tcb, Nbuf); > > - > > - // > > - // Third step: Check security and precedence, Ignored > > - // > > - > > - // > > - // Fourth step: Check the SYN bit. > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset " > > - "because received extra SYN for TCB %p\n", Tcb)); > > - > > - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); > > - goto RESET_THEN_DROP; > > - } > > - > > - // > > - // Fifth step: Check the ACK > > - // > > - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > > - DEBUG ((EFI_D_WARN, "TcpInput: segment discard because" > > - " of no ACK for connected TCB %p\n", Tcb)); > > - > > - goto DISCARD; > > - > > - } > > - > > - if (Tcb->State == TCP_SYN_RCVD) { > > - > > - if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) && > > - TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt)) { > > - > > - Tcb->SndWnd = Seg->Wnd; > > - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); > > - Tcb->SndWl1 = Seg->Seq; > > - Tcb->SndWl2 = Seg->Ack; > > - TcpSetState (Tcb, TCP_ESTABLISHED); > > - > > - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); > > - TcpDeliverData (Tcb); > > - > > - DEBUG ((EFI_D_NET, "TcpInput: connection established " > > - " for TCB %p in SYN_RCVD\n", Tcb)); > > - > > - // > > - // Continue the process as ESTABLISHED state > > - // > > - } else { > > - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" > > - " wrong ACK for TCB %p in SYN_RCVD\n", Tcb)); > > - > > - goto SEND_RESET; > > - } > > - } > > - > > - if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: ignore the out-of-data" > > - " ACK for connected TCB %p\n", Tcb)); > > - > > - goto StepSix; > > - > > - } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: discard segment for " > > - "future ACK for connected TCB %p\n", Tcb)); > > - > > - TcpSendAck (Tcb); > > - goto DISCARD; > > - } > > - > > - // > > - // From now on: SND.UNA <= SEG.ACK <= SND.NXT. > > - // > > - if (TCP_FLG_ON (Option.Flag, TCP_OPTION_RCVD_TS)) { > > - // > > - // update TsRecent as specified in page 16 RFC1323. > > - // RcvWl2 equals to the variable "LastAckSent" > > - // defined there. > > - // > > - if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) && > > - TCP_SEQ_LT (Tcb->RcvWl2, Seg->End)) { > > - > > - Tcb->TsRecent = Option.TSVal; > > - Tcb->TsRecentAge = mTcpTick; > > - } > > - > > - TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr)); > > - > > - } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > > - > > - ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN); > > - > > - TcpComputeRtt (Tcb, Tcb->RttMeasure); > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > > - } > > - > > - if (Seg->Ack == Tcb->SndNxt) { > > - > > - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); > > - } else { > > - > > - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); > > - } > > - > > - // > > - // Count duplicate acks. > > - // > > - if ((Seg->Ack == Tcb->SndUna) && > > - (Tcb->SndUna != Tcb->SndNxt) && > > - (Seg->Wnd == Tcb->SndWnd) && > > - (0 == Len)) { > > - > > - Tcb->DupAck++; > > - } else { > > - > > - Tcb->DupAck = 0; > > - } > > - > > - // > > - // Congestion avoidance, fast recovery and fast retransmission. > > - // > > - if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) > > || > > - (Tcb->CongestState == TCP_CONGEST_LOSS)) { > > - > > - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { > > - > > - if (Tcb->CWnd < Tcb->Ssthresh) { > > - > > - Tcb->CWnd += Tcb->SndMss; > > - } else { > > - > > - Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1); > > - } > > - > > - Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale); > > - } > > - > > - if (Tcb->CongestState == TCP_CONGEST_LOSS) { > > - TcpFastLossRecover (Tcb, Seg); > > - } > > - } else { > > - > > - TcpFastRecover (Tcb, Seg); > > - } > > - > > - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { > > - > > - TcpAdjustSndQue (Tcb, Seg->Ack); > > - Tcb->SndUna = Seg->Ack; > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && > > - TCP_SEQ_LT (Tcb->SndUp, Seg->Ack)) { > > - > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); > > - } > > - } > > - > > - // > > - // Update window info > > - // > > - if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) || > > - ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg- > > >Ack))) { > > - > > - Right = Seg->Ack + Seg->Wnd; > > - > > - if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) { > > - > > - if ((Tcb->SndWl1 == Seg->Seq) && > > - (Tcb->SndWl2 == Seg->Ack) && > > - (Len == 0)) { > > - > > - goto NO_UPDATE; > > - } > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: peer shrinks the" > > - " window for connected TCB %p\n", Tcb)); > > - > > - if ((Tcb->CongestState == TCP_CONGEST_RECOVER) && > > - (TCP_SEQ_LT (Right, Tcb->Recover))) { > > - > > - Tcb->Recover = Right; > > - } > > - > > - if ((Tcb->CongestState == TCP_CONGEST_LOSS) && > > - (TCP_SEQ_LT (Right, Tcb->LossRecover))) { > > - > > - Tcb->LossRecover = Right; > > - } > > - > > - if (TCP_SEQ_LT (Right, Tcb->SndNxt)) { > > - // > > - // Check for Window Retraction in RFC7923 section 2.4. > > - // The lower n bits of the peer's actual receive window is > wiped out if > > TCP > > - // window scale is enabled, it will look like the peer is > shrinking the > > window. > > - // Check whether the SndNxt is out of the advertised receive > window > > by more than > > - // 2^Rcv.Wind.Shift before moving the SndNxt to the left. > > - // > > - DEBUG ( > > - (EFI_D_WARN, > > - "TcpInput: peer advise negative useable window for connected > > TCB %p\n", > > - Tcb) > > - ); > > - Usable = TCP_SUB_SEQ (Tcb->SndNxt, Right); > > - if ((Usable >> Tcb->SndWndScale) > 0) { > > - DEBUG ( > > - (EFI_D_WARN, > > - "TcpInput: SndNxt is out of window by more than window > scale for > > TCB %p\n", > > - Tcb) > > - ); > > - Tcb->SndNxt = Right; > > - } > > - if (Right == Tcb->SndUna) { > > - > > - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); > > - TcpSetProbeTimer (Tcb); > > - } > > - } > > - } > > - > > - Tcb->SndWnd = Seg->Wnd; > > - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); > > - Tcb->SndWl1 = Seg->Seq; > > - Tcb->SndWl2 = Seg->Ack; > > - } > > - > > -NO_UPDATE: > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) && > > - (Tcb->SndUna == Tcb->SndNxt)) { > > - > > - DEBUG ((EFI_D_NET, "TcpInput: local FIN is ACKed by" > > - " peer for connected TCB %p\n", Tcb)); > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED); > > - } > > - > > - // > > - // Transit the state if proper. > > - // > > - switch (Tcb->State) { > > - case TCP_FIN_WAIT_1: > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > > - > > - TcpSetState (Tcb, TCP_FIN_WAIT_2); > > - > > - TcpClearAllTimer (Tcb); > > - TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout); > > - } > > - > > - case TCP_FIN_WAIT_2: > > - > > - break; > > - > > - case TCP_CLOSE_WAIT: > > - break; > > - > > - case TCP_CLOSING: > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > > - > > - TcpSetState (Tcb, TCP_TIME_WAIT); > > - > > - TcpClearAllTimer (Tcb); > > - > > - if (Tcb->TimeWaitTimeout != 0) { > > - > > - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); > > - } else { > > - > > - DEBUG ((EFI_D_WARN, "Connection closed immediately " > > - "because app disables TIME_WAIT timer for %p\n", Tcb)); > > - > > - TcpClose (Tcb); > > - } > > - } > > - break; > > - > > - case TCP_LAST_ACK: > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { > > - > > - TcpSetState (Tcb, TCP_CLOSED); > > - } > > - > > - break; > > - > > - case TCP_TIME_WAIT: > > - > > - TcpSendAck (Tcb); > > - > > - if (Tcb->TimeWaitTimeout != 0) { > > - > > - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); > > - } else { > > - > > - DEBUG ((EFI_D_WARN, "Connection closed immediately " > > - "because app disables TIME_WAIT timer for %p\n", Tcb)); > > - > > - TcpClose (Tcb); > > - } > > - break; > > - > > - default: > > - break; > > - } > > - > > - // > > - // Sixth step: Check the URG bit.update the Urg point > > - // if in TCP_CAN_RECV, otherwise, leave the RcvUp intact. > > - // > > -StepSix: > > - > > - Tcb->Idle = 0; > > - TcpSetKeepaliveTimer (Tcb); > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) && > > - !TCP_FIN_RCVD (Tcb->State)) > > - { > > - > > - DEBUG ((EFI_D_NET, "TcpInput: received urgent data " > > - "from peer for connected TCB %p\n", Tcb)); > > - > > - Urg = Seg->Seq + Seg->Urg; > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && > > - TCP_SEQ_GT (Urg, Tcb->RcvUp)) { > > - > > - Tcb->RcvUp = Urg; > > - } else { > > - > > - Tcb->RcvUp = Urg; > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG); > > - } > > - } > > - > > - // > > - // Seventh step: Process the segment data > > - // > > - if (Seg->End != Seg->Seq) { > > - > > - if (TCP_FIN_RCVD (Tcb->State)) { > > - > > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" > > - " data is lost for connected TCB %p\n", Tcb)); > > - > > - goto RESET_THEN_DROP; > > - } > > - > > - if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) { > > - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" > > - " data is lost for connected TCB %p\n", Tcb)); > > - > > - goto RESET_THEN_DROP; > > - } > > - > > - TcpQueueData (Tcb, Nbuf); > > - if (TcpDeliverData (Tcb) == -1) { > > - goto RESET_THEN_DROP; > > - } > > - > > - if (!IsListEmpty (&Tcb->RcvQue)) { > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > > - } > > - } > > - > > - // > > - // Eighth step: check the FIN. > > - // This step is moved to TcpDeliverData. FIN will be > > - // processed in sequence there. Check the comments in > > - // the beginning of the file header for information. > > - // > > - > > - // > > - // Tcb is a new child of the listening Parent, > > - // commit it. > > - // > > - if (Parent != NULL) { > > - Tcb->Parent = Parent; > > - TcpInsertTcb (Tcb); > > - } > > - > > - if ((Tcb->State != TCP_CLOSED) && > > - (TcpToSendData (Tcb, 0) == 0) && > > - (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf- > > >TotalSize != 0))) { > > - > > - TcpToSendAck (Tcb); > > - } > > - > > - NetbufFree (Nbuf); > > - return 0; > > - > > -RESET_THEN_DROP: > > - TcpSendReset (Tcb, Head, Len, Dst, Src); > > - > > -DROP_CONNECTION: > > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > > - > > - NetbufFree (Nbuf); > > - TcpClose (Tcb); > > - > > - return -1; > > - > > -SEND_RESET: > > - > > - TcpSendReset (Tcb, Head, Len, Dst, Src); > > - > > -DISCARD: > > - > > - // > > - // Tcb is a child of Parent, and it doesn't survive > > - // > > - DEBUG ((EFI_D_WARN, "Tcp4Input: Discard a packet\n")); > > - NetbufFree (Nbuf); > > - > > - if ((Parent != NULL) && (Tcb != NULL)) { > > - > > - ASSERT (Tcb->Sk != NULL); > > - TcpClose (Tcb); > > - } > > - > > - return 0; > > -} > > - > > - > > -/** > > - Process the received ICMP error messages for TCP. > > - > > - @param Nbuf Buffer that contains part of the TCP segment without > IP > > header > > - truncated from the ICMP error packet. > > - @param IcmpErr The ICMP error code interpreted from ICMP error > packet. > > - @param Src Source address of the ICMP error message. > > - @param Dst Destination address of the ICMP error message. > > - > > -**/ > > -VOID > > -TcpIcmpInput ( > > - IN NET_BUF *Nbuf, > > - IN UINT8 IcmpErr, > > - IN UINT32 Src, > > - IN UINT32 Dst > > - ) > > -{ > > - TCP_HEAD *Head; > > - TCP_CB *Tcb; > > - TCP_SEQNO Seq; > > - EFI_STATUS IcmpErrStatus; > > - BOOLEAN IcmpErrIsHard; > > - BOOLEAN IcmpErrNotify; > > - > > - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { > > - goto CLEAN_EXIT; > > - } > > - > > - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); > > - ASSERT (Head != NULL); > > - Tcb = TcpLocateTcb ( > > - Head->DstPort, > > - Dst, > > - Head->SrcPort, > > - Src, > > - FALSE > > - ); > > - if (Tcb == NULL || Tcb->State == TCP_CLOSED) { > > - > > - goto CLEAN_EXIT; > > - } > > - > > - // > > - // Validate the sequence number. > > - // > > - Seq = NTOHL (Head->Seq); > > - if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb- > > >SndNxt))) { > > - > > - goto CLEAN_EXIT; > > - } > > - > > - IcmpErrStatus = IpIoGetIcmpErrStatus ( > > - IcmpErr, > > - IP_VERSION_4, > > - &IcmpErrIsHard, > > - &IcmpErrNotify > > - ); > > - > > - if (IcmpErrNotify) { > > - > > - SOCK_ERROR (Tcb->Sk, IcmpErrStatus); > > - } > > - > > - if (IcmpErrIsHard) { > > - > > - TcpClose (Tcb); > > - } > > - > > -CLEAN_EXIT: > > - NetbufFree (Nbuf); > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > deleted file mode 100644 > > index b98d1e783a2f..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > +++ /dev/null > > @@ -1,112 +0,0 @@ > > -/** @file > > - I/O interfaces between TCP and IpIo. > > - > > -Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Tcp4Main.h" > > - > > - > > -/** > > - Packet receive callback function provided to IP_IO, used to call > > - the proper function to handle the packet received by IP. > > - > > - @param Status Status of the received packet. > > - @param IcmpErr ICMP error number. > > - @param NetSession Pointer to the net session of this packet. > > - @param Pkt Pointer to the recieved packet. > > - @param Context Pointer to the context configured in IpIoOpen(), > not > > used > > - now. > > - > > -**/ > > -VOID > > -EFIAPI > > -Tcp4RxCallback ( > > - IN EFI_STATUS Status, > > - IN UINT8 IcmpErr, > > - IN EFI_NET_SESSION_DATA *NetSession, > > - IN NET_BUF *Pkt, > > - IN VOID *Context OPTIONAL > > - ) > > -{ > > - if (EFI_SUCCESS == Status) { > > - TcpInput (Pkt, NetSession->Source.Addr[0], NetSession- > >Dest.Addr[0]); > > - } else { > > - TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession- > > >Dest.Addr[0]); > > - } > > -} > > - > > - > > -/** > > - Send the segment to IP via IpIo function. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the TCP segment to be sent. > > - @param Src Source address of the TCP segment. > > - @param Dest Destination address of the TCP segment. > > - > > - @retval 0 The segment was sent out successfully. > > - @retval -1 The segment was failed to send. > > - > > -**/ > > -INTN > > -TcpSendIpPacket ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf, > > - IN UINT32 Src, > > - IN UINT32 Dest > > - ) > > -{ > > - EFI_STATUS Status; > > - IP_IO *IpIo; > > - IP_IO_OVERRIDE Override; > > - SOCKET *Sock; > > - VOID *IpSender; > > - TCP4_PROTO_DATA *TcpProto; > > - EFI_IP_ADDRESS Source; > > - EFI_IP_ADDRESS Destination; > > - > > - Source.Addr[0] = Src; > > - Destination.Addr[0] = Dest; > > - > > - if (NULL == Tcb) { > > - > > - IpIo = NULL; > > - IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source); > > - > > - if (IpSender == NULL) { > > - DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate > > IpSender.\n")); > > - return -1; > > - } > > - } else { > > - > > - Sock = Tcb->Sk; > > - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > > - IpIo = TcpProto->TcpService->IpIo; > > - IpSender = Tcb->IpInfo; > > - } > > - > > - Override.Ip4OverrideData.TypeOfService = 0; > > - Override.Ip4OverrideData.TimeToLive = 255; > > - Override.Ip4OverrideData.DoNotFragment = FALSE; > > - Override.Ip4OverrideData.Protocol = EFI_IP_PROTO_TCP; > > - ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof > > (EFI_IPv4_ADDRESS)); > > - CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof > > (EFI_IPv4_ADDRESS)); > > - > > - Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, > > &Override); > > - > > - if (EFI_ERROR (Status)) { > > - DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status)); > > - return -1; > > - } > > - > > - return 0; > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > deleted file mode 100644 > > index d8fc68c0a97d..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > +++ /dev/null > > @@ -1,674 +0,0 @@ > > -/** @file > > - Implementation of TCP4 protocol services. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "Tcp4Main.h" > > - > > - > > -/** > > - Check the integrity of the data buffer. > > - > > - @param DataLen The total length of the data buffer. > > - @param FragmentCount The fragment count of the fragment > table. > > - @param FragmentTable Pointer to the fragment table of the > data > > - buffer. > > - > > - @retval EFI_SUCCESS The integrity check is passed. > > - @retval EFI_INVALID_PARAMETER The integrity check is failed. > > - > > -**/ > > -EFI_STATUS > > -Tcp4ChkDataBuf ( > > - IN UINT32 DataLen, > > - IN UINT32 FragmentCount, > > - IN EFI_TCP4_FRAGMENT_DATA *FragmentTable > > - ) > > -{ > > - UINT32 Index; > > - > > - UINT32 Len; > > - > > - for (Index = 0, Len = 0; Index < FragmentCount; Index++) { > > - Len = Len + (UINT32) FragmentTable[Index].FragmentLength; > > - } > > - > > - if (DataLen != Len) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Get the current operational status. > > - > > - The GetModeData() function copies the current operational settings of > this > > - EFI TCPv4 Protocol instance into user-supplied buffers. This function > can > > - also be used to retrieve the operational setting of underlying > drivers > > - such as IPv4, MNP, or SNP. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param Tcp4State Pointer to the buffer to receive the > current TCP > > - state. > > - @param Tcp4ConfigData Pointer to the buffer to receive the > current > > TCP > > - configuration. > > - @param Ip4ModeData Pointer to the buffer to receive the > current > > IPv4 > > - configuration data used by the TCPv4 > instance. > > - @param MnpConfigData Pointer to the buffer to receive the > current > > MNP > > - configuration data indirectly used > by the TCPv4 > > - Instance. > > - @param SnpModeData Pointer to the buffer to receive the > current > > SNP > > - configuration data indirectly used > by the TCPv4 > > - Instance. > > - > > - @retval EFI_SUCCESS The mode data was read. > > - @retval EFI_NOT_STARTED No configuration data is available > because > > this > > - instance hasn't been started. > > - @retval EFI_INVALID_PARAMETER This is NULL. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4GetModeData ( > > - IN EFI_TCP4_PROTOCOL *This, > > - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, > > - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, > > - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, > > - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData > > OPTIONAL, > > - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL > > - ) > > -{ > > - TCP4_MODE_DATA TcpMode; > > - SOCKET *Sock; > > - > > - if (NULL == This) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - TcpMode.Tcp4State = Tcp4State; > > - TcpMode.Tcp4ConfigData = Tcp4ConfigData; > > - TcpMode.Ip4ModeData = Ip4ModeData; > > - TcpMode.MnpConfigData = MnpConfigData; > > - TcpMode.SnpModeData = SnpModeData; > > - > > - return SockGetMode (Sock, &TcpMode); > > -} > > - > > - > > -/** > > - Initialize or brutally reset the operational parameters for > > - this EFI TCPv4 instance. > > - > > - The Configure() function does the following: > > - * Initialize this EFI TCPv4 instance, i.e., initialize the > communication end > > - setting, specify active open or passive open for an instance. > > - * Reset this TCPv4 instance brutally, i.e., cancel all pending > asynchronous > > - tokens, flush transmission and receiving buffer directly without > informing > > - the communication peer. > > - No other TCPv4 Protocol operation can be executed by this instance > > - until it is configured properly. For an active TCP4 instance, after a > proper > > - configuration it may call Connect() to initiates the three-way > handshake. > > - For a passive TCP4 instance, its state will transit to > Tcp4StateListen after > > - configuration, and Accept() may be called to listen the incoming TCP > > connection > > - request. If TcpConfigData is set to NULL, the instance is reset. > Resetting > > - process will be done brutally, the state machine will be set to > > Tcp4StateClosed > > - directly, the receive queue and transmit queue will be flushed, and > no > > traffic is > > - allowed through this instance. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param TcpConfigData Pointer to the configure data to > configure the > > - instance. > > - > > - @retval EFI_SUCCESS The operational settings are set, > changed, or > > - reset successfully. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (through DHCP, BOOTP, RARP, etc.) is > not > > - finished. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is > > already > > - configured. > > - @retval EFI_DEVICE_ERROR An unexpected network or system > error > > occurred. > > - @retval EFI_UNSUPPORTED One or more of the control options > are > > not > > - supported in the implementation. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system > > resources. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Configure ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL > > - ) > > -{ > > - EFI_TCP4_OPTION *Option; > > - SOCKET *Sock; > > - EFI_STATUS Status; > > - IP4_ADDR Ip; > > - IP4_ADDR SubnetMask; > > - > > - if (NULL == This) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // > > - // Tcp protocol related parameter check will be conducted here > > - // > > - if (NULL != TcpConfigData) { > > - > > - CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof > > (IP4_ADDR)); > > - if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (TcpConfigData->AccessPoint.ActiveFlag && > > - (0 == TcpConfigData->AccessPoint.RemotePort || (Ip == 0))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (!TcpConfigData->AccessPoint.UseDefaultAddress) { > > - > > - CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof > > (IP4_ADDR)); > > - CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, > > sizeof (IP4_ADDR)); > > - if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) || > > - (SubnetMask != 0 && !NetIp4IsUnicast (NTOHL (Ip), NTOHL > > (SubnetMask)))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - } > > - > > - Option = TcpConfigData->ControlOption; > > - if ((NULL != Option) && > > - (Option->EnableSelectiveAck || Option->EnablePathMtuDiscovery)) > { > > - return EFI_UNSUPPORTED; > > - } > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - if (NULL == TcpConfigData) { > > - return SockFlush (Sock); > > - } > > - > > - Status = SockConfigure (Sock, TcpConfigData); > > - > > - if (EFI_NO_MAPPING == Status) { > > - Sock->ConfigureState = SO_NO_MAPPING; > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - Add or delete routing entries. > > - > > - The Routes() function adds or deletes a route from the instance's > routing > > table. > > - The most specific route is selected by comparing the SubnetAddress > with > > the > > - destination IP address's arithmetical AND to the SubnetMask. > > - The default route is added with both SubnetAddress and SubnetMask set > > to 0.0.0.0. > > - The default route matches all destination IP addresses if there is no > more > > specific route. > > - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are > sent > > to > > - the destination host if its address can be found in the Address > Resolution > > Protocol (ARP) > > - cache or it is on the local subnet. If the instance is configured to > use default > > - address, a direct route to the local network will be added > automatically. > > - Each TCP instance has its own independent routing table. Instance > that > > uses the > > - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's > > routing table. > > - The copy will be updated automatically whenever the IP driver > > reconfigures its > > - instance. As a result, the previous modification to the instance's > local copy > > - will be lost. The priority of checking the route table is specific > with IP > > - implementation and every IP implementation must comply with RFC 1122. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param DeleteRoute If TRUE, delete the specified route > from > > routing > > - table; if FALSE, add the specified > route to > > - routing table. > > - DestinationAddress and SubnetMask > are used as > > - the keywords to search route entry. > > - @param SubnetAddress The destination network. > > - @param SubnetMask The subnet mask for the destination > network. > > - @param GatewayAddress The gateway address for this route. > > - It must be on the same subnet with > the station > > - address unless a direct route is > specified. > > - > > - @retval EFI_SUCCESS The operation completed successfully. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has > not > > been > > - configured. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (through DHCP, BOOTP, RARP, etc.) is > not > > - finished. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > > to add the > > - entry to the routing table. > > - @retval EFI_NOT_FOUND This route is not in the routing > table. > > - @retval EFI_ACCESS_DENIED This route is already in the routing > table. > > - @retval EFI_UNSUPPORTED The TCP driver does not support this > > operation. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Routes ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN BOOLEAN DeleteRoute, > > - IN EFI_IPv4_ADDRESS *SubnetAddress, > > - IN EFI_IPv4_ADDRESS *SubnetMask, > > - IN EFI_IPv4_ADDRESS *GatewayAddress > > - ) > > -{ > > - SOCKET *Sock; > > - TCP4_ROUTE_INFO RouteInfo; > > - > > - if (NULL == This) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - RouteInfo.DeleteRoute = DeleteRoute; > > - RouteInfo.SubnetAddress = SubnetAddress; > > - RouteInfo.SubnetMask = SubnetMask; > > - RouteInfo.GatewayAddress = GatewayAddress; > > - > > - return SockRoute (Sock, &RouteInfo); > > -} > > - > > - > > -/** > > - Initiate a nonblocking TCP connection request for an active TCP > instance. > > - > > - The Connect() function will initiate an active open to the remote > peer > > configured > > - in current TCP instance if it is configured active. If the connection > succeeds > > - or fails due to any error, the ConnectionToken->CompletionToken.Event > > will be > > - signaled and ConnectionToken->CompletionToken.Status will be updated > > accordingly. > > - This function can only be called for the TCP instance in > Tcp4StateClosed > > state. > > - The instance will transfer into Tcp4StateSynSent if the function > returns > > EFI_SUCCESS. > > - If TCP three way handshake succeeds, its state will become > > Tcp4StateEstablished, > > - otherwise, the state will return to Tcp4StateClosed. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance > > - @param ConnectionToken Pointer to the connection token to > return > > when > > - the TCP three way handshake finishes. > > - > > - @retval EFI_SUCCESS The connection request is > successfully initiated > > - and the state of this TCPv4 instance > has > > - been changed to Tcp4StateSynSent. > > - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_ACCESS_DENIED The instance is not configured as an > active > > one > > - or it is not in Tcp4StateClosed > state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough > > resource to > > - initiate the active open. > > - @retval EFI_DEVICE_ERROR An unexpected system or network > error > > occurred. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Connect ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken > > - ) > > -{ > > - SOCKET *Sock; > > - > > - if (NULL == This || > > - NULL == ConnectionToken || > > - NULL == ConnectionToken->CompletionToken.Event) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - return SockConnect (Sock, ConnectionToken); > > -} > > - > > - > > -/** > > - Listen on the passive instance to accept an incoming connection > request. > > - > > - The Accept() function initiates an asynchronous accept request to > wait for > > an > > - incoming connection on the passive TCP instance. If a remote peer > > successfully > > - establishes a connection with this instance, a new TCP instance will > be > > created > > - and its handle will be returned in ListenToken->NewChildHandle. The > > newly created > > - instance is configured by inheriting the passive instance's > configuration and > > is > > - ready for use upon return. The instance is in the > Tcp4StateEstablished state. > > - The ListenToken->CompletionToken.Event will be signaled when a new > > connection > > - is accepted, user aborts the listen or connection is reset. This > function only > > - can be called when current TCP instance is in Tcp4StateListen state. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance > > - @param ListenToken Pointer to the listen token to > return when > > - operation finishes. > > - > > - @retval EFI_SUCCESS The listen token has been queued > successfully. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_ACCESS_DENIED The instatnce is not a passive one > or it is > > not > > - in Tcp4StateListen state or a same > listen token > > - has already existed in the listen > token queue of > > - this TCP instance. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > > to finish > > - the operation. > > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > > above category error. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Accept ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_LISTEN_TOKEN *ListenToken > > - ) > > -{ > > - SOCKET *Sock; > > - > > - if (NULL == This || > > - NULL == ListenToken || > > - NULL == ListenToken->CompletionToken.Event) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - return SockAccept (Sock, ListenToken); > > -} > > - > > - > > -/** > > - Queues outgoing data into the transmit queue. > > - > > - The Transmit() function queues a sending request to this TCPv4 > instance > > along > > - with the user data. The status of the token is updated and the event > in the > > token > > - will be signaled once the data is sent out or some error occurs. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance > > - @param Token Pointer to the completion token to > queue to the > > - transmit queue > > - > > - @retval EFI_SUCCESS The data has been queued for > transmission. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (DHCP, BOOTP, RARP, etc.) is not > finished yet. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_ACCESS_DENIED One or more of the following > conditions is > > TRUE: > > - * A transmit completion token with > the same > > - Token-> CompletionToken.Event was > already in the > > - transmission queue. > > - * The current instance is in > Tcp4StateClosed state > > - * The current instance is a passive > one and > > - it is in Tcp4StateListen state. > > - * User has called Close() to > disconnect this > > - connection. > > - @retval EFI_NOT_READY The completion token could not be > queued > > because > > - the transmit queue is full. > > - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data > > because of > > - resource shortage. > > - @retval EFI_NETWORK_UNREACHABLE There is no route to the > > destination network or > > - address. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Transmit ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_IO_TOKEN *Token > > - ) > > -{ > > - SOCKET *Sock; > > - EFI_STATUS Status; > > - > > - if (NULL == This || > > - NULL == Token || > > - NULL == Token->CompletionToken.Event || > > - NULL == Token->Packet.TxData || > > - 0 == Token->Packet.TxData->FragmentCount || > > - 0 == Token->Packet.TxData->DataLength > > - ) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Status = Tcp4ChkDataBuf ( > > - (UINT32) Token->Packet.TxData->DataLength, > > - (UINT32) Token->Packet.TxData->FragmentCount, > > - Token->Packet.TxData->FragmentTable > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - return SockSend (Sock, Token); > > - > > -} > > - > > - > > -/** > > - Place an asynchronous receive request into the receiving queue. > > - > > - The Receive() function places a completion token into the receive > packet > > queue. > > - This function is always asynchronous. The caller must allocate the > > - Token->CompletionToken.Event and the FragmentBuffer used to receive > > data. He also > > - must fill the DataLength which represents the whole length of all > > FragmentBuffer. > > - When the receive operation completes, the EFI TCPv4 Protocol driver > > updates the > > - Token->CompletionToken.Status and Token->Packet.RxData fields and the > > - Token->CompletionToken.Event is signaled. If got data the data and > its > > length > > - will be copy into the FragmentTable, in the same time the full length > of > > received > > - data will be recorded in the DataLength fields. Providing a proper > > notification > > - function and context for the event will enable the user to receive > the > > notification > > - and receiving status. That notification function is guaranteed to not > be re- > > entered. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param Token Pointer to a token that is > associated with the > > - receive data descriptor. > > - > > - @retval EFI_SUCCESS The receive completion token was > cached. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (DHCP, BOOTP, RARP, etc.) is not > finished yet. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES The receive completion token could > > not be queued > > - due to a lack of system resources. > > - @retval EFI_DEVICE_ERROR An unexpected system or network > error > > occurred. > > - The EFI TCPv4 Protocol instance has > been reset > > - to startup defaults. > > - @retval EFI_ACCESS_DENIED One or more of the following > conditions is > > TRUE: > > - * A receive completion token with > the same > > - Token->CompletionToken.Event was > already in > > - the receive queue. > > - * The current instance is in > Tcp4StateClosed state. > > - * The current instance is a passive > one and it > > - is in Tcp4StateListen state. > > - * User has called Close() to > disconnect this > > - connection. > > - @retval EFI_CONNECTION_FIN The communication peer has closed > the > > connection > > - and there is no any buffered data in > the receive > > - buffer of this instance. > > - @retval EFI_NOT_READY The receive request could not be > queued > > because > > - the receive queue is full. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Receive ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_IO_TOKEN *Token > > - ) > > -{ > > - SOCKET *Sock; > > - EFI_STATUS Status; > > - > > - if (NULL == This || > > - NULL == Token || > > - NULL == Token->CompletionToken.Event || > > - NULL == Token->Packet.RxData || > > - 0 == Token->Packet.RxData->FragmentCount || > > - 0 == Token->Packet.RxData->DataLength > > - ) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Status = Tcp4ChkDataBuf ( > > - (UINT32) Token->Packet.RxData->DataLength, > > - (UINT32) Token->Packet.RxData->FragmentCount, > > - Token->Packet.RxData->FragmentTable > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - return SockRcv (Sock, Token); > > - > > -} > > - > > - > > -/** > > - Disconnecting a TCP connection gracefully or reset a TCP connection. > > - > > - Initiate an asynchronous close token to TCP driver. After Close() is > called, > > - any buffered transmission data will be sent by TCP driver and the > current > > - instance will have a graceful close working flow described as RFC 793 > if > > - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent > by TCP > > - driver to fast disconnect this connection. When the close operation > > completes > > - successfully the TCP instance is in Tcp4StateClosed state, all > pending > > - asynchronous operation is signaled and any buffers used for TCP > network > > traffic > > - is flushed. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param CloseToken Pointer to the close token to return > when > > - operation finishes. > > - > > - @retval EFI_SUCCESS The operation completed successfully. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_ACCESS_DENIED One or more of the following are > TRUE: > > - * Configure() has been called with > TcpConfigData > > - set to NULL and this function has > not returned. > > - * Previous Close() call on this > instance has not > > - finished. > > - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource > to > > finish the > > - operation. > > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > > above > > - category error. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Close ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_CLOSE_TOKEN *CloseToken > > - ) > > -{ > > - SOCKET *Sock; > > - > > - if (NULL == This || > > - NULL == CloseToken || > > - NULL == CloseToken->CompletionToken.Event) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - return SockClose (Sock, CloseToken, CloseToken->AbortOnClose); > > -} > > - > > - > > -/** > > - Abort an asynchronous connection, listen, transmission or receive > request. > > - > > - The Cancel() function aborts a pending connection, listen, transmit > or > > receive > > - request. If Token is not NULL and the token is in the connection, > listen, > > - transmission or receive queue when it is being cancelled, its Token- > >Status > > - will be set to EFI_ABORTED and then Token->Event will be signaled. If > the > > token > > - is not in one of the queues, which usually means that the > asynchronous > > operation > > - has completed, EFI_NOT_FOUND is returned. If Token is NULL all > > asynchronous token > > - issued by Connect(), Accept(), Transmit() and Receive()will be > aborted. > > - NOTE: It has not been implemented currently. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param Token Pointer to a token that has been > issued by > > - Connect(), Accept(), Transmit() or > Receive(). If > > - NULL, all pending tokens issued by > above four > > - functions will be aborted. > > - > > - @retval EFI_SUCCESS The asynchronous I/O request is > aborted and > > Token->Event > > - is signaled. > > - @retval EFI_INVALID_PARAMETER This is NULL. > > - @retval EFI_NOT_STARTED This instance hasn's been configured. > > - @retval EFI_NO_MAPPING When using the default address, > > configuration > > - (DHCP, BOOTP,RARP, etc.) hasn's > finished yet. > > - @retval EFI_NOT_FOUND The asynchronous I/O request isn's > found > > in the > > - transmission or receive queue. It > has either > > - completed or wasn's issued by > Transmit() and Receive(). > > - @retval EFI_UNSUPPORTED The operation is not supported in > current > > - implementation. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Cancel ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL > > - ) > > -{ > > - return EFI_UNSUPPORTED; > > -} > > - > > - > > -/** > > - Poll to receive incoming data and transmit outgoing segments. > > - > > - The Poll() function increases the rate that data is moved between the > > network > > - and application and can be called when the TCP instance is created > > successfully. > > - Its use is optional. In some implementations, the periodical timer in > the > > MNP > > - driver may not poll the underlying communications device fast enough > to > > avoid > > - drop packets. Drivers and applications that are experiencing packet > loss > > should > > - try calling the Poll() function in a high frequency. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - > > - @retval EFI_SUCCESS Incoming or outgoing data was > processed. > > - @retval EFI_INVALID_PARAMETER This is NULL. > > - @retval EFI_DEVICE_ERROR An unexpected system or network > error > > occurred. > > - @retval EFI_NOT_READY No incoming or outgoing data was > > processed. > > - @retval EFI_TIMEOUT Data was dropped out of the > transmission or > > - receive queue. Consider increasing > the polling > > - rate. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Poll ( > > - IN EFI_TCP4_PROTOCOL *This > > - ) > > -{ > > - SOCKET *Sock; > > - EFI_STATUS Status; > > - > > - if (NULL == This) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Sock = SOCK_FROM_THIS (This); > > - > > - Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL); > > - > > - return Status; > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > deleted file mode 100644 > > index 7fd8bb1fbe09..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > +++ /dev/null > > @@ -1,940 +0,0 @@ > > -/** @file > > - Misc support routines for tcp. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "Tcp4Main.h" > > - > > -#include <Library/DevicePathLib.h> > > - > > -LIST_ENTRY mTcpRunQue = { > > - &mTcpRunQue, > > - &mTcpRunQue > > -}; > > - > > -LIST_ENTRY mTcpListenQue = { > > - &mTcpListenQue, > > - &mTcpListenQue > > -}; > > - > > -TCP_SEQNO mTcpGlobalIss = 0x4d7e980b; > > - > > -CHAR16 *mTcpStateName[] = { > > - L"TCP_CLOSED", > > - L"TCP_LISTEN", > > - L"TCP_SYN_SENT", > > - L"TCP_SYN_RCVD", > > - L"TCP_ESTABLISHED", > > - L"TCP_FIN_WAIT_1", > > - L"TCP_FIN_WAIT_2", > > - L"TCP_CLOSING", > > - L"TCP_TIME_WAIT", > > - L"TCP_CLOSE_WAIT", > > - L"TCP_LAST_ACK" > > -}; > > - > > - > > -/** > > - Initialize the Tcb local related members. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > -**/ > > -VOID > > -TcpInitTcbLocal ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - // > > - // Compute the checksum of the fixed parts of pseudo header > > - // > > - Tcb->HeadSum = NetPseudoHeadChecksum ( > > - Tcb->LocalEnd.Ip, > > - Tcb->RemoteEnd.Ip, > > - 0x06, > > - 0 > > - ); > > - > > - Tcb->Iss = TcpGetIss (); > > - Tcb->SndUna = Tcb->Iss; > > - Tcb->SndNxt = Tcb->Iss; > > - > > - Tcb->SndWl2 = Tcb->Iss; > > - Tcb->SndWnd = 536; > > - > > - Tcb->RcvWnd = GET_RCV_BUFFSIZE (Tcb->Sk); > > - > > - // > > - // First window size is never scaled > > - // > > - Tcb->RcvWndScale = 0; > > - Tcb->RetxmitSeqMax = 0; > > - > > - Tcb->ProbeTimerOn = FALSE; > > -} > > - > > - > > -/** > > - Initialize the peer related members. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param Seg Pointer to the segment that contains > the peer's > > - intial info. > > - @param Opt Pointer to the options announced by the > peer. > > - > > -**/ > > -VOID > > -TcpInitTcbPeer ( > > - IN OUT TCP_CB *Tcb, > > - IN TCP_SEG *Seg, > > - IN TCP_OPTION *Opt > > - ) > > -{ > > - UINT16 RcvMss; > > - > > - ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL)); > > - ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)); > > - > > - Tcb->SndWnd = Seg->Wnd; > > - Tcb->SndWndMax = Tcb->SndWnd; > > - Tcb->SndWl1 = Seg->Seq; > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { > > - Tcb->SndWl2 = Seg->Ack; > > - } else { > > - Tcb->SndWl2 = Tcb->Iss + 1; > > - } > > - > > - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) { > > - Tcb->SndMss = (UINT16) MAX (64, Opt->Mss); > > - > > - RcvMss = TcpGetRcvMss (Tcb->Sk); > > - if (Tcb->SndMss > RcvMss) { > > - Tcb->SndMss = RcvMss; > > - } > > - > > - } else { > > - // > > - // One end doesn't support MSS option, use default. > > - // > > - Tcb->RcvMss = 536; > > - } > > - > > - Tcb->CWnd = Tcb->SndMss; > > - > > - Tcb->Irs = Seg->Seq; > > - Tcb->RcvNxt = Tcb->Irs + 1; > > - > > - Tcb->RcvWl2 = Tcb->RcvNxt; > > - > > - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_WS) && > > - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)) { > > - > > - Tcb->SndWndScale = Opt->WndScale; > > - > > - Tcb->RcvWndScale = TcpComputeScale (Tcb); > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS); > > - > > - } else { > > - // > > - // One end doesn't support window scale option. use zero. > > - // > > - Tcb->RcvWndScale = 0; > > - } > > - > > - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_TS) && > > - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)) { > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_TS); > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS); > > - > > - Tcb->TsRecent = Opt->TSVal; > > - > > - // > > - // Compute the effective SndMss per RFC1122 > > - // section 4.2.2.6. If timestamp option is > > - // enabled, it will always occupy 12 bytes. > > - // > > - Tcb->SndMss -= TCP_OPTION_TS_ALIGNED_LEN; > > - } > > -} > > - > > - > > -/** > > - Locate a listen TCB that matchs the Local and Remote. > > - > > - @param Local Pointer to the local (IP, Port). > > - @param Remote Pointer to the remote (IP, Port). > > - > > - @return Pointer to the TCP_CB with the least number of wildcard, > > - if NULL no match is found. > > - > > -**/ > > -TCP_CB * > > -TcpLocateListenTcb ( > > - IN TCP_PEER *Local, > > - IN TCP_PEER *Remote > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - TCP_CB *Node; > > - TCP_CB *Match; > > - INTN Last; > > - INTN Cur; > > - > > - Last = 4; > > - Match = NULL; > > - > > - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { > > - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > > - > > - if ((Local->Port != Node->LocalEnd.Port) || > > - !TCP_PEER_MATCH (Remote, &Node->RemoteEnd) || > > - !TCP_PEER_MATCH (Local, &Node->LocalEnd)) { > > - > > - continue; > > - } > > - > > - // > > - // Compute the number of wildcard > > - // > > - Cur = 0; > > - if (Node->RemoteEnd.Ip == 0) { > > - Cur++; > > - } > > - > > - if (Node->RemoteEnd.Port == 0) { > > - Cur++; > > - } > > - > > - if (Node->LocalEnd.Ip == 0) { > > - Cur++; > > - } > > - > > - if (Cur < Last) { > > - if (Cur == 0) { > > - return Node; > > - } > > - > > - Last = Cur; > > - Match = Node; > > - } > > - } > > - > > - return Match; > > -} > > - > > - > > -/** > > - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. > > - > > - @param Addr Pointer to the IP address needs to > match. > > - @param Port The port number needs to match. > > - > > - @return The Tcb which matches the <Addr Port> paire exists or not. > > - > > -**/ > > -BOOLEAN > > -TcpFindTcbByPeer ( > > - IN EFI_IPv4_ADDRESS *Addr, > > - IN TCP_PORTNO Port > > - ) > > -{ > > - TCP_PORTNO LocalPort; > > - LIST_ENTRY *Entry; > > - TCP_CB *Tcb; > > - > > - ASSERT ((Addr != NULL) && (Port != 0)); > > - > > - LocalPort = HTONS (Port); > > - > > - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { > > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > > - > > - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && > > - (LocalPort == Tcb->LocalEnd.Port)) { > > - > > - return TRUE; > > - } > > - } > > - > > - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { > > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > > - > > - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && > > - (LocalPort == Tcb->LocalEnd.Port)) { > > - > > - return TRUE; > > - } > > - } > > - > > - return FALSE; > > -} > > - > > - > > -/** > > - Locate the TCP_CB related to the socket pair. > > - > > - @param LocalPort The local port number. > > - @param LocalIp The local IP address. > > - @param RemotePort The remote port number. > > - @param RemoteIp The remote IP address. > > - @param Syn Whether to search the listen sockets, > if TRUE, the > > - listen sockets are searched. > > - > > - @return Pointer to the related TCP_CB, if NULL no match is found. > > - > > -**/ > > -TCP_CB * > > -TcpLocateTcb ( > > - IN TCP_PORTNO LocalPort, > > - IN UINT32 LocalIp, > > - IN TCP_PORTNO RemotePort, > > - IN UINT32 RemoteIp, > > - IN BOOLEAN Syn > > - ) > > -{ > > - TCP_PEER Local; > > - TCP_PEER Remote; > > - LIST_ENTRY *Entry; > > - TCP_CB *Tcb; > > - > > - Local.Port = LocalPort; > > - Local.Ip = LocalIp; > > - > > - Remote.Port = RemotePort; > > - Remote.Ip = RemoteIp; > > - > > - // > > - // First check for exact match. > > - // > > - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { > > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > > - > > - if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) && > > - TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) { > > - > > - RemoveEntryList (&Tcb->List); > > - InsertHeadList (&mTcpRunQue, &Tcb->List); > > - > > - return Tcb; > > - } > > - } > > - > > - // > > - // Only check listen queue when SYN flag is on > > - // > > - if (Syn) { > > - return TcpLocateListenTcb (&Local, &Remote); > > - } > > - > > - return NULL; > > -} > > - > > - > > -/** > > - Insert a Tcb into the proper queue. > > - > > - @param Tcb Pointer to the TCP_CB to be inserted. > > - > > - @retval 0 The Tcb is inserted successfully. > > - @retval -1 Error condition occurred. > > - > > -**/ > > -INTN > > -TcpInsertTcb ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - LIST_ENTRY *Head; > > - TCP_CB *Node; > > - > > - ASSERT ( > > - (Tcb != NULL) && > > - ((Tcb->State == TCP_LISTEN) || > > - (Tcb->State == TCP_SYN_SENT) || > > - (Tcb->State == TCP_SYN_RCVD) || > > - (Tcb->State == TCP_CLOSED)) > > - ); > > - > > - if (Tcb->LocalEnd.Port == 0) { > > - return -1; > > - } > > - > > - Head = &mTcpRunQue; > > - > > - if (Tcb->State == TCP_LISTEN) { > > - Head = &mTcpListenQue; > > - } > > - > > - // > > - // Check that Tcb isn't already on the list. > > - // > > - NET_LIST_FOR_EACH (Entry, Head) { > > - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > > - > > - if (TCP_PEER_EQUAL (&Tcb->LocalEnd, &Node->LocalEnd) && > > - TCP_PEER_EQUAL (&Tcb->RemoteEnd, &Node->RemoteEnd)) { > > - > > - return -1; > > - } > > - } > > - > > - InsertHeadList (Head, &Tcb->List); > > - > > - return 0; > > -} > > - > > - > > -/** > > - Clone a TCB_CB from Tcb. > > - > > - @param Tcb Pointer to the TCP_CB to be cloned. > > - > > - @return Pointer to the new cloned TCP_CB, if NULL error condition > > occurred. > > - > > -**/ > > -TCP_CB * > > -TcpCloneTcb ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - TCP_CB *Clone; > > - > > - Clone = AllocatePool (sizeof (TCP_CB)); > > - > > - if (Clone == NULL) { > > - return NULL; > > - > > - } > > - > > - CopyMem (Clone, Tcb, sizeof (TCP_CB)); > > - > > - // > > - // Increate the reference count of the shared IpInfo. > > - // > > - NET_GET_REF (Tcb->IpInfo); > > - > > - InitializeListHead (&Clone->List); > > - InitializeListHead (&Clone->SndQue); > > - InitializeListHead (&Clone->RcvQue); > > - > > - Clone->Sk = SockClone (Tcb->Sk); > > - if (Clone->Sk == NULL) { > > - DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n")); > > - FreePool (Clone); > > - return NULL; > > - } > > - > > - ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone; > > - > > - return Clone; > > -} > > - > > - > > -/** > > - Compute an ISS to be used by a new connection. > > - > > - @return The result ISS. > > - > > -**/ > > -TCP_SEQNO > > -TcpGetIss ( > > - VOID > > - ) > > -{ > > - mTcpGlobalIss += 2048; > > - return mTcpGlobalIss; > > -} > > - > > - > > -/** > > - Get the local mss. > > - > > - @param Sock Pointer to the socket to get mss > > - > > - @return The mss size. > > - > > -**/ > > -UINT16 > > -TcpGetRcvMss ( > > - IN SOCKET *Sock > > - ) > > -{ > > - EFI_IP4_MODE_DATA Ip4Mode; > > - TCP4_PROTO_DATA *TcpProto; > > - EFI_IP4_PROTOCOL *Ip; > > - > > - ASSERT (Sock != NULL); > > - > > - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > > - Ip = TcpProto->TcpService->IpIo->Ip.Ip4; > > - ASSERT (Ip != NULL); > > - > > - Ip->GetModeData (Ip, &Ip4Mode, NULL, NULL); > > - > > - return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD)); > > -} > > - > > - > > -/** > > - Set the Tcb's state. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param State The state to be set. > > - > > -**/ > > -VOID > > -TcpSetState ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT8 State > > - ) > > -{ > > - ASSERT (Tcb->State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); > > - ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); > > - > > - DEBUG ( > > - (EFI_D_NET, > > - "Tcb (%p) state %s --> %s\n", > > - Tcb, > > - mTcpStateName[Tcb->State], > > - mTcpStateName[State]) > > - ); > > - > > - Tcb->State = State; > > - > > - switch (State) { > > - case TCP_ESTABLISHED: > > - > > - SockConnEstablished (Tcb->Sk); > > - > > - if (Tcb->Parent != NULL) { > > - // > > - // A new connection is accepted by a listening socket, install > > - // the device path. > > - // > > - TcpInstallDevicePath (Tcb->Sk); > > - } > > - > > - break; > > - > > - case TCP_CLOSED: > > - > > - SockConnClosed (Tcb->Sk); > > - > > - break; > > - default: > > - break; > > - } > > -} > > - > > - > > -/** > > - Compute the TCP segment's checksum. > > - > > - @param Nbuf Pointer to the buffer that contains the > TCP > > - segment. > > - @param HeadSum The checksum value of the fixed part of > pseudo > > - header. > > - > > - @return The checksum value. > > - > > -**/ > > -UINT16 > > -TcpChecksum ( > > - IN NET_BUF *Nbuf, > > - IN UINT16 HeadSum > > - ) > > -{ > > - UINT16 Checksum; > > - > > - Checksum = NetbufChecksum (Nbuf); > > - Checksum = NetAddChecksum (Checksum, HeadSum); > > - > > - Checksum = NetAddChecksum ( > > - Checksum, > > - HTONS ((UINT16) Nbuf->TotalSize) > > - ); > > - > > - return (UINT16) ~Checksum; > > -} > > - > > -/** > > - Translate the information from the head of the received TCP > > - segment Nbuf contains and fill it into a TCP_SEG structure. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param Nbuf Pointer to the buffer contains the TCP > segment. > > - > > - @return Pointer to the TCP_SEG that contains the translated TCP head > > information. > > - > > -**/ > > -TCP_SEG * > > -TcpFormatNetbuf ( > > - IN TCP_CB *Tcb, > > - IN OUT NET_BUF *Nbuf > > - ) > > -{ > > - TCP_SEG *Seg; > > - TCP_HEAD *Head; > > - > > - Seg = TCPSEG_NETBUF (Nbuf); > > - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); > > - ASSERT (Head != NULL); > > - Nbuf->Tcp = Head; > > - > > - Seg->Seq = NTOHL (Head->Seq); > > - Seg->Ack = NTOHL (Head->Ack); > > - Seg->End = Seg->Seq + (Nbuf->TotalSize - (Head->HeadLen << 2)); > > - > > - Seg->Urg = NTOHS (Head->Urg); > > - Seg->Wnd = (NTOHS (Head->Wnd) << Tcb->SndWndScale); > > - Seg->Flag = Head->Flag; > > - > > - // > > - // SYN and FIN flag occupy one sequence space each. > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > > - // > > - // RFC requires that initial window not be scaled > > - // > > - Seg->Wnd = NTOHS (Head->Wnd); > > - Seg->End++; > > - } > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > > - Seg->End++; > > - } > > - > > - return Seg; > > -} > > - > > - > > -/** > > - Reset the connection related with Tcb. > > - > > - @param Tcb Pointer to the TCP_CB of the connection > to be > > - reset. > > - > > -**/ > > -VOID > > -TcpResetConnection ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - NET_BUF *Nbuf; > > - TCP_HEAD *Nhead; > > - > > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > > - > > - if (Nbuf == NULL) { > > - return ; > > - } > > - > > - Nhead = (TCP_HEAD *) NetbufAllocSpace ( > > - Nbuf, > > - sizeof (TCP_HEAD), > > - NET_BUF_TAIL > > - ); > > - > > - ASSERT (Nhead != NULL); > > - > > - Nbuf->Tcp = Nhead; > > - > > - Nhead->Flag = TCP_FLG_RST; > > - Nhead->Seq = HTONL (Tcb->SndNxt); > > - Nhead->Ack = HTONL (Tcb->RcvNxt); > > - Nhead->SrcPort = Tcb->LocalEnd.Port; > > - Nhead->DstPort = Tcb->RemoteEnd.Port; > > - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); > > - Nhead->Res = 0; > > - Nhead->Wnd = HTONS (0xFFFF); > > - Nhead->Checksum = 0; > > - Nhead->Urg = 0; > > - Nhead->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); > > - > > - TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip); > > - > > - NetbufFree (Nbuf); > > -} > > - > > - > > -/** > > - Initialize an active connection. > > - > > - @param Tcb Pointer to the TCP_CB that wants to > initiate a > > - connection. > > - > > -**/ > > -VOID > > -TcpOnAppConnect ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - TcpInitTcbLocal (Tcb); > > - TcpSetState (Tcb, TCP_SYN_SENT); > > - > > - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); > > - TcpToSendData (Tcb, 1); > > -} > > - > > - > > -/** > > - Initiate the connection close procedure, called when > > - applications want to close the connection. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > -**/ > > -VOID > > -TcpOnAppClose ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - ASSERT (Tcb != NULL); > > - > > - if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk) != 0) { > > - > > - DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset " > > - "because data is lost for TCB %p\n", Tcb)); > > - > > - TcpResetConnection (Tcb); > > - TcpClose (Tcb); > > - return; > > - } > > - > > - switch (Tcb->State) { > > - case TCP_CLOSED: > > - case TCP_LISTEN: > > - case TCP_SYN_SENT: > > - TcpSetState (Tcb, TCP_CLOSED); > > - break; > > - > > - case TCP_SYN_RCVD: > > - case TCP_ESTABLISHED: > > - TcpSetState (Tcb, TCP_FIN_WAIT_1); > > - break; > > - > > - case TCP_CLOSE_WAIT: > > - TcpSetState (Tcb, TCP_LAST_ACK); > > - break; > > - default: > > - break; > > - } > > - > > - TcpToSendData (Tcb, 1); > > -} > > - > > - > > -/** > > - Check whether the application's newly delivered data can be sent out. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > - @retval 0 Whether the data is sent out or is > buffered for > > - further sending. > > - @retval -1 The Tcb is not in a state that data is > permitted to > > - be sent out. > > - > > -**/ > > -INTN > > -TcpOnAppSend ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - > > - switch (Tcb->State) { > > - case TCP_CLOSED: > > - return -1; > > - > > - case TCP_LISTEN: > > - return -1; > > - > > - case TCP_SYN_SENT: > > - case TCP_SYN_RCVD: > > - return 0; > > - > > - case TCP_ESTABLISHED: > > - case TCP_CLOSE_WAIT: > > - TcpToSendData (Tcb, 0); > > - return 0; > > - > > - case TCP_FIN_WAIT_1: > > - case TCP_FIN_WAIT_2: > > - case TCP_CLOSING: > > - case TCP_LAST_ACK: > > - case TCP_TIME_WAIT: > > - return -1; > > - > > - default: > > - break; > > - } > > - > > - return 0; > > -} > > - > > - > > -/** > > - Application has consumed some data, check whether > > - to send a window updata ack or a delayed ack. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > -**/ > > -VOID > > -TcpOnAppConsume ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - UINT32 TcpOld; > > - > > - switch (Tcb->State) { > > - case TCP_CLOSED: > > - return; > > - > > - case TCP_LISTEN: > > - return; > > - > > - case TCP_SYN_SENT: > > - case TCP_SYN_RCVD: > > - return; > > - > > - case TCP_ESTABLISHED: > > - TcpOld = TcpRcvWinOld (Tcb); > > - if (TcpRcvWinNow (Tcb) > TcpOld) { > > - > > - if (TcpOld < Tcb->RcvMss) { > > - > > - DEBUG ((EFI_D_NET, "TcpOnAppConsume: send a window" > > - " update for a window closed Tcb %p\n", Tcb)); > > - > > - TcpSendAck (Tcb); > > - } else if (Tcb->DelayedAck == 0) { > > - > > - DEBUG ((EFI_D_NET, "TcpOnAppConsume: scheduled a delayed" > > - " ACK to update window for Tcb %p\n", Tcb)); > > - > > - Tcb->DelayedAck = 1; > > - } > > - } > > - > > - break; > > - > > - case TCP_CLOSE_WAIT: > > - return; > > - > > - case TCP_FIN_WAIT_1: > > - case TCP_FIN_WAIT_2: > > - case TCP_CLOSING: > > - case TCP_LAST_ACK: > > - case TCP_TIME_WAIT: > > - return; > > - > > - default: > > - break; > > - } > > -} > > - > > - > > -/** > > - Abort the connection by sending a reset segment, called > > - when the application wants to abort the connection. > > - > > - @param Tcb Pointer to the TCP_CB of the TCP > instance. > > - > > -**/ > > -VOID > > -TcpOnAppAbort ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset " > > - "issued by application for TCB %p\n", Tcb)); > > - > > - switch (Tcb->State) { > > - case TCP_SYN_RCVD: > > - case TCP_ESTABLISHED: > > - case TCP_FIN_WAIT_1: > > - case TCP_FIN_WAIT_2: > > - case TCP_CLOSE_WAIT: > > - TcpResetConnection (Tcb); > > - break; > > - default: > > - break; > > - } > > - > > - TcpSetState (Tcb, TCP_CLOSED); > > -} > > - > > -/** > > - Install the device path protocol on the TCP instance. > > - > > - @param Sock Pointer to the socket representing the TCP > instance. > > - > > - @retval EFI_SUCCESS The device path protocol is installed. > > - @retval other Failed to install the device path protocol. > > - > > -**/ > > -EFI_STATUS > > -TcpInstallDevicePath ( > > - IN SOCKET *Sock > > - ) > > -{ > > - TCP4_PROTO_DATA *TcpProto; > > - TCP4_SERVICE_DATA *TcpService; > > - TCP_CB *Tcb; > > - IPv4_DEVICE_PATH Ip4DPathNode; > > - EFI_STATUS Status; > > - TCP_PORTNO LocalPort; > > - TCP_PORTNO RemotePort; > > - > > - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; > > - TcpService = TcpProto->TcpService; > > - Tcb = TcpProto->TcpPcb; > > - > > - LocalPort = NTOHS (Tcb->LocalEnd.Port); > > - RemotePort = NTOHS (Tcb->RemoteEnd.Port); > > - NetLibCreateIPv4DPathNode ( > > - &Ip4DPathNode, > > - TcpService->ControllerHandle, > > - Tcb->LocalEnd.Ip, > > - LocalPort, > > - Tcb->RemoteEnd.Ip, > > - RemotePort, > > - EFI_IP_PROTO_TCP, > > - Tcb->UseDefaultAddr > > - ); > > - > > - IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask); > > - > > - Sock->DevicePath = AppendDevicePathNode ( > > - Sock->ParentDevicePath, > > - (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode > > - ); > > - if (Sock->DevicePath == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Status = gBS->InstallProtocolInterface ( > > - &Sock->SockHandle, > > - &gEfiDevicePathProtocolGuid, > > - EFI_NATIVE_INTERFACE, > > - Sock->DevicePath > > - ); > > - if (EFI_ERROR (Status)) { > > - FreePool (Sock->DevicePath); > > - } > > - > > - return Status; > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > deleted file mode 100644 > > index e84310f6c693..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > +++ /dev/null > > @@ -1,352 +0,0 @@ > > -/** @file > > - Routines to process TCP option. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Tcp4Main.h" > > - > > -/** > > - Get a UINT16 value from buffer. > > - > > - @param Buf Pointer to input buffer. > > - > > - @return The UINT16 value get from buffer. > > - > > -**/ > > -UINT16 > > -TcpGetUint16 ( > > - IN UINT8 *Buf > > - ) > > -{ > > - UINT16 Value; > > - CopyMem (&Value, Buf, sizeof (UINT16)); > > - return NTOHS (Value); > > -} > > - > > -/** > > - Get a UINT32 value from buffer. > > - > > - @param Buf Pointer to input buffer. > > - > > - @return The UINT32 value get from buffer. > > - > > -**/ > > -UINT32 > > -TcpGetUint32 ( > > - IN UINT8 *Buf > > - ) > > -{ > > - UINT32 Value; > > - CopyMem (&Value, Buf, sizeof (UINT32)); > > - return NTOHL (Value); > > -} > > - > > -/** > > - Put a UINT32 value in buffer. > > - > > - @param Buf Pointer to the buffer. > > - @param Data The UINT32 Date to put in buffer > > - > > -**/ > > -VOID > > -TcpPutUint32 ( > > - OUT UINT8 *Buf, > > - IN UINT32 Data > > - ) > > -{ > > - Data = HTONL (Data); > > - CopyMem (Buf, &Data, sizeof (UINT32)); > > -} > > - > > - > > -/** > > - Compute the window scale value according to the given buffer size. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The scale value. > > - > > -**/ > > -UINT8 > > -TcpComputeScale ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - UINT8 Scale; > > - UINT32 BufSize; > > - > > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > > - > > - BufSize = GET_RCV_BUFFSIZE (Tcb->Sk); > > - > > - Scale = 0; > > - while ((Scale < TCP_OPTION_MAX_WS) && > > - ((UINT32) (TCP_OPTION_MAX_WIN << Scale) < BufSize)) { > > - > > - Scale++; > > - } > > - > > - return Scale; > > -} > > - > > - > > -/** > > - Build the TCP option in three-way handshake. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the buffer to store the options. > > - > > - @return The total length of the TCP option field. > > - > > -**/ > > -UINT16 > > -TcpSynBuildOption ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ) > > -{ > > - UINT8 *Data; > > - UINT16 Len; > > - > > - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); > > - > > - Len = 0; > > - > > - // > > - // Add timestamp option if not disabled by application > > - // and it is the first SYN segment or the peer has sent > > - // us its timestamp. > > - // > > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS) && > > - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || > > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS))) { > > - > > - Data = NetbufAllocSpace ( > > - Nbuf, > > - TCP_OPTION_TS_ALIGNED_LEN, > > - NET_BUF_HEAD > > - ); > > - > > - ASSERT (Data != NULL); > > - Len += TCP_OPTION_TS_ALIGNED_LEN; > > - > > - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); > > - TcpPutUint32 (Data + 4, mTcpTick); > > - TcpPutUint32 (Data + 8, 0); > > - } > > - > > - // > > - // Build window scale option, only when are configured > > - // to send WS option, and either we are doing active > > - // open or we have received WS option from peer. > > - // > > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS) && > > - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || > > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS))) { > > - > > - Data = NetbufAllocSpace ( > > - Nbuf, > > - TCP_OPTION_WS_ALIGNED_LEN, > > - NET_BUF_HEAD > > - ); > > - > > - ASSERT (Data != NULL); > > - > > - Len += TCP_OPTION_WS_ALIGNED_LEN; > > - TcpPutUint32 (Data, TCP_OPTION_WS_FAST | TcpComputeScale (Tcb)); > > - } > > - > > - // > > - // Build MSS option > > - // > > - Data = NetbufAllocSpace (Nbuf, TCP_OPTION_MSS_LEN, 1); > > - ASSERT (Data != NULL); > > - > > - Len += TCP_OPTION_MSS_LEN; > > - TcpPutUint32 (Data, TCP_OPTION_MSS_FAST | Tcb->RcvMss); > > - > > - return Len; > > -} > > - > > - > > -/** > > - Build the TCP option in synchronized states. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the buffer to store the options. > > - > > - @return The total length of the TCP option field. > > - > > -**/ > > -UINT16 > > -TcpBuildOption ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ) > > -{ > > - UINT8 *Data; > > - UINT16 Len; > > - > > - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); > > - Len = 0; > > - > > - // > > - // Build Timestamp option > > - // > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_TS) && > > - !TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_RST)) { > > - > > - Data = NetbufAllocSpace ( > > - Nbuf, > > - TCP_OPTION_TS_ALIGNED_LEN, > > - NET_BUF_HEAD > > - ); > > - > > - ASSERT (Data != NULL); > > - Len += TCP_OPTION_TS_ALIGNED_LEN; > > - > > - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); > > - TcpPutUint32 (Data + 4, mTcpTick); > > - TcpPutUint32 (Data + 8, Tcb->TsRecent); > > - } > > - > > - return Len; > > -} > > - > > - > > -/** > > - Parse the supported options. > > - > > - @param Tcp Pointer to the TCP_CB of this TCP instance. > > - @param Option Pointer to the TCP_OPTION used to store the > successfully > > pasrsed > > - options. > > - > > - @retval 0 The options are successfully pasrsed. > > - @retval -1 Ilegal option was found. > > - > > -**/ > > -INTN > > -TcpParseOption ( > > - IN TCP_HEAD *Tcp, > > - IN OUT TCP_OPTION *Option > > - ) > > -{ > > - UINT8 *Head; > > - UINT8 TotalLen; > > - UINT8 Cur; > > - UINT8 Type; > > - UINT8 Len; > > - > > - ASSERT ((Tcp != NULL) && (Option != NULL)); > > - > > - Option->Flag = 0; > > - > > - TotalLen = (UINT8) ((Tcp->HeadLen << 2) - sizeof (TCP_HEAD)); > > - if (TotalLen <= 0) { > > - return 0; > > - } > > - > > - Head = (UINT8 *) (Tcp + 1); > > - > > - // > > - // Fast process of timestamp option > > - // > > - if ((TotalLen == TCP_OPTION_TS_ALIGNED_LEN) && > > - (TcpGetUint32 (Head) == TCP_OPTION_TS_FAST)) { > > - > > - Option->TSVal = TcpGetUint32 (Head + 4); > > - Option->TSEcr = TcpGetUint32 (Head + 8); > > - Option->Flag = TCP_OPTION_RCVD_TS; > > - > > - return 0; > > - } > > - > > - // > > - // Slow path to process the options. > > - // > > - Cur = 0; > > - > > - while (Cur < TotalLen) { > > - Type = Head[Cur]; > > - > > - switch (Type) { > > - case TCP_OPTION_MSS: > > - Len = Head[Cur + 1]; > > - > > - if ((Len != TCP_OPTION_MSS_LEN) || > > - (TotalLen - Cur < TCP_OPTION_MSS_LEN)) { > > - > > - return -1; > > - } > > - > > - Option->Mss = TcpGetUint16 (&Head[Cur + 2]); > > - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_MSS); > > - > > - Cur += TCP_OPTION_MSS_LEN; > > - break; > > - > > - case TCP_OPTION_WS: > > - Len = Head[Cur + 1]; > > - > > - if ((Len != TCP_OPTION_WS_LEN) || > > - (TotalLen - Cur < TCP_OPTION_WS_LEN)) { > > - > > - return -1; > > - } > > - > > - Option->WndScale = (UINT8) MIN (14, Head[Cur + 2]); > > - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_WS); > > - > > - Cur += TCP_OPTION_WS_LEN; > > - break; > > - > > - case TCP_OPTION_TS: > > - Len = Head[Cur + 1]; > > - > > - if ((Len != TCP_OPTION_TS_LEN) || > > - (TotalLen - Cur < TCP_OPTION_TS_LEN)) { > > - > > - return -1; > > - } > > - > > - Option->TSVal = TcpGetUint32 (&Head[Cur + 2]); > > - Option->TSEcr = TcpGetUint32 (&Head[Cur + 6]); > > - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_TS); > > - > > - Cur += TCP_OPTION_TS_LEN; > > - break; > > - > > - case TCP_OPTION_NOP: > > - Cur++; > > - break; > > - > > - case TCP_OPTION_EOP: > > - Cur = TotalLen; > > - break; > > - > > - default: > > - Len = Head[Cur + 1]; > > - > > - if ((TotalLen - Cur) < Len || Len < 2) { > > - return -1; > > - } > > - > > - Cur = (UINT8) (Cur + Len); > > - break; > > - } > > - > > - } > > - > > - return 0; > > -} > > - > > - > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > deleted file mode 100644 > > index 760b09a1eda1..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > +++ /dev/null > > @@ -1,1238 +0,0 @@ > > -/** @file > > - TCP output process routines. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Tcp4Main.h" > > - > > -UINT8 mTcpOutFlag[] = { > > - 0, // TCP_CLOSED > > - 0, // TCP_LISTEN > > - TCP_FLG_SYN, // TCP_SYN_SENT > > - TCP_FLG_SYN | TCP_FLG_ACK, // TCP_SYN_RCVD > > - TCP_FLG_ACK, // TCP_ESTABLISHED > > - TCP_FLG_FIN | TCP_FLG_ACK, // TCP_FIN_WAIT_1 > > - TCP_FLG_ACK, // TCP_FIN_WAIT_2 > > - TCP_FLG_ACK | TCP_FLG_FIN, // TCP_CLOSING > > - TCP_FLG_ACK, // TCP_TIME_WAIT > > - TCP_FLG_ACK, // TCP_CLOSE_WAIT > > - TCP_FLG_FIN | TCP_FLG_ACK // TCP_LAST_ACK > > -}; > > - > > - > > -/** > > - Compute the sequence space left in the old receive window. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The sequence space left in the old receive window. > > - > > -**/ > > -UINT32 > > -TcpRcvWinOld ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - UINT32 OldWin; > > - > > - OldWin = 0; > > - > > - if (TCP_SEQ_GT (Tcb->RcvWl2 + Tcb->RcvWnd, Tcb->RcvNxt)) { > > - > > - OldWin = TCP_SUB_SEQ ( > > - Tcb->RcvWl2 + Tcb->RcvWnd, > > - Tcb->RcvNxt > > - ); > > - } > > - > > - return OldWin; > > -} > > - > > - > > -/** > > - Compute the current receive window. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The size of the current receive window, in bytes. > > - > > -**/ > > -UINT32 > > -TcpRcvWinNow ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - SOCKET *Sk; > > - UINT32 Win; > > - UINT32 Increase; > > - UINT32 OldWin; > > - > > - Sk = Tcb->Sk; > > - ASSERT (Sk != NULL); > > - > > - OldWin = TcpRcvWinOld (Tcb); > > - > > - Win = SockGetFreeSpace (Sk, SOCK_RCV_BUF); > > - > > - Increase = 0; > > - if (Win > OldWin) { > > - Increase = Win - OldWin; > > - } > > - > > - // > > - // Receiver's SWS: don't advertise a bigger window > > - // unless it can be increased by at least one Mss or > > - // half of the receive buffer. > > - // > > - if ((Increase > Tcb->SndMss) || > > - (2 * Increase >= GET_RCV_BUFFSIZE (Sk))) { > > - > > - return Win; > > - } > > - > > - return OldWin; > > -} > > - > > - > > -/** > > - Compute the value to fill in the window size field of the outgoing > segment. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Syn The flag to indicate whether the outgoing segment is > a SYN > > - segment. > > - > > - @return The value of the local receive window size used to fill the > outing > > segment. > > - > > -**/ > > -UINT16 > > -TcpComputeWnd ( > > - IN OUT TCP_CB *Tcb, > > - IN BOOLEAN Syn > > - ) > > -{ > > - UINT32 Wnd; > > - > > - // > > - // RFC requires that initial window not be scaled > > - // > > - if (Syn) { > > - > > - Wnd = GET_RCV_BUFFSIZE (Tcb->Sk); > > - } else { > > - > > - Wnd = TcpRcvWinNow (Tcb); > > - > > - Tcb->RcvWnd = Wnd; > > - } > > - > > - Wnd = MIN (Wnd >> Tcb->RcvWndScale, 0xffff); > > - return NTOHS ((UINT16) Wnd); > > -} > > - > > - > > -/** > > - Get the maximum SndNxt. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The sequence number of the maximum SndNxt. > > - > > -**/ > > -TCP_SEQNO > > -TcpGetMaxSndNxt ( > > - IN TCP_CB *Tcb > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - NET_BUF *Nbuf; > > - > > - if (IsListEmpty (&Tcb->SndQue)) { > > - return Tcb->SndNxt; > > - } > > - > > - Entry = Tcb->SndQue.BackLink; > > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > > - > > - ASSERT (TCP_SEQ_GEQ (TCPSEG_NETBUF (Nbuf)->End, Tcb->SndNxt)); > > - return TCPSEG_NETBUF (Nbuf)->End; > > -} > > - > > - > > -/** > > - Compute how much data to send. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Force Whether to ignore the sender's SWS avoidance > algorithm > > and send > > - out data by force. > > - > > - @return The length of the data can be sent, if 0, no data can be sent. > > - > > -**/ > > -UINT32 > > -TcpDataToSend ( > > - IN TCP_CB *Tcb, > > - IN INTN Force > > - ) > > -{ > > - SOCKET *Sk; > > - UINT32 Win; > > - UINT32 Len; > > - UINT32 Left; > > - UINT32 Limit; > > - > > - Sk = Tcb->Sk; > > - ASSERT (Sk != NULL); > > - > > - // > > - // TCP should NOT send data beyond the send window > > - // and congestion window. The right edge of send > > - // window is defined as SND.WL2 + SND.WND. The right > > - // edge of congestion window is defined as SND.UNA + > > - // CWND. > > - // > > - Win = 0; > > - Limit = Tcb->SndWl2 + Tcb->SndWnd; > > - > > - if (TCP_SEQ_GT (Limit, Tcb->SndUna + Tcb->CWnd)) { > > - > > - Limit = Tcb->SndUna + Tcb->CWnd; > > - } > > - > > - if (TCP_SEQ_GT (Limit, Tcb->SndNxt)) { > > - Win = TCP_SUB_SEQ (Limit, Tcb->SndNxt); > > - } > > - > > - // > > - // The data to send contains two parts: the data on the > > - // socket send queue, and the data on the TCB's send > > - // buffer. The later can be non-zero if the peer shrinks > > - // its advertised window. > > - // > > - Left = GET_SND_DATASIZE (Sk) + > > - TCP_SUB_SEQ (TcpGetMaxSndNxt (Tcb), Tcb->SndNxt); > > - > > - Len = MIN (Win, Left); > > - > > - if (Len > Tcb->SndMss) { > > - Len = Tcb->SndMss; > > - } > > - > > - if ((Force != 0)|| (Len == 0 && Left == 0)) { > > - return Len; > > - } > > - > > - if (Len == 0 && Left != 0) { > > - goto SetPersistTimer; > > - } > > - > > - // > > - // Sender's SWS avoidance: Don't send a small segment unless > > - // a)A full-sized segment can be sent, > > - // b)at least one-half of the maximum sized windows that > > - // the other end has ever advertised. > > - // c)It can send everything it has and either it isn't > > - // expecting an ACK or the Nagle algorithm is disabled. > > - // > > - if ((Len == Tcb->SndMss) || (2 * Len >= Tcb->SndWndMax)) { > > - > > - return Len; > > - } > > - > > - if ((Len == Left) && > > - ((Tcb->SndNxt == Tcb->SndUna) || > > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE))) { > > - > > - return Len; > > - } > > - > > - // > > - // RFC1122 suggests to set a timer when SWSA forbids TCP > > - // sending more data, and combine it with probe timer. > > - // > > -SetPersistTimer: > > - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { > > - > > - DEBUG ( > > - (EFI_D_WARN, > > - "TcpDataToSend: enter persistent state for TCB %p\n", > > - Tcb) > > - ); > > - > > - if (!Tcb->ProbeTimerOn) { > > - TcpSetProbeTimer (Tcb); > > - } > > - } > > - > > - return 0; > > -} > > - > > - > > -/** > > - Build the TCP header of the TCP segment and transmit the segment by > IP. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the buffer containing the segment to be > sent > > out. > > - > > - @retval 0 The segment is sent out successfully. > > - @retval other Error condition occurred. > > - > > -**/ > > -INTN > > -TcpTransmitSegment ( > > - IN OUT TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ) > > -{ > > - UINT16 Len; > > - TCP_HEAD *Head; > > - TCP_SEG *Seg; > > - BOOLEAN Syn; > > - UINT32 DataLen; > > - > > - ASSERT ((Nbuf != NULL) && (Nbuf->Tcp == NULL) && (TcpVerifySegment > > (Nbuf) != 0)); > > - > > - DataLen = Nbuf->TotalSize; > > - > > - Seg = TCPSEG_NETBUF (Nbuf); > > - Syn = TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN); > > - > > - if (Syn) { > > - > > - Len = TcpSynBuildOption (Tcb, Nbuf); > > - } else { > > - > > - Len = TcpBuildOption (Tcb, Nbuf); > > - } > > - > > - ASSERT ((Len % 4 == 0) && (Len <= 40)); > > - > > - Len += sizeof (TCP_HEAD); > > - > > - Head = (TCP_HEAD *) NetbufAllocSpace ( > > - Nbuf, > > - sizeof (TCP_HEAD), > > - NET_BUF_HEAD > > - ); > > - > > - ASSERT (Head != NULL); > > - > > - Nbuf->Tcp = Head; > > - > > - Head->SrcPort = Tcb->LocalEnd.Port; > > - Head->DstPort = Tcb->RemoteEnd.Port; > > - Head->Seq = NTOHL (Seg->Seq); > > - Head->Ack = NTOHL (Tcb->RcvNxt); > > - Head->HeadLen = (UINT8) (Len >> 2); > > - Head->Res = 0; > > - Head->Wnd = TcpComputeWnd (Tcb, Syn); > > - Head->Checksum = 0; > > - > > - // > > - // Check whether to set the PSH flag. > > - // > > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_PSH); > > - > > - if (DataLen != 0) { > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_PSH) && > > - TCP_SEQ_BETWEEN (Seg->Seq, Tcb->SndPsh, Seg->End)) { > > - > > - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); > > - > > - } else if ((Seg->End == Tcb->SndNxt) && > > - (GET_SND_DATASIZE (Tcb->Sk) == 0)) { > > - > > - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); > > - } > > - } > > - > > - // > > - // Check whether to set the URG flag and the urgent pointer. > > - // > > - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); > > - > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && > > - TCP_SEQ_LEQ (Seg->Seq, Tcb->SndUp)) { > > - > > - TCP_SET_FLG (Seg->Flag, TCP_FLG_URG); > > - > > - if (TCP_SEQ_LT (Tcb->SndUp, Seg->End)) { > > - > > - Seg->Urg = (UINT16) TCP_SUB_SEQ (Tcb->SndUp, Seg->Seq); > > - } else { > > - > > - Seg->Urg = (UINT16) MIN ( > > - TCP_SUB_SEQ (Tcb->SndUp, > > - Seg->Seq), > > - 0xffff > > - ); > > - } > > - } > > - > > - Head->Flag = Seg->Flag; > > - Head->Urg = NTOHS (Seg->Urg); > > - Head->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); > > - > > - // > > - // update the TCP session's control information > > - // > > - Tcb->RcvWl2 = Tcb->RcvNxt; > > - if (Syn) { > > - Tcb->RcvWnd = NTOHS (Head->Wnd); > > - } > > - > > - // > > - // clear delayedack flag > > - // > > - Tcb->DelayedAck = 0; > > - > > - return TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb- > >RemoteEnd.Ip); > > -} > > - > > - > > -/** > > - Get a segment from the Tcb's SndQue. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment. > > - @param Len The maximum length of the segment. > > - > > - @return Pointer to the segment, if NULL some error occurred. > > - > > -**/ > > -NET_BUF * > > -TcpGetSegmentSndQue ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq, > > - IN UINT32 Len > > - ) > > -{ > > - LIST_ENTRY *Head; > > - LIST_ENTRY *Cur; > > - NET_BUF *Node; > > - TCP_SEG *Seg; > > - NET_BUF *Nbuf; > > - TCP_SEQNO End; > > - UINT8 *Data; > > - UINT8 Flag; > > - INT32 Offset; > > - INT32 CopyLen; > > - > > - ASSERT ((Tcb != NULL) && TCP_SEQ_LEQ (Seq, Tcb->SndNxt) && (Len > 0)); > > - > > - // > > - // Find the segment that contains the Seq. > > - // > > - Head = &Tcb->SndQue; > > - > > - Node = NULL; > > - Seg = NULL; > > - > > - NET_LIST_FOR_EACH (Cur, Head) { > > - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); > > - Seg = TCPSEG_NETBUF (Node); > > - > > - if (TCP_SEQ_LT (Seq, Seg->End) && TCP_SEQ_LEQ (Seg->Seq, Seq)) { > > - > > - break; > > - } > > - } > > - > > - ASSERT (Cur != Head); > > - ASSERT (Node != NULL); > > - ASSERT (Seg != NULL); > > - > > - // > > - // Return the buffer if it can be returned without > > - // adjustment: > > - // > > - if ((Seg->Seq == Seq) && > > - TCP_SEQ_LEQ (Seg->End, Seg->Seq + Len) && > > - !NET_BUF_SHARED (Node)) { > > - > > - NET_GET_REF (Node); > > - return Node; > > - } > > - > > - // > > - // Create a new buffer and copy data there. > > - // > > - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); > > - > > - if (Nbuf == NULL) { > > - return NULL; > > - } > > - > > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > > - > > - Flag = Seg->Flag; > > - End = Seg->End; > > - > > - if (TCP_SEQ_LT (Seq + Len, Seg->End)) { > > - End = Seq + Len; > > - } > > - > > - CopyLen = TCP_SUB_SEQ (End, Seq); > > - Offset = TCP_SUB_SEQ (Seq, Seg->Seq); > > - > > - // > > - // If SYN is set and out of the range, clear the flag. > > - // Because the sequence of the first byte is SEG.SEQ+1, > > - // adjust Offset by -1. If SYN is in the range, copy > > - // one byte less. > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > > - > > - if (TCP_SEQ_LT (Seg->Seq, Seq)) { > > - > > - TCP_CLEAR_FLG (Flag, TCP_FLG_SYN); > > - Offset--; > > - } else { > > - > > - CopyLen--; > > - } > > - } > > - > > - // > > - // If FIN is set and in the range, copy one byte less, > > - // and if it is out of the range, clear the flag. > > - // > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > > - > > - if (Seg->End == End) { > > - > > - CopyLen--; > > - } else { > > - > > - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); > > - } > > - } > > - > > - ASSERT (CopyLen >= 0); > > - > > - // > > - // copy data to the segment > > - // > > - if (CopyLen != 0) { > > - Data = NetbufAllocSpace (Nbuf, CopyLen, NET_BUF_TAIL); > > - ASSERT (Data != NULL); > > - > > - if ((INT32) NetbufCopy (Node, Offset, CopyLen, Data) != CopyLen) { > > - goto OnError; > > - } > > - } > > - > > - CopyMem (TCPSEG_NETBUF (Nbuf), Seg, sizeof (TCP_SEG)); > > - > > - TCPSEG_NETBUF (Nbuf)->Seq = Seq; > > - TCPSEG_NETBUF (Nbuf)->End = End; > > - TCPSEG_NETBUF (Nbuf)->Flag = Flag; > > - > > - return Nbuf; > > - > > -OnError: > > - NetbufFree (Nbuf); > > - return NULL; > > -} > > - > > - > > -/** > > - Get a segment from the Tcb's socket buffer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment. > > - @param Len The maximum length of the segment. > > - > > - @return Pointer to the segment, if NULL some error occurred. > > - > > -**/ > > -NET_BUF * > > -TcpGetSegmentSock ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq, > > - IN UINT32 Len > > - ) > > -{ > > - NET_BUF *Nbuf; > > - UINT8 *Data; > > - UINT32 DataGet; > > - > > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); > > - > > - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); > > - > > - if (Nbuf == NULL) { > > - DEBUG ((EFI_D_ERROR, "TcpGetSegmentSock: failed to allocate " > > - "a netbuf for TCB %p\n",Tcb)); > > - > > - return NULL; > > - } > > - > > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > > - > > - DataGet = 0; > > - > > - if (Len != 0) { > > - // > > - // copy data to the segment. > > - // > > - Data = NetbufAllocSpace (Nbuf, Len, NET_BUF_TAIL); > > - ASSERT (Data != NULL); > > - > > - DataGet = SockGetDataToSend (Tcb->Sk, 0, Len, Data); > > - } > > - > > - NET_GET_REF (Nbuf); > > - > > - TCPSEG_NETBUF (Nbuf)->Seq = Seq; > > - TCPSEG_NETBUF (Nbuf)->End = Seq + Len; > > - > > - InsertTailList (&(Tcb->SndQue), &(Nbuf->List)); > > - > > - if (DataGet != 0) { > > - > > - SockDataSent (Tcb->Sk, DataGet); > > - } > > - > > - return Nbuf; > > -} > > - > > - > > -/** > > - Get a segment starting from sequence Seq of a maximum > > - length of Len. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment. > > - @param Len The maximum length of the segment. > > - > > - @return Pointer to the segment, if NULL some error occurred. > > - > > -**/ > > -NET_BUF * > > -TcpGetSegment ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq, > > - IN UINT32 Len > > - ) > > -{ > > - NET_BUF *Nbuf; > > - > > - ASSERT (Tcb != NULL); > > - > > - // > > - // Compare the SndNxt with the max sequence number sent. > > - // > > - if ((Len != 0) && TCP_SEQ_LT (Seq, TcpGetMaxSndNxt (Tcb))) { > > - > > - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); > > - } else { > > - > > - Nbuf = TcpGetSegmentSock (Tcb, Seq, Len); > > - } > > - > > - ASSERT (TcpVerifySegment (Nbuf) != 0); > > - return Nbuf; > > -} > > - > > - > > -/** > > - Retransmit the segment from sequence Seq. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment to be > retransmitted. > > - > > - @retval 0 Retransmission succeeded. > > - @retval -1 Error condition occurred. > > - > > -**/ > > -INTN > > -TcpRetransmit ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq > > - ) > > -{ > > - NET_BUF *Nbuf; > > - UINT32 Len; > > - > > - // > > - // Compute the maxium length of retransmission. It is > > - // limited by three factors: > > - // 1. Less than SndMss > > - // 2. must in the current send window > > - // 3. will not change the boundaries of queued segments. > > - // > > - > > - // > > - // Handle the Window Retraction if TCP window scale is enabled > according > > to RFC7323: > > - // On first retransmission, or if the sequence number is out of > > - // window by less than 2^Rcv.Wind.Shift, then do normal > > - // retransmission(s) without regard to the receiver window as long > > - // as the original segment was in window when it was sent. > > - // > > - if ((Tcb->SndWndScale != 0) && > > - (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax) || TCP_SEQ_BETWEEN (Tcb- > > >SndWl2 + Tcb->SndWnd, Seq, Tcb->SndWl2 + Tcb->SndWnd + (1 << Tcb- > > >SndWndScale)))) { > > - Len = TCP_SUB_SEQ (Tcb->SndNxt, Seq); > > - DEBUG ( > > - (EFI_D_WARN, > > - "TcpRetransmit: retransmission without regard to the receiver > window > > for TCB %p\n", > > - Tcb) > > - ); > > - > > - } else if (TCP_SEQ_GEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq)) { > > - Len = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq); > > - > > - } else { > > - DEBUG ( > > - (EFI_D_WARN, > > - "TcpRetransmit: retransmission cancelled because send window too > > small for TCB %p\n", > > - Tcb) > > - ); > > - > > - return 0; > > - } > > - > > - Len = MIN (Len, Tcb->SndMss); > > - > > - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); > > - if (Nbuf == NULL) { > > - return -1; > > - } > > - > > - ASSERT (TcpVerifySegment (Nbuf) != 0); > > - > > - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { > > - goto OnError; > > - } > > - > > - if (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax)) { > > - Tcb->RetxmitSeqMax = Seq; > > - } > > - > > - // > > - // The retransmitted buffer may be on the SndQue, > > - // trim TCP head because all the buffer on SndQue > > - // are headless. > > - // > > - ASSERT (Nbuf->Tcp != NULL); > > - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); > > - Nbuf->Tcp = NULL; > > - > > - NetbufFree (Nbuf); > > - return 0; > > - > > -OnError: > > - if (Nbuf != NULL) { > > - NetbufFree (Nbuf); > > - } > > - > > - return -1; > > -} > > - > > - > > -/** > > - Check whether to send data/SYN/FIN and piggy back an ACK. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Force Whether to ignore the sender's SWS avoidance > algorithm > > and send > > - out data by force. > > - > > - @return The number of bytes sent. > > - > > -**/ > > -INTN > > -TcpToSendData ( > > - IN OUT TCP_CB *Tcb, > > - IN INTN Force > > - ) > > -{ > > - UINT32 Len; > > - INTN Sent; > > - UINT8 Flag; > > - NET_BUF *Nbuf; > > - TCP_SEG *Seg; > > - TCP_SEQNO Seq; > > - TCP_SEQNO End; > > - > > - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL) && (Tcb->State != > > TCP_LISTEN)); > > - > > - Sent = 0; > > - > > - if ((Tcb->State == TCP_CLOSED) || > > - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT)) { > > - > > - return 0; > > - } > > - > > -SEND_AGAIN: > > - // > > - // compute how much data can be sent > > - // > > - Len = TcpDataToSend (Tcb, Force); > > - Seq = Tcb->SndNxt; > > - > > - ASSERT ((Tcb->State) < (ARRAY_SIZE (mTcpOutFlag))); > > - Flag = mTcpOutFlag[Tcb->State]; > > - > > - if ((Flag & TCP_FLG_SYN) != 0) { > > - > > - Seq = Tcb->Iss; > > - Len = 0; > > - } > > - > > - // > > - // only send a segment without data if SYN or > > - // FIN is set. > > - // > > - if ((Len == 0) && > > - ((Flag & (TCP_FLG_SYN | TCP_FLG_FIN)) == 0)) { > > - return Sent; > > - } > > - > > - Nbuf = TcpGetSegment (Tcb, Seq, Len); > > - > > - if (Nbuf == NULL) { > > - DEBUG ( > > - (EFI_D_ERROR, > > - "TcpToSendData: failed to get a segment for TCB %p\n", > > - Tcb) > > - ); > > - > > - goto OnError; > > - } > > - > > - Seg = TCPSEG_NETBUF (Nbuf); > > - > > - // > > - // Set the TcpSeg in Nbuf. > > - // > > - Len = Nbuf->TotalSize; > > - End = Seq + Len; > > - if (TCP_FLG_ON (Flag, TCP_FLG_SYN)) { > > - End++; > > - } > > - > > - if ((Flag & TCP_FLG_FIN) != 0) { > > - // > > - // Send FIN if all data is sent, and FIN is > > - // in the window > > - // > > - if ((TcpGetMaxSndNxt (Tcb) == Tcb->SndNxt) && > > - (GET_SND_DATASIZE (Tcb->Sk) == 0) && > > - TCP_SEQ_LT (End + 1, Tcb->SndWnd + Tcb->SndWl2)) { > > - > > - DEBUG ( > > - (EFI_D_NET, > > - "TcpToSendData: send FIN " > > - "to peer for TCB %p in state %s\n", > > - Tcb, > > - mTcpStateName[Tcb->State]) > > - ); > > - > > - End++; > > - } else { > > - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); > > - } > > - } > > - > > - Seg->Seq = Seq; > > - Seg->End = End; > > - Seg->Flag = Flag; > > - > > - ASSERT (TcpVerifySegment (Nbuf) != 0); > > - ASSERT (TcpCheckSndQue (&Tcb->SndQue) != 0); > > - > > - // > > - // don't send an empty segment here. > > - // > > - if (Seg->End == Seg->Seq) { > > - DEBUG ((EFI_D_WARN, "TcpToSendData: created a empty" > > - " segment for TCB %p, free it now\n", Tcb)); > > - > > - NetbufFree (Nbuf); > > - return Sent; > > - } > > - > > - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { > > - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); > > - Nbuf->Tcp = NULL; > > - > > - if ((Flag & TCP_FLG_FIN) != 0) { > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); > > - } > > - > > - goto OnError; > > - } > > - > > - Sent += TCP_SUB_SEQ (End, Seq); > > - > > - // > > - // All the buffer in the SndQue is headless > > - // > > - ASSERT (Nbuf->Tcp != NULL); > > - > > - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); > > - Nbuf->Tcp = NULL; > > - > > - NetbufFree (Nbuf); > > - > > - // > > - // update status in TCB > > - // > > - Tcb->DelayedAck = 0; > > - > > - if ((Flag & TCP_FLG_FIN) != 0) { > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); > > - } > > - > > - if (TCP_SEQ_GT (End, Tcb->SndNxt)) { > > - Tcb->SndNxt = End; > > - } > > - > > - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { > > - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); > > - } > > - > > - // > > - // Enable RTT measurement only if not in retransmit. > > - // Karn's algorithm reqires not to update RTT when in loss. > > - // > > - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && > > - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > > - > > - DEBUG ((EFI_D_NET, "TcpToSendData: set RTT measure " > > - "sequence %d for TCB %p\n", Seq, Tcb)); > > - > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > > - Tcb->RttSeq = Seq; > > - Tcb->RttMeasure = 0; > > - } > > - > > - if (Len == Tcb->SndMss) { > > - goto SEND_AGAIN; > > - } > > - > > - return Sent; > > - > > -OnError: > > - if (Nbuf != NULL) { > > - NetbufFree (Nbuf); > > - } > > - > > - return Sent; > > -} > > - > > - > > -/** > > - Send an ACK immediately. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpSendAck ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - NET_BUF *Nbuf; > > - TCP_SEG *Seg; > > - > > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > > - > > - if (Nbuf == NULL) { > > - return; > > - } > > - > > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > > - > > - Seg = TCPSEG_NETBUF (Nbuf); > > - Seg->Seq = Tcb->SndNxt; > > - Seg->End = Tcb->SndNxt; > > - Seg->Flag = TCP_FLG_ACK; > > - > > - if (TcpTransmitSegment (Tcb, Nbuf) == 0) { > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); > > - Tcb->DelayedAck = 0; > > - } > > - > > - NetbufFree (Nbuf); > > -} > > - > > - > > -/** > > - Send a zero probe segment. It can be used by keepalive and zero > window > > probe. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @retval 0 The zero probe segment was sent out successfully. > > - @retval other Error condition occurred. > > - > > -**/ > > -INTN > > -TcpSendZeroProbe ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - NET_BUF *Nbuf; > > - TCP_SEG *Seg; > > - INTN Result; > > - > > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > > - > > - if (Nbuf == NULL) { > > - return -1; > > - } > > - > > - NetbufReserve (Nbuf, TCP_MAX_HEAD); > > - > > - // > > - // SndNxt-1 is out of window. The peer should respond > > - // with an ACK. > > - // > > - Seg = TCPSEG_NETBUF (Nbuf); > > - Seg->Seq = Tcb->SndNxt - 1; > > - Seg->End = Tcb->SndNxt - 1; > > - Seg->Flag = TCP_FLG_ACK; > > - > > - Result = TcpTransmitSegment (Tcb, Nbuf); > > - NetbufFree (Nbuf); > > - > > - return Result; > > -} > > - > > - > > -/** > > - Check whether to send an ACK or delayed ACK. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpToSendAck ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - UINT32 TcpNow; > > - > > - TcpNow = TcpRcvWinNow (Tcb); > > - // > > - // Generally, TCP should send a delayed ACK unless: > > - // 1. ACK at least every other FULL sized segment received, > > - // 2. Packets received out of order > > - // 3. Receiving window is open > > - // > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || > > - (Tcb->DelayedAck >= 1) || > > - (TcpNow > TcpRcvWinOld (Tcb))) { > > - TcpSendAck (Tcb); > > - return; > > - } > > - > > - DEBUG ((EFI_D_NET, "TcpToSendAck: scheduled a delayed" > > - " ACK for TCB %p\n", Tcb)); > > - > > - // > > - // schedule a delayed ACK > > - // > > - Tcb->DelayedAck++; > > -} > > - > > - > > -/** > > - Send a RESET segment in response to the segment received. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance, may be > NULL. > > - @param Head TCP header of the segment that triggers the reset. > > - @param Len Length of the segment that triggers the reset. > > - @param Local Local IP address. > > - @param Remote Remote peer's IP address. > > - > > - @retval 0 A reset is sent or no need to send it. > > - @retval -1 No reset is sent. > > - > > -**/ > > -INTN > > -TcpSendReset ( > > - IN TCP_CB *Tcb, > > - IN TCP_HEAD *Head, > > - IN INT32 Len, > > - IN UINT32 Local, > > - IN UINT32 Remote > > - ) > > -{ > > - NET_BUF *Nbuf; > > - TCP_HEAD *Nhead; > > - UINT16 HeadSum; > > - > > - // > > - // Don't respond to a Reset with reset > > - // > > - if ((Head->Flag & TCP_FLG_RST) != 0) { > > - return 0; > > - } > > - > > - Nbuf = NetbufAlloc (TCP_MAX_HEAD); > > - > > - if (Nbuf == NULL) { > > - return -1; > > - } > > - > > - Nhead = (TCP_HEAD *) NetbufAllocSpace ( > > - Nbuf, > > - sizeof (TCP_HEAD), > > - NET_BUF_TAIL > > - ); > > - > > - ASSERT (Nhead != NULL); > > - > > - Nbuf->Tcp = Nhead; > > - Nhead->Flag = TCP_FLG_RST; > > - > > - // > > - // Derive Seq/ACK from the segment if no TCB > > - // associated with it, otherwise from the Tcb > > - // > > - if (Tcb == NULL) { > > - > > - if (TCP_FLG_ON (Head->Flag, TCP_FLG_ACK)) { > > - Nhead->Seq = Head->Ack; > > - Nhead->Ack = 0; > > - } else { > > - Nhead->Seq = 0; > > - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); > > - Nhead->Ack = HTONL (NTOHL (Head->Seq) + Len); > > - } > > - } else { > > - > > - Nhead->Seq = HTONL (Tcb->SndNxt); > > - Nhead->Ack = HTONL (Tcb->RcvNxt); > > - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); > > - } > > - > > - Nhead->SrcPort = Head->DstPort; > > - Nhead->DstPort = Head->SrcPort; > > - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); > > - Nhead->Res = 0; > > - Nhead->Wnd = HTONS (0xFFFF); > > - Nhead->Checksum = 0; > > - Nhead->Urg = 0; > > - > > - HeadSum = NetPseudoHeadChecksum (Local, Remote, 6, 0); > > - Nhead->Checksum = TcpChecksum (Nbuf, HeadSum); > > - > > - TcpSendIpPacket (Tcb, Nbuf, Local, Remote); > > - > > - NetbufFree (Nbuf); > > - return 0; > > -} > > - > > - > > -/** > > - Verify that the segment is in good shape. > > - > > - @param Nbuf Buffer that contains the segment to be checked. > > - > > - @retval 0 The segment is broken. > > - @retval 1 The segment is in good shape. > > - > > -**/ > > -INTN > > -TcpVerifySegment ( > > - IN NET_BUF *Nbuf > > - ) > > -{ > > - TCP_HEAD *Head; > > - TCP_SEG *Seg; > > - UINT32 Len; > > - > > - if (Nbuf == NULL) { > > - return 1; > > - } > > - > > - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); > > - > > - Seg = TCPSEG_NETBUF (Nbuf); > > - Len = Nbuf->TotalSize; > > - Head = Nbuf->Tcp; > > - > > - if (Head != NULL) { > > - if (Head->Flag != Seg->Flag) { > > - return 0; > > - } > > - > > - Len -= (Head->HeadLen << 2); > > - } > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { > > - Len++; > > - } > > - > > - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { > > - Len++; > > - } > > - > > - if (Seg->Seq + Len != Seg->End) { > > - return 0; > > - } > > - > > - return 1; > > -} > > - > > - > > -/** > > - Verify that all the segments in SndQue are in good shape. > > - > > - @param Head Pointer to the head node of the SndQue. > > - > > - @retval 0 At least one segment is broken. > > - @retval 1 All segments in the specific queue are in good shape. > > - > > -**/ > > -INTN > > -TcpCheckSndQue ( > > - IN LIST_ENTRY *Head > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - NET_BUF *Nbuf; > > - TCP_SEQNO Seq; > > - > > - if (IsListEmpty (Head)) { > > - return 1; > > - } > > - // > > - // Initialize the Seq > > - // > > - Entry = Head->ForwardLink; > > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > > - Seq = TCPSEG_NETBUF (Nbuf)->Seq; > > - > > - NET_LIST_FOR_EACH (Entry, Head) { > > - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); > > - > > - if (TcpVerifySegment (Nbuf) == 0) { > > - return 0; > > - } > > - > > - // > > - // All the node in the SndQue should has: > > - // SEG.SEQ = LAST_SEG.END > > - // > > - if (Seq != TCPSEG_NETBUF (Nbuf)->Seq) { > > - return 0; > > - } > > - > > - Seq = TCPSEG_NETBUF (Nbuf)->End; > > - } > > - > > - return 1; > > -} > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > deleted file mode 100644 > > index 4cb0ee7b5e6f..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > +++ /dev/null > > @@ -1,584 +0,0 @@ > > -/** @file > > - TCP timer related functions. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "Tcp4Main.h" > > - > > -UINT32 mTcpTick = 1000; > > - > > -/** > > - Connect timeout handler. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpConnectTimeout ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Timeout handler for TCP retransmission timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpRexmitTimeout ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Timeout handler for window probe timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpProbeTimeout ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Timeout handler for keepalive timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpKeepaliveTimeout ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Timeout handler for FIN_WAIT_2 timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpFinwait2Timeout ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Timeout handler for 2MSL timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -Tcp2MSLTimeout ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = { > > - TcpConnectTimeout, > > - TcpRexmitTimeout, > > - TcpProbeTimeout, > > - TcpKeepaliveTimeout, > > - TcpFinwait2Timeout, > > - Tcp2MSLTimeout, > > -}; > > - > > -/** > > - Close the TCP connection. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpClose ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - NetbufFreeList (&Tcb->SndQue); > > - NetbufFreeList (&Tcb->RcvQue); > > - > > - TcpSetState (Tcb, TCP_CLOSED); > > -} > > - > > - > > -/** > > - Connect timeout handler. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpConnectTimeout ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - if (!TCP_CONNECTED (Tcb->State)) { > > - DEBUG ((EFI_D_ERROR, "TcpConnectTimeout: connection closed " > > - "because conenction timer timeout for TCB %p\n", Tcb)); > > - > > - if (EFI_ABORTED == Tcb->Sk->SockError) { > > - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); > > - } > > - > > - if (TCP_SYN_RCVD == Tcb->State) { > > - DEBUG ((EFI_D_WARN, "TcpConnectTimeout: send reset because " > > - "connection timer timeout for TCB %p\n", Tcb)); > > - > > - TcpResetConnection (Tcb); > > - > > - } > > - > > - TcpClose (Tcb); > > - } > > -} > > - > > - > > -/** > > - Timeout handler for TCP retransmission timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpRexmitTimeout ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - UINT32 FlightSize; > > - > > - DEBUG ((EFI_D_WARN, "TcpRexmitTimeout: transmission " > > - "timeout for TCB %p\n", Tcb)); > > - > > - // > > - // Set the congestion window. FlightSize is the > > - // amount of data that has been sent but not > > - // yet ACKed. > > - // > > - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); > > - Tcb->Ssthresh = MAX ((UINT32) (2 * Tcb->SndMss), FlightSize / 2); > > - > > - Tcb->CWnd = Tcb->SndMss; > > - Tcb->LossRecover = Tcb->SndNxt; > > - > > - Tcb->LossTimes++; > > - if ((Tcb->LossTimes > Tcb->MaxRexmit) && > > - !TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_CONNECT)) { > > - > > - DEBUG ((EFI_D_ERROR, "TcpRexmitTimeout: connection closed " > > - "because too many timeouts for TCB %p\n", Tcb)); > > - > > - if (EFI_ABORTED == Tcb->Sk->SockError) { > > - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); > > - } > > - > > - TcpClose (Tcb); > > - return ; > > - } > > - > > - TcpBackoffRto (Tcb); > > - TcpRetransmit (Tcb, Tcb->SndUna); > > - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); > > - > > - Tcb->CongestState = TCP_CONGEST_LOSS; > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); > > -} > > - > > - > > -/** > > - Timeout handler for window probe timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpProbeTimeout ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - // > > - // This is the timer for sender's SWSA. RFC1122 requires > > - // a timer set for sender's SWSA, and suggest combine it > > - // with window probe timer. If data is sent, don't set > > - // the probe timer, since retransmit timer is on. > > - // > > - if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) { > > - > > - ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0); > > - Tcb->ProbeTimerOn = FALSE; > > - return ; > > - } > > - > > - TcpSendZeroProbe (Tcb); > > - TcpSetProbeTimer (Tcb); > > -} > > - > > - > > -/** > > - Timeout handler for keepalive timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpKeepaliveTimeout ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - Tcb->KeepAliveProbes++; > > - > > - // > > - // Too many Keep-alive probes, drop the connection > > - // > > - if (Tcb->KeepAliveProbes > Tcb->MaxKeepAlive) { > > - > > - if (EFI_ABORTED == Tcb->Sk->SockError) { > > - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); > > - } > > - > > - TcpClose (Tcb); > > - return ; > > - } > > - > > - TcpSendZeroProbe (Tcb); > > - TcpSetKeepaliveTimer (Tcb); > > -} > > - > > - > > -/** > > - Timeout handler for FIN_WAIT_2 timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpFinwait2Timeout ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - DEBUG ((EFI_D_WARN, "TcpFinwait2Timeout: connection closed " > > - "because FIN_WAIT2 timer timeouts for TCB %p\n", Tcb)); > > - > > - TcpClose (Tcb); > > -} > > - > > - > > -/** > > - Timeout handler for 2MSL timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -Tcp2MSLTimeout ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - DEBUG ((EFI_D_WARN, "Tcp2MSLTimeout: connection closed " > > - "because TIME_WAIT timer timeouts for TCB %p\n", Tcb)); > > - > > - TcpClose (Tcb); > > -} > > - > > - > > -/** > > - Update the timer status and the next expire time according to the > timers > > - to expire in a specific future time slot. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpUpdateTimer ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - UINT16 Index; > > - > > - // > > - // Don't use a too large value to init NextExpire > > - // since mTcpTick wraps around as sequence no does. > > - // > > - Tcb->NextExpire = 65535; > > - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); > > - > > - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { > > - > > - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && > > - TCP_TIME_LT (Tcb->Timer[Index], mTcpTick + Tcb->NextExpire)) { > > - > > - Tcb->NextExpire = TCP_SUB_TIME (Tcb->Timer[Index], mTcpTick); > > - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); > > - } > > - } > > -} > > - > > - > > -/** > > - Enable a TCP timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Timer The index of the timer to be enabled. > > - @param TimeOut The timeout value of this timer. > > - > > -**/ > > -VOID > > -TcpSetTimer ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT16 Timer, > > - IN UINT32 TimeOut > > - ) > > -{ > > - TCP_SET_TIMER (Tcb->EnabledTimer, Timer); > > - Tcb->Timer[Timer] = mTcpTick + TimeOut; > > - > > - TcpUpdateTimer (Tcb); > > -} > > - > > - > > -/** > > - Clear one TCP timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Timer The index of the timer to be cleared. > > - > > -**/ > > -VOID > > -TcpClearTimer ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT16 Timer > > - ) > > -{ > > - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Timer); > > - TcpUpdateTimer (Tcb); > > -} > > - > > - > > -/** > > - Clear all TCP timers. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpClearAllTimer ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - Tcb->EnabledTimer = 0; > > - TcpUpdateTimer (Tcb); > > -} > > - > > - > > -/** > > - Enable the window prober timer and set the timeout value. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpSetProbeTimer ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - if (!Tcb->ProbeTimerOn) { > > - Tcb->ProbeTime = Tcb->Rto; > > - Tcb->ProbeTimerOn = TRUE; > > - > > - } else { > > - Tcb->ProbeTime <<= 1; > > - } > > - > > - if (Tcb->ProbeTime < TCP_RTO_MIN) { > > - > > - Tcb->ProbeTime = TCP_RTO_MIN; > > - } else if (Tcb->ProbeTime > TCP_RTO_MAX) { > > - > > - Tcb->ProbeTime = TCP_RTO_MAX; > > - } > > - > > - TcpSetTimer (Tcb, TCP_TIMER_PROBE, Tcb->ProbeTime); > > -} > > - > > - > > -/** > > - Enable the keepalive timer and set the timeout value. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpSetKeepaliveTimer ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE)) { > > - return ; > > - > > - } > > - > > - // > > - // Set the timer to KeepAliveIdle if either > > - // 1. the keepalive timer is off > > - // 2. The keepalive timer is on, but the idle > > - // is less than KeepAliveIdle, that means the > > - // connection is alive since our last probe. > > - // > > - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_KEEPALIVE) || > > - (Tcb->Idle < Tcb->KeepAliveIdle)) { > > - > > - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAliveIdle); > > - Tcb->KeepAliveProbes = 0; > > - > > - } else { > > - > > - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAlivePeriod); > > - } > > -} > > - > > - > > -/** > > - Backoff the RTO. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpBackoffRto ( > > - IN OUT TCP_CB *Tcb > > - ) > > -{ > > - // > > - // Fold the RTT estimate if too many times, the estimate > > - // may be wrong, fold it. So the next time a valid > > - // measurement is sampled, we can start fresh. > > - // > > - if ((Tcb->LossTimes >= TCP_FOLD_RTT) && (Tcb->SRtt != 0)) { > > - Tcb->RttVar += Tcb->SRtt >> 2; > > - Tcb->SRtt = 0; > > - } > > - > > - Tcb->Rto <<= 1; > > - > > - if (Tcb->Rto < TCP_RTO_MIN) { > > - > > - Tcb->Rto = TCP_RTO_MIN; > > - } else if (Tcb->Rto > TCP_RTO_MAX) { > > - > > - Tcb->Rto = TCP_RTO_MAX; > > - } > > -} > > - > > - > > -/** > > - Heart beat timer handler. > > - > > - @param Context Context of the timer event, ignored. > > - > > -**/ > > -VOID > > -EFIAPI > > -TcpTickingDpc ( > > - IN VOID *Context > > - ) > > -{ > > - LIST_ENTRY *Entry; > > - LIST_ENTRY *Next; > > - TCP_CB *Tcb; > > - INT16 Index; > > - > > - mTcpTick++; > > - mTcpGlobalIss += 100; > > - > > - // > > - // Don't use LIST_FOR_EACH, which isn't delete safe. > > - // > > - for (Entry = mTcpRunQue.ForwardLink; Entry != &mTcpRunQue; Entry = > > Next) { > > - > > - Next = Entry->ForwardLink; > > - > > - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); > > - > > - if (Tcb->State == TCP_CLOSED) { > > - continue; > > - } > > - // > > - // The connection is doing RTT measurement. > > - // > > - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { > > - Tcb->RttMeasure++; > > - } > > - > > - Tcb->Idle++; > > - > > - if (Tcb->DelayedAck != 0) { > > - TcpSendAck (Tcb); > > - } > > - > > - // > > - // No timer is active or no timer expired > > - // > > - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON) || > > - ((--Tcb->NextExpire) > 0)) { > > - > > - continue; > > - } > > - > > - // > > - // Call the timeout handler for each expired timer. > > - // > > - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { > > - > > - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && > > - TCP_TIME_LEQ (Tcb->Timer[Index], mTcpTick)) { > > - // > > - // disable the timer before calling the handler > > - // in case the handler enables it again. > > - // > > - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Index); > > - mTcpTimerHandler[Index](Tcb); > > - > > - // > > - // The Tcb may have been deleted by the timer, or > > - // no other timer is set. > > - // > > - if ((Next->BackLink != Entry) || > > - (Tcb->EnabledTimer == 0)) { > > - break; > > - } > > - } > > - } > > - > > - // > > - // If the Tcb still exist or some timer is set, update the timer > > - // > > - if (Index == TCP_TIMER_NUMBER) { > > - TcpUpdateTimer (Tcb); > > - } > > - } > > -} > > - > > -/** > > - Heart beat timer handler, queues the DPC at TPL_CALLBACK. > > - > > - @param Event Timer event signaled, ignored. > > - @param Context Context of the timer event, ignored. > > - > > -**/ > > -VOID > > -EFIAPI > > -TcpTicking ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ) > > -{ > > - QueueDpc (TPL_CALLBACK, TcpTickingDpc, Context); > > -} > > - > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > > deleted file mode 100644 > > index a085ef61f341..000000000000 > > --- > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > > +++ /dev/null > > @@ -1,365 +0,0 @@ > > -/** @file > > - > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "PxeBcImpl.h" > > - > > -// > > -// EFI Component Name Functions > > -// > > -/** > > - Retrieves a Unicode string that is the user readable name of the > driver. > > - > > - This function retrieves the user readable name of a driver in the > form of a > > - Unicode string. If the driver specified by This has a user readable > name in > > - the language specified by Language, then a pointer to the driver name > is > > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > > specified > > - by This does not support the language specified by Language, > > - then EFI_UNSUPPORTED is returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified > > - in RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] DriverName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - driver specified by This in the > language > > - specified by Language. > > - > > - @retval EFI_SUCCESS The Unicode string for the Driver > specified by > > - This and the language specified by > Language was > > - returned in DriverName. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcComponentNameGetDriverName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > > - IN CHAR8 *Language, > > - OUT CHAR16 **DriverName > > - ); > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > controller > > - that is being managed by a driver. > > - > > - This function retrieves the user readable name of the controller > specified > > by > > - ControllerHandle and ChildHandle in the form of a Unicode string. If > the > > - driver specified by This has a user readable name in the language > specified > > by > > - Language, then a pointer to the controller name is returned in > > ControllerName, > > - and EFI_SUCCESS is returned. If the driver specified by This is not > currently > > - managing the controller specified by ControllerHandle and ChildHandle, > > - then EFI_UNSUPPORTED is returned. If the driver specified by This > does > > not > > - support the language specified by Language, then EFI_UNSUPPORTED is > > returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] ControllerHandle The handle of a controller that the > driver > > - specified by This is managing. This > handle > > - specifies the controller whose name is > to be > > - returned. > > - > > - @param[in] ChildHandle The handle of the child controller to > retrieve > > - the name of. This is an optional > parameter that > > - may be NULL. It will be NULL for > device > > - drivers. It will also be NULL for a > bus drivers > > - that wish to retrieve the name of the > bus > > - controller. It will not be NULL for a > bus > > - driver that wishes to retrieve the name > of a > > - child controller. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified in > > - RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] ControllerName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - controller specified by > ControllerHandle and > > - ChildHandle in the language specified > by > > - Language from the point of view of the > driver > > - specified by This. > > - > > - @retval EFI_SUCCESS The Unicode string for the user > readable name > > in > > - the language specified by Language for > the > > - driver specified by This was returned > in > > - DriverName. > > - > > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > > valid > > - EFI_HANDLE. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This is not > currently > > - managing the controller specified by > > - ControllerHandle and ChildHandle. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcComponentNameGetControllerName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE ChildHandle OPTIONAL, > > - IN CHAR8 *Language, > > - OUT CHAR16 **ControllerName > > - ); > > - > > -// > > -// EFI Component Name Protocol > > -// > > -GLOBAL_REMOVE_IF_UNREFERENCED > > EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName = { > > - PxeBcComponentNameGetDriverName, > > - PxeBcComponentNameGetControllerName, > > - "eng" > > -}; > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED > > EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2 = { > > - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) > > PxeBcComponentNameGetDriverName, > > - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) > > PxeBcComponentNameGetControllerName, > > - "en" > > -}; > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > > mPxeBcDriverNameTable[] = { > > - { > > - "eng;en", > > - L"UEFI PXE Base Code Driver" > > - }, > > - { > > - NULL, > > - NULL > > - } > > -}; > > - > > -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE > > mPxeBcControllerNameTable[] = { > > - { > > - "eng;en", > > - L"PXE Controller" > > - }, > > - { > > - NULL, > > - NULL > > - } > > -}; > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > driver. > > - > > - This function retrieves the user readable name of a driver in the > form of a > > - Unicode string. If the driver specified by This has a user readable > name in > > - the language specified by Language, then a pointer to the driver name > is > > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > > specified > > - by This does not support the language specified by Language, > > - then EFI_UNSUPPORTED is returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified > > - in RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] DriverName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - driver specified by This in the > language > > - specified by Language. > > - > > - @retval EFI_SUCCESS The Unicode string for the Driver > specified by > > - This and the language specified by > Language was > > - returned in DriverName. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcComponentNameGetDriverName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > > - IN CHAR8 *Language, > > - OUT CHAR16 **DriverName > > - ) > > -{ > > - return LookupUnicodeString2 ( > > - Language, > > - This->SupportedLanguages, > > - mPxeBcDriverNameTable, > > - DriverName, > > - (BOOLEAN)(This == &gPxeBcComponentName) > > - ); > > -} > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > controller > > - that is being managed by a driver. > > - > > - This function retrieves the user readable name of the controller > specified > > by > > - ControllerHandle and ChildHandle in the form of a Unicode string. If > the > > - driver specified by This has a user readable name in the language > specified > > by > > - Language, then a pointer to the controller name is returned in > > ControllerName, > > - and EFI_SUCCESS is returned. If the driver specified by This is not > currently > > - managing the controller specified by ControllerHandle and ChildHandle, > > - then EFI_UNSUPPORTED is returned. If the driver specified by This > does > > not > > - support the language specified by Language, then EFI_UNSUPPORTED is > > returned. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME2_PROTOCOL or > > - EFI_COMPONENT_NAME_PROTOCOL instance. > > - > > - @param[in] ControllerHandle The handle of a controller that the > driver > > - specified by This is managing. This > handle > > - specifies the controller whose name is > to be > > - returned. > > - > > - @param[in] ChildHandle The handle of the child controller to > retrieve > > - the name of. This is an optional > parameter that > > - may be NULL. It will be NULL for > device > > - drivers. It will also be NULL for a > bus drivers > > - that wish to retrieve the name of the > bus > > - controller. It will not be NULL for a > bus > > - driver that wishes to retrieve the name > of a > > - child controller. > > - > > - @param[in] Language A pointer to a Null-terminated ASCII > string > > - array indicating the language. This is > the > > - language of the driver name that the > caller is > > - requesting, and it must match one of > the > > - languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up > > - to the driver writer. Language is > specified in > > - RFC 4646 or ISO 639-2 language code > format. > > - > > - @param[out] ControllerName A pointer to the Unicode string to > return. > > - This Unicode string is the name of the > > - controller specified by > ControllerHandle and > > - ChildHandle in the language specified > by > > - Language from the point of view of the > driver > > - specified by This. > > - > > - @retval EFI_SUCCESS The Unicode string for the user > readable name > > in > > - the language specified by Language for > the > > - driver specified by This was returned > in > > - DriverName. > > - > > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > > valid > > - EFI_HANDLE. > > - > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - > > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This is not > currently > > - managing the controller specified by > > - ControllerHandle and ChildHandle. > > - > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support > > - the language specified by Language. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcComponentNameGetControllerName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL * This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE ChildHandle OPTIONAL, > > - IN CHAR8 *Language, > > - OUT CHAR16 **ControllerName > > - ) > > -{ > > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > > - EFI_HANDLE NicHandle; > > - EFI_STATUS Status; > > - > > - if (ControllerHandle == NULL || ChildHandle != NULL) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiArpProtocolGuid); > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiDhcp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiIp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiUdp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiMtftp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - return EFI_UNSUPPORTED; > > - } > > - } > > - } > > - } > > - } > > - > > - Status = gBS->OpenProtocol ( > > - NicHandle, > > - &gEfiPxeBaseCodeProtocolGuid, > > - (VOID **) &PxeBc, > > - NULL, > > - NULL, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - return LookupUnicodeString2 ( > > - Language, > > - This->SupportedLanguages, > > - mPxeBcControllerNameTable, > > - ControllerName, > > - (BOOLEAN)(This == &gPxeBcComponentName) > > - ); > > -} > > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > deleted file mode 100644 > > index f7b975f2997f..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > +++ /dev/null > > @@ -1,1999 +0,0 @@ > > -/** @file > > - Support for PxeBc dhcp functions. > > - > > -Copyright (c) 2013, Red Hat, Inc. > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "PxeBcImpl.h" > > - > > -// > > -// This is a map from the interested DHCP4 option tags' index to the > tag > > value. > > -// > > -UINT8 mInterestedDhcp4Tags[PXEBC_DHCP4_TAG_INDEX_MAX] = { > > - DHCP4_TAG_BOOTFILE_LEN, > > - DHCP4_TAG_VENDOR, > > - DHCP4_TAG_OVERLOAD, > > - DHCP4_TAG_MSG_TYPE, > > - DHCP4_TAG_SERVER_ID, > > - DHCP4_TAG_VENDOR_CLASS_ID, > > - DHCP4_TAG_BOOTFILE > > -}; > > - > > - > > -/** > > - This function initialize the DHCP4 message instance. > > - > > - This function will pad each item of dhcp4 message packet. > > - > > - @param Seed Pointer to the message instance of the DHCP4 packet. > > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > > - > > -**/ > > -VOID > > -PxeBcInitSeedPacket ( > > - IN EFI_DHCP4_PACKET *Seed, > > - IN EFI_UDP4_PROTOCOL *Udp4 > > - ) > > -{ > > - EFI_SIMPLE_NETWORK_MODE Mode; > > - EFI_DHCP4_HEADER *Header; > > - > > - Udp4->GetModeData (Udp4, NULL, NULL, NULL, &Mode); > > - > > - Seed->Size = sizeof (EFI_DHCP4_PACKET); > > - Seed->Length = sizeof (Seed->Dhcp4); > > - > > - Header = &Seed->Dhcp4.Header; > > - > > - ZeroMem (Header, sizeof (EFI_DHCP4_HEADER)); > > - Header->OpCode = PXEBC_DHCP4_OPCODE_REQUEST; > > - Header->HwType = Mode.IfType; > > - Header->HwAddrLen = (UINT8) Mode.HwAddressSize; > > - CopyMem (Header->ClientHwAddr, &Mode.CurrentAddress, Header- > > >HwAddrLen); > > - > > - Seed->Dhcp4.Magik = PXEBC_DHCP4_MAGIC; > > - Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP; > > -} > > - > > - > > -/** > > - Copy the DCHP4 packet from srouce to destination. > > - > > - @param[in] Dst Pointer to the cache buffer for DHCPv4 > packet. > > - @param[in] Src Pointer to the DHCPv4 packet to be cached. > > - > > - @retval EFI_SUCCESS Packet is copied. > > - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough > to > > hold the packet. > > - > > -**/ > > -EFI_STATUS > > -PxeBcCopyEfiDhcp4Packet ( > > - IN EFI_DHCP4_PACKET *Dst, > > - IN EFI_DHCP4_PACKET *Src > > - ) > > -{ > > - if (Dst->Size < Src->Length) { > > - return EFI_BUFFER_TOO_SMALL; > > - } > > - > > - CopyMem (&Dst->Dhcp4, &Src->Dhcp4, Src->Length); > > - Dst->Length = Src->Length; > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Copy the dhcp4 packet to the PxeBc private data and parse the dhcp4 > > packet. > > - > > - @param Private Pointer to PxeBc private data. > > - @param OfferIndex Index of cached packets as complements of pxe > > mode data, > > - the index is maximum offer number. > > - > > - @retval EFI_SUCCESS Cache and parse the packet > successfully. > > - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough > to > > hold the packet. > > - > > -**/ > > -EFI_STATUS > > -PxeBcCopyProxyOffer ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN UINT32 OfferIndex > > - ) > > -{ > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_DHCP4_PACKET *Offer; > > - EFI_STATUS Status; > > - > > - ASSERT (OfferIndex < Private->NumOffers); > > - ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM); > > - > > - Mode = Private->PxeBc.Mode; > > - Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer; > > - > > - Status = PxeBcCopyEfiDhcp4Packet (&Private->ProxyOffer.Packet.Offer, > > Offer); > > - if (EFI_ERROR(Status)) { > > - return Status; > > - } > > - CopyMem (&Mode->ProxyOffer, &Offer->Dhcp4, Offer->Length); > > - Mode->ProxyOfferReceived = TRUE; > > - > > - PxeBcParseCachedDhcpPacket (&Private->ProxyOffer); > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Parse the cached dhcp packet. > > - > > - @param CachedPacket Pointer to cached dhcp packet. > > - > > - @retval TRUE Succeed to parse and validation. > > - @retval FALSE Fail to parse or validation. > > - > > -**/ > > -BOOLEAN > > -PxeBcParseCachedDhcpPacket ( > > - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket > > - ) > > -{ > > - EFI_DHCP4_PACKET *Offer; > > - EFI_DHCP4_PACKET_OPTION **Options; > > - EFI_DHCP4_PACKET_OPTION *Option; > > - UINT8 OfferType; > > - UINTN Index; > > - UINT8 *Ptr8; > > - > > - CachedPacket->IsPxeOffer = FALSE; > > - ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket- > > >Dhcp4Option)); > > - ZeroMem (&CachedPacket->PxeVendorOption, sizeof (CachedPacket- > > >PxeVendorOption)); > > - > > - Offer = &CachedPacket->Packet.Offer; > > - Options = CachedPacket->Dhcp4Option; > > - > > - // > > - // Parse interested dhcp options and store their pointers in > CachedPacket- > > >Dhcp4Option. > > - // First, try to parse DHCPv4 options from the DHCP optional > parameters > > field. > > - // > > - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { > > - Options[Index] = PxeBcParseExtendOptions ( > > - Offer->Dhcp4.Option, > > - GET_OPTION_BUFFER_LEN (Offer), > > - mInterestedDhcp4Tags[Index] > > - ); > > - } > > - // > > - // Second, Check if bootfilename and serverhostname is overloaded to > > carry DHCP options refers to rfc-2132. > > - // If yes, try to parse options from the BootFileName field, then > > ServerName field. > > - // > > - Option = Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]; > > - if (Option != NULL) { > > - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) != 0) { > > - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { > > - if (Options[Index] == NULL) { > > - Options[Index] = PxeBcParseExtendOptions ( > > - (UINT8 *) Offer->Dhcp4.Header.BootFileName, > > - sizeof (Offer->Dhcp4.Header.BootFileName), > > - mInterestedDhcp4Tags[Index] > > - ); > > - } > > - } > > - } > > - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_SERVER_NAME) != 0) { > > - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { > > - if (Options[Index] == NULL) { > > - Options[Index] = PxeBcParseExtendOptions ( > > - (UINT8 *) Offer->Dhcp4.Header.ServerName, > > - sizeof (Offer->Dhcp4.Header.ServerName), > > - mInterestedDhcp4Tags[Index] > > - ); > > - } > > - } > > - } > > - } > > - > > - // > > - // Check whether is an offer with PXEClient or not. > > - // > > - Option = Options[PXEBC_DHCP4_TAG_INDEX_CLASS_ID]; > > - if ((Option != NULL) && (Option->Length >= 9) && > > - (CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 9) == 0)) { > > - > > - CachedPacket->IsPxeOffer = TRUE; > > - } > > - > > - // > > - // Parse pxe vendor options and store their content/pointers in > > CachedPacket->PxeVendorOption. > > - // > > - Option = Options[PXEBC_DHCP4_TAG_INDEX_VENDOR]; > > - if (CachedPacket->IsPxeOffer && (Option != NULL)) { > > - > > - if (!PxeBcParseVendorOptions (Option, &CachedPacket- > > >PxeVendorOption)) { > > - return FALSE; > > - } > > - } > > - > > - > > - // > > - // Parse PXE boot file name: > > - // According to PXE spec, boot file name should be read from DHCP > option > > 67 (bootfile name) if present. > > - // Otherwise, read from boot file field in DHCP header. > > - // > > - if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { > > - // > > - // RFC 2132, Section 9.5 does not strictly state Bootfile name > (option 67) is > > null > > - // terminated string. So force to append null terminated character > at the > > end of string. > > - // > > - Ptr8 = (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]- > > >Data[0]; > > - Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length; > > - if (*(Ptr8 - 1) != '\0') { > > - *Ptr8 = '\0'; > > - } > > - } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) { > > - // > > - // If the bootfile is not present and bootfilename is present in > dhcp packet, > > just parse it. > > - // And do not count dhcp option header, or else will destroy the > > serverhostname. > > - // > > - // Make sure "BootFileName" is not overloaded. > > - // > > - if (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD] == NULL || > > - (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]->Data[0] & > > PXEBC_DHCP4_OVERLOAD_FILE) == 0) { > > - Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] = > > (EFI_DHCP4_PACKET_OPTION *) (&Offer->Dhcp4.Header.BootFileName[0] - > > - OFFSET_OF > (EFI_DHCP4_PACKET_OPTION, Data[0])); > > - } > > - } > > - > > - // > > - // Determine offer type of the dhcp packet. > > - // > > - Option = Options[PXEBC_DHCP4_TAG_INDEX_MSG_TYPE]; > > - if ((Option == NULL) || (Option->Data[0] == 0)) { > > - // > > - // It's a bootp offer > > - // > > - Option = CachedPacket- > > >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]; > > - if (Option == NULL) { > > - // > > - // bootp offer without bootfilename, discard it. > > - // > > - return FALSE; > > - } > > - > > - OfferType = DHCP4_PACKET_TYPE_BOOTP; > > - > > - } else { > > - > > - if (IS_VALID_DISCOVER_VENDOR_OPTION (CachedPacket- > > >PxeVendorOption.BitMap)) { > > - // > > - // It's a pxe10 offer with PXEClient and discover vendor option. > > - // > > - OfferType = DHCP4_PACKET_TYPE_PXE10; > > - } else if (IS_VALID_MTFTP_VENDOR_OPTION (CachedPacket- > > >PxeVendorOption.BitMap)) { > > - // > > - // It's a wfm11a offer with PXEClient and mtftp vendor option, > and > > - // return false since mtftp not supported currently. > > - // > > - return FALSE; > > - } else { > > - // > > - // If the binl offer with only PXEClient. > > - // > > - OfferType = (UINT8) ((CachedPacket->IsPxeOffer) ? > > DHCP4_PACKET_TYPE_BINL : DHCP4_PACKET_TYPE_DHCP_ONLY); > > - } > > - } > > - > > - CachedPacket->OfferType = OfferType; > > - > > - return TRUE; > > -} > > - > > - > > -/** > > - Offer dhcp service with a BINL dhcp offer. > > - > > - @param Private Pointer to PxeBc private data. > > - @param Index Index of cached packets as complements of pxe mode > > data, > > - the index is maximum offer number. > > - > > - @retval TRUE Offer the service successfully under priority BINL. > > - @retval FALSE Boot Service failed, parse cached dhcp packet > failed or this > > - BINL ack cannot find options set or bootfile name > specified. > > - > > -**/ > > -BOOLEAN > > -PxeBcTryBinl ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN UINT32 Index > > - ) > > -{ > > - EFI_DHCP4_PACKET *Offer; > > - EFI_IP_ADDRESS ServerIp; > > - EFI_STATUS Status; > > - PXEBC_CACHED_DHCP4_PACKET *CachedPacket; > > - EFI_DHCP4_PACKET *Reply; > > - > > - ASSERT (Index < PXEBC_MAX_OFFER_NUM); > > - ASSERT (Private->Dhcp4Offers[Index].OfferType == > > DHCP4_PACKET_TYPE_BINL); > > - > > - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; > > - > > - // > > - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use > option > > 54(server identifier) > > - // in DHCPOFFER packet. > > - // (It does not comply with PXE Spec, Ver2.1) > > - // > > - if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, > > &mZeroIp4Addr)) { > > - CopyMem ( > > - &ServerIp.Addr[0], > > - Private- > > >Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID] > > ->Data, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - } else { > > - CopyMem ( > > - &ServerIp.Addr[0], > > - &Offer->Dhcp4.Header.ServerAddr, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - } > > - if (ServerIp.Addr[0] == 0) { > > - return FALSE; > > - } > > - > > - CachedPacket = &Private->ProxyOffer; > > - Reply = &CachedPacket->Packet.Offer; > > - > > - Status = PxeBcDiscvBootService ( > > - Private, > > - 0, > > - NULL, > > - FALSE, > > - &ServerIp, > > - 0, > > - NULL, > > - FALSE, > > - Reply > > - ); > > - if (EFI_ERROR (Status)) { > > - return FALSE; > > - } > > - > > - if (!PxeBcParseCachedDhcpPacket (CachedPacket)) { > > - return FALSE; > > - } > > - > > - if ((CachedPacket->OfferType != DHCP4_PACKET_TYPE_PXE10) && > > - (CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] > > == NULL)) { > > - // > > - // This BINL ack doesn't have discovery options set or bootfile > name > > - // specified. > > - // > > - return FALSE; > > - } > > - > > - Private->PxeBc.Mode->ProxyOfferReceived = TRUE; > > - CopyMem (&Private->PxeBc.Mode->ProxyOffer, &Reply->Dhcp4, Reply- > > >Length); > > - > > - return TRUE; > > -} > > - > > - > > -/** > > - Offer dhcp service for each proxy with a BINL dhcp offer. > > - > > - @param Private Pointer to PxeBc private data > > - @param OfferIndex Pointer to the index of cached packets as > > complements of > > - pxe mode data, the index is maximum offer number. > > - > > - @return If there is no service needed offer return FALSE, otherwise > TRUE. > > - > > -**/ > > -BOOLEAN > > -PxeBcTryBinlProxy ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - OUT UINT32 *OfferIndex > > - ) > > -{ > > - UINT32 Index; > > - > > - for (Index = 0; Index < Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]; > > Index++) { > > - > > - *OfferIndex = Private->BinlIndex[Index]; > > - // > > - // Try this BINL proxy offer > > - // > > - if (PxeBcTryBinl (Private, *OfferIndex)) { > > - return TRUE; > > - } > > - } > > - > > - return FALSE; > > -} > > - > > - > > -/** > > - This function is to check the selected proxy offer (include BINL dhcp > offer > > and > > - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the > Pxe > > base code > > - mode structure. > > - > > - @param Private Pointer to PxeBc private data. > > - > > - @retval EFI_SUCCESS Operational successful. > > - @retval EFI_NO_RESPONSE Offer dhcp service failed. > > - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe > base > > code mode. > > - > > -**/ > > -EFI_STATUS > > -PxeBcCheckSelectedOffer ( > > - IN PXEBC_PRIVATE_DATA *Private > > - ) > > -{ > > - PXEBC_CACHED_DHCP4_PACKET *SelectedOffer; > > - EFI_DHCP4_PACKET_OPTION **Options; > > - UINT32 Index; > > - EFI_DHCP4_PACKET *Offer; > > - UINT32 ProxyOfferIndex; > > - EFI_STATUS Status; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_DHCP4_PACKET *Ack; > > - > > - ASSERT (Private->SelectedOffer != 0); > > - > > - Status = EFI_SUCCESS; > > - SelectedOffer = &Private->Dhcp4Offers[Private->SelectedOffer - 1]; > > - Options = SelectedOffer->Dhcp4Option; > > - > > - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BINL) { > > - // > > - // The addresses are acquired from a BINL dhcp offer, try BINL to > get > > - // the bootfile name > > - // > > - if (!PxeBcTryBinl (Private, Private->SelectedOffer - 1)) { > > - Status = EFI_NO_RESPONSE; > > - } > > - } else if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) > > { > > - // > > - // The selected offer to finish the D.O.R.A. is a DHCP only offer, > we need > > - // try proxy offers if there are some, othewise the bootfile name > must be > > - // set in this DHCP only offer. > > - // > > - if (Private->GotProxyOffer) { > > - // > > - // Get rid of the compiler warning. > > - // > > - ProxyOfferIndex = 0; > > - if (Private->SortOffers) { > > - // > > - // The offers are sorted before selecting, the proxy offer type > must be > > - // already determined. > > - // > > - ASSERT (Private->ProxyIndex[Private->ProxyOfferType] > 0); > > - > > - if (Private->ProxyOfferType == DHCP4_PACKET_TYPE_BINL) { > > - // > > - // We buffer all received BINL proxy offers, try them all one > by one > > - // > > - if (!PxeBcTryBinlProxy (Private, &ProxyOfferIndex)) { > > - Status = EFI_NO_RESPONSE; > > - } > > - } else { > > - // > > - // For other types, only one proxy offer is buffered. > > - // > > - ProxyOfferIndex = Private->ProxyIndex[Private->ProxyOfferType] > - 1; > > - } > > - } else { > > - // > > - // The proxy offer type is not determined, choose proxy offer > in the > > - // received order. > > - // > > - Status = EFI_NO_RESPONSE; > > - > > - ASSERT (Private->NumOffers < PXEBC_MAX_OFFER_NUM); > > - for (Index = 0; Index < Private->NumOffers; Index++) { > > - > > - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; > > - if (!IS_PROXY_DHCP_OFFER (Offer)) { > > - // > > - // Skip non proxy dhcp offers. > > - // > > - continue; > > - } > > - > > - if (Private->Dhcp4Offers[Index].OfferType == > > DHCP4_PACKET_TYPE_BINL) { > > - // > > - // Try BINL > > - // > > - if (!PxeBcTryBinl (Private, Index)) { > > - // > > - // Failed, skip to the next offer > > - // > > - continue; > > - } > > - } > > - > > - Private->ProxyOfferType = Private- > >Dhcp4Offers[Index].OfferType; > > - ProxyOfferIndex = Index; > > - Status = EFI_SUCCESS; > > - break; > > - } > > - } > > - > > - if (!EFI_ERROR (Status) && (Private->ProxyOfferType != > > DHCP4_PACKET_TYPE_BINL)) { > > - // > > - // Copy the proxy offer to Mode and set the flag > > - // > > - Status = PxeBcCopyProxyOffer (Private, ProxyOfferIndex); > > - } > > - } else { > > - // > > - // No proxy offer is received, the bootfile name MUST be set. > > - // > > - ASSERT (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL); > > - } > > - } > > - > > - if (!EFI_ERROR (Status)) { > > - // > > - // Everything is OK, set the flag and copy the DHCP packets. > > - // > > - Mode = Private->PxeBc.Mode; > > - Offer = &SelectedOffer->Packet.Offer; > > - > > - // > > - // The discover packet is already copied, just set flag here. > > - // > > - Mode->DhcpDiscoverValid = TRUE; > > - > > - Ack = &Private->Dhcp4Ack.Packet.Ack; > > - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BOOTP) { > > - // > > - // Other type of ACK is already cached. Bootp is special that we > should > > - // use the bootp reply as the ACK and put it into the DHCP_ONLY > buffer. > > - // > > - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, > > Offer); > > - } > > - > > - PxeBcParseCachedDhcpPacket (&Private->Dhcp4Ack); > > - > > - Mode->DhcpAckReceived = TRUE; > > - > > - // > > - // Copy the dhcp ack. > > - // > > - CopyMem (&Mode->DhcpAck, &Ack->Dhcp4, Ack->Length); > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - Cache the Dhcp4 packet offer, Parse and validate each option of the > packet. > > - > > - @param Private Pointer to PxeBc private data. > > - @param RcvdOffer Pointer to the received Dhcp proxy offer packet. > > - > > - @retval EFI_SUCCESS Cache and parse the packet successfully. > > - @retval Others Operation failed. > > - > > -**/ > > -EFI_STATUS > > -PxeBcCacheDhcpOffer ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_DHCP4_PACKET *RcvdOffer > > - ) > > -{ > > - PXEBC_CACHED_DHCP4_PACKET *CachedOffer; > > - EFI_DHCP4_PACKET *Offer; > > - UINT8 OfferType; > > - EFI_STATUS Status; > > - > > - CachedOffer = &Private->Dhcp4Offers[Private->NumOffers]; > > - Offer = &CachedOffer->Packet.Offer; > > - > > - // > > - // Cache the orignal dhcp packet > > - // > > - Status = PxeBcCopyEfiDhcp4Packet (Offer, RcvdOffer); > > - if (EFI_ERROR(Status)) { > > - return Status; > > - } > > - > > - // > > - // Parse and validate the options (including dhcp option and vendor > option) > > - // > > - if (!PxeBcParseCachedDhcpPacket (CachedOffer)) { > > - return EFI_ABORTED; > > - } > > - > > - OfferType = CachedOffer->OfferType; > > - if (OfferType >= DHCP4_PACKET_TYPE_MAX) { > > - return EFI_ABORTED; > > - } > > - > > - if (OfferType == DHCP4_PACKET_TYPE_BOOTP) { > > - > > - if (Private->BootpIndex != 0) { > > - // > > - // Only cache the first bootp offer, discard others. > > - // > > - return EFI_ABORTED; > > - } else { > > - // > > - // Take as a dhcp only offer, but record index specifically. > > - // > > - Private->BootpIndex = Private->NumOffers + 1; > > - } > > - } else { > > - > > - if (IS_PROXY_DHCP_OFFER (Offer)) { > > - // > > - // It's a proxy dhcp offer with no your address, including pxe10, > wfm11a > > or binl offer. > > - // > > - Private->GotProxyOffer = TRUE; > > - > > - if (OfferType == DHCP4_PACKET_TYPE_BINL) { > > - // > > - // Cache all binl offers. > > - // > > - Private->BinlIndex[Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]] > = > > Private->NumOffers; > > - Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]++; > > - } else if (Private->ProxyIndex[OfferType] != 0) { > > - // > > - // Only cache the first pxe10/wfm11a offers each, discard the > others. > > - // > > - return EFI_ABORTED; > > - } else { > > - // > > - // Record index of the proxy dhcp offer with type other than > binl. > > - // > > - Private->ProxyIndex[OfferType] = Private->NumOffers + 1; > > - } > > - } else { > > - // > > - // It's a dhcp offer with your address. > > - // > > - ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM); > > - Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] = > > Private->NumOffers; > > - Private->ServerCount[OfferType]++; > > - } > > - } > > - > > - // > > - // Count the accepted offers. > > - // > > - Private->NumOffers++; > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Switch the Ip4 policy to static. > > - > > - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. > > - > > - @retval EFI_SUCCESS The policy is already configured to > static. > > - @retval Others Other error as indicated.. > > - > > -**/ > > -EFI_STATUS > > -PxeBcSetIp4Policy ( > > - IN PXEBC_PRIVATE_DATA *Private > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; > > - EFI_IP4_CONFIG2_POLICY Policy; > > - UINTN DataSize; > > - > > - Ip4Config2 = Private->Ip4Config2; > > - DataSize = sizeof (EFI_IP4_CONFIG2_POLICY); > > - Status = Ip4Config2->GetData ( > > - Ip4Config2, > > - Ip4Config2DataTypePolicy, > > - &DataSize, > > - &Policy > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - if (Policy != Ip4Config2PolicyStatic) { > > - Policy = Ip4Config2PolicyStatic; > > - Status= Ip4Config2->SetData ( > > - Ip4Config2, > > - Ip4Config2DataTypePolicy, > > - sizeof (EFI_IP4_CONFIG2_POLICY), > > - &Policy > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Select the specified proxy offer, such as BINL, DHCP_ONLY and so on. > > - If the proxy does not exist, try offers with bootfile. > > - > > - @param Private Pointer to PxeBc private data. > > - > > -**/ > > -VOID > > -PxeBcSelectOffer ( > > - IN PXEBC_PRIVATE_DATA *Private > > - ) > > -{ > > - UINT32 Index; > > - UINT32 OfferIndex; > > - EFI_DHCP4_PACKET *Offer; > > - > > - Private->SelectedOffer = 0; > > - > > - if (Private->SortOffers) { > > - // > > - // Select offer according to the priority > > - // > > - if (Private->ServerCount[DHCP4_PACKET_TYPE_PXE10] > 0) { > > - // > > - // DHCP with PXE10 > > - // > > - Private->SelectedOffer = Private- > > >OfferIndex[DHCP4_PACKET_TYPE_PXE10][0] + 1; > > - > > - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_WFM11A] > 0) { > > - // > > - // DHCP with WfM > > - // > > - Private->SelectedOffer = Private- > > >OfferIndex[DHCP4_PACKET_TYPE_WFM11A][0] + 1; > > - > > - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_PXE10] > 0) && > > - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) > > - ) { > > - // > > - // DHCP only and proxy DHCP with PXE10 > > - // > > - Private->SelectedOffer = Private- > > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; > > - Private->ProxyOfferType = DHCP4_PACKET_TYPE_PXE10; > > - > > - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_WFM11A] > 0) && > > - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) > > - ) { > > - // > > - // DHCP only and proxy DHCP with WfM > > - // > > - Private->SelectedOffer = Private- > > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; > > - Private->ProxyOfferType = DHCP4_PACKET_TYPE_WFM11A; > > - > > - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_BINL] > 0) { > > - // > > - // DHCP with BINL > > - // > > - Private->SelectedOffer = Private- > > >OfferIndex[DHCP4_PACKET_TYPE_BINL][0] + 1; > > - > > - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL] > 0) && > > - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) > > - ) { > > - // > > - // DHCP only and proxy DHCP with BINL > > - // > > - Private->SelectedOffer = Private- > > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; > > - Private->ProxyOfferType = DHCP4_PACKET_TYPE_BINL; > > - > > - } else { > > - // > > - // Try offers with bootfile > > - // > > - for (Index = 0; Index < Private- > > >ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY]; Index++) { > > - // > > - // Select the first DHCP only offer with bootfile > > - // > > - OfferIndex = Private- > > >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][Index]; > > - if (Private- > > >Dhcp4Offers[OfferIndex].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTF > > ILE] != NULL) { > > - Private->SelectedOffer = OfferIndex + 1; > > - break; > > - } > > - } > > - > > - if (Private->SelectedOffer == 0) { > > - // > > - // Select the Bootp reply with bootfile if any > > - // > > - Private->SelectedOffer = Private->BootpIndex; > > - } > > - } > > - } else { > > - // > > - // Try the offers in the received order. > > - // > > - for (Index = 0; Index < Private->NumOffers; Index++) { > > - > > - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; > > - > > - if (IS_PROXY_DHCP_OFFER (Offer)) { > > - // > > - // Skip proxy offers > > - // > > - continue; > > - } > > - > > - if ((Private->Dhcp4Offers[Index].OfferType == > > DHCP4_PACKET_TYPE_DHCP_ONLY) && > > - ((!Private->GotProxyOffer) && (Private- > > >Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] > > == NULL))) { > > - // > > - // DHCP only offer but no proxy offer received and no bootfile > option in > > this offer > > - // > > - continue; > > - } > > - > > - Private->SelectedOffer = Index + 1; > > - break; > > - } > > - } > > -} > > - > > - > > -/** > > - Callback routine. > > - > > - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 > > Protocol driver > > - to intercept events that occurred in the configuration process. This > > structure > > - provides advanced control of each state transition of the DHCP > process. > > The > > - returned status code determines the behavior of the EFI DHCPv4 > Protocol > > driver. > > - There are three possible returned values, which are described in the > > following > > - table. > > - > > - @param This Pointer to the EFI DHCPv4 Protocol > instance that is > > used to > > - configure this callback function. > > - @param Context Pointer to the context that is > initialized by > > - EFI_DHCP4_PROTOCOL.Configure(). > > - @param CurrentState The current operational state of the > EFI DHCPv4 > > Protocol > > - driver. > > - @param Dhcp4Event The event that occurs in the current > state, > > which usually means a > > - state transition. > > - @param Packet The DHCP packet that is going to be > sent or already > > received. > > - @param NewPacket The packet that is used to replace the > above > > Packet. > > - > > - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to > continue > > the DHCP process. > > - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. > The EFI > > DHCPv4 Protocol > > - driver will continue to wait for more > DHCPOFFER packets > > until the retry > > - timeout expires. > > - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to > abort > > the current process and > > - return to the Dhcp4Init or > Dhcp4InitReboot state. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDhcpCallBack ( > > - IN EFI_DHCP4_PROTOCOL * This, > > - IN VOID *Context, > > - IN EFI_DHCP4_STATE CurrentState, > > - IN EFI_DHCP4_EVENT Dhcp4Event, > > - IN EFI_DHCP4_PACKET * Packet OPTIONAL, > > - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; > > - EFI_DHCP4_PACKET_OPTION *MaxMsgSize; > > - UINT16 Value; > > - EFI_STATUS Status; > > - BOOLEAN Received; > > - EFI_DHCP4_HEADER *DhcpHeader; > > - > > - if ((Dhcp4Event != Dhcp4RcvdOffer) && > > - (Dhcp4Event != Dhcp4SelectOffer) && > > - (Dhcp4Event != Dhcp4SendDiscover) && > > - (Dhcp4Event != Dhcp4RcvdAck) && > > - (Dhcp4Event != Dhcp4SendRequest)) { > > - return EFI_SUCCESS; > > - } > > - > > - Private = (PXEBC_PRIVATE_DATA *) Context; > > - Mode = Private->PxeBc.Mode; > > - Callback = Private->PxeBcCallback; > > - > > - // > > - // Override the Maximum DHCP Message Size. > > - // > > - MaxMsgSize = PxeBcParseExtendOptions ( > > - Packet->Dhcp4.Option, > > - GET_OPTION_BUFFER_LEN (Packet), > > - DHCP4_TAG_MAXMSG > > - ); > > - if (MaxMsgSize != NULL) { > > - Value = HTONS (PXEBC_DHCP4_MAX_PACKET_SIZE); > > - CopyMem (MaxMsgSize->Data, &Value, sizeof (Value)); > > - } > > - > > - if ((Dhcp4Event != Dhcp4SelectOffer) && (Callback != NULL)) { > > - Received = (BOOLEAN) ((Dhcp4Event == Dhcp4RcvdOffer) || (Dhcp4Event > > == Dhcp4RcvdAck)); > > - Status = Callback->Callback ( > > - Callback, > > - Private->Function, > > - Received, > > - Packet->Length, > > - (EFI_PXE_BASE_CODE_PACKET *) &Packet->Dhcp4 > > - ); > > - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { > > - return EFI_ABORTED; > > - } > > - } > > - > > - Status = EFI_SUCCESS; > > - > > - switch (Dhcp4Event) { > > - > > - case Dhcp4SendDiscover: > > - case Dhcp4SendRequest: > > - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { > > - // > > - // If the to be sent packet exceeds the maximum length, abort the > DHCP > > process. > > - // > > - Status = EFI_ABORTED; > > - break; > > - } > > - > > - if (Mode->SendGUID) { > > - // > > - // send the system GUID instead of the MAC address as the > hardware > > address > > - // in the DHCP packet header. > > - // > > - DhcpHeader = &Packet->Dhcp4.Header; > > - > > - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader- > > >ClientHwAddr))) { > > - // > > - // GUID not yet set - send all 0xff's to show programable (via > SetVariable) > > - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, > > sizeof(EFI_GUID), 0xff); > > - // GUID not yet set - send all 0's to show not programable > > - // > > - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the > > smbios table!\n")); > > - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); > > - } > > - > > - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); > > - } > > - > > - if (Dhcp4Event == Dhcp4SendDiscover) { > > - // > > - // Cache the dhcp discover packet, of which some information will > be > > used later. > > - // > > - CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet- > > >Length); > > - } > > - > > - break; > > - > > - case Dhcp4RcvdOffer: > > - Status = EFI_NOT_READY; > > - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { > > - // > > - // Ignore the incoming Offers which exceed the maximum length. > > - // > > - break; > > - } > > - > > - if (Private->NumOffers < PXEBC_MAX_OFFER_NUM) { > > - // > > - // Cache the dhcp offers in Private->Dhcp4Offers[] > > - // If error happens, just ignore this packet and continue to wait > more > > offer. > > - // > > - PxeBcCacheDhcpOffer (Private, Packet); > > - } > > - > > - break; > > - > > - case Dhcp4SelectOffer: > > - // > > - // Select an offer, if succeeded, Private->SelectedOffer points to > > - // the index of the selected one. > > - // > > - PxeBcSelectOffer (Private); > > - > > - if (Private->SelectedOffer == 0) { > > - Status = EFI_ABORTED; > > - } else { > > - *NewPacket = &Private->Dhcp4Offers[Private->SelectedOffer - > > 1].Packet.Offer; > > - } > > - > > - break; > > - > > - case Dhcp4RcvdAck: > > - // > > - // Cache Ack > > - // > > - ASSERT (Private->SelectedOffer != 0); > > - > > - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, > > Packet); > > - if (EFI_ERROR (Status)) { > > - return EFI_ABORTED; > > - } > > - break; > > - > > - default: > > - break; > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - Initialize the DHCP options and build the option list. > > - > > - @param Private Pointer to PxeBc private data. > > - @param OptList Pointer to a DHCP option list. > > - > > - @param IsDhcpDiscover Discover dhcp option or not. > > - > > - @return The index item number of the option list. > > - > > -**/ > > -UINT32 > > -PxeBcBuildDhcpOptions ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_DHCP4_PACKET_OPTION **OptList, > > - IN BOOLEAN IsDhcpDiscover > > - ) > > -{ > > - UINT32 Index; > > - PXEBC_DHCP4_OPTION_ENTRY OptEnt; > > - UINT16 Value; > > - > > - Index = 0; > > - OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer; > > - > > - if (!IsDhcpDiscover) { > > - // > > - // Append message type. > > - // > > - OptList[Index]->OpCode = DHCP4_TAG_MSG_TYPE; > > - OptList[Index]->Length = 1; > > - OptEnt.Mesg = (PXEBC_DHCP4_OPTION_MESG *) > OptList[Index]- > > >Data; > > - OptEnt.Mesg->Type = PXEBC_DHCP4_MSG_TYPE_REQUEST; > > - Index++; > > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > > - > > - // > > - // Append max message size. > > - // > > - OptList[Index]->OpCode = DHCP4_TAG_MAXMSG; > > - OptList[Index]->Length = (UINT8) sizeof > > (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE); > > - OptEnt.MaxMesgSize = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *) > > OptList[Index]->Data; > > - Value = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE); > > - CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16)); > > - Index++; > > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > > - } > > - // > > - // Parameter request list option. > > - // > > - OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST; > > - OptList[Index]->Length = 35; > > - OptEnt.Para = (PXEBC_DHCP4_OPTION_PARA *) > OptList[Index]- > > >Data; > > - OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK; > > - OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET; > > - OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER; > > - OptEnt.Para->ParaList[3] = DHCP4_TAG_TIME_SERVER; > > - OptEnt.Para->ParaList[4] = DHCP4_TAG_NAME_SERVER; > > - OptEnt.Para->ParaList[5] = DHCP4_TAG_DNS_SERVER; > > - OptEnt.Para->ParaList[6] = DHCP4_TAG_HOSTNAME; > > - OptEnt.Para->ParaList[7] = DHCP4_TAG_BOOTFILE_LEN; > > - OptEnt.Para->ParaList[8] = DHCP4_TAG_DOMAINNAME; > > - OptEnt.Para->ParaList[9] = DHCP4_TAG_ROOTPATH; > > - OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH; > > - OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU; > > - OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL; > > - OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST; > > - OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN; > > - OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER; > > - OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER; > > - OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR; > > - OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP; > > - OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE; > > - OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID; > > - OptEnt.Para->ParaList[21] = DHCP4_TAG_T1; > > - OptEnt.Para->ParaList[22] = DHCP4_TAG_T2; > > - OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID; > > - OptEnt.Para->ParaList[24] = DHCP4_TAG_TFTP; > > - OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE; > > - OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID; > > - OptEnt.Para->ParaList[27] = 0x80; > > - OptEnt.Para->ParaList[28] = 0x81; > > - OptEnt.Para->ParaList[29] = 0x82; > > - OptEnt.Para->ParaList[30] = 0x83; > > - OptEnt.Para->ParaList[31] = 0x84; > > - OptEnt.Para->ParaList[32] = 0x85; > > - OptEnt.Para->ParaList[33] = 0x86; > > - OptEnt.Para->ParaList[34] = 0x87; > > - Index++; > > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > > - > > - // > > - // Append UUID/Guid-based client identifier option > > - // > > - OptList[Index]->OpCode = DHCP4_TAG_UUID; > > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID); > > - OptEnt.Uuid = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]- > > >Data; > > - OptEnt.Uuid->Type = 0; > > - Index++; > > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > > - > > - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) > > { > > - // > > - // GUID not yet set - send all 0xff's to show programable (via > SetVariable) > > - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, > > sizeof(EFI_GUID), 0xff); > > - // GUID not yet set - send all 0's to show not programable > > - // > > - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the > smbios > > table!\n")); > > - ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID)); > > - } > > - > > - // > > - // Append client network device interface option > > - // > > - OptList[Index]->OpCode = DHCP4_TAG_UNDI; > > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI); > > - OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]- > > >Data; > > - if (Private->Nii != NULL) { > > - OptEnt.Undi->Type = Private->Nii->Type; > > - OptEnt.Undi->MajorVer = Private->Nii->MajorVer; > > - OptEnt.Undi->MinorVer = Private->Nii->MinorVer; > > - } else { > > - OptEnt.Undi->Type = DEFAULT_UNDI_TYPE; > > - OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR; > > - OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR; > > - } > > - > > - Index++; > > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > > - > > - // > > - // Append client system architecture option > > - // > > - OptList[Index]->OpCode = DHCP4_TAG_ARCH; > > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH); > > - OptEnt.Arch = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]- > > >Data; > > - Value = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE); > > - CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16)); > > - Index++; > > - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); > > - > > - // > > - // Append client system architecture option > > - // > > - OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID; > > - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID); > > - OptEnt.Clid = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]- > >Data; > > - CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof > > (PXEBC_DHCP4_OPTION_CLID)); > > - CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid- > > >ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType)); > > - > > - if (Private->Nii != NULL) { > > - // > > - // If NII protocol exists, update DHCP option data > > - // > > - CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof > > (OptEnt.Clid->InterfaceName)); > > - CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof > > (OptEnt.Clid->UndiMajor)); > > - CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof > > (OptEnt.Clid->UndiMinor)); > > - } > > - > > - Index++; > > - > > - return Index; > > -} > > - > > - > > -/** > > - Discover the boot of service and initialize the vendor option if > exists. > > - > > - @param Private Pointer to PxeBc private data. > > - @param Type PxeBc option boot item type > > - @param Layer PxeBc option boot item layer > > - @param UseBis Use BIS or not > > - @param DestIp Ip address for server > > - @param IpCount The total count of the server ip > address > > - @param SrvList Server list > > - @param IsDiscv Discover the vendor or not > > - @param Reply The dhcp4 packet of Pxe reply > > - > > - @retval EFI_SUCCESS Operation succeeds. > > - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. > > - @retval EFI_NOT_FOUND There is no vendor option exists. > > - @retval EFI_TIMEOUT Send Pxe Discover time out. > > - > > -**/ > > -EFI_STATUS > > -PxeBcDiscvBootService ( > > - IN PXEBC_PRIVATE_DATA * Private, > > - IN UINT16 Type, > > - IN UINT16 *Layer, > > - IN BOOLEAN UseBis, > > - IN EFI_IP_ADDRESS * DestIp, > > - IN UINT16 IpCount, > > - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, > > - IN BOOLEAN IsDiscv, > > - OUT EFI_DHCP4_PACKET * Reply OPTIONAL > > - ) > > -{ > > - EFI_PXE_BASE_CODE_UDP_PORT Sport; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_DHCP4_PROTOCOL *Dhcp4; > > - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; > > - BOOLEAN IsBCast; > > - EFI_STATUS Status; > > - UINT16 RepIndex; > > - UINT16 SrvIndex; > > - UINT16 TryIndex; > > - EFI_DHCP4_LISTEN_POINT ListenPoint; > > - EFI_DHCP4_PACKET *Response; > > - EFI_DHCP4_PACKET_OPTION > > *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; > > - UINT32 OptCount; > > - EFI_DHCP4_PACKET_OPTION *PxeOpt; > > - PXEBC_OPTION_BOOT_ITEM *PxeBootItem; > > - UINT8 VendorOptLen; > > - EFI_DHCP4_HEADER *DhcpHeader; > > - UINT32 Xid; > > - > > - Mode = Private->PxeBc.Mode; > > - Dhcp4 = Private->Dhcp4; > > - Status = EFI_SUCCESS; > > - > > - ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN)); > > - > > - if (DestIp == NULL) { > > - Sport = PXEBC_DHCP4_S_PORT; > > - IsBCast = TRUE; > > - } else { > > - Sport = PXEBC_BS_DISCOVER_PORT; > > - IsBCast = FALSE; > > - } > > - > > - if (!UseBis && Layer != NULL) { > > - *Layer &= EFI_PXE_BASE_CODE_BOOT_LAYER_MASK; > > - } > > - > > - OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE); > > - > > - if (IsDiscv) { > > - ASSERT (Layer != NULL); > > - // > > - // Add vendor option of PXE_BOOT_ITEM > > - // > > - VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 > + > > sizeof (PXEBC_OPTION_BOOT_ITEM) + 1); > > - OptList[OptCount] = AllocatePool (VendorOptLen); > > - if (OptList[OptCount] == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - OptList[OptCount]->OpCode = DHCP4_TAG_VENDOR; > > - OptList[OptCount]->Length = (UINT8) (VendorOptLen - 2); > > - PxeOpt = (EFI_DHCP4_PACKET_OPTION *) > OptList[OptCount]- > > >Data; > > - PxeOpt->OpCode = PXEBC_VENDOR_TAG_BOOT_ITEM; > > - PxeOpt->Length = (UINT8) sizeof > (PXEBC_OPTION_BOOT_ITEM); > > - PxeBootItem = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt- > >Data; > > - PxeBootItem->Type = HTONS (Type); > > - PxeBootItem->Layer = HTONS (*Layer); > > - PxeOpt->Data[PxeOpt->Length] = DHCP4_TAG_EOP; > > - > > - OptCount++; > > - } > > - > > - Status = Dhcp4->Build (Dhcp4, &Private->SeedPacket, 0, NULL, OptCount, > > OptList, &Token.Packet); > > - > > - if (IsDiscv) { > > - FreePool (OptList[OptCount - 1]); > > - } > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - DhcpHeader = &Token.Packet->Dhcp4.Header; > > - if (Mode->SendGUID) { > > - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader- > > >ClientHwAddr))) { > > - // > > - // GUID not yet set - send all 0's to show not programable > > - // > > - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the > > smbios table!\n")); > > - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); > > - } > > - > > - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); > > - } > > - > > - Xid = NET_RANDOM (NetRandomInitSeed > ()); > > - Token.Packet->Dhcp4.Header.Xid = HTONL(Xid); > > - Token.Packet->Dhcp4.Header.Reserved = HTONS((UINT16) ((IsBCast) ? > > 0x8000 : 0)); > > - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private- > > >StationIp, sizeof (EFI_IPv4_ADDRESS)); > > - > > - Token.RemotePort = Sport; > > - > > - if (IsBCast) { > > - SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff); > > - } else { > > - CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS)); > > - } > > - > > - CopyMem (&Token.GatewayAddress, &Private->GatewayIp, sizeof > > (EFI_IPv4_ADDRESS)); > > - > > - if (!IsBCast) { > > - Token.ListenPointCount = 1; > > - Token.ListenPoints = &ListenPoint; > > - Token.ListenPoints[0].ListenPort = PXEBC_BS_DISCOVER_PORT; > > - CopyMem (&Token.ListenPoints[0].ListenAddress, &Private->StationIp, > > sizeof(EFI_IPv4_ADDRESS)); > > - CopyMem (&Token.ListenPoints[0].SubnetMask, &Private->SubnetMask, > > sizeof(EFI_IPv4_ADDRESS)); > > - } > > - // > > - // Send Pxe Discover > > - // > > - for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; > > TryIndex++) { > > - > > - Token.TimeoutValue = (UINT16) > > (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex); > > - Token.Packet->Dhcp4.Header.Seconds = (UINT16) > > (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1)); > > - > > - Status = Dhcp4->TransmitReceive (Dhcp4, &Token); > > - > > - if (Token.Status != EFI_TIMEOUT) { > > - break; > > - } > > - } > > - > > - if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) { > > - // > > - // No server response our PXE request > > - // > > - Status = EFI_TIMEOUT; > > - } > > - > > - if (!EFI_ERROR (Status)) { > > - // > > - // Find Pxe Reply > > - // > > - RepIndex = 0; > > - SrvIndex = 0; > > - Response = Token.ResponseList; > > - > > - while (RepIndex < Token.ResponseCount) { > > - if (Response->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { > > - SrvIndex = 0; > > - RepIndex++; > > - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response- > > >Size); > > - continue; > > - } > > - > > - while (SrvIndex < IpCount) { > > - > > - if (SrvList[SrvIndex].AcceptAnyResponse) { > > - break; > > - } > > - > > - if ((SrvList[SrvIndex].Type == Type) && EFI_IP4_EQUAL > (&(Response- > > >Dhcp4.Header.ServerAddr), &(Private->ServerIp))) { > > - break; > > - } > > - > > - SrvIndex++; > > - } > > - > > - if ((IpCount != SrvIndex) || (IpCount == 0)) { > > - break; > > - } > > - > > - SrvIndex = 0; > > - RepIndex++; > > - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response- > > >Size); > > - } > > - > > - if (RepIndex < Token.ResponseCount) { > > - > > - if (Reply != NULL) { > > - Status = PxeBcCopyEfiDhcp4Packet (Reply, Response); > > - if (EFI_ERROR(Status)) { > > - goto ON_EXIT; > > - } > > - } > > - > > - if (IsDiscv) { > > - CopyMem (&(Mode->PxeDiscover), &(Token.Packet->Dhcp4), > > Token.Packet->Length); > > - Mode->PxeDiscoverValid = TRUE; > > - > > - CopyMem (Mode->PxeReply.Raw, &Response->Dhcp4, Response- > > >Length); > > - Mode->PxeReplyReceived = TRUE; > > - } > > - } else { > > - Status = EFI_NOT_FOUND; > > - } > > - } > > - > > -ON_EXIT: > > - // > > - // free the responselist > > - // > > - if (Token.ResponseList != NULL) { > > - FreePool (Token.ResponseList); > > - } > > - // > > - // Free the dhcp packet > > - // > > - if (Token.Packet != NULL) { > > - FreePool (Token.Packet); > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - Parse interested dhcp options. > > - > > - @param Buffer Pointer to the dhcp options packet. > > - @param Length The length of the dhcp options. > > - @param OptTag The option OpCode. > > - > > - @return NULL if the buffer length is 0 and OpCode is not > > - DHCP4_TAG_EOP, or the pointer to the buffer. > > - > > -**/ > > -EFI_DHCP4_PACKET_OPTION * > > -PxeBcParseExtendOptions ( > > - IN UINT8 *Buffer, > > - IN UINT32 Length, > > - IN UINT8 OptTag > > - ) > > -{ > > - EFI_DHCP4_PACKET_OPTION *Option; > > - UINT32 Offset; > > - > > - Option = (EFI_DHCP4_PACKET_OPTION *) Buffer; > > - Offset = 0; > > - > > - while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) { > > - > > - if (Option->OpCode == OptTag) { > > - > > - return Option; > > - } > > - > > - if (Option->OpCode == DHCP4_TAG_PAD) { > > - Offset++; > > - } else { > > - Offset += Option->Length + 2; > > - } > > - > > - Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset); > > - } > > - > > - return NULL; > > -} > > - > > - > > -/** > > - This function is to parse and check vendor options. > > - > > - @param Dhcp4Option Pointer to dhcp options > > - @param VendorOption Pointer to vendor options > > - > > - @return TRUE if valid for vendor options, or FALSE. > > - > > -**/ > > -BOOLEAN > > -PxeBcParseVendorOptions ( > > - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, > > - IN PXEBC_VENDOR_OPTION *VendorOption > > - ) > > -{ > > - UINT32 *BitMap; > > - UINT8 VendorOptionLen; > > - EFI_DHCP4_PACKET_OPTION *PxeOption; > > - UINT8 Offset; > > - > > - BitMap = VendorOption->BitMap; > > - VendorOptionLen = Dhcp4Option->Length; > > - PxeOption = (EFI_DHCP4_PACKET_OPTION *) &Dhcp4Option->Data[0]; > > - Offset = 0; > > - > > - while ((Offset < VendorOptionLen) && (PxeOption->OpCode != > > DHCP4_TAG_EOP)) { > > - // > > - // Parse every Vendor Option and set its BitMap > > - // > > - switch (PxeOption->OpCode) { > > - > > - case PXEBC_VENDOR_TAG_MTFTP_IP: > > - > > - CopyMem (&VendorOption->MtftpIp, PxeOption->Data, sizeof > > (EFI_IPv4_ADDRESS)); > > - break; > > - > > - case PXEBC_VENDOR_TAG_MTFTP_CPORT: > > - > > - CopyMem (&VendorOption->MtftpCPort, PxeOption->Data, sizeof > > (VendorOption->MtftpCPort)); > > - break; > > - > > - case PXEBC_VENDOR_TAG_MTFTP_SPORT: > > - > > - CopyMem (&VendorOption->MtftpSPort, PxeOption->Data, sizeof > > (VendorOption->MtftpSPort)); > > - break; > > - > > - case PXEBC_VENDOR_TAG_MTFTP_TIMEOUT: > > - > > - VendorOption->MtftpTimeout = *PxeOption->Data; > > - break; > > - > > - case PXEBC_VENDOR_TAG_MTFTP_DELAY: > > - > > - VendorOption->MtftpDelay = *PxeOption->Data; > > - break; > > - > > - case PXEBC_VENDOR_TAG_DISCOVER_CTRL: > > - > > - VendorOption->DiscoverCtrl = *PxeOption->Data; > > - break; > > - > > - case PXEBC_VENDOR_TAG_DISCOVER_MCAST: > > - > > - CopyMem (&VendorOption->DiscoverMcastIp, PxeOption->Data, sizeof > > (EFI_IPv4_ADDRESS)); > > - break; > > - > > - case PXEBC_VENDOR_TAG_BOOT_SERVERS: > > - > > - VendorOption->BootSvrLen = PxeOption->Length; > > - VendorOption->BootSvr = (PXEBC_BOOT_SVR_ENTRY *) PxeOption- > > >Data; > > - break; > > - > > - case PXEBC_VENDOR_TAG_BOOT_MENU: > > - > > - VendorOption->BootMenuLen = PxeOption->Length; > > - VendorOption->BootMenu = (PXEBC_BOOT_MENU_ENTRY *) > > PxeOption->Data; > > - break; > > - > > - case PXEBC_VENDOR_TAG_MENU_PROMPT: > > - > > - VendorOption->MenuPromptLen = PxeOption->Length; > > - VendorOption->MenuPrompt = (PXEBC_MENU_PROMPT *) > > PxeOption->Data; > > - break; > > - > > - case PXEBC_VENDOR_TAG_MCAST_ALLOC: > > - > > - CopyMem (&VendorOption->McastIpBase, PxeOption->Data, sizeof > > (EFI_IPv4_ADDRESS)); > > - CopyMem (&VendorOption->McastIpBlock, PxeOption->Data + 4, sizeof > > (VendorOption->McastIpBlock)); > > - CopyMem (&VendorOption->McastIpRange, PxeOption->Data + 6, sizeof > > (VendorOption->McastIpRange)); > > - break; > > - > > - case PXEBC_VENDOR_TAG_CREDENTIAL_TYPES: > > - > > - VendorOption->CredTypeLen = PxeOption->Length; > > - VendorOption->CredType = (UINT32 *) PxeOption->Data; > > - break; > > - > > - case PXEBC_VENDOR_TAG_BOOT_ITEM: > > - > > - CopyMem (&VendorOption->BootSrvType, PxeOption->Data, sizeof > > (VendorOption->BootSrvType)); > > - CopyMem (&VendorOption->BootSrvLayer, PxeOption->Data + 2, sizeof > > (VendorOption->BootSrvLayer)); > > - break; > > - } > > - > > - SET_VENDOR_OPTION_BIT_MAP (BitMap, PxeOption->OpCode); > > - > > - if (PxeOption->OpCode == DHCP4_TAG_PAD) { > > - Offset++; > > - } else { > > - Offset = (UINT8) (Offset + PxeOption->Length + 2); > > - } > > - > > - PxeOption = (EFI_DHCP4_PACKET_OPTION *) (Dhcp4Option->Data + > > Offset); > > - } > > - > > - // > > - // FixMe, return falas if invalid of any vendor option > > - // > > - > > - return TRUE; > > -} > > - > > - > > -/** > > - This function display boot item detail. > > - > > - If the length of the boot item string over 70 Char, just display 70 > Char. > > - > > - @param Str Pointer to a string (boot item string). > > - @param Len The length of string. > > - > > -**/ > > -VOID > > -PxeBcDisplayBootItem ( > > - IN UINT8 *Str, > > - IN UINT8 Len > > - ) > > -{ > > - UINT8 Tmp; > > - > > - Len = (UINT8) MIN (70, Len); > > - Tmp = Str[Len]; > > - Str[Len] = 0; > > - AsciiPrint ("%a \n", Str); > > - Str[Len] = Tmp; > > -} > > - > > - > > -/** > > - Choose the boot prompt. > > - > > - @param Private Pointer to PxeBc private data. > > - > > - @retval EFI_SUCCESS Select boot prompt done. > > - @retval EFI_TIMEOUT Select boot prompt time out. > > - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. > > - @retval EFI_ABORTED User cancel the operation. > > - @retval EFI_NOT_READY Read the input key from the keybroad has > not > > finish. > > - > > -**/ > > -EFI_STATUS > > -PxeBcSelectBootPrompt ( > > - IN PXEBC_PRIVATE_DATA *Private > > - ) > > -{ > > - PXEBC_CACHED_DHCP4_PACKET *Packet; > > - PXEBC_VENDOR_OPTION *VendorOpt; > > - EFI_EVENT TimeoutEvent; > > - EFI_EVENT DescendEvent; > > - EFI_INPUT_KEY InputKey; > > - EFI_STATUS Status; > > - UINT8 Timeout; > > - UINT8 *Prompt; > > - UINT8 PromptLen; > > - INT32 SecCol; > > - INT32 SecRow; > > - > > - TimeoutEvent = NULL; > > - DescendEvent = NULL; > > - > > - if (Private->PxeBc.Mode->ProxyOfferReceived) { > > - > > - Packet = &Private->ProxyOffer; > > - } else { > > - > > - Packet = &Private->Dhcp4Ack; > > - } > > - > > - if (Packet->OfferType != DHCP4_PACKET_TYPE_PXE10) { > > - return EFI_NOT_FOUND; > > - } > > - > > - VendorOpt = &Packet->PxeVendorOption; > > - // > > - // According to the PXE specification 2.1, Table 2-1 PXE DHCP Options > (Full > > - // List), we must not consider a boot prompt or boot menu if all of > the > > - // following hold: > > - // - the PXE_DISCOVERY_CONTROL PXE tag is present inside the Vendor > > Options > > - // (=43) DHCP tag, and > > - // - the PXE_DISCOVERY_CONTROL PXE tag has bit 3 set, and > > - // - a boot file name has been presented with DHCP option 67. > > - // > > - if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) && > > - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { > > - return EFI_ABORTED; > > - } > > - > > - if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) { > > - return EFI_SUCCESS; > > - } > > - > > - Timeout = VendorOpt->MenuPrompt->Timeout; > > - Prompt = VendorOpt->MenuPrompt->Prompt; > > - PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1); > > - > > - if (Timeout == 0) { > > - return EFI_SUCCESS; > > - } > > - > > - if (Timeout == 255) { > > - return EFI_TIMEOUT; > > - } > > - > > - Status = gBS->CreateEvent ( > > - EVT_TIMER, > > - TPL_CALLBACK, > > - NULL, > > - NULL, > > - &TimeoutEvent > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Status = gBS->SetTimer ( > > - TimeoutEvent, > > - TimerRelative, > > - MultU64x32 (Timeout, TICKS_PER_SECOND) > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - Status = gBS->CreateEvent ( > > - EVT_TIMER, > > - TPL_CALLBACK, > > - NULL, > > - NULL, > > - &DescendEvent > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - Status = gBS->SetTimer ( > > - DescendEvent, > > - TimerPeriodic, > > - TICKS_PER_SECOND > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - SecCol = gST->ConOut->Mode->CursorColumn; > > - SecRow = gST->ConOut->Mode->CursorRow; > > - > > - PxeBcDisplayBootItem (Prompt, PromptLen); > > - > > - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, > > SecRow); > > - AsciiPrint ("(%d) ", Timeout--); > > - > > - while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { > > - > > - if (!EFI_ERROR (gBS->CheckEvent (DescendEvent))) { > > - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, > > SecRow); > > - AsciiPrint ("(%d) ", Timeout--); > > - } > > - > > - if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == > > EFI_NOT_READY) { > > - > > - gBS->Stall (10 * TICKS_PER_MS); > > - continue; > > - } > > - > > - if (InputKey.ScanCode == 0) { > > - > > - switch (InputKey.UnicodeChar) { > > - case CTRL ('c'): > > - Status = EFI_ABORTED; > > - break; > > - > > - case CTRL ('m'): > > - case 'm': > > - case 'M': > > - Status = EFI_TIMEOUT; > > - break; > > - > > - default: > > - continue; > > - } > > - } else { > > - > > - switch (InputKey.ScanCode) { > > - case SCAN_F8: > > - Status = EFI_TIMEOUT; > > - break; > > - > > - case SCAN_ESC: > > - Status = EFI_ABORTED; > > - break; > > - > > - default: > > - continue; > > - } > > - } > > - > > - break; > > - } > > - > > - gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1); > > - > > -ON_EXIT: > > - > > - if (DescendEvent != NULL) { > > - gBS->CloseEvent (DescendEvent); > > - } > > - > > - if (TimeoutEvent != NULL) { > > - gBS->CloseEvent (TimeoutEvent); > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - Select the boot menu. > > - > > - @param Private Pointer to PxeBc private data. > > - @param Type The type of the menu. > > - @param UseDefaultItem Use default item or not. > > - > > - @retval EFI_ABORTED User cancel operation. > > - @retval EFI_SUCCESS Select the boot menu success. > > - @retval EFI_NOT_READY Read the input key from the keybroad has not > > finish. > > - > > -**/ > > -EFI_STATUS > > -PxeBcSelectBootMenu ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - OUT UINT16 *Type, > > - IN BOOLEAN UseDefaultItem > > - ) > > -{ > > - PXEBC_CACHED_DHCP4_PACKET *Packet; > > - PXEBC_VENDOR_OPTION *VendorOpt; > > - EFI_INPUT_KEY InputKey; > > - UINT8 MenuSize; > > - UINT8 MenuNum; > > - INT32 TopRow; > > - UINT16 Select; > > - UINT16 LastSelect; > > - UINT8 Index; > > - BOOLEAN Finish; > > - CHAR8 Blank[70]; > > - PXEBC_BOOT_MENU_ENTRY *MenuItem; > > - PXEBC_BOOT_MENU_ENTRY *MenuArray[PXEBC_MAX_MENU_NUM]; > > - > > - Finish = FALSE; > > - Select = 0; > > - Index = 0; > > - *Type = 0; > > - > > - if (Private->PxeBc.Mode->ProxyOfferReceived) { > > - > > - Packet = &Private->ProxyOffer; > > - } else { > > - > > - Packet = &Private->Dhcp4Ack; > > - } > > - > > - ASSERT (Packet->OfferType == DHCP4_PACKET_TYPE_PXE10); > > - > > - VendorOpt = &Packet->PxeVendorOption; > > - > > - if (!IS_VALID_BOOT_MENU (VendorOpt->BitMap)) { > > - return EFI_SUCCESS; > > - } > > - > > - SetMem (Blank, sizeof(Blank), ' '); > > - > > - MenuSize = VendorOpt->BootMenuLen; > > - MenuItem = VendorOpt->BootMenu; > > - > > - if (MenuSize == 0) { > > - return EFI_NOT_READY; > > - } > > - > > - while (MenuSize > 0) { > > - MenuArray[Index++] = MenuItem; > > - MenuSize = (UINT8) (MenuSize - (MenuItem->DescLen + 3)); > > - MenuItem = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + > > MenuItem->DescLen + 3); > > - if (Index >= PXEBC_MAX_MENU_NUM) { > > - break; > > - } > > - } > > - > > - if (UseDefaultItem) { > > - *Type = MenuArray[0]->Type; > > - *Type = NTOHS (*Type); > > - return EFI_SUCCESS; > > - } > > - > > - MenuNum = Index; > > - > > - for (Index = 0; Index < MenuNum; Index++) { > > - PxeBcDisplayBootItem (MenuArray[Index]->DescStr, MenuArray[Index]- > > >DescLen); > > - } > > - > > - TopRow = gST->ConOut->Mode->CursorRow - MenuNum; > > - > > - do { > > - ASSERT (Select < PXEBC_MAX_MENU_NUM); > > - // > > - // highlight selected row > > - // > > - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, > > EFI_LIGHTGRAY)); > > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Select); > > - Blank[MenuArray[Select]->DescLen] = 0; > > - AsciiPrint ("%a\r", Blank); > > - PxeBcDisplayBootItem (MenuArray[Select]->DescStr, > MenuArray[Select]- > > >DescLen); > > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); > > - LastSelect = Select; > > - > > - while (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == > > EFI_NOT_READY) { > > - gBS->Stall (10 * TICKS_PER_MS); > > - } > > - > > - if (InputKey.ScanCode == 0) { > > - switch (InputKey.UnicodeChar) { > > - case CTRL ('c'): > > - InputKey.ScanCode = SCAN_ESC; > > - break; > > - > > - case CTRL ('j'): /* linefeed */ > > - case CTRL ('m'): /* return */ > > - Finish = TRUE; > > - break; > > - > > - case CTRL ('i'): /* tab */ > > - case ' ': > > - case 'd': > > - case 'D': > > - InputKey.ScanCode = SCAN_DOWN; > > - break; > > - > > - case CTRL ('h'): /* backspace */ > > - case 'u': > > - case 'U': > > - InputKey.ScanCode = SCAN_UP; > > - break; > > - > > - default: > > - InputKey.ScanCode = 0; > > - } > > - } > > - > > - switch (InputKey.ScanCode) { > > - case SCAN_LEFT: > > - case SCAN_UP: > > - if (Select > 0) { > > - --Select; > > - } > > - > > - break; > > - > > - case SCAN_DOWN: > > - case SCAN_RIGHT: > > - if (++Select == MenuNum) { > > - --Select; > > - } > > - > > - break; > > - > > - case SCAN_PAGE_UP: > > - case SCAN_HOME: > > - Select = 0; > > - break; > > - > > - case SCAN_PAGE_DOWN: > > - case SCAN_END: > > - Select = (UINT16) (MenuNum - 1); > > - break; > > - > > - case SCAN_ESC: > > - return EFI_ABORTED; > > - } > > - > > - /* unhighlight last selected row */ > > - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR > > (EFI_LIGHTGRAY, EFI_BLACK)); > > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + > LastSelect); > > - Blank[MenuArray[LastSelect]->DescLen] = 0; > > - AsciiPrint ("%a\r", Blank); > > - PxeBcDisplayBootItem (MenuArray[LastSelect]->DescStr, > > MenuArray[LastSelect]->DescLen); > > - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); > > - } while (!Finish); > > - > > - ASSERT (Select < PXEBC_MAX_MENU_NUM); > > - > > - // > > - // Swap the byte order > > - // > > - CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16)); > > - *Type = NTOHS (*Type); > > - > > - return EFI_SUCCESS; > > -} > > - > > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > > deleted file mode 100644 > > index 76c140d8e3ff..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > > +++ /dev/null > > @@ -1,665 +0,0 @@ > > -/** @file > > - The driver binding for UEFI PXEBC protocol. > > - > > -Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "PxeBcImpl.h" > > - > > -EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = { > > - PxeBcDriverBindingSupported, > > - PxeBcDriverBindingStart, > > - PxeBcDriverBindingStop, > > - 0xa, > > - NULL, > > - NULL > > -}; > > - > > -/** > > - This is the declaration of an EFI image entry point. This entry point > is > > - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers > including > > - both device drivers and bus drivers. > > - > > - @param ImageHandle The firmware allocated handle for the > UEFI > > image. > > - @param SystemTable A pointer to the EFI System Table. > > - > > - @retval EFI_SUCCESS The operation completed successfully. > > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > > due to a lack of resources. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDriverEntryPoint ( > > - IN EFI_HANDLE ImageHandle, > > - IN EFI_SYSTEM_TABLE *SystemTable > > - ) > > -{ > > - return EfiLibInstallDriverBindingComponentName2 ( > > - ImageHandle, > > - SystemTable, > > - &gPxeBcDriverBinding, > > - ImageHandle, > > - &gPxeBcComponentName, > > - &gPxeBcComponentName2 > > - ); > > -} > > - > > - > > -/** > > - Test to see if this driver supports ControllerHandle. This service > > - is called by the EFI boot service ConnectController(). In > > - order to make drivers as small as possible, there are a few calling > > - restrictions for this service. ConnectController() must > > - follow these calling restrictions. If any other agent wishes to call > > - Supported() it must also follow these calling restrictions. > > - PxeBc requires DHCP4 and MTFTP4 protocols. > > - > > - @param This Protocol instance pointer. > > - @param ControllerHandle Handle of device to test > > - @param RemainingDevicePath Optional parameter use to pick a specific > > child > > - device to start. > > - > > - @retval EFI_SUCCESS This driver supports this device > > - @retval EFI_ALREADY_STARTED This driver is already running on this > device > > - @retval other This driver does not support this device > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDriverBindingSupported ( > > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > > - ) > > -{ > > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > > - EFI_STATUS Status; > > - > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiPxeBaseCodeProtocolGuid, > > - (VOID **) &PxeBc, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - > > - if (!EFI_ERROR (Status)) { > > - return EFI_ALREADY_STARTED; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiDhcp4ServiceBindingProtocolGuid, > > - NULL, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > - ); > > - > > - if (!EFI_ERROR (Status)) { > > - > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiMtftp4ServiceBindingProtocolGuid, > > - NULL, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_TEST_PROTOCOL > > - ); > > - > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - Start this driver on ControllerHandle. This service is called by the > > - EFI boot service ConnectController(). In order to make > > - drivers as small as possible, there are a few calling restrictions > for > > - this service. ConnectController() must follow these > > - calling restrictions. If any other agent wishes to call Start() it > > - must also follow these calling restrictions. > > - > > - @param This Protocol instance pointer. > > - @param ControllerHandle Handle of device to bind driver to > > - @param RemainingDevicePath Optional parameter use to pick a > specific > > child > > - device to start. > > - > > - @retval EFI_SUCCESS This driver is added to ControllerHandle > > - @retval EFI_ALREADY_STARTED This driver is already running on > > ControllerHandle > > - @retval other This driver does not support this device > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDriverBindingStart ( > > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - UINTN Index; > > - EFI_STATUS Status; > > - EFI_IP4_MODE_DATA Ip4ModeData; > > - > > - Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA)); > > - if (Private == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE; > > - Private->Controller = ControllerHandle; > > - Private->Image = This->DriverBindingHandle; > > - CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private- > > >PxeBc)); > > - Private->PxeBc.Mode = &Private->Mode; > > - CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof > > (Private->LoadFile)); > > - > > - Private->ProxyOffer.Packet.Offer.Size = > > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > > - Private->Dhcp4Ack.Packet.Ack.Size = > > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > > - Private->PxeReply.Packet.Ack.Size = > > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > > - > > - for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) { > > - Private->Dhcp4Offers[Index].Packet.Offer.Size = > > PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; > > - } > > - > > - // > > - // Get the NII interface if it exists. > > - // > > - Status = gBS->OpenProtocol ( > > - ControllerHandle, > > - &gEfiNetworkInterfaceIdentifierProtocolGuid_31, > > - (VOID **) &Private->Nii, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - if (EFI_ERROR (Status)) { > > - Private->Nii = NULL; > > - } > > - > > - Status = NetLibCreateServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiArpServiceBindingProtocolGuid, > > - &Private->ArpChild > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Private->ArpChild, > > - &gEfiArpProtocolGuid, > > - (VOID **) &Private->Arp, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = NetLibCreateServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiDhcp4ServiceBindingProtocolGuid, > > - &Private->Dhcp4Child > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Private->Dhcp4Child, > > - &gEfiDhcp4ProtocolGuid, > > - (VOID **) &Private->Dhcp4, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = NetLibCreateServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiIp4ServiceBindingProtocolGuid, > > - &Private->Ip4Child > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Private->Ip4Child, > > - &gEfiIp4ProtocolGuid, > > - (VOID **) &Private->Ip4, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - // > > - // Get max packet size from Ip4 to calculate block size for Tftp > later. > > - // > > - Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, > > NULL); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize; > > - > > - Status = NetLibCreateServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiMtftp4ServiceBindingProtocolGuid, > > - &Private->Mtftp4Child > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Private->Mtftp4Child, > > - &gEfiMtftp4ProtocolGuid, > > - (VOID **) &Private->Mtftp4, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = NetLibCreateServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiUdp4ServiceBindingProtocolGuid, > > - &Private->Udp4ReadChild > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - // > > - // The UDP instance for EfiPxeBcUdpRead > > - // > > - Status = gBS->OpenProtocol ( > > - Private->Udp4ReadChild, > > - &gEfiUdp4ProtocolGuid, > > - (VOID **) &Private->Udp4Read, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - // > > - // The UDP instance for EfiPxeBcUdpWrite > > - // > > - Status = NetLibCreateServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiUdp4ServiceBindingProtocolGuid, > > - &Private->Udp4WriteChild > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - Status = gBS->OpenProtocol ( > > - Private->Udp4WriteChild, > > - &gEfiUdp4ProtocolGuid, > > - (VOID **) &Private->Udp4Write, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_BY_DRIVER > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA)); > > - Private->Udp4CfgData.AcceptBroadcast = FALSE; > > - Private->Udp4CfgData.AcceptPromiscuous = FALSE; > > - Private->Udp4CfgData.AcceptAnyPort = TRUE; > > - Private->Udp4CfgData.AllowDuplicatePort = TRUE; > > - Private->Udp4CfgData.TypeOfService = DEFAULT_ToS; > > - Private->Udp4CfgData.TimeToLive = DEFAULT_TTL; > > - Private->Udp4CfgData.DoNotFragment = FALSE; > > - Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; > > - Private->Udp4CfgData.UseDefaultAddress = FALSE; > > - > > - PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read); > > - Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen; > > - CopyMem (&Private->Mac, &Private- > > >SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen); > > - > > - > > - ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA)); > > - Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP; > > - Private->Ip4ConfigData.AcceptIcmpErrors = TRUE; > > - Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS; > > - Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL; > > - Private->Ip4ConfigData.DoNotFragment = FALSE; > > - Private->Ip4ConfigData.RawData = FALSE; > > - > > - Status = gBS->InstallMultipleProtocolInterfaces ( > > - &ControllerHandle, > > - &gEfiPxeBaseCodeProtocolGuid, > > - &Private->PxeBc, > > - &gEfiLoadFileProtocolGuid, > > - &Private->LoadFile, > > - NULL > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - // > > - // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy. > > - // > > - Status = gBS->HandleProtocol ( > > - ControllerHandle, > > - &gEfiIp4Config2ProtocolGuid, > > - (VOID **) &Private->Ip4Config2 > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_ERROR; > > - } > > - > > - return EFI_SUCCESS; > > - > > -ON_ERROR: > > - > > - if (Private->Udp4WriteChild != NULL) { > > - gBS->CloseProtocol ( > > - Private->Udp4WriteChild, > > - &gEfiUdp4ProtocolGuid, > > - This->DriverBindingHandle, > > - ControllerHandle > > - ); > > - NetLibDestroyServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiUdp4ServiceBindingProtocolGuid, > > - Private->Udp4WriteChild > > - ); > > - } > > - > > - if (Private->Udp4ReadChild != NULL) { > > - gBS->CloseProtocol ( > > - Private->Udp4ReadChild, > > - &gEfiUdp4ProtocolGuid, > > - This->DriverBindingHandle, > > - ControllerHandle > > - ); > > - NetLibDestroyServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiUdp4ServiceBindingProtocolGuid, > > - Private->Udp4ReadChild > > - ); > > - } > > - > > - if (Private->Mtftp4Child != NULL) { > > - gBS->CloseProtocol ( > > - Private->Mtftp4Child, > > - &gEfiMtftp4ProtocolGuid, > > - This->DriverBindingHandle, > > - ControllerHandle > > - ); > > - > > - NetLibDestroyServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiMtftp4ServiceBindingProtocolGuid, > > - Private->Mtftp4Child > > - ); > > - } > > - > > - if (Private->Ip4Child != NULL) { > > - gBS->CloseProtocol ( > > - Private->Ip4Child, > > - &gEfiIp4ProtocolGuid, > > - This->DriverBindingHandle, > > - ControllerHandle > > - ); > > - > > - NetLibDestroyServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiIp4ServiceBindingProtocolGuid, > > - Private->Ip4Child > > - ); > > - } > > - > > - if (Private->Dhcp4Child != NULL) { > > - gBS->CloseProtocol ( > > - Private->Dhcp4Child, > > - &gEfiDhcp4ProtocolGuid, > > - This->DriverBindingHandle, > > - ControllerHandle > > - ); > > - > > - NetLibDestroyServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiDhcp4ServiceBindingProtocolGuid, > > - Private->Dhcp4Child > > - ); > > - } > > - > > - if (Private->ArpChild != NULL) { > > - gBS->CloseProtocol ( > > - Private->ArpChild, > > - &gEfiArpProtocolGuid, > > - This->DriverBindingHandle, > > - ControllerHandle > > - ); > > - > > - NetLibDestroyServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiArpServiceBindingProtocolGuid, > > - Private->ArpChild > > - ); > > - } > > - > > - FreePool (Private); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Stop this driver on ControllerHandle. This service is called by the > > - EFI boot service DisconnectController(). In order to > > - make drivers as small as possible, there are a few calling > > - restrictions for this service. DisconnectController() > > - must follow these calling restrictions. If any other agent wishes > > - to call Stop() it must also follow these calling restrictions. > > - > > - @param This Protocol instance pointer. > > - @param ControllerHandle Handle of device to stop driver on > > - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If > > number of > > - children is zero stop the entire bus driver. > > - @param ChildHandleBuffer List of Child Handles to Stop. > > - > > - @retval EFI_SUCCESS This driver is removed ControllerHandle > > - @retval other This driver was not removed from this > device > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDriverBindingStop ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN UINTN NumberOfChildren, > > - IN EFI_HANDLE *ChildHandleBuffer > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > > - EFI_HANDLE NicHandle; > > - EFI_STATUS Status; > > - > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > &gEfiArpProtocolGuid); > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiDhcp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiIp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiUdp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - NicHandle = NetLibGetNicHandle (ControllerHandle, > > &gEfiMtftp4ProtocolGuid); > > - > > - if (NicHandle == NULL) { > > - return EFI_SUCCESS; > > - } > > - } > > - } > > - } > > - } > > - > > - Status = gBS->OpenProtocol ( > > - NicHandle, > > - &gEfiPxeBaseCodeProtocolGuid, > > - (VOID **) &PxeBc, > > - This->DriverBindingHandle, > > - ControllerHandle, > > - EFI_OPEN_PROTOCOL_GET_PROTOCOL > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // Stop functionality of PXE Base Code protocol > > - // > > - Status = PxeBc->Stop (PxeBc); > > - if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) { > > - return Status; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc); > > - > > - Status = gBS->UninstallMultipleProtocolInterfaces ( > > - NicHandle, > > - &gEfiPxeBaseCodeProtocolGuid, > > - &Private->PxeBc, > > - &gEfiLoadFileProtocolGuid, > > - &Private->LoadFile, > > - NULL > > - ); > > - > > - if (!EFI_ERROR (Status)) { > > - > > - gBS->CloseProtocol ( > > - Private->Udp4WriteChild, > > - &gEfiUdp4ProtocolGuid, > > - This->DriverBindingHandle, > > - NicHandle > > - ); > > - NetLibDestroyServiceChild ( > > - ControllerHandle, > > - This->DriverBindingHandle, > > - &gEfiUdp4ServiceBindingProtocolGuid, > > - Private->Udp4WriteChild > > - ); > > - > > - gBS->CloseProtocol ( > > - Private->Udp4ReadChild, > > - &gEfiUdp4ProtocolGuid, > > - This->DriverBindingHandle, > > - NicHandle > > - ); > > - NetLibDestroyServiceChild ( > > - NicHandle, > > - This->DriverBindingHandle, > > - &gEfiUdp4ServiceBindingProtocolGuid, > > - Private->Udp4ReadChild > > - ); > > - > > - gBS->CloseProtocol ( > > - Private->Dhcp4Child, > > - &gEfiDhcp4ProtocolGuid, > > - This->DriverBindingHandle, > > - NicHandle > > - ); > > - NetLibDestroyServiceChild ( > > - NicHandle, > > - This->DriverBindingHandle, > > - &gEfiDhcp4ServiceBindingProtocolGuid, > > - Private->Dhcp4Child > > - ); > > - > > - gBS->CloseProtocol ( > > - Private->Mtftp4Child, > > - &gEfiMtftp4ProtocolGuid, > > - This->DriverBindingHandle, > > - NicHandle > > - ); > > - NetLibDestroyServiceChild ( > > - NicHandle, > > - This->DriverBindingHandle, > > - &gEfiMtftp4ServiceBindingProtocolGuid, > > - Private->Mtftp4Child > > - ); > > - > > - gBS->CloseProtocol ( > > - Private->Ip4Child, > > - &gEfiIp4ProtocolGuid, > > - This->DriverBindingHandle, > > - NicHandle > > - ); > > - NetLibDestroyServiceChild ( > > - NicHandle, > > - This->DriverBindingHandle, > > - &gEfiIp4ServiceBindingProtocolGuid, > > - Private->Ip4Child > > - ); > > - > > - gBS->CloseProtocol ( > > - Private->ArpChild, > > - &gEfiArpProtocolGuid, > > - This->DriverBindingHandle, > > - NicHandle > > - ); > > - NetLibDestroyServiceChild ( > > - NicHandle, > > - This->DriverBindingHandle, > > - &gEfiArpServiceBindingProtocolGuid, > > - Private->ArpChild > > - ); > > - > > - FreePool (Private); > > - } > > - > > - return Status; > > -} > > - > > - > > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > deleted file mode 100644 > > index 3fa3be99c178..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > +++ /dev/null > > @@ -1,2989 +0,0 @@ > > -/** @file > > - Interface routines for PxeBc. > > - > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "PxeBcImpl.h" > > - > > -UINT32 mPxeDhcpTimeout[4] = { 4, 8, 16, 32 }; > > - > > -/** > > - Get and record the arp cache. > > - > > - @param This Pointer to EFI_PXE_BC_PROTOCOL > > - > > - @retval EFI_SUCCESS Arp cache updated successfully > > - @retval others If error occurs when getting arp > cache > > - > > -**/ > > -EFI_STATUS > > -UpdateArpCache ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL * This > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_STATUS Status; > > - UINT32 EntryLength; > > - UINT32 EntryCount; > > - EFI_ARP_FIND_DATA *Entries; > > - UINT32 Index; > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - Status = Private->Arp->Find ( > > - Private->Arp, > > - TRUE, > > - NULL, > > - &EntryLength, > > - &EntryCount, > > - &Entries, > > - TRUE > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - Mode->ArpCacheEntries = MIN ( > > - EntryCount, > > - EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES > > - ); > > - for (Index = 0; Index < Mode->ArpCacheEntries; Index ++) { > > - CopyMem ( > > - &Mode->ArpCache[Index].IpAddr, > > - Entries + 1, > > - Entries->SwAddressLength > > - ); > > - CopyMem ( > > - &Mode->ArpCache[Index].MacAddr, > > - (UINT8 *) (Entries + 1) + Entries->SwAddressLength, > > - Entries->HwAddressLength > > - ); > > - // > > - // Slip to the next FindData. > > - // > > - Entries = (EFI_ARP_FIND_DATA *) ((UINT8 *) Entries + EntryLength); > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Timeout routine to update arp cache. > > - > > - @param Event Pointer to EFI_PXE_BC_PROTOCOL > > - @param Context Context of the timer event > > - > > -**/ > > -VOID > > -EFIAPI > > -ArpCacheUpdateTimeout ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ) > > -{ > > - UpdateArpCache ((EFI_PXE_BASE_CODE_PROTOCOL *) Context); > > -} > > - > > -/** > > - Do arp resolution from arp cache in PxeBcMode. > > - > > - @param PxeBcMode The PXE BC mode to look into. > > - @param Ip4Addr The Ip4 address for resolution. > > - @param MacAddress The resoluted MAC address if the resolution is > > successful. > > - The value is undefined if resolution fails. > > - > > - @retval TRUE The resolution is successful. > > - @retval FALSE Otherwise. > > - > > -**/ > > -BOOLEAN > > -FindInArpCache ( > > - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, > > - IN EFI_IPv4_ADDRESS *Ip4Addr, > > - OUT EFI_MAC_ADDRESS *MacAddress > > - ) > > -{ > > - UINT32 Index; > > - > > - for (Index = 0; Index < PxeBcMode->ArpCacheEntries; Index ++) { > > - if (EFI_IP4_EQUAL (&PxeBcMode->ArpCache[Index].IpAddr.v4, Ip4Addr)) > > { > > - CopyMem ( > > - MacAddress, > > - &PxeBcMode->ArpCache[Index].MacAddr, > > - sizeof (EFI_MAC_ADDRESS) > > - ); > > - return TRUE; > > - } > > - } > > - > > - return FALSE; > > -} > > - > > -/** > > - Notify function for the ICMP receive token, used to process > > - the received ICMP packets. > > - > > - @param Context The PXEBC private data. > > - > > -**/ > > -VOID > > -EFIAPI > > -IcmpErrorListenHandlerDpc ( > > - IN VOID *Context > > - ) > > -{ > > - EFI_STATUS Status; > > - EFI_IP4_RECEIVE_DATA *RxData; > > - EFI_IP4_PROTOCOL *Ip4; > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - UINTN Index; > > - UINT32 CopiedLen; > > - UINT8 *CopiedPointer; > > - > > - Private = (PXEBC_PRIVATE_DATA *) Context; > > - Mode = &Private->Mode; > > - Status = Private->IcmpErrorRcvToken.Status; > > - RxData = Private->IcmpErrorRcvToken.Packet.RxData; > > - Ip4 = Private->Ip4; > > - > > - if (Status == EFI_ABORTED) { > > - // > > - // The reception is actively aborted by the consumer, directly > return. > > - // > > - return; > > - } > > - > > - if (RxData == NULL) { > > - goto Resume; > > - } > > - > > - if (Status != EFI_ICMP_ERROR) { > > - // > > - // The return status should be recognized as EFI_ICMP_ERROR. > > - // > > - goto CleanUp; > > - } > > - > > - if (EFI_IP4 (RxData->Header->SourceAddress) != 0 && > > - (NTOHL (Mode->SubnetMask.Addr[0]) != 0) && > > - IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL > > (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) > > && > > - !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), > NTOHL > > (Mode->SubnetMask.Addr[0]))) { > > - // > > - // The source address is not zero and it's not a unicast IP address, > discard it. > > - // > > - goto CleanUp; > > - } > > - > > - if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode- > > >StationIp.v4)) { > > - // > > - // The dest address is not equal to Station Ip address, discard it. > > - // > > - goto CleanUp; > > - } > > - > > - // > > - // Constructor ICMP error packet > > - // > > - CopiedLen = 0; > > - CopiedPointer = (UINT8 *) &Mode->IcmpError; > > - > > - for (Index = 0; Index < RxData->FragmentCount; Index ++) { > > - CopiedLen += RxData->FragmentTable[Index].FragmentLength; > > - if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) { > > - CopyMem ( > > - CopiedPointer, > > - RxData->FragmentTable[Index].FragmentBuffer, > > - RxData->FragmentTable[Index].FragmentLength > > - ); > > - } else { > > - CopyMem ( > > - CopiedPointer, > > - RxData->FragmentTable[Index].FragmentBuffer, > > - CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR) > > - ); > > - } > > - CopiedPointer += CopiedLen; > > - } > > - > > -CleanUp: > > - gBS->SignalEvent (RxData->RecycleSignal); > > - > > -Resume: > > - Ip4->Receive (Ip4, &(Private->IcmpErrorRcvToken)); > > -} > > - > > -/** > > - Request IcmpErrorListenHandlerDpc as a DPC at TPL_CALLBACK > > - > > - @param Event The event signaled. > > - @param Context The context passed in by the event > notifier. > > - > > -**/ > > -VOID > > -EFIAPI > > -IcmpErrorListenHandler ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ) > > -{ > > - // > > - // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK > > - // > > - QueueDpc (TPL_CALLBACK, IcmpErrorListenHandlerDpc, Context); > > -} > > - > > -/** > > - Enables the use of the PXE Base Code Protocol functions. > > - > > - This function enables the use of the PXE Base Code Protocol functions. > If > > the > > - Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE, > > then > > - EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6 > > formatted > > - addresses will be used in this session. If UseIpv6 is FALSE, then > IPv4 > > formatted > > - addresses will be used in this session. If UseIpv6 is TRUE, and the > > Ipv6Supported > > - field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then > > EFI_UNSUPPORTED will > > - be returned. If there is not enough memory or other resources to > start the > > PXE > > - Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned. > > Otherwise, the > > - PXE Base Code Protocol will be started, and all of the fields of the > > EFI_PXE_BASE_CODE_MODE > > - structure will be initialized as follows: > > - StartedSet to TRUE. > > - Ipv6SupportedUnchanged. > > - Ipv6AvailableUnchanged. > > - UsingIpv6Set to UseIpv6. > > - BisSupportedUnchanged. > > - BisDetectedUnchanged. > > - AutoArpSet to TRUE. > > - SendGUIDSet to FALSE. > > - TTLSet to DEFAULT_TTL. > > - ToSSet to DEFAULT_ToS. > > - DhcpCompletedSet to FALSE. > > - ProxyOfferReceivedSet to FALSE. > > - StationIpSet to an address of all zeros. > > - SubnetMaskSet to a subnet mask of all zeros. > > - DhcpDiscoverZero-filled. > > - DhcpAckZero-filled. > > - ProxyOfferZero-filled. > > - PxeDiscoverValidSet to FALSE. > > - PxeDiscoverZero-filled. > > - PxeReplyValidSet to FALSE. > > - PxeReplyZero-filled. > > - PxeBisReplyValidSet to FALSE. > > - PxeBisReplyZero-filled. > > - IpFilterSet the Filters field to 0 and the IpCnt field to 0. > > - ArpCacheEntriesSet to 0. > > - ArpCacheZero-filled. > > - RouteTableEntriesSet to 0. > > - RouteTableZero-filled. > > - IcmpErrorReceivedSet to FALSE. > > - IcmpErrorZero-filled. > > - TftpErroReceivedSet to FALSE. > > - TftpErrorZero-filled. > > - MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is > > available. > > - Set to FALSE if the PXE Base Code Callback Protocol is not > available. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param UseIpv6 Specifies the type of IP addresses that > are to be > > used during the session > > - that is being started. Set to TRUE for > IPv6 addresses, and > > FALSE for > > - IPv4 addresses. > > - > > - @retval EFI_SUCCESS The PXE Base Code Protocol was started. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this oper > > - @retval EFI_UNSUPPORTED UseIpv6 is TRUE, but the Ipv6Supported > > field of the > > - EFI_PXE_BASE_CODE_MODE structure is > FALSE. > > - @retval EFI_ALREADY_STARTED The PXE Base Code Protocol is already > in > > the started state. > > - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not > > point to a valid > > - EFI_PXE_BASE_CODE_PROTOCOL structure. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory or > > other resources to start the > > - PXE Base Code Protocol. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcStart ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN BOOLEAN UseIpv6 > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_STATUS Status; > > - > > - if (This == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - if (Mode->Started) { > > - return EFI_ALREADY_STARTED; > > - } > > - > > - if (UseIpv6) { > > - // > > - // IPv6 is not supported now. > > - // > > - return EFI_UNSUPPORTED; > > - } > > - > > - AsciiPrint ("\n>>Start PXE over IPv4"); > > - > > - // > > - // Configure the udp4 instance to let it receive data > > - // > > - Status = Private->Udp4Read->Configure ( > > - Private->Udp4Read, > > - &Private->Udp4CfgData > > - ); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - > > - // > > - // Configure block size for TFTP as a default value to handle all > link layers. > > - // > > - Private->BlockSize = MIN (Private->Ip4MaxPacketSize, > > PXEBC_DEFAULT_PACKET_SIZE) - > > - PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - > > PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE; > > - // > > - // If PcdTftpBlockSize is set to non-zero, override the default value. > > - // > > - if (PcdGet64 (PcdTftpBlockSize) != 0) { > > - Private->BlockSize = (UINTN) PcdGet64 (PcdTftpBlockSize); > > - } > > - > > - Private->AddressIsOk = FALSE; > > - > > - ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE)); > > - > > - Mode->Started = TRUE; > > - Mode->TTL = DEFAULT_TTL; > > - Mode->ToS = DEFAULT_ToS; > > - Mode->AutoArp = TRUE; > > - > > - // > > - // Create the event for Arp Cache checking. > > - // > > - Status = gBS->CreateEvent ( > > - EVT_TIMER | EVT_NOTIFY_SIGNAL, > > - TPL_CALLBACK, > > - ArpCacheUpdateTimeout, > > - This, > > - &Private->GetArpCacheEvent > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - // > > - // Start the timeout timer event. > > - // > > - Status = gBS->SetTimer ( > > - Private->GetArpCacheEvent, > > - TimerPeriodic, > > - TICKS_PER_SECOND > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - // > > - // Create ICMP error receiving event > > - // > > - Status = gBS->CreateEvent ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - IcmpErrorListenHandler, > > - Private, > > - &(Private->IcmpErrorRcvToken.Event) > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - // > > - //DHCP4 service allows only one of its children to be configured in > > - //the active state, If the DHCP4 D.O.R.A started by IP4 auto > > - //configuration and has not been completed, the Dhcp4 state machine > > - //will not be in the right state for the PXE to start a new round > D.O.R.A. > > - //so we need to switch it's policy to static. > > - // > > - Status = PxeBcSetIp4Policy (Private); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - Status = Private->Ip4->Configure (Private->Ip4, &Private- > >Ip4ConfigData); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - // > > - // start to listen incoming packet > > - // > > - Status = Private->Ip4->Receive (Private->Ip4, &Private- > > >IcmpErrorRcvToken); > > - if (!EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > -ON_EXIT: > > - Private->Ip4->Configure (Private->Ip4, NULL); > > - > > - if (Private->IcmpErrorRcvToken.Event != NULL) { > > - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); > > - } > > - > > - if (Private->GetArpCacheEvent != NULL) { > > - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); > > - gBS->CloseEvent (Private->GetArpCacheEvent); > > - } > > - > > - Mode->Started = FALSE; > > - Mode->TTL = 0; > > - Mode->ToS = 0; > > - Mode->AutoArp = FALSE; > > - > > - return Status; > > -} > > - > > - > > -/** > > - Disables the use of the PXE Base Code Protocol functions. > > - > > - This function stops all activity on the network device. All the > resources > > allocated > > - in Start() are released, the Started field of the > EFI_PXE_BASE_CODE_MODE > > structure is > > - set to FALSE and EFI_SUCCESS is returned. If the Started field of the > > EFI_PXE_BASE_CODE_MODE > > - structure is already FALSE, then EFI_NOT_STARTED will be returned. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - > > - @retval EFI_SUCCESS The PXE Base Code Protocol was stopped. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is already > in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not > > point to a valid > > - EFI_PXE_BASE_CODE_PROTOCOL structure. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcStop ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - > > - if (This == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - Private->Ip4->Cancel (Private->Ip4, NULL); > > - // > > - // Dispatch the DPCs queued by the NotifyFunction of the canceled rx > > token's > > - // events. > > - // > > - DispatchDpc (); > > - > > - Private->Ip4->Configure (Private->Ip4, NULL); > > - > > - // > > - // Close the ICMP error receiving event. > > - // > > - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); > > - > > - // > > - // Cancel the TimeoutEvent timer. > > - // > > - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); > > - > > - // > > - // Close the TimeoutEvent event. > > - // > > - gBS->CloseEvent (Private->GetArpCacheEvent); > > - > > - Mode->Started = FALSE; > > - > > - Private->CurrentUdpSrcPort = 0; > > - Private->Udp4Write->Configure (Private->Udp4Write, NULL); > > - Private->Udp4Read->Groups (Private->Udp4Read, FALSE, NULL); > > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > > - > > - Private->Dhcp4->Stop (Private->Dhcp4); > > - Private->Dhcp4->Configure (Private->Dhcp4, NULL); > > - > > - Private->FileSize = 0; > > - > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request / > > acknowledge) or DHCPv6 > > - S.A.R.R (solicit / advertise / request / reply) sequence. > > - > > - This function attempts to complete the DHCP sequence. If this > sequence is > > completed, > > - then EFI_SUCCESS is returned, and the DhcpCompleted, > > ProxyOfferReceived, StationIp, > > - SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the > > EFI_PXE_BASE_CODE_MODE > > - structure are filled in. > > - If SortOffers is TRUE, then the cached DHCP offer packets will be > sorted > > before > > - they are tried. If SortOffers is FALSE, then the cached DHCP offer > packets > > will > > - be tried in the order in which they are received. Please see the > Preboot > > Execution > > - Environment (PXE) Specification for additional details on the > > implementation of DHCP. > > - This function can take at least 31 seconds to timeout and return > control to > > the > > - caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will > be > > returned. > > - If the Callback Protocol does not return > > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > > - then the DHCP sequence will be stopped and EFI_ABORTED will be > > returned. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param SortOffers TRUE if the offers received should be > sorted. Set > > to FALSE to try the > > - offers in the order that they are > received. > > - > > - @retval EFI_SUCCESS Valid DHCP has completed. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not > > point to a valid > > - EFI_PXE_BASE_CODE_PROTOCOL structure. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to > > complete the DHCP Protocol. > > - @retval EFI_ABORTED The callback function aborted the DHCP > > Protocol. > > - @retval EFI_TIMEOUT The DHCP Protocol timed out. > > - @retval EFI_ICMP_ERROR An ICMP error packet was received > during > > the DHCP session. > > - @retval EFI_NO_RESPONSE Valid PXE offer was not received. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcDhcp ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN BOOLEAN SortOffers > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_DHCP4_PROTOCOL *Dhcp4; > > - EFI_DHCP4_CONFIG_DATA Dhcp4CfgData; > > - EFI_DHCP4_MODE_DATA Dhcp4Mode; > > - EFI_DHCP4_PACKET_OPTION > > *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; > > - UINT32 OptCount; > > - EFI_STATUS Status; > > - EFI_ARP_CONFIG_DATA ArpConfigData; > > - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; > > - > > - if (This == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Status = EFI_SUCCESS; > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - Dhcp4 = Private->Dhcp4; > > - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DHCP; > > - Private->SortOffers = SortOffers; > > - > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - Mode->IcmpErrorReceived = FALSE; > > - > > - // > > - // Stop Udp4Read instance > > - // > > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > > - > > - // > > - // Initialize the DHCP options and build the option list > > - // > > - OptCount = PxeBcBuildDhcpOptions (Private, OptList, TRUE); > > - > > - // > > - // Set the DHCP4 config data. > > - // The four discovery timeouts are 4, 8, 16, 32 seconds respectively. > > - // > > - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); > > - Dhcp4CfgData.OptionCount = OptCount; > > - Dhcp4CfgData.OptionList = OptList; > > - Dhcp4CfgData.Dhcp4Callback = PxeBcDhcpCallBack; > > - Dhcp4CfgData.CallbackContext = Private; > > - Dhcp4CfgData.DiscoverTryCount = 4; > > - Dhcp4CfgData.DiscoverTimeout = mPxeDhcpTimeout; > > - > > - Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - // > > - // Zero those arrays to record the varies numbers of DHCP OFFERS. > > - // > > - Private->GotProxyOffer = FALSE; > > - Private->NumOffers = 0; > > - Private->BootpIndex = 0; > > - ZeroMem (Private->ServerCount, sizeof (Private->ServerCount)); > > - ZeroMem (Private->ProxyIndex, sizeof (Private->ProxyIndex)); > > - > > - Status = Dhcp4->Start (Dhcp4, NULL); > > - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { > > - if (Status == EFI_ICMP_ERROR) { > > - Mode->IcmpErrorReceived = TRUE; > > - } > > - goto ON_EXIT; > > - } > > - > > - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - ASSERT (Dhcp4Mode.State == Dhcp4Bound); > > - > > - CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof > > (EFI_IPv4_ADDRESS)); > > - CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof > > (EFI_IPv4_ADDRESS)); > > - CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof > > (EFI_IPv4_ADDRESS)); > > - > > - CopyMem (&Mode->StationIp, &Private->StationIp, sizeof > > (EFI_IPv4_ADDRESS)); > > - CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof > > (EFI_IPv4_ADDRESS)); > > - > > - // > > - // Check the selected offer to see whether BINL is required, if no or > BINL is > > - // finished, set the various Mode members. > > - // > > - Status = PxeBcCheckSelectedOffer (Private); > > - > > - AsciiPrint ("\n Station IP address is "); > > - > > - PxeBcShowIp4Addr (&Private->StationIp.v4); > > - AsciiPrint ("\n"); > > - > > -ON_EXIT: > > - if (EFI_ERROR (Status)) { > > - Dhcp4->Stop (Dhcp4); > > - Dhcp4->Configure (Dhcp4, NULL); > > - } else { > > - // > > - // Remove the previously configured option list and callback > function > > - // > > - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); > > - Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); > > - > > - Private->AddressIsOk = TRUE; > > - > > - if (!Mode->UsingIpv6) { > > - // > > - // If in IPv4 mode, configure the corresponding ARP with this new > > - // station IP address. > > - // > > - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); > > - > > - ArpConfigData.SwAddressType = 0x0800; > > - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); > > - ArpConfigData.StationAddress = &Private->StationIp.v4; > > - > > - Private->Arp->Configure (Private->Arp, NULL); > > - Private->Arp->Configure (Private->Arp, &ArpConfigData); > > - > > - // > > - // Updated the route table. Fill the first entry. > > - // > > - Mode->RouteTableEntries = 1; > > - Mode->RouteTable[0].IpAddr.Addr[0] = Private- > >StationIp.Addr[0] & > > Private->SubnetMask.Addr[0]; > > - Mode->RouteTable[0].SubnetMask.Addr[0] = Private- > > >SubnetMask.Addr[0]; > > - Mode->RouteTable[0].GwAddr.Addr[0] = 0; > > - > > - // > > - // Create the default route entry if there is a default router. > > - // > > - if (Private->GatewayIp.Addr[0] != 0) { > > - Mode->RouteTableEntries = 2; > > - Mode->RouteTable[1].IpAddr.Addr[0] = 0; > > - Mode->RouteTable[1].SubnetMask.Addr[0] = 0; > > - Mode->RouteTable[1].GwAddr.Addr[0] = Private- > > >GatewayIp.Addr[0]; > > - } > > - > > - // > > - // Flush new station IP address into Udp4CfgData and > Ip4ConfigData > > - // > > - CopyMem (&Private->Udp4CfgData.StationAddress, &Private- > >StationIp, > > sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&Private->Udp4CfgData.SubnetMask, &Private- > > >SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&Private->Ip4ConfigData.StationAddress, &Private- > > >StationIp, sizeof (EFI_IPv4_ADDRESS)); > > - CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private- > > >SubnetMask, sizeof (EFI_IPv4_ADDRESS)); > > - > > - // > > - // Reconfigure the Ip4 instance to capture background ICMP > packets with > > new station Ip address. > > - // > > - Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken); > > - Private->Ip4->Configure (Private->Ip4, NULL); > > - > > - Status = Private->Ip4->Configure (Private->Ip4, &Private- > >Ip4ConfigData); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - Status = Private->Ip4->Receive (Private->Ip4, &Private- > > >IcmpErrorRcvToken); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - } > > - } > > - > > - Private->Udp4Read->Configure (Private->Udp4Read, &Private- > > >Udp4CfgData); > > - > > - // > > - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with > the IP > > - // receive filter list emptied and the filter set to > > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > > - // > > - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); > > - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; > > - This->SetIpFilter (This, &IpFilter); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Attempts to complete the PXE Boot Server and/or boot image discovery > > sequence. > > - > > - This function attempts to complete the PXE Boot Server and/or boot > image > > discovery > > - sequence. If this sequence is completed, then EFI_SUCCESS is returned, > > and the > > - PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields > of > > the > > - EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, > then > > the > > - PxeBisReplyReceived and PxeBisReply fields of the > > EFI_PXE_BASE_CODE_MODE structure > > - will also be filled in. If UseBis is FALSE, then PxeBisReplyValid > will be set to > > FALSE. > > - In the structure referenced by parameter Info, the PXE Boot Server > list, > > SrvList[], > > - has two uses: It is the Boot Server IP address list used for unicast > discovery > > - (if the UseUCast field is TRUE), and it is the list used for Boot > Server > > verification > > - (if the MustUseList field is TRUE). Also, if the MustUseList field in > that > > structure > > - is TRUE and the AcceptAnyResponse field in the SrvList[] array is > TRUE, any > > Boot > > - Server reply of that type will be accepted. If the AcceptAnyResponse > field > > is > > - FALSE, only responses from Boot Servers with matching IP addresses > will > > be accepted. > > - This function can take at least 10 seconds to timeout and return > control to > > the > > - caller. If the Discovery sequence does not complete, then EFI_TIMEOUT > > will be > > - returned. Please see the Preboot Execution Environment (PXE) > > Specification for > > - additional details on the implementation of the Discovery sequence. > > - If the Callback Protocol does not return > > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > > - then the Discovery sequence is stopped and EFI_ABORTED will be > returned. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param Type The type of bootstrap to perform. > > - @param Layer Pointer to the boot server layer number > to discover, > > which must be > > - PXE_BOOT_LAYER_INITIAL when a new > server type is being > > - discovered. > > - @param UseBis TRUE if Boot Integrity Services are to > be used. > > FALSE otherwise. > > - @param Info Pointer to a data structure that > contains additional > > information on the > > - type of discovery operation that is to > be performed. > > - > > - @retval EFI_SUCCESS The Discovery sequence has been > completed. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to > > complete Discovery. > > - @retval EFI_ABORTED The callback function aborted the > Discovery > > sequence. > > - @retval EFI_TIMEOUT The Discovery sequence timed out. > > - @retval EFI_ICMP_ERROR An ICMP error packet was received > during > > the PXE discovery > > - session. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcDiscover ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN UINT16 Type, > > - IN UINT16 *Layer, > > - IN BOOLEAN UseBis, > > - IN EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo; > > - EFI_PXE_BASE_CODE_DISCOVER_INFO *CreatedInfo; > > - EFI_PXE_BASE_CODE_SRVLIST *SrvList; > > - EFI_PXE_BASE_CODE_SRVLIST DefaultSrvList; > > - PXEBC_CACHED_DHCP4_PACKET *Packet; > > - PXEBC_VENDOR_OPTION *VendorOpt; > > - UINT16 Index; > > - EFI_STATUS Status; > > - PXEBC_BOOT_SVR_ENTRY *BootSvrEntry; > > - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; > > - > > - if (This == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - BootSvrEntry = NULL; > > - SrvList = NULL; > > - CreatedInfo = NULL; > > - Status = EFI_DEVICE_ERROR; > > - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER; > > - > > - if (!Private->AddressIsOk) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - // > > - // Stop Udp4Read instance > > - // > > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > > - > > - Mode->IcmpErrorReceived = FALSE; > > - > > - // > > - // If layer isn't EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL, > > - // use the previous setting; > > - // If info isn't offered, > > - // use the cached DhcpAck and ProxyOffer packets. > > - // > > - ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO)); > > - if (*Layer != EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL) { > > - > > - if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode- > > >PxeBisReplyReceived && UseBis)) { > > - > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - > > - DefaultInfo.IpCnt = 1; > > - DefaultInfo.UseUCast = TRUE; > > - > > - DefaultSrvList.Type = Type; > > - DefaultSrvList.AcceptAnyResponse = FALSE; > > - DefaultSrvList.IpAddr.Addr[0] = Private->ServerIp.Addr[0]; > > - > > - SrvList = &DefaultSrvList; > > - Info = &DefaultInfo; > > - } else if (Info == NULL) { > > - // > > - // Create info by the cached packet before > > - // > > - Packet = (Mode->ProxyOfferReceived) ? &Private->ProxyOffer : > > &Private->Dhcp4Ack; > > - VendorOpt = &Packet->PxeVendorOption; > > - > > - if (!Mode->DhcpAckReceived || !IS_VALID_DISCOVER_VENDOR_OPTION > > (VendorOpt->BitMap)) { > > - // > > - // Address is not acquired or no discovery options. > > - // > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - > > - DefaultInfo.UseMCast = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER > > (VendorOpt->DiscoverCtrl); > > - DefaultInfo.UseBCast = (BOOLEAN)!IS_DISABLE_BCAST_DISCOVER > > (VendorOpt->DiscoverCtrl); > > - DefaultInfo.MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST > > (VendorOpt->DiscoverCtrl); > > - DefaultInfo.UseUCast = DefaultInfo.MustUseList; > > - > > - if (DefaultInfo.UseMCast) { > > - // > > - // Get the multicast discover ip address from vendor option. > > - // > > - CopyMem ( > > - &DefaultInfo.ServerMCastIp.Addr, > > - &VendorOpt->DiscoverMcastIp, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - } > > - > > - DefaultInfo.IpCnt = 0; > > - Info = &DefaultInfo; > > - SrvList = Info->SrvList; > > - > > - if (DefaultInfo.MustUseList) { > > - BootSvrEntry = VendorOpt->BootSvr; > > - Status = EFI_INVALID_PARAMETER; > > - > > - while (((UINT8) (BootSvrEntry - VendorOpt->BootSvr)) < VendorOpt- > > >BootSvrLen) { > > - > > - if (BootSvrEntry->Type == HTONS (Type)) { > > - Status = EFI_SUCCESS; > > - break; > > - } > > - > > - BootSvrEntry = GET_NEXT_BOOT_SVR_ENTRY (BootSvrEntry); > > - } > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - DefaultInfo.IpCnt = BootSvrEntry->IpCnt; > > - > > - if (DefaultInfo.IpCnt >= 1) { > > - CreatedInfo = AllocatePool (sizeof (DefaultInfo) + > (DefaultInfo.IpCnt - 1) > > * sizeof (*SrvList)); > > - if (CreatedInfo == NULL) { > > - Status = EFI_OUT_OF_RESOURCES; > > - goto ON_EXIT; > > - > > - } > > - > > - CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo)); > > - Info = CreatedInfo; > > - SrvList = Info->SrvList; > > - } > > - > > - for (Index = 0; Index < DefaultInfo.IpCnt; Index++) { > > - CopyMem (&SrvList[Index].IpAddr, &BootSvrEntry->IpAddr[Index], > > sizeof (EFI_IPv4_ADDRESS)); > > - SrvList[Index].AcceptAnyResponse = FALSE; > > - SrvList[Index].Type = BootSvrEntry->Type; > > - } > > - } > > - > > - } else { > > - > > - SrvList = Info->SrvList; > > - > > - if (!SrvList[0].AcceptAnyResponse) { > > - > > - for (Index = 1; Index < Info->IpCnt; Index++) { > > - if (SrvList[Index].AcceptAnyResponse) { > > - break; > > - } > > - } > > - > > - if (Index != Info->IpCnt) { > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - } > > - } > > - > > - if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info- > > >MustUseList && Info->IpCnt == 0)) { > > - > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - // > > - // Execute discover by UniCast/BroadCast/MultiCast > > - // > > - if (Info->UseUCast) { > > - > > - for (Index = 0; Index < Info->IpCnt; Index++) { > > - > > - if (BootSvrEntry == NULL) { > > - Private->ServerIp.Addr[0] = SrvList[Index].IpAddr.Addr[0]; > > - } else { > > - CopyMem ( > > - &Private->ServerIp, > > - &BootSvrEntry->IpAddr[Index], > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - } > > - > > - Status = PxeBcDiscvBootService ( > > - Private, > > - Type, > > - Layer, > > - UseBis, > > - &SrvList[Index].IpAddr, > > - 0, > > - NULL, > > - TRUE, > > - &Private->PxeReply.Packet.Ack > > - ); > > - if (!EFI_ERROR (Status)) { > > - break; > > - } > > - } > > - > > - } else if (Info->UseMCast) { > > - > > - Status = PxeBcDiscvBootService ( > > - Private, > > - Type, > > - Layer, > > - UseBis, > > - &Info->ServerMCastIp, > > - 0, > > - NULL, > > - TRUE, > > - &Private->PxeReply.Packet.Ack > > - ); > > - > > - } else if (Info->UseBCast) { > > - > > - Status = PxeBcDiscvBootService ( > > - Private, > > - Type, > > - Layer, > > - UseBis, > > - NULL, > > - Info->IpCnt, > > - SrvList, > > - TRUE, > > - &Private->PxeReply.Packet.Ack > > - ); > > - } > > - > > - if (EFI_ERROR (Status) || !Mode->PxeReplyReceived || (!Mode- > > >PxeBisReplyReceived && UseBis)) { > > - if (Status == EFI_ICMP_ERROR) { > > - Mode->IcmpErrorReceived = TRUE; > > - } else { > > - Status = EFI_DEVICE_ERROR; > > - } > > - goto ON_EXIT; > > - } else { > > - PxeBcParseCachedDhcpPacket (&Private->PxeReply); > > - } > > - > > - if (Mode->PxeBisReplyReceived) { > > - CopyMem ( > > - &Private->ServerIp, > > - &Mode->PxeReply.Dhcpv4.BootpSiAddr, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - } > > - > > - if (CreatedInfo != NULL) { > > - FreePool (CreatedInfo); > > - } > > - > > -ON_EXIT: > > - > > - Private->Udp4Read->Configure (Private->Udp4Read, &Private- > > >Udp4CfgData); > > - > > - // > > - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with > the IP > > - // receive filter list emptied and the filter set to > > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > > - // > > - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); > > - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; > > - This->SetIpFilter (This, &IpFilter); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Used to perform TFTP and MTFTP services. > > - > > - This function is used to perform TFTP and MTFTP services. This > includes the > > - TFTP operations to get the size of a file, read a directory, read a > file, and > > - write a file. It also includes the MTFTP operations to get the size > of a file, > > - read a directory, and read a file. The type of operation is specified > by > > Operation. > > - If the callback function that is invoked during the TFTP/MTFTP > operation > > does > > - not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then > > EFI_ABORTED will > > - be returned. > > - For read operations, the return data will be placed in the buffer > specified > > by > > - BufferPtr. If BufferSize is too small to contain the entire > downloaded file, > > - then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set > > to zero > > - or the size of the requested file (the size of the requested file is > only > > returned > > - if the TFTP server supports TFTP options). If BufferSize is large > enough for > > the > > - read operation, then BufferSize will be set to the size of the > downloaded > > file, > > - and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() > > services > > - should use the get-file-size operations to determine the size of the > > downloaded > > - file prior to using the read-file operations-especially when > downloading > > large > > - (greater than 64 MB) files-instead of making two calls to the read- > file > > operation. > > - Following this recommendation will save time if the file is larger > than > > expected > > - and the TFTP server does not support TFTP option extensions. Without > > TFTP option > > - extension support, the client has to download the entire file, > counting and > > discarding > > - the received packets, to determine the file size. > > - For write operations, the data to be sent is in the buffer specified > by > > BufferPtr. > > - BufferSize specifies the number of bytes to send. If the write > operation > > completes > > - successfully, then EFI_SUCCESS will be returned. > > - For TFTP "get file size" operations, the size of the requested file > or > > directory > > - is returned in BufferSize, and EFI_SUCCESS will be returned. If the > TFTP > > server > > - does not support options, the file will be downloaded into a bit > bucket and > > the > > - length of the downloaded file will be returned. For MTFTP "get file > size" > > operations, > > - if the MTFTP server does not support the "get file size" option, > > EFI_UNSUPPORTED > > - will be returned. > > - This function can take up to 10 seconds to timeout and return control > to the > > caller. > > - If the TFTP sequence does not complete, EFI_TIMEOUT will be returned. > > - If the Callback Protocol does not return > > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > > - then the TFTP sequence is stopped and EFI_ABORTED will be returned. > > - The format of the data returned from a TFTP read directory operation > is a > > null-terminated > > - filename followed by a null-terminated information string, of the > form > > - "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - > > note that > > - the seconds field can be a decimal number), where the date and time > are > > UTC. For > > - an MTFTP read directory command, there is additionally a null- > terminated > > multicast > > - IP address preceding the filename of the form %d.%d.%d.%d for IP v4. > The > > final > > - entry is itself null-terminated, so that the final information string > is > > terminated > > - with two null octets. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param Operation The type of operation to perform. > > - @param BufferPtr A pointer to the data buffer. > > - @param Overwrite Only used on write file operations. > TRUE if a file > > on a remote server can > > - be overwritten. > > - @param BufferSize For get-file-size operations, > *BufferSize returns > > the size of the > > - requested file. > > - @param BlockSize The requested block size to be used > during a TFTP > > transfer. > > - @param ServerIp The TFTP / MTFTP server IP address. > > - @param Filename A Null-terminated ASCII string that > specifies a > > directory name or a file > > - name. > > - @param Info Pointer to the MTFTP information. > > - @param DontUseBuffer Set to FALSE for normal TFTP and MTFTP > read > > file operation. > > - > > - @retval EFI_SUCCESS The TFTP/MTFTP operation was completed. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval EFI_BUFFER_TOO_SMALL The buffer is not large enough to > > complete the read operation. > > - @retval EFI_ABORTED The callback function aborted the > TFTP/MTFTP > > operation. > > - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. > > - @retval EFI_ICMP_ERROR An ICMP error packet was received > during > > the MTFTP session. > > - @retval EFI_TFTP_ERROR A TFTP error packet was received during > the > > MTFTP session. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcMtftp ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, > > - IN OUT VOID *BufferPtr, > > - IN BOOLEAN Overwrite, > > - IN OUT UINT64 *BufferSize, > > - IN UINTN *BlockSize OPTIONAL, > > - IN EFI_IP_ADDRESS *ServerIp, > > - IN UINT8 *Filename, > > - IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL, > > - IN BOOLEAN DontUseBuffer > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_MTFTP4_CONFIG_DATA Mtftp4Config; > > - EFI_STATUS Status; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_MAC_ADDRESS TempMacAddr; > > - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; > > - > > - if ((This == NULL) > || > > - (Filename == NULL) > || > > - (BufferSize == NULL) > || > > - ((ServerIp == NULL) || > > - (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) || > > - IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0])))) > || > > - ((BufferPtr == NULL) && DontUseBuffer) > || > > - ((BlockSize != NULL) && (*BlockSize < 512))) { > > - > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Status = EFI_DEVICE_ERROR; > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = &Private->Mode; > > - > > - if (!Mode->AutoArp) { > > - // > > - // If AutoArp is set false, check arp cache > > - // > > - UpdateArpCache (This); > > - if (!FindInArpCache (Mode, &ServerIp->v4, &TempMacAddr)) { > > - return EFI_DEVICE_ERROR; > > - } > > - } > > - > > - // > > - // Stop Udp4Read instance > > - // > > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > > - > > - Mode->TftpErrorReceived = FALSE; > > - Mode->IcmpErrorReceived = FALSE; > > - > > - Mtftp4Config.UseDefaultSetting = FALSE; > > - Mtftp4Config.TimeoutValue = PXEBC_MTFTP_TIMEOUT; > > - Mtftp4Config.TryCount = PXEBC_MTFTP_RETRIES; > > - > > - CopyMem ( > > - &Mtftp4Config.StationIp, > > - &Private->StationIp, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - CopyMem ( > > - &Mtftp4Config.SubnetMask, > > - &Private->SubnetMask, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - CopyMem ( > > - &Mtftp4Config.GatewayIp, > > - &Private->GatewayIp, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - CopyMem ( > > - &Mtftp4Config.ServerIp, > > - ServerIp, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - > > - switch (Operation) { > > - > > - case EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE: > > - > > - Status = PxeBcTftpGetFileSize ( > > - Private, > > - &Mtftp4Config, > > - Filename, > > - BlockSize, > > - BufferSize > > - ); > > - > > - break; > > - > > - case EFI_PXE_BASE_CODE_TFTP_READ_FILE: > > - > > - Status = PxeBcTftpReadFile ( > > - Private, > > - &Mtftp4Config, > > - Filename, > > - BlockSize, > > - BufferPtr, > > - BufferSize, > > - DontUseBuffer > > - ); > > - > > - break; > > - > > - case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE: > > - > > - Status = PxeBcTftpWriteFile ( > > - Private, > > - &Mtftp4Config, > > - Filename, > > - Overwrite, > > - BlockSize, > > - BufferPtr, > > - BufferSize > > - ); > > - > > - break; > > - > > - case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY: > > - > > - Status = PxeBcTftpReadDirectory ( > > - Private, > > - &Mtftp4Config, > > - Filename, > > - BlockSize, > > - BufferPtr, > > - BufferSize, > > - DontUseBuffer > > - ); > > - > > - break; > > - > > - case EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE: > > - case EFI_PXE_BASE_CODE_MTFTP_READ_FILE: > > - case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY: > > - Status = EFI_UNSUPPORTED; > > - break; > > - > > - default: > > - > > - Status = EFI_INVALID_PARAMETER; > > - break; > > - } > > - > > - if (Status == EFI_ICMP_ERROR) { > > - Mode->IcmpErrorReceived = TRUE; > > - } > > - > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > -ON_EXIT: > > - Private->Udp4Read->Configure (Private->Udp4Read, &Private- > > >Udp4CfgData); > > - // > > - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with > the IP > > - // receive filter list emptied and the filter set to > > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > > - // > > - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); > > - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; > > - This->SetIpFilter (This, &IpFilter); > > - > > - return Status; > > -} > > - > > - > > -/** > > - Writes a UDP packet to the network interface. > > - > > - This function writes a UDP packet specified by the (optional > HeaderPtr and) > > - BufferPtr parameters to the network interface. The UDP header is > > automatically > > - built by this routine. It uses the parameters OpFlags, DestIp, > DestPort, > > GatewayIp, > > - SrcIp, and SrcPort to build this header. If the packet is > successfully built and > > - transmitted through the network interface, then EFI_SUCCESS will be > > returned. > > - If a timeout occurs during the transmission of the packet, then > > EFI_TIMEOUT will > > - be returned. If an ICMP error occurs during the transmission of the > packet, > > then > > - the IcmpErrorReceived field is set to TRUE, the IcmpError field is > filled in > > and > > - EFI_ICMP_ERROR will be returned. If the Callback Protocol does not > return > > - EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED > > will be returned. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param OpFlags The UDP operation flags. > > - @param DestIp The destination IP address. > > - @param DestPort The destination UDP port number. > > - @param GatewayIp The gateway IP address. > > - @param SrcIp The source IP address. > > - @param SrcPort The source UDP port number. > > - @param HeaderSize An optional field which may be set to > the length > > of a header at > > - HeaderPtr to be prefixed to the data at > BufferPtr. > > - @param HeaderPtr If HeaderSize is not NULL, a pointer to > a header > > to be prefixed to the > > - data at BufferPtr. > > - @param BufferSize A pointer to the size of the data at > BufferPtr. > > - @param BufferPtr A pointer to the data to be written. > > - > > - @retval EFI_SUCCESS The UDP Write operation was completed. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_BAD_BUFFER_SIZE The buffer is too long to be > transmitted. > > - @retval EFI_ABORTED The callback function aborted the UDP > Write > > operation. > > - @retval EFI_TIMEOUT The UDP Write operation timed out. > > - @retval EFI_ICMP_ERROR An ICMP error packet was received > during > > the UDP write session. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcUdpWrite ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN UINT16 OpFlags, > > - IN EFI_IP_ADDRESS *DestIp, > > - IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, > > - IN EFI_IP_ADDRESS *GatewayIp OPTIONAL, > > - IN EFI_IP_ADDRESS *SrcIp OPTIONAL, > > - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, > > - IN UINTN *HeaderSize OPTIONAL, > > - IN VOID *HeaderPtr OPTIONAL, > > - IN UINTN *BufferSize, > > - IN VOID *BufferPtr > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_UDP4_PROTOCOL *Udp4; > > - EFI_UDP4_COMPLETION_TOKEN Token; > > - EFI_UDP4_TRANSMIT_DATA *Udp4TxData; > > - UINT32 FragCount; > > - UINT32 DataLength; > > - EFI_UDP4_SESSION_DATA Udp4Session; > > - EFI_STATUS Status; > > - BOOLEAN IsDone; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_MAC_ADDRESS TempMacAddr; > > - > > - IsDone = FALSE; > > - > > - if ((This == NULL) || (DestIp == NULL) || (DestPort == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if ((GatewayIp != NULL) && (IP4_IS_UNSPECIFIED (NTOHL (GatewayIp- > > >Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (GatewayIp->Addr[0])))) { > > - // > > - // Gateway is provided but it's not a unicast IP address. > > - // > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if ((HeaderSize != NULL) && ((*HeaderSize == 0) || (HeaderPtr == > NULL))) { > > - // > > - // The HeaderSize ptr isn't NULL and: 1. the value is zero; or 2. > the > > HeaderPtr > > - // is NULL. > > - // > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if ((BufferSize == NULL) || ((*BufferSize != 0) && (BufferPtr == > NULL))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Udp4 = Private->Udp4Write; > > - Mode = &Private->Mode; > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - if (!Private->AddressIsOk && (SrcIp == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (!Mode->AutoArp) { > > - // > > - // If AutoArp is set false, check arp cache > > - // > > - UpdateArpCache (This); > > - if (!FindInArpCache (Mode, &DestIp->v4, &TempMacAddr)) { > > - return EFI_DEVICE_ERROR; > > - } > > - } > > - > > - Mode->IcmpErrorReceived = FALSE; > > - > > - if ((Private->CurrentUdpSrcPort == 0) || > > - ((SrcPort != NULL) && (*SrcPort != Private->CurrentUdpSrcPort))) > { > > - // > > - // Port is changed, (re)configure the Udp4Write instance > > - // > > - if (SrcPort != NULL) { > > - Private->CurrentUdpSrcPort = *SrcPort; > > - } > > - } > > - > > - Status = PxeBcConfigureUdpWriteInstance ( > > - Udp4, > > - &Private->StationIp.v4, > > - &Private->SubnetMask.v4, > > - &Private->GatewayIp.v4, > > - &Private->CurrentUdpSrcPort, > > - Private->Mode.TTL, > > - Private->Mode.ToS > > - ); > > - if (EFI_ERROR (Status)) { > > - Private->CurrentUdpSrcPort = 0; > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - ZeroMem (&Token, sizeof (EFI_UDP4_COMPLETION_TOKEN)); > > - ZeroMem (&Udp4Session, sizeof (EFI_UDP4_SESSION_DATA)); > > - > > - CopyMem (&Udp4Session.DestinationAddress, DestIp, sizeof > > (EFI_IPv4_ADDRESS)); > > - Udp4Session.DestinationPort = *DestPort; > > - if (SrcIp != NULL) { > > - CopyMem (&Udp4Session.SourceAddress, SrcIp, sizeof > > (EFI_IPv4_ADDRESS)); > > - } > > - if (SrcPort != NULL) { > > - Udp4Session.SourcePort = *SrcPort; > > - } > > - > > - FragCount = (HeaderSize != NULL) ? 2 : 1; > > - Udp4TxData = (EFI_UDP4_TRANSMIT_DATA *) AllocateZeroPool (sizeof > > (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof > > (EFI_UDP4_FRAGMENT_DATA)); > > - if (Udp4TxData == NULL) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > - Udp4TxData->FragmentCount = FragCount; > > - Udp4TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) > > *BufferSize; > > - Udp4TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr; > > - DataLength = (UINT32) *BufferSize; > > - > > - if (FragCount == 2) { > > - > > - Udp4TxData->FragmentTable[0].FragmentLength = (UINT32) *HeaderSize; > > - Udp4TxData->FragmentTable[0].FragmentBuffer = HeaderPtr; > > - DataLength += (UINT32) *HeaderSize; > > - } > > - > > - if (GatewayIp != NULL) { > > - Udp4TxData->GatewayAddress = (EFI_IPv4_ADDRESS *) GatewayIp; > > - } > > - Udp4TxData->UdpSessionData = &Udp4Session; > > - Udp4TxData->DataLength = DataLength; > > - Token.Packet.TxData = Udp4TxData; > > - > > - Status = gBS->CreateEvent ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - PxeBcCommonNotify, > > - &IsDone, > > - &Token.Event > > - ); > > - if (EFI_ERROR (Status)) { > > - goto ON_EXIT; > > - } > > - > > - Status = Udp4->Transmit (Udp4, &Token); > > - if (EFI_ERROR (Status)) { > > - if (Status == EFI_ICMP_ERROR) { > > - Mode->IcmpErrorReceived = TRUE; > > - } > > - goto ON_EXIT; > > - } > > - > > - while (!IsDone) { > > - > > - Udp4->Poll (Udp4); > > - } > > - > > - Status = Token.Status; > > - > > -ON_EXIT: > > - > > - if (Token.Event != NULL) { > > - gBS->CloseEvent (Token.Event); > > - } > > - > > - FreePool (Udp4TxData); > > - > > - // > > - // Reset the instance. > > - // > > - Udp4->Configure (Udp4, NULL); > > - return Status; > > -} > > - > > -/** > > - Decide whether the incoming UDP packet is acceptable per IP filter > settings > > - in provided PxeBcMode. > > - > > - @param PxeBcMode Pointer to EFI_PXE_BASE_CODE_MODE. > > - @param Session Received UDP session. > > - > > - @retval TRUE The UDP package matches IP filters. > > - @retval FALSE The UDP package doesn't matches IP filters. > > - > > -**/ > > -BOOLEAN > > -CheckIpByFilter ( > > - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, > > - IN EFI_UDP4_SESSION_DATA *Session > > - ) > > -{ > > - UINTN Index; > > - EFI_IPv4_ADDRESS Ip4Address; > > - EFI_IPv4_ADDRESS DestIp4Address; > > - > > - if ((PxeBcMode->IpFilter.Filters & > > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) { > > - return TRUE; > > - } > > - > > - CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof > > (DestIp4Address)); > > - if (((PxeBcMode->IpFilter.Filters & > > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) && > > - IP4_IS_MULTICAST (EFI_NTOHL (DestIp4Address)) > > - ) { > > - return TRUE; > > - } > > - > > - if (((PxeBcMode->IpFilter.Filters & > > EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) && > > - IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address)) > > - ) { > > - return TRUE; > > - } > > - > > - CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address)); > > - if (((PxeBcMode->IpFilter.Filters & > > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) && > > - EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address) > > - ) { > > - return TRUE; > > - } > > - > > - ASSERT (PxeBcMode->IpFilter.IpCnt < EFI_PXE_BASE_CODE_MAX_IPCNT); > > - > > - for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; Index++) { > > - CopyMem ( > > - &Ip4Address, > > - &PxeBcMode->IpFilter.IpList[Index].v4, > > - sizeof (Ip4Address) > > - ); > > - if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) { > > - return TRUE; > > - } > > - } > > - > > - return FALSE; > > -} > > - > > -/** > > - Reads a UDP packet from the network interface. > > - > > - This function reads a UDP packet from a network interface. The data > > contents > > - are returned in (the optional HeaderPtr and) BufferPtr, and the size > of the > > - buffer received is returned in BufferSize . If the input BufferSize > is smaller > > - than the UDP packet received (less optional HeaderSize), it will be > set to > > the > > - required size, and EFI_BUFFER_TOO_SMALL will be returned. In this > case, > > the > > - contents of BufferPtr are undefined, and the packet is lost. If a UDP > packet > > is > > - successfully received, then EFI_SUCCESS will be returned, and the > > information > > - from the UDP header will be returned in DestIp, DestPort, SrcIp, and > > SrcPort if > > - they are not NULL. Depending on the values of OpFlags and the DestIp, > > DestPort, > > - SrcIp, and SrcPort input values, different types of UDP packet > receive > > filtering > > - will be performed. The following tables summarize these receive > filter > > operations. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param OpFlags The UDP operation flags. > > - @param DestIp The destination IP address. > > - @param DestPort The destination UDP port number. > > - @param SrcIp The source IP address. > > - @param SrcPort The source UDP port number. > > - @param HeaderSize An optional field which may be set to > the length > > of a header at > > - HeaderPtr to be prefixed to the data at > BufferPtr. > > - @param HeaderPtr If HeaderSize is not NULL, a pointer to > a header > > to be prefixed to the > > - data at BufferPtr. > > - @param BufferSize A pointer to the size of the data at > BufferPtr. > > - @param BufferPtr A pointer to the data to be read. > > - > > - @retval EFI_SUCCESS The UDP Read operation was completed. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval EFI_BUFFER_TOO_SMALL The packet is larger than Buffer can > hold. > > - @retval EFI_ABORTED The callback function aborted the UDP > Read > > operation. > > - @retval EFI_TIMEOUT The UDP Read operation timed out. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcUdpRead ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN UINT16 OpFlags, > > - IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, > > - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, > > - IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, > > - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, > > - IN UINTN *HeaderSize OPTIONAL, > > - IN VOID *HeaderPtr OPTIONAL, > > - IN OUT UINTN *BufferSize, > > - IN VOID *BufferPtr > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_UDP4_PROTOCOL *Udp4; > > - EFI_UDP4_COMPLETION_TOKEN Token; > > - EFI_UDP4_RECEIVE_DATA *RxData; > > - EFI_UDP4_SESSION_DATA *Session; > > - EFI_STATUS Status; > > - BOOLEAN IsDone; > > - BOOLEAN Matched; > > - UINTN CopiedLen; > > - UINTN HeaderLen; > > - UINTN HeaderCopiedLen; > > - UINTN BufferCopiedLen; > > - UINT32 FragmentLength; > > - UINTN FragmentIndex; > > - UINT8 *FragmentBuffer; > > - > > - if (This == NULL || DestIp == NULL || DestPort == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == > > 0 && (DestPort == NULL)) || > > - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == > > 0 && (SrcIp == NULL)) || > > - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) == 0 > > && (SrcPort == NULL))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (((HeaderSize != NULL) && (*HeaderSize == 0)) || ((HeaderSize != > NULL) > > && (HeaderPtr == NULL))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if ((BufferSize == NULL) || (BufferPtr == NULL)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - Udp4 = Private->Udp4Read; > > - > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - Mode->IcmpErrorReceived = FALSE; > > - > > - Status = gBS->CreateEvent ( > > - EVT_NOTIFY_SIGNAL, > > - TPL_NOTIFY, > > - PxeBcCommonNotify, > > - &IsDone, > > - &Token.Event > > - ); > > - if (EFI_ERROR (Status)) { > > - return EFI_OUT_OF_RESOURCES; > > - } > > - > > -TRY_AGAIN: > > - > > - IsDone = FALSE; > > - Status = Udp4->Receive (Udp4, &Token); > > - if (EFI_ERROR (Status)) { > > - if (Status == EFI_ICMP_ERROR) { > > - Mode->IcmpErrorReceived = TRUE; > > - } > > - goto ON_EXIT; > > - } > > - > > - Udp4->Poll (Udp4); > > - > > - if (!IsDone) { > > - Status = EFI_TIMEOUT; > > - } else { > > - > > - // > > - // check whether this packet matches the filters > > - // > > - if (EFI_ERROR (Token.Status)){ > > - goto ON_EXIT; > > - } > > - > > - RxData = Token.Packet.RxData; > > - Session = &RxData->UdpSession; > > - > > - Matched = TRUE; > > - > > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) { > > - Matched = FALSE; > > - // > > - // Check UDP package by IP filter settings > > - // > > - if (CheckIpByFilter (Mode, Session)) { > > - Matched = TRUE; > > - } > > - } > > - > > - if (Matched) { > > - Matched = FALSE; > > - > > - // > > - // Match the destination ip of the received udp dgram > > - // > > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) > > { > > - Matched = TRUE; > > - > > - if (DestIp != NULL) { > > - CopyMem (DestIp, &Session->DestinationAddress, sizeof > > (EFI_IPv4_ADDRESS)); > > - } > > - } else { > > - if (DestIp != NULL) { > > - if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) { > > - Matched = TRUE; > > - } > > - } else { > > - if (EFI_IP4_EQUAL (&Private->StationIp, &Session- > > >DestinationAddress)) { > > - Matched = TRUE; > > - } > > - } > > - } > > - } > > - > > - if (Matched) { > > - // > > - // Match the destination port of the received udp dgram > > - // > > - if ((OpFlags & > > EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0) { > > - > > - if (DestPort != NULL) { > > - *DestPort = Session->DestinationPort; > > - } > > - } else { > > - > > - if (*DestPort != Session->DestinationPort) { > > - Matched = FALSE; > > - } > > - } > > - } > > - > > - if (Matched) { > > - // > > - // Match the source ip of the received udp dgram > > - // > > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) { > > - > > - if (SrcIp != NULL) { > > - CopyMem (SrcIp, &Session->SourceAddress, sizeof > > (EFI_IPv4_ADDRESS)); > > - } > > - } else { > > - > > - if (!EFI_IP4_EQUAL (SrcIp, &Session->SourceAddress)) { > > - Matched = FALSE; > > - } > > - } > > - } > > - > > - if (Matched) { > > - // > > - // Match the source port of the received udp dgram > > - // > > - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != > > 0) { > > - > > - if (SrcPort != NULL) { > > - *SrcPort = Session->SourcePort; > > - } > > - } else { > > - > > - if (*SrcPort != Session->SourcePort) { > > - Matched = FALSE; > > - } > > - } > > - } > > - > > - if (Matched) { > > - ASSERT (RxData != NULL); > > - > > - HeaderLen = 0; > > - if (HeaderSize != NULL) { > > - HeaderLen = MIN (*HeaderSize, RxData->DataLength); > > - } > > - > > - if (RxData->DataLength - HeaderLen > *BufferSize) { > > - Status = EFI_BUFFER_TOO_SMALL; > > - } else { > > - *HeaderSize = HeaderLen; > > - *BufferSize = RxData->DataLength - HeaderLen; > > - > > - HeaderCopiedLen = 0; > > - BufferCopiedLen = 0; > > - for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; > > FragmentIndex++) { > > - FragmentLength = RxData- > > >FragmentTable[FragmentIndex].FragmentLength; > > - FragmentBuffer = RxData- > > >FragmentTable[FragmentIndex].FragmentBuffer; > > - if (HeaderCopiedLen + FragmentLength < HeaderLen) { > > - // > > - // Copy the header part of received data. > > - // > > - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, > FragmentBuffer, > > FragmentLength); > > - HeaderCopiedLen += FragmentLength; > > - } else if (HeaderCopiedLen < HeaderLen) { > > - // > > - // Copy the header part of received data. > > - // > > - CopiedLen = HeaderLen - HeaderCopiedLen; > > - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, > FragmentBuffer, > > CopiedLen); > > - HeaderCopiedLen += CopiedLen; > > - > > - // > > - // Copy the other part of received data. > > - // > > - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, > FragmentBuffer + > > CopiedLen, FragmentLength - CopiedLen); > > - BufferCopiedLen += (FragmentLength - CopiedLen); > > - } else { > > - // > > - // Copy the other part of received data. > > - // > > - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, > FragmentBuffer, > > FragmentLength); > > - BufferCopiedLen += FragmentLength; > > - } > > - } > > - } > > - } else { > > - > > - Status = EFI_TIMEOUT; > > - } > > - > > - // > > - // Recycle the RxData > > - // > > - gBS->SignalEvent (RxData->RecycleSignal); > > - > > - if (!Matched) { > > - goto TRY_AGAIN; > > - } > > - } > > - > > -ON_EXIT: > > - > > - Udp4->Cancel (Udp4, &Token); > > - > > - gBS->CloseEvent (Token.Event); > > - > > - return Status; > > -} > > - > > -/** > > - Updates the IP receive filters of a network device and enables > software > > filtering. > > - > > - The NewFilter field is used to modify the network device's current IP > > receive > > - filter settings and to enable a software filter. This function > updates the > > IpFilter > > - field of the EFI_PXE_BASE_CODE_MODE structure with the contents of > > NewIpFilter. > > - The software filter is used when the USE_FILTER in OpFlags is set to > > UdpRead(). > > - The current hardware filter remains in effect no matter what the > settings > > of OpFlags > > - are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() > is > > from those > > - packets whose reception is enabled in hardware-physical NIC address > > (unicast), > > - broadcast address, logical address or addresses (multicast), or all > > (promiscuous). > > - UdpRead() does not modify the IP filter settings. > > - Dhcp(), Discover(), and Mtftp() set the IP filter, and return with > the IP > > receive > > - filter list emptied and the filter set to > > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. > > - If an application or driver wishes to preserve the IP receive filter > settings, > > - it will have to preserve the IP receive filter settings before these > calls, and > > - use SetIpFilter() to restore them after the calls. If incompatible > filtering is > > - requested (for example, PROMISCUOUS with anything else) or if the > > device does not > > - support a requested filter setting and it cannot be accommodated in > > software > > - (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER > > will be returned. > > - The IPlist field is used to enable IPs other than the StationIP. They > may be > > - multicast or unicast. If IPcnt is set as well as > > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP, > > - then both the StationIP and the IPs from the IPlist will be used. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param NewFilter Pointer to the new set of IP receive > filters. > > - > > - @retval EFI_SUCCESS The IP receive filter settings were > updated. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcSetIpFilter ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter > > - ) > > -{ > > - EFI_STATUS Status; > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - UINTN Index; > > - EFI_UDP4_CONFIG_DATA *Udp4Cfg; > > - BOOLEAN PromiscuousNeed; > > - BOOLEAN AcceptPromiscuous; > > - BOOLEAN AcceptBroadcast; > > - BOOLEAN MultiCastUpdate; > > - > > - if (This == NULL) { > > - DEBUG ((EFI_D_ERROR, "This == NULL.\n")); > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - if (NewFilter == NULL) { > > - DEBUG ((EFI_D_ERROR, "NewFilter == NULL.\n")); > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (NewFilter->IpCnt > EFI_PXE_BASE_CODE_MAX_IPCNT) { > > - DEBUG ((EFI_D_ERROR, "NewFilter->IpCnt > %d.\n", > > EFI_PXE_BASE_CODE_MAX_IPCNT)); > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (!Mode->Started) { > > - DEBUG ((EFI_D_ERROR, "BC was not started.\n")); > > - return EFI_NOT_STARTED; > > - } > > - > > - if (Mode->UsingIpv6) { > > - DEBUG ((EFI_D_ERROR, "This driver is PXE for IPv4 Only.\n")); > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - PromiscuousNeed = FALSE; > > - > > - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { > > - if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) > { > > - // > > - // The IP is a broadcast address. > > - // > > - DEBUG ((EFI_D_ERROR, "There is broadcast address in > NewFilter.\n")); > > - return EFI_INVALID_PARAMETER; > > - } > > - if ((EFI_NTOHL(Mode->StationIp) != 0) && > > - (EFI_NTOHL(Mode->SubnetMask) != 0) && > > - IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter- > > >IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) && > > - NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), > > EFI_NTOHL(Mode->SubnetMask)) && > > - ((NewFilter->Filters & > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != > > 0)) { > > - // > > - // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 > address > > is in IpList, > > - // promiscuous mode is needed. > > - // > > - PromiscuousNeed = TRUE; > > - } > > - } > > - > > - AcceptPromiscuous = FALSE; > > - AcceptBroadcast = FALSE; > > - MultiCastUpdate = FALSE; > > - > > - if (PromiscuousNeed || > > - ((NewFilter->Filters & > > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) || > > - ((NewFilter->Filters & > > EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) > > - ) { > > - // > > - // Configure the udp4 filter to receive all packages. > > - // > > - AcceptPromiscuous = TRUE; > > - } else if ((NewFilter->Filters & > > EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) { > > - // > > - // Configure the udp4 filter to receive all broadcast packages. > > - // > > - AcceptBroadcast = TRUE; > > - } > > - > > - // > > - // In multicast condition when Promiscuous FALSE and IpCnt no-zero. > > - // Here check if there is any update of the multicast ip address. If > yes, > > - // we need leave the old multicast group (by Config UDP instance to > NULL), > > - // and join the new multicast group. > > - // > > - if (!AcceptPromiscuous) { > > - if ((NewFilter->Filters & > EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != > > 0) { > > - if (Mode->IpFilter.IpCnt != NewFilter->IpCnt) { > > - MultiCastUpdate = TRUE; > > - } else if (CompareMem (Mode->IpFilter.IpList, NewFilter->IpList, > > NewFilter->IpCnt * sizeof (EFI_IP_ADDRESS)) != 0 ) { > > - MultiCastUpdate = TRUE; > > - } > > - } > > - } > > - > > - // > > - // Check whether we need reconfigure the UDP instance. > > - // > > - Udp4Cfg = &Private->Udp4CfgData; > > - if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous) || > > - (AcceptBroadcast != Udp4Cfg->AcceptBroadcast) || > MultiCastUpdate) > > { > > - // > > - // Clear the UDP instance configuration, all joined groups will be > left > > - // during the operation. > > - // > > - Private->Udp4Read->Configure (Private->Udp4Read, NULL); > > - > > - // > > - // Configure the UDP instance with the new configuration. > > - // > > - Udp4Cfg->AcceptPromiscuous = AcceptPromiscuous; > > - Udp4Cfg->AcceptBroadcast = AcceptBroadcast; > > - Status = Private->Udp4Read->Configure (Private->Udp4Read, Udp4Cfg); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // In not Promiscuous mode, need to join the new multicast group. > > - // > > - if (!AcceptPromiscuous) { > > - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { > > - if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) > { > > - // > > - // Join the mutilcast group. > > - // > > - Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE, > > &NewFilter->IpList[Index].v4); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - } > > - } > > - } > > - } > > - > > - > > - // > > - // Save the new filter. > > - // > > - CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter)); > > - > > - return EFI_SUCCESS; > > -} > > - > > - > > -/** > > - Uses the ARP protocol to resolve a MAC address. > > - > > - This function uses the ARP protocol to resolve a MAC address. The > > UsingIpv6 field > > - of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 > > or IPv6 > > - addresses are being used. The IP address specified by IpAddr is used > to > > resolve > > - a MAC address. If the ARP protocol succeeds in resolving the > specified > > address, > > - then the ArpCacheEntries and ArpCache fields of the > > EFI_PXE_BASE_CODE_MODE structure > > - are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the > > resolved > > - MAC address is placed there as well. If the PXE Base Code protocol > is in the > > - stopped state, then EFI_NOT_STARTED is returned. If the ARP protocol > > encounters > > - a timeout condition while attempting to resolve an address, then > > EFI_TIMEOUT is > > - returned. If the Callback Protocol does not return > > EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, > > - then EFI_ABORTED is returned. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param IpAddr Pointer to the IP address that is used > to resolve a > > MAC address. > > - @param MacAddr If not NULL, a pointer to the MAC > address that > > was resolved with the > > - ARP protocol. > > - > > - @retval EFI_SUCCESS The IP or MAC address was resolved. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval EFI_ICMP_ERROR Something error occur with the ICMP > packet > > message. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcArp ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL * This, > > - IN EFI_IP_ADDRESS * IpAddr, > > - IN EFI_MAC_ADDRESS * MacAddr OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_STATUS Status; > > - EFI_MAC_ADDRESS TempMacAddr; > > - > > - if (This == NULL || IpAddr == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - if (!Private->AddressIsOk || Mode->UsingIpv6) { > > - // > > - // We can't resolve the IP address if we don't have a local address > now. > > - // Don't have ARP for IPv6. > > - // > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Mode->IcmpErrorReceived = FALSE; > > - > > - if (!Mode->AutoArp) { > > - // > > - // If AutoArp is set false, check arp cache > > - // > > - UpdateArpCache (This); > > - if (!FindInArpCache (Mode, &IpAddr->v4, &TempMacAddr)) { > > - return EFI_DEVICE_ERROR; > > - } > > - } else { > > - Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL, > > &TempMacAddr); > > - if (EFI_ERROR (Status)) { > > - if (Status == EFI_ICMP_ERROR) { > > - Mode->IcmpErrorReceived = TRUE; > > - } > > - return Status; > > - } > > - } > > - > > - if (MacAddr != NULL) { > > - CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS)); > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Updates the parameters that affect the operation of the PXE Base Code > > Protocol. > > - > > - This function sets parameters that affect the operation of the PXE > Base > > Code Protocol. > > - The parameter specified by NewAutoArp is used to control the > generation > > of ARP > > - protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets > will be > > generated > > - as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, > then > > no ARP > > - Protocol packets will be generated. In this case, the only mappings > that are > > - available are those stored in the ArpCache of the > > EFI_PXE_BASE_CODE_MODE structure. > > - If there are not enough mappings in the ArpCache to perform a PXE > Base > > Code Protocol > > - service, then the service will fail. This function updates the > AutoArp field of > > - the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp. > > - The SetParameters() call must be invoked after a Callback Protocol is > > installed > > - to enable the use of callbacks. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param NewAutoArp If not NULL, a pointer to a value that > specifies > > whether to replace the > > - current value of AutoARP. > > - @param NewSendGUID If not NULL, a pointer to a value that > > specifies whether to replace the > > - current value of SendGUID. > > - @param NewTTL If not NULL, a pointer to be used in > place of the > > current value of TTL, > > - the "time to live" field of the IP > header. > > - @param NewToS If not NULL, a pointer to be used in > place of the > > current value of ToS, > > - the "type of service" field of the IP > header. > > - @param NewMakeCallback If not NULL, a pointer to a value that > > specifies whether to replace the > > - current value of the MakeCallback field > of the Mode > > structure. > > - > > - @retval EFI_SUCCESS The new parameters values were updated. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcSetParameters ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL *This, > > - IN BOOLEAN *NewAutoArp OPTIONAL, > > - IN BOOLEAN *NewSendGUID OPTIONAL, > > - IN UINT8 *NewTTL OPTIONAL, > > - IN UINT8 *NewToS OPTIONAL, > > - IN BOOLEAN *NewMakeCallback // OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_STATUS Status; > > - > > - Status = EFI_SUCCESS; > > - > > - if (This == NULL) { > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - if (NewSendGUID != NULL && *NewSendGUID) { > > - // > > - // FixMe, cann't locate SendGuid > > - // > > - } > > - > > - if (NewMakeCallback != NULL && *NewMakeCallback) { > > - > > - Status = gBS->HandleProtocol ( > > - Private->Controller, > > - &gEfiPxeBaseCodeCallbackProtocolGuid, > > - (VOID **) &Private->PxeBcCallback > > - ); > > - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == > NULL)) { > > - > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - } > > - > > - if (!Mode->Started) { > > - Status = EFI_NOT_STARTED; > > - goto ON_EXIT; > > - } > > - > > - if (NewMakeCallback != NULL) { > > - > > - if (*NewMakeCallback) { > > - // > > - // Update the Callback protocol. > > - // > > - Status = gBS->HandleProtocol ( > > - Private->Controller, > > - &gEfiPxeBaseCodeCallbackProtocolGuid, > > - (VOID **) &Private->PxeBcCallback > > - ); > > - > > - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == > NULL)) { > > - Status = EFI_INVALID_PARAMETER; > > - goto ON_EXIT; > > - } > > - } else { > > - Private->PxeBcCallback = NULL; > > - } > > - > > - Mode->MakeCallbacks = *NewMakeCallback; > > - } > > - > > - if (NewAutoArp != NULL) { > > - Mode->AutoArp = *NewAutoArp; > > - } > > - > > - if (NewSendGUID != NULL) { > > - Mode->SendGUID = *NewSendGUID; > > - } > > - > > - if (NewTTL != NULL) { > > - Mode->TTL = *NewTTL; > > - } > > - > > - if (NewToS != NULL) { > > - Mode->ToS = *NewToS; > > - } > > - > > -ON_EXIT: > > - return Status; > > -} > > - > > -/** > > - Updates the station IP address and/or subnet mask values of a network > > device. > > - > > - This function updates the station IP address and/or subnet mask > values of > > a network > > - device. The NewStationIp field is used to modify the network device's > > current IP address. > > - If NewStationIP is NULL, then the current IP address will not be > modified. > > Otherwise, > > - this function updates the StationIp field of the > > EFI_PXE_BASE_CODE_MODE structure > > - with NewStationIp. The NewSubnetMask field is used to modify the > > network device's current subnet > > - mask. If NewSubnetMask is NULL, then the current subnet mask will not > be > > modified. > > - Otherwise, this function updates the SubnetMask field of the > > EFI_PXE_BASE_CODE_MODE > > - structure with NewSubnetMask. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param NewStationIp Pointer to the new IP address to be > used by > > the network device. > > - @param NewSubnetMask Pointer to the new subnet mask to be > used > > by the network device. > > - > > - @retval EFI_SUCCESS The new station IP address and/or > subnet mask > > were updated. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcSetStationIP ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL * This, > > - IN EFI_IP_ADDRESS * NewStationIp OPTIONAL, > > - IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_ARP_CONFIG_DATA ArpConfigData; > > - > > - if (This == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL > > (NewSubnetMask->Addr[0]))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - if (NewStationIp != NULL) { > > - if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) || > > - IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) || > > - (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0 > > && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL > > (NewSubnetMask->Addr[0])))) { > > - return EFI_INVALID_PARAMETER; > > - } > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - if (NewStationIp != NULL) { > > - CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS)); > > - CopyMem (&Private->StationIp, NewStationIp, sizeof > (EFI_IP_ADDRESS)); > > - } > > - > > - if (NewSubnetMask != NULL) { > > - CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof > > (EFI_IP_ADDRESS)); > > - CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof > > (EFI_IP_ADDRESS)); > > - } > > - > > - Private->AddressIsOk = TRUE; > > - > > - if (!Mode->UsingIpv6) { > > - // > > - // If in IPv4 mode, configure the corresponding ARP with this new > > - // station IP address. > > - // > > - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); > > - > > - ArpConfigData.SwAddressType = 0x0800; > > - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); > > - ArpConfigData.StationAddress = &Private->StationIp.v4; > > - > > - Private->Arp->Configure (Private->Arp, NULL); > > - Private->Arp->Configure (Private->Arp, &ArpConfigData); > > - > > - // > > - // Update the route table. > > - // > > - Mode->RouteTableEntries = 1; > > - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] > & > > Private->SubnetMask.Addr[0]; > > - Mode->RouteTable[0].SubnetMask.Addr[0] = Private- > > >SubnetMask.Addr[0]; > > - Mode->RouteTable[0].GwAddr.Addr[0] = 0; > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -/** > > - Updates the contents of the cached DHCP and Discover packets. > > - > > - The pointers to the new packets are used to update the contents of > the > > cached > > - packets in the EFI_PXE_BASE_CODE_MODE structure. > > - > > - @param This Pointer to the > EFI_PXE_BASE_CODE_PROTOCOL > > instance. > > - @param NewDhcpDiscoverValid Pointer to a value that will replace > the > > current > > - DhcpDiscoverValid field. > > - @param NewDhcpAckReceived Pointer to a value that will replace > the > > current > > - DhcpAckReceived field. > > - @param NewProxyOfferReceived Pointer to a value that will replace > the > > current > > - ProxyOfferReceived field. > > - @param NewPxeDiscoverValid Pointer to a value that will replace > the > > current > > - ProxyOfferReceived field. > > - @param NewPxeReplyReceived Pointer to a value that will replace > the > > current > > - PxeReplyReceived field. > > - @param NewPxeBisReplyReceived Pointer to a value that will replace > the > > current > > - PxeBisReplyReceived field. > > - @param NewDhcpDiscover Pointer to the new cached DHCP > Discover > > packet contents. > > - @param NewDhcpAck Pointer to the new cached DHCP Ack > packet > > contents. > > - @param NewProxyOffer Pointer to the new cached Proxy Offer > > packet contents. > > - @param NewPxeDiscover Pointer to the new cached PXE Discover > > packet contents. > > - @param NewPxeReply Pointer to the new cached PXE Reply > packet > > contents. > > - @param NewPxeBisReply Pointer to the new cached PXE BIS > Reply > > packet contents. > > - > > - @retval EFI_SUCCESS The cached packet contents were > updated. > > - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the > > stopped state. > > - @retval EFI_INVALID_PARAMETER This is NULL or not point to a valid > > EFI_PXE_BASE_CODE_PROTOCOL structure. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeBcSetPackets ( > > - IN EFI_PXE_BASE_CODE_PROTOCOL * This, > > - IN BOOLEAN * NewDhcpDiscoverValid OPTIONAL, > > - IN BOOLEAN * NewDhcpAckReceived OPTIONAL, > > - IN BOOLEAN * NewProxyOfferReceived OPTIONAL, > > - IN BOOLEAN * NewPxeDiscoverValid OPTIONAL, > > - IN BOOLEAN * NewPxeReplyReceived OPTIONAL, > > - IN BOOLEAN * NewPxeBisReplyReceived OPTIONAL, > > - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover OPTIONAL, > > - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck OPTIONAL, > > - IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer OPTIONAL, > > - IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover OPTIONAL, > > - IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply OPTIONAL, > > - IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - > > - if (This == NULL) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); > > - Mode = Private->PxeBc.Mode; > > - > > - if (!Mode->Started) { > > - return EFI_NOT_STARTED; > > - } > > - > > - if (NewDhcpDiscoverValid != NULL) { > > - Mode->DhcpDiscoverValid = *NewDhcpDiscoverValid; > > - } > > - > > - if (NewDhcpAckReceived != NULL) { > > - Mode->DhcpAckReceived = *NewDhcpAckReceived; > > - } > > - > > - if (NewProxyOfferReceived != NULL) { > > - Mode->ProxyOfferReceived = *NewProxyOfferReceived; > > - } > > - > > - if (NewPxeDiscoverValid != NULL) { > > - Mode->PxeDiscoverValid = *NewPxeDiscoverValid; > > - } > > - > > - if (NewPxeReplyReceived != NULL) { > > - Mode->PxeReplyReceived = *NewPxeReplyReceived; > > - } > > - > > - if (NewPxeBisReplyReceived != NULL) { > > - Mode->PxeBisReplyReceived = *NewPxeBisReplyReceived; > > - } > > - > > - if (NewDhcpDiscover != NULL) { > > - CopyMem (&Mode->DhcpDiscover, NewDhcpDiscover, sizeof > > (EFI_PXE_BASE_CODE_PACKET)); > > - } > > - > > - if (NewDhcpAck != NULL) { > > - CopyMem (&Mode->DhcpAck, NewDhcpAck, sizeof > > (EFI_PXE_BASE_CODE_PACKET)); > > - } > > - > > - if (NewProxyOffer != NULL) { > > - CopyMem (&Mode->ProxyOffer, NewProxyOffer, sizeof > > (EFI_PXE_BASE_CODE_PACKET)); > > - } > > - > > - if (NewPxeDiscover != NULL) { > > - CopyMem (&Mode->PxeDiscover, NewPxeDiscover, sizeof > > (EFI_PXE_BASE_CODE_PACKET)); > > - } > > - > > - if (NewPxeReply != NULL) { > > - CopyMem (&Mode->PxeReply, NewPxeReply, sizeof > > (EFI_PXE_BASE_CODE_PACKET)); > > - } > > - > > - if (NewPxeBisReply != NULL) { > > - CopyMem (&Mode->PxeBisReply, NewPxeBisReply, sizeof > > (EFI_PXE_BASE_CODE_PACKET)); > > - } > > - > > - return EFI_SUCCESS; > > -} > > - > > -EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate = { > > - EFI_PXE_BASE_CODE_PROTOCOL_REVISION, > > - EfiPxeBcStart, > > - EfiPxeBcStop, > > - EfiPxeBcDhcp, > > - EfiPxeBcDiscover, > > - EfiPxeBcMtftp, > > - EfiPxeBcUdpWrite, > > - EfiPxeBcUdpRead, > > - EfiPxeBcSetIpFilter, > > - EfiPxeBcArp, > > - EfiPxeBcSetParameters, > > - EfiPxeBcSetStationIP, > > - EfiPxeBcSetPackets, > > - NULL > > -}; > > - > > -/** > > - Callback function that is invoked when the PXE Base Code Protocol is > about > > to transmit, has > > - received, or is waiting to receive a packet. > > - > > - This function is invoked when the PXE Base Code Protocol is about to > > transmit, has received, > > - or is waiting to receive a packet. Parameters Function and Received > specify > > the type of event. > > - Parameters PacketLen and Packet specify the packet that generated the > > event. If these fields > > - are zero and NULL respectively, then this is a status update callback. > If the > > operation specified > > - by Function is to continue, then CALLBACK_STATUS_CONTINUE should be > > returned. If the operation > > - specified by Function should be aborted, then CALLBACK_STATUS_ABORT > > should be returned. Due to > > - the polling nature of UEFI device drivers, a callback function should > not > > execute for more than 5 ms. > > - The SetParameters() function must be called after a Callback Protocol > is > > installed to enable the > > - use of callbacks. > > - > > - @param This Pointer to the > > EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL instance. > > - @param Function The PXE Base Code Protocol function > that is > > waiting for an event. > > - @param Received TRUE if the callback is being invoked > due to a > > receive event. FALSE if > > - the callback is being invoked due to a > transmit event. > > - @param PacketLength The length, in bytes, of Packet. This > field will > > have a value of zero if > > - this is a wait for receive event. > > - @param PacketPtr If Received is TRUE, a pointer to the > packet that > > was just received; > > - otherwise a pointer to the packet that > is about to be > > transmitted. > > - > > - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE if Function > > specifies a continue operation > > - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT if Function > > specifies an abort operation > > - > > -**/ > > -EFI_PXE_BASE_CODE_CALLBACK_STATUS > > -EFIAPI > > -EfiPxeLoadFileCallback ( > > - IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL * This, > > - IN EFI_PXE_BASE_CODE_FUNCTION Function, > > - IN BOOLEAN Received, > > - IN UINT32 PacketLength, > > - IN EFI_PXE_BASE_CODE_PACKET * PacketPtr OPTIONAL > > - ) > > -{ > > - EFI_INPUT_KEY Key; > > - EFI_STATUS Status; > > - > > - // > > - // Catch Ctrl-C or ESC to abort. > > - // > > - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); > > - > > - if (!EFI_ERROR (Status)) { > > - > > - if (Key.ScanCode == SCAN_ESC || Key.UnicodeChar == (0x1F & 'c')) { > > - > > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT; > > - } > > - } > > - // > > - // No print if receive packet > > - // > > - if (Received) { > > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > > - } > > - // > > - // Print only for three functions > > - // > > - switch (Function) { > > - > > - case EFI_PXE_BASE_CODE_FUNCTION_MTFTP: > > - // > > - // Print only for open MTFTP packets, not every MTFTP packets > > - // > > - if (PacketLength != 0 && PacketPtr != NULL) { > > - if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) > { > > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > > - } > > - } > > - break; > > - > > - case EFI_PXE_BASE_CODE_FUNCTION_DHCP: > > - case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER: > > - break; > > - > > - default: > > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > > - } > > - > > - if (PacketLength != 0 && PacketPtr != NULL) { > > - // > > - // Print '.' when transmit a packet > > - // > > - AsciiPrint ("."); > > - > > - } > > - > > - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; > > -} > > - > > -EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL mPxeBcCallBackTemplate = { > > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION, > > - EfiPxeLoadFileCallback > > -}; > > - > > - > > -/** > > - Find the boot file. > > - > > - @param Private Pointer to PxeBc private data. > > - @param BufferSize Pointer to buffer size. > > - @param Buffer Pointer to buffer. > > - > > - @retval EFI_SUCCESS Discover the boot file successfully. > > - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. > > - @retval EFI_ABORTED PXE bootstrap server, so local boot need > abort. > > - @retval EFI_BUFFER_TOO_SMALL The buffer is too small to load the boot > > file. > > - > > -**/ > > -EFI_STATUS > > -DiscoverBootFile ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN OUT UINT64 *BufferSize, > > - IN VOID *Buffer > > - ) > > -{ > > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > > - EFI_PXE_BASE_CODE_MODE *Mode; > > - EFI_STATUS Status; > > - UINT16 Type; > > - UINT16 Layer; > > - BOOLEAN UseBis; > > - PXEBC_CACHED_DHCP4_PACKET *Packet; > > - UINT16 Value; > > - > > - PxeBc = &Private->PxeBc; > > - Mode = PxeBc->Mode; > > - Type = EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP; > > - Layer = EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL; > > - > > - // > > - // do DHCP. > > - // > > - Status = PxeBc->Dhcp (PxeBc, TRUE); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - > > - // > > - // Select a boot server > > - // > > - Status = PxeBcSelectBootPrompt (Private); > > - > > - if (Status == EFI_SUCCESS) { > > - Status = PxeBcSelectBootMenu (Private, &Type, TRUE); > > - } else if (Status == EFI_TIMEOUT) { > > - Status = PxeBcSelectBootMenu (Private, &Type, FALSE); > > - } > > - > > - if (!EFI_ERROR (Status)) { > > - > > - if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) { > > - // > > - // Local boot(PXE bootstrap server) need abort > > - // > > - return EFI_ABORTED; > > - } > > - > > - UseBis = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected); > > - Status = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > - } > > - > > - *BufferSize = 0; > > - > > - // > > - // Get bootfile name and (m)tftp server ip addresss > > - // > > - if (Mode->PxeReplyReceived) { > > - Packet = &Private->PxeReply; > > - } else if (Mode->ProxyOfferReceived) { > > - Packet = &Private->ProxyOffer; > > - } else { > > - Packet = &Private->Dhcp4Ack; > > - } > > - > > - // > > - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use > option > > 54(server identifier) > > - // in DHCPOFFER packet. > > - // (It does not comply with PXE Spec, Ver2.1) > > - // > > - if (EFI_IP4_EQUAL (&Packet->Packet.Offer.Dhcp4.Header.ServerAddr, > > &mZeroIp4Addr)) { > > - CopyMem ( > > - &Private->ServerIp, > > - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - } else { > > - CopyMem ( > > - &Private->ServerIp, > > - &Packet->Packet.Offer.Dhcp4.Header.ServerAddr, > > - sizeof (EFI_IPv4_ADDRESS) > > - ); > > - } > > - if (Private->ServerIp.Addr[0] == 0) { > > - return EFI_DEVICE_ERROR; > > - } > > - > > - ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != > > NULL); > > - > > - // > > - // bootlfile name > > - // > > - Private->BootFileName = (CHAR8 *) (Packet- > > >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data); > > - > > - if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != > > NULL) { > > - // > > - // Already have the bootfile length option, compute the file size > > - // > > - CopyMem (&Value, Packet- > > >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof > > (Value)); > > - Value = NTOHS (Value); > > - *BufferSize = 512 * Value; > > - Status = EFI_BUFFER_TOO_SMALL; > > - } else { > > - // > > - // Get the bootfile size from tftp > > - // > > - Status = PxeBc->Mtftp ( > > - PxeBc, > > - EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, > > - Buffer, > > - FALSE, > > - BufferSize, > > - &Private->BlockSize, > > - &Private->ServerIp, > > - (UINT8 *) Private->BootFileName, > > - NULL, > > - FALSE > > - ); > > - } > > - > > - Private->FileSize = (UINTN) *BufferSize; > > - > > - // > > - // Display all the information: boot server address, boot file name > and boot > > file size. > > - // > > - AsciiPrint ("\n Server IP address is "); > > - PxeBcShowIp4Addr (&Private->ServerIp.v4); > > - AsciiPrint ("\n NBP filename is %a", Private->BootFileName); > > - AsciiPrint ("\n NBP filesize is %d Bytes", Private->FileSize); > > - > > - return Status; > > -} > > - > > -/** > > - Causes the driver to load a specified file. > > - > > - @param This Protocol instance pointer. > > - @param FilePath The device specific path of the file to > load. > > - @param BootPolicy If TRUE, indicates that the request > originates > > from the > > - boot manager is attempting to load > FilePath as a boot > > - selection. If FALSE, then FilePath must > match as exact file > > - to be loaded. > > - @param BufferSize On input the size of Buffer in bytes. > On output > > with a return > > - code of EFI_SUCCESS, the amount of data > transferred to > > - Buffer. On output with a return code of > > EFI_BUFFER_TOO_SMALL, > > - the size of Buffer required to retrieve > the requested file. > > - @param Buffer The memory buffer to transfer the file > to. IF Buffer > > is NULL, > > - then no the size of the requested file > is returned in > > - BufferSize. > > - > > - @retval EFI_SUCCESS The file was loaded. > > - @retval EFI_UNSUPPORTED The device does not support the > > provided BootPolicy > > - @retval EFI_INVALID_PARAMETER FilePath is not a valid device > path, or > > - BufferSize is NULL. > > - @retval EFI_NO_MEDIA No medium was present to load the > file. > > - @retval EFI_DEVICE_ERROR The file was not loaded due to a > device > > error. > > - @retval EFI_NO_RESPONSE The remote system did not respond. > > - @retval EFI_NOT_FOUND The file was not found. > > - @retval EFI_ABORTED The file load process was > manually cancelled. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeLoadFile ( > > - IN EFI_LOAD_FILE_PROTOCOL * This, > > - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, > > - IN BOOLEAN BootPolicy, > > - IN OUT UINTN *BufferSize, > > - IN VOID *Buffer OPTIONAL > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; > > - BOOLEAN NewMakeCallback; > > - EFI_STATUS Status; > > - UINT64 TmpBufSize; > > - EFI_STATUS MediaStatus; > > - > > - if (FilePath == NULL || !IsDevicePathEnd (FilePath)) { > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This); > > - PxeBc = &Private->PxeBc; > > - NewMakeCallback = FALSE; > > - Status = EFI_DEVICE_ERROR; > > - > > - if (This == NULL || BufferSize == NULL) { > > - > > - return EFI_INVALID_PARAMETER; > > - } > > - > > - // > > - // Only support BootPolicy > > - // > > - if (!BootPolicy) { > > - return EFI_UNSUPPORTED; > > - } > > - > > - // > > - // Check media status before PXE start > > - // > > - MediaStatus = EFI_SUCCESS; > > - NetLibDetectMediaWaitTimeout (Private->Controller, > > PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus); > > - if (MediaStatus != EFI_SUCCESS) { > > - return EFI_NO_MEDIA; > > - } > > - > > - Status = PxeBc->Start (PxeBc, FALSE); > > - if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { > > - return Status; > > - } > > - > > - Status = gBS->HandleProtocol ( > > - Private->Controller, > > - &gEfiPxeBaseCodeCallbackProtocolGuid, > > - (VOID **) &Private->PxeBcCallback > > - ); > > - if (Status == EFI_UNSUPPORTED) { > > - > > - CopyMem (&Private->LoadFileCallback, &mPxeBcCallBackTemplate, > sizeof > > (Private->LoadFileCallback)); > > - > > - Status = gBS->InstallProtocolInterface ( > > - &Private->Controller, > > - &gEfiPxeBaseCodeCallbackProtocolGuid, > > - EFI_NATIVE_INTERFACE, > > - &Private->LoadFileCallback > > - ); > > - > > - NewMakeCallback = (BOOLEAN) (Status == EFI_SUCCESS); > > - > > - Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, > NULL, > > &NewMakeCallback); > > - if (EFI_ERROR (Status)) { > > - PxeBc->Stop (PxeBc); > > - return Status; > > - } > > - } > > - > > - if (Private->FileSize == 0) { > > - TmpBufSize = 0; > > - Status = DiscoverBootFile (Private, &TmpBufSize, Buffer); > > - > > - if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) > { > > - Status = EFI_DEVICE_ERROR; > > - } else if (TmpBufSize > 0 && *BufferSize >= (UINTN) TmpBufSize && > > Buffer != NULL) { > > - AsciiPrint ("\n Downloading NBP file...\n"); > > - *BufferSize = (UINTN) TmpBufSize; > > - Status = PxeBc->Mtftp ( > > - PxeBc, > > - EFI_PXE_BASE_CODE_TFTP_READ_FILE, > > - Buffer, > > - FALSE, > > - &TmpBufSize, > > - &Private->BlockSize, > > - &Private->ServerIp, > > - (UINT8 *) Private->BootFileName, > > - NULL, > > - FALSE > > - ); > > - } else if (TmpBufSize > 0) { > > - *BufferSize = (UINTN) TmpBufSize; > > - Status = EFI_BUFFER_TOO_SMALL; > > - } > > - } else if (Buffer == NULL || Private->FileSize > *BufferSize) { > > - *BufferSize = Private->FileSize; > > - Status = EFI_BUFFER_TOO_SMALL; > > - } else { > > - // > > - // Download the file. > > - // > > - AsciiPrint ("\n Downloading NBP file...\n"); > > - TmpBufSize = (UINT64) (*BufferSize); > > - Status = PxeBc->Mtftp ( > > - PxeBc, > > - EFI_PXE_BASE_CODE_TFTP_READ_FILE, > > - Buffer, > > - FALSE, > > - &TmpBufSize, > > - &Private->BlockSize, > > - &Private->ServerIp, > > - (UINT8 *) Private->BootFileName, > > - NULL, > > - FALSE > > - ); > > - } > > - // > > - // If we added a callback protocol, now is the time to remove it. > > - // > > - if (NewMakeCallback) { > > - > > - NewMakeCallback = FALSE; > > - > > - PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, > > &NewMakeCallback); > > - > > - gBS->UninstallProtocolInterface ( > > - Private->Controller, > > - &gEfiPxeBaseCodeCallbackProtocolGuid, > > - &Private->LoadFileCallback > > - ); > > - } > > - > > - // > > - // Check download status > > - // > > - if (Status == EFI_SUCCESS) { > > - AsciiPrint ("\n NBP file downloaded successfully.\n"); > > - // > > - // The DHCP4 can have only one configured child instance so we need > to > > stop > > - // reset the DHCP4 child before we return. Otherwise the other > programs > > which > > - // also need to use DHCP4 will be impacted. > > - // The functionality of PXE Base Code protocol will not be stopped, > > - // when downloading is successfully. > > - // > > - Private->Dhcp4->Stop (Private->Dhcp4); > > - Private->Dhcp4->Configure (Private->Dhcp4, NULL); > > - return EFI_SUCCESS; > > - > > - } else if (Status == EFI_BUFFER_TOO_SMALL) { > > - if (Buffer != NULL) { > > - AsciiPrint ("PXE-E05: Download buffer is smaller than requested > file.\n"); > > - } else { > > - // > > - // The functionality of PXE Base Code protocol will not be > stopped. > > - // > > - return Status; > > - } > > - > > - } else if (Status == EFI_DEVICE_ERROR) { > > - AsciiPrint ("PXE-E07: Network device error.\n"); > > - > > - } else if (Status == EFI_OUT_OF_RESOURCES) { > > - AsciiPrint ("PXE-E09: Could not allocate I/O buffers.\n"); > > - > > - } else if (Status == EFI_NO_MEDIA) { > > - AsciiPrint ("PXE-E12: Could not detect network connection.\n"); > > - > > - } else if (Status == EFI_NO_RESPONSE) { > > - AsciiPrint ("PXE-E16: No offer received.\n"); > > - > > - } else if (Status == EFI_TIMEOUT) { > > - AsciiPrint ("PXE-E18: Server response timeout.\n"); > > - > > - } else if (Status == EFI_ABORTED) { > > - AsciiPrint ("PXE-E21: Remote boot cancelled.\n"); > > - > > - } else if (Status == EFI_ICMP_ERROR) { > > - AsciiPrint ("PXE-E22: Client received ICMP error from server.\n"); > > - > > - } else if (Status == EFI_TFTP_ERROR) { > > - AsciiPrint ("PXE-E23: Client received TFTP error from server.\n"); > > - > > - } else { > > - AsciiPrint ("PXE-E99: Unexpected network error.\n"); > > - } > > - > > - PxeBc->Stop (PxeBc); > > - > > - return Status; > > -} > > - > > -EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate = { EfiPxeLoadFile }; > > - > > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > deleted file mode 100644 > > index 88767c8394ab..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > +++ /dev/null > > @@ -1,454 +0,0 @@ > > -/** @file > > - PxeBc MTFTP functions. > > - > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#include "PxeBcImpl.h" > > - > > -CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = { > > - "blksize", > > - "timeout", > > - "tsize", > > - "multicast" > > -}; > > - > > - > > -/** > > - This is a callback function when packets received/transmitted in > Mtftp > > driver. > > - > > - A callback function that is provided by the caller to intercept > > - the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets > > processed in the > > - EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to > intercept > > - EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets > > during a call to > > - EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory(). > > - > > - @param This Pointer to Mtftp protocol instance > > - @param Token Pointer to Mtftp token > > - @param PacketLen Length of Mtftp packet > > - @param Packet Pointer to Mtftp packet > > - > > - @retval EFI_SUCCESS Operation sucess > > - @retval EFI_ABORTED Abort transfer process > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcCheckPacket ( > > - IN EFI_MTFTP4_PROTOCOL *This, > > - IN EFI_MTFTP4_TOKEN *Token, > > - IN UINT16 PacketLen, > > - IN EFI_MTFTP4_PACKET *Packet > > - ) > > -{ > > - PXEBC_PRIVATE_DATA *Private; > > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; > > - EFI_STATUS Status; > > - > > - Private = (PXEBC_PRIVATE_DATA *) Token->Context; > > - Callback = Private->PxeBcCallback; > > - Status = EFI_SUCCESS; > > - > > - if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) { > > - Private->Mode.TftpErrorReceived = TRUE; > > - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode; > > - AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, > > PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet- > > >Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1); > > - Private- > > >Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; > > - } > > - > > - if (Callback != NULL) { > > - > > - Status = Callback->Callback ( > > - Callback, > > - Private->Function, > > - TRUE, > > - PacketLen, > > - (EFI_PXE_BASE_CODE_PACKET *) Packet > > - ); > > - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { > > - > > - Status = EFI_ABORTED; > > - } else { > > - > > - Status = EFI_SUCCESS; > > - } > > - } > > - > > - return Status; > > -} > > - > > - > > -/** > > - This function is to get size of a file by Tftp. > > - > > - @param Private Pointer to PxeBc private data > > - @param Config Pointer to Mtftp configuration data > > - @param Filename Pointer to file name > > - @param BlockSize Pointer to block size > > - @param BufferSize Pointer to buffer size > > - > > - @retval EFI_SUCCESS Get the size of file success > > - @retval EFI_NOT_FOUND Parse the tftp ptions failed. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval Other Has not get the size of the file. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpGetFileSize ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN UINTN *BlockSize, > > - IN OUT UINT64 *BufferSize > > - ) > > -{ > > - EFI_MTFTP4_PROTOCOL *Mtftp4; > > - EFI_MTFTP4_OPTION ReqOpt[2]; > > - EFI_MTFTP4_PACKET *Packet; > > - EFI_MTFTP4_OPTION *Option; > > - UINT32 PktLen; > > - UINT8 OptBuf[128]; > > - UINT32 OptCnt; > > - EFI_STATUS Status; > > - > > - *BufferSize = 0; > > - Status = EFI_DEVICE_ERROR; > > - Mtftp4 = Private->Mtftp4; > > - Packet = NULL; > > - Option = NULL; > > - PktLen = 0; > > - OptCnt = 1; > > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > > - > > - Status = Mtftp4->Configure (Mtftp4, Config); > > - if (EFI_ERROR (Status)) { > > - > > - return Status; > > - } > > - > > - ReqOpt[0].OptionStr = > > (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX]; > > - UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > > - ReqOpt[0].ValueStr = OptBuf; > > - > > - if (BlockSize != NULL) { > > - ReqOpt[1].OptionStr = > > (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > > - ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) > > ReqOpt[0].ValueStr) + 1; > > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, > > PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) > > ReqOpt[0].ValueStr) + 1)); > > - OptCnt++; > > - } > > - > > - Status = Mtftp4->GetInfo ( > > - Mtftp4, > > - NULL, > > - Filename, > > - NULL, > > - (UINT8) OptCnt, > > - ReqOpt, > > - &PktLen, > > - &Packet > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - if (Status == EFI_TFTP_ERROR) { > > - Private->Mode.TftpErrorReceived = TRUE; > > - Private->Mode.TftpError.ErrorCode = (UINT8) Packet- > >Error.ErrorCode; > > - AsciiStrnCpyS ( > > - Private->Mode.TftpError.ErrorString, > > - PXE_MTFTP_ERROR_STRING_LENGTH, > > - (CHAR8 *) Packet->Error.ErrorMessage, > > - PXE_MTFTP_ERROR_STRING_LENGTH - 1 > > - ); > > - Private- > > >Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; > > - } > > - goto ON_ERROR; > > - } > > - > > - OptCnt = 0; > > - > > - Status = Mtftp4->ParseOptions ( > > - Mtftp4, > > - PktLen, > > - Packet, > > - (UINT32 *) &OptCnt, > > - &Option > > - ); > > - > > - if (EFI_ERROR (Status)) { > > - > > - goto ON_ERROR; > > - } > > - > > - Status = EFI_NOT_FOUND; > > - > > - while (OptCnt != 0) { > > - > > - if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", > 5) == 0) > > { > > - > > - *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr); > > - Status = EFI_SUCCESS; > > - } > > - > > - OptCnt--; > > - } > > - > > - FreePool (Option); > > - > > -ON_ERROR: > > - > > - if (Packet != NULL) { > > - FreePool (Packet); > > - } > > - > > - Mtftp4->Configure (Mtftp4, NULL); > > - > > - return Status; > > -} > > - > > - > > -/** > > - This function is to get data of a file by Tftp. > > - > > - @param Private Pointer to PxeBc private data > > - @param Config Pointer to Mtftp configuration data > > - @param Filename Pointer to file name > > - @param BlockSize Pointer to block size > > - @param BufferPtr Pointer to buffer > > - @param BufferSize Pointer to buffer size > > - @param DontUseBuffer Indicate whether with a receive buffer > > - > > - @retval EFI_SUCCESS Read the data success from the special > file. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval other Read data from file failed. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpReadFile ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN UINTN *BlockSize, > > - IN UINT8 *BufferPtr, > > - IN OUT UINT64 *BufferSize, > > - IN BOOLEAN DontUseBuffer > > - ) > > -{ > > - EFI_MTFTP4_PROTOCOL *Mtftp4; > > - EFI_MTFTP4_TOKEN Token; > > - EFI_MTFTP4_OPTION ReqOpt[1]; > > - UINT32 OptCnt; > > - UINT8 OptBuf[128]; > > - EFI_STATUS Status; > > - > > - Status = EFI_DEVICE_ERROR; > > - Mtftp4 = Private->Mtftp4; > > - OptCnt = 0; > > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > > - > > - Status = Mtftp4->Configure (Mtftp4, Config); > > - if (EFI_ERROR (Status)) { > > - > > - return Status; > > - } > > - > > - if (BlockSize != NULL) { > > - > > - ReqOpt[0].OptionStr = (UINT8*) > > mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > > - ReqOpt[0].ValueStr = OptBuf; > > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, > > PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > > - OptCnt++; > > - } > > - > > - Token.Event = NULL; > > - Token.OverrideData = NULL; > > - Token.Filename = Filename; > > - Token.ModeStr = NULL; > > - Token.OptionCount = OptCnt; > > - Token.OptionList = ReqOpt; > > - Token.Context = Private; > > - > > - if (DontUseBuffer) { > > - Token.BufferSize = 0; > > - Token.Buffer = NULL; > > - } else { > > - Token.BufferSize = *BufferSize; > > - Token.Buffer = BufferPtr; > > - } > > - > > - Token.CheckPacket = PxeBcCheckPacket; > > - Token.TimeoutCallback = NULL; > > - Token.PacketNeeded = NULL; > > - > > - Status = Mtftp4->ReadFile (Mtftp4, &Token); > > - > > - *BufferSize = Token.BufferSize; > > - > > - Mtftp4->Configure (Mtftp4, NULL); > > - > > - return Status; > > -} > > - > > - > > -/** > > - This function is put data of a file by Tftp. > > - > > - @param Private Pointer to PxeBc private data > > - @param Config Pointer to Mtftp configuration data > > - @param Filename Pointer to file name > > - @param Overwrite Indicate whether with overwrite attribute > > - @param BlockSize Pointer to block size > > - @param BufferPtr Pointer to buffer > > - @param BufferSize Pointer to buffer size > > - > > - @retval EFI_SUCCESS Write the data success into the special > file. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval other Write data into file failed. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpWriteFile ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN BOOLEAN Overwrite, > > - IN UINTN *BlockSize, > > - IN UINT8 *BufferPtr, > > - IN OUT UINT64 *BufferSize > > - ) > > -{ > > - EFI_MTFTP4_PROTOCOL *Mtftp4; > > - EFI_MTFTP4_TOKEN Token; > > - EFI_MTFTP4_OPTION ReqOpt[1]; > > - UINT32 OptCnt; > > - UINT8 OptBuf[128]; > > - EFI_STATUS Status; > > - > > - Status = EFI_DEVICE_ERROR; > > - Mtftp4 = Private->Mtftp4; > > - OptCnt = 0; > > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > > - > > - Status = Mtftp4->Configure (Mtftp4, Config); > > - if (EFI_ERROR (Status)) { > > - > > - return Status; > > - } > > - > > - if (BlockSize != NULL) { > > - > > - ReqOpt[0].OptionStr = (UINT8*) > > mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > > - ReqOpt[0].ValueStr = OptBuf; > > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, > > PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > > - OptCnt++; > > - } > > - > > - Token.Event = NULL; > > - Token.OverrideData = NULL; > > - Token.Filename = Filename; > > - Token.ModeStr = NULL; > > - Token.OptionCount = OptCnt; > > - Token.OptionList = ReqOpt; > > - Token.BufferSize = *BufferSize; > > - Token.Buffer = BufferPtr; > > - Token.CheckPacket = PxeBcCheckPacket; > > - Token.TimeoutCallback = NULL; > > - Token.PacketNeeded = NULL; > > - > > - Status = Mtftp4->WriteFile (Mtftp4, &Token); > > - *BufferSize = Token.BufferSize; > > - > > - Mtftp4->Configure (Mtftp4, NULL); > > - > > - return Status; > > -} > > - > > - > > -/** > > - This function is to get data(file) from a directory(may be a server) > by Tftp. > > - > > - @param Private Pointer to PxeBc private data. > > - @param Config Pointer to Mtftp configuration data. > > - @param Filename Pointer to file name. > > - @param BlockSize Pointer to block size. > > - @param BufferPtr Pointer to buffer. > > - @param BufferSize Pointer to buffer size. > > - @param DontUseBuffer Indicate whether with a receive buffer. > > - > > - @retval EFI_SUCCES Get the data from the file included in > directory > > success. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval other Operation failed. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpReadDirectory ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN UINTN *BlockSize, > > - IN UINT8 *BufferPtr, > > - IN OUT UINT64 *BufferSize, > > - IN BOOLEAN DontUseBuffer > > - ) > > -{ > > - EFI_MTFTP4_PROTOCOL *Mtftp4; > > - EFI_MTFTP4_TOKEN Token; > > - EFI_MTFTP4_OPTION ReqOpt[1]; > > - UINT32 OptCnt; > > - UINT8 OptBuf[128]; > > - EFI_STATUS Status; > > - > > - Status = EFI_DEVICE_ERROR; > > - Mtftp4 = Private->Mtftp4; > > - OptCnt = 0; > > - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; > > - > > - Status = Mtftp4->Configure (Mtftp4, Config); > > - if (EFI_ERROR (Status)) { > > - > > - return Status; > > - } > > - > > - if (BlockSize != NULL) { > > - > > - ReqOpt[0].OptionStr = (UINT8*) > > mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; > > - ReqOpt[0].ValueStr = OptBuf; > > - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, > > PXE_MTFTP_OPTBUF_MAXNUM_INDEX); > > - OptCnt++; > > - } > > - > > - Token.Event = NULL; > > - Token.OverrideData = NULL; > > - Token.Filename = Filename; > > - Token.ModeStr = NULL; > > - Token.OptionCount = OptCnt; > > - Token.OptionList = ReqOpt; > > - Token.Context = Private; > > - > > - if (DontUseBuffer) { > > - Token.BufferSize = 0; > > - Token.Buffer = NULL; > > - } else { > > - Token.BufferSize = *BufferSize; > > - Token.Buffer = BufferPtr; > > - } > > - > > - Token.CheckPacket = PxeBcCheckPacket; > > - Token.TimeoutCallback = NULL; > > - Token.PacketNeeded = NULL; > > - > > - Status = Mtftp4->ReadDirectory (Mtftp4, &Token); > > - > > - *BufferSize = Token.BufferSize; > > - > > - Mtftp4->Configure (Mtftp4, NULL); > > - > > - return Status; > > -} > > - > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > > deleted file mode 100644 > > index 1401ca5ec2fd..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > > +++ /dev/null > > @@ -1,221 +0,0 @@ > > -/** @file > > - Support routines for PxeBc. > > - > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "PxeBcImpl.h" > > - > > - > > -/** > > - The common notify function associated with various PxeBc events. > > - > > - @param Event The event signaled. > > - @param Context The context. > > - > > -**/ > > -VOID > > -EFIAPI > > -PxeBcCommonNotify ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ) > > -{ > > - *((BOOLEAN *) Context) = TRUE; > > -} > > - > > - > > -/** > > - This function initialize(or configure) the Udp4Write instance. > > - > > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > > - @param StationIp Pointer to the station ip address. > > - @param SubnetMask Pointer to the subnetmask of the station ip > address. > > - @param Gateway Pointer to the gateway ip address. > > - @param SrcPort Pointer to the srouce port of the station. > > - @param Ttl The time to live field of the IP header. > > - @param ToS The type of service field of the IP header. > > - > > - @retval EFI_SUCCESS The configuration settings were set, > changed, or > > reset successfully. > > - @retval EFI_NO_MAPPING When using a default address, > configuration > > (DHCP, BOOTP, > > - RARP, etc.) is not finished yet. > > - @retval EFI_INVALID_PARAMETER One or more following conditions are > > TRUE: > > - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is > already > > started/configured > > - and must be stopped/reset before it can > be reconfigured. > > - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is > > FALSE > > - and UdpConfigData.StationPort is > already used by > > - other instance. > > - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot > > allocate memory for this > > - EFI UDPv4 Protocol instance. > > - @retval EFI_DEVICE_ERROR An unexpected network or system error > > occurred and this instance > > - was not opened. > > - @retval Others Please examine the function Udp4- > >Routes(Udp4, > > FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. > > - > > -**/ > > -EFI_STATUS > > -PxeBcConfigureUdpWriteInstance ( > > - IN EFI_UDP4_PROTOCOL *Udp4, > > - IN EFI_IPv4_ADDRESS *StationIp, > > - IN EFI_IPv4_ADDRESS *SubnetMask, > > - IN EFI_IPv4_ADDRESS *Gateway, > > - IN OUT UINT16 *SrcPort, > > - IN UINT8 Ttl, > > - IN UINT8 ToS > > - ) > > -{ > > - EFI_UDP4_CONFIG_DATA Udp4CfgData; > > - EFI_STATUS Status; > > - > > - ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData)); > > - > > - Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; > > - Udp4CfgData.TypeOfService = ToS; > > - Udp4CfgData.TimeToLive = Ttl; > > - Udp4CfgData.AllowDuplicatePort = TRUE; > > - > > - CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp)); > > - CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof > > (*SubnetMask)); > > - > > - Udp4CfgData.StationPort = *SrcPort; > > - > > - // > > - // Reset the instance. > > - // > > - Udp4->Configure (Udp4, NULL); > > - > > - Status = Udp4->Configure (Udp4, &Udp4CfgData); > > - if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) { > > - // > > - // basic configuration OK, need to add the default route entry > > - // > > - Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, > > Gateway); > > - if (EFI_ERROR (Status)) { > > - // > > - // roll back > > - // > > - Udp4->Configure (Udp4, NULL); > > - } > > - } > > - > > - if (!EFI_ERROR (Status) && (*SrcPort == 0)) { > > - Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL); > > - *SrcPort = Udp4CfgData.StationPort; > > - } > > - > > - return Status; > > -} > > - > > -/** > > - This function is to display the IPv4 address. > > - > > - @param[in] Ip The pointer to the IPv4 address. > > - > > -**/ > > -VOID > > -PxeBcShowIp4Addr ( > > - IN EFI_IPv4_ADDRESS *Ip > > - ) > > -{ > > - UINTN Index; > > - > > - for (Index = 0; Index < 4; Index++) { > > - AsciiPrint ("%d", Ip->Addr[Index]); > > - if (Index < 3) { > > - AsciiPrint ("."); > > - } > > - } > > -} > > - > > -/** > > - Convert number to ASCII value. > > - > > - @param Number Numeric value to convert to decimal ASCII > value. > > - @param Buffer Buffer to place ASCII version of the > Number. > > - @param Length Length of Buffer. > > - > > -**/ > > -VOID > > -CvtNum ( > > - IN UINTN Number, > > - IN UINT8 *Buffer, > > - IN UINTN Length > > - ) > > -{ > > - UINTN Remainder; > > - > > - for (; Length > 0; Length--) { > > - Remainder = Number % 10; > > - Number /= 10; > > - Buffer[Length - 1] = (UINT8) ('0' + Remainder); > > - } > > -} > > - > > - > > -/** > > - Convert unsigned int number to decimal number. > > - > > - @param Number The unsigned int number will be converted. > > - @param Buffer Pointer to the buffer to store the decimal > number > > after transform. > > - @param[in] BufferSize The maxsize of the buffer. > > - > > - @return the length of the number after transform. > > - > > -**/ > > -UINTN > > -UtoA10 ( > > - IN UINTN Number, > > - IN CHAR8 *Buffer, > > - IN UINTN BufferSize > > - ) > > -{ > > - UINTN Index; > > - CHAR8 TempStr[64]; > > - > > - Index = 63; > > - TempStr[Index] = 0; > > - > > - do { > > - Index--; > > - TempStr[Index] = (CHAR8) ('0' + (Number % 10)); > > - Number = Number / 10; > > - } while (Number != 0); > > - > > - AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]); > > - > > - return AsciiStrLen (Buffer); > > -} > > - > > - > > -/** > > - Convert ASCII numeric string to a UINTN value. > > - > > - @param Buffer Pointer to the 8-byte unsigned int value. > > - > > - @return UINTN value of the ASCII string. > > - > > -**/ > > -UINT64 > > -AtoU64 ( > > - IN UINT8 *Buffer > > - ) > > -{ > > - UINT64 Value; > > - UINT8 Character; > > - > > - Value = 0; > > - while ((Character = *Buffer++) != '\0') { > > - Value = MultU64x32 (Value, 10) + (Character - '0'); > > - } > > - > > - return Value; > > -} > > - > > diff --git a/MdeModulePkg/MdeModulePkg.dsc > > b/MdeModulePkg/MdeModulePkg.dsc > > index 2465d39fd744..5d042be3a862 100644 > > --- a/MdeModulePkg/MdeModulePkg.dsc > > +++ b/MdeModulePkg/MdeModulePkg.dsc > > @@ -354,12 +354,10 @@ [Components] > > MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf > > MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf > > MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf > > - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf > > MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf > > MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf > > MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf > > - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf > > > > > > MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/PcatSingleSegmen > > tPciCfg2Pei.inf > > @@ -422,7 +420,6 @@ [Components] > > MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf > > > > [Components.IA32, Components.X64, Components.AARCH64] > > - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf > > MdeModulePkg/Universal/EbcDxe/EbcDxe.inf > > MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf > > diff --git > > a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > deleted file mode 100644 > > index ee371d26744c..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > +++ /dev/null > > @@ -1,165 +0,0 @@ > > -/** @file > > - The header file of UEFI Component Name(2) protocol. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _COMPONENT_NAME_H_ > > -#define _COMPONENT_NAME_H_ > > - > > -#include <Protocol/ComponentName.h> > > -#include <Protocol/ComponentName2.h> > > - > > -extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2; > > -extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName; > > - > > -// > > -// EFI Component Name Protocol for iSCSI driver. > > -// > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the EFI > Driver. > > - > > - This function retrieves the user readable name of a driver in the > form of a > > - Unicode string. If the driver specified by This has a user readable > name in > > - the language specified by Language, then a pointer to the driver name > is > > - returned in DriverName, and EFI_SUCCESS is returned. If the driver > > specified > > - by This does not support the language specified by Language, > > - then EFI_UNSUPPORTED is returned. > > - > > - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL > > instance. > > - @param[in] Language A pointer to a three characters ISO 639-2 > language > > identifier. > > - This is the language of the driver name that > that the caller > > - is requesting, and it must match one of the > languages specified > > - in SupportedLanguages. The number of > languages supported > > by a > > - driver is up to the driver writer. > > - @param[out] DriverName A pointer to the Unicode string to return. > This > > Unicode string > > - is the name of the driver specified by This > in the language > > - specified by Language. > > - > > - @retval EFI_SUCCESS The Unicode string for the Driver > specified by > > This > > - and the language specified by Language > was returned > > - in DriverName. > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - @retval EFI_INVALID_PARAMETER DriverName is NULL. > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support the > > - language specified by Language. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiComponentNameGetDriverName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN CHAR8 *Language, > > - OUT CHAR16 **DriverName > > - ); > > - > > -/** > > - Retrieves a Unicode string that is the user readable name of the > controller > > - that is being managed by an EFI Driver. Currently not implemented. > > - > > - @param[in] This A pointer to the > > EFI_COMPONENT_NAME_PROTOCOL instance. > > - @param[in] ControllerHandle The handle of a controller that the > driver > > specified by > > - This is managing. This handle specifies > the controller > > - whose name is to be returned. > > - @param[in] ChildHandle The handle of the child controller to > retrieve > > the name > > - of. This is an optional parameter that > may be NULL. It > > - will be NULL for device drivers. It > will also be NULL > > - for a bus drivers that wish to retrieve > the name of the > > - bus controller. It will not be NULL for > a bus driver > > - that wishes to retrieve the name of a > child controller. > > - @param[in] Language A pointer to a three characters ISO 639- > 2 > > language > > - identifier. This is the language of the > controller name > > - that that the caller is requesting, and > it must match one > > - of the languages specified in > SupportedLanguages. The > > - number of languages supported by a > driver is up to the > > - driver writer. > > - @param[out] ControllerName A pointer to the Unicode string to > return. > > This Unicode > > - string is the name of the controller > specified by > > - ControllerHandle and ChildHandle in the > language specified > > - by Language from the point of view of > the driver specified > > - by This. > > - > > - @retval EFI_SUCCESS The Unicode string for the user > readable name > > in the > > - language specified by Language for the > driver > > - specified by This was returned in > DriverName. > > - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. > > - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a > > valid EFI_HANDLE. > > - @retval EFI_INVALID_PARAMETER Language is NULL. > > - @retval EFI_INVALID_PARAMETER ControllerName is NULL. > > - @retval EFI_UNSUPPORTED The driver specified by This is not > currently > > managing > > - the controller specified by > ControllerHandle and > > - ChildHandle. > > - @retval EFI_UNSUPPORTED The driver specified by This does not > > support the > > - language specified by Language. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiComponentNameGetControllerName ( > > - IN EFI_COMPONENT_NAME_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE ChildHandle OPTIONAL, > > - IN CHAR8 *Language, > > - OUT CHAR16 **ControllerName > > - ); > > - > > -// > > -// EFI iSCSI Initiator Name Protocol for IScsi driver. > > -// > > - > > -/** > > - Retrieves the current set value of iSCSI Initiator Name. > > - > > - @param[in] This Pointer to the > > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by > Buffer > > / Actual size of the > > - variable data buffer. > > - @param[out] Buffer Pointer to the buffer for data to be read. > > - > > - @retval EFI_SUCCESS Data was successfully retrieved into > the > > provided buffer and the > > - BufferSize was sufficient to handle the > iSCSI initiator name > > - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. > > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. > > - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be > > retrieved due to a hardware error. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiGetInitiatorName ( > > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > > - IN OUT UINTN *BufferSize, > > - OUT VOID *Buffer > > - ); > > - > > -/** > > - Sets the iSCSI Initiator Name. > > - > > - @param[in] This Pointer to the > > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by > Buffer. > > - @param[in] Buffer Pointer to the buffer for data to be > written. > > - > > - @retval EFI_SUCCESS Data was successfully stored by the > protocol. > > - @retval EFI_UNSUPPORTED Platform policies do not allow for data > to be > > written. > > - Currently not implemented. > > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or > > BufferSize exceeds the maximum allowed limit. > > - @retval EFI_DEVICE_ERROR The data could not be stored due to a > > hardware error. > > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > > the data. > > - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not > > adhere to RFC 3720 > > - (and other related protocols) > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiSetInitiatorName ( > > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > > - IN OUT UINTN *BufferSize, > > - IN VOID *Buffer > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > deleted file mode 100644 > > index d3c020e45d3b..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > +++ /dev/null > > @@ -1,25 +0,0 @@ > > -// /** @file > > -// This module produces EFI iSCSI Initiator Name Protocol. > > -// > > -// This module produces EFI iSCSI Initiator Name Protocol upon EFI > TCPv4 > > Protocol > > -// and EFI DHCPv4 Protocol, to provide the capability to do the > transport for > > SCSI > > -// data over TCP/IP. It installs EFI HII Configuration Access Protocol > to > > provide > > -// one way to configurate the iSCSI setting. > > -// > > -// Copyright (c) 2004 - 2018, Intel Corporation. All rights > reserved.<BR> > > -// > > -// This program and the accompanying materials > > -// are licensed and made available under the terms and conditions of > the > > BSD License > > -// which accompanies this distribution. The full text of the license > may be > > found at > > -// http://opensource.org/licenses/bsd-license.php > > -// > > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -// > > -// **/ > > - > > - > > -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI > iSCSI > > Initiator Name Protocol" > > - > > -#string STR_MODULE_DESCRIPTION #language en-US "This module > > produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and > EFI > > DHCPv4 Protocol, to provide the capability to do the transport for SCSI > data > > over TCP/IP. It installs EFI HII Configuration Access Protocol to > provide a way > > to configure the iSCSI setting." > > - > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > > deleted file mode 100644 > > index 5ec75820a605..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > > +++ /dev/null > > @@ -1,20 +0,0 @@ > > -// /** @file > > -// IScsi4Dxe Localized Strings and Content > > -// > > -// Copyright (c) 2013 - 2018, Intel Corporation. All rights > reserved.<BR> > > -// > > -// This program and the accompanying materials > > -// are licensed and made available under the terms and conditions of > the > > BSD License > > -// which accompanies this distribution. The full text of the license > may be > > found at > > -// http://opensource.org/licenses/bsd-license.php > > -// > > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -// > > -// **/ > > - > > -#string STR_PROPERTIES_MODULE_NAME > > -#language en-US > > -"iSCSI DXE Driver" > > - > > - > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > deleted file mode 100644 > > index 14a5658f754b..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > +++ /dev/null > > @@ -1,106 +0,0 @@ > > -/** @file > > - The header file of CHAP configuration. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_CHAP_H_ > > -#define _ISCSI_CHAP_H_ > > - > > -#define ISCSI_AUTH_METHOD_CHAP "CHAP" > > - > > -#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A" > > -#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I" > > -#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C" > > -#define ISCSI_KEY_CHAP_NAME "CHAP_N" > > -#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R" > > - > > -#define ISCSI_CHAP_ALGORITHM_MD5 5 > > - > > -#define ISCSI_CHAP_AUTH_MAX_LEN 1024 > > -/// > > -/// MD5_HASHSIZE > > -/// > > -#define ISCSI_CHAP_RSP_LEN 16 > > - > > -#define ISCSI_CHAP_INITIAL 0 > > -#define ISCSI_CHAP_STEP_ONE 1 > > -#define ISCSI_CHAP_STEP_TWO 2 > > -#define ISCSI_CHAP_STEP_THREE 3 > > -#define ISCSI_CHAP_STEP_FOUR 4 > > - > > -#pragma pack(1) > > - > > -typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA { > > - UINT8 CHAPType; > > - CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE]; > > - CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > > - CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; > > - CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > > -} ISCSI_CHAP_AUTH_CONFIG_NVDATA; > > - > > -#pragma pack() > > - > > -/// > > -/// ISCSI CHAP Authentication Data > > -/// > > -typedef struct _ISCSI_CHAP_AUTH_DATA { > > - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig; > > - UINT32 InIdentifier; > > - UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; > > - UINT32 InChallengeLength; > > - // > > - // Calculated CHAP Response (CHAP_R) value > > - // > > - UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN]; > > - > > - // > > - // Auth-data to be sent out for mutual authentication > > - // > > - UINT32 OutIdentifier; > > - UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; > > - UINT32 OutChallengeLength; > > -} ISCSI_CHAP_AUTH_DATA; > > - > > -/** > > - This function checks the received iSCSI Login Response during the > security > > - negotiation stage. > > - > > - @param[in] Conn The iSCSI connection. > > - > > - @retval EFI_SUCCESS The Login Response passed the CHAP > validation. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiCHAPOnRspReceived ( > > - IN ISCSI_CONNECTION *Conn > > - ); > > -/** > > - This function fills the CHAP authentication information into the > login PDU > > - during the security negotiation stage in the iSCSI connection login. > > - > > - @param[in] Conn The iSCSI connection. > > - @param[in, out] Pdu The PDU to send out. > > - > > - @retval EFI_SUCCESS All check passed and the phase-related > CHAP > > - authentication info is filled into the > iSCSI PDU. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. > > -**/ > > -EFI_STATUS > > -IScsiCHAPToSendReq ( > > - IN ISCSI_CONNECTION *Conn, > > - IN OUT NET_BUF *Pdu > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > deleted file mode 100644 > > index 650c68d53bab..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > +++ /dev/null > > @@ -1,22 +0,0 @@ > > -/** @file > > - The common header file of Iscsi. > > - > > -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_COMMON_H_ > > -#define _ISCSI_COMMON_H_ > > - > > -typedef struct _ISCSI_SESSION ISCSI_SESSION; > > -typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION; > > -typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA; > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > deleted file mode 100644 > > index c3d07f6f4859..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > +++ /dev/null > > @@ -1,166 +0,0 @@ > > -/** @file > > - The header file of IScsiConfig.c. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_CONFIG_H_ > > -#define _ISCSI_CONFIG_H_ > > - > > -#include <Guid/MdeModuleHii.h> > > -#include <Protocol/HiiConfigRouting.h> > > -#include <Library/HiiLib.h> > > -#include <Library/DevicePathLib.h> > > -#include <Library/DebugLib.h> > > -#include <Library/BaseLib.h> > > -#include <Library/NetLib.h> > > - > > -extern UINT8 IScsiConfigDxeBin[]; > > -extern UINT8 IScsi4DxeStrings[]; > > - > > -#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME" > > - > > -#define ISCSI_CONFIG_VAR_ATTR > > (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE) > > - > > -#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', > > 'c', 'i') > > - > > - > > - > > -/** > > - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of > > PcdDebugProperyMask is clear, > > - then this macro return a pointer to a data structure > > ISCSI_FORM_CALLBACK_INFO. > > - > > - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of > > PcdDebugProperyMask is set, > > - The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO > > - is compared to TestSignature. If the signatures match, then a > pointer > > - to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is > returned. > > - If the signatures do not match, then DebugAssert() is called with a > > description > > - of "CR has a bad signature" and Callback is returned. > > - > > - If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not > > contain the field > > - specified by Callback, then the module will not compile. > > - > > - If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field > > called Signature, > > - then the module will not compile. > > - > > - @param Callback Pointer to the specified field within the data > > - structure ISCSI_FORM_CALLBACK_INFO. > > - @return A pointer to the pointer to a data structure > > ISCSI_FORM_CALLBACK_INFO. > > - @retval Others Some unexpected error happened. > > -**/ > > - > > -#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) > > \ > > - CR ( \ > > - Callback, \ > > - ISCSI_FORM_CALLBACK_INFO, \ > > - ConfigAccess, \ > > - ISCSI_FORM_CALLBACK_INFO_SIGNATURE \ > > - ) > > - > > -#pragma pack(1) > > - > > -typedef struct _ISCSI_MAC_INFO { > > - EFI_MAC_ADDRESS Mac; > > - UINT8 Len; > > - UINT16 VlanId; > > -} ISCSI_MAC_INFO; > > - > > -typedef struct _ISCSI_DEVICE_LIST { > > - UINT8 NumDevice; > > - ISCSI_MAC_INFO MacInfo[1]; > > -} ISCSI_DEVICE_LIST; > > - > > -#pragma pack() > > - > > -typedef struct _ISCSI_CONFIG_FORM_ENTRY { > > - LIST_ENTRY Link; > > - EFI_HANDLE Controller; > > - CHAR16 MacString[95]; > > - EFI_STRING_ID PortTitleToken; > > - EFI_STRING_ID PortTitleHelpToken; > > - > > - ISCSI_SESSION_CONFIG_NVDATA SessionConfigData; > > - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData; > > -} ISCSI_CONFIG_FORM_ENTRY; > > - > > -typedef struct _ISCSI_FORM_CALLBACK_INFO { > > - UINTN Signature; > > - EFI_HANDLE DriverHandle; > > - EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess; > > - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; > > - EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting; > > - UINT16 *KeyList; > > - VOID *FormBuffer; > > - EFI_HII_HANDLE RegisteredHandle; > > - ISCSI_CONFIG_FORM_ENTRY *Current; > > -} ISCSI_FORM_CALLBACK_INFO; > > - > > -#pragma pack(1) > > - > > -/// > > -/// HII specific Vendor Device Path definition. > > -/// > > -typedef struct { > > - VENDOR_DEVICE_PATH VendorDevicePath; > > - EFI_DEVICE_PATH_PROTOCOL End; > > -} HII_VENDOR_DEVICE_PATH; > > - > > -#pragma pack() > > - > > -/** > > - Updates the iSCSI configuration form to add/delete an entry for the > iSCSI > > - device specified by the Controller. > > - > > - @param[in] DriverBindingHandle The driverbinding handle. > > - @param[in] Controller The controller handle of the iSCSI > device. > > - @param[in] AddForm Whether to add or delete a form entry. > > - > > - @retval EFI_SUCCESS The iSCSI configuration form is > updated. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiConfigUpdateForm ( > > - IN EFI_HANDLE DriverBindingHandle, > > - IN EFI_HANDLE Controller, > > - IN BOOLEAN AddForm > > - ); > > - > > -/** > > - Initialize the iSCSI configuration form. > > - > > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > > - > > - @retval EFI_SUCCESS The iSCSI configuration form is > initialized. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiConfigFormInit ( > > - VOID > > - ); > > - > > -/** > > - Unload the iSCSI configuration form, this includes: delete all the > iSCSI > > - device configuration entries, uninstall the form callback protocol > and > > - free the resources used. > > - > > - @param[in] DriverBindingHandle The iSCSI driverbinding handle. > > - > > - @retval EFI_SUCCESS The iSCSI configuration form is > unloaded. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > -**/ > > -EFI_STATUS > > -IScsiConfigFormUnload ( > > - IN EFI_HANDLE DriverBindingHandle > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > > deleted file mode 100644 > > index 9e28d81fb40d..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > > +++ /dev/null > > @@ -1,219 +0,0 @@ > > -/** @file > > - Vfr file for iSCSI config. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > - > > -#include "IScsiConfigNVDataStruc.h" > > -#define EFI_NETWORK_DEVICE_CLASS 0x04 > > - > > -formset > > - guid = IP4_ISCSI_CONFIG_GUID, > > - title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE), > > - help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP), > > - > > - varstore ISCSI_CONFIG_IFR_NVDATA, > > - name = ISCSI_CONFIG_IFR_NVDATA, > > - guid = IP4_ISCSI_CONFIG_GUID; > > - form formid = FORMID_MAIN_FORM, > > - title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE); > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName, > > - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME), > > - help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP), > > - flags = INTERACTIVE, > > - key = KEY_INITIATOR_NAME, > > - minsize = ISCSI_NAME_IFR_MIN_SIZE, > > - maxsize = ISCSI_NAME_IFR_MAX_SIZE, > > - endstring; > > - > > - label DEVICE_ENTRY_LABEL; > > - label LABEL_END; > > - > > - endform; > > - > > - form formid = FORMID_DEVICE_FORM, > > - title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE); > > - > > - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled, > > - prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE), > > - help = STRING_TOKEN(STR_NULL), > > - flags = 0, > > - endcheckbox; > > - > > - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp, > > - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), > > - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), > > - flags = INTERACTIVE, > > - key = KEY_DHCP_ENABLE, > > - endcheckbox; > > - > > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == > > 0x01; > > - string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp, > > - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS), > > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > > - flags = INTERACTIVE, > > - key = KEY_LOCAL_IP, > > - minsize = IP_MIN_SIZE, > > - maxsize = IP_MAX_SIZE, > > - endstring; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask, > > - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK), > > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > > - flags = INTERACTIVE, > > - key = KEY_SUBNET_MASK, > > - minsize = IP_MIN_SIZE, > > - maxsize = IP_MAX_SIZE, > > - endstring; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway, > > - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY), > > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > > - flags = INTERACTIVE, > > - key = KEY_GATE_WAY, > > - minsize = IP_MIN_SIZE, > > - maxsize = IP_MAX_SIZE, > > - endstring; > > - endif; > > - > > - subtitle text = STRING_TOKEN(STR_NULL); > > - > > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == > > 0x00; > > - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp, > > - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), > > - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), > > - flags = 0, > > - endcheckbox; > > - endif; > > - > > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == > > 0x01; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName, > > - prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME), > > - help = STRING_TOKEN(STR_ISCSI_TARGET_NAME), > > - flags = INTERACTIVE, > > - key = KEY_TARGET_NAME, > > - minsize = ISCSI_NAME_IFR_MIN_SIZE, > > - maxsize = ISCSI_NAME_IFR_MAX_SIZE, > > - endstring; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp, > > - prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS), > > - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), > > - flags = INTERACTIVE, > > - key = KEY_TARGET_IP, > > - minsize = IP_MIN_SIZE, > > - maxsize = IP_MAX_SIZE, > > - endstring; > > - > > - numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort, > > - prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT), > > - help = STRING_TOKEN(STR_ISCSI_TARGET_PORT), > > - flags = 0, > > - minimum = TARGET_PORT_MIN_NUM, > > - maximum = TARGET_PORT_MAX_NUM, > > - step = 0, > > - endnumeric; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun, > > - prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN), > > - help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP), > > - flags = INTERACTIVE, > > - key = KEY_BOOT_LUN, > > - minsize = LUN_MIN_SIZE, > > - maxsize = LUN_MAX_SIZE, > > - endstring; > > - endif; > > - > > - subtitle text = STRING_TOKEN(STR_NULL); > > - > > - oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType, > > - prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT), > > - help = STRING_TOKEN(STR_CHAP_TYPE_HELP), > > - option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value = > > ISCSI_CHAP_NONE, flags = DEFAULT; > > - option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value = > > ISCSI_CHAP_UNI, flags = 0; > > - option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = > > ISCSI_CHAP_MUTUAL, flags = 0; > > - endoneof; > > - > > - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == > > ISCSI_CHAP_NONE; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName, > > - prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME), > > - help = STRING_TOKEN(STR_ISCSI_CHAP_NAME), > > - flags = INTERACTIVE, > > - key = KEY_CHAP_NAME, > > - minsize = 0, > > - maxsize = ISCSI_CHAP_NAME_MAX_LEN, > > - endstring; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret, > > - prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET), > > - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), > > - flags = INTERACTIVE, > > - key = KEY_CHAP_SECRET, > > - minsize = ISCSI_CHAP_SECRET_MIN_LEN, > > - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, > > - endstring; > > - > > - endif; > > - > > - suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == > > ISCSI_CHAP_MUTUAL; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName, > > - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), > > - help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), > > - flags = INTERACTIVE, > > - key = KEY_REVERSE_CHAP_NAME, > > - minsize = 0, > > - maxsize = ISCSI_CHAP_NAME_MAX_LEN, > > - endstring; > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret, > > - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET), > > - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), > > - flags = INTERACTIVE, > > - key = KEY_REVERSE_CHAP_SECRET, > > - minsize = ISCSI_CHAP_SECRET_MIN_LEN, > > - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, > > - endstring; > > - > > - endif; > > - > > - subtitle text = STRING_TOKEN(STR_NULL); > > - > > - string varid = ISCSI_CONFIG_IFR_NVDATA.IsId, > > - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID), > > - help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP), > > - flags = INTERACTIVE, > > - key = KEY_CONFIG_ISID, > > - minsize = ISID_CONFIGURABLE_MIN_LEN, > > - maxsize = ISID_CONFIGURABLE_MAX_LEN, > > - endstring; > > - > > - subtitle text = STRING_TOKEN(STR_NULL); > > - > > - text > > - help = STRING_TOKEN (STR_SAVE_CHANGES), > > - text = STRING_TOKEN (STR_SAVE_CHANGES), > > - flags = INTERACTIVE, > > - key = KEY_SAVE_CHANGES; > > - > > - goto FORMID_MAIN_FORM, > > - prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM), > > - help = STRING_TOKEN (STR_RETURN_MAIN_FORM), > > - flags = 0; > > - > > - endform; > > - > > -endformset; > > - > > diff --git > > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > > deleted file mode 100644 > > index 729c74ebfc1b..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > > +++ /dev/null > > @@ -1,62 +0,0 @@ > > -// *++ > > -// > > -// Copyright (c) 2004 - 2018, Intel Corporation. All rights > reserved.<BR> > > -// This program and the accompanying materials > > -// are licensed and made available under the terms and conditions of > the > > BSD License > > -// which accompanies this distribution. The full text of the license > may be > > found at > > -// http://opensource.org/licenses/bsd-license.php > > -// > > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -// > > -// Module Name: > > -// > > -// IScsiConfigStrings.uni > > -// > > -// Abstract: > > -// > > -// String definitions for iSCSI configuration. > > -// > > -// Revision History: > > -// > > -// --*/ > > - > > - > > -/=# > > - > > -#langdef en-US "English" > > - > > -#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI > > Configuration" > > -#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the > > iSCSI parameters." > > -#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI > > Configuration" > > -#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI > Initiator > > Name" > > -#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The > > worldwide unique name of the initiator. Only iqn. format is accepted." > > -#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US "" > > -#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI" > > -#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP > > Address" > > -#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator > Subnet > > Mask" > > -#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway" > > -#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP > address > > in dotted-decimal notation." > > -#string STR_ISCSI_TARGET_NAME #language en-US " Target Name" > > -#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP > > Address" > > -#string STR_ISCSI_TARGET_PORT #language en-US " Target Port" > > -#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN" > > -#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal > > representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, > 6734- > > 9-156f-127, 4186-9" > > -#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP" > > -#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target > > info via DHCP" > > -#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type" > > -#string STR_CHAP_TYPE_HELP #language en-US "None, One way > > CHAP or mutual CHAP" > > -#string STR_CHAP_TYPE_NONE #language en-US "None" > > -#string STR_CHAP_TYPE_UNI #language en-US "One way" > > -#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual" > > -#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name" > > -#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret" > > -#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum > > length is 12 bytes and the maximum length is 16 bytes." > > -#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse > > CHAP Name" > > -#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse > > CHAP Secret" > > -#string STR_ISCSI_CONFIG_ISID #language en-US "ISID" > > -#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format > ISID > > in 6 bytes, default value are derived from MAC address. Only last 3 > bytes are > > configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input > > F07901." > > -#string STR_RETURN_MAIN_FORM #language en-US "Back to > Previous > > Page" > > -#string STR_SAVE_CHANGES #language en-US "Save Changes" > > -#string STR_NULL #language en-US "" > > - > > diff --git > > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > > deleted file mode 100644 > > index 7c2e4e65fa8e..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > > +++ /dev/null > > @@ -1,109 +0,0 @@ > > -/** @file > > - Define NVData structures used by the iSCSI configuration component > > - > > -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_NVDATASTRUC_H_ > > -#define _ISCSI_NVDATASTRUC_H_ > > - > > -#include <Guid/Ip4IScsiConfigHii.h> > > - > > -#define VAR_EQ_TEST_NAME 0x100 > > - > > -#define FORMID_MAIN_FORM 1 > > -#define FORMID_DEVICE_FORM 2 > > - > > -#define ISCSI_NAME_MAX_SIZE 224 > > - > > -// > > -// Vfr has a limit on the size, it's 255 bytes. > > -// > > -#define ISCSI_NAME_IFR_MIN_SIZE 4 > > -#define ISCSI_NAME_IFR_MAX_SIZE 223 > > - > > -#define IP_MIN_SIZE 7 > > -#define IP_MAX_SIZE 15 > > -#define IP4_STR_MAX_SIZE 16 > > - > > -#define LUN_MIN_SIZE 1 > > -#define LUN_MAX_SIZE 20 > > - > > -#define ISCSI_CHAP_NONE 0 > > -#define ISCSI_CHAP_UNI 1 > > -#define ISCSI_CHAP_MUTUAL 2 > > - > > -#define TARGET_PORT_MIN_NUM 0 > > -#define TARGET_PORT_MAX_NUM 65535 > > - > > -#define DEVICE_ENTRY_LABEL 0x1234 > > -#define LABEL_END 0xffff > > - > > -#define KEY_INITIATOR_NAME 0x101 > > -#define KEY_DHCP_ENABLE 0x102 > > -#define KEY_LOCAL_IP 0x103 > > -#define KEY_SUBNET_MASK 0x104 > > -#define KEY_GATE_WAY 0x105 > > -#define KEY_TARGET_IP 0x106 > > -#define KEY_CHAP_NAME 0x107 > > -#define KEY_CHAP_SECRET 0x108 > > -#define KEY_REVERSE_CHAP_NAME 0x109 > > -#define KEY_REVERSE_CHAP_SECRET 0x10a > > -#define KEY_SAVE_CHANGES 0x10b > > -#define KEY_TARGET_NAME 0x10c > > -#define KEY_BOOT_LUN 0x10d > > -#define KEY_CONFIG_ISID 0x10e > > - > > -#define KEY_DEVICE_ENTRY_BASE 0x1000 > > - > > -#define ISCSI_LUN_STR_MAX_LEN 21 > > -#define ISCSI_CHAP_SECRET_MIN_LEN 12 > > -#define ISCSI_CHAP_SECRET_MAX_LEN 16 > > -// > > -// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof > > (NULL-Terminator) > > -// > > -#define ISCSI_CHAP_SECRET_STORAGE 17 > > - > > -#define ISCSI_CHAP_NAME_MAX_LEN 126 > > -#define ISCSI_CHAP_NAME_STORAGE 127 > > - > > -#define ISID_CONFIGURABLE_MIN_LEN 6 > > -#define ISID_CONFIGURABLE_MAX_LEN 12 > > -#define ISID_CONFIGURABLE_STORAGE 13 > > - > > -#pragma pack(1) > > -typedef struct { > > - CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE]; > > - > > - UINT8 Enabled; > > - > > - UINT8 InitiatorInfoFromDhcp; > > - CHAR16 LocalIp[IP4_STR_MAX_SIZE]; > > - CHAR16 SubnetMask[IP4_STR_MAX_SIZE]; > > - CHAR16 Gateway[IP4_STR_MAX_SIZE]; > > - > > - CHAR16 TargetName[ISCSI_NAME_MAX_SIZE]; > > - CHAR16 TargetIp[IP4_STR_MAX_SIZE]; > > - UINT16 TargetPort; > > - CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN]; > > - UINT8 TargetInfoFromDhcp; > > - > > - UINT8 CHAPType; > > - CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE]; > > - CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > > - CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; > > - CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; > > - > > - CHAR16 IsId[ISID_CONFIGURABLE_STORAGE]; > > -} ISCSI_CONFIG_IFR_NVDATA; > > -#pragma pack() > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > deleted file mode 100644 > > index 4c4dcaa8f68d..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > +++ /dev/null > > @@ -1,55 +0,0 @@ > > -/** @file > > - The header file of IScsiDhcp. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_DHCP_H_ > > -#define _ISCSI_DHCP_H_ > > - > > -#include <Protocol/Dhcp4.h> > > - > > -#define ISCSI_ROOT_PATH_ID "iscsi:" > > -#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':' > > - > > -#define RP_FIELD_IDX_SERVERNAME 0 > > -#define RP_FIELD_IDX_PROTOCOL 1 > > -#define RP_FIELD_IDX_PORT 2 > > -#define RP_FIELD_IDX_LUN 3 > > -#define RP_FIELD_IDX_TARGETNAME 4 > > -#define RP_FIELD_IDX_MAX 5 > > - > > -typedef struct _ISCSI_ROOT_PATH_FIELD { > > - CHAR8 *Str; > > - UINT8 Len; > > -} ISCSI_ROOT_PATH_FIELD; > > - > > -/** > > - Parse the DHCP ACK to get the address configuration and DNS > information. > > - > > - @param[in] Image The handle of the driver image. > > - @param[in] Controller The handle of the controller; > > - @param[in, out] ConfigData The session configuration data. > > - > > - @retval EFI_SUCCESS The DNS information is got from the > DHCP ACK. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NO_MEDIA There was a media error. > > - @retval Others Other errors as indicated. > > - > > -**/ > > -EFI_STATUS > > -IScsiDoDhcp ( > > - IN EFI_HANDLE Image, > > - IN EFI_HANDLE Controller, > > - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > deleted file mode 100644 > > index d6a619f00fc0..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > +++ /dev/null > > @@ -1,140 +0,0 @@ > > -/** @file > > - The header file of IScsiDriver.c. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_DRIVER_H_ > > -#define _ISCSI_DRIVER_H_ > > - > > -#include <Uefi.h> > > -#include <Protocol/DevicePath.h> > > -#include <Protocol/LoadedImage.h> > > -#include <Protocol/HiiConfigAccess.h> > > -#include <Protocol/HiiDatabase.h> > > -#include <Library/UefiDriverEntryPoint.h> > > -#include <Library/UefiBootServicesTableLib.h> > > -#include <Library/UefiLib.h> > > -#include <Library/DevicePathLib.h> > > -#include <Protocol/DriverBinding.h> > > -#include <Protocol/ScsiPassThruExt.h> > > - > > -#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME" > > - > > -typedef struct _ISCSI_PRIVATE_PROTOCOL { > > - UINT32 Reserved; > > -} ISCSI_PRIVATE_PROTOCOL; > > - > > -// > > -// EFI Driver Binding Protocol for iSCSI driver. > > -// > > - > > -/** > > - Tests to see if this driver supports a given controller. If a child > device is > > provided, > > - it further tests to see if this driver supports creating a handle for > the > > specified child device. > > - > > - @param[in] This A pointer to the > > EFI_DRIVER_BINDING_PROTOCOL instance. > > - @param[in] ControllerHandle The handle of the controller to test. > This > > handle > > - must support a protocol interface > that supplies > > - an I/O abstraction to the driver. > > - @param[in] RemainingDevicePath A pointer to the remaining portion > of a > > device path. > > - This parameter is ignored by device > drivers, and is optional > > for bus drivers. > > - > > - > > - @retval EFI_SUCCESS The device specified by > ControllerHandle and > > - RemainingDevicePath is supported by > the driver specified > > by This. > > - @retval EFI_ALREADY_STARTED The device specified by > > ControllerHandle and > > - RemainingDevicePath is already being > managed by the > > driver > > - specified by This. > > - @retval EFI_ACCESS_DENIED The device specified by > ControllerHandle > > and > > - RemainingDevicePath is already being > managed by a > > different > > - driver or an application that > requires exclusive acces. > > - Currently not implemented. > > - @retval EFI_UNSUPPORTED The device specified by > ControllerHandle > > and > > - RemainingDevicePath is not supported > by the driver > > specified by This. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDriverBindingSupported ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ); > > - > > -/** > > - Start this driver on ControllerHandle. The Start() function is > designed to be > > - invoked from the EFI boot service ConnectController(). As a result, > much of > > - the error checking on the parameters to Start() has been moved into > this > > - common boot service. It is legal to call Start() from other locations, > > - but the following calling restrictions must be followed or the system > > behavior will not be deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE. > > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > > naturally aligned > > - EFI_DEVICE_PATH_PROTOCOL. > > - 3. Prior to calling Start(), the Supported() function for the driver > specified > > by This must > > - have been called with the same calling parameters, and Supported() > must > > have returned EFI_SUCCESS. > > - > > - @param[in] This A pointer to the > > EFI_DRIVER_BINDING_PROTOCOL instance. > > - @param[in] ControllerHandle The handle of the controller to > start. This > > handle > > - must support a protocol interface > that supplies > > - an I/O abstraction to the driver. > > - @param[in] RemainingDevicePath A pointer to the remaining portion > of a > > device path. > > - This parameter is ignored by device > drivers, and is optional > > for bus drivers. > > - > > - @retval EFI_SUCCESS The device was started. > > - @retval EFI_DEVICE_ERROR The device could not be started due > to a > > device error. > > - Currently not implemented. > > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > > due to a lack of resources. > > - @retval Others The driver failded to start the > device. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDriverBindingStart ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ); > > - > > -/** > > - Stop this driver on ControllerHandle. > > - > > - Release the control of this controller and remove the IScsi functions. > The > > Stop() > > - function is designed to be invoked from the EFI boot service > > DisconnectController(). > > - As a result, much of the error checking on the parameters to Stop() > has > > been moved > > - into this common boot service. It is legal to call Stop() from other > locations, > > - but the following calling restrictions must be followed or the system > > behavior will not be deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > > previous call to this > > - same driver's Start() function. > > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all > be a > > valid > > - EFI_HANDLE. In addition, all of these handles must have been > created in > > this driver's > > - Start() function, and the Start() function must have called > OpenProtocol() > > on > > - ControllerHandle with an Attribute of > > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > > - > > - @param[in] This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param[in] ControllerHandle A handle to the device being stopped. > The > > handle must > > - support a bus specific I/O protocol for > the driver > > - to use to stop the device. > > - @param[in] NumberOfChildren The number of child device handles in > > ChildHandleBuffer.Not used. > > - @param[in] ChildHandleBuffer An array of child handles to be freed. > May > > be NULL > > - if NumberOfChildren is 0.Not used. > > - > > - @retval EFI_SUCCESS The device was stopped. > > - @retval EFI_DEVICE_ERROR The device could not be stopped due to > a > > device error. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiDriverBindingStop ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN UINTN NumberOfChildren, > > - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > deleted file mode 100644 > > index 48729e3029f7..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > +++ /dev/null > > @@ -1,134 +0,0 @@ > > -## @file > > -# This module produces EFI iSCSI Initiator Name Protocol. > > -# > > -# This module produces EFI iSCSI Initiator Name Protocol upon EFI > TCPv4 > > Protocol > > -# and EFI DHCPv4 Protocol, to provide the capability to do the > transport for > > SCSI > > -# data over TCP/IP. It installs EFI HII Configuration Access Protocol > to > > provide > > -# one way to configurate the iSCSI setting. This driver only supports > IPv4 > > network > > -# stack. > > -# > > -# Notes: > > -# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg. > > -# 2) This driver might have some issues that have been fixed in the > IScsiDxe > > driver > > -# in NetworkPkg. > > -# 3) This driver supports fewer features than the IScsiDxe driver in > > NetworkPkg > > -# (e.g. IPv6, Dns support for target URL configuration, iSCSI > keyword > > support). > > -# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of > this > > one even > > -# though both of them can be used. > > -# > > -# Copyright (c) 2004 - 2018, Intel Corporation. All rights > reserved.<BR> > > -# This program and the accompanying materials > > -# are licensed and made available under the terms and conditions of > the > > BSD License > > -# which accompanies this distribution. The full text of the license > may be > > found at > > -# http://opensource.org/licenses/bsd-license.php > > -# > > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -# > > -## > > - > > -[Defines] > > - INF_VERSION = 0x00010005 > > - BASE_NAME = IScsi4Dxe > > - MODULE_UNI_FILE = IScsi4Dxe.uni > > - FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7 > > - MODULE_TYPE = UEFI_DRIVER > > - VERSION_STRING = 1.0 > > - ENTRY_POINT = IScsiDriverEntryPoint > > - UNLOAD_IMAGE = EfiIScsiUnload > > - > > -# > > -# The following information is for reference only and not required by > the > > build tools. > > -# > > -# VALID_ARCHITECTURES = IA32 X64 EBC > > -# > > -# DRIVER_BINDING = gIScsiDriverBinding > > -# COMPONENT_NAME = gIScsiComponentName > > -# COMPONENT_NAME2 = gIScsiComponentName2 > > -# > > - > > -[Sources] > > - IScsiTcp4Io.h > > - IScsiProto.h > > - IScsiMisc.h > > - IScsiIbft.h > > - IScsiExtScsiPassThru.h > > - IScsiDriver.h > > - IScsiDhcp.h > > - IScsiCommon.h > > - IScsiCHAP.h > > - IScsiInitiatorName.h > > - ComponentName.h > > - Md5.h > > - IScsiTcp4Io.c > > - IScsiProto.c > > - IScsiMisc.c > > - IScsiInitiatorName.c > > - IScsiIbft.c > > - IScsiExtScsiPassThru.c > > - IScsiDriver.c > > - IScsiDhcp.c > > - IScsiCHAP.c > > - ComponentName.c > > - Md5.c > > - IScsiConfigDxeStrings.uni > > - IScsiConfigDxe.vfr > > - IScsiConfig.c > > - IScsiConfig.h > > - IScsiImpl.h > > - IScsiConfigNVDataStruc.h > > - > > -[Packages] > > - MdePkg/MdePkg.dec > > - MdeModulePkg/MdeModulePkg.dec > > - > > -[LibraryClasses] > > - UefiDriverEntryPoint > > - UefiLib > > - BaseLib > > - UefiBootServicesTableLib > > - UefiRuntimeServicesTableLib > > - BaseMemoryLib > > - MemoryAllocationLib > > - DevicePathLib > > - DebugLib > > - PrintLib > > - HiiLib > > - NetLib > > - > > -[Protocols] > > - ## PRODUCES > > - ## UNDEFINED # Variable > > - gEfiIScsiInitiatorNameProtocolGuid > > - gEfiExtScsiPassThruProtocolGuid ## BY_START > > - gEfiTcp4ProtocolGuid ## TO_START > > - gEfiTcp4ServiceBindingProtocolGuid ## TO_START > > - gEfiDhcp4ProtocolGuid ## TO_START > > - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START > > - ## TO_START > > - ## PRODUCES > > - gEfiDevicePathProtocolGuid > > - gEfiHiiConfigAccessProtocolGuid ## PRODUCES > > - gEfiHiiDatabaseProtocolGuid ## CONSUMES > > - gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES > > - gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES > > - > > -[Guids] > > - gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES > ## > > Event > > - gEfiIfrTianoGuid ## SOMETIMES_PRODUCES > ## UNDEFINED > > - gEfiAcpiTableGuid ## SOMETIMES_CONSUMES > ## > > SystemTable > > - gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES > ## > > SystemTable > > - ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList" > > - ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList" > > - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch > > mVendorStorageName > > - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr > > mVendorStorageName > > - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData > > mVendorStorageName > > - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData > > mVendorStorageName > > - ## SOMETIMES_CONSUMES ## HII > > - gIp4IScsiConfigGuid > > - ## SOMETIMES_PRODUCES ## Variable > > - ## SOMETIMES_CONSUMES ## Variable > > - gIScsiCHAPAuthInfoGuid > > - > > -[UserExtensions.TianoCore."ExtraFiles"] > > - IScsi4DxeExtra.uni > > diff --git > > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > > deleted file mode 100644 > > index e635e47b9292..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > > +++ /dev/null > > @@ -1,22 +0,0 @@ > > -/** @file > > - The header file of IScsiExtScsiPassThru.c. > > - > > -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_ > > -#define _ISCSI_EXT_SCSI_PASS_THRU_H_ > > - > > -#include <Protocol/ScsiPassThruExt.h> > > - > > -extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL > > gIScsiExtScsiPassThruProtocolTemplate; > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > deleted file mode 100644 > > index 4f3828db63c6..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > +++ /dev/null > > @@ -1,38 +0,0 @@ > > -/** @file > > - Some extra definitions for iBFT. > > - > > -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_IBFT_H_ > > -#define _ISCSI_IBFT_H_ > > - > > -#include <IndustryStandard/Acpi.h> > > -#include <IndustryStandard/IScsiBootFirmwareTable.h> > > -#include <Protocol/AcpiTable.h> > > -#include <Protocol/PciIo.h> > > - > > -#define IBFT_TABLE_VAR_NAME L"iBFT" > > -#define IBFT_MAX_SIZE 4096 > > -#define IBFT_HEAP_OFFSET 2048 > > - > > -#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), > > EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT) > > - > > -/** > > - Publish and remove the iSCSI Boot Firmware Table according to the > iSCSI > > - session status. > > -**/ > > -VOID > > -IScsiPublishIbft ( > > - VOID > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > deleted file mode 100644 > > index 8a5ee2149eb2..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > +++ /dev/null > > @@ -1,168 +0,0 @@ > > -/** @file > > - The header file of IScsiImpl.c. > > - > > -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_IMPL_H_ > > -#define _ISCSI_IMPL_H_ > > - > > -#include <Uefi.h> > > - > > -#include <IndustryStandard/Dhcp.h> > > - > > -#include <Library/BaseMemoryLib.h> > > -#include <Library/MemoryAllocationLib.h> > > -#include <Library/NetLib.h> > > -#include <Library/PrintLib.h> > > -#include <Library/UefiRuntimeServicesTableLib.h> > > - > > -#include <Guid/EventGroup.h> > > - > > -#include "IScsiCommon.h" > > -#include "IScsiDriver.h" > > -#include "IScsiInitiatorName.h" > > -#include "ComponentName.h" > > -#include "IScsiConfigNVDataStruc.h" > > -#include "IScsiExtScsiPassThru.h" > > -#include "IScsiProto.h" > > -#include "IScsiMisc.h" > > -#include "IScsiCHAP.h" > > -#include "IScsiConfig.h" > > -#include "IScsiDhcp.h" > > -#include "IScsiTcp4Io.h" > > -#include "IScsiIbft.h" > > - > > - > > -#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N') > > - > > -struct _ISCSI_SESSION { > > - UINT32 Signature; > > - > > - ISCSI_SESSION_CONFIG_DATA ConfigData; > > - ISCSI_CHAP_AUTH_DATA AuthData; > > - > > - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; > > - UINTN InitiatorNameLength; > > - UINT8 State; > > - > > - UINT8 Isid[6]; > > - UINT16 Tsih; > > - > > - UINT32 CmdSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - > > - UINT32 InitiatorTaskTag; > > - UINT16 NextCid; > > - > > - LIST_ENTRY Conns; > > - UINT32 NumConns; > > - > > - LIST_ENTRY TcbList; > > - > > - // > > - // session-wide parameters > > - // > > - UINT16 TargetPortalGroupTag; > > - UINT32 MaxConnections; > > - BOOLEAN InitialR2T; > > - BOOLEAN ImmediateData; > > - UINT32 MaxBurstLength; > > - UINT32 FirstBurstLength; > > - UINT32 DefaultTime2Wait; > > - UINT32 DefaultTime2Retain; > > - UINT16 MaxOutstandingR2T; > > - BOOLEAN DataPDUInOrder; > > - BOOLEAN DataSequenceInOrder; > > - UINT8 ErrorRecoveryLevel; > > -}; > > - > > -#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N') > > - > > -struct _ISCSI_CONNECTION { > > - UINT32 Signature; > > - LIST_ENTRY Link; > > - > > - EFI_EVENT TimeoutEvent; > > - > > - ISCSI_SESSION *Session; > > - > > - UINT8 State; > > - UINT8 CurrentStage; > > - UINT8 NextStage; > > - > > - UINT8 CHAPStep; > > - > > - BOOLEAN PartialReqSent; > > - BOOLEAN PartialRspRcvd; > > - > > - BOOLEAN TransitInitiated; > > - > > - UINT16 Cid; > > - UINT32 ExpStatSN; > > - > > - // > > - // queues... > > - // > > - NET_BUF_QUEUE RspQue; > > - > > - TCP4_IO Tcp4Io; > > - > > - // > > - // connection-only parameters > > - // > > - UINT32 MaxRecvDataSegmentLength; > > - ISCSI_DIGEST_TYPE HeaderDigest; > > - ISCSI_DIGEST_TYPE DataDigest; > > -}; > > - > > -#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A') > > - > > -#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \ > > - CR ( \ > > - PassThru, \ > > - ISCSI_DRIVER_DATA, \ > > - IScsiExtScsiPassThru, \ > > - ISCSI_DRIVER_DATA_SIGNATURE \ > > - ) > > -#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \ > > - CR ( \ > > - Identifier, \ > > - ISCSI_DRIVER_DATA, \ > > - IScsiIdentifier, \ > > - ISCSI_DRIVER_DATA_SIGNATURE \ > > - ) > > -#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \ > > - CR ( \ > > - s, \ > > - ISCSI_DRIVER_DATA, \ > > - Session, \ > > - ISCSI_DRIVER_DATA_SIGNATURE \ > > - ) > > - > > -struct _ISCSI_DRIVER_DATA { > > - UINT32 Signature; > > - EFI_HANDLE Image; > > - EFI_HANDLE Controller; > > - ISCSI_PRIVATE_PROTOCOL IScsiIdentifier; > > - EFI_HANDLE ChildHandle; > > - EFI_EVENT ExitBootServiceEvent; > > - > > - EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru; > > - EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode; > > - EFI_HANDLE ExtScsiPassThruHandle; > > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > > - > > - ISCSI_SESSION Session; > > -}; > > - > > -#endif > > diff --git > > a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > > deleted file mode 100644 > > index f967fb383095..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > > +++ /dev/null > > @@ -1,74 +0,0 @@ > > -/** @file > > - The header file for EFI iSCSI Initiator Name Protocol. > > - > > -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_INITIATOR_NAME_H_ > > -#define _ISCSI_INITIATOR_NAME_H_ > > - > > -#include <Protocol/IScsiInitiatorName.h> > > - > > -extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName; > > - > > -// > > -// EFI iSCSI Initiator Name Protocol for IScsi driver. > > -// > > - > > -/** > > - Retrieves the current set value of iSCSI Initiator Name. > > - > > - @param[in] This Pointer to the > > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by > Buffer > > / Actual size of the > > - variable data buffer. > > - @param[out] Buffer Pointer to the buffer for data to be read. > > - > > - @retval EFI_SUCCESS Data was successfully retrieved into > the > > provided buffer and the > > - BufferSize was sufficient to handle the > iSCSI initiator name. > > - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. > > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. > > - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be > > retrieved due to a hardware error. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiGetInitiatorName ( > > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > > - IN OUT UINTN *BufferSize, > > - OUT VOID *Buffer > > - ); > > - > > -/** > > - Sets the iSCSI Initiator Name. > > - > > - @param[in] This Pointer to the > > EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. > > - @param[in, out] BufferSize Size of the buffer in bytes pointed to by > Buffer. > > - @param[in] Buffer Pointer to the buffer for data to be > written. > > - > > - @retval EFI_SUCCESS Data was successfully stored by the > protocol. > > - @retval EFI_UNSUPPORTED Platform policies do not allow for data > to be > > written. > > - Currently not implemented. > > - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or > > BufferSize exceeds the maximum allowed limit. > > - @retval EFI_DEVICE_ERROR The data could not be stored due to a > > hardware error. > > - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold > > the data. > > - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not > > adhere to RFC 3720 > > - (and other related protocols). > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiSetInitiatorName ( > > - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, > > - IN OUT UINTN *BufferSize, > > - IN VOID *Buffer > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > deleted file mode 100644 > > index 500e00373b25..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > +++ /dev/null > > @@ -1,317 +0,0 @@ > > -/** @file > > - Miscellaneous definitions for iSCSI driver. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_MISC_H_ > > -#define _ISCSI_MISC_H_ > > - > > -#include <Library/BaseLib.h> > > - > > -typedef struct _ISCSI_SESSION_CONFIG_DATA > > ISCSI_SESSION_CONFIG_DATA; > > - > > -/// > > -/// IPv4 Device Path Node Length > > -/// > > -#define IP4_NODE_LEN_NEW_VERSIONS 27 > > - > > -#pragma pack(1) > > -typedef struct { > > - BOOLEAN Enabled; > > - > > - BOOLEAN InitiatorInfoFromDhcp; > > - EFI_IPv4_ADDRESS LocalIp; > > - EFI_IPv4_ADDRESS SubnetMask; > > - EFI_IPv4_ADDRESS Gateway; > > - > > - BOOLEAN TargetInfoFromDhcp; > > - CHAR8 TargetName[ISCSI_NAME_MAX_SIZE]; > > - EFI_IPv4_ADDRESS TargetIp; > > - UINT16 TargetPort; > > - UINT8 BootLun[8]; > > - > > - UINT8 IsId[6]; > > -} ISCSI_SESSION_CONFIG_NVDATA; > > -#pragma pack() > > - > > -struct _ISCSI_SESSION_CONFIG_DATA { > > - ISCSI_SESSION_CONFIG_NVDATA NvData; > > - > > - EFI_IPv4_ADDRESS PrimaryDns; > > - EFI_IPv4_ADDRESS SecondaryDns; > > - EFI_IPv4_ADDRESS DhcpServer; > > -}; > > - > > -/** > > - Calculate the prefix length of the IPv4 subnet mask. > > - > > - @param[in] SubnetMask The IPv4 subnet mask. > > - > > - @return The prefix length of the subnet mask. > > - @retval 0 Other errors as indicated. > > -**/ > > -UINT8 > > -IScsiGetSubnetMaskPrefixLength ( > > - IN EFI_IPv4_ADDRESS *SubnetMask > > - ); > > - > > -/** > > - Convert the hexadecimal encoded LUN string into the 64-bit LUN. > > - > > - @param[in] Str The hexadecimal encoded LUN string. > > - @param[out] Lun Storage to return the 64-bit LUN. > > - > > - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. > > - @retval EFI_INVALID_PARAMETER The string is malformatted. > > -**/ > > -EFI_STATUS > > -IScsiAsciiStrToLun ( > > - IN CHAR8 *Str, > > - OUT UINT8 *Lun > > - ); > > - > > -/** > > - Convert the 64-bit LUN into the hexadecimal encoded LUN string. > > - > > - @param[in] Lun The 64-bit LUN. > > - @param[out] Str The storage to return the hexadecimal encoded LUN > > string. > > -**/ > > -VOID > > -IScsiLunToUnicodeStr ( > > - IN UINT8 *Lun, > > - OUT CHAR16 *Str > > - ); > > - > > -/** > > - Convert the ASCII string into a UNICODE string. > > - > > - @param[in] Source The ASCII string. > > - @param[out] Destination The storage to return the UNICODE string. > > - > > - @return CHAR16 * Pointer to the UNICODE string. > > -**/ > > -CHAR16 * > > -IScsiAsciiStrToUnicodeStr ( > > - IN CHAR8 *Source, > > - OUT CHAR16 *Destination > > - ); > > - > > -/** > > - Convert the UNICODE string into an ASCII string. > > - > > - @param[in] Source The UNICODE string. > > - @param[out] Destination The storage to return the ASCII string. > > - > > - @return CHAR8 * Pointer to the ASCII string. > > -**/ > > -CHAR8 * > > -IScsiUnicodeStrToAsciiStr ( > > - IN CHAR16 *Source, > > - OUT CHAR8 *Destination > > - ); > > - > > -/** > > - Convert the mac address into a hexadecimal encoded "-" seperated > string. > > - > > - @param[in] Mac The mac address. > > - @param[in] Len Length in bytes of the mac address. > > - @param[in] VlanId VLAN ID of the network device. > > - @param[out] Str The storage to return the mac string. > > -**/ > > -VOID > > -IScsiMacAddrToStr ( > > - IN EFI_MAC_ADDRESS *Mac, > > - IN UINT32 Len, > > - IN UINT16 VlanId, > > - OUT CHAR16 *Str > > - ); > > - > > -/** > > - Convert the decimal dotted IPv4 address into the binary IPv4 address. > > - > > - @param[in] Str The UNICODE string. > > - @param[out] Ip The storage to return the ASCII string. > > - > > - @retval EFI_SUCCESS The binary IP address is returned in Ip. > > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > > -**/ > > -EFI_STATUS > > -IScsiAsciiStrToIp ( > > - IN CHAR8 *Str, > > - OUT EFI_IPv4_ADDRESS *Ip > > - ); > > - > > -/** > > - Convert the binary encoded buffer into a hexadecimal encoded string. > > - > > - @param[in] BinBuffer The buffer containing the binary data. > > - @param[in] BinLength Length of the binary buffer. > > - @param[in, out] HexStr Pointer to the string. > > - @param[in, out] HexLength The length of the string. > > - > > - @retval EFI_SUCCESS The binary data is converted to the > hexadecimal > > string > > - and the length of the string is updated. > > - @retval EFI_BUFFER_TOO_SMALL The string is too small. > > - @retval EFI_INVALID_PARAMETER The IP string is malformatted. > > -**/ > > -EFI_STATUS > > -IScsiBinToHex ( > > - IN UINT8 *BinBuffer, > > - IN UINT32 BinLength, > > - IN OUT CHAR8 *HexStr, > > - IN OUT UINT32 *HexLength > > - ); > > - > > -/** > > - Convert the hexadecimal string into a binary encoded buffer. > > - > > - @param[in, out] BinBuffer The binary buffer. > > - @param[in, out] BinLength Length of the binary buffer. > > - @param[in] HexStr The hexadecimal string. > > - > > - @retval EFI_SUCCESS The hexadecimal string is converted into > a binary > > - encoded buffer. > > - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold > the > > converted data. > > -**/ > > -EFI_STATUS > > -IScsiHexToBin ( > > - IN OUT UINT8 *BinBuffer, > > - IN OUT UINT32 *BinLength, > > - IN CHAR8 *HexStr > > - ); > > - > > -/** > > - Generate random numbers. > > - > > - @param[in, out] Rand The buffer to contain random numbers. > > - @param[in] RandLength The length of the Rand buffer. > > -**/ > > -VOID > > -IScsiGenRandom ( > > - IN OUT UINT8 *Rand, > > - IN UINTN RandLength > > - ); > > - > > -/** > > - Create the iSCSI driver data.. > > - > > - @param[in] Image The handle of the driver image. > > - @param[in] Controller The handle of the controller. > > - > > - @return The iSCSI driver data created. > > - @retval NULL Other errors as indicated. > > -**/ > > -ISCSI_DRIVER_DATA * > > -IScsiCreateDriverData ( > > - IN EFI_HANDLE Image, > > - IN EFI_HANDLE Controller > > - ); > > - > > -/** > > - Clean the iSCSI driver data. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCES The clean operation is successful. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiCleanDriverData ( > > - IN ISCSI_DRIVER_DATA *Private > > - ); > > - > > -/** > > - Check wheather the Controller is configured to use DHCP protocol. > > - > > - @param[in] Controller The handle of the controller. > > - > > - @retval TRUE The handle of the controller need > the Dhcp > > protocol. > > - @retval FALSE The handle of the controller does > not need the > > Dhcp protocol. > > - > > -**/ > > -BOOLEAN > > -IScsiDhcpIsConfigured ( > > - IN EFI_HANDLE Controller > > - ); > > - > > -/** > > - Get the various configuration data of this iSCSI instance. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCESS The configuration of this instance is got. > > - @retval EFI_ABORTED The operation was aborted. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiGetConfigData ( > > - IN ISCSI_DRIVER_DATA *Private > > - ); > > - > > -/** > > - Get the device path of the iSCSI tcp connection and update it. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @return The updated device path. > > - @retval NULL Other errors as indicated. > > -**/ > > -EFI_DEVICE_PATH_PROTOCOL * > > -IScsiGetTcpConnDevicePath ( > > - IN ISCSI_DRIVER_DATA *Private > > - ); > > - > > -/** > > - Abort the session when the transition from BS to RT is initiated. > > - > > - @param[in] Event The event signaled. > > - @param[in] Context The iSCSI driver data. > > -**/ > > -VOID > > -EFIAPI > > -IScsiOnExitBootService ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ); > > - > > -/** > > - Tests whether a controller handle is being managed by IScsi driver. > > - > > - This function tests whether the driver specified by > DriverBindingHandle is > > - currently managing the controller specified by ControllerHandle. > This test > > - is performed by evaluating if the the protocol specified by > ProtocolGuid is > > - present on ControllerHandle and is was opened by DriverBindingHandle > > and Nic > > - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. > > - If ProtocolGuid is NULL, then ASSERT(). > > - > > - @param ControllerHandle A handle for a controller to test. > > - @param DriverBindingHandle Specifies the driver binding handle for > the > > - driver. > > - @param ProtocolGuid Specifies the protocol that the driver > specified > > - by DriverBindingHandle opens in its > Start() > > - function. > > - > > - @retval EFI_SUCCESS ControllerHandle is managed by the > driver > > - specified by DriverBindingHandle. > > - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the > > driver > > - specified by DriverBindingHandle. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -IScsiTestManagedDevice ( > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_HANDLE DriverBindingHandle, > > - IN EFI_GUID *ProtocolGuid > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > deleted file mode 100644 > > index 6469df0434a1..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > +++ /dev/null > > @@ -1,1005 +0,0 @@ > > -/** @file > > - The header file of iSCSI Protocol that defines many specific data > structures. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_PROTO_H_ > > -#define _ISCSI_PROTO_H_ > > - > > -#include <Protocol/ScsiPassThruExt.h> > > - > > -// > > -// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32 > > -// > > -#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2)) > > -#define ISCSI_SEQ_LT(s1, s2) \ > > - ( \ > > - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) > || \ > > - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) > \ > > - ) > > -#define ISCSI_SEQ_GT(s1, s2) \ > > - ( \ > > - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) > || \ > > - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) > \ > > - ) > > - > > -#define ISCSI_WELL_KNOWN_PORT 3260 > > -#define ISCSI_MAX_CONNS_PER_SESSION 1 > > - > > -#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192 > > -#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536 > > -#define DEFAULT_MAX_OUTSTANDING_R2T 1 > > - > > -#define ISCSI_VERSION_MAX 0x00 > > -#define ISCSI_VERSION_MIN 0x00 > > - > > -#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME > > EFI_TIMER_PERIOD_SECONDS(20) > > -#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME > > EFI_TIMER_PERIOD_SECONDS(20) > > - > > -#define ISCSI_KEY_AUTH_METHOD "AuthMethod" > > -#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest" > > -#define ISCSI_KEY_DATA_DIGEST "DataDigest" > > -#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections" > > -#define ISCSI_KEY_TARGET_NAME "TargetName" > > -#define ISCSI_KEY_INITIATOR_NAME "InitiatorName" > > -#define ISCSI_KEY_TARGET_ALIAS "TargetAlias" > > -#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias" > > -#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress" > > -#define ISCSI_KEY_INITIAL_R2T "InitialR2T" > > -#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData" > > -#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG > > "TargetPortalGroupTag" > > -#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength" > > -#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength" > > -#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait" > > -#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain" > > -#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T" > > -#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder" > > -#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER > > "DataSequenceInOrder" > > -#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel" > > -#define ISCSI_KEY_SESSION_TYPE "SessionType" > > -#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH > > "MaxRecvDataSegmentLength" > > - > > -#define ISCSI_KEY_VALUE_NONE "None" > > - > > -/// > > -/// connection state for initiator > > -/// > > - > > -#define CONN_STATE_FREE 0 > > -#define CONN_STATE_XPT_WAIT 1 > > -#define CONN_STATE_IN_LOGIN 2 > > -#define CONN_STATE_LOGGED_IN 3 > > -#define CONN_STATE_IN_LOGOUT 4 > > -#define CONN_STATE_LOGOUT_REQUESTED 5 > > -#define CONN_STATE_CLEANUP_WAIT 6 > > -#define CONN_STATE_IN_CLEANUP 7 > > - > > -/// > > -/// session state for initiator > > -/// > > -#define SESSION_STATE_FREE 0 > > -#define SESSION_STATE_LOGGED_IN 1 > > -#define SESSION_STATE_FAILED 2 > > - > > -typedef enum { > > - DataIn = 0, > > - DataOut = 1, > > - DataBi = 2 > > -} DATA_DIRECTION; > > - > > -#define ISCSI_RESERVED_TAG 0xffffffff > > - > > -#define ISCSI_REQ_IMMEDIATE 0x40 > > -#define ISCSI_OPCODE_MASK 0x3F > > - > > -#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) > > (PduHdr))->OpCode) = ((Op) | (Flgs))) > > -#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) > > (PduHdr))->OpCode) & ISCSI_OPCODE_MASK) > > -#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) & > > ISCSI_OPCODE_MASK) == (Op)) > > -#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode & > > ISCSI_REQ_IMMEDIATE) > > -#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) > > (PduHdr))->Flags |= (BOOLEAN)(Flag)) > > -#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) > > (PduHdr))->Flags &= ~(Flag)) > > -#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *) > > (PduHdr))->Flags & (Flag)) == (Flag)) > > -#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8) > > ((PduHdr)->Flags | ((Cur) << 2 | (Nxt)))) > > -#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & > > 0x3) > > -#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3) > > - > > -#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3) > > -#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3)) > > - > > -#define HTON24(Dst, Src) \ > > - do { \ > > - (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \ > > - (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \ > > - (Dst)[2] = (UINT8) ((Src) & 0xFF); \ > > - } while (0); > > - > > -#define NTOH24(src) (((src)[0] << 16) | > ((src)[1] << 8) | ((src)[2])) > > - > > -#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 > > (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength) > > -#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 > > (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len)) > > - > > -// > > -// initiator opcodes > > -// > > -#define ISCSI_OPCODE_NOP_OUT 0x00 > > -#define ISCSI_OPCODE_SCSI_CMD 0x01 > > -#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02 > > -#define ISCSI_OPCODE_LOGIN_REQ 0x03 > > -#define ISCSI_OPCODE_TEXT_REQ 0x04 > > -#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05 > > -#define ISCSI_OPCODE_LOGOUT_REQ 0x06 > > -#define ISCSI_OPCODE_SNACK_REQ 0x10 > > -#define ISCSI_OPCODE_VENDOR_I0 0x1c > > -#define ISCSI_OPCODE_VENDOR_I1 0x1d > > -#define ISCSI_OPCODE_VENDOR_I2 0x1e > > - > > -// > > -// target opcodes > > -// > > -#define ISCSI_OPCODE_NOP_IN 0x20 > > -#define ISCSI_OPCODE_SCSI_RSP 0x21 > > -#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22 > > -#define ISCSI_OPCODE_LOGIN_RSP 0x23 > > -#define ISCSI_OPCODE_TEXT_RSP 0x24 > > -#define ISCSI_OPCODE_SCSI_DATA_IN 0x25 > > -#define ISCSI_OPCODE_LOGOUT_RSP 0x26 > > -#define ISCSI_OPCODE_R2T 0x31 > > -#define ISCSI_OPCODE_ASYNC_MSG 0x32 > > -#define ISCSI_OPCODE_VENDOR_T0 0x3c > > -#define ISCSI_OPCODE_VENDOR_T1 0x3d > > -#define ISCSI_OPCODE_VENDOR_T2 0x3e > > -#define ISCSI_OPCODE_REJECT 0x3f > > - > > -#define ISCSI_BHS_FLAG_FINAL 0x80 > > - > > -/// > > -/// iSCSI Basic Header Segment > > -/// > > -typedef struct _ISCSI_BASIC_HEADER { > > - UINT8 OpCode; > > - UINT8 Flags; > > - UINT16 OpCodeSpecific1; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 OpCodeSpecific2[7]; > > -} ISCSI_BASIC_HEADER; > > - > > -// > > -// Defined AHS types, others are reserved. > > -// > > -#define ISCSI_AHS_TYPE_EXT_CDB 0x1 > > -#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2 > > - > > -typedef struct _ISCSI_ADDTIONAL_HEADER { > > - UINT16 Length; > > - UINT8 Type; > > - UINT8 TypeSpecific[1]; > > -} ISCSI_ADDITIONAL_HEADER; > > - > > -typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS { > > - UINT16 Length; > > - UINT8 Type; > > - UINT8 Reserved; > > - UINT32 ExpReadDataLength; > > -} ISCSI_BI_EXP_READ_DATA_LEN_AHS; > > - > > -#define SCSI_CMD_PDU_FLAG_READ 0x40 > > -#define SCSI_CMD_PDU_FLAG_WRITE 0x20 > > - > > -#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07 > > - > > -// > > -// task attributes > > -// > > -#define ISCSI_TASK_ATTR_UNTAGGED 0x00 > > -#define ISCSI_TASK_ATTR_SIMPLE 0x01 > > -#define ISCSI_TASK_ATTR_ORDERD 0x02 > > -#define ISCSI_TASK_ATTR_HOQ 0x03 > > -#define ISCSI_TASK_ATTR_ACA 0x04 > > - > > -/// > > -/// SCSI Command > > -/// > > -typedef struct _SCSI_COMMAND { > > - UINT8 OpCode; > > - UINT8 Flags; > > - UINT16 Reserved; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 ExpDataXferLength; > > - UINT32 CmdSN; > > - UINT32 ExpStatSN; > > - UINT8 Cdb[16]; > > -} SCSI_COMMAND; > > - > > -// > > -// flag bit definitions in SCSI response > > -// > > -#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10 > > -#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08 > > -#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04 > > -#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02 > > - > > -// > > -// iSCSI service response codes > > -// > > -#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00 > > -#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01 > > - > > -/// > > -/// SCSI Response > > -/// > > -typedef struct _SCSI_RESPONSE { > > - UINT8 OpCode; > > - UINT8 Flags; > > - UINT8 Response; > > - UINT8 Status; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Reserved[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 SNACKTag; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT32 ExpDataSN; > > - UINT32 BiReadResidualCount; > > - UINT32 ResidualCount; > > -} SCSI_RESPONSE; > > - > > -typedef struct _ISCSI_SENSE_DATA { > > - UINT16 Length; > > - UINT8 Data[2]; > > -} ISCSI_SENSE_DATA; > > - > > -/// > > -/// iSCSI Task Managment Function Request > > -/// > > -typedef struct _ISCSI_TMF_REQUEST { > > - UINT8 OpCode; > > - UINT8 Fuction; > > - UINT16 Reserved1; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 ReferencedTaskTag; > > - UINT32 CmdSN; > > - UINT32 ExpStatSN; > > - UINT32 RefCmdSN; > > - UINT32 ExpDataSN; > > - UINT32 Reserved2[2]; > > -} ISCSI_TMF_REQUEST; > > - > > -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0 > > -#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1 > > -#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2 > > -#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3 > > -#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4 > > -#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5 > > -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6 > > -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255 > > - > > -/// > > -/// iSCSI Task Management Function Response > > -/// > > -typedef struct _ISCSI_TMF_RESPONSE { > > - UINT8 OpCode; > > - UINT8 Reserved1; > > - UINT8 Response; > > - UINT8 Reserved2; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT32 Reserver3[2]; > > - UINT32 InitiatorTaskTag; > > - UINT32 Reserved4; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT32 Reserved[3]; > > -} ISCSI_TMF_RESPONSE; > > - > > -/// > > -/// SCSI Data-Out > > -/// > > -typedef struct _ISCSI_SCSI_DATA_OUT { > > - UINT8 OpCode; > > - UINT8 Reserved1[3]; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 TargetTransferTag; > > - UINT32 Reserved2; > > - UINT32 ExpStatSN; > > - UINT32 Reserved3; > > - UINT32 DataSN; > > - UINT32 BufferOffset; > > - UINT32 Reserved4; > > -} ISCSI_SCSI_DATA_OUT; > > - > > -#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40 > > -#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW > > SCSI_RSP_PDU_FLAG_OVERFLOW > > -#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW > > SCSI_RSP_PDU_FLAG_UNDERFLOW > > -#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01 > > - > > -/// > > -/// SCSI Data-In > > -/// > > -typedef struct _ISCSI_SCSI_DATA_IN { > > - UINT8 OpCode; > > - UINT8 Flags; > > - UINT8 Reserved1; > > - UINT8 Status; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 TargetTransferTag; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT32 DataSN; > > - UINT32 BufferOffset; > > - UINT32 ResidualCount; > > -} ISCSI_SCSI_DATA_IN; > > - > > -#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL > > (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset) > > - > > -/// > > -/// Ready To Transfer > > -/// > > -typedef struct _ISCSI_READY_TO_TRANSFER { > > - UINT8 OpCode; > > - UINT8 Reserved1[3]; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 TargetTransferTag; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT32 R2TSeqNum; > > - UINT32 BufferOffset; > > - UINT32 DesiredDataTransferLength; > > -} ISCSI_READY_TO_TRANSFER; > > - > > -typedef struct _ISCSI_ASYNC_MESSAGE { > > - UINT8 OpCode; > > - UINT8 Reserved1[8]; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 Reserved2; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT8 AsyncEvent; > > - UINT8 AsyncVCode; > > - UINT16 Parameter1; > > - UINT16 Parameter2; > > - UINT16 Parameter3; > > - UINT32 Reserved3; > > -} ISCSI_ASYNC_MESSAGE; > > - > > -#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80 > > -#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40 > > - > > -/// > > -/// Login Request > > -/// > > -typedef struct _ISCSI_LOGIN_REQUEST { > > - UINT8 OpCode; > > - UINT8 Flags; > > - UINT8 VersionMax; > > - UINT8 VersionMin; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Isid[6]; > > - UINT16 Tsih; > > - UINT32 InitiatorTaskTag; > > - UINT16 Cid; > > - UINT16 Reserved1; > > - UINT32 CmdSN; > > - UINT32 ExpStatSN; > > - UINT32 Reserved2[4]; > > -} ISCSI_LOGIN_REQUEST; > > - > > -#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT > > ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT > > -#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE > > ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE > > - > > -#define ISCSI_LOGIN_STATUS_SUCCESS 0 > > -#define ISCSI_LOGIN_STATUS_REDIRECTION 1 > > -#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2 > > -#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3 > > - > > -/// > > -/// Login Response > > -/// > > -typedef struct _ISCSI_LOGIN_RESPONSE { > > - UINT8 OpCode; > > - UINT8 Flags; > > - UINT8 VersionMax; > > - UINT8 VersionActive; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Isid[6]; > > - UINT16 Tsih; > > - UINT32 InitiatorTaskTag; > > - UINT32 Reserved1; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT8 StatusClass; > > - UINT8 StatusDetail; > > - UINT8 Reserved2[10]; > > -} ISCSI_LOGIN_RESPONSE; > > - > > -#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0 > > -#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1 > > -#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY > > 2 > > - > > -/// > > -/// Logout Request > > -/// > > -typedef struct _ISCSI_LOGOUT_REQUEST { > > - UINT8 OpCode; > > - UINT8 ReasonCode; > > - UINT16 Reserved1; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT32 Reserved2[2]; > > - UINT32 InitiatorTaskTag; > > - UINT16 Cid; > > - UINT16 Reserved3; > > - UINT32 CmdSN; > > - UINT32 ExpStatSN; > > - UINT32 Reserved4[4]; > > -} ISCSI_LOGOUT_REQUEST; > > - > > -#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0 > > -#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1 > > -#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2 > > -#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3 > > - > > -/// > > -/// Logout Response > > -/// > > -typedef struct _ISCSI_LOGOUT_RESPONSE { > > - UINT8 OpCode; > > - UINT8 Reserved1; > > - UINT8 Response; > > - UINT8 Reserved2; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT32 Reserved3[2]; > > - UINT32 InitiatorTaskTag; > > - UINT32 Reserved4; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT32 Reserved5; > > - UINT16 Time2Wait; > > - UINT16 Time2Retain; > > - UINT32 Reserved6; > > -} ISCSI_LOGOUT_RESPONSE; > > - > > -#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0 > > -#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1 > > -#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2 > > -#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3 > > - > > -/// > > -/// SNACK Request > > -/// > > -typedef struct _ISCSI_SNACK_REQUEST { > > - UINT8 OpCode; > > - UINT8 Type; > > - UINT16 Reserved1; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 TargetTransferTag; > > - UINT32 Reserved2; > > - UINT32 ExpStatSN; > > - UINT32 Reserved[2]; > > - UINT32 BegRun; > > - UINT32 RunLength; > > -} ISCSI_SNACK_REQUEST; > > - > > -/// > > -/// Reject > > -/// > > -typedef struct _ISCSI_REJECT { > > - UINT8 OpCode; > > - UINT8 Reserved1; > > - UINT8 Reason; > > - UINT8 Reserved2; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT32 Reserved3[2]; > > - UINT32 InitiatorTaskTag; > > - UINT32 Reserved4; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT32 DataSN; > > - UINT32 Reserved5[2]; > > -} ISCSI_REJECT; > > - > > -/// > > -/// NOP-Out > > -/// > > -typedef struct _ISCSI_NOP_OUT { > > - UINT8 OpCode; > > - UINT8 Reserved1[3]; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 TargetTransferTag; > > - UINT32 CmdSN; > > - UINT32 ExpStatSN; > > - UINT32 Reserved2[4]; > > -} ISCSI_NOP_OUT; > > - > > -/// > > -/// NOP-In > > -/// > > -typedef struct _ISCSI_NOP_IN { > > - UINT8 OpCode; > > - UINT8 Reserved1[3]; > > - UINT8 TotalAHSLength; > > - UINT8 DataSegmentLength[3]; > > - UINT8 Lun[8]; > > - UINT32 InitiatorTaskTag; > > - UINT32 TargetTransferTag; > > - UINT32 StatSN; > > - UINT32 ExpCmdSN; > > - UINT32 MaxCmdSN; > > - UINT32 Reserved2[3]; > > -} ISCSI_NOP_IN; > > - > > -#define ISCSI_SECURITY_NEGOTIATION 0 > > -#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1 > > -#define ISCSI_FULL_FEATURE_PHASE 3 > > - > > -typedef enum { > > - IScsiDigestNone, > > - IScsiDigestCRC32 > > -} ISCSI_DIGEST_TYPE; > > - > > -typedef struct _ISCSI_XFER_CONTEXT { > > - UINT32 TargetTransferTag; > > - UINT32 Offset; > > - UINT32 DesiredLength; > > - UINT32 ExpDataSN; > > -} ISCSI_XFER_CONTEXT; > > - > > -typedef struct _ISCSI_IN_BUFFER_CONTEXT { > > - UINT8 *InData; > > - UINT32 InDataLen; > > -} ISCSI_IN_BUFFER_CONTEXT; > > - > > -typedef struct _ISCSI_TCB { > > - LIST_ENTRY Link; > > - > > - BOOLEAN SoFarInOrder; > > - UINT32 ExpDataSN; > > - BOOLEAN FbitReceived; > > - BOOLEAN StatusXferd; > > - UINT32 ActiveR2Ts; > > - UINT32 Response; > > - CHAR8 *Reason; > > - UINT32 InitiatorTaskTag; > > - UINT32 CmdSN; > > - UINT32 SNACKTag; > > - > > - ISCSI_XFER_CONTEXT XferContext; > > - > > - ISCSI_CONNECTION *Conn; > > -} ISCSI_TCB; > > - > > -typedef struct _ISCSI_KEY_VALUE_PAIR { > > - LIST_ENTRY List; > > - > > - CHAR8 *Key; > > - CHAR8 *Value; > > -} ISCSI_KEY_VALUE_PAIR; > > - > > -/** > > - Attach the iSCSI connection to the iSCSI session. > > - > > - @param[in, out] Session The iSCSI session. > > - @param[in, out] Conn The iSCSI connection. > > -**/ > > -VOID > > -IScsiAttatchConnection ( > > - IN OUT ISCSI_SESSION *Session, > > - IN OUT ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - Detach the iSCSI connection from the session it belongs to. > > - > > - @param[in, out] Conn The iSCSI connection. > > -**/ > > -VOID > > -IScsiDetatchConnection ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - This function does the iSCSI connection login. > > - > > - @param[in, out] Conn The iSCSI connection to login. > > - > > - @retval EFI_SUCCESS The iSCSI connection is logged into the > iSCSI > > target. > > - @retval EFI_TIMEOUT Timeout happened during the login > procedure. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiConnLogin ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - Create a TCP connection for the iSCSI session. > > - > > - @param[in] Private The iSCSI driver data. > > - @param[in] Session Maximum CmdSN from the target. > > - > > - @return The newly created iSCSI connection. > > -**/ > > -ISCSI_CONNECTION * > > -IScsiCreateConnection ( > > - IN ISCSI_DRIVER_DATA *Private, > > - IN ISCSI_SESSION *Session > > - ); > > - > > -/** > > - Destroy an iSCSI connection. > > - > > - @param[in] Conn The connection to destroy. > > -**/ > > -VOID > > -IScsiDestroyConnection ( > > - IN ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - Login the iSCSI session. > > - > > - @param[in] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCESS The iSCSI session login procedure > finished. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NO_MEDIA There was a media error. > > - @retval Others Other errors as indicated. > > - > > -**/ > > -EFI_STATUS > > -IScsiSessionLogin ( > > - IN ISCSI_DRIVER_DATA *Private > > - ); > > - > > -/** > > - Build and send the iSCSI login request to the iSCSI target according > to > > - the current login stage. > > - > > - @param[in] Conn The connection in the iSCSI login phase. > > - > > - @retval EFI_SUCCESS The iSCSI login request PDU is built and > sent on > > this > > - connection. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_DEVICE_ERROR Some kind of device error happened. > > -**/ > > -EFI_STATUS > > -IScsiSendLoginReq ( > > - IN ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - Receive and process the iSCSI login response. > > - > > - @param[in] Conn The connection in the iSCSI login phase. > > - > > - @retval EFI_SUCCESS The iSCSI login response PDU is received > and > > processed. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiReceiveLoginRsp ( > > - IN ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - Add an iSCSI key-value pair as a string into the data segment of the > Login > > Request PDU. > > - The DataSegmentLength and the actual size of the net buffer > containing > > this PDU will be > > - updated. > > - > > - @param[in, out] Pdu The iSCSI PDU whose data segment the > key- > > value pair will > > - be added to. > > - @param[in] Key The key name string. > > - @param[in] Value The value string. > > - > > - @retval EFI_SUCCESS The key-valu pair is added to the PDU's > > datasegment and > > - the correspondence length fields are > updated. > > - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to > > add the key-value > > - pair. > > -**/ > > -EFI_STATUS > > -IScsiAddKeyValuePair ( > > - IN OUT NET_BUF *Pdu, > > - IN CHAR8 *Key, > > - IN CHAR8 *Value > > - ); > > - > > -/** > > - Prepare the iSCSI login request to be sent according to the current > login > > status. > > - > > - @param[in, out] Conn The connection in the iSCSI login phase. > > - > > - @return The pointer to the net buffer containing the iSCSI login > request > > built. > > - @retval Others Other errors as indicated. > > -**/ > > -NET_BUF * > > -IScsiPrepareLoginReq ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - Process the iSCSI Login Response. > > - > > - @param[in, out] Conn The connection on which the iSCSI login > response is > > received. > > - @param[in, out] Pdu The iSCSI login response PDU. > > - > > - @retval EFI_SUCCESS The iSCSI login response PDU is processed > and all > > check are passed. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > > happened. > > - @retval EFI_MEDIA_CHANGED Target is redirected. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiProcessLoginRsp ( > > - IN OUT ISCSI_CONNECTION *Conn, > > - IN OUT NET_BUF *Pdu > > - ); > > - > > -/** > > - Updated the target information according the data received in the > iSCSI > > - login response with an target redirection status. > > - > > - @param[in, out] Session The iSCSI session. > > - @param[in] Data The data segment which should contain > the > > - TargetAddress key-value list. > > - @param[in] Len Length of the data. > > - > > - @retval EFI_SUCCESS The target address is updated. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NOT_FOUND The TargetAddress key is not found. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiUpdateTargetAddress ( > > - IN OUT ISCSI_SESSION *Session, > > - IN CHAR8 *Data, > > - IN UINT32 Len > > - ); > > - > > -/** > > - The callback function to free the net buffer list. > > - > > - @param[in] Arg The opaque parameter. > > -**/ > > -VOID > > -EFIAPI > > -IScsiFreeNbufList ( > > - VOID *Arg > > - ); > > - > > -/** > > - Receive an iSCSI response PDU. An iSCSI response PDU contains an > iSCSI > > PDU header and > > - an optional data segment. The two parts will be put into two blocks > of > > buffers in the > > - net buffer. The digest check will be conducted in this function if > needed > > and the digests > > - will be trimmed from the PDU buffer. > > - > > - @param[in] Conn The iSCSI connection to receive data from. > > - @param[out] Pdu The received iSCSI pdu. > > - @param[in] Context The context used to describe information on > the > > caller provided > > - buffer to receive data segment of the iSCSI > pdu, it's optional. > > - @param[in] HeaderDigest Whether there will be header digest received. > > - @param[in] DataDigest Whether there will be data digest. > > - @param[in] TimeoutEvent The timeout event, it's optional. > > - > > - @retval EFI_SUCCESS An iSCSI pdu is received. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > > happened. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiReceivePdu ( > > - IN ISCSI_CONNECTION *Conn, > > - OUT NET_BUF **Pdu, > > - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL > > - IN BOOLEAN HeaderDigest, > > - IN BOOLEAN DataDigest, > > - IN EFI_EVENT TimeoutEvent OPTIONAL > > - ); > > - > > -/** > > - Check and get the result of the prameter negotiation. > > - > > - @param[in, out] Conn The connection in iSCSI login. > > - > > - @retval EFI_SUCCESS The parmeter check is passed and > negotiation is > > finished. > > - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error > > happened. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > -**/ > > -EFI_STATUS > > -IScsiCheckOpParams ( > > - IN OUT ISCSI_CONNECTION *Conn > > - ); > > - > > -/** > > - Fill the oprational prameters. > > - > > - @param[in] Conn The connection in iSCSI login. > > - @param[in, out] Pdu The iSCSI login request PDU to fill the > parameters. > > - > > - @retval EFI_SUCCESS The parmeters are filled into the iSCSI > login > > request PDU. > > -**/ > > -EFI_STATUS > > -IScsiFillOpParams ( > > - IN ISCSI_CONNECTION *Conn, > > - IN OUT NET_BUF *Pdu > > - ); > > - > > -/** > > - Pad the iSCSI AHS or data segment to an integer number of 4 byte > words. > > - > > - @param[in, out] Pdu The iSCSI pdu which contains segments to > pad. > > - @param[in] Len The length of the last semgnet in the > PDU. > > - > > - @retval EFI_SUCCESS The segment is padded or no need to pad > it. > > - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free > > space to add the > > - padding bytes. > > -**/ > > -EFI_STATUS > > -IScsiPadSegment ( > > - IN OUT NET_BUF *Pdu, > > - IN UINT32 Len > > - ); > > - > > -/** > > - Build a key-value list from the data segment. > > - > > - @param[in] Data The data segment containing the key-value pairs. > > - @param[in] Len Length of the data segment. > > - > > - @return The key-value list. > > - @retval NULL Other errors as indicated. > > -**/ > > -LIST_ENTRY * > > -IScsiBuildKeyValueList ( > > - IN CHAR8 *Data, > > - IN UINT32 Len > > - ); > > - > > -/** > > - Get the value string by the key name from the key-value list. If > found, > > - the key-value entry will be removed from the list. > > - > > - @param[in, out] KeyValueList The key-value list. > > - @param[in] Key The key name to find. > > - > > - @return The value string. > > -**/ > > -CHAR8 * > > -IScsiGetValueByKeyFromList ( > > - IN OUT LIST_ENTRY *KeyValueList, > > - IN CHAR8 *Key > > - ); > > - > > -/** > > - Free the key-value list. > > - > > - @param[in] KeyValueList The key-value list. > > -**/ > > -VOID > > -IScsiFreeKeyValueList ( > > - IN LIST_ENTRY *KeyValueList > > - ); > > - > > -/** > > - Normalize the iSCSI name according to RFC. > > - > > - @param[in, out] Name The iSCSI name. > > - @param[in] Len length of the iSCSI name. > > - > > - @retval EFI_SUCCESS The iSCSI name is valid and normalized. > > - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in > > the IQN format. > > -**/ > > -EFI_STATUS > > -IScsiNormalizeName ( > > - IN OUT CHAR8 *Name, > > - IN UINTN Len > > - ); > > - > > -/** > > - Execute the SCSI command issued through the EXT SCSI PASS THRU > > protocol. > > - > > - @param[in] PassThru The EXT SCSI PASS THRU protocol. > > - @param[in] Target The target ID. > > - @param[in] Lun The LUN. > > - @param[in, out] Packet The request packet containing IO request, > SCSI > > command > > - buffer and buffers to read/write. > > - > > - @retval EFI_SUCCES The SCSI command is executed and the > result is > > updated to > > - the Packet. > > - @retval EFI_DEVICE_ERROR Session state was not as required. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval EFI_NOT_READY The target can not accept new commands. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -IScsiExecuteScsiCommand ( > > - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, > > - IN UINT8 *Target, > > - IN UINT64 Lun, > > - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet > > - ); > > - > > -/** > > - Reinstate the session on some error. > > - > > - @param[in, out] Private The iSCSI driver data. > > - > > - @retval EFI_SUCCES The session is reinstated from some error. > > - @retval Other Reinstatement failed. > > -**/ > > -EFI_STATUS > > -IScsiSessionReinstatement ( > > - IN OUT ISCSI_DRIVER_DATA *Private > > - ); > > - > > -/** > > - Initialize some session parameters before login. > > - > > - @param[in, out] Session The iSCSI session. > > - @param[in] Recovery Whether the request is from a fresh new > start or > > recovery. > > -**/ > > -VOID > > -IScsiSessionInit ( > > - IN OUT ISCSI_SESSION *Session, > > - IN BOOLEAN Recovery > > - ); > > - > > -/** > > - Abort the iSCSI session, that is, reset all the connection and free > the > > - resources. > > - > > - @param[in, out] Session The iSCSI session. > > - > > - @retval EFI_SUCCES The session is aborted. > > -**/ > > -EFI_STATUS > > -IScsiSessionAbort ( > > - IN OUT ISCSI_SESSION *Session > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > deleted file mode 100644 > > index 9e0f1e0f02c2..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > +++ /dev/null > > @@ -1,142 +0,0 @@ > > -/** @file > > - iSCSI Tcp4 IO related definitions. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _ISCSI_TCP4_IO_H_ > > -#define _ISCSI_TCP4_IO_H_ > > - > > -#include <Library/NetLib.h> > > -#include <Protocol/Tcp4.h> > > - > > -typedef struct _TCP4_IO_CONFIG_DATA { > > - EFI_IPv4_ADDRESS LocalIp; > > - EFI_IPv4_ADDRESS SubnetMask; > > - EFI_IPv4_ADDRESS Gateway; > > - > > - EFI_IPv4_ADDRESS RemoteIp; > > - UINT16 RemotePort; > > -} TCP4_IO_CONFIG_DATA; > > - > > -typedef struct _TCP4_IO { > > - EFI_HANDLE Image; > > - EFI_HANDLE Controller; > > - > > - EFI_HANDLE Handle; > > - EFI_TCP4_PROTOCOL *Tcp4; > > - > > - EFI_TCP4_CONNECTION_TOKEN ConnToken; > > - EFI_TCP4_IO_TOKEN TxToken; > > - EFI_TCP4_IO_TOKEN RxToken; > > - EFI_TCP4_CLOSE_TOKEN CloseToken; > > - > > - BOOLEAN IsConnDone; > > - BOOLEAN IsTxDone; > > - BOOLEAN IsRxDone; > > - BOOLEAN IsCloseDone; > > -} TCP4_IO; > > - > > -/** > > - Create a TCP socket with the specified configuration data. > > - > > - @param[in] Image The handle of the driver image. > > - @param[in] Controller The handle of the controller. > > - @param[in] ConfigData The Tcp4 configuration data. > > - @param[in] Tcp4Io The Tcp4Io. > > - > > - @retval EFI_SUCCESS The TCP socket is created and configured. > > - @retval Others Failed to create the TCP socket or configure > it. > > -**/ > > -EFI_STATUS > > -Tcp4IoCreateSocket ( > > - IN EFI_HANDLE Image, > > - IN EFI_HANDLE Controller, > > - IN TCP4_IO_CONFIG_DATA *ConfigData, > > - IN TCP4_IO *Tcp4Io > > - ); > > - > > -/** > > - Destroy the socket. > > - > > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. > > -**/ > > -VOID > > -Tcp4IoDestroySocket ( > > - IN TCP4_IO *Tcp4Io > > - ); > > - > > -/** > > - Connect to the other endpoint of the TCP socket. > > - > > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > > - @param[in] Timeout The time to wait for connection done. > > - > > - @retval EFI_SUCCESS Connect to the other endpoint of the TCP > socket > > successfully. > > - @retval EFI_TIMEOUT Failed to connect to the other endpoint > of the > > TCP socket in the specified time period. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -Tcp4IoConnect ( > > - IN OUT TCP4_IO *Tcp4Io, > > - IN EFI_EVENT Timeout > > - ); > > - > > -/** > > - Reset the socket. > > - > > - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. > > -**/ > > -VOID > > -Tcp4IoReset ( > > - IN OUT TCP4_IO *Tcp4Io > > - ); > > - > > -/** > > - Transmit the Packet to the other endpoint of the socket. > > - > > - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. > > - @param[in] Packet The packet to transmit. > > - > > - @retval EFI_SUCCESS The packet is trasmitted. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -Tcp4IoTransmit ( > > - IN TCP4_IO *Tcp4Io, > > - IN NET_BUF *Packet > > - ); > > - > > -/** > > - Receive data from the socket. > > - > > - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be > > destroyed. > > - @param[in] Packet The buffer to hold the data copy from > the soket rx > > buffer. > > - @param[in] AsyncMode Is this receive asyncronous or not. > > - @param[in] Timeout The time to wait for receiving the > amount of data > > the Packet > > - can hold. > > - > > - @retval EFI_SUCCESS The required amount of data is received > from > > the socket. > > - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. > > - @retval EFI_TIMEOUT Failed to receive the required amount of > data in > > the > > - specified time period. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -Tcp4IoReceive ( > > - IN TCP4_IO *Tcp4Io, > > - IN NET_BUF *Packet, > > - IN BOOLEAN AsyncMode, > > - IN EFI_EVENT Timeout > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > deleted file mode 100644 > > index 1541b2d8ece1..000000000000 > > --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > +++ /dev/null > > @@ -1,80 +0,0 @@ > > -/** @file > > - Header file for Md5. > > - > > -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _MD5_H_ > > -#define _MD5_H_ > > - > > -#include <Uefi.h> > > -#include <Library/BaseLib.h> > > -#include <Library/BaseMemoryLib.h> > > -#include <Library/NetLib.h> > > - > > -#define MD5_HASHSIZE 16 > > - > > -typedef struct _MD5_CTX { > > - EFI_STATUS Status; > > - UINT64 Length; > > - UINT32 States[MD5_HASHSIZE / sizeof (UINT32)]; > > - UINT8 M[64]; > > - UINTN Count; > > -} MD5_CTX; > > - > > -/** > > - Initialize four 32-bits chaining variables and use them to do the Md5 > > transform. > > - > > - @param[out] Md5Ctx The data structure of Md5. > > - > > - @retval EFI_SUCCESS Initialization is ok. > > -**/ > > -EFI_STATUS > > -MD5Init ( > > - OUT MD5_CTX *Md5Ctx > > - ); > > - > > -/** > > - the external interface of Md5 algorithm > > - > > - @param[in, out] Md5Ctx The data structure of storing the original > data > > - segment and the final result. > > - @param[in] Data The data wanted to be transformed. > > - @param[in] DataLen The length of data. > > - > > - @retval EFI_SUCCESS The transform is ok. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -MD5Update ( > > - IN OUT MD5_CTX *Md5Ctx, > > - IN VOID *Data, > > - IN UINTN DataLen > > - ); > > - > > -/** > > - Accumulate the MD5 value of every data segment and generate the > finial > > - result according to MD5 algorithm. > > - > > - @param[in, out] Md5Ctx The data structure of storing the original > data > > - segment and the final result. > > - @param[out] HashVal The final 128-bits output. > > - > > - @retval EFI_SUCCESS The transform is ok. > > - @retval Others Other errors as indicated. > > -**/ > > -EFI_STATUS > > -MD5Final ( > > - IN OUT MD5_CTX *Md5Ctx, > > - OUT UINT8 *HashVal > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > deleted file mode 100644 > > index bea7479eb222..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > +++ /dev/null > > @@ -1,131 +0,0 @@ > > -/** @file > > - Socket implementation header file. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _SOCK_IMPL_H_ > > -#define _SOCK_IMPL_H_ > > - > > -#include "Socket.h" > > -#include "Tcp4Main.h" > > - > > -/** > > - Signal a event with the given status. > > - > > - @param Token The token's event is to be signaled. > > - @param TokenStatus The status to be sent with the event. > > - > > -**/ > > -#define SIGNAL_TOKEN(Token, TokenStatus) \ > > - do { \ > > - (Token)->Status = (TokenStatus); \ > > - gBS->SignalEvent ((Token)->Event); \ > > - } while (0) > > - > > - > > -/** > > - Supporting function for both SockImpl and SockInterface. > > - > > - @param Event The Event this notify function registered to, ignored. > > - > > -**/ > > -VOID > > -EFIAPI > > -SockFreeFoo ( > > - IN EFI_EVENT Event > > - ); > > - > > -/** > > - Process the TCP send data, buffer the tcp txdata and append > > - the buffer to socket send buffer,then try to send it. > > - > > - @param Sock Pointer to the socket. > > - @param TcpTxData Pointer to the tcp txdata. > > - > > - @retval EFI_SUCCESS The operation is completed successfully. > > - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. > > - > > -**/ > > -EFI_STATUS > > -SockProcessTcpSndData ( > > - IN SOCKET *Sock, > > - IN VOID *TcpTxData > > - ); > > - > > -/** > > - Copy data from socket buffer to application provided receive buffer. > > - > > - @param Sock Pointer to the socket. > > - @param TcpRxData Pointer to the application provided > receive > > buffer. > > - @param RcvdBytes The maximum length of the data can be > copied. > > - @param IsOOB If TRUE the data is OOB, else the data > is normal. > > - > > -**/ > > -VOID > > -SockSetTcpRxData ( > > - IN SOCKET *Sock, > > - IN VOID *TcpRxData, > > - IN UINT32 RcvdBytes, > > - IN BOOLEAN IsOOB > > - ); > > - > > -/** > > - Get received data from the socket layer to the receive token. > > - > > - @param Sock Pointer to the socket. > > - @param RcvToken Pointer to the application provided > receive token. > > - > > - @return The length of data received in this token. > > - > > -**/ > > -UINT32 > > -SockProcessRcvToken ( > > - IN SOCKET *Sock, > > - IN OUT SOCK_IO_TOKEN *RcvToken > > - ); > > - > > -/** > > - Flush the socket. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockConnFlush ( > > - IN OUT SOCKET *Sock > > - ); > > - > > -/** > > - Create a socket with initial data SockInitData. > > - > > - @param SockInitData Pointer to the initial data of the > socket. > > - > > - @return Pointer to the newly created socket. > > - > > -**/ > > -SOCKET * > > -SockCreate ( > > - IN SOCK_INIT_DATA *SockInitData > > - ); > > - > > -/** > > - Destroy a socket. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockDestroy ( > > - IN OUT SOCKET *Sock > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > deleted file mode 100644 > > index 650a7dd8651f..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > +++ /dev/null > > @@ -1,954 +0,0 @@ > > -/** @file > > - Socket header file. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _SOCKET_H_ > > -#define _SOCKET_H_ > > - > > -#include <Uefi.h> > > - > > -#include <Protocol/Ip4.h> > > -#include <Protocol/Tcp4.h> > > -#include <Protocol/Udp4.h> > > - > > -#include <Library/NetLib.h> > > -#include <Library/DebugLib.h> > > -#include <Library/BaseMemoryLib.h> > > -#include <Library/MemoryAllocationLib.h> > > -#include <Library/UefiRuntimeServicesTableLib.h> > > -#include <Library/UefiBootServicesTableLib.h> > > -#include <Library/UefiDriverEntryPoint.h> > > -#include <Library/UefiLib.h> > > -#include <Library/DpcLib.h> > > -#include <Library/PrintLib.h> > > - > > -#define SOCK_SND_BUF 0 > > -#define SOCK_RCV_BUF 1 > > - > > -#define SOCK_BUFF_LOW_WATER (2 * 1024) > > -#define SOCK_RCV_BUFF_SIZE (8 * 1024) > > -#define SOCK_SND_BUFF_SIZE (8 * 1024) > > -#define SOCK_BACKLOG 5 > > - > > -#define PROTO_RESERVED_LEN 20 > > - > > -#define SO_NO_MORE_DATA 0x0001 > > - > > -// > > -// > > -// > > -// When a socket is created it enters into SO_UNCONFIGURED, > > -// no actions can be taken on this socket, only after calling > > -// SockConfigure. The state transition diagram of socket is > > -// as following: > > -// > > -// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING > > -// ^ | | > > -// | ---> SO_LISTENING | > > -// | | > > -// |------------------SO_DISCONNECTING<-- SO_CONNECTED > > -// > > -// A passive socket can only go into SO_LISTENING and > > -// SO_UNCONFIGURED state. SO_XXXING state is a middle state > > -// when a socket is undergoing a protocol procedure such > > -// as requesting a TCP connection. > > -// > > -// > > -// > > - > > -/// > > -/// Socket state > > -/// > > -#define SO_CLOSED 0 > > -#define SO_LISTENING 1 > > -#define SO_CONNECTING 2 > > -#define SO_CONNECTED 3 > > -#define SO_DISCONNECTING 4 > > - > > -/// > > -/// Socket configure state > > -/// > > -#define SO_UNCONFIGURED 0 > > -#define SO_CONFIGURED_ACTIVE 1 > > -#define SO_CONFIGURED_PASSIVE 2 > > -#define SO_NO_MAPPING 3 > > - > > -/** > > - Set socket SO_NO_MORE_DATA flag. > > - > > - @param Sock Pointer to the socket > > - > > -**/ > > -#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= > > SO_NO_MORE_DATA) > > - > > -/** > > - Check whether the socket is unconfigured. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is unconfigued > > - @retval False The socket is not unconfigued > > - > > -**/ > > -#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == > > SO_UNCONFIGURED) > > - > > -/** > > - Check whether the socket is configured. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is configued > > - @retval False The socket is not configued > > - > > -**/ > > -#define SOCK_IS_CONFIGURED(Sock) \ > > - (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \ > > - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)) > > - > > -/** > > - Check whether the socket is configured to active mode. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is configued to active mode > > - @retval False The socket is not configued to active mode > > - > > -**/ > > -#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \ > > - ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) > > - > > -/** > > - Check whether the socket is configured to passive mode. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is configued to passive mode > > - @retval False The socket is not configued to passive > mode > > - > > -**/ > > -#define SOCK_IS_CONNECTED_PASSIVE(Sock) \ > > - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE) > > - > > -/** > > - Check whether the socket is mapped. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is no mapping > > - @retval False The socket is mapped > > - > > -**/ > > -#define SOCK_IS_NO_MAPPING(Sock) \ > > - ((Sock)->ConfigureState == SO_NO_MAPPING) > > - > > -/** > > - Check whether the socket is closed. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is closed > > - @retval False The socket is not closed > > - > > -**/ > > -#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED) > > - > > -/** > > - Check whether the socket is listening. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is listening > > - @retval False The socket is not listening > > - > > -**/ > > -#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING) > > - > > -/** > > - Check whether the socket is connecting. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is connecting > > - @retval False The socket is not connecting > > - > > -**/ > > -#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == > > SO_CONNECTING) > > - > > -/** > > - Check whether the socket has connected. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket has connected > > - @retval False The socket has not connected > > - > > -**/ > > -#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED) > > - > > -/** > > - Check whether the socket is disconnecting. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is disconnecting > > - @retval False The socket is not disconnecting > > - > > -**/ > > -#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == > > SO_DISCONNECTING) > > - > > -/** > > - Check whether the socket is no more data. > > - > > - @param Sock Pointer to the socket > > - > > - @retval True The socket is no more data > > - @retval False The socket still has data > > - > > -**/ > > -#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & > > SO_NO_MORE_DATA)) > > - > > -/** > > - Set the size of the receive buffer. > > - > > - @param Sock Pointer to the socket > > - @param Size The size to set > > - > > -**/ > > -#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = > > (Size)) > > - > > -/** > > - Get the size of the receive buffer. > > - > > - @param Sock Pointer to the socket > > - > > - @return The receive buffer size > > - > > -**/ > > -#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater) > > - > > -/** > > - Get the size of the receive data. > > - > > - @param Sock Pointer to the socket > > - > > - @return The received data size > > - > > -**/ > > -#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)- > > >BufSize) > > - > > -/** > > - Set the size of the send buffer. > > - > > - @param Sock Pointer to the socket > > - @param Size The size to set > > - > > -**/ > > -#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = > > (Size)) > > - > > -/** > > - Get the size of the send buffer. > > - > > - @param Sock Pointer to the socket > > - > > - @return The send buffer size > > - > > -**/ > > -#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater) > > - > > -/** > > - Get the size of the send data. > > - > > - @param Sock Pointer to the socket > > - > > - @return The send data size > > - > > -**/ > > -#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)- > > >BufSize) > > - > > -/** > > - Set the backlog value of the socket. > > - > > - @param Sock Pointer to the socket > > - @param Value The value to set > > - > > -**/ > > -#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value)) > > - > > -/** > > - Get the backlog value of the socket. > > - > > - @param Sock Pointer to the socket > > - > > - @return The backlog value > > - > > -**/ > > -#define GET_BACKLOG(Sock) ((Sock)->BackLog) > > - > > -/** > > - Set the socket with error state. > > - > > - @param Sock Pointer to the socket > > - @param Error The error state > > - > > -**/ > > -#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error)) > > - > > -#define SND_BUF_HDR_LEN(Sock) \ > > - ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize) > > - > > -#define RCV_BUF_HDR_LEN(Sock) \ > > - ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize) > > - > > -#define SOCK_SIGNATURE SIGNATURE_32 ('S', 'O', 'C', 'K') > > - > > -#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, > > SOCK_SIGNATURE) > > - > > -#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock) > > - > > -#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \ > > - ((Type *) (((SOCK_TOKEN *) (SockToken))->Token)) > > - > > -typedef struct _SOCKET SOCKET; > > - > > -/// > > -/// Socket completion token > > -/// > > -typedef struct _SOCK_COMPLETION_TOKEN { > > - EFI_EVENT Event; ///< The event to be issued > > - EFI_STATUS Status; ///< The status to be issued > > -} SOCK_COMPLETION_TOKEN; > > - > > -typedef union { > > - VOID *RxData; > > - VOID *TxData; > > -} SOCK_IO_DATA; > > - > > -/// > > -/// The application token with data packet > > -/// > > -typedef struct _SOCK_IO_TOKEN { > > - SOCK_COMPLETION_TOKEN Token; > > - SOCK_IO_DATA Packet; > > -} SOCK_IO_TOKEN; > > - > > -/// > > -/// The request issued from socket layer to protocol layer. > > -/// > > -#define SOCK_ATTACH 0 ///< Attach current socket to a new PCB > > -#define SOCK_DETACH 1 ///< Detach current socket from the PCB > > -#define SOCK_CONFIGURE 2 ///< Configure attached PCB > > -#define SOCK_FLUSH 3 ///< Flush attached PCB > > -#define SOCK_SND 4 ///< Need protocol to send something > > -#define SOCK_SNDPUSH 5 ///< Need protocol to send pushed data > > -#define SOCK_SNDURG 6 ///< Need protocol to send urgent data > > -#define SOCK_CONSUMED 7 ///< Application has retrieved data from > > socket > > -#define SOCK_CONNECT 8 ///< Need to connect to a peer > > -#define SOCK_CLOSE 9 ///< Need to close the protocol process > > -#define SOCK_ABORT 10 ///< Need to reset the protocol process > > -#define SOCK_POLL 11 ///< Need to poll to the protocol layer > > -#define SOCK_ROUTE 12 ///< Need to add a route information > > -#define SOCK_MODE 13 ///< Need to get the mode data of the > protocol > > -#define SOCK_GROUP 14 ///< Need to join a mcast group > > - > > -/// > > -/// The socket type. > > -/// > > -typedef enum { > > - SockDgram, ///< This socket providing datagram service > > - SockStream ///< This socket providing stream service > > -} SOCK_TYPE; > > - > > -/// > > -/// The buffer structure of rcvd data and send data used by socket. > > -/// > > -typedef struct _SOCK_BUFFER { > > - UINT32 HighWater; ///< The buffersize upper limit of > sock_buffer > > - UINT32 LowWater; ///< The low water mark of sock_buffer > > - NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data > > -} SOCK_BUFFER; > > - > > -/** > > - The handler of protocol for request from socket. > > - > > - @param Socket The socket issuing the request to protocol > > - @param Request The request issued by socket > > - @param RequestData The request related data > > - > > - @retval EFI_SUCCESS The socket request is completed > successfully. > > - @retval other The error status returned by the > corresponding TCP > > - layer function. > > - > > -**/ > > -typedef > > -EFI_STATUS > > -(*SOCK_PROTO_HANDLER) ( > > - IN SOCKET *Socket, > > - IN UINT8 Request, > > - IN VOID *RequestData > > - ); > > - > > - > > -// > > -// Socket provided oprerations for low layer protocol > > -// > > - > > -// > > -// Socket provided operations for user interface > > -// > > - > > -/** > > - Set the state of the socket. > > - > > - @param Sock Pointer to the socket. > > - @param State The new socket state to be set. > > - > > -**/ > > -VOID > > -SockSetState ( > > - IN OUT SOCKET *Sock, > > - IN UINT8 State > > - ); > > - > > -/** > > - Called by the low layer protocol to indicate the socket a connection > is > > - established. > > - > > - This function just changes the socket's state to SO_CONNECTED > > - and signals the token used for connection establishment. > > - > > - @param Sock Pointer to the socket associated with > the > > - established connection. > > - > > -**/ > > -VOID > > -SockConnEstablished ( > > - IN SOCKET *Sock > > - ); > > - > > -/** > > - Called by the low layer protocol to indicate the connection is closed. > > - > > - This function flushes the socket, sets the state to SO_CLOSED and > signals > > - the close token. > > - > > - @param Sock Pointer to the socket associated with > the closed > > - connection. > > - > > -**/ > > -VOID > > -SockConnClosed ( > > - IN OUT SOCKET *Sock > > - ); > > - > > -/** > > - Called by low layer protocol to indicate that some data is sent or > processed. > > - > > - This function trims the sent data in the socket send buffer, signals > the data > > - token if proper. > > - > > - @param Sock Pointer to the socket. > > - @param Count The length of the data processed or > sent, in bytes. > > - > > -**/ > > -VOID > > -SockDataSent ( > > - IN SOCKET *Sock, > > - IN UINT32 Count > > - ); > > - > > -/** > > - Called by the low layer protocol to copy some data in socket send > > - buffer starting from the specific offset to a buffer provided by > > - the caller. > > - > > - @param Sock Pointer to the socket. > > - @param Offset The start point of the data to be > copied. > > - @param Len The length of the data to be copied. > > - @param Dest Pointer to the destination to copy the > data. > > - > > - @return The data size copied. > > - > > -**/ > > -UINT32 > > -SockGetDataToSend ( > > - IN SOCKET *Sock, > > - IN UINT32 Offset, > > - IN UINT32 Len, > > - IN UINT8 *Dest > > - ); > > - > > -/** > > - Called by the low layer protocol to indicate that there > > - will be no more data from the communication peer. > > - > > - This function set the socket's state to SO_NO_MORE_DATA and > > - signal all queued IO tokens with the error status EFI_CONNECTION_FIN. > > - > > - @param Sock Pointer to the socket. > > - > > -**/ > > -VOID > > -SockNoMoreData ( > > - IN OUT SOCKET *Sock > > - ); > > - > > -/** > > - Called by the low layer protocol to deliver received data to socket > layer. > > - > > - This function will append the data to the socket receive buffer, set > ther > > - urgent data length and then check if any receive token can be > signaled. > > - > > - @param Sock Pointer to the socket. > > - @param NetBuffer Pointer to the buffer that contains the > received > > - data. > > - @param UrgLen The length of the urgent data in the > received data. > > - > > -**/ > > -VOID > > -SockDataRcvd ( > > - IN SOCKET *Sock, > > - IN OUT NET_BUF *NetBuffer, > > - IN UINT32 UrgLen > > - ); > > - > > -/** > > - Get the length of the free space of the specific socket buffer. > > - > > - @param Sock Pointer to the socket. > > - @param Which Flag to indicate which socket buffer to > check, > > - either send buffer or receive buffer. > > - > > - @return The length of the free space, in bytes. > > - > > -**/ > > -UINT32 > > -SockGetFreeSpace ( > > - IN SOCKET *Sock, > > - IN UINT32 Which > > - ); > > - > > -/** > > - Clone a new socket including its associated protocol control block. > > - > > - @param Sock Pointer to the socket to be cloned. > > - > > - @return Pointer to the newly cloned socket. If NULL, error condition > > occurred. > > - > > -**/ > > -SOCKET * > > -SockClone ( > > - IN SOCKET *Sock > > - ); > > - > > - > > -/// > > -/// Proto type of the create callback > > -/// > > -typedef > > -EFI_STATUS > > -(*SOCK_CREATE_CALLBACK) ( > > - IN SOCKET *This, > > - IN VOID *Context > > - ); > > - > > -/// > > -/// Proto type of the destroy callback > > -/// > > -typedef > > -VOID > > -(*SOCK_DESTROY_CALLBACK) ( > > - IN SOCKET *This, > > - IN VOID *Context > > - ); > > - > > -/// > > -/// The initialize data for create a new socket. > > -/// > > -typedef struct _SOCK_INIT_DATA { > > - SOCK_TYPE Type; > > - UINT8 State; > > - > > - SOCKET *Parent; ///< The parent of this socket > > - UINT32 BackLog; ///< The connection limit for listening > socket > > - UINT32 SndBufferSize; ///< The high water mark of send buffer > > - UINT32 RcvBufferSize; ///< The high water mark of receive > buffer > > - VOID *Protocol; ///< The pointer to protocol function > template > > - ///< wanted to install on socket > > - > > - // > > - // Callbacks after socket is created and before socket is to be > destroyed. > > - // > > - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created > > - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before > > destroied > > - VOID *Context; ///< The context of the > callback > > - > > - // > > - // Opaque protocol data. > > - // > > - VOID *ProtoData; > > - UINT32 DataSize; > > - > > - SOCK_PROTO_HANDLER ProtoHandler; ///< The handler of protocol > for > > socket request > > - > > - EFI_HANDLE DriverBinding; ///< The driver binding handle > > -} SOCK_INIT_DATA; > > - > > -/// > > -/// The union type of TCP and UDP protocol. > > -/// > > -typedef union _NET_PROTOCOL { > > - EFI_TCP4_PROTOCOL TcpProtocol; ///< Tcp protocol > > - EFI_UDP4_PROTOCOL UdpProtocol; ///< Udp protocol > > -} NET_PROTOCOL; > > - > > -/// > > -/// The socket structure representing a network service access point > > -/// > > -struct _SOCKET { > > - > > - // > > - // Socket description information > > - // > > - UINT32 Signature; ///< Signature of the socket > > - EFI_HANDLE SockHandle; ///< The virtual handle of the > socket > > - EFI_HANDLE DriverBinding; ///< Socket's driver binding > protocol > > - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; > > - EFI_DEVICE_PATH_PROTOCOL *DevicePath; > > - LIST_ENTRY Link; > > - UINT8 ConfigureState; > > - SOCK_TYPE Type; > > - UINT8 State; > > - UINT16 Flag; > > - EFI_LOCK Lock; ///< The lock of socket > > - SOCK_BUFFER SndBuffer; ///< Send buffer of application's > data > > - SOCK_BUFFER RcvBuffer; ///< Receive buffer of received > data > > - EFI_STATUS SockError; ///< The error returned by low > layer protocol > > - BOOLEAN InDestroy; > > - > > - // > > - // Fields used to manage the connection request > > - // > > - UINT32 BackLog; ///< the limit of connection to this > socket > > - UINT32 ConnCnt; ///< the current count of connections > to it > > - SOCKET *Parent; ///< listening parent that accept the > connection > > - LIST_ENTRY ConnectionList; ///< the connections maintained by > this > > socket > > - > > - // > > - // The queue to buffer application's asynchronous token > > - // > > - LIST_ENTRY ListenTokenList; > > - LIST_ENTRY RcvTokenList; > > - LIST_ENTRY SndTokenList; > > - LIST_ENTRY ProcessingSndTokenList; > > - > > - SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal > > if connected > > - SOCK_COMPLETION_TOKEN *CloseToken; ///< app's token to signal if > > closed > > - > > - // > > - // Interface for low level protocol > > - // > > - SOCK_PROTO_HANDLER ProtoHandler; ///< The request handler of > > protocol > > - UINT8 ProtoReserved[PROTO_RESERVED_LEN]; ///< Data fields reserved > > for protocol > > - NET_PROTOCOL NetProtocol; ///< TCP or UDP protocol > socket used > > - > > - // > > - // Callbacks after socket is created and before socket is to be > destroyed. > > - // > > - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created > > - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before > > destroied > > - VOID *Context; ///< The context of the > callback > > -}; > > - > > -/// > > -/// The token structure buffered in socket layer. > > -/// > > -typedef struct _SOCK_TOKEN { > > - LIST_ENTRY TokenList; ///< The entry to add in the > token list > > - SOCK_COMPLETION_TOKEN *Token; ///< The application's token > > - UINT32 RemainDataLen; ///< Unprocessed data length > > - SOCKET *Sock; ///< The poninter to the socket > this token > > - ///< belongs to > > -} SOCK_TOKEN; > > - > > -/// > > -/// Reserved data to access the NET_BUF delivered by UDP driver. > > -/// > > -typedef struct _UDP_RSV_DATA { > > - EFI_TIME TimeStamp; > > - EFI_UDP4_SESSION_DATA Session; > > -} UDP_RSV_DATA; > > - > > -/// > > -/// Reserved data to access the NET_BUF delivered by TCP driver. > > -/// > > -typedef struct _TCP_RSV_DATA { > > - UINT32 UrgLen; > > -} TCP_RSV_DATA; > > - > > -/** > > - Create a socket and its associated protocol control block > > - with the intial data SockInitData and protocol specific > > - data ProtoData. > > - > > - @param SockInitData Inital data to setting the socket. > > - > > - @return Pointer to the newly created socket. If NULL, error condition > > occured. > > - > > -**/ > > -SOCKET * > > -SockCreateChild ( > > - IN SOCK_INIT_DATA *SockInitData > > - ); > > - > > -/** > > - Destroy the socket Sock and its associated protocol control block. > > - > > - @param Sock The socket to be destroyed. > > - > > - @retval EFI_SUCCESS The socket Sock is destroyed > successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket. > > - > > -**/ > > -EFI_STATUS > > -SockDestroyChild ( > > - IN SOCKET *Sock > > - ); > > - > > -/** > > - Configure the specific socket Sock using configuration data > ConfigData. > > - > > - @param Sock Pointer to the socket to be configured. > > - @param ConfigData Pointer to the configuration data. > > - > > - @retval EFI_SUCCESS The socket is configured successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket or > > the > > - socket is already configured. > > - > > -**/ > > -EFI_STATUS > > -SockConfigure ( > > - IN SOCKET *Sock, > > - IN VOID *ConfigData > > - ); > > - > > -/** > > - Initiate a connection establishment process. > > - > > - @param Sock Pointer to the socket to initiate the > initate the > > - connection. > > - @param Token Pointer to the token used for the > connection > > - operation. > > - > > - @retval EFI_SUCCESS The connection is initialized > successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > configured to > > - be an active one, or the token is > already in one of > > - this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockConnect ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ); > > - > > -/** > > - Issue a listen token to get an existed connected network instance > > - or wait for a connection if there is none. > > - > > - @param Sock Pointer to the socket to accept > connections. > > - @param Token The token to accept a connection. > > - > > - @retval EFI_SUCCESS Either a connection is accpeted or the > Token is > > - buffered for further acception. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > configured to > > - be a passive one, or the token is > already in one of > > - this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to > > memory limit. > > - > > -**/ > > -EFI_STATUS > > -SockAccept ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ); > > - > > -/** > > - Issue a token with data to the socket to send out. > > - > > - @param Sock Pointer to the socket to process the > token with > > - data. > > - @param Token The token with data that needs to send > out. > > - > > - @retval EFI_SUCCESS The token is processed successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > in a > > - synchronized state , or the token is > already in one > > - of this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > > memory limit. > > - > > -**/ > > -EFI_STATUS > > -SockSend ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ); > > - > > -/** > > - Issue a token to get data from the socket. > > - > > - @param Sock Pointer to the socket to get data from. > > - @param Token The token to store the received data > from the > > - socket. > > - > > - @retval EFI_SUCCESS The token is processed successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > in a > > - synchronized state , or the token is > already in one > > - of this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - @retval EFI_CONNECTION_FIN The connection is closed and there is no > > more data. > > - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to > > memory limit. > > - > > -**/ > > -EFI_STATUS > > -SockRcv ( > > - IN SOCKET *Sock, > > - IN VOID *Token > > - ); > > - > > -/** > > - Reset the socket and its associated protocol control block. > > - > > - @param Sock Pointer to the socket to be flushed. > > - > > - @retval EFI_SUCCESS The socket is flushed successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket. > > - > > -**/ > > -EFI_STATUS > > -SockFlush ( > > - IN SOCKET *Sock > > - ); > > - > > -/** > > - Close or abort the socket associated connection. > > - > > - @param Sock Pointer to the socket of the connection > to close or > > - abort. > > - @param Token The token for close operation. > > - @param OnAbort TRUE for aborting the connection, FALSE > to close it. > > - > > - @retval EFI_SUCCESS The close or abort operation is > initialized > > - successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket, > > or the > > - socket is closed, or the socket is not > in a > > - synchronized state , or the token is > already in one > > - of this socket's lists. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockClose ( > > - IN SOCKET *Sock, > > - IN VOID *Token, > > - IN BOOLEAN OnAbort > > - ); > > - > > -/** > > - Get the mode data of the low layer protocol. > > - > > - @param Sock Pointer to the socket to get mode data > from. > > - @param Mode Pointer to the data to store the low > layer mode > > - information. > > - > > - @retval EFI_SUCCESS The mode data is got successfully. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockGetMode ( > > - IN SOCKET *Sock, > > - IN OUT VOID *Mode > > - ); > > - > > -/** > > - Add or remove route information in IP route table associated > > - with this socket. > > - > > - @param Sock Pointer to the socket associated with > the IP route > > - table to operate on. > > - @param RouteInfo Pointer to the route information to be > processed. > > - > > - @retval EFI_SUCCESS The route table is updated successfully. > > - @retval EFI_ACCESS_DENIED Failed to get the lock to access the > socket. > > - @retval EFI_NO_MAPPING The IP address configuration operation > is > > not > > - finished. > > - @retval EFI_NOT_STARTED The socket is not configured. > > - > > -**/ > > -EFI_STATUS > > -SockRoute ( > > - IN SOCKET *Sock, > > - IN VOID *RouteInfo > > - ); > > - > > -// > > -// Supporting function to operate on socket buffer > > -// > > - > > -/** > > - Get the first buffer block in the specific socket buffer. > > - > > - @param Sockbuf Pointer to the socket buffer. > > - > > - @return Pointer to the first buffer in the queue. NULL if the queue > is > > empty. > > - > > -**/ > > -NET_BUF * > > -SockBufFirst ( > > - IN SOCK_BUFFER *Sockbuf > > - ); > > - > > -/** > > - Get the next buffer block in the specific socket buffer. > > - > > - @param Sockbuf Pointer to the socket buffer. > > - @param SockEntry Pointer to the buffer block prior to > the required > > - one. > > - > > - @return Pointer to the buffer block next to SockEntry. NULL if > SockEntry is > > - the tail or head entry. > > - > > -**/ > > -NET_BUF * > > -SockBufNext ( > > - IN SOCK_BUFFER *Sockbuf, > > - IN NET_BUF *SockEntry > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > deleted file mode 100644 > > index 368f49c4ddb1..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > +++ /dev/null > > @@ -1,342 +0,0 @@ > > -/** @file > > - Tcp driver function header. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _TCP4_DRIVER_H_ > > -#define _TCP4_DRIVER_H_ > > - > > -#include <Protocol/ServiceBinding.h> > > -#include <Library/IpIoLib.h> > > - > > -#define TCP4_DRIVER_SIGNATURE SIGNATURE_32 ('T', 'C', 'P', '4') > > - > > -#define TCP4_PORT_KNOWN 1024 > > -#define TCP4_PORT_USER_RESERVED 65535 > > - > > -#define TCP4_FROM_THIS(a) \ > > - CR ( \ > > - (a), \ > > - TCP4_SERVICE_DATA, \ > > - Tcp4ServiceBinding, \ > > - TCP4_DRIVER_SIGNATURE \ > > - ) > > - > > -/// > > -/// TCP heartbeat tick timer. > > -/// > > -typedef struct _TCP4_HEARTBEAT_TIMER { > > - EFI_EVENT TimerEvent; ///< The event assoiated with the > timer > > - INTN RefCnt; ///< Number of reference > > -} TCP4_HEARTBEAT_TIMER; > > - > > -/// > > -/// TCP service data > > -/// > > -typedef struct _TCP4_SERVICE_DATA { > > - UINT32 Signature; > > - EFI_HANDLE ControllerHandle; > > - IP_IO *IpIo; // IP Io consumed by TCP4 > > - EFI_SERVICE_BINDING_PROTOCOL Tcp4ServiceBinding; > > - EFI_HANDLE DriverBindingHandle; > > - LIST_ENTRY SocketList; > > -} TCP4_SERVICE_DATA; > > - > > -/// > > -/// TCP protocol data > > -/// > > -typedef struct _TCP4_PROTO_DATA { > > - TCP4_SERVICE_DATA *TcpService; > > - TCP_CB *TcpPcb; > > -} TCP4_PROTO_DATA; > > - > > - > > -/** > > - Packet receive callback function provided to IP_IO, used to call > > - the proper function to handle the packet received by IP. > > - > > - @param Status Status of the received packet. > > - @param IcmpErr ICMP error number. > > - @param NetSession Pointer to the net session of this packet. > > - @param Pkt Pointer to the recieved packet. > > - @param Context Pointer to the context configured in IpIoOpen(), > not > > used > > - now. > > - > > - @return None > > - > > -**/ > > -VOID > > -EFIAPI > > -Tcp4RxCallback ( > > - IN EFI_STATUS Status, > > - IN UINT8 IcmpErr, > > - IN EFI_NET_SESSION_DATA *NetSession, > > - IN NET_BUF *Pkt, > > - IN VOID *Context OPTIONAL > > - ); > > - > > -/** > > - Send the segment to IP via IpIo function. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the TCP segment to be sent. > > - @param Src Source address of the TCP segment. > > - @param Dest Destination address of the TCP segment. > > - > > - @retval 0 The segment was sent out successfully. > > - @retval -1 The segment was failed to send. > > - > > -**/ > > -INTN > > -TcpSendIpPacket ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf, > > - IN UINT32 Src, > > - IN UINT32 Dest > > - ); > > - > > -/** > > - The procotol handler provided to the socket layer, used to > > - dispatch the socket level requests by calling the corresponding > > - TCP layer functions. > > - > > - @param Sock Pointer to the socket of this TCP > instance. > > - @param Request The code of this operation request. > > - @param Data Pointer to the operation specific data > passed in > > - together with the operation request. > > - > > - @retval EFI_SUCCESS The socket request is completed > successfully. > > - @retval other The error status returned by the > corresponding TCP > > - layer function. > > - > > -**/ > > -EFI_STATUS > > -Tcp4Dispatcher ( > > - IN SOCKET *Sock, > > - IN UINT8 Request, > > - IN VOID *Data OPTIONAL > > - ); > > - > > - > > -/** > > - The entry point for Tcp4 driver, used to install Tcp4 driver on the > > ImageHandle. > > - > > - @param ImageHandle The firmware allocated handle for this > > - driver image. > > - @param SystemTable Pointer to the EFI system table. > > - > > - @retval EFI_SUCCESS Driver loaded. > > - @retval other Driver not loaded. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverEntryPoint ( > > - IN EFI_HANDLE ImageHandle, > > - IN EFI_SYSTEM_TABLE *SystemTable > > - ); > > - > > - > > -/** > > - Tests to see if this driver supports a given controller. > > - > > - If a child device is provided, it further tests to see if this driver > supports > > - creating a handle for the specified child device. > > - > > - @param This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param ControllerHandle The handle of the controller to test. > This > > handle > > - must support a protocol interface that > supplies > > - an I/O abstraction to the driver. > > - @param RemainingDevicePath A pointer to the remaining portion of a > > device path. > > - This parameter is ignored by device > drivers, and is optional > > for bus drivers. > > - > > - > > - @retval EFI_SUCCESS The device specified by ControllerHandle > and > > - RemainingDevicePath is supported by the > driver > > - specified by This. > > - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle > > and > > - RemainingDevicePath is already being > managed by > > - the driver specified by This. > > - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle > > and > > - RemainingDevicePath is already being > managed by a > > - different driver or an application that > requires > > - exclusive access. > > - @retval EFI_UNSUPPORTED The device specified by ControllerHandle > > and > > - RemainingDevicePath is not supported by > the driver > > - specified by This. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverBindingSupported ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ); > > - > > -/** > > - Start this driver on ControllerHandle. > > - > > - The Start() function is designed to be invoked from the EFI boot > service > > - ConnectController(). As a result, much of the error checking on the > > parameters > > - to Start() has been moved into this common boot service. It is legal > to call > > - Start() from other locations, but the following calling restrictions > must be > > - followed or the system behavior will not be deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE. > > - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a > > naturally > > - aligned EFI_DEVICE_PATH_PROTOCOL. > > - 3. Prior to calling Start(), the Supported() function for the driver > specified > > - by This must have been called with the same calling parameters, > and > > Supported() > > - must have returned EFI_SUCCESS. > > - > > - @param This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param ControllerHandle The handle of the controller to start. > This > > handle > > - must support a protocol interface that > supplies > > - an I/O abstraction to the driver. > > - @param RemainingDevicePath A pointer to the remaining portion of a > > device path. > > - This parameter is ignored by device > drivers, and is > > - optional for bus drivers. > > - > > - @retval EFI_SUCCESS The device was started. > > - @retval EFI_ALREADY_STARTED The device could not be started due to a > > device error. > > - @retval EFI_OUT_OF_RESOURCES The request could not be completed > > due to a lack > > - of resources. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverBindingStart ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > > - ); > > - > > -/** > > - Stop this driver on ControllerHandle. > > - > > - The Stop() function is designed to be invoked from the EFI boot > service > > - DisconnectController(). As a result, much of the error checking on > the > > parameters > > - to Stop() has been moved into this common boot service. It is legal > to call > > Stop() > > - from other locations, but the following calling restrictions must be > followed > > - or the system behavior will not be deterministic. > > - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a > > previous call > > - to this same driver's Start() function. > > - 2. The first NumberOfChildren handles of ChildHandleBuffer must all > be a > > valid > > - EFI_HANDLE. In addition, all of these handles must have been > created in > > this > > - driver's Start() function, and the Start() function must have > called > > OpenProtocol() > > - on ControllerHandle with an Attribute of > > EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. > > - > > - @param This A pointer to the > EFI_DRIVER_BINDING_PROTOCOL > > instance. > > - @param ControllerHandle A handle to the device being stopped. The > > handle must > > - support a bus specific I/O protocol for the > driver > > - to use to stop the device. > > - @param NumberOfChildren The number of child device handles in > > ChildHandleBuffer. > > - @param ChildHandleBuffer An array of child handles to be freed. May > be > > NULL if > > - NumberOfChildren is 0. > > - > > - @retval EFI_SUCCESS The device was stopped. > > - @retval EFI_DEVICE_ERROR The device could not be stopped due to a > > device error. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4DriverBindingStop ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN UINTN NumberOfChildren, > > - IN EFI_HANDLE *ChildHandleBuffer > > - ); > > - > > -/** > > - Open Ip4 and device path protocols for a created socket, and insert > it in > > - socket list. > > - > > - @param This Pointer to the socket just created > > - @param Context Context of the socket > > - > > - @retval EFI_SUCCESS This protocol is installed successfully. > > - @retval other Some error occured. > > - > > -**/ > > -EFI_STATUS > > -Tcp4CreateSocketCallback ( > > - IN SOCKET *This, > > - IN VOID *Context > > - ); > > - > > -/** > > - Close Ip4 and device path protocols for a socket, and remove it from > socket > > list. > > - > > - @param This Pointer to the socket to be removed > > - @param Context Context of the socket > > - > > -**/ > > -VOID > > -Tcp4DestroySocketCallback ( > > - IN SOCKET *This, > > - IN VOID *Context > > - ); > > - > > -/** > > - Creates a child handle and installs a protocol. > > - > > - The CreateChild() function installs a protocol on ChildHandle. If > ChildHandle > > - is a pointer to NULL, then a new handle is created and returned in > > ChildHandle. > > - If ChildHandle is not a pointer to NULL, then the protocol installs > on the > > existing > > - ChildHandle. > > - > > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > > instance. > > - @param ChildHandle Pointer to the handle of the child to create. If > it is > > NULL, then > > - a new handle is created. If it is a pointer to an > existing UEFI > > - handle, then the protocol is added to the > existing UEFI handle. > > - > > - @retval EFI_SUCCES The protocol was added to ChildHandle. > > - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. > > - @retval EFI_OUT_OF_RESOURCES There are not enough resources > > available to create > > - the child. > > - @retval other The child handle was not created. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4ServiceBindingCreateChild ( > > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > > - IN OUT EFI_HANDLE *ChildHandle > > - ); > > - > > -/** > > - Destroys a child handle with a protocol installed on it. > > - > > - The DestroyChild() function does the opposite of CreateChild(). It > removes > > a protocol > > - that was installed by CreateChild() from ChildHandle. If the removed > > protocol is the > > - last protocol on ChildHandle, then ChildHandle is destroyed. > > - > > - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL > > instance. > > - @param ChildHandle Handle of the child to destroy > > - > > - @retval EFI_SUCCES The protocol was removed from > ChildHandle. > > - @retval EFI_UNSUPPORTED ChildHandle does not support the > protocol > > that is > > - being removed. > > - @retval EFI_INVALID_PARAMETER Child handle is NULL. > > - @retval EFI_ACCESS_DENIED The protocol could not be removed from > > the ChildHandle > > - because its services are being used. > > - @retval other The child handle was not destroyed. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4ServiceBindingDestroyChild ( > > - IN EFI_SERVICE_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ChildHandle > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > deleted file mode 100644 > > index 7c0504770b48..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > +++ /dev/null > > @@ -1,94 +0,0 @@ > > -## @file > > -# This module produces EFI TCPv4 Protocol and EFI TCPv4 Service > Binding > > Protocol. > > -# > > -# This module produces EFI TCPv4(Transmission Control Protocol version > 4) > > Protocol > > -# upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. This > driver > > only > > -# supports IPv4 network stack. > > -# > > -# Notes: > > -# 1) This driver can't co-work with the TcpDxe driver in NetworkPkg. > > -# 2) This driver might have some issues that have been fixed in the > TcpDxe > > driver > > -# in NetworkPkg. > > -# 3) This driver supports fewer features than the TcpDxe driver in > > NetworkPkg (e.g. IPv6, > > -# TCP Cancel function). > > -# 4) TcpDxe driver in NetworkPkg is recommended for use instead of > this > > one even though > > -# both of them can be used. > > -# > > -# Copyright (c) 2006 - 2018, Intel Corporation. All rights > reserved.<BR> > > -# This program and the accompanying materials > > -# are licensed and made available under the terms and conditions of > the > > BSD License > > -# which accompanies this distribution. The full text of the license > may be > > found at > > -# http://opensource.org/licenses/bsd-license.php > > -# > > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -# > > -# > > -## > > - > > -[Defines] > > - INF_VERSION = 0x00010005 > > - BASE_NAME = Tcp4Dxe > > - MODULE_UNI_FILE = Tcp4Dxe.uni > > - FILE_GUID = 6d6963ab-906d-4a65-a7ca-bd40e5d6af4d > > - MODULE_TYPE = UEFI_DRIVER > > - VERSION_STRING = 1.0 > > - ENTRY_POINT = Tcp4DriverEntryPoint > > - UNLOAD_IMAGE = NetLibDefaultUnload > > -# > > -# The following information is for reference only and not required by > the > > build tools. > > -# > > -# VALID_ARCHITECTURES = IA32 X64 EBC > > -# > > -# DRIVER_BINDING = mTcp4DriverBinding > > -# COMPONENT_NAME = gTcp4ComponentName > > -# COMPONENT_NAME2 = gTcp4ComponentName2 > > -# > > - > > -[Sources] > > - SockImpl.c > > - SockInterface.c > > - Tcp4Proto.h > > - Tcp4Main.h > > - SockImpl.h > > - Tcp4Output.c > > - Tcp4Timer.c > > - Tcp4Option.h > > - Tcp4Dispatcher.c > > - Tcp4Input.c > > - Tcp4Misc.c > > - Tcp4Main.c > > - Socket.h > > - ComponentName.c > > - Tcp4Driver.h > > - Tcp4Io.c > > - Tcp4Driver.c > > - Tcp4Func.h > > - Tcp4Option.c > > - > > - > > -[Packages] > > - MdePkg/MdePkg.dec > > - MdeModulePkg/MdeModulePkg.dec > > - > > -[LibraryClasses] > > - UefiLib > > - UefiBootServicesTableLib > > - UefiDriverEntryPoint > > - UefiRuntimeServicesTableLib > > - BaseMemoryLib > > - MemoryAllocationLib > > - DebugLib > > - NetLib > > - IpIoLib > > - DevicePathLib > > - DpcLib > > - > > -[Protocols] > > - gEfiTcp4ServiceBindingProtocolGuid ## BY_START > > - gEfiIp4ServiceBindingProtocolGuid ## TO_START > > - gEfiTcp4ProtocolGuid ## BY_START > > - gEfiIp4ProtocolGuid ## TO_START > > - > > -[UserExtensions.TianoCore."ExtraFiles"] > > - Tcp4DxeExtra.uni > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > deleted file mode 100644 > > index 1514a3917766..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > +++ /dev/null > > @@ -1,23 +0,0 @@ > > -// /** @file > > -// This module produces EFI TCPv4 Protocol and EFI TCPv4 Service > Binding > > Protocol. > > -// > > -// This module produces EFI TCPv4(Transmission Control Protocol version > 4) > > Protocol > > -// upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. > > -// > > -// Copyright (c) 2006 - 2018, Intel Corporation. All rights > reserved.<BR> > > -// > > -// This program and the accompanying materials > > -// are licensed and made available under the terms and conditions of > the > > BSD License > > -// which accompanies this distribution. The full text of the license > may be > > found at > > -// http://opensource.org/licenses/bsd-license.php > > -// > > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -// > > -// **/ > > - > > - > > -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI > > TCPv4 Protocol and EFI TCPv4 Service Binding Protocol" > > - > > -#string STR_MODULE_DESCRIPTION #language en-US "This module > > produces EFI TCPv4(Transmission Control Protocol version 4) Protocol > upon > > EFI IPv4 Protocol to provide basic TCPv4 I/O services." > > - > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > deleted file mode 100644 > > index 0e6d2f2896f3..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > +++ /dev/null > > @@ -1,20 +0,0 @@ > > -// /** @file > > -// Tcp4Dxe Localized Strings and Content > > -// > > -// Copyright (c) 2013 - 2018, Intel Corporation. All rights > reserved.<BR> > > -// > > -// This program and the accompanying materials > > -// are licensed and made available under the terms and conditions of > the > > BSD License > > -// which accompanies this distribution. The full text of the license > may be > > found at > > -// http://opensource.org/licenses/bsd-license.php > > -// > > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -// > > -// **/ > > - > > -#string STR_PROPERTIES_MODULE_NAME > > -#language en-US > > -"TCP v4 DXE Driver" > > - > > - > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > deleted file mode 100644 > > index 53b7aac8ae98..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > +++ /dev/null > > @@ -1,781 +0,0 @@ > > -/** @file > > - Tcp function header file. > > - > > -Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _TCP4_FUNC_H_ > > -#define _TCP4_FUNC_H_ > > - > > -// > > -// Declaration of all the functions in TCP > > -// protocol. It is intended to keep tcp.h > > -// clear. > > -// > > - > > -// > > -// Functions in tcp.c > > -// > > - > > -/** > > - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. > > - > > - @param Addr Pointer to the IP address needs to > match. > > - @param Port The port number needs to match. > > - > > - @return The Tcb which matches the <Addr Port> paire exists or not. > > - > > -**/ > > -BOOLEAN > > -TcpFindTcbByPeer ( > > - IN EFI_IPv4_ADDRESS *Addr, > > - IN TCP_PORTNO Port > > - ); > > - > > -/** > > - Locate the TCP_CB related to the socket pair. > > - > > - @param LocalPort The local port number. > > - @param LocalIp The local IP address. > > - @param RemotePort The remote port number. > > - @param RemoteIp The remote IP address. > > - @param Syn Whether to search the listen sockets, > if TRUE, the > > - listen sockets are searched. > > - > > - @return Pointer to the related TCP_CB, if NULL no match is found. > > - > > -**/ > > -TCP_CB * > > -TcpLocateTcb ( > > - IN TCP_PORTNO LocalPort, > > - IN UINT32 LocalIp, > > - IN TCP_PORTNO RemotePort, > > - IN UINT32 RemoteIp, > > - IN BOOLEAN Syn > > - ); > > - > > -/** > > - Insert a Tcb into the proper queue. > > - > > - @param Tcb Pointer to the TCP_CB to be inserted. > > - > > - @retval 0 The Tcb is inserted successfully. > > - @retval -1 Error condition occurred. > > - > > -**/ > > -INTN > > -TcpInsertTcb ( > > - IN TCP_CB *Tcb > > - ); > > - > > -/** > > - Clone a TCP_CB from Tcb. > > - > > - @param Tcb Pointer to the TCP_CB to be cloned. > > - > > - @return Pointer to the new cloned TCP_CB, if NULL error condition > > occurred. > > - > > -**/ > > -TCP_CB * > > -TcpCloneTcb ( > > - IN TCP_CB *Tcb > > - ); > > - > > -/** > > - Compute an ISS to be used by a new connection. > > - > > - @return The result ISS. > > - > > -**/ > > -TCP_SEQNO > > -TcpGetIss ( > > - VOID > > - ); > > - > > -/** > > - Initialize the Tcb local related members. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > -**/ > > -VOID > > -TcpInitTcbLocal ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Initialize the peer related members. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param Seg Pointer to the segment that contains > the peer's > > - intial info. > > - @param Opt Pointer to the options announced by the > peer. > > - > > -**/ > > -VOID > > -TcpInitTcbPeer ( > > - IN OUT TCP_CB *Tcb, > > - IN TCP_SEG *Seg, > > - IN TCP_OPTION *Opt > > - ); > > - > > -/** > > - Get the local mss. > > - > > - @param Sock Pointer to the socket to get mss > > - > > - @return The mss size. > > - > > -**/ > > -UINT16 > > -TcpGetRcvMss ( > > - IN SOCKET *Sock > > - ); > > - > > -/** > > - Set the Tcb's state. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param State The state to be set. > > - > > -**/ > > -VOID > > -TcpSetState ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT8 State > > - ); > > - > > -// > > -// Functions in Tcp4Output.c > > -// > > -/** > > - Send the segment to IP via IpIo function. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the TCP segment to be sent. > > - @param Src Source address of the TCP segment. > > - @param Dest Destination address of the TCP segment. > > - > > - @retval 0 The segment was sent out successfully. > > - @retval -1 The segment was failed to send. > > - > > -**/ > > -INTN > > -TcpSendIpPacket ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf, > > - IN UINT32 Src, > > - IN UINT32 Dest > > - ); > > - > > -/** > > - Check whether to send data/SYN/FIN and piggy back an ACK. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Force Whether to ignore the sender's SWS avoidance > algorithm > > and send > > - out data by force. > > - > > - @return The number of bytes sent. > > - > > -**/ > > -INTN > > -TcpToSendData ( > > - IN OUT TCP_CB *Tcb, > > - IN INTN Force > > - ); > > - > > -/** > > - Check whether to send an ACK or delayed ACK. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpToSendAck ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Send an ACK immediately. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpSendAck ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Send a zero probe segment. It can be used by keepalive and zero > window > > probe. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @retval 0 The zero probe segment was sent out successfully. > > - @retval other Error condition occurred. > > - > > -**/ > > -INTN > > -TcpSendZeroProbe ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Process the data and FIN flag, check whether to deliver > > - data to the socket layer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @retval 0 No error occurred to deliver data. > > - @retval -1 Error condition occurred. Proper response is to > reset the > > - connection. > > - > > -**/ > > -INTN > > -TcpDeliverData ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Send a RESET segment in response to the segment received. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance, may be > NULL. > > - @param Head TCP header of the segment that triggers the reset. > > - @param Len Length of the segment that triggers the reset. > > - @param Local Local IP address. > > - @param Remote Remote peer's IP address. > > - > > - @retval 0 A reset is sent or no need to send it. > > - @retval -1 No reset is sent. > > - > > -**/ > > -INTN > > -TcpSendReset ( > > - IN TCP_CB *Tcb, > > - IN TCP_HEAD *Head, > > - IN INT32 Len, > > - IN UINT32 Local, > > - IN UINT32 Remote > > - ); > > - > > -/** > > - Compute the sequence space left in the old receive window. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The sequence space left in the old receive window. > > - > > -**/ > > -UINT32 > > -TcpRcvWinOld ( > > - IN TCP_CB *Tcb > > - ); > > - > > -/** > > - Compute the current receive window. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The size of the current receive window, in bytes. > > - > > -**/ > > -UINT32 > > -TcpRcvWinNow ( > > - IN TCP_CB *Tcb > > - ); > > - > > -/** > > - Retransmit the segment from sequence Seq. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment to be > retransmitted. > > - > > - @retval 0 Retransmission succeeded. > > - @retval -1 Error condition occurred. > > - > > -**/ > > -INTN > > -TcpRetransmit ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq > > - ); > > - > > -/** > > - Compute how much data to send. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Force Whether to ignore the sender's SWS avoidance > algorithm > > and send > > - out data by force. > > - > > - @return The length of the data can be sent, if 0, no data can be sent. > > - > > -**/ > > -UINT32 > > -TcpDataToSend ( > > - IN TCP_CB *Tcb, > > - IN INTN Force > > - ); > > - > > -/** > > - Verify that the segment is in good shape. > > - > > - @param Nbuf Buffer that contains the segment to be checked. > > - > > - @retval 0 The segment is broken. > > - @retval 1 The segment is in good shape. > > - > > -**/ > > -INTN > > -TcpVerifySegment ( > > - IN NET_BUF *Nbuf > > - ); > > - > > -/** > > - Verify that all the segments in SndQue are in good shape. > > - > > - @param Head Pointer to the head node of the SndQue. > > - > > - @retval 0 At least one segment is broken. > > - @retval 1 All segments in the specific queue are in good shape. > > - > > -**/ > > -INTN > > -TcpCheckSndQue ( > > - IN LIST_ENTRY *Head > > - ); > > - > > -/** > > - Get a segment from the Tcb's SndQue. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment. > > - @param Len The maximum length of the segment. > > - > > - @return Pointer to the segment, if NULL some error occurred. > > - > > -**/ > > -NET_BUF * > > -TcpGetSegmentSndQue ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq, > > - IN UINT32 Len > > - ); > > - > > -/** > > - Get a segment from the Tcb's socket buffer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment. > > - @param Len The maximum length of the segment. > > - > > - @return Pointer to the segment, if NULL some error occurred. > > - > > -**/ > > -NET_BUF * > > -TcpGetSegmentSock ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq, > > - IN UINT32 Len > > - ); > > - > > -/** > > - Get a segment starting from sequence Seq of a maximum > > - length of Len. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seq The sequence number of the segment. > > - @param Len The maximum length of the segment. > > - > > - @return Pointer to the segment, if NULL some error occurred. > > - > > -**/ > > -NET_BUF * > > -TcpGetSegment ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Seq, > > - IN UINT32 Len > > - ); > > - > > -/** > > - Get the maximum SndNxt. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The sequence number of the maximum SndNxt. > > - > > -**/ > > -TCP_SEQNO > > -TcpGetMaxSndNxt ( > > - IN TCP_CB *Tcb > > - ); > > - > > -// > > -// Functions from Tcp4Input.c > > -// > > -/** > > - Process the received ICMP error messages for TCP. > > - > > - @param Nbuf Buffer that contains part of the TCP segment without > IP > > header > > - truncated from the ICMP error packet. > > - @param IcmpErr The ICMP error code interpreted from ICMP error > packet. > > - @param Src Source address of the ICMP error message. > > - @param Dst Destination address of the ICMP error message. > > - > > -**/ > > -VOID > > -TcpIcmpInput ( > > - IN NET_BUF *Nbuf, > > - IN UINT8 IcmpErr, > > - IN UINT32 Src, > > - IN UINT32 Dst > > - ); > > - > > -/** > > - Process the received TCP segments. > > - > > - @param Nbuf Buffer that contains received TCP segment without IP > > header. > > - @param Src Source address of the segment, or the peer's IP > address. > > - @param Dst Destination address of the segment, or the local > end's IP > > - address. > > - > > - @retval 0 Segment is processed successfully. It is either > accepted or > > - discarded. But no connection is reset by the segment. > > - @retval -1 A connection is reset by the segment. > > - > > -**/ > > -INTN > > -TcpInput ( > > - IN NET_BUF *Nbuf, > > - IN UINT32 Src, > > - IN UINT32 Dst > > - ); > > - > > -/** > > - Check whether the sequence number of the incoming segment is > > acceptable. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seg Pointer to the incoming segment. > > - > > - @retval 1 The sequence number is acceptable. > > - @retval 0 The sequence number is not acceptable. > > - > > -**/ > > -INTN > > -TcpSeqAcceptable ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEG *Seg > > - ); > > - > > -/** > > - NewReno fast recovery, RFC3782. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seg Segment that triggers the fast recovery. > > - > > -**/ > > -VOID > > -TcpFastRecover ( > > - IN OUT TCP_CB *Tcb, > > - IN TCP_SEG *Seg > > - ); > > - > > -/** > > - NewReno fast loss recovery, RFC3792. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Seg Segment that triggers the fast loss recovery. > > - > > -**/ > > -VOID > > -TcpFastLossRecover ( > > - IN OUT TCP_CB *Tcb, > > - IN TCP_SEG *Seg > > - ); > > - > > -/** > > - Compute the RTT as specified in RFC2988. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Measure Currently measured RTT in heart beats. > > - > > -**/ > > -VOID > > -TcpComputeRtt ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT32 Measure > > - ); > > - > > -/** > > - Trim off the data outside the tcb's receive window. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the NET_BUF containing the received tcp > > segment. > > - > > -**/ > > -VOID > > -TcpTrimInWnd ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ); > > - > > -/** > > - Store the data into the reassemble queue. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the buffer containing the data to be > queued. > > - > > -**/ > > -VOID > > -TcpQueueData ( > > - IN OUT TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ); > > - > > -/** > > - Ajust the send queue or the retransmit queue. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Ack The acknowledge seuqence number of the received > > segment. > > - > > -**/ > > -VOID > > -TcpAdjustSndQue ( > > - IN TCP_CB *Tcb, > > - IN TCP_SEQNO Ack > > - ); > > - > > -// > > -// Functions from Tcp4Misc.c > > -// > > -/** > > - Compute the TCP segment's checksum. > > - > > - @param Nbuf Pointer to the buffer that contains the > TCP > > - segment. > > - @param HeadSum The checksum value of the fixed part of > pseudo > > - header. > > - > > - @return The checksum value. > > - > > -**/ > > -UINT16 > > -TcpChecksum ( > > - IN NET_BUF *Nbuf, > > - IN UINT16 HeadSum > > - ); > > - > > -/** > > - Translate the information from the head of the received TCP > > - segment Nbuf contains and fill it into a TCP_SEG structure. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - @param Nbuf Pointer to the buffer contains the TCP > segment. > > - > > - @return Pointer to the TCP_SEG that contains the translated TCP head > > information. > > - > > -**/ > > -TCP_SEG * > > -TcpFormatNetbuf ( > > - IN TCP_CB *Tcb, > > - IN OUT NET_BUF *Nbuf > > - ); > > - > > -/** > > - Initialize an active connection. > > - > > - @param Tcb Pointer to the TCP_CB that wants to > initiate a > > - connection. > > - > > -**/ > > -VOID > > -TcpOnAppConnect ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Application has consumed some data, check whether > > - to send a window updata ack or a delayed ack. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > -**/ > > -VOID > > -TcpOnAppConsume ( > > - IN TCP_CB *Tcb > > - ); > > - > > -/** > > - Initiate the connection close procedure, called when > > - applications want to close the connection. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > -**/ > > -VOID > > -TcpOnAppClose ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Check whether the application's newly delivered data can be sent out. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP > instance. > > - > > - @retval 0 Whether the data is sent out or is > buffered for > > - further sending. > > - @retval -1 The Tcb is not in a state that data is > permitted to > > - be sent out. > > - > > -**/ > > -INTN > > -TcpOnAppSend ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Abort the connection by sending a reset segment, called > > - when the application wants to abort the connection. > > - > > - @param Tcb Pointer to the TCP_CB of the TCP > instance. > > - > > -**/ > > -VOID > > -TcpOnAppAbort ( > > - IN TCP_CB *Tcb > > - ); > > - > > -/** > > - Reset the connection related with Tcb. > > - > > - @param Tcb Pointer to the TCP_CB of the connection > to be > > - reset. > > - > > -**/ > > -VOID > > -TcpResetConnection ( > > - IN TCP_CB *Tcb > > - ); > > - > > -// > > -// Functions in Tcp4Timer.c > > -// > > -/** > > - Close the TCP connection. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpClose ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Heart beat timer handler, queues the DPC at TPL_CALLBACK. > > - > > - @param Event Timer event signaled, ignored. > > - @param Context Context of the timer event, ignored. > > - > > -**/ > > -VOID > > -EFIAPI > > -TcpTicking ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ); > > - > > -/** > > - Enable a TCP timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Timer The index of the timer to be enabled. > > - @param TimeOut The timeout value of this timer. > > - > > -**/ > > -VOID > > -TcpSetTimer ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT16 Timer, > > - IN UINT32 TimeOut > > - ); > > - > > -/** > > - Clear one TCP timer. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Timer The index of the timer to be cleared. > > - > > -**/ > > -VOID > > -TcpClearTimer ( > > - IN OUT TCP_CB *Tcb, > > - IN UINT16 Timer > > - ); > > - > > -/** > > - Clear all TCP timers. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpClearAllTimer ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Enable the window prober timer and set the timeout value. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpSetProbeTimer ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Enable the keepalive timer and set the timeout value. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpSetKeepaliveTimer ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Backoff the RTO. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > -**/ > > -VOID > > -TcpBackoffRto ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -/** > > - Install the device path protocol on the TCP instance. > > - > > - @param Sock Pointer to the socket representing the TCP > instance. > > - > > - @retval EFI_SUCCESS The device path protocol is installed. > > - @retval other Failed to install the device path protocol. > > - > > -**/ > > -EFI_STATUS > > -TcpInstallDevicePath ( > > - IN SOCKET *Sock > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > deleted file mode 100644 > > index c898a7ee2dd0..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > +++ /dev/null > > @@ -1,494 +0,0 @@ > > -/** @file > > - TCP4 protocol services header file. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _TCP4_MAIN_H_ > > -#define _TCP4_MAIN_H_ > > - > > -#include "Socket.h" > > - > > -#include "Tcp4Proto.h" > > -#include "Tcp4Func.h" > > -#include "Tcp4Driver.h" > > - > > - > > -extern UINT16 mTcp4RandomPort; > > -extern CHAR16 *mTcpStateName[]; > > - > > -// > > -// Driver Produced Protocol Prototypes > > -// > > - > > -// > > -// Function prototype for the Tcp4 socket request handler > > -// > > -/** > > - The procotol handler provided to the socket layer, used to > > - dispatch the socket level requests by calling the corresponding > > - TCP layer functions. > > - > > - @param Sock Pointer to the socket of this TCP > instance. > > - @param Request The code of this operation request. > > - @param Data Pointer to the operation specific data > passed in > > - together with the operation request. > > - > > - @retval EFI_SUCCESS The socket request is completed > successfully. > > - @retval other The error status returned by the > corresponding TCP > > - layer function. > > - > > -**/ > > -EFI_STATUS > > -Tcp4Dispatcher ( > > - IN SOCKET *Sock, > > - IN UINT8 Request, > > - IN VOID *Data OPTIONAL > > - ); > > - > > -/// > > -/// TCP mode data > > -/// > > -typedef struct _TCP4_MODE_DATA { > > - EFI_TCP4_CONNECTION_STATE *Tcp4State; > > - EFI_TCP4_CONFIG_DATA *Tcp4ConfigData; > > - EFI_IP4_MODE_DATA *Ip4ModeData; > > - EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData; > > - EFI_SIMPLE_NETWORK_MODE *SnpModeData; > > -} TCP4_MODE_DATA; > > - > > -/// > > -/// TCP route infomation data > > -/// > > -typedef struct _TCP4_ROUTE_INFO { > > - BOOLEAN DeleteRoute; > > - EFI_IPv4_ADDRESS *SubnetAddress; > > - EFI_IPv4_ADDRESS *SubnetMask; > > - EFI_IPv4_ADDRESS *GatewayAddress; > > -} TCP4_ROUTE_INFO; > > - > > -typedef struct { > > - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; > > - UINTN NumberOfChildren; > > - EFI_HANDLE *ChildHandleBuffer; > > -} TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT; > > - > > -/** > > - Get the current operational status of a TCP instance. > > - > > - The GetModeData() function copies the current operational settings of > this > > - EFI TCPv4 Protocol instance into user-supplied buffers. This function > can > > - also be used to retrieve the operational setting of underlying > drivers > > - such as IPv4, MNP, or SNP. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param Tcp4State Pointer to the buffer to receive the > current TCP > > - state. > > - @param Tcp4ConfigData Pointer to the buffer to receive the > current > > TCP > > - configuration. > > - @param Ip4ModeData Pointer to the buffer to receive the > current > > IPv4 > > - configuration data used by the TCPv4 > instance. > > - @param MnpConfigData Pointer to the buffer to receive the > current > > MNP > > - configuration data indirectly used > by the TCPv4 > > - Instance. > > - @param SnpModeData Pointer to the buffer to receive the > current > > SNP > > - configuration data indirectly used > by the TCPv4 > > - Instance. > > - > > - @retval EFI_SUCCESS The mode data was read. > > - @retval EFI_NOT_STARTED No configuration data is available > because > > this > > - instance hasn't been started. > > - @retval EFI_INVALID_PARAMETER This is NULL. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4GetModeData ( > > - IN EFI_TCP4_PROTOCOL *This, > > - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, > > - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, > > - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, > > - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData > > OPTIONAL, > > - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL > > - ); > > - > > - > > -/** > > - Initialize or brutally reset the operational parameters for > > - this EFI TCPv4 instance. > > - > > - The Configure() function does the following: > > - * Initialize this EFI TCPv4 instance, i.e., initialize the > communication end > > - setting, specify active open or passive open for an instance. > > - * Reset this TCPv4 instance brutally, i.e., cancel all pending > asynchronous > > - tokens, flush transmission and receiving buffer directly without > informing > > - the communication peer. > > - No other TCPv4 Protocol operation can be executed by this instance > > - until it is configured properly. For an active TCP4 instance, after a > proper > > - configuration it may call Connect() to initiates the three-way > handshake. > > - For a passive TCP4 instance, its state will transit to > Tcp4StateListen after > > - configuration, and Accept() may be called to listen the incoming TCP > > connection > > - request. If TcpConfigData is set to NULL, the instance is reset. > Resetting > > - process will be done brutally, the state machine will be set to > > Tcp4StateClosed > > - directly, the receive queue and transmit queue will be flushed, and > no > > traffic is > > - allowed through this instance. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param TcpConfigData Pointer to the configure data to > configure the > > - instance. > > - > > - @retval EFI_SUCCESS The operational settings are set, > changed, or > > - reset successfully. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (through DHCP, BOOTP, RARP, etc.) is > not > > - finished. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is > > already > > - configured. > > - @retval EFI_DEVICE_ERROR An unexpected network or system > error > > occurred. > > - @retval EFI_UNSUPPORTED One or more of the control options > are > > not > > - supported in the implementation. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system > > resources. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Configure ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL > > - ); > > - > > -/** > > - Add or delete routing entries. > > - > > - The Routes() function adds or deletes a route from the instance's > routing > > table. > > - The most specific route is selected by comparing the SubnetAddress > with > > the > > - destination IP address's arithmetical AND to the SubnetMask. > > - The default route is added with both SubnetAddress and SubnetMask set > > to 0.0.0.0. > > - The default route matches all destination IP addresses if there is no > more > > specific route. > > - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are > sent > > to > > - the destination host if its address can be found in the Address > Resolution > > Protocol (ARP) > > - cache or it is on the local subnet. If the instance is configured to > use default > > - address, a direct route to the local network will be added > automatically. > > - Each TCP instance has its own independent routing table. Instance > that > > uses the > > - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's > > routing table. > > - The copy will be updated automatically whenever the IP driver > > reconfigures its > > - instance. As a result, the previous modification to the instance's > local copy > > - will be lost. The priority of checking the route table is specific > with IP > > - implementation and every IP implementation must comply with RFC 1122. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param DeleteRoute If TRUE, delete the specified route > from > > routing > > - table; if FALSE, add the specified > route to > > - routing table. > > - DestinationAddress and SubnetMask > are used as > > - the keywords to search route entry. > > - @param SubnetAddress The destination network. > > - @param SubnetMask The subnet mask for the destination > network. > > - @param GatewayAddress The gateway address for this route. > > - It must be on the same subnet with > the station > > - address unless a direct route is > specified. > > - > > - @retval EFI_SUCCESS The operation completed successfully. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has > not > > been > > - configured. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (through DHCP, BOOTP, RARP, etc.) is > not > > - finished. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > > to add the > > - entry to the routing table. > > - @retval EFI_NOT_FOUND This route is not in the routing > table. > > - @retval EFI_ACCESS_DENIED This route is already in the routing > table. > > - @retval EFI_UNSUPPORTED The TCP driver does not support this > > operation. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Routes ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN BOOLEAN DeleteRoute, > > - IN EFI_IPv4_ADDRESS *SubnetAddress, > > - IN EFI_IPv4_ADDRESS *SubnetMask, > > - IN EFI_IPv4_ADDRESS *GatewayAddress > > - ); > > - > > -/** > > - Initiate a nonblocking TCP connection request for an active TCP > instance. > > - > > - The Connect() function will initiate an active open to the remote > peer > > configured > > - in current TCP instance if it is configured active. If the connection > succeeds > > - or fails due to any error, the ConnectionToken->CompletionToken.Event > > will be > > - signaled and ConnectionToken->CompletionToken.Status will be updated > > accordingly. > > - This function can only be called for the TCP instance in > Tcp4StateClosed > > state. > > - The instance will transfer into Tcp4StateSynSent if the function > returns > > EFI_SUCCESS. > > - If TCP three way handshake succeeds, its state will become > > Tcp4StateEstablished, > > - otherwise, the state will return to Tcp4StateClosed. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance > > - @param ConnectionToken Pointer to the connection token to > return > > when > > - the TCP three way handshake finishes. > > - > > - @retval EFI_SUCCESS The connection request is > successfully initiated > > - and the state of this TCPv4 instance > has > > - been changed to Tcp4StateSynSent. > > - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_ACCESS_DENIED The instance is not configured as an > active > > one > > - or it is not in Tcp4StateClosed > state. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough > > resource to > > - initiate the active open. > > - @retval EFI_DEVICE_ERROR An unexpected system or network > error > > occurred. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Connect ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken > > - ); > > - > > -/** > > - Listen on the passive instance to accept an incoming connection > request. > > - > > - The Accept() function initiates an asynchronous accept request to > wait for > > an > > - incoming connection on the passive TCP instance. If a remote peer > > successfully > > - establishes a connection with this instance, a new TCP instance will > be > > created > > - and its handle will be returned in ListenToken->NewChildHandle. The > > newly created > > - instance is configured by inheriting the passive instance's > configuration and > > is > > - ready for use upon return. The instance is in the > Tcp4StateEstablished state. > > - The ListenToken->CompletionToken.Event will be signaled when a new > > connection > > - is accepted, user aborts the listen or connection is reset. This > function only > > - can be called when current TCP instance is in Tcp4StateListen state. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance > > - @param ListenToken Pointer to the listen token to > return when > > - operation finishes. > > - > > - @retval EFI_SUCCESS The listen token has been queued > successfully. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_ACCESS_DENIED The instatnce is not a passive one > or it is > > not > > - in Tcp4StateListen state or a same > listen token > > - has already existed in the listen > token queue of > > - this TCP instance. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources > > to finish > > - the operation. > > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > > above category error. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Accept ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_LISTEN_TOKEN *ListenToken > > - ); > > - > > -/** > > - Queues outgoing data into the transmit queue. > > - > > - The Transmit() function queues a sending request to this TCPv4 > instance > > along > > - with the user data. The status of the token is updated and the event > in the > > token > > - will be signaled once the data is sent out or some error occurs. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance > > - @param Token Pointer to the completion token to > queue to the > > - transmit queue > > - > > - @retval EFI_SUCCESS The data has been queued for > transmission. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (DHCP, BOOTP, RARP, etc.) is not > finished yet. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_ACCESS_DENIED One or more of the following > conditions is > > TRUE: > > - * A transmit completion token with > the same > > - Token-> CompletionToken.Event was > already in the > > - transmission queue. > > - * The current instance is in > Tcp4StateClosed state > > - * The current instance is a passive > one and > > - it is in Tcp4StateListen state. > > - * User has called Close() to > disconnect this > > - connection. > > - @retval EFI_NOT_READY The completion token could not be > queued > > because > > - the transmit queue is full. > > - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data > > because of > > - resource shortage. > > - @retval EFI_NETWORK_UNREACHABLE There is no route to the > > destination network or > > - address. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Transmit ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_IO_TOKEN *Token > > - ); > > - > > -/** > > - Place an asynchronous receive request into the receiving queue. > > - > > - The Receive() function places a completion token into the receive > packet > > queue. > > - This function is always asynchronous. The caller must allocate the > > - Token->CompletionToken.Event and the FragmentBuffer used to receive > > data. He also > > - must fill the DataLength which represents the whole length of all > > FragmentBuffer. > > - When the receive operation completes, the EFI TCPv4 Protocol driver > > updates the > > - Token->CompletionToken.Status and Token->Packet.RxData fields and the > > - Token->CompletionToken.Event is signaled. If got data the data and > its > > length > > - will be copy into the FragmentTable, in the same time the full length > of > > received > > - data will be recorded in the DataLength fields. Providing a proper > > notification > > - function and context for the event will enable the user to receive > the > > notification > > - and receiving status. That notification function is guaranteed to not > be re- > > entered. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param Token Pointer to a token that is > associated with the > > - receive data descriptor. > > - > > - @retval EFI_SUCCESS The receive completion token was > cached. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_NO_MAPPING When using a default address, > > configuration > > - (DHCP, BOOTP, RARP, etc.) is not > finished yet. > > - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES The receive completion token could > > not be queued > > - due to a lack of system resources. > > - @retval EFI_DEVICE_ERROR An unexpected system or network > error > > occurred. > > - The EFI TCPv4 Protocol instance has > been reset > > - to startup defaults. > > - @retval EFI_ACCESS_DENIED One or more of the following > conditions is > > TRUE: > > - * A receive completion token with > the same > > - Token->CompletionToken.Event was > already in > > - the receive queue. > > - * The current instance is in > Tcp4StateClosed state. > > - * The current instance is a passive > one and it > > - is in Tcp4StateListen state. > > - * User has called Close() to > disconnect this > > - connection. > > - @retval EFI_CONNECTION_FIN The communication peer has closed > the > > connection > > - and there is no any buffered data in > the receive > > - buffer of this instance. > > - @retval EFI_NOT_READY The receive request could not be > queued > > because > > - the receive queue is full. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Receive ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_IO_TOKEN *Token > > - ); > > - > > -/** > > - Disconnecting a TCP connection gracefully or reset a TCP connection. > > - > > - Initiate an asynchronous close token to TCP driver. After Close() is > called, > > - any buffered transmission data will be sent by TCP driver and the > current > > - instance will have a graceful close working flow described as RFC 793 > if > > - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent > by TCP > > - driver to fast disconnect this connection. When the close operation > > completes > > - successfully the TCP instance is in Tcp4StateClosed state, all > pending > > - asynchronous operation is signaled and any buffers used for TCP > network > > traffic > > - is flushed. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param CloseToken Pointer to the close token to return > when > > - operation finishes. > > - > > - @retval EFI_SUCCESS The operation completed successfully. > > - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance > hasn't > > been > > - configured. > > - @retval EFI_ACCESS_DENIED One or more of the following are > TRUE: > > - * Configure() has been called with > TcpConfigData > > - set to NULL and this function has > not returned. > > - * Previous Close() call on this > instance has not > > - finished. > > - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. > > - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource > to > > finish the > > - operation. > > - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to > > above > > - category error. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Close ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_CLOSE_TOKEN *CloseToken > > - ); > > - > > -/** > > - Abort an asynchronous connection, listen, transmission or receive > request. > > - > > - The Cancel() function aborts a pending connection, listen, transmit > or > > receive > > - request. If Token is not NULL and the token is in the connection, > listen, > > - transmission or receive queue when it is being cancelled, its Token- > >Status > > - will be set to EFI_ABORTED and then Token->Event will be signaled. If > the > > token > > - is not in one of the queues, which usually means that the > asynchronous > > operation > > - has completed, EFI_NOT_FOUND is returned. If Token is NULL all > > asynchronous token > > - issued by Connect(), Accept(), Transmit() and Receive()will be > aborted. > > - NOTE: It has not been implemented currently. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - @param Token Pointer to a token that has been > issued by > > - Connect(), Accept(), Transmit() or > Receive(). If > > - NULL, all pending tokens issued by > above four > > - functions will be aborted. > > - > > - @retval EFI_SUCCESS The asynchronous I/O request is > aborted and > > Token->Event > > - is signaled. > > - @retval EFI_INVALID_PARAMETER This is NULL. > > - @retval EFI_NOT_STARTED This instance hasn's been configured. > > - @retval EFI_NO_MAPPING When using the default address, > > configuration > > - (DHCP, BOOTP,RARP, etc.) hasn's > finished yet. > > - @retval EFI_NOT_FOUND The asynchronous I/O request isn's > found > > in the > > - transmission or receive queue. It > has either > > - completed or wasn's issued by > Transmit() and Receive(). > > - @retval EFI_UNSUPPORTED The operation is not supported in > current > > - implementation. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Cancel ( > > - IN EFI_TCP4_PROTOCOL *This, > > - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL > > - ); > > - > > -/** > > - Poll to receive incoming data and transmit outgoing segments. > > - > > - The Poll() function increases the rate that data is moved between the > > network > > - and application and can be called when the TCP instance is created > > successfully. > > - Its use is optional. In some implementations, the periodical timer in > the > > MNP > > - driver may not poll the underlying communications device fast enough > to > > avoid > > - drop packets. Drivers and applications that are experiencing packet > loss > > should > > - try calling the Poll() function in a high frequency. > > - > > - @param This Pointer to the EFI_TCP4_PROTOCOL > instance. > > - > > - @retval EFI_SUCCESS Incoming or outgoing data was > processed. > > - @retval EFI_INVALID_PARAMETER This is NULL. > > - @retval EFI_DEVICE_ERROR An unexpected system or network > error > > occurred. > > - @retval EFI_NOT_READY No incoming or outgoing data was > > processed. > > - @retval EFI_TIMEOUT Data was dropped out of the > transmission or > > - receive queue. Consider increasing > the polling > > - rate. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -Tcp4Poll ( > > - IN EFI_TCP4_PROTOCOL *This > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > deleted file mode 100644 > > index f9782cb59801..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > +++ /dev/null > > @@ -1,130 +0,0 @@ > > -/** @file > > - Tcp option's routine header file. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _TCP4_OPTION_H_ > > -#define _TCP4_OPTION_H_ > > - > > -/// > > -/// The structure to store the parse option value. > > -/// ParseOption only parse the options, don't process them. > > -/// > > -typedef struct _TCP_OPTION { > > - UINT8 Flag; ///< Flag such as TCP_OPTION_RCVD_MSS > > - UINT8 WndScale; ///< The WndScale received > > - UINT16 Mss; ///< The Mss received > > - UINT32 TSVal; ///< The TSVal field in a timestamp option > > - UINT32 TSEcr; ///< The TSEcr field in a timestamp option > > -} TCP_OPTION; > > - > > -// > > -// supported TCP option type and their length > > -// > > -#define TCP_OPTION_EOP 0 ///< End Of oPtion > > -#define TCP_OPTION_NOP 1 ///< No-Option. > > -#define TCP_OPTION_MSS 2 ///< Maximum Segment Size > > -#define TCP_OPTION_WS 3 ///< Window scale > > -#define TCP_OPTION_TS 8 ///< Timestamp > > -#define TCP_OPTION_MSS_LEN 4 ///< Length of MSS option > > -#define TCP_OPTION_WS_LEN 3 ///< Length of window scale > option > > -#define TCP_OPTION_TS_LEN 10 ///< Length of timestamp option > > -#define TCP_OPTION_WS_ALIGNED_LEN 4 ///< Length of window scale > > option, aligned > > -#define TCP_OPTION_TS_ALIGNED_LEN 12 ///< Length of timestamp > > option, aligned > > - > > -// > > -// recommend format of timestamp window scale > > -// option for fast process. > > -// > > -#define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \ > > - (TCP_OPTION_NOP << 16) | \ > > - (TCP_OPTION_TS << 8) | \ > > - (TCP_OPTION_TS_LEN)) > > - > > -#define TCP_OPTION_WS_FAST ((TCP_OPTION_NOP << 24) | \ > > - (TCP_OPTION_WS << 16) | \ > > - (TCP_OPTION_WS_LEN << 8)) > > - > > -#define TCP_OPTION_MSS_FAST ((TCP_OPTION_MSS << 24) | > > (TCP_OPTION_MSS_LEN << 16)) > > - > > -// > > -// Other misc definations > > -// > > -#define TCP_OPTION_RCVD_MSS 0x01 > > -#define TCP_OPTION_RCVD_WS 0x02 > > -#define TCP_OPTION_RCVD_TS 0x04 > > -#define TCP_OPTION_MAX_WS 14 ///< Maxium window scale > value > > -#define TCP_OPTION_MAX_WIN 0xffff ///< Max window size in TCP > > header > > - > > - > > -/** > > - Compute the window scale value according to the given buffer size. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - > > - @return The scale value. > > - > > -**/ > > -UINT8 > > -TcpComputeScale ( > > - IN TCP_CB *Tcb > > - ); > > - > > -/** > > - Build the TCP option in three-way handshake. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the buffer to store the options. > > - > > - @return The total length of the TCP option field. > > - > > -**/ > > -UINT16 > > -TcpSynBuildOption ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ); > > - > > -/** > > - Build the TCP option in synchronized states. > > - > > - @param Tcb Pointer to the TCP_CB of this TCP instance. > > - @param Nbuf Pointer to the buffer to store the options. > > - > > - @return The total length of the TCP option field. > > - > > -**/ > > -UINT16 > > -TcpBuildOption ( > > - IN TCP_CB *Tcb, > > - IN NET_BUF *Nbuf > > - ); > > - > > -/** > > - Parse the supported options. > > - > > - @param Tcp Pointer to the TCP_CB of this TCP instance. > > - @param Option Pointer to the TCP_OPTION used to store the > successfully > > pasrsed > > - options. > > - > > - @retval 0 The options are successfully pasrsed. > > - @retval -1 Ilegal option was found. > > - > > -**/ > > -INTN > > -TcpParseOption ( > > - IN TCP_HEAD *Tcp, > > - IN OUT TCP_OPTION *Option > > - ); > > - > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > deleted file mode 100644 > > index 37191fe65112..000000000000 > > --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > +++ /dev/null > > @@ -1,357 +0,0 @@ > > -/** @file > > - Tcp Protocol header file. > > - > > -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php<BR> > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef _TCP4_PROTO_H_ > > -#define _TCP4_PROTO_H_ > > - > > -typedef struct _TCP_CB TCP_CB; > > - > > -#include "Tcp4Driver.h" > > -#include "Socket.h" > > -#include "Tcp4Option.h" > > - > > - > > - > > -/// > > -/// Tcp states, Don't change their order, it is used as > > -/// index to mTcpOutFlag and other macros > > -/// > > -#define TCP_CLOSED 0 > > -#define TCP_LISTEN 1 > > -#define TCP_SYN_SENT 2 > > -#define TCP_SYN_RCVD 3 > > -#define TCP_ESTABLISHED 4 > > -#define TCP_FIN_WAIT_1 5 > > -#define TCP_FIN_WAIT_2 6 > > -#define TCP_CLOSING 7 > > -#define TCP_TIME_WAIT 8 > > -#define TCP_CLOSE_WAIT 9 > > -#define TCP_LAST_ACK 10 > > - > > - > > -/// > > -/// Flags in the TCP header > > -/// > > -#define TCP_FLG_FIN 0x01 > > -#define TCP_FLG_SYN 0x02 > > -#define TCP_FLG_RST 0x04 > > -#define TCP_FLG_PSH 0x08 > > -#define TCP_FLG_ACK 0x10 > > -#define TCP_FLG_URG 0x20 > > - > > - // > > - // mask for all the flags > > - // > > -#define TCP_FLG_FLAG 0x3F > > - > > - > > -#define TCP_CONNECT_REFUSED (-1) ///< TCP error status > > -#define TCP_CONNECT_RESET (-2) ///< TCP error status > > -#define TCP_CONNECT_CLOSED (-3) ///< TCP error status > > - > > -// > > -// Current congestion status as suggested by RFC3782. > > -// > > -#define TCP_CONGEST_RECOVER 1 ///< During the NewReno fast > > recovery > > -#define TCP_CONGEST_LOSS 2 ///< Retxmit because of retxmit > time > > out > > -#define TCP_CONGEST_OPEN 3 ///< TCP is opening its congestion > > window > > - > > -// > > -// TCP control flags > > -// > > -#define TCP_CTRL_NO_NAGLE 0x0001 ///< Disable Nagle algorithm > > -#define TCP_CTRL_NO_KEEPALIVE 0x0002 ///< Disable keepalive timer > > -#define TCP_CTRL_NO_WS 0x0004 ///< Disable window scale > option > > -#define TCP_CTRL_RCVD_WS 0x0008 ///< Received a wnd scale > option > > in syn > > -#define TCP_CTRL_NO_TS 0x0010 ///< Disable Timestamp option > > -#define TCP_CTRL_RCVD_TS 0x0020 ///< Received a Timestamp > option > > in syn > > -#define TCP_CTRL_SND_TS 0x0040 ///< Send Timestamp option to > > remote > > -#define TCP_CTRL_SND_URG 0x0080 ///< In urgent send mode > > -#define TCP_CTRL_RCVD_URG 0x0100 ///< In urgent receive mode > > -#define TCP_CTRL_SND_PSH 0x0200 ///< In PUSH send mode > > -#define TCP_CTRL_FIN_SENT 0x0400 ///< FIN is sent > > -#define TCP_CTRL_FIN_ACKED 0x0800 ///< FIN is ACKed. > > -#define TCP_CTRL_TIMER_ON 0x1000 ///< At least one of the timer > is on > > -#define TCP_CTRL_RTT_ON 0x2000 ///< The RTT measurement is on > > -#define TCP_CTRL_ACK_NOW 0x4000 ///< Send the ACK now, don't > > delay > > - > > -// > > -// Timer related values > > -// > > -#define TCP_TIMER_CONNECT 0 ///< Connection > establishment > > timer > > -#define TCP_TIMER_REXMIT 1 ///< Retransmit > timer > > -#define TCP_TIMER_PROBE 2 ///< Window probe > timer > > -#define TCP_TIMER_KEEPALIVE 3 ///< Keepalive > timer > > -#define TCP_TIMER_FINWAIT2 4 ///< FIN_WAIT_2 > timer > > -#define TCP_TIMER_2MSL 5 ///< TIME_WAIT > tiemr > > -#define TCP_TIMER_NUMBER 6 ///< The total > number of TCP > > timer. > > -#define TCP_TICK 200 ///< Every TCP tick > is 200ms > > -#define TCP_TICK_HZ 5 ///< The frequence > of TCP tick > > -#define TCP_RTT_SHIFT 3 ///< SRTT & RTTVAR > scaled by 8 > > -#define TCP_RTO_MIN TCP_TICK_HZ ///< The minium > value of > > RTO > > -#define TCP_RTO_MAX (TCP_TICK_HZ * 60) ///< The maxium > value > > of RTO > > -#define TCP_FOLD_RTT 4 ///< Timeout > threshod to fold RTT > > - > > -// > > -// Default values for some timers > > -// > > -#define TCP_MAX_LOSS 12 ///< > Default max times to > > retxmit > > -#define TCP_KEEPALIVE_IDLE_MIN (TCP_TICK_HZ * 60 * 60 * 2) ///< First > > keep alive > > -#define TCP_KEEPALIVE_PERIOD (TCP_TICK_HZ * 60) > > -#define TCP_MAX_KEEPALIVE 8 > > -#define TCP_FIN_WAIT2_TIME (2 * TCP_TICK_HZ) > > -#define TCP_TIME_WAIT_TIME (2 * TCP_TICK_HZ) > > -#define TCP_PAWS_24DAY (24 * 24 * 60 * 60 * TCP_TICK_HZ) > > -#define TCP_CONNECT_TIME (75 * TCP_TICK_HZ) > > - > > -// > > -// The header space to be reserved before TCP data to accomodate : > > -// 60byte IP head + 60byte TCP head + link layer head > > -// > > -#define TCP_MAX_HEAD 192 > > - > > -// > > -// Value ranges for some control option > > -// > > -#define TCP_RCV_BUF_SIZE (2 * 1024 * 1024) > > -#define TCP_RCV_BUF_SIZE_MIN (8 * 1024) > > -#define TCP_SND_BUF_SIZE (2 * 1024 * 1024) > > -#define TCP_SND_BUF_SIZE_MIN (8 * 1024) > > -#define TCP_BACKLOG 10 > > -#define TCP_BACKLOG_MIN 5 > > -#define TCP_MAX_LOSS_MIN 6 > > -#define TCP_CONNECT_TIME_MIN (60 * TCP_TICK_HZ) > > -#define TCP_MAX_KEEPALIVE_MIN 4 > > -#define TCP_KEEPALIVE_IDLE_MAX (TCP_TICK_HZ * 60 * 60 * 4) > > -#define TCP_KEEPALIVE_PERIOD_MIN (TCP_TICK_HZ * 30) > > -#define TCP_FIN_WAIT2_TIME_MAX (4 * TCP_TICK_HZ) > > -#define TCP_TIME_WAIT_TIME_MAX (60 * TCP_TICK_HZ) > > - > > -/// > > -/// TCP segmentation data > > -/// > > -typedef struct _TCP_SEG { > > - TCP_SEQNO Seq; ///< Starting sequence number > > - TCP_SEQNO End; ///< The sequence of the last byte + 1, include > SYN/FIN. > > End-Seq = SEG.LEN > > - TCP_SEQNO Ack; ///< ACK field in the segment > > - UINT8 Flag; ///< TCP header flags > > - UINT16 Urg; ///< Valid if URG flag is set. > > - UINT32 Wnd; ///< TCP window size field > > -} TCP_SEG; > > - > > -/// > > -/// Network endpoint, IP+Port structure > > -/// > > -typedef struct _TCP_PEER { > > - UINT32 Ip; ///< IP address, network byte order > > - TCP_PORTNO Port; ///< Port number, network byte order > > -} TCP_PEER; > > - > > -/// > > -/// TCP control block, it includes various states > > -/// > > -struct _TCP_CB { > > - LIST_ENTRY List; ///< Back and forward link entry > > - TCP_CB *Parent; ///< The parent TCP_CB structure > > - > > - SOCKET *Sk; ///< The socket it controled. > > - TCP_PEER LocalEnd; ///< Local endpoint > > - TCP_PEER RemoteEnd;///< Remote endpoint > > - > > - LIST_ENTRY SndQue; ///< Retxmission queue > > - LIST_ENTRY RcvQue; ///< Reassemble queue > > - UINT32 CtrlFlag; ///< Control flags, such as NO_NAGLE > > - INT32 Error; ///< Soft error status, such as > TCP_CONNECT_RESET > > - > > - // > > - // RFC793 and RFC1122 defined variables > > - // > > - UINT8 State; ///< TCP state, such as SYN_SENT, > LISTEN > > - UINT8 DelayedAck; ///< Number of delayed ACKs > > - UINT16 HeadSum; ///< Checksum of the fixed parts of > pesudo > > - ///< header: Src IP, Dst IP, 0, > Protocol, > > - ///< not include the TCP length. > > - > > - TCP_SEQNO Iss; ///< Initial Sending Sequence > > - TCP_SEQNO SndUna; ///< First unacknowledged data > > - TCP_SEQNO SndNxt; ///< Next data sequence to send. > > - TCP_SEQNO SndPsh; ///< Send PUSH point > > - TCP_SEQNO SndUp; ///< Send urgent point > > - UINT32 SndWnd; ///< Window advertised by the remote > peer > > - UINT32 SndWndMax; ///< Max send window advertised by the > peer > > - TCP_SEQNO SndWl1; ///< Seq number used for last window > update > > - TCP_SEQNO SndWl2; ///< Ack no of last window update > > - UINT16 SndMss; ///< Max send segment size > > - TCP_SEQNO RcvNxt; ///< Next sequence no to receive > > - UINT32 RcvWnd; ///< Window advertised by the local > peer > > - TCP_SEQNO RcvWl2; ///< The RcvNxt (or ACK) of last window > update. > > - ///< It is necessary because of delayed > ACK > > - > > - TCP_SEQNO RcvUp; ///< Urgent point; > > - TCP_SEQNO Irs; ///< Initial Receiving > Sequence > > - UINT16 RcvMss; ///< Max receive segment > size > > - UINT16 EnabledTimer; ///< Which timer is > currently enabled > > - UINT32 Timer[TCP_TIMER_NUMBER]; ///< When the timer will > expire > > - INT32 NextExpire; ///< Count down offset for the nearest > timer > > - UINT32 Idle; ///< How long the connection is in > idle > > - UINT32 ProbeTime; ///< The time out value for current > window > > prober > > - BOOLEAN ProbeTimerOn;///< If TRUE, the probe time is on. > > - > > - // > > - // RFC1323 defined variables, about window scale, > > - // timestamp and PAWS > > - // > > - UINT8 SndWndScale; ///< Wndscale received from the peer > > - UINT8 RcvWndScale; ///< Wndscale used to scale local > buffer > > - UINT32 TsRecent; ///< TsRecent to echo to the remote > peer > > - UINT32 TsRecentAge; ///< When this TsRecent is updated > > - > > - // > > - // RFC2988 defined variables. about RTT measurement > > - // > > - TCP_SEQNO RttSeq; ///< The seq of measured segment now > > - UINT32 RttMeasure; ///< Currently measured RTT in heart > beats > > - UINT32 SRtt; ///< Smoothed RTT, scaled by 8 > > - UINT32 RttVar; ///< RTT variance, scaled by 8 > > - UINT32 Rto; ///< Current RTO, not scaled > > - > > - // > > - // RFC2581, and 3782 variables. > > - // Congestion control + NewReno fast recovery. > > - // > > - UINT32 CWnd; ///< Sender's congestion window > > - UINT32 Ssthresh; ///< Slow start threshold. > > - TCP_SEQNO Recover; ///< Recover point for NewReno > > - UINT16 DupAck; ///< Number of duplicate ACKs > > - UINT8 CongestState; ///< The current congestion > state(RFC3782) > > - UINT8 LossTimes; ///< Number of retxmit timeouts in a > row > > - TCP_SEQNO LossRecover; ///< Recover point for retxmit > > - > > - // > > - // configuration parameters, for EFI_TCP4_PROTOCOL specification > > - // > > - UINT32 KeepAliveIdle; ///< Idle time before sending > first probe > > - UINT32 KeepAlivePeriod; ///< Interval for subsequent keep > alive > > probe > > - UINT8 MaxKeepAlive; ///< Maxium keep alive probe times. > > - UINT8 KeepAliveProbes; ///< The number of keep alive > probe. > > - UINT16 MaxRexmit; ///< The maxium number of retxmit > before > > abort > > - UINT32 FinWait2Timeout; ///< The FIN_WAIT_2 time out > > - UINT32 TimeWaitTimeout; ///< The TIME_WAIT time out > > - UINT32 ConnectTimeout; ///< The connect establishment > time out > > - > > - // > > - // RFC7323 > > - // Addressing Window Retraction for TCP Window Scale Option. > > - // > > - TCP_SEQNO RetxmitSeqMax; ///< Max Seq number in > previous > > retransmission. > > - > > - // > > - // configuration for tcp provided by user > > - // > > - BOOLEAN UseDefaultAddr; > > - UINT8 Tos; > > - UINT8 Ttl; > > - EFI_IPv4_ADDRESS SubnetMask; > > - > > - IP_IO_IP_INFO *IpInfo; ///<pointer reference to Ip used to > send pkt > > -}; > > - > > -extern LIST_ENTRY mTcpRunQue; > > -extern LIST_ENTRY mTcpListenQue; > > -extern TCP_SEQNO mTcpGlobalIss; > > -extern UINT32 mTcpTick; > > - > > -/// > > -/// TCP_CONNECTED: both ends have synchronized their ISN. > > -/// > > -#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD) > > - > > -#define TCP_FIN_RCVD(State) \ > > - (((State) == TCP_CLOSE_WAIT) || \ > > - ((State) == TCP_LAST_ACK) || \ > > - ((State) == TCP_CLOSING) || \ > > - ((State) == TCP_TIME_WAIT)) > > - > > -#define TCP_LOCAL_CLOSED(State) \ > > - (((State) == TCP_FIN_WAIT_1) || \ > > - ((State) == TCP_FIN_WAIT_2) || \ > > - ((State) == TCP_CLOSING) || \ > > - ((State) == TCP_TIME_WAIT) || \ > > - ((State) == TCP_LAST_ACK)) > > - > > -// > > -// Get the TCP_SEG point from a net buffer's ProtoData > > -// > > -#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData)) > > - > > -// > > -// macros to compare sequence no > > -// > > -#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0) > > -#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0) > > -#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0) > > -#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0) > > - > > -// > > -// TCP_SEQ_BETWEEN return whether b <= m <= e > > -// > > -#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b)) > > - > > -// > > -// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2 > > -// > > -#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2))) > > - > > -// > > -// Check whether Flag is on > > -// > > -#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != > 0)) > > - > > -// > > -// Set and Clear operation on a Flag > > -// > > -#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag)) > > -#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag)) > > - > > -// > > -// Test whether two peers are equal > > -// > > -#define TCP_PEER_EQUAL(Pa, Pb) \ > > - (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port)) > > - > > -// > > -// Test whether Pa matches Pb, or Pa is more specific > > -// than pb. Zero means wildcard. > > -// > > -#define TCP_PEER_MATCH(Pa, Pb) \ > > - ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \ > > - (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port))) > > - > > -#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer))) > > -#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 > << > > (Timer)))) > > -#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 > << > > (Timer))))) > > - > > -#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0) > > -#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0) > > -#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb))) > > - > > -#define TCP_MAX_WIN 0xFFFFU > > - > > -typedef > > -VOID > > -(*TCP_TIMER_HANDLER) ( > > - IN OUT TCP_CB *Tcb > > - ); > > - > > -#endif > > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > deleted file mode 100644 > > index d8336c5e82e9..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > +++ /dev/null > > @@ -1,502 +0,0 @@ > > -/** @file > > - Dhcp and Discover routines for PxeBc. > > - > > -Copyright (c) 2013, Red Hat, Inc. > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef __EFI_PXEBC_DHCP_H__ > > -#define __EFI_PXEBC_DHCP_H__ > > - > > -#define PXEBC_DHCP4_MAX_OPTION_NUM 16 > > -#define PXEBC_DHCP4_MAX_OPTION_SIZE 312 > > -#define PXEBC_DHCP4_MAX_PACKET_SIZE (sizeof > > (EFI_PXE_BASE_CODE_PACKET)) > > - > > -#define PXEBC_DHCP4_S_PORT 67 > > -#define PXEBC_DHCP4_C_PORT 68 > > -#define PXEBC_BS_DOWNLOAD_PORT 69 > > -#define PXEBC_BS_DISCOVER_PORT 4011 > > - > > -#define PXEBC_DHCP4_OPCODE_REQUEST 1 > > -#define PXEBC_DHCP4_OPCODE_REPLY 2 > > -#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3 > > -#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte > order > > - > > -// > > -// Sub-Options in Dhcp Vendor Option > > -// > > -#define PXEBC_VENDOR_TAG_MTFTP_IP 1 > > -#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2 > > -#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3 > > -#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4 > > -#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5 > > -#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6 > > -#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7 > > -#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8 > > -#define PXEBC_VENDOR_TAG_BOOT_MENU 9 > > -#define PXEBC_VENDOR_TAG_MENU_PROMPT 10 > > -#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11 > > -#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12 > > -#define PXEBC_VENDOR_TAG_BOOT_ITEM 71 > > - > > -#define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT 4 > > -#define PXEBC_DHCP4_DISCOVER_RETRIES 4 > > - > > -#define PXEBC_MAX_MENU_NUM 24 > > -#define PXEBC_MAX_OFFER_NUM 16 > > - > > -#define PXEBC_BOOT_REQUEST_TIMEOUT 1 > > -#define PXEBC_BOOT_REQUEST_RETRIES 4 > > - > > -#define PXEBC_DHCP4_OVERLOAD_FILE 1 > > -#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2 > > - > > -// > > -// The array index of the DHCP4 option tag interested > > -// > > -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0 > > -#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1 > > -#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2 > > -#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3 > > -#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4 > > -#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5 > > -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6 > > -#define PXEBC_DHCP4_TAG_INDEX_MAX 7 > > - > > -// > > -// The type of DHCP OFFER, arranged by priority, PXE10 has the highest > > priority. > > -// > > -#define DHCP4_PACKET_TYPE_PXE10 0 > > -#define DHCP4_PACKET_TYPE_WFM11A 1 > > -#define DHCP4_PACKET_TYPE_BINL 2 > > -#define DHCP4_PACKET_TYPE_DHCP_ONLY 3 > > -#define DHCP4_PACKET_TYPE_BOOTP 4 > > -#define DHCP4_PACKET_TYPE_MAX 5 > > - > > -#define BIT(x) (1 << x) > > -#define CTRL(x) (0x1F & (x)) > > - > > -// > > -// WfM11a options > > -// > > -#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT > > (PXEBC_VENDOR_TAG_MTFTP_IP) | \ > > - BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) > | \ > > - BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) > | \ > > - BIT > (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \ > > - BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY)) > > -// > > -// Discoverty options > > -// > > -#define DISCOVER_VENDOR_OPTION_BIT_MAP (BIT > > (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \ > > - BIT > (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \ > > - BIT > (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \ > > - BIT > (PXEBC_VENDOR_TAG_BOOT_MENU) | \ > > - BIT > (PXEBC_VENDOR_TAG_MENU_PROMPT)) > > - > > -#define IS_VALID_BOOT_PROMPT(x) \ > > - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT > > (PXEBC_VENDOR_TAG_MENU_PROMPT)) > > - > > -#define IS_VALID_BOOT_MENU(x) \ > > - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT > > (PXEBC_VENDOR_TAG_BOOT_MENU)) > > - > > -#define IS_VALID_MTFTP_VENDOR_OPTION(x) \ > > - (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == > > MTFTP_VENDOR_OPTION_BIT_MAP) > > - > > -#define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) & > > DISCOVER_VENDOR_OPTION_BIT_MAP) != 0) > > - > > -#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \ > > - (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == > > BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) > > - > > -#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \ > > - (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT > > (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \ > > - == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) > > - > > -#define IS_DISABLE_BCAST_DISCOVER(x) (((x) & BIT (0)) == BIT (0)) > > -#define IS_DISABLE_MCAST_DISCOVER(x) (((x) & BIT (1)) == BIT (1)) > > -#define IS_ENABLE_USE_SERVER_LIST(x) (((x) & BIT (2)) == BIT (2)) > > -#define IS_DISABLE_PROMPT_MENU(x) (((x) & BIT (3)) == BIT (3)) > > - > > -#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) > > ((x)[(y) / 32]) | BIT ((y) % 32)) > > - > > -#pragma pack(1) > > -typedef struct { > > - UINT8 ParaList[135]; > > -} PXEBC_DHCP4_OPTION_PARA; > > - > > -typedef struct { > > - UINT16 Size; > > -} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE; > > - > > -typedef struct { > > - UINT8 Type; > > - UINT8 MajorVer; > > - UINT8 MinorVer; > > -} PXEBC_DHCP4_OPTION_UNDI; > > - > > -typedef struct { > > - UINT8 Type; > > -} PXEBC_DHCP4_OPTION_MESG; > > - > > -typedef struct { > > - UINT16 Type; > > -} PXEBC_DHCP4_OPTION_ARCH; > > - > > -#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000" > > -#define DEFAULT_UNDI_TYPE 1 > > -#define DEFAULT_UNDI_MAJOR 3 > > -#define DEFAULT_UNDI_MINOR 0 > > - > > -typedef struct { > > - UINT8 ClassIdentifier[10]; > > - UINT8 ArchitecturePrefix[5]; > > - UINT8 ArchitectureType[5]; > > - UINT8 Lit3[1]; > > - UINT8 InterfaceName[4]; > > - UINT8 Lit4[1]; > > - UINT8 UndiMajor[3]; > > - UINT8 UndiMinor[3]; > > -} PXEBC_DHCP4_OPTION_CLID; > > - > > -typedef struct { > > - UINT8 Type; > > - UINT8 Guid[16]; > > -} PXEBC_DHCP4_OPTION_UUID; > > - > > -typedef struct { > > - UINT16 Type; > > - UINT16 Layer; > > -} PXEBC_OPTION_BOOT_ITEM; > > - > > -#pragma pack() > > - > > -typedef union { > > - PXEBC_DHCP4_OPTION_PARA *Para; > > - PXEBC_DHCP4_OPTION_UNDI *Undi; > > - PXEBC_DHCP4_OPTION_ARCH *Arch; > > - PXEBC_DHCP4_OPTION_CLID *Clid; > > - PXEBC_DHCP4_OPTION_UUID *Uuid; > > - PXEBC_DHCP4_OPTION_MESG *Mesg; > > - PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize; > > -} PXEBC_DHCP4_OPTION_ENTRY; > > - > > -typedef struct { > > - UINT16 Type; > > - UINT8 IpCnt; > > - EFI_IPv4_ADDRESS IpAddr[1]; > > -} PXEBC_BOOT_SVR_ENTRY; > > - > > -typedef struct { > > - UINT16 Type; > > - UINT8 DescLen; > > - UINT8 DescStr[1]; > > -} PXEBC_BOOT_MENU_ENTRY; > > - > > -typedef struct { > > - UINT8 Timeout; > > - UINT8 Prompt[1]; > > -} PXEBC_MENU_PROMPT; > > - > > -typedef struct { > > - UINT32 BitMap[8]; > > - EFI_IPv4_ADDRESS MtftpIp; > > - UINT16 MtftpCPort; > > - UINT16 MtftpSPort; > > - UINT8 MtftpTimeout; > > - UINT8 MtftpDelay; > > - UINT8 DiscoverCtrl; > > - EFI_IPv4_ADDRESS DiscoverMcastIp; > > - EFI_IPv4_ADDRESS McastIpBase; > > - UINT16 McastIpBlock; > > - UINT16 McastIpRange; > > - UINT16 BootSrvType; > > - UINT16 BootSrvLayer; > > - PXEBC_BOOT_SVR_ENTRY *BootSvr; > > - UINT8 BootSvrLen; > > - PXEBC_BOOT_MENU_ENTRY *BootMenu; > > - UINT8 BootMenuLen; > > - PXEBC_MENU_PROMPT *MenuPrompt; > > - UINT8 MenuPromptLen; > > - UINT32 *CredType; > > - UINT8 CredTypeLen; > > -} PXEBC_VENDOR_OPTION; > > - > > -#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF > > (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE) > > - > > -typedef union { > > - EFI_DHCP4_PACKET Offer; > > - EFI_DHCP4_PACKET Ack; > > - UINT8 Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE]; > > -} PXEBC_DHCP4_PACKET; > > - > > -typedef struct { > > - PXEBC_DHCP4_PACKET Packet; > > - BOOLEAN IsPxeOffer; > > - UINT8 OfferType; > > - EFI_DHCP4_PACKET_OPTION > > *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX]; > > - PXEBC_VENDOR_OPTION PxeVendorOption; > > -} PXEBC_CACHED_DHCP4_PACKET; > > - > > -#define GET_NEXT_DHCP_OPTION(Opt) \ > > - (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof > > (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1) > > - > > -#define GET_OPTION_BUFFER_LEN(Pkt) ((Pkt)->Length - sizeof > > (EFI_DHCP4_HEADER) - 4) > > -#define IS_PROXY_DHCP_OFFER(Offer) EFI_IP4_EQUAL (&((Offer)- > > >Dhcp4.Header.YourAddr), &mZeroIp4Addr) > > - > > -#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \ > > - (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)- > > >IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS)) > > - > > - > > -/** > > - This function initialize the DHCP4 message instance. > > - > > - This function will pad each item of dhcp4 message packet. > > - > > - @param Seed Pointer to the message instance of the DHCP4 packet. > > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > > - > > -**/ > > -VOID > > -PxeBcInitSeedPacket ( > > - IN EFI_DHCP4_PACKET *Seed, > > - IN EFI_UDP4_PROTOCOL *Udp4 > > - ); > > - > > - > > -/** > > - Parse the cached dhcp packet. > > - > > - @param CachedPacket Pointer to cached dhcp packet. > > - > > - @retval TRUE Succeed to parse and validation. > > - @retval FALSE Fail to parse or validation. > > - > > -**/ > > -BOOLEAN > > -PxeBcParseCachedDhcpPacket ( > > - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket > > - ); > > - > > -/** > > - This function is to check the selected proxy offer (include BINL dhcp > offer > > and > > - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the > Pxe > > base code > > - mode structure. > > - > > - @param Private Pointer to PxeBc private data. > > - > > - @retval EFI_SUCCESS Operational successful. > > - @retval EFI_NO_RESPONSE Offer dhcp service failed. > > - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe > base > > code mode. > > - > > -**/ > > -EFI_STATUS > > -PxeBcCheckSelectedOffer ( > > - IN PXEBC_PRIVATE_DATA *Private > > - ); > > - > > - > > -/** > > - Callback routine. > > - > > - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 > > Protocol driver > > - to intercept events that occurred in the configuration process. This > > structure > > - provides advanced control of each state transition of the DHCP > process. > > The > > - returned status code determines the behavior of the EFI DHCPv4 > Protocol > > driver. > > - There are three possible returned values, which are described in the > > following > > - table. > > - > > - @param This Pointer to the EFI DHCPv4 Protocol > instance that is > > used to > > - configure this callback function. > > - @param Context Pointer to the context that is > initialized by > > - EFI_DHCP4_PROTOCOL.Configure(). > > - @param CurrentState The current operational state of the > EFI DHCPv4 > > Protocol > > - driver. > > - @param Dhcp4Event The event that occurs in the current > state, > > which usually means a > > - state transition. > > - @param Packet The DHCP packet that is going to be > sent or already > > received. > > - @param NewPacket The packet that is used to replace the > above > > Packet. > > - > > - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to > continue > > the DHCP process. > > - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. > The EFI > > DHCPv4 Protocol > > - driver will continue to wait for more > DHCPOFFER packets > > until the retry > > - timeout expires. > > - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to > abort > > the current process and > > - return to the Dhcp4Init or > Dhcp4InitReboot state. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDhcpCallBack ( > > - IN EFI_DHCP4_PROTOCOL * This, > > - IN VOID *Context, > > - IN EFI_DHCP4_STATE CurrentState, > > - IN EFI_DHCP4_EVENT Dhcp4Event, > > - IN EFI_DHCP4_PACKET * Packet OPTIONAL, > > - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL > > - ); > > - > > -/** > > - Switch the Ip4 policy to static. > > - > > - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. > > - > > - @retval EFI_SUCCESS The policy is already configured to > static. > > - @retval Others Other error as indicated.. > > - > > -**/ > > -EFI_STATUS > > -PxeBcSetIp4Policy ( > > - IN PXEBC_PRIVATE_DATA *Private > > - ); > > - > > -/** > > - Discover the boot of service and initialize the vendor option if > exists. > > - > > - @param Private Pointer to PxeBc private data. > > - @param Type PxeBc option boot item type > > - @param Layer PxeBc option boot item layer > > - @param UseBis Use BIS or not > > - @param DestIp Ip address for server > > - @param IpCount The total count of the server ip > address > > - @param SrvList Server list > > - @param IsDiscv Discover the vendor or not > > - @param Reply The dhcp4 packet of Pxe reply > > - > > - @retval EFI_SUCCESS Operation succeeds. > > - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. > > - @retval EFI_NOT_FOUND There is no vendor option exists. > > - @retval EFI_TIMEOUT Send Pxe Discover time out. > > - > > -**/ > > -EFI_STATUS > > -PxeBcDiscvBootService ( > > - IN PXEBC_PRIVATE_DATA * Private, > > - IN UINT16 Type, > > - IN UINT16 *Layer, > > - IN BOOLEAN UseBis, > > - IN EFI_IP_ADDRESS * DestIp, > > - IN UINT16 IpCount, > > - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, > > - IN BOOLEAN IsDiscv, > > - OUT EFI_DHCP4_PACKET * Reply OPTIONAL > > - ); > > - > > - > > -/** > > - Initialize the DHCP options and build the option list. > > - > > - @param Private Pointer to PxeBc private data. > > - @param OptList Pointer to a DHCP option list. > > - > > - @param IsDhcpDiscover Discover dhcp option or not. > > - > > - @return The index item number of the option list. > > - > > -**/ > > -UINT32 > > -PxeBcBuildDhcpOptions ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_DHCP4_PACKET_OPTION **OptList, > > - IN BOOLEAN IsDhcpDiscover > > - ); > > - > > - > > -/** > > - Create the boot options. > > - > > - @param OptList Pointer to the list of the options > > - @param Type the type of option > > - @param Layer the layer of the boot options > > - @param OptLen length of opotion > > - > > -**/ > > -VOID > > -PxeBcCreateBootOptions ( > > - IN EFI_DHCP4_PACKET_OPTION *OptList, > > - IN UINT16 Type, > > - IN UINT16 *Layer, > > - OUT UINT32 *OptLen > > - ); > > - > > - > > -/** > > - Parse interested dhcp options. > > - > > - @param Buffer Pointer to the dhcp options packet. > > - @param Length The length of the dhcp options. > > - @param OptTag The option OpCode. > > - > > - @return NULL if the buffer length is 0 and OpCode is not > > - DHCP4_TAG_EOP, or the pointer to the buffer. > > - > > -**/ > > -EFI_DHCP4_PACKET_OPTION * > > -PxeBcParseExtendOptions ( > > - IN UINT8 *Buffer, > > - IN UINT32 Length, > > - IN UINT8 OptTag > > - ); > > - > > - > > -/** > > - This function is to parse and check vendor options. > > - > > - @param Dhcp4Option Pointer to dhcp options > > - @param VendorOption Pointer to vendor options > > - > > - @return TRUE if valid for vendor options, or FALSE. > > - > > -**/ > > -BOOLEAN > > -PxeBcParseVendorOptions ( > > - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, > > - IN PXEBC_VENDOR_OPTION *VendorOption > > - ); > > - > > - > > -/** > > - Choose the boot prompt. > > - > > - @param Private Pointer to PxeBc private data. > > - > > - @retval EFI_SUCCESS Select boot prompt done. > > - @retval EFI_TIMEOUT Select boot prompt time out. > > - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. > > - @retval EFI_ABORTED User cancel the operation. > > - @retval EFI_NOT_READY Read the input key from the keybroad has > not > > finish. > > - > > -**/ > > -EFI_STATUS > > -PxeBcSelectBootPrompt ( > > - IN PXEBC_PRIVATE_DATA *Private > > - ); > > - > > - > > -/** > > - Select the boot menu. > > - > > - @param Private Pointer to PxeBc private data. > > - @param Type The type of the menu. > > - @param UseDefaultItem Use default item or not. > > - > > - @retval EFI_ABORTED User cancel operation. > > - @retval EFI_SUCCESS Select the boot menu success. > > - @retval EFI_NOT_READY Read the input key from the keybroad has not > > finish. > > - > > -**/ > > -EFI_STATUS > > -PxeBcSelectBootMenu ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - OUT UINT16 *Type, > > - IN BOOLEAN UseDefaultItem > > - ); > > - > > -#endif > > - > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > > deleted file mode 100644 > > index b7bf069dd637..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > > +++ /dev/null > > @@ -1,102 +0,0 @@ > > -/** @file > > - > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef __EFI_PXEBC_DRIVER_H__ > > -#define __EFI_PXEBC_DRIVER_H__ > > - > > -/** > > - Test to see if this driver supports ControllerHandle. This service > > - is called by the EFI boot service ConnectController(). In > > - order to make drivers as small as possible, there are a few calling > > - restrictions for this service. ConnectController() must > > - follow these calling restrictions. If any other agent wishes to call > > - Supported() it must also follow these calling restrictions. > > - PxeBc requires DHCP4 and MTFTP4 protocols. > > - > > - @param This Protocol instance pointer. > > - @param ControllerHandle Handle of device to test > > - @param RemainingDevicePath Optional parameter use to pick a specific > > child > > - device to start. > > - > > - @retval EFI_SUCCESS This driver supports this device > > - @retval EFI_ALREADY_STARTED This driver is already running on this > device > > - @retval other This driver does not support this device > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDriverBindingSupported ( > > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > > - ); > > - > > -/** > > - Start this driver on ControllerHandle. This service is called by the > > - EFI boot service ConnectController(). In order to make > > - drivers as small as possible, there are a few calling restrictions > for > > - this service. ConnectController() must follow these > > - calling restrictions. If any other agent wishes to call Start() it > > - must also follow these calling restrictions. > > - > > - @param This Protocol instance pointer. > > - @param ControllerHandle Handle of device to bind driver to > > - @param RemainingDevicePath Optional parameter use to pick a > specific > > child > > - device to start. > > - > > - @retval EFI_SUCCESS This driver is added to ControllerHandle > > - @retval EFI_ALREADY_STARTED This driver is already running on > > ControllerHandle > > - @retval other This driver does not support this device > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDriverBindingStart ( > > - IN EFI_DRIVER_BINDING_PROTOCOL * This, > > - IN EFI_HANDLE ControllerHandle, > > - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL > > - ); > > - > > -/** > > - Stop this driver on ControllerHandle. This service is called by the > > - EFI boot service DisconnectController(). In order to > > - make drivers as small as possible, there are a few calling > > - restrictions for this service. DisconnectController() > > - must follow these calling restrictions. If any other agent wishes > > - to call Stop() it must also follow these calling restrictions. > > - > > - @param This Protocol instance pointer. > > - @param ControllerHandle Handle of device to stop driver on > > - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If > > number of > > - children is zero stop the entire bus driver. > > - @param ChildHandleBuffer List of Child Handles to Stop. > > - > > - @retval EFI_SUCCESS This driver is removed ControllerHandle > > - @retval other This driver was not removed from this > device > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -PxeBcDriverBindingStop ( > > - IN EFI_DRIVER_BINDING_PROTOCOL *This, > > - IN EFI_HANDLE ControllerHandle, > > - IN UINTN NumberOfChildren, > > - IN EFI_HANDLE *ChildHandleBuffer > > - ); > > - > > -extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2; > > -extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName; > > -extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding; > > - > > -#endif > > - > > diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > deleted file mode 100644 > > index e96b6f2c5d14..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > +++ /dev/null > > @@ -1,189 +0,0 @@ > > -/** @file > > - > > -Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef __EFI_PXEBC_IMPL_H__ > > -#define __EFI_PXEBC_IMPL_H__ > > - > > - > > -typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA; > > - > > -#include <Uefi.h> > > - > > -#include <Guid/SmBios.h> > > -#include <IndustryStandard/SmBios.h> > > -#include <IndustryStandard/Dhcp.h> > > -#include <Protocol/Dhcp4.h> > > -#include <Protocol/PxeBaseCode.h> > > -#include <Protocol/Mtftp4.h> > > -#include <Protocol/Udp4.h> > > -#include <Protocol/LoadFile.h> > > -#include <Protocol/NetworkInterfaceIdentifier.h> > > -#include <Protocol/PxeBaseCodeCallBack.h> > > -#include <Protocol/Arp.h> > > -#include <Protocol/Ip4.h> > > -#include <Protocol/Ip4Config2.h> > > - > > -#include <Library/DebugLib.h> > > -#include <Library/DevicePathLib.h> > > -#include <Library/BaseMemoryLib.h> > > -#include <Library/MemoryAllocationLib.h> > > -#include <Library/UefiDriverEntryPoint.h> > > -#include <Library/UefiBootServicesTableLib.h> > > -#include <Library/UefiLib.h> > > -#include <Library/BaseLib.h> > > -#include <Library/NetLib.h> > > -#include <Library/DpcLib.h> > > -#include <Library/PcdLib.h> > > - > > -#include "PxeBcDriver.h" > > -#include "PxeBcDhcp.h" > > -#include "PxeBcMtftp.h" > > -#include "PxeBcSupport.h" > > - > > -#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P') > > -#define PXEBC_MTFTP_TIMEOUT 4 > > -#define PXEBC_MTFTP_RETRIES 6 > > -#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE 8 > > -#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE 4 > > -#define PXEBC_DEFAULT_PACKET_SIZE 1480 > > -#define PXEBC_DEFAULT_LIFETIME 50000 // 50ms, unit is > > microsecond > > -#define PXEBC_CHECK_MEDIA_WAITING_TIME > > EFI_TIMER_PERIOD_SECONDS(20) > > - > > -struct _PXEBC_PRIVATE_DATA { > > - UINT32 Signature; > > - EFI_HANDLE Controller; > > - EFI_HANDLE Image; > > - EFI_HANDLE ArpChild; > > - EFI_HANDLE Dhcp4Child; > > - EFI_HANDLE Ip4Child; > > - EFI_HANDLE Mtftp4Child; > > - EFI_HANDLE Udp4ReadChild; > > - EFI_HANDLE Udp4WriteChild; > > - > > - EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii; > > - > > - EFI_PXE_BASE_CODE_PROTOCOL PxeBc; > > - EFI_LOAD_FILE_PROTOCOL LoadFile; > > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback; > > - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback; > > - EFI_ARP_PROTOCOL *Arp; > > - EFI_DHCP4_PROTOCOL *Dhcp4; > > - EFI_IP4_PROTOCOL *Ip4; > > - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; > > - EFI_IP4_CONFIG_DATA Ip4ConfigData; > > - EFI_MTFTP4_PROTOCOL *Mtftp4; > > - EFI_UDP4_PROTOCOL *Udp4Read; > > - EFI_UDP4_PROTOCOL *Udp4Write; > > - UINT16 CurrentUdpSrcPort; > > - EFI_UDP4_CONFIG_DATA Udp4CfgData; > > - > > - > > - EFI_PXE_BASE_CODE_MODE Mode; > > - EFI_PXE_BASE_CODE_FUNCTION Function; > > - > > - CHAR8 *BootFileName; > > - > > - EFI_IP_ADDRESS StationIp; > > - EFI_IP_ADDRESS SubnetMask; > > - EFI_IP_ADDRESS GatewayIp; > > - EFI_IP_ADDRESS ServerIp; > > - BOOLEAN AddressIsOk; > > - UINT32 Ip4MaxPacketSize; > > - UINTN BlockSize; > > - UINTN FileSize; > > - > > - UINT8 > OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE]; > > - EFI_DHCP4_PACKET SeedPacket; > > - EFI_MAC_ADDRESS Mac; > > - UINT8 MacLen; > > - > > - BOOLEAN SortOffers; > > - BOOLEAN GotProxyOffer; > > - UINT32 NumOffers; > > - UINT32 SelectedOffer; > > - UINT32 ProxyOfferType; > > - > > - // > > - // Cached packets as complements of pxe mode data > > - // > > - PXEBC_CACHED_DHCP4_PACKET ProxyOffer; > > - PXEBC_CACHED_DHCP4_PACKET Dhcp4Ack; > > - PXEBC_CACHED_DHCP4_PACKET PxeReply; > > - PXEBC_CACHED_DHCP4_PACKET > > Dhcp4Offers[PXEBC_MAX_OFFER_NUM]; > > - > > - // > > - // Arrays for different types of offers: > > - // ServerCount records the count of the servers we got the offers, > > - // OfferIndex records the index of the offer sent by the server > indexed by > > ServerCount. > > - // > > - UINT32 > ServerCount[DHCP4_PACKET_TYPE_MAX]; > > - UINT32 > > OfferIndex[DHCP4_PACKET_TYPE_MAX][PXEBC_MAX_OFFER_NUM]; > > - UINT32 BootpIndex; > > - UINT32 > ProxyIndex[DHCP4_PACKET_TYPE_MAX]; > > - UINT32 > BinlIndex[PXEBC_MAX_OFFER_NUM]; > > - > > - EFI_EVENT GetArpCacheEvent; > > - // > > - // token and event used to get ICMP error data from IP > > - // > > - EFI_IP4_COMPLETION_TOKEN IcmpErrorRcvToken; > > -}; > > - > > -#define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a, > > PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE) > > - > > -#define PXEBC_PRIVATE_DATA_FROM_LOADFILE(a) CR (a, > > PXEBC_PRIVATE_DATA, LoadFile, PXEBC_PRIVATE_DATA_SIGNATURE) > > - > > -#define PXEBC_PRIVATE_DATA_FROM_PXEBCCALLBACK(a) CR (a, > > PXEBC_PRIVATE_DATA, PxeBcCallback, PXEBC_PRIVATE_DATA_SIGNATURE) > > - > > -extern EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate; > > -extern EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate; > > - > > -/** > > - Causes the driver to load a specified file. > > - > > - @param This Protocol instance pointer. > > - @param FilePath The device specific path of the file to > load. > > - @param BootPolicy If TRUE, indicates that the request > originates > > from the > > - boot manager is attempting to load > FilePath as a boot > > - selection. If FALSE, then FilePath must > match as exact file > > - to be loaded. > > - @param BufferSize On input the size of Buffer in bytes. > On output > > with a return > > - code of EFI_SUCCESS, the amount of data > transferred to > > - Buffer. On output with a return code of > > EFI_BUFFER_TOO_SMALL, > > - the size of Buffer required to retrieve > the requested file. > > - @param Buffer The memory buffer to transfer the file > to. IF Buffer > > is NULL, > > - then no the size of the requested file > is returned in > > - BufferSize. > > - > > - @retval EFI_SUCCESS The file was loaded. > > - @retval EFI_UNSUPPORTED The device does not support the > > provided BootPolicy > > - @retval EFI_INVALID_PARAMETER FilePath is not a valid device > path, or > > - BufferSize is NULL. > > - @retval EFI_NO_MEDIA No medium was present to load the > file. > > - @retval EFI_DEVICE_ERROR The file was not loaded due to a > device > > error. > > - @retval EFI_NO_RESPONSE The remote system did not respond. > > - @retval EFI_NOT_FOUND The file was not found. > > - @retval EFI_ABORTED The file load process was > manually cancelled. > > - > > -**/ > > -EFI_STATUS > > -EFIAPI > > -EfiPxeLoadFile ( > > - IN EFI_LOAD_FILE_PROTOCOL * This, > > - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, > > - IN BOOLEAN BootPolicy, > > - IN OUT UINTN *BufferSize, > > - IN VOID *Buffer OPTIONAL > > - ); > > - > > -#endif > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > deleted file mode 100644 > > index 903dd4fbb69a..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > +++ /dev/null > > @@ -1,137 +0,0 @@ > > -/** @file > > - Mtftp routines for PxeBc. > > - > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef __EFI_PXEBC_MTFTP_H__ > > -#define __EFI_PXEBC_MTFTP_H__ > > - > > -#define PXE_MTFTP_OPTION_BLKSIZE_INDEX 0 > > -#define PXE_MTFTP_OPTION_TIMEOUT_INDEX 1 > > -#define PXE_MTFTP_OPTION_TSIZE_INDEX 2 > > -#define PXE_MTFTP_OPTION_MULTICAST_INDEX 3 > > -#define PXE_MTFTP_OPTION_MAXIMUM_INDEX 4 > > - > > -#define PXE_MTFTP_ERROR_STRING_LENGTH 127 > > -#define PXE_MTFTP_OPTBUF_MAXNUM_INDEX 128 > > - > > - > > -/** > > - This function is to get size of a file by Tftp. > > - > > - @param Private Pointer to PxeBc private data > > - @param Config Pointer to Mtftp configuration data > > - @param Filename Pointer to file name > > - @param BlockSize Pointer to block size > > - @param BufferSize Pointer to buffer size > > - > > - @retval EFI_SUCCESS Get the size of file success > > - @retval EFI_NOT_FOUND Parse the tftp ptions failed. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval Other Has not get the size of the file. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpGetFileSize ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN UINTN *BlockSize, > > - IN OUT UINT64 *BufferSize > > - ); > > - > > - > > -/** > > - This function is to get data of a file by Tftp. > > - > > - @param Private Pointer to PxeBc private data > > - @param Config Pointer to Mtftp configuration data > > - @param Filename Pointer to file name > > - @param BlockSize Pointer to block size > > - @param BufferPtr Pointer to buffer > > - @param BufferSize Pointer to buffer size > > - @param DontUseBuffer Indicate whether with a receive buffer > > - > > - @retval EFI_SUCCESS Read the data success from the special > file. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval other Read data from file failed. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpReadFile ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN UINTN *BlockSize, > > - IN UINT8 *BufferPtr, > > - IN OUT UINT64 *BufferSize, > > - IN BOOLEAN DontUseBuffer > > - ); > > - > > - > > -/** > > - This function is put data of a file by Tftp. > > - > > - @param Private Pointer to PxeBc private data > > - @param Config Pointer to Mtftp configuration data > > - @param Filename Pointer to file name > > - @param Overwrite Indicate whether with overwrite attribute > > - @param BlockSize Pointer to block size > > - @param BufferPtr Pointer to buffer > > - @param BufferSize Pointer to buffer size > > - > > - @retval EFI_SUCCESS Write the data success into the special > file. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval other Write data into file failed. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpWriteFile ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN BOOLEAN Overwrite, > > - IN UINTN *BlockSize, > > - IN UINT8 *BufferPtr, > > - IN OUT UINT64 *BufferSize > > - ); > > - > > - > > -/** > > - This function is to get data(file) from a directory(may be a server) > by Tftp. > > - > > - @param Private Pointer to PxeBc private data. > > - @param Config Pointer to Mtftp configuration data. > > - @param Filename Pointer to file name. > > - @param BlockSize Pointer to block size. > > - @param BufferPtr Pointer to buffer. > > - @param BufferSize Pointer to buffer size. > > - @param DontUseBuffer Indicate whether with a receive buffer. > > - > > - @retval EFI_SUCCES Get the data from the file included in > directory > > success. > > - @retval EFI_DEVICE_ERROR The network device encountered an error > > during this operation. > > - @retval other Operation failed. > > - > > -**/ > > -EFI_STATUS > > -PxeBcTftpReadDirectory ( > > - IN PXEBC_PRIVATE_DATA *Private, > > - IN EFI_MTFTP4_CONFIG_DATA *Config, > > - IN UINT8 *Filename, > > - IN UINTN *BlockSize, > > - IN UINT8 *BufferPtr, > > - IN OUT UINT64 *BufferSize, > > - IN BOOLEAN DontUseBuffer > > - ); > > - > > -#endif > > - > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > > deleted file mode 100644 > > index a28c9740c171..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > > +++ /dev/null > > @@ -1,134 +0,0 @@ > > -/** @file > > - Support routines for PxeBc. > > -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> > > -This program and the accompanying materials > > -are licensed and made available under the terms and conditions of the > BSD > > License > > -which accompanies this distribution. The full text of the license may > be > > found at > > -http://opensource.org/licenses/bsd-license.php > > - > > -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > - > > -**/ > > - > > -#ifndef __EFI_PXEBC_SUPPORT_H__ > > -#define __EFI_PXEBC_SUPPORT_H__ > > - > > - > > -/** > > - The common notify function associated with various PxeBc events. > > - > > - @param Event The event signaled. > > - @param Context The context. > > - > > -**/ > > -VOID > > -EFIAPI > > -PxeBcCommonNotify ( > > - IN EFI_EVENT Event, > > - IN VOID *Context > > - ); > > - > > - > > -/** > > - This function initialize(or configure) the Udp4Write instance. > > - > > - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. > > - @param StationIp Pointer to the station ip address. > > - @param SubnetMask Pointer to the subnetmask of the station ip > address. > > - @param Gateway Pointer to the gateway ip address. > > - @param SrcPort Pointer to the srouce port of the station. > > - @param Ttl The time to live field of the IP header. > > - @param ToS The type of service field of the IP header. > > - > > - @retval EFI_SUCCESS The configuration settings were set, > changed, or > > reset successfully. > > - @retval EFI_NO_MAPPING When using a default address, > configuration > > (DHCP, BOOTP, > > - RARP, etc.) is not finished yet. > > - @retval EFI_INVALID_PARAMETER One or more following conditions are > > TRUE: > > - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is > already > > started/configured > > - and must be stopped/reset before it can > be reconfigured. > > - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is > > FALSE > > - and UdpConfigData.StationPort is > already used by > > - other instance. > > - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot > > allocate memory for this > > - EFI UDPv4 Protocol instance. > > - @retval EFI_DEVICE_ERROR An unexpected network or system error > > occurred and this instance > > - was not opened. > > - @retval Others Please examine the function Udp4- > >Routes(Udp4, > > FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. > > - > > -**/ > > -EFI_STATUS > > -PxeBcConfigureUdpWriteInstance ( > > - IN EFI_UDP4_PROTOCOL *Udp4, > > - IN EFI_IPv4_ADDRESS *StationIp, > > - IN EFI_IPv4_ADDRESS *SubnetMask, > > - IN EFI_IPv4_ADDRESS *Gateway, > > - IN OUT UINT16 *SrcPort, > > - IN UINT8 Ttl, > > - IN UINT8 ToS > > - ); > > - > > - > > -/** > > - This function is to display the IPv4 address. > > - > > - @param[in] Ip The pointer to the IPv4 address. > > - > > -**/ > > -VOID > > -PxeBcShowIp4Addr ( > > - IN EFI_IPv4_ADDRESS *Ip > > - ); > > - > > - > > -/** > > - Convert number to ASCII value. > > - > > - @param Number Numeric value to convert to decimal ASCII > value. > > - @param Buffer Buffer to place ASCII version of the > Number. > > - @param Length Length of Buffer. > > - > > -**/ > > -VOID > > -CvtNum ( > > - IN UINTN Number, > > - IN UINT8 *Buffer, > > - IN UINTN Length > > - ); > > - > > - > > -/** > > - Convert unsigned int number to decimal number. > > - > > - @param Number The unsigned int number will be converted. > > - @param Buffer Pointer to the buffer to store the decimal > number > > after transform. > > - @param[in] BufferSize The maxsize of the buffer. > > - > > - @return the length of the number after transform. > > - > > -**/ > > -UINTN > > -UtoA10 ( > > - IN UINTN Number, > > - IN CHAR8 *Buffer, > > - IN UINTN BufferSize > > - > > - ); > > - > > - > > -/** > > - Convert ASCII numeric string to a UINTN value. > > - > > - @param Buffer Pointer to the 8-byte unsigned int value. > > - > > - @return UINTN value of the ASCII string. > > - > > -**/ > > -UINT64 > > -AtoU64 ( > > - IN UINT8 *Buffer > > - ); > > - > > - > > -#endif > > - > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > > deleted file mode 100644 > > index e97c3cadd973..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > > +++ /dev/null > > @@ -1,25 +0,0 @@ > > -// /** @file > > -// This module produces EFI Preboot Execution Environment (PXE) Base > > Code Protocol. > > -// > > -// This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl > > and IPv4 > > -// network stack, used to control PXE-compatible devices. It produces > EFI > > Load File > > -// Protocol to provide one clean way to otain control from the boot > manager > > if the > > -// boot patch is from the remote device. > > -// > > -// Copyright (c) 2007 - 2018, Intel Corporation. All rights > reserved.<BR> > > -// > > -// This program and the accompanying materials > > -// are licensed and made available under the terms and conditions of > the > > BSD License > > -// which accompanies this distribution. The full text of the license > may be > > found at > > -// http://opensource.org/licenses/bsd-license.php > > -// > > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -// > > -// **/ > > - > > - > > -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI > > Preboot Execution Environment (PXE) Base Code Protocol" > > - > > -#string STR_MODULE_DESCRIPTION #language en-US "This module > > produces EFI PXE Base Code Protocol upon the EFI MMP Protocol and the > > IPv4 network stack, and is used to control PXE-compatible devices. It > > produces the EFI Load File Protocol to provide a clean method to obtain > > control from the boot manager if the boot patch is from the remote > device." > > - > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra. > > uni > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra. > > uni > > deleted file mode 100644 > > index 2c1bda1a8bd2..000000000000 > > --- > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra. > > uni > > +++ /dev/null > > @@ -1,20 +0,0 @@ > > -// /** @file > > -// UefiPxe4BcDxe Localized Strings and Content > > -// > > -// Copyright (c) 2013 - 2018, Intel Corporation. All rights > reserved.<BR> > > -// > > -// This program and the accompanying materials > > -// are licensed and made available under the terms and conditions of > the > > BSD License > > -// which accompanies this distribution. The full text of the license > may be > > found at > > -// http://opensource.org/licenses/bsd-license.php > > -// > > -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -// > > -// **/ > > - > > -#string STR_PROPERTIES_MODULE_NAME > > -#language en-US > > -"UEFI PXE Base Code DXE Driver" > > - > > - > > diff --git > > a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > deleted file mode 100644 > > index 042401992945..000000000000 > > --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > +++ /dev/null > > @@ -1,102 +0,0 @@ > > -## @file > > -# This module produces EFI Preboot Execution Environment (PXE) Base > > Code Protocol. > > -# > > -# This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl > > and IPv4 > > -# network stack, used to control PXE-compatible devices. It produces > EFI > > Load File > > -# Protocol to provide one clean way to otain control from the boot > manager > > if the > > -# boot patch is from the remote device. This driver only supports IPv4 > > network stack. > > -# > > -# Notes: > > -# 1) This driver can't co-work with the UefiPxeBcDxe driver in > NetworkPkg. > > -# 2) This driver might have some issues that have been fixed in the > > UefiPxeBcDxe > > -# driver in NetworkPkg. > > -# 3) This driver supports fewer features than the UefiPxeBcDxe driver > in > > NetworkPkg > > -# (e.g. IPv6, MTFTP windowsize). > > -# 4) UefiPxeBcDxe driver in NetworkPkg is recommended for use instead > of > > this one even > > -# though both of them can be used. > > -# > > -# Copyright (c) 2007 - 2018, Intel Corporation. All rights > reserved.<BR> > > -# This program and the accompanying materials > > -# are licensed and made available under the terms and conditions of > the > > BSD License > > -# which accompanies this distribution. The full text of the license > may be > > found at > > -# http://opensource.org/licenses/bsd-license.php > > -# > > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" > > BASIS, > > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > > EXPRESS OR IMPLIED. > > -# > > -# > > -## > > - > > - > > -[Defines] > > - INF_VERSION = 0x00010005 > > - BASE_NAME = UefiPxe4BcDxe > > - MODULE_UNI_FILE = UefiPxe4BcDxe.uni > > - FILE_GUID = 3B1DEAB5-C75D-442e-9238-8E2FFB62B0BB > > - MODULE_TYPE = UEFI_DRIVER > > - VERSION_STRING = 1.0 > > - ENTRY_POINT = PxeBcDriverEntryPoint > > - UNLOAD_IMAGE = NetLibDefaultUnload > > - > > -# > > -# The following information is for reference only and not required by > the > > build tools. > > -# > > -# VALID_ARCHITECTURES = IA32 X64 > > -# > > -# DRIVER_BINDING = gPxeBcDriverBinding > > -# COMPONENT_NAME = gPxeBcComponentName > > -# COMPONENT_NAME2 = gPxeBcComponentName2 > > -# > > - > > -[Sources] > > - PxeBcMtftp.c > > - PxeBcSupport.h > > - PxeBcSupport.c > > - PxeBcDriver.c > > - PxeBcDhcp.h > > - ComponentName.c > > - PxeBcImpl.c > > - PxeBcImpl.h > > - PxeBcDhcp.c > > - PxeBcMtftp.h > > - PxeBcDriver.h > > - > > - > > -[Packages] > > - MdePkg/MdePkg.dec > > - MdeModulePkg/MdeModulePkg.dec > > - > > -[LibraryClasses] > > - BaseLib > > - UefiLib > > - UefiBootServicesTableLib > > - UefiDriverEntryPoint > > - BaseMemoryLib > > - MemoryAllocationLib > > - DebugLib > > - NetLib > > - DpcLib > > - PcdLib > > - > > -[Protocols] > > - gEfiPxeBaseCodeCallbackProtocolGuid ## > SOMETIMES_PRODUCES > > - gEfiPxeBaseCodeProtocolGuid ## BY_START > > - gEfiLoadFileProtocolGuid ## BY_START > > - gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## > > SOMETIMES_CONSUMES > > - gEfiArpServiceBindingProtocolGuid ## TO_START > > - gEfiArpProtocolGuid ## TO_START > > - gEfiMtftp4ServiceBindingProtocolGuid ## TO_START > > - gEfiMtftp4ProtocolGuid ## TO_START > > - gEfiUdp4ServiceBindingProtocolGuid ## TO_START > > - gEfiUdp4ProtocolGuid ## TO_START > > - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START > > - gEfiDhcp4ProtocolGuid ## TO_START > > - gEfiIp4ServiceBindingProtocolGuid ## TO_START > > - gEfiIp4ProtocolGuid ## TO_START > > - gEfiIp4Config2ProtocolGuid ## TO_START > > - > > -[Pcd] > > - gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize ## > > SOMETIMES_CONSUMES > > - > > -[UserExtensions.TianoCore."ExtraFiles"] > > - UefiPxe4BcDxeExtra.uni > > -- > > 2.18.0.windows.1 > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. 2018-10-30 7:33 ` [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg Fu Siyuan 2018-10-31 8:23 ` Ni, Ruiyu @ 2018-11-01 3:08 ` Zeng, Star 1 sibling, 0 replies; 29+ messages in thread From: Zeng, Star @ 2018-11-01 3:08 UTC (permalink / raw) To: Fu, Siyuan, edk2-devel@lists.01.org; +Cc: Wang, Jian J, Wu, Jiaxin, Zeng, Star Reviewed-by: Star Zeng <star.zeng@intel.com> after you update all the references in platform to use NetworkPkg. Thanks, Star -----Original Message----- From: Fu, Siyuan Sent: Tuesday, October 30, 2018 3:33 PM To: edk2-devel@lists.01.org Cc: Zeng, Star <star.zeng@intel.com>; Wang, Jian J <jian.j.wang@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com> Subject: [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. This patch is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe drivers in MdeModulePkg. These drivers will not be maintained and can't co-work with the dual-stack drivers in NetworkPkg. People should use below NetworkPkg drivers instead: NetworkPkg/IScsiDxe/IScsiDxe.inf NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf These drivers are actively maintained with more bug fixes and new feature support. Cc: Star Zeng <star.zeng@intel.com> Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c | 283 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c | 1264 --------- MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c | 472 ---- MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c | 676 ----- MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c | 539 ---- MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c | 116 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------- MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c | 2799 ------------------ MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 ---- MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 --- MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c | 1201 -------- MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 ---------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 --- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 -------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c | 365 --- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ------------- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ----- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 -------------------- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- MdeModulePkg/MdeModulePkg.dsc | 3 - MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h | 165 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h | 22 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h | 166 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni | 62 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h | 140 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h | 38 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h | 168 -- MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h | 74 - MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h | 317 --- MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------- MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h | 131 - MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h | 954 ------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 --- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 ---- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 --- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 ---- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - 69 files changed, 32598 deletions(-) diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c deleted file mode 100644 index 3f561e93439d..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c +++ /dev/null @@ -1,283 +0,0 @@ -/** @file - UEFI Component Name(2) protocol implementation for iSCSI. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = { - IScsiComponentNameGetDriverName, - IScsiComponentNameGetControllerName, - "eng" -}; - -// -// EFI Component Name 2 Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IScsiComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IScsiComponentNameGetControllerName, - "en" -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIScsiDriverNameTable[] = { - {"eng;en", L"iSCSI Driver"}, - {NULL, NULL} -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *mIScsiControllerNameTable = NULL; - -/** - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] Language A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - @param[out] DriverName A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER DriverName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mIScsiDriverNameTable, - DriverName, - (BOOLEAN)(This == &gIScsiComponentName) - ); -} - -/** - Update the component name for the iSCSI instance. - - @param[in] IScsiExtScsiPassThru A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - - @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully. - @retval EFI_INVALID_PARAMETER The input parameter is invalid. - @retval EFI_UNSUPPORTED Can't get the corresponding NIC info from the Controller handle. - -**/ -EFI_STATUS -UpdateName ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru - ) -{ - EFI_STATUS Status; - CHAR16 HandleName[150]; - ISCSI_DRIVER_DATA *Private; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 MacString[70]; - - if (IScsiExtScsiPassThru == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (IScsiExtScsiPassThru); - - // - // Get the mac string, it's the name of various variable - // - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize); - if (EFI_ERROR (Status)) { - return Status; - } - VlanId = NetLibGetVlanId (Private->Controller); - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString); - - UnicodeSPrint ( - HandleName, - sizeof (HandleName), - L"iSCSI IPv4 (MacString=%s)", - MacString - ); - - if (mIScsiControllerNameTable != NULL) { - FreeUnicodeStringTable (mIScsiControllerNameTable); - mIScsiControllerNameTable = NULL; - } - - Status = AddUnicodeString2 ( - "eng", - gIScsiComponentName.SupportedLanguages, - &mIScsiControllerNameTable, - HandleName, - TRUE - ); - if (EFI_ERROR (Status)) { - return Status; - } - - return AddUnicodeString2 ( - "en", - gIScsiComponentName2.SupportedLanguages, - &mIScsiControllerNameTable, - HandleName, - FALSE - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver.Currently not implemented. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] ControllerHandle The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - @param[in] ChildHandle The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - @param[in] Language A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - @param[out] ControllerName A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - - EFI_HANDLE IScsiController; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru; - - if (ControllerHandle == NULL) { - return EFI_UNSUPPORTED; - } - - // - // Get the handle of the controller we are controling. - // - IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid); - if (IScsiController == NULL) { - return EFI_UNSUPPORTED; - } - - Status = gBS->OpenProtocol ( - IScsiController, - &gEfiCallerIdGuid, - (VOID **)&IScsiIdentifier, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (ChildHandle != NULL) { - // - // Make sure this driver produced ChildHandle - // - Status = EfiTestChildHandle ( - ControllerHandle, - ChildHandle, - &gEfiTcp4ProtocolGuid - ); - if (!EFI_ERROR (Status)) { - // - // Retrieve an instance of a produced protocol from ChildHandle - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiExtScsiPassThruProtocolGuid, - (VOID **)&IScsiExtScsiPassThru, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Update the component name for this child handle. - // - Status = UpdateName (IScsiExtScsiPassThru); - if (EFI_ERROR (Status)) { - return Status; - } - } else { - return Status; - } - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mIScsiControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gIScsiComponentName) - ); -} - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c deleted file mode 100644 index 6307684ff05b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c +++ /dev/null @@ -1,430 +0,0 @@ -/** @file - This file is for Challenge-Handshake Authentication Protocol (CHAP) Configuration. - -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" -#include "Md5.h" - -/** - Initator calculates its own expected hash value. - - @param[in] ChapIdentifier iSCSI CHAP identifier sent by authenticator. - @param[in] ChapSecret iSCSI CHAP secret of the authenticator. - @param[in] SecretLength The length of iSCSI CHAP secret. - @param[in] ChapChallenge The challenge message sent by authenticator. - @param[in] ChallengeLength The length of iSCSI CHAP challenge message. - @param[out] ChapResponse The calculation of the expected hash value. - - @retval EFI_SUCCESS The expected hash value was calculatedly successfully. - @retval EFI_PROTOCOL_ERROR The length of the secret should be at least the - length of the hash value for the hashing algorithm chosen. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPCalculateResponse ( - IN UINT32 ChapIdentifier, - IN CHAR8 *ChapSecret, - IN UINT32 SecretLength, - IN UINT8 *ChapChallenge, - IN UINT32 ChallengeLength, - OUT UINT8 *ChapResponse - ) -{ - MD5_CTX Md5Ctx; - CHAR8 IdByte[1]; - EFI_STATUS Status; - - Status = MD5Init (&Md5Ctx); - - // - // Hash Identifier - Only calculate 1 byte data (RFC1994) - // - IdByte[0] = (CHAR8) ChapIdentifier; - MD5Update (&Md5Ctx, IdByte, 1); - - // - // Hash Secret - // - if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) { - return EFI_PROTOCOL_ERROR; - } - - MD5Update (&Md5Ctx, ChapSecret, SecretLength); - - // - // Hash Challenge received from Target - // - MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength); - - Status = MD5Final (&Md5Ctx, ChapResponse); - - return Status; -} - -/** - The initator checks the CHAP response replied by target against its own - calculation of the expected hash value. - - @param[in] AuthData iSCSI CHAP authentication data. - @param[in] TargetResponse The response from target. - - @retval EFI_SUCCESS The response from target passed authentication. - @retval EFI_SECURITY_VIOLATION The response from target was not expected value. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPAuthTarget ( - IN ISCSI_CHAP_AUTH_DATA *AuthData, - IN UINT8 *TargetResponse - ) -{ - EFI_STATUS Status; - UINT32 SecretSize; - UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN]; - - Status = EFI_SUCCESS; - - SecretSize = (UINT32) AsciiStrLen (AuthData->AuthConfig.ReverseCHAPSecret); - Status = IScsiCHAPCalculateResponse ( - AuthData->OutIdentifier, - AuthData->AuthConfig.ReverseCHAPSecret, - SecretSize, - AuthData->OutChallenge, - AuthData->OutChallengeLength, - VerifyRsp - ); - - if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) { - Status = EFI_SECURITY_VIOLATION; - } - - return Status; -} - -/** - This function checks the received iSCSI Login Response during the security - negotiation stage. - - @param[in] Conn The iSCSI connection. - - @retval EFI_SUCCESS The Login Response passed the CHAP validation. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPOnRspReceived ( - IN ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_CHAP_AUTH_DATA *AuthData; - CHAR8 *Value; - UINT8 *Data; - UINT32 Len; - LIST_ENTRY *KeyValueList; - UINTN Algorithm; - CHAR8 *Identifier; - CHAR8 *Challenge; - CHAR8 *Name; - CHAR8 *Response; - UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN]; - UINT32 RspLen; - - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); - ASSERT (Conn->RspQue.BufNum != 0); - - Session = Conn->Session; - AuthData = &Session->AuthData; - - Len = Conn->RspQue.BufSize; - Data = AllocatePool (Len); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - // - // Copy the data in case the data spans over multiple PDUs. - // - NetbufQueCopy (&Conn->RspQue, 0, Len, Data); - - // - // Build the key-value list from the data segment of the Login Response. - // - KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len); - if (KeyValueList == NULL) { - FreePool (Data); - return EFI_OUT_OF_RESOURCES; - } - - Status = EFI_PROTOCOL_ERROR; - - switch (Conn->CHAPStep) { - case ISCSI_CHAP_INITIAL: - // - // The first Login Response. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); - if (Value == NULL) { - goto ON_EXIT; - } - - Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn (Value); - - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_AUTH_METHOD); - if (Value == NULL) { - goto ON_EXIT; - } - // - // Initiator mandates CHAP authentication but target replies without "CHAP" or - // initiator suggets "None" but target replies with some kind of auth method. - // - if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) { - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { - goto ON_EXIT; - } - } else { - if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) { - goto ON_EXIT; - } - } - // - // Transit to CHAP step one. - // - Conn->CHAPStep = ISCSI_CHAP_STEP_ONE; - Status = EFI_SUCCESS; - break; - - case ISCSI_CHAP_STEP_TWO: - // - // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C> - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_ALGORITHM); - if (Value == NULL) { - goto ON_EXIT; - } - - Algorithm = AsciiStrDecimalToUintn (Value); - if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) { - // - // Unsupported algorithm is chosen by target. - // - goto ON_EXIT; - } - - Identifier = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_IDENTIFIER); - if (Identifier == NULL) { - goto ON_EXIT; - } - - Challenge = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_CHALLENGE); - if (Challenge == NULL) { - goto ON_EXIT; - } - // - // Process the CHAP identifier and CHAP Challenge from Target - // Calculate Response value - // - AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn (Identifier); - AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN; - IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData->InChallengeLength, Challenge); - Status = IScsiCHAPCalculateResponse ( - AuthData->InIdentifier, - AuthData->AuthConfig.CHAPSecret, - (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret), - AuthData->InChallenge, - AuthData->InChallengeLength, - AuthData->CHAPResponse - ); - - // - // Transit to next step. - // - Conn->CHAPStep = ISCSI_CHAP_STEP_THREE; - break; - - case ISCSI_CHAP_STEP_THREE: - // - // one way CHAP authentication and the target would like to - // authenticate us. - // - Status = EFI_SUCCESS; - break; - - case ISCSI_CHAP_STEP_FOUR: - ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL); - // - // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target. - // - Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME); - if (Name == NULL) { - goto ON_EXIT; - } - - Response = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_RESPONSE); - if (Response == NULL) { - goto ON_EXIT; - } - - RspLen = ISCSI_CHAP_RSP_LEN; - IScsiHexToBin (TargetRsp, &RspLen, Response); - - // - // Check the CHAP Response replied by Target. - // - Status = IScsiCHAPAuthTarget (AuthData, TargetRsp); - break; - - default: - break; - } - -ON_EXIT: - - IScsiFreeKeyValueList (KeyValueList); - - FreePool (Data); - - return Status; -} - -/** - This function fills the CHAP authentication information into the login PDU - during the security negotiation stage in the iSCSI connection login. - - @param[in] Conn The iSCSI connection. - @param[in, out] Pdu The PDU to send out. - - @retval EFI_SUCCESS All check passed and the phase-related CHAP - authentication info is filled into the iSCSI PDU. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. -**/ -EFI_STATUS -IScsiCHAPToSendReq ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_LOGIN_REQUEST *LoginReq; - ISCSI_CHAP_AUTH_DATA *AuthData; - CHAR8 *Value; - CHAR8 ValueStr[256]; - CHAR8 *Response; - UINT32 RspLen; - CHAR8 *Challenge; - UINT32 ChallengeLen; - - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION); - - Session = Conn->Session; - AuthData = &Session->AuthData; - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0); - if (LoginReq == NULL) { - return EFI_PROTOCOL_ERROR; - } - Status = EFI_SUCCESS; - - RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3; - Response = AllocatePool (RspLen); - if (Response == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3; - Challenge = AllocatePool (ChallengeLen); - if (Challenge == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - switch (Conn->CHAPStep) { - case ISCSI_CHAP_INITIAL: - // - // It's the initial Login Request. Fill in the key=value pairs mandatory - // for the initial Login Request. - // - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session->InitiatorName); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session->ConfigData.NvData.TargetName); - - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) { - Value = ISCSI_KEY_VALUE_NONE; - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - } else { - Value = ISCSI_AUTH_METHOD_CHAP; - } - - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value); - - break; - - case ISCSI_CHAP_STEP_ONE: - // - // First step, send the Login Request with CHAP_A=<A1,A2...> key-value pair. - // - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", ISCSI_CHAP_ALGORITHM_MD5); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr); - - Conn->CHAPStep = ISCSI_CHAP_STEP_TWO; - break; - - case ISCSI_CHAP_STEP_THREE: - // - // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or - // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target ahtentication is - // required too. - // - // CHAP_N=<N> - // - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) &AuthData->AuthConfig.CHAPName); - // - // CHAP_R=<R> - // - IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, ISCSI_CHAP_RSP_LEN, Response, &RspLen); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response); - - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) { - // - // CHAP_I=<I> - // - IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1); - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); - // - // CHAP_C=<C> - // - IScsiGenRandom ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN); - AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN; - IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge); - - Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR; - } - // - // set the stage transition flag. - // - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - break; - - default: - Status = EFI_PROTOCOL_ERROR; - break; - } - - FreePool (Response); - FreePool (Challenge); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c deleted file mode 100644 index cb1eff1b690c..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c +++ /dev/null @@ -1,1264 +0,0 @@ -/** @file - Helper functions for configuring or getting the parameters relating to iSCSI. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA"; -BOOLEAN mIScsiDeviceListUpdated = FALSE; -UINTN mNumberOfIScsiDevices = 0; -ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL; - -LIST_ENTRY mIScsiConfigFormList = { - &mIScsiConfigFormList, - &mIScsiConfigFormList -}; - -HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = { - { - { - HARDWARE_DEVICE_PATH, - HW_VENDOR_DP, - { - (UINT8) (sizeof (VENDOR_DEVICE_PATH)), - (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) - } - }, - IP4_ISCSI_CONFIG_GUID - }, - { - END_DEVICE_PATH_TYPE, - END_ENTIRE_DEVICE_PATH_SUBTYPE, - { - (UINT8) (END_DEVICE_PATH_LENGTH), - (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) - } - } -}; - -/** - Convert the IPv4 address into a dotted string. - - @param[in] Ip The IPv4 address. - @param[out] Str The dotted IP string. -**/ -VOID -IScsiIpToStr ( - IN EFI_IPv4_ADDRESS *Ip, - OUT CHAR16 *Str - ) -{ - UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]); -} - - -/** - Parse IsId in string format and convert it to binary. - - @param[in] String The buffer of the string to be parsed. - @param[in, out] IsId The buffer to store IsId. - - @retval EFI_SUCCESS The operation finished successfully. - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. - -**/ -EFI_STATUS -IScsiParseIsIdFromString ( - IN CONST CHAR16 *String, - IN OUT UINT8 *IsId - ) -{ - UINT8 Index; - CHAR16 *IsIdStr; - CHAR16 TempStr[3]; - UINTN NodeVal; - CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE]; - EFI_INPUT_KEY Key; - - if ((String == NULL) || (IsId == NULL)) { - return EFI_INVALID_PARAMETER; - } - - IsIdStr = (CHAR16 *) String; - - if (StrLen (IsIdStr) != 6) { - UnicodeSPrint ( - PortString, - (UINTN) sizeof (PortString), - L"Error! Input is incorrect, please input 6 hex numbers!\n" - ); - - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - PortString, - NULL - ); - - return EFI_INVALID_PARAMETER; - } - - for (Index = 3; Index < 6; Index++) { - CopyMem (TempStr, IsIdStr, sizeof (TempStr)); - TempStr[2] = L'\0'; - - // - // Convert the string to IsId. StrHexToUintn stops at the first character - // that is not a valid hex character, '\0' here. - // - NodeVal = StrHexToUintn (TempStr); - - IsId[Index] = (UINT8) NodeVal; - - IsIdStr = IsIdStr + 2; - } - - return EFI_SUCCESS; -} - -/** - Convert IsId from binary to string format. - - @param[out] String The buffer to store the converted string. - @param[in] IsId The buffer to store IsId. - - @retval EFI_SUCCESS The string converted successfully. - @retval EFI_INVALID_PARAMETER Any input parameter is invalid. - -**/ -EFI_STATUS -IScsiConvertIsIdToString ( - OUT CHAR16 *String, - IN UINT8 *IsId - ) -{ - UINT8 Index; - UINTN Number; - - if ((String == NULL) || (IsId == NULL)) { - return EFI_INVALID_PARAMETER; - } - - for (Index = 0; Index < 6; Index++) { - if (IsId[Index] <= 0xF) { - Number = UnicodeSPrint ( - String, - 2 * ISID_CONFIGURABLE_STORAGE, - L"0%X", - (UINTN) IsId[Index] - ); - } else { - Number = UnicodeSPrint ( - String, - 2 * ISID_CONFIGURABLE_STORAGE, - L"%X", - (UINTN) IsId[Index] - ); - - } - - String = String + Number; - } - - *String = L'\0'; - - return EFI_SUCCESS; -} - - -/** - Update the list of iSCSI devices the iSCSI driver is controlling. - - @retval EFI_SUCCESS The callback successfully handled the action. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiUpdateDeviceList ( - VOID - ) -{ - EFI_STATUS Status; - ISCSI_DEVICE_LIST *DeviceList; - UINTN DataSize; - UINTN NumHandles; - EFI_HANDLE *Handles; - UINTN HandleIndex; - UINTN Index; - UINTN LastDeviceIndex; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - ISCSI_MAC_INFO *CurMacInfo; - ISCSI_MAC_INFO TempMacInfo; - CHAR16 MacString[70]; - UINTN DeviceListSize; - - // - // Dump all the handles the Managed Network Service Binding Protocol is installed on. - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiManagedNetworkServiceBindingProtocolGuid, - NULL, - &NumHandles, - &Handles - ); - if (EFI_ERROR (Status)) { - return Status; - } - - DataSize = 0; - Status = gRT->GetVariable ( - L"iSCSIDeviceList", - &gIp4IScsiConfigGuid, - NULL, - &DataSize, - NULL - ); - if (Status == EFI_BUFFER_TOO_SMALL) { - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize); - ASSERT (DeviceList != NULL); - - gRT->GetVariable ( - L"iSCSIDeviceList", - &gIp4IScsiConfigGuid, - NULL, - &DataSize, - DeviceList - ); - - LastDeviceIndex = 0; - - for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) { - Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - VlanId = NetLibGetVlanId (Handles[HandleIndex]); - - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) { - CurMacInfo = &DeviceList->MacInfo[Index]; - if ((CurMacInfo->Len == HwAddressSize) && - (CurMacInfo->VlanId == VlanId) && - (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize)) - ) { - // - // The previous configured NIC is still here. - // - if (Index != LastDeviceIndex) { - // - // Swap the current MAC address entry with the one indexed by - // LastDeviceIndex. - // - CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO)); - CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex], sizeof (ISCSI_MAC_INFO)); - CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo, sizeof (ISCSI_MAC_INFO)); - } - - LastDeviceIndex++; - } - } - - if (LastDeviceIndex == DeviceList->NumDevice) { - break; - } - } - - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) { - // - // delete the variables - // - CurMacInfo = &DeviceList->MacInfo[Index]; - IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo->VlanId, MacString); - gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0, NULL); - gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL); - } - - FreePool (DeviceList); - } else if (Status != EFI_NOT_FOUND) { - FreePool (Handles); - return Status; - } - // - // Construct the new iSCSI device list. - // - DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof (ISCSI_MAC_INFO); - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize); - ASSERT (DeviceList != NULL); - DeviceList->NumDevice = (UINT8) NumHandles; - - for (Index = 0; Index < NumHandles; Index++) { - NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize); - - CurMacInfo = &DeviceList->MacInfo[Index]; - CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize); - CurMacInfo->Len = (UINT8) HwAddressSize; - CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]); - } - - gRT->SetVariable ( - L"iSCSIDeviceList", - &gIp4IScsiConfigGuid, - ISCSI_CONFIG_VAR_ATTR, - DeviceListSize, - DeviceList - ); - - FreePool (DeviceList); - FreePool (Handles); - - return Status; -} - -/** - Get the iSCSI configuration form entry by the index of the goto opcode actived. - - @param[in] Index The 0-based index of the goto opcode actived. - - @return The iSCSI configuration form entry found. -**/ -ISCSI_CONFIG_FORM_ENTRY * -IScsiGetConfigFormEntryByIndex ( - IN UINT32 Index - ) -{ - UINT32 CurrentIndex; - LIST_ENTRY *Entry; - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - - CurrentIndex = 0; - ConfigFormEntry = NULL; - - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { - if (CurrentIndex == Index) { - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link); - break; - } - - CurrentIndex++; - } - - return ConfigFormEntry; -} - -/** - Convert the iSCSI configuration data into the IFR data. - - @param[in] ConfigFormEntry The iSCSI configuration form entry. - @param[out] IfrNvData The IFR nv data. - -**/ -VOID -IScsiConvertDeviceConfigDataToIfrNvData ( - IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry, - OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData - ) -{ - ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData; - - // - // Normal session configuration parameters. - // - SessionConfigData = &ConfigFormEntry->SessionConfigData; - IfrNvData->Enabled = SessionConfigData->Enabled; - - IfrNvData->InitiatorInfoFromDhcp = SessionConfigData->InitiatorInfoFromDhcp; - IfrNvData->TargetInfoFromDhcp = SessionConfigData->TargetInfoFromDhcp; - IfrNvData->TargetPort = SessionConfigData->TargetPort; - - IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp); - IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask); - IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway); - IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp); - - IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData->TargetName); - - IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun); - - IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId); - - // - // CHAP authentication parameters. - // - AuthConfigData = &ConfigFormEntry->AuthConfigData; - - IfrNvData->CHAPType = AuthConfigData->CHAPType; - - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData->CHAPName); - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData->CHAPSecret); - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName, IfrNvData->ReverseCHAPName); - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, IfrNvData->ReverseCHAPSecret); -} - -/** - This function allows the caller to request the current - configuration for one or more named elements. The resulting - string is in <ConfigAltResp> format. Any and all alternative - configuration strings shall also be appended to the end of the - current configuration string. If they are, they must appear - after the current configuration. They must contain the same - routing (GUID, NAME, PATH) as the current configuration string. - They must have an additional description indicating the type of - alternative configuration the string represents, - "ALTCFG=<StringToken>". That <StringToken> (when - converted from Hex UNICODE to binary) is a reference to a - string in the associated string pack. - - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param[in] Request A null-terminated Unicode string in - <ConfigRequest> format. Note that this - includes the routing information as well as - the configurable name / value pairs. It is - invalid for this string to be in - <MultiConfigRequest> format. - @param[out] Progress On return, points to a character in the - Request string. Points to the string's null - terminator if request was successful. Points - to the most recent "&" before the first - failing name / value pair (or the beginning - of the string if the failure is in the first - name / value pair) if the request was not - successful. - @param[out] Results A null-terminated Unicode string in - <ConfigAltResp> format which has all values - filled in for the names in the Request string. - String to be allocated by the called function. - - @retval EFI_SUCCESS The Results string is filled with the - values corresponding to all requested - names. - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the - parts of the results that must be - stored awaiting possible future - protocols. - @retval EFI_INVALID_PARAMETER For example, passing in a NULL - for the Request parameter - would result in this type of - error. In this case, the - Progress parameter would be - set to NULL. - @retval EFI_NOT_FOUND Routing data doesn't match any - known driver. Progress set to the - first character in the routing header. - Note: There is no requirement that the - driver validate the routing data. It - must skip the <ConfigHdr> in order to - process the names. - @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set - to most recent & before the - error or the beginning of the - string. - @retval EFI_INVALID_PARAMETER Unknown name. Progress points - to the & before the name in - question.Currently not implemented. -**/ -EFI_STATUS -EFIAPI -IScsiFormExtractConfig ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN CONST EFI_STRING Request, - OUT EFI_STRING *Progress, - OUT EFI_STRING *Results - ) -{ - EFI_STATUS Status; - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; - UINTN BufferSize; - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; - ISCSI_FORM_CALLBACK_INFO *Private; - EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting; - EFI_STRING ConfigRequestHdr; - EFI_STRING ConfigRequest; - BOOLEAN AllocatedRequest; - UINTN Size; - - if (Progress == NULL || Results == NULL) { - return EFI_INVALID_PARAMETER; - } - - *Progress = Request; - if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &gIp4IScsiConfigGuid, mVendorStorageName)) { - return EFI_NOT_FOUND; - } - - ConfigRequestHdr = NULL; - ConfigRequest = NULL; - AllocatedRequest = FALSE; - Size = 0; - - if (!mIScsiDeviceListUpdated) { - // - // Update the device list. - // - IScsiUpdateDeviceList (); - mIScsiDeviceListUpdated = TRUE; - } - - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); - ASSERT (IfrNvData != NULL); - if (Private->Current != NULL) { - IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData); - } - - BufferSize = ISCSI_NAME_MAX_SIZE; - Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName); - if (EFI_ERROR (Status)) { - IfrNvData->InitiatorName[0] = L'\0'; - } else { - IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName); - } - - // - // Convert buffer data to <ConfigResp> by helper function BlockToConfig() - // - HiiConfigRouting = Private->ConfigRouting; - BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA); - ConfigRequest = Request; - if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) { - // - // Request has no request element, construct full request string. - // Allocate and fill a buffer large enough to hold the <ConfigHdr> template - // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator - // - ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid, mVendorStorageName, Private->DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - ASSERT (ConfigRequest != NULL); - AllocatedRequest = TRUE; - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); - FreePool (ConfigRequestHdr); - } - Status = HiiConfigRouting->BlockToConfig ( - HiiConfigRouting, - ConfigRequest, - (UINT8 *) IfrNvData, - BufferSize, - Results, - Progress - ); - FreePool (IfrNvData); - // - // Free the allocated config request string. - // - if (AllocatedRequest) { - FreePool (ConfigRequest); - ConfigRequest = NULL; - } - - // - // Set Progress string to the original request string. - // - if (Request == NULL) { - *Progress = NULL; - } else if (StrStr (Request, L"OFFSET") == NULL) { - *Progress = Request + StrLen (Request); - } - - return Status; -} - -/** - This function applies changes in a driver's configuration. - Input is a Configuration, which has the routing data for this - driver followed by name / value configuration pairs. The driver - must apply those pairs to its configurable storage. If the - driver's configuration is stored in a linear block of data - and the driver's name / value pairs are in <BlockConfig> - format, it may use the ConfigToBlock helper function (above) to - simplify the job. Currently not implemented. - - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param[in] Configuration A null-terminated Unicode string in - <ConfigString> format. - @param[out] Progress A pointer to a string filled in with the - offset of the most recent '&' before the - first failing name / value pair (or the - beginn ing of the string if the failure - is in the first name / value pair) or - the terminating NULL if all was - successful. - - @retval EFI_SUCCESS The results have been distributed or are - awaiting distribution. - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the - parts of the results that must be - stored awaiting possible future - protocols. - @retval EFI_INVALID_PARAMETERS Passing in a NULL for the - Results parameter would result - in this type of error. - @retval EFI_NOT_FOUND Target for the specified routing data - was not found. -**/ -EFI_STATUS -EFIAPI -IScsiFormRouteConfig ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN CONST EFI_STRING Configuration, - OUT EFI_STRING *Progress - ) -{ - if (Configuration == NULL || Progress == NULL) { - return EFI_INVALID_PARAMETER; - } - - // - // Check routing data in <ConfigHdr>. - // Note: if only one Storage is used, then this checking could be skipped. - // - if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid, mVendorStorageName)) { - *Progress = Configuration; - return EFI_NOT_FOUND; - } - - *Progress = Configuration + StrLen (Configuration); - return EFI_SUCCESS; -} - -/** - This function is called to provide results data to the driver. - This data consists of a unique key that is used to identify - which data is either being passed back or being asked for. - - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param[in] Action Specifies the type of action taken by the browser. - @param[in] QuestionId A unique value which is sent to the original - exporting driver so that it can identify the type - of data to expect. The format of the data tends to - vary based on the opcode that enerated the callback. - @param[in] Type The type of value for the question. - @param[in] Value A pointer to the data being sent to the original - exporting driver. - @param[out] ActionRequest On return, points to the action requested by the - callback function. - - @retval EFI_SUCCESS The callback successfully handled the action. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the - variable and its data. - @retval EFI_DEVICE_ERROR The variable could not be saved. - @retval EFI_UNSUPPORTED The specified Action is not supported by the - callback.Currently not implemented. - @retval EFI_INVALID_PARAMETERS Passing in wrong parameter. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiFormCallback ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN EFI_BROWSER_ACTION Action, - IN EFI_QUESTION_ID QuestionId, - IN UINT8 Type, - IN EFI_IFR_TYPE_VALUE *Value, - OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest - ) -{ - ISCSI_FORM_CALLBACK_INFO *Private; - UINTN BufferSize; - CHAR8 IScsiName[ISCSI_NAME_MAX_SIZE]; - CHAR16 PortString[128]; - CHAR8 Ip4String[IP4_STR_MAX_SIZE]; - CHAR8 LunString[ISCSI_LUN_STR_MAX_LEN]; - UINT64 Lun; - EFI_STRING_ID DeviceFormTitleToken; - ISCSI_CONFIG_IFR_NVDATA *IfrNvData; - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - EFI_IP_ADDRESS HostIp; - EFI_IP_ADDRESS SubnetMask; - EFI_IP_ADDRESS Gateway; - EFI_STATUS Status; - EFI_INPUT_KEY Key; - - if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) { - return EFI_UNSUPPORTED; - } - - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This); - // - // Retrieve uncommitted data from Browser - // - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA)); - ASSERT (IfrNvData != NULL); - if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) { - FreePool (IfrNvData); - return EFI_NOT_FOUND; - } - Status = EFI_SUCCESS; - - if (Action == EFI_BROWSER_ACTION_CHANGING) { - if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) { - // - // In case goto the device configuration form, update the device form title. - // - ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (QuestionId - KEY_DEVICE_ENTRY_BASE)); - ASSERT (ConfigFormEntry != NULL); - - UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s", ConfigFormEntry->MacString); - DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE; - HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL); - - IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData); - - Private->Current = ConfigFormEntry; - } - } else if (Action == EFI_BROWSER_ACTION_CHANGED) { - switch (QuestionId) { - case KEY_INITIATOR_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName); - BufferSize = AsciiStrSize (IScsiName); - - Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName); - if (EFI_ERROR (Status)) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL); - } - - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; - break; - - case KEY_LOCAL_IP: - IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); - if (EFI_ERROR (Status) || - ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && - !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4)); - } - - break; - - case KEY_SUBNET_MASK: - IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4); - if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4)); - } - - break; - - case KEY_GATE_WAY: - IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4); - if (EFI_ERROR (Status) || - ((Gateway.Addr[0] != 0) && - (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && - !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4)); - } - - break; - - case KEY_TARGET_IP: - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String); - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4); - if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL); - Status = EFI_INVALID_PARAMETER; - } else { - CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4)); - } - - break; - - case KEY_TARGET_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName); - Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName)); - if (EFI_ERROR (Status)) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL); - } else { - AsciiStrCpyS (Private->Current->SessionConfigData.TargetName, ISCSI_NAME_MAX_SIZE, IScsiName); - } - - break; - - case KEY_DHCP_ENABLE: - if (IfrNvData->InitiatorInfoFromDhcp == 0) { - IfrNvData->TargetInfoFromDhcp = 0; - } - - break; - - case KEY_BOOT_LUN: - IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString); - Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun); - if (EFI_ERROR (Status)) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL); - } else { - CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun)); - } - - break; - - case KEY_CHAP_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current->AuthConfigData.CHAPName); - break; - - case KEY_CHAP_SECRET: - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current->AuthConfigData.CHAPSecret); - break; - - case KEY_REVERSE_CHAP_NAME: - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private->Current->AuthConfigData.ReverseCHAPName); - break; - - case KEY_REVERSE_CHAP_SECRET: - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private->Current->AuthConfigData.ReverseCHAPSecret); - break; - - case KEY_CONFIG_ISID: - IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId); - IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId); - - break; - - case KEY_SAVE_CHANGES: - // - // First, update those fields which don't have INTERACTIVE set. - // - Private->Current->SessionConfigData.Enabled = IfrNvData->Enabled; - Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData->InitiatorInfoFromDhcp; - Private->Current->SessionConfigData.TargetPort = IfrNvData->TargetPort; - if (Private->Current->SessionConfigData.TargetPort == 0) { - Private->Current->SessionConfigData.TargetPort = ISCSI_WELL_KNOWN_PORT; - } - - Private->Current->SessionConfigData.TargetInfoFromDhcp = IfrNvData->TargetInfoFromDhcp; - Private->Current->AuthConfigData.CHAPType = IfrNvData->CHAPType; - - // - // Only do full parameter validation if iSCSI is enabled on this device. - // - if (Private->Current->SessionConfigData.Enabled) { - // - // Validate the address configuration of the Initiator if DHCP isn't - // deployed. - // - if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) { - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp, sizeof (HostIp.v4)); - CopyMem (&SubnetMask.v4, &Private->Current->SessionConfigData.SubnetMask, sizeof (SubnetMask.v4)); - CopyMem (&Gateway.v4, &Private->Current->SessionConfigData.Gateway, sizeof (Gateway.v4)); - - if ((Gateway.Addr[0] != 0)) { - if (SubnetMask.Addr[0] == 0) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - } - } - // - // Validate target configuration if DHCP isn't deployed. - // - if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) { - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4)); - if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - - // - // Validate iSCSI target name configuration again: - // The format of iSCSI target name is already verified when user input the name; - // here we only check the case user does not input the name. - // - if (Private->Current->SessionConfigData.TargetName[0] == '\0') { - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - L"iSCSI target name is NULL!", - NULL - ); - Status = EFI_INVALID_PARAMETER; - break; - } - - } - - if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) { - if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - - if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) && - ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0')) - ) { - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL); - Status = EFI_INVALID_PARAMETER; - break; - } - } - } - - BufferSize = sizeof (Private->Current->SessionConfigData); - gRT->SetVariable ( - Private->Current->MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - ISCSI_CONFIG_VAR_ATTR, - BufferSize, - &Private->Current->SessionConfigData - ); - - BufferSize = sizeof (Private->Current->AuthConfigData); - gRT->SetVariable ( - Private->Current->MacString, - &gIScsiCHAPAuthInfoGuid, - ISCSI_CONFIG_VAR_ATTR, - BufferSize, - &Private->Current->AuthConfigData - ); - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; - break; - - default: - break; - } - } - - if (!EFI_ERROR (Status)) { - // - // Pass changed uncommitted data back to Form Browser - // - HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL); - } - - FreePool (IfrNvData); - - return Status; -} - -/** - Updates the iSCSI configuration form to add/delete an entry for the iSCSI - device specified by the Controller. - - @param[in] DriverBindingHandle The driverbinding handle. - @param[in] Controller The controller handle of the iSCSI device. - @param[in] AddForm Whether to add or delete a form entry. - - @retval EFI_SUCCESS The iSCSI configuration form is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigUpdateForm ( - IN EFI_HANDLE DriverBindingHandle, - IN EFI_HANDLE Controller, - IN BOOLEAN AddForm - ) -{ - LIST_ENTRY *Entry; - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - BOOLEAN EntryExisted; - EFI_STATUS Status; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 PortString[128]; - UINT16 FormIndex; - UINTN BufferSize; - VOID *StartOpCodeHandle; - VOID *EndOpCodeHandle; - EFI_IFR_GUID_LABEL *StartLabel; - EFI_IFR_GUID_LABEL *EndLabel; - - ConfigFormEntry = NULL; - EntryExisted = FALSE; - - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link); - - if (ConfigFormEntry->Controller == Controller) { - EntryExisted = TRUE; - break; - } - } - - if (AddForm) { - if (EntryExisted) { - return EFI_SUCCESS; - } else { - // - // Add a new form. - // - ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool (sizeof (ISCSI_CONFIG_FORM_ENTRY)); - if (ConfigFormEntry == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - InitializeListHead (&ConfigFormEntry->Link); - ConfigFormEntry->Controller = Controller; - - // - // Get the MAC address and convert it into the formatted string. - // - Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - VlanId = NetLibGetVlanId (Controller); - - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, ConfigFormEntry->MacString); - - // - // Get the normal session configuration data. - // - BufferSize = sizeof (ConfigFormEntry->SessionConfigData); - Status = gRT->GetVariable ( - ConfigFormEntry->MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - &BufferSize, - &ConfigFormEntry->SessionConfigData - ); - if (EFI_ERROR (Status)) { - ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof (ConfigFormEntry->SessionConfigData)); - - // - // Generate OUI-format ISID based on MAC address. - // - CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6); - ConfigFormEntry->SessionConfigData.IsId[0] = - (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F); - } - // - // Get the CHAP authentication configuration data. - // - BufferSize = sizeof (ConfigFormEntry->AuthConfigData); - Status = gRT->GetVariable ( - ConfigFormEntry->MacString, - &gIScsiCHAPAuthInfoGuid, - NULL, - &BufferSize, - &ConfigFormEntry->AuthConfigData - ); - if (EFI_ERROR (Status)) { - ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof (ConfigFormEntry->AuthConfigData)); - } - // - // Compose the Port string and create a new EFI_STRING_ID. - // - UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", ConfigFormEntry->MacString); - ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL); - - // - // Compose the help string of this port and create a new EFI_STRING_ID. - // - UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString); - ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL); - - InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link); - mNumberOfIScsiDevices++; - } - } else { - ASSERT (EntryExisted); - - mNumberOfIScsiDevices--; - RemoveEntryList (&ConfigFormEntry->Link); - FreePool (ConfigFormEntry); - mCallbackInfo->Current = NULL; - } - // - // Allocate space for creation of Buffer - // - - // - // Init OpCode Handle - // - StartOpCodeHandle = HiiAllocateOpCodeHandle (); - ASSERT (StartOpCodeHandle != NULL); - - EndOpCodeHandle = HiiAllocateOpCodeHandle (); - ASSERT (EndOpCodeHandle != NULL); - - // - // Create Hii Extend Label OpCode as the start opcode - // - StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); - StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; - StartLabel->Number = DEVICE_ENTRY_LABEL; - - // - // Create Hii Extend Label OpCode as the end opcode - // - EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); - EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; - EndLabel->Number = LABEL_END; - - FormIndex = 0; - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) { - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link); - - HiiCreateGotoOpCode ( - StartOpCodeHandle, // Container for dynamic created opcodes - FORMID_DEVICE_FORM, // Target Form ID - ConfigFormEntry->PortTitleToken, // Prompt text - ConfigFormEntry->PortTitleHelpToken, // Help text - EFI_IFR_FLAG_CALLBACK, // Question flag - (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID - ); - - FormIndex++; - } - - HiiUpdateForm ( - mCallbackInfo->RegisteredHandle, - &gIp4IScsiConfigGuid, - FORMID_MAIN_FORM, - StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL - EndOpCodeHandle // LABEL_END - ); - - HiiFreeOpCodeHandle (StartOpCodeHandle); - HiiFreeOpCodeHandle (EndOpCodeHandle); - - return EFI_SUCCESS; -} - -/** - Initialize the iSCSI configuration form. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is initialized. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigFormInit ( - VOID - ) -{ - EFI_STATUS Status; - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; - ISCSI_FORM_CALLBACK_INFO *CallbackInfo; - - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&HiiDatabase); - if (EFI_ERROR (Status)) { - return Status; - } - - CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof (ISCSI_FORM_CALLBACK_INFO)); - if (CallbackInfo == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - CallbackInfo->Signature = ISCSI_FORM_CALLBACK_INFO_SIGNATURE; - CallbackInfo->HiiDatabase = HiiDatabase; - CallbackInfo->Current = NULL; - - CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig; - CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig; - CallbackInfo->ConfigAccess.Callback = IScsiFormCallback; - - Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **)&CallbackInfo->ConfigRouting); - if (EFI_ERROR (Status)) { - FreePool(CallbackInfo); - return Status; - } - - // - // Install Device Path Protocol and Config Access protocol to driver handle - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &CallbackInfo->DriverHandle, - &gEfiDevicePathProtocolGuid, - &mIScsiHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &CallbackInfo->ConfigAccess, - NULL - ); - ASSERT_EFI_ERROR (Status); - - // - // Publish our HII data - // - CallbackInfo->RegisteredHandle = HiiAddPackages ( - &gIp4IScsiConfigGuid, - CallbackInfo->DriverHandle, - IScsi4DxeStrings, - IScsiConfigDxeBin, - NULL - ); - if (CallbackInfo->RegisteredHandle == NULL) { - FreePool(CallbackInfo); - return EFI_OUT_OF_RESOURCES; - } - - mCallbackInfo = CallbackInfo; - - return Status; -} - -/** - Unload the iSCSI configuration form, this includes: delete all the iSCSI - device configuration entries, uninstall the form callback protocol and - free the resources used. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is unloaded. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiConfigFormUnload ( - IN EFI_HANDLE DriverBindingHandle - ) -{ - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry; - - while (!IsListEmpty (&mIScsiConfigFormList)) { - // - // Uninstall the device forms as the iSCSI driver instance may fail to - // control the controller but still install the device configuration form. - // In such case, upon driver unloading, the driver instance's driverbinding. - // stop () won't be called, so we have to take this chance here to uninstall - // the device form. - // - ConfigFormEntry = NET_LIST_USER_STRUCT (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link); - IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry->Controller, FALSE); - } - - // - // Remove HII package list - // - mCallbackInfo->HiiDatabase->RemovePackageList ( - mCallbackInfo->HiiDatabase, - mCallbackInfo->RegisteredHandle - ); - - // - // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL - // - gBS->UninstallMultipleProtocolInterfaces ( - mCallbackInfo->DriverHandle, - &gEfiDevicePathProtocolGuid, - &mIScsiHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &mCallbackInfo->ConfigAccess, - NULL - ); - FreePool (mCallbackInfo); - - return EFI_SUCCESS; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c deleted file mode 100644 index 6a876c8b69dd..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c +++ /dev/null @@ -1,472 +0,0 @@ -/** @file - iSCSI DHCP related configuration routines. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -/** - Extract the Root Path option and get the required target information. - - @param[in] RootPath The RootPath. - @param[in] Length Length of the RootPath option payload. - @param[in, out] ConfigNvData The iSCSI session configuration data read from nonvolatile device. - - @retval EFI_SUCCESS All required information is extracted from the RootPath option. - @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted. -**/ -EFI_STATUS -IScsiDhcpExtractRootPath ( - IN CHAR8 *RootPath, - IN UINT8 Length, - IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData - ) -{ - EFI_STATUS Status; - UINT8 IScsiRootPathIdLen; - CHAR8 *TmpStr; - ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX]; - ISCSI_ROOT_PATH_FIELD *Field; - UINT32 FieldIndex; - UINT8 Index; - - // - // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname> - // - IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID); - - if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) { - return EFI_NOT_FOUND; - } - // - // Skip the iSCSI RootPath ID "iscsi:". - // - RootPath += IScsiRootPathIdLen; - Length = (UINT8) (Length - IScsiRootPathIdLen); - - TmpStr = (CHAR8 *) AllocatePool (Length + 1); - if (TmpStr == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - CopyMem (TmpStr, RootPath, Length); - TmpStr[Length] = '\0'; - - Index = 0; - FieldIndex = RP_FIELD_IDX_SERVERNAME; - ZeroMem (&Fields[0], sizeof (Fields)); - - // - // Extract the fields in the Root Path option string. - // - for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) { - if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) { - Fields[FieldIndex].Str = &TmpStr[Index]; - } - - while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) { - Index++; - } - - if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) { - if (FieldIndex != RP_FIELD_IDX_TARGETNAME) { - TmpStr[Index] = '\0'; - Index++; - } - - if (Fields[FieldIndex].Str != NULL) { - Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str); - } - } - } - - if (FieldIndex != RP_FIELD_IDX_MAX) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) || - (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) || - (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1) - ) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Get the IP address of the target. - // - Field = &Fields[RP_FIELD_IDX_SERVERNAME]; - Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - // - // Check the protocol type. - // - Field = &Fields[RP_FIELD_IDX_PROTOCOL]; - if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Get the port of the iSCSI target. - // - Field = &Fields[RP_FIELD_IDX_PORT]; - if (Field->Str != NULL) { - ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str); - } else { - ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT; - } - // - // Get the LUN. - // - Field = &Fields[RP_FIELD_IDX_LUN]; - if (Field->Str != NULL) { - Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } else { - ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun)); - } - // - // Get the target iSCSI Name. - // - Field = &Fields[RP_FIELD_IDX_TARGETNAME]; - - if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Validate the iSCSI name. - // - Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str)); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field->Str); - -ON_EXIT: - - FreePool (TmpStr); - - return Status; -} - -/** - The callback function registerd to the DHCP4 instance which is used to select - the qualified DHCP OFFER. - - @param[in] This The DHCP4 protocol. - @param[in] Context The context set when configuring the DHCP4 protocol. - @param[in] CurrentState The current state of the DHCP4 protocol. - @param[in] Dhcp4Event The event occurs in the current state. - @param[in] Packet The DHCP packet that is to be sent or already received. - @param[out] NewPacket The packet used to replace the above Packet. - - @retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're not intereseted - in the Dhcp4Event. - @retval EFI_NOT_READY The DHCP OFFER packet doesn't match our requirements. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiDhcpSelectOffer ( - IN EFI_DHCP4_PROTOCOL * This, - IN VOID *Context, - IN EFI_DHCP4_STATE CurrentState, - IN EFI_DHCP4_EVENT Dhcp4Event, - IN EFI_DHCP4_PACKET * Packet, OPTIONAL - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL - ) -{ - EFI_STATUS Status; - UINT32 OptionCount; - EFI_DHCP4_PACKET_OPTION **OptionList; - UINT32 Index; - - if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) { - return EFI_SUCCESS; - } - - OptionCount = 0; - - Status = This->Parse (This, Packet, &OptionCount, NULL); - if (Status != EFI_BUFFER_TOO_SMALL) { - return EFI_NOT_READY; - } - - OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *)); - if (OptionList == NULL) { - return EFI_NOT_READY; - } - - Status = This->Parse (This, Packet, &OptionCount, OptionList); - if (EFI_ERROR (Status)) { - FreePool (OptionList); - return EFI_NOT_READY; - } - - for (Index = 0; Index < OptionCount; Index++) { - if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) { - continue; - } - - Status = IScsiDhcpExtractRootPath ( - (CHAR8 *) &OptionList[Index]->Data[0], - OptionList[Index]->Length, - (ISCSI_SESSION_CONFIG_NVDATA *) Context - ); - - break; - } - - if (Index == OptionCount) { - Status = EFI_NOT_READY; - } - - FreePool (OptionList); - - return Status; -} - -/** - Parse the DHCP ACK to get the address configuration and DNS information. - - @param[in] Dhcp4 The DHCP4 protocol. - @param[in, out] ConfigData The session configuration data. - - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. - @retval EFI_NO_MAPPING DHCP failed to acquire address and other information. - @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-formatted. - @retval EFI_DEVICE_ERROR Other errors as indicated. -**/ -EFI_STATUS -IScsiParseDhcpAck ( - IN EFI_DHCP4_PROTOCOL *Dhcp4, - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData - ) -{ - EFI_STATUS Status; - EFI_DHCP4_MODE_DATA Dhcp4ModeData; - UINT32 OptionCount; - EFI_DHCP4_PACKET_OPTION **OptionList; - UINT32 Index; - - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData); - if (EFI_ERROR (Status)) { - return Status; - } - - if (Dhcp4ModeData.State != Dhcp4Bound) { - return EFI_NO_MAPPING; - } - - CopyMem (&ConfigData->NvData.LocalIp, &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&ConfigData->NvData.SubnetMask, &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&ConfigData->NvData.Gateway, &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS)); - - OptionCount = 0; - OptionList = NULL; - - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList); - if (Status != EFI_BUFFER_TOO_SMALL) { - return EFI_DEVICE_ERROR; - } - - OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *)); - if (OptionList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList); - if (EFI_ERROR (Status)) { - FreePool (OptionList); - return EFI_DEVICE_ERROR; - } - - for (Index = 0; Index < OptionCount; Index++) { - // - // Get DNS server addresses and DHCP server address from this offer. - // - if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) { - - if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) { - Status = EFI_INVALID_PARAMETER; - break; - } - // - // Primary DNS server address. - // - CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS)); - - if (OptionList[Index]->Length > 4) { - // - // Secondary DNS server address - // - CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4], sizeof (EFI_IPv4_ADDRESS)); - } - } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) { - if (OptionList[Index]->Length != 4) { - Status = EFI_INVALID_PARAMETER; - break; - } - - CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS)); - } - } - - FreePool (OptionList); - - return Status; -} - -/** - Parse the DHCP ACK to get the address configuration and DNS information. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller; - @param[in, out] ConfigData The session configuration data. - - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiDoDhcp ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData - ) -{ - EFI_HANDLE Dhcp4Handle; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_STATUS Status; - EFI_DHCP4_PACKET_OPTION *ParaList; - EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData; - EFI_STATUS MediaStatus; - UINT8 *Data; - - Dhcp4Handle = NULL; - Dhcp4 = NULL; - ParaList = NULL; - - // - // Check media status before do DHCP - // - MediaStatus = EFI_SUCCESS; - NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus); - if (MediaStatus != EFI_SUCCESS) { - return EFI_NO_MEDIA; - } - - // - // Create a DHCP4 child instance and get the protocol. - // - Status = NetLibCreateServiceChild ( - Controller, - Image, - &gEfiDhcp4ServiceBindingProtocolGuid, - &Dhcp4Handle - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->OpenProtocol ( - Dhcp4Handle, - &gEfiDhcp4ProtocolGuid, - (VOID **)&Dhcp4, - Image, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3); - if (ParaList == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - // - // Ask the server to reply with Netmask, Router, DNS and RootPath options. - // - ParaList->OpCode = DHCP4_TAG_PARA_LIST; - ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 : 3); - Data = &ParaList->Data[0]; - Data[0] = DHCP4_TAG_NETMASK; - Data[1] = DHCP4_TAG_ROUTER; - Data[2] = DHCP4_TAG_DNS_SERVER; - Data[3] = DHCP4_TAG_ROOTPATH; - - ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA)); - Dhcp4ConfigData.OptionCount = 1; - Dhcp4ConfigData.OptionList = &ParaList; - - if (ConfigData->NvData.TargetInfoFromDhcp) { - // - // Use callback to select an offer which contains target information. - // - Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer; - Dhcp4ConfigData.CallbackContext = &ConfigData->NvData; - } - - Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Dhcp4->Start (Dhcp4, NULL); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - // - // Parse the ACK to get required information. - // - Status = IScsiParseDhcpAck (Dhcp4, ConfigData); - -ON_EXIT: - - if (ParaList != NULL) { - FreePool (ParaList); - } - - if (Dhcp4 != NULL) { - Dhcp4->Stop (Dhcp4); - Dhcp4->Configure (Dhcp4, NULL); - - gBS->CloseProtocol ( - Dhcp4Handle, - &gEfiDhcp4ProtocolGuid, - Image, - Controller - ); - } - - NetLibDestroyServiceChild ( - Controller, - Image, - &gEfiDhcp4ServiceBindingProtocolGuid, - Dhcp4Handle - ); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c deleted file mode 100644 index 730f3e506bbc..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c +++ /dev/null @@ -1,676 +0,0 @@ -/** @file - The entry point of IScsi driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = { - IScsiDriverBindingSupported, - IScsiDriverBindingStart, - IScsiDriverBindingStop, - 0xa, - NULL, - NULL -}; - -/** - Tests to see if this driver supports the RemainingDevicePath. - - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This - parameter is ignored by device drivers, and is optional for bus - drivers. For bus drivers, if this parameter is not NULL, then - the bus driver must determine if the bus controller specified - by ControllerHandle and the child controller specified - by RemainingDevicePath are both supported by this - bus driver. - - @retval EFI_SUCCESS The RemainingDevicePath is supported or NULL. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver specified by This. -**/ -EFI_STATUS -IScsiIsDevicePathSupported ( - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath; - - CurrentDevicePath = RemainingDevicePath; - if (CurrentDevicePath != NULL) { - while (!IsDevicePathEnd (CurrentDevicePath)) { - if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && (CurrentDevicePath->SubType == MSG_ISCSI_DP)) { - return EFI_SUCCESS; - } - - CurrentDevicePath = NextDevicePathNode (CurrentDevicePath); - } - - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} - -/** - Tests to see if this driver supports a given controller. If a child device is provided, - it further tests to see if this driver supports creating a handle for the specified child device. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by the driver - specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a different - driver or an application that requires exclusive acces. - Currently not implemented. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver specified by This. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiCallerIdGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - return EFI_ALREADY_STARTED; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - Status = IScsiIsDevicePathSupported (RemainingDevicePath); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - if (IScsiDhcpIsConfigured (ControllerHandle)) { - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - } - - return EFI_SUCCESS; -} - -/** - Start this driver on ControllerHandle. - - The Start() function is designed to be invoked from the EFI boot service ConnectController(). - As a result, much of the error checking on the parameters to Start() has been moved into this - common boot service. It is legal to call Start() from other locations, but the following calling - restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned - EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified by This must - have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_DEVICE_ERROR The device could not be started due to a device error. - Currently not implemented. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval Others The driver failded to start the device. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - ISCSI_DRIVER_DATA *Private; - VOID *Interface; - - Private = IScsiCreateDriverData (This->DriverBindingHandle, ControllerHandle); - if (Private == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // - // Create a underlayer child instance, but not need to configure it. Just open ChildHandle - // via BY_DRIVER. That is, establishing the relationship between ControllerHandle and ChildHandle. - // Therefore, when DisconnectController(), especially VLAN virtual controller handle, - // IScsiDriverBindingStop() will be called. - // - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - &Private->ChildHandle - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->ChildHandle, - &gEfiTcp4ProtocolGuid, - &Interface, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Always install private protocol no matter what happens later. We need to - // keep the relationship between ControllerHandle and ChildHandle. - // - Status = gBS->InstallProtocolInterface ( - &ControllerHandle, - &gEfiCallerIdGuid, - EFI_NATIVE_INTERFACE, - &Private->IScsiIdentifier - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Try to add a port configuration page for this controller. - // - IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, TRUE); - - // - // Get the iSCSI configuration data of this controller. - // - Status = IScsiGetConfigData (Private); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - // - // Try to login and create an iSCSI session according to the configuration. - // - Status = IScsiSessionLogin (Private); - if (Status == EFI_MEDIA_CHANGED) { - // - // The specified target is not available and the redirection information is - // got, login the session again with the updated target address. - // - Status = IScsiSessionLogin (Private); - } - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - // - // Duplicate the Session's tcp connection device path. The source port field - // will be set to zero as one iSCSI session is comprised of several iSCSI - // connections. - // - Private->DevicePath = IScsiGetTcpConnDevicePath (Private); - if (Private->DevicePath == NULL) { - goto ON_ERROR; - } - // - // Install the updated device path onto the ExtScsiPassThruHandle. - // - Status = gBS->InstallProtocolInterface ( - &Private->ExtScsiPassThruHandle, - &gEfiDevicePathProtocolGuid, - EFI_NATIVE_INTERFACE, - Private->DevicePath - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // ISCSI children should share the default Tcp child, just open the default Tcp child via BY_CHILD_CONTROLLER. - // - Status = gBS->OpenProtocol ( - Private->ChildHandle, /// Default Tcp child - &gEfiTcp4ProtocolGuid, - &Interface, - This->DriverBindingHandle, - Private->ExtScsiPassThruHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - Private->ExtScsiPassThruHandle, - &gEfiExtScsiPassThruProtocolGuid, - &Private->IScsiExtScsiPassThru, - &gEfiDevicePathProtocolGuid, - Private->DevicePath, - NULL - ); - - goto ON_ERROR; - } - - // - // Update/Publish the iSCSI Boot Firmware Table. - // - IScsiPublishIbft (); - - return EFI_SUCCESS; - -ON_ERROR: - - IScsiSessionAbort (&Private->Session); - - return Status; -} - -/** - Stop this driver on ControllerHandle. - - Release the control of this controller and remove the IScsi functions. The Stop() - function is designed to be invoked from the EFI boot service DisconnectController(). - As a result, much of the error checking on the parameters to Stop() has been moved - into this common boot service. It is legal to call Stop() from other locations, - but the following calling restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this - same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this driver's - Start() function, and the Start() function must have called OpenProtocol() on - ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used. - @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL - if NumberOfChildren is 0.Not used. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. - @retval EFI_INVALID_PARAMETER Child handle is NULL. - @retval EFI_ACCESS_DENIED The protocol could not be removed from the Handle - because its interfaces are being used. - -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL - ) -{ - EFI_HANDLE IScsiController; - EFI_STATUS Status; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - ISCSI_DRIVER_DATA *Private; - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru; - ISCSI_CONNECTION *Conn; - - if (NumberOfChildren != 0) { - // - // We should have only one child. - // - Status = gBS->OpenProtocol ( - ChildHandleBuffer[0], - &gEfiExtScsiPassThruProtocolGuid, - (VOID **) &PassThru, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); - Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, Link); - - // - // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just close - // the protocol here but not uninstall the device path protocol and - // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle. - // - gBS->CloseProtocol ( - Private->ChildHandle, - &gEfiTcp4ProtocolGuid, - Private->Image, - Private->ExtScsiPassThruHandle - ); - - gBS->CloseProtocol ( - Conn->Tcp4Io.Handle, - &gEfiTcp4ProtocolGuid, - Private->Image, - Private->ExtScsiPassThruHandle - ); - - return EFI_SUCCESS; - } - // - // Get the handle of the controller we are controling. - // - IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid); - - Status = gBS->OpenProtocol ( - IScsiController, - &gEfiCallerIdGuid, - (VOID **)&IScsiIdentifier, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - - if (Private->ChildHandle != NULL) { - Status = gBS->CloseProtocol ( - Private->ChildHandle, - &gEfiTcp4ProtocolGuid, - This->DriverBindingHandle, - IScsiController - ); - - ASSERT (!EFI_ERROR (Status)); - - Status = NetLibDestroyServiceChild ( - IScsiController, - This->DriverBindingHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - Private->ChildHandle - ); - ASSERT (!EFI_ERROR (Status)); - } - - IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE); - - // - // Uninstall the private protocol. - // - gBS->UninstallProtocolInterface ( - IScsiController, - &gEfiCallerIdGuid, - &Private->IScsiIdentifier - ); - - // - // Update the iSCSI Boot Firware Table. - // - IScsiPublishIbft (); - - IScsiSessionAbort (&Private->Session); - Status = IScsiCleanDriverData (Private); - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} - -/** - Unloads an image(the iSCSI driver). - - @param[in] ImageHandle Handle that identifies the image to be unloaded. - - @retval EFI_SUCCESS The image has been unloaded. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -EfiIScsiUnload ( - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - UINTN DeviceHandleCount; - EFI_HANDLE *DeviceHandleBuffer; - UINTN Index; - EFI_COMPONENT_NAME_PROTOCOL *ComponentName; - EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; - - // - // Try to disonnect the driver from the devices it's controlling. - // - Status = gBS->LocateHandleBuffer ( - AllHandles, - NULL, - NULL, - &DeviceHandleCount, - &DeviceHandleBuffer - ); - if (EFI_ERROR (Status)) { - return Status; - } - - for (Index = 0; Index < DeviceHandleCount; Index++) { - Status = IScsiTestManagedDevice ( - DeviceHandleBuffer[Index], - gIScsiDriverBinding.DriverBindingHandle, - &gEfiTcp4ProtocolGuid - ); - if (EFI_ERROR (Status)) { - continue; - } - Status = gBS->DisconnectController ( - DeviceHandleBuffer[Index], - gIScsiDriverBinding.DriverBindingHandle, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - // - // Unload the iSCSI configuration form. - // - Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Uninstall the ComponentName and ComponentName2 protocol from iSCSI4 driver binding handle - // if it has been installed. - // - Status = gBS->HandleProtocol ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentNameProtocolGuid, - (VOID **) &ComponentName - ); - if (!EFI_ERROR (Status)) { - Status = gBS->UninstallMultipleProtocolInterfaces ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentNameProtocolGuid, - ComponentName, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - Status = gBS->HandleProtocol ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentName2ProtocolGuid, - (VOID **) &ComponentName2 - ); - if (!EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - gIScsiDriverBinding.DriverBindingHandle, - &gEfiComponentName2ProtocolGuid, - ComponentName2, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - Status = gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, - &gIScsiDriverBinding, - &gEfiIScsiInitiatorNameProtocolGuid, - &gIScsiInitiatorName, - NULL - ); -ON_EXIT: - - if (DeviceHandleBuffer != NULL) { - FreePool (DeviceHandleBuffer); - } - - return Status; -} - -/** - This is the declaration of an EFI image entry point. This entry point is - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including - both device drivers and bus drivers. It initialize the global variables and - publish the driver binding protocol. - - @param[in] ImageHandle The firmware allocated handle for the UEFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL was installed unexpectedly. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiDriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName; - - // - // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL. - // - Status = gBS->LocateProtocol ( - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - (VOID**) &IScsiInitiatorName - ); - - if (!EFI_ERROR (Status)) { - return EFI_ACCESS_DENIED; - } - - // - // Initialize the EFI Driver Library - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gIScsiDriverBinding, - ImageHandle, - &gIScsiComponentName, - &gIScsiComponentName2 - ); - - if (!EFI_ERROR (Status)) { - // - // Install the iSCSI Initiator Name Protocol. - // - Status = gBS->InstallProtocolInterface ( - &ImageHandle, - &gEfiIScsiInitiatorNameProtocolGuid, - EFI_NATIVE_INTERFACE, - &gIScsiInitiatorName - ); - if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, - &gIScsiDriverBinding, - &gEfiComponentName2ProtocolGuid, - &gIScsiComponentName2, - &gEfiComponentNameProtocolGuid, - &gIScsiComponentName, - NULL - ); - return Status; - } - - // - // Initialize the configuration form of iSCSI. - // - Status = IScsiConfigFormInit (); - if (EFI_ERROR (Status)) { - gBS->UninstallMultipleProtocolInterfaces ( - ImageHandle, - &gEfiDriverBindingProtocolGuid, - &gIScsiDriverBinding, - &gEfiComponentName2ProtocolGuid, - &gIScsiComponentName2, - &gEfiComponentNameProtocolGuid, - &gIScsiComponentName, - &gEfiIScsiInitiatorNameProtocolGuid, - &gIScsiInitiatorName, - NULL - ); - } - } - return Status; -} - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c deleted file mode 100644 index db2d6d19366e..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c +++ /dev/null @@ -1,412 +0,0 @@ -/** @file - The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -/** - Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function - supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the - nonblocking I/O functionality is optional. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it represents - the id of the SCSI device to send the SCSI Request Packet. Each - transport driver may chose to utilize a subset of this size to suit the needs - of transport target representation. For example, a Fibre Channel driver - may use only 8 bytes (WWN) to represent an FC target. - @param[in] Lun The LUN of the SCSI device to send the SCSI Request Packet. - @param[in, out] Packet A pointer to the SCSI Request Packet to send to the SCSI device - specified by Target and Lun. - @param[in] Event If nonblocking I/O is not supported then Event is ignored, and blocking - I/O is performed. If Event is NULL, then blocking I/O is performed. If - Event is not NULL and non blocking I/O is supported, then - nonblocking I/O is performed, and Event will be signaled when the - SCSI Request Packet completes. - - @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For bi-directional - commands, InTransferLength bytes were transferred from - InDataBuffer. For write and bi-directional commands, - OutTransferLength bytes were transferred by - OutDataBuffer. - @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed. The number of bytes that - could be transferred is returned in InTransferLength. For write - and bi-directional commands, OutTransferLength bytes were - transferred by OutDataBuffer. Currently not implemeted. - @retval EFI_NOT_READY The SCSI Request Packet could not be sent because there are too many - SCSI Request Packets already queued. The caller may retry again later. - @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the SCSI Request - Packet. - @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket are invalid. - @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet is not supported - by the host adapter. This includes the case of Bi-directional SCSI - commands not supported by the implementation. The SCSI Request - Packet was not sent, so no additional status information is available. - Currently not implemeted. - @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruFunction ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, - IN EFI_EVENT Event OPTIONAL - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - EFI_STATUS Status; - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - ConfigNvData = &Private->Session.ConfigData.NvData; - - if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0)) { - return EFI_INVALID_PARAMETER; - } - - if ((Packet == NULL) || (Packet->Cdb == NULL)) { - return EFI_INVALID_PARAMETER; - } - - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); - if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) { - // - // Try to reinstate the session and re-execute the Scsi command. - // - if (EFI_ERROR (IScsiSessionReinstatement (Private))) { - return EFI_DEVICE_ERROR; - } - - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet); - } - - return Status; -} - -/** - Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI channel. These - can either be the list SCSI devices that are actually present on the SCSI channel, or the list of legal - Target Ids and LUNs for the SCSI channel. Regardless, the caller of this function must probe the - Target ID and LUN returned to see if a SCSI device is actually present at that location on the SCSI - channel. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in, out] Target On input, a pointer to the Target ID (an array of size - TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel. - On output, a pointer to the Target ID (an array of - TARGET_MAX_BYTES) of the next SCSI device present on a SCSI - channel. An input value of 0xF(all bytes in the array are 0xF) in the - Target array retrieves the Target ID of the first SCSI device present on a - SCSI channel. - @param[in, out] Lun On input, a pointer to the LUN of a SCSI device present on the SCSI - channel. On output, a pointer to the LUN of the next SCSI device present - on a SCSI channel. - - @retval EFI_SUCCESS The Target ID and LUN of the next SCSI device on the SCSI - channel was returned in Target and Lun. - @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target and Lun were - not returned on a previous call to GetNextTargetLun(). - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruGetNextTargetLun ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN OUT UINT8 **Target, - IN OUT UINT64 *Lun - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - UINT8 TargetId[TARGET_MAX_BYTES]; - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - ConfigNvData = &Private->Session.ConfigData.NvData; - - if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) { - // - // Only one <Target, Lun> pair per iSCSI Driver instance. - // - return EFI_NOT_FOUND; - } - - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { - (*Target)[0] = 0; - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); - - return EFI_SUCCESS; - } - - return EFI_INVALID_PARAMETER; -} - -/** - Used to allocate and build a device path node for a SCSI device on a SCSI channel. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it specifies the - Target ID of the SCSI device for which a device path node is to be - allocated and built. Transport drivers may chose to utilize a subset of - this size to suit the representation of targets. For example, a Fibre - Channel driver may use only 8 bytes (WWN) in the array to represent a - FC target. - @param[in] Lun The LUN of the SCSI device for which a device path node is to be - allocated and built. - @param[in, out] DevicePath A pointer to a single device path node that describes the SCSI device - specified by Target and Lun. This function is responsible for - allocating the buffer DevicePath with the boot service - AllocatePool(). It is the caller's responsibility to free - DevicePath when the caller is finished with DevicePath. - - @retval EFI_SUCCESS The device path node that describes the SCSI device specified by - Target and Lun was allocated and returned in - DevicePath. - @retval EFI_INVALID_PARAMETER DevicePath is NULL. - @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun does not exist - on the SCSI channel. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate DevicePath. - -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruBuildDevicePath ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION *Session; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; - EFI_DEV_PATH *Node; - UINTN DevPathNodeLen; - - if (DevicePath == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (Target[0] != 0) { - return EFI_NOT_FOUND; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - Session = &Private->Session; - ConfigNvData = &Session->ConfigData.NvData; - AuthConfig = &Session->AuthData.AuthConfig; - - if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) { - return EFI_NOT_FOUND; - } - - DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1; - Node = AllocatePool (DevPathNodeLen); - if (Node == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Node->DevPath.Type = MESSAGING_DEVICE_PATH; - Node->DevPath.SubType = MSG_ISCSI_DP; - SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen); - - // - // 0 for TCP, others are reserved. - // - Node->Iscsi.NetworkProtocol = 0; - - Node->Iscsi.LoginOption = 0; - switch (AuthConfig->CHAPType) { - case ISCSI_CHAP_NONE: - Node->Iscsi.LoginOption |= 0x0800; - break; - - case ISCSI_CHAP_UNI: - Node->Iscsi.LoginOption |= 0x1000; - break; - - default: - break; - } - - CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64)); - Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag; - AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName); - - *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node; - - return EFI_SUCCESS; -} - -/** - Used to translate a device path node to a Target ID and LUN. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] DevicePath A pointer to a single device path node that describes the SCSI device - on the SCSI channel. - @param[out] Target A pointer to the Target Array which represents the ID of a SCSI device - on the SCSI channel. - @param[out] Lun A pointer to the LUN of a SCSI device on the SCSI channel. - - @retval EFI_SUCCESS DevicePath was successfully translated to a Target ID and - LUN, and they were returned in Target and Lun. - @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL. - @retval EFI_NOT_FOUND A valid translation from DevicePath to a Target ID and LUN - does not exist.Currently not implemented. - @retval EFI_UNSUPPORTED This driver does not support the device path node type in - DevicePath. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruGetTargetLun ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, - OUT UINT8 **Target, - OUT UINT64 *Lun - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData; - - if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if ((DevicePath->Type != MESSAGING_DEVICE_PATH) || - (DevicePath->SubType != MSG_ISCSI_DP) || - (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH)) - ) { - return EFI_UNSUPPORTED; - } - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This); - ConfigNvData = &Private->Session.ConfigData.NvData; - - SetMem (*Target, TARGET_MAX_BYTES, 0xFF); - (*Target)[0] = 0; - - if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) { - return EFI_UNSUPPORTED; - } - - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)); - - return EFI_SUCCESS; -} - -/** - Resets a SCSI channel. This operation resets all the SCSI devices connected to the SCSI channel. - Currently not implemented. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - - @retval EFI_SUCCESS The SCSI channel was reset. - @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI channel. - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI channel. - @retval EFI_UNSUPPORTED The SCSI channel does not support a channel reset operation. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruResetChannel ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This - ) -{ - return EFI_UNSUPPORTED; -} - -/** - Resets a SCSI logical unit that is connected to a SCSI channel. Currently not implemented. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in] Target The Target is an array of size TARGET_MAX_BYTE and it represents the - target port ID of the SCSI device containing the SCSI logical unit to - reset. Transport drivers may chose to utilize a subset of this array to suit - the representation of their targets. - @param[in] Lun The LUN of the SCSI device to reset. - - @retval EFI_SUCCESS The SCSI device specified by Target and Lun was reset. - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI device - specified by Target and Lun. - @retval EFI_UNSUPPORTED The SCSI channel does not support a target reset operation. - @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI device - specified by Target and Lun. - -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruResetTargetLun ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN UINT8 *Target, - IN UINT64 Lun - ) -{ - return EFI_UNSUPPORTED; -} - -/** - Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI channel. These can either - be the list SCSI devices that are actually present on the SCSI channel, or the list of legal Target IDs - for the SCSI channel. Regardless, the caller of this function must probe the Target ID returned to - see if a SCSI device is actually present at that location on the SCSI channel. - - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance. - @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel. - On output, a pointer to the Target ID (an array of - TARGET_MAX_BYTES) of the next SCSI device present on a SCSI - channel. An input value of 0xF(all bytes in the array are 0xF) in the - Target array retrieves the Target ID of the first SCSI device present on a - SCSI channel. - - @retval EFI_SUCCESS The Target ID of the next SCSI device on the SCSI - channel was returned in Target. - @retval EFI_INVALID_PARAMETER Target or Lun is NULL. - @retval EFI_TIMEOUT Target array is not all 0xF, and Target were not - returned on a previous call to GetNextTarget(). - Currently not implemented. - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel. -**/ -EFI_STATUS -EFIAPI -IScsiExtScsiPassThruGetNextTarget ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, - IN OUT UINT8 **Target - ) -{ - UINT8 TargetId[TARGET_MAX_BYTES]; - - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF); - - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) { - (*Target)[0] = 0; - return EFI_SUCCESS; - } else if ((*Target)[0] == 0) { - return EFI_NOT_FOUND; - } else { - return EFI_INVALID_PARAMETER; - } -} - -EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = { - NULL, - IScsiExtScsiPassThruFunction, - IScsiExtScsiPassThruGetNextTargetLun, - IScsiExtScsiPassThruBuildDevicePath, - IScsiExtScsiPassThruGetTargetLun, - IScsiExtScsiPassThruResetChannel, - IScsiExtScsiPassThruResetTargetLun, - IScsiExtScsiPassThruGetNextTarget -}; diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c deleted file mode 100644 index 58c5447dcbd1..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c +++ /dev/null @@ -1,539 +0,0 @@ -/** @file - Implementation for iSCSI Boot Firmware Table publication. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -BOOLEAN mIbftInstalled = FALSE; -UINTN mTableKey; - -/** - Initialize the header of the iSCSI Boot Firmware Table. - - @param[out] Header The header of the iSCSI Boot Firmware Table. - @param[in] OemId The OEM ID. - @param[in] OemTableId The OEM table ID for the iBFT. -**/ -VOID -IScsiInitIbfTableHeader ( - OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header, - IN UINT8 *OemId, - IN UINT64 *OemTableId - ) -{ - ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER)); - - Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE; - Header->Length = IBFT_HEAP_OFFSET; - Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION; - Header->Checksum = 0; - - CopyMem (Header->OemId, OemId, sizeof (Header->OemId)); - CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64)); -} - -/** - Initialize the control section of the iSCSI Boot Firmware Table. - - @param[in] Table The ACPI table. - @param[in] HandleCount The number of the handles associated with iSCSI sessions, it's - equal to the number of iSCSI sessions. -**/ -VOID -IScsiInitControlSection ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN UINTN HandleCount - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - UINTN NumOffset; - - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - - ZeroMem (Control, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE)); - - Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID; - Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION; - Control->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE); - - // - // Each session occupies two offsets, one for the NIC section, - // the other for the Target section. - // - NumOffset = 2 * HandleCount; - if (NumOffset > 4) { - // - // Need expand the control section if more than 2 NIC/Target sections - // exist. - // - Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16)); - } -} - -/** - Add one item into the heap. - - @param[in, out] Heap On input, the current address of the heap; On output, the address of - the heap after the item is added. - @param[in] Data The data to add into the heap. - @param[in] Len Length of the Data in byte. -**/ -VOID -IScsiAddHeapItem ( - IN OUT UINT8 **Heap, - IN VOID *Data, - IN UINTN Len - ) -{ - // - // Add one byte for the NULL delimiter. - // - *Heap -= Len + 1; - - CopyMem (*Heap, Data, Len); - *(*Heap + Len) = 0; -} - -/** - Fill the Initiator section of the iSCSI Boot Firmware Table. - - @param[in] Table The ACPI table. - @param[in, out] Heap The heap. - @param[in] Handle The handle associated with the iSCSI session. -**/ -VOID -IScsiFillInitiatorSection ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN OUT UINT8 **Heap, - IN EFI_HANDLE Handle - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator; - ISCSI_DRIVER_DATA *DriverData; - ISCSI_SESSION *Session; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - EFI_STATUS Status; - - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - - // - // Initiator section immediately follows the control section. - // - Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length)); - - Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table); - - ZeroMem (Initiator, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)); - - Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID; - Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION; - Initiator->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE); - Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED; - - // - // Get the identifier from the handle. - // - Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) &IScsiIdentifier); - if (EFI_ERROR (Status)) { - ASSERT (FALSE); - return ; - } - - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - Session = &DriverData->Session; - - // - // Fill the iSCSI Initiator Name into the heap. - // - IScsiAddHeapItem (Heap, Session->InitiatorName, Session->InitiatorNameLength - 1); - - Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1); - Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); -} - -/** - Map the v4 IP address into v6 IP address. - - @param[in] V4 The v4 IP address. - @param[out] V6 The v6 IP address. -**/ -VOID -IScsiMapV4ToV6Addr ( - IN EFI_IPv4_ADDRESS *V4, - OUT EFI_IPv6_ADDRESS *V6 - ) -{ - UINTN Index; - - ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS)); - - V6->Addr[10] = 0xff; - V6->Addr[11] = 0xff; - - for (Index = 0; Index < 4; Index++) { - V6->Addr[12 + Index] = V4->Addr[Index]; - } -} - -/** - Get the NIC's PCI location and return it according to the composited - format defined in iSCSI Boot Firmware Table. - - @param[in] Controller The handle of the controller. - - @return UINT16 The composited representation of the NIC PCI location. - @retval 0 Other errors as indicated. -**/ -UINT16 -IScsiGetNICPciLocation ( - IN EFI_HANDLE Controller - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_HANDLE PciIoHandle; - EFI_PCI_IO_PROTOCOL *PciIo; - UINTN Segment; - UINTN Bus; - UINTN Device; - UINTN Function; - - Status = gBS->HandleProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - (VOID **)&DevicePath - ); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = gBS->LocateDevicePath ( - &gEfiPciIoProtocolGuid, - &DevicePath, - &PciIoHandle - ); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo); - if (EFI_ERROR (Status)) { - return 0; - } - - Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function); - if (EFI_ERROR (Status)) { - return 0; - } - - return (UINT16) ((Bus << 8) | (Device << 3) | Function); -} - -/** - Fill the NIC and target sections in iSCSI Boot Firmware Table. - - @param[in] Table The buffer of the ACPI table. - @param[in, out] Heap The heap buffer used to store the variable length parameters such as iSCSI name. - @param[in] HandleCount Count The number of handles having iSCSI private protocol installed. - @param[in] Handles The handle buffer. -**/ -VOID -IScsiFillNICAndTargetSections ( - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table, - IN OUT UINT8 **Heap, - IN UINTN HandleCount, - IN EFI_HANDLE *Handles - ) -{ - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target; - ISCSI_DRIVER_DATA *DriverData; - ISCSI_SESSION_CONFIG_DATA *SessionConfigData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig; - UINT16 *SectionOffset; - UINTN Index; - UINT16 Length; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier; - EFI_STATUS Status; - - // - // Get the offset of the first Nic and Target section. - // - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1); - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Table + - Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE))); - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); - - SectionOffset = &Control->NIC0Offset; - - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID **)&IScsiIdentifier); - if (EFI_ERROR (Status)) { - ASSERT (FALSE); - return ; - } - - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier); - SessionConfigData = &DriverData->Session.ConfigData; - AuthConfig = &DriverData->Session.AuthData.AuthConfig; - - // - // Fill the Nic section. - // - ZeroMem (Nic, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)); - - Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID; - Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION; - Nic->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE); - Nic->Header.Index = (UINT8) Index; - Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID | - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED | - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL; - - // - // Get the subnet mask prefix length. - // - Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength (&SessionConfigData->NvData.SubnetMask); - - if (SessionConfigData->NvData.InitiatorInfoFromDhcp) { - Nic->Origin = IpPrefixOriginDhcp; - } else { - Nic->Origin = IpPrefixOriginManual; - } - // - // Map the various v4 addresses into v6 addresses. - // - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip); - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic->Gateway); - IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic->PrimaryDns); - IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic->SecondaryDns); - IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic->DhcpServer); - - Nic->VLanTag = NetLibGetVlanId (DriverData->Controller); - - Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac)); - - // - // Get the PCI location of the Nic. - // - Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller); - - *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table); - SectionOffset++; - - // - // Fill the Target section. - // - ZeroMem (Target, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)); - - Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID; - Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION; - Target->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE); - Target->Header.Index = (UINT8) Index; - Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED; - Target->Port = SessionConfigData->NvData.TargetPort; - Target->NicIndex = (UINT8) Index; - - if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP; - } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_CHAP; - } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) { - Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP; - } - - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target->Ip); - CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof (Target->BootLun)); - - // - // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret. - // - Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName); - IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, Length); - - Target->IScsiNameLength = Length; - Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - if (Target->CHAPType != EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP) { - // - // CHAP Name - // - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName); - IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length); - Target->CHAPNameLength = Length; - Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - // - // CHAP Secret - // - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret); - IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length); - Target->CHAPSecretLength = Length; - Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) { - // - // Reverse CHAP Name - // - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName); - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length); - Target->ReverseCHAPNameLength = Length; - Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - - // - // Reverse CHAP Secret - // - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret); - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length); - Target->ReverseCHAPSecretLength = Length; - Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table); - } - } - - *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table); - SectionOffset++; - - // - // Advance to the next NIC/Target pair - // - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Target + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE))); - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic + - IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE))); - } -} - -/** - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI - session status. -**/ -VOID -IScsiPublishIbft ( - VOID - ) -{ - EFI_STATUS Status; - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - UINT8 *Heap; - UINT8 Checksum; - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; - EFI_ACPI_DESCRIPTION_HEADER *Rsdt; - EFI_ACPI_DESCRIPTION_HEADER *Xsdt; - - Rsdt = NULL; - Xsdt = NULL; - - Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol); - if (EFI_ERROR (Status)) { - return ; - } - - - // - // Find ACPI table RSD_PTR from system table - // - Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp); - if (EFI_ERROR (Status)) { - Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp); - } - - if (EFI_ERROR (Status) || (Rsdp == NULL)) { - return ; - } else if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) { - Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress; - } else if (Rsdp->RsdtAddress != 0) { - Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress; - } - - if ((Xsdt == NULL) && (Rsdt == NULL)) { - return ; - } - - if (mIbftInstalled) { - Status = AcpiTableProtocol->UninstallAcpiTable ( - AcpiTableProtocol, - mTableKey - ); - if (EFI_ERROR (Status)) { - return ; - } - mIbftInstalled = FALSE; - } - - // - // Get all iSCSI private protocols. - // - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiCallerIdGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (EFI_ERROR (Status)) { - return ; - } - // - // Allocate 4k bytes to hold the ACPI table. - // - Table = AllocateZeroPool (IBFT_MAX_SIZE); - if (Table == NULL) { - return ; - } - - Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET; - - // - // Fill in the various section of the iSCSI Boot Firmware Table. - // - if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) { - IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId); - } else { - IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId); - } - - IScsiInitControlSection (Table, HandleCount); - IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]); - IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer); - - Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length); - Table->Checksum = Checksum; - - FreePool (HandleBuffer); - - // - // Install or update the iBFT table. - // - Status = AcpiTableProtocol->InstallAcpiTable ( - AcpiTableProtocol, - Table, - Table->Length, - &mTableKey - ); - if (EFI_ERROR(Status)) { - return; - } - - mIbftInstalled = TRUE; - FreePool (Table); -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c deleted file mode 100644 index e753d9eebdbe..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c +++ /dev/null @@ -1,116 +0,0 @@ -/** @file - Implementation for EFI iSCSI Initiator Name Protocol. - -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = { - IScsiGetInitiatorName, - IScsiSetInitiatorName -}; - -/** - Retrieves the current set value of iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the - variable data buffer. - @param[out] Buffer Pointer to the buffer for data to be read. The data is a null-terminated UTF-8 encoded string. - The maximum length is 223 characters, including the null-terminator. - - @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the - BufferSize was sufficient to handle the iSCSI initiator name. - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiGetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - EFI_STATUS Status; - - if ((BufferSize == NULL) || (Buffer == NULL)) { - return EFI_INVALID_PARAMETER; - } - - Status = gRT->GetVariable ( - ISCSI_INITIATOR_NAME_VAR_NAME, - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - BufferSize, - Buffer - ); - - return Status; -} - -/** - Sets the iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. - @param[in] Buffer Pointer to the buffer for data to be written. The data is a null-terminated UTF-8 encoded string. - The maximum length is 223 characters, including the null-terminator. - - @retval EFI_SUCCESS Data was successfully stored by the protocol. - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written. - Currently not implemented. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit. - @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data. - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720 - (and other related protocols). - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiSetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -{ - EFI_STATUS Status; - - if ((BufferSize == NULL) || (Buffer == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if (*BufferSize > ISCSI_NAME_MAX_SIZE) { - *BufferSize = ISCSI_NAME_MAX_SIZE; - return EFI_INVALID_PARAMETER; - } - // - // only support iqn iSCSI names. - // - Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gRT->SetVariable ( - ISCSI_INITIATOR_NAME_VAR_NAME, - &gEfiIScsiInitiatorNameProtocolGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - *BufferSize, - Buffer - ); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c deleted file mode 100644 index d924a8b82427..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c +++ /dev/null @@ -1,948 +0,0 @@ -/** @file - Miscellaneous routines for iSCSI driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] = "0123456789ABCDEFabcdef"; - -/** - Removes (trims) specified leading and trailing characters from a string. - - @param[in, out] Str Pointer to the null-terminated string to be trimmed. On return, - Str will hold the trimmed string. - - @param[in] CharC Character will be trimmed from str. -**/ -VOID -StrTrim ( - IN OUT CHAR16 *Str, - IN CHAR16 CharC - ) -{ - CHAR16 *Pointer1; - CHAR16 *Pointer2; - - if (*Str == 0) { - return; - } - - // - // Trim off the leading and trailing characters c - // - for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) { - ; - } - - Pointer2 = Str; - if (Pointer2 == Pointer1) { - while (*Pointer1 != 0) { - Pointer2++; - Pointer1++; - } - } else { - while (*Pointer1 != 0) { - *Pointer2 = *Pointer1; - Pointer1++; - Pointer2++; - } - *Pointer2 = 0; - } - - - for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; Pointer1--) { - ; - } - if (Pointer1 != Str + StrLen(Str) - 1) { - *(Pointer1 + 1) = 0; - } -} - -/** - Calculate the prefix length of the IPv4 subnet mask. - - @param[in] SubnetMask The IPv4 subnet mask. - - @return The prefix length of the subnet mask. - @retval 0 Other errors as indicated. -**/ -UINT8 -IScsiGetSubnetMaskPrefixLength ( - IN EFI_IPv4_ADDRESS *SubnetMask - ) -{ - UINT8 Len; - UINT32 ReverseMask; - - // - // The SubnetMask is in network byte order. - // - ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]); - - // - // Reverse it. - // - ReverseMask = ~ReverseMask; - - if ((ReverseMask & (ReverseMask + 1)) != 0) { - return 0; - } - - Len = 0; - - while (ReverseMask != 0) { - ReverseMask = ReverseMask >> 1; - Len++; - } - - return (UINT8) (32 - Len); -} - -/** - Convert the hexadecimal encoded LUN string into the 64-bit LUN. - - @param[in] Str The hexadecimal encoded LUN string. - @param[out] Lun Storage to return the 64-bit LUN. - - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. - @retval EFI_INVALID_PARAMETER The string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToLun ( - IN CHAR8 *Str, - OUT UINT8 *Lun - ) -{ - UINTN Index, IndexValue, IndexNum, SizeStr; - CHAR8 TemStr[2]; - UINT8 TemValue; - UINT16 Value[4]; - - ZeroMem (Lun, 8); - ZeroMem (TemStr, 2); - ZeroMem ((UINT8 *) Value, sizeof (Value)); - SizeStr = AsciiStrLen (Str); - IndexValue = 0; - IndexNum = 0; - - for (Index = 0; Index < SizeStr; Index ++) { - TemStr[0] = Str[Index]; - TemValue = (UINT8) AsciiStrHexToUint64 (TemStr); - if (TemValue == 0 && TemStr[0] != '0') { - if ((TemStr[0] != '-') || (IndexNum == 0)) { - // - // Invalid Lun Char - // - return EFI_INVALID_PARAMETER; - } - } - - if ((TemValue == 0) && (TemStr[0] == '-')) { - // - // Next Lun value - // - if (++IndexValue >= 4) { - // - // Max 4 Lun value - // - return EFI_INVALID_PARAMETER; - } - // - // Restart str index for the next lun value - // - IndexNum = 0; - continue; - } - - if (++IndexNum > 4) { - // - // Each Lun Str can't exceed size 4, because it will be as UINT16 value - // - return EFI_INVALID_PARAMETER; - } - - // - // Combine UINT16 value - // - Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue); - } - - for (Index = 0; Index <= IndexValue; Index ++) { - *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]); - } - - return EFI_SUCCESS; -} - -/** - Convert the 64-bit LUN into the hexadecimal encoded LUN string. - - @param[in] Lun The 64-bit LUN. - @param[out] Str The storage to return the hexadecimal encoded LUN string. -**/ -VOID -IScsiLunToUnicodeStr ( - IN UINT8 *Lun, - OUT CHAR16 *Str - ) -{ - UINTN Index; - CHAR16 *TempStr; - - TempStr = Str; - - for (Index = 0; Index < 4; Index++) { - - if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) { - CopyMem(TempStr, L"0-", sizeof (L"0-")); - } else { - TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4]; - TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F]; - TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4]; - TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F]; - TempStr[4] = L'-'; - TempStr[5] = 0; - - StrTrim (TempStr, L'0'); - } - - TempStr += StrLen (TempStr); - } - - ASSERT (StrLen(Str) >= 1); - Str[StrLen (Str) - 1] = 0; - - for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) { - if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) { - Str[Index - 1] = 0; - } else { - break; - } - } -} - -/** - Convert the ASCII string into a UNICODE string. - - @param[in] Source The ASCII string. - @param[out] Destination The storage to return the UNICODE string. - - @return CHAR16 * Pointer to the UNICODE string. -**/ -CHAR16 * -IScsiAsciiStrToUnicodeStr ( - IN CHAR8 *Source, - OUT CHAR16 *Destination - ) -{ - ASSERT (Destination != NULL); - ASSERT (Source != NULL); - - while (*Source != '\0') { - *(Destination++) = (CHAR16) *(Source++); - } - - *Destination = '\0'; - - return Destination; -} - -/** - Convert the UNICODE string into an ASCII string. - - @param[in] Source The UNICODE string. - @param[out] Destination The storage to return the ASCII string. - - @return CHAR8 * Pointer to the ASCII string. -**/ -CHAR8 * -IScsiUnicodeStrToAsciiStr ( - IN CHAR16 *Source, - OUT CHAR8 *Destination - ) -{ - ASSERT (Destination != NULL); - ASSERT (Source != NULL); - - while (*Source != '\0') { - // - // If any Unicode characters in Source contain - // non-zero value in the upper 8 bits, then ASSERT(). - // - ASSERT (*Source < 0x100); - *(Destination++) = (CHAR8) *(Source++); - } - - *Destination = '\0'; - - return Destination; -} - -/** - Convert the decimal dotted IPv4 address into the binary IPv4 address. - - @param[in] Str The UNICODE string. - @param[out] Ip The storage to return the ASCII string. - - @retval EFI_SUCCESS The binary IP address is returned in Ip. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToIp ( - IN CHAR8 *Str, - OUT EFI_IPv4_ADDRESS *Ip - ) -{ - UINTN Index; - UINTN Number; - - Index = 0; - - while (*Str != 0) { - - if (Index > 3) { - return EFI_INVALID_PARAMETER; - } - - Number = 0; - while (NET_IS_DIGIT (*Str)) { - Number = Number * 10 + (*Str - '0'); - Str++; - } - - if (Number > 0xFF) { - return EFI_INVALID_PARAMETER; - } - - Ip->Addr[Index] = (UINT8) Number; - - if ((*Str != '\0') && (*Str != '.')) { - // - // The current character should be either the NULL terminator or - // the dot delimiter. - // - return EFI_INVALID_PARAMETER; - } - - if (*Str == '.') { - // - // Skip the delimiter. - // - Str++; - } - - Index++; - } - - if (Index != 4) { - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - -/** - Convert the mac address into a hexadecimal encoded "-" seperated string. - - @param[in] Mac The mac address. - @param[in] Len Length in bytes of the mac address. - @param[in] VlanId VLAN ID of the network device. - @param[out] Str The storage to return the mac string. -**/ -VOID -IScsiMacAddrToStr ( - IN EFI_MAC_ADDRESS *Mac, - IN UINT32 Len, - IN UINT16 VlanId, - OUT CHAR16 *Str - ) -{ - UINT32 Index; - CHAR16 *String; - - for (Index = 0; Index < Len; Index++) { - Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F]; - Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F]; - Str[3 * Index + 2] = L'-'; - } - - String = &Str[3 * Index - 1] ; - if (VlanId != 0) { - String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) VlanId); - } - - *String = L'\0'; -} - -/** - Convert the binary encoded buffer into a hexadecimal encoded string. - - @param[in] BinBuffer The buffer containing the binary data. - @param[in] BinLength Length of the binary buffer. - @param[in, out] HexStr Pointer to the string. - @param[in, out] HexLength The length of the string. - - @retval EFI_SUCCESS The binary data is converted to the hexadecimal string - and the length of the string is updated. - @retval EFI_BUFFER_TOO_SMALL The string is too small. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiBinToHex ( - IN UINT8 *BinBuffer, - IN UINT32 BinLength, - IN OUT CHAR8 *HexStr, - IN OUT UINT32 *HexLength - ) -{ - UINTN Index; - - if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) { - return EFI_INVALID_PARAMETER; - } - - if (((*HexLength) - 3) < BinLength * 2) { - *HexLength = BinLength * 2 + 3; - return EFI_BUFFER_TOO_SMALL; - } - - *HexLength = BinLength * 2 + 3; - // - // Prefix for Hex String - // - HexStr[0] = '0'; - HexStr[1] = 'x'; - - for (Index = 0; Index < BinLength; Index++) { - HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4]; - HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F]; - } - - HexStr[Index * 2 + 2] = '\0'; - - return EFI_SUCCESS; -} - -/** - Convert the hexadecimal string into a binary encoded buffer. - - @param[in, out] BinBuffer The binary buffer. - @param[in, out] BinLength Length of the binary buffer. - @param[in] HexStr The hexadecimal string. - - @retval EFI_SUCCESS The hexadecimal string is converted into a binary - encoded buffer. - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data. -**/ -EFI_STATUS -IScsiHexToBin ( - IN OUT UINT8 *BinBuffer, - IN OUT UINT32 *BinLength, - IN CHAR8 *HexStr - ) -{ - UINTN Index; - UINTN Length; - UINT8 Digit; - CHAR8 TemStr[2]; - - ZeroMem (TemStr, sizeof (TemStr)); - - // - // Find out how many hex characters the string has. - // - if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) { - HexStr += 2; - } - - Length = AsciiStrLen (HexStr); - - for (Index = 0; Index < Length; Index ++) { - TemStr[0] = HexStr[Index]; - Digit = (UINT8) AsciiStrHexToUint64 (TemStr); - if (Digit == 0 && TemStr[0] != '0') { - // - // Invalid Lun Char - // - break; - } - if ((Index & 1) == 0) { - BinBuffer [Index/2] = Digit; - } else { - BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit); - } - } - - *BinLength = (UINT32) ((Index + 1)/2); - - return EFI_SUCCESS; -} - -/** - Generate random numbers. - - @param[in, out] Rand The buffer to contain random numbers. - @param[in] RandLength The length of the Rand buffer. -**/ -VOID -IScsiGenRandom ( - IN OUT UINT8 *Rand, - IN UINTN RandLength - ) -{ - UINT32 Random; - - while (RandLength > 0) { - Random = NET_RANDOM (NetRandomInitSeed ()); - *Rand++ = (UINT8) (Random); - RandLength--; - } -} - -/** - Create the iSCSI driver data.. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - - @return The iSCSI driver data created. - @retval NULL Other errors as indicated. -**/ -ISCSI_DRIVER_DATA * -IScsiCreateDriverData ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller - ) -{ - ISCSI_DRIVER_DATA *Private; - EFI_STATUS Status; - - Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA)); - if (Private == NULL) { - return NULL; - } - - Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE; - Private->Image = Image; - Private->Controller = Controller; - - // - // Create an event to be signal when the BS to RT transition is triggerd so - // as to abort the iSCSI session. - // - Status = gBS->CreateEventEx ( - EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - IScsiOnExitBootService, - Private, - &gEfiEventExitBootServicesGuid, - &Private->ExitBootServiceEvent - ); - if (EFI_ERROR (Status)) { - FreePool (Private); - return NULL; - } - - CopyMem(&Private->IScsiExtScsiPassThru, &gIScsiExtScsiPassThruProtocolTemplate, sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL)); - - // - // 0 is designated to the TargetId, so use another value for the AdapterId. - // - Private->ExtScsiPassThruMode.AdapterId = 2; - Private->ExtScsiPassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL; - Private->ExtScsiPassThruMode.IoAlign = 4; - Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode; - - // - // Install the Ext SCSI PASS THRU protocol. - // - Status = gBS->InstallProtocolInterface ( - &Private->ExtScsiPassThruHandle, - &gEfiExtScsiPassThruProtocolGuid, - EFI_NATIVE_INTERFACE, - &Private->IScsiExtScsiPassThru - ); - if (EFI_ERROR (Status)) { - gBS->CloseEvent (Private->ExitBootServiceEvent); - FreePool (Private); - - return NULL; - } - - IScsiSessionInit (&Private->Session, FALSE); - - return Private; -} - -/** - Clean the iSCSI driver data. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The clean operation is successful. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiCleanDriverData ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - EFI_STATUS Status; - - Status = EFI_SUCCESS; - - if (Private->DevicePath != NULL) { - Status = gBS->UninstallProtocolInterface ( - Private->ExtScsiPassThruHandle, - &gEfiDevicePathProtocolGuid, - Private->DevicePath - ); - if (EFI_ERROR (Status)) { - goto EXIT; - } - - FreePool (Private->DevicePath); - } - - if (Private->ExtScsiPassThruHandle != NULL) { - Status = gBS->UninstallProtocolInterface ( - Private->ExtScsiPassThruHandle, - &gEfiExtScsiPassThruProtocolGuid, - &Private->IScsiExtScsiPassThru - ); - } - -EXIT: - if (Private->ExitBootServiceEvent != NULL) { - gBS->CloseEvent (Private->ExitBootServiceEvent); - } - - FreePool (Private); - return Status; -} - -/** - Check wheather the Controller is configured to use DHCP protocol. - - @param[in] Controller The handle of the controller. - - @retval TRUE The handle of the controller need the Dhcp protocol. - @retval FALSE The handle of the controller does not need the Dhcp protocol. - -**/ -BOOLEAN -IScsiDhcpIsConfigured ( - IN EFI_HANDLE Controller - ) -{ - EFI_STATUS Status; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 MacString[70]; - ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp; - - // - // Get the mac string, it's the name of various variable - // - Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize); - if (EFI_ERROR (Status)) { - return FALSE; - } - VlanId = NetLibGetVlanId (Controller); - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString); - - // - // Get the normal configuration. - // - Status = GetVariable2 ( - MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - (VOID**)&ConfigDataTmp, - NULL - ); - if (ConfigDataTmp == NULL || EFI_ERROR (Status)) { - return FALSE; - } - - if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) { - FreePool (ConfigDataTmp); - return TRUE; - } - - FreePool (ConfigDataTmp); - return FALSE; -} - -/** - Get the various configuration data of this iSCSI instance. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The configuration of this instance is got. - @retval EFI_ABORTED The operation was aborted. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiGetConfigData ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - UINTN BufferSize; - EFI_MAC_ADDRESS MacAddress; - UINTN HwAddressSize; - UINT16 VlanId; - CHAR16 MacString[70]; - - // - // get the iSCSI Initiator Name - // - Session = &Private->Session; - Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE; - Status = gIScsiInitiatorName.Get ( - &gIScsiInitiatorName, - &Session->InitiatorNameLength, - Session->InitiatorName - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Get the mac string, it's the name of various variable - // - Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize); - ASSERT (Status == EFI_SUCCESS); - VlanId = NetLibGetVlanId (Private->Controller); - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString); - - // - // Get the normal configuration. - // - BufferSize = sizeof (Session->ConfigData.NvData); - Status = gRT->GetVariable ( - MacString, - &gEfiIScsiInitiatorNameProtocolGuid, - NULL, - &BufferSize, - &Session->ConfigData.NvData - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (!Session->ConfigData.NvData.Enabled) { - return EFI_ABORTED; - } - // - // Get the CHAP Auth information. - // - BufferSize = sizeof (Session->AuthData.AuthConfig); - Status = gRT->GetVariable ( - MacString, - &gIScsiCHAPAuthInfoGuid, - NULL, - &BufferSize, - &Session->AuthData.AuthConfig - ); - - if (!EFI_ERROR (Status) && Session->ConfigData.NvData.InitiatorInfoFromDhcp) { - // - // Start dhcp. - // - Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session->ConfigData); - } - - return Status; -} - -/** - Get the device path of the iSCSI tcp connection and update it. - - @param[in] Private The iSCSI driver data. - - @return The updated device path. - @retval NULL Other errors as indicated. -**/ -EFI_DEVICE_PATH_PROTOCOL * -IScsiGetTcpConnDevicePath ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - ISCSI_SESSION *Session; - ISCSI_CONNECTION *Conn; - TCP4_IO *Tcp4Io; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_STATUS Status; - EFI_DEV_PATH *DPathNode; - - Session = &Private->Session; - if (Session->State != SESSION_STATE_LOGGED_IN) { - return NULL; - } - - Conn = NET_LIST_USER_STRUCT_S ( - Session->Conns.ForwardLink, - ISCSI_CONNECTION, - Link, - ISCSI_CONNECTION_SIGNATURE - ); - Tcp4Io = &Conn->Tcp4Io; - - Status = gBS->HandleProtocol ( - Tcp4Io->Handle, - &gEfiDevicePathProtocolGuid, - (VOID **)&DevicePath - ); - if (EFI_ERROR (Status)) { - return NULL; - } - // - // Duplicate it. - // - DevicePath = DuplicateDevicePath (DevicePath); - if (DevicePath == NULL) { - return NULL; - } - - DPathNode = (EFI_DEV_PATH *) DevicePath; - - while (!IsDevicePathEnd (&DPathNode->DevPath)) { - if ((DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH) && - (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP) - ) { - - DPathNode->Ipv4.LocalPort = 0; - DPathNode->Ipv4.StaticIpAddress = - (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp); - - // - // Add a judgement here to support previous versions of IPv4_DEVICE_PATH. - // In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and SubnetMask - // do not exist. - // In new version of IPv4_DEVICE_PATH, structcure length is 27. - // - if (DevicePathNodeLength (&DPathNode->Ipv4) == IP4_NODE_LEN_NEW_VERSIONS) { - - IP4_COPY_ADDRESS ( - &DPathNode->Ipv4.GatewayIpAddress, - &Session->ConfigData.NvData.Gateway - ); - - IP4_COPY_ADDRESS ( - &DPathNode->Ipv4.SubnetMask, - &Session->ConfigData.NvData.SubnetMask - ); - } - - break; - } - - DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath); - } - - return DevicePath; -} - -/** - Abort the session when the transition from BS to RT is initiated. - - @param[in] Event The event signaled. - @param[in] Context The iSCSI driver data. -**/ -VOID -EFIAPI -IScsiOnExitBootService ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - ISCSI_DRIVER_DATA *Private; - - Private = (ISCSI_DRIVER_DATA *) Context; - - gBS->CloseEvent (Private->ExitBootServiceEvent); - Private->ExitBootServiceEvent = NULL; - - IScsiSessionAbort (&Private->Session); -} - -/** - Tests whether a controller handle is being managed by IScsi driver. - - This function tests whether the driver specified by DriverBindingHandle is - currently managing the controller specified by ControllerHandle. This test - is performed by evaluating if the the protocol specified by ProtocolGuid is - present on ControllerHandle and is was opened by DriverBindingHandle and Nic - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. - If ProtocolGuid is NULL, then ASSERT(). - - @param ControllerHandle A handle for a controller to test. - @param DriverBindingHandle Specifies the driver binding handle for the - driver. - @param ProtocolGuid Specifies the protocol that the driver specified - by DriverBindingHandle opens in its Start() - function. - - @retval EFI_SUCCESS ControllerHandle is managed by the driver - specified by DriverBindingHandle. - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver - specified by DriverBindingHandle. - -**/ -EFI_STATUS -EFIAPI -IScsiTestManagedDevice ( - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE DriverBindingHandle, - IN EFI_GUID *ProtocolGuid - ) -{ - EFI_STATUS Status; - VOID *ManagedInterface; - EFI_HANDLE NicControllerHandle; - - ASSERT (ProtocolGuid != NULL); - - NicControllerHandle = NetLibGetNicHandle (ControllerHandle, ProtocolGuid); - if (NicControllerHandle == NULL) { - return EFI_UNSUPPORTED; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - (EFI_GUID *) ProtocolGuid, - &ManagedInterface, - DriverBindingHandle, - NicControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (!EFI_ERROR (Status)) { - gBS->CloseProtocol ( - ControllerHandle, - (EFI_GUID *) ProtocolGuid, - DriverBindingHandle, - NicControllerHandle - ); - return EFI_UNSUPPORTED; - } - - if (Status != EFI_ALREADY_STARTED) { - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c deleted file mode 100644 index b4a5c2d02413..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c +++ /dev/null @@ -1,2799 +0,0 @@ -/** @file - The implementation of iSCSI protocol based on RFC3720. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -UINT32 mDataSegPad = 0; - -/** - Attach the iSCSI connection to the iSCSI session. - - @param[in, out] Session The iSCSI session. - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiAttatchConnection ( - IN OUT ISCSI_SESSION *Session, - IN OUT ISCSI_CONNECTION *Conn - ) -{ - InsertTailList (&Session->Conns, &Conn->Link); - Conn->Session = Session; - Session->NumConns++; -} - -/** - Detach the iSCSI connection from the session it belongs to. - - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiDetatchConnection ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - RemoveEntryList (&Conn->Link); - Conn->Session->NumConns--; - Conn->Session = NULL; -} - -/** - Check the sequence number according to RFC3720. - - @param[in, out] ExpSN The currently expected sequence number. - @param[in] NewSN The sequence number to check. - - @retval EFI_SUCCESS The check passed and the ExpSN is increased. - @retval EFI_NOT_READY Response was sent due to a retransmission request. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. -**/ -EFI_STATUS -IScsiCheckSN ( - IN OUT UINT32 *ExpSN, - IN UINT32 NewSN - ) -{ - if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) { - if (ISCSI_SEQ_LT (NewSN, *ExpSN)) { - // - // Duplicate - // - return EFI_NOT_READY; - } else { - return EFI_PROTOCOL_ERROR; - } - } else { - // - // Advance the ExpSN - // - (*ExpSN)++; - return EFI_SUCCESS; - } -} - -/** - Update the sequence numbers for the iSCSI command. - - @param[in, out] Session The iSCSI session. - @param[in] MaxCmdSN Maximum CmdSN from the target. - @param[in] ExpCmdSN Next expected CmdSN from the target. -**/ -VOID -IScsiUpdateCmdSN ( - IN OUT ISCSI_SESSION *Session, - IN UINT32 MaxCmdSN, - IN UINT32 ExpCmdSN - ) -{ - if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) { - return ; - } - - if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) { - Session->MaxCmdSN = MaxCmdSN; - } - - if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) { - Session->ExpCmdSN = ExpCmdSN; - } -} - -/** - This function does the iSCSI connection login. - - @param[in, out] Conn The iSCSI connection to login. - - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target. - @retval EFI_TIMEOUT Timeout happened during the login procedure. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConnLogin ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - - // - // Start the timer, wait 16 seconds to establish the TCP connection. - // - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 * TICKS_PER_SECOND); - if (EFI_ERROR (Status)) { - return Status; - } - // - // try to establish the tcp connection - // - Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent); - if (EFI_ERROR (Status)) { - return Status; - } - - gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0); - Conn->State = CONN_STATE_IN_LOGIN; - - // - // connection is established, start the iSCSI Login - // - do { - Status = IScsiSendLoginReq (Conn); - if (EFI_ERROR (Status)) { - break; - } - - Status = IScsiReceiveLoginRsp (Conn); - if (EFI_ERROR (Status)) { - break; - } - } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE); - - return Status; -} - -/** - Reset the iSCSI connection. - - @param[in, out] Conn The iSCSI connection to reset. -**/ -VOID -IScsiConnReset ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - Tcp4IoReset (&Conn->Tcp4Io); -} - -/** - Create a TCP connection for the iSCSI session. - - @param[in] Private The iSCSI driver data. - @param[in] Session Maximum CmdSN from the target. - - @return The newly created iSCSI connection. -**/ -ISCSI_CONNECTION * -IScsiCreateConnection ( - IN ISCSI_DRIVER_DATA *Private, - IN ISCSI_SESSION *Session - ) -{ - ISCSI_CONNECTION *Conn; - TCP4_IO_CONFIG_DATA Tcp4IoConfig; - EFI_STATUS Status; - - Conn = AllocatePool (sizeof (ISCSI_CONNECTION)); - if (Conn == NULL) { - return NULL; - } - - Conn->Signature = ISCSI_CONNECTION_SIGNATURE; - Conn->State = CONN_STATE_FREE; - Conn->CurrentStage = ISCSI_SECURITY_NEGOTIATION; - Conn->NextStage = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION; - Conn->CHAPStep = ISCSI_CHAP_INITIAL; - Conn->ExpStatSN = 0; - Conn->PartialReqSent = FALSE; - Conn->PartialRspRcvd = FALSE; - Conn->Cid = Session->NextCid++; - - Status = gBS->CreateEvent ( - EVT_TIMER, - TPL_CALLBACK, - NULL, - NULL, - &Conn->TimeoutEvent - ); - if (EFI_ERROR (Status)) { - FreePool (Conn); - return NULL; - } - - NetbufQueInit (&Conn->RspQue); - - // - // set the default connection-only parameters - // - Conn->MaxRecvDataSegmentLength = DEFAULT_MAX_RECV_DATA_SEG_LEN; - Conn->HeaderDigest = IScsiDigestNone; - Conn->DataDigest = IScsiDigestNone; - - CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Tcp4IoConfig.SubnetMask, &Session->ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Tcp4IoConfig.Gateway, &Session->ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Tcp4IoConfig.RemoteIp, &Session->ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS)); - - Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort; - - // - // Create the tcp4 IO for this connection - // - Status = Tcp4IoCreateSocket ( - Private->Image, - Private->Controller, - &Tcp4IoConfig, - &Conn->Tcp4Io - ); - if (EFI_ERROR (Status)) { - gBS->CloseEvent (Conn->TimeoutEvent); - FreePool (Conn); - Conn = NULL; - } - - return Conn; -} - -/** - Destroy an iSCSI connection. - - @param[in] Conn The connection to destroy. -**/ -VOID -IScsiDestroyConnection ( - IN ISCSI_CONNECTION *Conn - ) -{ - Tcp4IoDestroySocket (&Conn->Tcp4Io); - NetbufQueFlush (&Conn->RspQue); - gBS->CloseEvent (Conn->TimeoutEvent); - FreePool (Conn); -} - -/** - Login the iSCSI session. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The iSCSI session login procedure finished. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiSessionLogin ( - IN ISCSI_DRIVER_DATA *Private - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_CONNECTION *Conn; - EFI_TCP4_PROTOCOL *Tcp4; - EFI_STATUS MediaStatus; - - Session = &Private->Session; - - // - // Check media status before session login - // - MediaStatus = EFI_SUCCESS; - NetLibDetectMediaWaitTimeout (Private->Controller, ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus); - if (MediaStatus != EFI_SUCCESS) { - return EFI_NO_MEDIA; - } - - // - // Set session identifier - // - CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6); - - // - // Create a connection for the session. - // - Conn = IScsiCreateConnection (Private, Session); - if (Conn == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - IScsiAttatchConnection (Session, Conn); - - // - // Login througth the newly created connection. - // - Status = IScsiConnLogin (Conn); - if (EFI_ERROR (Status)) { - IScsiConnReset (Conn); - IScsiDetatchConnection (Conn); - IScsiDestroyConnection (Conn); - } else { - Session->State = SESSION_STATE_LOGGED_IN; - - gBS->OpenProtocol ( - Conn->Tcp4Io.Handle, - &gEfiTcp4ProtocolGuid, - (VOID **)&Tcp4, - Private->Image, - Private->ExtScsiPassThruHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - } - - return Status; -} - -/** - Build and send the iSCSI login request to the iSCSI target according to - the current login stage. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this - connection. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_DEVICE_ERROR Some kind of device error happened. -**/ -EFI_STATUS -IScsiSendLoginReq ( - IN ISCSI_CONNECTION *Conn - ) -{ - NET_BUF *Pdu; - EFI_STATUS Status; - - // - // build the Login Request PDU - // - Pdu = IScsiPrepareLoginReq (Conn); - if (Pdu == NULL) { - return EFI_DEVICE_ERROR; - } - // - // Send it to the iSCSI target. - // - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); - - NetbufFree (Pdu); - - return Status; -} - -/** - Receive and process the iSCSI login response. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login response PDU is received and processed. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceiveLoginRsp ( - IN ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - NET_BUF *Pdu; - - Pdu = NULL; - - // - // Receive the iSCSI login response. - // - Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL); - if (EFI_ERROR (Status)) { - return Status; - } - // - // A Login Response is received, process it. - // - ASSERT (Pdu != NULL); - Status = IScsiProcessLoginRsp (Conn, Pdu); - - NetbufFree (Pdu); - - return Status; -} - -/** - Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU. - The DataSegmentLength and the actual size of the net buffer containing this PDU will be - updated. - - @param[in, out] Pdu The iSCSI PDU whose data segment the key-value pair will - be added to. - @param[in] Key The key name string. - @param[in] Value The value string. - - @retval EFI_SUCCESS The key-valu pair is added to the PDU's datasegment and - the correspondence length fields are updated. - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value - pair. -**/ -EFI_STATUS -IScsiAddKeyValuePair ( - IN OUT NET_BUF *Pdu, - IN CHAR8 *Key, - IN CHAR8 *Value - ) -{ - UINT32 DataSegLen; - UINT32 KeyLen; - UINT32 ValueLen; - UINT32 TotalLen; - ISCSI_LOGIN_REQUEST *LoginReq; - CHAR8 *Data; - - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL); - if (LoginReq == NULL) { - return EFI_PROTOCOL_ERROR; - } - DataSegLen = NTOH24 (LoginReq->DataSegmentLength); - - KeyLen = (UINT32) AsciiStrLen (Key); - ValueLen = (UINT32) AsciiStrLen (Value); - - // - // 1 byte for the key value separator '=' and 1 byte for the null - // delimiter after the value. - // - TotalLen = KeyLen + 1 + ValueLen + 1; - - // - // Allocate the space for the key-value pair. - // - Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - // - // Add the key. - // - CopyMem (Data, Key, KeyLen); - Data += KeyLen; - - *Data = '='; - Data++; - - // - // Add the value. - // - CopyMem (Data, Value, ValueLen); - Data += ValueLen; - - *Data = '\0'; - - // - // update the DataSegmentLength - // - ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen); - - return EFI_SUCCESS; -} - -/** - Prepare the iSCSI login request to be sent according to the current login status. - - @param[in, out] Conn The connection in the iSCSI login phase. - - @return The pointer to the net buffer containing the iSCSI login request built. - @retval Others Other errors as indicated. -**/ -NET_BUF * -IScsiPrepareLoginReq ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - ISCSI_SESSION *Session; - NET_BUF *Nbuf; - ISCSI_LOGIN_REQUEST *LoginReq; - EFI_STATUS Status; - - Session = Conn->Session; - - Nbuf = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) + DEFAULT_MAX_RECV_DATA_SEG_LEN); - if (Nbuf == NULL) { - return NULL; - } - - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL); - ASSERT (LoginReq != NULL); - ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST)); - - // - // Init the login request pdu - // - ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ, ISCSI_REQ_IMMEDIATE); - ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage); - LoginReq->VersionMax = ISCSI_VERSION_MAX; - LoginReq->VersionMin = ISCSI_VERSION_MIN; - LoginReq->Tsih = HTONS (Session->Tsih); - LoginReq->InitiatorTaskTag = HTONL (Session->InitiatorTaskTag); - LoginReq->Cid = HTONS (Conn->Cid); - LoginReq->CmdSN = HTONL (Session->CmdSN); - - // - // For the first Login Request on a coonection this is ExpStatSN for the - // old connection and this field is only valid if the Login Request restarts - // a connection. - // For subsequent Login Requests it is used to acknowledge the Login Responses - // with their increasing StatSN values. - // - LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN); - CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid)); - - if (Conn->PartialRspRcvd) { - // - // A partial response, initiator must send an empty Login Request. - // - return Nbuf; - } - - switch (Conn->CurrentStage) { - case ISCSI_SECURITY_NEGOTIATION: - Status = IScsiCHAPToSendReq (Conn, Nbuf); - break; - - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: - Status = IScsiFillOpParams (Conn, Nbuf); - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - break; - - default: - // - // something error happens... - // - Status = EFI_DEVICE_ERROR; - break; - } - - if (EFI_ERROR (Status)) { - NetbufFree (Nbuf); - Nbuf = NULL; - } else { - // - // Pad the data segment if needed. - // - IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq)); - // - // Check whether we will issue the stage transition signal? - // - Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT); - } - - return Nbuf; -} - -/** - Process the iSCSI Login Response. - - @param[in, out] Conn The connection on which the iSCSI login response is received. - @param[in, out] Pdu The iSCSI login response PDU. - - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all check are passed. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_MEDIA_CHANGED Target is redirected. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiProcessLoginRsp ( - IN OUT ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ) -{ - EFI_STATUS Status; - ISCSI_SESSION *Session; - ISCSI_LOGIN_RESPONSE *LoginRsp; - BOOLEAN Transit; - BOOLEAN Continue; - UINT8 CurrentStage; - UINT8 NextStage; - UINT8 *DataSeg; - UINT32 DataSegLen; - - Session = Conn->Session; - - LoginRsp = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL); - if (LoginRsp == NULL) { - return EFI_PROTOCOL_ERROR; - } - if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) { - // - // It's not a Login Response - // - return EFI_PROTOCOL_ERROR; - } - // - // Get the data segment if any. - // - DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp); - if (DataSegLen != 0) { - DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL); - } else { - DataSeg = NULL; - } - // - // Check the status class in the login response PDU. - // - switch (LoginRsp->StatusClass) { - case ISCSI_LOGIN_STATUS_SUCCESS: - // - // Just break here, the response and the data segment will be processed later. - // - break; - - case ISCSI_LOGIN_STATUS_REDIRECTION: - // - // The target may be moved to a different address - // - if (DataSeg == NULL) { - return EFI_PROTOCOL_ERROR; - } - // - // Process the TargetAddress key-value strings in the data segment to update the - // target address info. - // - Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg, DataSegLen); - if (EFI_ERROR (Status)) { - return Status; - } - // - // Session will be restarted on this error status because the Target is - // redirected by this Login Response. - // - return EFI_MEDIA_CHANGED; - - default: - // - // Initiator Error, Target Error, or any other undefined error code. - // - return EFI_PROTOCOL_ERROR; - } - // - // The status is sucess, extract the wanted fields from the header segment. - // - Transit = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT); - Continue = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE); - - CurrentStage = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp); - NextStage = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp); - - LoginRsp->InitiatorTaskTag = NTOHL (LoginRsp->InitiatorTaskTag); - - if ((Transit && Continue) || - (CurrentStage != Conn->CurrentStage) || - (!Conn->TransitInitiated && Transit) || - (Transit && (NextStage != Conn->NextStage)) || - (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) != 0) || - (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag) - ) { - // - // A Login Response with the C bit set to 1 MUST have the T bit set to 0; - // The CSG in the Login Response MUST be the same with the I-end of this connection; - // The T bit can't be 1 if the last Login Response sent by the initiator doesn't - // initiate the transistion; - // The NSG MUST be the same with the I-end of this connection if Transit is required. - // The ISID in the Login Response MUST be the same with this session. - // - return EFI_PROTOCOL_ERROR; - } - - LoginRsp->StatSN = NTOHL (LoginRsp->StatSN); - LoginRsp->ExpCmdSN = NTOHL (LoginRsp->ExpCmdSN); - LoginRsp->MaxCmdSN = NTOHL (LoginRsp->MaxCmdSN); - - if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn->CHAPStep == ISCSI_CHAP_INITIAL)) { - // - // If the Login Request is a leading Login Request, the target MUST use - // the value presented in CmdSN as the target value for ExpCmdSN. - // - if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN != LoginRsp->ExpCmdSN)) { - return EFI_PROTOCOL_ERROR; - } - - // - // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN - // and ExpCmdSN. - // - Conn->ExpStatSN = LoginRsp->StatSN + 1; - Session->MaxCmdSN = LoginRsp->MaxCmdSN; - Session->ExpCmdSN = LoginRsp->ExpCmdSN; - } else { - // - // Check the StatSN of this PDU - // - Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN); - if (!EFI_ERROR (Status)) { - // - // Update the MaxCmdSN and ExpCmdSN - // - IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp->ExpCmdSN); - } else { - return Status; - } - } - // - // Trim off the header segment. - // - NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD); - - // - // Queue this login response first in case it's a partial response so that - // later when the full response list is received we can combine these scattered - // responses' data segment and then process it. - // - NET_GET_REF (Pdu); - NetbufQueAppend (&Conn->RspQue, Pdu); - - Conn->PartialRspRcvd = Continue; - if (Continue) { - // - // It's a partial response, have to wait for another or more Request/Response - // conversations to get the full response. - // - return EFI_SUCCESS; - } - - switch (CurrentStage) { - case ISCSI_SECURITY_NEGOTIATION: - // - // In security negotiation stage, let CHAP module handle it. - // - Status = IScsiCHAPOnRspReceived (Conn); - break; - - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION: - // - // Response received with negotiation resonse on iSCSI parameters, check them. - // - Status = IScsiCheckOpParams (Conn); - break; - - default: - // - // Should never get here. - // - Status = EFI_PROTOCOL_ERROR; - break; - } - - if (Transit && (Status == EFI_SUCCESS)) { - // - // Do the state transition. - // - Conn->CurrentStage = Conn->NextStage; - - if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) { - Conn->NextStage = ISCSI_FULL_FEATURE_PHASE; - } else { - // - // CurrentStage is iSCSI Full Feature, it's the Login-Final Response, - // get the TSIH from the Login Response. - // - Session->Tsih = NTOHS (LoginRsp->Tsih); - } - } - // - // Flush the response(s) received. - // - NetbufQueFlush (&Conn->RspQue); - - return Status; -} - -/** - Updated the target information according the data received in the iSCSI - login response with an target redirection status. - - @param[in, out] Session The iSCSI session. - @param[in] Data The data segment which should contain the - TargetAddress key-value list. - @param[in] Len Length of the data. - - @retval EFI_SUCCESS The target address is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_FOUND The TargetAddress key is not found. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiUpdateTargetAddress ( - IN OUT ISCSI_SESSION *Session, - IN CHAR8 *Data, - IN UINT32 Len - ) -{ - LIST_ENTRY *KeyValueList; - CHAR8 *TargetAddress; - CHAR8 *IpStr; - EFI_STATUS Status; - UINTN Number; - - KeyValueList = IScsiBuildKeyValueList (Data, Len); - if (KeyValueList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = EFI_NOT_FOUND; - - while (TRUE) { - TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ADDRESS); - if (TargetAddress == NULL) { - break; - } - - if (!NET_IS_DIGIT (TargetAddress[0])) { - // - // The domainname of the target may be presented in three formats: a DNS host name, - // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only accept dotted - // IPv4 address. - // - continue; - } - - IpStr = TargetAddress; - - while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) { - // - // NULL, ':' or ',' ends the IPv4 string. - // - TargetAddress++; - } - - if (*TargetAddress == ',') { - // - // Comma and the portal group tag MUST be ommitted if the TargetAddress is sent - // as the result of a redirection. - // - continue; - } else if (*TargetAddress == ':') { - *TargetAddress = '\0'; - - TargetAddress++; - - Number = AsciiStrDecimalToUintn (TargetAddress); - if (Number > 0xFFFF) { - continue; - } else { - Session->ConfigData.NvData.TargetPort = (UINT16) Number; - } - } else { - // - // The string only contains the IPv4 address. Use the well known port. - // - Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT; - } - // - // Update the target IP address. - // - Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp); - if (EFI_ERROR (Status)) { - continue; - } else { - break; - } - } - - IScsiFreeKeyValueList (KeyValueList); - - return Status; -} - -/** - The callback function to free the net buffer list. - - @param[in] Arg The opaque parameter. -**/ -VOID -EFIAPI -IScsiFreeNbufList ( - VOID *Arg - ) -{ - ASSERT (Arg != NULL); - - NetbufFreeList ((LIST_ENTRY *) Arg); - FreePool (Arg); -} - -/** - The callback function called in NetBufFree, it does nothing. - - @param[in] Arg The opaque parameter. -**/ -VOID -EFIAPI -IScsiNbufExtFree ( - VOID *Arg - ) -{ -} - -/** - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and - an optional data segment. The two parts will be put into two blocks of buffers in the - net buffer. The digest check will be conducted in this function if needed and the digests - will be trimmed from the PDU buffer. - - @param[in] Conn The iSCSI connection to receive data from. - @param[out] Pdu The received iSCSI pdu. - @param[in] Context The context used to describe information on the caller provided - buffer to receive data segment of the iSCSI pdu, it's optional. - @param[in] HeaderDigest Whether there will be header digest received. - @param[in] DataDigest Whether there will be data digest. - @param[in] TimeoutEvent The timeout event, it's optional. - - @retval EFI_SUCCESS An iSCSI pdu is received. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceivePdu ( - IN ISCSI_CONNECTION *Conn, - OUT NET_BUF **Pdu, - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL - IN BOOLEAN HeaderDigest, - IN BOOLEAN DataDigest, - IN EFI_EVENT TimeoutEvent OPTIONAL - ) -{ - LIST_ENTRY *NbufList; - UINT32 Len; - NET_BUF *PduHdr; - UINT8 *Header; - EFI_STATUS Status; - UINT32 PadLen; - UINT32 InDataOffset; - NET_FRAGMENT Fragment[2]; - UINT32 FragmentCount; - NET_BUF *DataSeg; - UINT32 PadAndCRC32[2]; - - NbufList = AllocatePool (sizeof (LIST_ENTRY)); - if (NbufList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - InitializeListHead (NbufList); - - // - // The header digest will be received together with the PDU header if exists. - // - Len = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0); - PduHdr = NetbufAlloc (Len); - if (PduHdr == NULL) { - FreePool (NbufList); - return EFI_OUT_OF_RESOURCES; - } - - Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL); - ASSERT (Header != NULL); - InsertTailList (NbufList, &PduHdr->List); - - // - // First step, receive the BHS of the PDU. - // - Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - if (HeaderDigest) { - // - // TODO: check the header-digest. - // - // - // Trim off the digest. - // - NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL); - } - - Len = ISCSI_GET_DATASEG_LEN (Header); - if (Len == 0) { - // - // No data segment.Form the pdu from a list of pdu segments. - // - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (*Pdu == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - return Status; - } - // - // Get the length of the padding bytes of the data segment. - // - PadLen = ISCSI_GET_PAD_LEN (Len); - - switch (ISCSI_GET_OPCODE (Header)) { - case ISCSI_OPCODE_SCSI_DATA_IN: - // - // Try to use the buffer described by Context if the PDU is an - // iSCSI SCSI data in pdu so as to reduce memory copy overhead. - // - InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header); - if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) { - Status = EFI_PROTOCOL_ERROR; - goto ON_EXIT; - } - - Fragment[0].Len = Len; - Fragment[0].Bulk = Context->InData + InDataOffset; - - if (DataDigest || (PadLen != 0)) { - // - // The data segment is padded, use two fragments to receive it. - // The first to receive the useful data. The second to receive the padding. - // - Fragment[1].Len = PadLen + (DataDigest ? sizeof (UINT32) : 0); - Fragment[1].Bulk = (UINT8 *)PadAndCRC32 + (4 - PadLen); - FragmentCount = 2; - } else { - FragmentCount = 1; - } - - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL); - if (DataSeg == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - break; - - case ISCSI_OPCODE_SCSI_RSP: - case ISCSI_OPCODE_NOP_IN: - case ISCSI_OPCODE_LOGIN_RSP: - case ISCSI_OPCODE_TEXT_RSP: - case ISCSI_OPCODE_ASYNC_MSG: - case ISCSI_OPCODE_REJECT: - case ISCSI_OPCODE_VENDOR_T0: - case ISCSI_OPCODE_VENDOR_T1: - case ISCSI_OPCODE_VENDOR_T2: - // - // Allocate buffer to receive the data segment. - // - Len += PadLen + (DataDigest ? sizeof (UINT32) : 0); - DataSeg = NetbufAlloc (Len); - if (DataSeg == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL); - break; - - default: - Status = EFI_PROTOCOL_ERROR; - goto ON_EXIT; - } - - InsertTailList (NbufList, &DataSeg->List); - - // - // Receive the data segment with the data digest if any. - // - Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - if (DataDigest) { - // - // TODO: Check the data digest. - // - NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL); - } - - if (PadLen != 0) { - // - // Trim off the padding bytes in the data segment. - // - NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL); - } - - // - // Form the pdu from a list of pdu segments. - // - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (*Pdu == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } - -ON_EXIT: - - if (EFI_ERROR (Status)) { - // - // Free the Nbufs in this NbufList and the NbufList itself. - // - IScsiFreeNbufList (NbufList); - } - - return Status; -} - -/** - Check and get the result of the prameter negotiation. - - @param[in, out] Conn The connection in iSCSI login. - - @retval EFI_SUCCESS The parmeter check is passed and negotiation is finished. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiCheckOpParams ( - IN OUT ISCSI_CONNECTION *Conn - ) -{ - EFI_STATUS Status; - LIST_ENTRY *KeyValueList; - CHAR8 *Data; - UINT32 Len; - ISCSI_SESSION *Session; - CHAR8 *Value; - UINTN NumericValue; - - ASSERT (Conn->RspQue.BufNum != 0); - - Session = Conn->Session; - - Len = Conn->RspQue.BufSize; - Data = AllocatePool (Len); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data); - - Status = EFI_PROTOCOL_ERROR; - - // - // Extract the Key-Value pairs into a list. - // - KeyValueList = IScsiBuildKeyValueList (Data, Len); - if (KeyValueList == NULL) { - FreePool (Data); - return Status; - } - // - // HeaderDigest - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_HEADER_DIGEST); - if (Value == NULL) { - goto ON_ERROR; - } - - if (AsciiStrCmp (Value, "CRC32") == 0) { - if (Conn->HeaderDigest != IScsiDigestCRC32) { - goto ON_ERROR; - } - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { - Conn->HeaderDigest = IScsiDigestNone; - } else { - goto ON_ERROR; - } - // - // DataDigest - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_DIGEST); - if (Value == NULL) { - goto ON_ERROR; - } - - if (AsciiStrCmp (Value, "CRC32") == 0) { - if (Conn->DataDigest != IScsiDigestCRC32) { - goto ON_ERROR; - } - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) { - Conn->DataDigest = IScsiDigestNone; - } else { - goto ON_ERROR; - } - // - // ErrorRecoveryLevel, result fuction is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_ERROR_RECOVERY_LEVEL); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if (NumericValue > 2) { - goto ON_ERROR; - } - - Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel, NumericValue); - - // - // InitialR2T, result function is OR. - // - if (!Session->InitialR2T) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); - } - - // - // ImmediateData, result function is AND. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_IMMEDIATE_DATA); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0)); - - // - // MaxRecvDataSegmentLength is declarative. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH); - if (Value != NULL) { - Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn (Value); - } - // - // MaxBurstLength, result funtion is Mininum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_BURST_LENGTH); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength, NumericValue); - - // - // FirstBurstLength, result function is Minimum. Irrelevant when InitialR2T=Yes and - // ImmediateData=No. - // This Key/Value is negotiation type. - // - if (!(Session->InitialR2T && !Session->ImmediateData)) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, NumericValue); - } - - // - // MaxConnections, result function is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_CONNECTIONS); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if ((NumericValue == 0) || (NumericValue > 65535)) { - goto ON_ERROR; - } - - Session->MaxConnections = (UINT32) MIN (Session->MaxConnections, NumericValue); - - // - // DataPDUInOrder, result function is OR. - // - if (!Session->DataPDUInOrder) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); - } - - // - // DataSequenceInorder, result function is OR. - // - if (!Session->DataSequenceInOrder) { - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); - if (Value == NULL) { - goto ON_ERROR; - } - - Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0); - } - - // - // DefaultTime2Wait, result function is Maximum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2WAIT); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if (NumericValue == 0) { - Session->DefaultTime2Wait = 0; - } else if (NumericValue > 3600) { - goto ON_ERROR; - } else { - Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait, NumericValue); - } - // - // DefaultTime2Retain, result function is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2RETAIN); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if (NumericValue == 0) { - Session->DefaultTime2Retain = 0; - } else if (NumericValue > 3600) { - goto ON_ERROR; - } else { - Session->DefaultTime2Retain = (UINT32) MIN (Session->DefaultTime2Retain, NumericValue); - } - // - // MaxOutstandingR2T, result function is Minimum. - // - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_OUTSTANDING_R2T); - if (Value == NULL) { - goto ON_ERROR; - } - - NumericValue = AsciiStrDecimalToUintn (Value); - if ((NumericValue == 0) || (NumericValue > 65535)) { - goto ON_ERROR; - } - - Session->MaxOutstandingR2T = (UINT16) MIN (Session->MaxOutstandingR2T, NumericValue); - - // - // Remove declarative key-value pairs, if any. - // - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG); - // - // Remove the key-value that may not needed for result function is OR. - // - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER); - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER); - - // - // Remove irrelevant parameter, if any. - // - if (Session->InitialR2T && !Session->ImmediateData) { - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH); - } - - if (IsListEmpty (KeyValueList)) { - // - // Succeed if no more keys in the list. - // - Status = EFI_SUCCESS; - } - -ON_ERROR: - - IScsiFreeKeyValueList (KeyValueList); - - FreePool (Data); - - return Status; -} - -/** - Fill the oprational prameters. - - @param[in] Conn The connection in iSCSI login. - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters. - - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request PDU. -**/ -EFI_STATUS -IScsiFillOpParams ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ) -{ - ISCSI_SESSION *Session; - CHAR8 Value[256]; - - Session = Conn->Session; - - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest == IScsiDigestCRC32) ? "None,CRC32" : "None"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest == IScsiDigestCRC32) ? "None,CRC32" : "None"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", MAX_RECV_DATA_SEG_LEN_IN_FFP); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value); - - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ? "Yes" : "No"); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value); - - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value); - - return EFI_SUCCESS; -} - -/** - Pad the iSCSI AHS or data segment to an integer number of 4 byte words. - - @param[in, out] Pdu The iSCSI pdu which contains segments to pad. - @param[in] Len The length of the last semgnet in the PDU. - - @retval EFI_SUCCESS The segment is padded or no need to pad it. - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the - padding bytes. -**/ -EFI_STATUS -IScsiPadSegment ( - IN OUT NET_BUF *Pdu, - IN UINT32 Len - ) -{ - UINT32 PadLen; - UINT8 *Data; - - PadLen = ISCSI_GET_PAD_LEN (Len); - - if (PadLen != 0) { - Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL); - if (Data == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - ZeroMem (Data, PadLen); - } - - return EFI_SUCCESS; -} - -/** - Build a key-value list from the data segment. - - @param[in] Data The data segment containing the key-value pairs. - @param[in] Len Length of the data segment. - - @return The key-value list. - @retval NULL Other errors as indicated. -**/ -LIST_ENTRY * -IScsiBuildKeyValueList ( - IN CHAR8 *Data, - IN UINT32 Len - ) -{ - LIST_ENTRY *ListHead; - ISCSI_KEY_VALUE_PAIR *KeyValuePair; - - ListHead = AllocatePool (sizeof (LIST_ENTRY)); - if (ListHead == NULL) { - return NULL; - } - - InitializeListHead (ListHead); - - while (Len > 0) { - KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR)); - if (KeyValuePair == NULL) { - goto ON_ERROR; - } - - InitializeListHead (&KeyValuePair->List); - - KeyValuePair->Key = Data; - - while ((Len > 0) && (*Data != '=')) { - Len--; - Data++; - } - - if (*Data == '=') { - *Data = '\0'; - - Data++; - Len--; - } else { - FreePool (KeyValuePair); - goto ON_ERROR; - } - - KeyValuePair->Value = Data; - - InsertTailList (ListHead, &KeyValuePair->List);; - - Data += AsciiStrLen (KeyValuePair->Value) + 1; - Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1; - } - - return ListHead; - -ON_ERROR: - - IScsiFreeKeyValueList (ListHead); - - return NULL; -} - -/** - Get the value string by the key name from the key-value list. If found, - the key-value entry will be removed from the list. - - @param[in, out] KeyValueList The key-value list. - @param[in] Key The key name to find. - - @return The value string. -**/ -CHAR8 * -IScsiGetValueByKeyFromList ( - IN OUT LIST_ENTRY *KeyValueList, - IN CHAR8 *Key - ) -{ - LIST_ENTRY *Entry; - ISCSI_KEY_VALUE_PAIR *KeyValuePair; - CHAR8 *Value; - - Value = NULL; - - NET_LIST_FOR_EACH (Entry, KeyValueList) { - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List); - - if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) { - Value = KeyValuePair->Value; - - RemoveEntryList (&KeyValuePair->List); - FreePool (KeyValuePair); - break; - } - } - - return Value; -} - -/** - Free the key-value list. - - @param[in] KeyValueList The key-value list. -**/ -VOID -IScsiFreeKeyValueList ( - IN LIST_ENTRY *KeyValueList - ) -{ - LIST_ENTRY *Entry; - ISCSI_KEY_VALUE_PAIR *KeyValuePair; - - while (!IsListEmpty (KeyValueList)) { - Entry = NetListRemoveHead (KeyValueList); - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List); - - FreePool (KeyValuePair); - } - - FreePool (KeyValueList); -} - -/** - Normalize the iSCSI name according to RFC. - - @param[in, out] Name The iSCSI name. - @param[in] Len length of the iSCSI name. - - @retval EFI_SUCCESS The iSCSI name is valid and normalized. - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format. -**/ -EFI_STATUS -IScsiNormalizeName ( - IN OUT CHAR8 *Name, - IN UINTN Len - ) -{ - UINTN Index; - - for (Index = 0; Index < Len; Index++) { - if (NET_IS_UPPER_CASE_CHAR (Name[Index])) { - // - // Convert the upper-case characters to lower-case ones - // - Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a'); - } - - if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) && - !NET_IS_DIGIT (Name[Index]) && - (Name[Index] != '-') && - (Name[Index] != '.') && - (Name[Index] != ':') - ) { - // - // ASCII dash, dot, colon lower-case characters and digit characters - // are allowed. - // - return EFI_PROTOCOL_ERROR; - } - } - - if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) { - // - // Only IQN format is accepted now. - // - return EFI_PROTOCOL_ERROR; - } - - return EFI_SUCCESS; -} - -/** - Create an iSCSI task control block. - - @param[in] Conn The connection on which the task control block will be created. - @param[out] Tcb The newly created task control block. - - @retval EFI_SUCCESS The task control block is created. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_READY The target can not accept new commands. -**/ -EFI_STATUS -IScsiNewTcb ( - IN ISCSI_CONNECTION *Conn, - OUT ISCSI_TCB **Tcb - ) -{ - ISCSI_SESSION *Session; - ISCSI_TCB *NewTcb; - - ASSERT (Tcb != NULL); - - Session = Conn->Session; - - if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) { - return EFI_NOT_READY; - } - - NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB)); - if (NewTcb == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - InitializeListHead (&NewTcb->Link); - - NewTcb->SoFarInOrder = TRUE; - NewTcb->InitiatorTaskTag = Session->InitiatorTaskTag; - NewTcb->CmdSN = Session->CmdSN; - NewTcb->Conn = Conn; - - InsertTailList (&Session->TcbList, &NewTcb->Link); - - // - // Advance the initiator task tag. - // - Session->InitiatorTaskTag++; - Session->CmdSN++; - - *Tcb = NewTcb; - - return EFI_SUCCESS; -} - -/** - Delete the tcb from the connection and destroy it. - - @param[in] Tcb The tcb to delete. -**/ -VOID -IScsiDelTcb ( - IN ISCSI_TCB *Tcb - ) -{ - RemoveEntryList (&Tcb->Link); - - FreePool (Tcb); -} - - -/** - Create a data segment, pad it and calculate the CRC if needed. - - @param[in] Data The data to fill into the data segment. - @param[in] Len Length of the data. - @param[in] DataDigest Whether to calculate CRC for this data segment. - - @return The net buffer wrapping the data segment. -**/ -NET_BUF * -IScsiNewDataSegment ( - IN UINT8 *Data, - IN UINT32 Len, - IN BOOLEAN DataDigest - ) -{ - NET_FRAGMENT Fragment[2]; - UINT32 FragmentCount; - UINT32 PadLen; - NET_BUF *DataSeg; - - Fragment[0].Len = Len; - Fragment[0].Bulk = Data; - - PadLen = ISCSI_GET_PAD_LEN (Len); - if (PadLen != 0) { - Fragment[1].Len = PadLen; - Fragment[1].Bulk = (UINT8 *) &mDataSegPad; - - FragmentCount = 2; - } else { - FragmentCount = 1; - } - - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL); - - return DataSeg; -} - -/** - Create a iSCSI SCSI command PDU to encapsulate the command issued - by SCSI through the EXT SCSI PASS THRU Protocol. - - @param[in] Packet The EXT SCSI PASS THRU request packet containing the SCSI command. - @param[in] Lun The LUN. - @param[in] Tcb The tcb associated with this SCSI command. - - @return The created iSCSI SCSI command PDU. - @retval NULL Other errors as indicated. -**/ -NET_BUF * -IScsiNewScsiCmdPdu ( - IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, - IN UINT64 Lun, - IN ISCSI_TCB *Tcb - ) -{ - LIST_ENTRY *NbufList; - NET_BUF *Pdu; - NET_BUF *PduHeader; - NET_BUF *DataSeg; - SCSI_COMMAND *ScsiCmd; - UINT8 AHSLength; - UINT32 Length; - ISCSI_ADDITIONAL_HEADER *Header; - ISCSI_BI_EXP_READ_DATA_LEN_AHS *BiExpReadDataLenAHS; - ISCSI_SESSION *Session; - UINT32 ImmediateDataLen; - - AHSLength = 0; - - if (Packet->DataDirection == DataBi) { - // - // Bi directional Read/Write command, the bidirectional expected - // read data length AHS is required. - // - AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS); - } - - if (Packet->CdbLength > 16) { - // - // The CDB exceeds 16 bytes, an extended CDB AHS is required. - // - AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet->CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER))); - } - - Length = sizeof (SCSI_COMMAND) + AHSLength; - PduHeader = NetbufAlloc (Length); - if (PduHeader == NULL) { - return NULL; - } - - ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length, NET_BUF_TAIL); - if (ScsiCmd == NULL) { - NetbufFree (PduHeader); - return NULL; - } - Header = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1); - - ZeroMem (ScsiCmd, Length); - - ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0); - ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE); - - // - // Set the READ/WRITE flags according to the IO type of this request. - // - switch (Packet->DataDirection) { - case DataIn: - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ); - ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength); - break; - - case DataOut: - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE); - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); - break; - - case DataBi: - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ | SCSI_CMD_PDU_FLAG_WRITE); - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength); - - // - // Fill the bidirectional expected read data length AHS. - // - BiExpReadDataLenAHS = (ISCSI_BI_EXP_READ_DATA_LEN_AHS *) Header; - Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1); - - BiExpReadDataLenAHS->Length = NTOHS (5); - BiExpReadDataLenAHS->Type = ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN; - BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet->InTransferLength); - - break; - } - - ScsiCmd->TotalAHSLength = AHSLength; - CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun)); - ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag); - ScsiCmd->CmdSN = NTOHL (Tcb->CmdSN); - ScsiCmd->ExpStatSN = NTOHL (Tcb->Conn->ExpStatSN); - - CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb)); - - if (Packet->CdbLength > 16) { - Header->Length = NTOHS ((UINT16) (Packet->CdbLength - 15)); - Header->Type = ISCSI_AHS_TYPE_EXT_CDB; - - CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength - 16); - } - - Pdu = PduHeader; - Session = Tcb->Conn->Session; - ImmediateDataLen = 0; - - if (Session->ImmediateData && (Packet->OutTransferLength != 0)) { - // - // Send immediate data in this SCSI Command PDU. The length of the immeidate - // data is the minimum of FirstBurstLength, the data length to be xfered and - // the MaxRecvdataSegmentLength on this connection. - // - ImmediateDataLen = MIN (Session->FirstBurstLength, Packet->OutTransferLength); - ImmediateDataLen = MIN (ImmediateDataLen, Tcb->Conn->MaxRecvDataSegmentLength); - - // - // Update the data segment length in the PDU header. - // - ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen); - - // - // Create the data segment. - // - DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer, ImmediateDataLen, FALSE); - if (DataSeg == NULL) { - NetbufFree (PduHeader); - Pdu = NULL; - goto ON_EXIT; - } - - NbufList = AllocatePool (sizeof (LIST_ENTRY)); - if (NbufList == NULL) { - NetbufFree (PduHeader); - NetbufFree (DataSeg); - - Pdu = NULL; - goto ON_EXIT; - } - - InitializeListHead (NbufList); - InsertTailList (NbufList, &PduHeader->List); - InsertTailList (NbufList, &DataSeg->List); - - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (Pdu == NULL) { - IScsiFreeNbufList (NbufList); - } - } - - if (Session->InitialR2T || - (ImmediateDataLen == Session->FirstBurstLength) || - (ImmediateDataLen == Packet->OutTransferLength) - ) { - // - // Unsolicited data out sequence is not allowed, - // or FirstBurstLength data is already sent out by immediate data - // or all the OUT data accompany this SCSI packet is sent as - // immediate data, the final flag should be set on this SCSI Command - // PDU. - // - ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL); - } - -ON_EXIT: - - return Pdu; -} - -/** - Create a new iSCSI SCSI Data Out PDU. - - @param[in] Data The data to put into the Data Out PDU. - @param[in] Len Length of the data. - @param[in] DataSN The DataSN of the Data Out PDU. - @param[in] Tcb The task control block of this Data Out PDU. - @param[in] Lun The LUN. - - @return The net buffer wrapping the Data Out PDU. - @retval NULL Other errors as indicated. -**/ -NET_BUF * -IScsiNewDataOutPdu ( - IN UINT8 *Data, - IN UINT32 Len, - IN UINT32 DataSN, - IN ISCSI_TCB *Tcb, - IN UINT64 Lun - ) -{ - LIST_ENTRY *NbufList; - NET_BUF *PduHdr; - NET_BUF *DataSeg; - NET_BUF *Pdu; - ISCSI_SCSI_DATA_OUT *DataOutHdr; - ISCSI_XFER_CONTEXT *XferContext; - - NbufList = AllocatePool (sizeof (LIST_ENTRY)); - if (NbufList == NULL) { - return NULL; - } - - InitializeListHead (NbufList); - - // - // Allocate memory for the BHS. - // - PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT)); - if (PduHdr == NULL) { - FreePool (NbufList); - return NULL; - } - // - // Insert the BHS into the buffer list. - // - InsertTailList (NbufList, &PduHdr->List); - - DataOutHdr = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr, sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL); - ASSERT (DataOutHdr != NULL); - XferContext = &Tcb->XferContext; - - ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT)); - - // - // Set the flags and fields of the Data Out PDU BHS. - // - ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0); - ISCSI_SET_DATASEG_LEN (DataOutHdr, Len); - - DataOutHdr->InitiatorTaskTag = HTONL (Tcb->InitiatorTaskTag); - DataOutHdr->TargetTransferTag = HTONL (XferContext->TargetTransferTag); - DataOutHdr->ExpStatSN = HTONL (Tcb->Conn->ExpStatSN); - DataOutHdr->DataSN = HTONL (DataSN); - DataOutHdr->BufferOffset = HTONL (XferContext->Offset); - - if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) { - CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun)); - } - // - // Build the data segment for this Data Out PDU. - // - DataSeg = IScsiNewDataSegment (Data, Len, FALSE); - if (DataSeg == NULL) { - IScsiFreeNbufList (NbufList); - return NULL; - } - // - // Put the data segment into the buffer list and combine it with the BHS - // into a full Data Out PDU. - // - InsertTailList (NbufList, &DataSeg->List); - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList); - if (Pdu == NULL) { - IScsiFreeNbufList (NbufList); - } - - return Pdu; -} - -/** - Generate a consecutive sequence of iSCSI SCSI Data Out PDUs. - - @param[in] Data The data which will be carried by the sequence of iSCSI SCSI Data Out PDUs. - @param[in] Tcb The task control block of the data to send out. - @param[in] Lun The LUN the data will be sent to. - - @return A list of net buffers with each of them wraps an iSCSI SCSI Data Out PDU. - @retval NULL Other errors as indicated. -**/ -LIST_ENTRY * -IScsiGenerateDataOutPduSequence ( - IN UINT8 *Data, - IN ISCSI_TCB *Tcb, - IN UINT64 Lun - ) -{ - LIST_ENTRY *PduList; - UINT32 DataSN; - UINT32 DataLen; - NET_BUF *DataOutPdu; - ISCSI_CONNECTION *Conn; - ISCSI_XFER_CONTEXT *XferContext; - UINT8 *DataOutPacket; - - PduList = AllocatePool (sizeof (LIST_ENTRY)); - if (PduList == NULL) { - return NULL; - } - - InitializeListHead (PduList); - - DataSN = 0; - Conn = Tcb->Conn; - DataOutPdu = NULL; - XferContext = &Tcb->XferContext; - - while (XferContext->DesiredLength > 0) { - // - // Determine the length of data this Data Out PDU can carry. - // - DataLen = MIN (XferContext->DesiredLength, Conn->MaxRecvDataSegmentLength); - - // - // Create a Data Out PDU. - // - DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun); - if (DataOutPdu == NULL) { - IScsiFreeNbufList (PduList); - PduList = NULL; - - goto ON_EXIT; - } - - InsertTailList (PduList, &DataOutPdu->List); - - // - // Update the context and DataSN. - // - XferContext->Offset += DataLen; - XferContext->DesiredLength -= DataLen; - DataSN++; - Data += DataLen; - } - // - // Set the F bit for the last data out PDU in this sequence. - // - DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL); - if (DataOutPacket == NULL) { - IScsiFreeNbufList (PduList); - PduList = NULL; - goto ON_EXIT; - } - - ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL); - -ON_EXIT: - - return PduList; -} - -/** - Send the Data in a sequence of Data Out PDUs one by one. - - @param[in] Data The data to carry by Data Out PDUs. - @param[in] Lun The LUN the data will be sent to. - @param[in] Tcb The task control block. - - @retval EFI_SUCCES The data is sent out to the LUN. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiSendDataOutPduSequence ( - IN UINT8 *Data, - IN UINT64 Lun, - IN ISCSI_TCB *Tcb - ) -{ - LIST_ENTRY *DataOutPduList; - LIST_ENTRY *Entry; - NET_BUF *Pdu; - EFI_STATUS Status; - - // - // Generate the Data Out PDU sequence. - // - DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun); - if (DataOutPduList == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = EFI_SUCCESS; - - // - // Send the Data Out PDU's one by one. - // - NET_LIST_FOR_EACH (Entry, DataOutPduList) { - Pdu = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - - Status = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu); - if (EFI_ERROR (Status)) { - break; - } - } - - IScsiFreeNbufList (DataOutPduList); - - return Status; -} - -/** - Process the received iSCSI SCSI Data In PDU. - - @param[in] Pdu The Data In PDU received. - @param[in] Tcb The task control block. - @param[in, out] Packet The EXT SCSI PASS THRU request packet. - - @retval EFI_SUCCES The check on the Data IN PDU is passed and some update - actions are taken. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiOnDataInRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - ISCSI_SCSI_DATA_IN *DataInHdr; - EFI_STATUS Status; - - DataInHdr = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0, NULL); - if (DataInHdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag); - DataInHdr->ExpCmdSN = NTOHL (DataInHdr->ExpCmdSN); - DataInHdr->MaxCmdSN = NTOHL (DataInHdr->MaxCmdSN); - DataInHdr->DataSN = NTOHL (DataInHdr->DataSN); - - // - // Check the DataSN. - // - Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN); - if (EFI_ERROR (Status)) { - return Status; - } - - if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { - return EFI_PROTOCOL_ERROR; - } - // - // Update the command related sequence numbers. - // - IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN, DataInHdr->ExpCmdSN); - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) { - if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) { - // - // The S bit is on but the F bit is off. - // - return EFI_PROTOCOL_ERROR; - } - - Tcb->StatusXferd = TRUE; - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW | SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) { - // - // Underflow and Overflow are mutual flags. - // - return EFI_PROTOCOL_ERROR; - } - // - // S bit is on, the StatSN is valid. - // - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr->StatSN)); - if (EFI_ERROR (Status)) { - return Status; - } - - Packet->HostAdapterStatus = 0; - Packet->TargetStatus = DataInHdr->Status; - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { - Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount); - Status = EFI_BAD_BUFFER_SIZE; - } - - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { - Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount); - } - } - - return Status; -} - -/** - Process the received iSCSI R2T PDU. - - @param[in] Pdu The R2T PDU received. - @param[in] Tcb The task control block. - @param[in] Lun The Lun. - @param[in, out] Packet The EXT SCSI PASS THRU request packet. - - @retval EFI_SUCCES The R2T PDU is valid and the solicited data is sent out. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiOnR2TRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - ISCSI_READY_TO_TRANSFER *R2THdr; - EFI_STATUS Status; - ISCSI_XFER_CONTEXT *XferContext; - UINT8 *Data; - - R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL); - if (R2THdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag); - R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag); - R2THdr->StatSN = NTOHL (R2THdr->StatSN); - R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum); - R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset); - R2THdr->DesiredDataTransferLength = NTOHL (R2THdr->DesiredDataTransferLength); - - if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) { - return EFI_PROTOCOL_ERROR;; - } - // - // Check the sequence number. - // - Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum); - if (EFI_ERROR (Status)) { - return Status; - } - - XferContext = &Tcb->XferContext; - XferContext->TargetTransferTag = R2THdr->TargetTransferTag; - XferContext->Offset = R2THdr->BufferOffset; - XferContext->DesiredLength = R2THdr->DesiredDataTransferLength; - - if (((XferContext->Offset + XferContext->DesiredLength) > Packet->OutTransferLength) || - (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength) - ) { - return EFI_PROTOCOL_ERROR; - } - // - // Send the data solicited by this R2T. - // - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); - - return Status; -} - -/** - Process the received iSCSI SCSI Response PDU. - - @param[in] Pdu The Response PDU received. - @param[in] Tcb The task control block. - @param[in, out] Packet The EXT SCSI PASS THRU request packet. - - @retval EFI_SUCCES The Response PDU is processed. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiOnScsiRspRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - SCSI_RESPONSE *ScsiRspHdr; - ISCSI_SENSE_DATA *SenseData; - EFI_STATUS Status; - UINT32 DataSegLen; - - ScsiRspHdr = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL); - if (ScsiRspHdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - ScsiRspHdr->InitiatorTaskTag = NTOHL (ScsiRspHdr->InitiatorTaskTag); - if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) { - return EFI_PROTOCOL_ERROR; - } - - ScsiRspHdr->StatSN = NTOHL (ScsiRspHdr->StatSN); - - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr->StatSN); - if (EFI_ERROR (Status)) { - return Status; - } - - ScsiRspHdr->MaxCmdSN = NTOHL (ScsiRspHdr->MaxCmdSN); - ScsiRspHdr->ExpCmdSN = NTOHL (ScsiRspHdr->ExpCmdSN); - IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN, ScsiRspHdr->ExpCmdSN); - - Tcb->StatusXferd = TRUE; - - Packet->HostAdapterStatus = ScsiRspHdr->Response; - if (Packet->HostAdapterStatus != ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) { - return EFI_SUCCESS; - } - - Packet->TargetStatus = ScsiRspHdr->Status; - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW | SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) || - ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW | SCSI_RSP_PDU_FLAG_UNDERFLOW) - ) { - return EFI_PROTOCOL_ERROR; - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) { - Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount); - Status = EFI_BAD_BUFFER_SIZE; - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) { - Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount); - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) { - if (Packet->DataDirection == DataIn) { - Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount); - } else { - Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount); - } - - Status = EFI_BAD_BUFFER_SIZE; - } - - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) { - if (Packet->DataDirection == DataIn) { - Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); - } else { - Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount); - } - } - - DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr); - if (DataSegLen != 0) { - SenseData = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof (SCSI_RESPONSE), NULL); - if (SenseData == NULL) { - return EFI_PROTOCOL_ERROR; - } - - SenseData->Length = NTOHS (SenseData->Length); - - Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet->SenseDataLength); - if (Packet->SenseDataLength != 0) { - CopyMem (Packet->SenseData, &SenseData->Data[0], Packet->SenseDataLength); - } - } else { - Packet->SenseDataLength = 0; - } - - return Status; -} - -/** - Process the received NOP In PDU. - - @param[in] Pdu The NOP In PDU received. - @param[in] Tcb The task control block. - - @retval EFI_SUCCES The NOP In PDU is processed and the related sequence - numbers are updated. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened. -**/ -EFI_STATUS -IScsiOnNopInRcvd ( - IN NET_BUF *Pdu, - IN ISCSI_TCB *Tcb - ) -{ - ISCSI_NOP_IN *NopInHdr; - EFI_STATUS Status; - - NopInHdr = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL); - if (NopInHdr == NULL) { - return EFI_PROTOCOL_ERROR; - } - - NopInHdr->StatSN = NTOHL (NopInHdr->StatSN); - NopInHdr->ExpCmdSN = NTOHL (NopInHdr->ExpCmdSN); - NopInHdr->MaxCmdSN = NTOHL (NopInHdr->MaxCmdSN); - - if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) { - if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) { - return EFI_PROTOCOL_ERROR; - } - } else { - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN); - if (EFI_ERROR (Status)) { - return Status; - } - } - - IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN, NopInHdr->ExpCmdSN); - - return EFI_SUCCESS; -} - -/** - Execute the SCSI command issued through the EXT SCSI PASS THRU protocol. - - @param[in] PassThru The EXT SCSI PASS THRU protocol. - @param[in] Target The target ID. - @param[in] Lun The LUN. - @param[in, out] Packet The request packet containing IO request, SCSI command - buffer and buffers to read/write. - - @retval EFI_SUCCES The SCSI command is executed and the result is updated to - the Packet. - @retval EFI_DEVICE_ERROR Session state was not as required. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_READY The target can not accept new commands. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiExecuteScsiCommand ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ) -{ - EFI_STATUS Status; - ISCSI_DRIVER_DATA *Private; - ISCSI_SESSION *Session; - EFI_EVENT TimeoutEvent; - ISCSI_CONNECTION *Conn; - ISCSI_TCB *Tcb; - NET_BUF *Pdu; - ISCSI_XFER_CONTEXT *XferContext; - UINT8 *Data; - ISCSI_IN_BUFFER_CONTEXT InBufferContext; - UINT64 Timeout; - UINT8 *PduHdr; - - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru); - Session = &Private->Session; - Status = EFI_SUCCESS; - Tcb = NULL; - TimeoutEvent = NULL; - Timeout = 0; - - if (Session->State != SESSION_STATE_LOGGED_IN) { - Status = EFI_DEVICE_ERROR; - goto ON_EXIT; - } - - Conn = NET_LIST_USER_STRUCT_S ( - Session->Conns.ForwardLink, - ISCSI_CONNECTION, - Link, - ISCSI_CONNECTION_SIGNATURE - ); - - if (Packet->Timeout != 0) { - Timeout = MultU64x32 (Packet->Timeout, 2); - } - - Status = IScsiNewTcb (Conn, &Tcb); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - // - // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU. - // - Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb); - if (Pdu == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - XferContext = &Tcb->XferContext; - PduHdr = NetbufGetByte (Pdu, 0, NULL); - if (PduHdr == NULL) { - Status = EFI_PROTOCOL_ERROR; - NetbufFree (Pdu); - goto ON_EXIT; - } - XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr); - - // - // Transmit the SCSI Command PDU. - // - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu); - - NetbufFree (Pdu); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - if (!Session->InitialR2T && - (XferContext->Offset < Session->FirstBurstLength) && - (XferContext->Offset < Packet->OutTransferLength) - ) { - // - // Unsolicited Data-Out sequence is allowed, there is remaining SCSI - // OUT data and the limit of FirstBurstLength is not reached. - // - XferContext->TargetTransferTag = ISCSI_RESERVED_TAG; - XferContext->DesiredLength = MIN ( - Session->FirstBurstLength, - Packet->OutTransferLength - XferContext->Offset - ); - - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset; - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - - InBufferContext.InData = (UINT8 *) Packet->InDataBuffer; - InBufferContext.InDataLen = Packet->InTransferLength; - - while (!Tcb->StatusXferd) { - // - // Start the timeout timer. - // - if (Timeout != 0) { - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - TimeoutEvent = Conn->TimeoutEvent; - } - // - // try to receive PDU from target. - // - Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE, TimeoutEvent); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - PduHdr = NetbufGetByte (Pdu, 0, NULL); - if (PduHdr == NULL) { - Status = EFI_PROTOCOL_ERROR; - NetbufFree (Pdu); - goto ON_EXIT; - } - switch (ISCSI_GET_OPCODE (PduHdr)) { - case ISCSI_OPCODE_SCSI_DATA_IN: - Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet); - break; - - case ISCSI_OPCODE_R2T: - Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet); - break; - - case ISCSI_OPCODE_SCSI_RSP: - Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet); - break; - - case ISCSI_OPCODE_NOP_IN: - Status = IScsiOnNopInRcvd (Pdu, Tcb); - break; - - case ISCSI_OPCODE_VENDOR_T0: - case ISCSI_OPCODE_VENDOR_T1: - case ISCSI_OPCODE_VENDOR_T2: - // - // These messages are vendor specific, skip them. - // - break; - - default: - Status = EFI_PROTOCOL_ERROR; - break; - } - - NetbufFree (Pdu); - - if (EFI_ERROR (Status)) { - break; - } - } - -ON_EXIT: - - if (TimeoutEvent != NULL) { - gBS->SetTimer (TimeoutEvent, TimerCancel, 0); - } - - if (Tcb != NULL) { - IScsiDelTcb (Tcb); - } - - return Status; -} - -/** - Reinstate the session on some error. - - @param[in, out] Private The iSCSI driver data. - - @retval EFI_SUCCES The session is reinstated from some error. - @retval Other Reinstatement failed. -**/ -EFI_STATUS -IScsiSessionReinstatement ( - IN OUT ISCSI_DRIVER_DATA *Private - ) -{ - ISCSI_SESSION *Session; - EFI_STATUS Status; - - Session = &Private->Session; - ASSERT (Session->State != SESSION_STATE_FREE); - - // - // Abort the session and re-init it. - // - IScsiSessionAbort (Session); - IScsiSessionInit (Session, TRUE); - - // - // Login again. - // - Status = IScsiSessionLogin (Private); - - return Status; -} - -/** - Initialize some session parameters before login. - - @param[in, out] Session The iSCSI session. - @param[in] Recovery Whether the request is from a fresh new start or recovery. -**/ -VOID -IScsiSessionInit ( - IN OUT ISCSI_SESSION *Session, - IN BOOLEAN Recovery - ) -{ - if (!Recovery) { - Session->Signature = ISCSI_SESSION_SIGNATURE; - Session->State = SESSION_STATE_FREE; - - InitializeListHead (&Session->Conns); - InitializeListHead (&Session->TcbList); - } - - Session->Tsih = 0; - - Session->CmdSN = 1; - Session->InitiatorTaskTag = 1; - Session->NextCid = 1; - - Session->TargetPortalGroupTag = 0; - Session->MaxConnections = ISCSI_MAX_CONNS_PER_SESSION; - Session->InitialR2T = FALSE; - Session->ImmediateData = TRUE; - Session->MaxBurstLength = 262144; - Session->FirstBurstLength = MAX_RECV_DATA_SEG_LEN_IN_FFP; - Session->DefaultTime2Wait = 2; - Session->DefaultTime2Retain = 20; - Session->MaxOutstandingR2T = DEFAULT_MAX_OUTSTANDING_R2T; - Session->DataPDUInOrder = TRUE; - Session->DataSequenceInOrder = TRUE; - Session->ErrorRecoveryLevel = 0; -} - -/** - Abort the iSCSI session, that is, reset all the connection and free the - resources. - - @param[in, out] Session The iSCSI session. - - @retval EFI_SUCCES The session is aborted. -**/ -EFI_STATUS -IScsiSessionAbort ( - IN OUT ISCSI_SESSION *Session - ) -{ - ISCSI_DRIVER_DATA *Private; - ISCSI_CONNECTION *Conn; - - if (Session->State != SESSION_STATE_LOGGED_IN) { - return EFI_SUCCESS; - } - - ASSERT (!IsListEmpty (&Session->Conns)); - - Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session); - - while (!IsListEmpty (&Session->Conns)) { - Conn = NET_LIST_USER_STRUCT_S ( - Session->Conns.ForwardLink, - ISCSI_CONNECTION, - Link, - ISCSI_CONNECTION_SIGNATURE - ); - - gBS->CloseProtocol ( - Conn->Tcp4Io.Handle, - &gEfiTcp4ProtocolGuid, - Private->Image, - Private->ExtScsiPassThruHandle - ); - - IScsiConnReset (Conn); - - IScsiDetatchConnection (Conn); - IScsiDestroyConnection (Conn); - } - - Session->State = SESSION_STATE_FAILED; - - return EFI_SUCCESS; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c deleted file mode 100644 index 901b38e92fc0..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c +++ /dev/null @@ -1,487 +0,0 @@ -/** @file - The wrap of TCP/IP Socket interface. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "IScsiImpl.h" - -/** - The common notify function associated with various Tcp4Io events. - - @param[in] Event The event signaled. - @param[in] Context The context. -**/ -VOID -EFIAPI -Tcp4IoCommonNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - *((BOOLEAN *) Context) = TRUE; -} - -/** - Create a TCP socket with the specified configuration data. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - @param[in] ConfigData The Tcp4 configuration data. - @param[in] Tcp4Io The Tcp4Io. - - @retval EFI_SUCCESS The TCP socket is created and configured. - @retval Others Failed to create the TCP socket or configure it. -**/ -EFI_STATUS -Tcp4IoCreateSocket ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN TCP4_IO_CONFIG_DATA *ConfigData, - IN TCP4_IO *Tcp4Io - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; - EFI_TCP4_OPTION ControlOption; - EFI_TCP4_ACCESS_POINT *AccessPoint; - - Tcp4Io->Handle = NULL; - Tcp4Io->ConnToken.CompletionToken.Event = NULL; - Tcp4Io->TxToken.CompletionToken.Event = NULL; - Tcp4Io->RxToken.CompletionToken.Event = NULL; - Tcp4Io->CloseToken.CompletionToken.Event = NULL; - Tcp4 = NULL; - - // - // Create the TCP4 child instance and get the TCP4 protocol. - // - Status = NetLibCreateServiceChild ( - Controller, - Image, - &gEfiTcp4ServiceBindingProtocolGuid, - &Tcp4Io->Handle - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->OpenProtocol ( - Tcp4Io->Handle, - &gEfiTcp4ProtocolGuid, - (VOID **)&Tcp4Io->Tcp4, - Image, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Tcp4Io->Image = Image; - Tcp4Io->Controller = Controller; - Tcp4 = Tcp4Io->Tcp4; - - // - // Set the configuration parameters. - // - ControlOption.ReceiveBufferSize = 0x200000; - ControlOption.SendBufferSize = 0x200000; - ControlOption.MaxSynBackLog = 0; - ControlOption.ConnectionTimeout = 0; - ControlOption.DataRetries = 6; - ControlOption.FinTimeout = 0; - ControlOption.TimeWaitTimeout = 0; - ControlOption.KeepAliveProbes = 4; - ControlOption.KeepAliveTime = 0; - ControlOption.KeepAliveInterval = 0; - ControlOption.EnableNagle = FALSE; - ControlOption.EnableTimeStamp = FALSE; - ControlOption.EnableWindowScaling = TRUE; - ControlOption.EnableSelectiveAck = FALSE; - ControlOption.EnablePathMtuDiscovery = FALSE; - - Tcp4ConfigData.TypeOfService = 8; - Tcp4ConfigData.TimeToLive = 255; - Tcp4ConfigData.ControlOption = &ControlOption; - - AccessPoint = &Tcp4ConfigData.AccessPoint; - - AccessPoint->UseDefaultAddress = FALSE; - AccessPoint->StationPort = 0; - AccessPoint->RemotePort = ConfigData->RemotePort; - AccessPoint->ActiveFlag = TRUE; - - CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, sizeof (EFI_IPv4_ADDRESS)); - - // - // Configure the TCP4 protocol. - // - Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) { - // - // the gateway is not zero, add the default route by hand - // - Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, &ConfigData->Gateway); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - } - // - // Create events for variuos asynchronous operations. - // - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsConnDone, - &Tcp4Io->ConnToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsTxDone, - &Tcp4Io->TxToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsRxDone, - &Tcp4Io->RxToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - Tcp4IoCommonNotify, - &Tcp4Io->IsCloseDone, - &Tcp4Io->CloseToken.CompletionToken.Event - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Tcp4Io->IsTxDone = FALSE; - Tcp4Io->IsRxDone = FALSE; - - return EFI_SUCCESS; - -ON_ERROR: - - if (Tcp4Io->RxToken.CompletionToken.Event != NULL) { - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); - } - - if (Tcp4Io->TxToken.CompletionToken.Event != NULL) { - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); - } - - if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) { - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); - } - - if (Tcp4 != NULL) { - Tcp4->Configure (Tcp4, NULL); - - gBS->CloseProtocol ( - Tcp4Io->Handle, - &gEfiTcp4ProtocolGuid, - Image, - Controller - ); - } - - NetLibDestroyServiceChild ( - Controller, - Image, - &gEfiTcp4ServiceBindingProtocolGuid, - Tcp4Io->Handle - ); - - return Status; -} - -/** - Destroy the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. -**/ -VOID -Tcp4IoDestroySocket ( - IN TCP4_IO *Tcp4Io - ) -{ - EFI_TCP4_PROTOCOL *Tcp4; - - Tcp4 = Tcp4Io->Tcp4; - - Tcp4->Configure (Tcp4, NULL); - - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event); - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event); - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event); - - gBS->CloseProtocol ( - Tcp4Io->Handle, - &gEfiTcp4ProtocolGuid, - Tcp4Io->Image, - Tcp4Io->Controller - ); - - NetLibDestroyServiceChild ( - Tcp4Io->Controller, - Tcp4Io->Image, - &gEfiTcp4ServiceBindingProtocolGuid, - Tcp4Io->Handle - ); -} - -/** - Connect to the other endpoint of the TCP socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Timeout The time to wait for connection done. - - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully. - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoConnect ( - IN OUT TCP4_IO *Tcp4Io, - IN EFI_EVENT Timeout - ) -{ - EFI_TCP4_PROTOCOL *Tcp4; - EFI_STATUS Status; - - Tcp4Io->IsConnDone = FALSE; - Tcp4 = Tcp4Io->Tcp4; - Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken); - if (EFI_ERROR (Status)) { - return Status; - } - - while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) { - Tcp4->Poll (Tcp4); - } - - if (!Tcp4Io->IsConnDone) { - Status = EFI_TIMEOUT; - } else { - Status = Tcp4Io->ConnToken.CompletionToken.Status; - } - - return Status; -} - -/** - Reset the socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. -**/ -VOID -Tcp4IoReset ( - IN OUT TCP4_IO *Tcp4Io - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - - Tcp4Io->CloseToken.AbortOnClose = TRUE; - Tcp4Io->IsCloseDone = FALSE; - - Tcp4 = Tcp4Io->Tcp4; - Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken); - if (EFI_ERROR (Status)) { - return ; - } - - while (!Tcp4Io->IsCloseDone) { - Tcp4->Poll (Tcp4); - } -} - -/** - Transmit the Packet to the other endpoint of the socket. - - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Packet The packet to transmit. - - @retval EFI_SUCCESS The packet is trasmitted. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoTransmit ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet - ) -{ - EFI_TCP4_TRANSMIT_DATA *TxData; - EFI_TCP4_PROTOCOL *Tcp4; - EFI_STATUS Status; - - TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet->BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA)); - if (TxData == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - TxData->Push = TRUE; - TxData->Urgent = FALSE; - TxData->DataLength = Packet->TotalSize; - - // - // Build the fragment table. - // - TxData->FragmentCount = Packet->BlockOpNum; - NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0], &TxData->FragmentCount); - - Tcp4Io->TxToken.Packet.TxData = TxData; - - // - // Trasnmit the packet. - // - Tcp4 = Tcp4Io->Tcp4; - Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - while (!Tcp4Io->IsTxDone) { - Tcp4->Poll (Tcp4); - } - - Tcp4Io->IsTxDone = FALSE; - - Status = Tcp4Io->TxToken.CompletionToken.Status; - -ON_EXIT: - - FreePool (TxData); - - return Status; -} - -/** - Receive data from the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed. - @param[in] Packet The buffer to hold the data copy from the soket rx buffer. - @param[in] AsyncMode Is this receive asyncronous or not. - @param[in] Timeout The time to wait for receiving the amount of data the Packet - can hold. - - @retval EFI_SUCCESS The required amount of data is received from the socket. - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. - @retval EFI_TIMEOUT Failed to receive the required amount of data in the - specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoReceive ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet, - IN BOOLEAN AsyncMode, - IN EFI_EVENT Timeout - ) -{ - EFI_TCP4_PROTOCOL *Tcp4; - EFI_TCP4_RECEIVE_DATA RxData; - EFI_STATUS Status; - NET_FRAGMENT *Fragment; - UINT32 FragmentCount; - UINT32 CurrentFragment; - - FragmentCount = Packet->BlockOpNum; - Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT)); - if (Fragment == NULL) { - return EFI_OUT_OF_RESOURCES; - } - // - // Build the fragment table. - // - NetbufBuildExt (Packet, Fragment, &FragmentCount); - - RxData.FragmentCount = 1; - Tcp4Io->RxToken.Packet.RxData = &RxData; - CurrentFragment = 0; - Tcp4 = Tcp4Io->Tcp4; - Status = EFI_SUCCESS; - - while (CurrentFragment < FragmentCount) { - RxData.DataLength = Fragment[CurrentFragment].Len; - RxData.FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len; - RxData.FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk; - - Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) { - // - // Poll until some data is received or something error happens. - // - Tcp4->Poll (Tcp4); - } - - if (!Tcp4Io->IsRxDone) { - // - // Timeout occurs, cancel the receive request. - // - Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken); - - Status = EFI_TIMEOUT; - goto ON_EXIT; - } else { - Tcp4Io->IsRxDone = FALSE; - } - - if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) { - Status = Tcp4Io->RxToken.CompletionToken.Status; - goto ON_EXIT; - } - - Fragment[CurrentFragment].Len -= RxData.FragmentTable[0].FragmentLength; - if (Fragment[CurrentFragment].Len == 0) { - CurrentFragment++; - } else { - Fragment[CurrentFragment].Bulk += RxData.FragmentTable[0].FragmentLength; - } - } - -ON_EXIT: - Tcp4Io->RxToken.Packet.RxData = NULL; - FreePool (Fragment); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c deleted file mode 100644 index 3555f1a2ebe3..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c +++ /dev/null @@ -1,350 +0,0 @@ -/** @file - Implementation of MD5 algorithm. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Md5.h" - -CONST UINT32 Md5_Data[][2] = { - { 0, 1 }, - { 1, 5 }, - { 5, 3 }, - { 0, 7 } -}; - -CONST UINT32 Md5_S[][4] = { - { 7, 22, 17, 12 }, - { 5, 20, 14, 9 }, - { 4, 23, 16 ,11 }, - { 6, 21, 15, 10 }, -}; - -CONST UINT32 Md5_T[] = { - 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE, - 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501, - 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE, - 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821, - 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA, - 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8, - 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED, - 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A, - 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C, - 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70, - 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05, - 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665, - 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039, - 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1, - 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1, - 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391 -}; - -CONST UINT8 Md5HashPadding[] = -{ - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// -// ROTATE_LEFT rotates x left n bits. -// -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) - -#define SA MedStates[Index2 & 3] -#define SB MedStates[(Index2 + 1) & 3] -#define SC MedStates[(Index2 + 2) & 3] -#define SD MedStates[(Index2 + 3) & 3] - -/** - Tf1 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf1 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return (A & B) | (~A & C); -} - -/** - Tf2 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf2 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return (A & C) | (B & ~C); -} - -/** - Tf3 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf3 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return A ^ B ^ C; -} - -/** - Tf4 is one basic MD5 transform function. - - @param[in] A A 32-bit quantity. - @param[in] B A 32-bit quantity. - @param[in] C A 32-bit quantity. - - @return Output was produced as a 32-bit quantity based on the - three 32-bit input quantity. -**/ -UINT32 -Tf4 ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ) -{ - return B ^ (A | ~C); -} - -typedef -UINT32 -(*MD5_TRANSFORM_FUNC) ( - IN UINT32 A, - IN UINT32 B, - IN UINT32 C - ); - -CONST MD5_TRANSFORM_FUNC Md5_F[] = { - Tf1, - Tf2, - Tf3, - Tf4 -}; - -/** - Perform the MD5 transform on 64 bytes data segment. - - @param[in, out] Md5Ctx It includes the data segment for Md5 transform. -**/ -VOID -MD5Transform ( - IN OUT MD5_CTX *Md5Ctx - ) -{ - UINT32 Index1; - UINT32 Index2; - UINT32 MedStates[MD5_HASHSIZE >> 2]; - UINT32 *Data; - UINT32 IndexD; - UINT32 IndexT; - - Data = (UINT32 *) Md5Ctx->M; - - // - // Copy MD5 states to MedStates - // - CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE); - - IndexT = 0; - for (Index1 = 0; Index1 < 4; Index1++) { - IndexD = Md5_Data[Index1][0]; - for (Index2 = 16; Index2 > 0; Index2--) { - SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT]; - SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]); - SA += SB; - - IndexD += Md5_Data[Index1][1]; - IndexD &= 15; - - IndexT++; - } - } - - for (Index1 = 0; Index1 < 4; Index1++) { - Md5Ctx->States[Index1] += MedStates[Index1]; - } -} - -/** - Copy data segment into the M field of MD5_CTX structure for later transform. - If the length of data segment is larger than 64 bytes, then does the transform - immediately and the generated Md5 code is stored in the States field of MD5_CTX - data struct for later accumulation. - All of Md5 code generated for the sequential 64-bytes data segaments are be - accumulated in MD5Final() function. - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[in] Data The data wanted to be transformed. - @param[in] DataLen The length of data. -**/ -VOID -MD5UpdateBlock ( - IN OUT MD5_CTX *Md5Ctx, - IN CONST UINT8 *Data, - IN UINTN DataLen - ) -{ - UINTN Limit; - - for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) { - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit); - MD5Transform (Md5Ctx); - - Md5Ctx->Count = 0; - Data += Limit; - DataLen -= Limit; - } - - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen); - Md5Ctx->Count += DataLen; -} - -/** - Initialize four 32-bits chaining variables and use them to do the Md5 transform. - - @param[out] Md5Ctx The data structure of Md5. - - @retval EFI_SUCCESS Initialization is ok. -**/ -EFI_STATUS -MD5Init ( - OUT MD5_CTX *Md5Ctx - ) -{ - ZeroMem (Md5Ctx, sizeof (*Md5Ctx)); - - // - // Set magic initialization constants. - // - Md5Ctx->States[0] = 0x67452301; - Md5Ctx->States[1] = 0xefcdab89; - Md5Ctx->States[2] = 0x98badcfe; - Md5Ctx->States[3] = 0x10325476; - - return EFI_SUCCESS; -} - -/** - the external interface of Md5 algorithm - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[in] Data The data wanted to be transformed. - @param[in] DataLen The length of data. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Update ( - IN OUT MD5_CTX *Md5Ctx, - IN VOID *Data, - IN UINTN DataLen - ) -{ - if (EFI_ERROR (Md5Ctx->Status)) { - return Md5Ctx->Status; - } - - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen); - Md5Ctx->Length += DataLen; - return EFI_SUCCESS; -} - -/** - Accumulate the MD5 value of every data segment and generate the finial - result according to MD5 algorithm. - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[out] HashVal The final 128-bits output. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Final ( - IN OUT MD5_CTX *Md5Ctx, - OUT UINT8 *HashVal - ) -{ - UINTN PadLength; - - if (Md5Ctx->Status == EFI_ALREADY_STARTED) { - // - // Store Hashed value & Zeroize sensitive context information. - // - CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE); - ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx)); - - return EFI_SUCCESS; - } - - if (EFI_ERROR (Md5Ctx->Status)) { - return Md5Ctx->Status; - } - - PadLength = Md5Ctx->Count >= 56 ? 120 : 56; - PadLength -= Md5Ctx->Count; - MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength); - Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3); - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8); - - ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M)); - Md5Ctx->Length = 0; - Md5Ctx->Status = EFI_ALREADY_STARTED; - return MD5Final (Md5Ctx, HashVal); -} - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c deleted file mode 100644 index f1227691ec21..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c +++ /dev/null @@ -1,433 +0,0 @@ -/** @file - UEFI Component Name(2) protocol implementation for Tcp4Dxe driver. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - - -/// -/// EFI Component Name Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = { - TcpComponentNameGetDriverName, - TcpComponentNameGetControllerName, - "eng" -}; - -/// -/// EFI Component Name 2 Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) TcpComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) TcpComponentNameGetControllerName, - "en" -}; - - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mTcpDriverNameTable[] = { - { - "eng;en", - L"Tcp Network Service Driver" - }, - { - NULL, - NULL - } -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable = NULL; - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mTcpDriverNameTable, - DriverName, - (BOOLEAN) (This == &gTcp4ComponentName) - ); -} - -/** - Update the component name for the Tcp4 child handle. - - @param Tcp4[in] A pointer to the EFI_TCP4_PROTOCOL. - - - @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully. - @retval EFI_INVALID_PARAMETER The input parameter is invalid. - -**/ -EFI_STATUS -UpdateName ( - IN EFI_TCP4_PROTOCOL *Tcp4 - ) -{ - EFI_STATUS Status; - CHAR16 HandleName[80]; - EFI_TCP4_CONFIG_DATA Tcp4ConfigData; - - if (Tcp4 == NULL) { - return EFI_INVALID_PARAMETER; - } - - // - // Format the child name into the string buffer as: - // TCPv4 (SrcPort=59, DestPort=60, ActiveFlag=TRUE) - // - ZeroMem (&Tcp4ConfigData, sizeof (Tcp4ConfigData)); - Status = Tcp4->GetModeData (Tcp4, NULL, &Tcp4ConfigData, NULL, NULL, NULL); - if (!EFI_ERROR (Status)) { - UnicodeSPrint (HandleName, sizeof (HandleName), - L"TCPv4 (SrcPort=%d, DestPort=%d, ActiveFlag=%s)", - Tcp4ConfigData.AccessPoint.StationPort, - Tcp4ConfigData.AccessPoint.RemotePort, - (Tcp4ConfigData.AccessPoint.ActiveFlag ? L"TRUE" : L"FALSE") - ); - } else if (Status == EFI_NOT_STARTED) { - UnicodeSPrint ( - HandleName, - sizeof (HandleName), - L"TCPv4 (Not started)" - ); - } else { - return Status; - } - - if (gTcpControllerNameTable != NULL) { - FreeUnicodeStringTable (gTcpControllerNameTable); - gTcpControllerNameTable = NULL; - } - - Status = AddUnicodeString2 ( - "eng", - gTcp4ComponentName.SupportedLanguages, - &gTcpControllerNameTable, - HandleName, - TRUE - ); - if (EFI_ERROR (Status)) { - return Status; - } - - return AddUnicodeString2 ( - "en", - gTcp4ComponentName2.SupportedLanguages, - &gTcpControllerNameTable, - HandleName, - FALSE - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -TcpComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - - // - // Only provide names for child handles. - // - if (ChildHandle == NULL) { - return EFI_UNSUPPORTED; - } - - // - // Make sure this driver produced ChildHandle - // - Status = EfiTestChildHandle ( - ControllerHandle, - ChildHandle, - &gEfiIp4ProtocolGuid - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Retrieve an instance of a produced protocol from ChildHandle - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiTcp4ProtocolGuid, - (VOID **)&Tcp4, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Update the component name for this child handle. - // - Status = UpdateName (Tcp4); - if (EFI_ERROR (Status)) { - return Status; - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - gTcpControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gTcp4ComponentName) - ); -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c deleted file mode 100644 index adb5aa35cdf2..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c +++ /dev/null @@ -1,1201 +0,0 @@ -/** @file - Implementation of the Socket. - -Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "SockImpl.h" - -/** - Get the length of the data that can be retrieved from the socket - receive buffer. - - @param SockBuffer Pointer to the socket receive buffer. - @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is - OOB. - @param BufLen The maximum length of the data buffer to store the - received data in socket layer. - - @return The length of the data can be retreived. - -**/ -UINT32 -SockTcpDataToRcv ( - IN SOCK_BUFFER *SockBuffer, - OUT BOOLEAN *IsUrg, - IN UINT32 BufLen - ); - -/** - Process the send token. - - @param Sock Pointer to the socket. - -**/ -VOID -SockProcessSndToken ( - IN OUT SOCKET *Sock - ); - -/** - Supporting function for both SockImpl and SockInterface. - - @param Event The Event this notify function registered to, ignored. - -**/ -VOID -EFIAPI -SockFreeFoo ( - IN EFI_EVENT Event - ) -{ - return ; -} - - -/** - Get the length of the data that can be retrieved from the socket - receive buffer. - - @param SockBuffer Pointer to the socket receive buffer. - @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is - OOB. - @param BufLen The maximum length of the data buffer to store the - received data in socket layer. - - @return The length of the data can be retreived. - -**/ -UINT32 -SockTcpDataToRcv ( - IN SOCK_BUFFER *SockBuffer, - OUT BOOLEAN *IsUrg, - IN UINT32 BufLen - ) -{ - NET_BUF *RcvBufEntry; - UINT32 DataLen; - TCP_RSV_DATA *TcpRsvData; - BOOLEAN Urg; - ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0)); - - RcvBufEntry = SockBufFirst (SockBuffer); - ASSERT (RcvBufEntry != NULL); - - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; - - *IsUrg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); - - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { - - DataLen = MIN (TcpRsvData->UrgLen, BufLen); - - if (DataLen < TcpRsvData->UrgLen) { - TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen; - } else { - TcpRsvData->UrgLen = 0; - } - - return DataLen; - - } - - DataLen = RcvBufEntry->TotalSize; - - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); - - while ((BufLen > DataLen) && (RcvBufEntry != NULL)) { - - TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData; - - Urg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE); - - if (*IsUrg != Urg) { - break; - } - - if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) { - - if (TcpRsvData->UrgLen + DataLen < BufLen) { - TcpRsvData->UrgLen = 0; - } else { - TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen); - } - - return MIN (TcpRsvData->UrgLen + DataLen, BufLen); - - } - - DataLen += RcvBufEntry->TotalSize; - - RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry); - } - - DataLen = MIN (BufLen, DataLen); - return DataLen; -} - - -/** - Copy data from socket buffer to application provided receive buffer. - - @param Sock Pointer to the socket. - @param TcpRxData Pointer to the application provided receive buffer. - @param RcvdBytes The maximum length of the data can be copied. - @param IsOOB If TRUE the data is OOB, FALSE the data is normal. - -**/ -VOID -SockSetTcpRxData ( - IN SOCKET *Sock, - IN VOID *TcpRxData, - IN UINT32 RcvdBytes, - IN BOOLEAN IsOOB - ) -{ - UINT32 Index; - UINT32 CopyBytes; - UINT32 OffSet; - EFI_TCP4_RECEIVE_DATA *RxData; - EFI_TCP4_FRAGMENT_DATA *Fragment; - - RxData = (EFI_TCP4_RECEIVE_DATA *) TcpRxData; - - OffSet = 0; - - ASSERT (RxData->DataLength >= RcvdBytes); - - RxData->DataLength = RcvdBytes; - RxData->UrgentFlag = IsOOB; - - for (Index = 0; (Index < RxData->FragmentCount) && (RcvdBytes > 0); Index++) { - - Fragment = &RxData->FragmentTable[Index]; - CopyBytes = MIN ((UINT32) (Fragment->FragmentLength), RcvdBytes); - - NetbufQueCopy ( - Sock->RcvBuffer.DataQueue, - OffSet, - CopyBytes, - Fragment->FragmentBuffer - ); - - Fragment->FragmentLength = CopyBytes; - RcvdBytes -= CopyBytes; - OffSet += CopyBytes; - } -} - - -/** - Get received data from the socket layer to the receive token. - - @param Sock Pointer to the socket. - @param RcvToken Pointer to the application provided receive token. - - @return The length of data received in this token. - -**/ -UINT32 -SockProcessRcvToken ( - IN SOCKET *Sock, - IN OUT SOCK_IO_TOKEN *RcvToken - ) -{ - UINT32 TokenRcvdBytes; - EFI_TCP4_RECEIVE_DATA *RxData; - BOOLEAN IsUrg; - - ASSERT (Sock != NULL); - - ASSERT (SockStream == Sock->Type); - - RxData = RcvToken->Packet.RxData; - - TokenRcvdBytes = SockTcpDataToRcv ( - &Sock->RcvBuffer, - &IsUrg, - (UINT32) RxData->DataLength - ); - - // - // Copy data from RcvBuffer of socket to user - // provided RxData and set the fields in TCP RxData - // - SockSetTcpRxData (Sock, RxData, TokenRcvdBytes, IsUrg); - - NetbufQueTrim (Sock->RcvBuffer.DataQueue, TokenRcvdBytes); - SIGNAL_TOKEN (&(RcvToken->Token), EFI_SUCCESS); - - return TokenRcvdBytes; -} - - -/** - Process the TCP send data, buffer the tcp txdata and append - the buffer to socket send buffer,then try to send it. - - @param Sock Pointer to the socket. - @param TcpTxData Pointer to the application provided send buffer. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -SockProcessTcpSndData ( - IN SOCKET *Sock, - IN VOID *TcpTxData - ) -{ - NET_BUF *SndData; - EFI_STATUS Status; - EFI_TCP4_TRANSMIT_DATA *TxData; - - TxData = (EFI_TCP4_TRANSMIT_DATA *) TcpTxData; - - // - // transform this TxData into a NET_BUFFER - // and insert it into Sock->SndBuffer - // - SndData = NetbufFromExt ( - (NET_FRAGMENT *) TxData->FragmentTable, - (UINT32) TxData->FragmentCount, - 0, - 0, - SockFreeFoo, - NULL - ); - - if (NULL == SndData) { - DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to" - " call NetBufferFromExt\n")); - - return EFI_OUT_OF_RESOURCES; - } - - NetbufQueAppend (Sock->SndBuffer.DataQueue, SndData); - - // - // notify the low layer protocol to handle this send token - // - if (TxData->Urgent) { - Status = Sock->ProtoHandler (Sock, SOCK_SNDURG, NULL); - - if (EFI_ERROR (Status)) { - return Status; - } - } - - if (TxData->Push) { - Status = Sock->ProtoHandler (Sock, SOCK_SNDPUSH, NULL); - - if (EFI_ERROR (Status)) { - return Status; - } - } - - // - // low layer protocol should really handle the sending - // process when catching SOCK_SND request - // - Status = Sock->ProtoHandler (Sock, SOCK_SND, NULL); - - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} - - -/** - Flush the tokens in the specific token list. - - @param Sock Pointer to the socket. - @param PendingTokenList Pointer to the token list to be flushed. - -**/ -VOID -SockFlushPendingToken ( - IN SOCKET *Sock, - IN LIST_ENTRY *PendingTokenList - ) -{ - SOCK_TOKEN *SockToken; - SOCK_COMPLETION_TOKEN *Token; - - ASSERT ((Sock != NULL) && (PendingTokenList != NULL)); - - while (!IsListEmpty (PendingTokenList)) { - SockToken = NET_LIST_HEAD ( - PendingTokenList, - SOCK_TOKEN, - TokenList - ); - - Token = SockToken->Token; - SIGNAL_TOKEN (Token, Sock->SockError); - - RemoveEntryList (&(SockToken->TokenList)); - FreePool (SockToken); - } -} - - -/** - Wake up the connection token while the connection is successfully established, - then try to process any pending send token. - - @param Sock Pointer to the socket. - -**/ -VOID -SockWakeConnToken ( - IN OUT SOCKET *Sock - ) -{ - ASSERT (Sock->ConnectionToken != NULL); - - SIGNAL_TOKEN (Sock->ConnectionToken, EFI_SUCCESS); - Sock->ConnectionToken = NULL; - - // - // check to see if some pending send token existed? - // - SockProcessSndToken (Sock); - return ; -} - - -/** - Wake up the listen token while the connection is established successfully. - - @param Sock Pointer to the socket. - -**/ -VOID -SockWakeListenToken ( - IN OUT SOCKET *Sock - ) -{ - SOCKET *Parent; - SOCK_TOKEN *SockToken; - EFI_TCP4_LISTEN_TOKEN *ListenToken; - - Parent = Sock->Parent; - - ASSERT ((Parent != NULL) && SOCK_IS_LISTENING (Parent) && SOCK_IS_CONNECTED (Sock)); - - if (!IsListEmpty (&Parent->ListenTokenList)) { - SockToken = NET_LIST_HEAD ( - &Parent->ListenTokenList, - SOCK_TOKEN, - TokenList - ); - - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) SockToken->Token; - ListenToken->NewChildHandle = Sock->SockHandle; - - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); - - RemoveEntryList (&SockToken->TokenList); - FreePool (SockToken); - - RemoveEntryList (&Sock->ConnectionList); - - Parent->ConnCnt--; - DEBUG ((EFI_D_NET, "SockWakeListenToken: accept a socket, now conncnt is %d", Parent->ConnCnt)); - - Sock->Parent = NULL; - } -} - - -/** - Wake up the receive token while some data is received. - - @param Sock Pointer to the socket. - -**/ -VOID -SockWakeRcvToken ( - IN SOCKET *Sock - ) -{ - UINT32 RcvdBytes; - UINT32 TokenRcvdBytes; - SOCK_TOKEN *SockToken; - SOCK_IO_TOKEN *RcvToken; - - ASSERT (Sock->RcvBuffer.DataQueue != NULL); - - RcvdBytes = (Sock->RcvBuffer.DataQueue)->BufSize; - - ASSERT (RcvdBytes > 0); - - while (RcvdBytes > 0 && !IsListEmpty (&Sock->RcvTokenList)) { - - SockToken = NET_LIST_HEAD ( - &Sock->RcvTokenList, - SOCK_TOKEN, - TokenList - ); - - RcvToken = (SOCK_IO_TOKEN *) SockToken->Token; - TokenRcvdBytes = SockProcessRcvToken (Sock, RcvToken); - - if (0 == TokenRcvdBytes) { - return ; - } - - RemoveEntryList (&(SockToken->TokenList)); - FreePool (SockToken); - RcvdBytes -= TokenRcvdBytes; - } -} - - -/** - Process the send token. - - @param Sock Pointer to the socket. - -**/ -VOID -SockProcessSndToken ( - IN OUT SOCKET *Sock - ) -{ - UINT32 FreeSpace; - SOCK_TOKEN *SockToken; - UINT32 DataLen; - SOCK_IO_TOKEN *SndToken; - EFI_TCP4_TRANSMIT_DATA *TxData; - EFI_STATUS Status; - - ASSERT ((Sock != NULL) && (SockStream == Sock->Type)); - - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); - - // - // to determine if process a send token using - // socket layer flow control policy - // - while ((FreeSpace >= Sock->SndBuffer.LowWater) && - !IsListEmpty (&Sock->SndTokenList)) { - - SockToken = NET_LIST_HEAD ( - &(Sock->SndTokenList), - SOCK_TOKEN, - TokenList - ); - - // - // process this token - // - RemoveEntryList (&(SockToken->TokenList)); - InsertTailList ( - &(Sock->ProcessingSndTokenList), - &(SockToken->TokenList) - ); - - // - // Proceess it in the light of SockType - // - SndToken = (SOCK_IO_TOKEN *) SockToken->Token; - TxData = SndToken->Packet.TxData; - - DataLen = (UINT32) TxData->DataLength; - Status = SockProcessTcpSndData (Sock, TxData); - - if (EFI_ERROR (Status)) { - goto OnError; - } - - if (DataLen >= FreeSpace) { - FreeSpace = 0; - - } else { - FreeSpace -= DataLen; - - } - } - - return ; - -OnError: - - RemoveEntryList (&SockToken->TokenList); - SIGNAL_TOKEN (SockToken->Token, Status); - FreePool (SockToken); -} - - -/** - Create a socket with initial data SockInitData. - - @param SockInitData Pointer to the initial data of the socket. - - @return Pointer to the newly created socket, return NULL when exception occured. - -**/ -SOCKET * -SockCreate ( - IN SOCK_INIT_DATA *SockInitData - ) -{ - SOCKET *Sock; - SOCKET *Parent; - EFI_STATUS Status; - - ASSERT ((SockInitData != NULL) && (SockInitData->ProtoHandler != NULL)); - ASSERT (SockInitData->Type == SockStream); - ASSERT ((SockInitData->ProtoData != NULL) && (SockInitData->DataSize <= PROTO_RESERVED_LEN)); - - Parent = SockInitData->Parent; - - if ((Parent != NULL) && (Parent->ConnCnt == Parent->BackLog)) { - DEBUG ( - (EFI_D_ERROR, - "SockCreate: Socket parent has " - "reached its connection limit with %d ConnCnt and %d BackLog\n", - Parent->ConnCnt, - Parent->BackLog) - ); - - return NULL; - } - - Sock = AllocateZeroPool (sizeof (SOCKET)); - if (NULL == Sock) { - - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to create a new socket\n")); - return NULL; - } - - InitializeListHead (&Sock->Link); - InitializeListHead (&Sock->ConnectionList); - InitializeListHead (&Sock->ListenTokenList); - InitializeListHead (&Sock->RcvTokenList); - InitializeListHead (&Sock->SndTokenList); - InitializeListHead (&Sock->ProcessingSndTokenList); - - EfiInitializeLock (&(Sock->Lock), TPL_CALLBACK); - - Sock->SndBuffer.DataQueue = NetbufQueAlloc (); - if (NULL == Sock->SndBuffer.DataQueue) { - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate" - " SndBuffer for new socket\n")); - - goto OnError; - } - - Sock->RcvBuffer.DataQueue = NetbufQueAlloc (); - if (NULL == Sock->RcvBuffer.DataQueue) { - DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate " - "RcvBuffer for new socket\n")); - - goto OnError; - } - - Sock->Signature = SOCK_SIGNATURE; - - Sock->Parent = Parent; - Sock->BackLog = SockInitData->BackLog; - Sock->ProtoHandler = SockInitData->ProtoHandler; - Sock->SndBuffer.HighWater = SockInitData->SndBufferSize; - Sock->RcvBuffer.HighWater = SockInitData->RcvBufferSize; - Sock->Type = SockInitData->Type; - Sock->DriverBinding = SockInitData->DriverBinding; - Sock->State = SockInitData->State; - Sock->CreateCallback = SockInitData->CreateCallback; - Sock->DestroyCallback = SockInitData->DestroyCallback; - Sock->Context = SockInitData->Context; - - Sock->SockError = EFI_ABORTED; - Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER; - Sock->RcvBuffer.LowWater = SOCK_BUFF_LOW_WATER; - - // - // Install protocol on Sock->SockHandle - // - CopyMem ( - &(Sock->NetProtocol.TcpProtocol), - SockInitData->Protocol, - sizeof (EFI_TCP4_PROTOCOL) - ); - - // - // copy the protodata into socket - // - CopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize); - - Status = gBS->InstallMultipleProtocolInterfaces ( - &Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &(Sock->NetProtocol.TcpProtocol), - NULL - ); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockCreate: Install TCP protocol in " - "socket failed with %r\n", Status)); - - goto OnError; - } - - if (Parent != NULL) { - ASSERT (Parent->BackLog > 0); - ASSERT (SOCK_IS_LISTENING (Parent)); - - // - // need to add it into Parent->ConnectionList - // if the Parent->ConnCnt < Parent->BackLog - // - Parent->ConnCnt++; - - DEBUG ( - (EFI_D_NET, - "SockCreate: Create a new socket and add to parent, now conncnt is %d\n", - Parent->ConnCnt) - ); - - InsertTailList (&Parent->ConnectionList, &Sock->ConnectionList); - } - - if (Sock->CreateCallback != NULL) { - Status = Sock->CreateCallback (Sock, Sock->Context); - if (EFI_ERROR (Status)) { - goto OnError; - } - } - - return Sock; - -OnError: - - if (Sock->SockHandle != NULL) { - gBS->UninstallMultipleProtocolInterfaces ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &(Sock->NetProtocol.TcpProtocol), - NULL - ); - } - - if (NULL != Sock->SndBuffer.DataQueue) { - NetbufQueFree (Sock->SndBuffer.DataQueue); - } - - if (NULL != Sock->RcvBuffer.DataQueue) { - NetbufQueFree (Sock->RcvBuffer.DataQueue); - } - - FreePool (Sock); - - return NULL; -} - - -/** - Destroy a socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockDestroy ( - IN OUT SOCKET *Sock - ) -{ - ASSERT (SockStream == Sock->Type); - - // - // Flush the completion token buffered - // by sock and rcv, snd buffer - // - if (!SOCK_IS_UNCONFIGURED (Sock)) { - - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - Sock->ConfigureState = SO_UNCONFIGURED; - - } - // - // Destroy the RcvBuffer Queue and SendBuffer Queue - // - NetbufQueFree (Sock->RcvBuffer.DataQueue); - NetbufQueFree (Sock->SndBuffer.DataQueue); - - // - // Remove it from parent connection list if needed - // - if (Sock->Parent != NULL) { - - RemoveEntryList (&(Sock->ConnectionList)); - (Sock->Parent->ConnCnt)--; - - DEBUG ( - (EFI_D_NET, - "SockDestroy: Delete a unaccepted socket from parent" - "now conncnt is %d\n", - Sock->Parent->ConnCnt) - ); - - Sock->Parent = NULL; - } - - FreePool (Sock); - return ; -} - - -/** - Flush the sndBuffer and rcvBuffer of socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockConnFlush ( - IN OUT SOCKET *Sock - ) -{ - SOCKET *Child; - - ASSERT (Sock != NULL); - - // - // Clear the flag in this socket - // - Sock->Flag = 0; - - // - // Flush the SndBuffer and RcvBuffer of Sock - // - NetbufQueFlush (Sock->SndBuffer.DataQueue); - NetbufQueFlush (Sock->RcvBuffer.DataQueue); - - // - // Signal the pending token - // - if (Sock->ConnectionToken != NULL) { - SIGNAL_TOKEN (Sock->ConnectionToken, Sock->SockError); - Sock->ConnectionToken = NULL; - } - - if (Sock->CloseToken != NULL) { - SIGNAL_TOKEN (Sock->CloseToken, Sock->SockError); - Sock->CloseToken = NULL; - } - - SockFlushPendingToken (Sock, &(Sock->ListenTokenList)); - SockFlushPendingToken (Sock, &(Sock->RcvTokenList)); - SockFlushPendingToken (Sock, &(Sock->SndTokenList)); - SockFlushPendingToken (Sock, &(Sock->ProcessingSndTokenList)); - - // - // Destroy the pending connection, if it is a listening socket - // - if (SOCK_IS_LISTENING (Sock)) { - while (!IsListEmpty (&Sock->ConnectionList)) { - Child = NET_LIST_HEAD ( - &Sock->ConnectionList, - SOCKET, - ConnectionList - ); - - SockDestroyChild (Child); - } - - Sock->ConnCnt = 0; - } - - return ; -} - - -/** - Set the state of the socket. - - @param Sock Pointer to the socket. - @param State The new socket state to be set. - -**/ -VOID -SockSetState ( - IN OUT SOCKET *Sock, - IN UINT8 State - ) -{ - Sock->State = State; -} - - -/** - Clone a new socket including its associated protocol control block. - - @param Sock Pointer to the socket to be cloned. - - @return Pointer to the newly cloned socket. If NULL, error condition occurred. - -**/ -SOCKET * -SockClone ( - IN SOCKET *Sock - ) -{ - SOCKET *ClonedSock; - SOCK_INIT_DATA InitData; - - InitData.BackLog = Sock->BackLog; - InitData.Parent = Sock; - InitData.State = Sock->State; - InitData.ProtoHandler = Sock->ProtoHandler; - InitData.Type = Sock->Type; - InitData.RcvBufferSize = Sock->RcvBuffer.HighWater; - InitData.SndBufferSize = Sock->SndBuffer.HighWater; - InitData.DriverBinding = Sock->DriverBinding; - InitData.Protocol = &(Sock->NetProtocol); - InitData.CreateCallback = Sock->CreateCallback; - InitData.DestroyCallback = Sock->DestroyCallback; - InitData.Context = Sock->Context; - InitData.ProtoData = Sock->ProtoReserved; - InitData.DataSize = sizeof (Sock->ProtoReserved); - - ClonedSock = SockCreate (&InitData); - - if (NULL == ClonedSock) { - DEBUG ((EFI_D_ERROR, "SockClone: no resource to create a cloned sock\n")); - return NULL; - } - - SockSetState (ClonedSock, SO_CONNECTING); - ClonedSock->ConfigureState = Sock->ConfigureState; - - return ClonedSock; -} - - -/** - Called by the low layer protocol to indicate the socket a connection is - established. - - This function just changes the socket's state to SO_CONNECTED - and signals the token used for connection establishment. - - @param Sock Pointer to the socket associated with the - established connection. -**/ -VOID -SockConnEstablished ( - IN SOCKET *Sock - ) -{ - - ASSERT (SO_CONNECTING == Sock->State); - - SockSetState (Sock, SO_CONNECTED); - - if (NULL == Sock->Parent) { - SockWakeConnToken (Sock); - } else { - SockWakeListenToken (Sock); - } - - return ; -} - - -/** - Called by the low layer protocol to indicate the connection is closed. - - This function flushes the socket, sets the state to SO_CLOSED and signals - the close token. - - @param Sock Pointer to the socket associated with the closed - connection. - -**/ -VOID -SockConnClosed ( - IN OUT SOCKET *Sock - ) -{ - if (Sock->CloseToken != NULL) { - SIGNAL_TOKEN (Sock->CloseToken, EFI_SUCCESS); - Sock->CloseToken = NULL; - } - - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - - if (Sock->Parent != NULL) { - SockDestroyChild (Sock); - } - -} - - -/** - Called by low layer protocol to indicate that some data is sent or processed. - - This function trims the sent data in the socket send buffer, signals the data - token if proper. - - @param Sock Pointer to the socket. - @param Count The length of the data processed or sent, in bytes. - -**/ -VOID -SockDataSent ( - IN SOCKET *Sock, - IN UINT32 Count - ) -{ - SOCK_TOKEN *SockToken; - SOCK_COMPLETION_TOKEN *SndToken; - - ASSERT (!IsListEmpty (&Sock->ProcessingSndTokenList)); - ASSERT (Count <= (Sock->SndBuffer.DataQueue)->BufSize); - - NetbufQueTrim (Sock->SndBuffer.DataQueue, Count); - - // - // To check if we can signal some snd token in this socket - // - while (Count > 0) { - SockToken = NET_LIST_HEAD ( - &(Sock->ProcessingSndTokenList), - SOCK_TOKEN, - TokenList - ); - - SndToken = SockToken->Token; - - if (SockToken->RemainDataLen <= Count) { - - RemoveEntryList (&(SockToken->TokenList)); - SIGNAL_TOKEN (SndToken, EFI_SUCCESS); - Count -= SockToken->RemainDataLen; - FreePool (SockToken); - } else { - - SockToken->RemainDataLen -= Count; - Count = 0; - } - } - - // - // to judge if we can process some send token in - // Sock->SndTokenList, if so process those send token - // - SockProcessSndToken (Sock); - return ; -} - - -/** - Called by the low layer protocol to copy some data in socket send - buffer starting from the specific offset to a buffer provided by - the caller. - - @param Sock Pointer to the socket. - @param Offset The start point of the data to be copied. - @param Len The length of the data to be copied. - @param Dest Pointer to the destination to copy the data. - - @return The data size copied. - -**/ -UINT32 -SockGetDataToSend ( - IN SOCKET *Sock, - IN UINT32 Offset, - IN UINT32 Len, - IN UINT8 *Dest - ) -{ - ASSERT ((Sock != NULL) && SockStream == Sock->Type); - - return NetbufQueCopy ( - Sock->SndBuffer.DataQueue, - Offset, - Len, - Dest - ); -} - - -/** - Called by the low layer protocol to deliver received data to socket layer. - - This function will append the data to the socket receive buffer, set ther - urgent data length and then check if any receive token can be signaled. - - @param Sock Pointer to the socket. - @param NetBuffer Pointer to the buffer that contains the received - data. - @param UrgLen The length of the urgent data in the received data. - -**/ -VOID -SockDataRcvd ( - IN SOCKET *Sock, - IN OUT NET_BUF *NetBuffer, - IN UINT32 UrgLen - ) -{ - ASSERT ((Sock != NULL) && (Sock->RcvBuffer.DataQueue != NULL) && - UrgLen <= NetBuffer->TotalSize); - - NET_GET_REF (NetBuffer); - - ((TCP_RSV_DATA *) (NetBuffer->ProtoData))->UrgLen = UrgLen; - - NetbufQueAppend (Sock->RcvBuffer.DataQueue, NetBuffer); - - SockWakeRcvToken (Sock); - return ; -} - - -/** - Get the length of the free space of the specific socket buffer. - - @param Sock Pointer to the socket. - @param Which Flag to indicate which socket buffer to check, - either send buffer or receive buffer. - - @return The length of the free space, in bytes. - -**/ -UINT32 -SockGetFreeSpace ( - IN SOCKET *Sock, - IN UINT32 Which - ) -{ - UINT32 BufferCC; - SOCK_BUFFER *SockBuffer; - - ASSERT ((Sock != NULL) && ((SOCK_SND_BUF == Which) || (SOCK_RCV_BUF == Which))); - - if (SOCK_SND_BUF == Which) { - SockBuffer = &(Sock->SndBuffer); - } else { - SockBuffer = &(Sock->RcvBuffer); - } - - BufferCC = (SockBuffer->DataQueue)->BufSize; - - if (BufferCC >= SockBuffer->HighWater) { - - return 0; - } - - return SockBuffer->HighWater - BufferCC; -} - - - -/** - Called by the low layer protocol to indicate that there will be no more data - from the communication peer. - - This function set the socket's state to SO_NO_MORE_DATA and signal all queued - IO tokens with the error status EFI_CONNECTION_FIN. - - @param Sock Pointer to the socket. - -**/ -VOID -SockNoMoreData ( - IN OUT SOCKET *Sock - ) -{ - EFI_STATUS Err; - - SOCK_NO_MORE_DATA (Sock); - - if (!IsListEmpty (&Sock->RcvTokenList)) { - - ASSERT (0 == GET_RCV_DATASIZE (Sock)); - - Err = Sock->SockError; - - SOCK_ERROR (Sock, EFI_CONNECTION_FIN); - - SockFlushPendingToken (Sock, &Sock->RcvTokenList); - - SOCK_ERROR (Sock, Err); - - } - -} - - -/** - Get the first buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - - @return Pointer to the first buffer in the queue. NULL if the queue is empty. - -**/ -NET_BUF * -SockBufFirst ( - IN SOCK_BUFFER *Sockbuf - ) -{ - LIST_ENTRY *NetbufList; - - NetbufList = &(Sockbuf->DataQueue->BufList); - - if (IsListEmpty (NetbufList)) { - return NULL; - } - - return NET_LIST_HEAD (NetbufList, NET_BUF, List); -} - - -/** - Get the next buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - @param SockEntry Pointer to the buffer block prior to the required - one. - - @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is - the tail or head entry. - -**/ -NET_BUF * -SockBufNext ( - IN SOCK_BUFFER *Sockbuf, - IN NET_BUF *SockEntry - ) -{ - LIST_ENTRY *NetbufList; - - NetbufList = &(Sockbuf->DataQueue->BufList); - - if ((SockEntry->List.ForwardLink == NetbufList) || - (SockEntry->List.BackLink == &SockEntry->List) || - (SockEntry->List.ForwardLink == &SockEntry->List)) { - - return NULL; - } - - return NET_LIST_USER_STRUCT (SockEntry->List.ForwardLink, NET_BUF, List); -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c deleted file mode 100644 index cd20b8bcb2dd..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c +++ /dev/null @@ -1,990 +0,0 @@ -/** @file - Interface function of the Socket. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "SockImpl.h" - - -/** - Check whether the Event is in the List. - - @param List Pointer to the token list to be searched. - @param Event The event to be checked. - - @retval TRUE The specific Event exists in the List. - @retval FALSE The specific Event is not in the List. - -**/ -BOOLEAN -SockTokenExistedInList ( - IN LIST_ENTRY *List, - IN EFI_EVENT Event - ) -{ - LIST_ENTRY *ListEntry; - SOCK_TOKEN *SockToken; - - NET_LIST_FOR_EACH (ListEntry, List) { - SockToken = NET_LIST_USER_STRUCT ( - ListEntry, - SOCK_TOKEN, - TokenList - ); - - if (Event == SockToken->Token->Event) { - return TRUE; - } - } - - return FALSE; -} - - -/** - Call SockTokenExistedInList() to check whether the Event is - in the related socket's lists. - - @param Sock Pointer to the instance's socket. - @param Event The event to be checked. - - @retval TRUE The Event exists in related socket's lists. - @retval FALSE The Event is not in related socket's lists. - -**/ -BOOLEAN -SockTokenExisted ( - IN SOCKET *Sock, - IN EFI_EVENT Event - ) -{ - - if (SockTokenExistedInList (&Sock->SndTokenList, Event) || - SockTokenExistedInList (&Sock->ProcessingSndTokenList, Event) || - SockTokenExistedInList (&Sock->RcvTokenList, Event) || - SockTokenExistedInList (&Sock->ListenTokenList, Event)) { - - return TRUE; - } - - if ((Sock->ConnectionToken != NULL) && - (Sock->ConnectionToken->Event == Event)) { - - return TRUE; - } - - if ((Sock->CloseToken != NULL) && (Sock->CloseToken->Event == Event)) { - return TRUE; - } - - return FALSE; -} - - -/** - Buffer a token into the specific list of socket Sock. - - @param Sock Pointer to the instance's socket. - @param List Pointer to the list to store the token. - @param Token Pointer to the token to be buffered. - @param DataLen The data length of the buffer contained in Token. - - @return Pointer to the token that wraps Token. If NULL, error condition occurred. - -**/ -SOCK_TOKEN * -SockBufferToken ( - IN SOCKET *Sock, - IN LIST_ENTRY *List, - IN VOID *Token, - IN UINT32 DataLen - ) -{ - SOCK_TOKEN *SockToken; - - SockToken = AllocatePool (sizeof (SOCK_TOKEN)); - if (NULL == SockToken) { - - DEBUG ((EFI_D_ERROR, "SockBufferIOToken: No Memory " - "to allocate SockToken\n")); - - return NULL; - } - - SockToken->Sock = Sock; - SockToken->Token = (SOCK_COMPLETION_TOKEN *) Token; - SockToken->RemainDataLen = DataLen; - InsertTailList (List, &SockToken->TokenList); - - return SockToken; -} - - -/** - Destroy the socket Sock and its associated protocol control block. - - @param Sock The socket to be destroyed. - - @retval EFI_SUCCESS The socket Sock is destroyed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockDestroyChild ( - IN SOCKET *Sock - ) -{ - EFI_STATUS Status; - TCP4_PROTO_DATA *ProtoData; - TCP_CB *Tcb; - VOID *SockProtocol; - - ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL)); - - if (Sock->InDestroy) { - return EFI_SUCCESS; - } - - Sock->InDestroy = TRUE; - - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - Tcb = ProtoData->TcpPcb; - - ASSERT (Tcb != NULL); - - // - // Close the IP protocol. - // - gBS->CloseProtocol ( - Tcb->IpInfo->ChildHandle, - &gEfiIp4ProtocolGuid, - ProtoData->TcpService->IpIo->Image, - Sock->SockHandle - ); - - if (Sock->DestroyCallback != NULL) { - Sock->DestroyCallback (Sock, Sock->Context); - } - - // - // Retrieve the protocol installed on this sock - // - Status = gBS->OpenProtocol ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &SockProtocol, - Sock->DriverBinding, - Sock->SockHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Open protocol installed " - "on socket failed with %r\n", Status)); - } - - // - // Uninstall the protocol installed on this sock - // in the light of Sock->SockType - // - gBS->UninstallMultipleProtocolInterfaces ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - SockProtocol, - NULL - ); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Get the lock to " - "access socket failed with %r\n", Status)); - - return EFI_ACCESS_DENIED; - } - - // - // force protocol layer to detach the PCB - // - Status = Sock->ProtoHandler (Sock, SOCK_DETACH, NULL); - - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockDestroyChild: Protocol detach socket" - " failed with %r\n", Status)); - - Sock->InDestroy = FALSE; - } else if (SOCK_IS_CONFIGURED (Sock)) { - - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - - Sock->ConfigureState = SO_UNCONFIGURED; - } - - EfiReleaseLock (&(Sock->Lock)); - - if (EFI_ERROR (Status)) { - return Status; - } - - SockDestroy (Sock); - return EFI_SUCCESS; -} - - -/** - Create a socket and its associated protocol control block - with the intial data SockInitData and protocol specific - data ProtoData. - - @param SockInitData Inital data to setting the socket. - - @return Pointer to the newly created socket. If NULL, error condition occured. - -**/ -SOCKET * -SockCreateChild ( - IN SOCK_INIT_DATA *SockInitData - ) -{ - SOCKET *Sock; - VOID *SockProtocol; - EFI_STATUS Status; - - // - // create a new socket - // - Sock = SockCreate (SockInitData); - if (NULL == Sock) { - - DEBUG ((EFI_D_ERROR, "SockCreateChild: No resource to " - "create a new socket\n")); - - return NULL; - } - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockCreateChild: Get the lock to " - "access socket failed with %r\n", Status)); - - goto ERROR; - } - // - // inform the protocol layer to attach the socket - // with a new protocol control block - // - Status = Sock->ProtoHandler (Sock, SOCK_ATTACH, NULL); - EfiReleaseLock (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockCreateChild: Protocol failed to" - " attach a socket with %r\n", Status)); - - goto ERROR; - } - - return Sock; - -ERROR: - - if (Sock->DestroyCallback != NULL) { - Sock->DestroyCallback (Sock, Sock->Context); - } - - gBS->OpenProtocol ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - &SockProtocol, - Sock->DriverBinding, - Sock->SockHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - // - // Uninstall the protocol installed on this sock - // - gBS->UninstallMultipleProtocolInterfaces ( - Sock->SockHandle, - &gEfiTcp4ProtocolGuid, - SockProtocol, - NULL - ); - SockDestroy (Sock); - return NULL; -} - - -/** - Configure the specific socket Sock using configuration data ConfigData. - - @param Sock Pointer to the socket to be configured. - @param ConfigData Pointer to the configuration data. - - @retval EFI_SUCCESS The socket is configured successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or the - socket is already configured. - -**/ -EFI_STATUS -SockConfigure ( - IN SOCKET *Sock, - IN VOID *ConfigData - ) -{ - EFI_STATUS Status; - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockConfigure: Get the access for " - "socket failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_CONFIGURED (Sock)) { - Status = EFI_ACCESS_DENIED; - goto OnExit; - } - - ASSERT (Sock->State == SO_CLOSED); - - Status = Sock->ProtoHandler (Sock, SOCK_CONFIGURE, ConfigData); - -OnExit: - EfiReleaseLock (&(Sock->Lock)); - - return Status; -} - - -/** - Initiate a connection establishment process. - - @param Sock Pointer to the socket to initiate the initate the - connection. - @param Token Pointer to the token used for the connection - operation. - - @retval EFI_SUCCESS The connection is initialized successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be an active one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockConnect ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - EFI_STATUS Status; - EFI_EVENT Event; - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockConnect: Get the access for " - "socket failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto OnExit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - - Status = EFI_NOT_STARTED; - goto OnExit; - } - - if (!SOCK_IS_CLOSED (Sock) || !SOCK_IS_CONFIGURED_ACTIVE (Sock)) { - - Status = EFI_ACCESS_DENIED; - goto OnExit; - } - - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; - - if (SockTokenExisted (Sock, Event)) { - - Status = EFI_ACCESS_DENIED; - goto OnExit; - } - - Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *) Token; - SockSetState (Sock, SO_CONNECTING); - Status = Sock->ProtoHandler (Sock, SOCK_CONNECT, NULL); - -OnExit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Issue a listen token to get an existed connected network instance - or wait for a connection if there is none. - - @param Sock Pointer to the socket to accept connections. - @param Token The token to accept a connection. - - @retval EFI_SUCCESS Either a connection is accpeted or the Token is - buffered for further acception. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be a passive one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limit. - -**/ -EFI_STATUS -SockAccept ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - EFI_TCP4_LISTEN_TOKEN *ListenToken; - LIST_ENTRY *ListEntry; - EFI_STATUS Status; - SOCKET *Socket; - EFI_EVENT Event; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockAccept: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (!SOCK_IS_LISTENING (Sock)) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; - - if (SockTokenExisted (Sock, Event)) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - ListenToken = (EFI_TCP4_LISTEN_TOKEN *) Token; - - // - // Check if a connection has already in this Sock->ConnectionList - // - NET_LIST_FOR_EACH (ListEntry, &Sock->ConnectionList) { - - Socket = NET_LIST_USER_STRUCT (ListEntry, SOCKET, ConnectionList); - - if (SOCK_IS_CONNECTED (Socket)) { - ListenToken->NewChildHandle = Socket->SockHandle; - SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS); - - RemoveEntryList (ListEntry); - - ASSERT (Socket->Parent != NULL); - - Socket->Parent->ConnCnt--; - - DEBUG ( - (EFI_D_NET, - "SockAccept: Accept a socket, now conncount is %d", - Socket->Parent->ConnCnt) - ); - Socket->Parent = NULL; - - goto Exit; - } - } - - // - // Buffer this token for latter incoming connection request - // - if (NULL == SockBufferToken (Sock, &(Sock->ListenTokenList), Token, 0)) { - - Status = EFI_OUT_OF_RESOURCES; - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - - return Status; -} - - -/** - Issue a token with data to the socket to send out. - - @param Sock Pointer to the socket to process the token with - data. - @param Token The token with data that needs to send out. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockSend ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - SOCK_IO_TOKEN *SndToken; - EFI_EVENT Event; - UINT32 FreeSpace; - EFI_TCP4_TRANSMIT_DATA *TxData; - EFI_STATUS Status; - SOCK_TOKEN *SockToken; - UINT32 DataLen; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockSend: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - SndToken = (SOCK_IO_TOKEN *) Token; - TxData = (EFI_TCP4_TRANSMIT_DATA *) SndToken->Packet.TxData; - - if (SOCK_IS_UNCONFIGURED (Sock)) { - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (!(SOCK_IS_CONNECTING (Sock) || SOCK_IS_CONNECTED (Sock))) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - // - // check if a token is already in the token buffer - // - Event = SndToken->Token.Event; - - if (SockTokenExisted (Sock, Event)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - DataLen = (UINT32) TxData->DataLength; - - // - // process this sending token now or buffer it only? - // - FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF); - - if ((FreeSpace < Sock->SndBuffer.LowWater) || !SOCK_IS_CONNECTED (Sock)) { - - SockToken = SockBufferToken ( - Sock, - &Sock->SndTokenList, - SndToken, - DataLen - ); - - if (NULL == SockToken) { - Status = EFI_OUT_OF_RESOURCES; - } - } else { - - SockToken = SockBufferToken ( - Sock, - &Sock->ProcessingSndTokenList, - SndToken, - DataLen - ); - - if (NULL == SockToken) { - DEBUG ((EFI_D_ERROR, "SockSend: Failed to buffer IO token into" - " socket processing SndToken List\n", Status)); - - Status = EFI_OUT_OF_RESOURCES; - goto Exit; - } - - Status = SockProcessTcpSndData (Sock, TxData); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockSend: Failed to process " - "Snd Data\n", Status)); - - RemoveEntryList (&(SockToken->TokenList)); - FreePool (SockToken); - } - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Issue a token to get data from the socket. - - @param Sock Pointer to the socket to get data from. - @param Token The token to store the received data from the - socket. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_CONNECTION_FIN The connection is closed and there is no more data. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockRcv ( - IN SOCKET *Sock, - IN VOID *Token - ) -{ - SOCK_IO_TOKEN *RcvToken; - UINT32 RcvdBytes; - EFI_STATUS Status; - EFI_EVENT Event; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockRcv: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (!(SOCK_IS_CONNECTED (Sock) || SOCK_IS_CONNECTING (Sock))) { - - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - RcvToken = (SOCK_IO_TOKEN *) Token; - - // - // check if a token is already in the token buffer of this socket - // - Event = RcvToken->Token.Event; - if (SockTokenExisted (Sock, Event)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - RcvToken = (SOCK_IO_TOKEN *) Token; - RcvdBytes = GET_RCV_DATASIZE (Sock); - - // - // check whether an error has happened before - // - if (EFI_ABORTED != Sock->SockError) { - - SIGNAL_TOKEN (&(RcvToken->Token), Sock->SockError); - Sock->SockError = EFI_ABORTED; - goto Exit; - } - - // - // check whether can not receive and there is no any - // data buffered in Sock->RcvBuffer - // - if (SOCK_IS_NO_MORE_DATA (Sock) && (0 == RcvdBytes)) { - - Status = EFI_CONNECTION_FIN; - goto Exit; - } - - if (RcvdBytes != 0) { - SockProcessRcvToken (Sock, RcvToken); - - Status = Sock->ProtoHandler (Sock, SOCK_CONSUMED, NULL); - } else { - - if (NULL == SockBufferToken (Sock, &Sock->RcvTokenList, RcvToken, 0)) { - Status = EFI_OUT_OF_RESOURCES; - } - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Reset the socket and its associated protocol control block. - - @param Sock Pointer to the socket to be flushed. - - @retval EFI_SUCCESS The socket is flushed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockFlush ( - IN SOCKET *Sock - ) -{ - EFI_STATUS Status; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockFlush: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (!SOCK_IS_CONFIGURED (Sock)) { - goto Exit; - } - - Status = Sock->ProtoHandler (Sock, SOCK_FLUSH, NULL); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "SockFlush: Protocol failed handling" - " SOCK_FLUSH with %r", Status)); - - goto Exit; - } - - SOCK_ERROR (Sock, EFI_ABORTED); - SockConnFlush (Sock); - SockSetState (Sock, SO_CLOSED); - - Sock->ConfigureState = SO_UNCONFIGURED; - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Close or abort the socket associated connection. - - @param Sock Pointer to the socket of the connection to close or - abort. - @param Token The token for close operation. - @param OnAbort TRUE for aborting the connection, FALSE to close it. - - @retval EFI_SUCCESS The close or abort operation is initialized - successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockClose ( - IN SOCKET *Sock, - IN VOID *Token, - IN BOOLEAN OnAbort - ) -{ - EFI_STATUS Status; - EFI_EVENT Event; - - ASSERT (SockStream == Sock->Type); - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockClose: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - Status = EFI_NOT_STARTED; - goto Exit; - } - - if (SOCK_IS_DISCONNECTING (Sock)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event; - - if (SockTokenExisted (Sock, Event)) { - Status = EFI_ACCESS_DENIED; - goto Exit; - } - - Sock->CloseToken = Token; - SockSetState (Sock, SO_DISCONNECTING); - - if (OnAbort) { - Status = Sock->ProtoHandler (Sock, SOCK_ABORT, NULL); - } else { - Status = Sock->ProtoHandler (Sock, SOCK_CLOSE, NULL); - } - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} - - -/** - Get the mode data of the low layer protocol. - - @param Sock Pointer to the socket to get mode data from. - @param Mode Pointer to the data to store the low layer mode - information. - - @retval EFI_SUCCESS The mode data is got successfully. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockGetMode ( - IN SOCKET *Sock, - IN OUT VOID *Mode - ) -{ - return Sock->ProtoHandler (Sock, SOCK_MODE, Mode); -} - - - - - -/** - Add or remove route information in IP route table associated - with this socket. - - @param Sock Pointer to the socket associated with the IP route - table to operate on. - @param RouteInfo Pointer to the route information to be processed. - - @retval EFI_SUCCESS The route table is updated successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockRoute ( - IN SOCKET *Sock, - IN VOID *RouteInfo - ) -{ - EFI_STATUS Status; - - Status = EfiAcquireLockOrFail (&(Sock->Lock)); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SockRoute: Get the access for socket" - " failed with %r", Status)); - - return EFI_ACCESS_DENIED; - } - - if (SOCK_IS_NO_MAPPING (Sock)) { - Status = EFI_NO_MAPPING; - goto Exit; - } - - if (SOCK_IS_UNCONFIGURED (Sock)) { - Status = EFI_NOT_STARTED; - goto Exit; - } - - Status = Sock->ProtoHandler (Sock, SOCK_ROUTE, RouteInfo); - -Exit: - EfiReleaseLock (&(Sock->Lock)); - return Status; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c deleted file mode 100644 index a0f97d603171..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c +++ /dev/null @@ -1,717 +0,0 @@ -/** @file - Tcp request dispatcher implementation. - -(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -#define TCP_COMP_VAL(Min, Max, Default, Val) \ - ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default)) - -/** - Add or remove a route entry in the IP route table associated with this TCP instance. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param RouteInfo Pointer to the route info to be processed. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The driver instance has not been started. - @retval EFI_NO_MAPPING When using the default address, configuration(DHCP, - BOOTP, RARP, etc.) is not finished yet. - @retval EFI_OUT_OF_RESOURCES Could not add the entry to the routing table. - @retval EFI_NOT_FOUND This route is not in the routing table - (when RouteInfo->DeleteRoute is TRUE). - @retval EFI_ACCESS_DENIED The route is already defined in the routing table - (when RouteInfo->DeleteRoute is FALSE). -**/ -EFI_STATUS -Tcp4Route ( - IN TCP_CB *Tcb, - IN TCP4_ROUTE_INFO *RouteInfo - ) -{ - EFI_IP4_PROTOCOL *Ip4; - - Ip4 = Tcb->IpInfo->Ip.Ip4; - - ASSERT (Ip4 != NULL); - - return Ip4->Routes ( - Ip4, - RouteInfo->DeleteRoute, - RouteInfo->SubnetAddress, - RouteInfo->SubnetMask, - RouteInfo->GatewayAddress - ); - -} - - -/** - Get the operational settings of this TCP instance. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Mode Pointer to the buffer to store the operational - settings. - - @retval EFI_SUCCESS The mode data is read. - @retval EFI_NOT_STARTED No configuration data is available because this - instance hasn't been started. - -**/ -EFI_STATUS -Tcp4GetMode ( - IN TCP_CB *Tcb, - IN OUT TCP4_MODE_DATA *Mode - ) -{ - SOCKET *Sock; - EFI_TCP4_CONFIG_DATA *ConfigData; - EFI_TCP4_ACCESS_POINT *AccessPoint; - EFI_TCP4_OPTION *Option; - EFI_IP4_PROTOCOL *Ip; - - Sock = Tcb->Sk; - - if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) { - return EFI_NOT_STARTED; - } - - if (Mode->Tcp4State != NULL) { - *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State; - } - - if (Mode->Tcp4ConfigData != NULL) { - - ConfigData = Mode->Tcp4ConfigData; - AccessPoint = &(ConfigData->AccessPoint); - Option = ConfigData->ControlOption; - - ConfigData->TypeOfService = Tcb->Tos; - ConfigData->TimeToLive = Tcb->Ttl; - - AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr; - - IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip); - IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask); - AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port); - - IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip); - AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port); - AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != TCP_LISTEN); - - if (Option != NULL) { - Option->ReceiveBufferSize = GET_RCV_BUFFSIZE (Tcb->Sk); - Option->SendBufferSize = GET_SND_BUFFSIZE (Tcb->Sk); - Option->MaxSynBackLog = GET_BACKLOG (Tcb->Sk); - - Option->ConnectionTimeout = Tcb->ConnectTimeout / TCP_TICK_HZ; - Option->DataRetries = Tcb->MaxRexmit; - Option->FinTimeout = Tcb->FinWait2Timeout / TCP_TICK_HZ; - Option->TimeWaitTimeout = Tcb->TimeWaitTimeout / TCP_TICK_HZ; - Option->KeepAliveProbes = Tcb->MaxKeepAlive; - Option->KeepAliveTime = Tcb->KeepAliveIdle / TCP_TICK_HZ; - Option->KeepAliveInterval = Tcb->KeepAlivePeriod / TCP_TICK_HZ; - - Option->EnableNagle = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE)); - Option->EnableTimeStamp = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)); - Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)); - - Option->EnableSelectiveAck = FALSE; - Option->EnablePathMtuDiscovery = FALSE; - } - } - - Ip = Tcb->IpInfo->Ip.Ip4; - ASSERT (Ip != NULL); - - return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData); -} - - -/** - If AP->StationPort isn't zero, check whether the access point - is registered, else generate a random station port for this - access point. - - @param AP Pointer to the access point. - - @retval EFI_SUCCESS The check is passed or the port is assigned. - @retval EFI_INVALID_PARAMETER The non-zero station port is already used. - @retval EFI_OUT_OF_RESOURCES No port can be allocated. - -**/ -EFI_STATUS -Tcp4Bind ( - IN EFI_TCP4_ACCESS_POINT *AP - ) -{ - BOOLEAN Cycle; - - if (0 != AP->StationPort) { - // - // check if a same endpoint is bound - // - if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) { - - return EFI_INVALID_PARAMETER; - } - } else { - // - // generate a random port - // - Cycle = FALSE; - - if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) { - mTcp4RandomPort = TCP4_PORT_KNOWN; - } - - mTcp4RandomPort++; - - while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) { - - mTcp4RandomPort++; - - if (mTcp4RandomPort <= TCP4_PORT_KNOWN) { - - if (Cycle) { - DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated " - "for this pcb\n")); - - return EFI_OUT_OF_RESOURCES; - } - - mTcp4RandomPort = TCP4_PORT_KNOWN + 1; - - Cycle = TRUE; - } - - } - - AP->StationPort = mTcp4RandomPort; - } - - return EFI_SUCCESS; -} - - -/** - Flush the Tcb add its associated protocols. - - @param Tcb Pointer to the TCP_CB to be flushed. - -**/ -VOID -Tcp4FlushPcb ( - IN TCP_CB *Tcb - ) -{ - SOCKET *Sock; - - IpIoConfigIp (Tcb->IpInfo, NULL); - - Sock = Tcb->Sk; - - if (SOCK_IS_CONFIGURED (Sock)) { - RemoveEntryList (&Tcb->List); - - // - // Uninstall the device path protocol. - // - if (Sock->DevicePath != NULL) { - gBS->UninstallProtocolInterface ( - Sock->SockHandle, - &gEfiDevicePathProtocolGuid, - Sock->DevicePath - ); - FreePool (Sock->DevicePath); - } - } - - NetbufFreeList (&Tcb->SndQue); - NetbufFreeList (&Tcb->RcvQue); - Tcb->State = TCP_CLOSED; -} - -/** - Attach a Pcb to the socket. - - @param Sk Pointer to the socket of this TCP instance. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -Tcp4AttachPcb ( - IN SOCKET *Sk - ) -{ - TCP_CB *Tcb; - TCP4_PROTO_DATA *ProtoData; - IP_IO *IpIo; - EFI_STATUS Status; - VOID *Ip; - - Tcb = AllocateZeroPool (sizeof (TCP_CB)); - - if (Tcb == NULL) { - - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n")); - - return EFI_OUT_OF_RESOURCES; - } - - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; - IpIo = ProtoData->TcpService->IpIo; - - // - // Create an IpInfo for this Tcb. - // - Tcb->IpInfo = IpIoAddIp (IpIo); - if (Tcb->IpInfo == NULL) { - - FreePool (Tcb); - return EFI_OUT_OF_RESOURCES; - } - - // - // Open the new created IP instance BY_CHILD. - // - Status = gBS->OpenProtocol ( - Tcb->IpInfo->ChildHandle, - &gEfiIp4ProtocolGuid, - &Ip, - IpIo->Image, - Sk->SockHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - if (EFI_ERROR (Status)) { - IpIoRemoveIp (IpIo, Tcb->IpInfo); - return Status; - } - - InitializeListHead (&Tcb->List); - InitializeListHead (&Tcb->SndQue); - InitializeListHead (&Tcb->RcvQue); - - Tcb->State = TCP_CLOSED; - Tcb->Sk = Sk; - ProtoData->TcpPcb = Tcb; - - return EFI_SUCCESS; -} - -/** - Detach the Pcb of the socket. - - @param Sk Pointer to the socket of this TCP instance. - -**/ -VOID -Tcp4DetachPcb ( - IN SOCKET *Sk - ) -{ - TCP4_PROTO_DATA *ProtoData; - TCP_CB *Tcb; - - ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved; - Tcb = ProtoData->TcpPcb; - - ASSERT (Tcb != NULL); - - Tcp4FlushPcb (Tcb); - - IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo); - - FreePool (Tcb); - - ProtoData->TcpPcb = NULL; -} - - -/** - Configure the Pcb using CfgData. - - @param Sk Pointer to the socket of this TCP instance. - @param CfgData Pointer to the TCP configuration data. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_INVALID_PARAMETER A same access point has been configured in - another TCP instance. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -Tcp4ConfigurePcb ( - IN SOCKET *Sk, - IN EFI_TCP4_CONFIG_DATA *CfgData - ) -{ - EFI_IP4_CONFIG_DATA IpCfgData; - EFI_STATUS Status; - EFI_TCP4_OPTION *Option; - TCP4_PROTO_DATA *TcpProto; - TCP_CB *Tcb; - - ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != NULL)); - - TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved; - Tcb = TcpProto->TcpPcb; - - ASSERT (Tcb != NULL); - - // - // Add Ip for send pkt to the peer - // - CopyMem (&IpCfgData, &mIp4IoDefaultIpConfigData, sizeof (IpCfgData)); - IpCfgData.DefaultProtocol = EFI_IP_PROTO_TCP; - IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress; - IpCfgData.StationAddress = CfgData->AccessPoint.StationAddress; - IpCfgData.SubnetMask = CfgData->AccessPoint.SubnetMask; - IpCfgData.ReceiveTimeout = (UINT32) (-1); - - // - // Configure the IP instance this Tcb consumes. - // - Status = IpIoConfigIp (Tcb->IpInfo, &IpCfgData); - if (EFI_ERROR (Status)) { - goto OnExit; - } - - // - // Get the default address info if the instance is configured to use default address. - // - if (CfgData->AccessPoint.UseDefaultAddress) { - CfgData->AccessPoint.StationAddress = IpCfgData.StationAddress; - CfgData->AccessPoint.SubnetMask = IpCfgData.SubnetMask; - } - - // - // check if we can bind this endpoint in CfgData - // - Status = Tcp4Bind (&(CfgData->AccessPoint)); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed " - "with %r\n", Status)); - - goto OnExit; - } - - // - // Initalize the operating information in this Tcb - // - ASSERT (Tcb->State == TCP_CLOSED && - IsListEmpty (&Tcb->SndQue) && - IsListEmpty (&Tcb->RcvQue)); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); - Tcb->State = TCP_CLOSED; - - Tcb->SndMss = 536; - Tcb->RcvMss = TcpGetRcvMss (Sk); - - Tcb->SRtt = 0; - Tcb->Rto = 3 * TCP_TICK_HZ; - - Tcb->CWnd = Tcb->SndMss; - Tcb->Ssthresh = 0xffffffff; - - Tcb->CongestState = TCP_CONGEST_OPEN; - - Tcb->KeepAliveIdle = TCP_KEEPALIVE_IDLE_MIN; - Tcb->KeepAlivePeriod = TCP_KEEPALIVE_PERIOD; - Tcb->MaxKeepAlive = TCP_MAX_KEEPALIVE; - Tcb->MaxRexmit = TCP_MAX_LOSS; - Tcb->FinWait2Timeout = TCP_FIN_WAIT2_TIME; - Tcb->TimeWaitTimeout = TCP_TIME_WAIT_TIME; - Tcb->ConnectTimeout = TCP_CONNECT_TIME; - - // - // initialize Tcb in the light of CfgData - // - Tcb->Ttl = CfgData->TimeToLive; - Tcb->Tos = CfgData->TypeOfService; - - Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress; - - CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR)); - Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort); - IP4_COPY_ADDRESS (&Tcb->SubnetMask, &CfgData->AccessPoint.SubnetMask); - - if (CfgData->AccessPoint.ActiveFlag) { - CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR)); - Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort); - } else { - Tcb->RemoteEnd.Ip = 0; - Tcb->RemoteEnd.Port = 0; - } - - Option = CfgData->ControlOption; - - if (Option != NULL) { - SET_RCV_BUFFSIZE ( - Sk, - (UINT32) (TCP_COMP_VAL ( - TCP_RCV_BUF_SIZE_MIN, - TCP_RCV_BUF_SIZE, - TCP_RCV_BUF_SIZE, - Option->ReceiveBufferSize - ) - ) - ); - SET_SND_BUFFSIZE ( - Sk, - (UINT32) (TCP_COMP_VAL ( - TCP_SND_BUF_SIZE_MIN, - TCP_SND_BUF_SIZE, - TCP_SND_BUF_SIZE, - Option->SendBufferSize - ) - ) - ); - - SET_BACKLOG ( - Sk, - (UINT32) (TCP_COMP_VAL ( - TCP_BACKLOG_MIN, - TCP_BACKLOG, - TCP_BACKLOG, - Option->MaxSynBackLog - ) - ) - ); - - Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL ( - TCP_MAX_LOSS_MIN, - TCP_MAX_LOSS, - TCP_MAX_LOSS, - Option->DataRetries - ); - Tcb->FinWait2Timeout = TCP_COMP_VAL ( - TCP_FIN_WAIT2_TIME, - TCP_FIN_WAIT2_TIME_MAX, - TCP_FIN_WAIT2_TIME, - (UINT32) (Option->FinTimeout * TCP_TICK_HZ) - ); - - if (Option->TimeWaitTimeout != 0) { - Tcb->TimeWaitTimeout = TCP_COMP_VAL ( - TCP_TIME_WAIT_TIME, - TCP_TIME_WAIT_TIME_MAX, - TCP_TIME_WAIT_TIME, - (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ) - ); - } else { - Tcb->TimeWaitTimeout = 0; - } - - if (Option->KeepAliveProbes != 0) { - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE); - - Tcb->MaxKeepAlive = (UINT8) TCP_COMP_VAL ( - TCP_MAX_KEEPALIVE_MIN, - TCP_MAX_KEEPALIVE, - TCP_MAX_KEEPALIVE, - Option->KeepAliveProbes - ); - Tcb->KeepAliveIdle = TCP_COMP_VAL ( - TCP_KEEPALIVE_IDLE_MIN, - TCP_KEEPALIVE_IDLE_MAX, - TCP_KEEPALIVE_IDLE_MIN, - (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ) - ); - Tcb->KeepAlivePeriod = TCP_COMP_VAL ( - TCP_KEEPALIVE_PERIOD_MIN, - TCP_KEEPALIVE_PERIOD, - TCP_KEEPALIVE_PERIOD, - (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ) - ); - } - - Tcb->ConnectTimeout = TCP_COMP_VAL ( - TCP_CONNECT_TIME_MIN, - TCP_CONNECT_TIME, - TCP_CONNECT_TIME, - (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ) - ); - - if (!Option->EnableNagle) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE); - } - - if (!Option->EnableTimeStamp) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS); - } - - if (!Option->EnableWindowScaling) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS); - } - } - - // - // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is - // determined, construct the IP device path and install it. - // - Status = TcpInstallDevicePath (Sk); - if (EFI_ERROR (Status)) { - goto OnExit; - } - - // - // update state of Tcb and socket - // - if (!CfgData->AccessPoint.ActiveFlag) { - - TcpSetState (Tcb, TCP_LISTEN); - SockSetState (Sk, SO_LISTENING); - - Sk->ConfigureState = SO_CONFIGURED_PASSIVE; - } else { - - Sk->ConfigureState = SO_CONFIGURED_ACTIVE; - } - - TcpInsertTcb (Tcb); - -OnExit: - - return Status; -} - - -/** - The procotol handler provided to the socket layer, used to - dispatch the socket level requests by calling the corresponding - TCP layer functions. - - @param Sock Pointer to the socket of this TCP instance. - @param Request The code of this operation request. - @param Data Pointer to the operation specific data passed in - together with the operation request. - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN UINT8 Request, - IN VOID *Data OPTIONAL - ) -{ - TCP_CB *Tcb; - TCP4_PROTO_DATA *ProtoData; - EFI_IP4_PROTOCOL *Ip; - - ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - Tcb = ProtoData->TcpPcb; - - switch (Request) { - case SOCK_POLL: - Ip = ProtoData->TcpService->IpIo->Ip.Ip4; - Ip->Poll (Ip); - break; - - case SOCK_CONSUMED: - // - // After user received data from socket buffer, socket will - // notify TCP using this message to give it a chance to send out - // window update information - // - ASSERT (Tcb != NULL); - TcpOnAppConsume (Tcb); - break; - - case SOCK_SND: - - ASSERT (Tcb != NULL); - TcpOnAppSend (Tcb); - break; - - case SOCK_CLOSE: - - TcpOnAppClose (Tcb); - - break; - - case SOCK_ABORT: - - TcpOnAppAbort (Tcb); - - break; - - case SOCK_SNDPUSH: - Tcb->SndPsh = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); - - break; - - case SOCK_SNDURG: - Tcb->SndUp = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk) - 1; - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); - - break; - - case SOCK_CONNECT: - - TcpOnAppConnect (Tcb); - - break; - - case SOCK_ATTACH: - - return Tcp4AttachPcb (Sock); - - case SOCK_FLUSH: - - Tcp4FlushPcb (Tcb); - - break; - - case SOCK_DETACH: - - Tcp4DetachPcb (Sock); - - break; - - case SOCK_CONFIGURE: - - return Tcp4ConfigurePcb ( - Sock, - (EFI_TCP4_CONFIG_DATA *) Data - ); - - case SOCK_MODE: - - ASSERT ((Data != NULL) && (Tcb != NULL)); - - return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data); - - case SOCK_ROUTE: - - ASSERT ((Data != NULL) && (Tcb != NULL)); - - return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data); - - default: - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; - -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c deleted file mode 100644 index 2ff8eee8693b..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c +++ /dev/null @@ -1,782 +0,0 @@ -/** @file - Tcp driver function. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - - -UINT16 mTcp4RandomPort; -extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2; -extern EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable; - -TCP4_HEARTBEAT_TIMER mTcp4Timer = { - NULL, - 0 -}; - -EFI_TCP4_PROTOCOL mTcp4ProtocolTemplate = { - Tcp4GetModeData, - Tcp4Configure, - Tcp4Routes, - Tcp4Connect, - Tcp4Accept, - Tcp4Transmit, - Tcp4Receive, - Tcp4Close, - Tcp4Cancel, - Tcp4Poll -}; - -SOCK_INIT_DATA mTcp4DefaultSockData = { - SockStream, - 0, - NULL, - TCP_BACKLOG, - TCP_SND_BUF_SIZE, - TCP_RCV_BUF_SIZE, - &mTcp4ProtocolTemplate, - Tcp4CreateSocketCallback, - Tcp4DestroySocketCallback, - NULL, - NULL, - 0, - Tcp4Dispatcher, - NULL, -}; - -EFI_DRIVER_BINDING_PROTOCOL mTcp4DriverBinding = { - Tcp4DriverBindingSupported, - Tcp4DriverBindingStart, - Tcp4DriverBindingStop, - 0xa, - NULL, - NULL -}; - -EFI_SERVICE_BINDING_PROTOCOL mTcp4ServiceBinding = { - Tcp4ServiceBindingCreateChild, - Tcp4ServiceBindingDestroyChild -}; - - -/** - Create and start the heartbeat timer for TCP driver. - - @retval EFI_SUCCESS The timer is successfully created and started. - @retval other The timer is not created. - -**/ -EFI_STATUS -Tcp4CreateTimer ( - VOID - ) -{ - EFI_STATUS Status; - - Status = EFI_SUCCESS; - - if (mTcp4Timer.RefCnt == 0) { - - Status = gBS->CreateEvent ( - EVT_TIMER | EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - TcpTicking, - NULL, - &mTcp4Timer.TimerEvent - ); - if (!EFI_ERROR (Status)) { - - Status = gBS->SetTimer ( - mTcp4Timer.TimerEvent, - TimerPeriodic, - (UINT64) (TICKS_PER_SECOND / TCP_TICK_HZ) - ); - } - } - - if (!EFI_ERROR (Status)) { - - mTcp4Timer.RefCnt++; - } - - return Status; -} - - -/** - Stop and destroy the heartbeat timer for TCP driver. - -**/ -VOID -Tcp4DestroyTimer ( - VOID - ) -{ - ASSERT (mTcp4Timer.RefCnt > 0); - - mTcp4Timer.RefCnt--; - - if (mTcp4Timer.RefCnt > 0) { - return; - } - - gBS->SetTimer (mTcp4Timer.TimerEvent, TimerCancel, 0); - gBS->CloseEvent (mTcp4Timer.TimerEvent); - mTcp4Timer.TimerEvent = NULL; -} - -/** - Callback function which provided by user to remove one node in NetDestroyLinkList process. - - @param[in] Entry The entry to be removed. - @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList. - - @retval EFI_SUCCESS The entry has been removed successfully. - @retval Others Fail to remove the entry. - -**/ -EFI_STATUS -EFIAPI -Tcp4DestroyChildEntryInHandleBuffer ( - IN LIST_ENTRY *Entry, - IN VOID *Context - ) -{ - SOCKET *Sock; - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; - UINTN NumberOfChildren; - EFI_HANDLE *ChildHandleBuffer; - - if (Entry == NULL || Context == NULL) { - return EFI_INVALID_PARAMETER; - } - - Sock = NET_LIST_USER_STRUCT_S (Entry, SOCKET, Link, SOCK_SIGNATURE); - ServiceBinding = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding; - NumberOfChildren = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren; - ChildHandleBuffer = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer; - - if (!NetIsInHandleBuffer (Sock->SockHandle, NumberOfChildren, ChildHandleBuffer)) { - return EFI_SUCCESS; - } - - return ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle); -} - -/** - The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle. - - @param ImageHandle The firmware allocated handle for this - driver image. - @param SystemTable Pointer to the EFI system table. - - @retval EFI_SUCCESS Driver loaded. - @retval other Driver not loaded. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - UINT32 Seed; - - // - // Install the TCP4 Driver Binding Protocol - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &mTcp4DriverBinding, - ImageHandle, - &gTcp4ComponentName, - &gTcp4ComponentName2 - ); - ASSERT_EFI_ERROR (Status); - // - // Initialize ISS and random port. - // - Seed = NetRandomInitSeed (); - mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; - mTcp4RandomPort = (UINT16) (TCP4_PORT_KNOWN + - (UINT16) (NET_RANDOM(Seed) % TCP4_PORT_KNOWN)); - - return Status; -} - - -/** - Tests to see if this driver supports a given controller. - - If a child device is provided, it further tests to see if this driver supports - creating a handle for the specified child device. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver - specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by - the driver specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a - different driver or an application that requires - exclusive access. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver - specified by This. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - - // - // Test for the Tcp4ServiceBinding Protocol - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - return EFI_ALREADY_STARTED; - } - - // - // Test for the Ip4 Protocol - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiIp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - - return Status; -} - - -/** - Start this driver on ControllerHandle. - - The Start() function is designed to be invoked from the EFI boot service - ConnectController(). As a result, much of the error checking on the parameters - to Start() has been moved into this common boot service. It is legal to call - Start() from other locations, but the following calling restrictions must be - followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally - aligned EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified - by This must have been called with the same calling parameters, and Supported() - must have returned EFI_SUCCESS. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is - optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_ALREADY_STARTED The device could not be started due to a device error. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack - of resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ) -{ - EFI_STATUS Status; - TCP4_SERVICE_DATA *TcpServiceData; - IP_IO_OPEN_DATA OpenData; - - TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA)); - - if (NULL == TcpServiceData) { - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" - " resource to create a Tcp Servcie Data\n")); - - return EFI_OUT_OF_RESOURCES; - } - - // - // Create a new IP IO to Consume it - // - TcpServiceData->IpIo = IpIoCreate ( - This->DriverBindingHandle, - ControllerHandle, - IP_VERSION_4 - ); - if (NULL == TcpServiceData->IpIo) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough" - " resource to create an Ip Io\n")); - - Status = EFI_OUT_OF_RESOURCES; - goto ON_ERROR; - } - - // - // Configure and start IpIo. - // - ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA)); - - CopyMem ( - &OpenData.IpConfigData.Ip4CfgData, - &mIp4IoDefaultIpConfigData, - sizeof (EFI_IP4_CONFIG_DATA) - ); - - OpenData.IpConfigData.Ip4CfgData.DefaultProtocol = EFI_IP_PROTO_TCP; - - OpenData.PktRcvdNotify = Tcp4RxCallback; - Status = IpIoOpen (TcpServiceData->IpIo, &OpenData); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Create the timer event used by TCP driver - // - Status = Tcp4CreateTimer (); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer" - " Event failed with %r\n", Status)); - - goto ON_ERROR; - } - - // - // Install the Tcp4ServiceBinding Protocol on the - // controller handle - // - TcpServiceData->Tcp4ServiceBinding = mTcp4ServiceBinding; - - Status = gBS->InstallMultipleProtocolInterfaces ( - &ControllerHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - &TcpServiceData->Tcp4ServiceBinding, - NULL - ); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service Binding" - " Protocol failed for %r\n", Status)); - - Tcp4DestroyTimer (); - goto ON_ERROR; - } - - // - // Initialize member in TcpServiceData - // - TcpServiceData->ControllerHandle = ControllerHandle; - TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE; - TcpServiceData->DriverBindingHandle = This->DriverBindingHandle; - - InitializeListHead (&TcpServiceData->SocketList); - - return EFI_SUCCESS; - -ON_ERROR: - - if (TcpServiceData->IpIo != NULL) { - IpIoDestroy (TcpServiceData->IpIo); - TcpServiceData->IpIo = NULL; - } - - FreePool (TcpServiceData); - - return Status; -} - - -/** - Stop this driver on ControllerHandle. - - The Stop() function is designed to be invoked from the EFI boot service - DisconnectController(). As a result, much of the error checking on the parameters - to Stop() has been moved into this common boot service. It is legal to call Stop() - from other locations, but the following calling restrictions must be followed - or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call - to this same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this - driver's Start() function, and the Start() function must have called OpenProtocol() - on ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param NumberOfChildren The number of child device handles in ChildHandleBuffer. - @param ChildHandleBuffer An array of child handles to be freed. May be NULL if - NumberOfChildren is 0. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -{ - EFI_STATUS Status; - EFI_HANDLE NicHandle; - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; - TCP4_SERVICE_DATA *TcpServiceData; - LIST_ENTRY *List; - TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context; - - // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed. - // - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); - if (NicHandle == NULL) { - return EFI_SUCCESS; - } - - // - // Retrieve the TCP driver Data Structure - // - Status = gBS->OpenProtocol ( - NicHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - (VOID **) &ServiceBinding, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service " - " Binding Protocol failed with %r\n", Status)); - - return EFI_DEVICE_ERROR; - } - - TcpServiceData = TCP4_FROM_THIS (ServiceBinding); - - if (NumberOfChildren != 0) { - List = &TcpServiceData->SocketList; - Context.ServiceBinding = ServiceBinding; - Context.NumberOfChildren = NumberOfChildren; - Context.ChildHandleBuffer = ChildHandleBuffer; - Status = NetDestroyLinkList ( - List, - Tcp4DestroyChildEntryInHandleBuffer, - &Context, - NULL - ); - } else if (IsListEmpty (&TcpServiceData->SocketList)) { - // - // Uninstall TCP servicebinding protocol - // - gBS->UninstallMultipleProtocolInterfaces ( - NicHandle, - &gEfiTcp4ServiceBindingProtocolGuid, - ServiceBinding, - NULL - ); - - // - // Destroy the IpIO consumed by TCP driver - // - IpIoDestroy (TcpServiceData->IpIo); - TcpServiceData->IpIo = NULL; - - // - // Destroy the heartbeat timer. - // - Tcp4DestroyTimer (); - - if (gTcpControllerNameTable != NULL) { - FreeUnicodeStringTable (gTcpControllerNameTable); - gTcpControllerNameTable = NULL; - } - - // - // Release the TCP service data - // - FreePool (TcpServiceData); - - Status = EFI_SUCCESS; - } - - return Status; -} - -/** - Open Ip4 and device path protocols for a created socket, and insert it in - socket list. - - @param This Pointer to the socket just created - @param Context Context of the socket - - @retval EFI_SUCCESS This protocol is installed successfully. - @retval other Some error occured. - -**/ -EFI_STATUS -Tcp4CreateSocketCallback ( - IN SOCKET *This, - IN VOID *Context - ) -{ - EFI_STATUS Status; - TCP4_SERVICE_DATA *TcpServiceData; - EFI_IP4_PROTOCOL *Ip4; - - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService; - - // - // Open the default Ip4 protocol of IP_IO BY_DRIVER. - // - Status = gBS->OpenProtocol ( - TcpServiceData->IpIo->ChildHandle, - &gEfiIp4ProtocolGuid, - (VOID **) &Ip4, - TcpServiceData->DriverBindingHandle, - This->SockHandle, - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Open the device path on the handle where service binding resides on. - // - Status = gBS->OpenProtocol ( - TcpServiceData->ControllerHandle, - &gEfiDevicePathProtocolGuid, - (VOID **) &This->ParentDevicePath, - TcpServiceData->DriverBindingHandle, - This->SockHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - gBS->CloseProtocol ( - TcpServiceData->IpIo->ChildHandle, - &gEfiIp4ProtocolGuid, - TcpServiceData->DriverBindingHandle, - This->SockHandle - ); - } else { - // - // Insert this socket into the SocketList. - // - InsertTailList (&TcpServiceData->SocketList, &This->Link); - } - - return Status; -} - -/** - Close Ip4 and device path protocols for a socket, and remove it from socket list. - - @param This Pointer to the socket to be removed - @param Context Context of the socket - -**/ -VOID -Tcp4DestroySocketCallback ( - IN SOCKET *This, - IN VOID *Context - ) -{ - TCP4_SERVICE_DATA *TcpServiceData; - - TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService; - - // - // Remove this node from the list. - // - RemoveEntryList (&This->Link); - - // - // Close the Ip4 protocol. - // - gBS->CloseProtocol ( - TcpServiceData->IpIo->ChildHandle, - &gEfiIp4ProtocolGuid, - TcpServiceData->DriverBindingHandle, - This->SockHandle - ); -} - -/** - Creates a child handle and installs a protocol. - - The CreateChild() function installs a protocol on ChildHandle. If ChildHandle - is a pointer to NULL, then a new handle is created and returned in ChildHandle. - If ChildHandle is not a pointer to NULL, then the protocol installs on the existing - ChildHandle. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Pointer to the handle of the child to create. If it is NULL, then - a new handle is created. If it is a pointer to an existing UEFI - handle, then the protocol is added to the existing UEFI handle. - - @retval EFI_SUCCES The protocol was added to ChildHandle. - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. - @retval EFI_OUT_OF_RESOURCES There are not enough resources available to create - the child. - @retval other The child handle was not created. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN OUT EFI_HANDLE *ChildHandle - ) -{ - SOCKET *Sock; - TCP4_SERVICE_DATA *TcpServiceData; - TCP4_PROTO_DATA TcpProto; - EFI_STATUS Status; - EFI_TPL OldTpl; - - if (NULL == This || NULL == ChildHandle) { - return EFI_INVALID_PARAMETER; - } - - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); - Status = EFI_SUCCESS; - TcpServiceData = TCP4_FROM_THIS (This); - TcpProto.TcpService = TcpServiceData; - TcpProto.TcpPcb = NULL; - - // - // Create a tcp instance with defualt Tcp default - // sock init data and TcpProto - // - mTcp4DefaultSockData.ProtoData = &TcpProto; - mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA); - mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle; - - Sock = SockCreateChild (&mTcp4DefaultSockData); - if (NULL == Sock) { - DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: " - "No resource to create a Tcp Child\n")); - - Status = EFI_OUT_OF_RESOURCES; - } else { - *ChildHandle = Sock->SockHandle; - } - - mTcp4DefaultSockData.ProtoData = NULL; - - gBS->RestoreTPL (OldTpl); - return Status; -} - - -/** - Destroys a child handle with a protocol installed on it. - - The DestroyChild() function does the opposite of CreateChild(). It removes a protocol - that was installed by CreateChild() from ChildHandle. If the removed protocol is the - last protocol on ChildHandle, then ChildHandle is destroyed. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Handle of the child to destroy - - @retval EFI_SUCCES The protocol was removed from ChildHandle. - @retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is - being removed. - @retval EFI_INVALID_PARAMETER Child handle is NULL. - @retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle - because its services are being used. - @retval other The child handle was not destroyed. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ) -{ - EFI_STATUS Status; - EFI_TCP4_PROTOCOL *Tcp4; - SOCKET *Sock; - - if (NULL == This || NULL == ChildHandle) { - return EFI_INVALID_PARAMETER; - } - - // - // retrieve the Tcp4 protocol from ChildHandle - // - Status = gBS->OpenProtocol ( - ChildHandle, - &gEfiTcp4ProtocolGuid, - (VOID **) &Tcp4, - mTcp4DriverBinding.DriverBindingHandle, - ChildHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - Status = EFI_UNSUPPORTED; - } else { - // - // destroy this sock and related Tcp protocol control - // block - // - Sock = SOCK_FROM_THIS (Tcp4); - - SockDestroyChild (Sock); - } - - return Status; -} - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c deleted file mode 100644 index f48efdac7cd8..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c +++ /dev/null @@ -1,1497 +0,0 @@ -/** @file - TCP input process routines. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Tcp4Main.h" - - -/** - Check whether the sequence number of the incoming segment is acceptable. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the incoming segment. - - @retval 1 The sequence number is acceptable. - @retval 0 The sequence number is not acceptable. - -**/ -INTN -TcpSeqAcceptable ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg - ) -{ - return (TCP_SEQ_LEQ (Tcb->RcvNxt, Seg->End) && - TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd)); -} - - -/** - NewReno fast recovery, RFC3782. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast recovery. - -**/ -VOID -TcpFastRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ) -{ - UINT32 FlightSize; - UINT32 Acked; - - // - // Step 1: Three duplicate ACKs and not in fast recovery - // - if (Tcb->CongestState != TCP_CONGEST_RECOVER) { - - // - // Step 1A: Invoking fast retransmission. - // - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); - - Tcb->Ssthresh = MAX (FlightSize >> 1, (UINT32) (2 * Tcb->SndMss)); - Tcb->Recover = Tcb->SndNxt; - - Tcb->CongestState = TCP_CONGEST_RECOVER; - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - - // - // Step 2: Entering fast retransmission - // - TcpRetransmit (Tcb, Tcb->SndUna); - Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss; - - DEBUG ((EFI_D_NET, "TcpFastRecover: enter fast retransmission" - " for TCB %p, recover point is %d\n", Tcb, Tcb->Recover)); - return; - } - - // - // During fast recovery, execute Step 3, 4, 5 of RFC3782 - // - if (Seg->Ack == Tcb->SndUna) { - - // - // Step 3: Fast Recovery, - // If this is a duplicated ACK, increse Cwnd by SMSS. - // - - // Step 4 is skipped here only to be executed later - // by TcpToSendData - // - Tcb->CWnd += Tcb->SndMss; - DEBUG ((EFI_D_NET, "TcpFastRecover: received another" - " duplicated ACK (%d) for TCB %p\n", Seg->Ack, Tcb)); - - } else { - - // - // New data is ACKed, check whether it is a - // full ACK or partial ACK - // - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) { - - // - // Step 5 - Full ACK: - // deflate the congestion window, and exit fast recovery - // - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); - - Tcb->CWnd = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss); - - Tcb->CongestState = TCP_CONGEST_OPEN; - DEBUG ((EFI_D_NET, "TcpFastRecover: received a full ACK(%d)" - " for TCB %p, exit fast recovery\n", Seg->Ack, Tcb)); - - } else { - - // - // Step 5 - Partial ACK: - // fast retransmit the first unacknowledge field - // , then deflate the CWnd - // - TcpRetransmit (Tcb, Seg->Ack); - Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna); - - // - // Deflate the CWnd by the amount of new data - // ACKed by SEG.ACK. If more than one SMSS data - // is ACKed, add back SMSS byte to CWnd after - // - if (Acked >= Tcb->SndMss) { - Acked -= Tcb->SndMss; - - } - - Tcb->CWnd -= Acked; - - DEBUG ((EFI_D_NET, "TcpFastRecover: received a partial" - " ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); - - } - } -} - - -/** - NewReno fast loss recovery, RFC3792. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast loss recovery. - -**/ -VOID -TcpFastLossRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ) -{ - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { - - // - // New data is ACKed, check whether it is a - // full ACK or partial ACK - // - if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) { - - // - // Full ACK: exit the loss recovery. - // - Tcb->LossTimes = 0; - Tcb->CongestState = TCP_CONGEST_OPEN; - - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " - "full ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); - - } else { - - // - // Partial ACK: - // fast retransmit the first unacknowledge field. - // - TcpRetransmit (Tcb, Seg->Ack); - DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a " - "partial ACK(%d) for TCB %p\n", Seg->Ack, Tcb)); - } - } -} - - -/** - Compute the RTT as specified in RFC2988. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Measure Currently measured RTT in heart beats. - -**/ -VOID -TcpComputeRtt ( - IN OUT TCP_CB *Tcb, - IN UINT32 Measure - ) -{ - INT32 Var; - - // - // Step 2.3: Compute the RTO for subsequent RTT measurement. - // - if (Tcb->SRtt != 0) { - - Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT); - - if (Var < 0) { - Var = -Var; - } - - Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2; - Tcb->SRtt = 7 * (Tcb->SRtt >> 3) + Measure; - - } else { - // - // Step 2.2: compute the first RTT measure - // - Tcb->SRtt = Measure << TCP_RTT_SHIFT; - Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1); - } - - Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT; - - // - // Step 2.4: Limit the RTO to at least 1 second - // Step 2.5: Limit the RTO to a maxium value that - // is at least 60 second - // - if (Tcb->Rto < TCP_RTO_MIN) { - Tcb->Rto = TCP_RTO_MIN; - - } else if (Tcb->Rto > TCP_RTO_MAX) { - Tcb->Rto = TCP_RTO_MAX; - - } - - DEBUG ((EFI_D_NET, "TcpComputeRtt: new RTT for TCB %p" - " computed SRTT: %d RTTVAR: %d RTO: %d\n", - Tcb, Tcb->SRtt, Tcb->RttVar, Tcb->Rto)); - -} - - -/** - Trim the data, SYN and FIN to fit into the window defined by Left and Right. - - @param Nbuf Buffer that contains received TCP segment without IP header. - @param Left The sequence number of the window's left edge. - @param Right The sequence number of the window's right edge. - -**/ -VOID -TcpTrimSegment ( - IN NET_BUF *Nbuf, - IN TCP_SEQNO Left, - IN TCP_SEQNO Right - ) -{ - TCP_SEG *Seg; - TCP_SEQNO Urg; - UINT32 Drop; - - Seg = TCPSEG_NETBUF (Nbuf); - - // - // If the segment is completely out of window, - // truncate every thing, include SYN and FIN. - // - if (TCP_SEQ_LEQ (Seg->End, Left) || TCP_SEQ_LEQ (Right, Seg->Seq)) { - - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); - - Seg->Seq = Seg->End; - NetbufTrim (Nbuf, Nbuf->TotalSize, NET_BUF_HEAD); - return; - } - - // - // Adjust the buffer header - // - if (TCP_SEQ_LT (Seg->Seq, Left)) { - - Drop = TCP_SUB_SEQ (Left, Seg->Seq); - Urg = Seg->Seq + Seg->Urg; - Seg->Seq = Left; - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN); - Drop--; - } - - // - // Adjust the urgent point - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG)) { - - if (TCP_SEQ_LT (Urg, Seg->Seq)) { - - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); - } else { - Seg->Urg = (UINT16) TCP_SUB_SEQ (Urg, Seg->Seq); - } - } - - if (Drop != 0) { - NetbufTrim (Nbuf, Drop, NET_BUF_HEAD); - } - } - - // - // Adjust the buffer tail - // - if (TCP_SEQ_GT (Seg->End, Right)) { - - Drop = TCP_SUB_SEQ (Seg->End, Right); - Seg->End = Right; - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN); - Drop--; - } - - if (Drop != 0) { - NetbufTrim (Nbuf, Drop, NET_BUF_TAIL); - } - } - - ASSERT (TcpVerifySegment (Nbuf) != 0); -} - - -/** - Trim off the data outside the tcb's receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the NET_BUF containing the received tcp segment. - -**/ -VOID -TcpTrimInWnd ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd); -} - - -/** - Process the data and FIN flag, check whether to deliver - data to the socket layer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 No error occurred to deliver data. - @retval -1 Error condition occurred. Proper response is to reset the - connection. - -**/ -INTN -TcpDeliverData ( - IN OUT TCP_CB *Tcb - ) -{ - LIST_ENTRY *Entry; - NET_BUF *Nbuf; - TCP_SEQNO Seq; - TCP_SEG *Seg; - UINT32 Urgent; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - // - // make sure there is some data queued, - // and TCP is in a proper state - // - if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) { - - return 0; - } - - // - // Deliver data to the socket layer - // - Entry = Tcb->RcvQue.ForwardLink; - Seq = Tcb->RcvNxt; - - while (Entry != &Tcb->RcvQue) { - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - Seg = TCPSEG_NETBUF (Nbuf); - - ASSERT (TcpVerifySegment (Nbuf) != 0); - ASSERT (Nbuf->Tcp == NULL); - - if (TCP_SEQ_GT (Seg->Seq, Seq)) { - break; - } - - Entry = Entry->ForwardLink; - Seq = Seg->End; - Tcb->RcvNxt = Seq; - - RemoveEntryList (&Nbuf->List); - - // - // RFC793 Eighth step: process FIN in sequence - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - - // - // The peer sends to us junky data after FIN, - // reset the connection. - // - if (!IsListEmpty (&Tcb->RcvQue)) { - DEBUG ((EFI_D_ERROR, "TcpDeliverData: data received after" - " FIN from peer of TCB %p, reset connection\n", Tcb)); - - NetbufFree (Nbuf); - return -1; - } - - DEBUG ((EFI_D_NET, "TcpDeliverData: processing FIN " - "from peer of TCB %p\n", Tcb)); - - switch (Tcb->State) { - case TCP_SYN_RCVD: - case TCP_ESTABLISHED: - - TcpSetState (Tcb, TCP_CLOSE_WAIT); - break; - - case TCP_FIN_WAIT_1: - - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_CLOSING); - break; - } - - // - // fall through - // - case TCP_FIN_WAIT_2: - - TcpSetState (Tcb, TCP_TIME_WAIT); - TcpClearAllTimer (Tcb); - - if (Tcb->TimeWaitTimeout != 0) { - - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); - } else { - - DEBUG ((EFI_D_WARN, "Connection closed immediately " - "because app disables TIME_WAIT timer for %p\n", Tcb)); - - TcpSendAck (Tcb); - TcpClose (Tcb); - } - break; - - case TCP_CLOSE_WAIT: - case TCP_CLOSING: - case TCP_LAST_ACK: - case TCP_TIME_WAIT: - // - // The peer sends to us junk FIN byte. Discard - // the buffer then reset the connection - // - NetbufFree (Nbuf); - return -1; - default: - break; - } - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - - Seg->End--; - } - - // - // Don't delay the ack if PUSH flag is on. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_PSH)) { - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - } - - if (Nbuf->TotalSize != 0) { - Urgent = 0; - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && - TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp)) { - - if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) { - Urgent = Nbuf->TotalSize; - } else { - Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1; - } - } - - SockDataRcvd (Tcb->Sk, Nbuf, Urgent); - } - - if (TCP_FIN_RCVD (Tcb->State)) { - - SockNoMoreData (Tcb->Sk); - } - - NetbufFree (Nbuf); - } - - return 0; -} - - -/** - Store the data into the reassemble queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer containing the data to be queued. - -**/ -VOID -TcpQueueData ( - IN OUT TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - TCP_SEG *Seg; - LIST_ENTRY *Head; - LIST_ENTRY *Prev; - LIST_ENTRY *Cur; - NET_BUF *Node; - - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); - - NET_GET_REF (Nbuf); - - Seg = TCPSEG_NETBUF (Nbuf); - Head = &Tcb->RcvQue; - - // - // Fast path to process normal case. That is, - // no out-of-order segments are received. - // - if (IsListEmpty (Head)) { - - InsertTailList (Head, &Nbuf->List); - return; - } - - // - // Find the point to insert the buffer - // - for (Prev = Head, Cur = Head->ForwardLink; - Cur != Head; - Prev = Cur, Cur = Cur->ForwardLink) { - - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->Seq)) { - break; - } - } - - // - // Check whether the current segment overlaps with the - // previous segment. - // - if (Prev != Head) { - Node = NET_LIST_USER_STRUCT (Prev, NET_BUF, List); - - if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->End)) { - - if (TCP_SEQ_LEQ (Seg->End, TCPSEG_NETBUF (Node)->End)) { - - NetbufFree (Nbuf); - return; - } - - TcpTrimSegment (Nbuf, TCPSEG_NETBUF (Node)->End, Seg->End); - } - } - - InsertHeadList (Prev, &Nbuf->List); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - - // - // Check the segments after the insert point. - // - while (Cur != Head) { - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->End, Seg->End)) { - - Cur = Cur->ForwardLink; - - RemoveEntryList (&Node->List); - NetbufFree (Node); - continue; - } - - if (TCP_SEQ_LT (TCPSEG_NETBUF (Node)->Seq, Seg->End)) { - - if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->Seq, Seg->Seq)) { - - RemoveEntryList (&Nbuf->List); - NetbufFree (Nbuf); - return ; - } - - TcpTrimSegment (Nbuf, Seg->Seq, TCPSEG_NETBUF (Node)->Seq); - break; - } - - Cur = Cur->ForwardLink; - } -} - - -/** - Ajust the send queue or the retransmit queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Ack The acknowledge seuqence number of the received segment. - -**/ -VOID -TcpAdjustSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Ack - ) -{ - LIST_ENTRY *Head; - LIST_ENTRY *Cur; - NET_BUF *Node; - TCP_SEG *Seg; - - Head = &Tcb->SndQue; - Cur = Head->ForwardLink; - - while (Cur != Head) { - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - Seg = TCPSEG_NETBUF (Node); - - if (TCP_SEQ_GEQ (Seg->Seq, Ack)) { - break; - } - - // - // Remove completely ACKed segments - // - if (TCP_SEQ_LEQ (Seg->End, Ack)) { - Cur = Cur->ForwardLink; - - RemoveEntryList (&Node->List); - NetbufFree (Node); - continue; - } - - TcpTrimSegment (Node, Ack, Seg->End); - break; - } -} - - -/** - Process the received TCP segments. - - @param Nbuf Buffer that contains received TCP segment without IP header. - @param Src Source address of the segment, or the peer's IP address. - @param Dst Destination address of the segment, or the local end's IP - address. - - @retval 0 Segment is processed successfully. It is either accepted or - discarded. But no connection is reset by the segment. - @retval -1 A connection is reset by the segment. - -**/ -INTN -TcpInput ( - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dst - ) -{ - TCP_CB *Tcb; - TCP_CB *Parent; - TCP_OPTION Option; - TCP_HEAD *Head; - INT32 Len; - TCP_SEG *Seg; - TCP_SEQNO Right; - TCP_SEQNO Urg; - INT32 Usable; - - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); - - Parent = NULL; - Tcb = NULL; - - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); - ASSERT (Head != NULL); - - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); - goto DISCARD; - } - - Len = Nbuf->TotalSize - (Head->HeadLen << 2); - - if ((Head->HeadLen < 5) || (Len < 0) || - (TcpChecksum (Nbuf, NetPseudoHeadChecksum (Src, Dst, 6, 0)) != 0)) { - - DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n")); - goto DISCARD; - } - - if (TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)) { - Len++; - } - - if (TCP_FLG_ON (Head->Flag, TCP_FLG_FIN)) { - Len++; - } - - Tcb = TcpLocateTcb ( - Head->DstPort, - Dst, - Head->SrcPort, - Src, - (BOOLEAN) TCP_FLG_ON (Head->Flag, TCP_FLG_SYN) - ); - - if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) { - DEBUG ((EFI_D_NET, "TcpInput: send reset because no TCB found\n")); - - Tcb = NULL; - goto SEND_RESET; - } - - Seg = TcpFormatNetbuf (Tcb, Nbuf); - - // - // RFC1122 recommended reaction to illegal option - // (in fact, an illegal option length) is reset. - // - if (TcpParseOption (Nbuf->Tcp, &Option) == -1) { - DEBUG ((EFI_D_ERROR, "TcpInput: reset the peer because" - " of malformed option for TCB %p\n", Tcb)); - - goto SEND_RESET; - } - - // - // From now on, the segment is headless - // - NetbufTrim (Nbuf, (Head->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - // - // Process the segment in LISTEN state. - // - if (Tcb->State == TCP_LISTEN) { - // - // First step: Check RST - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " - "for TCB %p in listening\n", Tcb)); - - goto DISCARD; - } - - // - // Second step: Check ACK. - // Any ACK sent to TCP in LISTEN is reseted. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" - " segment with ACK for TCB %p in listening\n", Tcb)); - - goto SEND_RESET; - } - - // - // Third step: Check SYN - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - // - // create a child TCB to handle the data - // - Parent = Tcb; - - Tcb = TcpCloneTcb (Parent); - if (Tcb == NULL) { - DEBUG ((EFI_D_ERROR, "TcpInput: discard a segment because" - " failed to clone a child for TCB %p\n", Tcb)); - - goto DISCARD; - } - - DEBUG ((EFI_D_NET, "TcpInput: create a child for TCB %p" - " in listening\n", Tcb)); - - // - // init the TCB structure - // - Tcb->LocalEnd.Ip = Dst; - Tcb->LocalEnd.Port = Head->DstPort; - Tcb->RemoteEnd.Ip = Src; - Tcb->RemoteEnd.Port = Head->SrcPort; - - TcpInitTcbLocal (Tcb); - TcpInitTcbPeer (Tcb, Seg, &Option); - - TcpSetState (Tcb, TCP_SYN_RCVD); - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); - TcpTrimInWnd (Tcb, Nbuf); - - goto StepSix; - } - - goto DISCARD; - - } else if (Tcb->State == TCP_SYN_SENT) { - // - // First step: Check ACK bit - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + 1)) { - - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of " - "wrong ACK received for TCB %p in SYN_SENT\n", Tcb)); - - goto SEND_RESET; - } - - // - // Second step: Check RST bit - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset by" - " peer for TCB %p in SYN_SENT\n", Tcb)); - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); - goto DROP_CONNECTION; - } else { - - DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment " - "because of no ACK for TCB %p in SYN_SENT\n", Tcb)); - - goto DISCARD; - } - } - - // - // Third step: Check security and precedence. Skipped - // - - // - // Fourth step: Check SYN. Pay attention to simultaneous open - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - - TcpInitTcbPeer (Tcb, Seg, &Option); - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - - Tcb->SndUna = Seg->Ack; - } - - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); - - if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) { - - TcpSetState (Tcb, TCP_ESTABLISHED); - - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); - TcpDeliverData (Tcb); - - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - - TcpComputeRtt (Tcb, Tcb->RttMeasure); - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - } - - TcpTrimInWnd (Tcb, Nbuf); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - - DEBUG ((EFI_D_NET, "TcpInput: connection established" - " for TCB %p in SYN_SENT\n", Tcb)); - - goto StepSix; - } else { - // - // Received a SYN segment without ACK, simultaneous open. - // - TcpSetState (Tcb, TCP_SYN_RCVD); - - ASSERT (Tcb->SndNxt == Tcb->Iss + 1); - TcpAdjustSndQue (Tcb, Tcb->SndNxt); - - TcpTrimInWnd (Tcb, Nbuf); - - DEBUG ((EFI_D_WARN, "TcpInput: simultaneous open " - "for TCB %p in SYN_SENT\n", Tcb)); - - goto StepSix; - } - } - - goto DISCARD; - } - - // - // Process segment in SYN_RCVD or TCP_CONNECTED states - // - - // - // Clear probe timer since the RecvWindow is opened. - // - if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) { - TcpClearTimer (Tcb, TCP_TIMER_PROBE); - Tcb->ProbeTimerOn = FALSE; - } - - // - // First step: Check whether SEG.SEQ is acceptable - // - if (TcpSeqAcceptable (Tcb, Seg) == 0) { - DEBUG ((EFI_D_WARN, "TcpInput: sequence acceptance" - " test failed for segment of TCB %p\n", Tcb)); - - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - TcpSendAck (Tcb); - } - - goto DISCARD; - } - - if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) && - (Tcb->RcvWl2 == Seg->End) && - !TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN | TCP_FLG_FIN)) { - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - } - - // - // Second step: Check the RST - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", Tcb)); - - if (Tcb->State == TCP_SYN_RCVD) { - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED); - - // - // This TCB comes from either a LISTEN TCB, - // or active open TCB with simultanous open. - // Do NOT signal user CONNECTION refused - // if it comes from a LISTEN TCB. - // - } else if ((Tcb->State == TCP_ESTABLISHED) || - (Tcb->State == TCP_FIN_WAIT_1) || - (Tcb->State == TCP_FIN_WAIT_2) || - (Tcb->State == TCP_CLOSE_WAIT)) { - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); - - } else { - - } - - goto DROP_CONNECTION; - } - - // - // Trim the data and flags. - // - TcpTrimInWnd (Tcb, Nbuf); - - // - // Third step: Check security and precedence, Ignored - // - - // - // Fourth step: Check the SYN bit. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset " - "because received extra SYN for TCB %p\n", Tcb)); - - SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET); - goto RESET_THEN_DROP; - } - - // - // Fifth step: Check the ACK - // - if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - DEBUG ((EFI_D_WARN, "TcpInput: segment discard because" - " of no ACK for connected TCB %p\n", Tcb)); - - goto DISCARD; - - } - - if (Tcb->State == TCP_SYN_RCVD) { - - if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) && - TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt)) { - - Tcb->SndWnd = Seg->Wnd; - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); - Tcb->SndWl1 = Seg->Seq; - Tcb->SndWl2 = Seg->Ack; - TcpSetState (Tcb, TCP_ESTABLISHED); - - TcpClearTimer (Tcb, TCP_TIMER_CONNECT); - TcpDeliverData (Tcb); - - DEBUG ((EFI_D_NET, "TcpInput: connection established " - " for TCB %p in SYN_RCVD\n", Tcb)); - - // - // Continue the process as ESTABLISHED state - // - } else { - DEBUG ((EFI_D_WARN, "TcpInput: send reset because of" - " wrong ACK for TCB %p in SYN_RCVD\n", Tcb)); - - goto SEND_RESET; - } - } - - if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) { - - DEBUG ((EFI_D_WARN, "TcpInput: ignore the out-of-data" - " ACK for connected TCB %p\n", Tcb)); - - goto StepSix; - - } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) { - - DEBUG ((EFI_D_WARN, "TcpInput: discard segment for " - "future ACK for connected TCB %p\n", Tcb)); - - TcpSendAck (Tcb); - goto DISCARD; - } - - // - // From now on: SND.UNA <= SEG.ACK <= SND.NXT. - // - if (TCP_FLG_ON (Option.Flag, TCP_OPTION_RCVD_TS)) { - // - // update TsRecent as specified in page 16 RFC1323. - // RcvWl2 equals to the variable "LastAckSent" - // defined there. - // - if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) && - TCP_SEQ_LT (Tcb->RcvWl2, Seg->End)) { - - Tcb->TsRecent = Option.TSVal; - Tcb->TsRecentAge = mTcpTick; - } - - TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr)); - - } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - - ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN); - - TcpComputeRtt (Tcb, Tcb->RttMeasure); - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - } - - if (Seg->Ack == Tcb->SndNxt) { - - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); - } else { - - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); - } - - // - // Count duplicate acks. - // - if ((Seg->Ack == Tcb->SndUna) && - (Tcb->SndUna != Tcb->SndNxt) && - (Seg->Wnd == Tcb->SndWnd) && - (0 == Len)) { - - Tcb->DupAck++; - } else { - - Tcb->DupAck = 0; - } - - // - // Congestion avoidance, fast recovery and fast retransmission. - // - if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) || - (Tcb->CongestState == TCP_CONGEST_LOSS)) { - - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { - - if (Tcb->CWnd < Tcb->Ssthresh) { - - Tcb->CWnd += Tcb->SndMss; - } else { - - Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1); - } - - Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale); - } - - if (Tcb->CongestState == TCP_CONGEST_LOSS) { - TcpFastLossRecover (Tcb, Seg); - } - } else { - - TcpFastRecover (Tcb, Seg); - } - - if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) { - - TcpAdjustSndQue (Tcb, Seg->Ack); - Tcb->SndUna = Seg->Ack; - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && - TCP_SEQ_LT (Tcb->SndUp, Seg->Ack)) { - - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG); - } - } - - // - // Update window info - // - if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) || - ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg->Ack))) { - - Right = Seg->Ack + Seg->Wnd; - - if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) { - - if ((Tcb->SndWl1 == Seg->Seq) && - (Tcb->SndWl2 == Seg->Ack) && - (Len == 0)) { - - goto NO_UPDATE; - } - - DEBUG ((EFI_D_WARN, "TcpInput: peer shrinks the" - " window for connected TCB %p\n", Tcb)); - - if ((Tcb->CongestState == TCP_CONGEST_RECOVER) && - (TCP_SEQ_LT (Right, Tcb->Recover))) { - - Tcb->Recover = Right; - } - - if ((Tcb->CongestState == TCP_CONGEST_LOSS) && - (TCP_SEQ_LT (Right, Tcb->LossRecover))) { - - Tcb->LossRecover = Right; - } - - if (TCP_SEQ_LT (Right, Tcb->SndNxt)) { - // - // Check for Window Retraction in RFC7923 section 2.4. - // The lower n bits of the peer's actual receive window is wiped out if TCP - // window scale is enabled, it will look like the peer is shrinking the window. - // Check whether the SndNxt is out of the advertised receive window by more than - // 2^Rcv.Wind.Shift before moving the SndNxt to the left. - // - DEBUG ( - (EFI_D_WARN, - "TcpInput: peer advise negative useable window for connected TCB %p\n", - Tcb) - ); - Usable = TCP_SUB_SEQ (Tcb->SndNxt, Right); - if ((Usable >> Tcb->SndWndScale) > 0) { - DEBUG ( - (EFI_D_WARN, - "TcpInput: SndNxt is out of window by more than window scale for TCB %p\n", - Tcb) - ); - Tcb->SndNxt = Right; - } - if (Right == Tcb->SndUna) { - - TcpClearTimer (Tcb, TCP_TIMER_REXMIT); - TcpSetProbeTimer (Tcb); - } - } - } - - Tcb->SndWnd = Seg->Wnd; - Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax); - Tcb->SndWl1 = Seg->Seq; - Tcb->SndWl2 = Seg->Ack; - } - -NO_UPDATE: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) && - (Tcb->SndUna == Tcb->SndNxt)) { - - DEBUG ((EFI_D_NET, "TcpInput: local FIN is ACKed by" - " peer for connected TCB %p\n", Tcb)); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED); - } - - // - // Transit the state if proper. - // - switch (Tcb->State) { - case TCP_FIN_WAIT_1: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_FIN_WAIT_2); - - TcpClearAllTimer (Tcb); - TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout); - } - - case TCP_FIN_WAIT_2: - - break; - - case TCP_CLOSE_WAIT: - break; - - case TCP_CLOSING: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_TIME_WAIT); - - TcpClearAllTimer (Tcb); - - if (Tcb->TimeWaitTimeout != 0) { - - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); - } else { - - DEBUG ((EFI_D_WARN, "Connection closed immediately " - "because app disables TIME_WAIT timer for %p\n", Tcb)); - - TcpClose (Tcb); - } - } - break; - - case TCP_LAST_ACK: - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) { - - TcpSetState (Tcb, TCP_CLOSED); - } - - break; - - case TCP_TIME_WAIT: - - TcpSendAck (Tcb); - - if (Tcb->TimeWaitTimeout != 0) { - - TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout); - } else { - - DEBUG ((EFI_D_WARN, "Connection closed immediately " - "because app disables TIME_WAIT timer for %p\n", Tcb)); - - TcpClose (Tcb); - } - break; - - default: - break; - } - - // - // Sixth step: Check the URG bit.update the Urg point - // if in TCP_CAN_RECV, otherwise, leave the RcvUp intact. - // -StepSix: - - Tcb->Idle = 0; - TcpSetKeepaliveTimer (Tcb); - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) && - !TCP_FIN_RCVD (Tcb->State)) - { - - DEBUG ((EFI_D_NET, "TcpInput: received urgent data " - "from peer for connected TCB %p\n", Tcb)); - - Urg = Seg->Seq + Seg->Urg; - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) && - TCP_SEQ_GT (Urg, Tcb->RcvUp)) { - - Tcb->RcvUp = Urg; - } else { - - Tcb->RcvUp = Urg; - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG); - } - } - - // - // Seventh step: Process the segment data - // - if (Seg->End != Seg->Seq) { - - if (TCP_FIN_RCVD (Tcb->State)) { - - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" - " data is lost for connected TCB %p\n", Tcb)); - - goto RESET_THEN_DROP; - } - - if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) { - DEBUG ((EFI_D_WARN, "TcpInput: connection reset because" - " data is lost for connected TCB %p\n", Tcb)); - - goto RESET_THEN_DROP; - } - - TcpQueueData (Tcb, Nbuf); - if (TcpDeliverData (Tcb) == -1) { - goto RESET_THEN_DROP; - } - - if (!IsListEmpty (&Tcb->RcvQue)) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - } - } - - // - // Eighth step: check the FIN. - // This step is moved to TcpDeliverData. FIN will be - // processed in sequence there. Check the comments in - // the beginning of the file header for information. - // - - // - // Tcb is a new child of the listening Parent, - // commit it. - // - if (Parent != NULL) { - Tcb->Parent = Parent; - TcpInsertTcb (Tcb); - } - - if ((Tcb->State != TCP_CLOSED) && - (TcpToSendData (Tcb, 0) == 0) && - (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf->TotalSize != 0))) { - - TcpToSendAck (Tcb); - } - - NetbufFree (Nbuf); - return 0; - -RESET_THEN_DROP: - TcpSendReset (Tcb, Head, Len, Dst, Src); - -DROP_CONNECTION: - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - NetbufFree (Nbuf); - TcpClose (Tcb); - - return -1; - -SEND_RESET: - - TcpSendReset (Tcb, Head, Len, Dst, Src); - -DISCARD: - - // - // Tcb is a child of Parent, and it doesn't survive - // - DEBUG ((EFI_D_WARN, "Tcp4Input: Discard a packet\n")); - NetbufFree (Nbuf); - - if ((Parent != NULL) && (Tcb != NULL)) { - - ASSERT (Tcb->Sk != NULL); - TcpClose (Tcb); - } - - return 0; -} - - -/** - Process the received ICMP error messages for TCP. - - @param Nbuf Buffer that contains part of the TCP segment without IP header - truncated from the ICMP error packet. - @param IcmpErr The ICMP error code interpreted from ICMP error packet. - @param Src Source address of the ICMP error message. - @param Dst Destination address of the ICMP error message. - -**/ -VOID -TcpIcmpInput ( - IN NET_BUF *Nbuf, - IN UINT8 IcmpErr, - IN UINT32 Src, - IN UINT32 Dst - ) -{ - TCP_HEAD *Head; - TCP_CB *Tcb; - TCP_SEQNO Seq; - EFI_STATUS IcmpErrStatus; - BOOLEAN IcmpErrIsHard; - BOOLEAN IcmpErrNotify; - - if (Nbuf->TotalSize < sizeof (TCP_HEAD)) { - goto CLEAN_EXIT; - } - - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); - ASSERT (Head != NULL); - Tcb = TcpLocateTcb ( - Head->DstPort, - Dst, - Head->SrcPort, - Src, - FALSE - ); - if (Tcb == NULL || Tcb->State == TCP_CLOSED) { - - goto CLEAN_EXIT; - } - - // - // Validate the sequence number. - // - Seq = NTOHL (Head->Seq); - if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb->SndNxt))) { - - goto CLEAN_EXIT; - } - - IcmpErrStatus = IpIoGetIcmpErrStatus ( - IcmpErr, - IP_VERSION_4, - &IcmpErrIsHard, - &IcmpErrNotify - ); - - if (IcmpErrNotify) { - - SOCK_ERROR (Tcb->Sk, IcmpErrStatus); - } - - if (IcmpErrIsHard) { - - TcpClose (Tcb); - } - -CLEAN_EXIT: - NetbufFree (Nbuf); -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c deleted file mode 100644 index b98d1e783a2f..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c +++ /dev/null @@ -1,112 +0,0 @@ -/** @file - I/O interfaces between TCP and IpIo. - -Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - - -/** - Packet receive callback function provided to IP_IO, used to call - the proper function to handle the packet received by IP. - - @param Status Status of the received packet. - @param IcmpErr ICMP error number. - @param NetSession Pointer to the net session of this packet. - @param Pkt Pointer to the recieved packet. - @param Context Pointer to the context configured in IpIoOpen(), not used - now. - -**/ -VOID -EFIAPI -Tcp4RxCallback ( - IN EFI_STATUS Status, - IN UINT8 IcmpErr, - IN EFI_NET_SESSION_DATA *NetSession, - IN NET_BUF *Pkt, - IN VOID *Context OPTIONAL - ) -{ - if (EFI_SUCCESS == Status) { - TcpInput (Pkt, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]); - } else { - TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]); - } -} - - -/** - Send the segment to IP via IpIo function. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the TCP segment to be sent. - @param Src Source address of the TCP segment. - @param Dest Destination address of the TCP segment. - - @retval 0 The segment was sent out successfully. - @retval -1 The segment was failed to send. - -**/ -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dest - ) -{ - EFI_STATUS Status; - IP_IO *IpIo; - IP_IO_OVERRIDE Override; - SOCKET *Sock; - VOID *IpSender; - TCP4_PROTO_DATA *TcpProto; - EFI_IP_ADDRESS Source; - EFI_IP_ADDRESS Destination; - - Source.Addr[0] = Src; - Destination.Addr[0] = Dest; - - if (NULL == Tcb) { - - IpIo = NULL; - IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source); - - if (IpSender == NULL) { - DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate IpSender.\n")); - return -1; - } - } else { - - Sock = Tcb->Sk; - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - IpIo = TcpProto->TcpService->IpIo; - IpSender = Tcb->IpInfo; - } - - Override.Ip4OverrideData.TypeOfService = 0; - Override.Ip4OverrideData.TimeToLive = 255; - Override.Ip4OverrideData.DoNotFragment = FALSE; - Override.Ip4OverrideData.Protocol = EFI_IP_PROTO_TCP; - ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof (EFI_IPv4_ADDRESS)); - - Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, &Override); - - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status)); - return -1; - } - - return 0; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c deleted file mode 100644 index d8fc68c0a97d..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c +++ /dev/null @@ -1,674 +0,0 @@ -/** @file - Implementation of TCP4 protocol services. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Tcp4Main.h" - - -/** - Check the integrity of the data buffer. - - @param DataLen The total length of the data buffer. - @param FragmentCount The fragment count of the fragment table. - @param FragmentTable Pointer to the fragment table of the data - buffer. - - @retval EFI_SUCCESS The integrity check is passed. - @retval EFI_INVALID_PARAMETER The integrity check is failed. - -**/ -EFI_STATUS -Tcp4ChkDataBuf ( - IN UINT32 DataLen, - IN UINT32 FragmentCount, - IN EFI_TCP4_FRAGMENT_DATA *FragmentTable - ) -{ - UINT32 Index; - - UINT32 Len; - - for (Index = 0, Len = 0; Index < FragmentCount; Index++) { - Len = Len + (UINT32) FragmentTable[Index].FragmentLength; - } - - if (DataLen != Len) { - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - - -/** - Get the current operational status. - - The GetModeData() function copies the current operational settings of this - EFI TCPv4 Protocol instance into user-supplied buffers. This function can - also be used to retrieve the operational setting of underlying drivers - such as IPv4, MNP, or SNP. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Tcp4State Pointer to the buffer to receive the current TCP - state. - @param Tcp4ConfigData Pointer to the buffer to receive the current TCP - configuration. - @param Ip4ModeData Pointer to the buffer to receive the current IPv4 - configuration data used by the TCPv4 instance. - @param MnpConfigData Pointer to the buffer to receive the current MNP - configuration data indirectly used by the TCPv4 - Instance. - @param SnpModeData Pointer to the buffer to receive the current SNP - configuration data indirectly used by the TCPv4 - Instance. - - @retval EFI_SUCCESS The mode data was read. - @retval EFI_NOT_STARTED No configuration data is available because this - instance hasn't been started. - @retval EFI_INVALID_PARAMETER This is NULL. - -**/ -EFI_STATUS -EFIAPI -Tcp4GetModeData ( - IN EFI_TCP4_PROTOCOL *This, - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL - ) -{ - TCP4_MODE_DATA TcpMode; - SOCKET *Sock; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - TcpMode.Tcp4State = Tcp4State; - TcpMode.Tcp4ConfigData = Tcp4ConfigData; - TcpMode.Ip4ModeData = Ip4ModeData; - TcpMode.MnpConfigData = MnpConfigData; - TcpMode.SnpModeData = SnpModeData; - - return SockGetMode (Sock, &TcpMode); -} - - -/** - Initialize or brutally reset the operational parameters for - this EFI TCPv4 instance. - - The Configure() function does the following: - * Initialize this EFI TCPv4 instance, i.e., initialize the communication end - setting, specify active open or passive open for an instance. - * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous - tokens, flush transmission and receiving buffer directly without informing - the communication peer. - No other TCPv4 Protocol operation can be executed by this instance - until it is configured properly. For an active TCP4 instance, after a proper - configuration it may call Connect() to initiates the three-way handshake. - For a passive TCP4 instance, its state will transit to Tcp4StateListen after - configuration, and Accept() may be called to listen the incoming TCP connection - request. If TcpConfigData is set to NULL, the instance is reset. Resetting - process will be done brutally, the state machine will be set to Tcp4StateClosed - directly, the receive queue and transmit queue will be flushed, and no traffic is - allowed through this instance. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param TcpConfigData Pointer to the configure data to configure the - instance. - - @retval EFI_SUCCESS The operational settings are set, changed, or - reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is already - configured. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred. - @retval EFI_UNSUPPORTED One or more of the control options are not - supported in the implementation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4Configure ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL - ) -{ - EFI_TCP4_OPTION *Option; - SOCKET *Sock; - EFI_STATUS Status; - IP4_ADDR Ip; - IP4_ADDR SubnetMask; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - // - // Tcp protocol related parameter check will be conducted here - // - if (NULL != TcpConfigData) { - - CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR)); - if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) { - return EFI_INVALID_PARAMETER; - } - - if (TcpConfigData->AccessPoint.ActiveFlag && - (0 == TcpConfigData->AccessPoint.RemotePort || (Ip == 0))) { - return EFI_INVALID_PARAMETER; - } - - if (!TcpConfigData->AccessPoint.UseDefaultAddress) { - - CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof (IP4_ADDR)); - CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, sizeof (IP4_ADDR)); - if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) || - (SubnetMask != 0 && !NetIp4IsUnicast (NTOHL (Ip), NTOHL (SubnetMask)))) { - return EFI_INVALID_PARAMETER; - } - } - - Option = TcpConfigData->ControlOption; - if ((NULL != Option) && - (Option->EnableSelectiveAck || Option->EnablePathMtuDiscovery)) { - return EFI_UNSUPPORTED; - } - } - - Sock = SOCK_FROM_THIS (This); - - if (NULL == TcpConfigData) { - return SockFlush (Sock); - } - - Status = SockConfigure (Sock, TcpConfigData); - - if (EFI_NO_MAPPING == Status) { - Sock->ConfigureState = SO_NO_MAPPING; - } - - return Status; -} - - -/** - Add or delete routing entries. - - The Routes() function adds or deletes a route from the instance's routing table. - The most specific route is selected by comparing the SubnetAddress with the - destination IP address's arithmetical AND to the SubnetMask. - The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0. - The default route matches all destination IP addresses if there is no more specific route. - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to - the destination host if its address can be found in the Address Resolution Protocol (ARP) - cache or it is on the local subnet. If the instance is configured to use default - address, a direct route to the local network will be added automatically. - Each TCP instance has its own independent routing table. Instance that uses the - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table. - The copy will be updated automatically whenever the IP driver reconfigures its - instance. As a result, the previous modification to the instance's local copy - will be lost. The priority of checking the route table is specific with IP - implementation and every IP implementation must comply with RFC 1122. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param DeleteRoute If TRUE, delete the specified route from routing - table; if FALSE, add the specified route to - routing table. - DestinationAddress and SubnetMask are used as - the keywords to search route entry. - @param SubnetAddress The destination network. - @param SubnetMask The subnet mask for the destination network. - @param GatewayAddress The gateway address for this route. - It must be on the same subnet with the station - address unless a direct route is specified. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to add the - entry to the routing table. - @retval EFI_NOT_FOUND This route is not in the routing table. - @retval EFI_ACCESS_DENIED This route is already in the routing table. - @retval EFI_UNSUPPORTED The TCP driver does not support this operation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Routes ( - IN EFI_TCP4_PROTOCOL *This, - IN BOOLEAN DeleteRoute, - IN EFI_IPv4_ADDRESS *SubnetAddress, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *GatewayAddress - ) -{ - SOCKET *Sock; - TCP4_ROUTE_INFO RouteInfo; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - RouteInfo.DeleteRoute = DeleteRoute; - RouteInfo.SubnetAddress = SubnetAddress; - RouteInfo.SubnetMask = SubnetMask; - RouteInfo.GatewayAddress = GatewayAddress; - - return SockRoute (Sock, &RouteInfo); -} - - -/** - Initiate a nonblocking TCP connection request for an active TCP instance. - - The Connect() function will initiate an active open to the remote peer configured - in current TCP instance if it is configured active. If the connection succeeds - or fails due to any error, the ConnectionToken->CompletionToken.Event will be - signaled and ConnectionToken->CompletionToken.Status will be updated accordingly. - This function can only be called for the TCP instance in Tcp4StateClosed state. - The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS. - If TCP three way handshake succeeds, its state will become Tcp4StateEstablished, - otherwise, the state will return to Tcp4StateClosed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ConnectionToken Pointer to the connection token to return when - the TCP three way handshake finishes. - - @retval EFI_SUCCESS The connection request is successfully initiated - and the state of this TCPv4 instance has - been changed to Tcp4StateSynSent. - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instance is not configured as an active one - or it is not in Tcp4StateClosed state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough resource to - initiate the active open. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - -**/ -EFI_STATUS -EFIAPI -Tcp4Connect ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken - ) -{ - SOCKET *Sock; - - if (NULL == This || - NULL == ConnectionToken || - NULL == ConnectionToken->CompletionToken.Event) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - return SockConnect (Sock, ConnectionToken); -} - - -/** - Listen on the passive instance to accept an incoming connection request. - - The Accept() function initiates an asynchronous accept request to wait for an - incoming connection on the passive TCP instance. If a remote peer successfully - establishes a connection with this instance, a new TCP instance will be created - and its handle will be returned in ListenToken->NewChildHandle. The newly created - instance is configured by inheriting the passive instance's configuration and is - ready for use upon return. The instance is in the Tcp4StateEstablished state. - The ListenToken->CompletionToken.Event will be signaled when a new connection - is accepted, user aborts the listen or connection is reset. This function only - can be called when current TCP instance is in Tcp4StateListen state. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ListenToken Pointer to the listen token to return when - operation finishes. - - @retval EFI_SUCCESS The listen token has been queued successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is not - in Tcp4StateListen state or a same listen token - has already existed in the listen token queue of - this TCP instance. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to finish - the operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Accept ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_LISTEN_TOKEN *ListenToken - ) -{ - SOCKET *Sock; - - if (NULL == This || - NULL == ListenToken || - NULL == ListenToken->CompletionToken.Event) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - return SockAccept (Sock, ListenToken); -} - - -/** - Queues outgoing data into the transmit queue. - - The Transmit() function queues a sending request to this TCPv4 instance along - with the user data. The status of the token is updated and the event in the token - will be signaled once the data is sent out or some error occurs. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param Token Pointer to the completion token to queue to the - transmit queue - - @retval EFI_SUCCESS The data has been queued for transmission. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A transmit completion token with the same - Token-> CompletionToken.Event was already in the - transmission queue. - * The current instance is in Tcp4StateClosed state - * The current instance is a passive one and - it is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_NOT_READY The completion token could not be queued because - the transmit queue is full. - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data because of - resource shortage. - @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or - address. - -**/ -EFI_STATUS -EFIAPI -Tcp4Transmit ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ) -{ - SOCKET *Sock; - EFI_STATUS Status; - - if (NULL == This || - NULL == Token || - NULL == Token->CompletionToken.Event || - NULL == Token->Packet.TxData || - 0 == Token->Packet.TxData->FragmentCount || - 0 == Token->Packet.TxData->DataLength - ) { - return EFI_INVALID_PARAMETER; - } - - Status = Tcp4ChkDataBuf ( - (UINT32) Token->Packet.TxData->DataLength, - (UINT32) Token->Packet.TxData->FragmentCount, - Token->Packet.TxData->FragmentTable - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Sock = SOCK_FROM_THIS (This); - - return SockSend (Sock, Token); - -} - - -/** - Place an asynchronous receive request into the receiving queue. - - The Receive() function places a completion token into the receive packet queue. - This function is always asynchronous. The caller must allocate the - Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also - must fill the DataLength which represents the whole length of all FragmentBuffer. - When the receive operation completes, the EFI TCPv4 Protocol driver updates the - Token->CompletionToken.Status and Token->Packet.RxData fields and the - Token->CompletionToken.Event is signaled. If got data the data and its length - will be copy into the FragmentTable, in the same time the full length of received - data will be recorded in the DataLength fields. Providing a proper notification - function and context for the event will enable the user to receive the notification - and receiving status. That notification function is guaranteed to not be re-entered. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that is associated with the - receive data descriptor. - - @retval EFI_SUCCESS The receive completion token was cached. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued - due to a lack of system resources. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - The EFI TCPv4 Protocol instance has been reset - to startup defaults. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A receive completion token with the same - Token->CompletionToken.Event was already in - the receive queue. - * The current instance is in Tcp4StateClosed state. - * The current instance is a passive one and it - is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_CONNECTION_FIN The communication peer has closed the connection - and there is no any buffered data in the receive - buffer of this instance. - @retval EFI_NOT_READY The receive request could not be queued because - the receive queue is full. - -**/ -EFI_STATUS -EFIAPI -Tcp4Receive ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ) -{ - SOCKET *Sock; - EFI_STATUS Status; - - if (NULL == This || - NULL == Token || - NULL == Token->CompletionToken.Event || - NULL == Token->Packet.RxData || - 0 == Token->Packet.RxData->FragmentCount || - 0 == Token->Packet.RxData->DataLength - ) { - return EFI_INVALID_PARAMETER; - } - - Status = Tcp4ChkDataBuf ( - (UINT32) Token->Packet.RxData->DataLength, - (UINT32) Token->Packet.RxData->FragmentCount, - Token->Packet.RxData->FragmentTable - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Sock = SOCK_FROM_THIS (This); - - return SockRcv (Sock, Token); - -} - - -/** - Disconnecting a TCP connection gracefully or reset a TCP connection. - - Initiate an asynchronous close token to TCP driver. After Close() is called, - any buffered transmission data will be sent by TCP driver and the current - instance will have a graceful close working flow described as RFC 793 if - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP - driver to fast disconnect this connection. When the close operation completes - successfully the TCP instance is in Tcp4StateClosed state, all pending - asynchronous operation is signaled and any buffers used for TCP network traffic - is flushed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param CloseToken Pointer to the close token to return when - operation finishes. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED One or more of the following are TRUE: - * Configure() has been called with TcpConfigData - set to NULL and this function has not returned. - * Previous Close() call on this instance has not - finished. - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to finish the - operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above - category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Close ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CLOSE_TOKEN *CloseToken - ) -{ - SOCKET *Sock; - - if (NULL == This || - NULL == CloseToken || - NULL == CloseToken->CompletionToken.Event) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - return SockClose (Sock, CloseToken, CloseToken->AbortOnClose); -} - - -/** - Abort an asynchronous connection, listen, transmission or receive request. - - The Cancel() function aborts a pending connection, listen, transmit or receive - request. If Token is not NULL and the token is in the connection, listen, - transmission or receive queue when it is being cancelled, its Token->Status - will be set to EFI_ABORTED and then Token->Event will be signaled. If the token - is not in one of the queues, which usually means that the asynchronous operation - has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token - issued by Connect(), Accept(), Transmit() and Receive()will be aborted. - NOTE: It has not been implemented currently. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that has been issued by - Connect(), Accept(), Transmit() or Receive(). If - NULL, all pending tokens issued by above four - functions will be aborted. - - @retval EFI_SUCCESS The asynchronous I/O request is aborted and Token->Event - is signaled. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_NOT_STARTED This instance hasn's been configured. - @retval EFI_NO_MAPPING When using the default address, configuration - (DHCP, BOOTP,RARP, etc.) hasn's finished yet. - @retval EFI_NOT_FOUND The asynchronous I/O request isn's found in the - transmission or receive queue. It has either - completed or wasn's issued by Transmit() and Receive(). - @retval EFI_UNSUPPORTED The operation is not supported in current - implementation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Cancel ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL - ) -{ - return EFI_UNSUPPORTED; -} - - -/** - Poll to receive incoming data and transmit outgoing segments. - - The Poll() function increases the rate that data is moved between the network - and application and can be called when the TCP instance is created successfully. - Its use is optional. In some implementations, the periodical timer in the MNP - driver may not poll the underlying communications device fast enough to avoid - drop packets. Drivers and applications that are experiencing packet loss should - try calling the Poll() function in a high frequency. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - - @retval EFI_SUCCESS Incoming or outgoing data was processed. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - @retval EFI_NOT_READY No incoming or outgoing data was processed. - @retval EFI_TIMEOUT Data was dropped out of the transmission or - receive queue. Consider increasing the polling - rate. - -**/ -EFI_STATUS -EFIAPI -Tcp4Poll ( - IN EFI_TCP4_PROTOCOL *This - ) -{ - SOCKET *Sock; - EFI_STATUS Status; - - if (NULL == This) { - return EFI_INVALID_PARAMETER; - } - - Sock = SOCK_FROM_THIS (This); - - Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL); - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c deleted file mode 100644 index 7fd8bb1fbe09..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c +++ /dev/null @@ -1,940 +0,0 @@ -/** @file - Misc support routines for tcp. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "Tcp4Main.h" - -#include <Library/DevicePathLib.h> - -LIST_ENTRY mTcpRunQue = { - &mTcpRunQue, - &mTcpRunQue -}; - -LIST_ENTRY mTcpListenQue = { - &mTcpListenQue, - &mTcpListenQue -}; - -TCP_SEQNO mTcpGlobalIss = 0x4d7e980b; - -CHAR16 *mTcpStateName[] = { - L"TCP_CLOSED", - L"TCP_LISTEN", - L"TCP_SYN_SENT", - L"TCP_SYN_RCVD", - L"TCP_ESTABLISHED", - L"TCP_FIN_WAIT_1", - L"TCP_FIN_WAIT_2", - L"TCP_CLOSING", - L"TCP_TIME_WAIT", - L"TCP_CLOSE_WAIT", - L"TCP_LAST_ACK" -}; - - -/** - Initialize the Tcb local related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpInitTcbLocal ( - IN OUT TCP_CB *Tcb - ) -{ - // - // Compute the checksum of the fixed parts of pseudo header - // - Tcb->HeadSum = NetPseudoHeadChecksum ( - Tcb->LocalEnd.Ip, - Tcb->RemoteEnd.Ip, - 0x06, - 0 - ); - - Tcb->Iss = TcpGetIss (); - Tcb->SndUna = Tcb->Iss; - Tcb->SndNxt = Tcb->Iss; - - Tcb->SndWl2 = Tcb->Iss; - Tcb->SndWnd = 536; - - Tcb->RcvWnd = GET_RCV_BUFFSIZE (Tcb->Sk); - - // - // First window size is never scaled - // - Tcb->RcvWndScale = 0; - Tcb->RetxmitSeqMax = 0; - - Tcb->ProbeTimerOn = FALSE; -} - - -/** - Initialize the peer related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the segment that contains the peer's - intial info. - @param Opt Pointer to the options announced by the peer. - -**/ -VOID -TcpInitTcbPeer ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg, - IN TCP_OPTION *Opt - ) -{ - UINT16 RcvMss; - - ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL)); - ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)); - - Tcb->SndWnd = Seg->Wnd; - Tcb->SndWndMax = Tcb->SndWnd; - Tcb->SndWl1 = Seg->Seq; - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) { - Tcb->SndWl2 = Seg->Ack; - } else { - Tcb->SndWl2 = Tcb->Iss + 1; - } - - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) { - Tcb->SndMss = (UINT16) MAX (64, Opt->Mss); - - RcvMss = TcpGetRcvMss (Tcb->Sk); - if (Tcb->SndMss > RcvMss) { - Tcb->SndMss = RcvMss; - } - - } else { - // - // One end doesn't support MSS option, use default. - // - Tcb->RcvMss = 536; - } - - Tcb->CWnd = Tcb->SndMss; - - Tcb->Irs = Seg->Seq; - Tcb->RcvNxt = Tcb->Irs + 1; - - Tcb->RcvWl2 = Tcb->RcvNxt; - - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_WS) && - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)) { - - Tcb->SndWndScale = Opt->WndScale; - - Tcb->RcvWndScale = TcpComputeScale (Tcb); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS); - - } else { - // - // One end doesn't support window scale option. use zero. - // - Tcb->RcvWndScale = 0; - } - - if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_TS) && - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)) { - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_TS); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS); - - Tcb->TsRecent = Opt->TSVal; - - // - // Compute the effective SndMss per RFC1122 - // section 4.2.2.6. If timestamp option is - // enabled, it will always occupy 12 bytes. - // - Tcb->SndMss -= TCP_OPTION_TS_ALIGNED_LEN; - } -} - - -/** - Locate a listen TCB that matchs the Local and Remote. - - @param Local Pointer to the local (IP, Port). - @param Remote Pointer to the remote (IP, Port). - - @return Pointer to the TCP_CB with the least number of wildcard, - if NULL no match is found. - -**/ -TCP_CB * -TcpLocateListenTcb ( - IN TCP_PEER *Local, - IN TCP_PEER *Remote - ) -{ - LIST_ENTRY *Entry; - TCP_CB *Node; - TCP_CB *Match; - INTN Last; - INTN Cur; - - Last = 4; - Match = NULL; - - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if ((Local->Port != Node->LocalEnd.Port) || - !TCP_PEER_MATCH (Remote, &Node->RemoteEnd) || - !TCP_PEER_MATCH (Local, &Node->LocalEnd)) { - - continue; - } - - // - // Compute the number of wildcard - // - Cur = 0; - if (Node->RemoteEnd.Ip == 0) { - Cur++; - } - - if (Node->RemoteEnd.Port == 0) { - Cur++; - } - - if (Node->LocalEnd.Ip == 0) { - Cur++; - } - - if (Cur < Last) { - if (Cur == 0) { - return Node; - } - - Last = Cur; - Match = Node; - } - } - - return Match; -} - - -/** - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. - - @param Addr Pointer to the IP address needs to match. - @param Port The port number needs to match. - - @return The Tcb which matches the <Addr Port> paire exists or not. - -**/ -BOOLEAN -TcpFindTcbByPeer ( - IN EFI_IPv4_ADDRESS *Addr, - IN TCP_PORTNO Port - ) -{ - TCP_PORTNO LocalPort; - LIST_ENTRY *Entry; - TCP_CB *Tcb; - - ASSERT ((Addr != NULL) && (Port != 0)); - - LocalPort = HTONS (Port); - - NET_LIST_FOR_EACH (Entry, &mTcpListenQue) { - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && - (LocalPort == Tcb->LocalEnd.Port)) { - - return TRUE; - } - } - - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) && - (LocalPort == Tcb->LocalEnd.Port)) { - - return TRUE; - } - } - - return FALSE; -} - - -/** - Locate the TCP_CB related to the socket pair. - - @param LocalPort The local port number. - @param LocalIp The local IP address. - @param RemotePort The remote port number. - @param RemoteIp The remote IP address. - @param Syn Whether to search the listen sockets, if TRUE, the - listen sockets are searched. - - @return Pointer to the related TCP_CB, if NULL no match is found. - -**/ -TCP_CB * -TcpLocateTcb ( - IN TCP_PORTNO LocalPort, - IN UINT32 LocalIp, - IN TCP_PORTNO RemotePort, - IN UINT32 RemoteIp, - IN BOOLEAN Syn - ) -{ - TCP_PEER Local; - TCP_PEER Remote; - LIST_ENTRY *Entry; - TCP_CB *Tcb; - - Local.Port = LocalPort; - Local.Ip = LocalIp; - - Remote.Port = RemotePort; - Remote.Ip = RemoteIp; - - // - // First check for exact match. - // - NET_LIST_FOR_EACH (Entry, &mTcpRunQue) { - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) && - TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) { - - RemoveEntryList (&Tcb->List); - InsertHeadList (&mTcpRunQue, &Tcb->List); - - return Tcb; - } - } - - // - // Only check listen queue when SYN flag is on - // - if (Syn) { - return TcpLocateListenTcb (&Local, &Remote); - } - - return NULL; -} - - -/** - Insert a Tcb into the proper queue. - - @param Tcb Pointer to the TCP_CB to be inserted. - - @retval 0 The Tcb is inserted successfully. - @retval -1 Error condition occurred. - -**/ -INTN -TcpInsertTcb ( - IN TCP_CB *Tcb - ) -{ - LIST_ENTRY *Entry; - LIST_ENTRY *Head; - TCP_CB *Node; - - ASSERT ( - (Tcb != NULL) && - ((Tcb->State == TCP_LISTEN) || - (Tcb->State == TCP_SYN_SENT) || - (Tcb->State == TCP_SYN_RCVD) || - (Tcb->State == TCP_CLOSED)) - ); - - if (Tcb->LocalEnd.Port == 0) { - return -1; - } - - Head = &mTcpRunQue; - - if (Tcb->State == TCP_LISTEN) { - Head = &mTcpListenQue; - } - - // - // Check that Tcb isn't already on the list. - // - NET_LIST_FOR_EACH (Entry, Head) { - Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (TCP_PEER_EQUAL (&Tcb->LocalEnd, &Node->LocalEnd) && - TCP_PEER_EQUAL (&Tcb->RemoteEnd, &Node->RemoteEnd)) { - - return -1; - } - } - - InsertHeadList (Head, &Tcb->List); - - return 0; -} - - -/** - Clone a TCB_CB from Tcb. - - @param Tcb Pointer to the TCP_CB to be cloned. - - @return Pointer to the new cloned TCP_CB, if NULL error condition occurred. - -**/ -TCP_CB * -TcpCloneTcb ( - IN TCP_CB *Tcb - ) -{ - TCP_CB *Clone; - - Clone = AllocatePool (sizeof (TCP_CB)); - - if (Clone == NULL) { - return NULL; - - } - - CopyMem (Clone, Tcb, sizeof (TCP_CB)); - - // - // Increate the reference count of the shared IpInfo. - // - NET_GET_REF (Tcb->IpInfo); - - InitializeListHead (&Clone->List); - InitializeListHead (&Clone->SndQue); - InitializeListHead (&Clone->RcvQue); - - Clone->Sk = SockClone (Tcb->Sk); - if (Clone->Sk == NULL) { - DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n")); - FreePool (Clone); - return NULL; - } - - ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone; - - return Clone; -} - - -/** - Compute an ISS to be used by a new connection. - - @return The result ISS. - -**/ -TCP_SEQNO -TcpGetIss ( - VOID - ) -{ - mTcpGlobalIss += 2048; - return mTcpGlobalIss; -} - - -/** - Get the local mss. - - @param Sock Pointer to the socket to get mss - - @return The mss size. - -**/ -UINT16 -TcpGetRcvMss ( - IN SOCKET *Sock - ) -{ - EFI_IP4_MODE_DATA Ip4Mode; - TCP4_PROTO_DATA *TcpProto; - EFI_IP4_PROTOCOL *Ip; - - ASSERT (Sock != NULL); - - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - Ip = TcpProto->TcpService->IpIo->Ip.Ip4; - ASSERT (Ip != NULL); - - Ip->GetModeData (Ip, &Ip4Mode, NULL, NULL); - - return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD)); -} - - -/** - Set the Tcb's state. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param State The state to be set. - -**/ -VOID -TcpSetState ( - IN OUT TCP_CB *Tcb, - IN UINT8 State - ) -{ - ASSERT (Tcb->State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); - ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *))); - - DEBUG ( - (EFI_D_NET, - "Tcb (%p) state %s --> %s\n", - Tcb, - mTcpStateName[Tcb->State], - mTcpStateName[State]) - ); - - Tcb->State = State; - - switch (State) { - case TCP_ESTABLISHED: - - SockConnEstablished (Tcb->Sk); - - if (Tcb->Parent != NULL) { - // - // A new connection is accepted by a listening socket, install - // the device path. - // - TcpInstallDevicePath (Tcb->Sk); - } - - break; - - case TCP_CLOSED: - - SockConnClosed (Tcb->Sk); - - break; - default: - break; - } -} - - -/** - Compute the TCP segment's checksum. - - @param Nbuf Pointer to the buffer that contains the TCP - segment. - @param HeadSum The checksum value of the fixed part of pseudo - header. - - @return The checksum value. - -**/ -UINT16 -TcpChecksum ( - IN NET_BUF *Nbuf, - IN UINT16 HeadSum - ) -{ - UINT16 Checksum; - - Checksum = NetbufChecksum (Nbuf); - Checksum = NetAddChecksum (Checksum, HeadSum); - - Checksum = NetAddChecksum ( - Checksum, - HTONS ((UINT16) Nbuf->TotalSize) - ); - - return (UINT16) ~Checksum; -} - -/** - Translate the information from the head of the received TCP - segment Nbuf contains and fill it into a TCP_SEG structure. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer contains the TCP segment. - - @return Pointer to the TCP_SEG that contains the translated TCP head information. - -**/ -TCP_SEG * -TcpFormatNetbuf ( - IN TCP_CB *Tcb, - IN OUT NET_BUF *Nbuf - ) -{ - TCP_SEG *Seg; - TCP_HEAD *Head; - - Seg = TCPSEG_NETBUF (Nbuf); - Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL); - ASSERT (Head != NULL); - Nbuf->Tcp = Head; - - Seg->Seq = NTOHL (Head->Seq); - Seg->Ack = NTOHL (Head->Ack); - Seg->End = Seg->Seq + (Nbuf->TotalSize - (Head->HeadLen << 2)); - - Seg->Urg = NTOHS (Head->Urg); - Seg->Wnd = (NTOHS (Head->Wnd) << Tcb->SndWndScale); - Seg->Flag = Head->Flag; - - // - // SYN and FIN flag occupy one sequence space each. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - // - // RFC requires that initial window not be scaled - // - Seg->Wnd = NTOHS (Head->Wnd); - Seg->End++; - } - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - Seg->End++; - } - - return Seg; -} - - -/** - Reset the connection related with Tcb. - - @param Tcb Pointer to the TCP_CB of the connection to be - reset. - -**/ -VOID -TcpResetConnection ( - IN TCP_CB *Tcb - ) -{ - NET_BUF *Nbuf; - TCP_HEAD *Nhead; - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return ; - } - - Nhead = (TCP_HEAD *) NetbufAllocSpace ( - Nbuf, - sizeof (TCP_HEAD), - NET_BUF_TAIL - ); - - ASSERT (Nhead != NULL); - - Nbuf->Tcp = Nhead; - - Nhead->Flag = TCP_FLG_RST; - Nhead->Seq = HTONL (Tcb->SndNxt); - Nhead->Ack = HTONL (Tcb->RcvNxt); - Nhead->SrcPort = Tcb->LocalEnd.Port; - Nhead->DstPort = Tcb->RemoteEnd.Port; - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); - Nhead->Res = 0; - Nhead->Wnd = HTONS (0xFFFF); - Nhead->Checksum = 0; - Nhead->Urg = 0; - Nhead->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); - - TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip); - - NetbufFree (Nbuf); -} - - -/** - Initialize an active connection. - - @param Tcb Pointer to the TCP_CB that wants to initiate a - connection. - -**/ -VOID -TcpOnAppConnect ( - IN OUT TCP_CB *Tcb - ) -{ - TcpInitTcbLocal (Tcb); - TcpSetState (Tcb, TCP_SYN_SENT); - - TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout); - TcpToSendData (Tcb, 1); -} - - -/** - Initiate the connection close procedure, called when - applications want to close the connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppClose ( - IN OUT TCP_CB *Tcb - ) -{ - ASSERT (Tcb != NULL); - - if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk) != 0) { - - DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset " - "because data is lost for TCB %p\n", Tcb)); - - TcpResetConnection (Tcb); - TcpClose (Tcb); - return; - } - - switch (Tcb->State) { - case TCP_CLOSED: - case TCP_LISTEN: - case TCP_SYN_SENT: - TcpSetState (Tcb, TCP_CLOSED); - break; - - case TCP_SYN_RCVD: - case TCP_ESTABLISHED: - TcpSetState (Tcb, TCP_FIN_WAIT_1); - break; - - case TCP_CLOSE_WAIT: - TcpSetState (Tcb, TCP_LAST_ACK); - break; - default: - break; - } - - TcpToSendData (Tcb, 1); -} - - -/** - Check whether the application's newly delivered data can be sent out. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 Whether the data is sent out or is buffered for - further sending. - @retval -1 The Tcb is not in a state that data is permitted to - be sent out. - -**/ -INTN -TcpOnAppSend ( - IN OUT TCP_CB *Tcb - ) -{ - - switch (Tcb->State) { - case TCP_CLOSED: - return -1; - - case TCP_LISTEN: - return -1; - - case TCP_SYN_SENT: - case TCP_SYN_RCVD: - return 0; - - case TCP_ESTABLISHED: - case TCP_CLOSE_WAIT: - TcpToSendData (Tcb, 0); - return 0; - - case TCP_FIN_WAIT_1: - case TCP_FIN_WAIT_2: - case TCP_CLOSING: - case TCP_LAST_ACK: - case TCP_TIME_WAIT: - return -1; - - default: - break; - } - - return 0; -} - - -/** - Application has consumed some data, check whether - to send a window updata ack or a delayed ack. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppConsume ( - IN TCP_CB *Tcb - ) -{ - UINT32 TcpOld; - - switch (Tcb->State) { - case TCP_CLOSED: - return; - - case TCP_LISTEN: - return; - - case TCP_SYN_SENT: - case TCP_SYN_RCVD: - return; - - case TCP_ESTABLISHED: - TcpOld = TcpRcvWinOld (Tcb); - if (TcpRcvWinNow (Tcb) > TcpOld) { - - if (TcpOld < Tcb->RcvMss) { - - DEBUG ((EFI_D_NET, "TcpOnAppConsume: send a window" - " update for a window closed Tcb %p\n", Tcb)); - - TcpSendAck (Tcb); - } else if (Tcb->DelayedAck == 0) { - - DEBUG ((EFI_D_NET, "TcpOnAppConsume: scheduled a delayed" - " ACK to update window for Tcb %p\n", Tcb)); - - Tcb->DelayedAck = 1; - } - } - - break; - - case TCP_CLOSE_WAIT: - return; - - case TCP_FIN_WAIT_1: - case TCP_FIN_WAIT_2: - case TCP_CLOSING: - case TCP_LAST_ACK: - case TCP_TIME_WAIT: - return; - - default: - break; - } -} - - -/** - Abort the connection by sending a reset segment, called - when the application wants to abort the connection. - - @param Tcb Pointer to the TCP_CB of the TCP instance. - -**/ -VOID -TcpOnAppAbort ( - IN TCP_CB *Tcb - ) -{ - DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset " - "issued by application for TCB %p\n", Tcb)); - - switch (Tcb->State) { - case TCP_SYN_RCVD: - case TCP_ESTABLISHED: - case TCP_FIN_WAIT_1: - case TCP_FIN_WAIT_2: - case TCP_CLOSE_WAIT: - TcpResetConnection (Tcb); - break; - default: - break; - } - - TcpSetState (Tcb, TCP_CLOSED); -} - -/** - Install the device path protocol on the TCP instance. - - @param Sock Pointer to the socket representing the TCP instance. - - @retval EFI_SUCCESS The device path protocol is installed. - @retval other Failed to install the device path protocol. - -**/ -EFI_STATUS -TcpInstallDevicePath ( - IN SOCKET *Sock - ) -{ - TCP4_PROTO_DATA *TcpProto; - TCP4_SERVICE_DATA *TcpService; - TCP_CB *Tcb; - IPv4_DEVICE_PATH Ip4DPathNode; - EFI_STATUS Status; - TCP_PORTNO LocalPort; - TCP_PORTNO RemotePort; - - TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved; - TcpService = TcpProto->TcpService; - Tcb = TcpProto->TcpPcb; - - LocalPort = NTOHS (Tcb->LocalEnd.Port); - RemotePort = NTOHS (Tcb->RemoteEnd.Port); - NetLibCreateIPv4DPathNode ( - &Ip4DPathNode, - TcpService->ControllerHandle, - Tcb->LocalEnd.Ip, - LocalPort, - Tcb->RemoteEnd.Ip, - RemotePort, - EFI_IP_PROTO_TCP, - Tcb->UseDefaultAddr - ); - - IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask); - - Sock->DevicePath = AppendDevicePathNode ( - Sock->ParentDevicePath, - (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode - ); - if (Sock->DevicePath == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Status = gBS->InstallProtocolInterface ( - &Sock->SockHandle, - &gEfiDevicePathProtocolGuid, - EFI_NATIVE_INTERFACE, - Sock->DevicePath - ); - if (EFI_ERROR (Status)) { - FreePool (Sock->DevicePath); - } - - return Status; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c deleted file mode 100644 index e84310f6c693..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c +++ /dev/null @@ -1,352 +0,0 @@ -/** @file - Routines to process TCP option. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -/** - Get a UINT16 value from buffer. - - @param Buf Pointer to input buffer. - - @return The UINT16 value get from buffer. - -**/ -UINT16 -TcpGetUint16 ( - IN UINT8 *Buf - ) -{ - UINT16 Value; - CopyMem (&Value, Buf, sizeof (UINT16)); - return NTOHS (Value); -} - -/** - Get a UINT32 value from buffer. - - @param Buf Pointer to input buffer. - - @return The UINT32 value get from buffer. - -**/ -UINT32 -TcpGetUint32 ( - IN UINT8 *Buf - ) -{ - UINT32 Value; - CopyMem (&Value, Buf, sizeof (UINT32)); - return NTOHL (Value); -} - -/** - Put a UINT32 value in buffer. - - @param Buf Pointer to the buffer. - @param Data The UINT32 Date to put in buffer - -**/ -VOID -TcpPutUint32 ( - OUT UINT8 *Buf, - IN UINT32 Data - ) -{ - Data = HTONL (Data); - CopyMem (Buf, &Data, sizeof (UINT32)); -} - - -/** - Compute the window scale value according to the given buffer size. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The scale value. - -**/ -UINT8 -TcpComputeScale ( - IN TCP_CB *Tcb - ) -{ - UINT8 Scale; - UINT32 BufSize; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - BufSize = GET_RCV_BUFFSIZE (Tcb->Sk); - - Scale = 0; - while ((Scale < TCP_OPTION_MAX_WS) && - ((UINT32) (TCP_OPTION_MAX_WIN << Scale) < BufSize)) { - - Scale++; - } - - return Scale; -} - - -/** - Build the TCP option in three-way handshake. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpSynBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - UINT8 *Data; - UINT16 Len; - - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); - - Len = 0; - - // - // Add timestamp option if not disabled by application - // and it is the first SYN segment or the peer has sent - // us its timestamp. - // - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS) && - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS))) { - - Data = NetbufAllocSpace ( - Nbuf, - TCP_OPTION_TS_ALIGNED_LEN, - NET_BUF_HEAD - ); - - ASSERT (Data != NULL); - Len += TCP_OPTION_TS_ALIGNED_LEN; - - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); - TcpPutUint32 (Data + 4, mTcpTick); - TcpPutUint32 (Data + 8, 0); - } - - // - // Build window scale option, only when are configured - // to send WS option, and either we are doing active - // open or we have received WS option from peer. - // - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS) && - (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS))) { - - Data = NetbufAllocSpace ( - Nbuf, - TCP_OPTION_WS_ALIGNED_LEN, - NET_BUF_HEAD - ); - - ASSERT (Data != NULL); - - Len += TCP_OPTION_WS_ALIGNED_LEN; - TcpPutUint32 (Data, TCP_OPTION_WS_FAST | TcpComputeScale (Tcb)); - } - - // - // Build MSS option - // - Data = NetbufAllocSpace (Nbuf, TCP_OPTION_MSS_LEN, 1); - ASSERT (Data != NULL); - - Len += TCP_OPTION_MSS_LEN; - TcpPutUint32 (Data, TCP_OPTION_MSS_FAST | Tcb->RcvMss); - - return Len; -} - - -/** - Build the TCP option in synchronized states. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - UINT8 *Data; - UINT16 Len; - - ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL)); - Len = 0; - - // - // Build Timestamp option - // - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_TS) && - !TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_RST)) { - - Data = NetbufAllocSpace ( - Nbuf, - TCP_OPTION_TS_ALIGNED_LEN, - NET_BUF_HEAD - ); - - ASSERT (Data != NULL); - Len += TCP_OPTION_TS_ALIGNED_LEN; - - TcpPutUint32 (Data, TCP_OPTION_TS_FAST); - TcpPutUint32 (Data + 4, mTcpTick); - TcpPutUint32 (Data + 8, Tcb->TsRecent); - } - - return Len; -} - - -/** - Parse the supported options. - - @param Tcp Pointer to the TCP_CB of this TCP instance. - @param Option Pointer to the TCP_OPTION used to store the successfully pasrsed - options. - - @retval 0 The options are successfully pasrsed. - @retval -1 Ilegal option was found. - -**/ -INTN -TcpParseOption ( - IN TCP_HEAD *Tcp, - IN OUT TCP_OPTION *Option - ) -{ - UINT8 *Head; - UINT8 TotalLen; - UINT8 Cur; - UINT8 Type; - UINT8 Len; - - ASSERT ((Tcp != NULL) && (Option != NULL)); - - Option->Flag = 0; - - TotalLen = (UINT8) ((Tcp->HeadLen << 2) - sizeof (TCP_HEAD)); - if (TotalLen <= 0) { - return 0; - } - - Head = (UINT8 *) (Tcp + 1); - - // - // Fast process of timestamp option - // - if ((TotalLen == TCP_OPTION_TS_ALIGNED_LEN) && - (TcpGetUint32 (Head) == TCP_OPTION_TS_FAST)) { - - Option->TSVal = TcpGetUint32 (Head + 4); - Option->TSEcr = TcpGetUint32 (Head + 8); - Option->Flag = TCP_OPTION_RCVD_TS; - - return 0; - } - - // - // Slow path to process the options. - // - Cur = 0; - - while (Cur < TotalLen) { - Type = Head[Cur]; - - switch (Type) { - case TCP_OPTION_MSS: - Len = Head[Cur + 1]; - - if ((Len != TCP_OPTION_MSS_LEN) || - (TotalLen - Cur < TCP_OPTION_MSS_LEN)) { - - return -1; - } - - Option->Mss = TcpGetUint16 (&Head[Cur + 2]); - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_MSS); - - Cur += TCP_OPTION_MSS_LEN; - break; - - case TCP_OPTION_WS: - Len = Head[Cur + 1]; - - if ((Len != TCP_OPTION_WS_LEN) || - (TotalLen - Cur < TCP_OPTION_WS_LEN)) { - - return -1; - } - - Option->WndScale = (UINT8) MIN (14, Head[Cur + 2]); - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_WS); - - Cur += TCP_OPTION_WS_LEN; - break; - - case TCP_OPTION_TS: - Len = Head[Cur + 1]; - - if ((Len != TCP_OPTION_TS_LEN) || - (TotalLen - Cur < TCP_OPTION_TS_LEN)) { - - return -1; - } - - Option->TSVal = TcpGetUint32 (&Head[Cur + 2]); - Option->TSEcr = TcpGetUint32 (&Head[Cur + 6]); - TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_TS); - - Cur += TCP_OPTION_TS_LEN; - break; - - case TCP_OPTION_NOP: - Cur++; - break; - - case TCP_OPTION_EOP: - Cur = TotalLen; - break; - - default: - Len = Head[Cur + 1]; - - if ((TotalLen - Cur) < Len || Len < 2) { - return -1; - } - - Cur = (UINT8) (Cur + Len); - break; - } - - } - - return 0; -} - - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c deleted file mode 100644 index 760b09a1eda1..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c +++ /dev/null @@ -1,1238 +0,0 @@ -/** @file - TCP output process routines. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -UINT8 mTcpOutFlag[] = { - 0, // TCP_CLOSED - 0, // TCP_LISTEN - TCP_FLG_SYN, // TCP_SYN_SENT - TCP_FLG_SYN | TCP_FLG_ACK, // TCP_SYN_RCVD - TCP_FLG_ACK, // TCP_ESTABLISHED - TCP_FLG_FIN | TCP_FLG_ACK, // TCP_FIN_WAIT_1 - TCP_FLG_ACK, // TCP_FIN_WAIT_2 - TCP_FLG_ACK | TCP_FLG_FIN, // TCP_CLOSING - TCP_FLG_ACK, // TCP_TIME_WAIT - TCP_FLG_ACK, // TCP_CLOSE_WAIT - TCP_FLG_FIN | TCP_FLG_ACK // TCP_LAST_ACK -}; - - -/** - Compute the sequence space left in the old receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence space left in the old receive window. - -**/ -UINT32 -TcpRcvWinOld ( - IN TCP_CB *Tcb - ) -{ - UINT32 OldWin; - - OldWin = 0; - - if (TCP_SEQ_GT (Tcb->RcvWl2 + Tcb->RcvWnd, Tcb->RcvNxt)) { - - OldWin = TCP_SUB_SEQ ( - Tcb->RcvWl2 + Tcb->RcvWnd, - Tcb->RcvNxt - ); - } - - return OldWin; -} - - -/** - Compute the current receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The size of the current receive window, in bytes. - -**/ -UINT32 -TcpRcvWinNow ( - IN TCP_CB *Tcb - ) -{ - SOCKET *Sk; - UINT32 Win; - UINT32 Increase; - UINT32 OldWin; - - Sk = Tcb->Sk; - ASSERT (Sk != NULL); - - OldWin = TcpRcvWinOld (Tcb); - - Win = SockGetFreeSpace (Sk, SOCK_RCV_BUF); - - Increase = 0; - if (Win > OldWin) { - Increase = Win - OldWin; - } - - // - // Receiver's SWS: don't advertise a bigger window - // unless it can be increased by at least one Mss or - // half of the receive buffer. - // - if ((Increase > Tcb->SndMss) || - (2 * Increase >= GET_RCV_BUFFSIZE (Sk))) { - - return Win; - } - - return OldWin; -} - - -/** - Compute the value to fill in the window size field of the outgoing segment. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Syn The flag to indicate whether the outgoing segment is a SYN - segment. - - @return The value of the local receive window size used to fill the outing segment. - -**/ -UINT16 -TcpComputeWnd ( - IN OUT TCP_CB *Tcb, - IN BOOLEAN Syn - ) -{ - UINT32 Wnd; - - // - // RFC requires that initial window not be scaled - // - if (Syn) { - - Wnd = GET_RCV_BUFFSIZE (Tcb->Sk); - } else { - - Wnd = TcpRcvWinNow (Tcb); - - Tcb->RcvWnd = Wnd; - } - - Wnd = MIN (Wnd >> Tcb->RcvWndScale, 0xffff); - return NTOHS ((UINT16) Wnd); -} - - -/** - Get the maximum SndNxt. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence number of the maximum SndNxt. - -**/ -TCP_SEQNO -TcpGetMaxSndNxt ( - IN TCP_CB *Tcb - ) -{ - LIST_ENTRY *Entry; - NET_BUF *Nbuf; - - if (IsListEmpty (&Tcb->SndQue)) { - return Tcb->SndNxt; - } - - Entry = Tcb->SndQue.BackLink; - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - - ASSERT (TCP_SEQ_GEQ (TCPSEG_NETBUF (Nbuf)->End, Tcb->SndNxt)); - return TCPSEG_NETBUF (Nbuf)->End; -} - - -/** - Compute how much data to send. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The length of the data can be sent, if 0, no data can be sent. - -**/ -UINT32 -TcpDataToSend ( - IN TCP_CB *Tcb, - IN INTN Force - ) -{ - SOCKET *Sk; - UINT32 Win; - UINT32 Len; - UINT32 Left; - UINT32 Limit; - - Sk = Tcb->Sk; - ASSERT (Sk != NULL); - - // - // TCP should NOT send data beyond the send window - // and congestion window. The right edge of send - // window is defined as SND.WL2 + SND.WND. The right - // edge of congestion window is defined as SND.UNA + - // CWND. - // - Win = 0; - Limit = Tcb->SndWl2 + Tcb->SndWnd; - - if (TCP_SEQ_GT (Limit, Tcb->SndUna + Tcb->CWnd)) { - - Limit = Tcb->SndUna + Tcb->CWnd; - } - - if (TCP_SEQ_GT (Limit, Tcb->SndNxt)) { - Win = TCP_SUB_SEQ (Limit, Tcb->SndNxt); - } - - // - // The data to send contains two parts: the data on the - // socket send queue, and the data on the TCB's send - // buffer. The later can be non-zero if the peer shrinks - // its advertised window. - // - Left = GET_SND_DATASIZE (Sk) + - TCP_SUB_SEQ (TcpGetMaxSndNxt (Tcb), Tcb->SndNxt); - - Len = MIN (Win, Left); - - if (Len > Tcb->SndMss) { - Len = Tcb->SndMss; - } - - if ((Force != 0)|| (Len == 0 && Left == 0)) { - return Len; - } - - if (Len == 0 && Left != 0) { - goto SetPersistTimer; - } - - // - // Sender's SWS avoidance: Don't send a small segment unless - // a)A full-sized segment can be sent, - // b)at least one-half of the maximum sized windows that - // the other end has ever advertised. - // c)It can send everything it has and either it isn't - // expecting an ACK or the Nagle algorithm is disabled. - // - if ((Len == Tcb->SndMss) || (2 * Len >= Tcb->SndWndMax)) { - - return Len; - } - - if ((Len == Left) && - ((Tcb->SndNxt == Tcb->SndUna) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE))) { - - return Len; - } - - // - // RFC1122 suggests to set a timer when SWSA forbids TCP - // sending more data, and combine it with probe timer. - // -SetPersistTimer: - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { - - DEBUG ( - (EFI_D_WARN, - "TcpDataToSend: enter persistent state for TCB %p\n", - Tcb) - ); - - if (!Tcb->ProbeTimerOn) { - TcpSetProbeTimer (Tcb); - } - } - - return 0; -} - - -/** - Build the TCP header of the TCP segment and transmit the segment by IP. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer containing the segment to be sent out. - - @retval 0 The segment is sent out successfully. - @retval other Error condition occurred. - -**/ -INTN -TcpTransmitSegment ( - IN OUT TCP_CB *Tcb, - IN NET_BUF *Nbuf - ) -{ - UINT16 Len; - TCP_HEAD *Head; - TCP_SEG *Seg; - BOOLEAN Syn; - UINT32 DataLen; - - ASSERT ((Nbuf != NULL) && (Nbuf->Tcp == NULL) && (TcpVerifySegment (Nbuf) != 0)); - - DataLen = Nbuf->TotalSize; - - Seg = TCPSEG_NETBUF (Nbuf); - Syn = TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN); - - if (Syn) { - - Len = TcpSynBuildOption (Tcb, Nbuf); - } else { - - Len = TcpBuildOption (Tcb, Nbuf); - } - - ASSERT ((Len % 4 == 0) && (Len <= 40)); - - Len += sizeof (TCP_HEAD); - - Head = (TCP_HEAD *) NetbufAllocSpace ( - Nbuf, - sizeof (TCP_HEAD), - NET_BUF_HEAD - ); - - ASSERT (Head != NULL); - - Nbuf->Tcp = Head; - - Head->SrcPort = Tcb->LocalEnd.Port; - Head->DstPort = Tcb->RemoteEnd.Port; - Head->Seq = NTOHL (Seg->Seq); - Head->Ack = NTOHL (Tcb->RcvNxt); - Head->HeadLen = (UINT8) (Len >> 2); - Head->Res = 0; - Head->Wnd = TcpComputeWnd (Tcb, Syn); - Head->Checksum = 0; - - // - // Check whether to set the PSH flag. - // - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_PSH); - - if (DataLen != 0) { - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_PSH) && - TCP_SEQ_BETWEEN (Seg->Seq, Tcb->SndPsh, Seg->End)) { - - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH); - - } else if ((Seg->End == Tcb->SndNxt) && - (GET_SND_DATASIZE (Tcb->Sk) == 0)) { - - TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH); - } - } - - // - // Check whether to set the URG flag and the urgent pointer. - // - TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG); - - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) && - TCP_SEQ_LEQ (Seg->Seq, Tcb->SndUp)) { - - TCP_SET_FLG (Seg->Flag, TCP_FLG_URG); - - if (TCP_SEQ_LT (Tcb->SndUp, Seg->End)) { - - Seg->Urg = (UINT16) TCP_SUB_SEQ (Tcb->SndUp, Seg->Seq); - } else { - - Seg->Urg = (UINT16) MIN ( - TCP_SUB_SEQ (Tcb->SndUp, - Seg->Seq), - 0xffff - ); - } - } - - Head->Flag = Seg->Flag; - Head->Urg = NTOHS (Seg->Urg); - Head->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum); - - // - // update the TCP session's control information - // - Tcb->RcvWl2 = Tcb->RcvNxt; - if (Syn) { - Tcb->RcvWnd = NTOHS (Head->Wnd); - } - - // - // clear delayedack flag - // - Tcb->DelayedAck = 0; - - return TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip); -} - - -/** - Get a segment from the Tcb's SndQue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ) -{ - LIST_ENTRY *Head; - LIST_ENTRY *Cur; - NET_BUF *Node; - TCP_SEG *Seg; - NET_BUF *Nbuf; - TCP_SEQNO End; - UINT8 *Data; - UINT8 Flag; - INT32 Offset; - INT32 CopyLen; - - ASSERT ((Tcb != NULL) && TCP_SEQ_LEQ (Seq, Tcb->SndNxt) && (Len > 0)); - - // - // Find the segment that contains the Seq. - // - Head = &Tcb->SndQue; - - Node = NULL; - Seg = NULL; - - NET_LIST_FOR_EACH (Cur, Head) { - Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List); - Seg = TCPSEG_NETBUF (Node); - - if (TCP_SEQ_LT (Seq, Seg->End) && TCP_SEQ_LEQ (Seg->Seq, Seq)) { - - break; - } - } - - ASSERT (Cur != Head); - ASSERT (Node != NULL); - ASSERT (Seg != NULL); - - // - // Return the buffer if it can be returned without - // adjustment: - // - if ((Seg->Seq == Seq) && - TCP_SEQ_LEQ (Seg->End, Seg->Seq + Len) && - !NET_BUF_SHARED (Node)) { - - NET_GET_REF (Node); - return Node; - } - - // - // Create a new buffer and copy data there. - // - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return NULL; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - Flag = Seg->Flag; - End = Seg->End; - - if (TCP_SEQ_LT (Seq + Len, Seg->End)) { - End = Seq + Len; - } - - CopyLen = TCP_SUB_SEQ (End, Seq); - Offset = TCP_SUB_SEQ (Seq, Seg->Seq); - - // - // If SYN is set and out of the range, clear the flag. - // Because the sequence of the first byte is SEG.SEQ+1, - // adjust Offset by -1. If SYN is in the range, copy - // one byte less. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - - if (TCP_SEQ_LT (Seg->Seq, Seq)) { - - TCP_CLEAR_FLG (Flag, TCP_FLG_SYN); - Offset--; - } else { - - CopyLen--; - } - } - - // - // If FIN is set and in the range, copy one byte less, - // and if it is out of the range, clear the flag. - // - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - - if (Seg->End == End) { - - CopyLen--; - } else { - - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); - } - } - - ASSERT (CopyLen >= 0); - - // - // copy data to the segment - // - if (CopyLen != 0) { - Data = NetbufAllocSpace (Nbuf, CopyLen, NET_BUF_TAIL); - ASSERT (Data != NULL); - - if ((INT32) NetbufCopy (Node, Offset, CopyLen, Data) != CopyLen) { - goto OnError; - } - } - - CopyMem (TCPSEG_NETBUF (Nbuf), Seg, sizeof (TCP_SEG)); - - TCPSEG_NETBUF (Nbuf)->Seq = Seq; - TCPSEG_NETBUF (Nbuf)->End = End; - TCPSEG_NETBUF (Nbuf)->Flag = Flag; - - return Nbuf; - -OnError: - NetbufFree (Nbuf); - return NULL; -} - - -/** - Get a segment from the Tcb's socket buffer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSock ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ) -{ - NET_BUF *Nbuf; - UINT8 *Data; - UINT32 DataGet; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL)); - - Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD); - - if (Nbuf == NULL) { - DEBUG ((EFI_D_ERROR, "TcpGetSegmentSock: failed to allocate " - "a netbuf for TCB %p\n",Tcb)); - - return NULL; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - DataGet = 0; - - if (Len != 0) { - // - // copy data to the segment. - // - Data = NetbufAllocSpace (Nbuf, Len, NET_BUF_TAIL); - ASSERT (Data != NULL); - - DataGet = SockGetDataToSend (Tcb->Sk, 0, Len, Data); - } - - NET_GET_REF (Nbuf); - - TCPSEG_NETBUF (Nbuf)->Seq = Seq; - TCPSEG_NETBUF (Nbuf)->End = Seq + Len; - - InsertTailList (&(Tcb->SndQue), &(Nbuf->List)); - - if (DataGet != 0) { - - SockDataSent (Tcb->Sk, DataGet); - } - - return Nbuf; -} - - -/** - Get a segment starting from sequence Seq of a maximum - length of Len. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegment ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ) -{ - NET_BUF *Nbuf; - - ASSERT (Tcb != NULL); - - // - // Compare the SndNxt with the max sequence number sent. - // - if ((Len != 0) && TCP_SEQ_LT (Seq, TcpGetMaxSndNxt (Tcb))) { - - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); - } else { - - Nbuf = TcpGetSegmentSock (Tcb, Seq, Len); - } - - ASSERT (TcpVerifySegment (Nbuf) != 0); - return Nbuf; -} - - -/** - Retransmit the segment from sequence Seq. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment to be retransmitted. - - @retval 0 Retransmission succeeded. - @retval -1 Error condition occurred. - -**/ -INTN -TcpRetransmit ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq - ) -{ - NET_BUF *Nbuf; - UINT32 Len; - - // - // Compute the maxium length of retransmission. It is - // limited by three factors: - // 1. Less than SndMss - // 2. must in the current send window - // 3. will not change the boundaries of queued segments. - // - - // - // Handle the Window Retraction if TCP window scale is enabled according to RFC7323: - // On first retransmission, or if the sequence number is out of - // window by less than 2^Rcv.Wind.Shift, then do normal - // retransmission(s) without regard to the receiver window as long - // as the original segment was in window when it was sent. - // - if ((Tcb->SndWndScale != 0) && - (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax) || TCP_SEQ_BETWEEN (Tcb->SndWl2 + Tcb->SndWnd, Seq, Tcb->SndWl2 + Tcb->SndWnd + (1 << Tcb->SndWndScale)))) { - Len = TCP_SUB_SEQ (Tcb->SndNxt, Seq); - DEBUG ( - (EFI_D_WARN, - "TcpRetransmit: retransmission without regard to the receiver window for TCB %p\n", - Tcb) - ); - - } else if (TCP_SEQ_GEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq)) { - Len = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq); - - } else { - DEBUG ( - (EFI_D_WARN, - "TcpRetransmit: retransmission cancelled because send window too small for TCB %p\n", - Tcb) - ); - - return 0; - } - - Len = MIN (Len, Tcb->SndMss); - - Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len); - if (Nbuf == NULL) { - return -1; - } - - ASSERT (TcpVerifySegment (Nbuf) != 0); - - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { - goto OnError; - } - - if (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax)) { - Tcb->RetxmitSeqMax = Seq; - } - - // - // The retransmitted buffer may be on the SndQue, - // trim TCP head because all the buffer on SndQue - // are headless. - // - ASSERT (Nbuf->Tcp != NULL); - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - NetbufFree (Nbuf); - return 0; - -OnError: - if (Nbuf != NULL) { - NetbufFree (Nbuf); - } - - return -1; -} - - -/** - Check whether to send data/SYN/FIN and piggy back an ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The number of bytes sent. - -**/ -INTN -TcpToSendData ( - IN OUT TCP_CB *Tcb, - IN INTN Force - ) -{ - UINT32 Len; - INTN Sent; - UINT8 Flag; - NET_BUF *Nbuf; - TCP_SEG *Seg; - TCP_SEQNO Seq; - TCP_SEQNO End; - - ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL) && (Tcb->State != TCP_LISTEN)); - - Sent = 0; - - if ((Tcb->State == TCP_CLOSED) || - TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT)) { - - return 0; - } - -SEND_AGAIN: - // - // compute how much data can be sent - // - Len = TcpDataToSend (Tcb, Force); - Seq = Tcb->SndNxt; - - ASSERT ((Tcb->State) < (ARRAY_SIZE (mTcpOutFlag))); - Flag = mTcpOutFlag[Tcb->State]; - - if ((Flag & TCP_FLG_SYN) != 0) { - - Seq = Tcb->Iss; - Len = 0; - } - - // - // only send a segment without data if SYN or - // FIN is set. - // - if ((Len == 0) && - ((Flag & (TCP_FLG_SYN | TCP_FLG_FIN)) == 0)) { - return Sent; - } - - Nbuf = TcpGetSegment (Tcb, Seq, Len); - - if (Nbuf == NULL) { - DEBUG ( - (EFI_D_ERROR, - "TcpToSendData: failed to get a segment for TCB %p\n", - Tcb) - ); - - goto OnError; - } - - Seg = TCPSEG_NETBUF (Nbuf); - - // - // Set the TcpSeg in Nbuf. - // - Len = Nbuf->TotalSize; - End = Seq + Len; - if (TCP_FLG_ON (Flag, TCP_FLG_SYN)) { - End++; - } - - if ((Flag & TCP_FLG_FIN) != 0) { - // - // Send FIN if all data is sent, and FIN is - // in the window - // - if ((TcpGetMaxSndNxt (Tcb) == Tcb->SndNxt) && - (GET_SND_DATASIZE (Tcb->Sk) == 0) && - TCP_SEQ_LT (End + 1, Tcb->SndWnd + Tcb->SndWl2)) { - - DEBUG ( - (EFI_D_NET, - "TcpToSendData: send FIN " - "to peer for TCB %p in state %s\n", - Tcb, - mTcpStateName[Tcb->State]) - ); - - End++; - } else { - TCP_CLEAR_FLG (Flag, TCP_FLG_FIN); - } - } - - Seg->Seq = Seq; - Seg->End = End; - Seg->Flag = Flag; - - ASSERT (TcpVerifySegment (Nbuf) != 0); - ASSERT (TcpCheckSndQue (&Tcb->SndQue) != 0); - - // - // don't send an empty segment here. - // - if (Seg->End == Seg->Seq) { - DEBUG ((EFI_D_WARN, "TcpToSendData: created a empty" - " segment for TCB %p, free it now\n", Tcb)); - - NetbufFree (Nbuf); - return Sent; - } - - if (TcpTransmitSegment (Tcb, Nbuf) != 0) { - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - if ((Flag & TCP_FLG_FIN) != 0) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); - } - - goto OnError; - } - - Sent += TCP_SUB_SEQ (End, Seq); - - // - // All the buffer in the SndQue is headless - // - ASSERT (Nbuf->Tcp != NULL); - - NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD); - Nbuf->Tcp = NULL; - - NetbufFree (Nbuf); - - // - // update status in TCB - // - Tcb->DelayedAck = 0; - - if ((Flag & TCP_FLG_FIN) != 0) { - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT); - } - - if (TCP_SEQ_GT (End, Tcb->SndNxt)) { - Tcb->SndNxt = End; - } - - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) { - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); - } - - // - // Enable RTT measurement only if not in retransmit. - // Karn's algorithm reqires not to update RTT when in loss. - // - if ((Tcb->CongestState == TCP_CONGEST_OPEN) && - !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - - DEBUG ((EFI_D_NET, "TcpToSendData: set RTT measure " - "sequence %d for TCB %p\n", Seq, Tcb)); - - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); - Tcb->RttSeq = Seq; - Tcb->RttMeasure = 0; - } - - if (Len == Tcb->SndMss) { - goto SEND_AGAIN; - } - - return Sent; - -OnError: - if (Nbuf != NULL) { - NetbufFree (Nbuf); - } - - return Sent; -} - - -/** - Send an ACK immediately. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSendAck ( - IN OUT TCP_CB *Tcb - ) -{ - NET_BUF *Nbuf; - TCP_SEG *Seg; - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - Seg = TCPSEG_NETBUF (Nbuf); - Seg->Seq = Tcb->SndNxt; - Seg->End = Tcb->SndNxt; - Seg->Flag = TCP_FLG_ACK; - - if (TcpTransmitSegment (Tcb, Nbuf) == 0) { - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW); - Tcb->DelayedAck = 0; - } - - NetbufFree (Nbuf); -} - - -/** - Send a zero probe segment. It can be used by keepalive and zero window probe. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 The zero probe segment was sent out successfully. - @retval other Error condition occurred. - -**/ -INTN -TcpSendZeroProbe ( - IN OUT TCP_CB *Tcb - ) -{ - NET_BUF *Nbuf; - TCP_SEG *Seg; - INTN Result; - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return -1; - } - - NetbufReserve (Nbuf, TCP_MAX_HEAD); - - // - // SndNxt-1 is out of window. The peer should respond - // with an ACK. - // - Seg = TCPSEG_NETBUF (Nbuf); - Seg->Seq = Tcb->SndNxt - 1; - Seg->End = Tcb->SndNxt - 1; - Seg->Flag = TCP_FLG_ACK; - - Result = TcpTransmitSegment (Tcb, Nbuf); - NetbufFree (Nbuf); - - return Result; -} - - -/** - Check whether to send an ACK or delayed ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpToSendAck ( - IN OUT TCP_CB *Tcb - ) -{ - UINT32 TcpNow; - - TcpNow = TcpRcvWinNow (Tcb); - // - // Generally, TCP should send a delayed ACK unless: - // 1. ACK at least every other FULL sized segment received, - // 2. Packets received out of order - // 3. Receiving window is open - // - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || - (Tcb->DelayedAck >= 1) || - (TcpNow > TcpRcvWinOld (Tcb))) { - TcpSendAck (Tcb); - return; - } - - DEBUG ((EFI_D_NET, "TcpToSendAck: scheduled a delayed" - " ACK for TCB %p\n", Tcb)); - - // - // schedule a delayed ACK - // - Tcb->DelayedAck++; -} - - -/** - Send a RESET segment in response to the segment received. - - @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL. - @param Head TCP header of the segment that triggers the reset. - @param Len Length of the segment that triggers the reset. - @param Local Local IP address. - @param Remote Remote peer's IP address. - - @retval 0 A reset is sent or no need to send it. - @retval -1 No reset is sent. - -**/ -INTN -TcpSendReset ( - IN TCP_CB *Tcb, - IN TCP_HEAD *Head, - IN INT32 Len, - IN UINT32 Local, - IN UINT32 Remote - ) -{ - NET_BUF *Nbuf; - TCP_HEAD *Nhead; - UINT16 HeadSum; - - // - // Don't respond to a Reset with reset - // - if ((Head->Flag & TCP_FLG_RST) != 0) { - return 0; - } - - Nbuf = NetbufAlloc (TCP_MAX_HEAD); - - if (Nbuf == NULL) { - return -1; - } - - Nhead = (TCP_HEAD *) NetbufAllocSpace ( - Nbuf, - sizeof (TCP_HEAD), - NET_BUF_TAIL - ); - - ASSERT (Nhead != NULL); - - Nbuf->Tcp = Nhead; - Nhead->Flag = TCP_FLG_RST; - - // - // Derive Seq/ACK from the segment if no TCB - // associated with it, otherwise from the Tcb - // - if (Tcb == NULL) { - - if (TCP_FLG_ON (Head->Flag, TCP_FLG_ACK)) { - Nhead->Seq = Head->Ack; - Nhead->Ack = 0; - } else { - Nhead->Seq = 0; - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); - Nhead->Ack = HTONL (NTOHL (Head->Seq) + Len); - } - } else { - - Nhead->Seq = HTONL (Tcb->SndNxt); - Nhead->Ack = HTONL (Tcb->RcvNxt); - TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK); - } - - Nhead->SrcPort = Head->DstPort; - Nhead->DstPort = Head->SrcPort; - Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2); - Nhead->Res = 0; - Nhead->Wnd = HTONS (0xFFFF); - Nhead->Checksum = 0; - Nhead->Urg = 0; - - HeadSum = NetPseudoHeadChecksum (Local, Remote, 6, 0); - Nhead->Checksum = TcpChecksum (Nbuf, HeadSum); - - TcpSendIpPacket (Tcb, Nbuf, Local, Remote); - - NetbufFree (Nbuf); - return 0; -} - - -/** - Verify that the segment is in good shape. - - @param Nbuf Buffer that contains the segment to be checked. - - @retval 0 The segment is broken. - @retval 1 The segment is in good shape. - -**/ -INTN -TcpVerifySegment ( - IN NET_BUF *Nbuf - ) -{ - TCP_HEAD *Head; - TCP_SEG *Seg; - UINT32 Len; - - if (Nbuf == NULL) { - return 1; - } - - NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE); - - Seg = TCPSEG_NETBUF (Nbuf); - Len = Nbuf->TotalSize; - Head = Nbuf->Tcp; - - if (Head != NULL) { - if (Head->Flag != Seg->Flag) { - return 0; - } - - Len -= (Head->HeadLen << 2); - } - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) { - Len++; - } - - if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) { - Len++; - } - - if (Seg->Seq + Len != Seg->End) { - return 0; - } - - return 1; -} - - -/** - Verify that all the segments in SndQue are in good shape. - - @param Head Pointer to the head node of the SndQue. - - @retval 0 At least one segment is broken. - @retval 1 All segments in the specific queue are in good shape. - -**/ -INTN -TcpCheckSndQue ( - IN LIST_ENTRY *Head - ) -{ - LIST_ENTRY *Entry; - NET_BUF *Nbuf; - TCP_SEQNO Seq; - - if (IsListEmpty (Head)) { - return 1; - } - // - // Initialize the Seq - // - Entry = Head->ForwardLink; - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - Seq = TCPSEG_NETBUF (Nbuf)->Seq; - - NET_LIST_FOR_EACH (Entry, Head) { - Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List); - - if (TcpVerifySegment (Nbuf) == 0) { - return 0; - } - - // - // All the node in the SndQue should has: - // SEG.SEQ = LAST_SEG.END - // - if (Seq != TCPSEG_NETBUF (Nbuf)->Seq) { - return 0; - } - - Seq = TCPSEG_NETBUF (Nbuf)->End; - } - - return 1; -} diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c deleted file mode 100644 index 4cb0ee7b5e6f..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c +++ /dev/null @@ -1,584 +0,0 @@ -/** @file - TCP timer related functions. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "Tcp4Main.h" - -UINT32 mTcpTick = 1000; - -/** - Connect timeout handler. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpConnectTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for TCP retransmission timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpRexmitTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for window probe timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpProbeTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for keepalive timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpKeepaliveTimeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for FIN_WAIT_2 timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpFinwait2Timeout ( - IN OUT TCP_CB *Tcb - ); - -/** - Timeout handler for 2MSL timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -Tcp2MSLTimeout ( - IN OUT TCP_CB *Tcb - ); - -TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = { - TcpConnectTimeout, - TcpRexmitTimeout, - TcpProbeTimeout, - TcpKeepaliveTimeout, - TcpFinwait2Timeout, - Tcp2MSLTimeout, -}; - -/** - Close the TCP connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClose ( - IN OUT TCP_CB *Tcb - ) -{ - NetbufFreeList (&Tcb->SndQue); - NetbufFreeList (&Tcb->RcvQue); - - TcpSetState (Tcb, TCP_CLOSED); -} - - -/** - Connect timeout handler. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpConnectTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - if (!TCP_CONNECTED (Tcb->State)) { - DEBUG ((EFI_D_ERROR, "TcpConnectTimeout: connection closed " - "because conenction timer timeout for TCB %p\n", Tcb)); - - if (EFI_ABORTED == Tcb->Sk->SockError) { - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); - } - - if (TCP_SYN_RCVD == Tcb->State) { - DEBUG ((EFI_D_WARN, "TcpConnectTimeout: send reset because " - "connection timer timeout for TCB %p\n", Tcb)); - - TcpResetConnection (Tcb); - - } - - TcpClose (Tcb); - } -} - - -/** - Timeout handler for TCP retransmission timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpRexmitTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - UINT32 FlightSize; - - DEBUG ((EFI_D_WARN, "TcpRexmitTimeout: transmission " - "timeout for TCB %p\n", Tcb)); - - // - // Set the congestion window. FlightSize is the - // amount of data that has been sent but not - // yet ACKed. - // - FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna); - Tcb->Ssthresh = MAX ((UINT32) (2 * Tcb->SndMss), FlightSize / 2); - - Tcb->CWnd = Tcb->SndMss; - Tcb->LossRecover = Tcb->SndNxt; - - Tcb->LossTimes++; - if ((Tcb->LossTimes > Tcb->MaxRexmit) && - !TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_CONNECT)) { - - DEBUG ((EFI_D_ERROR, "TcpRexmitTimeout: connection closed " - "because too many timeouts for TCB %p\n", Tcb)); - - if (EFI_ABORTED == Tcb->Sk->SockError) { - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); - } - - TcpClose (Tcb); - return ; - } - - TcpBackoffRto (Tcb); - TcpRetransmit (Tcb, Tcb->SndUna); - TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto); - - Tcb->CongestState = TCP_CONGEST_LOSS; - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON); -} - - -/** - Timeout handler for window probe timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpProbeTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - // - // This is the timer for sender's SWSA. RFC1122 requires - // a timer set for sender's SWSA, and suggest combine it - // with window probe timer. If data is sent, don't set - // the probe timer, since retransmit timer is on. - // - if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) { - - ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0); - Tcb->ProbeTimerOn = FALSE; - return ; - } - - TcpSendZeroProbe (Tcb); - TcpSetProbeTimer (Tcb); -} - - -/** - Timeout handler for keepalive timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpKeepaliveTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - Tcb->KeepAliveProbes++; - - // - // Too many Keep-alive probes, drop the connection - // - if (Tcb->KeepAliveProbes > Tcb->MaxKeepAlive) { - - if (EFI_ABORTED == Tcb->Sk->SockError) { - SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT); - } - - TcpClose (Tcb); - return ; - } - - TcpSendZeroProbe (Tcb); - TcpSetKeepaliveTimer (Tcb); -} - - -/** - Timeout handler for FIN_WAIT_2 timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpFinwait2Timeout ( - IN OUT TCP_CB *Tcb - ) -{ - DEBUG ((EFI_D_WARN, "TcpFinwait2Timeout: connection closed " - "because FIN_WAIT2 timer timeouts for TCB %p\n", Tcb)); - - TcpClose (Tcb); -} - - -/** - Timeout handler for 2MSL timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -Tcp2MSLTimeout ( - IN OUT TCP_CB *Tcb - ) -{ - DEBUG ((EFI_D_WARN, "Tcp2MSLTimeout: connection closed " - "because TIME_WAIT timer timeouts for TCB %p\n", Tcb)); - - TcpClose (Tcb); -} - - -/** - Update the timer status and the next expire time according to the timers - to expire in a specific future time slot. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpUpdateTimer ( - IN OUT TCP_CB *Tcb - ) -{ - UINT16 Index; - - // - // Don't use a too large value to init NextExpire - // since mTcpTick wraps around as sequence no does. - // - Tcb->NextExpire = 65535; - TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); - - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { - - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && - TCP_TIME_LT (Tcb->Timer[Index], mTcpTick + Tcb->NextExpire)) { - - Tcb->NextExpire = TCP_SUB_TIME (Tcb->Timer[Index], mTcpTick); - TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON); - } - } -} - - -/** - Enable a TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be enabled. - @param TimeOut The timeout value of this timer. - -**/ -VOID -TcpSetTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer, - IN UINT32 TimeOut - ) -{ - TCP_SET_TIMER (Tcb->EnabledTimer, Timer); - Tcb->Timer[Timer] = mTcpTick + TimeOut; - - TcpUpdateTimer (Tcb); -} - - -/** - Clear one TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be cleared. - -**/ -VOID -TcpClearTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer - ) -{ - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Timer); - TcpUpdateTimer (Tcb); -} - - -/** - Clear all TCP timers. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClearAllTimer ( - IN OUT TCP_CB *Tcb - ) -{ - Tcb->EnabledTimer = 0; - TcpUpdateTimer (Tcb); -} - - -/** - Enable the window prober timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetProbeTimer ( - IN OUT TCP_CB *Tcb - ) -{ - if (!Tcb->ProbeTimerOn) { - Tcb->ProbeTime = Tcb->Rto; - Tcb->ProbeTimerOn = TRUE; - - } else { - Tcb->ProbeTime <<= 1; - } - - if (Tcb->ProbeTime < TCP_RTO_MIN) { - - Tcb->ProbeTime = TCP_RTO_MIN; - } else if (Tcb->ProbeTime > TCP_RTO_MAX) { - - Tcb->ProbeTime = TCP_RTO_MAX; - } - - TcpSetTimer (Tcb, TCP_TIMER_PROBE, Tcb->ProbeTime); -} - - -/** - Enable the keepalive timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetKeepaliveTimer ( - IN OUT TCP_CB *Tcb - ) -{ - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE)) { - return ; - - } - - // - // Set the timer to KeepAliveIdle if either - // 1. the keepalive timer is off - // 2. The keepalive timer is on, but the idle - // is less than KeepAliveIdle, that means the - // connection is alive since our last probe. - // - if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_KEEPALIVE) || - (Tcb->Idle < Tcb->KeepAliveIdle)) { - - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAliveIdle); - Tcb->KeepAliveProbes = 0; - - } else { - - TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAlivePeriod); - } -} - - -/** - Backoff the RTO. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpBackoffRto ( - IN OUT TCP_CB *Tcb - ) -{ - // - // Fold the RTT estimate if too many times, the estimate - // may be wrong, fold it. So the next time a valid - // measurement is sampled, we can start fresh. - // - if ((Tcb->LossTimes >= TCP_FOLD_RTT) && (Tcb->SRtt != 0)) { - Tcb->RttVar += Tcb->SRtt >> 2; - Tcb->SRtt = 0; - } - - Tcb->Rto <<= 1; - - if (Tcb->Rto < TCP_RTO_MIN) { - - Tcb->Rto = TCP_RTO_MIN; - } else if (Tcb->Rto > TCP_RTO_MAX) { - - Tcb->Rto = TCP_RTO_MAX; - } -} - - -/** - Heart beat timer handler. - - @param Context Context of the timer event, ignored. - -**/ -VOID -EFIAPI -TcpTickingDpc ( - IN VOID *Context - ) -{ - LIST_ENTRY *Entry; - LIST_ENTRY *Next; - TCP_CB *Tcb; - INT16 Index; - - mTcpTick++; - mTcpGlobalIss += 100; - - // - // Don't use LIST_FOR_EACH, which isn't delete safe. - // - for (Entry = mTcpRunQue.ForwardLink; Entry != &mTcpRunQue; Entry = Next) { - - Next = Entry->ForwardLink; - - Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List); - - if (Tcb->State == TCP_CLOSED) { - continue; - } - // - // The connection is doing RTT measurement. - // - if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) { - Tcb->RttMeasure++; - } - - Tcb->Idle++; - - if (Tcb->DelayedAck != 0) { - TcpSendAck (Tcb); - } - - // - // No timer is active or no timer expired - // - if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON) || - ((--Tcb->NextExpire) > 0)) { - - continue; - } - - // - // Call the timeout handler for each expired timer. - // - for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) { - - if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) && - TCP_TIME_LEQ (Tcb->Timer[Index], mTcpTick)) { - // - // disable the timer before calling the handler - // in case the handler enables it again. - // - TCP_CLEAR_TIMER (Tcb->EnabledTimer, Index); - mTcpTimerHandler[Index](Tcb); - - // - // The Tcb may have been deleted by the timer, or - // no other timer is set. - // - if ((Next->BackLink != Entry) || - (Tcb->EnabledTimer == 0)) { - break; - } - } - } - - // - // If the Tcb still exist or some timer is set, update the timer - // - if (Index == TCP_TIMER_NUMBER) { - TcpUpdateTimer (Tcb); - } - } -} - -/** - Heart beat timer handler, queues the DPC at TPL_CALLBACK. - - @param Event Timer event signaled, ignored. - @param Context Context of the timer event, ignored. - -**/ -VOID -EFIAPI -TcpTicking ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - QueueDpc (TPL_CALLBACK, TcpTickingDpc, Context); -} - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c deleted file mode 100644 index a085ef61f341..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c +++ /dev/null @@ -1,365 +0,0 @@ -/** @file - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -// -// EFI Component Name Functions -// -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName = { - PxeBcComponentNameGetDriverName, - PxeBcComponentNameGetControllerName, - "eng" -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeBcComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeBcComponentNameGetControllerName, - "en" -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcDriverNameTable[] = { - { - "eng;en", - L"UEFI PXE Base Code Driver" - }, - { - NULL, - NULL - } -}; - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcControllerNameTable[] = { - { - "eng;en", - L"PXE Controller" - }, - { - NULL, - NULL - } -}; - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param[out] DriverName A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mPxeBcDriverNameTable, - DriverName, - (BOOLEAN)(This == &gPxeBcComponentName) - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param[in] ControllerHandle The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param[in] ChildHandle The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param[in] Language A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param[out] ControllerName A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -PxeBcComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_HANDLE NicHandle; - EFI_STATUS Status; - - if (ControllerHandle == NULL || ChildHandle != NULL) { - return EFI_UNSUPPORTED; - } - - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid); - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid); - - if (NicHandle == NULL) { - return EFI_UNSUPPORTED; - } - } - } - } - } - - Status = gBS->OpenProtocol ( - NicHandle, - &gEfiPxeBaseCodeProtocolGuid, - (VOID **) &PxeBc, - NULL, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mPxeBcControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gPxeBcComponentName) - ); -} diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c deleted file mode 100644 index f7b975f2997f..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c +++ /dev/null @@ -1,1999 +0,0 @@ -/** @file - Support for PxeBc dhcp functions. - -Copyright (c) 2013, Red Hat, Inc. -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -// -// This is a map from the interested DHCP4 option tags' index to the tag value. -// -UINT8 mInterestedDhcp4Tags[PXEBC_DHCP4_TAG_INDEX_MAX] = { - DHCP4_TAG_BOOTFILE_LEN, - DHCP4_TAG_VENDOR, - DHCP4_TAG_OVERLOAD, - DHCP4_TAG_MSG_TYPE, - DHCP4_TAG_SERVER_ID, - DHCP4_TAG_VENDOR_CLASS_ID, - DHCP4_TAG_BOOTFILE -}; - - -/** - This function initialize the DHCP4 message instance. - - This function will pad each item of dhcp4 message packet. - - @param Seed Pointer to the message instance of the DHCP4 packet. - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - -**/ -VOID -PxeBcInitSeedPacket ( - IN EFI_DHCP4_PACKET *Seed, - IN EFI_UDP4_PROTOCOL *Udp4 - ) -{ - EFI_SIMPLE_NETWORK_MODE Mode; - EFI_DHCP4_HEADER *Header; - - Udp4->GetModeData (Udp4, NULL, NULL, NULL, &Mode); - - Seed->Size = sizeof (EFI_DHCP4_PACKET); - Seed->Length = sizeof (Seed->Dhcp4); - - Header = &Seed->Dhcp4.Header; - - ZeroMem (Header, sizeof (EFI_DHCP4_HEADER)); - Header->OpCode = PXEBC_DHCP4_OPCODE_REQUEST; - Header->HwType = Mode.IfType; - Header->HwAddrLen = (UINT8) Mode.HwAddressSize; - CopyMem (Header->ClientHwAddr, &Mode.CurrentAddress, Header->HwAddrLen); - - Seed->Dhcp4.Magik = PXEBC_DHCP4_MAGIC; - Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP; -} - - -/** - Copy the DCHP4 packet from srouce to destination. - - @param[in] Dst Pointer to the cache buffer for DHCPv4 packet. - @param[in] Src Pointer to the DHCPv4 packet to be cached. - - @retval EFI_SUCCESS Packet is copied. - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold the packet. - -**/ -EFI_STATUS -PxeBcCopyEfiDhcp4Packet ( - IN EFI_DHCP4_PACKET *Dst, - IN EFI_DHCP4_PACKET *Src - ) -{ - if (Dst->Size < Src->Length) { - return EFI_BUFFER_TOO_SMALL; - } - - CopyMem (&Dst->Dhcp4, &Src->Dhcp4, Src->Length); - Dst->Length = Src->Length; - return EFI_SUCCESS; -} - - -/** - Copy the dhcp4 packet to the PxeBc private data and parse the dhcp4 packet. - - @param Private Pointer to PxeBc private data. - @param OfferIndex Index of cached packets as complements of pxe mode data, - the index is maximum offer number. - - @retval EFI_SUCCESS Cache and parse the packet successfully. - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold the packet. - -**/ -EFI_STATUS -PxeBcCopyProxyOffer ( - IN PXEBC_PRIVATE_DATA *Private, - IN UINT32 OfferIndex - ) -{ - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PACKET *Offer; - EFI_STATUS Status; - - ASSERT (OfferIndex < Private->NumOffers); - ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM); - - Mode = Private->PxeBc.Mode; - Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer; - - Status = PxeBcCopyEfiDhcp4Packet (&Private->ProxyOffer.Packet.Offer, Offer); - if (EFI_ERROR(Status)) { - return Status; - } - CopyMem (&Mode->ProxyOffer, &Offer->Dhcp4, Offer->Length); - Mode->ProxyOfferReceived = TRUE; - - PxeBcParseCachedDhcpPacket (&Private->ProxyOffer); - return EFI_SUCCESS; -} - - -/** - Parse the cached dhcp packet. - - @param CachedPacket Pointer to cached dhcp packet. - - @retval TRUE Succeed to parse and validation. - @retval FALSE Fail to parse or validation. - -**/ -BOOLEAN -PxeBcParseCachedDhcpPacket ( - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket - ) -{ - EFI_DHCP4_PACKET *Offer; - EFI_DHCP4_PACKET_OPTION **Options; - EFI_DHCP4_PACKET_OPTION *Option; - UINT8 OfferType; - UINTN Index; - UINT8 *Ptr8; - - CachedPacket->IsPxeOffer = FALSE; - ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket->Dhcp4Option)); - ZeroMem (&CachedPacket->PxeVendorOption, sizeof (CachedPacket->PxeVendorOption)); - - Offer = &CachedPacket->Packet.Offer; - Options = CachedPacket->Dhcp4Option; - - // - // Parse interested dhcp options and store their pointers in CachedPacket->Dhcp4Option. - // First, try to parse DHCPv4 options from the DHCP optional parameters field. - // - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { - Options[Index] = PxeBcParseExtendOptions ( - Offer->Dhcp4.Option, - GET_OPTION_BUFFER_LEN (Offer), - mInterestedDhcp4Tags[Index] - ); - } - // - // Second, Check if bootfilename and serverhostname is overloaded to carry DHCP options refers to rfc-2132. - // If yes, try to parse options from the BootFileName field, then ServerName field. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]; - if (Option != NULL) { - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) != 0) { - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { - if (Options[Index] == NULL) { - Options[Index] = PxeBcParseExtendOptions ( - (UINT8 *) Offer->Dhcp4.Header.BootFileName, - sizeof (Offer->Dhcp4.Header.BootFileName), - mInterestedDhcp4Tags[Index] - ); - } - } - } - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_SERVER_NAME) != 0) { - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) { - if (Options[Index] == NULL) { - Options[Index] = PxeBcParseExtendOptions ( - (UINT8 *) Offer->Dhcp4.Header.ServerName, - sizeof (Offer->Dhcp4.Header.ServerName), - mInterestedDhcp4Tags[Index] - ); - } - } - } - } - - // - // Check whether is an offer with PXEClient or not. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_CLASS_ID]; - if ((Option != NULL) && (Option->Length >= 9) && - (CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 9) == 0)) { - - CachedPacket->IsPxeOffer = TRUE; - } - - // - // Parse pxe vendor options and store their content/pointers in CachedPacket->PxeVendorOption. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_VENDOR]; - if (CachedPacket->IsPxeOffer && (Option != NULL)) { - - if (!PxeBcParseVendorOptions (Option, &CachedPacket->PxeVendorOption)) { - return FALSE; - } - } - - - // - // Parse PXE boot file name: - // According to PXE spec, boot file name should be read from DHCP option 67 (bootfile name) if present. - // Otherwise, read from boot file field in DHCP header. - // - if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { - // - // RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is null - // terminated string. So force to append null terminated character at the end of string. - // - Ptr8 = (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data[0]; - Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length; - if (*(Ptr8 - 1) != '\0') { - *Ptr8 = '\0'; - } - } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) { - // - // If the bootfile is not present and bootfilename is present in dhcp packet, just parse it. - // And do not count dhcp option header, or else will destroy the serverhostname. - // - // Make sure "BootFileName" is not overloaded. - // - if (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD] == NULL || - (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) == 0) { - Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] = (EFI_DHCP4_PACKET_OPTION *) (&Offer->Dhcp4.Header.BootFileName[0] - - OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0])); - } - } - - // - // Determine offer type of the dhcp packet. - // - Option = Options[PXEBC_DHCP4_TAG_INDEX_MSG_TYPE]; - if ((Option == NULL) || (Option->Data[0] == 0)) { - // - // It's a bootp offer - // - Option = CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]; - if (Option == NULL) { - // - // bootp offer without bootfilename, discard it. - // - return FALSE; - } - - OfferType = DHCP4_PACKET_TYPE_BOOTP; - - } else { - - if (IS_VALID_DISCOVER_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) { - // - // It's a pxe10 offer with PXEClient and discover vendor option. - // - OfferType = DHCP4_PACKET_TYPE_PXE10; - } else if (IS_VALID_MTFTP_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) { - // - // It's a wfm11a offer with PXEClient and mtftp vendor option, and - // return false since mtftp not supported currently. - // - return FALSE; - } else { - // - // If the binl offer with only PXEClient. - // - OfferType = (UINT8) ((CachedPacket->IsPxeOffer) ? DHCP4_PACKET_TYPE_BINL : DHCP4_PACKET_TYPE_DHCP_ONLY); - } - } - - CachedPacket->OfferType = OfferType; - - return TRUE; -} - - -/** - Offer dhcp service with a BINL dhcp offer. - - @param Private Pointer to PxeBc private data. - @param Index Index of cached packets as complements of pxe mode data, - the index is maximum offer number. - - @retval TRUE Offer the service successfully under priority BINL. - @retval FALSE Boot Service failed, parse cached dhcp packet failed or this - BINL ack cannot find options set or bootfile name specified. - -**/ -BOOLEAN -PxeBcTryBinl ( - IN PXEBC_PRIVATE_DATA *Private, - IN UINT32 Index - ) -{ - EFI_DHCP4_PACKET *Offer; - EFI_IP_ADDRESS ServerIp; - EFI_STATUS Status; - PXEBC_CACHED_DHCP4_PACKET *CachedPacket; - EFI_DHCP4_PACKET *Reply; - - ASSERT (Index < PXEBC_MAX_OFFER_NUM); - ASSERT (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL); - - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; - - // - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier) - // in DHCPOFFER packet. - // (It does not comply with PXE Spec, Ver2.1) - // - if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, &mZeroIp4Addr)) { - CopyMem ( - &ServerIp.Addr[0], - Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data, - sizeof (EFI_IPv4_ADDRESS) - ); - } else { - CopyMem ( - &ServerIp.Addr[0], - &Offer->Dhcp4.Header.ServerAddr, - sizeof (EFI_IPv4_ADDRESS) - ); - } - if (ServerIp.Addr[0] == 0) { - return FALSE; - } - - CachedPacket = &Private->ProxyOffer; - Reply = &CachedPacket->Packet.Offer; - - Status = PxeBcDiscvBootService ( - Private, - 0, - NULL, - FALSE, - &ServerIp, - 0, - NULL, - FALSE, - Reply - ); - if (EFI_ERROR (Status)) { - return FALSE; - } - - if (!PxeBcParseCachedDhcpPacket (CachedPacket)) { - return FALSE; - } - - if ((CachedPacket->OfferType != DHCP4_PACKET_TYPE_PXE10) && - (CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL)) { - // - // This BINL ack doesn't have discovery options set or bootfile name - // specified. - // - return FALSE; - } - - Private->PxeBc.Mode->ProxyOfferReceived = TRUE; - CopyMem (&Private->PxeBc.Mode->ProxyOffer, &Reply->Dhcp4, Reply->Length); - - return TRUE; -} - - -/** - Offer dhcp service for each proxy with a BINL dhcp offer. - - @param Private Pointer to PxeBc private data - @param OfferIndex Pointer to the index of cached packets as complements of - pxe mode data, the index is maximum offer number. - - @return If there is no service needed offer return FALSE, otherwise TRUE. - -**/ -BOOLEAN -PxeBcTryBinlProxy ( - IN PXEBC_PRIVATE_DATA *Private, - OUT UINT32 *OfferIndex - ) -{ - UINT32 Index; - - for (Index = 0; Index < Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]; Index++) { - - *OfferIndex = Private->BinlIndex[Index]; - // - // Try this BINL proxy offer - // - if (PxeBcTryBinl (Private, *OfferIndex)) { - return TRUE; - } - } - - return FALSE; -} - - -/** - This function is to check the selected proxy offer (include BINL dhcp offer and - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code - mode structure. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Operational successful. - @retval EFI_NO_RESPONSE Offer dhcp service failed. - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base code mode. - -**/ -EFI_STATUS -PxeBcCheckSelectedOffer ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - PXEBC_CACHED_DHCP4_PACKET *SelectedOffer; - EFI_DHCP4_PACKET_OPTION **Options; - UINT32 Index; - EFI_DHCP4_PACKET *Offer; - UINT32 ProxyOfferIndex; - EFI_STATUS Status; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PACKET *Ack; - - ASSERT (Private->SelectedOffer != 0); - - Status = EFI_SUCCESS; - SelectedOffer = &Private->Dhcp4Offers[Private->SelectedOffer - 1]; - Options = SelectedOffer->Dhcp4Option; - - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BINL) { - // - // The addresses are acquired from a BINL dhcp offer, try BINL to get - // the bootfile name - // - if (!PxeBcTryBinl (Private, Private->SelectedOffer - 1)) { - Status = EFI_NO_RESPONSE; - } - } else if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) { - // - // The selected offer to finish the D.O.R.A. is a DHCP only offer, we need - // try proxy offers if there are some, othewise the bootfile name must be - // set in this DHCP only offer. - // - if (Private->GotProxyOffer) { - // - // Get rid of the compiler warning. - // - ProxyOfferIndex = 0; - if (Private->SortOffers) { - // - // The offers are sorted before selecting, the proxy offer type must be - // already determined. - // - ASSERT (Private->ProxyIndex[Private->ProxyOfferType] > 0); - - if (Private->ProxyOfferType == DHCP4_PACKET_TYPE_BINL) { - // - // We buffer all received BINL proxy offers, try them all one by one - // - if (!PxeBcTryBinlProxy (Private, &ProxyOfferIndex)) { - Status = EFI_NO_RESPONSE; - } - } else { - // - // For other types, only one proxy offer is buffered. - // - ProxyOfferIndex = Private->ProxyIndex[Private->ProxyOfferType] - 1; - } - } else { - // - // The proxy offer type is not determined, choose proxy offer in the - // received order. - // - Status = EFI_NO_RESPONSE; - - ASSERT (Private->NumOffers < PXEBC_MAX_OFFER_NUM); - for (Index = 0; Index < Private->NumOffers; Index++) { - - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; - if (!IS_PROXY_DHCP_OFFER (Offer)) { - // - // Skip non proxy dhcp offers. - // - continue; - } - - if (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL) { - // - // Try BINL - // - if (!PxeBcTryBinl (Private, Index)) { - // - // Failed, skip to the next offer - // - continue; - } - } - - Private->ProxyOfferType = Private->Dhcp4Offers[Index].OfferType; - ProxyOfferIndex = Index; - Status = EFI_SUCCESS; - break; - } - } - - if (!EFI_ERROR (Status) && (Private->ProxyOfferType != DHCP4_PACKET_TYPE_BINL)) { - // - // Copy the proxy offer to Mode and set the flag - // - Status = PxeBcCopyProxyOffer (Private, ProxyOfferIndex); - } - } else { - // - // No proxy offer is received, the bootfile name MUST be set. - // - ASSERT (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL); - } - } - - if (!EFI_ERROR (Status)) { - // - // Everything is OK, set the flag and copy the DHCP packets. - // - Mode = Private->PxeBc.Mode; - Offer = &SelectedOffer->Packet.Offer; - - // - // The discover packet is already copied, just set flag here. - // - Mode->DhcpDiscoverValid = TRUE; - - Ack = &Private->Dhcp4Ack.Packet.Ack; - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BOOTP) { - // - // Other type of ACK is already cached. Bootp is special that we should - // use the bootp reply as the ACK and put it into the DHCP_ONLY buffer. - // - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Offer); - } - - PxeBcParseCachedDhcpPacket (&Private->Dhcp4Ack); - - Mode->DhcpAckReceived = TRUE; - - // - // Copy the dhcp ack. - // - CopyMem (&Mode->DhcpAck, &Ack->Dhcp4, Ack->Length); - } - - return Status; -} - - -/** - Cache the Dhcp4 packet offer, Parse and validate each option of the packet. - - @param Private Pointer to PxeBc private data. - @param RcvdOffer Pointer to the received Dhcp proxy offer packet. - - @retval EFI_SUCCESS Cache and parse the packet successfully. - @retval Others Operation failed. - -**/ -EFI_STATUS -PxeBcCacheDhcpOffer ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_DHCP4_PACKET *RcvdOffer - ) -{ - PXEBC_CACHED_DHCP4_PACKET *CachedOffer; - EFI_DHCP4_PACKET *Offer; - UINT8 OfferType; - EFI_STATUS Status; - - CachedOffer = &Private->Dhcp4Offers[Private->NumOffers]; - Offer = &CachedOffer->Packet.Offer; - - // - // Cache the orignal dhcp packet - // - Status = PxeBcCopyEfiDhcp4Packet (Offer, RcvdOffer); - if (EFI_ERROR(Status)) { - return Status; - } - - // - // Parse and validate the options (including dhcp option and vendor option) - // - if (!PxeBcParseCachedDhcpPacket (CachedOffer)) { - return EFI_ABORTED; - } - - OfferType = CachedOffer->OfferType; - if (OfferType >= DHCP4_PACKET_TYPE_MAX) { - return EFI_ABORTED; - } - - if (OfferType == DHCP4_PACKET_TYPE_BOOTP) { - - if (Private->BootpIndex != 0) { - // - // Only cache the first bootp offer, discard others. - // - return EFI_ABORTED; - } else { - // - // Take as a dhcp only offer, but record index specifically. - // - Private->BootpIndex = Private->NumOffers + 1; - } - } else { - - if (IS_PROXY_DHCP_OFFER (Offer)) { - // - // It's a proxy dhcp offer with no your address, including pxe10, wfm11a or binl offer. - // - Private->GotProxyOffer = TRUE; - - if (OfferType == DHCP4_PACKET_TYPE_BINL) { - // - // Cache all binl offers. - // - Private->BinlIndex[Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]] = Private->NumOffers; - Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]++; - } else if (Private->ProxyIndex[OfferType] != 0) { - // - // Only cache the first pxe10/wfm11a offers each, discard the others. - // - return EFI_ABORTED; - } else { - // - // Record index of the proxy dhcp offer with type other than binl. - // - Private->ProxyIndex[OfferType] = Private->NumOffers + 1; - } - } else { - // - // It's a dhcp offer with your address. - // - ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM); - Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] = Private->NumOffers; - Private->ServerCount[OfferType]++; - } - } - - // - // Count the accepted offers. - // - Private->NumOffers++; - - return EFI_SUCCESS; -} - -/** - Switch the Ip4 policy to static. - - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. - - @retval EFI_SUCCESS The policy is already configured to static. - @retval Others Other error as indicated.. - -**/ -EFI_STATUS -PxeBcSetIp4Policy ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - EFI_STATUS Status; - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; - EFI_IP4_CONFIG2_POLICY Policy; - UINTN DataSize; - - Ip4Config2 = Private->Ip4Config2; - DataSize = sizeof (EFI_IP4_CONFIG2_POLICY); - Status = Ip4Config2->GetData ( - Ip4Config2, - Ip4Config2DataTypePolicy, - &DataSize, - &Policy - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (Policy != Ip4Config2PolicyStatic) { - Policy = Ip4Config2PolicyStatic; - Status= Ip4Config2->SetData ( - Ip4Config2, - Ip4Config2DataTypePolicy, - sizeof (EFI_IP4_CONFIG2_POLICY), - &Policy - ); - if (EFI_ERROR (Status)) { - return Status; - } - } - - return EFI_SUCCESS; -} - - -/** - Select the specified proxy offer, such as BINL, DHCP_ONLY and so on. - If the proxy does not exist, try offers with bootfile. - - @param Private Pointer to PxeBc private data. - -**/ -VOID -PxeBcSelectOffer ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - UINT32 Index; - UINT32 OfferIndex; - EFI_DHCP4_PACKET *Offer; - - Private->SelectedOffer = 0; - - if (Private->SortOffers) { - // - // Select offer according to the priority - // - if (Private->ServerCount[DHCP4_PACKET_TYPE_PXE10] > 0) { - // - // DHCP with PXE10 - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_PXE10][0] + 1; - - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_WFM11A] > 0) { - // - // DHCP with WfM - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_WFM11A][0] + 1; - - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_PXE10] > 0) && - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) - ) { - // - // DHCP only and proxy DHCP with PXE10 - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; - Private->ProxyOfferType = DHCP4_PACKET_TYPE_PXE10; - - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_WFM11A] > 0) && - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) - ) { - // - // DHCP only and proxy DHCP with WfM - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; - Private->ProxyOfferType = DHCP4_PACKET_TYPE_WFM11A; - - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_BINL] > 0) { - // - // DHCP with BINL - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_BINL][0] + 1; - - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL] > 0) && - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0) - ) { - // - // DHCP only and proxy DHCP with BINL - // - Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1; - Private->ProxyOfferType = DHCP4_PACKET_TYPE_BINL; - - } else { - // - // Try offers with bootfile - // - for (Index = 0; Index < Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY]; Index++) { - // - // Select the first DHCP only offer with bootfile - // - OfferIndex = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][Index]; - if (Private->Dhcp4Offers[OfferIndex].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { - Private->SelectedOffer = OfferIndex + 1; - break; - } - } - - if (Private->SelectedOffer == 0) { - // - // Select the Bootp reply with bootfile if any - // - Private->SelectedOffer = Private->BootpIndex; - } - } - } else { - // - // Try the offers in the received order. - // - for (Index = 0; Index < Private->NumOffers; Index++) { - - Offer = &Private->Dhcp4Offers[Index].Packet.Offer; - - if (IS_PROXY_DHCP_OFFER (Offer)) { - // - // Skip proxy offers - // - continue; - } - - if ((Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) && - ((!Private->GotProxyOffer) && (Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL))) { - // - // DHCP only offer but no proxy offer received and no bootfile option in this offer - // - continue; - } - - Private->SelectedOffer = Index + 1; - break; - } - } -} - - -/** - Callback routine. - - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver - to intercept events that occurred in the configuration process. This structure - provides advanced control of each state transition of the DHCP process. The - returned status code determines the behavior of the EFI DHCPv4 Protocol driver. - There are three possible returned values, which are described in the following - table. - - @param This Pointer to the EFI DHCPv4 Protocol instance that is used to - configure this callback function. - @param Context Pointer to the context that is initialized by - EFI_DHCP4_PROTOCOL.Configure(). - @param CurrentState The current operational state of the EFI DHCPv4 Protocol - driver. - @param Dhcp4Event The event that occurs in the current state, which usually means a - state transition. - @param Packet The DHCP packet that is going to be sent or already received. - @param NewPacket The packet that is used to replace the above Packet. - - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue the DHCP process. - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol - driver will continue to wait for more DHCPOFFER packets until the retry - timeout expires. - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and - return to the Dhcp4Init or Dhcp4InitReboot state. - -**/ -EFI_STATUS -EFIAPI -PxeBcDhcpCallBack ( - IN EFI_DHCP4_PROTOCOL * This, - IN VOID *Context, - IN EFI_DHCP4_STATE CurrentState, - IN EFI_DHCP4_EVENT Dhcp4Event, - IN EFI_DHCP4_PACKET * Packet OPTIONAL, - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; - EFI_DHCP4_PACKET_OPTION *MaxMsgSize; - UINT16 Value; - EFI_STATUS Status; - BOOLEAN Received; - EFI_DHCP4_HEADER *DhcpHeader; - - if ((Dhcp4Event != Dhcp4RcvdOffer) && - (Dhcp4Event != Dhcp4SelectOffer) && - (Dhcp4Event != Dhcp4SendDiscover) && - (Dhcp4Event != Dhcp4RcvdAck) && - (Dhcp4Event != Dhcp4SendRequest)) { - return EFI_SUCCESS; - } - - Private = (PXEBC_PRIVATE_DATA *) Context; - Mode = Private->PxeBc.Mode; - Callback = Private->PxeBcCallback; - - // - // Override the Maximum DHCP Message Size. - // - MaxMsgSize = PxeBcParseExtendOptions ( - Packet->Dhcp4.Option, - GET_OPTION_BUFFER_LEN (Packet), - DHCP4_TAG_MAXMSG - ); - if (MaxMsgSize != NULL) { - Value = HTONS (PXEBC_DHCP4_MAX_PACKET_SIZE); - CopyMem (MaxMsgSize->Data, &Value, sizeof (Value)); - } - - if ((Dhcp4Event != Dhcp4SelectOffer) && (Callback != NULL)) { - Received = (BOOLEAN) ((Dhcp4Event == Dhcp4RcvdOffer) || (Dhcp4Event == Dhcp4RcvdAck)); - Status = Callback->Callback ( - Callback, - Private->Function, - Received, - Packet->Length, - (EFI_PXE_BASE_CODE_PACKET *) &Packet->Dhcp4 - ); - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { - return EFI_ABORTED; - } - } - - Status = EFI_SUCCESS; - - switch (Dhcp4Event) { - - case Dhcp4SendDiscover: - case Dhcp4SendRequest: - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { - // - // If the to be sent packet exceeds the maximum length, abort the DHCP process. - // - Status = EFI_ABORTED; - break; - } - - if (Mode->SendGUID) { - // - // send the system GUID instead of the MAC address as the hardware address - // in the DHCP packet header. - // - DhcpHeader = &Packet->Dhcp4.Header; - - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) { - // - // GUID not yet set - send all 0xff's to show programable (via SetVariable) - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff); - // GUID not yet set - send all 0's to show not programable - // - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n")); - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); - } - - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); - } - - if (Dhcp4Event == Dhcp4SendDiscover) { - // - // Cache the dhcp discover packet, of which some information will be used later. - // - CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet->Length); - } - - break; - - case Dhcp4RcvdOffer: - Status = EFI_NOT_READY; - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { - // - // Ignore the incoming Offers which exceed the maximum length. - // - break; - } - - if (Private->NumOffers < PXEBC_MAX_OFFER_NUM) { - // - // Cache the dhcp offers in Private->Dhcp4Offers[] - // If error happens, just ignore this packet and continue to wait more offer. - // - PxeBcCacheDhcpOffer (Private, Packet); - } - - break; - - case Dhcp4SelectOffer: - // - // Select an offer, if succeeded, Private->SelectedOffer points to - // the index of the selected one. - // - PxeBcSelectOffer (Private); - - if (Private->SelectedOffer == 0) { - Status = EFI_ABORTED; - } else { - *NewPacket = &Private->Dhcp4Offers[Private->SelectedOffer - 1].Packet.Offer; - } - - break; - - case Dhcp4RcvdAck: - // - // Cache Ack - // - ASSERT (Private->SelectedOffer != 0); - - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Packet); - if (EFI_ERROR (Status)) { - return EFI_ABORTED; - } - break; - - default: - break; - } - - return Status; -} - - -/** - Initialize the DHCP options and build the option list. - - @param Private Pointer to PxeBc private data. - @param OptList Pointer to a DHCP option list. - - @param IsDhcpDiscover Discover dhcp option or not. - - @return The index item number of the option list. - -**/ -UINT32 -PxeBcBuildDhcpOptions ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_DHCP4_PACKET_OPTION **OptList, - IN BOOLEAN IsDhcpDiscover - ) -{ - UINT32 Index; - PXEBC_DHCP4_OPTION_ENTRY OptEnt; - UINT16 Value; - - Index = 0; - OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer; - - if (!IsDhcpDiscover) { - // - // Append message type. - // - OptList[Index]->OpCode = DHCP4_TAG_MSG_TYPE; - OptList[Index]->Length = 1; - OptEnt.Mesg = (PXEBC_DHCP4_OPTION_MESG *) OptList[Index]->Data; - OptEnt.Mesg->Type = PXEBC_DHCP4_MSG_TYPE_REQUEST; - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append max message size. - // - OptList[Index]->OpCode = DHCP4_TAG_MAXMSG; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE); - OptEnt.MaxMesgSize = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *) OptList[Index]->Data; - Value = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE); - CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16)); - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - } - // - // Parameter request list option. - // - OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST; - OptList[Index]->Length = 35; - OptEnt.Para = (PXEBC_DHCP4_OPTION_PARA *) OptList[Index]->Data; - OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK; - OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET; - OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER; - OptEnt.Para->ParaList[3] = DHCP4_TAG_TIME_SERVER; - OptEnt.Para->ParaList[4] = DHCP4_TAG_NAME_SERVER; - OptEnt.Para->ParaList[5] = DHCP4_TAG_DNS_SERVER; - OptEnt.Para->ParaList[6] = DHCP4_TAG_HOSTNAME; - OptEnt.Para->ParaList[7] = DHCP4_TAG_BOOTFILE_LEN; - OptEnt.Para->ParaList[8] = DHCP4_TAG_DOMAINNAME; - OptEnt.Para->ParaList[9] = DHCP4_TAG_ROOTPATH; - OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH; - OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU; - OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL; - OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST; - OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN; - OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER; - OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER; - OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR; - OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP; - OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE; - OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID; - OptEnt.Para->ParaList[21] = DHCP4_TAG_T1; - OptEnt.Para->ParaList[22] = DHCP4_TAG_T2; - OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID; - OptEnt.Para->ParaList[24] = DHCP4_TAG_TFTP; - OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE; - OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID; - OptEnt.Para->ParaList[27] = 0x80; - OptEnt.Para->ParaList[28] = 0x81; - OptEnt.Para->ParaList[29] = 0x82; - OptEnt.Para->ParaList[30] = 0x83; - OptEnt.Para->ParaList[31] = 0x84; - OptEnt.Para->ParaList[32] = 0x85; - OptEnt.Para->ParaList[33] = 0x86; - OptEnt.Para->ParaList[34] = 0x87; - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append UUID/Guid-based client identifier option - // - OptList[Index]->OpCode = DHCP4_TAG_UUID; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID); - OptEnt.Uuid = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]->Data; - OptEnt.Uuid->Type = 0; - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) { - // - // GUID not yet set - send all 0xff's to show programable (via SetVariable) - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff); - // GUID not yet set - send all 0's to show not programable - // - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n")); - ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID)); - } - - // - // Append client network device interface option - // - OptList[Index]->OpCode = DHCP4_TAG_UNDI; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI); - OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]->Data; - if (Private->Nii != NULL) { - OptEnt.Undi->Type = Private->Nii->Type; - OptEnt.Undi->MajorVer = Private->Nii->MajorVer; - OptEnt.Undi->MinorVer = Private->Nii->MinorVer; - } else { - OptEnt.Undi->Type = DEFAULT_UNDI_TYPE; - OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR; - OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR; - } - - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append client system architecture option - // - OptList[Index]->OpCode = DHCP4_TAG_ARCH; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH); - OptEnt.Arch = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]->Data; - Value = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE); - CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16)); - Index++; - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); - - // - // Append client system architecture option - // - OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID; - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID); - OptEnt.Clid = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]->Data; - CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof (PXEBC_DHCP4_OPTION_CLID)); - CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid->ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType)); - - if (Private->Nii != NULL) { - // - // If NII protocol exists, update DHCP option data - // - CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof (OptEnt.Clid->InterfaceName)); - CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof (OptEnt.Clid->UndiMajor)); - CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof (OptEnt.Clid->UndiMinor)); - } - - Index++; - - return Index; -} - - -/** - Discover the boot of service and initialize the vendor option if exists. - - @param Private Pointer to PxeBc private data. - @param Type PxeBc option boot item type - @param Layer PxeBc option boot item layer - @param UseBis Use BIS or not - @param DestIp Ip address for server - @param IpCount The total count of the server ip address - @param SrvList Server list - @param IsDiscv Discover the vendor or not - @param Reply The dhcp4 packet of Pxe reply - - @retval EFI_SUCCESS Operation succeeds. - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. - @retval EFI_NOT_FOUND There is no vendor option exists. - @retval EFI_TIMEOUT Send Pxe Discover time out. - -**/ -EFI_STATUS -PxeBcDiscvBootService ( - IN PXEBC_PRIVATE_DATA * Private, - IN UINT16 Type, - IN UINT16 *Layer, - IN BOOLEAN UseBis, - IN EFI_IP_ADDRESS * DestIp, - IN UINT16 IpCount, - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, - IN BOOLEAN IsDiscv, - OUT EFI_DHCP4_PACKET * Reply OPTIONAL - ) -{ - EFI_PXE_BASE_CODE_UDP_PORT Sport; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; - BOOLEAN IsBCast; - EFI_STATUS Status; - UINT16 RepIndex; - UINT16 SrvIndex; - UINT16 TryIndex; - EFI_DHCP4_LISTEN_POINT ListenPoint; - EFI_DHCP4_PACKET *Response; - EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; - UINT32 OptCount; - EFI_DHCP4_PACKET_OPTION *PxeOpt; - PXEBC_OPTION_BOOT_ITEM *PxeBootItem; - UINT8 VendorOptLen; - EFI_DHCP4_HEADER *DhcpHeader; - UINT32 Xid; - - Mode = Private->PxeBc.Mode; - Dhcp4 = Private->Dhcp4; - Status = EFI_SUCCESS; - - ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN)); - - if (DestIp == NULL) { - Sport = PXEBC_DHCP4_S_PORT; - IsBCast = TRUE; - } else { - Sport = PXEBC_BS_DISCOVER_PORT; - IsBCast = FALSE; - } - - if (!UseBis && Layer != NULL) { - *Layer &= EFI_PXE_BASE_CODE_BOOT_LAYER_MASK; - } - - OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE); - - if (IsDiscv) { - ASSERT (Layer != NULL); - // - // Add vendor option of PXE_BOOT_ITEM - // - VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 + sizeof (PXEBC_OPTION_BOOT_ITEM) + 1); - OptList[OptCount] = AllocatePool (VendorOptLen); - if (OptList[OptCount] == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - OptList[OptCount]->OpCode = DHCP4_TAG_VENDOR; - OptList[OptCount]->Length = (UINT8) (VendorOptLen - 2); - PxeOpt = (EFI_DHCP4_PACKET_OPTION *) OptList[OptCount]->Data; - PxeOpt->OpCode = PXEBC_VENDOR_TAG_BOOT_ITEM; - PxeOpt->Length = (UINT8) sizeof (PXEBC_OPTION_BOOT_ITEM); - PxeBootItem = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt->Data; - PxeBootItem->Type = HTONS (Type); - PxeBootItem->Layer = HTONS (*Layer); - PxeOpt->Data[PxeOpt->Length] = DHCP4_TAG_EOP; - - OptCount++; - } - - Status = Dhcp4->Build (Dhcp4, &Private->SeedPacket, 0, NULL, OptCount, OptList, &Token.Packet); - - if (IsDiscv) { - FreePool (OptList[OptCount - 1]); - } - - if (EFI_ERROR (Status)) { - return Status; - } - - DhcpHeader = &Token.Packet->Dhcp4.Header; - if (Mode->SendGUID) { - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) { - // - // GUID not yet set - send all 0's to show not programable - // - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n")); - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID)); - } - - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID); - } - - Xid = NET_RANDOM (NetRandomInitSeed ()); - Token.Packet->Dhcp4.Header.Xid = HTONL(Xid); - Token.Packet->Dhcp4.Header.Reserved = HTONS((UINT16) ((IsBCast) ? 0x8000 : 0)); - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - - Token.RemotePort = Sport; - - if (IsBCast) { - SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff); - } else { - CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS)); - } - - CopyMem (&Token.GatewayAddress, &Private->GatewayIp, sizeof (EFI_IPv4_ADDRESS)); - - if (!IsBCast) { - Token.ListenPointCount = 1; - Token.ListenPoints = &ListenPoint; - Token.ListenPoints[0].ListenPort = PXEBC_BS_DISCOVER_PORT; - CopyMem (&Token.ListenPoints[0].ListenAddress, &Private->StationIp, sizeof(EFI_IPv4_ADDRESS)); - CopyMem (&Token.ListenPoints[0].SubnetMask, &Private->SubnetMask, sizeof(EFI_IPv4_ADDRESS)); - } - // - // Send Pxe Discover - // - for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; TryIndex++) { - - Token.TimeoutValue = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex); - Token.Packet->Dhcp4.Header.Seconds = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1)); - - Status = Dhcp4->TransmitReceive (Dhcp4, &Token); - - if (Token.Status != EFI_TIMEOUT) { - break; - } - } - - if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) { - // - // No server response our PXE request - // - Status = EFI_TIMEOUT; - } - - if (!EFI_ERROR (Status)) { - // - // Find Pxe Reply - // - RepIndex = 0; - SrvIndex = 0; - Response = Token.ResponseList; - - while (RepIndex < Token.ResponseCount) { - if (Response->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) { - SrvIndex = 0; - RepIndex++; - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size); - continue; - } - - while (SrvIndex < IpCount) { - - if (SrvList[SrvIndex].AcceptAnyResponse) { - break; - } - - if ((SrvList[SrvIndex].Type == Type) && EFI_IP4_EQUAL (&(Response->Dhcp4.Header.ServerAddr), &(Private->ServerIp))) { - break; - } - - SrvIndex++; - } - - if ((IpCount != SrvIndex) || (IpCount == 0)) { - break; - } - - SrvIndex = 0; - RepIndex++; - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size); - } - - if (RepIndex < Token.ResponseCount) { - - if (Reply != NULL) { - Status = PxeBcCopyEfiDhcp4Packet (Reply, Response); - if (EFI_ERROR(Status)) { - goto ON_EXIT; - } - } - - if (IsDiscv) { - CopyMem (&(Mode->PxeDiscover), &(Token.Packet->Dhcp4), Token.Packet->Length); - Mode->PxeDiscoverValid = TRUE; - - CopyMem (Mode->PxeReply.Raw, &Response->Dhcp4, Response->Length); - Mode->PxeReplyReceived = TRUE; - } - } else { - Status = EFI_NOT_FOUND; - } - } - -ON_EXIT: - // - // free the responselist - // - if (Token.ResponseList != NULL) { - FreePool (Token.ResponseList); - } - // - // Free the dhcp packet - // - if (Token.Packet != NULL) { - FreePool (Token.Packet); - } - - return Status; -} - - -/** - Parse interested dhcp options. - - @param Buffer Pointer to the dhcp options packet. - @param Length The length of the dhcp options. - @param OptTag The option OpCode. - - @return NULL if the buffer length is 0 and OpCode is not - DHCP4_TAG_EOP, or the pointer to the buffer. - -**/ -EFI_DHCP4_PACKET_OPTION * -PxeBcParseExtendOptions ( - IN UINT8 *Buffer, - IN UINT32 Length, - IN UINT8 OptTag - ) -{ - EFI_DHCP4_PACKET_OPTION *Option; - UINT32 Offset; - - Option = (EFI_DHCP4_PACKET_OPTION *) Buffer; - Offset = 0; - - while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) { - - if (Option->OpCode == OptTag) { - - return Option; - } - - if (Option->OpCode == DHCP4_TAG_PAD) { - Offset++; - } else { - Offset += Option->Length + 2; - } - - Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset); - } - - return NULL; -} - - -/** - This function is to parse and check vendor options. - - @param Dhcp4Option Pointer to dhcp options - @param VendorOption Pointer to vendor options - - @return TRUE if valid for vendor options, or FALSE. - -**/ -BOOLEAN -PxeBcParseVendorOptions ( - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, - IN PXEBC_VENDOR_OPTION *VendorOption - ) -{ - UINT32 *BitMap; - UINT8 VendorOptionLen; - EFI_DHCP4_PACKET_OPTION *PxeOption; - UINT8 Offset; - - BitMap = VendorOption->BitMap; - VendorOptionLen = Dhcp4Option->Length; - PxeOption = (EFI_DHCP4_PACKET_OPTION *) &Dhcp4Option->Data[0]; - Offset = 0; - - while ((Offset < VendorOptionLen) && (PxeOption->OpCode != DHCP4_TAG_EOP)) { - // - // Parse every Vendor Option and set its BitMap - // - switch (PxeOption->OpCode) { - - case PXEBC_VENDOR_TAG_MTFTP_IP: - - CopyMem (&VendorOption->MtftpIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS)); - break; - - case PXEBC_VENDOR_TAG_MTFTP_CPORT: - - CopyMem (&VendorOption->MtftpCPort, PxeOption->Data, sizeof (VendorOption->MtftpCPort)); - break; - - case PXEBC_VENDOR_TAG_MTFTP_SPORT: - - CopyMem (&VendorOption->MtftpSPort, PxeOption->Data, sizeof (VendorOption->MtftpSPort)); - break; - - case PXEBC_VENDOR_TAG_MTFTP_TIMEOUT: - - VendorOption->MtftpTimeout = *PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_MTFTP_DELAY: - - VendorOption->MtftpDelay = *PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_DISCOVER_CTRL: - - VendorOption->DiscoverCtrl = *PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_DISCOVER_MCAST: - - CopyMem (&VendorOption->DiscoverMcastIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS)); - break; - - case PXEBC_VENDOR_TAG_BOOT_SERVERS: - - VendorOption->BootSvrLen = PxeOption->Length; - VendorOption->BootSvr = (PXEBC_BOOT_SVR_ENTRY *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_BOOT_MENU: - - VendorOption->BootMenuLen = PxeOption->Length; - VendorOption->BootMenu = (PXEBC_BOOT_MENU_ENTRY *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_MENU_PROMPT: - - VendorOption->MenuPromptLen = PxeOption->Length; - VendorOption->MenuPrompt = (PXEBC_MENU_PROMPT *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_MCAST_ALLOC: - - CopyMem (&VendorOption->McastIpBase, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&VendorOption->McastIpBlock, PxeOption->Data + 4, sizeof (VendorOption->McastIpBlock)); - CopyMem (&VendorOption->McastIpRange, PxeOption->Data + 6, sizeof (VendorOption->McastIpRange)); - break; - - case PXEBC_VENDOR_TAG_CREDENTIAL_TYPES: - - VendorOption->CredTypeLen = PxeOption->Length; - VendorOption->CredType = (UINT32 *) PxeOption->Data; - break; - - case PXEBC_VENDOR_TAG_BOOT_ITEM: - - CopyMem (&VendorOption->BootSrvType, PxeOption->Data, sizeof (VendorOption->BootSrvType)); - CopyMem (&VendorOption->BootSrvLayer, PxeOption->Data + 2, sizeof (VendorOption->BootSrvLayer)); - break; - } - - SET_VENDOR_OPTION_BIT_MAP (BitMap, PxeOption->OpCode); - - if (PxeOption->OpCode == DHCP4_TAG_PAD) { - Offset++; - } else { - Offset = (UINT8) (Offset + PxeOption->Length + 2); - } - - PxeOption = (EFI_DHCP4_PACKET_OPTION *) (Dhcp4Option->Data + Offset); - } - - // - // FixMe, return falas if invalid of any vendor option - // - - return TRUE; -} - - -/** - This function display boot item detail. - - If the length of the boot item string over 70 Char, just display 70 Char. - - @param Str Pointer to a string (boot item string). - @param Len The length of string. - -**/ -VOID -PxeBcDisplayBootItem ( - IN UINT8 *Str, - IN UINT8 Len - ) -{ - UINT8 Tmp; - - Len = (UINT8) MIN (70, Len); - Tmp = Str[Len]; - Str[Len] = 0; - AsciiPrint ("%a \n", Str); - Str[Len] = Tmp; -} - - -/** - Choose the boot prompt. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Select boot prompt done. - @retval EFI_TIMEOUT Select boot prompt time out. - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. - @retval EFI_ABORTED User cancel the operation. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootPrompt ( - IN PXEBC_PRIVATE_DATA *Private - ) -{ - PXEBC_CACHED_DHCP4_PACKET *Packet; - PXEBC_VENDOR_OPTION *VendorOpt; - EFI_EVENT TimeoutEvent; - EFI_EVENT DescendEvent; - EFI_INPUT_KEY InputKey; - EFI_STATUS Status; - UINT8 Timeout; - UINT8 *Prompt; - UINT8 PromptLen; - INT32 SecCol; - INT32 SecRow; - - TimeoutEvent = NULL; - DescendEvent = NULL; - - if (Private->PxeBc.Mode->ProxyOfferReceived) { - - Packet = &Private->ProxyOffer; - } else { - - Packet = &Private->Dhcp4Ack; - } - - if (Packet->OfferType != DHCP4_PACKET_TYPE_PXE10) { - return EFI_NOT_FOUND; - } - - VendorOpt = &Packet->PxeVendorOption; - // - // According to the PXE specification 2.1, Table 2-1 PXE DHCP Options (Full - // List), we must not consider a boot prompt or boot menu if all of the - // following hold: - // - the PXE_DISCOVERY_CONTROL PXE tag is present inside the Vendor Options - // (=43) DHCP tag, and - // - the PXE_DISCOVERY_CONTROL PXE tag has bit 3 set, and - // - a boot file name has been presented with DHCP option 67. - // - if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) && - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) { - return EFI_ABORTED; - } - - if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) { - return EFI_SUCCESS; - } - - Timeout = VendorOpt->MenuPrompt->Timeout; - Prompt = VendorOpt->MenuPrompt->Prompt; - PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1); - - if (Timeout == 0) { - return EFI_SUCCESS; - } - - if (Timeout == 255) { - return EFI_TIMEOUT; - } - - Status = gBS->CreateEvent ( - EVT_TIMER, - TPL_CALLBACK, - NULL, - NULL, - &TimeoutEvent - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->SetTimer ( - TimeoutEvent, - TimerRelative, - MultU64x32 (Timeout, TICKS_PER_SECOND) - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = gBS->CreateEvent ( - EVT_TIMER, - TPL_CALLBACK, - NULL, - NULL, - &DescendEvent - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = gBS->SetTimer ( - DescendEvent, - TimerPeriodic, - TICKS_PER_SECOND - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - SecCol = gST->ConOut->Mode->CursorColumn; - SecRow = gST->ConOut->Mode->CursorRow; - - PxeBcDisplayBootItem (Prompt, PromptLen); - - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow); - AsciiPrint ("(%d) ", Timeout--); - - while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) { - - if (!EFI_ERROR (gBS->CheckEvent (DescendEvent))) { - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow); - AsciiPrint ("(%d) ", Timeout--); - } - - if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) { - - gBS->Stall (10 * TICKS_PER_MS); - continue; - } - - if (InputKey.ScanCode == 0) { - - switch (InputKey.UnicodeChar) { - case CTRL ('c'): - Status = EFI_ABORTED; - break; - - case CTRL ('m'): - case 'm': - case 'M': - Status = EFI_TIMEOUT; - break; - - default: - continue; - } - } else { - - switch (InputKey.ScanCode) { - case SCAN_F8: - Status = EFI_TIMEOUT; - break; - - case SCAN_ESC: - Status = EFI_ABORTED; - break; - - default: - continue; - } - } - - break; - } - - gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1); - -ON_EXIT: - - if (DescendEvent != NULL) { - gBS->CloseEvent (DescendEvent); - } - - if (TimeoutEvent != NULL) { - gBS->CloseEvent (TimeoutEvent); - } - - return Status; -} - - -/** - Select the boot menu. - - @param Private Pointer to PxeBc private data. - @param Type The type of the menu. - @param UseDefaultItem Use default item or not. - - @retval EFI_ABORTED User cancel operation. - @retval EFI_SUCCESS Select the boot menu success. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootMenu ( - IN PXEBC_PRIVATE_DATA *Private, - OUT UINT16 *Type, - IN BOOLEAN UseDefaultItem - ) -{ - PXEBC_CACHED_DHCP4_PACKET *Packet; - PXEBC_VENDOR_OPTION *VendorOpt; - EFI_INPUT_KEY InputKey; - UINT8 MenuSize; - UINT8 MenuNum; - INT32 TopRow; - UINT16 Select; - UINT16 LastSelect; - UINT8 Index; - BOOLEAN Finish; - CHAR8 Blank[70]; - PXEBC_BOOT_MENU_ENTRY *MenuItem; - PXEBC_BOOT_MENU_ENTRY *MenuArray[PXEBC_MAX_MENU_NUM]; - - Finish = FALSE; - Select = 0; - Index = 0; - *Type = 0; - - if (Private->PxeBc.Mode->ProxyOfferReceived) { - - Packet = &Private->ProxyOffer; - } else { - - Packet = &Private->Dhcp4Ack; - } - - ASSERT (Packet->OfferType == DHCP4_PACKET_TYPE_PXE10); - - VendorOpt = &Packet->PxeVendorOption; - - if (!IS_VALID_BOOT_MENU (VendorOpt->BitMap)) { - return EFI_SUCCESS; - } - - SetMem (Blank, sizeof(Blank), ' '); - - MenuSize = VendorOpt->BootMenuLen; - MenuItem = VendorOpt->BootMenu; - - if (MenuSize == 0) { - return EFI_NOT_READY; - } - - while (MenuSize > 0) { - MenuArray[Index++] = MenuItem; - MenuSize = (UINT8) (MenuSize - (MenuItem->DescLen + 3)); - MenuItem = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + MenuItem->DescLen + 3); - if (Index >= PXEBC_MAX_MENU_NUM) { - break; - } - } - - if (UseDefaultItem) { - *Type = MenuArray[0]->Type; - *Type = NTOHS (*Type); - return EFI_SUCCESS; - } - - MenuNum = Index; - - for (Index = 0; Index < MenuNum; Index++) { - PxeBcDisplayBootItem (MenuArray[Index]->DescStr, MenuArray[Index]->DescLen); - } - - TopRow = gST->ConOut->Mode->CursorRow - MenuNum; - - do { - ASSERT (Select < PXEBC_MAX_MENU_NUM); - // - // highlight selected row - // - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY)); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Select); - Blank[MenuArray[Select]->DescLen] = 0; - AsciiPrint ("%a\r", Blank); - PxeBcDisplayBootItem (MenuArray[Select]->DescStr, MenuArray[Select]->DescLen); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); - LastSelect = Select; - - while (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) { - gBS->Stall (10 * TICKS_PER_MS); - } - - if (InputKey.ScanCode == 0) { - switch (InputKey.UnicodeChar) { - case CTRL ('c'): - InputKey.ScanCode = SCAN_ESC; - break; - - case CTRL ('j'): /* linefeed */ - case CTRL ('m'): /* return */ - Finish = TRUE; - break; - - case CTRL ('i'): /* tab */ - case ' ': - case 'd': - case 'D': - InputKey.ScanCode = SCAN_DOWN; - break; - - case CTRL ('h'): /* backspace */ - case 'u': - case 'U': - InputKey.ScanCode = SCAN_UP; - break; - - default: - InputKey.ScanCode = 0; - } - } - - switch (InputKey.ScanCode) { - case SCAN_LEFT: - case SCAN_UP: - if (Select > 0) { - --Select; - } - - break; - - case SCAN_DOWN: - case SCAN_RIGHT: - if (++Select == MenuNum) { - --Select; - } - - break; - - case SCAN_PAGE_UP: - case SCAN_HOME: - Select = 0; - break; - - case SCAN_PAGE_DOWN: - case SCAN_END: - Select = (UINT16) (MenuNum - 1); - break; - - case SCAN_ESC: - return EFI_ABORTED; - } - - /* unhighlight last selected row */ - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + LastSelect); - Blank[MenuArray[LastSelect]->DescLen] = 0; - AsciiPrint ("%a\r", Blank); - PxeBcDisplayBootItem (MenuArray[LastSelect]->DescStr, MenuArray[LastSelect]->DescLen); - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum); - } while (!Finish); - - ASSERT (Select < PXEBC_MAX_MENU_NUM); - - // - // Swap the byte order - // - CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16)); - *Type = NTOHS (*Type); - - return EFI_SUCCESS; -} - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c deleted file mode 100644 index 76c140d8e3ff..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c +++ /dev/null @@ -1,665 +0,0 @@ -/** @file - The driver binding for UEFI PXEBC protocol. - -Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = { - PxeBcDriverBindingSupported, - PxeBcDriverBindingStart, - PxeBcDriverBindingStop, - 0xa, - NULL, - NULL -}; - -/** - This is the declaration of an EFI image entry point. This entry point is - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including - both device drivers and bus drivers. - - @param ImageHandle The firmware allocated handle for the UEFI image. - @param SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - return EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gPxeBcDriverBinding, - ImageHandle, - &gPxeBcComponentName, - &gPxeBcComponentName2 - ); -} - - -/** - Test to see if this driver supports ControllerHandle. This service - is called by the EFI boot service ConnectController(). In - order to make drivers as small as possible, there are a few calling - restrictions for this service. ConnectController() must - follow these calling restrictions. If any other agent wishes to call - Supported() it must also follow these calling restrictions. - PxeBc requires DHCP4 and MTFTP4 protocols. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to test - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver supports this device - @retval EFI_ALREADY_STARTED This driver is already running on this device - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ) -{ - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_STATUS Status; - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiPxeBaseCodeProtocolGuid, - (VOID **) &PxeBc, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (!EFI_ERROR (Status)) { - return EFI_ALREADY_STARTED; - } - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - - if (!EFI_ERROR (Status)) { - - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - NULL, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - - } - - return Status; -} - - -/** - Start this driver on ControllerHandle. This service is called by the - EFI boot service ConnectController(). In order to make - drivers as small as possible, there are a few calling restrictions for - this service. ConnectController() must follow these - calling restrictions. If any other agent wishes to call Start() it - must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to bind driver to - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver is added to ControllerHandle - @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - UINTN Index; - EFI_STATUS Status; - EFI_IP4_MODE_DATA Ip4ModeData; - - Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA)); - if (Private == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE; - Private->Controller = ControllerHandle; - Private->Image = This->DriverBindingHandle; - CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc)); - Private->PxeBc.Mode = &Private->Mode; - CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile)); - - Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - - for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) { - Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE; - } - - // - // Get the NII interface if it exists. - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiNetworkInterfaceIdentifierProtocolGuid_31, - (VOID **) &Private->Nii, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - Private->Nii = NULL; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiArpServiceBindingProtocolGuid, - &Private->ArpChild - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->ArpChild, - &gEfiArpProtocolGuid, - (VOID **) &Private->Arp, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - &Private->Dhcp4Child - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Dhcp4Child, - &gEfiDhcp4ProtocolGuid, - (VOID **) &Private->Dhcp4, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiIp4ServiceBindingProtocolGuid, - &Private->Ip4Child - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Ip4Child, - &gEfiIp4ProtocolGuid, - (VOID **) &Private->Ip4, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // Get max packet size from Ip4 to calculate block size for Tftp later. - // - Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize; - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - &Private->Mtftp4Child - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Mtftp4Child, - &gEfiMtftp4ProtocolGuid, - (VOID **) &Private->Mtftp4, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - &Private->Udp4ReadChild - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // The UDP instance for EfiPxeBcUdpRead - // - Status = gBS->OpenProtocol ( - Private->Udp4ReadChild, - &gEfiUdp4ProtocolGuid, - (VOID **) &Private->Udp4Read, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - // - // The UDP instance for EfiPxeBcUdpWrite - // - Status = NetLibCreateServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - &Private->Udp4WriteChild - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - Status = gBS->OpenProtocol ( - Private->Udp4WriteChild, - &gEfiUdp4ProtocolGuid, - (VOID **) &Private->Udp4Write, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA)); - Private->Udp4CfgData.AcceptBroadcast = FALSE; - Private->Udp4CfgData.AcceptPromiscuous = FALSE; - Private->Udp4CfgData.AcceptAnyPort = TRUE; - Private->Udp4CfgData.AllowDuplicatePort = TRUE; - Private->Udp4CfgData.TypeOfService = DEFAULT_ToS; - Private->Udp4CfgData.TimeToLive = DEFAULT_TTL; - Private->Udp4CfgData.DoNotFragment = FALSE; - Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; - Private->Udp4CfgData.UseDefaultAddress = FALSE; - - PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read); - Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen; - CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen); - - - ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA)); - Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP; - Private->Ip4ConfigData.AcceptIcmpErrors = TRUE; - Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS; - Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL; - Private->Ip4ConfigData.DoNotFragment = FALSE; - Private->Ip4ConfigData.RawData = FALSE; - - Status = gBS->InstallMultipleProtocolInterfaces ( - &ControllerHandle, - &gEfiPxeBaseCodeProtocolGuid, - &Private->PxeBc, - &gEfiLoadFileProtocolGuid, - &Private->LoadFile, - NULL - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - // - // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy. - // - Status = gBS->HandleProtocol ( - ControllerHandle, - &gEfiIp4Config2ProtocolGuid, - (VOID **) &Private->Ip4Config2 - ); - if (EFI_ERROR (Status)) { - goto ON_ERROR; - } - - return EFI_SUCCESS; - -ON_ERROR: - - if (Private->Udp4WriteChild != NULL) { - gBS->CloseProtocol ( - Private->Udp4WriteChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4WriteChild - ); - } - - if (Private->Udp4ReadChild != NULL) { - gBS->CloseProtocol ( - Private->Udp4ReadChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4ReadChild - ); - } - - if (Private->Mtftp4Child != NULL) { - gBS->CloseProtocol ( - Private->Mtftp4Child, - &gEfiMtftp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - Private->Mtftp4Child - ); - } - - if (Private->Ip4Child != NULL) { - gBS->CloseProtocol ( - Private->Ip4Child, - &gEfiIp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiIp4ServiceBindingProtocolGuid, - Private->Ip4Child - ); - } - - if (Private->Dhcp4Child != NULL) { - gBS->CloseProtocol ( - Private->Dhcp4Child, - &gEfiDhcp4ProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - Private->Dhcp4Child - ); - } - - if (Private->ArpChild != NULL) { - gBS->CloseProtocol ( - Private->ArpChild, - &gEfiArpProtocolGuid, - This->DriverBindingHandle, - ControllerHandle - ); - - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiArpServiceBindingProtocolGuid, - Private->ArpChild - ); - } - - FreePool (Private); - - return Status; -} - - -/** - Stop this driver on ControllerHandle. This service is called by the - EFI boot service DisconnectController(). In order to - make drivers as small as possible, there are a few calling - restrictions for this service. DisconnectController() - must follow these calling restrictions. If any other agent wishes - to call Stop() it must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed ControllerHandle - @retval other This driver was not removed from this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_HANDLE NicHandle; - EFI_STATUS Status; - - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid); - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid); - - if (NicHandle == NULL) { - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid); - - if (NicHandle == NULL) { - return EFI_SUCCESS; - } - } - } - } - } - - Status = gBS->OpenProtocol ( - NicHandle, - &gEfiPxeBaseCodeProtocolGuid, - (VOID **) &PxeBc, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Stop functionality of PXE Base Code protocol - // - Status = PxeBc->Stop (PxeBc); - if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) { - return Status; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc); - - Status = gBS->UninstallMultipleProtocolInterfaces ( - NicHandle, - &gEfiPxeBaseCodeProtocolGuid, - &Private->PxeBc, - &gEfiLoadFileProtocolGuid, - &Private->LoadFile, - NULL - ); - - if (!EFI_ERROR (Status)) { - - gBS->CloseProtocol ( - Private->Udp4WriteChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - ControllerHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4WriteChild - ); - - gBS->CloseProtocol ( - Private->Udp4ReadChild, - &gEfiUdp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiUdp4ServiceBindingProtocolGuid, - Private->Udp4ReadChild - ); - - gBS->CloseProtocol ( - Private->Dhcp4Child, - &gEfiDhcp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiDhcp4ServiceBindingProtocolGuid, - Private->Dhcp4Child - ); - - gBS->CloseProtocol ( - Private->Mtftp4Child, - &gEfiMtftp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiMtftp4ServiceBindingProtocolGuid, - Private->Mtftp4Child - ); - - gBS->CloseProtocol ( - Private->Ip4Child, - &gEfiIp4ProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiIp4ServiceBindingProtocolGuid, - Private->Ip4Child - ); - - gBS->CloseProtocol ( - Private->ArpChild, - &gEfiArpProtocolGuid, - This->DriverBindingHandle, - NicHandle - ); - NetLibDestroyServiceChild ( - NicHandle, - This->DriverBindingHandle, - &gEfiArpServiceBindingProtocolGuid, - Private->ArpChild - ); - - FreePool (Private); - } - - return Status; -} - - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c deleted file mode 100644 index 3fa3be99c178..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c +++ /dev/null @@ -1,2989 +0,0 @@ -/** @file - Interface routines for PxeBc. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - -UINT32 mPxeDhcpTimeout[4] = { 4, 8, 16, 32 }; - -/** - Get and record the arp cache. - - @param This Pointer to EFI_PXE_BC_PROTOCOL - - @retval EFI_SUCCESS Arp cache updated successfully - @retval others If error occurs when getting arp cache - -**/ -EFI_STATUS -UpdateArpCache ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - UINT32 EntryLength; - UINT32 EntryCount; - EFI_ARP_FIND_DATA *Entries; - UINT32 Index; - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - Status = Private->Arp->Find ( - Private->Arp, - TRUE, - NULL, - &EntryLength, - &EntryCount, - &Entries, - TRUE - ); - if (EFI_ERROR (Status)) { - return Status; - } - - Mode->ArpCacheEntries = MIN ( - EntryCount, - EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES - ); - for (Index = 0; Index < Mode->ArpCacheEntries; Index ++) { - CopyMem ( - &Mode->ArpCache[Index].IpAddr, - Entries + 1, - Entries->SwAddressLength - ); - CopyMem ( - &Mode->ArpCache[Index].MacAddr, - (UINT8 *) (Entries + 1) + Entries->SwAddressLength, - Entries->HwAddressLength - ); - // - // Slip to the next FindData. - // - Entries = (EFI_ARP_FIND_DATA *) ((UINT8 *) Entries + EntryLength); - } - - return EFI_SUCCESS; -} - -/** - Timeout routine to update arp cache. - - @param Event Pointer to EFI_PXE_BC_PROTOCOL - @param Context Context of the timer event - -**/ -VOID -EFIAPI -ArpCacheUpdateTimeout ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - UpdateArpCache ((EFI_PXE_BASE_CODE_PROTOCOL *) Context); -} - -/** - Do arp resolution from arp cache in PxeBcMode. - - @param PxeBcMode The PXE BC mode to look into. - @param Ip4Addr The Ip4 address for resolution. - @param MacAddress The resoluted MAC address if the resolution is successful. - The value is undefined if resolution fails. - - @retval TRUE The resolution is successful. - @retval FALSE Otherwise. - -**/ -BOOLEAN -FindInArpCache ( - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, - IN EFI_IPv4_ADDRESS *Ip4Addr, - OUT EFI_MAC_ADDRESS *MacAddress - ) -{ - UINT32 Index; - - for (Index = 0; Index < PxeBcMode->ArpCacheEntries; Index ++) { - if (EFI_IP4_EQUAL (&PxeBcMode->ArpCache[Index].IpAddr.v4, Ip4Addr)) { - CopyMem ( - MacAddress, - &PxeBcMode->ArpCache[Index].MacAddr, - sizeof (EFI_MAC_ADDRESS) - ); - return TRUE; - } - } - - return FALSE; -} - -/** - Notify function for the ICMP receive token, used to process - the received ICMP packets. - - @param Context The PXEBC private data. - -**/ -VOID -EFIAPI -IcmpErrorListenHandlerDpc ( - IN VOID *Context - ) -{ - EFI_STATUS Status; - EFI_IP4_RECEIVE_DATA *RxData; - EFI_IP4_PROTOCOL *Ip4; - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - UINTN Index; - UINT32 CopiedLen; - UINT8 *CopiedPointer; - - Private = (PXEBC_PRIVATE_DATA *) Context; - Mode = &Private->Mode; - Status = Private->IcmpErrorRcvToken.Status; - RxData = Private->IcmpErrorRcvToken.Packet.RxData; - Ip4 = Private->Ip4; - - if (Status == EFI_ABORTED) { - // - // The reception is actively aborted by the consumer, directly return. - // - return; - } - - if (RxData == NULL) { - goto Resume; - } - - if (Status != EFI_ICMP_ERROR) { - // - // The return status should be recognized as EFI_ICMP_ERROR. - // - goto CleanUp; - } - - if (EFI_IP4 (RxData->Header->SourceAddress) != 0 && - (NTOHL (Mode->SubnetMask.Addr[0]) != 0) && - IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) && - !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0]))) { - // - // The source address is not zero and it's not a unicast IP address, discard it. - // - goto CleanUp; - } - - if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v4)) { - // - // The dest address is not equal to Station Ip address, discard it. - // - goto CleanUp; - } - - // - // Constructor ICMP error packet - // - CopiedLen = 0; - CopiedPointer = (UINT8 *) &Mode->IcmpError; - - for (Index = 0; Index < RxData->FragmentCount; Index ++) { - CopiedLen += RxData->FragmentTable[Index].FragmentLength; - if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) { - CopyMem ( - CopiedPointer, - RxData->FragmentTable[Index].FragmentBuffer, - RxData->FragmentTable[Index].FragmentLength - ); - } else { - CopyMem ( - CopiedPointer, - RxData->FragmentTable[Index].FragmentBuffer, - CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR) - ); - } - CopiedPointer += CopiedLen; - } - -CleanUp: - gBS->SignalEvent (RxData->RecycleSignal); - -Resume: - Ip4->Receive (Ip4, &(Private->IcmpErrorRcvToken)); -} - -/** - Request IcmpErrorListenHandlerDpc as a DPC at TPL_CALLBACK - - @param Event The event signaled. - @param Context The context passed in by the event notifier. - -**/ -VOID -EFIAPI -IcmpErrorListenHandler ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - // - // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK - // - QueueDpc (TPL_CALLBACK, IcmpErrorListenHandlerDpc, Context); -} - -/** - Enables the use of the PXE Base Code Protocol functions. - - This function enables the use of the PXE Base Code Protocol functions. If the - Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE, then - EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6 formatted - addresses will be used in this session. If UseIpv6 is FALSE, then IPv4 formatted - addresses will be used in this session. If UseIpv6 is TRUE, and the Ipv6Supported - field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then EFI_UNSUPPORTED will - be returned. If there is not enough memory or other resources to start the PXE - Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned. Otherwise, the - PXE Base Code Protocol will be started, and all of the fields of the EFI_PXE_BASE_CODE_MODE - structure will be initialized as follows: - StartedSet to TRUE. - Ipv6SupportedUnchanged. - Ipv6AvailableUnchanged. - UsingIpv6Set to UseIpv6. - BisSupportedUnchanged. - BisDetectedUnchanged. - AutoArpSet to TRUE. - SendGUIDSet to FALSE. - TTLSet to DEFAULT_TTL. - ToSSet to DEFAULT_ToS. - DhcpCompletedSet to FALSE. - ProxyOfferReceivedSet to FALSE. - StationIpSet to an address of all zeros. - SubnetMaskSet to a subnet mask of all zeros. - DhcpDiscoverZero-filled. - DhcpAckZero-filled. - ProxyOfferZero-filled. - PxeDiscoverValidSet to FALSE. - PxeDiscoverZero-filled. - PxeReplyValidSet to FALSE. - PxeReplyZero-filled. - PxeBisReplyValidSet to FALSE. - PxeBisReplyZero-filled. - IpFilterSet the Filters field to 0 and the IpCnt field to 0. - ArpCacheEntriesSet to 0. - ArpCacheZero-filled. - RouteTableEntriesSet to 0. - RouteTableZero-filled. - IcmpErrorReceivedSet to FALSE. - IcmpErrorZero-filled. - TftpErroReceivedSet to FALSE. - TftpErrorZero-filled. - MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is available. - Set to FALSE if the PXE Base Code Callback Protocol is not available. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param UseIpv6 Specifies the type of IP addresses that are to be used during the session - that is being started. Set to TRUE for IPv6 addresses, and FALSE for - IPv4 addresses. - - @retval EFI_SUCCESS The PXE Base Code Protocol was started. - @retval EFI_DEVICE_ERROR The network device encountered an error during this oper - @retval EFI_UNSUPPORTED UseIpv6 is TRUE, but the Ipv6Supported field of the - EFI_PXE_BASE_CODE_MODE structure is FALSE. - @retval EFI_ALREADY_STARTED The PXE Base Code Protocol is already in the started state. - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid - EFI_PXE_BASE_CODE_PROTOCOL structure. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory or other resources to start the - PXE Base Code Protocol. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcStart ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN UseIpv6 - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (Mode->Started) { - return EFI_ALREADY_STARTED; - } - - if (UseIpv6) { - // - // IPv6 is not supported now. - // - return EFI_UNSUPPORTED; - } - - AsciiPrint ("\n>>Start PXE over IPv4"); - - // - // Configure the udp4 instance to let it receive data - // - Status = Private->Udp4Read->Configure ( - Private->Udp4Read, - &Private->Udp4CfgData - ); - if (EFI_ERROR (Status)) { - return Status; - } - - - // - // Configure block size for TFTP as a default value to handle all link layers. - // - Private->BlockSize = MIN (Private->Ip4MaxPacketSize, PXEBC_DEFAULT_PACKET_SIZE) - - PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE; - // - // If PcdTftpBlockSize is set to non-zero, override the default value. - // - if (PcdGet64 (PcdTftpBlockSize) != 0) { - Private->BlockSize = (UINTN) PcdGet64 (PcdTftpBlockSize); - } - - Private->AddressIsOk = FALSE; - - ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE)); - - Mode->Started = TRUE; - Mode->TTL = DEFAULT_TTL; - Mode->ToS = DEFAULT_ToS; - Mode->AutoArp = TRUE; - - // - // Create the event for Arp Cache checking. - // - Status = gBS->CreateEvent ( - EVT_TIMER | EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - ArpCacheUpdateTimeout, - This, - &Private->GetArpCacheEvent - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Start the timeout timer event. - // - Status = gBS->SetTimer ( - Private->GetArpCacheEvent, - TimerPeriodic, - TICKS_PER_SECOND - ); - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Create ICMP error receiving event - // - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - IcmpErrorListenHandler, - Private, - &(Private->IcmpErrorRcvToken.Event) - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - //DHCP4 service allows only one of its children to be configured in - //the active state, If the DHCP4 D.O.R.A started by IP4 auto - //configuration and has not been completed, the Dhcp4 state machine - //will not be in the right state for the PXE to start a new round D.O.R.A. - //so we need to switch it's policy to static. - // - Status = PxeBcSetIp4Policy (Private); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // start to listen incoming packet - // - Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken); - if (!EFI_ERROR (Status)) { - return Status; - } - -ON_EXIT: - Private->Ip4->Configure (Private->Ip4, NULL); - - if (Private->IcmpErrorRcvToken.Event != NULL) { - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); - } - - if (Private->GetArpCacheEvent != NULL) { - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); - gBS->CloseEvent (Private->GetArpCacheEvent); - } - - Mode->Started = FALSE; - Mode->TTL = 0; - Mode->ToS = 0; - Mode->AutoArp = FALSE; - - return Status; -} - - -/** - Disables the use of the PXE Base Code Protocol functions. - - This function stops all activity on the network device. All the resources allocated - in Start() are released, the Started field of the EFI_PXE_BASE_CODE_MODE structure is - set to FALSE and EFI_SUCCESS is returned. If the Started field of the EFI_PXE_BASE_CODE_MODE - structure is already FALSE, then EFI_NOT_STARTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - - @retval EFI_SUCCESS The PXE Base Code Protocol was stopped. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is already in the stopped state. - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid - EFI_PXE_BASE_CODE_PROTOCOL structure. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcStop ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - Private->Ip4->Cancel (Private->Ip4, NULL); - // - // Dispatch the DPCs queued by the NotifyFunction of the canceled rx token's - // events. - // - DispatchDpc (); - - Private->Ip4->Configure (Private->Ip4, NULL); - - // - // Close the ICMP error receiving event. - // - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event); - - // - // Cancel the TimeoutEvent timer. - // - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0); - - // - // Close the TimeoutEvent event. - // - gBS->CloseEvent (Private->GetArpCacheEvent); - - Mode->Started = FALSE; - - Private->CurrentUdpSrcPort = 0; - Private->Udp4Write->Configure (Private->Udp4Write, NULL); - Private->Udp4Read->Groups (Private->Udp4Read, FALSE, NULL); - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - Private->Dhcp4->Stop (Private->Dhcp4); - Private->Dhcp4->Configure (Private->Dhcp4, NULL); - - Private->FileSize = 0; - - return EFI_SUCCESS; -} - - -/** - Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request / acknowledge) or DHCPv6 - S.A.R.R (solicit / advertise / request / reply) sequence. - - This function attempts to complete the DHCP sequence. If this sequence is completed, - then EFI_SUCCESS is returned, and the DhcpCompleted, ProxyOfferReceived, StationIp, - SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the EFI_PXE_BASE_CODE_MODE - structure are filled in. - If SortOffers is TRUE, then the cached DHCP offer packets will be sorted before - they are tried. If SortOffers is FALSE, then the cached DHCP offer packets will - be tried in the order in which they are received. Please see the Preboot Execution - Environment (PXE) Specification for additional details on the implementation of DHCP. - This function can take at least 31 seconds to timeout and return control to the - caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will be returned. - If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then the DHCP sequence will be stopped and EFI_ABORTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param SortOffers TRUE if the offers received should be sorted. Set to FALSE to try the - offers in the order that they are received. - - @retval EFI_SUCCESS Valid DHCP has completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid - EFI_PXE_BASE_CODE_PROTOCOL structure. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to complete the DHCP Protocol. - @retval EFI_ABORTED The callback function aborted the DHCP Protocol. - @retval EFI_TIMEOUT The DHCP Protocol timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the DHCP session. - @retval EFI_NO_RESPONSE Valid PXE offer was not received. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcDhcp ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN SortOffers - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_DHCP4_CONFIG_DATA Dhcp4CfgData; - EFI_DHCP4_MODE_DATA Dhcp4Mode; - EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_MAX_OPTION_NUM]; - UINT32 OptCount; - EFI_STATUS Status; - EFI_ARP_CONFIG_DATA ArpConfigData; - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Status = EFI_SUCCESS; - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - Dhcp4 = Private->Dhcp4; - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DHCP; - Private->SortOffers = SortOffers; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - Mode->IcmpErrorReceived = FALSE; - - // - // Stop Udp4Read instance - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - // - // Initialize the DHCP options and build the option list - // - OptCount = PxeBcBuildDhcpOptions (Private, OptList, TRUE); - - // - // Set the DHCP4 config data. - // The four discovery timeouts are 4, 8, 16, 32 seconds respectively. - // - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); - Dhcp4CfgData.OptionCount = OptCount; - Dhcp4CfgData.OptionList = OptList; - Dhcp4CfgData.Dhcp4Callback = PxeBcDhcpCallBack; - Dhcp4CfgData.CallbackContext = Private; - Dhcp4CfgData.DiscoverTryCount = 4; - Dhcp4CfgData.DiscoverTimeout = mPxeDhcpTimeout; - - Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - // - // Zero those arrays to record the varies numbers of DHCP OFFERS. - // - Private->GotProxyOffer = FALSE; - Private->NumOffers = 0; - Private->BootpIndex = 0; - ZeroMem (Private->ServerCount, sizeof (Private->ServerCount)); - ZeroMem (Private->ProxyIndex, sizeof (Private->ProxyIndex)); - - Status = Dhcp4->Start (Dhcp4, NULL); - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - goto ON_EXIT; - } - - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - ASSERT (Dhcp4Mode.State == Dhcp4Bound); - - CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof (EFI_IPv4_ADDRESS)); - - CopyMem (&Mode->StationIp, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - - // - // Check the selected offer to see whether BINL is required, if no or BINL is - // finished, set the various Mode members. - // - Status = PxeBcCheckSelectedOffer (Private); - - AsciiPrint ("\n Station IP address is "); - - PxeBcShowIp4Addr (&Private->StationIp.v4); - AsciiPrint ("\n"); - -ON_EXIT: - if (EFI_ERROR (Status)) { - Dhcp4->Stop (Dhcp4); - Dhcp4->Configure (Dhcp4, NULL); - } else { - // - // Remove the previously configured option list and callback function - // - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA)); - Dhcp4->Configure (Dhcp4, &Dhcp4CfgData); - - Private->AddressIsOk = TRUE; - - if (!Mode->UsingIpv6) { - // - // If in IPv4 mode, configure the corresponding ARP with this new - // station IP address. - // - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); - - ArpConfigData.SwAddressType = 0x0800; - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); - ArpConfigData.StationAddress = &Private->StationIp.v4; - - Private->Arp->Configure (Private->Arp, NULL); - Private->Arp->Configure (Private->Arp, &ArpConfigData); - - // - // Updated the route table. Fill the first entry. - // - Mode->RouteTableEntries = 1; - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].GwAddr.Addr[0] = 0; - - // - // Create the default route entry if there is a default router. - // - if (Private->GatewayIp.Addr[0] != 0) { - Mode->RouteTableEntries = 2; - Mode->RouteTable[1].IpAddr.Addr[0] = 0; - Mode->RouteTable[1].SubnetMask.Addr[0] = 0; - Mode->RouteTable[1].GwAddr.Addr[0] = Private->GatewayIp.Addr[0]; - } - - // - // Flush new station IP address into Udp4CfgData and Ip4ConfigData - // - CopyMem (&Private->Udp4CfgData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->Udp4CfgData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->Ip4ConfigData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); - CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS)); - - // - // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address. - // - Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken); - Private->Ip4->Configure (Private->Ip4, NULL); - - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - } - } - - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData); - - // - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP - // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - // - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; - This->SetIpFilter (This, &IpFilter); - - return Status; -} - - -/** - Attempts to complete the PXE Boot Server and/or boot image discovery sequence. - - This function attempts to complete the PXE Boot Server and/or boot image discovery - sequence. If this sequence is completed, then EFI_SUCCESS is returned, and the - PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields of the - EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, then the - PxeBisReplyReceived and PxeBisReply fields of the EFI_PXE_BASE_CODE_MODE structure - will also be filled in. If UseBis is FALSE, then PxeBisReplyValid will be set to FALSE. - In the structure referenced by parameter Info, the PXE Boot Server list, SrvList[], - has two uses: It is the Boot Server IP address list used for unicast discovery - (if the UseUCast field is TRUE), and it is the list used for Boot Server verification - (if the MustUseList field is TRUE). Also, if the MustUseList field in that structure - is TRUE and the AcceptAnyResponse field in the SrvList[] array is TRUE, any Boot - Server reply of that type will be accepted. If the AcceptAnyResponse field is - FALSE, only responses from Boot Servers with matching IP addresses will be accepted. - This function can take at least 10 seconds to timeout and return control to the - caller. If the Discovery sequence does not complete, then EFI_TIMEOUT will be - returned. Please see the Preboot Execution Environment (PXE) Specification for - additional details on the implementation of the Discovery sequence. - If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then the Discovery sequence is stopped and EFI_ABORTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param Type The type of bootstrap to perform. - @param Layer Pointer to the boot server layer number to discover, which must be - PXE_BOOT_LAYER_INITIAL when a new server type is being - discovered. - @param UseBis TRUE if Boot Integrity Services are to be used. FALSE otherwise. - @param Info Pointer to a data structure that contains additional information on the - type of discovery operation that is to be performed. - - @retval EFI_SUCCESS The Discovery sequence has been completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to complete Discovery. - @retval EFI_ABORTED The callback function aborted the Discovery sequence. - @retval EFI_TIMEOUT The Discovery sequence timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the PXE discovery - session. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcDiscover ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 Type, - IN UINT16 *Layer, - IN BOOLEAN UseBis, - IN EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo; - EFI_PXE_BASE_CODE_DISCOVER_INFO *CreatedInfo; - EFI_PXE_BASE_CODE_SRVLIST *SrvList; - EFI_PXE_BASE_CODE_SRVLIST DefaultSrvList; - PXEBC_CACHED_DHCP4_PACKET *Packet; - PXEBC_VENDOR_OPTION *VendorOpt; - UINT16 Index; - EFI_STATUS Status; - PXEBC_BOOT_SVR_ENTRY *BootSvrEntry; - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - BootSvrEntry = NULL; - SrvList = NULL; - CreatedInfo = NULL; - Status = EFI_DEVICE_ERROR; - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER; - - if (!Private->AddressIsOk) { - return EFI_INVALID_PARAMETER; - } - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - // - // Stop Udp4Read instance - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - Mode->IcmpErrorReceived = FALSE; - - // - // If layer isn't EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL, - // use the previous setting; - // If info isn't offered, - // use the cached DhcpAck and ProxyOffer packets. - // - ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO)); - if (*Layer != EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL) { - - if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - DefaultInfo.IpCnt = 1; - DefaultInfo.UseUCast = TRUE; - - DefaultSrvList.Type = Type; - DefaultSrvList.AcceptAnyResponse = FALSE; - DefaultSrvList.IpAddr.Addr[0] = Private->ServerIp.Addr[0]; - - SrvList = &DefaultSrvList; - Info = &DefaultInfo; - } else if (Info == NULL) { - // - // Create info by the cached packet before - // - Packet = (Mode->ProxyOfferReceived) ? &Private->ProxyOffer : &Private->Dhcp4Ack; - VendorOpt = &Packet->PxeVendorOption; - - if (!Mode->DhcpAckReceived || !IS_VALID_DISCOVER_VENDOR_OPTION (VendorOpt->BitMap)) { - // - // Address is not acquired or no discovery options. - // - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - DefaultInfo.UseMCast = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER (VendorOpt->DiscoverCtrl); - DefaultInfo.UseBCast = (BOOLEAN)!IS_DISABLE_BCAST_DISCOVER (VendorOpt->DiscoverCtrl); - DefaultInfo.MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST (VendorOpt->DiscoverCtrl); - DefaultInfo.UseUCast = DefaultInfo.MustUseList; - - if (DefaultInfo.UseMCast) { - // - // Get the multicast discover ip address from vendor option. - // - CopyMem ( - &DefaultInfo.ServerMCastIp.Addr, - &VendorOpt->DiscoverMcastIp, - sizeof (EFI_IPv4_ADDRESS) - ); - } - - DefaultInfo.IpCnt = 0; - Info = &DefaultInfo; - SrvList = Info->SrvList; - - if (DefaultInfo.MustUseList) { - BootSvrEntry = VendorOpt->BootSvr; - Status = EFI_INVALID_PARAMETER; - - while (((UINT8) (BootSvrEntry - VendorOpt->BootSvr)) < VendorOpt->BootSvrLen) { - - if (BootSvrEntry->Type == HTONS (Type)) { - Status = EFI_SUCCESS; - break; - } - - BootSvrEntry = GET_NEXT_BOOT_SVR_ENTRY (BootSvrEntry); - } - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - DefaultInfo.IpCnt = BootSvrEntry->IpCnt; - - if (DefaultInfo.IpCnt >= 1) { - CreatedInfo = AllocatePool (sizeof (DefaultInfo) + (DefaultInfo.IpCnt - 1) * sizeof (*SrvList)); - if (CreatedInfo == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - - } - - CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo)); - Info = CreatedInfo; - SrvList = Info->SrvList; - } - - for (Index = 0; Index < DefaultInfo.IpCnt; Index++) { - CopyMem (&SrvList[Index].IpAddr, &BootSvrEntry->IpAddr[Index], sizeof (EFI_IPv4_ADDRESS)); - SrvList[Index].AcceptAnyResponse = FALSE; - SrvList[Index].Type = BootSvrEntry->Type; - } - } - - } else { - - SrvList = Info->SrvList; - - if (!SrvList[0].AcceptAnyResponse) { - - for (Index = 1; Index < Info->IpCnt; Index++) { - if (SrvList[Index].AcceptAnyResponse) { - break; - } - } - - if (Index != Info->IpCnt) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - } - } - - if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info->MustUseList && Info->IpCnt == 0)) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - // - // Execute discover by UniCast/BroadCast/MultiCast - // - if (Info->UseUCast) { - - for (Index = 0; Index < Info->IpCnt; Index++) { - - if (BootSvrEntry == NULL) { - Private->ServerIp.Addr[0] = SrvList[Index].IpAddr.Addr[0]; - } else { - CopyMem ( - &Private->ServerIp, - &BootSvrEntry->IpAddr[Index], - sizeof (EFI_IPv4_ADDRESS) - ); - } - - Status = PxeBcDiscvBootService ( - Private, - Type, - Layer, - UseBis, - &SrvList[Index].IpAddr, - 0, - NULL, - TRUE, - &Private->PxeReply.Packet.Ack - ); - if (!EFI_ERROR (Status)) { - break; - } - } - - } else if (Info->UseMCast) { - - Status = PxeBcDiscvBootService ( - Private, - Type, - Layer, - UseBis, - &Info->ServerMCastIp, - 0, - NULL, - TRUE, - &Private->PxeReply.Packet.Ack - ); - - } else if (Info->UseBCast) { - - Status = PxeBcDiscvBootService ( - Private, - Type, - Layer, - UseBis, - NULL, - Info->IpCnt, - SrvList, - TRUE, - &Private->PxeReply.Packet.Ack - ); - } - - if (EFI_ERROR (Status) || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } else { - Status = EFI_DEVICE_ERROR; - } - goto ON_EXIT; - } else { - PxeBcParseCachedDhcpPacket (&Private->PxeReply); - } - - if (Mode->PxeBisReplyReceived) { - CopyMem ( - &Private->ServerIp, - &Mode->PxeReply.Dhcpv4.BootpSiAddr, - sizeof (EFI_IPv4_ADDRESS) - ); - } - - if (CreatedInfo != NULL) { - FreePool (CreatedInfo); - } - -ON_EXIT: - - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData); - - // - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP - // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - // - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; - This->SetIpFilter (This, &IpFilter); - - return Status; -} - - -/** - Used to perform TFTP and MTFTP services. - - This function is used to perform TFTP and MTFTP services. This includes the - TFTP operations to get the size of a file, read a directory, read a file, and - write a file. It also includes the MTFTP operations to get the size of a file, - read a directory, and read a file. The type of operation is specified by Operation. - If the callback function that is invoked during the TFTP/MTFTP operation does - not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will - be returned. - For read operations, the return data will be placed in the buffer specified by - BufferPtr. If BufferSize is too small to contain the entire downloaded file, - then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set to zero - or the size of the requested file (the size of the requested file is only returned - if the TFTP server supports TFTP options). If BufferSize is large enough for the - read operation, then BufferSize will be set to the size of the downloaded file, - and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() services - should use the get-file-size operations to determine the size of the downloaded - file prior to using the read-file operations-especially when downloading large - (greater than 64 MB) files-instead of making two calls to the read-file operation. - Following this recommendation will save time if the file is larger than expected - and the TFTP server does not support TFTP option extensions. Without TFTP option - extension support, the client has to download the entire file, counting and discarding - the received packets, to determine the file size. - For write operations, the data to be sent is in the buffer specified by BufferPtr. - BufferSize specifies the number of bytes to send. If the write operation completes - successfully, then EFI_SUCCESS will be returned. - For TFTP "get file size" operations, the size of the requested file or directory - is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP server - does not support options, the file will be downloaded into a bit bucket and the - length of the downloaded file will be returned. For MTFTP "get file size" operations, - if the MTFTP server does not support the "get file size" option, EFI_UNSUPPORTED - will be returned. - This function can take up to 10 seconds to timeout and return control to the caller. - If the TFTP sequence does not complete, EFI_TIMEOUT will be returned. - If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then the TFTP sequence is stopped and EFI_ABORTED will be returned. - The format of the data returned from a TFTP read directory operation is a null-terminated - filename followed by a null-terminated information string, of the form - "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - note that - the seconds field can be a decimal number), where the date and time are UTC. For - an MTFTP read directory command, there is additionally a null-terminated multicast - IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The final - entry is itself null-terminated, so that the final information string is terminated - with two null octets. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param Operation The type of operation to perform. - @param BufferPtr A pointer to the data buffer. - @param Overwrite Only used on write file operations. TRUE if a file on a remote server can - be overwritten. - @param BufferSize For get-file-size operations, *BufferSize returns the size of the - requested file. - @param BlockSize The requested block size to be used during a TFTP transfer. - @param ServerIp The TFTP / MTFTP server IP address. - @param Filename A Null-terminated ASCII string that specifies a directory name or a file - name. - @param Info Pointer to the MTFTP information. - @param DontUseBuffer Set to FALSE for normal TFTP and MTFTP read file operation. - - @retval EFI_SUCCESS The TFTP/MTFTP operation was completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_BUFFER_TOO_SMALL The buffer is not large enough to complete the read operation. - @retval EFI_ABORTED The callback function aborted the TFTP/MTFTP operation. - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the MTFTP session. - @retval EFI_TFTP_ERROR A TFTP error packet was received during the MTFTP session. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcMtftp ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, - IN OUT VOID *BufferPtr, - IN BOOLEAN Overwrite, - IN OUT UINT64 *BufferSize, - IN UINTN *BlockSize OPTIONAL, - IN EFI_IP_ADDRESS *ServerIp, - IN UINT8 *Filename, - IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL, - IN BOOLEAN DontUseBuffer - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_MTFTP4_CONFIG_DATA Mtftp4Config; - EFI_STATUS Status; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_MAC_ADDRESS TempMacAddr; - EFI_PXE_BASE_CODE_IP_FILTER IpFilter; - - if ((This == NULL) || - (Filename == NULL) || - (BufferSize == NULL) || - ((ServerIp == NULL) || - (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) || - IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0])))) || - ((BufferPtr == NULL) && DontUseBuffer) || - ((BlockSize != NULL) && (*BlockSize < 512))) { - - return EFI_INVALID_PARAMETER; - } - - Status = EFI_DEVICE_ERROR; - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = &Private->Mode; - - if (!Mode->AutoArp) { - // - // If AutoArp is set false, check arp cache - // - UpdateArpCache (This); - if (!FindInArpCache (Mode, &ServerIp->v4, &TempMacAddr)) { - return EFI_DEVICE_ERROR; - } - } - - // - // Stop Udp4Read instance - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - Mode->TftpErrorReceived = FALSE; - Mode->IcmpErrorReceived = FALSE; - - Mtftp4Config.UseDefaultSetting = FALSE; - Mtftp4Config.TimeoutValue = PXEBC_MTFTP_TIMEOUT; - Mtftp4Config.TryCount = PXEBC_MTFTP_RETRIES; - - CopyMem ( - &Mtftp4Config.StationIp, - &Private->StationIp, - sizeof (EFI_IPv4_ADDRESS) - ); - CopyMem ( - &Mtftp4Config.SubnetMask, - &Private->SubnetMask, - sizeof (EFI_IPv4_ADDRESS) - ); - CopyMem ( - &Mtftp4Config.GatewayIp, - &Private->GatewayIp, - sizeof (EFI_IPv4_ADDRESS) - ); - CopyMem ( - &Mtftp4Config.ServerIp, - ServerIp, - sizeof (EFI_IPv4_ADDRESS) - ); - - switch (Operation) { - - case EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE: - - Status = PxeBcTftpGetFileSize ( - Private, - &Mtftp4Config, - Filename, - BlockSize, - BufferSize - ); - - break; - - case EFI_PXE_BASE_CODE_TFTP_READ_FILE: - - Status = PxeBcTftpReadFile ( - Private, - &Mtftp4Config, - Filename, - BlockSize, - BufferPtr, - BufferSize, - DontUseBuffer - ); - - break; - - case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE: - - Status = PxeBcTftpWriteFile ( - Private, - &Mtftp4Config, - Filename, - Overwrite, - BlockSize, - BufferPtr, - BufferSize - ); - - break; - - case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY: - - Status = PxeBcTftpReadDirectory ( - Private, - &Mtftp4Config, - Filename, - BlockSize, - BufferPtr, - BufferSize, - DontUseBuffer - ); - - break; - - case EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE: - case EFI_PXE_BASE_CODE_MTFTP_READ_FILE: - case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY: - Status = EFI_UNSUPPORTED; - break; - - default: - - Status = EFI_INVALID_PARAMETER; - break; - } - - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - -ON_EXIT: - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData); - // - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP - // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - // - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER)); - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP; - This->SetIpFilter (This, &IpFilter); - - return Status; -} - - -/** - Writes a UDP packet to the network interface. - - This function writes a UDP packet specified by the (optional HeaderPtr and) - BufferPtr parameters to the network interface. The UDP header is automatically - built by this routine. It uses the parameters OpFlags, DestIp, DestPort, GatewayIp, - SrcIp, and SrcPort to build this header. If the packet is successfully built and - transmitted through the network interface, then EFI_SUCCESS will be returned. - If a timeout occurs during the transmission of the packet, then EFI_TIMEOUT will - be returned. If an ICMP error occurs during the transmission of the packet, then - the IcmpErrorReceived field is set to TRUE, the IcmpError field is filled in and - EFI_ICMP_ERROR will be returned. If the Callback Protocol does not return - EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will be returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param OpFlags The UDP operation flags. - @param DestIp The destination IP address. - @param DestPort The destination UDP port number. - @param GatewayIp The gateway IP address. - @param SrcIp The source IP address. - @param SrcPort The source UDP port number. - @param HeaderSize An optional field which may be set to the length of a header at - HeaderPtr to be prefixed to the data at BufferPtr. - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to be prefixed to the - data at BufferPtr. - @param BufferSize A pointer to the size of the data at BufferPtr. - @param BufferPtr A pointer to the data to be written. - - @retval EFI_SUCCESS The UDP Write operation was completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_BAD_BUFFER_SIZE The buffer is too long to be transmitted. - @retval EFI_ABORTED The callback function aborted the UDP Write operation. - @retval EFI_TIMEOUT The UDP Write operation timed out. - @retval EFI_ICMP_ERROR An ICMP error packet was received during the UDP write session. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcUdpWrite ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN EFI_IP_ADDRESS *DestIp, - IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, - IN EFI_IP_ADDRESS *GatewayIp OPTIONAL, - IN EFI_IP_ADDRESS *SrcIp OPTIONAL, - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, - IN UINTN *HeaderSize OPTIONAL, - IN VOID *HeaderPtr OPTIONAL, - IN UINTN *BufferSize, - IN VOID *BufferPtr - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_UDP4_PROTOCOL *Udp4; - EFI_UDP4_COMPLETION_TOKEN Token; - EFI_UDP4_TRANSMIT_DATA *Udp4TxData; - UINT32 FragCount; - UINT32 DataLength; - EFI_UDP4_SESSION_DATA Udp4Session; - EFI_STATUS Status; - BOOLEAN IsDone; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_MAC_ADDRESS TempMacAddr; - - IsDone = FALSE; - - if ((This == NULL) || (DestIp == NULL) || (DestPort == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if ((GatewayIp != NULL) && (IP4_IS_UNSPECIFIED (NTOHL (GatewayIp->Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (GatewayIp->Addr[0])))) { - // - // Gateway is provided but it's not a unicast IP address. - // - return EFI_INVALID_PARAMETER; - } - - if ((HeaderSize != NULL) && ((*HeaderSize == 0) || (HeaderPtr == NULL))) { - // - // The HeaderSize ptr isn't NULL and: 1. the value is zero; or 2. the HeaderPtr - // is NULL. - // - return EFI_INVALID_PARAMETER; - } - - if ((BufferSize == NULL) || ((*BufferSize != 0) && (BufferPtr == NULL))) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Udp4 = Private->Udp4Write; - Mode = &Private->Mode; - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (!Private->AddressIsOk && (SrcIp == NULL)) { - return EFI_INVALID_PARAMETER; - } - - if (!Mode->AutoArp) { - // - // If AutoArp is set false, check arp cache - // - UpdateArpCache (This); - if (!FindInArpCache (Mode, &DestIp->v4, &TempMacAddr)) { - return EFI_DEVICE_ERROR; - } - } - - Mode->IcmpErrorReceived = FALSE; - - if ((Private->CurrentUdpSrcPort == 0) || - ((SrcPort != NULL) && (*SrcPort != Private->CurrentUdpSrcPort))) { - // - // Port is changed, (re)configure the Udp4Write instance - // - if (SrcPort != NULL) { - Private->CurrentUdpSrcPort = *SrcPort; - } - } - - Status = PxeBcConfigureUdpWriteInstance ( - Udp4, - &Private->StationIp.v4, - &Private->SubnetMask.v4, - &Private->GatewayIp.v4, - &Private->CurrentUdpSrcPort, - Private->Mode.TTL, - Private->Mode.ToS - ); - if (EFI_ERROR (Status)) { - Private->CurrentUdpSrcPort = 0; - return EFI_INVALID_PARAMETER; - } - - ZeroMem (&Token, sizeof (EFI_UDP4_COMPLETION_TOKEN)); - ZeroMem (&Udp4Session, sizeof (EFI_UDP4_SESSION_DATA)); - - CopyMem (&Udp4Session.DestinationAddress, DestIp, sizeof (EFI_IPv4_ADDRESS)); - Udp4Session.DestinationPort = *DestPort; - if (SrcIp != NULL) { - CopyMem (&Udp4Session.SourceAddress, SrcIp, sizeof (EFI_IPv4_ADDRESS)); - } - if (SrcPort != NULL) { - Udp4Session.SourcePort = *SrcPort; - } - - FragCount = (HeaderSize != NULL) ? 2 : 1; - Udp4TxData = (EFI_UDP4_TRANSMIT_DATA *) AllocateZeroPool (sizeof (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof (EFI_UDP4_FRAGMENT_DATA)); - if (Udp4TxData == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - Udp4TxData->FragmentCount = FragCount; - Udp4TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) *BufferSize; - Udp4TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr; - DataLength = (UINT32) *BufferSize; - - if (FragCount == 2) { - - Udp4TxData->FragmentTable[0].FragmentLength = (UINT32) *HeaderSize; - Udp4TxData->FragmentTable[0].FragmentBuffer = HeaderPtr; - DataLength += (UINT32) *HeaderSize; - } - - if (GatewayIp != NULL) { - Udp4TxData->GatewayAddress = (EFI_IPv4_ADDRESS *) GatewayIp; - } - Udp4TxData->UdpSessionData = &Udp4Session; - Udp4TxData->DataLength = DataLength; - Token.Packet.TxData = Udp4TxData; - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - PxeBcCommonNotify, - &IsDone, - &Token.Event - ); - if (EFI_ERROR (Status)) { - goto ON_EXIT; - } - - Status = Udp4->Transmit (Udp4, &Token); - if (EFI_ERROR (Status)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - goto ON_EXIT; - } - - while (!IsDone) { - - Udp4->Poll (Udp4); - } - - Status = Token.Status; - -ON_EXIT: - - if (Token.Event != NULL) { - gBS->CloseEvent (Token.Event); - } - - FreePool (Udp4TxData); - - // - // Reset the instance. - // - Udp4->Configure (Udp4, NULL); - return Status; -} - -/** - Decide whether the incoming UDP packet is acceptable per IP filter settings - in provided PxeBcMode. - - @param PxeBcMode Pointer to EFI_PXE_BASE_CODE_MODE. - @param Session Received UDP session. - - @retval TRUE The UDP package matches IP filters. - @retval FALSE The UDP package doesn't matches IP filters. - -**/ -BOOLEAN -CheckIpByFilter ( - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode, - IN EFI_UDP4_SESSION_DATA *Session - ) -{ - UINTN Index; - EFI_IPv4_ADDRESS Ip4Address; - EFI_IPv4_ADDRESS DestIp4Address; - - if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) { - return TRUE; - } - - CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof (DestIp4Address)); - if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) && - IP4_IS_MULTICAST (EFI_NTOHL (DestIp4Address)) - ) { - return TRUE; - } - - if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) && - IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address)) - ) { - return TRUE; - } - - CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address)); - if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) && - EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address) - ) { - return TRUE; - } - - ASSERT (PxeBcMode->IpFilter.IpCnt < EFI_PXE_BASE_CODE_MAX_IPCNT); - - for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; Index++) { - CopyMem ( - &Ip4Address, - &PxeBcMode->IpFilter.IpList[Index].v4, - sizeof (Ip4Address) - ); - if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) { - return TRUE; - } - } - - return FALSE; -} - -/** - Reads a UDP packet from the network interface. - - This function reads a UDP packet from a network interface. The data contents - are returned in (the optional HeaderPtr and) BufferPtr, and the size of the - buffer received is returned in BufferSize . If the input BufferSize is smaller - than the UDP packet received (less optional HeaderSize), it will be set to the - required size, and EFI_BUFFER_TOO_SMALL will be returned. In this case, the - contents of BufferPtr are undefined, and the packet is lost. If a UDP packet is - successfully received, then EFI_SUCCESS will be returned, and the information - from the UDP header will be returned in DestIp, DestPort, SrcIp, and SrcPort if - they are not NULL. Depending on the values of OpFlags and the DestIp, DestPort, - SrcIp, and SrcPort input values, different types of UDP packet receive filtering - will be performed. The following tables summarize these receive filter operations. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param OpFlags The UDP operation flags. - @param DestIp The destination IP address. - @param DestPort The destination UDP port number. - @param SrcIp The source IP address. - @param SrcPort The source UDP port number. - @param HeaderSize An optional field which may be set to the length of a header at - HeaderPtr to be prefixed to the data at BufferPtr. - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to be prefixed to the - data at BufferPtr. - @param BufferSize A pointer to the size of the data at BufferPtr. - @param BufferPtr A pointer to the data to be read. - - @retval EFI_SUCCESS The UDP Read operation was completed. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_BUFFER_TOO_SMALL The packet is larger than Buffer can hold. - @retval EFI_ABORTED The callback function aborted the UDP Read operation. - @retval EFI_TIMEOUT The UDP Read operation timed out. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcUdpRead ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN UINT16 OpFlags, - IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL, - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL, - IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL, - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL, - IN UINTN *HeaderSize OPTIONAL, - IN VOID *HeaderPtr OPTIONAL, - IN OUT UINTN *BufferSize, - IN VOID *BufferPtr - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_UDP4_PROTOCOL *Udp4; - EFI_UDP4_COMPLETION_TOKEN Token; - EFI_UDP4_RECEIVE_DATA *RxData; - EFI_UDP4_SESSION_DATA *Session; - EFI_STATUS Status; - BOOLEAN IsDone; - BOOLEAN Matched; - UINTN CopiedLen; - UINTN HeaderLen; - UINTN HeaderCopiedLen; - UINTN BufferCopiedLen; - UINT32 FragmentLength; - UINTN FragmentIndex; - UINT8 *FragmentBuffer; - - if (This == NULL || DestIp == NULL || DestPort == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (DestPort == NULL)) || - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (SrcIp == NULL)) || - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) == 0 && (SrcPort == NULL))) { - return EFI_INVALID_PARAMETER; - } - - if (((HeaderSize != NULL) && (*HeaderSize == 0)) || ((HeaderSize != NULL) && (HeaderPtr == NULL))) { - return EFI_INVALID_PARAMETER; - } - - if ((BufferSize == NULL) || (BufferPtr == NULL)) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - Udp4 = Private->Udp4Read; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - Mode->IcmpErrorReceived = FALSE; - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_NOTIFY, - PxeBcCommonNotify, - &IsDone, - &Token.Event - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - -TRY_AGAIN: - - IsDone = FALSE; - Status = Udp4->Receive (Udp4, &Token); - if (EFI_ERROR (Status)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - goto ON_EXIT; - } - - Udp4->Poll (Udp4); - - if (!IsDone) { - Status = EFI_TIMEOUT; - } else { - - // - // check whether this packet matches the filters - // - if (EFI_ERROR (Token.Status)){ - goto ON_EXIT; - } - - RxData = Token.Packet.RxData; - Session = &RxData->UdpSession; - - Matched = TRUE; - - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) { - Matched = FALSE; - // - // Check UDP package by IP filter settings - // - if (CheckIpByFilter (Mode, Session)) { - Matched = TRUE; - } - } - - if (Matched) { - Matched = FALSE; - - // - // Match the destination ip of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) { - Matched = TRUE; - - if (DestIp != NULL) { - CopyMem (DestIp, &Session->DestinationAddress, sizeof (EFI_IPv4_ADDRESS)); - } - } else { - if (DestIp != NULL) { - if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) { - Matched = TRUE; - } - } else { - if (EFI_IP4_EQUAL (&Private->StationIp, &Session->DestinationAddress)) { - Matched = TRUE; - } - } - } - } - - if (Matched) { - // - // Match the destination port of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0) { - - if (DestPort != NULL) { - *DestPort = Session->DestinationPort; - } - } else { - - if (*DestPort != Session->DestinationPort) { - Matched = FALSE; - } - } - } - - if (Matched) { - // - // Match the source ip of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) { - - if (SrcIp != NULL) { - CopyMem (SrcIp, &Session->SourceAddress, sizeof (EFI_IPv4_ADDRESS)); - } - } else { - - if (!EFI_IP4_EQUAL (SrcIp, &Session->SourceAddress)) { - Matched = FALSE; - } - } - } - - if (Matched) { - // - // Match the source port of the received udp dgram - // - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != 0) { - - if (SrcPort != NULL) { - *SrcPort = Session->SourcePort; - } - } else { - - if (*SrcPort != Session->SourcePort) { - Matched = FALSE; - } - } - } - - if (Matched) { - ASSERT (RxData != NULL); - - HeaderLen = 0; - if (HeaderSize != NULL) { - HeaderLen = MIN (*HeaderSize, RxData->DataLength); - } - - if (RxData->DataLength - HeaderLen > *BufferSize) { - Status = EFI_BUFFER_TOO_SMALL; - } else { - *HeaderSize = HeaderLen; - *BufferSize = RxData->DataLength - HeaderLen; - - HeaderCopiedLen = 0; - BufferCopiedLen = 0; - for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; FragmentIndex++) { - FragmentLength = RxData->FragmentTable[FragmentIndex].FragmentLength; - FragmentBuffer = RxData->FragmentTable[FragmentIndex].FragmentBuffer; - if (HeaderCopiedLen + FragmentLength < HeaderLen) { - // - // Copy the header part of received data. - // - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, FragmentLength); - HeaderCopiedLen += FragmentLength; - } else if (HeaderCopiedLen < HeaderLen) { - // - // Copy the header part of received data. - // - CopiedLen = HeaderLen - HeaderCopiedLen; - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, CopiedLen); - HeaderCopiedLen += CopiedLen; - - // - // Copy the other part of received data. - // - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer + CopiedLen, FragmentLength - CopiedLen); - BufferCopiedLen += (FragmentLength - CopiedLen); - } else { - // - // Copy the other part of received data. - // - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer, FragmentLength); - BufferCopiedLen += FragmentLength; - } - } - } - } else { - - Status = EFI_TIMEOUT; - } - - // - // Recycle the RxData - // - gBS->SignalEvent (RxData->RecycleSignal); - - if (!Matched) { - goto TRY_AGAIN; - } - } - -ON_EXIT: - - Udp4->Cancel (Udp4, &Token); - - gBS->CloseEvent (Token.Event); - - return Status; -} - -/** - Updates the IP receive filters of a network device and enables software filtering. - - The NewFilter field is used to modify the network device's current IP receive - filter settings and to enable a software filter. This function updates the IpFilter - field of the EFI_PXE_BASE_CODE_MODE structure with the contents of NewIpFilter. - The software filter is used when the USE_FILTER in OpFlags is set to UdpRead(). - The current hardware filter remains in effect no matter what the settings of OpFlags - are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() is from those - packets whose reception is enabled in hardware-physical NIC address (unicast), - broadcast address, logical address or addresses (multicast), or all (promiscuous). - UdpRead() does not modify the IP filter settings. - Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP receive - filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP. - If an application or driver wishes to preserve the IP receive filter settings, - it will have to preserve the IP receive filter settings before these calls, and - use SetIpFilter() to restore them after the calls. If incompatible filtering is - requested (for example, PROMISCUOUS with anything else) or if the device does not - support a requested filter setting and it cannot be accommodated in software - (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER will be returned. - The IPlist field is used to enable IPs other than the StationIP. They may be - multicast or unicast. If IPcnt is set as well as EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP, - then both the StationIP and the IPs from the IPlist will be used. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewFilter Pointer to the new set of IP receive filters. - - @retval EFI_SUCCESS The IP receive filter settings were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetIpFilter ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter - ) -{ - EFI_STATUS Status; - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - UINTN Index; - EFI_UDP4_CONFIG_DATA *Udp4Cfg; - BOOLEAN PromiscuousNeed; - BOOLEAN AcceptPromiscuous; - BOOLEAN AcceptBroadcast; - BOOLEAN MultiCastUpdate; - - if (This == NULL) { - DEBUG ((EFI_D_ERROR, "This == NULL.\n")); - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (NewFilter == NULL) { - DEBUG ((EFI_D_ERROR, "NewFilter == NULL.\n")); - return EFI_INVALID_PARAMETER; - } - - if (NewFilter->IpCnt > EFI_PXE_BASE_CODE_MAX_IPCNT) { - DEBUG ((EFI_D_ERROR, "NewFilter->IpCnt > %d.\n", EFI_PXE_BASE_CODE_MAX_IPCNT)); - return EFI_INVALID_PARAMETER; - } - - if (!Mode->Started) { - DEBUG ((EFI_D_ERROR, "BC was not started.\n")); - return EFI_NOT_STARTED; - } - - if (Mode->UsingIpv6) { - DEBUG ((EFI_D_ERROR, "This driver is PXE for IPv4 Only.\n")); - return EFI_INVALID_PARAMETER; - } - - PromiscuousNeed = FALSE; - - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { - if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) { - // - // The IP is a broadcast address. - // - DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n")); - return EFI_INVALID_PARAMETER; - } - if ((EFI_NTOHL(Mode->StationIp) != 0) && - (EFI_NTOHL(Mode->SubnetMask) != 0) && - IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) && - NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) && - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0)) { - // - // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is in IpList, - // promiscuous mode is needed. - // - PromiscuousNeed = TRUE; - } - } - - AcceptPromiscuous = FALSE; - AcceptBroadcast = FALSE; - MultiCastUpdate = FALSE; - - if (PromiscuousNeed || - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) || - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) - ) { - // - // Configure the udp4 filter to receive all packages. - // - AcceptPromiscuous = TRUE; - } else if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) { - // - // Configure the udp4 filter to receive all broadcast packages. - // - AcceptBroadcast = TRUE; - } - - // - // In multicast condition when Promiscuous FALSE and IpCnt no-zero. - // Here check if there is any update of the multicast ip address. If yes, - // we need leave the old multicast group (by Config UDP instance to NULL), - // and join the new multicast group. - // - if (!AcceptPromiscuous) { - if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) { - if (Mode->IpFilter.IpCnt != NewFilter->IpCnt) { - MultiCastUpdate = TRUE; - } else if (CompareMem (Mode->IpFilter.IpList, NewFilter->IpList, NewFilter->IpCnt * sizeof (EFI_IP_ADDRESS)) != 0 ) { - MultiCastUpdate = TRUE; - } - } - } - - // - // Check whether we need reconfigure the UDP instance. - // - Udp4Cfg = &Private->Udp4CfgData; - if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous) || - (AcceptBroadcast != Udp4Cfg->AcceptBroadcast) || MultiCastUpdate) { - // - // Clear the UDP instance configuration, all joined groups will be left - // during the operation. - // - Private->Udp4Read->Configure (Private->Udp4Read, NULL); - - // - // Configure the UDP instance with the new configuration. - // - Udp4Cfg->AcceptPromiscuous = AcceptPromiscuous; - Udp4Cfg->AcceptBroadcast = AcceptBroadcast; - Status = Private->Udp4Read->Configure (Private->Udp4Read, Udp4Cfg); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // In not Promiscuous mode, need to join the new multicast group. - // - if (!AcceptPromiscuous) { - for (Index = 0; Index < NewFilter->IpCnt; ++Index) { - if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) { - // - // Join the mutilcast group. - // - Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE, &NewFilter->IpList[Index].v4); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - } - } - - - // - // Save the new filter. - // - CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter)); - - return EFI_SUCCESS; -} - - -/** - Uses the ARP protocol to resolve a MAC address. - - This function uses the ARP protocol to resolve a MAC address. The UsingIpv6 field - of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 or IPv6 - addresses are being used. The IP address specified by IpAddr is used to resolve - a MAC address. If the ARP protocol succeeds in resolving the specified address, - then the ArpCacheEntries and ArpCache fields of the EFI_PXE_BASE_CODE_MODE structure - are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the resolved - MAC address is placed there as well. If the PXE Base Code protocol is in the - stopped state, then EFI_NOT_STARTED is returned. If the ARP protocol encounters - a timeout condition while attempting to resolve an address, then EFI_TIMEOUT is - returned. If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, - then EFI_ABORTED is returned. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param IpAddr Pointer to the IP address that is used to resolve a MAC address. - @param MacAddr If not NULL, a pointer to the MAC address that was resolved with the - ARP protocol. - - @retval EFI_SUCCESS The IP or MAC address was resolved. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval EFI_ICMP_ERROR Something error occur with the ICMP packet message. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcArp ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN EFI_IP_ADDRESS * IpAddr, - IN EFI_MAC_ADDRESS * MacAddr OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - EFI_MAC_ADDRESS TempMacAddr; - - if (This == NULL || IpAddr == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (!Private->AddressIsOk || Mode->UsingIpv6) { - // - // We can't resolve the IP address if we don't have a local address now. - // Don't have ARP for IPv6. - // - return EFI_INVALID_PARAMETER; - } - - Mode->IcmpErrorReceived = FALSE; - - if (!Mode->AutoArp) { - // - // If AutoArp is set false, check arp cache - // - UpdateArpCache (This); - if (!FindInArpCache (Mode, &IpAddr->v4, &TempMacAddr)) { - return EFI_DEVICE_ERROR; - } - } else { - Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL, &TempMacAddr); - if (EFI_ERROR (Status)) { - if (Status == EFI_ICMP_ERROR) { - Mode->IcmpErrorReceived = TRUE; - } - return Status; - } - } - - if (MacAddr != NULL) { - CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS)); - } - - return EFI_SUCCESS; -} - -/** - Updates the parameters that affect the operation of the PXE Base Code Protocol. - - This function sets parameters that affect the operation of the PXE Base Code Protocol. - The parameter specified by NewAutoArp is used to control the generation of ARP - protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets will be generated - as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, then no ARP - Protocol packets will be generated. In this case, the only mappings that are - available are those stored in the ArpCache of the EFI_PXE_BASE_CODE_MODE structure. - If there are not enough mappings in the ArpCache to perform a PXE Base Code Protocol - service, then the service will fail. This function updates the AutoArp field of - the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp. - The SetParameters() call must be invoked after a Callback Protocol is installed - to enable the use of callbacks. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewAutoArp If not NULL, a pointer to a value that specifies whether to replace the - current value of AutoARP. - @param NewSendGUID If not NULL, a pointer to a value that specifies whether to replace the - current value of SendGUID. - @param NewTTL If not NULL, a pointer to be used in place of the current value of TTL, - the "time to live" field of the IP header. - @param NewToS If not NULL, a pointer to be used in place of the current value of ToS, - the "type of service" field of the IP header. - @param NewMakeCallback If not NULL, a pointer to a value that specifies whether to replace the - current value of the MakeCallback field of the Mode structure. - - @retval EFI_SUCCESS The new parameters values were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetParameters ( - IN EFI_PXE_BASE_CODE_PROTOCOL *This, - IN BOOLEAN *NewAutoArp OPTIONAL, - IN BOOLEAN *NewSendGUID OPTIONAL, - IN UINT8 *NewTTL OPTIONAL, - IN UINT8 *NewToS OPTIONAL, - IN BOOLEAN *NewMakeCallback // OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - - Status = EFI_SUCCESS; - - if (This == NULL) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (NewSendGUID != NULL && *NewSendGUID) { - // - // FixMe, cann't locate SendGuid - // - } - - if (NewMakeCallback != NULL && *NewMakeCallback) { - - Status = gBS->HandleProtocol ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - (VOID **) &Private->PxeBcCallback - ); - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) { - - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - } - - if (!Mode->Started) { - Status = EFI_NOT_STARTED; - goto ON_EXIT; - } - - if (NewMakeCallback != NULL) { - - if (*NewMakeCallback) { - // - // Update the Callback protocol. - // - Status = gBS->HandleProtocol ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - (VOID **) &Private->PxeBcCallback - ); - - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) { - Status = EFI_INVALID_PARAMETER; - goto ON_EXIT; - } - } else { - Private->PxeBcCallback = NULL; - } - - Mode->MakeCallbacks = *NewMakeCallback; - } - - if (NewAutoArp != NULL) { - Mode->AutoArp = *NewAutoArp; - } - - if (NewSendGUID != NULL) { - Mode->SendGUID = *NewSendGUID; - } - - if (NewTTL != NULL) { - Mode->TTL = *NewTTL; - } - - if (NewToS != NULL) { - Mode->ToS = *NewToS; - } - -ON_EXIT: - return Status; -} - -/** - Updates the station IP address and/or subnet mask values of a network device. - - This function updates the station IP address and/or subnet mask values of a network - device. The NewStationIp field is used to modify the network device's current IP address. - If NewStationIP is NULL, then the current IP address will not be modified. Otherwise, - this function updates the StationIp field of the EFI_PXE_BASE_CODE_MODE structure - with NewStationIp. The NewSubnetMask field is used to modify the network device's current subnet - mask. If NewSubnetMask is NULL, then the current subnet mask will not be modified. - Otherwise, this function updates the SubnetMask field of the EFI_PXE_BASE_CODE_MODE - structure with NewSubnetMask. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewStationIp Pointer to the new IP address to be used by the network device. - @param NewSubnetMask Pointer to the new subnet mask to be used by the network device. - - @retval EFI_SUCCESS The new station IP address and/or subnet mask were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetStationIP ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN EFI_IP_ADDRESS * NewStationIp OPTIONAL, - IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_ARP_CONFIG_DATA ArpConfigData; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL (NewSubnetMask->Addr[0]))) { - return EFI_INVALID_PARAMETER; - } - - if (NewStationIp != NULL) { - if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) || - IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) || - (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0 && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0])))) { - return EFI_INVALID_PARAMETER; - } - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (NewStationIp != NULL) { - CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS)); - CopyMem (&Private->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS)); - } - - if (NewSubnetMask != NULL) { - CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof (EFI_IP_ADDRESS)); - CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof (EFI_IP_ADDRESS)); - } - - Private->AddressIsOk = TRUE; - - if (!Mode->UsingIpv6) { - // - // If in IPv4 mode, configure the corresponding ARP with this new - // station IP address. - // - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA)); - - ArpConfigData.SwAddressType = 0x0800; - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS); - ArpConfigData.StationAddress = &Private->StationIp.v4; - - Private->Arp->Configure (Private->Arp, NULL); - Private->Arp->Configure (Private->Arp, &ArpConfigData); - - // - // Update the route table. - // - Mode->RouteTableEntries = 1; - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0]; - Mode->RouteTable[0].GwAddr.Addr[0] = 0; - } - - return EFI_SUCCESS; -} - -/** - Updates the contents of the cached DHCP and Discover packets. - - The pointers to the new packets are used to update the contents of the cached - packets in the EFI_PXE_BASE_CODE_MODE structure. - - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance. - @param NewDhcpDiscoverValid Pointer to a value that will replace the current - DhcpDiscoverValid field. - @param NewDhcpAckReceived Pointer to a value that will replace the current - DhcpAckReceived field. - @param NewProxyOfferReceived Pointer to a value that will replace the current - ProxyOfferReceived field. - @param NewPxeDiscoverValid Pointer to a value that will replace the current - ProxyOfferReceived field. - @param NewPxeReplyReceived Pointer to a value that will replace the current - PxeReplyReceived field. - @param NewPxeBisReplyReceived Pointer to a value that will replace the current - PxeBisReplyReceived field. - @param NewDhcpDiscover Pointer to the new cached DHCP Discover packet contents. - @param NewDhcpAck Pointer to the new cached DHCP Ack packet contents. - @param NewProxyOffer Pointer to the new cached Proxy Offer packet contents. - @param NewPxeDiscover Pointer to the new cached PXE Discover packet contents. - @param NewPxeReply Pointer to the new cached PXE Reply packet contents. - @param NewPxeBisReply Pointer to the new cached PXE BIS Reply packet contents. - - @retval EFI_SUCCESS The cached packet contents were updated. - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state. - @retval EFI_INVALID_PARAMETER This is NULL or not point to a valid EFI_PXE_BASE_CODE_PROTOCOL structure. - -**/ -EFI_STATUS -EFIAPI -EfiPxeBcSetPackets ( - IN EFI_PXE_BASE_CODE_PROTOCOL * This, - IN BOOLEAN * NewDhcpDiscoverValid OPTIONAL, - IN BOOLEAN * NewDhcpAckReceived OPTIONAL, - IN BOOLEAN * NewProxyOfferReceived OPTIONAL, - IN BOOLEAN * NewPxeDiscoverValid OPTIONAL, - IN BOOLEAN * NewPxeReplyReceived OPTIONAL, - IN BOOLEAN * NewPxeBisReplyReceived OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply OPTIONAL, - IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_MODE *Mode; - - if (This == NULL) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This); - Mode = Private->PxeBc.Mode; - - if (!Mode->Started) { - return EFI_NOT_STARTED; - } - - if (NewDhcpDiscoverValid != NULL) { - Mode->DhcpDiscoverValid = *NewDhcpDiscoverValid; - } - - if (NewDhcpAckReceived != NULL) { - Mode->DhcpAckReceived = *NewDhcpAckReceived; - } - - if (NewProxyOfferReceived != NULL) { - Mode->ProxyOfferReceived = *NewProxyOfferReceived; - } - - if (NewPxeDiscoverValid != NULL) { - Mode->PxeDiscoverValid = *NewPxeDiscoverValid; - } - - if (NewPxeReplyReceived != NULL) { - Mode->PxeReplyReceived = *NewPxeReplyReceived; - } - - if (NewPxeBisReplyReceived != NULL) { - Mode->PxeBisReplyReceived = *NewPxeBisReplyReceived; - } - - if (NewDhcpDiscover != NULL) { - CopyMem (&Mode->DhcpDiscover, NewDhcpDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewDhcpAck != NULL) { - CopyMem (&Mode->DhcpAck, NewDhcpAck, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewProxyOffer != NULL) { - CopyMem (&Mode->ProxyOffer, NewProxyOffer, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewPxeDiscover != NULL) { - CopyMem (&Mode->PxeDiscover, NewPxeDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewPxeReply != NULL) { - CopyMem (&Mode->PxeReply, NewPxeReply, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - if (NewPxeBisReply != NULL) { - CopyMem (&Mode->PxeBisReply, NewPxeBisReply, sizeof (EFI_PXE_BASE_CODE_PACKET)); - } - - return EFI_SUCCESS; -} - -EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate = { - EFI_PXE_BASE_CODE_PROTOCOL_REVISION, - EfiPxeBcStart, - EfiPxeBcStop, - EfiPxeBcDhcp, - EfiPxeBcDiscover, - EfiPxeBcMtftp, - EfiPxeBcUdpWrite, - EfiPxeBcUdpRead, - EfiPxeBcSetIpFilter, - EfiPxeBcArp, - EfiPxeBcSetParameters, - EfiPxeBcSetStationIP, - EfiPxeBcSetPackets, - NULL -}; - -/** - Callback function that is invoked when the PXE Base Code Protocol is about to transmit, has - received, or is waiting to receive a packet. - - This function is invoked when the PXE Base Code Protocol is about to transmit, has received, - or is waiting to receive a packet. Parameters Function and Received specify the type of event. - Parameters PacketLen and Packet specify the packet that generated the event. If these fields - are zero and NULL respectively, then this is a status update callback. If the operation specified - by Function is to continue, then CALLBACK_STATUS_CONTINUE should be returned. If the operation - specified by Function should be aborted, then CALLBACK_STATUS_ABORT should be returned. Due to - the polling nature of UEFI device drivers, a callback function should not execute for more than 5 ms. - The SetParameters() function must be called after a Callback Protocol is installed to enable the - use of callbacks. - - @param This Pointer to the EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL instance. - @param Function The PXE Base Code Protocol function that is waiting for an event. - @param Received TRUE if the callback is being invoked due to a receive event. FALSE if - the callback is being invoked due to a transmit event. - @param PacketLength The length, in bytes, of Packet. This field will have a value of zero if - this is a wait for receive event. - @param PacketPtr If Received is TRUE, a pointer to the packet that was just received; - otherwise a pointer to the packet that is about to be transmitted. - - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE if Function specifies a continue operation - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT if Function specifies an abort operation - -**/ -EFI_PXE_BASE_CODE_CALLBACK_STATUS -EFIAPI -EfiPxeLoadFileCallback ( - IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL * This, - IN EFI_PXE_BASE_CODE_FUNCTION Function, - IN BOOLEAN Received, - IN UINT32 PacketLength, - IN EFI_PXE_BASE_CODE_PACKET * PacketPtr OPTIONAL - ) -{ - EFI_INPUT_KEY Key; - EFI_STATUS Status; - - // - // Catch Ctrl-C or ESC to abort. - // - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - - if (!EFI_ERROR (Status)) { - - if (Key.ScanCode == SCAN_ESC || Key.UnicodeChar == (0x1F & 'c')) { - - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT; - } - } - // - // No print if receive packet - // - if (Received) { - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; - } - // - // Print only for three functions - // - switch (Function) { - - case EFI_PXE_BASE_CODE_FUNCTION_MTFTP: - // - // Print only for open MTFTP packets, not every MTFTP packets - // - if (PacketLength != 0 && PacketPtr != NULL) { - if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) { - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; - } - } - break; - - case EFI_PXE_BASE_CODE_FUNCTION_DHCP: - case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER: - break; - - default: - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; - } - - if (PacketLength != 0 && PacketPtr != NULL) { - // - // Print '.' when transmit a packet - // - AsciiPrint ("."); - - } - - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE; -} - -EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL mPxeBcCallBackTemplate = { - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION, - EfiPxeLoadFileCallback -}; - - -/** - Find the boot file. - - @param Private Pointer to PxeBc private data. - @param BufferSize Pointer to buffer size. - @param Buffer Pointer to buffer. - - @retval EFI_SUCCESS Discover the boot file successfully. - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out. - @retval EFI_ABORTED PXE bootstrap server, so local boot need abort. - @retval EFI_BUFFER_TOO_SMALL The buffer is too small to load the boot file. - -**/ -EFI_STATUS -DiscoverBootFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN OUT UINT64 *BufferSize, - IN VOID *Buffer - ) -{ - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - EFI_PXE_BASE_CODE_MODE *Mode; - EFI_STATUS Status; - UINT16 Type; - UINT16 Layer; - BOOLEAN UseBis; - PXEBC_CACHED_DHCP4_PACKET *Packet; - UINT16 Value; - - PxeBc = &Private->PxeBc; - Mode = PxeBc->Mode; - Type = EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP; - Layer = EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL; - - // - // do DHCP. - // - Status = PxeBc->Dhcp (PxeBc, TRUE); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Select a boot server - // - Status = PxeBcSelectBootPrompt (Private); - - if (Status == EFI_SUCCESS) { - Status = PxeBcSelectBootMenu (Private, &Type, TRUE); - } else if (Status == EFI_TIMEOUT) { - Status = PxeBcSelectBootMenu (Private, &Type, FALSE); - } - - if (!EFI_ERROR (Status)) { - - if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) { - // - // Local boot(PXE bootstrap server) need abort - // - return EFI_ABORTED; - } - - UseBis = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected); - Status = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL); - if (EFI_ERROR (Status)) { - return Status; - } - } - - *BufferSize = 0; - - // - // Get bootfile name and (m)tftp server ip addresss - // - if (Mode->PxeReplyReceived) { - Packet = &Private->PxeReply; - } else if (Mode->ProxyOfferReceived) { - Packet = &Private->ProxyOffer; - } else { - Packet = &Private->Dhcp4Ack; - } - - // - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier) - // in DHCPOFFER packet. - // (It does not comply with PXE Spec, Ver2.1) - // - if (EFI_IP4_EQUAL (&Packet->Packet.Offer.Dhcp4.Header.ServerAddr, &mZeroIp4Addr)) { - CopyMem ( - &Private->ServerIp, - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data, - sizeof (EFI_IPv4_ADDRESS) - ); - } else { - CopyMem ( - &Private->ServerIp, - &Packet->Packet.Offer.Dhcp4.Header.ServerAddr, - sizeof (EFI_IPv4_ADDRESS) - ); - } - if (Private->ServerIp.Addr[0] == 0) { - return EFI_DEVICE_ERROR; - } - - ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL); - - // - // bootlfile name - // - Private->BootFileName = (CHAR8 *) (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data); - - if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != NULL) { - // - // Already have the bootfile length option, compute the file size - // - CopyMem (&Value, Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof (Value)); - Value = NTOHS (Value); - *BufferSize = 512 * Value; - Status = EFI_BUFFER_TOO_SMALL; - } else { - // - // Get the bootfile size from tftp - // - Status = PxeBc->Mtftp ( - PxeBc, - EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, - Buffer, - FALSE, - BufferSize, - &Private->BlockSize, - &Private->ServerIp, - (UINT8 *) Private->BootFileName, - NULL, - FALSE - ); - } - - Private->FileSize = (UINTN) *BufferSize; - - // - // Display all the information: boot server address, boot file name and boot file size. - // - AsciiPrint ("\n Server IP address is "); - PxeBcShowIp4Addr (&Private->ServerIp.v4); - AsciiPrint ("\n NBP filename is %a", Private->BootFileName); - AsciiPrint ("\n NBP filesize is %d Bytes", Private->FileSize); - - return Status; -} - -/** - Causes the driver to load a specified file. - - @param This Protocol instance pointer. - @param FilePath The device specific path of the file to load. - @param BootPolicy If TRUE, indicates that the request originates from the - boot manager is attempting to load FilePath as a boot - selection. If FALSE, then FilePath must match as exact file - to be loaded. - @param BufferSize On input the size of Buffer in bytes. On output with a return - code of EFI_SUCCESS, the amount of data transferred to - Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, - the size of Buffer required to retrieve the requested file. - @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in - BufferSize. - - @retval EFI_SUCCESS The file was loaded. - @retval EFI_UNSUPPORTED The device does not support the provided BootPolicy - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or - BufferSize is NULL. - @retval EFI_NO_MEDIA No medium was present to load the file. - @retval EFI_DEVICE_ERROR The file was not loaded due to a device error. - @retval EFI_NO_RESPONSE The remote system did not respond. - @retval EFI_NOT_FOUND The file was not found. - @retval EFI_ABORTED The file load process was manually cancelled. - -**/ -EFI_STATUS -EFIAPI -EfiPxeLoadFile ( - IN EFI_LOAD_FILE_PROTOCOL * This, - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, - IN BOOLEAN BootPolicy, - IN OUT UINTN *BufferSize, - IN VOID *Buffer OPTIONAL - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; - BOOLEAN NewMakeCallback; - EFI_STATUS Status; - UINT64 TmpBufSize; - EFI_STATUS MediaStatus; - - if (FilePath == NULL || !IsDevicePathEnd (FilePath)) { - return EFI_INVALID_PARAMETER; - } - - Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This); - PxeBc = &Private->PxeBc; - NewMakeCallback = FALSE; - Status = EFI_DEVICE_ERROR; - - if (This == NULL || BufferSize == NULL) { - - return EFI_INVALID_PARAMETER; - } - - // - // Only support BootPolicy - // - if (!BootPolicy) { - return EFI_UNSUPPORTED; - } - - // - // Check media status before PXE start - // - MediaStatus = EFI_SUCCESS; - NetLibDetectMediaWaitTimeout (Private->Controller, PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus); - if (MediaStatus != EFI_SUCCESS) { - return EFI_NO_MEDIA; - } - - Status = PxeBc->Start (PxeBc, FALSE); - if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { - return Status; - } - - Status = gBS->HandleProtocol ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - (VOID **) &Private->PxeBcCallback - ); - if (Status == EFI_UNSUPPORTED) { - - CopyMem (&Private->LoadFileCallback, &mPxeBcCallBackTemplate, sizeof (Private->LoadFileCallback)); - - Status = gBS->InstallProtocolInterface ( - &Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - EFI_NATIVE_INTERFACE, - &Private->LoadFileCallback - ); - - NewMakeCallback = (BOOLEAN) (Status == EFI_SUCCESS); - - Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback); - if (EFI_ERROR (Status)) { - PxeBc->Stop (PxeBc); - return Status; - } - } - - if (Private->FileSize == 0) { - TmpBufSize = 0; - Status = DiscoverBootFile (Private, &TmpBufSize, Buffer); - - if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) { - Status = EFI_DEVICE_ERROR; - } else if (TmpBufSize > 0 && *BufferSize >= (UINTN) TmpBufSize && Buffer != NULL) { - AsciiPrint ("\n Downloading NBP file...\n"); - *BufferSize = (UINTN) TmpBufSize; - Status = PxeBc->Mtftp ( - PxeBc, - EFI_PXE_BASE_CODE_TFTP_READ_FILE, - Buffer, - FALSE, - &TmpBufSize, - &Private->BlockSize, - &Private->ServerIp, - (UINT8 *) Private->BootFileName, - NULL, - FALSE - ); - } else if (TmpBufSize > 0) { - *BufferSize = (UINTN) TmpBufSize; - Status = EFI_BUFFER_TOO_SMALL; - } - } else if (Buffer == NULL || Private->FileSize > *BufferSize) { - *BufferSize = Private->FileSize; - Status = EFI_BUFFER_TOO_SMALL; - } else { - // - // Download the file. - // - AsciiPrint ("\n Downloading NBP file...\n"); - TmpBufSize = (UINT64) (*BufferSize); - Status = PxeBc->Mtftp ( - PxeBc, - EFI_PXE_BASE_CODE_TFTP_READ_FILE, - Buffer, - FALSE, - &TmpBufSize, - &Private->BlockSize, - &Private->ServerIp, - (UINT8 *) Private->BootFileName, - NULL, - FALSE - ); - } - // - // If we added a callback protocol, now is the time to remove it. - // - if (NewMakeCallback) { - - NewMakeCallback = FALSE; - - PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback); - - gBS->UninstallProtocolInterface ( - Private->Controller, - &gEfiPxeBaseCodeCallbackProtocolGuid, - &Private->LoadFileCallback - ); - } - - // - // Check download status - // - if (Status == EFI_SUCCESS) { - AsciiPrint ("\n NBP file downloaded successfully.\n"); - // - // The DHCP4 can have only one configured child instance so we need to stop - // reset the DHCP4 child before we return. Otherwise the other programs which - // also need to use DHCP4 will be impacted. - // The functionality of PXE Base Code protocol will not be stopped, - // when downloading is successfully. - // - Private->Dhcp4->Stop (Private->Dhcp4); - Private->Dhcp4->Configure (Private->Dhcp4, NULL); - return EFI_SUCCESS; - - } else if (Status == EFI_BUFFER_TOO_SMALL) { - if (Buffer != NULL) { - AsciiPrint ("PXE-E05: Download buffer is smaller than requested file.\n"); - } else { - // - // The functionality of PXE Base Code protocol will not be stopped. - // - return Status; - } - - } else if (Status == EFI_DEVICE_ERROR) { - AsciiPrint ("PXE-E07: Network device error.\n"); - - } else if (Status == EFI_OUT_OF_RESOURCES) { - AsciiPrint ("PXE-E09: Could not allocate I/O buffers.\n"); - - } else if (Status == EFI_NO_MEDIA) { - AsciiPrint ("PXE-E12: Could not detect network connection.\n"); - - } else if (Status == EFI_NO_RESPONSE) { - AsciiPrint ("PXE-E16: No offer received.\n"); - - } else if (Status == EFI_TIMEOUT) { - AsciiPrint ("PXE-E18: Server response timeout.\n"); - - } else if (Status == EFI_ABORTED) { - AsciiPrint ("PXE-E21: Remote boot cancelled.\n"); - - } else if (Status == EFI_ICMP_ERROR) { - AsciiPrint ("PXE-E22: Client received ICMP error from server.\n"); - - } else if (Status == EFI_TFTP_ERROR) { - AsciiPrint ("PXE-E23: Client received TFTP error from server.\n"); - - } else { - AsciiPrint ("PXE-E99: Unexpected network error.\n"); - } - - PxeBc->Stop (PxeBc); - - return Status; -} - -EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate = { EfiPxeLoadFile }; - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c deleted file mode 100644 index 88767c8394ab..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c +++ /dev/null @@ -1,454 +0,0 @@ -/** @file - PxeBc MTFTP functions. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "PxeBcImpl.h" - -CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = { - "blksize", - "timeout", - "tsize", - "multicast" -}; - - -/** - This is a callback function when packets received/transmitted in Mtftp driver. - - A callback function that is provided by the caller to intercept - the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the - EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept - EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to - EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory(). - - @param This Pointer to Mtftp protocol instance - @param Token Pointer to Mtftp token - @param PacketLen Length of Mtftp packet - @param Packet Pointer to Mtftp packet - - @retval EFI_SUCCESS Operation sucess - @retval EFI_ABORTED Abort transfer process - -**/ -EFI_STATUS -EFIAPI -PxeBcCheckPacket ( - IN EFI_MTFTP4_PROTOCOL *This, - IN EFI_MTFTP4_TOKEN *Token, - IN UINT16 PacketLen, - IN EFI_MTFTP4_PACKET *Packet - ) -{ - PXEBC_PRIVATE_DATA *Private; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback; - EFI_STATUS Status; - - Private = (PXEBC_PRIVATE_DATA *) Token->Context; - Callback = Private->PxeBcCallback; - Status = EFI_SUCCESS; - - if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) { - Private->Mode.TftpErrorReceived = TRUE; - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode; - AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet->Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1); - Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; - } - - if (Callback != NULL) { - - Status = Callback->Callback ( - Callback, - Private->Function, - TRUE, - PacketLen, - (EFI_PXE_BASE_CODE_PACKET *) Packet - ); - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) { - - Status = EFI_ABORTED; - } else { - - Status = EFI_SUCCESS; - } - } - - return Status; -} - - -/** - This function is to get size of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Get the size of file success - @retval EFI_NOT_FOUND Parse the tftp ptions failed. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval Other Has not get the size of the file. - -**/ -EFI_STATUS -PxeBcTftpGetFileSize ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN OUT UINT64 *BufferSize - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_OPTION ReqOpt[2]; - EFI_MTFTP4_PACKET *Packet; - EFI_MTFTP4_OPTION *Option; - UINT32 PktLen; - UINT8 OptBuf[128]; - UINT32 OptCnt; - EFI_STATUS Status; - - *BufferSize = 0; - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - Packet = NULL; - Option = NULL; - PktLen = 0; - OptCnt = 1; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - ReqOpt[0].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX]; - UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - ReqOpt[0].ValueStr = OptBuf; - - if (BlockSize != NULL) { - ReqOpt[1].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1)); - OptCnt++; - } - - Status = Mtftp4->GetInfo ( - Mtftp4, - NULL, - Filename, - NULL, - (UINT8) OptCnt, - ReqOpt, - &PktLen, - &Packet - ); - - if (EFI_ERROR (Status)) { - if (Status == EFI_TFTP_ERROR) { - Private->Mode.TftpErrorReceived = TRUE; - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode; - AsciiStrnCpyS ( - Private->Mode.TftpError.ErrorString, - PXE_MTFTP_ERROR_STRING_LENGTH, - (CHAR8 *) Packet->Error.ErrorMessage, - PXE_MTFTP_ERROR_STRING_LENGTH - 1 - ); - Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0'; - } - goto ON_ERROR; - } - - OptCnt = 0; - - Status = Mtftp4->ParseOptions ( - Mtftp4, - PktLen, - Packet, - (UINT32 *) &OptCnt, - &Option - ); - - if (EFI_ERROR (Status)) { - - goto ON_ERROR; - } - - Status = EFI_NOT_FOUND; - - while (OptCnt != 0) { - - if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) { - - *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr); - Status = EFI_SUCCESS; - } - - OptCnt--; - } - - FreePool (Option); - -ON_ERROR: - - if (Packet != NULL) { - FreePool (Packet); - } - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - - -/** - This function is to get data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - @param DontUseBuffer Indicate whether with a receive buffer - - @retval EFI_SUCCESS Read the data success from the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Read data from file failed. - -**/ -EFI_STATUS -PxeBcTftpReadFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_TOKEN Token; - EFI_MTFTP4_OPTION ReqOpt[1]; - UINT32 OptCnt; - UINT8 OptBuf[128]; - EFI_STATUS Status; - - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - OptCnt = 0; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - if (BlockSize != NULL) { - - ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[0].ValueStr = OptBuf; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - OptCnt++; - } - - Token.Event = NULL; - Token.OverrideData = NULL; - Token.Filename = Filename; - Token.ModeStr = NULL; - Token.OptionCount = OptCnt; - Token.OptionList = ReqOpt; - Token.Context = Private; - - if (DontUseBuffer) { - Token.BufferSize = 0; - Token.Buffer = NULL; - } else { - Token.BufferSize = *BufferSize; - Token.Buffer = BufferPtr; - } - - Token.CheckPacket = PxeBcCheckPacket; - Token.TimeoutCallback = NULL; - Token.PacketNeeded = NULL; - - Status = Mtftp4->ReadFile (Mtftp4, &Token); - - *BufferSize = Token.BufferSize; - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - - -/** - This function is put data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param Overwrite Indicate whether with overwrite attribute - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Write the data success into the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Write data into file failed. - -**/ -EFI_STATUS -PxeBcTftpWriteFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN BOOLEAN Overwrite, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_TOKEN Token; - EFI_MTFTP4_OPTION ReqOpt[1]; - UINT32 OptCnt; - UINT8 OptBuf[128]; - EFI_STATUS Status; - - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - OptCnt = 0; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - if (BlockSize != NULL) { - - ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[0].ValueStr = OptBuf; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - OptCnt++; - } - - Token.Event = NULL; - Token.OverrideData = NULL; - Token.Filename = Filename; - Token.ModeStr = NULL; - Token.OptionCount = OptCnt; - Token.OptionList = ReqOpt; - Token.BufferSize = *BufferSize; - Token.Buffer = BufferPtr; - Token.CheckPacket = PxeBcCheckPacket; - Token.TimeoutCallback = NULL; - Token.PacketNeeded = NULL; - - Status = Mtftp4->WriteFile (Mtftp4, &Token); - *BufferSize = Token.BufferSize; - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - - -/** - This function is to get data(file) from a directory(may be a server) by Tftp. - - @param Private Pointer to PxeBc private data. - @param Config Pointer to Mtftp configuration data. - @param Filename Pointer to file name. - @param BlockSize Pointer to block size. - @param BufferPtr Pointer to buffer. - @param BufferSize Pointer to buffer size. - @param DontUseBuffer Indicate whether with a receive buffer. - - @retval EFI_SUCCES Get the data from the file included in directory success. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Operation failed. - -**/ -EFI_STATUS -PxeBcTftpReadDirectory ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ) -{ - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_MTFTP4_TOKEN Token; - EFI_MTFTP4_OPTION ReqOpt[1]; - UINT32 OptCnt; - UINT8 OptBuf[128]; - EFI_STATUS Status; - - Status = EFI_DEVICE_ERROR; - Mtftp4 = Private->Mtftp4; - OptCnt = 0; - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT; - - Status = Mtftp4->Configure (Mtftp4, Config); - if (EFI_ERROR (Status)) { - - return Status; - } - - if (BlockSize != NULL) { - - ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX]; - ReqOpt[0].ValueStr = OptBuf; - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX); - OptCnt++; - } - - Token.Event = NULL; - Token.OverrideData = NULL; - Token.Filename = Filename; - Token.ModeStr = NULL; - Token.OptionCount = OptCnt; - Token.OptionList = ReqOpt; - Token.Context = Private; - - if (DontUseBuffer) { - Token.BufferSize = 0; - Token.Buffer = NULL; - } else { - Token.BufferSize = *BufferSize; - Token.Buffer = BufferPtr; - } - - Token.CheckPacket = PxeBcCheckPacket; - Token.TimeoutCallback = NULL; - Token.PacketNeeded = NULL; - - Status = Mtftp4->ReadDirectory (Mtftp4, &Token); - - *BufferSize = Token.BufferSize; - - Mtftp4->Configure (Mtftp4, NULL); - - return Status; -} - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c deleted file mode 100644 index 1401ca5ec2fd..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c +++ /dev/null @@ -1,221 +0,0 @@ -/** @file - Support routines for PxeBc. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "PxeBcImpl.h" - - -/** - The common notify function associated with various PxeBc events. - - @param Event The event signaled. - @param Context The context. - -**/ -VOID -EFIAPI -PxeBcCommonNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - *((BOOLEAN *) Context) = TRUE; -} - - -/** - This function initialize(or configure) the Udp4Write instance. - - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - @param StationIp Pointer to the station ip address. - @param SubnetMask Pointer to the subnetmask of the station ip address. - @param Gateway Pointer to the gateway ip address. - @param SrcPort Pointer to the srouce port of the station. - @param Ttl The time to live field of the IP header. - @param ToS The type of service field of the IP header. - - @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration (DHCP, BOOTP, - RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE: - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already started/configured - and must be stopped/reset before it can be reconfigured. - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE - and UdpConfigData.StationPort is already used by - other instance. - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot allocate memory for this - EFI UDPv4 Protocol instance. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance - was not opened. - @retval Others Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. - -**/ -EFI_STATUS -PxeBcConfigureUdpWriteInstance ( - IN EFI_UDP4_PROTOCOL *Udp4, - IN EFI_IPv4_ADDRESS *StationIp, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *Gateway, - IN OUT UINT16 *SrcPort, - IN UINT8 Ttl, - IN UINT8 ToS - ) -{ - EFI_UDP4_CONFIG_DATA Udp4CfgData; - EFI_STATUS Status; - - ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData)); - - Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME; - Udp4CfgData.TypeOfService = ToS; - Udp4CfgData.TimeToLive = Ttl; - Udp4CfgData.AllowDuplicatePort = TRUE; - - CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp)); - CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask)); - - Udp4CfgData.StationPort = *SrcPort; - - // - // Reset the instance. - // - Udp4->Configure (Udp4, NULL); - - Status = Udp4->Configure (Udp4, &Udp4CfgData); - if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) { - // - // basic configuration OK, need to add the default route entry - // - Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway); - if (EFI_ERROR (Status)) { - // - // roll back - // - Udp4->Configure (Udp4, NULL); - } - } - - if (!EFI_ERROR (Status) && (*SrcPort == 0)) { - Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL); - *SrcPort = Udp4CfgData.StationPort; - } - - return Status; -} - -/** - This function is to display the IPv4 address. - - @param[in] Ip The pointer to the IPv4 address. - -**/ -VOID -PxeBcShowIp4Addr ( - IN EFI_IPv4_ADDRESS *Ip - ) -{ - UINTN Index; - - for (Index = 0; Index < 4; Index++) { - AsciiPrint ("%d", Ip->Addr[Index]); - if (Index < 3) { - AsciiPrint ("."); - } - } -} - -/** - Convert number to ASCII value. - - @param Number Numeric value to convert to decimal ASCII value. - @param Buffer Buffer to place ASCII version of the Number. - @param Length Length of Buffer. - -**/ -VOID -CvtNum ( - IN UINTN Number, - IN UINT8 *Buffer, - IN UINTN Length - ) -{ - UINTN Remainder; - - for (; Length > 0; Length--) { - Remainder = Number % 10; - Number /= 10; - Buffer[Length - 1] = (UINT8) ('0' + Remainder); - } -} - - -/** - Convert unsigned int number to decimal number. - - @param Number The unsigned int number will be converted. - @param Buffer Pointer to the buffer to store the decimal number after transform. - @param[in] BufferSize The maxsize of the buffer. - - @return the length of the number after transform. - -**/ -UINTN -UtoA10 ( - IN UINTN Number, - IN CHAR8 *Buffer, - IN UINTN BufferSize - ) -{ - UINTN Index; - CHAR8 TempStr[64]; - - Index = 63; - TempStr[Index] = 0; - - do { - Index--; - TempStr[Index] = (CHAR8) ('0' + (Number % 10)); - Number = Number / 10; - } while (Number != 0); - - AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]); - - return AsciiStrLen (Buffer); -} - - -/** - Convert ASCII numeric string to a UINTN value. - - @param Buffer Pointer to the 8-byte unsigned int value. - - @return UINTN value of the ASCII string. - -**/ -UINT64 -AtoU64 ( - IN UINT8 *Buffer - ) -{ - UINT64 Value; - UINT8 Character; - - Value = 0; - while ((Character = *Buffer++) != '\0') { - Value = MultU64x32 (Value, 10) + (Character - '0'); - } - - return Value; -} - diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 2465d39fd744..5d042be3a862 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -354,12 +354,10 @@ [Components] MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/PcatSingleSegmentPciCfg2Pei.inf @@ -422,7 +420,6 @@ [Components] MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf [Components.IA32, Components.X64, Components.AARCH64] - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf MdeModulePkg/Universal/EbcDxe/EbcDxe.inf MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h deleted file mode 100644 index ee371d26744c..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h +++ /dev/null @@ -1,165 +0,0 @@ -/** @file - The header file of UEFI Component Name(2) protocol. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _COMPONENT_NAME_H_ -#define _COMPONENT_NAME_H_ - -#include <Protocol/ComponentName.h> -#include <Protocol/ComponentName2.h> - -extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2; -extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName; - -// -// EFI Component Name Protocol for iSCSI driver. -// - -/** - Retrieves a Unicode string that is the user readable name of the EFI Driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] Language A pointer to a three characters ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - @param[out] DriverName A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER DriverName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ); - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an EFI Driver. Currently not implemented. - - @param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param[in] ControllerHandle The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - @param[in] ChildHandle The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - @param[in] Language A pointer to a three characters ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - @param[out] ControllerName A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language specified - by Language from the point of view of the driver specified - by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This is not currently managing - the controller specified by ControllerHandle and - ChildHandle. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -IScsiComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ); - -// -// EFI iSCSI Initiator Name Protocol for IScsi driver. -// - -/** - Retrieves the current set value of iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the - variable data buffer. - @param[out] Buffer Pointer to the buffer for data to be read. - - @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the - BufferSize was sufficient to handle the iSCSI initiator name - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiGetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -/** - Sets the iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. - @param[in] Buffer Pointer to the buffer for data to be written. - - @retval EFI_SUCCESS Data was successfully stored by the protocol. - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written. - Currently not implemented. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit. - @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data. - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720 - (and other related protocols) - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiSetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni deleted file mode 100644 index d3c020e45d3b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni +++ /dev/null @@ -1,25 +0,0 @@ -// /** @file -// This module produces EFI iSCSI Initiator Name Protocol. -// -// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol -// and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI -// data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide -// one way to configurate the iSCSI setting. -// -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI iSCSI Initiator Name Protocol" - -#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way to configure the iSCSI setting." - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni deleted file mode 100644 index 5ec75820a605..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// IScsi4Dxe Localized Strings and Content -// -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"iSCSI DXE Driver" - - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h deleted file mode 100644 index 14a5658f754b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h +++ /dev/null @@ -1,106 +0,0 @@ -/** @file - The header file of CHAP configuration. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_CHAP_H_ -#define _ISCSI_CHAP_H_ - -#define ISCSI_AUTH_METHOD_CHAP "CHAP" - -#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A" -#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I" -#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C" -#define ISCSI_KEY_CHAP_NAME "CHAP_N" -#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R" - -#define ISCSI_CHAP_ALGORITHM_MD5 5 - -#define ISCSI_CHAP_AUTH_MAX_LEN 1024 -/// -/// MD5_HASHSIZE -/// -#define ISCSI_CHAP_RSP_LEN 16 - -#define ISCSI_CHAP_INITIAL 0 -#define ISCSI_CHAP_STEP_ONE 1 -#define ISCSI_CHAP_STEP_TWO 2 -#define ISCSI_CHAP_STEP_THREE 3 -#define ISCSI_CHAP_STEP_FOUR 4 - -#pragma pack(1) - -typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA { - UINT8 CHAPType; - CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; - CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; -} ISCSI_CHAP_AUTH_CONFIG_NVDATA; - -#pragma pack() - -/// -/// ISCSI CHAP Authentication Data -/// -typedef struct _ISCSI_CHAP_AUTH_DATA { - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig; - UINT32 InIdentifier; - UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; - UINT32 InChallengeLength; - // - // Calculated CHAP Response (CHAP_R) value - // - UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN]; - - // - // Auth-data to be sent out for mutual authentication - // - UINT32 OutIdentifier; - UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN]; - UINT32 OutChallengeLength; -} ISCSI_CHAP_AUTH_DATA; - -/** - This function checks the received iSCSI Login Response during the security - negotiation stage. - - @param[in] Conn The iSCSI connection. - - @retval EFI_SUCCESS The Login Response passed the CHAP validation. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCHAPOnRspReceived ( - IN ISCSI_CONNECTION *Conn - ); -/** - This function fills the CHAP authentication information into the login PDU - during the security negotiation stage in the iSCSI connection login. - - @param[in] Conn The iSCSI connection. - @param[in, out] Pdu The PDU to send out. - - @retval EFI_SUCCESS All check passed and the phase-related CHAP - authentication info is filled into the iSCSI PDU. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend. -**/ -EFI_STATUS -IScsiCHAPToSendReq ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h deleted file mode 100644 index 650c68d53bab..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h +++ /dev/null @@ -1,22 +0,0 @@ -/** @file - The common header file of Iscsi. - -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_COMMON_H_ -#define _ISCSI_COMMON_H_ - -typedef struct _ISCSI_SESSION ISCSI_SESSION; -typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION; -typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA; - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h deleted file mode 100644 index c3d07f6f4859..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h +++ /dev/null @@ -1,166 +0,0 @@ -/** @file - The header file of IScsiConfig.c. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_CONFIG_H_ -#define _ISCSI_CONFIG_H_ - -#include <Guid/MdeModuleHii.h> -#include <Protocol/HiiConfigRouting.h> -#include <Library/HiiLib.h> -#include <Library/DevicePathLib.h> -#include <Library/DebugLib.h> -#include <Library/BaseLib.h> -#include <Library/NetLib.h> - -extern UINT8 IScsiConfigDxeBin[]; -extern UINT8 IScsi4DxeStrings[]; - -#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME" - -#define ISCSI_CONFIG_VAR_ATTR (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE) - -#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', 'c', 'i') - - - -/** - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear, - then this macro return a pointer to a data structure ISCSI_FORM_CALLBACK_INFO. - - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set, - The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO - is compared to TestSignature. If the signatures match, then a pointer - to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned. - If the signatures do not match, then DebugAssert() is called with a description - of "CR has a bad signature" and Callback is returned. - - If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain the field - specified by Callback, then the module will not compile. - - If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field called Signature, - then the module will not compile. - - @param Callback Pointer to the specified field within the data - structure ISCSI_FORM_CALLBACK_INFO. - @return A pointer to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO. - @retval Others Some unexpected error happened. -**/ - -#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) \ - CR ( \ - Callback, \ - ISCSI_FORM_CALLBACK_INFO, \ - ConfigAccess, \ - ISCSI_FORM_CALLBACK_INFO_SIGNATURE \ - ) - -#pragma pack(1) - -typedef struct _ISCSI_MAC_INFO { - EFI_MAC_ADDRESS Mac; - UINT8 Len; - UINT16 VlanId; -} ISCSI_MAC_INFO; - -typedef struct _ISCSI_DEVICE_LIST { - UINT8 NumDevice; - ISCSI_MAC_INFO MacInfo[1]; -} ISCSI_DEVICE_LIST; - -#pragma pack() - -typedef struct _ISCSI_CONFIG_FORM_ENTRY { - LIST_ENTRY Link; - EFI_HANDLE Controller; - CHAR16 MacString[95]; - EFI_STRING_ID PortTitleToken; - EFI_STRING_ID PortTitleHelpToken; - - ISCSI_SESSION_CONFIG_NVDATA SessionConfigData; - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData; -} ISCSI_CONFIG_FORM_ENTRY; - -typedef struct _ISCSI_FORM_CALLBACK_INFO { - UINTN Signature; - EFI_HANDLE DriverHandle; - EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess; - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; - EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting; - UINT16 *KeyList; - VOID *FormBuffer; - EFI_HII_HANDLE RegisteredHandle; - ISCSI_CONFIG_FORM_ENTRY *Current; -} ISCSI_FORM_CALLBACK_INFO; - -#pragma pack(1) - -/// -/// HII specific Vendor Device Path definition. -/// -typedef struct { - VENDOR_DEVICE_PATH VendorDevicePath; - EFI_DEVICE_PATH_PROTOCOL End; -} HII_VENDOR_DEVICE_PATH; - -#pragma pack() - -/** - Updates the iSCSI configuration form to add/delete an entry for the iSCSI - device specified by the Controller. - - @param[in] DriverBindingHandle The driverbinding handle. - @param[in] Controller The controller handle of the iSCSI device. - @param[in] AddForm Whether to add or delete a form entry. - - @retval EFI_SUCCESS The iSCSI configuration form is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigUpdateForm ( - IN EFI_HANDLE DriverBindingHandle, - IN EFI_HANDLE Controller, - IN BOOLEAN AddForm - ); - -/** - Initialize the iSCSI configuration form. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is initialized. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConfigFormInit ( - VOID - ); - -/** - Unload the iSCSI configuration form, this includes: delete all the iSCSI - device configuration entries, uninstall the form callback protocol and - free the resources used. - - @param[in] DriverBindingHandle The iSCSI driverbinding handle. - - @retval EFI_SUCCESS The iSCSI configuration form is unloaded. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiConfigFormUnload ( - IN EFI_HANDLE DriverBindingHandle - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr deleted file mode 100644 index 9e28d81fb40d..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr +++ /dev/null @@ -1,219 +0,0 @@ -/** @file - Vfr file for iSCSI config. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "IScsiConfigNVDataStruc.h" -#define EFI_NETWORK_DEVICE_CLASS 0x04 - -formset - guid = IP4_ISCSI_CONFIG_GUID, - title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE), - help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP), - - varstore ISCSI_CONFIG_IFR_NVDATA, - name = ISCSI_CONFIG_IFR_NVDATA, - guid = IP4_ISCSI_CONFIG_GUID; - form formid = FORMID_MAIN_FORM, - title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE); - - string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName, - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME), - help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP), - flags = INTERACTIVE, - key = KEY_INITIATOR_NAME, - minsize = ISCSI_NAME_IFR_MIN_SIZE, - maxsize = ISCSI_NAME_IFR_MAX_SIZE, - endstring; - - label DEVICE_ENTRY_LABEL; - label LABEL_END; - - endform; - - form formid = FORMID_DEVICE_FORM, - title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE); - - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled, - prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE), - help = STRING_TOKEN(STR_NULL), - flags = 0, - endcheckbox; - - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp, - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP), - flags = INTERACTIVE, - key = KEY_DHCP_ENABLE, - endcheckbox; - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x01; - string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp, - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_LOCAL_IP, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask, - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_SUBNET_MASK, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway, - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_GATE_WAY, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x00; - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp, - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET), - flags = 0, - endcheckbox; - endif; - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01; - - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName, - prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME), - help = STRING_TOKEN(STR_ISCSI_TARGET_NAME), - flags = INTERACTIVE, - key = KEY_TARGET_NAME, - minsize = ISCSI_NAME_IFR_MIN_SIZE, - maxsize = ISCSI_NAME_IFR_MAX_SIZE, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp, - prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS), - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP), - flags = INTERACTIVE, - key = KEY_TARGET_IP, - minsize = IP_MIN_SIZE, - maxsize = IP_MAX_SIZE, - endstring; - - numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort, - prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT), - help = STRING_TOKEN(STR_ISCSI_TARGET_PORT), - flags = 0, - minimum = TARGET_PORT_MIN_NUM, - maximum = TARGET_PORT_MAX_NUM, - step = 0, - endnumeric; - - string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun, - prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN), - help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP), - flags = INTERACTIVE, - key = KEY_BOOT_LUN, - minsize = LUN_MIN_SIZE, - maxsize = LUN_MAX_SIZE, - endstring; - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType, - prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT), - help = STRING_TOKEN(STR_CHAP_TYPE_HELP), - option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value = ISCSI_CHAP_NONE, flags = DEFAULT; - option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value = ISCSI_CHAP_UNI, flags = 0; - option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = ISCSI_CHAP_MUTUAL, flags = 0; - endoneof; - - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_NONE; - - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName, - prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME), - help = STRING_TOKEN(STR_ISCSI_CHAP_NAME), - flags = INTERACTIVE, - key = KEY_CHAP_NAME, - minsize = 0, - maxsize = ISCSI_CHAP_NAME_MAX_LEN, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret, - prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET), - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), - flags = INTERACTIVE, - key = KEY_CHAP_SECRET, - minsize = ISCSI_CHAP_SECRET_MIN_LEN, - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, - endstring; - - endif; - - suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_MUTUAL; - - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName, - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), - help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME), - flags = INTERACTIVE, - key = KEY_REVERSE_CHAP_NAME, - minsize = 0, - maxsize = ISCSI_CHAP_NAME_MAX_LEN, - endstring; - - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret, - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET), - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP), - flags = INTERACTIVE, - key = KEY_REVERSE_CHAP_SECRET, - minsize = ISCSI_CHAP_SECRET_MIN_LEN, - maxsize = ISCSI_CHAP_SECRET_MAX_LEN, - endstring; - - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - string varid = ISCSI_CONFIG_IFR_NVDATA.IsId, - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID), - help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP), - flags = INTERACTIVE, - key = KEY_CONFIG_ISID, - minsize = ISID_CONFIGURABLE_MIN_LEN, - maxsize = ISID_CONFIGURABLE_MAX_LEN, - endstring; - - subtitle text = STRING_TOKEN(STR_NULL); - - text - help = STRING_TOKEN (STR_SAVE_CHANGES), - text = STRING_TOKEN (STR_SAVE_CHANGES), - flags = INTERACTIVE, - key = KEY_SAVE_CHANGES; - - goto FORMID_MAIN_FORM, - prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM), - help = STRING_TOKEN (STR_RETURN_MAIN_FORM), - flags = 0; - - endform; - -endformset; - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni deleted file mode 100644 index 729c74ebfc1b..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni +++ /dev/null @@ -1,62 +0,0 @@ -// *++ -// -// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// Module Name: -// -// IScsiConfigStrings.uni -// -// Abstract: -// -// String definitions for iSCSI configuration. -// -// Revision History: -// -// --*/ - - -/=# - -#langdef en-US "English" - -#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI Configuration" -#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the iSCSI parameters." -#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI Configuration" -#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI Initiator Name" -#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The worldwide unique name of the initiator. Only iqn. format is accepted." -#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US "" -#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI" -#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP Address" -#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator Subnet Mask" -#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway" -#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP address in dotted-decimal notation." -#string STR_ISCSI_TARGET_NAME #language en-US " Target Name" -#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP Address" -#string STR_ISCSI_TARGET_PORT #language en-US " Target Port" -#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN" -#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-9-156f-127, 4186-9" -#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP" -#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target info via DHCP" -#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type" -#string STR_CHAP_TYPE_HELP #language en-US "None, One way CHAP or mutual CHAP" -#string STR_CHAP_TYPE_NONE #language en-US "None" -#string STR_CHAP_TYPE_UNI #language en-US "One way" -#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual" -#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name" -#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret" -#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum length is 12 bytes and the maximum length is 16 bytes." -#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse CHAP Name" -#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse CHAP Secret" -#string STR_ISCSI_CONFIG_ISID #language en-US "ISID" -#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format ISID in 6 bytes, default value are derived from MAC address. Only last 3 bytes are configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input F07901." -#string STR_RETURN_MAIN_FORM #language en-US "Back to Previous Page" -#string STR_SAVE_CHANGES #language en-US "Save Changes" -#string STR_NULL #language en-US "" - diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h deleted file mode 100644 index 7c2e4e65fa8e..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h +++ /dev/null @@ -1,109 +0,0 @@ -/** @file - Define NVData structures used by the iSCSI configuration component - -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_NVDATASTRUC_H_ -#define _ISCSI_NVDATASTRUC_H_ - -#include <Guid/Ip4IScsiConfigHii.h> - -#define VAR_EQ_TEST_NAME 0x100 - -#define FORMID_MAIN_FORM 1 -#define FORMID_DEVICE_FORM 2 - -#define ISCSI_NAME_MAX_SIZE 224 - -// -// Vfr has a limit on the size, it's 255 bytes. -// -#define ISCSI_NAME_IFR_MIN_SIZE 4 -#define ISCSI_NAME_IFR_MAX_SIZE 223 - -#define IP_MIN_SIZE 7 -#define IP_MAX_SIZE 15 -#define IP4_STR_MAX_SIZE 16 - -#define LUN_MIN_SIZE 1 -#define LUN_MAX_SIZE 20 - -#define ISCSI_CHAP_NONE 0 -#define ISCSI_CHAP_UNI 1 -#define ISCSI_CHAP_MUTUAL 2 - -#define TARGET_PORT_MIN_NUM 0 -#define TARGET_PORT_MAX_NUM 65535 - -#define DEVICE_ENTRY_LABEL 0x1234 -#define LABEL_END 0xffff - -#define KEY_INITIATOR_NAME 0x101 -#define KEY_DHCP_ENABLE 0x102 -#define KEY_LOCAL_IP 0x103 -#define KEY_SUBNET_MASK 0x104 -#define KEY_GATE_WAY 0x105 -#define KEY_TARGET_IP 0x106 -#define KEY_CHAP_NAME 0x107 -#define KEY_CHAP_SECRET 0x108 -#define KEY_REVERSE_CHAP_NAME 0x109 -#define KEY_REVERSE_CHAP_SECRET 0x10a -#define KEY_SAVE_CHANGES 0x10b -#define KEY_TARGET_NAME 0x10c -#define KEY_BOOT_LUN 0x10d -#define KEY_CONFIG_ISID 0x10e - -#define KEY_DEVICE_ENTRY_BASE 0x1000 - -#define ISCSI_LUN_STR_MAX_LEN 21 -#define ISCSI_CHAP_SECRET_MIN_LEN 12 -#define ISCSI_CHAP_SECRET_MAX_LEN 16 -// -// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator) -// -#define ISCSI_CHAP_SECRET_STORAGE 17 - -#define ISCSI_CHAP_NAME_MAX_LEN 126 -#define ISCSI_CHAP_NAME_STORAGE 127 - -#define ISID_CONFIGURABLE_MIN_LEN 6 -#define ISID_CONFIGURABLE_MAX_LEN 12 -#define ISID_CONFIGURABLE_STORAGE 13 - -#pragma pack(1) -typedef struct { - CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE]; - - UINT8 Enabled; - - UINT8 InitiatorInfoFromDhcp; - CHAR16 LocalIp[IP4_STR_MAX_SIZE]; - CHAR16 SubnetMask[IP4_STR_MAX_SIZE]; - CHAR16 Gateway[IP4_STR_MAX_SIZE]; - - CHAR16 TargetName[ISCSI_NAME_MAX_SIZE]; - CHAR16 TargetIp[IP4_STR_MAX_SIZE]; - UINT16 TargetPort; - CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN]; - UINT8 TargetInfoFromDhcp; - - UINT8 CHAPType; - CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; - CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE]; - CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE]; - - CHAR16 IsId[ISID_CONFIGURABLE_STORAGE]; -} ISCSI_CONFIG_IFR_NVDATA; -#pragma pack() - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h deleted file mode 100644 index 4c4dcaa8f68d..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h +++ /dev/null @@ -1,55 +0,0 @@ -/** @file - The header file of IScsiDhcp. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_DHCP_H_ -#define _ISCSI_DHCP_H_ - -#include <Protocol/Dhcp4.h> - -#define ISCSI_ROOT_PATH_ID "iscsi:" -#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':' - -#define RP_FIELD_IDX_SERVERNAME 0 -#define RP_FIELD_IDX_PROTOCOL 1 -#define RP_FIELD_IDX_PORT 2 -#define RP_FIELD_IDX_LUN 3 -#define RP_FIELD_IDX_TARGETNAME 4 -#define RP_FIELD_IDX_MAX 5 - -typedef struct _ISCSI_ROOT_PATH_FIELD { - CHAR8 *Str; - UINT8 Len; -} ISCSI_ROOT_PATH_FIELD; - -/** - Parse the DHCP ACK to get the address configuration and DNS information. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller; - @param[in, out] ConfigData The session configuration data. - - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiDoDhcp ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h deleted file mode 100644 index d6a619f00fc0..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h +++ /dev/null @@ -1,140 +0,0 @@ -/** @file - The header file of IScsiDriver.c. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_DRIVER_H_ -#define _ISCSI_DRIVER_H_ - -#include <Uefi.h> -#include <Protocol/DevicePath.h> -#include <Protocol/LoadedImage.h> -#include <Protocol/HiiConfigAccess.h> -#include <Protocol/HiiDatabase.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> -#include <Library/DevicePathLib.h> -#include <Protocol/DriverBinding.h> -#include <Protocol/ScsiPassThruExt.h> - -#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME" - -typedef struct _ISCSI_PRIVATE_PROTOCOL { - UINT32 Reserved; -} ISCSI_PRIVATE_PROTOCOL; - -// -// EFI Driver Binding Protocol for iSCSI driver. -// - -/** - Tests to see if this driver supports a given controller. If a child device is provided, - it further tests to see if this driver supports creating a handle for the specified child device. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by the driver - specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a different - driver or an application that requires exclusive acces. - Currently not implemented. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver specified by This. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Start this driver on ControllerHandle. The Start() function is designed to be - invoked from the EFI boot service ConnectController(). As a result, much of - the error checking on the parameters to Start() has been moved into this - common boot service. It is legal to call Start() from other locations, - but the following calling restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned - EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified by This must - have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_DEVICE_ERROR The device could not be started due to a device error. - Currently not implemented. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval Others The driver failded to start the device. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Stop this driver on ControllerHandle. - - Release the control of this controller and remove the IScsi functions. The Stop() - function is designed to be invoked from the EFI boot service DisconnectController(). - As a result, much of the error checking on the parameters to Stop() has been moved - into this common boot service. It is legal to call Stop() from other locations, - but the following calling restrictions must be followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this - same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this driver's - Start() function, and the Start() function must have called OpenProtocol() on - ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used. - @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL - if NumberOfChildren is 0.Not used. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. -**/ -EFI_STATUS -EFIAPI -IScsiDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf deleted file mode 100644 index 48729e3029f7..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf +++ /dev/null @@ -1,134 +0,0 @@ -## @file -# This module produces EFI iSCSI Initiator Name Protocol. -# -# This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol -# and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI -# data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide -# one way to configurate the iSCSI setting. This driver only supports IPv4 network -# stack. -# -# Notes: -# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg. -# 2) This driver might have some issues that have been fixed in the IScsiDxe driver -# in NetworkPkg. -# 3) This driver supports fewer features than the IScsiDxe driver in NetworkPkg -# (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword support). -# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of this one even -# though both of them can be used. -# -# Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = IScsi4Dxe - MODULE_UNI_FILE = IScsi4Dxe.uni - FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7 - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = IScsiDriverEntryPoint - UNLOAD_IMAGE = EfiIScsiUnload - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC -# -# DRIVER_BINDING = gIScsiDriverBinding -# COMPONENT_NAME = gIScsiComponentName -# COMPONENT_NAME2 = gIScsiComponentName2 -# - -[Sources] - IScsiTcp4Io.h - IScsiProto.h - IScsiMisc.h - IScsiIbft.h - IScsiExtScsiPassThru.h - IScsiDriver.h - IScsiDhcp.h - IScsiCommon.h - IScsiCHAP.h - IScsiInitiatorName.h - ComponentName.h - Md5.h - IScsiTcp4Io.c - IScsiProto.c - IScsiMisc.c - IScsiInitiatorName.c - IScsiIbft.c - IScsiExtScsiPassThru.c - IScsiDriver.c - IScsiDhcp.c - IScsiCHAP.c - ComponentName.c - Md5.c - IScsiConfigDxeStrings.uni - IScsiConfigDxe.vfr - IScsiConfig.c - IScsiConfig.h - IScsiImpl.h - IScsiConfigNVDataStruc.h - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - UefiDriverEntryPoint - UefiLib - BaseLib - UefiBootServicesTableLib - UefiRuntimeServicesTableLib - BaseMemoryLib - MemoryAllocationLib - DevicePathLib - DebugLib - PrintLib - HiiLib - NetLib - -[Protocols] - ## PRODUCES - ## UNDEFINED # Variable - gEfiIScsiInitiatorNameProtocolGuid - gEfiExtScsiPassThruProtocolGuid ## BY_START - gEfiTcp4ProtocolGuid ## TO_START - gEfiTcp4ServiceBindingProtocolGuid ## TO_START - gEfiDhcp4ProtocolGuid ## TO_START - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START - ## TO_START - ## PRODUCES - gEfiDevicePathProtocolGuid - gEfiHiiConfigAccessProtocolGuid ## PRODUCES - gEfiHiiDatabaseProtocolGuid ## CONSUMES - gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES - gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES - -[Guids] - gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## Event - gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED - gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ## SystemTable - gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ## SystemTable - ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList" - ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList" - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch mVendorStorageName - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr mVendorStorageName - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData mVendorStorageName - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData mVendorStorageName - ## SOMETIMES_CONSUMES ## HII - gIp4IScsiConfigGuid - ## SOMETIMES_PRODUCES ## Variable - ## SOMETIMES_CONSUMES ## Variable - gIScsiCHAPAuthInfoGuid - -[UserExtensions.TianoCore."ExtraFiles"] - IScsi4DxeExtra.uni diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h deleted file mode 100644 index e635e47b9292..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h +++ /dev/null @@ -1,22 +0,0 @@ -/** @file - The header file of IScsiExtScsiPassThru.c. - -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_ -#define _ISCSI_EXT_SCSI_PASS_THRU_H_ - -#include <Protocol/ScsiPassThruExt.h> - -extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate; - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h deleted file mode 100644 index 4f3828db63c6..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h +++ /dev/null @@ -1,38 +0,0 @@ -/** @file - Some extra definitions for iBFT. - -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_IBFT_H_ -#define _ISCSI_IBFT_H_ - -#include <IndustryStandard/Acpi.h> -#include <IndustryStandard/IScsiBootFirmwareTable.h> -#include <Protocol/AcpiTable.h> -#include <Protocol/PciIo.h> - -#define IBFT_TABLE_VAR_NAME L"iBFT" -#define IBFT_MAX_SIZE 4096 -#define IBFT_HEAP_OFFSET 2048 - -#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT) - -/** - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI - session status. -**/ -VOID -IScsiPublishIbft ( - VOID - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h deleted file mode 100644 index 8a5ee2149eb2..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h +++ /dev/null @@ -1,168 +0,0 @@ -/** @file - The header file of IScsiImpl.c. - -Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_IMPL_H_ -#define _ISCSI_IMPL_H_ - -#include <Uefi.h> - -#include <IndustryStandard/Dhcp.h> - -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/NetLib.h> -#include <Library/PrintLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> - -#include <Guid/EventGroup.h> - -#include "IScsiCommon.h" -#include "IScsiDriver.h" -#include "IScsiInitiatorName.h" -#include "ComponentName.h" -#include "IScsiConfigNVDataStruc.h" -#include "IScsiExtScsiPassThru.h" -#include "IScsiProto.h" -#include "IScsiMisc.h" -#include "IScsiCHAP.h" -#include "IScsiConfig.h" -#include "IScsiDhcp.h" -#include "IScsiTcp4Io.h" -#include "IScsiIbft.h" - - -#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N') - -struct _ISCSI_SESSION { - UINT32 Signature; - - ISCSI_SESSION_CONFIG_DATA ConfigData; - ISCSI_CHAP_AUTH_DATA AuthData; - - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE]; - UINTN InitiatorNameLength; - UINT8 State; - - UINT8 Isid[6]; - UINT16 Tsih; - - UINT32 CmdSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - - UINT32 InitiatorTaskTag; - UINT16 NextCid; - - LIST_ENTRY Conns; - UINT32 NumConns; - - LIST_ENTRY TcbList; - - // - // session-wide parameters - // - UINT16 TargetPortalGroupTag; - UINT32 MaxConnections; - BOOLEAN InitialR2T; - BOOLEAN ImmediateData; - UINT32 MaxBurstLength; - UINT32 FirstBurstLength; - UINT32 DefaultTime2Wait; - UINT32 DefaultTime2Retain; - UINT16 MaxOutstandingR2T; - BOOLEAN DataPDUInOrder; - BOOLEAN DataSequenceInOrder; - UINT8 ErrorRecoveryLevel; -}; - -#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N') - -struct _ISCSI_CONNECTION { - UINT32 Signature; - LIST_ENTRY Link; - - EFI_EVENT TimeoutEvent; - - ISCSI_SESSION *Session; - - UINT8 State; - UINT8 CurrentStage; - UINT8 NextStage; - - UINT8 CHAPStep; - - BOOLEAN PartialReqSent; - BOOLEAN PartialRspRcvd; - - BOOLEAN TransitInitiated; - - UINT16 Cid; - UINT32 ExpStatSN; - - // - // queues... - // - NET_BUF_QUEUE RspQue; - - TCP4_IO Tcp4Io; - - // - // connection-only parameters - // - UINT32 MaxRecvDataSegmentLength; - ISCSI_DIGEST_TYPE HeaderDigest; - ISCSI_DIGEST_TYPE DataDigest; -}; - -#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A') - -#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \ - CR ( \ - PassThru, \ - ISCSI_DRIVER_DATA, \ - IScsiExtScsiPassThru, \ - ISCSI_DRIVER_DATA_SIGNATURE \ - ) -#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \ - CR ( \ - Identifier, \ - ISCSI_DRIVER_DATA, \ - IScsiIdentifier, \ - ISCSI_DRIVER_DATA_SIGNATURE \ - ) -#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \ - CR ( \ - s, \ - ISCSI_DRIVER_DATA, \ - Session, \ - ISCSI_DRIVER_DATA_SIGNATURE \ - ) - -struct _ISCSI_DRIVER_DATA { - UINT32 Signature; - EFI_HANDLE Image; - EFI_HANDLE Controller; - ISCSI_PRIVATE_PROTOCOL IScsiIdentifier; - EFI_HANDLE ChildHandle; - EFI_EVENT ExitBootServiceEvent; - - EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru; - EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode; - EFI_HANDLE ExtScsiPassThruHandle; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - ISCSI_SESSION Session; -}; - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h deleted file mode 100644 index f967fb383095..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h +++ /dev/null @@ -1,74 +0,0 @@ -/** @file - The header file for EFI iSCSI Initiator Name Protocol. - -Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_INITIATOR_NAME_H_ -#define _ISCSI_INITIATOR_NAME_H_ - -#include <Protocol/IScsiInitiatorName.h> - -extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName; - -// -// EFI iSCSI Initiator Name Protocol for IScsi driver. -// - -/** - Retrieves the current set value of iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the - variable data buffer. - @param[out] Buffer Pointer to the buffer for data to be read. - - @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the - BufferSize was sufficient to handle the iSCSI initiator name. - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL. - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiGetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ); - -/** - Sets the iSCSI Initiator Name. - - @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance. - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer. - @param[in] Buffer Pointer to the buffer for data to be written. - - @retval EFI_SUCCESS Data was successfully stored by the protocol. - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written. - Currently not implemented. - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit. - @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data. - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720 - (and other related protocols). - @retval Others Other errors as indicated. -**/ -EFI_STATUS -EFIAPI -IScsiSetInitiatorName ( - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h deleted file mode 100644 index 500e00373b25..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h +++ /dev/null @@ -1,317 +0,0 @@ -/** @file - Miscellaneous definitions for iSCSI driver. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_MISC_H_ -#define _ISCSI_MISC_H_ - -#include <Library/BaseLib.h> - -typedef struct _ISCSI_SESSION_CONFIG_DATA ISCSI_SESSION_CONFIG_DATA; - -/// -/// IPv4 Device Path Node Length -/// -#define IP4_NODE_LEN_NEW_VERSIONS 27 - -#pragma pack(1) -typedef struct { - BOOLEAN Enabled; - - BOOLEAN InitiatorInfoFromDhcp; - EFI_IPv4_ADDRESS LocalIp; - EFI_IPv4_ADDRESS SubnetMask; - EFI_IPv4_ADDRESS Gateway; - - BOOLEAN TargetInfoFromDhcp; - CHAR8 TargetName[ISCSI_NAME_MAX_SIZE]; - EFI_IPv4_ADDRESS TargetIp; - UINT16 TargetPort; - UINT8 BootLun[8]; - - UINT8 IsId[6]; -} ISCSI_SESSION_CONFIG_NVDATA; -#pragma pack() - -struct _ISCSI_SESSION_CONFIG_DATA { - ISCSI_SESSION_CONFIG_NVDATA NvData; - - EFI_IPv4_ADDRESS PrimaryDns; - EFI_IPv4_ADDRESS SecondaryDns; - EFI_IPv4_ADDRESS DhcpServer; -}; - -/** - Calculate the prefix length of the IPv4 subnet mask. - - @param[in] SubnetMask The IPv4 subnet mask. - - @return The prefix length of the subnet mask. - @retval 0 Other errors as indicated. -**/ -UINT8 -IScsiGetSubnetMaskPrefixLength ( - IN EFI_IPv4_ADDRESS *SubnetMask - ); - -/** - Convert the hexadecimal encoded LUN string into the 64-bit LUN. - - @param[in] Str The hexadecimal encoded LUN string. - @param[out] Lun Storage to return the 64-bit LUN. - - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun. - @retval EFI_INVALID_PARAMETER The string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToLun ( - IN CHAR8 *Str, - OUT UINT8 *Lun - ); - -/** - Convert the 64-bit LUN into the hexadecimal encoded LUN string. - - @param[in] Lun The 64-bit LUN. - @param[out] Str The storage to return the hexadecimal encoded LUN string. -**/ -VOID -IScsiLunToUnicodeStr ( - IN UINT8 *Lun, - OUT CHAR16 *Str - ); - -/** - Convert the ASCII string into a UNICODE string. - - @param[in] Source The ASCII string. - @param[out] Destination The storage to return the UNICODE string. - - @return CHAR16 * Pointer to the UNICODE string. -**/ -CHAR16 * -IScsiAsciiStrToUnicodeStr ( - IN CHAR8 *Source, - OUT CHAR16 *Destination - ); - -/** - Convert the UNICODE string into an ASCII string. - - @param[in] Source The UNICODE string. - @param[out] Destination The storage to return the ASCII string. - - @return CHAR8 * Pointer to the ASCII string. -**/ -CHAR8 * -IScsiUnicodeStrToAsciiStr ( - IN CHAR16 *Source, - OUT CHAR8 *Destination - ); - -/** - Convert the mac address into a hexadecimal encoded "-" seperated string. - - @param[in] Mac The mac address. - @param[in] Len Length in bytes of the mac address. - @param[in] VlanId VLAN ID of the network device. - @param[out] Str The storage to return the mac string. -**/ -VOID -IScsiMacAddrToStr ( - IN EFI_MAC_ADDRESS *Mac, - IN UINT32 Len, - IN UINT16 VlanId, - OUT CHAR16 *Str - ); - -/** - Convert the decimal dotted IPv4 address into the binary IPv4 address. - - @param[in] Str The UNICODE string. - @param[out] Ip The storage to return the ASCII string. - - @retval EFI_SUCCESS The binary IP address is returned in Ip. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiAsciiStrToIp ( - IN CHAR8 *Str, - OUT EFI_IPv4_ADDRESS *Ip - ); - -/** - Convert the binary encoded buffer into a hexadecimal encoded string. - - @param[in] BinBuffer The buffer containing the binary data. - @param[in] BinLength Length of the binary buffer. - @param[in, out] HexStr Pointer to the string. - @param[in, out] HexLength The length of the string. - - @retval EFI_SUCCESS The binary data is converted to the hexadecimal string - and the length of the string is updated. - @retval EFI_BUFFER_TOO_SMALL The string is too small. - @retval EFI_INVALID_PARAMETER The IP string is malformatted. -**/ -EFI_STATUS -IScsiBinToHex ( - IN UINT8 *BinBuffer, - IN UINT32 BinLength, - IN OUT CHAR8 *HexStr, - IN OUT UINT32 *HexLength - ); - -/** - Convert the hexadecimal string into a binary encoded buffer. - - @param[in, out] BinBuffer The binary buffer. - @param[in, out] BinLength Length of the binary buffer. - @param[in] HexStr The hexadecimal string. - - @retval EFI_SUCCESS The hexadecimal string is converted into a binary - encoded buffer. - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data. -**/ -EFI_STATUS -IScsiHexToBin ( - IN OUT UINT8 *BinBuffer, - IN OUT UINT32 *BinLength, - IN CHAR8 *HexStr - ); - -/** - Generate random numbers. - - @param[in, out] Rand The buffer to contain random numbers. - @param[in] RandLength The length of the Rand buffer. -**/ -VOID -IScsiGenRandom ( - IN OUT UINT8 *Rand, - IN UINTN RandLength - ); - -/** - Create the iSCSI driver data.. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - - @return The iSCSI driver data created. - @retval NULL Other errors as indicated. -**/ -ISCSI_DRIVER_DATA * -IScsiCreateDriverData ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller - ); - -/** - Clean the iSCSI driver data. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCES The clean operation is successful. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiCleanDriverData ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Check wheather the Controller is configured to use DHCP protocol. - - @param[in] Controller The handle of the controller. - - @retval TRUE The handle of the controller need the Dhcp protocol. - @retval FALSE The handle of the controller does not need the Dhcp protocol. - -**/ -BOOLEAN -IScsiDhcpIsConfigured ( - IN EFI_HANDLE Controller - ); - -/** - Get the various configuration data of this iSCSI instance. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The configuration of this instance is got. - @retval EFI_ABORTED The operation was aborted. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiGetConfigData ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Get the device path of the iSCSI tcp connection and update it. - - @param[in] Private The iSCSI driver data. - - @return The updated device path. - @retval NULL Other errors as indicated. -**/ -EFI_DEVICE_PATH_PROTOCOL * -IScsiGetTcpConnDevicePath ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Abort the session when the transition from BS to RT is initiated. - - @param[in] Event The event signaled. - @param[in] Context The iSCSI driver data. -**/ -VOID -EFIAPI -IScsiOnExitBootService ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - Tests whether a controller handle is being managed by IScsi driver. - - This function tests whether the driver specified by DriverBindingHandle is - currently managing the controller specified by ControllerHandle. This test - is performed by evaluating if the the protocol specified by ProtocolGuid is - present on ControllerHandle and is was opened by DriverBindingHandle and Nic - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER. - If ProtocolGuid is NULL, then ASSERT(). - - @param ControllerHandle A handle for a controller to test. - @param DriverBindingHandle Specifies the driver binding handle for the - driver. - @param ProtocolGuid Specifies the protocol that the driver specified - by DriverBindingHandle opens in its Start() - function. - - @retval EFI_SUCCESS ControllerHandle is managed by the driver - specified by DriverBindingHandle. - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver - specified by DriverBindingHandle. - -**/ -EFI_STATUS -EFIAPI -IScsiTestManagedDevice ( - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE DriverBindingHandle, - IN EFI_GUID *ProtocolGuid - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h deleted file mode 100644 index 6469df0434a1..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h +++ /dev/null @@ -1,1005 +0,0 @@ -/** @file - The header file of iSCSI Protocol that defines many specific data structures. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_PROTO_H_ -#define _ISCSI_PROTO_H_ - -#include <Protocol/ScsiPassThruExt.h> - -// -// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32 -// -#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2)) -#define ISCSI_SEQ_LT(s1, s2) \ - ( \ - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \ - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \ - ) -#define ISCSI_SEQ_GT(s1, s2) \ - ( \ - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \ - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \ - ) - -#define ISCSI_WELL_KNOWN_PORT 3260 -#define ISCSI_MAX_CONNS_PER_SESSION 1 - -#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192 -#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536 -#define DEFAULT_MAX_OUTSTANDING_R2T 1 - -#define ISCSI_VERSION_MAX 0x00 -#define ISCSI_VERSION_MIN 0x00 - -#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) -#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) - -#define ISCSI_KEY_AUTH_METHOD "AuthMethod" -#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest" -#define ISCSI_KEY_DATA_DIGEST "DataDigest" -#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections" -#define ISCSI_KEY_TARGET_NAME "TargetName" -#define ISCSI_KEY_INITIATOR_NAME "InitiatorName" -#define ISCSI_KEY_TARGET_ALIAS "TargetAlias" -#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias" -#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress" -#define ISCSI_KEY_INITIAL_R2T "InitialR2T" -#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData" -#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG "TargetPortalGroupTag" -#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength" -#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength" -#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait" -#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain" -#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T" -#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder" -#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER "DataSequenceInOrder" -#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel" -#define ISCSI_KEY_SESSION_TYPE "SessionType" -#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH "MaxRecvDataSegmentLength" - -#define ISCSI_KEY_VALUE_NONE "None" - -/// -/// connection state for initiator -/// - -#define CONN_STATE_FREE 0 -#define CONN_STATE_XPT_WAIT 1 -#define CONN_STATE_IN_LOGIN 2 -#define CONN_STATE_LOGGED_IN 3 -#define CONN_STATE_IN_LOGOUT 4 -#define CONN_STATE_LOGOUT_REQUESTED 5 -#define CONN_STATE_CLEANUP_WAIT 6 -#define CONN_STATE_IN_CLEANUP 7 - -/// -/// session state for initiator -/// -#define SESSION_STATE_FREE 0 -#define SESSION_STATE_LOGGED_IN 1 -#define SESSION_STATE_FAILED 2 - -typedef enum { - DataIn = 0, - DataOut = 1, - DataBi = 2 -} DATA_DIRECTION; - -#define ISCSI_RESERVED_TAG 0xffffffff - -#define ISCSI_REQ_IMMEDIATE 0x40 -#define ISCSI_OPCODE_MASK 0x3F - -#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs))) -#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK) -#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) & ISCSI_OPCODE_MASK) == (Op)) -#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode & ISCSI_REQ_IMMEDIATE) -#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags |= (BOOLEAN)(Flag)) -#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags &= ~(Flag)) -#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *) (PduHdr))->Flags & (Flag)) == (Flag)) -#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8) ((PduHdr)->Flags | ((Cur) << 2 | (Nxt)))) -#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & 0x3) -#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3) - -#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3) -#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3)) - -#define HTON24(Dst, Src) \ - do { \ - (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \ - (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \ - (Dst)[2] = (UINT8) ((Src) & 0xFF); \ - } while (0); - -#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2])) - -#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength) -#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len)) - -// -// initiator opcodes -// -#define ISCSI_OPCODE_NOP_OUT 0x00 -#define ISCSI_OPCODE_SCSI_CMD 0x01 -#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02 -#define ISCSI_OPCODE_LOGIN_REQ 0x03 -#define ISCSI_OPCODE_TEXT_REQ 0x04 -#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05 -#define ISCSI_OPCODE_LOGOUT_REQ 0x06 -#define ISCSI_OPCODE_SNACK_REQ 0x10 -#define ISCSI_OPCODE_VENDOR_I0 0x1c -#define ISCSI_OPCODE_VENDOR_I1 0x1d -#define ISCSI_OPCODE_VENDOR_I2 0x1e - -// -// target opcodes -// -#define ISCSI_OPCODE_NOP_IN 0x20 -#define ISCSI_OPCODE_SCSI_RSP 0x21 -#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22 -#define ISCSI_OPCODE_LOGIN_RSP 0x23 -#define ISCSI_OPCODE_TEXT_RSP 0x24 -#define ISCSI_OPCODE_SCSI_DATA_IN 0x25 -#define ISCSI_OPCODE_LOGOUT_RSP 0x26 -#define ISCSI_OPCODE_R2T 0x31 -#define ISCSI_OPCODE_ASYNC_MSG 0x32 -#define ISCSI_OPCODE_VENDOR_T0 0x3c -#define ISCSI_OPCODE_VENDOR_T1 0x3d -#define ISCSI_OPCODE_VENDOR_T2 0x3e -#define ISCSI_OPCODE_REJECT 0x3f - -#define ISCSI_BHS_FLAG_FINAL 0x80 - -/// -/// iSCSI Basic Header Segment -/// -typedef struct _ISCSI_BASIC_HEADER { - UINT8 OpCode; - UINT8 Flags; - UINT16 OpCodeSpecific1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 OpCodeSpecific2[7]; -} ISCSI_BASIC_HEADER; - -// -// Defined AHS types, others are reserved. -// -#define ISCSI_AHS_TYPE_EXT_CDB 0x1 -#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2 - -typedef struct _ISCSI_ADDTIONAL_HEADER { - UINT16 Length; - UINT8 Type; - UINT8 TypeSpecific[1]; -} ISCSI_ADDITIONAL_HEADER; - -typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS { - UINT16 Length; - UINT8 Type; - UINT8 Reserved; - UINT32 ExpReadDataLength; -} ISCSI_BI_EXP_READ_DATA_LEN_AHS; - -#define SCSI_CMD_PDU_FLAG_READ 0x40 -#define SCSI_CMD_PDU_FLAG_WRITE 0x20 - -#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07 - -// -// task attributes -// -#define ISCSI_TASK_ATTR_UNTAGGED 0x00 -#define ISCSI_TASK_ATTR_SIMPLE 0x01 -#define ISCSI_TASK_ATTR_ORDERD 0x02 -#define ISCSI_TASK_ATTR_HOQ 0x03 -#define ISCSI_TASK_ATTR_ACA 0x04 - -/// -/// SCSI Command -/// -typedef struct _SCSI_COMMAND { - UINT8 OpCode; - UINT8 Flags; - UINT16 Reserved; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 ExpDataXferLength; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT8 Cdb[16]; -} SCSI_COMMAND; - -// -// flag bit definitions in SCSI response -// -#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10 -#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08 -#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04 -#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02 - -// -// iSCSI service response codes -// -#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00 -#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01 - -/// -/// SCSI Response -/// -typedef struct _SCSI_RESPONSE { - UINT8 OpCode; - UINT8 Flags; - UINT8 Response; - UINT8 Status; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Reserved[8]; - UINT32 InitiatorTaskTag; - UINT32 SNACKTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 ExpDataSN; - UINT32 BiReadResidualCount; - UINT32 ResidualCount; -} SCSI_RESPONSE; - -typedef struct _ISCSI_SENSE_DATA { - UINT16 Length; - UINT8 Data[2]; -} ISCSI_SENSE_DATA; - -/// -/// iSCSI Task Managment Function Request -/// -typedef struct _ISCSI_TMF_REQUEST { - UINT8 OpCode; - UINT8 Fuction; - UINT16 Reserved1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 ReferencedTaskTag; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 RefCmdSN; - UINT32 ExpDataSN; - UINT32 Reserved2[2]; -} ISCSI_TMF_REQUEST; - -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0 -#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1 -#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2 -#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3 -#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4 -#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5 -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6 -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255 - -/// -/// iSCSI Task Management Function Response -/// -typedef struct _ISCSI_TMF_RESPONSE { - UINT8 OpCode; - UINT8 Reserved1; - UINT8 Response; - UINT8 Reserved2; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserver3[2]; - UINT32 InitiatorTaskTag; - UINT32 Reserved4; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 Reserved[3]; -} ISCSI_TMF_RESPONSE; - -/// -/// SCSI Data-Out -/// -typedef struct _ISCSI_SCSI_DATA_OUT { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 Reserved2; - UINT32 ExpStatSN; - UINT32 Reserved3; - UINT32 DataSN; - UINT32 BufferOffset; - UINT32 Reserved4; -} ISCSI_SCSI_DATA_OUT; - -#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40 -#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW SCSI_RSP_PDU_FLAG_OVERFLOW -#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW SCSI_RSP_PDU_FLAG_UNDERFLOW -#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01 - -/// -/// SCSI Data-In -/// -typedef struct _ISCSI_SCSI_DATA_IN { - UINT8 OpCode; - UINT8 Flags; - UINT8 Reserved1; - UINT8 Status; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 DataSN; - UINT32 BufferOffset; - UINT32 ResidualCount; -} ISCSI_SCSI_DATA_IN; - -#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset) - -/// -/// Ready To Transfer -/// -typedef struct _ISCSI_READY_TO_TRANSFER { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 R2TSeqNum; - UINT32 BufferOffset; - UINT32 DesiredDataTransferLength; -} ISCSI_READY_TO_TRANSFER; - -typedef struct _ISCSI_ASYNC_MESSAGE { - UINT8 OpCode; - UINT8 Reserved1[8]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 Reserved2; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT8 AsyncEvent; - UINT8 AsyncVCode; - UINT16 Parameter1; - UINT16 Parameter2; - UINT16 Parameter3; - UINT32 Reserved3; -} ISCSI_ASYNC_MESSAGE; - -#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80 -#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40 - -/// -/// Login Request -/// -typedef struct _ISCSI_LOGIN_REQUEST { - UINT8 OpCode; - UINT8 Flags; - UINT8 VersionMax; - UINT8 VersionMin; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Isid[6]; - UINT16 Tsih; - UINT32 InitiatorTaskTag; - UINT16 Cid; - UINT16 Reserved1; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 Reserved2[4]; -} ISCSI_LOGIN_REQUEST; - -#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT -#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE - -#define ISCSI_LOGIN_STATUS_SUCCESS 0 -#define ISCSI_LOGIN_STATUS_REDIRECTION 1 -#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2 -#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3 - -/// -/// Login Response -/// -typedef struct _ISCSI_LOGIN_RESPONSE { - UINT8 OpCode; - UINT8 Flags; - UINT8 VersionMax; - UINT8 VersionActive; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Isid[6]; - UINT16 Tsih; - UINT32 InitiatorTaskTag; - UINT32 Reserved1; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT8 StatusClass; - UINT8 StatusDetail; - UINT8 Reserved2[10]; -} ISCSI_LOGIN_RESPONSE; - -#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0 -#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1 -#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY 2 - -/// -/// Logout Request -/// -typedef struct _ISCSI_LOGOUT_REQUEST { - UINT8 OpCode; - UINT8 ReasonCode; - UINT16 Reserved1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserved2[2]; - UINT32 InitiatorTaskTag; - UINT16 Cid; - UINT16 Reserved3; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 Reserved4[4]; -} ISCSI_LOGOUT_REQUEST; - -#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0 -#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1 -#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2 -#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3 - -/// -/// Logout Response -/// -typedef struct _ISCSI_LOGOUT_RESPONSE { - UINT8 OpCode; - UINT8 Reserved1; - UINT8 Response; - UINT8 Reserved2; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserved3[2]; - UINT32 InitiatorTaskTag; - UINT32 Reserved4; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 Reserved5; - UINT16 Time2Wait; - UINT16 Time2Retain; - UINT32 Reserved6; -} ISCSI_LOGOUT_RESPONSE; - -#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0 -#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1 -#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2 -#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3 - -/// -/// SNACK Request -/// -typedef struct _ISCSI_SNACK_REQUEST { - UINT8 OpCode; - UINT8 Type; - UINT16 Reserved1; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 Reserved2; - UINT32 ExpStatSN; - UINT32 Reserved[2]; - UINT32 BegRun; - UINT32 RunLength; -} ISCSI_SNACK_REQUEST; - -/// -/// Reject -/// -typedef struct _ISCSI_REJECT { - UINT8 OpCode; - UINT8 Reserved1; - UINT8 Reason; - UINT8 Reserved2; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT32 Reserved3[2]; - UINT32 InitiatorTaskTag; - UINT32 Reserved4; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 DataSN; - UINT32 Reserved5[2]; -} ISCSI_REJECT; - -/// -/// NOP-Out -/// -typedef struct _ISCSI_NOP_OUT { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 CmdSN; - UINT32 ExpStatSN; - UINT32 Reserved2[4]; -} ISCSI_NOP_OUT; - -/// -/// NOP-In -/// -typedef struct _ISCSI_NOP_IN { - UINT8 OpCode; - UINT8 Reserved1[3]; - UINT8 TotalAHSLength; - UINT8 DataSegmentLength[3]; - UINT8 Lun[8]; - UINT32 InitiatorTaskTag; - UINT32 TargetTransferTag; - UINT32 StatSN; - UINT32 ExpCmdSN; - UINT32 MaxCmdSN; - UINT32 Reserved2[3]; -} ISCSI_NOP_IN; - -#define ISCSI_SECURITY_NEGOTIATION 0 -#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1 -#define ISCSI_FULL_FEATURE_PHASE 3 - -typedef enum { - IScsiDigestNone, - IScsiDigestCRC32 -} ISCSI_DIGEST_TYPE; - -typedef struct _ISCSI_XFER_CONTEXT { - UINT32 TargetTransferTag; - UINT32 Offset; - UINT32 DesiredLength; - UINT32 ExpDataSN; -} ISCSI_XFER_CONTEXT; - -typedef struct _ISCSI_IN_BUFFER_CONTEXT { - UINT8 *InData; - UINT32 InDataLen; -} ISCSI_IN_BUFFER_CONTEXT; - -typedef struct _ISCSI_TCB { - LIST_ENTRY Link; - - BOOLEAN SoFarInOrder; - UINT32 ExpDataSN; - BOOLEAN FbitReceived; - BOOLEAN StatusXferd; - UINT32 ActiveR2Ts; - UINT32 Response; - CHAR8 *Reason; - UINT32 InitiatorTaskTag; - UINT32 CmdSN; - UINT32 SNACKTag; - - ISCSI_XFER_CONTEXT XferContext; - - ISCSI_CONNECTION *Conn; -} ISCSI_TCB; - -typedef struct _ISCSI_KEY_VALUE_PAIR { - LIST_ENTRY List; - - CHAR8 *Key; - CHAR8 *Value; -} ISCSI_KEY_VALUE_PAIR; - -/** - Attach the iSCSI connection to the iSCSI session. - - @param[in, out] Session The iSCSI session. - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiAttatchConnection ( - IN OUT ISCSI_SESSION *Session, - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Detach the iSCSI connection from the session it belongs to. - - @param[in, out] Conn The iSCSI connection. -**/ -VOID -IScsiDetatchConnection ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - This function does the iSCSI connection login. - - @param[in, out] Conn The iSCSI connection to login. - - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target. - @retval EFI_TIMEOUT Timeout happened during the login procedure. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiConnLogin ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Create a TCP connection for the iSCSI session. - - @param[in] Private The iSCSI driver data. - @param[in] Session Maximum CmdSN from the target. - - @return The newly created iSCSI connection. -**/ -ISCSI_CONNECTION * -IScsiCreateConnection ( - IN ISCSI_DRIVER_DATA *Private, - IN ISCSI_SESSION *Session - ); - -/** - Destroy an iSCSI connection. - - @param[in] Conn The connection to destroy. -**/ -VOID -IScsiDestroyConnection ( - IN ISCSI_CONNECTION *Conn - ); - -/** - Login the iSCSI session. - - @param[in] Private The iSCSI driver data. - - @retval EFI_SUCCESS The iSCSI session login procedure finished. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NO_MEDIA There was a media error. - @retval Others Other errors as indicated. - -**/ -EFI_STATUS -IScsiSessionLogin ( - IN ISCSI_DRIVER_DATA *Private - ); - -/** - Build and send the iSCSI login request to the iSCSI target according to - the current login stage. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this - connection. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_DEVICE_ERROR Some kind of device error happened. -**/ -EFI_STATUS -IScsiSendLoginReq ( - IN ISCSI_CONNECTION *Conn - ); - -/** - Receive and process the iSCSI login response. - - @param[in] Conn The connection in the iSCSI login phase. - - @retval EFI_SUCCESS The iSCSI login response PDU is received and processed. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceiveLoginRsp ( - IN ISCSI_CONNECTION *Conn - ); - -/** - Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU. - The DataSegmentLength and the actual size of the net buffer containing this PDU will be - updated. - - @param[in, out] Pdu The iSCSI PDU whose data segment the key-value pair will - be added to. - @param[in] Key The key name string. - @param[in] Value The value string. - - @retval EFI_SUCCESS The key-valu pair is added to the PDU's datasegment and - the correspondence length fields are updated. - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value - pair. -**/ -EFI_STATUS -IScsiAddKeyValuePair ( - IN OUT NET_BUF *Pdu, - IN CHAR8 *Key, - IN CHAR8 *Value - ); - -/** - Prepare the iSCSI login request to be sent according to the current login status. - - @param[in, out] Conn The connection in the iSCSI login phase. - - @return The pointer to the net buffer containing the iSCSI login request built. - @retval Others Other errors as indicated. -**/ -NET_BUF * -IScsiPrepareLoginReq ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Process the iSCSI Login Response. - - @param[in, out] Conn The connection on which the iSCSI login response is received. - @param[in, out] Pdu The iSCSI login response PDU. - - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all check are passed. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_MEDIA_CHANGED Target is redirected. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiProcessLoginRsp ( - IN OUT ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ); - -/** - Updated the target information according the data received in the iSCSI - login response with an target redirection status. - - @param[in, out] Session The iSCSI session. - @param[in] Data The data segment which should contain the - TargetAddress key-value list. - @param[in] Len Length of the data. - - @retval EFI_SUCCESS The target address is updated. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_FOUND The TargetAddress key is not found. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiUpdateTargetAddress ( - IN OUT ISCSI_SESSION *Session, - IN CHAR8 *Data, - IN UINT32 Len - ); - -/** - The callback function to free the net buffer list. - - @param[in] Arg The opaque parameter. -**/ -VOID -EFIAPI -IScsiFreeNbufList ( - VOID *Arg - ); - -/** - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and - an optional data segment. The two parts will be put into two blocks of buffers in the - net buffer. The digest check will be conducted in this function if needed and the digests - will be trimmed from the PDU buffer. - - @param[in] Conn The iSCSI connection to receive data from. - @param[out] Pdu The received iSCSI pdu. - @param[in] Context The context used to describe information on the caller provided - buffer to receive data segment of the iSCSI pdu, it's optional. - @param[in] HeaderDigest Whether there will be header digest received. - @param[in] DataDigest Whether there will be data digest. - @param[in] TimeoutEvent The timeout event, it's optional. - - @retval EFI_SUCCESS An iSCSI pdu is received. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiReceivePdu ( - IN ISCSI_CONNECTION *Conn, - OUT NET_BUF **Pdu, - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL - IN BOOLEAN HeaderDigest, - IN BOOLEAN DataDigest, - IN EFI_EVENT TimeoutEvent OPTIONAL - ); - -/** - Check and get the result of the prameter negotiation. - - @param[in, out] Conn The connection in iSCSI login. - - @retval EFI_SUCCESS The parmeter check is passed and negotiation is finished. - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. -**/ -EFI_STATUS -IScsiCheckOpParams ( - IN OUT ISCSI_CONNECTION *Conn - ); - -/** - Fill the oprational prameters. - - @param[in] Conn The connection in iSCSI login. - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters. - - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request PDU. -**/ -EFI_STATUS -IScsiFillOpParams ( - IN ISCSI_CONNECTION *Conn, - IN OUT NET_BUF *Pdu - ); - -/** - Pad the iSCSI AHS or data segment to an integer number of 4 byte words. - - @param[in, out] Pdu The iSCSI pdu which contains segments to pad. - @param[in] Len The length of the last semgnet in the PDU. - - @retval EFI_SUCCESS The segment is padded or no need to pad it. - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the - padding bytes. -**/ -EFI_STATUS -IScsiPadSegment ( - IN OUT NET_BUF *Pdu, - IN UINT32 Len - ); - -/** - Build a key-value list from the data segment. - - @param[in] Data The data segment containing the key-value pairs. - @param[in] Len Length of the data segment. - - @return The key-value list. - @retval NULL Other errors as indicated. -**/ -LIST_ENTRY * -IScsiBuildKeyValueList ( - IN CHAR8 *Data, - IN UINT32 Len - ); - -/** - Get the value string by the key name from the key-value list. If found, - the key-value entry will be removed from the list. - - @param[in, out] KeyValueList The key-value list. - @param[in] Key The key name to find. - - @return The value string. -**/ -CHAR8 * -IScsiGetValueByKeyFromList ( - IN OUT LIST_ENTRY *KeyValueList, - IN CHAR8 *Key - ); - -/** - Free the key-value list. - - @param[in] KeyValueList The key-value list. -**/ -VOID -IScsiFreeKeyValueList ( - IN LIST_ENTRY *KeyValueList - ); - -/** - Normalize the iSCSI name according to RFC. - - @param[in, out] Name The iSCSI name. - @param[in] Len length of the iSCSI name. - - @retval EFI_SUCCESS The iSCSI name is valid and normalized. - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format. -**/ -EFI_STATUS -IScsiNormalizeName ( - IN OUT CHAR8 *Name, - IN UINTN Len - ); - -/** - Execute the SCSI command issued through the EXT SCSI PASS THRU protocol. - - @param[in] PassThru The EXT SCSI PASS THRU protocol. - @param[in] Target The target ID. - @param[in] Lun The LUN. - @param[in, out] Packet The request packet containing IO request, SCSI command - buffer and buffers to read/write. - - @retval EFI_SUCCES The SCSI command is executed and the result is updated to - the Packet. - @retval EFI_DEVICE_ERROR Session state was not as required. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval EFI_NOT_READY The target can not accept new commands. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -IScsiExecuteScsiCommand ( - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru, - IN UINT8 *Target, - IN UINT64 Lun, - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet - ); - -/** - Reinstate the session on some error. - - @param[in, out] Private The iSCSI driver data. - - @retval EFI_SUCCES The session is reinstated from some error. - @retval Other Reinstatement failed. -**/ -EFI_STATUS -IScsiSessionReinstatement ( - IN OUT ISCSI_DRIVER_DATA *Private - ); - -/** - Initialize some session parameters before login. - - @param[in, out] Session The iSCSI session. - @param[in] Recovery Whether the request is from a fresh new start or recovery. -**/ -VOID -IScsiSessionInit ( - IN OUT ISCSI_SESSION *Session, - IN BOOLEAN Recovery - ); - -/** - Abort the iSCSI session, that is, reset all the connection and free the - resources. - - @param[in, out] Session The iSCSI session. - - @retval EFI_SUCCES The session is aborted. -**/ -EFI_STATUS -IScsiSessionAbort ( - IN OUT ISCSI_SESSION *Session - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h deleted file mode 100644 index 9e0f1e0f02c2..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h +++ /dev/null @@ -1,142 +0,0 @@ -/** @file - iSCSI Tcp4 IO related definitions. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _ISCSI_TCP4_IO_H_ -#define _ISCSI_TCP4_IO_H_ - -#include <Library/NetLib.h> -#include <Protocol/Tcp4.h> - -typedef struct _TCP4_IO_CONFIG_DATA { - EFI_IPv4_ADDRESS LocalIp; - EFI_IPv4_ADDRESS SubnetMask; - EFI_IPv4_ADDRESS Gateway; - - EFI_IPv4_ADDRESS RemoteIp; - UINT16 RemotePort; -} TCP4_IO_CONFIG_DATA; - -typedef struct _TCP4_IO { - EFI_HANDLE Image; - EFI_HANDLE Controller; - - EFI_HANDLE Handle; - EFI_TCP4_PROTOCOL *Tcp4; - - EFI_TCP4_CONNECTION_TOKEN ConnToken; - EFI_TCP4_IO_TOKEN TxToken; - EFI_TCP4_IO_TOKEN RxToken; - EFI_TCP4_CLOSE_TOKEN CloseToken; - - BOOLEAN IsConnDone; - BOOLEAN IsTxDone; - BOOLEAN IsRxDone; - BOOLEAN IsCloseDone; -} TCP4_IO; - -/** - Create a TCP socket with the specified configuration data. - - @param[in] Image The handle of the driver image. - @param[in] Controller The handle of the controller. - @param[in] ConfigData The Tcp4 configuration data. - @param[in] Tcp4Io The Tcp4Io. - - @retval EFI_SUCCESS The TCP socket is created and configured. - @retval Others Failed to create the TCP socket or configure it. -**/ -EFI_STATUS -Tcp4IoCreateSocket ( - IN EFI_HANDLE Image, - IN EFI_HANDLE Controller, - IN TCP4_IO_CONFIG_DATA *ConfigData, - IN TCP4_IO *Tcp4Io - ); - -/** - Destroy the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds. -**/ -VOID -Tcp4IoDestroySocket ( - IN TCP4_IO *Tcp4Io - ); - -/** - Connect to the other endpoint of the TCP socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Timeout The time to wait for connection done. - - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully. - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoConnect ( - IN OUT TCP4_IO *Tcp4Io, - IN EFI_EVENT Timeout - ); - -/** - Reset the socket. - - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket. -**/ -VOID -Tcp4IoReset ( - IN OUT TCP4_IO *Tcp4Io - ); - -/** - Transmit the Packet to the other endpoint of the socket. - - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket. - @param[in] Packet The packet to transmit. - - @retval EFI_SUCCESS The packet is trasmitted. - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoTransmit ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet - ); - -/** - Receive data from the socket. - - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed. - @param[in] Packet The buffer to hold the data copy from the soket rx buffer. - @param[in] AsyncMode Is this receive asyncronous or not. - @param[in] Timeout The time to wait for receiving the amount of data the Packet - can hold. - - @retval EFI_SUCCESS The required amount of data is received from the socket. - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery. - @retval EFI_TIMEOUT Failed to receive the required amount of data in the - specified time period. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -Tcp4IoReceive ( - IN TCP4_IO *Tcp4Io, - IN NET_BUF *Packet, - IN BOOLEAN AsyncMode, - IN EFI_EVENT Timeout - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h deleted file mode 100644 index 1541b2d8ece1..000000000000 --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h +++ /dev/null @@ -1,80 +0,0 @@ -/** @file - Header file for Md5. - -Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _MD5_H_ -#define _MD5_H_ - -#include <Uefi.h> -#include <Library/BaseLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/NetLib.h> - -#define MD5_HASHSIZE 16 - -typedef struct _MD5_CTX { - EFI_STATUS Status; - UINT64 Length; - UINT32 States[MD5_HASHSIZE / sizeof (UINT32)]; - UINT8 M[64]; - UINTN Count; -} MD5_CTX; - -/** - Initialize four 32-bits chaining variables and use them to do the Md5 transform. - - @param[out] Md5Ctx The data structure of Md5. - - @retval EFI_SUCCESS Initialization is ok. -**/ -EFI_STATUS -MD5Init ( - OUT MD5_CTX *Md5Ctx - ); - -/** - the external interface of Md5 algorithm - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[in] Data The data wanted to be transformed. - @param[in] DataLen The length of data. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Update ( - IN OUT MD5_CTX *Md5Ctx, - IN VOID *Data, - IN UINTN DataLen - ); - -/** - Accumulate the MD5 value of every data segment and generate the finial - result according to MD5 algorithm. - - @param[in, out] Md5Ctx The data structure of storing the original data - segment and the final result. - @param[out] HashVal The final 128-bits output. - - @retval EFI_SUCCESS The transform is ok. - @retval Others Other errors as indicated. -**/ -EFI_STATUS -MD5Final ( - IN OUT MD5_CTX *Md5Ctx, - OUT UINT8 *HashVal - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h deleted file mode 100644 index bea7479eb222..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h +++ /dev/null @@ -1,131 +0,0 @@ -/** @file - Socket implementation header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _SOCK_IMPL_H_ -#define _SOCK_IMPL_H_ - -#include "Socket.h" -#include "Tcp4Main.h" - -/** - Signal a event with the given status. - - @param Token The token's event is to be signaled. - @param TokenStatus The status to be sent with the event. - -**/ -#define SIGNAL_TOKEN(Token, TokenStatus) \ - do { \ - (Token)->Status = (TokenStatus); \ - gBS->SignalEvent ((Token)->Event); \ - } while (0) - - -/** - Supporting function for both SockImpl and SockInterface. - - @param Event The Event this notify function registered to, ignored. - -**/ -VOID -EFIAPI -SockFreeFoo ( - IN EFI_EVENT Event - ); - -/** - Process the TCP send data, buffer the tcp txdata and append - the buffer to socket send buffer,then try to send it. - - @param Sock Pointer to the socket. - @param TcpTxData Pointer to the tcp txdata. - - @retval EFI_SUCCESS The operation is completed successfully. - @retval EFI_OUT_OF_RESOURCES Failed due to resource limit. - -**/ -EFI_STATUS -SockProcessTcpSndData ( - IN SOCKET *Sock, - IN VOID *TcpTxData - ); - -/** - Copy data from socket buffer to application provided receive buffer. - - @param Sock Pointer to the socket. - @param TcpRxData Pointer to the application provided receive buffer. - @param RcvdBytes The maximum length of the data can be copied. - @param IsOOB If TRUE the data is OOB, else the data is normal. - -**/ -VOID -SockSetTcpRxData ( - IN SOCKET *Sock, - IN VOID *TcpRxData, - IN UINT32 RcvdBytes, - IN BOOLEAN IsOOB - ); - -/** - Get received data from the socket layer to the receive token. - - @param Sock Pointer to the socket. - @param RcvToken Pointer to the application provided receive token. - - @return The length of data received in this token. - -**/ -UINT32 -SockProcessRcvToken ( - IN SOCKET *Sock, - IN OUT SOCK_IO_TOKEN *RcvToken - ); - -/** - Flush the socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockConnFlush ( - IN OUT SOCKET *Sock - ); - -/** - Create a socket with initial data SockInitData. - - @param SockInitData Pointer to the initial data of the socket. - - @return Pointer to the newly created socket. - -**/ -SOCKET * -SockCreate ( - IN SOCK_INIT_DATA *SockInitData - ); - -/** - Destroy a socket. - - @param Sock Pointer to the socket. - -**/ -VOID -SockDestroy ( - IN OUT SOCKET *Sock - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h deleted file mode 100644 index 650a7dd8651f..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h +++ /dev/null @@ -1,954 +0,0 @@ -/** @file - Socket header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -#include <Uefi.h> - -#include <Protocol/Ip4.h> -#include <Protocol/Tcp4.h> -#include <Protocol/Udp4.h> - -#include <Library/NetLib.h> -#include <Library/DebugLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/UefiLib.h> -#include <Library/DpcLib.h> -#include <Library/PrintLib.h> - -#define SOCK_SND_BUF 0 -#define SOCK_RCV_BUF 1 - -#define SOCK_BUFF_LOW_WATER (2 * 1024) -#define SOCK_RCV_BUFF_SIZE (8 * 1024) -#define SOCK_SND_BUFF_SIZE (8 * 1024) -#define SOCK_BACKLOG 5 - -#define PROTO_RESERVED_LEN 20 - -#define SO_NO_MORE_DATA 0x0001 - -// -// -// -// When a socket is created it enters into SO_UNCONFIGURED, -// no actions can be taken on this socket, only after calling -// SockConfigure. The state transition diagram of socket is -// as following: -// -// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING -// ^ | | -// | ---> SO_LISTENING | -// | | -// |------------------SO_DISCONNECTING<-- SO_CONNECTED -// -// A passive socket can only go into SO_LISTENING and -// SO_UNCONFIGURED state. SO_XXXING state is a middle state -// when a socket is undergoing a protocol procedure such -// as requesting a TCP connection. -// -// -// - -/// -/// Socket state -/// -#define SO_CLOSED 0 -#define SO_LISTENING 1 -#define SO_CONNECTING 2 -#define SO_CONNECTED 3 -#define SO_DISCONNECTING 4 - -/// -/// Socket configure state -/// -#define SO_UNCONFIGURED 0 -#define SO_CONFIGURED_ACTIVE 1 -#define SO_CONFIGURED_PASSIVE 2 -#define SO_NO_MAPPING 3 - -/** - Set socket SO_NO_MORE_DATA flag. - - @param Sock Pointer to the socket - -**/ -#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= SO_NO_MORE_DATA) - -/** - Check whether the socket is unconfigured. - - @param Sock Pointer to the socket - - @retval True The socket is unconfigued - @retval False The socket is not unconfigued - -**/ -#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == SO_UNCONFIGURED) - -/** - Check whether the socket is configured. - - @param Sock Pointer to the socket - - @retval True The socket is configued - @retval False The socket is not configued - -**/ -#define SOCK_IS_CONFIGURED(Sock) \ - (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \ - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)) - -/** - Check whether the socket is configured to active mode. - - @param Sock Pointer to the socket - - @retval True The socket is configued to active mode - @retval False The socket is not configued to active mode - -**/ -#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \ - ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) - -/** - Check whether the socket is configured to passive mode. - - @param Sock Pointer to the socket - - @retval True The socket is configued to passive mode - @retval False The socket is not configued to passive mode - -**/ -#define SOCK_IS_CONNECTED_PASSIVE(Sock) \ - ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE) - -/** - Check whether the socket is mapped. - - @param Sock Pointer to the socket - - @retval True The socket is no mapping - @retval False The socket is mapped - -**/ -#define SOCK_IS_NO_MAPPING(Sock) \ - ((Sock)->ConfigureState == SO_NO_MAPPING) - -/** - Check whether the socket is closed. - - @param Sock Pointer to the socket - - @retval True The socket is closed - @retval False The socket is not closed - -**/ -#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED) - -/** - Check whether the socket is listening. - - @param Sock Pointer to the socket - - @retval True The socket is listening - @retval False The socket is not listening - -**/ -#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING) - -/** - Check whether the socket is connecting. - - @param Sock Pointer to the socket - - @retval True The socket is connecting - @retval False The socket is not connecting - -**/ -#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == SO_CONNECTING) - -/** - Check whether the socket has connected. - - @param Sock Pointer to the socket - - @retval True The socket has connected - @retval False The socket has not connected - -**/ -#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED) - -/** - Check whether the socket is disconnecting. - - @param Sock Pointer to the socket - - @retval True The socket is disconnecting - @retval False The socket is not disconnecting - -**/ -#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == SO_DISCONNECTING) - -/** - Check whether the socket is no more data. - - @param Sock Pointer to the socket - - @retval True The socket is no more data - @retval False The socket still has data - -**/ -#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA)) - -/** - Set the size of the receive buffer. - - @param Sock Pointer to the socket - @param Size The size to set - -**/ -#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = (Size)) - -/** - Get the size of the receive buffer. - - @param Sock Pointer to the socket - - @return The receive buffer size - -**/ -#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater) - -/** - Get the size of the receive data. - - @param Sock Pointer to the socket - - @return The received data size - -**/ -#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)->BufSize) - -/** - Set the size of the send buffer. - - @param Sock Pointer to the socket - @param Size The size to set - -**/ -#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = (Size)) - -/** - Get the size of the send buffer. - - @param Sock Pointer to the socket - - @return The send buffer size - -**/ -#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater) - -/** - Get the size of the send data. - - @param Sock Pointer to the socket - - @return The send data size - -**/ -#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)->BufSize) - -/** - Set the backlog value of the socket. - - @param Sock Pointer to the socket - @param Value The value to set - -**/ -#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value)) - -/** - Get the backlog value of the socket. - - @param Sock Pointer to the socket - - @return The backlog value - -**/ -#define GET_BACKLOG(Sock) ((Sock)->BackLog) - -/** - Set the socket with error state. - - @param Sock Pointer to the socket - @param Error The error state - -**/ -#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error)) - -#define SND_BUF_HDR_LEN(Sock) \ - ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize) - -#define RCV_BUF_HDR_LEN(Sock) \ - ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize) - -#define SOCK_SIGNATURE SIGNATURE_32 ('S', 'O', 'C', 'K') - -#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE) - -#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock) - -#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \ - ((Type *) (((SOCK_TOKEN *) (SockToken))->Token)) - -typedef struct _SOCKET SOCKET; - -/// -/// Socket completion token -/// -typedef struct _SOCK_COMPLETION_TOKEN { - EFI_EVENT Event; ///< The event to be issued - EFI_STATUS Status; ///< The status to be issued -} SOCK_COMPLETION_TOKEN; - -typedef union { - VOID *RxData; - VOID *TxData; -} SOCK_IO_DATA; - -/// -/// The application token with data packet -/// -typedef struct _SOCK_IO_TOKEN { - SOCK_COMPLETION_TOKEN Token; - SOCK_IO_DATA Packet; -} SOCK_IO_TOKEN; - -/// -/// The request issued from socket layer to protocol layer. -/// -#define SOCK_ATTACH 0 ///< Attach current socket to a new PCB -#define SOCK_DETACH 1 ///< Detach current socket from the PCB -#define SOCK_CONFIGURE 2 ///< Configure attached PCB -#define SOCK_FLUSH 3 ///< Flush attached PCB -#define SOCK_SND 4 ///< Need protocol to send something -#define SOCK_SNDPUSH 5 ///< Need protocol to send pushed data -#define SOCK_SNDURG 6 ///< Need protocol to send urgent data -#define SOCK_CONSUMED 7 ///< Application has retrieved data from socket -#define SOCK_CONNECT 8 ///< Need to connect to a peer -#define SOCK_CLOSE 9 ///< Need to close the protocol process -#define SOCK_ABORT 10 ///< Need to reset the protocol process -#define SOCK_POLL 11 ///< Need to poll to the protocol layer -#define SOCK_ROUTE 12 ///< Need to add a route information -#define SOCK_MODE 13 ///< Need to get the mode data of the protocol -#define SOCK_GROUP 14 ///< Need to join a mcast group - -/// -/// The socket type. -/// -typedef enum { - SockDgram, ///< This socket providing datagram service - SockStream ///< This socket providing stream service -} SOCK_TYPE; - -/// -/// The buffer structure of rcvd data and send data used by socket. -/// -typedef struct _SOCK_BUFFER { - UINT32 HighWater; ///< The buffersize upper limit of sock_buffer - UINT32 LowWater; ///< The low water mark of sock_buffer - NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data -} SOCK_BUFFER; - -/** - The handler of protocol for request from socket. - - @param Socket The socket issuing the request to protocol - @param Request The request issued by socket - @param RequestData The request related data - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -typedef -EFI_STATUS -(*SOCK_PROTO_HANDLER) ( - IN SOCKET *Socket, - IN UINT8 Request, - IN VOID *RequestData - ); - - -// -// Socket provided oprerations for low layer protocol -// - -// -// Socket provided operations for user interface -// - -/** - Set the state of the socket. - - @param Sock Pointer to the socket. - @param State The new socket state to be set. - -**/ -VOID -SockSetState ( - IN OUT SOCKET *Sock, - IN UINT8 State - ); - -/** - Called by the low layer protocol to indicate the socket a connection is - established. - - This function just changes the socket's state to SO_CONNECTED - and signals the token used for connection establishment. - - @param Sock Pointer to the socket associated with the - established connection. - -**/ -VOID -SockConnEstablished ( - IN SOCKET *Sock - ); - -/** - Called by the low layer protocol to indicate the connection is closed. - - This function flushes the socket, sets the state to SO_CLOSED and signals - the close token. - - @param Sock Pointer to the socket associated with the closed - connection. - -**/ -VOID -SockConnClosed ( - IN OUT SOCKET *Sock - ); - -/** - Called by low layer protocol to indicate that some data is sent or processed. - - This function trims the sent data in the socket send buffer, signals the data - token if proper. - - @param Sock Pointer to the socket. - @param Count The length of the data processed or sent, in bytes. - -**/ -VOID -SockDataSent ( - IN SOCKET *Sock, - IN UINT32 Count - ); - -/** - Called by the low layer protocol to copy some data in socket send - buffer starting from the specific offset to a buffer provided by - the caller. - - @param Sock Pointer to the socket. - @param Offset The start point of the data to be copied. - @param Len The length of the data to be copied. - @param Dest Pointer to the destination to copy the data. - - @return The data size copied. - -**/ -UINT32 -SockGetDataToSend ( - IN SOCKET *Sock, - IN UINT32 Offset, - IN UINT32 Len, - IN UINT8 *Dest - ); - -/** - Called by the low layer protocol to indicate that there - will be no more data from the communication peer. - - This function set the socket's state to SO_NO_MORE_DATA and - signal all queued IO tokens with the error status EFI_CONNECTION_FIN. - - @param Sock Pointer to the socket. - -**/ -VOID -SockNoMoreData ( - IN OUT SOCKET *Sock - ); - -/** - Called by the low layer protocol to deliver received data to socket layer. - - This function will append the data to the socket receive buffer, set ther - urgent data length and then check if any receive token can be signaled. - - @param Sock Pointer to the socket. - @param NetBuffer Pointer to the buffer that contains the received - data. - @param UrgLen The length of the urgent data in the received data. - -**/ -VOID -SockDataRcvd ( - IN SOCKET *Sock, - IN OUT NET_BUF *NetBuffer, - IN UINT32 UrgLen - ); - -/** - Get the length of the free space of the specific socket buffer. - - @param Sock Pointer to the socket. - @param Which Flag to indicate which socket buffer to check, - either send buffer or receive buffer. - - @return The length of the free space, in bytes. - -**/ -UINT32 -SockGetFreeSpace ( - IN SOCKET *Sock, - IN UINT32 Which - ); - -/** - Clone a new socket including its associated protocol control block. - - @param Sock Pointer to the socket to be cloned. - - @return Pointer to the newly cloned socket. If NULL, error condition occurred. - -**/ -SOCKET * -SockClone ( - IN SOCKET *Sock - ); - - -/// -/// Proto type of the create callback -/// -typedef -EFI_STATUS -(*SOCK_CREATE_CALLBACK) ( - IN SOCKET *This, - IN VOID *Context - ); - -/// -/// Proto type of the destroy callback -/// -typedef -VOID -(*SOCK_DESTROY_CALLBACK) ( - IN SOCKET *This, - IN VOID *Context - ); - -/// -/// The initialize data for create a new socket. -/// -typedef struct _SOCK_INIT_DATA { - SOCK_TYPE Type; - UINT8 State; - - SOCKET *Parent; ///< The parent of this socket - UINT32 BackLog; ///< The connection limit for listening socket - UINT32 SndBufferSize; ///< The high water mark of send buffer - UINT32 RcvBufferSize; ///< The high water mark of receive buffer - VOID *Protocol; ///< The pointer to protocol function template - ///< wanted to install on socket - - // - // Callbacks after socket is created and before socket is to be destroyed. - // - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied - VOID *Context; ///< The context of the callback - - // - // Opaque protocol data. - // - VOID *ProtoData; - UINT32 DataSize; - - SOCK_PROTO_HANDLER ProtoHandler; ///< The handler of protocol for socket request - - EFI_HANDLE DriverBinding; ///< The driver binding handle -} SOCK_INIT_DATA; - -/// -/// The union type of TCP and UDP protocol. -/// -typedef union _NET_PROTOCOL { - EFI_TCP4_PROTOCOL TcpProtocol; ///< Tcp protocol - EFI_UDP4_PROTOCOL UdpProtocol; ///< Udp protocol -} NET_PROTOCOL; - -/// -/// The socket structure representing a network service access point -/// -struct _SOCKET { - - // - // Socket description information - // - UINT32 Signature; ///< Signature of the socket - EFI_HANDLE SockHandle; ///< The virtual handle of the socket - EFI_HANDLE DriverBinding; ///< Socket's driver binding protocol - EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - LIST_ENTRY Link; - UINT8 ConfigureState; - SOCK_TYPE Type; - UINT8 State; - UINT16 Flag; - EFI_LOCK Lock; ///< The lock of socket - SOCK_BUFFER SndBuffer; ///< Send buffer of application's data - SOCK_BUFFER RcvBuffer; ///< Receive buffer of received data - EFI_STATUS SockError; ///< The error returned by low layer protocol - BOOLEAN InDestroy; - - // - // Fields used to manage the connection request - // - UINT32 BackLog; ///< the limit of connection to this socket - UINT32 ConnCnt; ///< the current count of connections to it - SOCKET *Parent; ///< listening parent that accept the connection - LIST_ENTRY ConnectionList; ///< the connections maintained by this socket - - // - // The queue to buffer application's asynchronous token - // - LIST_ENTRY ListenTokenList; - LIST_ENTRY RcvTokenList; - LIST_ENTRY SndTokenList; - LIST_ENTRY ProcessingSndTokenList; - - SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal if connected - SOCK_COMPLETION_TOKEN *CloseToken; ///< app's token to signal if closed - - // - // Interface for low level protocol - // - SOCK_PROTO_HANDLER ProtoHandler; ///< The request handler of protocol - UINT8 ProtoReserved[PROTO_RESERVED_LEN]; ///< Data fields reserved for protocol - NET_PROTOCOL NetProtocol; ///< TCP or UDP protocol socket used - - // - // Callbacks after socket is created and before socket is to be destroyed. - // - SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created - SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied - VOID *Context; ///< The context of the callback -}; - -/// -/// The token structure buffered in socket layer. -/// -typedef struct _SOCK_TOKEN { - LIST_ENTRY TokenList; ///< The entry to add in the token list - SOCK_COMPLETION_TOKEN *Token; ///< The application's token - UINT32 RemainDataLen; ///< Unprocessed data length - SOCKET *Sock; ///< The poninter to the socket this token - ///< belongs to -} SOCK_TOKEN; - -/// -/// Reserved data to access the NET_BUF delivered by UDP driver. -/// -typedef struct _UDP_RSV_DATA { - EFI_TIME TimeStamp; - EFI_UDP4_SESSION_DATA Session; -} UDP_RSV_DATA; - -/// -/// Reserved data to access the NET_BUF delivered by TCP driver. -/// -typedef struct _TCP_RSV_DATA { - UINT32 UrgLen; -} TCP_RSV_DATA; - -/** - Create a socket and its associated protocol control block - with the intial data SockInitData and protocol specific - data ProtoData. - - @param SockInitData Inital data to setting the socket. - - @return Pointer to the newly created socket. If NULL, error condition occured. - -**/ -SOCKET * -SockCreateChild ( - IN SOCK_INIT_DATA *SockInitData - ); - -/** - Destroy the socket Sock and its associated protocol control block. - - @param Sock The socket to be destroyed. - - @retval EFI_SUCCESS The socket Sock is destroyed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockDestroyChild ( - IN SOCKET *Sock - ); - -/** - Configure the specific socket Sock using configuration data ConfigData. - - @param Sock Pointer to the socket to be configured. - @param ConfigData Pointer to the configuration data. - - @retval EFI_SUCCESS The socket is configured successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or the - socket is already configured. - -**/ -EFI_STATUS -SockConfigure ( - IN SOCKET *Sock, - IN VOID *ConfigData - ); - -/** - Initiate a connection establishment process. - - @param Sock Pointer to the socket to initiate the initate the - connection. - @param Token Pointer to the token used for the connection - operation. - - @retval EFI_SUCCESS The connection is initialized successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be an active one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockConnect ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Issue a listen token to get an existed connected network instance - or wait for a connection if there is none. - - @param Sock Pointer to the socket to accept connections. - @param Token The token to accept a connection. - - @retval EFI_SUCCESS Either a connection is accpeted or the Token is - buffered for further acception. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not configured to - be a passive one, or the token is already in one of - this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limit. - -**/ -EFI_STATUS -SockAccept ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Issue a token with data to the socket to send out. - - @param Sock Pointer to the socket to process the token with - data. - @param Token The token with data that needs to send out. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockSend ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Issue a token to get data from the socket. - - @param Sock Pointer to the socket to get data from. - @param Token The token to store the received data from the - socket. - - @retval EFI_SUCCESS The token is processed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - @retval EFI_CONNECTION_FIN The connection is closed and there is no more data. - @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit. - -**/ -EFI_STATUS -SockRcv ( - IN SOCKET *Sock, - IN VOID *Token - ); - -/** - Reset the socket and its associated protocol control block. - - @param Sock Pointer to the socket to be flushed. - - @retval EFI_SUCCESS The socket is flushed successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - -**/ -EFI_STATUS -SockFlush ( - IN SOCKET *Sock - ); - -/** - Close or abort the socket associated connection. - - @param Sock Pointer to the socket of the connection to close or - abort. - @param Token The token for close operation. - @param OnAbort TRUE for aborting the connection, FALSE to close it. - - @retval EFI_SUCCESS The close or abort operation is initialized - successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the - socket is closed, or the socket is not in a - synchronized state , or the token is already in one - of this socket's lists. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockClose ( - IN SOCKET *Sock, - IN VOID *Token, - IN BOOLEAN OnAbort - ); - -/** - Get the mode data of the low layer protocol. - - @param Sock Pointer to the socket to get mode data from. - @param Mode Pointer to the data to store the low layer mode - information. - - @retval EFI_SUCCESS The mode data is got successfully. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockGetMode ( - IN SOCKET *Sock, - IN OUT VOID *Mode - ); - -/** - Add or remove route information in IP route table associated - with this socket. - - @param Sock Pointer to the socket associated with the IP route - table to operate on. - @param RouteInfo Pointer to the route information to be processed. - - @retval EFI_SUCCESS The route table is updated successfully. - @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket. - @retval EFI_NO_MAPPING The IP address configuration operation is not - finished. - @retval EFI_NOT_STARTED The socket is not configured. - -**/ -EFI_STATUS -SockRoute ( - IN SOCKET *Sock, - IN VOID *RouteInfo - ); - -// -// Supporting function to operate on socket buffer -// - -/** - Get the first buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - - @return Pointer to the first buffer in the queue. NULL if the queue is empty. - -**/ -NET_BUF * -SockBufFirst ( - IN SOCK_BUFFER *Sockbuf - ); - -/** - Get the next buffer block in the specific socket buffer. - - @param Sockbuf Pointer to the socket buffer. - @param SockEntry Pointer to the buffer block prior to the required - one. - - @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is - the tail or head entry. - -**/ -NET_BUF * -SockBufNext ( - IN SOCK_BUFFER *Sockbuf, - IN NET_BUF *SockEntry - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h deleted file mode 100644 index 368f49c4ddb1..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h +++ /dev/null @@ -1,342 +0,0 @@ -/** @file - Tcp driver function header. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_DRIVER_H_ -#define _TCP4_DRIVER_H_ - -#include <Protocol/ServiceBinding.h> -#include <Library/IpIoLib.h> - -#define TCP4_DRIVER_SIGNATURE SIGNATURE_32 ('T', 'C', 'P', '4') - -#define TCP4_PORT_KNOWN 1024 -#define TCP4_PORT_USER_RESERVED 65535 - -#define TCP4_FROM_THIS(a) \ - CR ( \ - (a), \ - TCP4_SERVICE_DATA, \ - Tcp4ServiceBinding, \ - TCP4_DRIVER_SIGNATURE \ - ) - -/// -/// TCP heartbeat tick timer. -/// -typedef struct _TCP4_HEARTBEAT_TIMER { - EFI_EVENT TimerEvent; ///< The event assoiated with the timer - INTN RefCnt; ///< Number of reference -} TCP4_HEARTBEAT_TIMER; - -/// -/// TCP service data -/// -typedef struct _TCP4_SERVICE_DATA { - UINT32 Signature; - EFI_HANDLE ControllerHandle; - IP_IO *IpIo; // IP Io consumed by TCP4 - EFI_SERVICE_BINDING_PROTOCOL Tcp4ServiceBinding; - EFI_HANDLE DriverBindingHandle; - LIST_ENTRY SocketList; -} TCP4_SERVICE_DATA; - -/// -/// TCP protocol data -/// -typedef struct _TCP4_PROTO_DATA { - TCP4_SERVICE_DATA *TcpService; - TCP_CB *TcpPcb; -} TCP4_PROTO_DATA; - - -/** - Packet receive callback function provided to IP_IO, used to call - the proper function to handle the packet received by IP. - - @param Status Status of the received packet. - @param IcmpErr ICMP error number. - @param NetSession Pointer to the net session of this packet. - @param Pkt Pointer to the recieved packet. - @param Context Pointer to the context configured in IpIoOpen(), not used - now. - - @return None - -**/ -VOID -EFIAPI -Tcp4RxCallback ( - IN EFI_STATUS Status, - IN UINT8 IcmpErr, - IN EFI_NET_SESSION_DATA *NetSession, - IN NET_BUF *Pkt, - IN VOID *Context OPTIONAL - ); - -/** - Send the segment to IP via IpIo function. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the TCP segment to be sent. - @param Src Source address of the TCP segment. - @param Dest Destination address of the TCP segment. - - @retval 0 The segment was sent out successfully. - @retval -1 The segment was failed to send. - -**/ -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dest - ); - -/** - The procotol handler provided to the socket layer, used to - dispatch the socket level requests by calling the corresponding - TCP layer functions. - - @param Sock Pointer to the socket of this TCP instance. - @param Request The code of this operation request. - @param Data Pointer to the operation specific data passed in - together with the operation request. - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN UINT8 Request, - IN VOID *Data OPTIONAL - ); - - -/** - The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle. - - @param ImageHandle The firmware allocated handle for this - driver image. - @param SystemTable Pointer to the EFI system table. - - @retval EFI_SUCCESS Driver loaded. - @retval other Driver not loaded. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - - -/** - Tests to see if this driver supports a given controller. - - If a child device is provided, it further tests to see if this driver supports - creating a handle for the specified child device. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to test. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is optional for bus drivers. - - - @retval EFI_SUCCESS The device specified by ControllerHandle and - RemainingDevicePath is supported by the driver - specified by This. - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by - the driver specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a - different driver or an application that requires - exclusive access. - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and - RemainingDevicePath is not supported by the driver - specified by This. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Start this driver on ControllerHandle. - - The Start() function is designed to be invoked from the EFI boot service - ConnectController(). As a result, much of the error checking on the parameters - to Start() has been moved into this common boot service. It is legal to call - Start() from other locations, but the following calling restrictions must be - followed or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE. - 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally - aligned EFI_DEVICE_PATH_PROTOCOL. - 3. Prior to calling Start(), the Supported() function for the driver specified - by This must have been called with the same calling parameters, and Supported() - must have returned EFI_SUCCESS. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param RemainingDevicePath A pointer to the remaining portion of a device path. - This parameter is ignored by device drivers, and is - optional for bus drivers. - - @retval EFI_SUCCESS The device was started. - @retval EFI_ALREADY_STARTED The device could not be started due to a device error. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack - of resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL - ); - -/** - Stop this driver on ControllerHandle. - - The Stop() function is designed to be invoked from the EFI boot service - DisconnectController(). As a result, much of the error checking on the parameters - to Stop() has been moved into this common boot service. It is legal to call Stop() - from other locations, but the following calling restrictions must be followed - or the system behavior will not be deterministic. - 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call - to this same driver's Start() function. - 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid - EFI_HANDLE. In addition, all of these handles must have been created in this - driver's Start() function, and the Start() function must have called OpenProtocol() - on ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. - - @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param ControllerHandle A handle to the device being stopped. The handle must - support a bus specific I/O protocol for the driver - to use to stop the device. - @param NumberOfChildren The number of child device handles in ChildHandleBuffer. - @param ChildHandleBuffer An array of child handles to be freed. May be NULL if - NumberOfChildren is 0. - - @retval EFI_SUCCESS The device was stopped. - @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. - -**/ -EFI_STATUS -EFIAPI -Tcp4DriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -/** - Open Ip4 and device path protocols for a created socket, and insert it in - socket list. - - @param This Pointer to the socket just created - @param Context Context of the socket - - @retval EFI_SUCCESS This protocol is installed successfully. - @retval other Some error occured. - -**/ -EFI_STATUS -Tcp4CreateSocketCallback ( - IN SOCKET *This, - IN VOID *Context - ); - -/** - Close Ip4 and device path protocols for a socket, and remove it from socket list. - - @param This Pointer to the socket to be removed - @param Context Context of the socket - -**/ -VOID -Tcp4DestroySocketCallback ( - IN SOCKET *This, - IN VOID *Context - ); - -/** - Creates a child handle and installs a protocol. - - The CreateChild() function installs a protocol on ChildHandle. If ChildHandle - is a pointer to NULL, then a new handle is created and returned in ChildHandle. - If ChildHandle is not a pointer to NULL, then the protocol installs on the existing - ChildHandle. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Pointer to the handle of the child to create. If it is NULL, then - a new handle is created. If it is a pointer to an existing UEFI - handle, then the protocol is added to the existing UEFI handle. - - @retval EFI_SUCCES The protocol was added to ChildHandle. - @retval EFI_INVALID_PARAMETER ChildHandle is NULL. - @retval EFI_OUT_OF_RESOURCES There are not enough resources available to create - the child. - @retval other The child handle was not created. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingCreateChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN OUT EFI_HANDLE *ChildHandle - ); - -/** - Destroys a child handle with a protocol installed on it. - - The DestroyChild() function does the opposite of CreateChild(). It removes a protocol - that was installed by CreateChild() from ChildHandle. If the removed protocol is the - last protocol on ChildHandle, then ChildHandle is destroyed. - - @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. - @param ChildHandle Handle of the child to destroy - - @retval EFI_SUCCES The protocol was removed from ChildHandle. - @retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is - being removed. - @retval EFI_INVALID_PARAMETER Child handle is NULL. - @retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle - because its services are being used. - @retval other The child handle was not destroyed. - -**/ -EFI_STATUS -EFIAPI -Tcp4ServiceBindingDestroyChild ( - IN EFI_SERVICE_BINDING_PROTOCOL *This, - IN EFI_HANDLE ChildHandle - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf deleted file mode 100644 index 7c0504770b48..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf +++ /dev/null @@ -1,94 +0,0 @@ -## @file -# This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol. -# -# This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol -# upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. This driver only -# supports IPv4 network stack. -# -# Notes: -# 1) This driver can't co-work with the TcpDxe driver in NetworkPkg. -# 2) This driver might have some issues that have been fixed in the TcpDxe driver -# in NetworkPkg. -# 3) This driver supports fewer features than the TcpDxe driver in NetworkPkg (e.g. IPv6, -# TCP Cancel function). -# 4) TcpDxe driver in NetworkPkg is recommended for use instead of this one even though -# both of them can be used. -# -# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = Tcp4Dxe - MODULE_UNI_FILE = Tcp4Dxe.uni - FILE_GUID = 6d6963ab-906d-4a65-a7ca-bd40e5d6af4d - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = Tcp4DriverEntryPoint - UNLOAD_IMAGE = NetLibDefaultUnload -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 EBC -# -# DRIVER_BINDING = mTcp4DriverBinding -# COMPONENT_NAME = gTcp4ComponentName -# COMPONENT_NAME2 = gTcp4ComponentName2 -# - -[Sources] - SockImpl.c - SockInterface.c - Tcp4Proto.h - Tcp4Main.h - SockImpl.h - Tcp4Output.c - Tcp4Timer.c - Tcp4Option.h - Tcp4Dispatcher.c - Tcp4Input.c - Tcp4Misc.c - Tcp4Main.c - Socket.h - ComponentName.c - Tcp4Driver.h - Tcp4Io.c - Tcp4Driver.c - Tcp4Func.h - Tcp4Option.c - - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - UefiLib - UefiBootServicesTableLib - UefiDriverEntryPoint - UefiRuntimeServicesTableLib - BaseMemoryLib - MemoryAllocationLib - DebugLib - NetLib - IpIoLib - DevicePathLib - DpcLib - -[Protocols] - gEfiTcp4ServiceBindingProtocolGuid ## BY_START - gEfiIp4ServiceBindingProtocolGuid ## TO_START - gEfiTcp4ProtocolGuid ## BY_START - gEfiIp4ProtocolGuid ## TO_START - -[UserExtensions.TianoCore."ExtraFiles"] - Tcp4DxeExtra.uni diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni deleted file mode 100644 index 1514a3917766..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni +++ /dev/null @@ -1,23 +0,0 @@ -// /** @file -// This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol. -// -// This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol -// upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. -// -// Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol" - -#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol upon EFI IPv4 Protocol to provide basic TCPv4 I/O services." - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni deleted file mode 100644 index 0e6d2f2896f3..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// Tcp4Dxe Localized Strings and Content -// -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"TCP v4 DXE Driver" - - diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h deleted file mode 100644 index 53b7aac8ae98..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h +++ /dev/null @@ -1,781 +0,0 @@ -/** @file - Tcp function header file. - -Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_FUNC_H_ -#define _TCP4_FUNC_H_ - -// -// Declaration of all the functions in TCP -// protocol. It is intended to keep tcp.h -// clear. -// - -// -// Functions in tcp.c -// - -/** - Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>. - - @param Addr Pointer to the IP address needs to match. - @param Port The port number needs to match. - - @return The Tcb which matches the <Addr Port> paire exists or not. - -**/ -BOOLEAN -TcpFindTcbByPeer ( - IN EFI_IPv4_ADDRESS *Addr, - IN TCP_PORTNO Port - ); - -/** - Locate the TCP_CB related to the socket pair. - - @param LocalPort The local port number. - @param LocalIp The local IP address. - @param RemotePort The remote port number. - @param RemoteIp The remote IP address. - @param Syn Whether to search the listen sockets, if TRUE, the - listen sockets are searched. - - @return Pointer to the related TCP_CB, if NULL no match is found. - -**/ -TCP_CB * -TcpLocateTcb ( - IN TCP_PORTNO LocalPort, - IN UINT32 LocalIp, - IN TCP_PORTNO RemotePort, - IN UINT32 RemoteIp, - IN BOOLEAN Syn - ); - -/** - Insert a Tcb into the proper queue. - - @param Tcb Pointer to the TCP_CB to be inserted. - - @retval 0 The Tcb is inserted successfully. - @retval -1 Error condition occurred. - -**/ -INTN -TcpInsertTcb ( - IN TCP_CB *Tcb - ); - -/** - Clone a TCP_CB from Tcb. - - @param Tcb Pointer to the TCP_CB to be cloned. - - @return Pointer to the new cloned TCP_CB, if NULL error condition occurred. - -**/ -TCP_CB * -TcpCloneTcb ( - IN TCP_CB *Tcb - ); - -/** - Compute an ISS to be used by a new connection. - - @return The result ISS. - -**/ -TCP_SEQNO -TcpGetIss ( - VOID - ); - -/** - Initialize the Tcb local related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpInitTcbLocal ( - IN OUT TCP_CB *Tcb - ); - -/** - Initialize the peer related members. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the segment that contains the peer's - intial info. - @param Opt Pointer to the options announced by the peer. - -**/ -VOID -TcpInitTcbPeer ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg, - IN TCP_OPTION *Opt - ); - -/** - Get the local mss. - - @param Sock Pointer to the socket to get mss - - @return The mss size. - -**/ -UINT16 -TcpGetRcvMss ( - IN SOCKET *Sock - ); - -/** - Set the Tcb's state. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param State The state to be set. - -**/ -VOID -TcpSetState ( - IN OUT TCP_CB *Tcb, - IN UINT8 State - ); - -// -// Functions in Tcp4Output.c -// -/** - Send the segment to IP via IpIo function. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the TCP segment to be sent. - @param Src Source address of the TCP segment. - @param Dest Destination address of the TCP segment. - - @retval 0 The segment was sent out successfully. - @retval -1 The segment was failed to send. - -**/ -INTN -TcpSendIpPacket ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dest - ); - -/** - Check whether to send data/SYN/FIN and piggy back an ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The number of bytes sent. - -**/ -INTN -TcpToSendData ( - IN OUT TCP_CB *Tcb, - IN INTN Force - ); - -/** - Check whether to send an ACK or delayed ACK. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpToSendAck ( - IN OUT TCP_CB *Tcb - ); - -/** - Send an ACK immediately. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSendAck ( - IN OUT TCP_CB *Tcb - ); - -/** - Send a zero probe segment. It can be used by keepalive and zero window probe. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 The zero probe segment was sent out successfully. - @retval other Error condition occurred. - -**/ -INTN -TcpSendZeroProbe ( - IN OUT TCP_CB *Tcb - ); - -/** - Process the data and FIN flag, check whether to deliver - data to the socket layer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 No error occurred to deliver data. - @retval -1 Error condition occurred. Proper response is to reset the - connection. - -**/ -INTN -TcpDeliverData ( - IN OUT TCP_CB *Tcb - ); - -/** - Send a RESET segment in response to the segment received. - - @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL. - @param Head TCP header of the segment that triggers the reset. - @param Len Length of the segment that triggers the reset. - @param Local Local IP address. - @param Remote Remote peer's IP address. - - @retval 0 A reset is sent or no need to send it. - @retval -1 No reset is sent. - -**/ -INTN -TcpSendReset ( - IN TCP_CB *Tcb, - IN TCP_HEAD *Head, - IN INT32 Len, - IN UINT32 Local, - IN UINT32 Remote - ); - -/** - Compute the sequence space left in the old receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence space left in the old receive window. - -**/ -UINT32 -TcpRcvWinOld ( - IN TCP_CB *Tcb - ); - -/** - Compute the current receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The size of the current receive window, in bytes. - -**/ -UINT32 -TcpRcvWinNow ( - IN TCP_CB *Tcb - ); - -/** - Retransmit the segment from sequence Seq. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment to be retransmitted. - - @retval 0 Retransmission succeeded. - @retval -1 Error condition occurred. - -**/ -INTN -TcpRetransmit ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq - ); - -/** - Compute how much data to send. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Force Whether to ignore the sender's SWS avoidance algorithm and send - out data by force. - - @return The length of the data can be sent, if 0, no data can be sent. - -**/ -UINT32 -TcpDataToSend ( - IN TCP_CB *Tcb, - IN INTN Force - ); - -/** - Verify that the segment is in good shape. - - @param Nbuf Buffer that contains the segment to be checked. - - @retval 0 The segment is broken. - @retval 1 The segment is in good shape. - -**/ -INTN -TcpVerifySegment ( - IN NET_BUF *Nbuf - ); - -/** - Verify that all the segments in SndQue are in good shape. - - @param Head Pointer to the head node of the SndQue. - - @retval 0 At least one segment is broken. - @retval 1 All segments in the specific queue are in good shape. - -**/ -INTN -TcpCheckSndQue ( - IN LIST_ENTRY *Head - ); - -/** - Get a segment from the Tcb's SndQue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -/** - Get a segment from the Tcb's socket buffer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegmentSock ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -/** - Get a segment starting from sequence Seq of a maximum - length of Len. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seq The sequence number of the segment. - @param Len The maximum length of the segment. - - @return Pointer to the segment, if NULL some error occurred. - -**/ -NET_BUF * -TcpGetSegment ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Seq, - IN UINT32 Len - ); - -/** - Get the maximum SndNxt. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The sequence number of the maximum SndNxt. - -**/ -TCP_SEQNO -TcpGetMaxSndNxt ( - IN TCP_CB *Tcb - ); - -// -// Functions from Tcp4Input.c -// -/** - Process the received ICMP error messages for TCP. - - @param Nbuf Buffer that contains part of the TCP segment without IP header - truncated from the ICMP error packet. - @param IcmpErr The ICMP error code interpreted from ICMP error packet. - @param Src Source address of the ICMP error message. - @param Dst Destination address of the ICMP error message. - -**/ -VOID -TcpIcmpInput ( - IN NET_BUF *Nbuf, - IN UINT8 IcmpErr, - IN UINT32 Src, - IN UINT32 Dst - ); - -/** - Process the received TCP segments. - - @param Nbuf Buffer that contains received TCP segment without IP header. - @param Src Source address of the segment, or the peer's IP address. - @param Dst Destination address of the segment, or the local end's IP - address. - - @retval 0 Segment is processed successfully. It is either accepted or - discarded. But no connection is reset by the segment. - @retval -1 A connection is reset by the segment. - -**/ -INTN -TcpInput ( - IN NET_BUF *Nbuf, - IN UINT32 Src, - IN UINT32 Dst - ); - -/** - Check whether the sequence number of the incoming segment is acceptable. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Pointer to the incoming segment. - - @retval 1 The sequence number is acceptable. - @retval 0 The sequence number is not acceptable. - -**/ -INTN -TcpSeqAcceptable ( - IN TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -/** - NewReno fast recovery, RFC3782. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast recovery. - -**/ -VOID -TcpFastRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -/** - NewReno fast loss recovery, RFC3792. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Seg Segment that triggers the fast loss recovery. - -**/ -VOID -TcpFastLossRecover ( - IN OUT TCP_CB *Tcb, - IN TCP_SEG *Seg - ); - -/** - Compute the RTT as specified in RFC2988. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Measure Currently measured RTT in heart beats. - -**/ -VOID -TcpComputeRtt ( - IN OUT TCP_CB *Tcb, - IN UINT32 Measure - ); - -/** - Trim off the data outside the tcb's receive window. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the NET_BUF containing the received tcp segment. - -**/ -VOID -TcpTrimInWnd ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Store the data into the reassemble queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer containing the data to be queued. - -**/ -VOID -TcpQueueData ( - IN OUT TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Ajust the send queue or the retransmit queue. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Ack The acknowledge seuqence number of the received segment. - -**/ -VOID -TcpAdjustSndQue ( - IN TCP_CB *Tcb, - IN TCP_SEQNO Ack - ); - -// -// Functions from Tcp4Misc.c -// -/** - Compute the TCP segment's checksum. - - @param Nbuf Pointer to the buffer that contains the TCP - segment. - @param HeadSum The checksum value of the fixed part of pseudo - header. - - @return The checksum value. - -**/ -UINT16 -TcpChecksum ( - IN NET_BUF *Nbuf, - IN UINT16 HeadSum - ); - -/** - Translate the information from the head of the received TCP - segment Nbuf contains and fill it into a TCP_SEG structure. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer contains the TCP segment. - - @return Pointer to the TCP_SEG that contains the translated TCP head information. - -**/ -TCP_SEG * -TcpFormatNetbuf ( - IN TCP_CB *Tcb, - IN OUT NET_BUF *Nbuf - ); - -/** - Initialize an active connection. - - @param Tcb Pointer to the TCP_CB that wants to initiate a - connection. - -**/ -VOID -TcpOnAppConnect ( - IN OUT TCP_CB *Tcb - ); - -/** - Application has consumed some data, check whether - to send a window updata ack or a delayed ack. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppConsume ( - IN TCP_CB *Tcb - ); - -/** - Initiate the connection close procedure, called when - applications want to close the connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpOnAppClose ( - IN OUT TCP_CB *Tcb - ); - -/** - Check whether the application's newly delivered data can be sent out. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @retval 0 Whether the data is sent out or is buffered for - further sending. - @retval -1 The Tcb is not in a state that data is permitted to - be sent out. - -**/ -INTN -TcpOnAppSend ( - IN OUT TCP_CB *Tcb - ); - -/** - Abort the connection by sending a reset segment, called - when the application wants to abort the connection. - - @param Tcb Pointer to the TCP_CB of the TCP instance. - -**/ -VOID -TcpOnAppAbort ( - IN TCP_CB *Tcb - ); - -/** - Reset the connection related with Tcb. - - @param Tcb Pointer to the TCP_CB of the connection to be - reset. - -**/ -VOID -TcpResetConnection ( - IN TCP_CB *Tcb - ); - -// -// Functions in Tcp4Timer.c -// -/** - Close the TCP connection. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClose ( - IN OUT TCP_CB *Tcb - ); - -/** - Heart beat timer handler, queues the DPC at TPL_CALLBACK. - - @param Event Timer event signaled, ignored. - @param Context Context of the timer event, ignored. - -**/ -VOID -EFIAPI -TcpTicking ( - IN EFI_EVENT Event, - IN VOID *Context - ); - -/** - Enable a TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be enabled. - @param TimeOut The timeout value of this timer. - -**/ -VOID -TcpSetTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer, - IN UINT32 TimeOut - ); - -/** - Clear one TCP timer. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Timer The index of the timer to be cleared. - -**/ -VOID -TcpClearTimer ( - IN OUT TCP_CB *Tcb, - IN UINT16 Timer - ); - -/** - Clear all TCP timers. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpClearAllTimer ( - IN OUT TCP_CB *Tcb - ); - -/** - Enable the window prober timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetProbeTimer ( - IN OUT TCP_CB *Tcb - ); - -/** - Enable the keepalive timer and set the timeout value. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpSetKeepaliveTimer ( - IN OUT TCP_CB *Tcb - ); - -/** - Backoff the RTO. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - -**/ -VOID -TcpBackoffRto ( - IN OUT TCP_CB *Tcb - ); - -/** - Install the device path protocol on the TCP instance. - - @param Sock Pointer to the socket representing the TCP instance. - - @retval EFI_SUCCESS The device path protocol is installed. - @retval other Failed to install the device path protocol. - -**/ -EFI_STATUS -TcpInstallDevicePath ( - IN SOCKET *Sock - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h deleted file mode 100644 index c898a7ee2dd0..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h +++ /dev/null @@ -1,494 +0,0 @@ -/** @file - TCP4 protocol services header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_MAIN_H_ -#define _TCP4_MAIN_H_ - -#include "Socket.h" - -#include "Tcp4Proto.h" -#include "Tcp4Func.h" -#include "Tcp4Driver.h" - - -extern UINT16 mTcp4RandomPort; -extern CHAR16 *mTcpStateName[]; - -// -// Driver Produced Protocol Prototypes -// - -// -// Function prototype for the Tcp4 socket request handler -// -/** - The procotol handler provided to the socket layer, used to - dispatch the socket level requests by calling the corresponding - TCP layer functions. - - @param Sock Pointer to the socket of this TCP instance. - @param Request The code of this operation request. - @param Data Pointer to the operation specific data passed in - together with the operation request. - - @retval EFI_SUCCESS The socket request is completed successfully. - @retval other The error status returned by the corresponding TCP - layer function. - -**/ -EFI_STATUS -Tcp4Dispatcher ( - IN SOCKET *Sock, - IN UINT8 Request, - IN VOID *Data OPTIONAL - ); - -/// -/// TCP mode data -/// -typedef struct _TCP4_MODE_DATA { - EFI_TCP4_CONNECTION_STATE *Tcp4State; - EFI_TCP4_CONFIG_DATA *Tcp4ConfigData; - EFI_IP4_MODE_DATA *Ip4ModeData; - EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData; - EFI_SIMPLE_NETWORK_MODE *SnpModeData; -} TCP4_MODE_DATA; - -/// -/// TCP route infomation data -/// -typedef struct _TCP4_ROUTE_INFO { - BOOLEAN DeleteRoute; - EFI_IPv4_ADDRESS *SubnetAddress; - EFI_IPv4_ADDRESS *SubnetMask; - EFI_IPv4_ADDRESS *GatewayAddress; -} TCP4_ROUTE_INFO; - -typedef struct { - EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; - UINTN NumberOfChildren; - EFI_HANDLE *ChildHandleBuffer; -} TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT; - -/** - Get the current operational status of a TCP instance. - - The GetModeData() function copies the current operational settings of this - EFI TCPv4 Protocol instance into user-supplied buffers. This function can - also be used to retrieve the operational setting of underlying drivers - such as IPv4, MNP, or SNP. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Tcp4State Pointer to the buffer to receive the current TCP - state. - @param Tcp4ConfigData Pointer to the buffer to receive the current TCP - configuration. - @param Ip4ModeData Pointer to the buffer to receive the current IPv4 - configuration data used by the TCPv4 instance. - @param MnpConfigData Pointer to the buffer to receive the current MNP - configuration data indirectly used by the TCPv4 - Instance. - @param SnpModeData Pointer to the buffer to receive the current SNP - configuration data indirectly used by the TCPv4 - Instance. - - @retval EFI_SUCCESS The mode data was read. - @retval EFI_NOT_STARTED No configuration data is available because this - instance hasn't been started. - @retval EFI_INVALID_PARAMETER This is NULL. - -**/ -EFI_STATUS -EFIAPI -Tcp4GetModeData ( - IN EFI_TCP4_PROTOCOL *This, - OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, - OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, - OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, - OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, - OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL - ); - - -/** - Initialize or brutally reset the operational parameters for - this EFI TCPv4 instance. - - The Configure() function does the following: - * Initialize this EFI TCPv4 instance, i.e., initialize the communication end - setting, specify active open or passive open for an instance. - * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous - tokens, flush transmission and receiving buffer directly without informing - the communication peer. - No other TCPv4 Protocol operation can be executed by this instance - until it is configured properly. For an active TCP4 instance, after a proper - configuration it may call Connect() to initiates the three-way handshake. - For a passive TCP4 instance, its state will transit to Tcp4StateListen after - configuration, and Accept() may be called to listen the incoming TCP connection - request. If TcpConfigData is set to NULL, the instance is reset. Resetting - process will be done brutally, the state machine will be set to Tcp4StateClosed - directly, the receive queue and transmit queue will be flushed, and no traffic is - allowed through this instance. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param TcpConfigData Pointer to the configure data to configure the - instance. - - @retval EFI_SUCCESS The operational settings are set, changed, or - reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED Configuring TCP instance when it is already - configured. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred. - @retval EFI_UNSUPPORTED One or more of the control options are not - supported in the implementation. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough system resources. - -**/ -EFI_STATUS -EFIAPI -Tcp4Configure ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL - ); - -/** - Add or delete routing entries. - - The Routes() function adds or deletes a route from the instance's routing table. - The most specific route is selected by comparing the SubnetAddress with the - destination IP address's arithmetical AND to the SubnetMask. - The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0. - The default route matches all destination IP addresses if there is no more specific route. - Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to - the destination host if its address can be found in the Address Resolution Protocol (ARP) - cache or it is on the local subnet. If the instance is configured to use default - address, a direct route to the local network will be added automatically. - Each TCP instance has its own independent routing table. Instance that uses the - default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table. - The copy will be updated automatically whenever the IP driver reconfigures its - instance. As a result, the previous modification to the instance's local copy - will be lost. The priority of checking the route table is specific with IP - implementation and every IP implementation must comply with RFC 1122. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param DeleteRoute If TRUE, delete the specified route from routing - table; if FALSE, add the specified route to - routing table. - DestinationAddress and SubnetMask are used as - the keywords to search route entry. - @param SubnetAddress The destination network. - @param SubnetMask The subnet mask for the destination network. - @param GatewayAddress The gateway address for this route. - It must be on the same subnet with the station - address unless a direct route is specified. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (through DHCP, BOOTP, RARP, etc.) is not - finished. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to add the - entry to the routing table. - @retval EFI_NOT_FOUND This route is not in the routing table. - @retval EFI_ACCESS_DENIED This route is already in the routing table. - @retval EFI_UNSUPPORTED The TCP driver does not support this operation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Routes ( - IN EFI_TCP4_PROTOCOL *This, - IN BOOLEAN DeleteRoute, - IN EFI_IPv4_ADDRESS *SubnetAddress, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *GatewayAddress - ); - -/** - Initiate a nonblocking TCP connection request for an active TCP instance. - - The Connect() function will initiate an active open to the remote peer configured - in current TCP instance if it is configured active. If the connection succeeds - or fails due to any error, the ConnectionToken->CompletionToken.Event will be - signaled and ConnectionToken->CompletionToken.Status will be updated accordingly. - This function can only be called for the TCP instance in Tcp4StateClosed state. - The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS. - If TCP three way handshake succeeds, its state will become Tcp4StateEstablished, - otherwise, the state will return to Tcp4StateClosed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ConnectionToken Pointer to the connection token to return when - the TCP three way handshake finishes. - - @retval EFI_SUCCESS The connection request is successfully initiated - and the state of this TCPv4 instance has - been changed to Tcp4StateSynSent. - @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instance is not configured as an active one - or it is not in Tcp4StateClosed state. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough resource to - initiate the active open. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - -**/ -EFI_STATUS -EFIAPI -Tcp4Connect ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken - ); - -/** - Listen on the passive instance to accept an incoming connection request. - - The Accept() function initiates an asynchronous accept request to wait for an - incoming connection on the passive TCP instance. If a remote peer successfully - establishes a connection with this instance, a new TCP instance will be created - and its handle will be returned in ListenToken->NewChildHandle. The newly created - instance is configured by inheriting the passive instance's configuration and is - ready for use upon return. The instance is in the Tcp4StateEstablished state. - The ListenToken->CompletionToken.Event will be signaled when a new connection - is accepted, user aborts the listen or connection is reset. This function only - can be called when current TCP instance is in Tcp4StateListen state. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param ListenToken Pointer to the listen token to return when - operation finishes. - - @retval EFI_SUCCESS The listen token has been queued successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is not - in Tcp4StateListen state or a same listen token - has already existed in the listen token queue of - this TCP instance. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to finish - the operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Accept ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_LISTEN_TOKEN *ListenToken - ); - -/** - Queues outgoing data into the transmit queue. - - The Transmit() function queues a sending request to this TCPv4 instance along - with the user data. The status of the token is updated and the event in the token - will be signaled once the data is sent out or some error occurs. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance - @param Token Pointer to the completion token to queue to the - transmit queue - - @retval EFI_SUCCESS The data has been queued for transmission. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A transmit completion token with the same - Token-> CompletionToken.Event was already in the - transmission queue. - * The current instance is in Tcp4StateClosed state - * The current instance is a passive one and - it is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_NOT_READY The completion token could not be queued because - the transmit queue is full. - @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data because of - resource shortage. - @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or - address. - -**/ -EFI_STATUS -EFIAPI -Tcp4Transmit ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ); - -/** - Place an asynchronous receive request into the receiving queue. - - The Receive() function places a completion token into the receive packet queue. - This function is always asynchronous. The caller must allocate the - Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also - must fill the DataLength which represents the whole length of all FragmentBuffer. - When the receive operation completes, the EFI TCPv4 Protocol driver updates the - Token->CompletionToken.Status and Token->Packet.RxData fields and the - Token->CompletionToken.Event is signaled. If got data the data and its length - will be copy into the FragmentTable, in the same time the full length of received - data will be recorded in the DataLength fields. Providing a proper notification - function and context for the event will enable the user to receive the notification - and receiving status. That notification function is guaranteed to not be re-entered. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that is associated with the - receive data descriptor. - - @retval EFI_SUCCESS The receive completion token was cached. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_NO_MAPPING When using a default address, configuration - (DHCP, BOOTP, RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued - due to a lack of system resources. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - The EFI TCPv4 Protocol instance has been reset - to startup defaults. - @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE: - * A receive completion token with the same - Token->CompletionToken.Event was already in - the receive queue. - * The current instance is in Tcp4StateClosed state. - * The current instance is a passive one and it - is in Tcp4StateListen state. - * User has called Close() to disconnect this - connection. - @retval EFI_CONNECTION_FIN The communication peer has closed the connection - and there is no any buffered data in the receive - buffer of this instance. - @retval EFI_NOT_READY The receive request could not be queued because - the receive queue is full. - -**/ -EFI_STATUS -EFIAPI -Tcp4Receive ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_IO_TOKEN *Token - ); - -/** - Disconnecting a TCP connection gracefully or reset a TCP connection. - - Initiate an asynchronous close token to TCP driver. After Close() is called, - any buffered transmission data will be sent by TCP driver and the current - instance will have a graceful close working flow described as RFC 793 if - AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP - driver to fast disconnect this connection. When the close operation completes - successfully the TCP instance is in Tcp4StateClosed state, all pending - asynchronous operation is signaled and any buffers used for TCP network traffic - is flushed. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param CloseToken Pointer to the close token to return when - operation finishes. - - @retval EFI_SUCCESS The operation completed successfully. - @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been - configured. - @retval EFI_ACCESS_DENIED One or more of the following are TRUE: - * Configure() has been called with TcpConfigData - set to NULL and this function has not returned. - * Previous Close() call on this instance has not - finished. - @retval EFI_INVALID_PARAMETER One ore more parameters are invalid. - @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to finish the - operation. - @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above - category error. - -**/ -EFI_STATUS -EFIAPI -Tcp4Close ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_CLOSE_TOKEN *CloseToken - ); - -/** - Abort an asynchronous connection, listen, transmission or receive request. - - The Cancel() function aborts a pending connection, listen, transmit or receive - request. If Token is not NULL and the token is in the connection, listen, - transmission or receive queue when it is being cancelled, its Token->Status - will be set to EFI_ABORTED and then Token->Event will be signaled. If the token - is not in one of the queues, which usually means that the asynchronous operation - has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token - issued by Connect(), Accept(), Transmit() and Receive()will be aborted. - NOTE: It has not been implemented currently. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - @param Token Pointer to a token that has been issued by - Connect(), Accept(), Transmit() or Receive(). If - NULL, all pending tokens issued by above four - functions will be aborted. - - @retval EFI_SUCCESS The asynchronous I/O request is aborted and Token->Event - is signaled. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_NOT_STARTED This instance hasn's been configured. - @retval EFI_NO_MAPPING When using the default address, configuration - (DHCP, BOOTP,RARP, etc.) hasn's finished yet. - @retval EFI_NOT_FOUND The asynchronous I/O request isn's found in the - transmission or receive queue. It has either - completed or wasn's issued by Transmit() and Receive(). - @retval EFI_UNSUPPORTED The operation is not supported in current - implementation. - -**/ -EFI_STATUS -EFIAPI -Tcp4Cancel ( - IN EFI_TCP4_PROTOCOL *This, - IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL - ); - -/** - Poll to receive incoming data and transmit outgoing segments. - - The Poll() function increases the rate that data is moved between the network - and application and can be called when the TCP instance is created successfully. - Its use is optional. In some implementations, the periodical timer in the MNP - driver may not poll the underlying communications device fast enough to avoid - drop packets. Drivers and applications that are experiencing packet loss should - try calling the Poll() function in a high frequency. - - @param This Pointer to the EFI_TCP4_PROTOCOL instance. - - @retval EFI_SUCCESS Incoming or outgoing data was processed. - @retval EFI_INVALID_PARAMETER This is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. - @retval EFI_NOT_READY No incoming or outgoing data was processed. - @retval EFI_TIMEOUT Data was dropped out of the transmission or - receive queue. Consider increasing the polling - rate. - -**/ -EFI_STATUS -EFIAPI -Tcp4Poll ( - IN EFI_TCP4_PROTOCOL *This - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h deleted file mode 100644 index f9782cb59801..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h +++ /dev/null @@ -1,130 +0,0 @@ -/** @file - Tcp option's routine header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_OPTION_H_ -#define _TCP4_OPTION_H_ - -/// -/// The structure to store the parse option value. -/// ParseOption only parse the options, don't process them. -/// -typedef struct _TCP_OPTION { - UINT8 Flag; ///< Flag such as TCP_OPTION_RCVD_MSS - UINT8 WndScale; ///< The WndScale received - UINT16 Mss; ///< The Mss received - UINT32 TSVal; ///< The TSVal field in a timestamp option - UINT32 TSEcr; ///< The TSEcr field in a timestamp option -} TCP_OPTION; - -// -// supported TCP option type and their length -// -#define TCP_OPTION_EOP 0 ///< End Of oPtion -#define TCP_OPTION_NOP 1 ///< No-Option. -#define TCP_OPTION_MSS 2 ///< Maximum Segment Size -#define TCP_OPTION_WS 3 ///< Window scale -#define TCP_OPTION_TS 8 ///< Timestamp -#define TCP_OPTION_MSS_LEN 4 ///< Length of MSS option -#define TCP_OPTION_WS_LEN 3 ///< Length of window scale option -#define TCP_OPTION_TS_LEN 10 ///< Length of timestamp option -#define TCP_OPTION_WS_ALIGNED_LEN 4 ///< Length of window scale option, aligned -#define TCP_OPTION_TS_ALIGNED_LEN 12 ///< Length of timestamp option, aligned - -// -// recommend format of timestamp window scale -// option for fast process. -// -#define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \ - (TCP_OPTION_NOP << 16) | \ - (TCP_OPTION_TS << 8) | \ - (TCP_OPTION_TS_LEN)) - -#define TCP_OPTION_WS_FAST ((TCP_OPTION_NOP << 24) | \ - (TCP_OPTION_WS << 16) | \ - (TCP_OPTION_WS_LEN << 8)) - -#define TCP_OPTION_MSS_FAST ((TCP_OPTION_MSS << 24) | (TCP_OPTION_MSS_LEN << 16)) - -// -// Other misc definations -// -#define TCP_OPTION_RCVD_MSS 0x01 -#define TCP_OPTION_RCVD_WS 0x02 -#define TCP_OPTION_RCVD_TS 0x04 -#define TCP_OPTION_MAX_WS 14 ///< Maxium window scale value -#define TCP_OPTION_MAX_WIN 0xffff ///< Max window size in TCP header - - -/** - Compute the window scale value according to the given buffer size. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - - @return The scale value. - -**/ -UINT8 -TcpComputeScale ( - IN TCP_CB *Tcb - ); - -/** - Build the TCP option in three-way handshake. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpSynBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Build the TCP option in synchronized states. - - @param Tcb Pointer to the TCP_CB of this TCP instance. - @param Nbuf Pointer to the buffer to store the options. - - @return The total length of the TCP option field. - -**/ -UINT16 -TcpBuildOption ( - IN TCP_CB *Tcb, - IN NET_BUF *Nbuf - ); - -/** - Parse the supported options. - - @param Tcp Pointer to the TCP_CB of this TCP instance. - @param Option Pointer to the TCP_OPTION used to store the successfully pasrsed - options. - - @retval 0 The options are successfully pasrsed. - @retval -1 Ilegal option was found. - -**/ -INTN -TcpParseOption ( - IN TCP_HEAD *Tcp, - IN OUT TCP_OPTION *Option - ); - - -#endif diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h deleted file mode 100644 index 37191fe65112..000000000000 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h +++ /dev/null @@ -1,357 +0,0 @@ -/** @file - Tcp Protocol header file. - -Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php<BR> - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _TCP4_PROTO_H_ -#define _TCP4_PROTO_H_ - -typedef struct _TCP_CB TCP_CB; - -#include "Tcp4Driver.h" -#include "Socket.h" -#include "Tcp4Option.h" - - - -/// -/// Tcp states, Don't change their order, it is used as -/// index to mTcpOutFlag and other macros -/// -#define TCP_CLOSED 0 -#define TCP_LISTEN 1 -#define TCP_SYN_SENT 2 -#define TCP_SYN_RCVD 3 -#define TCP_ESTABLISHED 4 -#define TCP_FIN_WAIT_1 5 -#define TCP_FIN_WAIT_2 6 -#define TCP_CLOSING 7 -#define TCP_TIME_WAIT 8 -#define TCP_CLOSE_WAIT 9 -#define TCP_LAST_ACK 10 - - -/// -/// Flags in the TCP header -/// -#define TCP_FLG_FIN 0x01 -#define TCP_FLG_SYN 0x02 -#define TCP_FLG_RST 0x04 -#define TCP_FLG_PSH 0x08 -#define TCP_FLG_ACK 0x10 -#define TCP_FLG_URG 0x20 - - // - // mask for all the flags - // -#define TCP_FLG_FLAG 0x3F - - -#define TCP_CONNECT_REFUSED (-1) ///< TCP error status -#define TCP_CONNECT_RESET (-2) ///< TCP error status -#define TCP_CONNECT_CLOSED (-3) ///< TCP error status - -// -// Current congestion status as suggested by RFC3782. -// -#define TCP_CONGEST_RECOVER 1 ///< During the NewReno fast recovery -#define TCP_CONGEST_LOSS 2 ///< Retxmit because of retxmit time out -#define TCP_CONGEST_OPEN 3 ///< TCP is opening its congestion window - -// -// TCP control flags -// -#define TCP_CTRL_NO_NAGLE 0x0001 ///< Disable Nagle algorithm -#define TCP_CTRL_NO_KEEPALIVE 0x0002 ///< Disable keepalive timer -#define TCP_CTRL_NO_WS 0x0004 ///< Disable window scale option -#define TCP_CTRL_RCVD_WS 0x0008 ///< Received a wnd scale option in syn -#define TCP_CTRL_NO_TS 0x0010 ///< Disable Timestamp option -#define TCP_CTRL_RCVD_TS 0x0020 ///< Received a Timestamp option in syn -#define TCP_CTRL_SND_TS 0x0040 ///< Send Timestamp option to remote -#define TCP_CTRL_SND_URG 0x0080 ///< In urgent send mode -#define TCP_CTRL_RCVD_URG 0x0100 ///< In urgent receive mode -#define TCP_CTRL_SND_PSH 0x0200 ///< In PUSH send mode -#define TCP_CTRL_FIN_SENT 0x0400 ///< FIN is sent -#define TCP_CTRL_FIN_ACKED 0x0800 ///< FIN is ACKed. -#define TCP_CTRL_TIMER_ON 0x1000 ///< At least one of the timer is on -#define TCP_CTRL_RTT_ON 0x2000 ///< The RTT measurement is on -#define TCP_CTRL_ACK_NOW 0x4000 ///< Send the ACK now, don't delay - -// -// Timer related values -// -#define TCP_TIMER_CONNECT 0 ///< Connection establishment timer -#define TCP_TIMER_REXMIT 1 ///< Retransmit timer -#define TCP_TIMER_PROBE 2 ///< Window probe timer -#define TCP_TIMER_KEEPALIVE 3 ///< Keepalive timer -#define TCP_TIMER_FINWAIT2 4 ///< FIN_WAIT_2 timer -#define TCP_TIMER_2MSL 5 ///< TIME_WAIT tiemr -#define TCP_TIMER_NUMBER 6 ///< The total number of TCP timer. -#define TCP_TICK 200 ///< Every TCP tick is 200ms -#define TCP_TICK_HZ 5 ///< The frequence of TCP tick -#define TCP_RTT_SHIFT 3 ///< SRTT & RTTVAR scaled by 8 -#define TCP_RTO_MIN TCP_TICK_HZ ///< The minium value of RTO -#define TCP_RTO_MAX (TCP_TICK_HZ * 60) ///< The maxium value of RTO -#define TCP_FOLD_RTT 4 ///< Timeout threshod to fold RTT - -// -// Default values for some timers -// -#define TCP_MAX_LOSS 12 ///< Default max times to retxmit -#define TCP_KEEPALIVE_IDLE_MIN (TCP_TICK_HZ * 60 * 60 * 2) ///< First keep alive -#define TCP_KEEPALIVE_PERIOD (TCP_TICK_HZ * 60) -#define TCP_MAX_KEEPALIVE 8 -#define TCP_FIN_WAIT2_TIME (2 * TCP_TICK_HZ) -#define TCP_TIME_WAIT_TIME (2 * TCP_TICK_HZ) -#define TCP_PAWS_24DAY (24 * 24 * 60 * 60 * TCP_TICK_HZ) -#define TCP_CONNECT_TIME (75 * TCP_TICK_HZ) - -// -// The header space to be reserved before TCP data to accomodate : -// 60byte IP head + 60byte TCP head + link layer head -// -#define TCP_MAX_HEAD 192 - -// -// Value ranges for some control option -// -#define TCP_RCV_BUF_SIZE (2 * 1024 * 1024) -#define TCP_RCV_BUF_SIZE_MIN (8 * 1024) -#define TCP_SND_BUF_SIZE (2 * 1024 * 1024) -#define TCP_SND_BUF_SIZE_MIN (8 * 1024) -#define TCP_BACKLOG 10 -#define TCP_BACKLOG_MIN 5 -#define TCP_MAX_LOSS_MIN 6 -#define TCP_CONNECT_TIME_MIN (60 * TCP_TICK_HZ) -#define TCP_MAX_KEEPALIVE_MIN 4 -#define TCP_KEEPALIVE_IDLE_MAX (TCP_TICK_HZ * 60 * 60 * 4) -#define TCP_KEEPALIVE_PERIOD_MIN (TCP_TICK_HZ * 30) -#define TCP_FIN_WAIT2_TIME_MAX (4 * TCP_TICK_HZ) -#define TCP_TIME_WAIT_TIME_MAX (60 * TCP_TICK_HZ) - -/// -/// TCP segmentation data -/// -typedef struct _TCP_SEG { - TCP_SEQNO Seq; ///< Starting sequence number - TCP_SEQNO End; ///< The sequence of the last byte + 1, include SYN/FIN. End-Seq = SEG.LEN - TCP_SEQNO Ack; ///< ACK field in the segment - UINT8 Flag; ///< TCP header flags - UINT16 Urg; ///< Valid if URG flag is set. - UINT32 Wnd; ///< TCP window size field -} TCP_SEG; - -/// -/// Network endpoint, IP+Port structure -/// -typedef struct _TCP_PEER { - UINT32 Ip; ///< IP address, network byte order - TCP_PORTNO Port; ///< Port number, network byte order -} TCP_PEER; - -/// -/// TCP control block, it includes various states -/// -struct _TCP_CB { - LIST_ENTRY List; ///< Back and forward link entry - TCP_CB *Parent; ///< The parent TCP_CB structure - - SOCKET *Sk; ///< The socket it controled. - TCP_PEER LocalEnd; ///< Local endpoint - TCP_PEER RemoteEnd;///< Remote endpoint - - LIST_ENTRY SndQue; ///< Retxmission queue - LIST_ENTRY RcvQue; ///< Reassemble queue - UINT32 CtrlFlag; ///< Control flags, such as NO_NAGLE - INT32 Error; ///< Soft error status, such as TCP_CONNECT_RESET - - // - // RFC793 and RFC1122 defined variables - // - UINT8 State; ///< TCP state, such as SYN_SENT, LISTEN - UINT8 DelayedAck; ///< Number of delayed ACKs - UINT16 HeadSum; ///< Checksum of the fixed parts of pesudo - ///< header: Src IP, Dst IP, 0, Protocol, - ///< not include the TCP length. - - TCP_SEQNO Iss; ///< Initial Sending Sequence - TCP_SEQNO SndUna; ///< First unacknowledged data - TCP_SEQNO SndNxt; ///< Next data sequence to send. - TCP_SEQNO SndPsh; ///< Send PUSH point - TCP_SEQNO SndUp; ///< Send urgent point - UINT32 SndWnd; ///< Window advertised by the remote peer - UINT32 SndWndMax; ///< Max send window advertised by the peer - TCP_SEQNO SndWl1; ///< Seq number used for last window update - TCP_SEQNO SndWl2; ///< Ack no of last window update - UINT16 SndMss; ///< Max send segment size - TCP_SEQNO RcvNxt; ///< Next sequence no to receive - UINT32 RcvWnd; ///< Window advertised by the local peer - TCP_SEQNO RcvWl2; ///< The RcvNxt (or ACK) of last window update. - ///< It is necessary because of delayed ACK - - TCP_SEQNO RcvUp; ///< Urgent point; - TCP_SEQNO Irs; ///< Initial Receiving Sequence - UINT16 RcvMss; ///< Max receive segment size - UINT16 EnabledTimer; ///< Which timer is currently enabled - UINT32 Timer[TCP_TIMER_NUMBER]; ///< When the timer will expire - INT32 NextExpire; ///< Count down offset for the nearest timer - UINT32 Idle; ///< How long the connection is in idle - UINT32 ProbeTime; ///< The time out value for current window prober - BOOLEAN ProbeTimerOn;///< If TRUE, the probe time is on. - - // - // RFC1323 defined variables, about window scale, - // timestamp and PAWS - // - UINT8 SndWndScale; ///< Wndscale received from the peer - UINT8 RcvWndScale; ///< Wndscale used to scale local buffer - UINT32 TsRecent; ///< TsRecent to echo to the remote peer - UINT32 TsRecentAge; ///< When this TsRecent is updated - - // - // RFC2988 defined variables. about RTT measurement - // - TCP_SEQNO RttSeq; ///< The seq of measured segment now - UINT32 RttMeasure; ///< Currently measured RTT in heart beats - UINT32 SRtt; ///< Smoothed RTT, scaled by 8 - UINT32 RttVar; ///< RTT variance, scaled by 8 - UINT32 Rto; ///< Current RTO, not scaled - - // - // RFC2581, and 3782 variables. - // Congestion control + NewReno fast recovery. - // - UINT32 CWnd; ///< Sender's congestion window - UINT32 Ssthresh; ///< Slow start threshold. - TCP_SEQNO Recover; ///< Recover point for NewReno - UINT16 DupAck; ///< Number of duplicate ACKs - UINT8 CongestState; ///< The current congestion state(RFC3782) - UINT8 LossTimes; ///< Number of retxmit timeouts in a row - TCP_SEQNO LossRecover; ///< Recover point for retxmit - - // - // configuration parameters, for EFI_TCP4_PROTOCOL specification - // - UINT32 KeepAliveIdle; ///< Idle time before sending first probe - UINT32 KeepAlivePeriod; ///< Interval for subsequent keep alive probe - UINT8 MaxKeepAlive; ///< Maxium keep alive probe times. - UINT8 KeepAliveProbes; ///< The number of keep alive probe. - UINT16 MaxRexmit; ///< The maxium number of retxmit before abort - UINT32 FinWait2Timeout; ///< The FIN_WAIT_2 time out - UINT32 TimeWaitTimeout; ///< The TIME_WAIT time out - UINT32 ConnectTimeout; ///< The connect establishment time out - - // - // RFC7323 - // Addressing Window Retraction for TCP Window Scale Option. - // - TCP_SEQNO RetxmitSeqMax; ///< Max Seq number in previous retransmission. - - // - // configuration for tcp provided by user - // - BOOLEAN UseDefaultAddr; - UINT8 Tos; - UINT8 Ttl; - EFI_IPv4_ADDRESS SubnetMask; - - IP_IO_IP_INFO *IpInfo; ///<pointer reference to Ip used to send pkt -}; - -extern LIST_ENTRY mTcpRunQue; -extern LIST_ENTRY mTcpListenQue; -extern TCP_SEQNO mTcpGlobalIss; -extern UINT32 mTcpTick; - -/// -/// TCP_CONNECTED: both ends have synchronized their ISN. -/// -#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD) - -#define TCP_FIN_RCVD(State) \ - (((State) == TCP_CLOSE_WAIT) || \ - ((State) == TCP_LAST_ACK) || \ - ((State) == TCP_CLOSING) || \ - ((State) == TCP_TIME_WAIT)) - -#define TCP_LOCAL_CLOSED(State) \ - (((State) == TCP_FIN_WAIT_1) || \ - ((State) == TCP_FIN_WAIT_2) || \ - ((State) == TCP_CLOSING) || \ - ((State) == TCP_TIME_WAIT) || \ - ((State) == TCP_LAST_ACK)) - -// -// Get the TCP_SEG point from a net buffer's ProtoData -// -#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData)) - -// -// macros to compare sequence no -// -#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0) -#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0) -#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0) -#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0) - -// -// TCP_SEQ_BETWEEN return whether b <= m <= e -// -#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b)) - -// -// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2 -// -#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2))) - -// -// Check whether Flag is on -// -#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != 0)) - -// -// Set and Clear operation on a Flag -// -#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag)) -#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag)) - -// -// Test whether two peers are equal -// -#define TCP_PEER_EQUAL(Pa, Pb) \ - (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port)) - -// -// Test whether Pa matches Pb, or Pa is more specific -// than pb. Zero means wildcard. -// -#define TCP_PEER_MATCH(Pa, Pb) \ - ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \ - (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port))) - -#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer))) -#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 << (Timer)))) -#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 << (Timer))))) - -#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0) -#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0) -#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb))) - -#define TCP_MAX_WIN 0xFFFFU - -typedef -VOID -(*TCP_TIMER_HANDLER) ( - IN OUT TCP_CB *Tcb - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h deleted file mode 100644 index d8336c5e82e9..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h +++ /dev/null @@ -1,502 +0,0 @@ -/** @file - Dhcp and Discover routines for PxeBc. - -Copyright (c) 2013, Red Hat, Inc. -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_DHCP_H__ -#define __EFI_PXEBC_DHCP_H__ - -#define PXEBC_DHCP4_MAX_OPTION_NUM 16 -#define PXEBC_DHCP4_MAX_OPTION_SIZE 312 -#define PXEBC_DHCP4_MAX_PACKET_SIZE (sizeof (EFI_PXE_BASE_CODE_PACKET)) - -#define PXEBC_DHCP4_S_PORT 67 -#define PXEBC_DHCP4_C_PORT 68 -#define PXEBC_BS_DOWNLOAD_PORT 69 -#define PXEBC_BS_DISCOVER_PORT 4011 - -#define PXEBC_DHCP4_OPCODE_REQUEST 1 -#define PXEBC_DHCP4_OPCODE_REPLY 2 -#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3 -#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order - -// -// Sub-Options in Dhcp Vendor Option -// -#define PXEBC_VENDOR_TAG_MTFTP_IP 1 -#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2 -#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3 -#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4 -#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5 -#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6 -#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7 -#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8 -#define PXEBC_VENDOR_TAG_BOOT_MENU 9 -#define PXEBC_VENDOR_TAG_MENU_PROMPT 10 -#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11 -#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12 -#define PXEBC_VENDOR_TAG_BOOT_ITEM 71 - -#define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT 4 -#define PXEBC_DHCP4_DISCOVER_RETRIES 4 - -#define PXEBC_MAX_MENU_NUM 24 -#define PXEBC_MAX_OFFER_NUM 16 - -#define PXEBC_BOOT_REQUEST_TIMEOUT 1 -#define PXEBC_BOOT_REQUEST_RETRIES 4 - -#define PXEBC_DHCP4_OVERLOAD_FILE 1 -#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2 - -// -// The array index of the DHCP4 option tag interested -// -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0 -#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1 -#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2 -#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3 -#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4 -#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5 -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6 -#define PXEBC_DHCP4_TAG_INDEX_MAX 7 - -// -// The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority. -// -#define DHCP4_PACKET_TYPE_PXE10 0 -#define DHCP4_PACKET_TYPE_WFM11A 1 -#define DHCP4_PACKET_TYPE_BINL 2 -#define DHCP4_PACKET_TYPE_DHCP_ONLY 3 -#define DHCP4_PACKET_TYPE_BOOTP 4 -#define DHCP4_PACKET_TYPE_MAX 5 - -#define BIT(x) (1 << x) -#define CTRL(x) (0x1F & (x)) - -// -// WfM11a options -// -#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \ - BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY)) -// -// Discoverty options -// -#define DISCOVER_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \ - BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \ - BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \ - BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \ - BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) - -#define IS_VALID_BOOT_PROMPT(x) \ - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) - -#define IS_VALID_BOOT_MENU(x) \ - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) - -#define IS_VALID_MTFTP_VENDOR_OPTION(x) \ - (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == MTFTP_VENDOR_OPTION_BIT_MAP) - -#define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0) - -#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \ - (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) - -#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \ - (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \ - == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) - -#define IS_DISABLE_BCAST_DISCOVER(x) (((x) & BIT (0)) == BIT (0)) -#define IS_DISABLE_MCAST_DISCOVER(x) (((x) & BIT (1)) == BIT (1)) -#define IS_ENABLE_USE_SERVER_LIST(x) (((x) & BIT (2)) == BIT (2)) -#define IS_DISABLE_PROMPT_MENU(x) (((x) & BIT (3)) == BIT (3)) - -#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) / 32]) | BIT ((y) % 32)) - -#pragma pack(1) -typedef struct { - UINT8 ParaList[135]; -} PXEBC_DHCP4_OPTION_PARA; - -typedef struct { - UINT16 Size; -} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE; - -typedef struct { - UINT8 Type; - UINT8 MajorVer; - UINT8 MinorVer; -} PXEBC_DHCP4_OPTION_UNDI; - -typedef struct { - UINT8 Type; -} PXEBC_DHCP4_OPTION_MESG; - -typedef struct { - UINT16 Type; -} PXEBC_DHCP4_OPTION_ARCH; - -#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000" -#define DEFAULT_UNDI_TYPE 1 -#define DEFAULT_UNDI_MAJOR 3 -#define DEFAULT_UNDI_MINOR 0 - -typedef struct { - UINT8 ClassIdentifier[10]; - UINT8 ArchitecturePrefix[5]; - UINT8 ArchitectureType[5]; - UINT8 Lit3[1]; - UINT8 InterfaceName[4]; - UINT8 Lit4[1]; - UINT8 UndiMajor[3]; - UINT8 UndiMinor[3]; -} PXEBC_DHCP4_OPTION_CLID; - -typedef struct { - UINT8 Type; - UINT8 Guid[16]; -} PXEBC_DHCP4_OPTION_UUID; - -typedef struct { - UINT16 Type; - UINT16 Layer; -} PXEBC_OPTION_BOOT_ITEM; - -#pragma pack() - -typedef union { - PXEBC_DHCP4_OPTION_PARA *Para; - PXEBC_DHCP4_OPTION_UNDI *Undi; - PXEBC_DHCP4_OPTION_ARCH *Arch; - PXEBC_DHCP4_OPTION_CLID *Clid; - PXEBC_DHCP4_OPTION_UUID *Uuid; - PXEBC_DHCP4_OPTION_MESG *Mesg; - PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize; -} PXEBC_DHCP4_OPTION_ENTRY; - -typedef struct { - UINT16 Type; - UINT8 IpCnt; - EFI_IPv4_ADDRESS IpAddr[1]; -} PXEBC_BOOT_SVR_ENTRY; - -typedef struct { - UINT16 Type; - UINT8 DescLen; - UINT8 DescStr[1]; -} PXEBC_BOOT_MENU_ENTRY; - -typedef struct { - UINT8 Timeout; - UINT8 Prompt[1]; -} PXEBC_MENU_PROMPT; - -typedef struct { - UINT32 BitMap[8]; - EFI_IPv4_ADDRESS MtftpIp; - UINT16 MtftpCPort; - UINT16 MtftpSPort; - UINT8 MtftpTimeout; - UINT8 MtftpDelay; - UINT8 DiscoverCtrl; - EFI_IPv4_ADDRESS DiscoverMcastIp; - EFI_IPv4_ADDRESS McastIpBase; - UINT16 McastIpBlock; - UINT16 McastIpRange; - UINT16 BootSrvType; - UINT16 BootSrvLayer; - PXEBC_BOOT_SVR_ENTRY *BootSvr; - UINT8 BootSvrLen; - PXEBC_BOOT_MENU_ENTRY *BootMenu; - UINT8 BootMenuLen; - PXEBC_MENU_PROMPT *MenuPrompt; - UINT8 MenuPromptLen; - UINT32 *CredType; - UINT8 CredTypeLen; -} PXEBC_VENDOR_OPTION; - -#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE) - -typedef union { - EFI_DHCP4_PACKET Offer; - EFI_DHCP4_PACKET Ack; - UINT8 Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE]; -} PXEBC_DHCP4_PACKET; - -typedef struct { - PXEBC_DHCP4_PACKET Packet; - BOOLEAN IsPxeOffer; - UINT8 OfferType; - EFI_DHCP4_PACKET_OPTION *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX]; - PXEBC_VENDOR_OPTION PxeVendorOption; -} PXEBC_CACHED_DHCP4_PACKET; - -#define GET_NEXT_DHCP_OPTION(Opt) \ - (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1) - -#define GET_OPTION_BUFFER_LEN(Pkt) ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4) -#define IS_PROXY_DHCP_OFFER(Offer) EFI_IP4_EQUAL (&((Offer)->Dhcp4.Header.YourAddr), &mZeroIp4Addr) - -#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \ - (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS)) - - -/** - This function initialize the DHCP4 message instance. - - This function will pad each item of dhcp4 message packet. - - @param Seed Pointer to the message instance of the DHCP4 packet. - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - -**/ -VOID -PxeBcInitSeedPacket ( - IN EFI_DHCP4_PACKET *Seed, - IN EFI_UDP4_PROTOCOL *Udp4 - ); - - -/** - Parse the cached dhcp packet. - - @param CachedPacket Pointer to cached dhcp packet. - - @retval TRUE Succeed to parse and validation. - @retval FALSE Fail to parse or validation. - -**/ -BOOLEAN -PxeBcParseCachedDhcpPacket ( - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket - ); - -/** - This function is to check the selected proxy offer (include BINL dhcp offer and - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code - mode structure. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Operational successful. - @retval EFI_NO_RESPONSE Offer dhcp service failed. - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base code mode. - -**/ -EFI_STATUS -PxeBcCheckSelectedOffer ( - IN PXEBC_PRIVATE_DATA *Private - ); - - -/** - Callback routine. - - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver - to intercept events that occurred in the configuration process. This structure - provides advanced control of each state transition of the DHCP process. The - returned status code determines the behavior of the EFI DHCPv4 Protocol driver. - There are three possible returned values, which are described in the following - table. - - @param This Pointer to the EFI DHCPv4 Protocol instance that is used to - configure this callback function. - @param Context Pointer to the context that is initialized by - EFI_DHCP4_PROTOCOL.Configure(). - @param CurrentState The current operational state of the EFI DHCPv4 Protocol - driver. - @param Dhcp4Event The event that occurs in the current state, which usually means a - state transition. - @param Packet The DHCP packet that is going to be sent or already received. - @param NewPacket The packet that is used to replace the above Packet. - - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue the DHCP process. - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol - driver will continue to wait for more DHCPOFFER packets until the retry - timeout expires. - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and - return to the Dhcp4Init or Dhcp4InitReboot state. - -**/ -EFI_STATUS -EFIAPI -PxeBcDhcpCallBack ( - IN EFI_DHCP4_PROTOCOL * This, - IN VOID *Context, - IN EFI_DHCP4_STATE CurrentState, - IN EFI_DHCP4_EVENT Dhcp4Event, - IN EFI_DHCP4_PACKET * Packet OPTIONAL, - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL - ); - -/** - Switch the Ip4 policy to static. - - @param[in] Private The pointer to PXEBC_PRIVATE_DATA. - - @retval EFI_SUCCESS The policy is already configured to static. - @retval Others Other error as indicated.. - -**/ -EFI_STATUS -PxeBcSetIp4Policy ( - IN PXEBC_PRIVATE_DATA *Private - ); - -/** - Discover the boot of service and initialize the vendor option if exists. - - @param Private Pointer to PxeBc private data. - @param Type PxeBc option boot item type - @param Layer PxeBc option boot item layer - @param UseBis Use BIS or not - @param DestIp Ip address for server - @param IpCount The total count of the server ip address - @param SrvList Server list - @param IsDiscv Discover the vendor or not - @param Reply The dhcp4 packet of Pxe reply - - @retval EFI_SUCCESS Operation succeeds. - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed. - @retval EFI_NOT_FOUND There is no vendor option exists. - @retval EFI_TIMEOUT Send Pxe Discover time out. - -**/ -EFI_STATUS -PxeBcDiscvBootService ( - IN PXEBC_PRIVATE_DATA * Private, - IN UINT16 Type, - IN UINT16 *Layer, - IN BOOLEAN UseBis, - IN EFI_IP_ADDRESS * DestIp, - IN UINT16 IpCount, - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList, - IN BOOLEAN IsDiscv, - OUT EFI_DHCP4_PACKET * Reply OPTIONAL - ); - - -/** - Initialize the DHCP options and build the option list. - - @param Private Pointer to PxeBc private data. - @param OptList Pointer to a DHCP option list. - - @param IsDhcpDiscover Discover dhcp option or not. - - @return The index item number of the option list. - -**/ -UINT32 -PxeBcBuildDhcpOptions ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_DHCP4_PACKET_OPTION **OptList, - IN BOOLEAN IsDhcpDiscover - ); - - -/** - Create the boot options. - - @param OptList Pointer to the list of the options - @param Type the type of option - @param Layer the layer of the boot options - @param OptLen length of opotion - -**/ -VOID -PxeBcCreateBootOptions ( - IN EFI_DHCP4_PACKET_OPTION *OptList, - IN UINT16 Type, - IN UINT16 *Layer, - OUT UINT32 *OptLen - ); - - -/** - Parse interested dhcp options. - - @param Buffer Pointer to the dhcp options packet. - @param Length The length of the dhcp options. - @param OptTag The option OpCode. - - @return NULL if the buffer length is 0 and OpCode is not - DHCP4_TAG_EOP, or the pointer to the buffer. - -**/ -EFI_DHCP4_PACKET_OPTION * -PxeBcParseExtendOptions ( - IN UINT8 *Buffer, - IN UINT32 Length, - IN UINT8 OptTag - ); - - -/** - This function is to parse and check vendor options. - - @param Dhcp4Option Pointer to dhcp options - @param VendorOption Pointer to vendor options - - @return TRUE if valid for vendor options, or FALSE. - -**/ -BOOLEAN -PxeBcParseVendorOptions ( - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option, - IN PXEBC_VENDOR_OPTION *VendorOption - ); - - -/** - Choose the boot prompt. - - @param Private Pointer to PxeBc private data. - - @retval EFI_SUCCESS Select boot prompt done. - @retval EFI_TIMEOUT Select boot prompt time out. - @retval EFI_NOT_FOUND The proxy offer is not Pxe10. - @retval EFI_ABORTED User cancel the operation. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootPrompt ( - IN PXEBC_PRIVATE_DATA *Private - ); - - -/** - Select the boot menu. - - @param Private Pointer to PxeBc private data. - @param Type The type of the menu. - @param UseDefaultItem Use default item or not. - - @retval EFI_ABORTED User cancel operation. - @retval EFI_SUCCESS Select the boot menu success. - @retval EFI_NOT_READY Read the input key from the keybroad has not finish. - -**/ -EFI_STATUS -PxeBcSelectBootMenu ( - IN PXEBC_PRIVATE_DATA *Private, - OUT UINT16 *Type, - IN BOOLEAN UseDefaultItem - ); - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h deleted file mode 100644 index b7bf069dd637..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h +++ /dev/null @@ -1,102 +0,0 @@ -/** @file - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_DRIVER_H__ -#define __EFI_PXEBC_DRIVER_H__ - -/** - Test to see if this driver supports ControllerHandle. This service - is called by the EFI boot service ConnectController(). In - order to make drivers as small as possible, there are a few calling - restrictions for this service. ConnectController() must - follow these calling restrictions. If any other agent wishes to call - Supported() it must also follow these calling restrictions. - PxeBc requires DHCP4 and MTFTP4 protocols. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to test - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver supports this device - @retval EFI_ALREADY_STARTED This driver is already running on this device - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -/** - Start this driver on ControllerHandle. This service is called by the - EFI boot service ConnectController(). In order to make - drivers as small as possible, there are a few calling restrictions for - this service. ConnectController() must follow these - calling restrictions. If any other agent wishes to call Start() it - must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to bind driver to - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver is added to ControllerHandle - @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle - @retval other This driver does not support this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStart ( - IN EFI_DRIVER_BINDING_PROTOCOL * This, - IN EFI_HANDLE ControllerHandle, - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL - ); - -/** - Stop this driver on ControllerHandle. This service is called by the - EFI boot service DisconnectController(). In order to - make drivers as small as possible, there are a few calling - restrictions for this service. DisconnectController() - must follow these calling restrictions. If any other agent wishes - to call Stop() it must also follow these calling restrictions. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed ControllerHandle - @retval other This driver was not removed from this device - -**/ -EFI_STATUS -EFIAPI -PxeBcDriverBindingStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ); - -extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2; -extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName; -extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding; - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h deleted file mode 100644 index e96b6f2c5d14..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h +++ /dev/null @@ -1,189 +0,0 @@ -/** @file - -Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_IMPL_H__ -#define __EFI_PXEBC_IMPL_H__ - - -typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA; - -#include <Uefi.h> - -#include <Guid/SmBios.h> -#include <IndustryStandard/SmBios.h> -#include <IndustryStandard/Dhcp.h> -#include <Protocol/Dhcp4.h> -#include <Protocol/PxeBaseCode.h> -#include <Protocol/Mtftp4.h> -#include <Protocol/Udp4.h> -#include <Protocol/LoadFile.h> -#include <Protocol/NetworkInterfaceIdentifier.h> -#include <Protocol/PxeBaseCodeCallBack.h> -#include <Protocol/Arp.h> -#include <Protocol/Ip4.h> -#include <Protocol/Ip4Config2.h> - -#include <Library/DebugLib.h> -#include <Library/DevicePathLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> -#include <Library/BaseLib.h> -#include <Library/NetLib.h> -#include <Library/DpcLib.h> -#include <Library/PcdLib.h> - -#include "PxeBcDriver.h" -#include "PxeBcDhcp.h" -#include "PxeBcMtftp.h" -#include "PxeBcSupport.h" - -#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P') -#define PXEBC_MTFTP_TIMEOUT 4 -#define PXEBC_MTFTP_RETRIES 6 -#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE 8 -#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE 4 -#define PXEBC_DEFAULT_PACKET_SIZE 1480 -#define PXEBC_DEFAULT_LIFETIME 50000 // 50ms, unit is microsecond -#define PXEBC_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20) - -struct _PXEBC_PRIVATE_DATA { - UINT32 Signature; - EFI_HANDLE Controller; - EFI_HANDLE Image; - EFI_HANDLE ArpChild; - EFI_HANDLE Dhcp4Child; - EFI_HANDLE Ip4Child; - EFI_HANDLE Mtftp4Child; - EFI_HANDLE Udp4ReadChild; - EFI_HANDLE Udp4WriteChild; - - EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii; - - EFI_PXE_BASE_CODE_PROTOCOL PxeBc; - EFI_LOAD_FILE_PROTOCOL LoadFile; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback; - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback; - EFI_ARP_PROTOCOL *Arp; - EFI_DHCP4_PROTOCOL *Dhcp4; - EFI_IP4_PROTOCOL *Ip4; - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2; - EFI_IP4_CONFIG_DATA Ip4ConfigData; - EFI_MTFTP4_PROTOCOL *Mtftp4; - EFI_UDP4_PROTOCOL *Udp4Read; - EFI_UDP4_PROTOCOL *Udp4Write; - UINT16 CurrentUdpSrcPort; - EFI_UDP4_CONFIG_DATA Udp4CfgData; - - - EFI_PXE_BASE_CODE_MODE Mode; - EFI_PXE_BASE_CODE_FUNCTION Function; - - CHAR8 *BootFileName; - - EFI_IP_ADDRESS StationIp; - EFI_IP_ADDRESS SubnetMask; - EFI_IP_ADDRESS GatewayIp; - EFI_IP_ADDRESS ServerIp; - BOOLEAN AddressIsOk; - UINT32 Ip4MaxPacketSize; - UINTN BlockSize; - UINTN FileSize; - - UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE]; - EFI_DHCP4_PACKET SeedPacket; - EFI_MAC_ADDRESS Mac; - UINT8 MacLen; - - BOOLEAN SortOffers; - BOOLEAN GotProxyOffer; - UINT32 NumOffers; - UINT32 SelectedOffer; - UINT32 ProxyOfferType; - - // - // Cached packets as complements of pxe mode data - // - PXEBC_CACHED_DHCP4_PACKET ProxyOffer; - PXEBC_CACHED_DHCP4_PACKET Dhcp4Ack; - PXEBC_CACHED_DHCP4_PACKET PxeReply; - PXEBC_CACHED_DHCP4_PACKET Dhcp4Offers[PXEBC_MAX_OFFER_NUM]; - - // - // Arrays for different types of offers: - // ServerCount records the count of the servers we got the offers, - // OfferIndex records the index of the offer sent by the server indexed by ServerCount. - // - UINT32 ServerCount[DHCP4_PACKET_TYPE_MAX]; - UINT32 OfferIndex[DHCP4_PACKET_TYPE_MAX][PXEBC_MAX_OFFER_NUM]; - UINT32 BootpIndex; - UINT32 ProxyIndex[DHCP4_PACKET_TYPE_MAX]; - UINT32 BinlIndex[PXEBC_MAX_OFFER_NUM]; - - EFI_EVENT GetArpCacheEvent; - // - // token and event used to get ICMP error data from IP - // - EFI_IP4_COMPLETION_TOKEN IcmpErrorRcvToken; -}; - -#define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a, PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE) - -#define PXEBC_PRIVATE_DATA_FROM_LOADFILE(a) CR (a, PXEBC_PRIVATE_DATA, LoadFile, PXEBC_PRIVATE_DATA_SIGNATURE) - -#define PXEBC_PRIVATE_DATA_FROM_PXEBCCALLBACK(a) CR (a, PXEBC_PRIVATE_DATA, PxeBcCallback, PXEBC_PRIVATE_DATA_SIGNATURE) - -extern EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate; -extern EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate; - -/** - Causes the driver to load a specified file. - - @param This Protocol instance pointer. - @param FilePath The device specific path of the file to load. - @param BootPolicy If TRUE, indicates that the request originates from the - boot manager is attempting to load FilePath as a boot - selection. If FALSE, then FilePath must match as exact file - to be loaded. - @param BufferSize On input the size of Buffer in bytes. On output with a return - code of EFI_SUCCESS, the amount of data transferred to - Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL, - the size of Buffer required to retrieve the requested file. - @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL, - then no the size of the requested file is returned in - BufferSize. - - @retval EFI_SUCCESS The file was loaded. - @retval EFI_UNSUPPORTED The device does not support the provided BootPolicy - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or - BufferSize is NULL. - @retval EFI_NO_MEDIA No medium was present to load the file. - @retval EFI_DEVICE_ERROR The file was not loaded due to a device error. - @retval EFI_NO_RESPONSE The remote system did not respond. - @retval EFI_NOT_FOUND The file was not found. - @retval EFI_ABORTED The file load process was manually cancelled. - -**/ -EFI_STATUS -EFIAPI -EfiPxeLoadFile ( - IN EFI_LOAD_FILE_PROTOCOL * This, - IN EFI_DEVICE_PATH_PROTOCOL * FilePath, - IN BOOLEAN BootPolicy, - IN OUT UINTN *BufferSize, - IN VOID *Buffer OPTIONAL - ); - -#endif diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h deleted file mode 100644 index 903dd4fbb69a..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h +++ /dev/null @@ -1,137 +0,0 @@ -/** @file - Mtftp routines for PxeBc. - -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_MTFTP_H__ -#define __EFI_PXEBC_MTFTP_H__ - -#define PXE_MTFTP_OPTION_BLKSIZE_INDEX 0 -#define PXE_MTFTP_OPTION_TIMEOUT_INDEX 1 -#define PXE_MTFTP_OPTION_TSIZE_INDEX 2 -#define PXE_MTFTP_OPTION_MULTICAST_INDEX 3 -#define PXE_MTFTP_OPTION_MAXIMUM_INDEX 4 - -#define PXE_MTFTP_ERROR_STRING_LENGTH 127 -#define PXE_MTFTP_OPTBUF_MAXNUM_INDEX 128 - - -/** - This function is to get size of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Get the size of file success - @retval EFI_NOT_FOUND Parse the tftp ptions failed. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval Other Has not get the size of the file. - -**/ -EFI_STATUS -PxeBcTftpGetFileSize ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN OUT UINT64 *BufferSize - ); - - -/** - This function is to get data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - @param DontUseBuffer Indicate whether with a receive buffer - - @retval EFI_SUCCESS Read the data success from the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Read data from file failed. - -**/ -EFI_STATUS -PxeBcTftpReadFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ); - - -/** - This function is put data of a file by Tftp. - - @param Private Pointer to PxeBc private data - @param Config Pointer to Mtftp configuration data - @param Filename Pointer to file name - @param Overwrite Indicate whether with overwrite attribute - @param BlockSize Pointer to block size - @param BufferPtr Pointer to buffer - @param BufferSize Pointer to buffer size - - @retval EFI_SUCCESS Write the data success into the special file. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Write data into file failed. - -**/ -EFI_STATUS -PxeBcTftpWriteFile ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN BOOLEAN Overwrite, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize - ); - - -/** - This function is to get data(file) from a directory(may be a server) by Tftp. - - @param Private Pointer to PxeBc private data. - @param Config Pointer to Mtftp configuration data. - @param Filename Pointer to file name. - @param BlockSize Pointer to block size. - @param BufferPtr Pointer to buffer. - @param BufferSize Pointer to buffer size. - @param DontUseBuffer Indicate whether with a receive buffer. - - @retval EFI_SUCCES Get the data from the file included in directory success. - @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. - @retval other Operation failed. - -**/ -EFI_STATUS -PxeBcTftpReadDirectory ( - IN PXEBC_PRIVATE_DATA *Private, - IN EFI_MTFTP4_CONFIG_DATA *Config, - IN UINT8 *Filename, - IN UINTN *BlockSize, - IN UINT8 *BufferPtr, - IN OUT UINT64 *BufferSize, - IN BOOLEAN DontUseBuffer - ); - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h deleted file mode 100644 index a28c9740c171..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h +++ /dev/null @@ -1,134 +0,0 @@ -/** @file - Support routines for PxeBc. -Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __EFI_PXEBC_SUPPORT_H__ -#define __EFI_PXEBC_SUPPORT_H__ - - -/** - The common notify function associated with various PxeBc events. - - @param Event The event signaled. - @param Context The context. - -**/ -VOID -EFIAPI -PxeBcCommonNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ); - - -/** - This function initialize(or configure) the Udp4Write instance. - - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. - @param StationIp Pointer to the station ip address. - @param SubnetMask Pointer to the subnetmask of the station ip address. - @param Gateway Pointer to the gateway ip address. - @param SrcPort Pointer to the srouce port of the station. - @param Ttl The time to live field of the IP header. - @param ToS The type of service field of the IP header. - - @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully. - @retval EFI_NO_MAPPING When using a default address, configuration (DHCP, BOOTP, - RARP, etc.) is not finished yet. - @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE: - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already started/configured - and must be stopped/reset before it can be reconfigured. - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE - and UdpConfigData.StationPort is already used by - other instance. - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot allocate memory for this - EFI UDPv4 Protocol instance. - @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance - was not opened. - @retval Others Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. - -**/ -EFI_STATUS -PxeBcConfigureUdpWriteInstance ( - IN EFI_UDP4_PROTOCOL *Udp4, - IN EFI_IPv4_ADDRESS *StationIp, - IN EFI_IPv4_ADDRESS *SubnetMask, - IN EFI_IPv4_ADDRESS *Gateway, - IN OUT UINT16 *SrcPort, - IN UINT8 Ttl, - IN UINT8 ToS - ); - - -/** - This function is to display the IPv4 address. - - @param[in] Ip The pointer to the IPv4 address. - -**/ -VOID -PxeBcShowIp4Addr ( - IN EFI_IPv4_ADDRESS *Ip - ); - - -/** - Convert number to ASCII value. - - @param Number Numeric value to convert to decimal ASCII value. - @param Buffer Buffer to place ASCII version of the Number. - @param Length Length of Buffer. - -**/ -VOID -CvtNum ( - IN UINTN Number, - IN UINT8 *Buffer, - IN UINTN Length - ); - - -/** - Convert unsigned int number to decimal number. - - @param Number The unsigned int number will be converted. - @param Buffer Pointer to the buffer to store the decimal number after transform. - @param[in] BufferSize The maxsize of the buffer. - - @return the length of the number after transform. - -**/ -UINTN -UtoA10 ( - IN UINTN Number, - IN CHAR8 *Buffer, - IN UINTN BufferSize - - ); - - -/** - Convert ASCII numeric string to a UINTN value. - - @param Buffer Pointer to the 8-byte unsigned int value. - - @return UINTN value of the ASCII string. - -**/ -UINT64 -AtoU64 ( - IN UINT8 *Buffer - ); - - -#endif - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni deleted file mode 100644 index e97c3cadd973..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni +++ /dev/null @@ -1,25 +0,0 @@ -// /** @file -// This module produces EFI Preboot Execution Environment (PXE) Base Code Protocol. -// -// This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and IPv4 -// network stack, used to control PXE-compatible devices. It produces EFI Load File -// Protocol to provide one clean way to otain control from the boot manager if the -// boot patch is from the remote device. -// -// Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - - -#string STR_MODULE_ABSTRACT #language en-US "Produces EFI Preboot Execution Environment (PXE) Base Code Protocol" - -#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI PXE Base Code Protocol upon the EFI MMP Protocol and the IPv4 network stack, and is used to control PXE-compatible devices. It produces the EFI Load File Protocol to provide a clean method to obtain control from the boot manager if the boot patch is from the remote device." - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni deleted file mode 100644 index 2c1bda1a8bd2..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni +++ /dev/null @@ -1,20 +0,0 @@ -// /** @file -// UefiPxe4BcDxe Localized Strings and Content -// -// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR> -// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -#string STR_PROPERTIES_MODULE_NAME -#language en-US -"UEFI PXE Base Code DXE Driver" - - diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf deleted file mode 100644 index 042401992945..000000000000 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf +++ /dev/null @@ -1,102 +0,0 @@ -## @file -# This module produces EFI Preboot Execution Environment (PXE) Base Code Protocol. -# -# This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and IPv4 -# network stack, used to control PXE-compatible devices. It produces EFI Load File -# Protocol to provide one clean way to otain control from the boot manager if the -# boot patch is from the remote device. This driver only supports IPv4 network stack. -# -# Notes: -# 1) This driver can't co-work with the UefiPxeBcDxe driver in NetworkPkg. -# 2) This driver might have some issues that have been fixed in the UefiPxeBcDxe -# driver in NetworkPkg. -# 3) This driver supports fewer features than the UefiPxeBcDxe driver in NetworkPkg -# (e.g. IPv6, MTFTP windowsize). -# 4) UefiPxeBcDxe driver in NetworkPkg is recommended for use instead of this one even -# though both of them can be used. -# -# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# -## - - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = UefiPxe4BcDxe - MODULE_UNI_FILE = UefiPxe4BcDxe.uni - FILE_GUID = 3B1DEAB5-C75D-442e-9238-8E2FFB62B0BB - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = PxeBcDriverEntryPoint - UNLOAD_IMAGE = NetLibDefaultUnload - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 -# -# DRIVER_BINDING = gPxeBcDriverBinding -# COMPONENT_NAME = gPxeBcComponentName -# COMPONENT_NAME2 = gPxeBcComponentName2 -# - -[Sources] - PxeBcMtftp.c - PxeBcSupport.h - PxeBcSupport.c - PxeBcDriver.c - PxeBcDhcp.h - ComponentName.c - PxeBcImpl.c - PxeBcImpl.h - PxeBcDhcp.c - PxeBcMtftp.h - PxeBcDriver.h - - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - BaseLib - UefiLib - UefiBootServicesTableLib - UefiDriverEntryPoint - BaseMemoryLib - MemoryAllocationLib - DebugLib - NetLib - DpcLib - PcdLib - -[Protocols] - gEfiPxeBaseCodeCallbackProtocolGuid ## SOMETIMES_PRODUCES - gEfiPxeBaseCodeProtocolGuid ## BY_START - gEfiLoadFileProtocolGuid ## BY_START - gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## SOMETIMES_CONSUMES - gEfiArpServiceBindingProtocolGuid ## TO_START - gEfiArpProtocolGuid ## TO_START - gEfiMtftp4ServiceBindingProtocolGuid ## TO_START - gEfiMtftp4ProtocolGuid ## TO_START - gEfiUdp4ServiceBindingProtocolGuid ## TO_START - gEfiUdp4ProtocolGuid ## TO_START - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START - gEfiDhcp4ProtocolGuid ## TO_START - gEfiIp4ServiceBindingProtocolGuid ## TO_START - gEfiIp4ProtocolGuid ## TO_START - gEfiIp4Config2ProtocolGuid ## TO_START - -[Pcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize ## SOMETIMES_CONSUMES - -[UserExtensions.TianoCore."ExtraFiles"] - UefiPxe4BcDxeExtra.uni -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v1 7/7] NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan ` (5 preceding siblings ...) 2018-10-30 7:33 ` [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg Fu Siyuan @ 2018-10-30 7:33 ` Fu Siyuan 2018-10-30 8:16 ` Ye, Ting 2018-10-30 7:42 ` [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Zeng, Star 2018-10-30 10:50 ` Leif Lindholm 8 siblings, 1 reply; 29+ messages in thread From: Fu Siyuan @ 2018-10-30 7:33 UTC (permalink / raw) To: edk2-devel; +Cc: Jiaxin Wu, Ye Ting This patch is to remove the clarification about usage/difference between those drivers in MdeModulePkg and NetworkPkg, since the MdeModulePkg ones have been deleted now. Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Ye Ting <ting.ye@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 ---------- NetworkPkg/TcpDxe/TcpDxe.inf | 6 ------ NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 ------ 3 files changed, 22 deletions(-) diff --git a/NetworkPkg/IScsiDxe/IScsiDxe.inf b/NetworkPkg/IScsiDxe/IScsiDxe.inf index 195dc191250f..bdf1313aa957 100644 --- a/NetworkPkg/IScsiDxe/IScsiDxe.inf +++ b/NetworkPkg/IScsiDxe/IScsiDxe.inf @@ -4,16 +4,6 @@ # The iSCSI driver provides iSCSI service in the preboot environment and supports # booting over iSCSI. This driver supports both IPv4 and IPv6 network stack. # -# Notes: -# 1) This driver can't co-work with the IScsiDxe driver in MdeModulePkg. -# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, Dns -# support for target URL configuration, iSCSI keyword support) than the IscsiDxe -# driver in MdeModulePkg. So, we recommend using this driver even though both of -# them can be used. -# 3) This driver depends on OpenSSL. To use this driver, please follow the -# instructions found in the file "OpenSSL-HOWTO.txt" located in -# CryptoPkg\Library\OpensslLib to enable the OpenSSL building first. -# # Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf index 9433fb875cba..c4e3de7ec5ce 100644 --- a/NetworkPkg/TcpDxe/TcpDxe.inf +++ b/NetworkPkg/TcpDxe/TcpDxe.inf @@ -5,12 +5,6 @@ # It might provide TCPv4 Protocol or TCPv6 Protocol or both of them that depends on which network # stack has been loaded in system. This driver supports both IPv4 and IPv6 network stack. # -# Notes: -# 1) This driver can't co-work with the Tcp4Dxe driver in MdeModulePkg. -# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, TCP Cancel -# function) than the Tcp4Dxe driver in MdeModulePkg. So, we recommend using this driver -# even though both of them can be used. -# # Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> # # This program and the accompanying materials diff --git a/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf b/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf index 130a5456e2c1..63430711e71b 100644 --- a/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf +++ b/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf @@ -5,12 +5,6 @@ # PXE-compatible device for network access or booting. This driver supports # both IPv4 and IPv6 network stack. # -# Notes: -# 1) This driver can't co-work with the UefiPxeBcDxe driver in MdeModulePkg. -# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, -# MTFTP windowsize) than the UefiPxeBcDxe driver in MdeModulePkg. So, we -# recommend using this driver even though both of them can be used. -# # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> # # This program and the accompanying materials -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v1 7/7] NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. 2018-10-30 7:33 ` [PATCH v1 7/7] NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF Fu Siyuan @ 2018-10-30 8:16 ` Ye, Ting 0 siblings, 0 replies; 29+ messages in thread From: Ye, Ting @ 2018-10-30 8:16 UTC (permalink / raw) To: Fu, Siyuan, edk2-devel@lists.01.org; +Cc: Wu, Jiaxin Reviewed-by: Ye Ting <ting.ye@intel.com> -----Original Message----- From: Fu, Siyuan Sent: Tuesday, October 30, 2018 3:33 PM To: edk2-devel@lists.01.org Cc: Wu, Jiaxin <jiaxin.wu@intel.com>; Ye, Ting <ting.ye@intel.com> Subject: [PATCH v1 7/7] NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. This patch is to remove the clarification about usage/difference between those drivers in MdeModulePkg and NetworkPkg, since the MdeModulePkg ones have been deleted now. Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Ye Ting <ting.ye@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> --- NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 ---------- NetworkPkg/TcpDxe/TcpDxe.inf | 6 ------ NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 ------ 3 files changed, 22 deletions(-) diff --git a/NetworkPkg/IScsiDxe/IScsiDxe.inf b/NetworkPkg/IScsiDxe/IScsiDxe.inf index 195dc191250f..bdf1313aa957 100644 --- a/NetworkPkg/IScsiDxe/IScsiDxe.inf +++ b/NetworkPkg/IScsiDxe/IScsiDxe.inf @@ -4,16 +4,6 @@ # The iSCSI driver provides iSCSI service in the preboot environment and supports # booting over iSCSI. This driver supports both IPv4 and IPv6 network stack. # -# Notes: -# 1) This driver can't co-work with the IScsiDxe driver in MdeModulePkg. -# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, Dns -# support for target URL configuration, iSCSI keyword support) than the IscsiDxe -# driver in MdeModulePkg. So, we recommend using this driver even though both of -# them can be used. -# 3) This driver depends on OpenSSL. To use this driver, please follow the -# instructions found in the file "OpenSSL-HOWTO.txt" located in -# CryptoPkg\Library\OpensslLib to enable the OpenSSL building first. -# # Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf index 9433fb875cba..c4e3de7ec5ce 100644 --- a/NetworkPkg/TcpDxe/TcpDxe.inf +++ b/NetworkPkg/TcpDxe/TcpDxe.inf @@ -5,12 +5,6 @@ # It might provide TCPv4 Protocol or TCPv6 Protocol or both of them that depends on which network # stack has been loaded in system. This driver supports both IPv4 and IPv6 network stack. # -# Notes: -# 1) This driver can't co-work with the Tcp4Dxe driver in MdeModulePkg. -# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, TCP Cancel -# function) than the Tcp4Dxe driver in MdeModulePkg. So, we recommend using this driver -# even though both of them can be used. -# # Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> # # This program and the accompanying materials diff --git a/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf b/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf index 130a5456e2c1..63430711e71b 100644 --- a/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf +++ b/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf @@ -5,12 +5,6 @@ # PXE-compatible device for network access or booting. This driver supports # both IPv4 and IPv6 network stack. # -# Notes: -# 1) This driver can't co-work with the UefiPxeBcDxe driver in MdeModulePkg. -# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, -# MTFTP windowsize) than the UefiPxeBcDxe driver in MdeModulePkg. So, we -# recommend using this driver even though both of them can be used. -# # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR> # # This program and the accompanying materials -- 2.18.0.windows.1 ^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan ` (6 preceding siblings ...) 2018-10-30 7:33 ` [PATCH v1 7/7] NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF Fu Siyuan @ 2018-10-30 7:42 ` Zeng, Star 2018-10-30 8:23 ` Fu, Siyuan 2018-10-30 10:50 ` Leif Lindholm 8 siblings, 1 reply; 29+ messages in thread From: Zeng, Star @ 2018-10-30 7:42 UTC (permalink / raw) To: Fu, Siyuan, edk2-devel@lists.01.org Cc: Kinney, Michael D, Leif Lindholm, Andrew Fish (afish@apple.com), Laszlo Ersek (lersek@redhat.com), Gao, Liming, Zeng, Star Hi Siyuan, Have you checked the platforms in https://github.com/tianocore/edk2-platforms to see whether they need to be updated accordingly or not? Cc more people. Thanks, Star -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Fu Siyuan Sent: Tuesday, October 30, 2018 3:33 PM To: edk2-devel@lists.01.org Subject: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. This patch series is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe drivers in MdeModulePkg. These drivers will not be maintained and can't co-work with the dual-stack drivers in NetworkPkg. People should use below NetworkPkg drivers instead: NetworkPkg/IScsiDxe/IScsiDxe.inf NetworkPkg/TcpDxe/TcpDxe.inf NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf These drivers are actively maintained with more bug fixes and new feature support. Patch 1~5 update edk2 platform DSC/FDF files to use NetworkPkg drivers. Patch 6 deletes the TCP,PXE,iSCSI driver in MdeModulePkg. Patch 7 removes some clarification in NetworkPkg drivers since the related driver has been deleted in Patch 6. Fu Siyuan (7): Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. .../Network/IScsiDxe/ComponentName.c | 283 -- .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ------- .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 --- .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 ---- .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 --- .../Network/IScsiDxe/IScsiInitiatorName.c | 116 - .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------- .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 --- MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 -- .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ------- .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------ .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---- .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --------- .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 -- .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ------- .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- .../Network/UefiPxeBcDxe/ComponentName.c | 365 -- .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ----------- .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---- .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 ----------------- .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- ArmVirtPkg/ArmVirtQemu.dsc | 10 +- ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +- ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +- EmulatorPkg/EmulatorPkg.dsc | 2 +- EmulatorPkg/EmulatorPkg.fdf | 2 +- MdeModulePkg/MdeModulePkg.dsc | 3 - .../Network/IScsiDxe/ComponentName.h | 165 - .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 - .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 - .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 - .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 - .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 - .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 - .../Network/IScsiDxe/IScsiInitiatorName.h | 74 - .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 -- .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------ .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 - .../Universal/Network/Tcp4Dxe/Socket.h | 954 ------ .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 -- .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 -- .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --- .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 - NetworkPkg/TcpDxe/TcpDxe.inf | 6 - NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 - Nt32Pkg/Nt32Pkg.dsc | 12 +- Nt32Pkg/Nt32Pkg.fdf | 12 +- OvmfPkg/OvmfPkgIa32.dsc | 12 +- OvmfPkg/OvmfPkgIa32.fdf | 10 +- OvmfPkg/OvmfPkgIa32X64.dsc | 12 +- OvmfPkg/OvmfPkgIa32X64.fdf | 10 +- OvmfPkg/OvmfPkgX64.dsc | 12 +- OvmfPkg/OvmfPkgX64.fdf | 10 +- Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +- Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +- Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +- Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +- Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +- 90 files changed, 55 insertions(+), 32771 deletions(-) delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf -- 2.18.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-30 7:42 ` [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Zeng, Star @ 2018-10-30 8:23 ` Fu, Siyuan 2018-10-30 21:14 ` Kinney, Michael D 0 siblings, 1 reply; 29+ messages in thread From: Fu, Siyuan @ 2018-10-30 8:23 UTC (permalink / raw) To: Zeng, Star, edk2-devel@lists.01.org Cc: Kinney, Michael D, Leif Lindholm, Andrew Fish (afish@apple.com), Laszlo Ersek (lersek@redhat.com), Gao, Liming Hi, Star This patch only covers the platforms in https://github.com/tianocore/edk2 I will modify the edk2 network wiki page for an updated sample DSC/FDF section, if this patch could pass review w/o objection. https://github.com/tianocore/tianocore.github.io/wiki/NetworkPkg-Getting-Started-Guide Let's wait a few days to see if there is any objection on deleting these driver first, and I will be happy to generate another patch for edk2-platforms then. Thanks for your reminder. BestRegards Fu Siyuan > -----Original Message----- > From: Zeng, Star > Sent: Tuesday, October 30, 2018 3:43 PM > To: Fu, Siyuan <siyuan.fu@intel.com>; edk2-devel@lists.01.org > Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Leif Lindholm > <leif.lindholm@linaro.org>; Andrew Fish (afish@apple.com) > <afish@apple.com>; Laszlo Ersek (lersek@redhat.com) <lersek@redhat.com>; > Gao, Liming <liming.gao@intel.com>; Zeng, Star <star.zeng@intel.com> > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in > MdeModulePkg. > > Hi Siyuan, > > Have you checked the platforms in https://github.com/tianocore/edk2- > platforms to see whether they need to be updated accordingly or not? > > Cc more people. > > Thanks, > Star > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Fu > Siyuan > Sent: Tuesday, October 30, 2018 3:33 PM > To: edk2-devel@lists.01.org > Subject: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in > MdeModulePkg. > > This patch series is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe > drivers in MdeModulePkg. These drivers will not be maintained and can't > co-work with the dual-stack drivers in NetworkPkg. > > People should use below NetworkPkg drivers instead: > NetworkPkg/IScsiDxe/IScsiDxe.inf > NetworkPkg/TcpDxe/TcpDxe.inf > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > These drivers are actively maintained with more bug fixes and new feature > support. > > Patch 1~5 update edk2 platform DSC/FDF files to use NetworkPkg drivers. > Patch 6 deletes the TCP,PXE,iSCSI driver in MdeModulePkg. > Patch 7 removes some clarification in NetworkPkg drivers since the related > driver has been deleted in Patch 6. > > Fu Siyuan (7): > Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. > EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. > OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. > Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. > ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. > NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. > > .../Network/IScsiDxe/ComponentName.c | 283 -- > .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- > .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ------- > .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 --- > .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 ---- > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- > .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 --- > .../Network/IScsiDxe/IScsiInitiatorName.c | 116 - > .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ > .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------- > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 --- > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 -- > .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- > .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ------- > .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------ > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---- > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --------- > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 -- > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ------- > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- > .../Network/UefiPxeBcDxe/ComponentName.c | 365 -- > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ----------- > .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---- > .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 ----------------- > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- > .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- > ArmVirtPkg/ArmVirtQemu.dsc | 10 +- > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +- > ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +- > EmulatorPkg/EmulatorPkg.dsc | 2 +- > EmulatorPkg/EmulatorPkg.fdf | 2 +- > MdeModulePkg/MdeModulePkg.dsc | 3 - > .../Network/IScsiDxe/ComponentName.h | 165 - > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - > .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - > .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - > .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 - > .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 - > .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- > .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 - > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - > .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - > .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 - > .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - > .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 - > .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 - > .../Network/IScsiDxe/IScsiInitiatorName.h | 74 - > .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 -- > .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------ > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - > .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 - > .../Universal/Network/Tcp4Dxe/Socket.h | 954 ------ > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 -- > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 -- > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --- > .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - > .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - > .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - > NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 - > NetworkPkg/TcpDxe/TcpDxe.inf | 6 - > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 - > Nt32Pkg/Nt32Pkg.dsc | 12 +- > Nt32Pkg/Nt32Pkg.fdf | 12 +- > OvmfPkg/OvmfPkgIa32.dsc | 12 +- > OvmfPkg/OvmfPkgIa32.fdf | 10 +- > OvmfPkg/OvmfPkgIa32X64.dsc | 12 +- > OvmfPkg/OvmfPkgIa32X64.fdf | 10 +- > OvmfPkg/OvmfPkgX64.dsc | 12 +- > OvmfPkg/OvmfPkgX64.fdf | 10 +- > Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +- > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +- > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +- > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +- > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +- > 90 files changed, 55 insertions(+), 32771 deletions(-) delete mode > 100644 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > -- > 2.18.0.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-30 8:23 ` Fu, Siyuan @ 2018-10-30 21:14 ` Kinney, Michael D 2018-10-31 0:51 ` Fu, Siyuan 0 siblings, 1 reply; 29+ messages in thread From: Kinney, Michael D @ 2018-10-30 21:14 UTC (permalink / raw) To: Fu, Siyuan, Zeng, Star, edk2-devel@lists.01.org, Kinney, Michael D Cc: Leif Lindholm, Andrew Fish (afish@apple.com), Laszlo Ersek (lersek@redhat.com), Gao, Liming Fu Siyuan, Please review edk2-platform/master and prepare a patch for that branch if there are DSC/FDF files that refer to the network drivers that are being removed. We should never break any platforms in edk2-platform/master. The commits should be performed to the repos in the correct order to guarantee no build breaks. Thanks, Mike > -----Original Message----- > From: Fu, Siyuan > Sent: Tuesday, October 30, 2018 1:23 AM > To: Zeng, Star <star.zeng@intel.com>; edk2- > devel@lists.01.org > Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Leif > Lindholm <leif.lindholm@linaro.org>; Andrew Fish > (afish@apple.com) <afish@apple.com>; Laszlo Ersek > (lersek@redhat.com) <lersek@redhat.com>; Gao, Liming > <liming.gao@intel.com> > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > iSCSI driver in MdeModulePkg. > > Hi, Star > > This patch only covers the platforms in > https://github.com/tianocore/edk2 > > I will modify the edk2 network wiki page for an updated > sample DSC/FDF section, if this patch could pass review > w/o objection. > https://github.com/tianocore/tianocore.github.io/wiki/Ne > tworkPkg-Getting-Started-Guide > > Let's wait a few days to see if there is any objection > on deleting these driver first, and I will be happy to > generate another patch for edk2-platforms then. > > Thanks for your reminder. > > > BestRegards > Fu Siyuan > > > -----Original Message----- > > From: Zeng, Star > > Sent: Tuesday, October 30, 2018 3:43 PM > > To: Fu, Siyuan <siyuan.fu@intel.com>; edk2- > devel@lists.01.org > > Cc: Kinney, Michael D <michael.d.kinney@intel.com>; > Leif Lindholm > > <leif.lindholm@linaro.org>; Andrew Fish > (afish@apple.com) > > <afish@apple.com>; Laszlo Ersek (lersek@redhat.com) > <lersek@redhat.com>; > > Gao, Liming <liming.gao@intel.com>; Zeng, Star > <star.zeng@intel.com> > > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > iSCSI driver in > > MdeModulePkg. > > > > Hi Siyuan, > > > > Have you checked the platforms in > https://github.com/tianocore/edk2- > > platforms to see whether they need to be updated > accordingly or not? > > > > Cc more people. > > > > Thanks, > > Star > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel- > bounces@lists.01.org] On Behalf Of Fu > > Siyuan > > Sent: Tuesday, October 30, 2018 3:33 PM > > To: edk2-devel@lists.01.org > > Subject: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI > driver in > > MdeModulePkg. > > > > This patch series is to delete the Tcp4Dxe, > UefiPxeBcDxe and IScsi4Dxe > > drivers in MdeModulePkg. These drivers will not be > maintained and can't > > co-work with the dual-stack drivers in NetworkPkg. > > > > People should use below NetworkPkg drivers instead: > > NetworkPkg/IScsiDxe/IScsiDxe.inf > > NetworkPkg/TcpDxe/TcpDxe.inf > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > > These drivers are actively maintained with more bug > fixes and new feature > > support. > > > > Patch 1~5 update edk2 platform DSC/FDF files to use > NetworkPkg drivers. > > Patch 6 deletes the TCP,PXE,iSCSI driver in > MdeModulePkg. > > Patch 7 removes some clarification in NetworkPkg > drivers since the related > > driver has been deleted in Patch 6. > > > > Fu Siyuan (7): > > Nt32Pkg: Replace obsoleted network drivers from NT32 > platform DSC/FDF. > > EmulatorPkg: Replace obsoleted network drivers from > platform DSC/FDF. > > OvmfPkg: Replace obsoleted network drivers from > platform DSC/FDF. > > Vlv2TbltDevicePkg: Replace obsoleted drivers from > platform DSC/FDF. > > ArmVirtPkg: Replace obsoleted network drivers from > platform DSC/FDF. > > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in > MdeModulePkg. > > NetworkPkg: Remove some clarification from > TCP/PXE/ISCSI driver INF. > > > > .../Network/IScsiDxe/ComponentName.c | 283 > -- > > .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 > --- > > .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 > ------- > > .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 > --- > > .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 > ---- > > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 > --- > > .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 > --- > > .../Network/IScsiDxe/IScsiInitiatorName.c | 116 > - > > .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 > ------ > > .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 > --------------- > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 > --- > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 - > - > > .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 > --- > > .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 > ------- > > .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 > ------ > > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 > ---- > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 > ----- > > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 > --------- > > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 > - > > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 > ---- > > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 > ------ > > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 > -- > > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 > ------- > > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 > ---- > > .../Network/UefiPxeBcDxe/ComponentName.c | 365 > -- > > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 > ----------- > > .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 > ---- > > .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 > ----------------- > > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 > --- > > .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 > -- > > ArmVirtPkg/ArmVirtQemu.dsc | 10 > +- > > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 > +- > > ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 > +- > > EmulatorPkg/EmulatorPkg.dsc | 2 > +- > > EmulatorPkg/EmulatorPkg.fdf | 2 > +- > > MdeModulePkg/MdeModulePkg.dsc | 3 > - > > .../Network/IScsiDxe/ComponentName.h | 165 > - > > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 > - > > .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 > - > > .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 > - > > .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 > - > > .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 > - > > .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 > -- > > .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 > - > > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 > - > > .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 > - > > .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 > - > > .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 > - > > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 > - > > .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 > - > > .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 > - > > .../Network/IScsiDxe/IScsiInitiatorName.h | 74 > - > > .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 > -- > > .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 > ------ > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 > - > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 > - > > .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 > - > > .../Universal/Network/Tcp4Dxe/Socket.h | 954 > ------ > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 > -- > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 > - > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 > - > > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 > - > > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 > ----- > > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 > --- > > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 > - > > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 > -- > > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 > --- > > .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 > - > > .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 > -- > > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 > - > > .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 > - > > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 > - > > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 > - > > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 > - > > NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 > - > > NetworkPkg/TcpDxe/TcpDxe.inf | 6 > - > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 > - > > Nt32Pkg/Nt32Pkg.dsc | 12 > +- > > Nt32Pkg/Nt32Pkg.fdf | 12 > +- > > OvmfPkg/OvmfPkgIa32.dsc | 12 > +- > > OvmfPkg/OvmfPkgIa32.fdf | 10 > +- > > OvmfPkg/OvmfPkgIa32X64.dsc | 12 > +- > > OvmfPkg/OvmfPkgIa32X64.fdf | 10 > +- > > OvmfPkg/OvmfPkgX64.dsc | 12 > +- > > OvmfPkg/OvmfPkgX64.fdf | 10 > +- > > Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 > +- > > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 > +- > > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 > +- > > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 > +- > > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 > +- > > 90 files changed, 55 insertions(+), 32771 deletions(- > ) delete mode > > 100644 > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPass > Thru.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorNa > me.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentNam > e.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver. > c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport > .c > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.u > ni > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.v > fr > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeSt > rings.uni > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDat > aStruc.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPass > Thru.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorNa > me.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver. > h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport > .h > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDx > e.uni > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDx > eExtra.uni > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe > .inf > > > > -- > > 2.18.0.windows.1 > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-30 21:14 ` Kinney, Michael D @ 2018-10-31 0:51 ` Fu, Siyuan 2018-10-31 16:29 ` Kinney, Michael D 0 siblings, 1 reply; 29+ messages in thread From: Fu, Siyuan @ 2018-10-31 0:51 UTC (permalink / raw) To: Kinney, Michael D, Zeng, Star, edk2-devel@lists.01.org Cc: Leif Lindholm, Andrew Fish (afish@apple.com), Laszlo Ersek (lersek@redhat.com), Gao, Liming Mike, Should I also update the devel branches in edk2-platform? Or the branch owner will take care of it? BestRegards Fu Siyuan > -----Original Message----- > From: Kinney, Michael D > Sent: Wednesday, October 31, 2018 5:15 AM > To: Fu, Siyuan <siyuan.fu@intel.com>; Zeng, Star <star.zeng@intel.com>; > edk2-devel@lists.01.org; Kinney, Michael D <michael.d.kinney@intel.com> > Cc: Leif Lindholm <leif.lindholm@linaro.org>; Andrew Fish (afish@apple.com) > <afish@apple.com>; Laszlo Ersek (lersek@redhat.com) <lersek@redhat.com>; > Gao, Liming <liming.gao@intel.com> > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in > MdeModulePkg. > > Fu Siyuan, > > Please review edk2-platform/master and prepare a patch > for that branch if there are DSC/FDF files that refer > to the network drivers that are being removed. > > We should never break any platforms in edk2-platform/master. > The commits should be performed to the repos in the correct > order to guarantee no build breaks. > > Thanks, > > Mike > > > -----Original Message----- > > From: Fu, Siyuan > > Sent: Tuesday, October 30, 2018 1:23 AM > > To: Zeng, Star <star.zeng@intel.com>; edk2- > > devel@lists.01.org > > Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Leif > > Lindholm <leif.lindholm@linaro.org>; Andrew Fish > > (afish@apple.com) <afish@apple.com>; Laszlo Ersek > > (lersek@redhat.com) <lersek@redhat.com>; Gao, Liming > > <liming.gao@intel.com> > > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > > iSCSI driver in MdeModulePkg. > > > > Hi, Star > > > > This patch only covers the platforms in > > https://github.com/tianocore/edk2 > > > > I will modify the edk2 network wiki page for an updated > > sample DSC/FDF section, if this patch could pass review > > w/o objection. > > https://github.com/tianocore/tianocore.github.io/wiki/Ne > > tworkPkg-Getting-Started-Guide > > > > Let's wait a few days to see if there is any objection > > on deleting these driver first, and I will be happy to > > generate another patch for edk2-platforms then. > > > > Thanks for your reminder. > > > > > > BestRegards > > Fu Siyuan > > > > > -----Original Message----- > > > From: Zeng, Star > > > Sent: Tuesday, October 30, 2018 3:43 PM > > > To: Fu, Siyuan <siyuan.fu@intel.com>; edk2- > > devel@lists.01.org > > > Cc: Kinney, Michael D <michael.d.kinney@intel.com>; > > Leif Lindholm > > > <leif.lindholm@linaro.org>; Andrew Fish > > (afish@apple.com) > > > <afish@apple.com>; Laszlo Ersek (lersek@redhat.com) > > <lersek@redhat.com>; > > > Gao, Liming <liming.gao@intel.com>; Zeng, Star > > <star.zeng@intel.com> > > > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > > iSCSI driver in > > > MdeModulePkg. > > > > > > Hi Siyuan, > > > > > > Have you checked the platforms in > > https://github.com/tianocore/edk2- > > > platforms to see whether they need to be updated > > accordingly or not? > > > > > > Cc more people. > > > > > > Thanks, > > > Star > > > -----Original Message----- > > > From: edk2-devel [mailto:edk2-devel- > > bounces@lists.01.org] On Behalf Of Fu > > > Siyuan > > > Sent: Tuesday, October 30, 2018 3:33 PM > > > To: edk2-devel@lists.01.org > > > Subject: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI > > driver in > > > MdeModulePkg. > > > > > > This patch series is to delete the Tcp4Dxe, > > UefiPxeBcDxe and IScsi4Dxe > > > drivers in MdeModulePkg. These drivers will not be > > maintained and can't > > > co-work with the dual-stack drivers in NetworkPkg. > > > > > > People should use below NetworkPkg drivers instead: > > > NetworkPkg/IScsiDxe/IScsiDxe.inf > > > NetworkPkg/TcpDxe/TcpDxe.inf > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > > > These drivers are actively maintained with more bug > > fixes and new feature > > > support. > > > > > > Patch 1~5 update edk2 platform DSC/FDF files to use > > NetworkPkg drivers. > > > Patch 6 deletes the TCP,PXE,iSCSI driver in > > MdeModulePkg. > > > Patch 7 removes some clarification in NetworkPkg > > drivers since the related > > > driver has been deleted in Patch 6. > > > > > > Fu Siyuan (7): > > > Nt32Pkg: Replace obsoleted network drivers from NT32 > > platform DSC/FDF. > > > EmulatorPkg: Replace obsoleted network drivers from > > platform DSC/FDF. > > > OvmfPkg: Replace obsoleted network drivers from > > platform DSC/FDF. > > > Vlv2TbltDevicePkg: Replace obsoleted drivers from > > platform DSC/FDF. > > > ArmVirtPkg: Replace obsoleted network drivers from > > platform DSC/FDF. > > > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in > > MdeModulePkg. > > > NetworkPkg: Remove some clarification from > > TCP/PXE/ISCSI driver INF. > > > > > > .../Network/IScsiDxe/ComponentName.c | 283 > > -- > > > .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 > > --- > > > .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 > > ------- > > > .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 > > --- > > > .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 > > ---- > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 > > --- > > > .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 > > --- > > > .../Network/IScsiDxe/IScsiInitiatorName.c | 116 > > - > > > .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 > > ------ > > > .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 > > --------------- > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 > > --- > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 - > > - > > > .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 > > --- > > > .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 > > ------- > > > .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 > > ------ > > > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 > > ---- > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 > > ----- > > > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 > > --------- > > > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 > > - > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 > > ---- > > > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 > > ------ > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 > > -- > > > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 > > ------- > > > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 > > ---- > > > .../Network/UefiPxeBcDxe/ComponentName.c | 365 > > -- > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 > > ----------- > > > .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 > > ---- > > > .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 > > ----------------- > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 > > --- > > > .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 > > -- > > > ArmVirtPkg/ArmVirtQemu.dsc | 10 > > +- > > > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 > > +- > > > ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 > > +- > > > EmulatorPkg/EmulatorPkg.dsc | 2 > > +- > > > EmulatorPkg/EmulatorPkg.fdf | 2 > > +- > > > MdeModulePkg/MdeModulePkg.dsc | 3 > > - > > > .../Network/IScsiDxe/ComponentName.h | 165 > > - > > > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 > > - > > > .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 > > - > > > .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 > > - > > > .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 > > - > > > .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 > > - > > > .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 > > -- > > > .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 > > - > > > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 > > - > > > .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 > > - > > > .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 > > - > > > .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 > > - > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 > > - > > > .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 > > - > > > .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 > > - > > > .../Network/IScsiDxe/IScsiInitiatorName.h | 74 > > - > > > .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 > > -- > > > .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 > > ------ > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 > > - > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 > > - > > > .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 > > - > > > .../Universal/Network/Tcp4Dxe/Socket.h | 954 > > ------ > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 > > -- > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 > > - > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 > > - > > > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 > > - > > > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 > > ----- > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 > > --- > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 > > - > > > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 > > -- > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 > > --- > > > .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 > > - > > > .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 > > -- > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 > > - > > > .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 > > - > > > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 > > - > > > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 > > - > > > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 > > - > > > NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 > > - > > > NetworkPkg/TcpDxe/TcpDxe.inf | 6 > > - > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 > > - > > > Nt32Pkg/Nt32Pkg.dsc | 12 > > +- > > > Nt32Pkg/Nt32Pkg.fdf | 12 > > +- > > > OvmfPkg/OvmfPkgIa32.dsc | 12 > > +- > > > OvmfPkg/OvmfPkgIa32.fdf | 10 > > +- > > > OvmfPkg/OvmfPkgIa32X64.dsc | 12 > > +- > > > OvmfPkg/OvmfPkgIa32X64.fdf | 10 > > +- > > > OvmfPkg/OvmfPkgX64.dsc | 12 > > +- > > > OvmfPkg/OvmfPkgX64.fdf | 10 > > +- > > > Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 > > +- > > > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 > > +- > > > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 > > +- > > > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 > > +- > > > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 > > +- > > > 90 files changed, 55 insertions(+), 32771 deletions(- > > ) delete mode > > > 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPass > > Thru.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorNa > > me.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentNam > > e.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver. > > c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport > > .c > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.u > > ni > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.v > > fr > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeSt > > rings.uni > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDat > > aStruc.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPass > > Thru.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorNa > > me.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver. > > h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport > > .h > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDx > > e.uni > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDx > > eExtra.uni > > > delete mode 100644 > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe > > .inf > > > > > > -- > > > 2.18.0.windows.1 > > > > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org > > > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-31 0:51 ` Fu, Siyuan @ 2018-10-31 16:29 ` Kinney, Michael D 0 siblings, 0 replies; 29+ messages in thread From: Kinney, Michael D @ 2018-10-31 16:29 UTC (permalink / raw) To: Fu, Siyuan, Zeng, Star, edk2-devel@lists.01.org, Kinney, Michael D Cc: Leif Lindholm, Andrew Fish (afish@apple.com), Laszlo Ersek (lersek@redhat.com), Gao, Liming Fu Siyuan, Just edk2-platforms/master. Maintainers for devel and stable branches need to device when to move to a new version of edk2 repo and perform integration tasks. The patch for edk2-platforms/master should include this notification so maintainer of devel and stable branches will know that the need to pay attention to this change. Mike > -----Original Message----- > From: Fu, Siyuan > Sent: Tuesday, October 30, 2018 5:52 PM > To: Kinney, Michael D <michael.d.kinney@intel.com>; > Zeng, Star <star.zeng@intel.com>; edk2- > devel@lists.01.org > Cc: Leif Lindholm <leif.lindholm@linaro.org>; Andrew > Fish (afish@apple.com) <afish@apple.com>; Laszlo Ersek > (lersek@redhat.com) <lersek@redhat.com>; Gao, Liming > <liming.gao@intel.com> > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > iSCSI driver in MdeModulePkg. > > Mike, > > Should I also update the devel branches in edk2- > platform? Or the branch owner will take care of it? > > BestRegards > Fu Siyuan > > > > -----Original Message----- > > From: Kinney, Michael D > > Sent: Wednesday, October 31, 2018 5:15 AM > > To: Fu, Siyuan <siyuan.fu@intel.com>; Zeng, Star > <star.zeng@intel.com>; > > edk2-devel@lists.01.org; Kinney, Michael D > <michael.d.kinney@intel.com> > > Cc: Leif Lindholm <leif.lindholm@linaro.org>; Andrew > Fish (afish@apple.com) > > <afish@apple.com>; Laszlo Ersek (lersek@redhat.com) > <lersek@redhat.com>; > > Gao, Liming <liming.gao@intel.com> > > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > iSCSI driver in > > MdeModulePkg. > > > > Fu Siyuan, > > > > Please review edk2-platform/master and prepare a patch > > for that branch if there are DSC/FDF files that refer > > to the network drivers that are being removed. > > > > We should never break any platforms in edk2- > platform/master. > > The commits should be performed to the repos in the > correct > > order to guarantee no build breaks. > > > > Thanks, > > > > Mike > > > > > -----Original Message----- > > > From: Fu, Siyuan > > > Sent: Tuesday, October 30, 2018 1:23 AM > > > To: Zeng, Star <star.zeng@intel.com>; edk2- > > > devel@lists.01.org > > > Cc: Kinney, Michael D <michael.d.kinney@intel.com>; > Leif > > > Lindholm <leif.lindholm@linaro.org>; Andrew Fish > > > (afish@apple.com) <afish@apple.com>; Laszlo Ersek > > > (lersek@redhat.com) <lersek@redhat.com>; Gao, Liming > > > <liming.gao@intel.com> > > > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > > > iSCSI driver in MdeModulePkg. > > > > > > Hi, Star > > > > > > This patch only covers the platforms in > > > https://github.com/tianocore/edk2 > > > > > > I will modify the edk2 network wiki page for an > updated > > > sample DSC/FDF section, if this patch could pass > review > > > w/o objection. > > > > https://github.com/tianocore/tianocore.github.io/wiki/Ne > > > tworkPkg-Getting-Started-Guide > > > > > > Let's wait a few days to see if there is any > objection > > > on deleting these driver first, and I will be happy > to > > > generate another patch for edk2-platforms then. > > > > > > Thanks for your reminder. > > > > > > > > > BestRegards > > > Fu Siyuan > > > > > > > -----Original Message----- > > > > From: Zeng, Star > > > > Sent: Tuesday, October 30, 2018 3:43 PM > > > > To: Fu, Siyuan <siyuan.fu@intel.com>; edk2- > > > devel@lists.01.org > > > > Cc: Kinney, Michael D > <michael.d.kinney@intel.com>; > > > Leif Lindholm > > > > <leif.lindholm@linaro.org>; Andrew Fish > > > (afish@apple.com) > > > > <afish@apple.com>; Laszlo Ersek > (lersek@redhat.com) > > > <lersek@redhat.com>; > > > > Gao, Liming <liming.gao@intel.com>; Zeng, Star > > > <star.zeng@intel.com> > > > > Subject: RE: [edk2] [PATCH v1 0/7] Delete TCP, > PXE, > > > iSCSI driver in > > > > MdeModulePkg. > > > > > > > > Hi Siyuan, > > > > > > > > Have you checked the platforms in > > > https://github.com/tianocore/edk2- > > > > platforms to see whether they need to be updated > > > accordingly or not? > > > > > > > > Cc more people. > > > > > > > > Thanks, > > > > Star > > > > -----Original Message----- > > > > From: edk2-devel [mailto:edk2-devel- > > > bounces@lists.01.org] On Behalf Of Fu > > > > Siyuan > > > > Sent: Tuesday, October 30, 2018 3:33 PM > > > > To: edk2-devel@lists.01.org > > > > Subject: [edk2] [PATCH v1 0/7] Delete TCP, PXE, > iSCSI > > > driver in > > > > MdeModulePkg. > > > > > > > > This patch series is to delete the Tcp4Dxe, > > > UefiPxeBcDxe and IScsi4Dxe > > > > drivers in MdeModulePkg. These drivers will not be > > > maintained and can't > > > > co-work with the dual-stack drivers in NetworkPkg. > > > > > > > > People should use below NetworkPkg drivers > instead: > > > > NetworkPkg/IScsiDxe/IScsiDxe.inf > > > > NetworkPkg/TcpDxe/TcpDxe.inf > > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > > > > These drivers are actively maintained with more > bug > > > fixes and new feature > > > > support. > > > > > > > > Patch 1~5 update edk2 platform DSC/FDF files to > use > > > NetworkPkg drivers. > > > > Patch 6 deletes the TCP,PXE,iSCSI driver in > > > MdeModulePkg. > > > > Patch 7 removes some clarification in NetworkPkg > > > drivers since the related > > > > driver has been deleted in Patch 6. > > > > > > > > Fu Siyuan (7): > > > > Nt32Pkg: Replace obsoleted network drivers from > NT32 > > > platform DSC/FDF. > > > > EmulatorPkg: Replace obsoleted network drivers > from > > > platform DSC/FDF. > > > > OvmfPkg: Replace obsoleted network drivers from > > > platform DSC/FDF. > > > > Vlv2TbltDevicePkg: Replace obsoleted drivers > from > > > platform DSC/FDF. > > > > ArmVirtPkg: Replace obsoleted network drivers > from > > > platform DSC/FDF. > > > > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers > in > > > MdeModulePkg. > > > > NetworkPkg: Remove some clarification from > > > TCP/PXE/ISCSI driver INF. > > > > > > > > .../Network/IScsiDxe/ComponentName.c | > 283 > > > -- > > > > .../Universal/Network/IScsiDxe/IScsiCHAP.c | > 430 > > > --- > > > > .../Universal/Network/IScsiDxe/IScsiConfig.c | > 1264 > > > ------- > > > > .../Universal/Network/IScsiDxe/IScsiDhcp.c | > 472 > > > --- > > > > .../Universal/Network/IScsiDxe/IScsiDriver.c | > 676 > > > ---- > > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | > 412 > > > --- > > > > .../Universal/Network/IScsiDxe/IScsiIbft.c | > 539 > > > --- > > > > .../Network/IScsiDxe/IScsiInitiatorName.c | > 116 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiMisc.c | > 948 > > > ------ > > > > .../Universal/Network/IScsiDxe/IScsiProto.c | > 2799 > > > --------------- > > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | > 487 > > > --- > > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | > 350 - > > > - > > > > .../Universal/Network/Tcp4Dxe/ComponentName.c | > 433 > > > --- > > > > .../Universal/Network/Tcp4Dxe/SockImpl.c | > 1201 > > > ------- > > > > .../Universal/Network/Tcp4Dxe/SockInterface.c | > 990 > > > ------ > > > > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | > 717 > > > ---- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | > 782 > > > ----- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | > 1497 > > > --------- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | > 112 > > > - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | > 674 > > > ---- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | > 940 > > > ------ > > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | > 352 > > > -- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | > 1238 > > > ------- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | > 584 > > > ---- > > > > .../Network/UefiPxeBcDxe/ComponentName.c | > 365 > > > -- > > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | > 1999 > > > ----------- > > > > .../Network/UefiPxeBcDxe/PxeBcDriver.c | > 665 > > > ---- > > > > .../Network/UefiPxeBcDxe/PxeBcImpl.c | > 2989 > > > ----------------- > > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | > 454 > > > --- > > > > .../Network/UefiPxeBcDxe/PxeBcSupport.c | > 221 > > > -- > > > > ArmVirtPkg/ArmVirtQemu.dsc | > 10 > > > +- > > > > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | > 10 > > > +- > > > > ArmVirtPkg/ArmVirtQemuKernel.dsc | > 10 > > > +- > > > > EmulatorPkg/EmulatorPkg.dsc | > 2 > > > +- > > > > EmulatorPkg/EmulatorPkg.fdf | > 2 > > > +- > > > > MdeModulePkg/MdeModulePkg.dsc | > 3 > > > - > > > > .../Network/IScsiDxe/ComponentName.h | > 165 > > > - > > > > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | > 25 > > > - > > > > .../Network/IScsiDxe/IScsi4DxeExtra.uni | > 20 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiCHAP.h | > 106 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiCommon.h | > 22 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiConfig.h | > 166 > > > - > > > > .../Network/IScsiDxe/IScsiConfigDxe.vfr | > 219 > > > -- > > > > .../IScsiDxe/IScsiConfigDxeStrings.uni | > 62 > > > - > > > > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | > 109 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiDhcp.h | > 55 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiDriver.h | > 140 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiDxe.inf | > 134 > > > - > > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | > 22 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiIbft.h | > 38 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiImpl.h | > 168 > > > - > > > > .../Network/IScsiDxe/IScsiInitiatorName.h | > 74 > > > - > > > > .../Universal/Network/IScsiDxe/IScsiMisc.h | > 317 > > > -- > > > > .../Universal/Network/IScsiDxe/IScsiProto.h | > 1005 > > > ------ > > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | > 142 > > > - > > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | > 80 > > > - > > > > .../Universal/Network/Tcp4Dxe/SockImpl.h | > 131 > > > - > > > > .../Universal/Network/Tcp4Dxe/Socket.h | > 954 > > > ------ > > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | > 342 > > > -- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | > 94 > > > - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | > 23 > > > - > > > > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | > 20 > > > - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | > 781 > > > ----- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | > 494 > > > --- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | > 130 > > > - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | > 357 > > > -- > > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | > 502 > > > --- > > > > .../Network/UefiPxeBcDxe/PxeBcDriver.h | > 102 > > > - > > > > .../Network/UefiPxeBcDxe/PxeBcImpl.h | > 189 > > > -- > > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | > 137 > > > - > > > > .../Network/UefiPxeBcDxe/PxeBcSupport.h | > 134 > > > - > > > > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | > 25 > > > - > > > > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | > 20 > > > - > > > > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | > 102 > > > - > > > > NetworkPkg/IScsiDxe/IScsiDxe.inf | > 10 > > > - > > > > NetworkPkg/TcpDxe/TcpDxe.inf | > 6 > > > - > > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | > 6 > > > - > > > > Nt32Pkg/Nt32Pkg.dsc | > 12 > > > +- > > > > Nt32Pkg/Nt32Pkg.fdf | > 12 > > > +- > > > > OvmfPkg/OvmfPkgIa32.dsc | > 12 > > > +- > > > > OvmfPkg/OvmfPkgIa32.fdf | > 10 > > > +- > > > > OvmfPkg/OvmfPkgIa32X64.dsc | > 12 > > > +- > > > > OvmfPkg/OvmfPkgIa32X64.fdf | > 10 > > > +- > > > > OvmfPkg/OvmfPkgX64.dsc | > 12 > > > +- > > > > OvmfPkg/OvmfPkgX64.fdf | > 10 > > > +- > > > > Vlv2TbltDevicePkg/PlatformPkg.fdf | > 14 > > > +- > > > > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | > 14 > > > +- > > > > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | > 18 > > > +- > > > > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | > 18 > > > +- > > > > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | > 18 > > > +- > > > > 90 files changed, 55 insertions(+), 32771 > deletions(- > > > ) delete mode > > > > 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPass > > > Thru.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorNa > > > me.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentNam > > > e.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver. > > > c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport > > > .c > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.u > > > ni > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.v > > > fr > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeSt > > > rings.uni > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDat > > > aStruc.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPass > > > Thru.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorNa > > > me.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > > > delete mode 100644 > > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver. > > > h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport > > > .h > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDx > > > e.uni > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDx > > > eExtra.uni > > > > delete mode 100644 > > > > > > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe > > > .inf > > > > > > > > -- > > > > 2.18.0.windows.1 > > > > > > > > _______________________________________________ > > > > edk2-devel mailing list > > > > edk2-devel@lists.01.org > > > > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan ` (7 preceding siblings ...) 2018-10-30 7:42 ` [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Zeng, Star @ 2018-10-30 10:50 ` Leif Lindholm 2018-10-31 0:41 ` Fu, Siyuan 8 siblings, 1 reply; 29+ messages in thread From: Leif Lindholm @ 2018-10-30 10:50 UTC (permalink / raw) To: Fu Siyuan; +Cc: edk2-devel On Tue, Oct 30, 2018 at 03:33:21PM +0800, Fu Siyuan wrote: > This patch series is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe > drivers in MdeModulePkg. These drivers will not be maintained and can't > co-work with the dual-stack drivers in NetworkPkg. > > People should use below NetworkPkg drivers instead: > NetworkPkg/IScsiDxe/IScsiDxe.inf > NetworkPkg/TcpDxe/TcpDxe.inf > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > These drivers are actively maintained with more bug fixes and new feature > support. > > Patch 1~5 update edk2 platform DSC/FDF files to use NetworkPkg drivers. > Patch 6 deletes the TCP,PXE,iSCSI driver in MdeModulePkg. > Patch 7 removes some clarification in NetworkPkg drivers since the > related driver has been deleted in Patch 6. > > Fu Siyuan (7): > Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. > EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. > OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. > Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. > ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. > NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. > > .../Network/IScsiDxe/ComponentName.c | 283 -- > .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- > .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ------- > .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 --- > .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 ---- > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- > .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 --- > .../Network/IScsiDxe/IScsiInitiatorName.c | 116 - > .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ > .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------- > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 --- If there is a v2, can you follow the steps from https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt-git-guide-for-edk2-contributors-and-maintainers#contrib-23 when generating it, to order the files, and to get rid of the ... truncation of file names? Regards, Leif > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 -- > .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- > .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ------- > .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------ > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---- > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --------- > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 -- > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ------- > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- > .../Network/UefiPxeBcDxe/ComponentName.c | 365 -- > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ----------- > .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---- > .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 ----------------- > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- > .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- > ArmVirtPkg/ArmVirtQemu.dsc | 10 +- > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +- > ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +- > EmulatorPkg/EmulatorPkg.dsc | 2 +- > EmulatorPkg/EmulatorPkg.fdf | 2 +- > MdeModulePkg/MdeModulePkg.dsc | 3 - > .../Network/IScsiDxe/ComponentName.h | 165 - > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - > .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - > .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - > .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 - > .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 - > .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- > .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 - > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - > .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - > .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 - > .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - > .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 - > .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 - > .../Network/IScsiDxe/IScsiInitiatorName.h | 74 - > .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 -- > .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------ > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - > .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 - > .../Universal/Network/Tcp4Dxe/Socket.h | 954 ------ > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 -- > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 -- > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --- > .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - > .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - > .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - > NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 - > NetworkPkg/TcpDxe/TcpDxe.inf | 6 - > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 - > Nt32Pkg/Nt32Pkg.dsc | 12 +- > Nt32Pkg/Nt32Pkg.fdf | 12 +- > OvmfPkg/OvmfPkgIa32.dsc | 12 +- > OvmfPkg/OvmfPkgIa32.fdf | 10 +- > OvmfPkg/OvmfPkgIa32X64.dsc | 12 +- > OvmfPkg/OvmfPkgIa32X64.fdf | 10 +- > OvmfPkg/OvmfPkgX64.dsc | 12 +- > OvmfPkg/OvmfPkgX64.fdf | 10 +- > Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +- > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +- > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +- > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +- > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +- > 90 files changed, 55 insertions(+), 32771 deletions(-) > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni > delete mode 100644 MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > -- > 2.18.0.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-30 10:50 ` Leif Lindholm @ 2018-10-31 0:41 ` Fu, Siyuan 2018-10-31 10:59 ` Leif Lindholm 0 siblings, 1 reply; 29+ messages in thread From: Fu, Siyuan @ 2018-10-31 0:41 UTC (permalink / raw) To: Leif Lindholm; +Cc: edk2-devel@lists.01.org Hi, Leif I have followed your wiki page to configure my Git when I generate this patch, and I don't know why the files are still unordered and truncated. I will do more test and try to figure out the problem. BestRegards Fu Siyuan > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of > Leif Lindholm > Sent: Tuesday, October 30, 2018 6:51 PM > To: Fu, Siyuan <siyuan.fu@intel.com> > Cc: edk2-devel@lists.01.org > Subject: Re: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in > MdeModulePkg. > > On Tue, Oct 30, 2018 at 03:33:21PM +0800, Fu Siyuan wrote: > > This patch series is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe > > drivers in MdeModulePkg. These drivers will not be maintained and can't > > co-work with the dual-stack drivers in NetworkPkg. > > > > People should use below NetworkPkg drivers instead: > > NetworkPkg/IScsiDxe/IScsiDxe.inf > > NetworkPkg/TcpDxe/TcpDxe.inf > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > > These drivers are actively maintained with more bug fixes and new > feature > > support. > > > > Patch 1~5 update edk2 platform DSC/FDF files to use NetworkPkg drivers. > > Patch 6 deletes the TCP,PXE,iSCSI driver in MdeModulePkg. > > Patch 7 removes some clarification in NetworkPkg drivers since the > > related driver has been deleted in Patch 6. > > > > Fu Siyuan (7): > > Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. > > EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. > > OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. > > Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. > > ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. > > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. > > NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. > > > > .../Network/IScsiDxe/ComponentName.c | 283 -- > > .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- > > .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ------- > > .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 --- > > .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 ---- > > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- > > .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 --- > > .../Network/IScsiDxe/IScsiInitiatorName.c | 116 - > > .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ > > .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------- > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 --- > > If there is a v2, can you follow the steps from > https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt- > git-guide-for-edk2-contributors-and-maintainers#contrib-23 > when generating it, to order the files, and to get rid of the > ... truncation of file names? > > Regards, > > Leif > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 -- > > .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- > > .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ------- > > .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------ > > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---- > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- > > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --------- > > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - > > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- > > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ > > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 -- > > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ------- > > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- > > .../Network/UefiPxeBcDxe/ComponentName.c | 365 -- > > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ----------- > > .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---- > > .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 ----------------- > > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- > > .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- > > ArmVirtPkg/ArmVirtQemu.dsc | 10 +- > > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +- > > ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +- > > EmulatorPkg/EmulatorPkg.dsc | 2 +- > > EmulatorPkg/EmulatorPkg.fdf | 2 +- > > MdeModulePkg/MdeModulePkg.dsc | 3 - > > .../Network/IScsiDxe/ComponentName.h | 165 - > > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - > > .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - > > .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - > > .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 - > > .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 - > > .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- > > .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 - > > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - > > .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - > > .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 - > > .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - > > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - > > .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 - > > .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 - > > .../Network/IScsiDxe/IScsiInitiatorName.h | 74 - > > .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 -- > > .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------ > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - > > .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 - > > .../Universal/Network/Tcp4Dxe/Socket.h | 954 ------ > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 -- > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - > > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - > > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- > > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- > > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - > > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 -- > > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --- > > .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - > > .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- > > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - > > .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - > > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - > > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - > > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - > > NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 - > > NetworkPkg/TcpDxe/TcpDxe.inf | 6 - > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 - > > Nt32Pkg/Nt32Pkg.dsc | 12 +- > > Nt32Pkg/Nt32Pkg.fdf | 12 +- > > OvmfPkg/OvmfPkgIa32.dsc | 12 +- > > OvmfPkg/OvmfPkgIa32.fdf | 10 +- > > OvmfPkg/OvmfPkgIa32X64.dsc | 12 +- > > OvmfPkg/OvmfPkgIa32X64.fdf | 10 +- > > OvmfPkg/OvmfPkgX64.dsc | 12 +- > > OvmfPkg/OvmfPkgX64.fdf | 10 +- > > Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +- > > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +- > > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +- > > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +- > > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +- > > 90 files changed, 55 insertions(+), 32771 deletions(-) > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > delete mode 100644 > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > delete mode 100644 > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni > > delete mode 100644 > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > > > -- > > 2.18.0.windows.1 > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-31 0:41 ` Fu, Siyuan @ 2018-10-31 10:59 ` Leif Lindholm 2018-10-31 14:02 ` Gao, Liming 2018-11-05 22:12 ` Laszlo Ersek 0 siblings, 2 replies; 29+ messages in thread From: Leif Lindholm @ 2018-10-31 10:59 UTC (permalink / raw) To: Fu, Siyuan; +Cc: edk2-devel@lists.01.org, Ming Huang Hi Fu Siyuan, Hmm, strange. Ming Huang (cc) has also had issues with this in his latest set (but not before). Can you guys work together to try to figure out what is going wrong? Can you start by testing with an older version of git? Best Regards, Leif On Wed, Oct 31, 2018 at 12:41:39AM +0000, Fu, Siyuan wrote: > Hi, Leif > > I have followed your wiki page to configure my Git when I generate > this patch, and I don't know why the files are still unordered and > truncated. I will do more test and try to figure out the problem. > > BestRegards > Fu Siyuan > > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of > > Leif Lindholm > > Sent: Tuesday, October 30, 2018 6:51 PM > > To: Fu, Siyuan <siyuan.fu@intel.com> > > Cc: edk2-devel@lists.01.org > > Subject: Re: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in > > MdeModulePkg. > > > > On Tue, Oct 30, 2018 at 03:33:21PM +0800, Fu Siyuan wrote: > > > This patch series is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe > > > drivers in MdeModulePkg. These drivers will not be maintained and can't > > > co-work with the dual-stack drivers in NetworkPkg. > > > > > > People should use below NetworkPkg drivers instead: > > > NetworkPkg/IScsiDxe/IScsiDxe.inf > > > NetworkPkg/TcpDxe/TcpDxe.inf > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > > > These drivers are actively maintained with more bug fixes and new > > feature > > > support. > > > > > > Patch 1~5 update edk2 platform DSC/FDF files to use NetworkPkg drivers. > > > Patch 6 deletes the TCP,PXE,iSCSI driver in MdeModulePkg. > > > Patch 7 removes some clarification in NetworkPkg drivers since the > > > related driver has been deleted in Patch 6. > > > > > > Fu Siyuan (7): > > > Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. > > > EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. > > > OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. > > > Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. > > > ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. > > > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. > > > NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. > > > > > > .../Network/IScsiDxe/ComponentName.c | 283 -- > > > .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- > > > .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ------- > > > .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 --- > > > .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 ---- > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- > > > .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 --- > > > .../Network/IScsiDxe/IScsiInitiatorName.c | 116 - > > > .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ > > > .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------- > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 --- > > > > If there is a v2, can you follow the steps from > > https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt- > > git-guide-for-edk2-contributors-and-maintainers#contrib-23 > > when generating it, to order the files, and to get rid of the > > ... truncation of file names? > > > > Regards, > > > > Leif > > > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 -- > > > .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- > > > .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ------- > > > .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------ > > > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---- > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- > > > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --------- > > > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- > > > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 -- > > > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ------- > > > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- > > > .../Network/UefiPxeBcDxe/ComponentName.c | 365 -- > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ----------- > > > .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---- > > > .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 ----------------- > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- > > > .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- > > > ArmVirtPkg/ArmVirtQemu.dsc | 10 +- > > > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +- > > > ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +- > > > EmulatorPkg/EmulatorPkg.dsc | 2 +- > > > EmulatorPkg/EmulatorPkg.fdf | 2 +- > > > MdeModulePkg/MdeModulePkg.dsc | 3 - > > > .../Network/IScsiDxe/ComponentName.h | 165 - > > > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - > > > .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - > > > .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - > > > .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 - > > > .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 - > > > .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- > > > .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 - > > > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - > > > .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - > > > .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 - > > > .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - > > > .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 - > > > .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 - > > > .../Network/IScsiDxe/IScsiInitiatorName.h | 74 - > > > .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 -- > > > .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------ > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - > > > .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 - > > > .../Universal/Network/Tcp4Dxe/Socket.h | 954 ------ > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 -- > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - > > > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - > > > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - > > > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 -- > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --- > > > .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - > > > .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - > > > .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - > > > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - > > > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - > > > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - > > > NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 - > > > NetworkPkg/TcpDxe/TcpDxe.inf | 6 - > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 - > > > Nt32Pkg/Nt32Pkg.dsc | 12 +- > > > Nt32Pkg/Nt32Pkg.fdf | 12 +- > > > OvmfPkg/OvmfPkgIa32.dsc | 12 +- > > > OvmfPkg/OvmfPkgIa32.fdf | 10 +- > > > OvmfPkg/OvmfPkgIa32X64.dsc | 12 +- > > > OvmfPkg/OvmfPkgIa32X64.fdf | 10 +- > > > OvmfPkg/OvmfPkgX64.dsc | 12 +- > > > OvmfPkg/OvmfPkgX64.fdf | 10 +- > > > Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +- > > > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +- > > > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +- > > > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +- > > > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +- > > > 90 files changed, 55 insertions(+), 32771 deletions(-) > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > > delete mode 100644 > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni > > > delete mode 100644 > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > > > > > -- > > > 2.18.0.windows.1 > > > > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org > > > https://lists.01.org/mailman/listinfo/edk2-devel > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-31 10:59 ` Leif Lindholm @ 2018-10-31 14:02 ` Gao, Liming 2018-11-05 22:12 ` Laszlo Ersek 1 sibling, 0 replies; 29+ messages in thread From: Gao, Liming @ 2018-10-31 14:02 UTC (permalink / raw) To: Leif Lindholm, Fu, Siyuan; +Cc: edk2-devel@lists.01.org I use git version 2.10.0. It can generate the full file path in the patch. > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Leif Lindholm > Sent: Wednesday, October 31, 2018 6:59 PM > To: Fu, Siyuan <siyuan.fu@intel.com> > Cc: edk2-devel@lists.01.org > Subject: Re: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. > > Hi Fu Siyuan, > > Hmm, strange. > > Ming Huang (cc) has also had issues with this in his latest set (but > not before). Can you guys work together to try to figure out what is > going wrong? > > Can you start by testing with an older version of git? > > Best Regards, > > Leif > > On Wed, Oct 31, 2018 at 12:41:39AM +0000, Fu, Siyuan wrote: > > Hi, Leif > > > > I have followed your wiki page to configure my Git when I generate > > this patch, and I don't know why the files are still unordered and > > truncated. I will do more test and try to figure out the problem. > > > > BestRegards > > Fu Siyuan > > > > > -----Original Message----- > > > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of > > > Leif Lindholm > > > Sent: Tuesday, October 30, 2018 6:51 PM > > > To: Fu, Siyuan <siyuan.fu@intel.com> > > > Cc: edk2-devel@lists.01.org > > > Subject: Re: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in > > > MdeModulePkg. > > > > > > On Tue, Oct 30, 2018 at 03:33:21PM +0800, Fu Siyuan wrote: > > > > This patch series is to delete the Tcp4Dxe, UefiPxeBcDxe and IScsi4Dxe > > > > drivers in MdeModulePkg. These drivers will not be maintained and can't > > > > co-work with the dual-stack drivers in NetworkPkg. > > > > > > > > People should use below NetworkPkg drivers instead: > > > > NetworkPkg/IScsiDxe/IScsiDxe.inf > > > > NetworkPkg/TcpDxe/TcpDxe.inf > > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf > > > > These drivers are actively maintained with more bug fixes and new > > > feature > > > > support. > > > > > > > > Patch 1~5 update edk2 platform DSC/FDF files to use NetworkPkg drivers. > > > > Patch 6 deletes the TCP,PXE,iSCSI driver in MdeModulePkg. > > > > Patch 7 removes some clarification in NetworkPkg drivers since the > > > > related driver has been deleted in Patch 6. > > > > > > > > Fu Siyuan (7): > > > > Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF. > > > > EmulatorPkg: Replace obsoleted network drivers from platform DSC/FDF. > > > > OvmfPkg: Replace obsoleted network drivers from platform DSC/FDF. > > > > Vlv2TbltDevicePkg: Replace obsoleted drivers from platform DSC/FDF. > > > > ArmVirtPkg: Replace obsoleted network drivers from platform DSC/FDF. > > > > MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg. > > > > NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF. > > > > > > > > .../Network/IScsiDxe/ComponentName.c | 283 -- > > > > .../Universal/Network/IScsiDxe/IScsiCHAP.c | 430 --- > > > > .../Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ------- > > > > .../Universal/Network/IScsiDxe/IScsiDhcp.c | 472 --- > > > > .../Universal/Network/IScsiDxe/IScsiDriver.c | 676 ---- > > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 --- > > > > .../Universal/Network/IScsiDxe/IScsiIbft.c | 539 --- > > > > .../Network/IScsiDxe/IScsiInitiatorName.c | 116 - > > > > .../Universal/Network/IScsiDxe/IScsiMisc.c | 948 ------ > > > > .../Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------- > > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 --- > > > > > > If there is a v2, can you follow the steps from > > > https://github.com/tianocore/tianocore.github.io/wiki/Laszlo's-unkempt- > > > git-guide-for-edk2-contributors-and-maintainers#contrib-23 > > > when generating it, to order the files, and to get rid of the > > > ... truncation of file names? > > > > > > Regards, > > > > > > Leif > > > > > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 -- > > > > .../Universal/Network/Tcp4Dxe/ComponentName.c | 433 --- > > > > .../Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ------- > > > > .../Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------ > > > > .../Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ----- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 --------- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 ---- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------ > > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 -- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ------- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 ---- > > > > .../Network/UefiPxeBcDxe/ComponentName.c | 365 -- > > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 ----------- > > > > .../Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---- > > > > .../Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 ----------------- > > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --- > > > > .../Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -- > > > > ArmVirtPkg/ArmVirtQemu.dsc | 10 +- > > > > ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 10 +- > > > > ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +- > > > > EmulatorPkg/EmulatorPkg.dsc | 2 +- > > > > EmulatorPkg/EmulatorPkg.fdf | 2 +- > > > > MdeModulePkg/MdeModulePkg.dsc | 3 - > > > > .../Network/IScsiDxe/ComponentName.h | 165 - > > > > .../Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 - > > > > .../Network/IScsiDxe/IScsi4DxeExtra.uni | 20 - > > > > .../Universal/Network/IScsiDxe/IScsiCHAP.h | 106 - > > > > .../Universal/Network/IScsiDxe/IScsiCommon.h | 22 - > > > > .../Universal/Network/IScsiDxe/IScsiConfig.h | 166 - > > > > .../Network/IScsiDxe/IScsiConfigDxe.vfr | 219 -- > > > > .../IScsiDxe/IScsiConfigDxeStrings.uni | 62 - > > > > .../Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 - > > > > .../Universal/Network/IScsiDxe/IScsiDhcp.h | 55 - > > > > .../Universal/Network/IScsiDxe/IScsiDriver.h | 140 - > > > > .../Universal/Network/IScsiDxe/IScsiDxe.inf | 134 - > > > > .../Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 - > > > > .../Universal/Network/IScsiDxe/IScsiIbft.h | 38 - > > > > .../Universal/Network/IScsiDxe/IScsiImpl.h | 168 - > > > > .../Network/IScsiDxe/IScsiInitiatorName.h | 74 - > > > > .../Universal/Network/IScsiDxe/IScsiMisc.h | 317 -- > > > > .../Universal/Network/IScsiDxe/IScsiProto.h | 1005 ------ > > > > .../Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 - > > > > MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 - > > > > .../Universal/Network/Tcp4Dxe/SockImpl.h | 131 - > > > > .../Universal/Network/Tcp4Dxe/Socket.h | 954 ------ > > > > .../Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 -- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - > > > > .../Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ----- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 --- > > > > .../Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 - > > > > .../Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 -- > > > > .../Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --- > > > > .../Network/UefiPxeBcDxe/PxeBcDriver.h | 102 - > > > > .../Network/UefiPxeBcDxe/PxeBcImpl.h | 189 -- > > > > .../Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 - > > > > .../Network/UefiPxeBcDxe/PxeBcSupport.h | 134 - > > > > .../Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 - > > > > .../UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni | 20 - > > > > .../Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 - > > > > NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 - > > > > NetworkPkg/TcpDxe/TcpDxe.inf | 6 - > > > > NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 - > > > > Nt32Pkg/Nt32Pkg.dsc | 12 +- > > > > Nt32Pkg/Nt32Pkg.fdf | 12 +- > > > > OvmfPkg/OvmfPkgIa32.dsc | 12 +- > > > > OvmfPkg/OvmfPkgIa32.fdf | 10 +- > > > > OvmfPkg/OvmfPkgIa32X64.dsc | 12 +- > > > > OvmfPkg/OvmfPkgIa32X64.fdf | 10 +- > > > > OvmfPkg/OvmfPkgX64.dsc | 12 +- > > > > OvmfPkg/OvmfPkgX64.fdf | 10 +- > > > > Vlv2TbltDevicePkg/PlatformPkg.fdf | 14 +- > > > > Vlv2TbltDevicePkg/PlatformPkgGcc.fdf | 14 +- > > > > Vlv2TbltDevicePkg/PlatformPkgGccX64.dsc | 18 +- > > > > Vlv2TbltDevicePkg/PlatformPkgIA32.dsc | 18 +- > > > > Vlv2TbltDevicePkg/PlatformPkgX64.dsc | 18 +- > > > > 90 files changed, 55 insertions(+), 32771 deletions(-) > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/IScsiDxe/Md5.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h > > > > delete mode 100644 MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni > > > > delete mode 100644 > > > MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf > > > > > > > > -- > > > > 2.18.0.windows.1 > > > > > > > > _______________________________________________ > > > > edk2-devel mailing list > > > > edk2-devel@lists.01.org > > > > https://lists.01.org/mailman/listinfo/edk2-devel > > > _______________________________________________ > > > edk2-devel mailing list > > > edk2-devel@lists.01.org > > > https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-10-31 10:59 ` Leif Lindholm 2018-10-31 14:02 ` Gao, Liming @ 2018-11-05 22:12 ` Laszlo Ersek 2018-11-06 0:59 ` Fu, Siyuan 2018-11-06 11:02 ` Leif Lindholm 1 sibling, 2 replies; 29+ messages in thread From: Laszlo Ersek @ 2018-11-05 22:12 UTC (permalink / raw) To: Leif Lindholm, Fu, Siyuan; +Cc: edk2-devel@lists.01.org Hi Leif, On 10/31/18 11:59, Leif Lindholm wrote: > Hi Fu Siyuan, > > Hmm, strange. > > Ming Huang (cc) has also had issues with this in his latest set (but > not before). Can you guys work together to try to figure out what is > going wrong? > > Can you start by testing with an older version of git? this is indeed a git regression. I ran into it myself recently, when I upgraded git from v2.14.1 to v2.19.1. I dug a little into the git source code, but couldn't spend much time on it. Ultimately I rolled back the upgrade. The diffstats are still well-formed (not truncated) in the individual patch emails, under v2.19.1, as long as the "recommended" options are used on the cmdline. However, the cumulative diffstat is truncated regardless. I couldn't convince git v2.19.1 to keep the previous (desired) behavior. "Documentation/RelNotes/2.17.0.txt" has some words on "diffstat". Thanks Laszlo ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-11-05 22:12 ` Laszlo Ersek @ 2018-11-06 0:59 ` Fu, Siyuan 2018-11-06 14:38 ` Laszlo Ersek 2018-11-06 11:02 ` Leif Lindholm 1 sibling, 1 reply; 29+ messages in thread From: Fu, Siyuan @ 2018-11-06 0:59 UTC (permalink / raw) To: Laszlo Ersek, Leif Lindholm; +Cc: edk2-devel@lists.01.org Hi, Leif and Laszlo > -----Original Message----- > From: Laszlo Ersek [mailto:lersek@redhat.com] > Sent: Tuesday, November 6, 2018 6:12 AM > To: Leif Lindholm <leif.lindholm@linaro.org>; Fu, Siyuan > <siyuan.fu@intel.com> > Cc: edk2-devel@lists.01.org > Subject: Re: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in > MdeModulePkg. > > Hi Leif, > > On 10/31/18 11:59, Leif Lindholm wrote: > > Hi Fu Siyuan, > > > > Hmm, strange. > > > > Ming Huang (cc) has also had issues with this in his latest set (but > > not before). Can you guys work together to try to figure out what is > > going wrong? > > > > Can you start by testing with an older version of git? > > this is indeed a git regression. I ran into it myself recently, when I > upgraded git from v2.14.1 to v2.19.1. I dug a little into the git source > code, but couldn't spend much time on it. Ultimately I rolled back the > upgrade. > > The diffstats are still well-formed (not truncated) in the individual > patch emails, under v2.19.1, as long as the "recommended" options are > used on the cmdline. However, the cumulative diffstat is truncated > regardless. I couldn't convince git v2.19.1 to keep the previous > (desired) behavior. So should I rollback my Git to v2.14.1, or the new truncated cumulative diffstat is also acceptable? > > "Documentation/RelNotes/2.17.0.txt" has some words on "diffstat". > > Thanks > Laszlo ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-11-06 0:59 ` Fu, Siyuan @ 2018-11-06 14:38 ` Laszlo Ersek 0 siblings, 0 replies; 29+ messages in thread From: Laszlo Ersek @ 2018-11-06 14:38 UTC (permalink / raw) To: Fu, Siyuan, Leif Lindholm; +Cc: edk2-devel@lists.01.org On 11/06/18 01:59, Fu, Siyuan wrote: > Hi, Leif and Laszlo > > >> -----Original Message----- >> From: Laszlo Ersek [mailto:lersek@redhat.com] >> Sent: Tuesday, November 6, 2018 6:12 AM >> To: Leif Lindholm <leif.lindholm@linaro.org>; Fu, Siyuan >> <siyuan.fu@intel.com> >> Cc: edk2-devel@lists.01.org >> Subject: Re: [edk2] [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in >> MdeModulePkg. >> >> Hi Leif, >> >> On 10/31/18 11:59, Leif Lindholm wrote: >>> Hi Fu Siyuan, >>> >>> Hmm, strange. >>> >>> Ming Huang (cc) has also had issues with this in his latest set (but >>> not before). Can you guys work together to try to figure out what is >>> going wrong? >>> >>> Can you start by testing with an older version of git? >> >> this is indeed a git regression. I ran into it myself recently, when I >> upgraded git from v2.14.1 to v2.19.1. I dug a little into the git source >> code, but couldn't spend much time on it. Ultimately I rolled back the >> upgrade. >> >> The diffstats are still well-formed (not truncated) in the individual >> patch emails, under v2.19.1, as long as the "recommended" options are >> used on the cmdline. However, the cumulative diffstat is truncated >> regardless. I couldn't convince git v2.19.1 to keep the previous >> (desired) behavior. > > So should I rollback my Git to v2.14.1, or the new truncated cumulative > diffstat is also acceptable? Leif identified the culprit git patch as commit 43662b23abbd ("format-patch: keep cover-letter diffstat wrapped in 72 columns", 2018-01-25), and that commit was part of release v2.17.0. Therefore, if you could roll back to v2.16.5 (the latest stable release of v2.16), that should mitigate this issue. (I haven't checked whether running upstream v2.16.* binaries is advisable from a security perspective.) Thanks Laszlo ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-11-05 22:12 ` Laszlo Ersek 2018-11-06 0:59 ` Fu, Siyuan @ 2018-11-06 11:02 ` Leif Lindholm 2018-11-06 14:34 ` Laszlo Ersek 1 sibling, 1 reply; 29+ messages in thread From: Leif Lindholm @ 2018-11-06 11:02 UTC (permalink / raw) To: Laszlo Ersek; +Cc: Fu, Siyuan, edk2-devel@lists.01.org On Mon, Nov 05, 2018 at 11:12:20PM +0100, Laszlo Ersek wrote: > > Ming Huang (cc) has also had issues with this in his latest set (but > > not before). Can you guys work together to try to figure out what is > > going wrong? > > > > Can you start by testing with an older version of git? > > this is indeed a git regression. I ran into it myself recently, when I > upgraded git from v2.14.1 to v2.19.1. I dug a little into the git source > code, but couldn't spend much time on it. Ultimately I rolled back the > upgrade. Argh. > The diffstats are still well-formed (not truncated) in the individual > patch emails, under v2.19.1, as long as the "recommended" options are > used on the cmdline. However, the cumulative diffstat is truncated > regardless. I couldn't convince git v2.19.1 to keep the previous > (desired) behavior. > > "Documentation/RelNotes/2.17.0.txt" has some words on "diffstat". Thanks for tracking this down. I've submitted a patch here: https://public-inbox.org/git/20181106104811.14625-1-leif.lindholm@linaro.org/T/#u But I guess we'll just need to live with this for a while :/ / Leif ^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg. 2018-11-06 11:02 ` Leif Lindholm @ 2018-11-06 14:34 ` Laszlo Ersek 0 siblings, 0 replies; 29+ messages in thread From: Laszlo Ersek @ 2018-11-06 14:34 UTC (permalink / raw) To: Leif Lindholm; +Cc: Fu, Siyuan, edk2-devel@lists.01.org On 11/06/18 12:02, Leif Lindholm wrote: > On Mon, Nov 05, 2018 at 11:12:20PM +0100, Laszlo Ersek wrote: >>> Ming Huang (cc) has also had issues with this in his latest set (but >>> not before). Can you guys work together to try to figure out what is >>> going wrong? >>> >>> Can you start by testing with an older version of git? >> >> this is indeed a git regression. I ran into it myself recently, when I >> upgraded git from v2.14.1 to v2.19.1. I dug a little into the git source >> code, but couldn't spend much time on it. Ultimately I rolled back the >> upgrade. > > Argh. > >> The diffstats are still well-formed (not truncated) in the individual >> patch emails, under v2.19.1, as long as the "recommended" options are >> used on the cmdline. However, the cumulative diffstat is truncated >> regardless. I couldn't convince git v2.19.1 to keep the previous >> (desired) behavior. >> >> "Documentation/RelNotes/2.17.0.txt" has some words on "diffstat". > > Thanks for tracking this down. I've submitted a patch here: > https://public-inbox.org/git/20181106104811.14625-1-leif.lindholm@linaro.org/T/#u Awesome, I'll test it and report back on the git list. Thanks! Laszlo ^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2018-11-06 14:39 UTC | newest] Thread overview: 29+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-10-30 7:33 [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 1/7] Nt32Pkg: Replace obsoleted network drivers from NT32 platform DSC/FDF Fu Siyuan 2018-10-30 7:57 ` Ni, Ruiyu 2018-10-30 7:33 ` [PATCH v1 2/7] EmulatorPkg: Replace obsoleted network drivers from " Fu Siyuan 2018-10-30 7:57 ` Ni, Ruiyu 2018-10-30 7:33 ` [PATCH v1 3/7] OvmfPkg: " Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 4/7] Vlv2TbltDevicePkg: Replace obsoleted " Fu Siyuan 2018-11-04 6:14 ` Wei, David 2018-10-30 7:33 ` [PATCH v1 5/7] ArmVirtPkg: Replace obsoleted network " Fu Siyuan 2018-10-30 7:33 ` [PATCH v1 6/7] MdeModulePkg: Delete the TCP/PXE/ISCSI drivers in MdeModulePkg Fu Siyuan 2018-10-31 8:23 ` Ni, Ruiyu 2018-10-31 8:37 ` Fu, Siyuan 2018-11-01 3:08 ` Zeng, Star 2018-10-30 7:33 ` [PATCH v1 7/7] NetworkPkg: Remove some clarification from TCP/PXE/ISCSI driver INF Fu Siyuan 2018-10-30 8:16 ` Ye, Ting 2018-10-30 7:42 ` [PATCH v1 0/7] Delete TCP, PXE, iSCSI driver in MdeModulePkg Zeng, Star 2018-10-30 8:23 ` Fu, Siyuan 2018-10-30 21:14 ` Kinney, Michael D 2018-10-31 0:51 ` Fu, Siyuan 2018-10-31 16:29 ` Kinney, Michael D 2018-10-30 10:50 ` Leif Lindholm 2018-10-31 0:41 ` Fu, Siyuan 2018-10-31 10:59 ` Leif Lindholm 2018-10-31 14:02 ` Gao, Liming 2018-11-05 22:12 ` Laszlo Ersek 2018-11-06 0:59 ` Fu, Siyuan 2018-11-06 14:38 ` Laszlo Ersek 2018-11-06 11:02 ` Leif Lindholm 2018-11-06 14:34 ` Laszlo Ersek
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox