197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/** @file
2fb115c61504fe6c4f94be0a87f75e28e1684657ftye  This library is only intended to be used by UEFI network stack modules.
3fb115c61504fe6c4f94be0a87f75e28e1684657ftye  It provides the combined IpIo layer on the EFI IP4 Protocol and EFI IP6 protocol.
497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
5cd5ebaa06dca3e6ef3c464081e6defe00d358c69hhtianCopyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>
664a80549c8ab874c5b23b376adbb99008e6143b0myronporterThis program and the accompanying materials are licensed and made available under
764a80549c8ab874c5b23b376adbb99008e6143b0myronporterthe terms and conditions of the BSD License that accompanies this distribution.
864a80549c8ab874c5b23b376adbb99008e6143b0myronporterThe full text of the license may be found at
964a80549c8ab874c5b23b376adbb99008e6143b0myronporterhttp://opensource.org/licenses/bsd-license.php.
1097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
1164a80549c8ab874c5b23b376adbb99008e6143b0myronporterTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
1497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
1597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
1697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#ifndef _IP_IO_H_
1797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define _IP_IO_H_
1897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
1997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#include <Protocol/Ip4.h>
20fb115c61504fe6c4f94be0a87f75e28e1684657ftye#include <Protocol/Ip6.h>
21cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
2297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#include <Library/NetLib.h>
2397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
2497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang//
25e9b67286ad4428d63e2495f38b71273b81e0846fpkandel// type and code define for ICMP protocol error
2697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang// from IP
2797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang//
2897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_TYPE_UNREACH              3
29cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu#define ICMP_TYPE_TIMXCEED             11
3097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_TYPE_PARAMPROB            12
3197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_TYPE_SOURCEQUENCH         4
3297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
3397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_NET          0
3497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_HOST         1
3597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_PROTOCOL     2
3697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_PORT         3
3797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_NEEDFRAG     4
3897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_SRCFAIL      5
3997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_NET_UNKNOWN  6
4097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7
4197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_ISOLATED     8
4297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_NET_PROHIB   9
4397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_HOST_PROHIB  10
4497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_TOSNET       11
4597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#define ICMP_CODE_UNREACH_TOSHOST      12
4697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
47cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu/**
48e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  Get the IP header length from the struct EFI_IP4_HEADER. HeaderLength is
49cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  Internet header length in 32-bit words, so HeaderLength<<2 is the real
50cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  length of IP header.
51cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
5264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[out] HdrPtr   A pointer to EFI_IP4_HEADER.
53cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
5464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @return The IP header length.
55cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu**/
56cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)
57cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
58cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu/**
59cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  To types of ICMP error which consist of ICMP header, IP header and original
60cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  datagram's data, get length from sum of ICMP header length, IP header length
61cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  and first 64 bits of datagram's data length.
62cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
6364a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in] IpHdr   A pointer to EFI_IP4_HEADER.
64cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
6564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @return The ICMP error length.
66cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu**/
67cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu#define ICMP_ERRLEN(IpHdr) \
68cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  (sizeof(IP4_ICMP_HEAD) + EFI_IP4_HEADER_LEN(IpHdr) + 8)
69cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
70cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu/**
71cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  Get the packet header from NET_BUF.
72cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
7364a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[out]  Buf    A pointer to NET_BUF.
7464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]   Type   Header type.
75cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
7664a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @return The pointer to packet header.
77cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu**/
78cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu#define NET_PROTO_HDR(Buf, Type)  ((Type *) ((Buf)->BlockOp[0].Head))
79cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
80cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
81fb115c61504fe6c4f94be0a87f75e28e1684657ftyeextern EFI_IP4_CONFIG_DATA  mIp4IoDefaultIpConfigData;
82fb115c61504fe6c4f94be0a87f75e28e1684657ftyeextern EFI_IP6_CONFIG_DATA  mIp6IoDefaultIpConfigData;
83fb115c61504fe6c4f94be0a87f75e28e1684657ftye
84cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu
85e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
86e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// This error will be delivered to the
87e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// listening transportation layer protocol
88e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// that consumes IpIO.
89e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
90b45b45b2d248892930620c33a9d01d8457ae0e54tye
91b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_UNREACH_NET           0
92b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_UNREACH_HOST          1
93b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_UNREACH_PROTOCOL      2
94b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_UNREACH_PORT          3
95b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_MSGSIZE               4
96b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_UNREACH_SRCFAIL       5
97b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_TIMXCEED_INTRANS      6
98b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_TIMXCEED_REASS        7
99b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_QUENCH                8
100b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP_ERR_PARAMPROB             9
101b45b45b2d248892930620c33a9d01d8457ae0e54tye
102b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_UNREACH_NET          0
103b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_UNREACH_HOST         1
104b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_UNREACH_PROTOCOL     2
105b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_UNREACH_PORT         3
106b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_PACKAGE_TOOBIG       4
107b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_TIMXCEED_HOPLIMIT    5
108b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_TIMXCEED_REASS       6
109b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_PARAMPROB_HEADER     7
110b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_PARAMPROB_NEXHEADER  8
111b45b45b2d248892930620c33a9d01d8457ae0e54tye#define  ICMP6_ERR_PARAMPROB_IPV6OPTION 9
112fb115c61504fe6c4f94be0a87f75e28e1684657ftye
113e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
114e9b67286ad4428d63e2495f38b71273b81e0846fpkandel/// The helper struct for IpIoGetIcmpErrStatus(). It is for internal use only.
115e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
116cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywutypedef struct {
117fb115c61504fe6c4f94be0a87f75e28e1684657ftye  BOOLEAN                   IsHard;
118fb115c61504fe6c4f94be0a87f75e28e1684657ftye  BOOLEAN                   Notify;
11997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang} ICMP_ERROR_INFO;
12097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
121fb115c61504fe6c4f94be0a87f75e28e1684657ftyetypedef union {
122fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP4_COMPLETION_TOKEN  Ip4Token;
123fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP6_COMPLETION_TOKEN  Ip6Token;
124fb115c61504fe6c4f94be0a87f75e28e1684657ftye} IP_IO_IP_COMPLETION_TOKEN;
125fb115c61504fe6c4f94be0a87f75e28e1684657ftye
126fb115c61504fe6c4f94be0a87f75e28e1684657ftyetypedef union {
127fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP4_TRANSMIT_DATA     Ip4TxData;
128fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP6_TRANSMIT_DATA     Ip6TxData;
129fb115c61504fe6c4f94be0a87f75e28e1684657ftye} IP_IO_IP_TX_DATA;
130fb115c61504fe6c4f94be0a87f75e28e1684657ftye
131fb115c61504fe6c4f94be0a87f75e28e1684657ftyetypedef union {
132fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP4_RECEIVE_DATA      Ip4RxData;
133fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP6_RECEIVE_DATA      Ip6RxData;
134fb115c61504fe6c4f94be0a87f75e28e1684657ftye} IP_IO_IP_RX_DATA;
135fb115c61504fe6c4f94be0a87f75e28e1684657ftye
136fb115c61504fe6c4f94be0a87f75e28e1684657ftyetypedef union {
137fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP4_OVERRIDE_DATA     Ip4OverrideData;
138fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP6_OVERRIDE_DATA     Ip6OverrideData;
139fb115c61504fe6c4f94be0a87f75e28e1684657ftye} IP_IO_OVERRIDE;
140fb115c61504fe6c4f94be0a87f75e28e1684657ftye
141fb115c61504fe6c4f94be0a87f75e28e1684657ftyetypedef union {
142fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP4_CONFIG_DATA       Ip4CfgData;
143fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP6_CONFIG_DATA       Ip6CfgData;
144fb115c61504fe6c4f94be0a87f75e28e1684657ftye} IP_IO_IP_CONFIG_DATA;
145fb115c61504fe6c4f94be0a87f75e28e1684657ftye
146b45b45b2d248892930620c33a9d01d8457ae0e54tyetypedef union {
147b45b45b2d248892930620c33a9d01d8457ae0e54tye  EFI_IP4_HEADER            *Ip4Hdr;
148b45b45b2d248892930620c33a9d01d8457ae0e54tye  EFI_IP6_HEADER            *Ip6Hdr;
149b45b45b2d248892930620c33a9d01d8457ae0e54tye} IP_IO_IP_HEADER;
150b45b45b2d248892930620c33a9d01d8457ae0e54tye
151b45b45b2d248892930620c33a9d01d8457ae0e54tyetypedef union {
152b45b45b2d248892930620c33a9d01d8457ae0e54tye  IP4_ADDR                  SubnetMask;
153b45b45b2d248892930620c33a9d01d8457ae0e54tye  UINT8                     PrefixLength;
154b45b45b2d248892930620c33a9d01d8457ae0e54tye} IP_IO_IP_MASK;
155b45b45b2d248892930620c33a9d01d8457ae0e54tye
1562a2e33b20feb245572416333bf26eb8a77e73aa9qianouyangtypedef union {
1572a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  EFI_IP4_PROTOCOL  *Ip4;
1582a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  EFI_IP6_PROTOCOL  *Ip6;
1592a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang} IP_IO_IP_PROTOCOL;
1602a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang
161e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
162e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// The IP session for an IP receive packet.
163e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
16497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangtypedef struct _EFI_NET_SESSION_DATA {
16564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  EFI_IP_ADDRESS        Source;     ///< Source IP of the received packet.
16664a80549c8ab874c5b23b376adbb99008e6143b0myronporter  EFI_IP_ADDRESS        Dest;       ///< Destination IP of the received packet.
16764a80549c8ab874c5b23b376adbb99008e6143b0myronporter  IP_IO_IP_HEADER       IpHdr;      ///< IP header of the received packet.
168a09ee46d9a258ef08a931c0d412c62c98dbdb8aaqouyang  UINT32                IpHdrLen;   ///< IP header length of the received packet.
169a09ee46d9a258ef08a931c0d412c62c98dbdb8aaqouyang                                    ///< For IPv6, it includes the IP6 header
170a09ee46d9a258ef08a931c0d412c62c98dbdb8aaqouyang                                    ///< length and extension header length. For
171a09ee46d9a258ef08a931c0d412c62c98dbdb8aaqouyang                                    ///< IPv4, it includes the IP4 header length
172a09ee46d9a258ef08a931c0d412c62c98dbdb8aaqouyang                                    ///< and options length.
17364a80549c8ab874c5b23b376adbb99008e6143b0myronporter  UINT8                 IpVersion;  ///< The IP version of the received packet.
17497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang} EFI_NET_SESSION_DATA;
17597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
176e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/**
177e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  The prototype is called back when an IP packet is received.
178e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
17964a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in] Status        The result of the receive request.
18064a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in] IcmpErr       Valid when Status is EFI_ICMP_ERROR.
18164a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in] NetSession    The IP session for the received packet.
18264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in] Pkt           The packet received.
183e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  @param[in] Context       The data provided by the user for the received packet when
184cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                           the callback is registered in IP_IO_OPEN_DATA::RcvdContext.
185e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
186e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong**/
18797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangtypedef
18897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangVOID
189e798cd87ca9a3a30c4cea50c5f5de84e10a8bc5ageekboy(EFIAPI *PKT_RCVD_NOTIFY) (
190e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  IN EFI_STATUS           Status,
191b45b45b2d248892930620c33a9d01d8457ae0e54tye  IN UINT8                IcmpErr,
192e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  IN EFI_NET_SESSION_DATA *NetSession,
193e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  IN NET_BUF              *Pkt,
194e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  IN VOID                 *Context
19597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
19697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
197e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/**
198e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  The prototype is called back when an IP packet is sent.
199e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
20064a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in] Status        Result of the IP packet being sent.
201cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @param[in] Context       The data provided by user for the received packet when
202cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                           the callback is registered in IP_IO_OPEN_DATA::SndContext.
2032a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  @param[in] Sender        A Union type to specify a pointer of EFI_IP4_PROTOCOL
2042a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang                           or EFI_IP6_PROTOCOL.
20564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in] NotifyData    The Context data specified when calling IpIoSend()
206e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
207e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong**/
20897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangtypedef
20997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangVOID
210e798cd87ca9a3a30c4cea50c5f5de84e10a8bc5ageekboy(EFIAPI *PKT_SENT_NOTIFY) (
2112a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  IN EFI_STATUS        Status,
2122a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  IN VOID              *Context,
2132a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  IN IP_IO_IP_PROTOCOL Sender,
2142a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  IN VOID              *NotifyData
21597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
21697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
217e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
218fb115c61504fe6c4f94be0a87f75e28e1684657ftye/// This data structure wraps Ip4/Ip6 instances. The IpIo Library uses it for all
219fb115c61504fe6c4f94be0a87f75e28e1684657ftye/// Ip4/Ip6 operations.
220e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
22197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangtypedef struct _IP_IO {
222e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
223e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  /// The node used to link this IpIo to the active IpIo list.
224e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
22597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  LIST_ENTRY                    Entry;
22697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
227e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
228e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  /// The list used to maintain the IP instance for different sending purpose.
229e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
23097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  LIST_ENTRY                    IpList;
231e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
23297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  EFI_HANDLE                    Controller;
23397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  EFI_HANDLE                    Image;
23497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  EFI_HANDLE                    ChildHandle;
235e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  //
236e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  // The IP instance consumed by this IP_IO
237e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  //
2382a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  IP_IO_IP_PROTOCOL             Ip;
23997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  BOOLEAN                       IsConfigured;
24097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
241e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
24264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  /// Some ip configuration data can be changed.
243e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
24497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  UINT8                         Protocol;
24597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
246e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
24764a80549c8ab874c5b23b376adbb99008e6143b0myronporter  /// Token and event used to get data from IP.
248e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
249fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IP_IO_IP_COMPLETION_TOKEN     RcvToken;
25097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
251e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
25264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  /// List entry used to link the token passed to IP_IO.
253e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  ///
25497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  LIST_ENTRY                    PendingSndList;
25597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
25697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  //
25797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  // User interface used to get notify from IP_IO
25897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  //
25964a80549c8ab874c5b23b376adbb99008e6143b0myronporter  VOID                          *RcvdContext;    ///< See IP_IO_OPEN_DATA::RcvdContext.
26064a80549c8ab874c5b23b376adbb99008e6143b0myronporter  VOID                          *SndContext;     ///< See IP_IO_OPEN_DATA::SndContext.
26164a80549c8ab874c5b23b376adbb99008e6143b0myronporter  PKT_RCVD_NOTIFY               PktRcvdNotify;   ///< See IP_IO_OPEN_DATA::PktRcvdNotify.
26264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  PKT_SENT_NOTIFY               PktSentNotify;   ///< See IP_IO_OPEN_DATA::PktSentNotify.
263b45b45b2d248892930620c33a9d01d8457ae0e54tye  UINT8                         IpVersion;
26497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang} IP_IO;
26597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
266e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
267e9b67286ad4428d63e2495f38b71273b81e0846fpkandel/// The struct is for the user to pass IP configuration and callbacks to IP_IO.
268e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// It is used by IpIoOpen().
269e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
27097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangtypedef struct _IP_IO_OPEN_DATA {
27164a80549c8ab874c5b23b376adbb99008e6143b0myronporter  IP_IO_IP_CONFIG_DATA IpConfigData;    ///< Configuration of the IP instance.
27264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  VOID                 *RcvdContext;    ///< Context data used by receive callback.
27364a80549c8ab874c5b23b376adbb99008e6143b0myronporter  VOID                 *SndContext;     ///< Context data used by send callback.
27464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  PKT_RCVD_NOTIFY      PktRcvdNotify;   ///< Receive callback.
27564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  PKT_SENT_NOTIFY      PktSentNotify;   ///< Send callback.
27697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang} IP_IO_OPEN_DATA;
27797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
278e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
279e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// Internal struct book-keeping send request of IP_IO.
280e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
281e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// An IP_IO_SEND_ENTRY will be created each time a send request is issued to
282e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// IP_IO via IpIoSend().
283e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
28497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangtypedef struct _IP_IO_SEND_ENTRY {
28597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  LIST_ENTRY                Entry;
28697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  IP_IO                     *IpIo;
28797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  VOID                      *Context;
28897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  VOID                      *NotifyData;
2892a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  IP_IO_IP_PROTOCOL         Ip;
29097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  NET_BUF                   *Pkt;
291fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IP_IO_IP_COMPLETION_TOKEN SndToken;
29297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang} IP_IO_SEND_ENTRY;
29397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
294e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
295e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// The IP_IO_IP_INFO is used in IpIoSend() to override the default IP instance
296e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong/// in IP_IO.
297e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong///
29897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangtypedef struct _IP_IO_IP_INFO {
299fb115c61504fe6c4f94be0a87f75e28e1684657ftye  EFI_IP_ADDRESS            Addr;
300b45b45b2d248892930620c33a9d01d8457ae0e54tye  IP_IO_IP_MASK             PreMask;
30197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  LIST_ENTRY                Entry;
30297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  EFI_HANDLE                ChildHandle;
3032a2e33b20feb245572416333bf26eb8a77e73aa9qianouyang  IP_IO_IP_PROTOCOL         Ip;
304fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IP_IO_IP_COMPLETION_TOKEN DummyRcvToken;
30597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  INTN                      RefCnt;
306b45b45b2d248892930620c33a9d01d8457ae0e54tye  UINT8                     IpVersion;
30797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang} IP_IO_IP_INFO;
30897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
30997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
31097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Create a new IP_IO instance.
311e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
312fb115c61504fe6c4f94be0a87f75e28e1684657ftye  This function uses IP4/IP6 service binding protocol in Controller to create
313fb115c61504fe6c4f94be0a87f75e28e1684657ftye  an IP4/IP6 child (aka IP4/IP6 instance).
31497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
315cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @param[in]  Image             The image handle of the driver or application that
316e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong                                consumes IP_IO.
317fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @param[in]  Controller        The controller handle that has IP4 or IP6 service
318fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                binding protocol installed.
319fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @param[in]  IpVersion         The version of the IP protocol to use, either
320fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                IPv4 or IPv6.
32197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
32264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @return The pointer to a newly created IP_IO instance, or NULL if failed.
32397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
32497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
32597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIP_IO *
32697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
32797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoCreate (
32897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  IN EFI_HANDLE Image,
329fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN EFI_HANDLE Controller,
330b45b45b2d248892930620c33a9d01d8457ae0e54tye  IN UINT8      IpVersion
33197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
33297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
33397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
33497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Destroy an IP_IO instance.
335e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
336e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  This function is paired with IpIoCreate(). The IP_IO will be closed first.
337e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  Resource will be freed afterwards. See IpIoClose().
33897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
33964a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  IpIo         The pointer to the IP_IO instance that needs to be
340e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong                                destroyed.
34197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
34264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          EFI_SUCCESS  The IP_IO instance was destroyed successfully.
34364a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          Others       An error condition occurred.
34497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
34597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
34697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFI_STATUS
34797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
34897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoDestroy (
349cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN OUT IP_IO *IpIo
35097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
35197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
35297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
35397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Stop an IP_IO instance.
354e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
355e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  This function is paired with IpIoOpen(). The IP_IO will be unconfigured, and all
356e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  pending send/receive tokens will be canceled.
35797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
35864a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  IpIo            The pointer to the IP_IO instance that needs to stop.
35997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
360cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @retval          EFI_SUCCESS     The IP_IO instance stopped successfully.
36164a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          Others          Anrror condition occurred.
36297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
36397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
36497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFI_STATUS
36597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
36697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoStop (
367cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN OUT IP_IO *IpIo
36897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
36997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
37097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
37197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Open an IP_IO instance for use.
372e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
373e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  This function is called after IpIoCreate(). It is used for configuring the IP
374e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  instance and register the callbacks and their context data for sending and
375e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  receiving IP packets.
37697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
37764a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  IpIo               The pointer to an IP_IO instance that needs
378cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                                      to open.
379cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @param[in]       OpenData           The configuration data and callbacks for
380cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                                      the IP_IO instance.
38197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
382cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @retval          EFI_SUCCESS        The IP_IO instance opened with OpenData
383cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                                      successfully.
38464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          EFI_ACCESS_DENIED  The IP_IO instance is configured; avoid
38564a80549c8ab874c5b23b376adbb99008e6143b0myronporter                                      reopening it.
38664a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          Others             An error condition occurred.
38797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
38897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
38997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFI_STATUS
390e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgongEFIAPI
39197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoOpen (
392cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN OUT IP_IO           *IpIo,
393cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN     IP_IO_OPEN_DATA *OpenData
39497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
39597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
39697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
39797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Send out an IP packet.
398e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
399e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  This function is called after IpIoOpen(). The data to be sent are wrapped in
400e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  Pkt. The IP instance wrapped in IpIo is used for sending by default, but can be
401e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  overriden by Sender. Other sending configurations, such as source address and gateway
402e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  address, are specified in OverrideData.
40397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
40464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  IpIo                  The pointer to an IP_IO instance used for sending IP
405cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                                         packet.
40664a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  Pkt                   The pointer to the IP packet to be sent.
407e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  @param[in]       Sender                Optional. The IP protocol instance used for sending.
40864a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]       Context               The optional context data.
40964a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]       NotifyData            The optional notify data.
410cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @param[in]       Dest                  The destination IP address to send this packet to.
411cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @param[in]       OverrideData          The data to override some configuration of the IP
412cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                                         instance used for sending.
41397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
41464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          EFI_SUCCESS           The operation completed successfully.
415cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @retval          EFI_NOT_STARTED       The IpIo is not configured.
41664a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          EFI_OUT_OF_RESOURCES  Failed due to resource limitations.
41797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
41897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
41997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFI_STATUS
42097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
42197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoSend (
422cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN OUT IP_IO          *IpIo,
423cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN OUT NET_BUF        *Pkt,
424cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN     IP_IO_IP_INFO  *Sender        OPTIONAL,
425cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN     VOID           *Context       OPTIONAL,
426cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN     VOID           *NotifyData    OPTIONAL,
427fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN     EFI_IP_ADDRESS *Dest,
428cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN     IP_IO_OVERRIDE *OverrideData  OPTIONAL
42997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
43097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
43197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
43264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  Cancel the IP transmit token that wraps this Packet.
43397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
43464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]  IpIo                  The pointer to the IP_IO instance.
43564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]  Packet                The pointer to the packet of NET_BUF to cancel.
43697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
43797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
43897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangVOID
43997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
44097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoCancelTxToken (
44197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  IN IP_IO  *IpIo,
44297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  IN VOID   *Packet
44397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
44497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
44597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
44697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Add a new IP instance for sending data.
447e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
448e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  The function is used to add the IP_IO to the IP_IO sending list. The caller
449e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  can later use IpIoFindSender() to get the IP_IO and call IpIoSend() to send
450e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  data.
45197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
45264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  IpIo               The pointer to an IP_IO instance to add a new IP
453e9b67286ad4428d63e2495f38b71273b81e0846fpkandel                                      instance for sending purposes.
45497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
45564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @return The pointer to the created IP_IO_IP_INFO structure; NULL if failed.
45697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
45797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
45897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIP_IO_IP_INFO *
45997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
46097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoAddIp (
461cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN OUT IP_IO  *IpIo
46297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
46397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
46497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
465fb115c61504fe6c4f94be0a87f75e28e1684657ftye  Configure the IP instance of this IpInfo and start the receiving if IpConfigData
46697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  is not NULL.
46797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
46864a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  IpInfo          The pointer to the IP_IO_IP_INFO instance.
469fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @param[in, out]  IpConfigData    The IP4 or IP6 configure data used to configure
470fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                   the IP instance. If NULL, the IP instance is reset.
471fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                   If UseDefaultAddress is set to TRUE, and the configure
472cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu                                   operation succeeds, the default address information
473fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                   is written back in this IpConfigData.
47497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
47564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          EFI_SUCCESS     The IP instance of this IpInfo was configured successfully,
476e9b67286ad4428d63e2495f38b71273b81e0846fpkandel                                   or there is no need to reconfigure it.
47764a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval          Others          The configuration failed.
47897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
47997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
48097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFI_STATUS
48197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
48297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoConfigIp (
483cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  IN OUT IP_IO_IP_INFO        *IpInfo,
484fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN OUT VOID                 *IpConfigData OPTIONAL
48597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
48697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
48797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
48897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Destroy an IP instance maintained in IpIo->IpList for
48997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  sending purpose.
490e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
491e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  This function pairs with IpIoAddIp(). The IpInfo is previously created by
492e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  IpIoAddIp(). The IP_IO_IP_INFO::RefCnt is decremented and the IP instance
493e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  will be dstroyed if the RefCnt is zero.
49497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
49564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]  IpIo                  The pointer to the IP_IO instance.
49664a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]  IpInfo                The pointer to the IpInfo to be removed.
49797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
49897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
49997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangVOID
50097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
50197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoRemoveIp (
50297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  IN IP_IO            *IpIo,
50397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  IN IP_IO_IP_INFO    *IpInfo
50497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
50597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
50697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
50797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  Find the first IP protocol maintained in IpIo whose local
508e9b67286ad4428d63e2495f38b71273b81e0846fpkandel  address is the same as Src.
509e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
510e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  This function is called when the caller needs the IpIo to send data to the
511e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  specified Src. The IpIo was added previously by IpIoAddIp().
51297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
51364a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in, out]  IpIo              The pointer to the pointer of the IP_IO instance.
514fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @param[in]       IpVersion         The version of the IP protocol to use, either
515fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                     IPv4 or IPv6.
516cdfdbb970a8b7311391a28e046f39d4cc3b7d610ywu  @param[in]       Src               The local IP address.
51797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
51864a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @return The pointer to the IP protocol can be used for sending purpose and its local
519e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong          address is the same with Src.
52097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
52197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
52297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIP_IO_IP_INFO *
52397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
52497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoFindSender (
525fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN OUT IP_IO           **IpIo,
526b45b45b2d248892930620c33a9d01d8457ae0e54tye  IN     UINT8           IpVersion,
527fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN     EFI_IP_ADDRESS  *Src
52897b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
52997b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
53097b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang/**
531e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  Get the ICMP error map information.
532e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong
533e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  The ErrorStatus will be returned. The IsHard and Notify are optional. If they
534e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  are not NULL, this routine will fill them.
53597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
5363a1ab4bc2c322e835faca717ed4b0dc17536cfd7ywu  @param[in]   IcmpError             IcmpError Type.
537fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @param[in]   IpVersion             The version of the IP protocol to use,
5383b1464d5ac4e8b917c54b9f29a43ad972d2a2c85rsun                                     either IPv4 or IPv6.
5393b1464d5ac4e8b917c54b9f29a43ad972d2a2c85rsun  @param[out]  IsHard                If TRUE, indicates that it is a hard error.
5403b1464d5ac4e8b917c54b9f29a43ad972d2a2c85rsun  @param[out]  Notify                If TRUE, SockError needs to be notified.
54197b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
54264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @return The ICMP Error Status, such as EFI_NETWORK_UNREACHABLE.
54397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
54497b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang**/
54597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFI_STATUS
54697b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangEFIAPI
54797b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuangIpIoGetIcmpErrStatus (
548b45b45b2d248892930620c33a9d01d8457ae0e54tye  IN  UINT8       IcmpError,
549b45b45b2d248892930620c33a9d01d8457ae0e54tye  IN  UINT8       IpVersion,
550e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  OUT BOOLEAN     *IsHard  OPTIONAL,
551e29a2e7e8003e824d77a68f980daf0d614fc3bf5jgong  OUT BOOLEAN     *Notify  OPTIONAL
55297b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang  );
55397b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang
554fb115c61504fe6c4f94be0a87f75e28e1684657ftye/**
555fb115c61504fe6c4f94be0a87f75e28e1684657ftye  Refresh the remote peer's Neighbor Cache entries.
556fb115c61504fe6c4f94be0a87f75e28e1684657ftye
557fb115c61504fe6c4f94be0a87f75e28e1684657ftye  This function is called when the caller needs the IpIo to refresh the existing
558fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IPv6 neighbor cache entries since the neighbor is considered reachable by the
559fb115c61504fe6c4f94be0a87f75e28e1684657ftye  node has recently received a confirmation that packets sent recently to the
560fb115c61504fe6c4f94be0a87f75e28e1684657ftye  neighbor were received by its IP layer.
561fb115c61504fe6c4f94be0a87f75e28e1684657ftye
56264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]   IpIo                  The pointer to an IP_IO instance
563fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @param[in]   Neighbor              The IP address of the neighbor
56464a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @param[in]   Timeout               The time in 100-ns units that this entry will
565fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                     remain in the neighbor cache. A value of
566fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                     zero means that the entry is permanent.
567fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                     A value of non-zero means that the entry is
568fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                     dynamic and will be deleted after Timeout.
569fb115c61504fe6c4f94be0a87f75e28e1684657ftye
57064a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval      EFI_SUCCESS           The operation completed successfully.
571fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @retval      EFI_NOT_STARTED       The IpIo is not configured.
57264a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval      EFI_INVALID_PARAMETER The Neighbor Address is invalid.
573fb115c61504fe6c4f94be0a87f75e28e1684657ftye  @retval      EFI_NOT_FOUND         The neighbor cache entry is not in the
574fb115c61504fe6c4f94be0a87f75e28e1684657ftye                                     neighbor table.
57564a80549c8ab874c5b23b376adbb99008e6143b0myronporter  @retval      EFI_OUT_OF_RESOURCES  Failed due to resource limitations.
576fb115c61504fe6c4f94be0a87f75e28e1684657ftye
577fb115c61504fe6c4f94be0a87f75e28e1684657ftye**/
578fb115c61504fe6c4f94be0a87f75e28e1684657ftyeEFI_STATUS
579fb115c61504fe6c4f94be0a87f75e28e1684657ftyeIpIoRefreshNeighbor (
580fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN IP_IO           *IpIo,
581fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN EFI_IP_ADDRESS  *Neighbor,
582fb115c61504fe6c4f94be0a87f75e28e1684657ftye  IN UINT32          Timeout
583fb115c61504fe6c4f94be0a87f75e28e1684657ftye  );
584fb115c61504fe6c4f94be0a87f75e28e1684657ftye
58597b38d4e359e1c5cbdadb2af8d4665d76a7068f2qhuang#endif
586fb115c61504fe6c4f94be0a87f75e28e1684657ftye
587