/** @file\r
\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
Module Name:\r
\r
{\r
0,\r
0,\r
- 0\r
+ EfiLockUninitialized\r
}, // Lock\r
//\r
// Private functions\r
NULL,\r
NULL\r
}, // Entry\r
+ NULL, // RecycledTxBuf\r
+ 0, // RecycledTxBufCount\r
+ 32, // MaxRecycledTxBuf\r
NULL, // GlobalData\r
NULL, // DeviceHandle\r
NULL, // DevicePath\r
NET_IFTYPE_ETHERNET, // IfType\r
FALSE, // MacAddressChangeable\r
FALSE, // MultipleTxSupported\r
- FALSE, // MediaPresentSupported\r
+ TRUE, // MediaPresentSupported\r
TRUE // MediaPresent\r
},\r
{\r
ReturnValue = GlobalData->NtNetUtilityTable.SetReceiveFilter (\r
Instance->InterfaceInfo.InterfaceIndex,\r
EnableBits,\r
- McastFilterCount,\r
+ (UINT32)McastFilterCount,\r
McastFilter\r
);\r
\r
OUT VOID **TxBuffer\r
)\r
{\r
+ SNPNT32_INSTANCE_DATA *Instance;\r
+\r
+ Instance = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);\r
\r
if (TxBuffer != NULL) {\r
- *((UINT8 **) TxBuffer) = (UINT8 *) 1;\r
+ if (Instance->RecycledTxBufCount != 0) {\r
+ Instance->RecycledTxBufCount --;\r
+ *((UINT8 **) TxBuffer) = (UINT8 *) (UINTN)Instance->RecycledTxBuf[Instance->RecycledTxBufCount];\r
+ } else {\r
+ *((UINT8 **) TxBuffer) = NULL;\r
+ }\r
}\r
\r
if (InterruptStatus != NULL) {\r
SNPNT32_INSTANCE_DATA *Instance;\r
SNPNT32_GLOBAL_DATA *GlobalData;\r
INT32 ReturnValue;\r
+ UINT64 *Tmp;\r
\r
Instance = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);\r
\r
\r
ReturnValue = GlobalData->NtNetUtilityTable.Transmit (\r
Instance->InterfaceInfo.InterfaceIndex,\r
- HeaderSize,\r
- BufferSize,\r
+ (UINT32)HeaderSize,\r
+ (UINT32)BufferSize,\r
Buffer,\r
SrcAddr,\r
DestAddr,\r
\r
if (ReturnValue < 0) {\r
return EFI_DEVICE_ERROR;\r
+ } else {\r
+ if ((Instance->MaxRecycledTxBuf + SNP_TX_BUFFER_INCREASEMENT) >= SNP_MAX_TX_BUFFER_NUM) {\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
+ if (Instance->RecycledTxBufCount < Instance->MaxRecycledTxBuf) {\r
+ Instance->RecycledTxBuf[Instance->RecycledTxBufCount] = (UINT64) Buffer;\r
+ Instance->RecycledTxBufCount ++;\r
+ } else {\r
+ Tmp = AllocatePool (sizeof (UINT64) * (Instance->MaxRecycledTxBuf + SNP_TX_BUFFER_INCREASEMENT));\r
+ if (Tmp == NULL) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ CopyMem (Tmp, Instance->RecycledTxBuf, sizeof (UINT64) * Instance->RecycledTxBufCount);\r
+ FreePool (Instance->RecycledTxBuf);\r
+ Instance->RecycledTxBuf = Tmp;\r
+ Instance->MaxRecycledTxBuf += SNP_TX_BUFFER_INCREASEMENT;\r
+ }\r
}\r
\r
return EFI_SUCCESS;\r
SNPNT32_INSTANCE_DATA *Instance;\r
SNPNT32_GLOBAL_DATA *GlobalData;\r
INT32 ReturnValue;\r
+ UINTN BufSize;\r
+ \r
+ BufSize = *BuffSize;\r
\r
Instance = SNP_NT32_INSTANCE_DATA_FROM_SNP_THIS (This);\r
\r
*Protocol = NTOHS (*((UINT16 *) (((UINT8 *) Buffer) + 12)));\r
}\r
\r
- return EFI_SUCCESS;\r
+ return (*BuffSize <= BufSize) ? EFI_SUCCESS : EFI_BUFFER_TOO_SMALL; \r
}\r
\r
/**\r
//\r
// Get the WinNT thunk\r
//\r
- Status = gBS->LocateProtocol (&gEfiWinNtThunkProtocolGuid, NULL, &This->WinNtThunk);\r
+ Status = gBS->LocateProtocol (&gEfiWinNtThunkProtocolGuid, NULL, (VOID **)&This->WinNtThunk);\r
\r
if (EFI_ERROR (Status)) {\r
return Status;\r
//\r
for (Index = 0; Index < InterfaceCount; Index++) {\r
\r
- Instance = AllocatePool (sizeof (SNPNT32_INSTANCE_DATA));\r
+ Instance = AllocateZeroPool (sizeof (SNPNT32_INSTANCE_DATA));\r
\r
if (NULL == Instance) {\r
Status = EFI_OUT_OF_RESOURCES;\r
//\r
CopyMem (Instance, &gSnpNt32InstanceTemplate, sizeof (SNPNT32_INSTANCE_DATA));\r
\r
+ //\r
+ // Allocate the RecycledTxBuf.\r
+ //\r
+ Instance->RecycledTxBuf = AllocatePool (sizeof (UINT64) * Instance->MaxRecycledTxBuf);\r
+ if (Instance->RecycledTxBuf == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
//\r
// Set the interface information.\r
//\r
- Instance->InterfaceInfo = NetInterfaceInfoBuffer[Index];\r
+ CopyMem (&Instance->InterfaceInfo, &NetInterfaceInfoBuffer[Index], sizeof(Instance->InterfaceInfo));\r
//\r
// Initialize this instance\r
//\r
//\r
// Copy Current/PermanentAddress MAC address\r
//\r
- Instance->Mode.CurrentAddress = Instance->InterfaceInfo.MacAddr;\r
- Instance->Mode.PermanentAddress = Instance->InterfaceInfo.MacAddr;\r
+ CopyMem (&Instance->Mode.CurrentAddress, &Instance->InterfaceInfo.MacAddr, sizeof(Instance->Mode.CurrentAddress));\r
+ CopyMem (&Instance->Mode.PermanentAddress, &Instance->InterfaceInfo.MacAddr, sizeof(Instance->Mode.PermanentAddress));\r
\r
//\r
// Since the fake SNP is based on a real NIC, to avoid conflict with the host\r
CopyMem (\r
&Node.MacAddr.MacAddress,\r
&Instance->Mode.CurrentAddress,\r
- sizeof (EFI_MAC_ADDRESS)\r
+ NET_ETHER_ADDR_LEN\r
);\r
\r
Node.MacAddr.IfType = Instance->Mode.IfType;\r