mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 02:40:26 +00:00 
			
		
		
		
	2. Remove the GetTime() call when receiving Udp4/6 packets. Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye, Ting <ting.ye@intel.com> Reviewed-by: Wu, Jiaxin <jiaxin.wu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15497 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			655 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			655 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Udp6 driver's whole implementation and internal data structures.
 | 
						|
 | 
						|
  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
						|
 | 
						|
  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
 | 
						|
  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 _UDP6_IMPL_H_
 | 
						|
#define _UDP6_IMPL_H_
 | 
						|
 | 
						|
#include <Uefi.h>
 | 
						|
 | 
						|
#include <Protocol/Ip6.h>
 | 
						|
#include <Protocol/Udp6.h>
 | 
						|
 | 
						|
#include <Library/IpIoLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/UefiRuntimeServicesTableLib.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/DpcLib.h>
 | 
						|
#include <Library/PrintLib.h>
 | 
						|
 | 
						|
#include "Udp6Driver.h"
 | 
						|
 | 
						|
extern EFI_COMPONENT_NAME2_PROTOCOL   gUdp6ComponentName2;
 | 
						|
extern EFI_COMPONENT_NAME_PROTOCOL    gUdp6ComponentName;
 | 
						|
extern EFI_UNICODE_STRING_TABLE       *gUdp6ControllerNameTable;
 | 
						|
extern EFI_SERVICE_BINDING_PROTOCOL   mUdp6ServiceBinding;
 | 
						|
extern EFI_UDP6_PROTOCOL              mUdp6Protocol;
 | 
						|
extern UINT16                         mUdp6RandomPort;
 | 
						|
 | 
						|
//
 | 
						|
// Define time out 50 milliseconds
 | 
						|
//
 | 
						|
#define UDP6_TIMEOUT_INTERVAL (50 * TICKS_PER_MS)
 | 
						|
#define UDP6_HEADER_SIZE      sizeof (EFI_UDP_HEADER)
 | 
						|
#define UDP6_MAX_DATA_SIZE    65507
 | 
						|
#define UDP6_PORT_KNOWN       1024
 | 
						|
 | 
						|
#define UDP6_SERVICE_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'p', '6')
 | 
						|
#define UDP6_INSTANCE_DATA_SIGNATURE  SIGNATURE_32 ('U', 'd', 'p', 'S')
 | 
						|
 | 
						|
#define UDP6_SERVICE_DATA_FROM_THIS(a) \
 | 
						|
  CR ( \
 | 
						|
  (a), \
 | 
						|
  UDP6_SERVICE_DATA, \
 | 
						|
  ServiceBinding, \
 | 
						|
  UDP6_SERVICE_DATA_SIGNATURE \
 | 
						|
  )
 | 
						|
 | 
						|
#define UDP6_INSTANCE_DATA_FROM_THIS(a) \
 | 
						|
  CR ( \
 | 
						|
  (a), \
 | 
						|
  UDP6_INSTANCE_DATA, \
 | 
						|
  Udp6Proto, \
 | 
						|
  UDP6_INSTANCE_DATA_SIGNATURE \
 | 
						|
  )
 | 
						|
//
 | 
						|
// Udp6 service contest data
 | 
						|
//
 | 
						|
typedef struct _UDP6_SERVICE_DATA {
 | 
						|
  UINT32                        Signature;
 | 
						|
  EFI_SERVICE_BINDING_PROTOCOL  ServiceBinding;
 | 
						|
  EFI_HANDLE                    ImageHandle;
 | 
						|
  EFI_HANDLE                    ControllerHandle;
 | 
						|
  LIST_ENTRY                    ChildrenList;
 | 
						|
  UINTN                         ChildrenNumber;
 | 
						|
  IP_IO                         *IpIo;
 | 
						|
  EFI_EVENT                     TimeoutEvent;
 | 
						|
 } UDP6_SERVICE_DATA;
 | 
						|
 | 
						|
