/** @file\r
- Ihis library is only intended to be used by UEFI network stack modules.\r
+ This library is used to share code between UEFI network stack modules.\r
It provides the helper routines to access UDP service. It is used by both DHCP and MTFTP.\r
\r
-Copyright (c) 2006 - 2008, 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<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
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
-#ifndef _UDP4IO_H_\r
-#define _UDP4IO_H_\r
+#ifndef _UDP_IO_H_\r
+#define _UDP_IO_H_\r
\r
#include <Protocol/Udp4.h>\r
+#include <Protocol/Udp6.h>\r
\r
#include <Library/NetLib.h>\r
\r
-typedef struct _UDP_IO_PORT UDP_IO_PORT;\r
+typedef struct _UDP_IO UDP_IO;\r
\r
///\r
/// Signatures used by UdpIo Library.\r
///\r
-typedef enum {\r
- UDP_IO_RX_SIGNATURE = SIGNATURE_32 ('U', 'D', 'P', 'R'),\r
- UDP_IO_TX_SIGNATURE = SIGNATURE_32 ('U', 'D', 'P', 'T'),\r
- UDP_IO_SIGNATURE = SIGNATURE_32 ('U', 'D', 'P', 'I')\r
-} UDP_IO_SIGNATURE_TYPE;\r
+\r
+#define UDP_IO_RX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'R')\r
+#define UDP_IO_TX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'T')\r
+#define UDP_IO_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'I')\r
+\r
+#define UDP_IO_UDP4_VERSION 4\r
+#define UDP_IO_UDP6_VERSION 6\r
\r
///\r
-/// The Udp4 address pair.\r
+/// The UDP address pair.\r
///\r
typedef struct {\r
- IP4_ADDR LocalAddr;\r
+ EFI_IP_ADDRESS LocalAddr;\r
UINT16 LocalPort;\r
- IP4_ADDR RemoteAddr;\r
+ EFI_IP_ADDRESS RemoteAddr;\r
UINT16 RemotePort;\r
-} UDP_POINTS;\r
+} UDP_END_POINT;\r
\r
/**\r
- Prototype called when receiving or sending packets from/to a UDP point.\r
+ Prototype called when receiving or sending packets to or from a UDP point.\r
\r
This prototype is used by both receive and sending when calling\r
- UdpIoRecvDatagram() or UdpIoSendDatagram(). When receiving, Netbuf is allocated by\r
- UDP access point, and released by user. When sending, the NetBuf is from user,\r
- and provided to the callback as a reference.\r
- \r
- @param[in] Packet Packet received or sent\r
- @param[in] Points The Udp4 address pair corresponds to the Udp4 IO\r
- @param[in] IoStatus Packet receiving or sending status\r
- @param[in] Context User-defined data when calling UdpIoRecvDatagram() or\r
- UdpIoSendDatagram()\r
+ UdpIoRecvDatagram() or UdpIoSendDatagram(). When receiving, Netbuf is allocated by the\r
+ UDP access point and released by the user. When sending, the user allocates the the NetBuf,\r
+ which is then provided to the callback as a reference.\r
+\r
+ @param[in] Packet The packet received or sent.\r
+ @param[in] EndPoint The UDP address pair corresponds to the UDP IO.\r
+ @param[in] IoStatus The packet receiving or sending status.\r
+ @param[in] Context The user-defined data when calling UdpIoRecvDatagram() or\r
+ UdpIoSendDatagram().\r
**/\r
typedef\r
VOID\r
-(*UDP_IO_CALLBACK) (\r
+(EFIAPI *UDP_IO_CALLBACK) (\r
IN NET_BUF *Packet,\r
- IN UDP_POINTS *Points,\r
+ IN UDP_END_POINT *EndPoint,\r
IN EFI_STATUS IoStatus,\r
IN VOID *Context\r
);\r
\r
///\r
-/// This structure is used internally by UdpIo Library.\r
+/// This structure is used internally by the UdpIo Library.\r
///\r
/// Each receive request is wrapped in an UDP_RX_TOKEN. Upon completion,\r
/// the CallBack will be called. Only one receive request is sent to UDP at a\r
/// time. HeadLen gives the length of the application's header. UDP_IO will\r
/// make the application's header continuous before delivering up.\r
///\r
+typedef union {\r
+ EFI_UDP4_COMPLETION_TOKEN Udp4;\r
+ EFI_UDP6_COMPLETION_TOKEN Udp6;\r
+} UDP_COMPLETION_TOKEN;\r
+\r
typedef struct {\r
- UINT32 Signature;\r
- UDP_IO_PORT *UdpIo;\r
+ UINT32 Signature;\r
+ UDP_IO *UdpIo;\r
\r
- UDP_IO_CALLBACK CallBack;\r
- VOID *Context;\r
+ UDP_IO_CALLBACK CallBack;\r
+ VOID *Context;\r
+ UINT32 HeadLen;\r
\r
- UINT32 HeadLen;\r
- EFI_UDP4_COMPLETION_TOKEN UdpToken;\r
+ UDP_COMPLETION_TOKEN Token;\r
} UDP_RX_TOKEN;\r
\r
+\r
+\r
///\r
/// This structure is used internally by UdpIo Library.\r
///\r
/// Each transmit request is wrapped in an UDP_TX_TOKEN. Upon completion,\r
-/// the CallBack will be called. There can be several transmit requests and they\r
-/// are linked in a list.\r
+/// the CallBack will be called. There can be several transmit requests. All transmit\r
+/// requests are linked in a list.\r
///\r
-typedef struct {\r
- UINT32 Signature;\r
- LIST_ENTRY Link;\r
- UDP_IO_PORT *UdpIo;\r
\r
- UDP_IO_CALLBACK CallBack;\r
- NET_BUF *Packet;\r
- VOID *Context;\r
+typedef union {\r
+ EFI_UDP4_SESSION_DATA Udp4;\r
+ EFI_UDP6_SESSION_DATA Udp6;\r
+} UDP_SESSION_DATA;\r
\r
- EFI_UDP4_SESSION_DATA UdpSession;\r
- EFI_IPv4_ADDRESS Gateway;\r
+typedef union {\r
+ EFI_UDP4_TRANSMIT_DATA Udp4;\r
+ EFI_UDP6_TRANSMIT_DATA Udp6;\r
+} UDP_TRANSMIT_DATA;\r
\r
- EFI_UDP4_COMPLETION_TOKEN UdpToken;\r
- EFI_UDP4_TRANSMIT_DATA UdpTxData;\r
+typedef struct {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+ UDP_IO *UdpIo;\r
+ UDP_IO_CALLBACK CallBack;\r
+ NET_BUF *Packet;\r
+ VOID *Context;\r
+ EFI_IPv4_ADDRESS Gateway;\r
+ UDP_SESSION_DATA Session;\r
+ UDP_COMPLETION_TOKEN Token;\r
+ UDP_TRANSMIT_DATA Data;\r
} UDP_TX_TOKEN;\r
\r
///\r
-/// Type defined as UDP_IO_PORT.\r
+/// Type defined as UDP_IO.\r
///\r
-/// The data structure wraps Udp4 instance and its configuration. It is used by\r
-/// UdpIo Library to do all Udp4 operations.\r
+/// This data structure wraps the UDP instance and configuration.\r
+/// UdpIo Library uses this structure for all Udp4 or Udp6 operations.\r
///\r
-struct _UDP_IO_PORT {\r
+struct _UDP_IO {\r
UINT32 Signature;\r
LIST_ENTRY Link;\r
INTN RefCnt;\r
+ UINT8 UdpVersion;\r
\r
//\r
- // Handle used to create/destory UDP child\r
+ // Handle used to create/destroy UDP child\r
//\r
EFI_HANDLE Controller;\r
EFI_HANDLE Image;\r
EFI_HANDLE UdpHandle;\r
\r
- EFI_UDP4_PROTOCOL *Udp; ///< The wrapped Udp4 instance.\r
- EFI_UDP4_CONFIG_DATA UdpConfig;\r
EFI_SIMPLE_NETWORK_MODE SnpMode;\r
\r
LIST_ENTRY SentDatagram; ///< A list of UDP_TX_TOKEN.\r
UDP_RX_TOKEN *RecvRequest;\r
+\r
+ union {\r
+ EFI_UDP4_PROTOCOL *Udp4;\r
+ EFI_UDP6_PROTOCOL *Udp6;\r
+ } Protocol;\r
+\r
+ union {\r
+ EFI_UDP4_CONFIG_DATA Udp4;\r
+ EFI_UDP6_CONFIG_DATA Udp6;\r
+ } Config;\r
};\r
\r
/**\r
- Prototype called when UdpIo Library configures a Udp4 instance.\r
- \r
- The prototype is set and called when creating a UDP_IO_PORT in UdpIoCreatePort().\r
- \r
- @param[in] UdpIo The UDP_IO_PORT to configure\r
- @param[in] Context User-defined data when calling UdpIoCreatePort()\r
- \r
- @retval EFI_SUCCESS The configure process succeeds\r
- @retval Others The UDP_IO_PORT fails to configure indicating\r
- UdpIoCreatePort() should fail\r
+ The prototype called when UdpIo Library configures a UDP instance.\r
+\r
+ The prototype is set and called when creating a UDP_IO in UdpIoCreatePort().\r
+\r
+ @param[in] UdpIo The UDP_IO to configure.\r
+ @param[in] Context The user-defined data when calling UdpIoCreatePort().\r
+\r
+ @retval EFI_SUCCESS The configuration succeeded.\r
+ @retval Others The UDP_IO fails to configure indicating\r
+ UdpIoCreatePort() should fail.\r
**/\r
typedef\r
EFI_STATUS\r
-(*UDP_IO_CONFIG) (\r
- IN UDP_IO_PORT *UdpIo,\r
+(EFIAPI *UDP_IO_CONFIG) (\r
+ IN UDP_IO *UdpIo,\r
IN VOID *Context\r
);\r
\r
/**\r
- The select function to decide whether to cancel the UDP_TX_TOKEN. \r
- \r
- @param[in] Token The UDP_TX_TOKEN to decide whether to cancel\r
- @param[in] Context User-defined data in UdpIoCancelDgrams()\r
- \r
- @retval TRUE To cancel the UDP_TX_TOKEN\r
- @retval FALSE Do not cancel this UDP_TX_TOKEN\r
+ The select function to decide whether to cancel the UDP_TX_TOKEN.\r
+\r
+ @param[in] Token The UDP_TX_TOKEN to decide whether to cancel.\r
+ @param[in] Context User-defined data in UdpIoCancelDgrams().\r
+\r
+ @retval TRUE Cancel the UDP_TX_TOKEN.\r
+ @retval FALSE Do not cancel this UDP_TX_TOKEN.\r
\r
**/\r
typedef\r
BOOLEAN\r
-(*UDP_IO_TO_CANCEL) (\r
+(EFIAPI *UDP_IO_TO_CANCEL) (\r
IN UDP_TX_TOKEN *Token,\r
IN VOID *Context\r
);\r
\r
/**\r
Cancel all the sent datagram that pass the selection criteria of ToCancel.\r
+\r
If ToCancel is NULL, all the datagrams are cancelled.\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
\r
- @param[in] UdpIo The UDP_IO_PORT to cancel packet.\r
+ @param[in] UdpIo The UDP_IO 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
VOID\r
EFIAPI\r
UdpIoCancelDgrams (\r
- IN UDP_IO_PORT *UdpIo,\r
+ IN UDP_IO *UdpIo,\r
IN EFI_STATUS IoStatus,\r
IN UDP_IO_TO_CANCEL ToCancel, OPTIONAL\r
- IN VOID *Context\r
+ IN VOID *Context OPTIONAL\r
);\r
\r
/**\r
- Create a UDP_IO_PORT to access the UDP service. It will create and configure\r
+ Creates a UDP_IO to access the UDP service. It creates and configures\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
+ If Configure is NULL, then ASSERT().\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ It locates the UDP service binding prototype on the Controller parameter\r
+ uses the UDP service binding prototype to create a UDP child (also known as\r
+ a UDP instance) configures the UDP child by calling Configure function prototype.\r
+ Any failures in creating or configuring the UDP child return NULL for failure.\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] ImageHandle The image handle for the driver.\r
@param[in] Configure The function to configure the created UDP child.\r
+ @param[in] UdpVersion The UDP protocol version, UDP4 or UDP6.\r
@param[in] Context The opaque parameter for the Configure funtion.\r
\r
- @return Newly-created UDP_IO_PORT or NULL if failed.\r
+ @return The newly-created UDP_IO, or NULL if failed.\r
\r
**/\r
-UDP_IO_PORT *\r
+UDP_IO *\r
EFIAPI\r
-UdpIoCreatePort (\r
+UdpIoCreateIo (\r
IN EFI_HANDLE Controller,\r
- IN EFI_HANDLE Image,\r
+ IN EFI_HANDLE ImageHandle,\r
IN UDP_IO_CONFIG Configure,\r
+ IN UINT8 UdpVersion,\r
IN VOID *Context\r
);\r
\r
/**\r
- Free the UDP_IO_PORT and all its related resources.\r
- \r
- The function will cancel all sent datagram and receive request.\r
+ Free the UDP_IO and all its related resources.\r
+\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ The function cancels all sent datagrams and receive requests.\r
\r
- @param[in] UdpIo The UDP_IO_PORT to free.\r
+ @param[in] UdpIo The UDP_IO to free.\r
\r
- @retval EFI_SUCCESS The UDP_IO_PORT is freed.\r
+ @retval EFI_SUCCESS The UDP_IO is freed.\r
+ @retval Others Failed to free UDP_IO.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
-UdpIoFreePort (\r
- IN UDP_IO_PORT *UdpIo\r
+UdpIoFreeIo (\r
+ IN UDP_IO *UdpIo\r
);\r
\r
/**\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
+ Cleans up the UDP_IO without freeing it. Call this function\r
+ if you intend to later re-use the UDP_IO.\r
\r
- @param[in] UdpIo The UDP_IO_PORT to clean up.\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ This function releases all transmitted datagrams and receive requests and configures NULL for the UDP instance.\r
+\r
+ @param[in] UdpIo The UDP_IO to clean up.\r
\r
**/\r
VOID\r
EFIAPI\r
-UdpIoCleanPort (\r
- IN UDP_IO_PORT *UdpIo\r
+UdpIoCleanIo (\r
+ IN UDP_IO *UdpIo\r
);\r
\r
/**\r
- Send a packet through the UDP_IO_PORT.\r
- \r
+ Send a packet through the UDP_IO.\r
+\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\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] UdpIo The UDP_IO 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] 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
+ @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 UDP_IO *UdpIo,\r
IN NET_BUF *Packet,\r
- IN UDP_POINTS *EndPoint, OPTIONAL\r
- IN IP4_ADDR Gateway,\r
+ IN UDP_END_POINT *EndPoint OPTIONAL,\r
+ IN EFI_IP_ADDRESS *Gateway OPTIONAL,\r
IN UDP_IO_CALLBACK CallBack,\r
IN VOID *Context\r
);\r
/**\r
Cancel a single sent datagram.\r
\r
- @param[in] UdpIo The UDP_IO_PORT to cancel the packet from\r
+ @param[in] UdpIo The UDP_IO from which to cancel the packet\r
@param[in] Packet The packet to cancel\r
\r
**/\r
VOID\r
EFIAPI\r
UdpIoCancelSentDatagram (\r
- IN UDP_IO_PORT *UdpIo,\r
+ IN UDP_IO *UdpIo,\r
IN NET_BUF *Packet\r
);\r
\r
/**\r
- Issue a receive request to the UDP_IO_PORT.\r
- \r
+ Issue a receive request to the UDP_IO.\r
+\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\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
+ Only one receive request is acceptable at a time. Therefore, one 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] UdpIo The UDP_IO 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
+ @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 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
+ @retval EFI_SUCCESS The receive request was issued successfully.\r
+ @retval EFI_UNSUPPORTED The UDP version in UDP_IO is not supported.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
UdpIoRecvDatagram (\r
- IN UDP_IO_PORT *UdpIo,\r
+ IN UDP_IO *UdpIo,\r
IN UDP_IO_CALLBACK CallBack,\r
IN VOID *Context,\r
IN UINT32 HeadLen\r
);\r
+\r
#endif\r
+\r