Home | History | Annotate | Download | only in DnsDxe
      1 /** @file
      2 DnsDxe support functions implementation.
      3 
      4 Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef __EFI_DNS_IMPL_H_
     16 #define __EFI_DNS_IMPL_H_
     17 
     18 #include <Uefi.h>
     19 
     20 //
     21 // Libraries classes
     22 //
     23 #include <Library/BaseLib.h>
     24 #include <Library/UefiLib.h>
     25 #include <Library/UefiBootServicesTableLib.h>
     26 #include <Library/UefiDriverEntryPoint.h>
     27 #include <Library/UefiRuntimeServicesTableLib.h>
     28 #include <Library/BaseMemoryLib.h>
     29 #include <Library/MemoryAllocationLib.h>
     30 #include <Library/NetLib.h>
     31 #include <Library/DebugLib.h>
     32 #include <Library/DpcLib.h>
     33 #include <Library/PrintLib.h>
     34 #include <Library/UdpIoLib.h>
     35 
     36 //
     37 // UEFI Driver Model Protocols
     38 //
     39 #include <Protocol/DriverBinding.h>
     40 #include <Protocol/ComponentName2.h>
     41 #include <Protocol/ComponentName.h>
     42 
     43 #include <Protocol/Udp4.h>
     44 #include <Protocol/Dhcp4.h>
     45 #include <Protocol/Dns4.h>
     46 
     47 #include <Protocol/Udp6.h>
     48 #include <Protocol/Dhcp6.h>
     49 #include <Protocol/Dns6.h>
     50 
     51 #include <Protocol/Ip4Config2.h>
     52 
     53 #include "DnsDriver.h"
     54 #include "DnsDhcp.h"
     55 
     56 //
     57 // Driver Version
     58 //
     59 #define DNS_VERSION  0x00000000
     60 
     61 //
     62 // Protocol instances
     63 //
     64 extern EFI_COMPONENT_NAME_PROTOCOL   gDnsComponentName;
     65 extern EFI_COMPONENT_NAME2_PROTOCOL  gDnsComponentName2;
     66 extern EFI_UNICODE_STRING_TABLE      *gDnsControllerNameTable;
     67 
     68 extern EFI_DRIVER_BINDING_PROTOCOL   gDns4DriverBinding;
     69 extern EFI_SERVICE_BINDING_PROTOCOL  mDns4ServiceBinding;
     70 extern EFI_DNS4_PROTOCOL             mDns4Protocol;
     71 
     72 extern EFI_DRIVER_BINDING_PROTOCOL   gDns6DriverBinding;
     73 extern EFI_SERVICE_BINDING_PROTOCOL  mDns6ServiceBinding;
     74 extern EFI_DNS6_PROTOCOL             mDns6Protocol;
     75 
     76 //
     77 // DNS related
     78 //
     79 #define DNS_SERVER_PORT   53
     80 
     81 #define DNS_PROTOCOL_UDP   EFI_IP_PROTO_UDP
     82 #define DNS_PROTOCOL_TCP   EFI_IP_PROTO_TCP
     83 
     84 #define DNS_STATE_UNCONFIGED     0
     85 #define DNS_STATE_CONFIGED       1
     86 #define DNS_STATE_DESTROY        2
     87 
     88 #define DNS_DEFAULT_TIMEOUT      2
     89 #define DNS_DEFAULT_RETRY        3
     90 
     91 #define DNS_TIME_TO_GETMAP       5
     92 
     93 #pragma pack(1)
     94 
     95 typedef union _DNS_FLAGS  DNS_FLAGS;
     96 
     97 typedef struct {
     98   LIST_ENTRY             AllCacheLink;
     99   EFI_DNS4_CACHE_ENTRY   DnsCache;
    100 } DNS4_CACHE;
    101 
    102 typedef struct {
    103   LIST_ENTRY             AllCacheLink;
    104   EFI_DNS6_CACHE_ENTRY   DnsCache;
    105 } DNS6_CACHE;
    106 
    107 typedef struct {
    108   LIST_ENTRY             AllServerLink;
    109   EFI_IPv4_ADDRESS       Dns4ServerIp;
    110 } DNS4_SERVER_IP;
    111 
    112 typedef struct {
    113   LIST_ENTRY             AllServerLink;
    114   EFI_IPv6_ADDRESS       Dns6ServerIp;
    115 } DNS6_SERVER_IP;
    116 
    117 typedef struct {
    118   UINT32                     PacketToLive;
    119   CHAR16                     *QueryHostName;
    120   EFI_IPv4_ADDRESS           QueryIpAddress;
    121   BOOLEAN                    GeneralLookUp;
    122   EFI_DNS4_COMPLETION_TOKEN  *Token;
    123 } DNS4_TOKEN_ENTRY;
    124 
    125 typedef struct {
    126   UINT32                     PacketToLive;
    127   CHAR16                     *QueryHostName;
    128   EFI_IPv6_ADDRESS           QueryIpAddress;
    129   BOOLEAN                    GeneralLookUp;
    130   EFI_DNS6_COMPLETION_TOKEN  *Token;
    131 } DNS6_TOKEN_ENTRY;
    132 
    133 union _DNS_FLAGS{
    134   struct {
    135     UINT16     RCode:4;
    136     UINT16     Zero:3;
    137     UINT16     RA:1;
    138     UINT16     RD:1;
    139     UINT16     TC:1;
    140     UINT16     AA:1;
    141     UINT16     OpCode:4;
    142     UINT16     QR:1;
    143   } Bits;
    144   UINT16  Uint16;
    145 };
    146 
    147 #define DNS_FLAGS_QR_QUERY     0
    148 #define DNS_FLAGS_QR_RESPONSE  1
    149 
    150 #define DNS_FLAGS_OPCODE_STANDARD     0
    151 #define DNS_FLAGS_OPCODE_INVERSE      1
    152 #define DNS_FLAGS_OPCODE_SERVER_STATE 2
    153 
    154 #define DNS_FLAGS_RCODE_NO_ERROR    0
    155 #define DNS_FLAGS_RCODE_NAME_ERROR  3
    156 
    157 typedef struct {
    158   UINT16      Identification;
    159   DNS_FLAGS   Flags;
    160   UINT16      QuestionsNum;
    161   UINT16      AnswersNum;
    162   UINT16      AuthorityNum;
    163   UINT16      AditionalNum;
    164 } DNS_HEADER;
    165 
    166 typedef struct {
    167   UINT16      Type;
    168   UINT16      Class;
    169 } DNS_QUERY_SECTION;
    170 
    171 typedef struct {
    172   UINT16      Type;
    173   UINT16      Class;
    174   UINT32      Ttl;
    175   UINT16      DataLength;
    176 } DNS_ANSWER_SECTION;
    177 
    178 #define DNS4_DOMAIN  L"in-addr.arpa"
    179 #define DNS6_DOMAIN  L"IP6.ARPA"
    180 
    181 
    182 #pragma pack()
    183 
    184 /**
    185   Remove TokenEntry from TokenMap.
    186 
    187   @param[in] TokenMap          All DNSv4 Token entrys.
    188   @param[in] TokenEntry        TokenEntry need to be removed.
    189 
    190   @retval EFI_SUCCESS          Remove TokenEntry from TokenMap sucessfully.
    191   @retval EFI_NOT_FOUND        TokenEntry is not found in TokenMap.
    192 
    193 **/
    194 EFI_STATUS
    195 Dns4RemoveTokenEntry (
    196   IN NET_MAP                    *TokenMap,
    197   IN DNS4_TOKEN_ENTRY           *TokenEntry
    198   );
    199 
    200 /**
    201   Remove TokenEntry from TokenMap.
    202 
    203   @param[in] TokenMap           All DNSv6 Token entrys.
    204   @param[in] TokenEntry         TokenEntry need to be removed.
    205 
    206   @retval EFI_SUCCESS           Remove TokenEntry from TokenMap sucessfully.
    207   @retval EFI_NOT_FOUND         TokenEntry is not found in TokenMap.
    208 
    209 **/
    210 EFI_STATUS
    211 Dns6RemoveTokenEntry (
    212   IN NET_MAP                    *TokenMap,
    213   IN DNS6_TOKEN_ENTRY           *TokenEntry
    214   );
    215 
    216 /**
    217   This function cancle the token specified by Arg in the Map.
    218 
    219   @param[in]  Map             Pointer to the NET_MAP.
    220   @param[in]  Item            Pointer to the NET_MAP_ITEM.
    221   @param[in]  Arg             Pointer to the token to be cancelled. If NULL, all
    222                               the tokens in this Map will be cancelled.
    223                               This parameter is optional and may be NULL.
    224 
    225   @retval EFI_SUCCESS         The token is cancelled if Arg is NULL, or the token
    226                               is not the same as that in the Item, if Arg is not
    227                               NULL.
    228   @retval EFI_ABORTED         Arg is not NULL, and the token specified by Arg is
    229                               cancelled.
    230 
    231 **/
    232 EFI_STATUS
    233 EFIAPI
    234 Dns4CancelTokens (
    235   IN NET_MAP       *Map,
    236   IN NET_MAP_ITEM  *Item,
    237   IN VOID          *Arg OPTIONAL
    238   );
    239 
    240 /**
    241   This function cancle the token specified by Arg in the Map.
    242 
    243   @param[in]  Map             Pointer to the NET_MAP.
    244   @param[in]  Item            Pointer to the NET_MAP_ITEM.
    245   @param[in]  Arg             Pointer to the token to be cancelled. If NULL, all
    246                               the tokens in this Map will be cancelled.
    247                               This parameter is optional and may be NULL.
    248 
    249   @retval EFI_SUCCESS         The token is cancelled if Arg is NULL, or the token
    250                               is not the same as that in the Item, if Arg is not
    251                               NULL.
    252   @retval EFI_ABORTED         Arg is not NULL, and the token specified by Arg is
    253                               cancelled.
    254 
    255 **/
    256 EFI_STATUS
    257 EFIAPI
    258 Dns6CancelTokens (
    259   IN NET_MAP       *Map,
    260   IN NET_MAP_ITEM  *Item,
    261   IN VOID          *Arg OPTIONAL
    262   );
    263 
    264 /**
    265   Get the TokenEntry from the TokensMap.
    266 
    267   @param[in]  TokensMap           All DNSv4 Token entrys
    268   @param[in]  Token               Pointer to the token to be get.
    269   @param[out] TokenEntry          Pointer to TokenEntry corresponding Token.
    270 
    271   @retval EFI_SUCCESS             Get the TokenEntry from the TokensMap sucessfully.
    272   @retval EFI_NOT_FOUND           TokenEntry is not found in TokenMap.
    273 
    274 **/
    275 EFI_STATUS
    276 EFIAPI
    277 GetDns4TokenEntry (
    278   IN     NET_MAP                   *TokensMap,
    279   IN     EFI_DNS4_COMPLETION_TOKEN *Token,
    280      OUT DNS4_TOKEN_ENTRY          **TokenEntry
    281   );
    282 
    283 /**
    284   Get the TokenEntry from the TokensMap.
    285 
    286   @param[in]  TokensMap           All DNSv6 Token entrys
    287   @param[in]  Token               Pointer to the token to be get.
    288   @param[out] TokenEntry          Pointer to TokenEntry corresponding Token.
    289 
    290   @retval EFI_SUCCESS             Get the TokenEntry from the TokensMap sucessfully.
    291   @retval EFI_NOT_FOUND           TokenEntry is not found in TokenMap.
    292 
    293 **/
    294 EFI_STATUS
    295 EFIAPI
    296 GetDns6TokenEntry (
    297   IN     NET_MAP                   *TokensMap,
    298   IN     EFI_DNS6_COMPLETION_TOKEN *Token,
    299      OUT DNS6_TOKEN_ENTRY          **TokenEntry
    300   );
    301 
    302 /**
    303   Cancel DNS4 tokens from the DNS4 instance.
    304 
    305   @param[in]  Instance           Pointer to the DNS instance context data.
    306   @param[in]  Token              Pointer to the token to be canceled. If NULL, all
    307                                  tokens in this instance will be cancelled.
    308                                  This parameter is optional and may be NULL.
    309 
    310   @retval EFI_SUCCESS            The Token is cancelled.
    311   @retval EFI_NOT_FOUND          The Token is not found.
    312 
    313 **/
    314 EFI_STATUS
    315 Dns4InstanceCancelToken (
    316   IN DNS_INSTANCE               *Instance,
    317   IN EFI_DNS4_COMPLETION_TOKEN  *Token
    318   );
    319 
    320 /**
    321   Cancel DNS6 tokens from the DNS6 instance.
    322 
    323   @param[in]  Instance           Pointer to the DNS instance context data.
    324   @param[in]  Token              Pointer to the token to be canceled. If NULL, all
    325                                  tokens in this instance will be cancelled.
    326                                  This parameter is optional and may be NULL.
    327 
    328   @retval EFI_SUCCESS            The Token is cancelled.
    329   @retval EFI_NOT_FOUND          The Token is not found.
    330 
    331 **/
    332 EFI_STATUS
    333 Dns6InstanceCancelToken (
    334   IN DNS_INSTANCE               *Instance,
    335   IN EFI_DNS6_COMPLETION_TOKEN  *Token
    336   );
    337 
    338 /**
    339   Free the resource related to the configure parameters.
    340 
    341   @param  Config                 The DNS configure data
    342 
    343 **/
    344 VOID
    345 Dns4CleanConfigure (
    346   IN OUT EFI_DNS4_CONFIG_DATA  *Config
    347   );
    348 
    349 /**
    350   Free the resource related to the configure parameters.
    351 
    352   @param  Config                 The DNS configure data
    353 
    354 **/
    355 VOID
    356 Dns6CleanConfigure (
    357   IN OUT EFI_DNS6_CONFIG_DATA  *Config
    358   );
    359 
    360 /**
    361   Allocate memory for configure parameter such as timeout value for Dst,
    362   then copy the configure parameter from Src to Dst.
    363 
    364   @param[out]  Dst               The destination DHCP configure data.
    365   @param[in]   Src               The source DHCP configure data.
    366 
    367   @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory.
    368   @retval EFI_SUCCESS            The configure is copied.
    369 
    370 **/
    371 EFI_STATUS
    372 Dns4CopyConfigure (
    373   OUT EFI_DNS4_CONFIG_DATA  *Dst,
    374   IN  EFI_DNS4_CONFIG_DATA  *Src
    375   );
    376 
    377 /**
    378   Allocate memory for configure parameter such as timeout value for Dst,
    379   then copy the configure parameter from Src to Dst.
    380 
    381   @param[out]  Dst               The destination DHCP configure data.
    382   @param[in]   Src               The source DHCP configure data.
    383 
    384   @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory.
    385   @retval EFI_SUCCESS            The configure is copied.
    386 
    387 **/
    388 EFI_STATUS
    389 Dns6CopyConfigure (
    390   OUT EFI_DNS6_CONFIG_DATA  *Dst,
    391   IN  EFI_DNS6_CONFIG_DATA  *Src
    392   );
    393 
    394 /**
    395   Callback of Dns packet. Does nothing.
    396 
    397   @param Arg           The context.
    398 
    399 **/
    400 VOID
    401 EFIAPI
    402 DnsDummyExtFree (
    403   IN VOID                   *Arg
    404   );
    405 
    406 /**
    407   Poll the UDP to get the IP4 default address, which may be retrieved
    408   by DHCP.
    409 
    410   The default time out value is 5 seconds. If IP has retrieved the default address,
    411   the UDP is reconfigured.
    412 
    413   @param  Instance               The DNS instance
    414   @param  UdpIo                  The UDP_IO to poll
    415   @param  UdpCfgData             The UDP configure data to reconfigure the UDP_IO
    416 
    417   @retval TRUE                   The default address is retrieved and UDP is reconfigured.
    418   @retval FALSE                  Some error occured.
    419 
    420 **/
    421 BOOLEAN
    422 Dns4GetMapping (
    423   IN DNS_INSTANCE           *Instance,
    424   IN UDP_IO                 *UdpIo,
    425   IN EFI_UDP4_CONFIG_DATA   *UdpCfgData
    426   );
    427 
    428 /**
    429   Configure the opened Udp6 instance until the corresponding Ip6 instance
    430   has been configured.
    431 
    432   @param  Instance               The DNS instance
    433   @param  UdpIo                  The UDP_IO to poll
    434   @param  UdpCfgData             The UDP configure data to reconfigure the UDP_IO
    435 
    436   @retval TRUE                   Configure the Udp6 instance successfully.
    437   @retval FALSE                  Some error occured.
    438 
    439 **/
    440 BOOLEAN
    441 Dns6GetMapping (
    442   IN DNS_INSTANCE           *Instance,
    443   IN UDP_IO                 *UdpIo,
    444   IN EFI_UDP6_CONFIG_DATA   *UdpCfgData
    445   );
    446 
    447 /**
    448   Configure the UDP.
    449 
    450   @param  Instance               The DNS session
    451   @param  UdpIo                  The UDP_IO instance
    452 
    453   @retval EFI_SUCCESS            The UDP is successfully configured for the
    454                                  session.
    455 
    456 **/
    457 EFI_STATUS
    458 Dns4ConfigUdp (
    459   IN DNS_INSTANCE           *Instance,
    460   IN UDP_IO                 *UdpIo
    461   );
    462 
    463 /**
    464   Configure the UDP.
    465 
    466   @param  Instance               The DNS session
    467   @param  UdpIo                  The UDP_IO instance
    468 
    469   @retval EFI_SUCCESS            The UDP is successfully configured for the
    470                                  session.
    471 
    472 **/
    473 EFI_STATUS
    474 Dns6ConfigUdp (
    475   IN DNS_INSTANCE           *Instance,
    476   IN UDP_IO                 *UdpIo
    477   );
    478 
    479 /**
    480   Update Dns4 cache to shared list of caches of all DNSv4 instances.
    481 
    482   @param  Dns4CacheList      All Dns4 cache list.
    483   @param  DeleteFlag         If FALSE, this function is to add one entry to the DNS Cache.
    484                              If TRUE, this function will delete matching DNS Cache entry.
    485   @param  Override           If TRUE, the matching DNS cache entry will be overwritten with the supplied parameter.
    486                              If FALSE, EFI_ACCESS_DENIED will be returned if the entry to be added is already exists.
    487   @param  DnsCacheEntry      Entry Pointer to DNS Cache entry.
    488 
    489   @retval EFI_SUCCESS        Update Dns4 cache successfully.
    490   @retval Others             Failed to update Dns4 cache.
    491 
    492 **/
    493 EFI_STATUS
    494 EFIAPI
    495 UpdateDns4Cache (
    496   IN LIST_ENTRY             *Dns4CacheList,
    497   IN BOOLEAN                DeleteFlag,
    498   IN BOOLEAN                Override,
    499   IN EFI_DNS4_CACHE_ENTRY   DnsCacheEntry
    500   );
    501 
    502 /**
    503   Update Dns6 cache to shared list of caches of all DNSv6 instances.
    504 
    505   @param  Dns6CacheList      All Dns6 cache list.
    506   @param  DeleteFlag         If FALSE, this function is to add one entry to the DNS Cache.
    507                              If TRUE, this function will delete matching DNS Cache entry.
    508   @param  Override           If TRUE, the matching DNS cache entry will be overwritten with the supplied parameter.
    509                              If FALSE, EFI_ACCESS_DENIED will be returned if the entry to be added is already exists.
    510   @param  DnsCacheEntry      Entry Pointer to DNS Cache entry.
    511 
    512   @retval EFI_SUCCESS        Update Dns6 cache successfully.
    513   @retval Others             Failed to update Dns6 cache.
    514 **/
    515 EFI_STATUS
    516 EFIAPI
    517 UpdateDns6Cache (
    518   IN LIST_ENTRY             *Dns6CacheList,
    519   IN BOOLEAN                DeleteFlag,
    520   IN BOOLEAN                Override,
    521   IN EFI_DNS6_CACHE_ENTRY   DnsCacheEntry
    522   );
    523 
    524 /**
    525   Add Dns4 ServerIp to common list of addresses of all configured DNSv4 server.
    526 
    527   @param  Dns4ServerList    Common list of addresses of all configured DNSv4 server.
    528   @param  ServerIp          DNS server Ip.
    529 
    530   @retval EFI_SUCCESS       Add Dns4 ServerIp to common list successfully.
    531   @retval Others            Failed to add Dns4 ServerIp to common list.
    532 
    533 **/
    534 EFI_STATUS
    535 EFIAPI
    536 AddDns4ServerIp (
    537   IN LIST_ENTRY                *Dns4ServerList,
    538   IN EFI_IPv4_ADDRESS           ServerIp
    539   );
    540 
    541 /**
    542   Add Dns6 ServerIp to common list of addresses of all configured DNSv6 server.
    543 
    544   @param  Dns6ServerList    Common list of addresses of all configured DNSv6 server.
    545   @param  ServerIp          DNS server Ip.
    546 
    547   @retval EFI_SUCCESS       Add Dns6 ServerIp to common list successfully.
    548   @retval Others            Failed to add Dns6 ServerIp to common list.
    549 
    550 **/
    551 EFI_STATUS
    552 EFIAPI
    553 AddDns6ServerIp (
    554   IN LIST_ENTRY                *Dns6ServerList,
    555   IN EFI_IPv6_ADDRESS           ServerIp
    556   );
    557 
    558 /**
    559   Find out whether the response is valid or invalid.
    560 
    561   @param  TokensMap       All DNS transmittal Tokens entry.
    562   @param  Identification  Identification for queried packet.
    563   @param  Type            Type for queried packet.
    564   @param  Class           Class for queried packet.
    565   @param  Item            Return corresponding Token entry.
    566 
    567   @retval TRUE            The response is valid.
    568   @retval FALSE           The response is invalid.
    569 
    570 **/
    571 BOOLEAN
    572 IsValidDnsResponse (
    573   IN     NET_MAP      *TokensMap,
    574   IN     UINT16       Identification,
    575   IN     UINT16       Type,
    576   IN     UINT16       Class,
    577      OUT NET_MAP_ITEM **Item
    578   );
    579 
    580 /**
    581   Parse Dns Response.
    582 
    583   @param  Instance              The DNS instance
    584   @param  RxString              Received buffer.
    585   @param  Completed             Flag to indicate that Dns response is valid.
    586 
    587   @retval EFI_SUCCESS           Parse Dns Response successfully.
    588   @retval Others                Failed to parse Dns Response.
    589 
    590 **/
    591 EFI_STATUS
    592 ParseDnsResponse (
    593   IN OUT DNS_INSTANCE              *Instance,
    594   IN     UINT8                     *RxString,
    595      OUT BOOLEAN                   *Completed
    596   );
    597 
    598 /**
    599   Parse response packet.
    600 
    601   @param  Packet                The packets received.
    602   @param  EndPoint              The local/remote UDP access point
    603   @param  IoStatus              The status of the UDP receive
    604   @param  Context               The opaque parameter to the function.
    605 
    606 **/
    607 VOID
    608 EFIAPI
    609 DnsOnPacketReceived (
    610   NET_BUF                   *Packet,
    611   UDP_END_POINT             *EndPoint,
    612   EFI_STATUS                IoStatus,
    613   VOID                      *Context
    614   );
    615 
    616 /**
    617   Release the net buffer when packet is sent.
    618 
    619   @param  Packet                The packets received.
    620   @param  EndPoint              The local/remote UDP access point
    621   @param  IoStatus              The status of the UDP receive
    622   @param  Context               The opaque parameter to the function.
    623 
    624 **/
    625 VOID
    626 EFIAPI
    627 DnsOnPacketSent (
    628   NET_BUF                   *Packet,
    629   UDP_END_POINT             *EndPoint,
    630   EFI_STATUS                IoStatus,
    631   VOID                      *Context
    632   );
    633 
    634 /**
    635   Query request information.
    636 
    637   @param  Instance              The DNS instance
    638   @param  Packet                The packet for querying request information.
    639 
    640   @retval EFI_SUCCESS           Query request information successfully.
    641   @retval Others                Failed to query request information.
    642 
    643 **/
    644 EFI_STATUS
    645 DoDnsQuery (
    646   IN  DNS_INSTANCE              *Instance,
    647   IN  NET_BUF                   *Packet
    648   );
    649 
    650 /**
    651   Construct the Packet according query section.
    652 
    653   @param  Instance              The DNS instance
    654   @param  QueryName             Queried Name
    655   @param  Type                  Queried Type
    656   @param  Class                 Queried Class
    657   @param  Packet                The packet for query
    658 
    659   @retval EFI_SUCCESS           The packet is constructed.
    660   @retval Others                Failed to construct the Packet.
    661 
    662 **/
    663 EFI_STATUS
    664 ConstructDNSQuery (
    665   IN  DNS_INSTANCE              *Instance,
    666   IN  CHAR8                     *QueryName,
    667   IN  UINT16                    Type,
    668   IN  UINT16                    Class,
    669   OUT NET_BUF                   **Packet
    670   );
    671 
    672 /**
    673   Retransmit the packet.
    674 
    675   @param  Instance              The DNS instance
    676   @param  Packet                Retransmit the packet
    677 
    678   @retval EFI_SUCCESS           The packet is retransmitted.
    679   @retval Others                Failed to retransmit.
    680 
    681 **/
    682 EFI_STATUS
    683 DnsRetransmit (
    684   IN DNS_INSTANCE        *Instance,
    685   IN NET_BUF             *Packet
    686   );
    687 
    688 /**
    689   The timer ticking function for the DNS service.
    690 
    691   @param  Event                 The ticking event
    692   @param  Context               The DNS service instance
    693 
    694 **/
    695 VOID
    696 EFIAPI
    697 DnsOnTimerRetransmit (
    698   IN EFI_EVENT              Event,
    699   IN VOID                   *Context
    700   );
    701 
    702 /**
    703   The timer ticking function for the DNS driver.
    704 
    705   @param  Event                 The ticking event
    706   @param  Context               NULL
    707 
    708 **/
    709 VOID
    710 EFIAPI
    711 DnsOnTimerUpdate (
    712   IN EFI_EVENT              Event,
    713   IN VOID                   *Context
    714   );
    715 
    716 
    717 /**
    718   Retrieve mode data of this DNS instance.
    719 
    720   This function is used to retrieve DNS mode data for this DNS instance.
    721 
    722   @param[in]   This               Pointer to EFI_DNS4_PROTOCOL instance.
    723   @param[out]  DnsModeData        Point to the mode data.
    724 
    725   @retval EFI_SUCCESS             The operation completed successfully.
    726   @retval EFI_NOT_STARTED         When DnsConfigData is queried, no configuration data
    727                                   is available because this instance has not been
    728                                   configured.
    729   @retval EFI_INVALID_PARAMETER   This is NULL or DnsModeData is NULL.
    730   @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
    731 **/
    732 EFI_STATUS
    733 EFIAPI
    734 Dns4GetModeData (
    735   IN  EFI_DNS4_PROTOCOL          *This,
    736   OUT EFI_DNS4_MODE_DATA         *DnsModeData
    737   );
    738 
    739 /**
    740   Configure this DNS instance.
    741 
    742   This function is used to configure DNS mode data for this DNS instance.
    743 
    744   @param[in]  This                Pointer to EFI_DNS4_PROTOCOL instance.
    745   @param[in]  DnsConfigData       Point to the Configuration data.
    746 
    747   @retval EFI_SUCCESS             The operation completed successfully.
    748   @retval EFI_UNSUPPORTED         The designated protocol is not supported.
    749   @retval EFI_INVALID_PARAMTER    Thisis NULL.
    750                                   The StationIp address provided in DnsConfigData is not a
    751                                   valid unicast.
    752                                   DnsServerList is NULL while DnsServerListCount
    753                                   is not ZERO.
    754                                   DnsServerListCount is ZERO while DnsServerList
    755                                   is not NULL
    756   @retval EFI_OUT_OF_RESOURCES    The DNS instance data or required space could not be
    757                                   allocated.
    758   @retval EFI_DEVICE_ERROR        An unexpected system or network error occurred. The
    759                                   EFI DNSv4 Protocol instance is not configured.
    760   @retval EFI_ALREADY_STARTED     Second call to Configure() with DnsConfigData. To
    761                                   reconfigure the instance the caller must call Configure()
    762                                   with NULL first to return driver to unconfigured state.
    763 **/
    764 EFI_STATUS
    765 EFIAPI
    766 Dns4Configure (
    767   IN EFI_DNS4_PROTOCOL           *This,
    768   IN EFI_DNS4_CONFIG_DATA        *DnsConfigData
    769   );
    770 
    771 /**
    772   Host name to host address translation.
    773 
    774   The HostNameToIp () function is used to translate the host name to host IP address. A
    775   type A query is used to get the one or more IP addresses for this host.
    776 
    777   @param[in]  This                Pointer to EFI_DNS4_PROTOCOL instance.
    778   @param[in]  HostName            Host name.
    779   @param[in]  Token               Point to the completion token to translate host name
    780                                   to host address.
    781 
    782   @retval EFI_SUCCESS             The operation completed successfully.
    783   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
    784                                   This is NULL.
    785                                   Token is NULL.
    786                                   Token.Event is NULL.
    787                                   HostName is NULL. HostName string is unsupported format.
    788   @retval EFI_NO_MAPPING          There's no source address is available for use.
    789   @retval EFI_NOT_STARTED         This instance has not been started.
    790 **/
    791 EFI_STATUS
    792 EFIAPI
    793 Dns4HostNameToIp (
    794   IN  EFI_DNS4_PROTOCOL          *This,
    795   IN  CHAR16                    *HostName,
    796   IN  EFI_DNS4_COMPLETION_TOKEN  *Token
    797   );
    798 
    799 /**
    800   IPv4 address to host name translation also known as Reverse DNS lookup.
    801 
    802   The IpToHostName() function is used to translate the host address to host name. A type PTR
    803   query is used to get the primary name of the host. Support of this function is optional.
    804 
    805   @param[in]  This                Pointer to EFI_DNS4_PROTOCOL instance.
    806   @param[in]  IpAddress           Ip Address.
    807   @param[in]  Token               Point to the completion token to translate host
    808                                   address to host name.
    809 
    810   @retval EFI_SUCCESS             The operation completed successfully.
    811   @retval EFI_UNSUPPORTED         This function is not supported.
    812   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
    813                                   This is NULL.
    814                                   Token is NULL.
    815                                   Token.Event is NULL.
    816                                   IpAddress is not valid IP address .
    817   @retval EFI_NO_MAPPING          There's no source address is available for use.
    818   @retval EFI_ALREADY_STARTED     This Token is being used in another DNS session.
    819   @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
    820 **/
    821 EFI_STATUS
    822 EFIAPI
    823 Dns4IpToHostName (
    824   IN  EFI_DNS4_PROTOCOL             *This,
    825   IN  EFI_IPv4_ADDRESS              IpAddress,
    826   IN  EFI_DNS4_COMPLETION_TOKEN     *Token
    827   );
    828 
    829 /**
    830   Retrieve arbitrary information from the DNS server.
    831 
    832   This GeneralLookup() function retrieves arbitrary information from the DNS. The caller
    833   supplies a QNAME, QTYPE, and QCLASS, and all of the matching RRs are returned. All
    834   RR content (e.g., TTL) was returned. The caller need parse the returned RR to get
    835   required information. The function is optional.
    836 
    837   @param[in]  This                Pointer to EFI_DNS4_PROTOCOL instance.
    838   @param[in]  QName               Pointer to Query Name.
    839   @param[in]  QType               Query Type.
    840   @param[in]  QClass              Query Name.
    841   @param[in]  Token               Point to the completion token to retrieve arbitrary
    842                                   information.
    843 
    844   @retval EFI_SUCCESS             The operation completed successfully.
    845   @retval EFI_UNSUPPORTED         This function is not supported. Or the requested
    846                                   QType is not supported
    847   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
    848                                   This is NULL.
    849                                   Token is NULL.
    850                                   Token.Event is NULL.
    851                                   QName is NULL.
    852   @retval EFI_NO_MAPPING          There's no source address is available for use.
    853   @retval EFI_ALREADY_STARTED     This Token is being used in another DNS session.
    854   @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
    855 **/
    856 EFI_STATUS
    857 EFIAPI
    858 Dns4GeneralLookUp (
    859   IN  EFI_DNS4_PROTOCOL                *This,
    860   IN  CHAR8                            *QName,
    861   IN  UINT16                           QType,
    862   IN  UINT16                           QClass,
    863   IN  EFI_DNS4_COMPLETION_TOKEN        *Token
    864   );
    865 
    866 /**
    867   This function is to update the DNS Cache.
    868 
    869   The UpdateDnsCache() function is used to add/delete/modify DNS cache entry. DNS cache
    870   can be normally dynamically updated after the DNS resolve succeeds. This function
    871   provided capability to manually add/delete/modify the DNS cache.
    872 
    873   @param[in]  This                Pointer to EFI_DNS4_PROTOCOL instance.
    874   @param[in]  DeleteFlag          If FALSE, this function is to add one entry to the
    875                                   DNS Cahce. If TRUE, this function will delete
    876                                   matching DNS Cache entry.
    877   @param[in]  Override            If TRUE, the maching DNS cache entry will be
    878                                   overwritten with the supplied parameter. If FALSE,
    879                                   EFI_ACCESS_DENIED will be returned if the entry to
    880                                   be added is already existed.
    881   @param[in]  DnsCacheEntry       Pointer to DNS Cache entry.
    882 
    883   @retval EFI_SUCCESS             The operation completed successfully.
    884   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
    885                                   This is NULL.
    886                                   DnsCacheEntry.HostName is NULL.
    887                                   DnsCacheEntry.IpAddress is NULL.
    888                                   DnsCacheEntry.Timeout is zero.
    889   @retval EFI_ACCESS_DENIED       The DNS cache entry already exists and Override is
    890                                   not TRUE.
    891 **/
    892 EFI_STATUS
    893 EFIAPI
    894 Dns4UpdateDnsCache (
    895   IN EFI_DNS4_PROTOCOL      *This,
    896   IN BOOLEAN               DeleteFlag,
    897   IN BOOLEAN               Override,
    898   IN EFI_DNS4_CACHE_ENTRY   DnsCacheEntry
    899   );
    900 
    901 /**
    902   Polls for incoming data packets and processes outgoing data packets.
    903 
    904   The Poll() function can be used by network drivers and applications to increase the
    905   rate that data packets are moved between the communications device and the transmit
    906   and receive queues.
    907   In some systems, the periodic timer event in the managed network driver may not poll
    908   the underlying communications device fast enough to transmit and/or receive all data
    909   packets without missing incoming packets or dropping outgoing packets. Drivers and
    910   applications that are experiencing packet loss should try calling the Poll()
    911   function more often.
    912 
    913   @param[in]  This                Pointer to EFI_DNS4_PROTOCOL instance.
    914 
    915   @retval EFI_SUCCESS             Incoming or outgoing data was processed.
    916   @retval EFI_NOT_STARTED         This EFI DNS Protocol instance has not been started.
    917   @retval EFI_INVALID_PARAMETER   This is NULL.
    918   @retval EFI_DEVICE_ERROR        An unexpected system or network error occurred.
    919   @retval EFI_TIMEOUT             Data was dropped out of the transmit and/or receive
    920                                   queue. Consider increasing the polling rate.
    921 **/
    922 EFI_STATUS
    923 EFIAPI
    924 Dns4Poll (
    925   IN EFI_DNS4_PROTOCOL    *This
    926   );
    927 
    928 /**
    929   Abort an asynchronous DNS operation, including translation between IP and Host, and
    930   general look up behavior.
    931 
    932   The Cancel() function is used to abort a pending resolution request. After calling
    933   this function, Token.Status will be set to EFI_ABORTED and then Token.Event will be
    934   signaled. If the token is not in one of the queues, which usually means that the
    935   asynchronous operation has completed, this function will not signal the token and
    936   EFI_NOT_FOUND is returned.
    937 
    938   @param[in]  This                Pointer to EFI_DNS4_PROTOCOL instance.
    939   @param[in]  Token               Pointer to a token that has been issued by
    940                                   EFI_DNS4_PROTOCOL.HostNameToIp (),
    941                                   EFI_DNS4_PROTOCOL.IpToHostName() or
    942                                   EFI_DNS4_PROTOCOL.GeneralLookup().
    943                                   If NULL, all pending tokens are aborted.
    944 
    945   @retval EFI_SUCCESS             Incoming or outgoing data was processed.
    946   @retval EFI_NOT_STARTED         This EFI DNS4 Protocol instance has not been started.
    947   @retval EFI_INVALID_PARAMETER   This is NULL.
    948   @retval EFI_NOT_FOUND           When Token is not NULL, and the asynchronous DNS
    949                                   operation was not found in the transmit queue. It
    950                                   was either completed or was not issued by
    951                                   HostNameToIp(), IpToHostName() or GeneralLookup().
    952 **/
    953 EFI_STATUS
    954 EFIAPI
    955 Dns4Cancel (
    956   IN  EFI_DNS4_PROTOCOL          *This,
    957   IN  EFI_DNS4_COMPLETION_TOKEN  *Token
    958   );
    959 
    960 
    961 /**
    962   Retrieve mode data of this DNS instance.
    963 
    964   This function is used to retrieve DNS mode data for this DNS instance.
    965 
    966   @param[in]   This                Pointer to EFI_DNS6_PROTOCOL instance.
    967   @param[out]  DnsModeData         Pointer to the caller-allocated storage for the
    968                                    EFI_DNS6_MODE_DATA data.
    969 
    970   @retval EFI_SUCCESS             The operation completed successfully.
    971   @retval EFI_NOT_STARTED         When DnsConfigData is queried, no configuration data
    972                                   is available because this instance has not been
    973                                   configured.
    974   @retval EFI_INVALID_PARAMETER   This is NULL or DnsModeData is NULL.
    975   @retval EFI_OUT_OF_RESOURCE     Failed to allocate needed resources.
    976 **/
    977 EFI_STATUS
    978 EFIAPI
    979 Dns6GetModeData (
    980   IN  EFI_DNS6_PROTOCOL          *This,
    981   OUT EFI_DNS6_MODE_DATA         *DnsModeData
    982   );
    983 
    984 /**
    985   Configure this DNS instance.
    986 
    987   The Configure() function is used to set and change the configuration data for this
    988   EFI DNSv6 Protocol driver instance. Reset the DNS instance if DnsConfigData is NULL.
    989 
    990   @param[in]  This                Pointer to EFI_DNS6_PROTOCOL instance.
    991   @param[in]  DnsConfigData       Pointer to the configuration data structure. All associated
    992                                   storage to be allocated and released by caller.
    993 
    994   @retval EFI_SUCCESS             The operation completed successfully.
    995   @retval EFI_INVALID_PARAMTER    This is NULL.
    996                                   The StationIp address provided in DnsConfigData is not zero and not a valid unicast.
    997                                   DnsServerList is NULL while DnsServerList Count is not ZERO.
    998                                   DnsServerList Count is ZERO while DnsServerList is not NULL.
    999   @retval EFI_OUT_OF_RESOURCES    The DNS instance data or required space could not be allocated.
   1000   @retval EFI_DEVICE_ERROR        An unexpected system or network error occurred. The
   1001                                   EFI DNSv6 Protocol instance is not configured.
   1002   @retval EFI_UNSUPPORTED         The designated protocol is not supported.
   1003   @retval EFI_ALREADY_STARTED     Second call to Configure() with DnsConfigData. To
   1004                                   reconfigure the instance the caller must call Configure() with
   1005                                   NULL first to return driver to unconfigured state.
   1006 **/
   1007 EFI_STATUS
   1008 EFIAPI
   1009 Dns6Configure (
   1010   IN EFI_DNS6_PROTOCOL           *This,
   1011   IN EFI_DNS6_CONFIG_DATA        *DnsConfigData
   1012   );
   1013 
   1014 /**
   1015   Host name to host address translation.
   1016 
   1017   The HostNameToIp () function is used to translate the host name to host IP address. A
   1018   type AAAA query is used to get the one or more IPv6 addresses for this host.
   1019 
   1020   @param[in]  This                Pointer to EFI_DNS6_PROTOCOL instance.
   1021   @param[in]  HostName            Host name.
   1022   @param[in]  Token               Point to the completion token to translate host name
   1023                                   to host address.
   1024 
   1025   @retval EFI_SUCCESS             The operation completed successfully.
   1026   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
   1027                                   This is NULL.
   1028                                   Token is NULL.
   1029                                   Token.Event is NULL.
   1030                                   HostName is NULL or buffer contained unsupported characters.
   1031   @retval EFI_NO_MAPPING          There's no source address is available for use.
   1032   @retval EFI_ALREADY_STARTED     This Token is being used in another DNS session.
   1033   @retval EFI_NOT_STARTED         This instance has not been started.
   1034   @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
   1035 **/
   1036 EFI_STATUS
   1037 EFIAPI
   1038 Dns6HostNameToIp (
   1039   IN  EFI_DNS6_PROTOCOL          *This,
   1040   IN  CHAR16                     *HostName,
   1041   IN  EFI_DNS6_COMPLETION_TOKEN  *Token
   1042   );
   1043 
   1044 /**
   1045   Host address to host name translation.
   1046 
   1047   The IpToHostName () function is used to translate the host address to host name. A
   1048   type PTR query is used to get the primary name of the host. Implementation can choose
   1049   to support this function or not.
   1050 
   1051   @param[in]  This                Pointer to EFI_DNS6_PROTOCOL instance.
   1052   @param[in]  IpAddress           Ip Address.
   1053   @param[in]  Token               Point to the completion token to translate host
   1054                                   address to host name.
   1055 
   1056   @retval EFI_SUCCESS             The operation completed successfully.
   1057   @retval EFI_UNSUPPORTED         This function is not supported.
   1058   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
   1059                                   This is NULL.
   1060                                   Token is NULL.
   1061                                   Token.Event is NULL.
   1062                                   IpAddress is not valid IP address.
   1063   @retval EFI_NO_MAPPING          There's no source address is available for use.
   1064   @retval EFI_NOT_STARTED         This instance has not been started.
   1065   @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
   1066 **/
   1067 EFI_STATUS
   1068 EFIAPI
   1069 Dns6IpToHostName (
   1070   IN  EFI_DNS6_PROTOCOL             *This,
   1071   IN  EFI_IPv6_ADDRESS              IpAddress,
   1072   IN  EFI_DNS6_COMPLETION_TOKEN     *Token
   1073   );
   1074 
   1075 /**
   1076   This function provides capability to retrieve arbitrary information from the DNS
   1077   server.
   1078 
   1079   This GeneralLookup() function retrieves arbitrary information from the DNS. The caller
   1080   supplies a QNAME, QTYPE, and QCLASS, and all of the matching RRs are returned. All
   1081   RR content (e.g., TTL) was returned. The caller need parse the returned RR to get
   1082   required information. The function is optional. Implementation can choose to support
   1083   it or not.
   1084 
   1085   @param[in]  This                Pointer to EFI_DNS6_PROTOCOL instance.
   1086   @param[in]  QName               Pointer to Query Name.
   1087   @param[in]  QType               Query Type.
   1088   @param[in]  QClass              Query Name.
   1089   @param[in]  Token               Point to the completion token to retrieve arbitrary
   1090                                   information.
   1091 
   1092   @retval EFI_SUCCESS             The operation completed successfully.
   1093   @retval EFI_UNSUPPORTED         This function is not supported. Or the requested
   1094                                   QType is not supported
   1095   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
   1096                                   This is NULL.
   1097                                   Token is NULL.
   1098                                   Token.Event is NULL.
   1099                                   QName is NULL.
   1100   @retval EFI_NO_MAPPING          There's no source address is available for use.
   1101   @retval EFI_NOT_STARTED         This instance has not been started.
   1102   @retval EFI_OUT_OF_RESOURCES    Failed to allocate needed resources.
   1103 **/
   1104 EFI_STATUS
   1105 EFIAPI
   1106 Dns6GeneralLookUp (
   1107   IN  EFI_DNS6_PROTOCOL                *This,
   1108   IN  CHAR8                            *QName,
   1109   IN  UINT16                           QType,
   1110   IN  UINT16                           QClass,
   1111   IN  EFI_DNS6_COMPLETION_TOKEN        *Token
   1112   );
   1113 
   1114 /**
   1115   This function is to update the DNS Cache.
   1116 
   1117   The UpdateDnsCache() function is used to add/delete/modify DNS cache entry. DNS cache
   1118   can be normally dynamically updated after the DNS resolve succeeds. This function
   1119   provided capability to manually add/delete/modify the DNS cache.
   1120 
   1121   @param[in]  This                Pointer to EFI_DNS6_PROTOCOL instance.
   1122   @param[in]  DeleteFlag          If FALSE, this function is to add one entry to the
   1123                                   DNS Cahce. If TRUE, this function will delete
   1124                                   matching DNS Cache entry.
   1125   @param[in]  Override            If TRUE, the maching DNS cache entry will be
   1126                                   overwritten with the supplied parameter. If FALSE,
   1127                                   EFI_ACCESS_DENIED will be returned if the entry to
   1128                                   be added is already existed.
   1129   @param[in]  DnsCacheEntry       Pointer to DNS Cache entry.
   1130 
   1131   @retval EFI_SUCCESS             The operation completed successfully.
   1132   @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
   1133                                   This is NULL.
   1134                                   DnsCacheEntry.HostName is NULL.
   1135                                   DnsCacheEntry.IpAddress is NULL.
   1136                                   DnsCacheEntry.Timeout is zero.
   1137   @retval EFI_ACCESS_DENIED       The DNS cache entry already exists and Override is
   1138                                   not TRUE.
   1139   @retval EFI_OUT_OF_RESOURCE     Failed to allocate needed resources.
   1140 **/
   1141 EFI_STATUS
   1142 EFIAPI
   1143 Dns6UpdateDnsCache (
   1144   IN EFI_DNS6_PROTOCOL      *This,
   1145   IN BOOLEAN               DeleteFlag,
   1146   IN BOOLEAN               Override,
   1147   IN EFI_DNS6_CACHE_ENTRY   DnsCacheEntry
   1148   );
   1149 
   1150 /**
   1151   Polls for incoming data packets and processes outgoing data packets.
   1152 
   1153   The Poll() function can be used by network drivers and applications to increase the
   1154   rate that data packets are moved between the communications device and the transmit
   1155   and receive queues.
   1156 
   1157   In some systems, the periodic timer event in the managed network driver may not poll
   1158   the underlying communications device fast enough to transmit and/or receive all data
   1159   packets without missing incoming packets or dropping outgoing packets. Drivers and
   1160   applications that are experiencing packet loss should try calling the Poll()
   1161   function more often.
   1162 
   1163   @param[in]  This                Pointer to EFI_DNS6_PROTOCOL instance.
   1164 
   1165   @retval EFI_SUCCESS             Incoming or outgoing data was processed.
   1166   @retval EFI_NOT_STARTED         This EFI DNS Protocol instance has not been started.
   1167   @retval EFI_INVALID_PARAMETER   This is NULL.
   1168   @retval EFI_NO_MAPPING          There is no source address is available for use.
   1169   @retval EFI_DEVICE_ERROR        An unexpected system or network error occurred.
   1170   @retval EFI_TIMEOUT             Data was dropped out of the transmit and/or receive
   1171                                   queue. Consider increasing the polling rate.
   1172 **/
   1173 EFI_STATUS
   1174 EFIAPI
   1175 Dns6Poll (
   1176   IN EFI_DNS6_PROTOCOL    *This
   1177   );
   1178 
   1179 /**
   1180   Abort an asynchronous DNS operation, including translation between IP and Host, and
   1181   general look up behavior.
   1182 
   1183   The Cancel() function is used to abort a pending resolution request. After calling
   1184   this function, Token.Status will be set to EFI_ABORTED and then Token.Event will be
   1185   signaled. If the token is not in one of the queues, which usually means that the
   1186   asynchronous operation has completed, this function will not signal the token and
   1187   EFI_NOT_FOUND is returned.
   1188 
   1189   @param[in]  This                Pointer to EFI_DNS6_PROTOCOL instance.
   1190   @param[in]  Token               Pointer to a token that has been issued by
   1191                                   EFI_DNS6_PROTOCOL.HostNameToIp (),
   1192                                   EFI_DNS6_PROTOCOL.IpToHostName() or
   1193                                   EFI_DNS6_PROTOCOL.GeneralLookup().
   1194                                   If NULL, all pending tokens are aborted.
   1195 
   1196   @retval EFI_SUCCESS             Incoming or outgoing data was processed.
   1197   @retval EFI_NOT_STARTED         This EFI DNS6 Protocol instance has not been started.
   1198   @retval EFI_INVALID_PARAMETER   This is NULL.
   1199   @retval EFI_NO_MAPPING          There's no source address is available for use.
   1200   @retval EFI_NOT_FOUND           When Token is not NULL, and the asynchronous DNS
   1201                                   operation was not found in the transmit queue. It
   1202                                   was either completed or was not issued by
   1203                                   HostNameToIp(), IpToHostName() or GeneralLookup().
   1204 **/
   1205 EFI_STATUS
   1206 EFIAPI
   1207 Dns6Cancel (
   1208   IN  EFI_DNS6_PROTOCOL          *This,
   1209   IN  EFI_DNS6_COMPLETION_TOKEN  *Token
   1210   );
   1211 
   1212 #endif
   1213