typedef struct _UDP6_INSTANCE_DATA {
 | 
						|
  UINT32                Signature;
 | 
						|
  LIST_ENTRY            Link;
 | 
						|
  UDP6_SERVICE_DATA     *Udp6Service;
 | 
						|
  EFI_UDP6_PROTOCOL     Udp6Proto;
 | 
						|
  EFI_UDP6_CONFIG_DATA  ConfigData;
 | 
						|
  EFI_HANDLE            ChildHandle;
 | 
						|
  BOOLEAN               Configured;
 | 
						|
  BOOLEAN               IsNoMapping;
 | 
						|
  NET_MAP               TxTokens;
 | 
						|
  NET_MAP               RxTokens;
 | 
						|
  NET_MAP               McastIps;
 | 
						|
  LIST_ENTRY            RcvdDgramQue;
 | 
						|
  LIST_ENTRY            DeliveredDgramQue;
 | 
						|
  UINT16                HeadSum;
 | 
						|
  EFI_STATUS            IcmpError;
 | 
						|
  IP_IO_IP_INFO         *IpInfo;
 | 
						|
  BOOLEAN               InDestroy;
 | 
						|
} UDP6_INSTANCE_DATA;
 | 
						|
 | 
						|
typedef struct _UDP6_RXDATA_WRAP {
 | 
						|
  LIST_ENTRY             Link;
 | 
						|
  NET_BUF                *Packet;
 | 
						|
  UINT32                 TimeoutTick;
 | 
						|
  EFI_UDP6_RECEIVE_DATA  RxData;
 | 
						|
} UDP6_RXDATA_WRAP;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;
 | 
						|
  UINTN                         NumberOfChildren;
 | 
						|
  EFI_HANDLE                    *ChildHandleBuffer;
 | 
						|
} UDP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
 | 
						|
 | 
						|
