//\r
// free the responselist\r
//\r
- FreePool (Token.ResponseList);\r
+ if (Token.ResponseList != NULL) {\r
+ FreePool (Token.ResponseList);\r
+ }\r
}\r
//\r
// Free the dhcp packet\r
PXEBC_PRIVATE_DATA *Private;\r
UINTN Index;\r
EFI_STATUS Status;\r
+ EFI_IP4_MODE_DATA Ip4ModeData;\r
\r
Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
if (Private == NULL) {\r
if (EFI_ERROR (Status)) {\r
goto ON_ERROR;\r
}\r
+
+ //
+ // Get max packet size from Ip4 to calculate block size for Tftp later.\r
+ //
+ Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);
+ if (EFI_ERROR (Status)) {
+ goto ON_ERROR;
+ }
+
+ Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;\r
\r
Status = NetLibCreateServiceChild (\r
ControllerHandle,\r
return Status;\r
}\r
\r
+ //\r
+ // Configure block size for TFTP as a default value to handle all link layers.\r
+ // \r
+ Private->BlockSize = (UINTN) (MIN (Private->Ip4MaxPacketSize, PXEBC_DEFAULT_PACKET_SIZE) - \r
+ PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE);\r
Private->AddressIsOk = FALSE;\r
\r
ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE));\r
UINT16 Type;\r
UINT16 Layer;\r
BOOLEAN UseBis;\r
- UINTN BlockSize;\r
PXEBC_CACHED_DHCP4_PACKET *Packet;\r
UINT16 Value;\r
\r
}\r
\r
*BufferSize = 0;\r
- BlockSize = 0x8000;\r
\r
//\r
// Get bootfile name and (m)tftp server ip addresss\r
Buffer,\r
FALSE,\r
BufferSize,\r
- &BlockSize,\r
+ &Private->BlockSize,\r
&Private->ServerIp,\r
(UINT8 *) Private->BootFileName,\r
NULL,\r
PXEBC_PRIVATE_DATA *Private;\r
EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;\r
BOOLEAN NewMakeCallback;\r
- UINTN BlockSize;\r
EFI_STATUS Status;\r
UINT64 TmpBufSize;\r
\r
Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This);\r
PxeBc = &Private->PxeBc;\r
NewMakeCallback = FALSE;\r
- BlockSize = 0x8000;\r
Status = EFI_DEVICE_ERROR;\r
\r
if (This == NULL || BufferSize == NULL) {\r
Buffer,\r
FALSE,\r
&TmpBufSize,\r
- &BlockSize,\r
+ &Private->BlockSize,\r
&Private->ServerIp,\r
(UINT8 *) Private->BootFileName,\r
NULL,\r
Buffer,\r
FALSE,\r
&TmpBufSize,\r
- &BlockSize,\r
+ &Private->BlockSize,\r
&Private->ServerIp,\r
(UINT8 *) Private->BootFileName,\r
NULL,\r
#include "PxeBcSupport.h"\r
\r
#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P')\r
-#define PXEBC_MTFTP_TIMEOUT 4\r
-#define PXEBC_MTFTP_RETRIES 6\r
+#define PXEBC_MTFTP_TIMEOUT 4\r
+#define PXEBC_MTFTP_RETRIES 6\r
+#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE 8
+#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE 4\r
+#define PXEBC_DEFAULT_PACKET_SIZE 1480 \r
\r
struct _PXEBC_PRIVATE_DATA {\r
UINT32 Signature;\r
EFI_IP_ADDRESS GatewayIp;\r
EFI_IP_ADDRESS ServerIp;\r
BOOLEAN AddressIsOk;\r
-\r
+ UINT32 Ip4MaxPacketSize;\r
+ UINTN BlockSize;\r
UINTN FileSize;\r
\r
UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE];\r