| /** @file | |
| The helper routines to access UDP service. It is used by both | |
| DHCP and MTFTP. | |
| Copyright (c) 2006 - 2008, Intel Corporation.<BR> | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at<BR> | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef _UDP4IO_H_ | |
| #define _UDP4IO_H_ | |
| #include <Protocol/Udp4.h> | |
| #include <Library/UdpIoLib.h> | |
| #include <Library/NetLib.h> | |
| typedef struct _UDP_IO_PORT UDP_IO_PORT; | |
| /// | |
| /// Signatures used by UdpIo Library. | |
| /// | |
| typedef enum { | |
| UDP_IO_RX_SIGNATURE = SIGNATURE_32 ('U', 'D', 'P', 'R'), | |
| UDP_IO_TX_SIGNATURE = SIGNATURE_32 ('U', 'D', 'P', 'T'), | |
| UDP_IO_SIGNATURE = SIGNATURE_32 ('U', 'D', 'P', 'I') | |
| } UDP_IO_SIGNATURE_TYPE; | |
| /// | |
| /// The Udp4 address pair. | |
| /// | |
| typedef struct { | |
| IP4_ADDR LocalAddr; | |
| UINT16 LocalPort; | |
| IP4_ADDR RemoteAddr; | |
| UINT16 RemotePort; | |
| } UDP_POINTS; | |
| /** | |
| Prototype called when receiving or sending packets from/to a UDP point. | |
| This prototype is used by both receive and sending when calling | |
| UdpIoRecvDatagram() or UdpIoSendDatagram(). When receiving, Netbuf is allocated by | |
| UDP access point, and released by user. When sending, the NetBuf is from user, | |
| and provided to the callback as a reference. | |
| @param Packet Packet received or sent | |
| @param Points The Udp4 address pair corresponds to the Udp4 IO | |
| @param IoStatus Packet receiving or sending status | |
| @param Context User-defined data when calling UdpIoRecvDatagram() or | |
| UdpIoSendDatagram() | |
| @return None | |
| **/ | |
| typedef | |
| VOID | |
| (*UDP_IO_CALLBACK) ( | |
| IN NET_BUF *Packet, | |
| IN UDP_POINTS *Points, | |
| IN EFI_STATUS IoStatus, | |
| IN VOID *Context | |
| ); | |
| /// | |
| /// This structure is used internally by UdpIo Library. | |
| /// | |
| /// Each receive request is wrapped in an UDP_RX_TOKEN. Upon completion, | |
| /// the CallBack will be called. Only one receive request is sent to UDP at a | |
| /// time. HeadLen gives the length of the application's header. UDP_IO will | |
| /// make the application's header continuous before delivering up. | |
| /// | |
| typedef struct { | |
| UINT32 Signature; | |
| UDP_IO_PORT *UdpIo; | |
| UDP_IO_CALLBACK CallBack; | |
| VOID *Context; | |
| UINT32 HeadLen; | |
| EFI_UDP4_COMPLETION_TOKEN UdpToken; | |
| } UDP_RX_TOKEN; | |
| /// | |
| /// This structure is used internally by UdpIo Library. | |
| /// | |
| /// Each transmit request is wrapped in an UDP_TX_TOKEN. Upon completion, | |
| /// the CallBack will be called. There can be several transmit requests and they | |
| /// are linked in a list. | |
| /// | |
| typedef struct { | |
| UINT32 Signature; | |
| LIST_ENTRY Link; | |
| UDP_IO_PORT *UdpIo; | |
| UDP_IO_CALLBACK CallBack; | |
| NET_BUF *Packet; | |
| VOID *Context; | |
| EFI_UDP4_SESSION_DATA UdpSession; | |
| EFI_IPv4_ADDRESS Gateway; | |
| EFI_UDP4_COMPLETION_TOKEN UdpToken; | |
| EFI_UDP4_TRANSMIT_DATA UdpTxData; | |
| } UDP_TX_TOKEN; | |
| /// | |
| /// Type defined as UDP_IO_PORT. | |
| /// | |
| /// The data structure wraps Udp4 instance and its configuration. It is used by | |
| /// UdpIo Library to do all Udp4 operations. | |
| /// | |
| struct _UDP_IO_PORT { | |
| UINT32 Signature; | |
| LIST_ENTRY Link; | |
| INTN RefCnt; | |
| // | |
| // Handle used to create/destory UDP child | |
| // | |
| EFI_HANDLE Controller; | |
| EFI_HANDLE Image; | |
| EFI_HANDLE UdpHandle; | |
| EFI_UDP4_PROTOCOL *Udp; ///< The wrapped Udp4 instance. | |
| EFI_UDP4_CONFIG_DATA UdpConfig; | |
| EFI_SIMPLE_NETWORK_MODE SnpMode; | |
| LIST_ENTRY SentDatagram; ///< A list of UDP_TX_TOKEN. | |
| UDP_RX_TOKEN *RecvRequest; | |
| }; | |
| /** | |
| Prototype called when UdpIo Library configures a Udp4 instance. | |
| The prototype is set and called when creating a UDP_IO_PORT in UdpIoCreatePort(). | |
| @param UdpIo The UDP_IO_PORT to configure | |
| @param Context User-defined data when calling UdpIoCreatePort() | |
| @retval EFI_SUCCESS The configure process succeeds | |
| @retval Others The UDP_IO_PORT fails to configure indicating | |
| UdpIoCreatePort() should fail | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (*UDP_IO_CONFIG) ( | |
| IN UDP_IO_PORT *UdpIo, | |
| IN VOID *Context | |
| ); | |
| /** | |
| The select function to decide whether to cancel the UDP_TX_TOKEN. It is used | |
| @param Token The UDP_TX_TOKEN to decide whether to cancel | |
| @param Context User-defined data in UdpIoCancelDgrams() | |
| @retval TRUE To cancel the UDP_TX_TOKEN | |
| @retval FALSE Do not cancel this UDP_TX_TOKEN | |
| **/ | |
| typedef | |
| BOOLEAN | |
| (*UDP_IO_TO_CANCEL) ( | |
| IN UDP_TX_TOKEN *Token, | |
| IN VOID *Context | |
| ); | |
| /** | |
| Create a UDP_IO_PORT to access the UDP service. It will create and configure | |
| a UDP child. | |
| The function will locate the UDP service binding prototype on the Controller | |
| parameter and use it to create a UDP child (aka Udp instance). Then the UDP | |
| child will be configured by calling Configure function prototype. Any failures | |
| in creating or configure the UDP child will lead to the failure of UDP_IO_PORT | |
| creation. | |
| @param Controller The controller that has the UDP service binding | |
| protocol installed. | |
| @param Image The image handle for the driver. | |
| @param Configure The function to configure the created UDP child | |
| @param Context The opaque parameter for the Configure funtion. | |
| @return Newly-created UDP_IO_PORT or NULL if failed. | |
| **/ | |
| UDP_IO_PORT * | |
| EFIAPI | |
| UdpIoCreatePort ( | |
| IN EFI_HANDLE Controller, | |
| IN EFI_HANDLE Image, | |
| IN UDP_IO_CONFIG Configure, | |
| IN VOID *Context | |
| ); | |
| /** | |
| Free the UDP_IO_PORT and all its related resources. | |
| The function will cancel all sent datagram and receive request. | |
| @param UdpIo The UDP_IO_PORT to free. | |
| @retval EFI_SUCCESS The UDP_IO_PORT is freed. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UdpIoFreePort ( | |
| IN UDP_IO_PORT *UdpIo | |
| ); | |
| /** | |
| Clean up the UDP_IO_PORT without freeing it. The function is called when | |
| user wants to re-use the UDP_IO_PORT later. | |
| It will release all the transmitted datagrams and receive request. It will | |
| also configure NULL for the UDP instance. | |
| @param UdpIo The UDP_IO_PORT to clean up. | |
| **/ | |
| VOID | |
| EFIAPI | |
| UdpIoCleanPort ( | |
| IN UDP_IO_PORT *UdpIo | |
| ); | |
| /** | |
| Send a packet through the UDP_IO_PORT. | |
| The packet will be wrapped in UDP_TX_TOKEN. Function Callback will be called | |
| when the packet is sent. The optional parameter EndPoint overrides the default | |
| address pair if specified. | |
| @param UdpIo The UDP_IO_PORT to send the packet through | |
| @param Packet The packet to send | |
| @param EndPoint The local and remote access point. Override the | |
| default address pair set during configuration. | |
| @param Gateway The gateway to use | |
| @param CallBack The function being called when packet is | |
| transmitted or failed. | |
| @param Context The opaque parameter passed to CallBack | |
| @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the packet | |
| @retval EFI_SUCCESS The packet is successfully delivered to UDP for | |
| transmission. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UdpIoSendDatagram ( | |
| IN UDP_IO_PORT *UdpIo, | |
| IN NET_BUF *Packet, | |
| IN UDP_POINTS *EndPoint OPTIONAL, | |
| IN IP4_ADDR Gateway, | |
| IN UDP_IO_CALLBACK CallBack, | |
| IN VOID *Context | |
| ); | |
| /** | |
| Cancel a single sent datagram. | |
| @param UdpIo The UDP_IO_PORT to cancel the packet from | |
| @param Packet The packet to cancel | |
| **/ | |
| VOID | |
| EFIAPI | |
| UdpIoCancelSentDatagram ( | |
| IN UDP_IO_PORT *UdpIo, | |
| IN NET_BUF *Packet | |
| ); | |
| /** | |
| Issue a receive request to the UDP_IO_PORT. | |
| This function is called when upper-layer needs packet from UDP for processing. | |
| Only one receive request is acceptable at a time so a common usage model is | |
| to invoke this function inside its Callback function when the former packet | |
| is processed. | |
| @param UdpIo The UDP_IO_PORT to receive the packet from. | |
| @param CallBack The call back function to execute when the packet | |
| is received. | |
| @param Context The opaque context passed to Callback | |
| @param HeadLen The length of the upper-layer's protocol header | |
| @retval EFI_ALREADY_STARTED There is already a pending receive request. Only | |
| one receive request is supported at a time. | |
| @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources. | |
| @retval EFI_SUCCESS The receive request is issued successfully. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UdpIoRecvDatagram ( | |
| IN UDP_IO_PORT *UdpIo, | |
| IN UDP_IO_CALLBACK CallBack, | |
| IN VOID *Context, | |
| IN UINT32 HeadLen | |
| ); | |
| #endif |