/** @file\r
-\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
+ Help functions to access UDP service, it is used by both the DHCP and MTFTP.\r
+ \r
+Copyright (c) 2005 - 2007, Intel Corporation.<BR>\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
+which accompanies this distribution. The full text of the license may be found at<BR>\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
-\r
-\r
-Module Name:\r
-\r
- Udp4Io.c\r
-\r
-Abstract:\r
-\r
- Help functions to access UDP service, it is used by both the DHCP and MTFTP.\r
-\r
-\r
**/\r
\r
-#include <PiDxe.h>\r
+#include <Uefi.h>\r
\r
#include <Protocol/Udp4.h>\r
\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
#include <Library/BaseMemoryLib.h>\r
+#include <Library/DpcLib.h>\r
+\r
+\r
+/**\r
+ Free a UDP_TX_TOKEN. The TX event is closed.\r
+\r
+ @param[in] Token The UDP_TX_TOKEN to release.\r
+\r
+**/\r
+VOID\r
+UdpIoFreeTxToken (\r
+ IN UDP_TX_TOKEN *Token\r
+ )\r
+{\r
+ gBS->CloseEvent (Token->UdpToken.Event);\r
+ gBS->FreePool (Token);\r
+}\r
+\r
+/**\r
+ Free a UDP_RX_TOKEN. The RX event is closed.\r
+\r
+ @param[in] Token The UDP_RX_TOKEN to release.\r
+\r
+**/\r
+VOID\r
+UdpIoFreeRxToken (\r
+ IN UDP_RX_TOKEN *Token\r
+ )\r
+{\r
+ gBS->CloseEvent (Token->UdpToken.Event);\r
+ gBS->FreePool (Token);\r
+}\r
\r
-STATIC\r
+/**\r
+ The callback function when the packet is sent by UDP.\r
+ \r
+ It will remove the packet from the local list then call\r
+ the packet owner's callback function set by UdpIoSendDatagram.\r
+\r
+ @param[in] Context The UDP TX Token.\r
+\r
+**/\r
VOID\r
EFIAPI\r
UdpIoOnDgramSentDpc (\r
IN VOID *Context\r
- );\r
+ )\r
+{\r
+ UDP_TX_TOKEN *Token;\r
+\r
+ Token = (UDP_TX_TOKEN *) Context;\r
+ ASSERT (Token->Signature == UDP_IO_TX_SIGNATURE);\r
\r
-STATIC\r
+ RemoveEntryList (&Token->Link);\r
+ Token->CallBack (Token->Packet, NULL, Token->UdpToken.Status, Token->Context);\r
+\r
+ UdpIoFreeTxToken (Token);\r
+}\r
+\r
+/**\r
+ Request UdpIoOnDgramSentDpc as a DPC at TPL_CALLBACK.\r
+ \r
+ @param[in] Event The event signaled.\r
+ @param[in] Context The UDP TX Token.\r
+\r
+**/\r
VOID\r
EFIAPI\r
UdpIoOnDgramSent (\r
IN EFI_EVENT Event,\r
IN VOID *Context\r
- );\r
+ )\r
+{\r
+ //\r
+ // Request UdpIoOnDgramSentDpc as a DPC at TPL_CALLBACK\r
+ //\r
+ QueueDpc (TPL_CALLBACK, UdpIoOnDgramSentDpc, Context);\r
+}\r
+\r
+/**\r
+ Recycle the received UDP data.\r
\r
-STATIC\r
+ @param[in] Context The UDP_RX_TOKEN.\r
+\r
+**/\r
VOID\r
-EFIAPI\r
-UdpIoOnDgramRcvd (\r
- IN EFI_EVENT Event,\r
+UdpIoRecycleDgram (\r
IN VOID *Context\r
- );\r
+ )\r
+{\r
+ UDP_RX_TOKEN *Token;\r
\r
+ Token = (UDP_RX_TOKEN *) Context;\r
+ gBS->SignalEvent (Token->UdpToken.Packet.RxData->RecycleSignal);\r
+ UdpIoFreeRxToken (Token);\r
+}\r
\r
/**\r
- Wrap a transmit request into a UDP_TX_TOKEN.\r
-\r
- @param UdpIo The UdpIo port to send packet to\r
- @param Packet The user's packet\r
- @param EndPoint The local and remote access point\r
- @param Gateway The overrided next hop\r
- @param CallBack The function to call when transmission completed.\r
- @param Context The opaque parameter to the call back\r
+ The event handle for UDP receive request.\r
+ \r
+ It will build a NET_BUF from the recieved UDP data, then deliver it\r
+ to the receiver.\r
\r
- @return The wrapped transmission request or NULL if failed to allocate resources.\r
+ @param[in] Context The UDP RX token.\r
\r
**/\r
-STATIC\r
-UDP_TX_TOKEN *\r
-UdpIoWrapTx (\r
- IN UDP_IO_PORT *UdpIo,\r
- IN NET_BUF *Packet,\r
- IN UDP_POINTS *EndPoint, OPTIONAL\r
- IN IP4_ADDR Gateway,\r
- IN UDP_IO_CALLBACK CallBack,\r
+VOID\r
+EFIAPI\r
+UdpIoOnDgramRcvdDpc (\r
IN VOID *Context\r
)\r
{\r
- UDP_TX_TOKEN *Token;\r
EFI_UDP4_COMPLETION_TOKEN *UdpToken;\r
- EFI_UDP4_TRANSMIT_DATA *UdpTxData;\r
- EFI_STATUS Status;\r
- UINT32 Count;\r
- IP4_ADDR Ip;\r
-\r
- Token = AllocatePool (sizeof (UDP_TX_TOKEN) +\r
- sizeof (EFI_UDP4_FRAGMENT_DATA) * (Packet->BlockOpNum - 1));\r
+ EFI_UDP4_RECEIVE_DATA *UdpRxData;\r
+ EFI_UDP4_SESSION_DATA *UdpSession;\r
+ UDP_RX_TOKEN *Token;\r
+ UDP_POINTS Points;\r
+ NET_BUF *Netbuf;\r
\r
- if (Token == NULL) {\r
- return NULL;\r
- }\r
+ Token = (UDP_RX_TOKEN *) Context;\r
\r
- Token->Signature = UDP_IO_TX_SIGNATURE;\r
- InitializeListHead (&Token->Link);\r
+ ASSERT ((Token->Signature == UDP_IO_RX_SIGNATURE) &&\r
+ (Token == Token->UdpIo->RecvRequest));\r
\r
- Token->UdpIo = UdpIo;\r
- Token->CallBack = CallBack;\r
- Token->Packet = Packet;\r
- Token->Context = Context;\r
+ //\r
+ // Clear the receive request first in case that the caller\r
+ // wants to restart the receive in the callback.\r
+ //\r
+ Token->UdpIo->RecvRequest = NULL;\r
\r
- UdpToken = &(Token->UdpToken);\r
- UdpToken->Status = EFI_NOT_READY;\r
+ UdpToken = &Token->UdpToken;\r
+ UdpRxData = UdpToken->Packet.RxData;\r
\r
- Status = gBS->CreateEvent (\r
- EVT_NOTIFY_SIGNAL,\r
- TPL_NOTIFY,\r
- UdpIoOnDgramSent,\r
- Token,\r
- &UdpToken->Event\r
- );\r
+ if (EFI_ERROR (UdpToken->Status) || (UdpRxData == NULL)) {\r
+ if (UdpToken->Status != EFI_ABORTED) {\r
+ //\r
+ // Invoke the CallBack only if the reception is not actively aborted.\r
+ //\r
+ Token->CallBack (NULL, NULL, UdpToken->Status, Token->Context);\r
+ }\r
\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (Token);\r
- return NULL;\r
+ UdpIoFreeRxToken (Token);\r
+ return;\r
}\r
\r
- UdpTxData = &Token->UdpTxData;\r
- UdpToken->Packet.TxData = UdpTxData;\r
-\r
- UdpTxData->UdpSessionData = NULL;\r
- UdpTxData->GatewayAddress = NULL;\r
-\r
- if (EndPoint != NULL) {\r
- Ip = HTONL (EndPoint->LocalAddr);\r
- CopyMem (&Token->UdpSession.SourceAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ //\r
+ // Build a NET_BUF from the UDP receive data, then deliver it up.\r
+ //\r
+ Netbuf = NetbufFromExt (\r
+ (NET_FRAGMENT *) UdpRxData->FragmentTable,\r
+ UdpRxData->FragmentCount,\r
+ 0,\r
+ (UINT32) Token->HeadLen,\r
+ UdpIoRecycleDgram,\r
+ Token\r
+ );\r
\r
- Ip = HTONL (EndPoint->RemoteAddr);\r
- CopyMem (&Token->UdpSession.DestinationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ if (Netbuf == NULL) {\r
+ gBS->SignalEvent (UdpRxData->RecycleSignal);\r
+ Token->CallBack (NULL, NULL, EFI_OUT_OF_RESOURCES, Token->Context);\r
\r
- Token->UdpSession.SourcePort = EndPoint->LocalPort;\r
- Token->UdpSession.DestinationPort = EndPoint->RemotePort;\r
- UdpTxData->UdpSessionData = &Token->UdpSession;\r
+ UdpIoFreeRxToken (Token);\r
+ return;\r
}\r
\r
- if (Gateway != 0) {\r
- Ip = HTONL (Gateway);\r
- CopyMem (&Token->Gateway, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
-\r
- UdpTxData->GatewayAddress = &Token->Gateway;\r
- }\r
+ UdpSession = &UdpRxData->UdpSession;\r
+ Points.LocalPort = UdpSession->DestinationPort;\r
+ Points.RemotePort = UdpSession->SourcePort;\r
\r
- UdpTxData->DataLength = Packet->TotalSize;\r
- Count = Packet->BlockOpNum;\r
- NetbufBuildExt (Packet, (NET_FRAGMENT *) UdpTxData->FragmentTable, &Count);\r
- UdpTxData->FragmentCount = Count;\r
+ CopyMem (&Points.LocalAddr, &UdpSession->DestinationAddress, sizeof (IP4_ADDR));\r
+ CopyMem (&Points.RemoteAddr, &UdpSession->SourceAddress, sizeof (IP4_ADDR));\r
+ Points.LocalAddr = NTOHL (Points.LocalAddr);\r
+ Points.RemoteAddr = NTOHL (Points.RemoteAddr);\r
\r
- return Token;\r
+ Token->CallBack (Netbuf, &Points, EFI_SUCCESS, Token->Context);\r
}\r
\r
-\r
/**\r
- Free a UDP_TX_TOKEN. The event is closed and memory released.\r
+ Request UdpIoOnDgramRcvdDpc() as a DPC at TPL_CALLBACK.\r
\r
- @param Token The UDP_TX_TOKEN to release.\r
-\r
- @return None\r
+ @param[in] Event The UDP receive request event.\r
+ @param[in] Context The UDP RX token.\r
\r
**/\r
VOID\r
-UdpIoFreeTxToken (\r
- IN UDP_TX_TOKEN *Token\r
+EFIAPI\r
+UdpIoOnDgramRcvd (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- gBS->CloseEvent (Token->UdpToken.Event);\r
- gBS->FreePool (Token);\r
+ //\r
+ // Request UdpIoOnDgramRcvdDpc as a DPC at TPL_CALLBACK\r
+ //\r
+ QueueDpc (TPL_CALLBACK, UdpIoOnDgramRcvdDpc, Context);\r
}\r
\r
-\r
/**\r
Create a UDP_RX_TOKEN to wrap the request.\r
\r
- @param UdpIo The UdpIo to receive packets from\r
- @param CallBack The function to call when receive finished.\r
- @param Context The opaque parameter to the CallBack\r
- @param HeadLen The head length to reserver for the packet.\r
+ @param[in] UdpIo The UdpIo to receive packets from.\r
+ @param[in] CallBack The function to call when receive finished.\r
+ @param[in] Context The opaque parameter to the CallBack.\r
+ @param[in] HeadLen The head length to reserver for the packet.\r
\r
- @return The Wrapped request or NULL if failed to allocate resources.\r
+ @return The Wrapped request or NULL if failed to allocate resources or some errors happened.\r
\r
**/\r
UDP_RX_TOKEN *\r
return Token;\r
}\r
\r
-\r
/**\r
- Free a receive request wrap.\r
+ Wrap a transmit request into a UDP_TX_TOKEN.\r
\r
- @param Token The receive request to release.\r
+ @param[in] UdpIo The UdpIo port to send packet to.\r
+ @param[in] Packet The user's packet.\r
+ @param[in] EndPoint The local and remote access point.\r
+ @param[in] Gateway The overrided next hop.\r
+ @param[in] CallBack The function to call when transmission completed.\r
+ @param[in] Context The opaque parameter to the call back.\r
\r
- @return None\r
+ @return The wrapped transmission request or NULL if failed to allocate resources \r
+ or for some errors.\r
\r
**/\r
-VOID\r
-UdpIoFreeRxToken (\r
- IN UDP_RX_TOKEN *Token\r
+UDP_TX_TOKEN *\r
+UdpIoWrapTx (\r
+ IN UDP_IO_PORT *UdpIo,\r
+ IN NET_BUF *Packet,\r
+ IN UDP_POINTS *EndPoint OPTIONAL,\r
+ IN IP4_ADDR Gateway,\r
+ IN UDP_IO_CALLBACK CallBack,\r
+ IN VOID *Context\r
)\r
{\r
- gBS->CloseEvent (Token->UdpToken.Event);\r
- gBS->FreePool (Token);\r
-}\r
+ UDP_TX_TOKEN *Token;\r
+ EFI_UDP4_COMPLETION_TOKEN *UdpToken;\r
+ EFI_UDP4_TRANSMIT_DATA *UdpTxData;\r
+ EFI_STATUS Status;\r
+ UINT32 Count;\r
+ IP4_ADDR Ip;\r
\r
+ Token = AllocatePool (sizeof (UDP_TX_TOKEN) +\r
+ sizeof (EFI_UDP4_FRAGMENT_DATA) * (Packet->BlockOpNum - 1));\r
\r
-/**\r
- Create a UDP IO port to access the UDP service. It will\r
- create and configure a UDP child.\r
+ if (Token == NULL) {\r
+ return NULL;\r
+ }\r
\r
- @param Controller The controller that has the UDP service binding\r
- protocol installed.\r
- @param Image The image handle for the driver.\r
- @param Configure The function to configure the created UDP child\r
- @param Context The opaque parameter for the Configure funtion.\r
+ Token->Signature = UDP_IO_TX_SIGNATURE;\r
+ InitializeListHead (&Token->Link);\r
\r
- @return A point to just created UDP IO port or NULL if failed.\r
+ Token->UdpIo = UdpIo;\r
+ Token->CallBack = CallBack;\r
+ Token->Packet = Packet;\r
+ Token->Context = Context;\r
+\r
+ UdpToken = &(Token->UdpToken);\r
+ UdpToken->Status = EFI_NOT_READY;\r
+\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_SIGNAL,\r
+ TPL_NOTIFY,\r
+ UdpIoOnDgramSent,\r
+ Token,\r
+ &UdpToken->Event\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ gBS->FreePool (Token);\r
+ return NULL;\r
+ }\r
+\r
+ UdpTxData = &Token->UdpTxData;\r
+ UdpToken->Packet.TxData = UdpTxData;\r
+\r
+ UdpTxData->UdpSessionData = NULL;\r
+ UdpTxData->GatewayAddress = NULL;\r
+\r
+ if (EndPoint != NULL) {\r
+ Ip = HTONL (EndPoint->LocalAddr);\r
+ CopyMem (&Token->UdpSession.SourceAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+\r
+ Ip = HTONL (EndPoint->RemoteAddr);\r
+ CopyMem (&Token->UdpSession.DestinationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+\r
+ Token->UdpSession.SourcePort = EndPoint->LocalPort;\r
+ Token->UdpSession.DestinationPort = EndPoint->RemotePort;\r
+ UdpTxData->UdpSessionData = &Token->UdpSession;\r
+ }\r
+\r
+ if (Gateway != 0) {\r
+ Ip = HTONL (Gateway);\r
+ CopyMem (&Token->Gateway, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+\r
+ UdpTxData->GatewayAddress = &Token->Gateway;\r
+ }\r
+\r
+ UdpTxData->DataLength = Packet->TotalSize;\r
+ Count = Packet->BlockOpNum;\r
+ NetbufBuildExt (Packet, (NET_FRAGMENT *) UdpTxData->FragmentTable, &Count);\r
+ UdpTxData->FragmentCount = Count;\r
+\r
+ return Token;\r
+}\r
+\r
+/**\r
+ Create a UDP_IO_PORT to access the UDP service. It will create and configure\r
+ a UDP child.\r
+ \r
+ The function will locate the UDP service binding prototype on the Controller\r
+ parameter and use it to create a UDP child (aka Udp instance). Then the UDP\r
+ child will be configured by calling Configure function prototype. Any failures\r
+ in creating or configure the UDP child will lead to the failure of UDP_IO_PORT\r
+ creation.\r
+\r
+ @param[in] Controller The controller that has the UDP service binding.\r
+ protocol installed.\r
+ @param[in] Image The image handle for the driver.\r
+ @param[in] Configure The function to configure the created UDP child.\r
+ @param[in] Context The opaque parameter for the Configure funtion.\r
+\r
+ @return Newly-created UDP_IO_PORT or NULL if failed.\r
\r
**/\r
UDP_IO_PORT *\r
+EFIAPI\r
UdpIoCreatePort (\r
IN EFI_HANDLE Controller,\r
IN EFI_HANDLE Image,\r
return NULL;\r
}\r
\r
-\r
/**\r
- Cancel all the sent datagram that pass the selection of ToCancel.\r
+ Cancel all the sent datagram that pass the selection criteria of ToCancel.\r
If ToCancel is NULL, all the datagrams are cancelled.\r
\r
- @param UdpIo The UDP IO port to cancel packet\r
- @param IoStatus The IoStatus to return to the packet owners.\r
- @param ToCancel The select funtion to test whether to cancel this\r
- packet or not.\r
- @param Context The opaque parameter to the ToCancel.\r
-\r
- @return None\r
+ @param[in] UdpIo The UDP_IO_PORT to cancel packet.\r
+ @param[in] IoStatus The IoStatus to return to the packet owners.\r
+ @param[in] ToCancel The select funtion to test whether to cancel this\r
+ packet or not.\r
+ @param[in] Context The opaque parameter to the ToCancel.\r
\r
**/\r
-STATIC\r
VOID\r
+EFIAPI\r
UdpIoCancelDgrams (\r
IN UDP_IO_PORT *UdpIo,\r
IN EFI_STATUS IoStatus,\r
}\r
}\r
\r
-\r
/**\r
- Free the UDP IO port and all its related resources including\r
- all the transmitted packet.\r
+ Free the UDP_IO_PORT and all its related resources.\r
+ \r
+ The function will cancel all sent datagram and receive request.\r
\r
- @param UdpIo The UDP IO port to free.\r
+ @param[in] UdpIo The UDP_IO_PORT to free.\r
\r
- @retval EFI_SUCCESS The UDP IO port is freed.\r
+ @retval EFI_SUCCESS The UDP_IO_PORT is freed.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
UdpIoFreePort (\r
IN UDP_IO_PORT *UdpIo\r
)\r
\r
\r
/**\r
- Clean up the UDP IO port. It will release all the transmitted\r
- datagrams and receive request. It will also configure NULL the\r
- UDP child.\r
-\r
- @param UdpIo UDP IO port to clean up.\r
+ Clean up the UDP_IO_PORT without freeing it. The function is called when\r
+ user wants to re-use the UDP_IO_PORT later.\r
+ \r
+ It will release all the transmitted datagrams and receive request. It will\r
+ also configure NULL for the UDP instance.\r
\r
- @return None\r
+ @param[in] UdpIo The UDP_IO_PORT to clean up.\r
\r
**/\r
VOID\r
+EFIAPI\r
UdpIoCleanPort (\r
IN UDP_IO_PORT *UdpIo\r
)\r
UdpIo->Udp->Configure (UdpIo->Udp, NULL);\r
}\r
\r
-\r
-/**\r
- The callback function when the packet is sent by UDP.\r
- It will remove the packet from the local list then call\r
- the packet owner's callback function.\r
-\r
- @param Context The UDP TX Token.\r
-\r
- @return None\r
-\r
-**/\r
-STATIC\r
-VOID\r
-EFIAPI\r
-UdpIoOnDgramSentDpc (\r
- IN VOID *Context\r
- )\r
-{\r
- UDP_TX_TOKEN *Token;\r
-\r
- Token = (UDP_TX_TOKEN *) Context;\r
- ASSERT (Token->Signature == UDP_IO_TX_SIGNATURE);\r
-\r
- RemoveEntryList (&Token->Link);\r
- Token->CallBack (Token->Packet, NULL, Token->UdpToken.Status, Token->Context);\r
-\r
- UdpIoFreeTxToken (Token);\r
-}\r
-\r
/**\r
- Request UdpIoOnDgramSentDpc as a DPC at TPL_CALLBACK.\r
-\r
- @param Event The event signalled.\r
- @param Context The UDP TX Token.\r
-\r
- @return None\r
-\r
-**/\r
-STATIC\r
-VOID\r
-EFIAPI\r
-UdpIoOnDgramSent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-{\r
- //\r
- // Request UdpIoOnDgramSentDpc as a DPC at TPL_CALLBACK\r
- //\r
- NetLibQueueDpc (TPL_CALLBACK, UdpIoOnDgramSentDpc, Context);\r
-}\r
-\r
-\r
-/**\r
- Send a packet through the UDP IO port.\r
-\r
- @param UdpIo The UDP IO Port to send the packet through\r
- @param Packet The packet to send\r
- @param EndPoint The local and remote access point\r
- @param Gateway The gateway to use\r
- @param CallBack The call back function to call when packet is\r
- transmitted or failed.\r
- @param Context The opque parameter to the CallBack\r
-\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the packet\r
+ Send a packet through the UDP_IO_PORT.\r
+ \r
+ The packet will be wrapped in UDP_TX_TOKEN. Function Callback will be called\r
+ when the packet is sent. The optional parameter EndPoint overrides the default\r
+ address pair if specified.\r
+\r
+ @param[in] UdpIo The UDP_IO_PORT to send the packet through.\r
+ @param[in] Packet The packet to send.\r
+ @param[in] EndPoint The local and remote access point. Override the\r
+ default address pair set during configuration.\r
+ @param[in] Gateway The gateway to use.\r
+ @param[in] CallBack The function being called when packet is\r
+ transmitted or failed.\r
+ @param[in] Context The opaque parameter passed to CallBack.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the packet.\r
@retval EFI_SUCCESS The packet is successfully delivered to UDP for\r
transmission.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
UdpIoSendDatagram (\r
IN UDP_IO_PORT *UdpIo,\r
IN NET_BUF *Packet,\r
\r
\r
/**\r
- The selection function to cancel a single sent datagram.\r
-\r
- @param Token The UDP TX token to test againist.\r
- @param Context The context\r
+ The select function to cancel a single sent datagram.\r
\r
- @return TRUE if the packet is to be cancelled, otherwise FALSE.\r
+ @param[in] Token The UDP_TX_TOKEN to test against\r
+ @param[in] Context The NET_BUF of the sent datagram\r
\r
+ @retval TRUE The packet is to be cancelled.\r
+ @retval FALSE The packet is not to be cancelled.\r
**/\r
-STATIC\r
BOOLEAN\r
UdpIoCancelSingleDgram (\r
IN UDP_TX_TOKEN *Token,\r
return FALSE;\r
}\r
\r
-\r
/**\r
Cancel a single sent datagram.\r
\r
- @param UdpIo The UDP IO port to cancel the packet from\r
- @param Packet The packet to cancel\r
-\r
- @return None\r
+ @param[in] UdpIo The UDP_IO_PORT to cancel the packet from\r
+ @param[in] Packet The packet to cancel\r
\r
**/\r
VOID\r
+EFIAPI\r
UdpIoCancelSentDatagram (\r
IN UDP_IO_PORT *UdpIo,\r
IN NET_BUF *Packet\r
UdpIoCancelDgrams (UdpIo, EFI_ABORTED, UdpIoCancelSingleDgram, Packet);\r
}\r
\r
-\r
/**\r
- Recycle the received UDP data.\r
-\r
- @param Context The UDP_RX_TOKEN\r
-\r
- @return None\r
-\r
-**/\r
-STATIC\r
-VOID\r
-UdpIoRecycleDgram (\r
- IN VOID *Context\r
- )\r
-{\r
- UDP_RX_TOKEN *Token;\r
-\r
- Token = (UDP_RX_TOKEN *) Context;\r
- gBS->SignalEvent (Token->UdpToken.Packet.RxData->RecycleSignal);\r
- UdpIoFreeRxToken (Token);\r
-}\r
-\r
-/**\r
- The event handle for UDP receive request. It will build\r
- a NET_BUF from the recieved UDP data, then deliver it\r
- to the receiver.\r
-\r
- @param Context The UDP RX token.\r
-\r
- @return None\r
-\r
-**/\r
-STATIC\r
-VOID\r
-EFIAPI\r
-UdpIoOnDgramRcvdDpc (\r
- IN VOID *Context\r
- )\r
-{\r
- EFI_UDP4_COMPLETION_TOKEN *UdpToken;\r
- EFI_UDP4_RECEIVE_DATA *UdpRxData;\r
- EFI_UDP4_SESSION_DATA *UdpSession;\r
- UDP_RX_TOKEN *Token;\r
- UDP_POINTS Points;\r
- NET_BUF *Netbuf;\r
-\r
- Token = (UDP_RX_TOKEN *) Context;\r
-\r
- ASSERT ((Token->Signature == UDP_IO_RX_SIGNATURE) &&\r
- (Token == Token->UdpIo->RecvRequest));\r
-\r
- //\r
- // Clear the receive request first in case that the caller\r
- // wants to restart the receive in the callback.\r
- //\r
- Token->UdpIo->RecvRequest = NULL;\r
-\r
- UdpToken = &Token->UdpToken;\r
- UdpRxData = UdpToken->Packet.RxData;\r
-\r
- if (EFI_ERROR (UdpToken->Status) || (UdpRxData == NULL)) {\r
- if (UdpToken->Status != EFI_ABORTED) {\r
- //\r
- // Invoke the CallBack only if the reception is not actively aborted.\r
- //\r
- Token->CallBack (NULL, NULL, UdpToken->Status, Token->Context);\r
- }\r
-\r
- UdpIoFreeRxToken (Token);\r
- return;\r
- }\r
-\r
- //\r
- // Build a NET_BUF from the UDP receive data, then deliver it up.\r
- //\r
- Netbuf = NetbufFromExt (\r
- (NET_FRAGMENT *) UdpRxData->FragmentTable,\r
- UdpRxData->FragmentCount,\r
- 0,\r
- (UINT32) Token->HeadLen,\r
- UdpIoRecycleDgram,\r
- Token\r
- );\r
-\r
- if (Netbuf == NULL) {\r
- gBS->SignalEvent (UdpRxData->RecycleSignal);\r
- Token->CallBack (NULL, NULL, EFI_OUT_OF_RESOURCES, Token->Context);\r
-\r
- UdpIoFreeRxToken (Token);\r
- return;\r
- }\r
-\r
- UdpSession = &UdpRxData->UdpSession;\r
- Points.LocalPort = UdpSession->DestinationPort;\r
- Points.RemotePort = UdpSession->SourcePort;\r
-\r
- CopyMem (&Points.LocalAddr, &UdpSession->DestinationAddress, sizeof (IP4_ADDR));\r
- CopyMem (&Points.RemoteAddr, &UdpSession->SourceAddress, sizeof (IP4_ADDR));\r
- Points.LocalAddr = NTOHL (Points.LocalAddr);\r
- Points.RemoteAddr = NTOHL (Points.RemoteAddr);\r
-\r
- Token->CallBack (Netbuf, &Points, EFI_SUCCESS, Token->Context);\r
-}\r
-\r
-/**\r
- Request UdpIoOnDgramRcvdDpc as a DPC at TPL_CALLBACK.\r
-\r
- @param Event The UDP receive request event.\r
- @param Context The UDP RX token.\r
-\r
- @return None\r
-\r
-**/\r
-STATIC\r
-VOID\r
-EFIAPI\r
-UdpIoOnDgramRcvd (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Request UdpIoOnDgramRcvdDpc as a DPC at TPL_CALLBACK\r
-\r
-Arguments:\r
-\r
- Event - The UDP receive request event\r
- Context - The UDP RX token.\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-{\r
- //\r
- // Request UdpIoOnDgramRcvdDpc as a DPC at TPL_CALLBACK\r
- //\r
- NetLibQueueDpc (TPL_CALLBACK, UdpIoOnDgramRcvdDpc, Context);\r
-}\r
-\r
-\r
-/**\r
- Issue a receive request to the UDP IO port.\r
-\r
- @param UdpIo The UDP IO port to recieve the packet from.\r
- @param CallBack The call back function to execute when receive\r
- finished.\r
- @param Context The opque context to the call back\r
- @param HeadLen The lenght of the application's header\r
+ Issue a receive request to the UDP_IO_PORT.\r
+ \r
+ This function is called when upper-layer needs packet from UDP for processing.\r
+ Only one receive request is acceptable at a time so a common usage model is\r
+ to invoke this function inside its Callback function when the former packet\r
+ is processed.\r
+\r
+ @param[in] UdpIo The UDP_IO_PORT to receive the packet from.\r
+ @param[in] CallBack The call back function to execute when the packet\r
+ is received.\r
+ @param[in] Context The opaque context passed to Callback.\r
+ @param[in] HeadLen The length of the upper-layer's protocol header.\r
\r
@retval EFI_ALREADY_STARTED There is already a pending receive request. Only\r
- one receive request is supported.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate some resource.\r
+ one receive request is supported at a time.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
@retval EFI_SUCCESS The receive request is issued successfully.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
UdpIoRecvDatagram (\r
IN UDP_IO_PORT *UdpIo,\r
IN UDP_IO_CALLBACK CallBack,\r