/**
 | 
						|
  Clean the Udp service context data.
 | 
						|
 | 
						|
  @param[in, out]  Udp6Service      Pointer to the UDP6_SERVICE_DATA.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
Udp6CleanService (
 | 
						|
  IN OUT UDP6_SERVICE_DATA  *Udp6Service
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Create the Udp service context data.
 | 
						|
 | 
						|
  @param[in]  Udp6Service            Pointer to the UDP6_SERVICE_DATA.
 | 
						|
  @param[in]  ImageHandle            The image handle of this udp6 driver.
 | 
						|
  @param[in]  ControllerHandle       The controller handle this udp6 driver binds on.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The udp6 service context data was created and
 | 
						|
                                 initialized.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   Cannot allocate memory.
 | 
						|
  @retval Others                 An error condition occurred.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
Udp6CreateService (
 | 
						|
  IN UDP6_SERVICE_DATA  *Udp6Service,
 | 
						|
  IN EFI_HANDLE         ImageHandle,
 | 
						|
  IN EFI_HANDLE         ControllerHandle
 | 
						|
  );
 | 
						|
 
 | 
						|
/**
 | 
						|
  This function cleans the udp instance.
 | 
						|
 | 
						|
  @param[in, out]  Instance       Pointer to the UDP6_INSTANCE_DATA to clean.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
Udp6CleanInstance (
 | 
						|
  IN OUT UDP6_INSTANCE_DATA  *Instance
 | 
						|
  );
 | 
						|
 
 | 
						|
/**
 | 
						|
  This function intializes the new created udp instance.
 | 
						|
 | 
						|
  @param[in]      Udp6Service      Pointer to the UDP6_SERVICE_DATA.
 | 
						|
  @param[in, out]  Instance         Pointer to the un-initialized UDP6_INSTANCE_DATA.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
Udp6InitInstance (
 | 
						|
  IN UDP6_SERVICE_DATA       *Udp6Service,
 | 
						|
  IN OUT UDP6_INSTANCE_DATA  *Instance
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function reports the received ICMP error.
 | 
						|
 | 
						|
  @param[in]  Instance          Pointer to the udp instance context data.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
Udp6ReportIcmpError (
 | 
						|
  IN UDP6_INSTANCE_DATA  *Instance
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function copies the current operational settings of this EFI UDPv6 Protocol
 | 
						|
  instance into user-supplied buffers. This function is used optionally to retrieve
 | 
						|
  the operational mode data of underlying networks or drivers.
 | 
						|
 | 
						|
  @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
 | 
						|
  @param[out] Udp6ConfigData     The buffer in which the current UDP configuration
 | 
						|
                                 data is returned. This parameter is optional and
 | 
						|
                                 may be NULL.
 | 
						|
  @param[out] Ip6ModeData        The buffer in which the current EFI IPv6 Protocol
 | 
						|
                                 mode data is returned. This parameter is optional
 | 
						|
                                 and may be NULL.
 | 
						|
  @param[out] MnpConfigData      The buffer in which the current managed network
 | 
						|
                                 configuration data is returned. This parameter
 | 
						|
                                 is optional and may be NULL.
 | 
						|
  @param[out] SnpModeData        The buffer in which the simple network mode data
 | 
						|
                                 is returned. This parameter is optional and may be NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The mode data was read.
 | 
						|
  @retval EFI_NOT_STARTED        When Udp6ConfigData is queried, no configuration
 | 
						|
                                 data is  available because this instance has not
 | 
						|
                                 been started.
 | 
						|
  @retval EFI_INVALID_PARAMETER  This is NULL.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6GetModeData (
 | 
						|
  IN  EFI_UDP6_PROTOCOL                *This,
 | 
						|
  OUT EFI_UDP6_CONFIG_DATA             *Udp6ConfigData OPTIONAL,
 | 
						|
  OUT EFI_IP6_MODE_DATA                *Ip6ModeData    OPTIONAL,
 | 
						|
  OUT EFI_MANAGED_NETWORK_CONFIG_DATA  *MnpConfigData  OPTIONAL,
 | 
						|
  OUT EFI_SIMPLE_NETWORK_MODE          *SnpModeData    OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function is used to do the following:
 | 
						|
  Initialize and start this instance of the EFI UDPv6 Protocol.
 | 
						|
  Change the filtering rules and operational parameters.
 | 
						|
  Reset this instance of the EFI UDPv6 Protocol.
 | 
						|
 | 
						|
  @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
 | 
						|
  @param[in]  UdpConfigData      Pointer to the buffer to set the configuration
 | 
						|
                                 data. This parameter is optional and may be NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The configuration settings were set, changed, or
 | 
						|
                                 reset successfully.
 | 
						|
  @retval EFI_NO_MAPPING         When the UdpConifgData.UseAnyStationAddress is set
 | 
						|
                                 to true  and there is no address available for IP6
 | 
						|
                                 driver to binding  source address to this
 | 
						|
                                 instance.
 | 
						|
  @retval EFI_INVALID_PARAMETER  One or more following conditions are TRUE:
 | 
						|
                                 This is NULL.
 | 
						|
                                 UdpConfigData.StationAddress is not a valid
 | 
						|
                                 unicast IPv6 address.
 | 
						|
                                 UdpConfigData.RemoteAddress is not a valid unicast
 | 
						|
                                 IPv6  address, if it is not zero.
 | 
						|
  @retval EFI_ALREADY_STARTED    The EFI UDPv6 Protocol instance is already
 | 
						|
                                 started/configured and must be stopped/reset
 | 
						|
                                 before it can be reconfigured. Only TrafficClass,
 | 
						|
                                 HopLimit, ReceiveTimeout, and TransmitTimeout can
 | 
						|
                                 be reconfigured without stopping the current
 | 
						|
                                 instance of the EFI UDPv6 Protocol.
 | 
						|
  @retval EFI_ACCESS_DENIED      UdpConfigData.AllowDuplicatePort is FALSE, and
 | 
						|
                                 UdpConfigData.StationPort is already used by another
 | 
						|
                                 instance.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   The EFI UDPv6 Protocol driver cannot allocate
 | 
						|
                                 memory for this EFI UDPv6 Protocol instance.
 | 
						|
  @retval EFI_DEVICE_ERROR       An unexpected network or system error occurred, and
 | 
						|
                                 this instance was not opened.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6Configure (
 | 
						|
  IN EFI_UDP6_PROTOCOL     *This,
 | 
						|
  IN EFI_UDP6_CONFIG_DATA  *UdpConfigData OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function places a sending request to this instance of the EFI UDPv6 Protocol,
 | 
						|
  alongside the transmit data that was filled by the user.
 | 
						|
 | 
						|
  @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
 | 
						|
  @param[in]  Token              Pointer to the completion token that will be
 | 
						|
                                 placed into the transmit queue.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The data has been queued for transmission.
 | 
						|
  @retval EFI_NOT_STARTED        This EFI UDPv6 Protocol instance has not been
 | 
						|
                                 started.
 | 
						|
  @retval EFI_NO_MAPPING         The under-layer IPv6 driver was responsible for
 | 
						|
                                 choosing a source address for this instance, but
 | 
						|
                                 no  source address was available for use.
 | 
						|
  @retval EFI_INVALID_PARAMETER  One or more of the following are TRUE:
 | 
						|
                                 This is NULL. Token is NULL. Token.Event is NULL.
 | 
						|
                                 Token.Packet.TxData is NULL.
 | 
						|
                                 Token.Packet.TxData.FragmentCount is zero.
 | 
						|
                                 Token.Packet.TxData.DataLength is not equal to the
 | 
						|
                                 sum of fragment lengths.
 | 
						|
                                 One or more of the
 | 
						|
                                 Token.Packet.TxData.FragmentTable[]
 | 
						|
                                 .FragmentLength fields is zero.
 | 
						|
                                 One or more of the
 | 
						|
                                 Token.Packet.TxData.FragmentTable[]
 | 
						|
                                 .FragmentBuffer fields is NULL.
 | 
						|
                                 One or more of the
 | 
						|
                                 Token.Packet.TxData.UdpSessionData.
 | 
						|
                                 DestinationAddres are not valid unicast IPv6
 | 
						|
                                 addresses, if the  UdpSessionData is not NULL.
 | 
						|
                                 Token.Packet.TxData.UdpSessionData.
 | 
						|
                                 DestinationAddres is NULL
 | 
						|
                                 Token.Packet.TxData.UdpSessionData.
 | 
						|
                                 DestinatioPort is zero.
 | 
						|
                                 Token.Packet.TxData.UdpSessionData is
 | 
						|
                                 NULL and this  instance's
 | 
						|
                                 UdpConfigData.RemoteAddress is unspecified.
 | 
						|
  @retval EFI_ACCESS_DENIED      The transmit completion token with the same
 | 
						|
                                 Token.Event is already in the transmit queue.
 | 
						|
  @retval EFI_NOT_READY          The completion token could not be queued because
 | 
						|
                                 the transmit queue is full.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   Could not queue the transmit data.
 | 
						|
  @retval EFI_NOT_FOUND          There is no route to the destination network or
 | 
						|
                                 address.
 | 
						|
  @retval EFI_BAD_BUFFER_SIZE    The data length is greater than the maximum UDP
 | 
						|
                                 packet size. Or the length of the IP header + UDP
 | 
						|
                                 header + data length is greater than MTU if
 | 
						|
                                 DoNotFragment is TRUE.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6Transmit (
 | 
						|
  IN EFI_UDP6_PROTOCOL          *This,
 | 
						|
  IN EFI_UDP6_COMPLETION_TOKEN  *Token
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function places a completion token into the receive packet queue. This function
 | 
						|
  is always asynchronous.
 | 
						|
 | 
						|
  @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
 | 
						|
  @param[in]  Token              Pointer to a token that is associated with the
 | 
						|
                                 receive data descriptor.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The receive completion token is cached.
 | 
						|
  @retval EFI_NOT_STARTED        This EFI UDPv6 Protocol instance has not been
 | 
						|
                                 started.
 | 
						|
  @retval EFI_NO_MAPPING         When using a default address, configuration (DHCP,
 | 
						|
                                 BOOTP, RARP, etc.) is not finished yet.
 | 
						|
  @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
 | 
						|
                                 This is NULL.
 | 
						|
                                 Token is NULL.
 | 
						|
                                 Token.Event is NULL.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   The receive completion token could not be queued
 | 
						|
                                 due to a lack of system resources (usually
 | 
						|
                                 memory).
 | 
						|
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
 | 
						|
                                 The EFI UDPv6 Protocol instance has been reset to
 | 
						|
                                 startup defaults.
 | 
						|
  @retval EFI_ACCESS_DENIED      A receive completion token with the same
 | 
						|
                                 Token.Event is already in the receive queue.
 | 
						|
  @retval EFI_NOT_READY          The receive request could not be queued because
 | 
						|
                                 the receive  queue is full.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6Receive (
 | 
						|
  IN EFI_UDP6_PROTOCOL          *This,
 | 
						|
  IN EFI_UDP6_COMPLETION_TOKEN  *Token
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function is used to abort a pending transmit or receive request.
 | 
						|
 | 
						|
  @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
 | 
						|
  @param[in]  Token              Pointer to a token that has been issued by
 | 
						|
                                 EFI_UDP6_PROTOCOL.Transmit() or
 | 
						|
                                 EFI_UDP6_PROTOCOL.Receive(). This parameter is
 | 
						|
                                 optional and may be NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The asynchronous I/O request is aborted and
 | 
						|
                                 Token.Event is  signaled. When Token is NULL, all
 | 
						|
                                 pending requests are aborted and their events are
 | 
						|
                                 signaled.
 | 
						|
  @retval EFI_INVALID_PARAMETER  This is NULL.
 | 
						|
  @retval EFI_NOT_STARTED        This instance has not been started.
 | 
						|
  @retval EFI_NO_MAPPING         When using the default address, configuration
 | 
						|
                                 (DHCP, BOOTP, RARP, etc.) is not finished yet.
 | 
						|
  @retval EFI_NOT_FOUND          When Token is not NULL, the asynchronous I/O
 | 
						|
                                 request is not found in the transmit or receive
 | 
						|
                                 queue. It either completed or was not issued by
 | 
						|
                                 Transmit() or Receive().
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6Cancel (
 | 
						|
  IN EFI_UDP6_PROTOCOL          *This,
 | 
						|
  IN EFI_UDP6_COMPLETION_TOKEN  *Token OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function can be used by network drivers and applications to increase the rate that
 | 
						|
  data packets are moved between the communications device and the transmit/receive queues.
 | 
						|
 | 
						|
  @param[in] This                Pointer to the EFI_UDP6_PROTOCOL instance.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            Incoming or outgoing data was processed.
 | 
						|
  @retval EFI_INVALID_PARAMETER  This is NULL.
 | 
						|
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
 | 
						|
  @retval EFI_TIMEOUT            Data was dropped out of the transmit and/or
 | 
						|
                                 receive queue.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6Poll (
 | 
						|
  IN EFI_UDP6_PROTOCOL  *This
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function is used to enable and disable the multicast group filtering.
 | 
						|
 | 
						|
  @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
 | 
						|
  @param[in]  JoinFlag           Set to TRUE to join a multicast group. Set to
 | 
						|
                                 FALSE to leave one or all multicast groups.
 | 
						|
  @param[in]  MulticastAddress   Pointer to multicast group address to join or
 | 
						|
                                 leave. This parameter is optional and may be NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The operation completed successfully.
 | 
						|
  @retval EFI_NOT_STARTED        The EFI UDPv6 Protocol instance has not been
 | 
						|
                                 started.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   Could not allocate resources to join the group.
 | 
						|
  @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
 | 
						|
                                 This is NULL. JoinFlag is TRUE and
 | 
						|
                                 MulticastAddress is NULL. JoinFlag is TRUE and
 | 
						|
                                 *MulticastAddress is not a valid  multicast
 | 
						|
                                 address.
 | 
						|
  @retval EFI_ALREADY_STARTED    The group address is already in the group table
 | 
						|
                                 (when JoinFlag is TRUE).
 | 
						|
  @retval EFI_NOT_FOUND          The group address is not in the group table (when
 | 
						|
                                 JoinFlag is FALSE).
 | 
						|
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6Groups (
 | 
						|
  IN EFI_UDP6_PROTOCOL  *This,
 | 
						|
  IN BOOLEAN            JoinFlag,
 | 
						|
  IN EFI_IPv6_ADDRESS   *MulticastAddress OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function tries to bind the udp instance according to the configured port
 | 
						|
  allocation stragety.
 | 
						|
 | 
						|
  @param[in]  InstanceList       Pointer to the head of the list linking the udp
 | 
						|
                                 instances.
 | 
						|
  @param[in]  ConfigData         Pointer to the ConfigData of the instance to be
 | 
						|
                                 bound.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The bound operation completed successfully.
 | 
						|
  @retval EFI_ACCESS_DENIED      The <Address, Port> specified by the ConfigData is
 | 
						|
                                 already used by another instance.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES   No available port resources.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
Udp6Bind (
 | 
						|
  IN LIST_ENTRY            *InstanceList,
 | 
						|
  IN EFI_UDP6_CONFIG_DATA  *ConfigData
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function builds the Ip6 configdata from the Udp6ConfigData.
 | 
						|
 | 
						|
  @param[in]       Udp6ConfigData         Pointer to the EFI_UDP6_CONFIG_DATA.
 | 
						|
  @param[in, out]  Ip6ConfigData          Pointer to the EFI_IP6_CONFIG_DATA.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
Udp6BuildIp6ConfigData (
 | 
						|
  IN EFI_UDP6_CONFIG_DATA      *Udp6ConfigData,
 | 
						|
  IN OUT EFI_IP6_CONFIG_DATA   *Ip6ConfigData
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function checks whether the specified Token duplicates with the one in the Map.
 | 
						|
 | 
						|
  @param[in]  Map                Pointer to the NET_MAP.
 | 
						|
  @param[in]  Item               Pointer to the NET_MAP_ITEM contain the pointer to
 | 
						|
                                 the Token.
 | 
						|
  @param[in]  Context            Pointer to the Token to be checked.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The Token specified by Context differs from the
 | 
						|
                                 one in the Item.
 | 
						|
  @retval EFI_ACCESS_DENIED      The Token duplicates with the one in the Item.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6TokenExist (
 | 
						|
  IN NET_MAP       *Map,
 | 
						|
  IN NET_MAP_ITEM  *Item,
 | 
						|
  IN VOID          *Context
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function removes the specified Token from the TokenMap.
 | 
						|
 | 
						|
  @param[in]  TokenMap           Pointer to the NET_MAP containing the tokens.
 | 
						|
  @param[in]  Token              Pointer to the Token to be removed.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The specified Token is removed from the TokenMap.
 | 
						|
  @retval EFI_NOT_FOUND          The specified Token is not found in the TokenMap.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
Udp6RemoveToken (
 | 
						|
  IN NET_MAP                    *TokenMap,
 | 
						|
  IN EFI_UDP6_COMPLETION_TOKEN  *Token
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function is used to check whether the NewConfigData has any un-reconfigurable
 | 
						|
  parameters changed compared to the OldConfigData.
 | 
						|
 | 
						|
  @param[in]  OldConfigData    Pointer to the current ConfigData the udp instance
 | 
						|
                               uses.
 | 
						|
  @param[in]  NewConfigData    Pointer to the new ConfigData.
 | 
						|
 | 
						|
  @retval TRUE     The instance is reconfigurable according to NewConfigData.
 | 
						|
  @retval FALSE   The instance is not reconfigurable according to NewConfigData.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
Udp6IsReconfigurable (
 | 
						|
  IN EFI_UDP6_CONFIG_DATA  *OldConfigData,
 | 
						|
  IN EFI_UDP6_CONFIG_DATA  *NewConfigData
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function removes the multicast group specified by Arg from the Map.
 | 
						|
 | 
						|
  @param[in]  Map                Pointer to the NET_MAP.
 | 
						|
  @param[in]  Item               Pointer to the NET_MAP_ITEM.
 | 
						|
  @param[in]  Arg                Pointer to the Arg. It is the pointer to a
 | 
						|
                                 multicast IPv6 Address. This parameter is
 | 
						|
                                 optional and may be NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The multicast address is removed.
 | 
						|
  @retval EFI_ABORTED            The specified multicast address is removed, and the
 | 
						|
                                 Arg is not NULL.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
Udp6LeaveGroup (
 | 
						|
  IN NET_MAP       *Map,
 | 
						|
  IN NET_MAP_ITEM  *Item,
 | 
						|
  IN VOID          *Arg OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function validates the TxToken, it returns the error code according to the spec.
 | 
						|
 | 
						|
  @param[in]  Instance           Pointer to the udp instance context data.
 | 
						|
  @param[in]  TxToken            Pointer to the token to be checked.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The TxToken is valid.
 | 
						|
  @retval EFI_INVALID_PARAMETER  One or more of the following are TRUE:
 | 
						|
                                 Token.Event is NULL.
 | 
						|
                                 Token.Packet.TxData is NULL.
 | 
						|
                                 Token.Packet.TxData.FragmentCount is zero.
 | 
						|
                                 Token.Packet.TxData.DataLength is not equal to the
 | 
						|
                                 sum of fragment lengths.
 | 
						|
                                 One or more of the
 | 
						|
                                 Token.Packet.TxData.FragmentTable[].FragmentLength
 | 
						|
                                 fields is zero.
 | 
						|
                                 One or more of the
 | 
						|
                                 Token.Packet.TxData.FragmentTable[].FragmentBuffer
 | 
						|
                                 fields is NULL.
 | 
						|
                                 UdpSessionData.DestinationAddress are not valid
 | 
						|
                                 unicast IPv6 addresses if the UdpSessionData is
 | 
						|
                                 not NULL.
 | 
						|
                                 UdpSessionData.DestinationPort and
 | 
						|
                                 ConfigData.RemotePort are all zero if the
 | 
						|
                                 UdpSessionData is not NULL.
 | 
						|
  @retval EFI_BAD_BUFFER_SIZE    The data length is greater than the maximum UDP
 | 
						|
                                 packet size.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
Udp6ValidateTxToken (
 | 
						|
  IN UDP6_INSTANCE_DATA         *Instance,
 | 
						|
  IN EFI_UDP6_COMPLETION_TOKEN  *TxToken
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function is a dummy ext-free function for the NET_BUF created for the output
 | 
						|
  udp datagram.
 | 
						|
 | 
						|
  @param[in]  Context               Pointer to the context data.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
Udp6NetVectorExtFree (
 | 
						|
  IN VOID  *Context
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function calculates the checksum for the Packet, utilizing the pre-calculated
 | 
						|
  pseudo header to reduce overhead.
 | 
						|
 | 
						|
  @param[in]  Packet           Pointer to the NET_BUF contains the udp datagram.
 | 
						|
  @param[in]  HeadSum          Checksum of the pseudo header execpt the length
 | 
						|
                               field.
 | 
						|
 | 
						|
  @return The 16-bit checksum of this udp datagram.
 | 
						|
 | 
						|
**/
 | 
						|
