Get MaxPacketSize from IP4 mode data and reduce the head size of UDP and MTFTP, and take it as BlockSize to download.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9894 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
ljin6 2010-02-01 03:32:28 +00:00
parent 9f7d5b46aa
commit fa6d3ee491
4 changed files with 29 additions and 11 deletions

View File

@ -1270,7 +1270,9 @@ PxeBcDiscvBootService (
// //
// free the responselist // free the responselist
// //
FreePool (Token.ResponseList); if (Token.ResponseList != NULL) {
FreePool (Token.ResponseList);
}
} }
// //
// Free the dhcp packet // Free the dhcp packet

View File

@ -152,6 +152,7 @@ PxeBcDriverBindingStart (
PXEBC_PRIVATE_DATA *Private; PXEBC_PRIVATE_DATA *Private;
UINTN Index; UINTN Index;
EFI_STATUS Status; EFI_STATUS Status;
EFI_IP4_MODE_DATA Ip4ModeData;
Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA)); Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));
if (Private == NULL) { if (Private == NULL) {
@ -253,6 +254,16 @@ PxeBcDriverBindingStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto ON_ERROR; 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 ( Status = NetLibCreateServiceChild (
ControllerHandle, ControllerHandle,

View File

@ -347,6 +347,11 @@ EfiPxeBcStart (
return Status; 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; Private->AddressIsOk = FALSE;
ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE)); ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE));
@ -2421,7 +2426,6 @@ DiscoverBootFile (
UINT16 Type; UINT16 Type;
UINT16 Layer; UINT16 Layer;
BOOLEAN UseBis; BOOLEAN UseBis;
UINTN BlockSize;
PXEBC_CACHED_DHCP4_PACKET *Packet; PXEBC_CACHED_DHCP4_PACKET *Packet;
UINT16 Value; UINT16 Value;
@ -2466,7 +2470,6 @@ DiscoverBootFile (
} }
*BufferSize = 0; *BufferSize = 0;
BlockSize = 0x8000;
// //
// Get bootfile name and (m)tftp server ip addresss // Get bootfile name and (m)tftp server ip addresss
@ -2526,7 +2529,7 @@ DiscoverBootFile (
Buffer, Buffer,
FALSE, FALSE,
BufferSize, BufferSize,
&BlockSize, &Private->BlockSize,
&Private->ServerIp, &Private->ServerIp,
(UINT8 *) Private->BootFileName, (UINT8 *) Private->BootFileName,
NULL, NULL,
@ -2580,14 +2583,12 @@ EfiPxeLoadFile (
PXEBC_PRIVATE_DATA *Private; PXEBC_PRIVATE_DATA *Private;
EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
BOOLEAN NewMakeCallback; BOOLEAN NewMakeCallback;
UINTN BlockSize;
EFI_STATUS Status; EFI_STATUS Status;
UINT64 TmpBufSize; UINT64 TmpBufSize;
Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This); Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This);
PxeBc = &Private->PxeBc; PxeBc = &Private->PxeBc;
NewMakeCallback = FALSE; NewMakeCallback = FALSE;
BlockSize = 0x8000;
Status = EFI_DEVICE_ERROR; Status = EFI_DEVICE_ERROR;
if (This == NULL || BufferSize == NULL) { if (This == NULL || BufferSize == NULL) {
@ -2646,7 +2647,7 @@ EfiPxeLoadFile (
Buffer, Buffer,
FALSE, FALSE,
&TmpBufSize, &TmpBufSize,
&BlockSize, &Private->BlockSize,
&Private->ServerIp, &Private->ServerIp,
(UINT8 *) Private->BootFileName, (UINT8 *) Private->BootFileName,
NULL, NULL,
@ -2670,7 +2671,7 @@ EfiPxeLoadFile (
Buffer, Buffer,
FALSE, FALSE,
&TmpBufSize, &TmpBufSize,
&BlockSize, &Private->BlockSize,
&Private->ServerIp, &Private->ServerIp,
(UINT8 *) Private->BootFileName, (UINT8 *) Private->BootFileName,
NULL, NULL,

View File

@ -47,8 +47,11 @@ typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA;
#include "PxeBcSupport.h" #include "PxeBcSupport.h"
#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P') #define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P')
#define PXEBC_MTFTP_TIMEOUT 4 #define PXEBC_MTFTP_TIMEOUT 4
#define PXEBC_MTFTP_RETRIES 6 #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 { struct _PXEBC_PRIVATE_DATA {
UINT32 Signature; UINT32 Signature;
@ -88,7 +91,8 @@ struct _PXEBC_PRIVATE_DATA {
EFI_IP_ADDRESS GatewayIp; EFI_IP_ADDRESS GatewayIp;
EFI_IP_ADDRESS ServerIp; EFI_IP_ADDRESS ServerIp;
BOOLEAN AddressIsOk; BOOLEAN AddressIsOk;
UINT32 Ip4MaxPacketSize;
UINTN BlockSize;
UINTN FileSize; UINTN FileSize;
UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE]; UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE];