Home | History | Annotate | Download | only in Udp6Dxe
      1 /** @file
      2   Udp6 driver's whole implementation and internal data structures.
      3 
      4   Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
      5 
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php.
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef _UDP6_IMPL_H_
     17 #define _UDP6_IMPL_H_
     18 
     19 #include <Uefi.h>
     20 
     21 #include <Protocol/Ip6.h>
     22 #include <Protocol/Udp6.h>
     23 
     24 #include <Library/IpIoLib.h>
     25 #include <Library/DebugLib.h>
     26 #include <Library/UefiRuntimeServicesTableLib.h>
     27 #include <Library/UefiBootServicesTableLib.h>
     28 #include <Library/BaseLib.h>
     29 #include <Library/UefiLib.h>
     30 #include <Library/BaseMemoryLib.h>
     31 #include <Library/MemoryAllocationLib.h>
     32 #include <Library/DpcLib.h>
     33 #include <Library/PrintLib.h>
     34 
     35 #include "Udp6Driver.h"
     36 
     37 extern EFI_COMPONENT_NAME2_PROTOCOL   gUdp6ComponentName2;
     38 extern EFI_COMPONENT_NAME_PROTOCOL    gUdp6ComponentName;
     39 extern EFI_UNICODE_STRING_TABLE       *gUdp6ControllerNameTable;
     40 extern EFI_SERVICE_BINDING_PROTOCOL   mUdp6ServiceBinding;
     41 extern EFI_UDP6_PROTOCOL              mUdp6Protocol;
     42 extern UINT16                         mUdp6RandomPort;
     43 
     44 //
     45 // Define time out 50 milliseconds
     46 //
     47 #define UDP6_TIMEOUT_INTERVAL (50 * TICKS_PER_MS)
     48 #define UDP6_HEADER_SIZE      sizeof (EFI_UDP_HEADER)
     49 #define UDP6_MAX_DATA_SIZE    65507
     50 #define UDP6_PORT_KNOWN       1024
     51 
     52 #define UDP6_SERVICE_DATA_SIGNATURE SIGNATURE_32 ('U', 'd', 'p', '6')
     53 #define UDP6_INSTANCE_DATA_SIGNATURE  SIGNATURE_32 ('U', 'd', 'p', 'S')
     54 
     55 #define UDP6_SERVICE_DATA_FROM_THIS(a) \
     56   CR ( \
     57   (a), \
     58   UDP6_SERVICE_DATA, \
     59   ServiceBinding, \
     60   UDP6_SERVICE_DATA_SIGNATURE \
     61   )
     62 
     63 #define UDP6_INSTANCE_DATA_FROM_THIS(a) \
     64   CR ( \
     65   (a), \
     66   UDP6_INSTANCE_DATA, \
     67   Udp6Proto, \
     68   UDP6_INSTANCE_DATA_SIGNATURE \
     69   )
     70 //
     71 // Udp6 service contest data
     72 //
     73 typedef struct _UDP6_SERVICE_DATA {
     74   UINT32                        Signature;
     75   EFI_SERVICE_BINDING_PROTOCOL  ServiceBinding;
     76   EFI_HANDLE                    ImageHandle;
     77   EFI_HANDLE                    ControllerHandle;
     78   LIST_ENTRY                    ChildrenList;
     79   UINTN                         ChildrenNumber;
     80   IP_IO                         *IpIo;
     81   EFI_EVENT                     TimeoutEvent;
     82  } UDP6_SERVICE_DATA;
     83 
     84 typedef struct _UDP6_INSTANCE_DATA {
     85   UINT32                Signature;
     86   LIST_ENTRY            Link;
     87   UDP6_SERVICE_DATA     *Udp6Service;
     88   EFI_UDP6_PROTOCOL     Udp6Proto;
     89   EFI_UDP6_CONFIG_DATA  ConfigData;
     90   EFI_HANDLE            ChildHandle;
     91   BOOLEAN               Configured;
     92   BOOLEAN               IsNoMapping;
     93   NET_MAP               TxTokens;
     94   NET_MAP               RxTokens;
     95   NET_MAP               McastIps;
     96   LIST_ENTRY            RcvdDgramQue;
     97   LIST_ENTRY            DeliveredDgramQue;
     98   UINT16                HeadSum;
     99   EFI_STATUS            IcmpError;
    100   IP_IO_IP_INFO         *IpInfo;
    101   BOOLEAN               InDestroy;
    102 } UDP6_INSTANCE_DATA;
    103 
    104 typedef struct _UDP6_RXDATA_WRAP {
    105   LIST_ENTRY             Link;
    106   NET_BUF                *Packet;
    107   UINT32                 TimeoutTick;
    108   EFI_UDP6_RECEIVE_DATA  RxData;
    109 } UDP6_RXDATA_WRAP;
    110 
    111 typedef struct {
    112   EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;
    113   UINTN                         NumberOfChildren;
    114   EFI_HANDLE                    *ChildHandleBuffer;
    115 } UDP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
    116 
    117 /**
    118   Clean the Udp service context data.
    119 
    120   @param[in, out]  Udp6Service      Pointer to the UDP6_SERVICE_DATA.
    121 
    122 **/
    123 VOID
    124 Udp6CleanService (
    125   IN OUT UDP6_SERVICE_DATA  *Udp6Service
    126   );
    127 
    128 /**
    129   Create the Udp service context data.
    130 
    131   @param[in]  Udp6Service            Pointer to the UDP6_SERVICE_DATA.
    132   @param[in]  ImageHandle            The image handle of this udp6 driver.
    133   @param[in]  ControllerHandle       The controller handle this udp6 driver binds on.
    134 
    135   @retval EFI_SUCCESS            The udp6 service context data was created and
    136                                  initialized.
    137   @retval EFI_OUT_OF_RESOURCES   Cannot allocate memory.
    138   @retval Others                 An error condition occurred.
    139 
    140 **/
    141 EFI_STATUS
    142 Udp6CreateService (
    143   IN UDP6_SERVICE_DATA  *Udp6Service,
    144   IN EFI_HANDLE         ImageHandle,
    145   IN EFI_HANDLE         ControllerHandle
    146   );
    147 
    148 /**
    149   This function cleans the udp instance.
    150 
    151   @param[in, out]  Instance       Pointer to the UDP6_INSTANCE_DATA to clean.
    152 
    153 **/
    154 VOID
    155 Udp6CleanInstance (
    156   IN OUT UDP6_INSTANCE_DATA  *Instance
    157   );
    158 
    159 /**
    160   This function intializes the new created udp instance.
    161 
    162   @param[in]      Udp6Service      Pointer to the UDP6_SERVICE_DATA.
    163   @param[in, out]  Instance         Pointer to the un-initialized UDP6_INSTANCE_DATA.
    164 
    165 **/
    166 VOID
    167 Udp6InitInstance (
    168   IN UDP6_SERVICE_DATA       *Udp6Service,
    169   IN OUT UDP6_INSTANCE_DATA  *Instance
    170   );
    171 
    172 /**
    173   This function reports the received ICMP error.
    174 
    175   @param[in]  Instance          Pointer to the udp instance context data.
    176 
    177 **/
    178 VOID
    179 Udp6ReportIcmpError (
    180   IN UDP6_INSTANCE_DATA  *Instance
    181   );
    182 
    183 /**
    184   This function copies the current operational settings of this EFI UDPv6 Protocol
    185   instance into user-supplied buffers. This function is used optionally to retrieve
    186   the operational mode data of underlying networks or drivers.
    187 
    188   @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
    189   @param[out] Udp6ConfigData     The buffer in which the current UDP configuration
    190                                  data is returned. This parameter is optional and
    191                                  may be NULL.
    192   @param[out] Ip6ModeData        The buffer in which the current EFI IPv6 Protocol
    193                                  mode data is returned. This parameter is optional
    194                                  and may be NULL.
    195   @param[out] MnpConfigData      The buffer in which the current managed network
    196                                  configuration data is returned. This parameter
    197                                  is optional and may be NULL.
    198   @param[out] SnpModeData        The buffer in which the simple network mode data
    199                                  is returned. This parameter is optional and may be NULL.
    200 
    201   @retval EFI_SUCCESS            The mode data was read.
    202   @retval EFI_NOT_STARTED        When Udp6ConfigData is queried, no configuration
    203                                  data is  available because this instance has not
    204                                  been started.
    205   @retval EFI_INVALID_PARAMETER  This is NULL.
    206 
    207 **/
    208 EFI_STATUS
    209 EFIAPI
    210 Udp6GetModeData (
    211   IN  EFI_UDP6_PROTOCOL                *This,
    212   OUT EFI_UDP6_CONFIG_DATA             *Udp6ConfigData OPTIONAL,
    213   OUT EFI_IP6_MODE_DATA                *Ip6ModeData    OPTIONAL,
    214   OUT EFI_MANAGED_NETWORK_CONFIG_DATA  *MnpConfigData  OPTIONAL,
    215   OUT EFI_SIMPLE_NETWORK_MODE          *SnpModeData    OPTIONAL
    216   );
    217 
    218 /**
    219   This function is used to do the following:
    220   Initialize and start this instance of the EFI UDPv6 Protocol.
    221   Change the filtering rules and operational parameters.
    222   Reset this instance of the EFI UDPv6 Protocol.
    223 
    224   @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
    225   @param[in]  UdpConfigData      Pointer to the buffer to set the configuration
    226                                  data. This parameter is optional and may be NULL.
    227 
    228   @retval EFI_SUCCESS            The configuration settings were set, changed, or
    229                                  reset successfully.
    230   @retval EFI_NO_MAPPING         When the UdpConifgData.UseAnyStationAddress is set
    231                                  to true  and there is no address available for IP6
    232                                  driver to binding  source address to this
    233                                  instance.
    234   @retval EFI_INVALID_PARAMETER  One or more following conditions are TRUE:
    235                                  This is NULL.
    236                                  UdpConfigData.StationAddress is not a valid
    237                                  unicast IPv6 address.
    238                                  UdpConfigData.RemoteAddress is not a valid unicast
    239                                  IPv6  address, if it is not zero.
    240   @retval EFI_ALREADY_STARTED    The EFI UDPv6 Protocol instance is already
    241                                  started/configured and must be stopped/reset
    242                                  before it can be reconfigured. Only TrafficClass,
    243                                  HopLimit, ReceiveTimeout, and TransmitTimeout can
    244                                  be reconfigured without stopping the current
    245                                  instance of the EFI UDPv6 Protocol.
    246   @retval EFI_ACCESS_DENIED      UdpConfigData.AllowDuplicatePort is FALSE, and
    247                                  UdpConfigData.StationPort is already used by another
    248                                  instance.
    249   @retval EFI_OUT_OF_RESOURCES   The EFI UDPv6 Protocol driver cannot allocate
    250                                  memory for this EFI UDPv6 Protocol instance.
    251   @retval EFI_DEVICE_ERROR       An unexpected network or system error occurred, and
    252                                  this instance was not opened.
    253 
    254 **/
    255 EFI_STATUS
    256 EFIAPI
    257 Udp6Configure (
    258   IN EFI_UDP6_PROTOCOL     *This,
    259   IN EFI_UDP6_CONFIG_DATA  *UdpConfigData OPTIONAL
    260   );
    261 
    262 /**
    263   This function places a sending request to this instance of the EFI UDPv6 Protocol,
    264   alongside the transmit data that was filled by the user.
    265 
    266   @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
    267   @param[in]  Token              Pointer to the completion token that will be
    268                                  placed into the transmit queue.
    269 
    270   @retval EFI_SUCCESS            The data has been queued for transmission.
    271   @retval EFI_NOT_STARTED        This EFI UDPv6 Protocol instance has not been
    272                                  started.
    273   @retval EFI_NO_MAPPING         The under-layer IPv6 driver was responsible for
    274                                  choosing a source address for this instance, but
    275                                  no  source address was available for use.
    276   @retval EFI_INVALID_PARAMETER  One or more of the following are TRUE:
    277                                  This is NULL. Token is NULL. Token.Event is NULL.
    278                                  Token.Packet.TxData is NULL.
    279                                  Token.Packet.TxData.FragmentCount is zero.
    280                                  Token.Packet.TxData.DataLength is not equal to the
    281                                  sum of fragment lengths.
    282                                  One or more of the
    283                                  Token.Packet.TxData.FragmentTable[]
    284                                  .FragmentLength fields is zero.
    285                                  One or more of the
    286                                  Token.Packet.TxData.FragmentTable[]
    287                                  .FragmentBuffer fields is NULL.
    288                                  One or more of the
    289                                  Token.Packet.TxData.UdpSessionData.
    290                                  DestinationAddres are not valid unicast IPv6
    291                                  addresses, if the  UdpSessionData is not NULL.
    292                                  Token.Packet.TxData.UdpSessionData.
    293                                  DestinationAddres is NULL
    294                                  Token.Packet.TxData.UdpSessionData.
    295                                  DestinatioPort is zero.
    296                                  Token.Packet.TxData.UdpSessionData is
    297                                  NULL and this  instance's
    298                                  UdpConfigData.RemoteAddress is unspecified.
    299   @retval EFI_ACCESS_DENIED      The transmit completion token with the same
    300                                  Token.Event is already in the transmit queue.
    301   @retval EFI_NOT_READY          The completion token could not be queued because
    302                                  the transmit queue is full.
    303   @retval EFI_OUT_OF_RESOURCES   Could not queue the transmit data.
    304   @retval EFI_NOT_FOUND          There is no route to the destination network or
    305                                  address.
    306   @retval EFI_BAD_BUFFER_SIZE    The data length is greater than the maximum UDP
    307                                  packet size. Or the length of the IP header + UDP
    308                                  header + data length is greater than MTU if
    309                                  DoNotFragment is TRUE.
    310 
    311 **/
    312 EFI_STATUS
    313 EFIAPI
    314 Udp6Transmit (
    315   IN EFI_UDP6_PROTOCOL          *This,
    316   IN EFI_UDP6_COMPLETION_TOKEN  *Token
    317   );
    318 
    319 /**
    320   This function places a completion token into the receive packet queue. This function
    321   is always asynchronous.
    322 
    323   @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
    324   @param[in]  Token              Pointer to a token that is associated with the
    325                                  receive data descriptor.
    326 
    327   @retval EFI_SUCCESS            The receive completion token is cached.
    328   @retval EFI_NOT_STARTED        This EFI UDPv6 Protocol instance has not been
    329                                  started.
    330   @retval EFI_NO_MAPPING         When using a default address, configuration (DHCP,
    331                                  BOOTP, RARP, etc.) is not finished yet.
    332   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
    333                                  This is NULL.
    334                                  Token is NULL.
    335                                  Token.Event is NULL.
    336   @retval EFI_OUT_OF_RESOURCES   The receive completion token could not be queued
    337                                  due to a lack of system resources (usually
    338                                  memory).
    339   @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
    340                                  The EFI UDPv6 Protocol instance has been reset to
    341                                  startup defaults.
    342   @retval EFI_ACCESS_DENIED      A receive completion token with the same
    343                                  Token.Event is already in the receive queue.
    344   @retval EFI_NOT_READY          The receive request could not be queued because
    345                                  the receive  queue is full.
    346 
    347 **/
    348 EFI_STATUS
    349 EFIAPI
    350 Udp6Receive (
    351   IN EFI_UDP6_PROTOCOL          *This,
    352   IN EFI_UDP6_COMPLETION_TOKEN  *Token
    353   );
    354 
    355 /**
    356   This function is used to abort a pending transmit or receive request.
    357 
    358   @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
    359   @param[in]  Token              Pointer to a token that has been issued by
    360                                  EFI_UDP6_PROTOCOL.Transmit() or
    361                                  EFI_UDP6_PROTOCOL.Receive(). This parameter is
    362                                  optional and may be NULL.
    363 
    364   @retval EFI_SUCCESS            The asynchronous I/O request is aborted and
    365                                  Token.Event is  signaled. When Token is NULL, all
    366                                  pending requests are aborted and their events are
    367                                  signaled.
    368   @retval EFI_INVALID_PARAMETER  This is NULL.
    369   @retval EFI_NOT_STARTED        This instance has not been started.
    370   @retval EFI_NO_MAPPING         When using the default address, configuration
    371                                  (DHCP, BOOTP, RARP, etc.) is not finished yet.
    372   @retval EFI_NOT_FOUND          When Token is not NULL, the asynchronous I/O
    373                                  request is not found in the transmit or receive
    374                                  queue. It either completed or was not issued by
    375                                  Transmit() or Receive().
    376 
    377 **/
    378 EFI_STATUS
    379 EFIAPI
    380 Udp6Cancel (
    381   IN EFI_UDP6_PROTOCOL          *This,
    382   IN EFI_UDP6_COMPLETION_TOKEN  *Token OPTIONAL
    383   );
    384 
    385 /**
    386   This function can be used by network drivers and applications to increase the rate that
    387   data packets are moved between the communications device and the transmit/receive queues.
    388 
    389   @param[in] This                Pointer to the EFI_UDP6_PROTOCOL instance.
    390 
    391   @retval EFI_SUCCESS            Incoming or outgoing data was processed.
    392   @retval EFI_INVALID_PARAMETER  This is NULL.
    393   @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
    394   @retval EFI_TIMEOUT            Data was dropped out of the transmit and/or
    395                                  receive queue.
    396 
    397 **/
    398 EFI_STATUS
    399 EFIAPI
    400 Udp6Poll (
    401   IN EFI_UDP6_PROTOCOL  *This
    402   );
    403 
    404 /**
    405   This function is used to enable and disable the multicast group filtering.
    406 
    407   @param[in]  This               Pointer to the EFI_UDP6_PROTOCOL instance.
    408   @param[in]  JoinFlag           Set to TRUE to join a multicast group. Set to
    409                                  FALSE to leave one or all multicast groups.
    410   @param[in]  MulticastAddress   Pointer to multicast group address to join or
    411                                  leave. This parameter is optional and may be NULL.
    412 
    413   @retval EFI_SUCCESS            The operation completed successfully.
    414   @retval EFI_NOT_STARTED        The EFI UDPv6 Protocol instance has not been
    415                                  started.
    416   @retval EFI_OUT_OF_RESOURCES   Could not allocate resources to join the group.
    417   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
    418                                  This is NULL. JoinFlag is TRUE and
    419                                  MulticastAddress is NULL. JoinFlag is TRUE and
    420                                  *MulticastAddress is not a valid  multicast
    421                                  address.
    422   @retval EFI_ALREADY_STARTED    The group address is already in the group table
    423                                  (when JoinFlag is TRUE).
    424   @retval EFI_NOT_FOUND          The group address is not in the group table (when
    425                                  JoinFlag is FALSE).
    426   @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
    427 
    428 **/
    429 EFI_STATUS
    430 EFIAPI
    431 Udp6Groups (
    432   IN EFI_UDP6_PROTOCOL  *This,
    433   IN BOOLEAN            JoinFlag,
    434   IN EFI_IPv6_ADDRESS   *MulticastAddress OPTIONAL
    435   );
    436 
    437 /**
    438   This function tries to bind the udp instance according to the configured port
    439   allocation stragety.
    440 
    441   @param[in]  InstanceList       Pointer to the head of the list linking the udp
    442                                  instances.
    443   @param[in]  ConfigData         Pointer to the ConfigData of the instance to be
    444                                  bound.
    445 
    446   @retval EFI_SUCCESS            The bound operation completed successfully.
    447   @retval EFI_ACCESS_DENIED      The <Address, Port> specified by the ConfigData is
    448                                  already used by another instance.
    449   @retval EFI_OUT_OF_RESOURCES   No available port resources.
    450 
    451 **/
    452 EFI_STATUS
    453 Udp6Bind (
    454   IN LIST_ENTRY            *InstanceList,
    455   IN EFI_UDP6_CONFIG_DATA  *ConfigData
    456   );
    457 
    458 /**
    459   This function builds the Ip6 configdata from the Udp6ConfigData.
    460 
    461   @param[in]       Udp6ConfigData         Pointer to the EFI_UDP6_CONFIG_DATA.
    462   @param[in, out]  Ip6ConfigData          Pointer to the EFI_IP6_CONFIG_DATA.
    463 
    464 **/
    465 VOID
    466 Udp6BuildIp6ConfigData (
    467   IN EFI_UDP6_CONFIG_DATA      *Udp6ConfigData,
    468   IN OUT EFI_IP6_CONFIG_DATA   *Ip6ConfigData
    469   );
    470 
    471 /**
    472   This function checks whether the specified Token duplicates with the one in the Map.
    473 
    474   @param[in]  Map                Pointer to the NET_MAP.
    475   @param[in]  Item               Pointer to the NET_MAP_ITEM contain the pointer to
    476                                  the Token.
    477   @param[in]  Context            Pointer to the Token to be checked.
    478 
    479   @retval EFI_SUCCESS            The Token specified by Context differs from the
    480                                  one in the Item.
    481   @retval EFI_ACCESS_DENIED      The Token duplicates with the one in the Item.
    482 
    483 **/
    484 EFI_STATUS
    485 EFIAPI
    486 Udp6TokenExist (
    487   IN NET_MAP       *Map,
    488   IN NET_MAP_ITEM  *Item,
    489   IN VOID          *Context
    490   );
    491 
    492 /**
    493   This function removes the specified Token from the TokenMap.
    494 
    495   @param[in]  TokenMap           Pointer to the NET_MAP containing the tokens.
    496   @param[in]  Token              Pointer to the Token to be removed.
    497 
    498   @retval EFI_SUCCESS            The specified Token is removed from the TokenMap.
    499   @retval EFI_NOT_FOUND          The specified Token is not found in the TokenMap.
    500 
    501 **/
    502 EFI_STATUS
    503 Udp6RemoveToken (
    504   IN NET_MAP                    *TokenMap,
    505   IN EFI_UDP6_COMPLETION_TOKEN  *Token
    506   );
    507 
    508 /**
    509   This function is used to check whether the NewConfigData has any un-reconfigurable
    510   parameters changed compared to the OldConfigData.
    511 
    512   @param[in]  OldConfigData    Pointer to the current ConfigData the udp instance
    513                                uses.
    514   @param[in]  NewConfigData    Pointer to the new ConfigData.
    515 
    516   @retval TRUE     The instance is reconfigurable according to NewConfigData.
    517   @retval FALSE   The instance is not reconfigurable according to NewConfigData.
    518 
    519 **/
    520 BOOLEAN
    521 Udp6IsReconfigurable (
    522   IN EFI_UDP6_CONFIG_DATA  *OldConfigData,
    523   IN EFI_UDP6_CONFIG_DATA  *NewConfigData
    524   );
    525 
    526 /**
    527   This function removes the multicast group specified by Arg from the Map.
    528 
    529   @param[in]  Map                Pointer to the NET_MAP.
    530   @param[in]  Item               Pointer to the NET_MAP_ITEM.
    531   @param[in]  Arg                Pointer to the Arg. It is the pointer to a
    532                                  multicast IPv6 Address. This parameter is
    533                                  optional and may be NULL.
    534 
    535   @retval EFI_SUCCESS            The multicast address is removed.
    536   @retval EFI_ABORTED            The specified multicast address is removed, and the
    537                                  Arg is not NULL.
    538 
    539 **/
    540 EFI_STATUS
    541 EFIAPI
    542 Udp6LeaveGroup (
    543   IN NET_MAP       *Map,
    544   IN NET_MAP_ITEM  *Item,
    545   IN VOID          *Arg OPTIONAL
    546   );
    547 
    548 /**
    549   This function validates the TxToken, it returns the error code according to the spec.
    550 
    551   @param[in]  Instance           Pointer to the udp instance context data.
    552   @param[in]  TxToken            Pointer to the token to be checked.
    553 
    554   @retval EFI_SUCCESS            The TxToken is valid.
    555   @retval EFI_INVALID_PARAMETER  One or more of the following are TRUE:
    556                                  Token.Event is NULL.
    557                                  Token.Packet.TxData is NULL.
    558                                  Token.Packet.TxData.FragmentCount is zero.
    559                                  Token.Packet.TxData.DataLength is not equal to the
    560                                  sum of fragment lengths.
    561                                  One or more of the
    562                                  Token.Packet.TxData.FragmentTable[].FragmentLength
    563                                  fields is zero.
    564                                  One or more of the
    565                                  Token.Packet.TxData.FragmentTable[].FragmentBuffer
    566                                  fields is NULL.
    567                                  UdpSessionData.DestinationAddress are not valid
    568                                  unicast IPv6 addresses if the UdpSessionData is
    569                                  not NULL.
    570                                  UdpSessionData.DestinationPort and
    571                                  ConfigData.RemotePort are all zero if the
    572                                  UdpSessionData is not NULL.
    573   @retval EFI_BAD_BUFFER_SIZE    The data length is greater than the maximum UDP
    574                                  packet size.
    575 
    576 **/
    577 EFI_STATUS
    578 Udp6ValidateTxToken (
    579   IN UDP6_INSTANCE_DATA         *Instance,
    580   IN EFI_UDP6_COMPLETION_TOKEN  *TxToken
    581   );
    582 
    583 /**
    584   This function is a dummy ext-free function for the NET_BUF created for the output
    585   udp datagram.
    586 
    587   @param[in]  Context               Pointer to the context data.
    588 
    589 **/
    590 VOID
    591 EFIAPI
    592 Udp6NetVectorExtFree (
    593   IN VOID  *Context
    594   );
    595 
    596 /**
    597   This function calculates the checksum for the Packet, utilizing the pre-calculated
    598   pseudo header to reduce overhead.
    599 
    600   @param[in]  Packet           Pointer to the NET_BUF contains the udp datagram.
    601   @param[in]  HeadSum          Checksum of the pseudo header execpt the length
    602                                field.
    603 
    604   @return The 16-bit checksum of this udp datagram.
    605 
    606 **/
    607 UINT16
    608 Udp6Checksum (
    609   IN NET_BUF *Packet,
    610   IN UINT16  HeadSum
    611   );
    612 
    613 /**
    614   This function delivers the received datagrams to the specified instance.
    615 
    616   @param[in]  Instance               Pointer to the instance context data.
    617 
    618 **/
    619 VOID
    620 Udp6InstanceDeliverDgram (
    621   IN UDP6_INSTANCE_DATA  *Instance
    622   );
    623 
    624 /**
    625   Cancel Udp6 tokens from the Udp6 instance.
    626 
    627   @param[in]  Instance           Pointer to the udp instance context data.
    628   @param[in]  Token              Pointer to the token to be canceled. If NULL, all
    629                                  tokens in this instance will be cancelled.
    630                                  This parameter is optional and may be NULL.
    631 
    632   @retval EFI_SUCCESS            The Token is cancelled.
    633   @retval EFI_NOT_FOUND          The Token is not found.
    634 
    635 **/
    636 EFI_STATUS
    637 Udp6InstanceCancelToken (
    638   IN UDP6_INSTANCE_DATA         *Instance,
    639   IN EFI_UDP6_COMPLETION_TOKEN  *Token OPTIONAL
    640   );
    641 
    642 /**
    643   This function removes all the Wrap datas in the RcvdDgramQue.
    644 
    645   @param[in]  Instance    Pointer to the Udp6 Instance.
    646 
    647 **/
    648 VOID
    649 Udp6FlushRcvdDgram (
    650   IN UDP6_INSTANCE_DATA  *Instance
    651   );
    652 
    653 #endif
    654 
    655