EFI_STATUS Status;\r
BOOLEAN IsDone;\r
BOOLEAN Matched;\r
- UINTN CopyLen;\r
+ UINTN CopiedLen;\r
+ UINTN HeaderLen;\r
+ UINTN HeaderCopiedLen;\r
+ UINTN BufferCopiedLen;\r
+ UINT32 FragmentLength;\r
+ UINTN FragmentIndex;\r
+ UINT8 *FragmentBuffer;\r
\r
if (This == NULL || DestIp == NULL || DestPort == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (Matched) {\r
+ ASSERT (RxData != NULL);\r
\r
- CopyLen = 0;\r
-\r
+ HeaderLen = 0;\r
if (HeaderSize != NULL) {\r
- CopyLen = MIN (*HeaderSize, RxData->DataLength);\r
- CopyMem (HeaderPtr, RxData->FragmentTable[0].FragmentBuffer, CopyLen);\r
- *HeaderSize = CopyLen;\r
+ HeaderLen = MIN (*HeaderSize, RxData->DataLength);\r
}\r
\r
- if (RxData->DataLength - CopyLen > *BufferSize) {\r
-\r
+ if (RxData->DataLength - HeaderLen > *BufferSize) {\r
Status = EFI_BUFFER_TOO_SMALL;\r
} else {\r
-\r
- *BufferSize = RxData->DataLength - CopyLen;\r
- CopyMem (\r
- BufferPtr,\r
- (UINT8 *) RxData->FragmentTable[0].FragmentBuffer + CopyLen,\r
- *BufferSize\r
- );\r
+ *HeaderSize = HeaderLen;\r
+ *BufferSize = RxData->DataLength - HeaderLen;\r
+\r
+ HeaderCopiedLen = 0;\r
+ BufferCopiedLen = 0;\r
+ for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; FragmentIndex++) {\r
+ FragmentLength = RxData->FragmentTable[FragmentIndex].FragmentLength;\r
+ FragmentBuffer = RxData->FragmentTable[FragmentIndex].FragmentBuffer;\r
+ if (HeaderCopiedLen + FragmentLength < HeaderLen) {\r
+ //\r
+ // Copy the header part of received data.\r
+ //\r
+ CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, FragmentLength);\r
+ HeaderCopiedLen += FragmentLength;\r
+ } else if (HeaderCopiedLen < HeaderLen) {\r
+ //\r
+ // Copy the header part of received data.\r
+ //\r
+ CopiedLen = HeaderLen - HeaderCopiedLen;\r
+ CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, CopiedLen);\r
+ HeaderCopiedLen += CopiedLen;\r
+\r
+ //\r
+ // Copy the other part of received data.\r
+ //\r
+ CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer + CopiedLen, FragmentLength - CopiedLen);\r
+ BufferCopiedLen += (FragmentLength - CopiedLen);\r
+ } else {\r
+ //\r
+ // Copy the other part of received data.\r
+ //\r
+ CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer, FragmentLength);\r
+ BufferCopiedLen += FragmentLength;\r
+ }\r
+ }\r
}\r
} else {\r
\r