diff options
4 files changed, 29 insertions, 11 deletions
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c index f2d8eec..d2e60b6 100644 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c +++ b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c @@ -1270,7 +1270,9 @@ PxeBcDiscvBootService ( //
// free the responselist
//
- FreePool (Token.ResponseList);
+ if (Token.ResponseList != NULL) {
+ FreePool (Token.ResponseList);
+ }
}
//
// Free the dhcp packet
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c index 9dc32f2..f82f744 100644 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c +++ b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c @@ -152,6 +152,7 @@ PxeBcDriverBindingStart ( PXEBC_PRIVATE_DATA *Private;
UINTN Index;
EFI_STATUS Status;
+ EFI_IP4_MODE_DATA Ip4ModeData;
Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));
if (Private == NULL) {
@@ -253,6 +254,16 @@ PxeBcDriverBindingStart ( 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,
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c index e5ff4ad..df9d2df 100644 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c +++ b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c @@ -347,6 +347,11 @@ EfiPxeBcStart ( return Status;
}
+ //
+ // Configure block size for TFTP as a default value to handle all link layers.
+ //
+ Private->BlockSize = (UINTN) (MIN (Private->Ip4MaxPacketSize, PXEBC_DEFAULT_PACKET_SIZE) -
+ PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE);
Private->AddressIsOk = FALSE;
ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE));
@@ -2421,7 +2426,6 @@ DiscoverBootFile ( UINT16 Type;
UINT16 Layer;
BOOLEAN UseBis;
- UINTN BlockSize;
PXEBC_CACHED_DHCP4_PACKET *Packet;
UINT16 Value;
@@ -2466,7 +2470,6 @@ DiscoverBootFile ( }
*BufferSize = 0;
- BlockSize = 0x8000;
//
// Get bootfile name and (m)tftp server ip addresss
@@ -2526,7 +2529,7 @@ DiscoverBootFile ( Buffer,
FALSE,
BufferSize,
- &BlockSize,
+ &Private->BlockSize,
&Private->ServerIp,
(UINT8 *) Private->BootFileName,
NULL,
@@ -2580,14 +2583,12 @@ EfiPxeLoadFile ( PXEBC_PRIVATE_DATA *Private;
EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
BOOLEAN NewMakeCallback;
- UINTN BlockSize;
EFI_STATUS Status;
UINT64 TmpBufSize;
Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This);
PxeBc = &Private->PxeBc;
NewMakeCallback = FALSE;
- BlockSize = 0x8000;
Status = EFI_DEVICE_ERROR;
if (This == NULL || BufferSize == NULL) {
@@ -2646,7 +2647,7 @@ EfiPxeLoadFile ( Buffer,
FALSE,
&TmpBufSize,
- &BlockSize,
+ &Private->BlockSize,
&Private->ServerIp,
(UINT8 *) Private->BootFileName,
NULL,
@@ -2670,7 +2671,7 @@ EfiPxeLoadFile ( Buffer,
FALSE,
&TmpBufSize,
- &BlockSize,
+ &Private->BlockSize,
&Private->ServerIp,
(UINT8 *) Private->BootFileName,
NULL,
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h index e8c278d..807e4d1 100644 --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h +++ b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h @@ -47,8 +47,11 @@ typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA; #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_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
struct _PXEBC_PRIVATE_DATA {
UINT32 Signature;
@@ -88,7 +91,8 @@ struct _PXEBC_PRIVATE_DATA { EFI_IP_ADDRESS GatewayIp;
EFI_IP_ADDRESS ServerIp;
BOOLEAN AddressIsOk;
-
+ UINT32 Ip4MaxPacketSize;
+ UINTN BlockSize;
UINTN FileSize;
UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE];
|