UINT16
 | 
						|
Udp6Checksum (
 | 
						|
  IN NET_BUF *Packet,
 | 
						|
  IN UINT16  HeadSum
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function delivers the received datagrams to the specified instance.
 | 
						|
 | 
						|
  @param[in]  Instance               Pointer to the instance context data.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
Udp6InstanceDeliverDgram (
 | 
						|
  IN UDP6_INSTANCE_DATA  *Instance
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Cancel Udp6 tokens from the Udp6 instance.
 | 
						|
 | 
						|
  @param[in]  Instance           Pointer to the udp instance context data.
 | 
						|
  @param[in]  Token              Pointer to the token to be canceled. If NULL, all
 | 
						|
                                 tokens in this instance will be cancelled.
 | 
						|
                                 This parameter is optional and may be NULL.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The Token is cancelled.
 | 
						|
  @retval EFI_NOT_FOUND          The Token is not found.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
Udp6InstanceCancelToken (
 | 
						|
  IN UDP6_INSTANCE_DATA         *Instance,
 | 
						|
  IN EFI_UDP6_COMPLETION_TOKEN  *Token OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function removes all the Wrap datas in the RcvdDgramQue.
 | 
						|
 | 
						|
  @param[in]  Instance    Pointer to the Udp6 Instance.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
Udp6FlushRcvdDgram (
 | 
						|
  IN UDP6_INSTANCE_DATA  *Instance
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 | 
						|
 |