Vishal Bhoj | 82c8071 | 2015-12-15 21:13:33 +0530 | [diff] [blame^] | 1 | /** @file
|
| 2 | This library is only intended to be used by UEFI network stack modules.
|
| 3 | It provides basic functions for the UEFI network stack.
|
| 4 |
|
| 5 | Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
|
| 6 | This program and the accompanying materials
|
| 7 | are licensed and made available under the terms and conditions of the BSD License
|
| 8 | which accompanies this distribution. The full text of the license may be found at<BR>
|
| 9 | http://opensource.org/licenses/bsd-license.php
|
| 10 |
|
| 11 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| 12 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
| 13 |
|
| 14 | **/
|
| 15 |
|
| 16 | #ifndef _NET_LIB_H_
|
| 17 | #define _NET_LIB_H_
|
| 18 |
|
| 19 | #include <Protocol/Ip6.h>
|
| 20 |
|
| 21 | #include <Library/BaseLib.h>
|
| 22 | #include <Library/BaseMemoryLib.h>
|
| 23 |
|
| 24 | typedef UINT32 IP4_ADDR;
|
| 25 | typedef UINT32 TCP_SEQNO;
|
| 26 | typedef UINT16 TCP_PORTNO;
|
| 27 |
|
| 28 |
|
| 29 | #define NET_ETHER_ADDR_LEN 6
|
| 30 | #define NET_IFTYPE_ETHERNET 0x01
|
| 31 |
|
| 32 | #define NET_VLAN_TAG_LEN 4
|
| 33 | #define ETHER_TYPE_VLAN 0x8100
|
| 34 |
|
| 35 | #define EFI_IP_PROTO_UDP 0x11
|
| 36 | #define EFI_IP_PROTO_TCP 0x06
|
| 37 | #define EFI_IP_PROTO_ICMP 0x01
|
| 38 | #define IP4_PROTO_IGMP 0x02
|
| 39 | #define IP6_ICMP 58
|
| 40 |
|
| 41 | //
|
| 42 | // The address classification
|
| 43 | //
|
| 44 | #define IP4_ADDR_CLASSA 1
|
| 45 | #define IP4_ADDR_CLASSB 2
|
| 46 | #define IP4_ADDR_CLASSC 3
|
| 47 | #define IP4_ADDR_CLASSD 4
|
| 48 | #define IP4_ADDR_CLASSE 5
|
| 49 |
|
| 50 | #define IP4_MASK_NUM 33
|
| 51 | #define IP6_PREFIX_NUM 129
|
| 52 |
|
| 53 | #define IP6_HOP_BY_HOP 0
|
| 54 | #define IP6_DESTINATION 60
|
| 55 | #define IP6_ROUTING 43
|
| 56 | #define IP6_FRAGMENT 44
|
| 57 | #define IP6_AH 51
|
| 58 | #define IP6_ESP 50
|
| 59 | #define IP6_NO_NEXT_HEADER 59
|
| 60 |
|
| 61 | #define IP_VERSION_4 4
|
| 62 | #define IP_VERSION_6 6
|
| 63 |
|
| 64 | #define IP6_PREFIX_LENGTH 64
|
| 65 |
|
| 66 | #pragma pack(1)
|
| 67 |
|
| 68 | //
|
| 69 | // Ethernet head definition
|
| 70 | //
|
| 71 | typedef struct {
|
| 72 | UINT8 DstMac [NET_ETHER_ADDR_LEN];
|
| 73 | UINT8 SrcMac [NET_ETHER_ADDR_LEN];
|
| 74 | UINT16 EtherType;
|
| 75 | } ETHER_HEAD;
|
| 76 |
|
| 77 | //
|
| 78 | // 802.1Q VLAN Tag Control Information
|
| 79 | //
|
| 80 | typedef union {
|
| 81 | struct {
|
| 82 | UINT16 Vid : 12; // Unique VLAN identifier (0 to 4094)
|
| 83 | UINT16 Cfi : 1; // Canonical Format Indicator
|
| 84 | UINT16 Priority : 3; // 802.1Q priority level (0 to 7)
|
| 85 | } Bits;
|
| 86 | UINT16 Uint16;
|
| 87 | } VLAN_TCI;
|
| 88 |
|
| 89 | #define VLAN_TCI_CFI_CANONICAL_MAC 0
|
| 90 | #define VLAN_TCI_CFI_NON_CANONICAL_MAC 1
|
| 91 |
|
| 92 | //
|
| 93 | // The EFI_IP4_HEADER is hard to use because the source and
|
| 94 | // destination address are defined as EFI_IPv4_ADDRESS, which
|
| 95 | // is a structure. Two structures can't be compared or masked
|
| 96 | // directly. This is why there is an internal representation.
|
| 97 | //
|
| 98 | typedef struct {
|
| 99 | UINT8 HeadLen : 4;
|
| 100 | UINT8 Ver : 4;
|
| 101 | UINT8 Tos;
|
| 102 | UINT16 TotalLen;
|
| 103 | UINT16 Id;
|
| 104 | UINT16 Fragment;
|
| 105 | UINT8 Ttl;
|
| 106 | UINT8 Protocol;
|
| 107 | UINT16 Checksum;
|
| 108 | IP4_ADDR Src;
|
| 109 | IP4_ADDR Dst;
|
| 110 | } IP4_HEAD;
|
| 111 |
|
| 112 |
|
| 113 | //
|
| 114 | // ICMP head definition. Each ICMP message is categorized as either an error
|
| 115 | // message or query message. Two message types have their own head format.
|
| 116 | //
|
| 117 | typedef struct {
|
| 118 | UINT8 Type;
|
| 119 | UINT8 Code;
|
| 120 | UINT16 Checksum;
|
| 121 | } IP4_ICMP_HEAD;
|
| 122 |
|
| 123 | typedef struct {
|
| 124 | IP4_ICMP_HEAD Head;
|
| 125 | UINT32 Fourth; // 4th filed of the head, it depends on Type.
|
| 126 | IP4_HEAD IpHead;
|
| 127 | } IP4_ICMP_ERROR_HEAD;
|
| 128 |
|
| 129 | typedef struct {
|
| 130 | IP4_ICMP_HEAD Head;
|
| 131 | UINT16 Id;
|
| 132 | UINT16 Seq;
|
| 133 | } IP4_ICMP_QUERY_HEAD;
|
| 134 |
|
| 135 | typedef struct {
|
| 136 | UINT8 Type;
|
| 137 | UINT8 Code;
|
| 138 | UINT16 Checksum;
|
| 139 | } IP6_ICMP_HEAD;
|
| 140 |
|
| 141 | typedef struct {
|
| 142 | IP6_ICMP_HEAD Head;
|
| 143 | UINT32 Fourth;
|
| 144 | EFI_IP6_HEADER IpHead;
|
| 145 | } IP6_ICMP_ERROR_HEAD;
|
| 146 |
|
| 147 | typedef struct {
|
| 148 | IP6_ICMP_HEAD Head;
|
| 149 | UINT32 Fourth;
|
| 150 | } IP6_ICMP_INFORMATION_HEAD;
|
| 151 |
|
| 152 | //
|
| 153 | // UDP header definition
|
| 154 | //
|
| 155 | typedef struct {
|
| 156 | UINT16 SrcPort;
|
| 157 | UINT16 DstPort;
|
| 158 | UINT16 Length;
|
| 159 | UINT16 Checksum;
|
| 160 | } EFI_UDP_HEADER;
|
| 161 |
|
| 162 | //
|
| 163 | // TCP header definition
|
| 164 | //
|
| 165 | typedef struct {
|
| 166 | TCP_PORTNO SrcPort;
|
| 167 | TCP_PORTNO DstPort;
|
| 168 | TCP_SEQNO Seq;
|
| 169 | TCP_SEQNO Ack;
|
| 170 | UINT8 Res : 4;
|
| 171 | UINT8 HeadLen : 4;
|
| 172 | UINT8 Flag;
|
| 173 | UINT16 Wnd;
|
| 174 | UINT16 Checksum;
|
| 175 | UINT16 Urg;
|
| 176 | } TCP_HEAD;
|
| 177 |
|
| 178 | #pragma pack()
|
| 179 |
|
| 180 | #define NET_MAC_EQUAL(pMac1, pMac2, Len) \
|
| 181 | (CompareMem ((pMac1), (pMac2), Len) == 0)
|
| 182 |
|
| 183 | #define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
|
| 184 | (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
|
| 185 |
|
| 186 | #define NTOHL(x) SwapBytes32 (x)
|
| 187 |
|
| 188 | #define HTONL(x) NTOHL(x)
|
| 189 |
|
| 190 | #define NTOHS(x) SwapBytes16 (x)
|
| 191 |
|
| 192 | #define HTONS(x) NTOHS(x)
|
| 193 | #define NTOHLL(x) SwapBytes64 (x)
|
| 194 | #define HTONLL(x) NTOHLL(x)
|
| 195 | #define NTOHLLL(x) Ip6Swap128 (x)
|
| 196 | #define HTONLLL(x) NTOHLLL(x)
|
| 197 |
|
| 198 | //
|
| 199 | // Test the IP's attribute, All the IPs are in host byte order.
|
| 200 | //
|
| 201 | #define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)
|
| 202 | #define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)
|
| 203 | #define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
|
| 204 | #define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != IP4_MASK_NUM)
|
| 205 |
|
| 206 | #define IP6_IS_MULTICAST(Ip6) (((Ip6)->Addr[0]) == 0xFF)
|
| 207 |
|
| 208 | //
|
| 209 | // Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.
|
| 210 | //
|
| 211 | #define EFI_IP4(EfiIpAddr) (*(IP4_ADDR *) ((EfiIpAddr).Addr))
|
| 212 | #define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))
|
| 213 | #define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
|
| 214 |
|
| 215 | #define EFI_IP6_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv6_ADDRESS)) == 0)
|
| 216 |
|
| 217 | #define IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS)))
|
| 218 | #define IP6_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv6_ADDRESS)))
|
| 219 | #define IP6_COPY_LINK_ADDRESS(Mac1, Mac2) (CopyMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)))
|
| 220 |
|
| 221 | //
|
| 222 | // The debug level definition. This value is also used as the
|
| 223 | // syslog's servity level. Don't change it.
|
| 224 | //
|
| 225 | #define NETDEBUG_LEVEL_TRACE 5
|
| 226 | #define NETDEBUG_LEVEL_WARNING 4
|
| 227 | #define NETDEBUG_LEVEL_ERROR 3
|
| 228 |
|
| 229 | //
|
| 230 | // Network debug message is sent out as syslog packet.
|
| 231 | //
|
| 232 | #define NET_SYSLOG_FACILITY 16 // Syslog local facility local use
|
| 233 | #define NET_SYSLOG_PACKET_LEN 512
|
| 234 | #define NET_SYSLOG_TX_TIMEOUT (500 * 1000 * 10) // 500ms
|
| 235 | #define NET_DEBUG_MSG_LEN 470 // 512 - (ether+ip4+udp4 head length)
|
| 236 |
|
| 237 | //
|
| 238 | // The debug output expects the ASCII format string, Use %a to print ASCII
|
| 239 | // string, and %s to print UNICODE string. PrintArg must be enclosed in ().
|
| 240 | // For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));
|
| 241 | //
|
| 242 | #define NET_DEBUG_TRACE(Module, PrintArg) \
|
| 243 | NetDebugOutput ( \
|
| 244 | NETDEBUG_LEVEL_TRACE, \
|
| 245 | Module, \
|
| 246 | __FILE__, \
|
| 247 | __LINE__, \
|
| 248 | NetDebugASPrint PrintArg \
|
| 249 | )
|
| 250 |
|
| 251 | #define NET_DEBUG_WARNING(Module, PrintArg) \
|
| 252 | NetDebugOutput ( \
|
| 253 | NETDEBUG_LEVEL_WARNING, \
|
| 254 | Module, \
|
| 255 | __FILE__, \
|
| 256 | __LINE__, \
|
| 257 | NetDebugASPrint PrintArg \
|
| 258 | )
|
| 259 |
|
| 260 | #define NET_DEBUG_ERROR(Module, PrintArg) \
|
| 261 | NetDebugOutput ( \
|
| 262 | NETDEBUG_LEVEL_ERROR, \
|
| 263 | Module, \
|
| 264 | __FILE__, \
|
| 265 | __LINE__, \
|
| 266 | NetDebugASPrint PrintArg \
|
| 267 | )
|
| 268 |
|
| 269 | /**
|
| 270 | Allocate a buffer, then format the message to it. This is a
|
| 271 | help function for the NET_DEBUG_XXX macros. The PrintArg of
|
| 272 | these macros treats the variable length print parameters as a
|
| 273 | single parameter, and pass it to the NetDebugASPrint. For
|
| 274 | example, NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name))
|
| 275 | if extracted to:
|
| 276 |
|
| 277 | NetDebugOutput (
|
| 278 | NETDEBUG_LEVEL_TRACE,
|
| 279 | "Tcp",
|
| 280 | __FILE__,
|
| 281 | __LINE__,
|
| 282 | NetDebugASPrint ("State transit to %a\n", Name)
|
| 283 | )
|
| 284 |
|
| 285 | @param Format The ASCII format string.
|
| 286 | @param ... The variable length parameter whose format is determined
|
| 287 | by the Format string.
|
| 288 |
|
| 289 | @return The buffer containing the formatted message,
|
| 290 | or NULL if memory allocation failed.
|
| 291 |
|
| 292 | **/
|
| 293 | CHAR8 *
|
| 294 | EFIAPI
|
| 295 | NetDebugASPrint (
|
| 296 | IN CHAR8 *Format,
|
| 297 | ...
|
| 298 | );
|
| 299 |
|
| 300 | /**
|
| 301 | Builds an UDP4 syslog packet and send it using SNP.
|
| 302 |
|
| 303 | This function will locate a instance of SNP then send the message through it.
|
| 304 | Because it isn't open the SNP BY_DRIVER, apply caution when using it.
|
| 305 |
|
| 306 | @param Level The servity level of the message.
|
| 307 | @param Module The Moudle that generates the log.
|
| 308 | @param File The file that contains the log.
|
| 309 | @param Line The exact line that contains the log.
|
| 310 | @param Message The user message to log.
|
| 311 |
|
| 312 | @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
|
| 313 | @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the packet
|
| 314 | @retval EFI_SUCCESS The log is discard because that it is more verbose
|
| 315 | than the mNetDebugLevelMax. Or, it has been sent out.
|
| 316 | **/
|
| 317 | EFI_STATUS
|
| 318 | EFIAPI
|
| 319 | NetDebugOutput (
|
| 320 | IN UINT32 Level,
|
| 321 | IN UINT8 *Module,
|
| 322 | IN UINT8 *File,
|
| 323 | IN UINT32 Line,
|
| 324 | IN UINT8 *Message
|
| 325 | );
|
| 326 |
|
| 327 |
|
| 328 | /**
|
| 329 | Return the length of the mask.
|
| 330 |
|
| 331 | Return the length of the mask. Valid values are 0 to 32.
|
| 332 | If the mask is invalid, return the invalid length 33, which is IP4_MASK_NUM.
|
| 333 | NetMask is in the host byte order.
|
| 334 |
|
| 335 | @param[in] NetMask The netmask to get the length from.
|
| 336 |
|
| 337 | @return The length of the netmask, or IP4_MASK_NUM (33) if the mask is invalid.
|
| 338 |
|
| 339 | **/
|
| 340 | INTN
|
| 341 | EFIAPI
|
| 342 | NetGetMaskLength (
|
| 343 | IN IP4_ADDR NetMask
|
| 344 | );
|
| 345 |
|
| 346 | /**
|
| 347 | Return the class of the IP address, such as class A, B, C.
|
| 348 | Addr is in host byte order.
|
| 349 |
|
| 350 | The address of class A starts with 0.
|
| 351 | If the address belong to class A, return IP4_ADDR_CLASSA.
|
| 352 | The address of class B starts with 10.
|
| 353 | If the address belong to class B, return IP4_ADDR_CLASSB.
|
| 354 | The address of class C starts with 110.
|
| 355 | If the address belong to class C, return IP4_ADDR_CLASSC.
|
| 356 | The address of class D starts with 1110.
|
| 357 | If the address belong to class D, return IP4_ADDR_CLASSD.
|
| 358 | The address of class E starts with 1111.
|
| 359 | If the address belong to class E, return IP4_ADDR_CLASSE.
|
| 360 |
|
| 361 |
|
| 362 | @param[in] Addr The address to get the class from.
|
| 363 |
|
| 364 | @return IP address class, such as IP4_ADDR_CLASSA.
|
| 365 |
|
| 366 | **/
|
| 367 | INTN
|
| 368 | EFIAPI
|
| 369 | NetGetIpClass (
|
| 370 | IN IP4_ADDR Addr
|
| 371 | );
|
| 372 |
|
| 373 | /**
|
| 374 | Check whether the IP is a valid unicast address according to
|
| 375 | the netmask. If NetMask is zero, use the IP address's class to get the default mask.
|
| 376 |
|
| 377 | If Ip is 0, IP is not a valid unicast address.
|
| 378 | Class D address is used for multicasting and class E address is reserved for future. If Ip
|
| 379 | belongs to class D or class E, Ip is not a valid unicast address.
|
| 380 | If all bits of the host address of Ip are 0 or 1, Ip is not a valid unicast address.
|
| 381 |
|
| 382 | @param[in] Ip The IP to check against.
|
| 383 | @param[in] NetMask The mask of the IP.
|
| 384 |
|
| 385 | @return TRUE if Ip is a valid unicast address on the network, otherwise FALSE.
|
| 386 |
|
| 387 | **/
|
| 388 | BOOLEAN
|
| 389 | EFIAPI
|
| 390 | NetIp4IsUnicast (
|
| 391 | IN IP4_ADDR Ip,
|
| 392 | IN IP4_ADDR NetMask
|
| 393 | );
|
| 394 |
|
| 395 | /**
|
| 396 | Check whether the incoming IPv6 address is a valid unicast address.
|
| 397 |
|
| 398 | If the address is a multicast address has binary 0xFF at the start, it is not
|
| 399 | a valid unicast address. If the address is unspecified ::, it is not a valid
|
| 400 | unicast address to be assigned to any node. If the address is loopback address
|
| 401 | ::1, it is also not a valid unicast address to be assigned to any physical
|
| 402 | interface.
|
| 403 |
|
| 404 | @param[in] Ip6 The IPv6 address to check against.
|
| 405 |
|
| 406 | @return TRUE if Ip6 is a valid unicast address on the network, otherwise FALSE.
|
| 407 |
|
| 408 | **/
|
| 409 | BOOLEAN
|
| 410 | EFIAPI
|
| 411 | NetIp6IsValidUnicast (
|
| 412 | IN EFI_IPv6_ADDRESS *Ip6
|
| 413 | );
|
| 414 |
|
| 415 |
|
| 416 | /**
|
| 417 | Check whether the incoming Ipv6 address is the unspecified address or not.
|
| 418 |
|
| 419 | @param[in] Ip6 - Ip6 address, in network order.
|
| 420 |
|
| 421 | @retval TRUE - Yes, incoming Ipv6 address is the unspecified address.
|
| 422 | @retval FALSE - The incoming Ipv6 address is not the unspecified address
|
| 423 |
|
| 424 | **/
|
| 425 | BOOLEAN
|
| 426 | EFIAPI
|
| 427 | NetIp6IsUnspecifiedAddr (
|
| 428 | IN EFI_IPv6_ADDRESS *Ip6
|
| 429 | );
|
| 430 |
|
| 431 | /**
|
| 432 | Check whether the incoming Ipv6 address is a link-local address.
|
| 433 |
|
| 434 | @param[in] Ip6 - Ip6 address, in network order.
|
| 435 |
|
| 436 | @retval TRUE - The incoming Ipv6 address is a link-local address.
|
| 437 | @retval FALSE - The incoming Ipv6 address is not a link-local address.
|
| 438 |
|
| 439 | **/
|
| 440 | BOOLEAN
|
| 441 | EFIAPI
|
| 442 | NetIp6IsLinkLocalAddr (
|
| 443 | IN EFI_IPv6_ADDRESS *Ip6
|
| 444 | );
|
| 445 |
|
| 446 | /**
|
| 447 | Check whether the Ipv6 address1 and address2 are on the connected network.
|
| 448 |
|
| 449 | @param[in] Ip1 - Ip6 address1, in network order.
|
| 450 | @param[in] Ip2 - Ip6 address2, in network order.
|
| 451 | @param[in] PrefixLength - The prefix length of the checking net.
|
| 452 |
|
| 453 | @retval TRUE - Yes, the Ipv6 address1 and address2 are connected.
|
| 454 | @retval FALSE - No the Ipv6 address1 and address2 are not connected.
|
| 455 |
|
| 456 | **/
|
| 457 | BOOLEAN
|
| 458 | EFIAPI
|
| 459 | NetIp6IsNetEqual (
|
| 460 | EFI_IPv6_ADDRESS *Ip1,
|
| 461 | EFI_IPv6_ADDRESS *Ip2,
|
| 462 | UINT8 PrefixLength
|
| 463 | );
|
| 464 |
|
| 465 | /**
|
| 466 | Switches the endianess of an IPv6 address.
|
| 467 |
|
| 468 | This function swaps the bytes in a 128-bit IPv6 address to switch the value
|
| 469 | from little endian to big endian or vice versa. The byte swapped value is
|
| 470 | returned.
|
| 471 |
|
| 472 | @param Ip6 Points to an IPv6 address.
|
| 473 |
|
| 474 | @return The byte swapped IPv6 address.
|
| 475 |
|
| 476 | **/
|
| 477 | EFI_IPv6_ADDRESS *
|
| 478 | EFIAPI
|
| 479 | Ip6Swap128 (
|
| 480 | EFI_IPv6_ADDRESS *Ip6
|
| 481 | );
|
| 482 |
|
| 483 | extern IP4_ADDR gIp4AllMasks[IP4_MASK_NUM];
|
| 484 |
|
| 485 |
|
| 486 | extern EFI_IPv4_ADDRESS mZeroIp4Addr;
|
| 487 |
|
| 488 | #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))
|
| 489 | #define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1)))
|
| 490 | #define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z'))
|
| 491 | #define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z'))
|
| 492 |
|
| 493 | #define TICKS_PER_MS 10000U
|
| 494 | #define TICKS_PER_SECOND 10000000U
|
| 495 |
|
| 496 | #define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
|
| 497 |
|
| 498 | /**
|
| 499 | Extract a UINT32 from a byte stream.
|
| 500 |
|
| 501 | This function copies a UINT32 from a byte stream, and then converts it from Network
|
| 502 | byte order to host byte order. Use this function to avoid alignment error.
|
| 503 |
|
| 504 | @param[in] Buf The buffer to extract the UINT32.
|
| 505 |
|
| 506 | @return The UINT32 extracted.
|
| 507 |
|
| 508 | **/
|
| 509 | UINT32
|
| 510 | EFIAPI
|
| 511 | NetGetUint32 (
|
| 512 | IN UINT8 *Buf
|
| 513 | );
|
| 514 |
|
| 515 | /**
|
| 516 | Puts a UINT32 into the byte stream in network byte order.
|
| 517 |
|
| 518 | Converts a UINT32 from host byte order to network byte order, then copies it to the
|
| 519 | byte stream.
|
| 520 |
|
| 521 | @param[in, out] Buf The buffer in which to put the UINT32.
|
| 522 | @param[in] Data The data to be converted and put into the byte stream.
|
| 523 |
|
| 524 | **/
|
| 525 | VOID
|
| 526 | EFIAPI
|
| 527 | NetPutUint32 (
|
| 528 | IN OUT UINT8 *Buf,
|
| 529 | IN UINT32 Data
|
| 530 | );
|
| 531 |
|
| 532 | /**
|
| 533 | Initialize a random seed using current time.
|
| 534 |
|
| 535 | Get current time first. Then initialize a random seed based on some basic
|
| 536 | mathematical operations on the hour, day, minute, second, nanosecond and year
|
| 537 | of the current time.
|
| 538 |
|
| 539 | @return The random seed, initialized with current time.
|
| 540 |
|
| 541 | **/
|
| 542 | UINT32
|
| 543 | EFIAPI
|
| 544 | NetRandomInitSeed (
|
| 545 | VOID
|
| 546 | );
|
| 547 |
|
| 548 |
|
| 549 | #define NET_LIST_USER_STRUCT(Entry, Type, Field) \
|
| 550 | BASE_CR(Entry, Type, Field)
|
| 551 |
|
| 552 | #define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig) \
|
| 553 | CR(Entry, Type, Field, Sig)
|
| 554 |
|
| 555 | //
|
| 556 | // Iterate through the double linked list. It is NOT delete safe
|
| 557 | //
|
| 558 | #define NET_LIST_FOR_EACH(Entry, ListHead) \
|
| 559 | for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
|
| 560 |
|
| 561 | //
|
| 562 | // Iterate through the double linked list. This is delete-safe.
|
| 563 | // Don't touch NextEntry. Also, don't use this macro if list
|
| 564 | // entries other than the Entry may be deleted when processing
|
| 565 | // the current Entry.
|
| 566 | //
|
| 567 | #define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
|
| 568 | for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \
|
| 569 | Entry != (ListHead); \
|
| 570 | Entry = NextEntry, NextEntry = Entry->ForwardLink \
|
| 571 | )
|
| 572 |
|
| 573 | //
|
| 574 | // Make sure the list isn't empty before getting the first/last record.
|
| 575 | //
|
| 576 | #define NET_LIST_HEAD(ListHead, Type, Field) \
|
| 577 | NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)
|
| 578 |
|
| 579 | #define NET_LIST_TAIL(ListHead, Type, Field) \
|
| 580 | NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)
|
| 581 |
|
| 582 |
|
| 583 | /**
|
| 584 | Remove the first node entry on the list, and return the removed node entry.
|
| 585 |
|
| 586 | Removes the first node entry from a doubly linked list. It is up to the caller of
|
| 587 | this function to release the memory used by the first node, if that is required. On
|
| 588 | exit, the removed node is returned.
|
| 589 |
|
| 590 | If Head is NULL, then ASSERT().
|
| 591 | If Head was not initialized, then ASSERT().
|
| 592 | If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
|
| 593 | linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
|
| 594 | then ASSERT().
|
| 595 |
|
| 596 | @param[in, out] Head The list header.
|
| 597 |
|
| 598 | @return The first node entry that is removed from the list, NULL if the list is empty.
|
| 599 |
|
| 600 | **/
|
| 601 | LIST_ENTRY *
|
| 602 | EFIAPI
|
| 603 | NetListRemoveHead (
|
| 604 | IN OUT LIST_ENTRY *Head
|
| 605 | );
|
| 606 |
|
| 607 | /**
|
| 608 | Remove the last node entry on the list and return the removed node entry.
|
| 609 |
|
| 610 | Removes the last node entry from a doubly linked list. It is up to the caller of
|
| 611 | this function to release the memory used by the first node, if that is required. On
|
| 612 | exit, the removed node is returned.
|
| 613 |
|
| 614 | If Head is NULL, then ASSERT().
|
| 615 | If Head was not initialized, then ASSERT().
|
| 616 | If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
|
| 617 | linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
|
| 618 | then ASSERT().
|
| 619 |
|
| 620 | @param[in, out] Head The list head.
|
| 621 |
|
| 622 | @return The last node entry that is removed from the list, NULL if the list is empty.
|
| 623 |
|
| 624 | **/
|
| 625 | LIST_ENTRY *
|
| 626 | EFIAPI
|
| 627 | NetListRemoveTail (
|
| 628 | IN OUT LIST_ENTRY *Head
|
| 629 | );
|
| 630 |
|
| 631 | /**
|
| 632 | Insert a new node entry after a designated node entry of a doubly linked list.
|
| 633 |
|
| 634 | Inserts a new node entry designated by NewEntry after the node entry designated by PrevEntry
|
| 635 | of the doubly linked list.
|
| 636 |
|
| 637 | @param[in, out] PrevEntry The entry after which to insert.
|
| 638 | @param[in, out] NewEntry The new entry to insert.
|
| 639 |
|
| 640 | **/
|
| 641 | VOID
|
| 642 | EFIAPI
|
| 643 | NetListInsertAfter (
|
| 644 | IN OUT LIST_ENTRY *PrevEntry,
|
| 645 | IN OUT LIST_ENTRY *NewEntry
|
| 646 | );
|
| 647 |
|
| 648 | /**
|
| 649 | Insert a new node entry before a designated node entry of a doubly linked list.
|
| 650 |
|
| 651 | Inserts a new node entry designated by NewEntry before the node entry designated by PostEntry
|
| 652 | of the doubly linked list.
|
| 653 |
|
| 654 | @param[in, out] PostEntry The entry to insert before.
|
| 655 | @param[in, out] NewEntry The new entry to insert.
|
| 656 |
|
| 657 | **/
|
| 658 | VOID
|
| 659 | EFIAPI
|
| 660 | NetListInsertBefore (
|
| 661 | IN OUT LIST_ENTRY *PostEntry,
|
| 662 | IN OUT LIST_ENTRY *NewEntry
|
| 663 | );
|
| 664 |
|
| 665 | /**
|
| 666 | Callback function which provided by user to remove one node in NetDestroyLinkList process.
|
| 667 |
|
| 668 | @param[in] Entry The entry to be removed.
|
| 669 | @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList.
|
| 670 |
|
| 671 | @retval EFI_SUCCESS The entry has been removed successfully.
|
| 672 | @retval Others Fail to remove the entry.
|
| 673 |
|
| 674 | **/
|
| 675 | typedef
|
| 676 | EFI_STATUS
|
| 677 | (EFIAPI *NET_DESTROY_LINK_LIST_CALLBACK) (
|
| 678 | IN LIST_ENTRY *Entry,
|
| 679 | IN VOID *Context OPTIONAL
|
| 680 | );
|
| 681 |
|
| 682 | /**
|
| 683 | Safe destroy nodes in a linked list, and return the length of the list after all possible operations finished.
|
| 684 |
|
| 685 | Destroy network children list by list traversals is not safe due to graph dependencies between nodes.
|
| 686 | This function performs a safe traversal to destroy these nodes by checking to see if the node being destroyed
|
| 687 | has been removed from the list or not.
|
| 688 | If it has been removed, then restart the traversal from the head.
|
| 689 | If it hasn't been removed, then continue with the next node directly.
|
| 690 | This function will end the iterate and return the CallBack's last return value if error happens,
|
| 691 | or retrun EFI_SUCCESS if 2 complete passes are made with no changes in the number of children in the list.
|
| 692 |
|
| 693 | @param[in] List The head of the list.
|
| 694 | @param[in] CallBack Pointer to the callback function to destroy one node in the list.
|
| 695 | @param[in] Context Pointer to the callback function's context: corresponds to the
|
| 696 | parameter Context in NET_DESTROY_LINK_LIST_CALLBACK.
|
| 697 | @param[out] ListLength The length of the link list if the function returns successfully.
|
| 698 |
|
| 699 | @retval EFI_SUCCESS Two complete passes are made with no changes in the number of children.
|
| 700 | @retval EFI_INVALID_PARAMETER The input parameter is invalid.
|
| 701 | @retval Others Return the CallBack's last return value.
|
| 702 |
|
| 703 | **/
|
| 704 | EFI_STATUS
|
| 705 | EFIAPI
|
| 706 | NetDestroyLinkList (
|
| 707 | IN LIST_ENTRY *List,
|
| 708 | IN NET_DESTROY_LINK_LIST_CALLBACK CallBack,
|
| 709 | IN VOID *Context, OPTIONAL
|
| 710 | OUT UINTN *ListLength OPTIONAL
|
| 711 | );
|
| 712 |
|
| 713 | /**
|
| 714 | This function checks the input Handle to see if it's one of these handles in ChildHandleBuffer.
|
| 715 |
|
| 716 | @param[in] Handle Handle to be checked.
|
| 717 | @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer.
|
| 718 | @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
|
| 719 | if NumberOfChildren is 0.
|
| 720 |
|
| 721 | @retval TURE Found the input Handle in ChildHandleBuffer.
|
| 722 | @retval FALSE Can't find the input Handle in ChildHandleBuffer.
|
| 723 |
|
| 724 | **/
|
| 725 | BOOLEAN
|
| 726 | EFIAPI
|
| 727 | NetIsInHandleBuffer (
|
| 728 | IN EFI_HANDLE Handle,
|
| 729 | IN UINTN NumberOfChildren,
|
| 730 | IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
| 731 | );
|
| 732 |
|
| 733 | //
|
| 734 | // Object container: EFI network stack spec defines various kinds of
|
| 735 | // tokens. The drivers can share code to manage those objects.
|
| 736 | //
|
| 737 | typedef struct {
|
| 738 | LIST_ENTRY Link;
|
| 739 | VOID *Key;
|
| 740 | VOID *Value;
|
| 741 | } NET_MAP_ITEM;
|
| 742 |
|
| 743 | typedef struct {
|
| 744 | LIST_ENTRY Used;
|
| 745 | LIST_ENTRY Recycled;
|
| 746 | UINTN Count;
|
| 747 | } NET_MAP;
|
| 748 |
|
| 749 | #define NET_MAP_INCREAMENT 64
|
| 750 |
|
| 751 | /**
|
| 752 | Initialize the netmap. Netmap is a reposity to keep the <Key, Value> pairs.
|
| 753 |
|
| 754 | Initialize the forward and backward links of two head nodes donated by Map->Used
|
| 755 | and Map->Recycled of two doubly linked lists.
|
| 756 | Initializes the count of the <Key, Value> pairs in the netmap to zero.
|
| 757 |
|
| 758 | If Map is NULL, then ASSERT().
|
| 759 | If the address of Map->Used is NULL, then ASSERT().
|
| 760 | If the address of Map->Recycled is NULl, then ASSERT().
|
| 761 |
|
| 762 | @param[in, out] Map The netmap to initialize.
|
| 763 |
|
| 764 | **/
|
| 765 | VOID
|
| 766 | EFIAPI
|
| 767 | NetMapInit (
|
| 768 | IN OUT NET_MAP *Map
|
| 769 | );
|
| 770 |
|
| 771 | /**
|
| 772 | To clean up the netmap, that is, release allocated memories.
|
| 773 |
|
| 774 | Removes all nodes of the Used doubly linked list and frees memory of all related netmap items.
|
| 775 | Removes all nodes of the Recycled doubly linked list and free memory of all related netmap items.
|
| 776 | The number of the <Key, Value> pairs in the netmap is set to zero.
|
| 777 |
|
| 778 | If Map is NULL, then ASSERT().
|
| 779 |
|
| 780 | @param[in, out] Map The netmap to clean up.
|
| 781 |
|
| 782 | **/
|
| 783 | VOID
|
| 784 | EFIAPI
|
| 785 | NetMapClean (
|
| 786 | IN OUT NET_MAP *Map
|
| 787 | );
|
| 788 |
|
| 789 | /**
|
| 790 | Test whether the netmap is empty and return true if it is.
|
| 791 |
|
| 792 | If the number of the <Key, Value> pairs in the netmap is zero, return TRUE.
|
| 793 |
|
| 794 | If Map is NULL, then ASSERT().
|
| 795 |
|
| 796 |
|
| 797 | @param[in] Map The net map to test.
|
| 798 |
|
| 799 | @return TRUE if the netmap is empty, otherwise FALSE.
|
| 800 |
|
| 801 | **/
|
| 802 | BOOLEAN
|
| 803 | EFIAPI
|
| 804 | NetMapIsEmpty (
|
| 805 | IN NET_MAP *Map
|
| 806 | );
|
| 807 |
|
| 808 | /**
|
| 809 | Return the number of the <Key, Value> pairs in the netmap.
|
| 810 |
|
| 811 | @param[in] Map The netmap to get the entry number.
|
| 812 |
|
| 813 | @return The entry number in the netmap.
|
| 814 |
|
| 815 | **/
|
| 816 | UINTN
|
| 817 | EFIAPI
|
| 818 | NetMapGetCount (
|
| 819 | IN NET_MAP *Map
|
| 820 | );
|
| 821 |
|
| 822 | /**
|
| 823 | Allocate an item to save the <Key, Value> pair to the head of the netmap.
|
| 824 |
|
| 825 | Allocate an item to save the <Key, Value> pair and add corresponding node entry
|
| 826 | to the beginning of the Used doubly linked list. The number of the <Key, Value>
|
| 827 | pairs in the netmap increase by 1.
|
| 828 |
|
| 829 | If Map is NULL, then ASSERT().
|
| 830 |
|
| 831 | @param[in, out] Map The netmap to insert into.
|
| 832 | @param[in] Key The user's key.
|
| 833 | @param[in] Value The user's value for the key.
|
| 834 |
|
| 835 | @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
|
| 836 | @retval EFI_SUCCESS The item is inserted to the head.
|
| 837 |
|
| 838 | **/
|
| 839 | EFI_STATUS
|
| 840 | EFIAPI
|
| 841 | NetMapInsertHead (
|
| 842 | IN OUT NET_MAP *Map,
|
| 843 | IN VOID *Key,
|
| 844 | IN VOID *Value OPTIONAL
|
| 845 | );
|
| 846 |
|
| 847 | /**
|
| 848 | Allocate an item to save the <Key, Value> pair to the tail of the netmap.
|
| 849 |
|
| 850 | Allocate an item to save the <Key, Value> pair and add corresponding node entry
|
| 851 | to the tail of the Used doubly linked list. The number of the <Key, Value>
|
| 852 | pairs in the netmap increase by 1.
|
| 853 |
|
| 854 | If Map is NULL, then ASSERT().
|
| 855 |
|
| 856 | @param[in, out] Map The netmap to insert into.
|
| 857 | @param[in] Key The user's key.
|
| 858 | @param[in] Value The user's value for the key.
|
| 859 |
|
| 860 | @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
|
| 861 | @retval EFI_SUCCESS The item is inserted to the tail.
|
| 862 |
|
| 863 | **/
|
| 864 | EFI_STATUS
|
| 865 | EFIAPI
|
| 866 | NetMapInsertTail (
|
| 867 | IN OUT NET_MAP *Map,
|
| 868 | IN VOID *Key,
|
| 869 | IN VOID *Value OPTIONAL
|
| 870 | );
|
| 871 |
|
| 872 | /**
|
| 873 | Finds the key in the netmap and returns the point to the item containing the Key.
|
| 874 |
|
| 875 | Iterate the Used doubly linked list of the netmap to get every item. Compare the key of every
|
| 876 | item with the key to search. It returns the point to the item contains the Key if found.
|
| 877 |
|
| 878 | If Map is NULL, then ASSERT().
|
| 879 |
|
| 880 | @param[in] Map The netmap to search within.
|
| 881 | @param[in] Key The key to search.
|
| 882 |
|
| 883 | @return The point to the item contains the Key, or NULL if Key isn't in the map.
|
| 884 |
|
| 885 | **/
|
| 886 | NET_MAP_ITEM *
|
| 887 | EFIAPI
|
| 888 | NetMapFindKey (
|
| 889 | IN NET_MAP *Map,
|
| 890 | IN VOID *Key
|
| 891 | );
|
| 892 |
|
| 893 | /**
|
| 894 | Remove the node entry of the item from the netmap and return the key of the removed item.
|
| 895 |
|
| 896 | Remove the node entry of the item from the Used doubly linked list of the netmap.
|
| 897 | The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
|
| 898 | entry of the item to the Recycled doubly linked list of the netmap. If Value is not NULL,
|
| 899 | Value will point to the value of the item. It returns the key of the removed item.
|
| 900 |
|
| 901 | If Map is NULL, then ASSERT().
|
| 902 | If Item is NULL, then ASSERT().
|
| 903 | if item in not in the netmap, then ASSERT().
|
| 904 |
|
| 905 | @param[in, out] Map The netmap to remove the item from.
|
| 906 | @param[in, out] Item The item to remove.
|
| 907 | @param[out] Value The variable to receive the value if not NULL.
|
| 908 |
|
| 909 | @return The key of the removed item.
|
| 910 |
|
| 911 | **/
|
| 912 | VOID *
|
| 913 | EFIAPI
|
| 914 | NetMapRemoveItem (
|
| 915 | IN OUT NET_MAP *Map,
|
| 916 | IN OUT NET_MAP_ITEM *Item,
|
| 917 | OUT VOID **Value OPTIONAL
|
| 918 | );
|
| 919 |
|
| 920 | /**
|
| 921 | Remove the first node entry on the netmap and return the key of the removed item.
|
| 922 |
|
| 923 | Remove the first node entry from the Used doubly linked list of the netmap.
|
| 924 | The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
|
| 925 | entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
|
| 926 | parameter Value will point to the value of the item. It returns the key of the removed item.
|
| 927 |
|
| 928 | If Map is NULL, then ASSERT().
|
| 929 | If the Used doubly linked list is empty, then ASSERT().
|
| 930 |
|
| 931 | @param[in, out] Map The netmap to remove the head from.
|
| 932 | @param[out] Value The variable to receive the value if not NULL.
|
| 933 |
|
| 934 | @return The key of the item removed.
|
| 935 |
|
| 936 | **/
|
| 937 | VOID *
|
| 938 | EFIAPI
|
| 939 | NetMapRemoveHead (
|
| 940 | IN OUT NET_MAP *Map,
|
| 941 | OUT VOID **Value OPTIONAL
|
| 942 | );
|
| 943 |
|
| 944 | /**
|
| 945 | Remove the last node entry on the netmap and return the key of the removed item.
|
| 946 |
|
| 947 | Remove the last node entry from the Used doubly linked list of the netmap.
|
| 948 | The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
|
| 949 | entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
|
| 950 | parameter Value will point to the value of the item. It returns the key of the removed item.
|
| 951 |
|
| 952 | If Map is NULL, then ASSERT().
|
| 953 | If the Used doubly linked list is empty, then ASSERT().
|
| 954 |
|
| 955 | @param[in, out] Map The netmap to remove the tail from.
|
| 956 | @param[out] Value The variable to receive the value if not NULL.
|
| 957 |
|
| 958 | @return The key of the item removed.
|
| 959 |
|
| 960 | **/
|
| 961 | VOID *
|
| 962 | EFIAPI
|
| 963 | NetMapRemoveTail (
|
| 964 | IN OUT NET_MAP *Map,
|
| 965 | OUT VOID **Value OPTIONAL
|
| 966 | );
|
| 967 |
|
| 968 | typedef
|
| 969 | EFI_STATUS
|
| 970 | (EFIAPI *NET_MAP_CALLBACK) (
|
| 971 | IN NET_MAP *Map,
|
| 972 | IN NET_MAP_ITEM *Item,
|
| 973 | IN VOID *Arg
|
| 974 | );
|
| 975 |
|
| 976 | /**
|
| 977 | Iterate through the netmap and call CallBack for each item.
|
| 978 |
|
| 979 | It will contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break
|
| 980 | from the loop. It returns the CallBack's last return value. This function is
|
| 981 | delete safe for the current item.
|
| 982 |
|
| 983 | If Map is NULL, then ASSERT().
|
| 984 | If CallBack is NULL, then ASSERT().
|
| 985 |
|
| 986 | @param[in] Map The Map to iterate through.
|
| 987 | @param[in] CallBack The callback function to call for each item.
|
| 988 | @param[in] Arg The opaque parameter to the callback.
|
| 989 |
|
| 990 | @retval EFI_SUCCESS There is no item in the netmap, or CallBack for each item
|
| 991 | returns EFI_SUCCESS.
|
| 992 | @retval Others It returns the CallBack's last return value.
|
| 993 |
|
| 994 | **/
|
| 995 | EFI_STATUS
|
| 996 | EFIAPI
|
| 997 | NetMapIterate (
|
| 998 | IN NET_MAP *Map,
|
| 999 | IN NET_MAP_CALLBACK CallBack,
|
| 1000 | IN VOID *Arg OPTIONAL
|
| 1001 | );
|
| 1002 |
|
| 1003 |
|
| 1004 | //
|
| 1005 | // Helper functions to implement driver binding and service binding protocols.
|
| 1006 | //
|
| 1007 | /**
|
| 1008 | Create a child of the service that is identified by ServiceBindingGuid.
|
| 1009 |
|
| 1010 | Get the ServiceBinding Protocol first, then use it to create a child.
|
| 1011 |
|
| 1012 | If ServiceBindingGuid is NULL, then ASSERT().
|
| 1013 | If ChildHandle is NULL, then ASSERT().
|
| 1014 |
|
| 1015 | @param[in] Controller The controller which has the service installed.
|
| 1016 | @param[in] Image The image handle used to open service.
|
| 1017 | @param[in] ServiceBindingGuid The service's Guid.
|
| 1018 | @param[in, out] ChildHandle The handle to receive the created child.
|
| 1019 |
|
| 1020 | @retval EFI_SUCCESS The child was successfully created.
|
| 1021 | @retval Others Failed to create the child.
|
| 1022 |
|
| 1023 | **/
|
| 1024 | EFI_STATUS
|
| 1025 | EFIAPI
|
| 1026 | NetLibCreateServiceChild (
|
| 1027 | IN EFI_HANDLE Controller,
|
| 1028 | IN EFI_HANDLE Image,
|
| 1029 | IN EFI_GUID *ServiceBindingGuid,
|
| 1030 | IN OUT EFI_HANDLE *ChildHandle
|
| 1031 | );
|
| 1032 |
|
| 1033 | /**
|
| 1034 | Destroy a child of the service that is identified by ServiceBindingGuid.
|
| 1035 |
|
| 1036 | Get the ServiceBinding Protocol first, then use it to destroy a child.
|
| 1037 |
|
| 1038 | If ServiceBindingGuid is NULL, then ASSERT().
|
| 1039 |
|
| 1040 | @param[in] Controller The controller which has the service installed.
|
| 1041 | @param[in] Image The image handle used to open service.
|
| 1042 | @param[in] ServiceBindingGuid The service's Guid.
|
| 1043 | @param[in] ChildHandle The child to destroy.
|
| 1044 |
|
| 1045 | @retval EFI_SUCCESS The child was destroyed.
|
| 1046 | @retval Others Failed to destroy the child.
|
| 1047 |
|
| 1048 | **/
|
| 1049 | EFI_STATUS
|
| 1050 | EFIAPI
|
| 1051 | NetLibDestroyServiceChild (
|
| 1052 | IN EFI_HANDLE Controller,
|
| 1053 | IN EFI_HANDLE Image,
|
| 1054 | IN EFI_GUID *ServiceBindingGuid,
|
| 1055 | IN EFI_HANDLE ChildHandle
|
| 1056 | );
|
| 1057 |
|
| 1058 | /**
|
| 1059 | Get handle with Simple Network Protocol installed on it.
|
| 1060 |
|
| 1061 | There should be MNP Service Binding Protocol installed on the input ServiceHandle.
|
| 1062 | If Simple Network Protocol is already installed on the ServiceHandle, the
|
| 1063 | ServiceHandle will be returned. If SNP is not installed on the ServiceHandle,
|
| 1064 | try to find its parent handle with SNP installed.
|
| 1065 |
|
| 1066 | @param[in] ServiceHandle The handle where network service binding protocols are
|
| 1067 | installed on.
|
| 1068 | @param[out] Snp The pointer to store the address of the SNP instance.
|
| 1069 | This is an optional parameter that may be NULL.
|
| 1070 |
|
| 1071 | @return The SNP handle, or NULL if not found.
|
| 1072 |
|
| 1073 | **/
|
| 1074 | EFI_HANDLE
|
| 1075 | EFIAPI
|
| 1076 | NetLibGetSnpHandle (
|
| 1077 | IN EFI_HANDLE ServiceHandle,
|
| 1078 | OUT EFI_SIMPLE_NETWORK_PROTOCOL **Snp OPTIONAL
|
| 1079 | );
|
| 1080 |
|
| 1081 | /**
|
| 1082 | Retrieve VLAN ID of a VLAN device handle.
|
| 1083 |
|
| 1084 | Search VLAN device path node in Device Path of specified ServiceHandle and
|
| 1085 | return its VLAN ID. If no VLAN device path node found, then this ServiceHandle
|
| 1086 | is not a VLAN device handle, and 0 will be returned.
|
| 1087 |
|
| 1088 | @param[in] ServiceHandle The handle where network service binding protocols are
|
| 1089 | installed on.
|
| 1090 |
|
| 1091 | @return VLAN ID of the device handle, or 0 if not a VLAN device.
|
| 1092 |
|
| 1093 | **/
|
| 1094 | UINT16
|
| 1095 | EFIAPI
|
| 1096 | NetLibGetVlanId (
|
| 1097 | IN EFI_HANDLE ServiceHandle
|
| 1098 | );
|
| 1099 |
|
| 1100 | /**
|
| 1101 | Find VLAN device handle with specified VLAN ID.
|
| 1102 |
|
| 1103 | The VLAN child device handle is created by VLAN Config Protocol on ControllerHandle.
|
| 1104 | This function will append VLAN device path node to the parent device path,
|
| 1105 | and then use LocateDevicePath() to find the correct VLAN device handle.
|
| 1106 |
|
| 1107 | @param[in] ControllerHandle The handle where network service binding protocols are
|
| 1108 | installed on.
|
| 1109 | @param[in] VlanId The configured VLAN ID for the VLAN device.
|
| 1110 |
|
| 1111 | @return The VLAN device handle, or NULL if not found.
|
| 1112 |
|
| 1113 | **/
|
| 1114 | EFI_HANDLE
|
| 1115 | EFIAPI
|
| 1116 | NetLibGetVlanHandle (
|
| 1117 | IN EFI_HANDLE ControllerHandle,
|
| 1118 | IN UINT16 VlanId
|
| 1119 | );
|
| 1120 |
|
| 1121 | /**
|
| 1122 | Get MAC address associated with the network service handle.
|
| 1123 |
|
| 1124 | There should be MNP Service Binding Protocol installed on the input ServiceHandle.
|
| 1125 | If SNP is installed on the ServiceHandle or its parent handle, MAC address will
|
| 1126 | be retrieved from SNP. If no SNP found, try to get SNP mode data use MNP.
|
| 1127 |
|
| 1128 | @param[in] ServiceHandle The handle where network service binding protocols are
|
| 1129 | installed on.
|
| 1130 | @param[out] MacAddress The pointer to store the returned MAC address.
|
| 1131 | @param[out] AddressSize The length of returned MAC address.
|
| 1132 |
|
| 1133 | @retval EFI_SUCCESS MAC address was returned successfully.
|
| 1134 | @retval Others Failed to get SNP mode data.
|
| 1135 |
|
| 1136 | **/
|
| 1137 | EFI_STATUS
|
| 1138 | EFIAPI
|
| 1139 | NetLibGetMacAddress (
|
| 1140 | IN EFI_HANDLE ServiceHandle,
|
| 1141 | OUT EFI_MAC_ADDRESS *MacAddress,
|
| 1142 | OUT UINTN *AddressSize
|
| 1143 | );
|
| 1144 |
|
| 1145 | /**
|
| 1146 | Convert MAC address of the NIC associated with specified Service Binding Handle
|
| 1147 | to a unicode string. Callers are responsible for freeing the string storage.
|
| 1148 |
|
| 1149 | Locate simple network protocol associated with the Service Binding Handle and
|
| 1150 | get the mac address from SNP. Then convert the mac address into a unicode
|
| 1151 | string. It takes 2 unicode characters to represent a 1 byte binary buffer.
|
| 1152 | Plus one unicode character for the null-terminator.
|
| 1153 |
|
| 1154 | @param[in] ServiceHandle The handle where network service binding protocol is
|
| 1155 | installed.
|
| 1156 | @param[in] ImageHandle The image handle used to act as the agent handle to
|
| 1157 | get the simple network protocol. This parameter is
|
| 1158 | optional and may be NULL.
|
| 1159 | @param[out] MacString The pointer to store the address of the string
|
| 1160 | representation of the mac address.
|
| 1161 |
|
| 1162 | @retval EFI_SUCCESS Converted the mac address a unicode string successfully.
|
| 1163 | @retval EFI_OUT_OF_RESOURCES There are not enough memory resources.
|
| 1164 | @retval Others Failed to open the simple network protocol.
|
| 1165 |
|
| 1166 | **/
|
| 1167 | EFI_STATUS
|
| 1168 | EFIAPI
|
| 1169 | NetLibGetMacString (
|
| 1170 | IN EFI_HANDLE ServiceHandle,
|
| 1171 | IN EFI_HANDLE ImageHandle, OPTIONAL
|
| 1172 | OUT CHAR16 **MacString
|
| 1173 | );
|
| 1174 |
|
| 1175 | /**
|
| 1176 | Detect media status for specified network device.
|
| 1177 |
|
| 1178 | The underlying UNDI driver may or may not support reporting media status from
|
| 1179 | GET_STATUS command (PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED). This routine
|
| 1180 | will try to invoke Snp->GetStatus() to get the media status. If media is already
|
| 1181 | present, it returns directly. If media is not present, it will stop SNP and then
|
| 1182 | restart SNP to get the latest media status. This provides an opportunity to get
|
| 1183 | the correct media status for old UNDI driver, which doesn't support reporting
|
| 1184 | media status from GET_STATUS command.
|
| 1185 | Note: there are two limitations for the current algorithm:
|
| 1186 | 1) For UNDI with this capability, when the cable is not attached, there will
|
| 1187 | be an redundant Stop/Start() process.
|
| 1188 | 2) for UNDI without this capability, in case that network cable is attached when
|
| 1189 | Snp->Initialize() is invoked while network cable is unattached later,
|
| 1190 | NetLibDetectMedia() will report MediaPresent as TRUE, causing upper layer
|
| 1191 | apps to wait for timeout time.
|
| 1192 |
|
| 1193 | @param[in] ServiceHandle The handle where network service binding protocols are
|
| 1194 | installed.
|
| 1195 | @param[out] MediaPresent The pointer to store the media status.
|
| 1196 |
|
| 1197 | @retval EFI_SUCCESS Media detection success.
|
| 1198 | @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network device handle.
|
| 1199 | @retval EFI_UNSUPPORTED The network device does not support media detection.
|
| 1200 | @retval EFI_DEVICE_ERROR SNP is in an unknown state.
|
| 1201 |
|
| 1202 | **/
|
| 1203 | EFI_STATUS
|
| 1204 | EFIAPI
|
| 1205 | NetLibDetectMedia (
|
| 1206 | IN EFI_HANDLE ServiceHandle,
|
| 1207 | OUT BOOLEAN *MediaPresent
|
| 1208 | );
|
| 1209 |
|
| 1210 | /**
|
| 1211 | Create an IPv4 device path node.
|
| 1212 |
|
| 1213 | The header type of IPv4 device path node is MESSAGING_DEVICE_PATH.
|
| 1214 | The header subtype of IPv4 device path node is MSG_IPv4_DP.
|
| 1215 | The length of the IPv4 device path node in bytes is 19.
|
| 1216 | Get other information from parameters to make up the whole IPv4 device path node.
|
| 1217 |
|
| 1218 | @param[in, out] Node The pointer to the IPv4 device path node.
|
| 1219 | @param[in] Controller The controller handle.
|
| 1220 | @param[in] LocalIp The local IPv4 address.
|
| 1221 | @param[in] LocalPort The local port.
|
| 1222 | @param[in] RemoteIp The remote IPv4 address.
|
| 1223 | @param[in] RemotePort The remote port.
|
| 1224 | @param[in] Protocol The protocol type in the IP header.
|
| 1225 | @param[in] UseDefaultAddress Whether this instance is using default address or not.
|
| 1226 |
|
| 1227 | **/
|
| 1228 | VOID
|
| 1229 | EFIAPI
|
| 1230 | NetLibCreateIPv4DPathNode (
|
| 1231 | IN OUT IPv4_DEVICE_PATH *Node,
|
| 1232 | IN EFI_HANDLE Controller,
|
| 1233 | IN IP4_ADDR LocalIp,
|
| 1234 | IN UINT16 LocalPort,
|
| 1235 | IN IP4_ADDR RemoteIp,
|
| 1236 | IN UINT16 RemotePort,
|
| 1237 | IN UINT16 Protocol,
|
| 1238 | IN BOOLEAN UseDefaultAddress
|
| 1239 | );
|
| 1240 |
|
| 1241 | /**
|
| 1242 | Create an IPv6 device path node.
|
| 1243 |
|
| 1244 | The header type of IPv6 device path node is MESSAGING_DEVICE_PATH.
|
| 1245 | The header subtype of IPv6 device path node is MSG_IPv6_DP.
|
| 1246 | The length of the IPv6 device path node in bytes is 43.
|
| 1247 | Get other information from parameters to make up the whole IPv6 device path node.
|
| 1248 |
|
| 1249 | @param[in, out] Node The pointer to the IPv6 device path node.
|
| 1250 | @param[in] Controller The controller handle.
|
| 1251 | @param[in] LocalIp The local IPv6 address.
|
| 1252 | @param[in] LocalPort The local port.
|
| 1253 | @param[in] RemoteIp The remote IPv6 address.
|
| 1254 | @param[in] RemotePort The remote port.
|
| 1255 | @param[in] Protocol The protocol type in the IP header.
|
| 1256 |
|
| 1257 | **/
|
| 1258 | VOID
|
| 1259 | EFIAPI
|
| 1260 | NetLibCreateIPv6DPathNode (
|
| 1261 | IN OUT IPv6_DEVICE_PATH *Node,
|
| 1262 | IN EFI_HANDLE Controller,
|
| 1263 | IN EFI_IPv6_ADDRESS *LocalIp,
|
| 1264 | IN UINT16 LocalPort,
|
| 1265 | IN EFI_IPv6_ADDRESS *RemoteIp,
|
| 1266 | IN UINT16 RemotePort,
|
| 1267 | IN UINT16 Protocol
|
| 1268 | );
|
| 1269 |
|
| 1270 |
|
| 1271 | /**
|
| 1272 | Find the UNDI/SNP handle from controller and protocol GUID.
|
| 1273 |
|
| 1274 | For example, IP will open an MNP child to transmit/receive
|
| 1275 | packets. When MNP is stopped, IP should also be stopped. IP
|
| 1276 | needs to find its own private data that is related the IP's
|
| 1277 | service binding instance that is installed on the UNDI/SNP handle.
|
| 1278 | The controller is then either an MNP or an ARP child handle. Note that
|
| 1279 | IP opens these handles using BY_DRIVER. Use that infomation to get the
|
| 1280 | UNDI/SNP handle.
|
| 1281 |
|
| 1282 | @param[in] Controller The protocol handle to check.
|
| 1283 | @param[in] ProtocolGuid The protocol that is related with the handle.
|
| 1284 |
|
| 1285 | @return The UNDI/SNP handle or NULL for errors.
|
| 1286 |
|
| 1287 | **/
|
| 1288 | EFI_HANDLE
|
| 1289 | EFIAPI
|
| 1290 | NetLibGetNicHandle (
|
| 1291 | IN EFI_HANDLE Controller,
|
| 1292 | IN EFI_GUID *ProtocolGuid
|
| 1293 | );
|
| 1294 |
|
| 1295 | /**
|
| 1296 | This is the default unload handle for all the network drivers.
|
| 1297 |
|
| 1298 | Disconnect the driver specified by ImageHandle from all the devices in the handle database.
|
| 1299 | Uninstall all the protocols installed in the driver entry point.
|
| 1300 |
|
| 1301 | @param[in] ImageHandle The drivers' driver image.
|
| 1302 |
|
| 1303 | @retval EFI_SUCCESS The image is unloaded.
|
| 1304 | @retval Others Failed to unload the image.
|
| 1305 |
|
| 1306 | **/
|
| 1307 | EFI_STATUS
|
| 1308 | EFIAPI
|
| 1309 | NetLibDefaultUnload (
|
| 1310 | IN EFI_HANDLE ImageHandle
|
| 1311 | );
|
| 1312 |
|
| 1313 | /**
|
| 1314 | Convert one Null-terminated ASCII string (decimal dotted) to EFI_IPv4_ADDRESS.
|
| 1315 |
|
| 1316 | @param[in] String The pointer to the Ascii string.
|
| 1317 | @param[out] Ip4Address The pointer to the converted IPv4 address.
|
| 1318 |
|
| 1319 | @retval EFI_SUCCESS Converted to an IPv4 address successfully.
|
| 1320 | @retval EFI_INVALID_PARAMETER The string is malformated, or Ip4Address is NULL.
|
| 1321 |
|
| 1322 | **/
|
| 1323 | EFI_STATUS
|
| 1324 | EFIAPI
|
| 1325 | NetLibAsciiStrToIp4 (
|
| 1326 | IN CONST CHAR8 *String,
|
| 1327 | OUT EFI_IPv4_ADDRESS *Ip4Address
|
| 1328 | );
|
| 1329 |
|
| 1330 | /**
|
| 1331 | Convert one Null-terminated ASCII string to EFI_IPv6_ADDRESS. The format of the
|
| 1332 | string is defined in RFC 4291 - Text Pepresentation of Addresses.
|
| 1333 |
|
| 1334 | @param[in] String The pointer to the Ascii string.
|
| 1335 | @param[out] Ip6Address The pointer to the converted IPv6 address.
|
| 1336 |
|
| 1337 | @retval EFI_SUCCESS Converted to an IPv6 address successfully.
|
| 1338 | @retval EFI_INVALID_PARAMETER The string is malformated, or Ip6Address is NULL.
|
| 1339 |
|
| 1340 | **/
|
| 1341 | EFI_STATUS
|
| 1342 | EFIAPI
|
| 1343 | NetLibAsciiStrToIp6 (
|
| 1344 | IN CONST CHAR8 *String,
|
| 1345 | OUT EFI_IPv6_ADDRESS *Ip6Address
|
| 1346 | );
|
| 1347 |
|
| 1348 | /**
|
| 1349 | Convert one Null-terminated Unicode string (decimal dotted) to EFI_IPv4_ADDRESS.
|
| 1350 |
|
| 1351 | @param[in] String The pointer to the Ascii string.
|
| 1352 | @param[out] Ip4Address The pointer to the converted IPv4 address.
|
| 1353 |
|
| 1354 | @retval EFI_SUCCESS Converted to an IPv4 address successfully.
|
| 1355 | @retval EFI_INVALID_PARAMETER The string is mal-formated or Ip4Address is NULL.
|
| 1356 | @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to lack of resources.
|
| 1357 |
|
| 1358 | **/
|
| 1359 | EFI_STATUS
|
| 1360 | EFIAPI
|
| 1361 | NetLibStrToIp4 (
|
| 1362 | IN CONST CHAR16 *String,
|
| 1363 | OUT EFI_IPv4_ADDRESS *Ip4Address
|
| 1364 | );
|
| 1365 |
|
| 1366 | /**
|
| 1367 | Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS. The format of
|
| 1368 | the string is defined in RFC 4291 - Text Pepresentation of Addresses.
|
| 1369 |
|
| 1370 | @param[in] String The pointer to the Ascii string.
|
| 1371 | @param[out] Ip6Address The pointer to the converted IPv6 address.
|
| 1372 |
|
| 1373 | @retval EFI_SUCCESS Converted to an IPv6 address successfully.
|
| 1374 | @retval EFI_INVALID_PARAMETER The string is malformated or Ip6Address is NULL.
|
| 1375 | @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to a lack of resources.
|
| 1376 |
|
| 1377 | **/
|
| 1378 | EFI_STATUS
|
| 1379 | EFIAPI
|
| 1380 | NetLibStrToIp6 (
|
| 1381 | IN CONST CHAR16 *String,
|
| 1382 | OUT EFI_IPv6_ADDRESS *Ip6Address
|
| 1383 | );
|
| 1384 |
|
| 1385 | /**
|
| 1386 | Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS and prefix length.
|
| 1387 | The format of the string is defined in RFC 4291 - Text Pepresentation of Addresses
|
| 1388 | Prefixes: ipv6-address/prefix-length.
|
| 1389 |
|
| 1390 | @param[in] String The pointer to the Ascii string.
|
| 1391 | @param[out] Ip6Address The pointer to the converted IPv6 address.
|
| 1392 | @param[out] PrefixLength The pointer to the converted prefix length.
|
| 1393 |
|
| 1394 | @retval EFI_SUCCESS Converted to an IPv6 address successfully.
|
| 1395 | @retval EFI_INVALID_PARAMETER The string is malformated, or Ip6Address is NULL.
|
| 1396 | @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to a lack of resources.
|
| 1397 |
|
| 1398 | **/
|
| 1399 | EFI_STATUS
|
| 1400 | EFIAPI
|
| 1401 | NetLibStrToIp6andPrefix (
|
| 1402 | IN CONST CHAR16 *String,
|
| 1403 | OUT EFI_IPv6_ADDRESS *Ip6Address,
|
| 1404 | OUT UINT8 *PrefixLength
|
| 1405 | );
|
| 1406 |
|
| 1407 | /**
|
| 1408 |
|
| 1409 | Convert one EFI_IPv6_ADDRESS to Null-terminated Unicode string.
|
| 1410 | The text representation of address is defined in RFC 4291.
|
| 1411 |
|
| 1412 | @param[in] Ip6Address The pointer to the IPv6 address.
|
| 1413 | @param[out] String The buffer to return the converted string.
|
| 1414 | @param[in] StringSize The length in bytes of the input String.
|
| 1415 |
|
| 1416 | @retval EFI_SUCCESS Convert to string successfully.
|
| 1417 | @retval EFI_INVALID_PARAMETER The input parameter is invalid.
|
| 1418 | @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small for the result. BufferSize has been
|
| 1419 | updated with the size needed to complete the request.
|
| 1420 | **/
|
| 1421 | EFI_STATUS
|
| 1422 | EFIAPI
|
| 1423 | NetLibIp6ToStr (
|
| 1424 | IN EFI_IPv6_ADDRESS *Ip6Address,
|
| 1425 | OUT CHAR16 *String,
|
| 1426 | IN UINTN StringSize
|
| 1427 | );
|
| 1428 |
|
| 1429 | //
|
| 1430 | // Various signatures
|
| 1431 | //
|
| 1432 | #define NET_BUF_SIGNATURE SIGNATURE_32 ('n', 'b', 'u', 'f')
|
| 1433 | #define NET_VECTOR_SIGNATURE SIGNATURE_32 ('n', 'v', 'e', 'c')
|
| 1434 | #define NET_QUE_SIGNATURE SIGNATURE_32 ('n', 'b', 'q', 'u')
|
| 1435 |
|
| 1436 |
|
| 1437 | #define NET_PROTO_DATA 64 // Opaque buffer for protocols
|
| 1438 | #define NET_BUF_HEAD 1 // Trim or allocate space from head
|
| 1439 | #define NET_BUF_TAIL 0 // Trim or allocate space from tail
|
| 1440 | #define NET_VECTOR_OWN_FIRST 0x01 // We allocated the 1st block in the vector
|
| 1441 |
|
| 1442 | #define NET_CHECK_SIGNATURE(PData, SIGNATURE) \
|
| 1443 | ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))
|
| 1444 |
|
| 1445 | //
|
| 1446 | // Single memory block in the vector.
|
| 1447 | //
|
| 1448 | typedef struct {
|
| 1449 | UINT32 Len; // The block's length
|
| 1450 | UINT8 *Bulk; // The block's Data
|
| 1451 | } NET_BLOCK;
|
| 1452 |
|
| 1453 | typedef VOID (EFIAPI *NET_VECTOR_EXT_FREE) (VOID *Arg);
|
| 1454 |
|
| 1455 | //
|
| 1456 | //NET_VECTOR contains several blocks to hold all packet's
|
| 1457 | //fragments and other house-keeping stuff for sharing. It
|
| 1458 | //doesn't specify the where actual packet fragment begins.
|
| 1459 | //
|
| 1460 | typedef struct {
|
| 1461 | UINT32 Signature;
|
| 1462 | INTN RefCnt; // Reference count to share NET_VECTOR.
|
| 1463 | NET_VECTOR_EXT_FREE Free; // external function to free NET_VECTOR
|
| 1464 | VOID *Arg; // opeque argument to Free
|
| 1465 | UINT32 Flag; // Flags, NET_VECTOR_OWN_FIRST
|
| 1466 | UINT32 Len; // Total length of the assocated BLOCKs
|
| 1467 |
|
| 1468 | UINT32 BlockNum;
|
| 1469 | NET_BLOCK Block[1];
|
| 1470 | } NET_VECTOR;
|
| 1471 |
|
| 1472 | //
|
| 1473 | //NET_BLOCK_OP operates on the NET_BLOCK. It specifies
|
| 1474 | //where the actual fragment begins and ends
|
| 1475 | //
|
| 1476 | typedef struct {
|
| 1477 | UINT8 *BlockHead; // Block's head, or the smallest valid Head
|
| 1478 | UINT8 *BlockTail; // Block's tail. BlockTail-BlockHead=block length
|
| 1479 | UINT8 *Head; // 1st byte of the data in the block
|
| 1480 | UINT8 *Tail; // Tail of the data in the block, Tail-Head=Size
|
| 1481 | UINT32 Size; // The size of the data
|
| 1482 | } NET_BLOCK_OP;
|
| 1483 |
|
| 1484 | typedef union {
|
| 1485 | IP4_HEAD *Ip4;
|
| 1486 | EFI_IP6_HEADER *Ip6;
|
| 1487 | } NET_IP_HEAD;
|
| 1488 |
|
| 1489 | //
|
| 1490 | //NET_BUF is the buffer manage structure used by the
|
| 1491 | //network stack. Every network packet may be fragmented. The Vector points to
|
| 1492 | //memory blocks used by each fragment, and BlockOp
|
| 1493 | //specifies where each fragment begins and ends.
|
| 1494 | //
|
| 1495 | //It also contains an opaque area for the protocol to store
|
| 1496 | //per-packet information. Protocol must be careful not
|
| 1497 | //to overwrite the members after that.
|
| 1498 | //
|
| 1499 | typedef struct {
|
| 1500 | UINT32 Signature;
|
| 1501 | INTN RefCnt;
|
| 1502 | LIST_ENTRY List; // The List this NET_BUF is on
|
| 1503 |
|
| 1504 | NET_IP_HEAD Ip; // Network layer header, for fast access
|
| 1505 | TCP_HEAD *Tcp; // Transport layer header, for fast access
|
| 1506 | EFI_UDP_HEADER *Udp; // User Datagram Protocol header
|
| 1507 | UINT8 ProtoData [NET_PROTO_DATA]; //Protocol specific data
|
| 1508 |
|
| 1509 | NET_VECTOR *Vector; // The vector containing the packet
|
| 1510 |
|
| 1511 | UINT32 BlockOpNum; // Total number of BlockOp in the buffer
|
| 1512 | UINT32 TotalSize; // Total size of the actual packet
|
| 1513 | NET_BLOCK_OP BlockOp[1]; // Specify the position of actual packet
|
| 1514 | } NET_BUF;
|
| 1515 |
|
| 1516 | //
|
| 1517 | //A queue of NET_BUFs. It is a thin extension of
|
| 1518 | //NET_BUF functions.
|
| 1519 | //
|
| 1520 | typedef struct {
|
| 1521 | UINT32 Signature;
|
| 1522 | INTN RefCnt;
|
| 1523 | LIST_ENTRY List; // The List this buffer queue is on
|
| 1524 |
|
| 1525 | LIST_ENTRY BufList; // list of queued buffers
|
| 1526 | UINT32 BufSize; // total length of DATA in the buffers
|
| 1527 | UINT32 BufNum; // total number of buffers on the chain
|
| 1528 | } NET_BUF_QUEUE;
|
| 1529 |
|
| 1530 | //
|
| 1531 | // Pseudo header for TCP and UDP checksum
|
| 1532 | //
|
| 1533 | #pragma pack(1)
|
| 1534 | typedef struct {
|
| 1535 | IP4_ADDR SrcIp;
|
| 1536 | IP4_ADDR DstIp;
|
| 1537 | UINT8 Reserved;
|
| 1538 | UINT8 Protocol;
|
| 1539 | UINT16 Len;
|
| 1540 | } NET_PSEUDO_HDR;
|
| 1541 |
|
| 1542 | typedef struct {
|
| 1543 | EFI_IPv6_ADDRESS SrcIp;
|
| 1544 | EFI_IPv6_ADDRESS DstIp;
|
| 1545 | UINT32 Len;
|
| 1546 | UINT32 Reserved:24;
|
| 1547 | UINT32 NextHeader:8;
|
| 1548 | } NET_IP6_PSEUDO_HDR;
|
| 1549 | #pragma pack()
|
| 1550 |
|
| 1551 | //
|
| 1552 | // The fragment entry table used in network interfaces. This is
|
| 1553 | // the same as NET_BLOCK now. Use two different to distinguish
|
| 1554 | // the two in case that NET_BLOCK be enhanced later.
|
| 1555 | //
|
| 1556 | typedef struct {
|
| 1557 | UINT32 Len;
|
| 1558 | UINT8 *Bulk;
|
| 1559 | } NET_FRAGMENT;
|
| 1560 |
|
| 1561 | #define NET_GET_REF(PData) ((PData)->RefCnt++)
|
| 1562 | #define NET_PUT_REF(PData) ((PData)->RefCnt--)
|
| 1563 | #define NETBUF_FROM_PROTODATA(Info) BASE_CR((Info), NET_BUF, ProtoData)
|
| 1564 |
|
| 1565 | #define NET_BUF_SHARED(Buf) \
|
| 1566 | (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))
|
| 1567 |
|
| 1568 | #define NET_VECTOR_SIZE(BlockNum) \
|
| 1569 | (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))
|
| 1570 |
|
| 1571 | #define NET_BUF_SIZE(BlockOpNum) \
|
| 1572 | (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))
|
| 1573 |
|
| 1574 | #define NET_HEADSPACE(BlockOp) \
|
| 1575 | (UINTN)((BlockOp)->Head - (BlockOp)->BlockHead)
|
| 1576 |
|
| 1577 | #define NET_TAILSPACE(BlockOp) \
|
| 1578 | (UINTN)((BlockOp)->BlockTail - (BlockOp)->Tail)
|
| 1579 |
|
| 1580 | /**
|
| 1581 | Allocate a single block NET_BUF. Upon allocation, all the
|
| 1582 | free space is in the tail room.
|
| 1583 |
|
| 1584 | @param[in] Len The length of the block.
|
| 1585 |
|
| 1586 | @return The pointer to the allocated NET_BUF, or NULL if the
|
| 1587 | allocation failed due to resource limitations.
|
| 1588 |
|
| 1589 | **/
|
| 1590 | NET_BUF *
|
| 1591 | EFIAPI
|
| 1592 | NetbufAlloc (
|
| 1593 | IN UINT32 Len
|
| 1594 | );
|
| 1595 |
|
| 1596 | /**
|
| 1597 | Free the net buffer and its associated NET_VECTOR.
|
| 1598 |
|
| 1599 | Decrease the reference count of the net buffer by one. Free the associated net
|
| 1600 | vector and itself if the reference count of the net buffer is decreased to 0.
|
| 1601 | The net vector free operation decreases the reference count of the net
|
| 1602 | vector by one, and performs the resource free operation when the reference count
|
| 1603 | of the net vector is 0.
|
| 1604 |
|
| 1605 | @param[in] Nbuf The pointer to the NET_BUF to be freed.
|
| 1606 |
|
| 1607 | **/
|
| 1608 | VOID
|
| 1609 | EFIAPI
|
| 1610 | NetbufFree (
|
| 1611 | IN NET_BUF *Nbuf
|
| 1612 | );
|
| 1613 |
|
| 1614 | /**
|
| 1615 | Get the index of NET_BLOCK_OP that contains the byte at Offset in the net
|
| 1616 | buffer.
|
| 1617 |
|
| 1618 | For example, this function can be used to retrieve the IP header in the packet. It
|
| 1619 | also can be used to get the fragment that contains the byte used
|
| 1620 | mainly by the library implementation itself.
|
| 1621 |
|
| 1622 | @param[in] Nbuf The pointer to the net buffer.
|
| 1623 | @param[in] Offset The offset of the byte.
|
| 1624 | @param[out] Index Index of the NET_BLOCK_OP that contains the byte at
|
| 1625 | Offset.
|
| 1626 |
|
| 1627 | @return The pointer to the Offset'th byte of data in the net buffer, or NULL
|
| 1628 | if there is no such data in the net buffer.
|
| 1629 |
|
| 1630 | **/
|
| 1631 | UINT8 *
|
| 1632 | EFIAPI
|
| 1633 | NetbufGetByte (
|
| 1634 | IN NET_BUF *Nbuf,
|
| 1635 | IN UINT32 Offset,
|
| 1636 | OUT UINT32 *Index OPTIONAL
|
| 1637 | );
|
| 1638 |
|
| 1639 | /**
|
| 1640 | Create a copy of the net buffer that shares the associated net vector.
|
| 1641 |
|
| 1642 | The reference count of the newly created net buffer is set to 1. The reference
|
| 1643 | count of the associated net vector is increased by one.
|
| 1644 |
|
| 1645 | @param[in] Nbuf The pointer to the net buffer to be cloned.
|
| 1646 |
|
| 1647 | @return The pointer to the cloned net buffer, or NULL if the
|
| 1648 | allocation failed due to resource limitations.
|
| 1649 |
|
| 1650 | **/
|
| 1651 | NET_BUF *
|
| 1652 | EFIAPI
|
| 1653 | NetbufClone (
|
| 1654 | IN NET_BUF *Nbuf
|
| 1655 | );
|
| 1656 |
|
| 1657 | /**
|
| 1658 | Create a duplicated copy of the net buffer with data copied and HeadSpace
|
| 1659 | bytes of head space reserved.
|
| 1660 |
|
| 1661 | The duplicated net buffer will allocate its own memory to hold the data of the
|
| 1662 | source net buffer.
|
| 1663 |
|
| 1664 | @param[in] Nbuf The pointer to the net buffer to be duplicated from.
|
| 1665 | @param[in, out] Duplicate The pointer to the net buffer to duplicate to. If
|
| 1666 | NULL, a new net buffer is allocated.
|
| 1667 | @param[in] HeadSpace The length of the head space to reserve.
|
| 1668 |
|
| 1669 | @return The pointer to the duplicated net buffer, or NULL if
|
| 1670 | the allocation failed due to resource limitations.
|
| 1671 |
|
| 1672 | **/
|
| 1673 | NET_BUF *
|
| 1674 | EFIAPI
|
| 1675 | NetbufDuplicate (
|
| 1676 | IN NET_BUF *Nbuf,
|
| 1677 | IN OUT NET_BUF *Duplicate OPTIONAL,
|
| 1678 | IN UINT32 HeadSpace
|
| 1679 | );
|
| 1680 |
|
| 1681 | /**
|
| 1682 | Create a NET_BUF structure which contains Len byte data of Nbuf starting from
|
| 1683 | Offset.
|
| 1684 |
|
| 1685 | A new NET_BUF structure will be created but the associated data in NET_VECTOR
|
| 1686 | is shared. This function exists to perform IP packet fragmentation.
|
| 1687 |
|
| 1688 | @param[in] Nbuf The pointer to the net buffer to be extracted.
|
| 1689 | @param[in] Offset Starting point of the data to be included in the new
|
| 1690 | net buffer.
|
| 1691 | @param[in] Len The bytes of data to be included in the new net buffer.
|
| 1692 | @param[in] HeadSpace The bytes of the head space to reserve for the protocol header.
|
| 1693 |
|
| 1694 | @return The pointer to the cloned net buffer, or NULL if the
|
| 1695 | allocation failed due to resource limitations.
|
| 1696 |
|
| 1697 | **/
|
| 1698 | NET_BUF *
|
| 1699 | EFIAPI
|
| 1700 | NetbufGetFragment (
|
| 1701 | IN NET_BUF *Nbuf,
|
| 1702 | IN UINT32 Offset,
|
| 1703 | IN UINT32 Len,
|
| 1704 | IN UINT32 HeadSpace
|
| 1705 | );
|
| 1706 |
|
| 1707 | /**
|
| 1708 | Reserve some space in the header room of the net buffer.
|
| 1709 |
|
| 1710 | Upon allocation, all the space is in the tail room of the buffer. Call this
|
| 1711 | function to move space to the header room. This function is quite limited
|
| 1712 | in that it can only reserve space from the first block of an empty NET_BUF not
|
| 1713 | built from the external. However, it should be enough for the network stack.
|
| 1714 |
|
| 1715 | @param[in, out] Nbuf The pointer to the net buffer.
|
| 1716 | @param[in] Len The length of buffer to be reserved from the header.
|
| 1717 |
|
| 1718 | **/
|
| 1719 | VOID
|
| 1720 | EFIAPI
|
| 1721 | NetbufReserve (
|
| 1722 | IN OUT NET_BUF *Nbuf,
|
| 1723 | IN UINT32 Len
|
| 1724 | );
|
| 1725 |
|
| 1726 | /**
|
| 1727 | Allocate Len bytes of space from the header or tail of the buffer.
|
| 1728 |
|
| 1729 | @param[in, out] Nbuf The pointer to the net buffer.
|
| 1730 | @param[in] Len The length of the buffer to be allocated.
|
| 1731 | @param[in] FromHead The flag to indicate whether to reserve the data
|
| 1732 | from head (TRUE) or tail (FALSE).
|
| 1733 |
|
| 1734 | @return The pointer to the first byte of the allocated buffer,
|
| 1735 | or NULL, if there is no sufficient space.
|
| 1736 |
|
| 1737 | **/
|
| 1738 | UINT8*
|
| 1739 | EFIAPI
|
| 1740 | NetbufAllocSpace (
|
| 1741 | IN OUT NET_BUF *Nbuf,
|
| 1742 | IN UINT32 Len,
|
| 1743 | IN BOOLEAN FromHead
|
| 1744 | );
|
| 1745 |
|
| 1746 | /**
|
| 1747 | Trim Len bytes from the header or the tail of the net buffer.
|
| 1748 |
|
| 1749 | @param[in, out] Nbuf The pointer to the net buffer.
|
| 1750 | @param[in] Len The length of the data to be trimmed.
|
| 1751 | @param[in] FromHead The flag to indicate whether trim data is from the
|
| 1752 | head (TRUE) or the tail (FALSE).
|
| 1753 |
|
| 1754 | @return The length of the actual trimmed data, which may be less
|
| 1755 | than Len if the TotalSize of Nbuf is less than Len.
|
| 1756 |
|
| 1757 | **/
|
| 1758 | UINT32
|
| 1759 | EFIAPI
|
| 1760 | NetbufTrim (
|
| 1761 | IN OUT NET_BUF *Nbuf,
|
| 1762 | IN UINT32 Len,
|
| 1763 | IN BOOLEAN FromHead
|
| 1764 | );
|
| 1765 |
|
| 1766 | /**
|
| 1767 | Copy Len bytes of data from the specific offset of the net buffer to the
|
| 1768 | destination memory.
|
| 1769 |
|
| 1770 | The Len bytes of data may cross several fragments of the net buffer.
|
| 1771 |
|
| 1772 | @param[in] Nbuf The pointer to the net buffer.
|
| 1773 | @param[in] Offset The sequence number of the first byte to copy.
|
| 1774 | @param[in] Len The length of the data to copy.
|
| 1775 | @param[in] Dest The destination of the data to copy to.
|
| 1776 |
|
| 1777 | @return The length of the actual copied data, or 0 if the offset
|
| 1778 | specified exceeds the total size of net buffer.
|
| 1779 |
|
| 1780 | **/
|
| 1781 | UINT32
|
| 1782 | EFIAPI
|
| 1783 | NetbufCopy (
|
| 1784 | IN NET_BUF *Nbuf,
|
| 1785 | IN UINT32 Offset,
|
| 1786 | IN UINT32 Len,
|
| 1787 | IN UINT8 *Dest
|
| 1788 | );
|
| 1789 |
|
| 1790 | /**
|
| 1791 | Build a NET_BUF from external blocks.
|
| 1792 |
|
| 1793 | A new NET_BUF structure will be created from external blocks. An additional block
|
| 1794 | of memory will be allocated to hold reserved HeadSpace bytes of header room
|
| 1795 | and existing HeadLen bytes of header, but the external blocks are shared by the
|
| 1796 | net buffer to avoid data copying.
|
| 1797 |
|
| 1798 | @param[in] ExtFragment The pointer to the data block.
|
| 1799 | @param[in] ExtNum The number of the data blocks.
|
| 1800 | @param[in] HeadSpace The head space to be reserved.
|
| 1801 | @param[in] HeadLen The length of the protocol header. The function
|
| 1802 | pulls this amount of data into a linear block.
|
| 1803 | @param[in] ExtFree The pointer to the caller-provided free function.
|
| 1804 | @param[in] Arg The argument passed to ExtFree when ExtFree is
|
| 1805 | called.
|
| 1806 |
|
| 1807 | @return The pointer to the net buffer built from the data blocks,
|
| 1808 | or NULL if the allocation failed due to resource
|
| 1809 | limit.
|
| 1810 |
|
| 1811 | **/
|
| 1812 | NET_BUF *
|
| 1813 | EFIAPI
|
| 1814 | NetbufFromExt (
|
| 1815 | IN NET_FRAGMENT *ExtFragment,
|
| 1816 | IN UINT32 ExtNum,
|
| 1817 | IN UINT32 HeadSpace,
|
| 1818 | IN UINT32 HeadLen,
|
| 1819 | IN NET_VECTOR_EXT_FREE ExtFree,
|
| 1820 | IN VOID *Arg OPTIONAL
|
| 1821 | );
|
| 1822 |
|
| 1823 | /**
|
| 1824 | Build a fragment table to contain the fragments in the net buffer. This is the
|
| 1825 | opposite operation of the NetbufFromExt.
|
| 1826 |
|
| 1827 | @param[in] Nbuf Points to the net buffer.
|
| 1828 | @param[in, out] ExtFragment The pointer to the data block.
|
| 1829 | @param[in, out] ExtNum The number of the data blocks.
|
| 1830 |
|
| 1831 | @retval EFI_BUFFER_TOO_SMALL The number of non-empty blocks is bigger than
|
| 1832 | ExtNum.
|
| 1833 | @retval EFI_SUCCESS The fragment table was built successfully.
|
| 1834 |
|
| 1835 | **/
|
| 1836 | EFI_STATUS
|
| 1837 | EFIAPI
|
| 1838 | NetbufBuildExt (
|
| 1839 | IN NET_BUF *Nbuf,
|
| 1840 | IN OUT NET_FRAGMENT *ExtFragment,
|
| 1841 | IN OUT UINT32 *ExtNum
|
| 1842 | );
|
| 1843 |
|
| 1844 | /**
|
| 1845 | Build a net buffer from a list of net buffers.
|
| 1846 |
|
| 1847 | All the fragments will be collected from the list of NEW_BUF, and then a new
|
| 1848 | net buffer will be created through NetbufFromExt.
|
| 1849 |
|
| 1850 | @param[in] BufList A List of the net buffer.
|
| 1851 | @param[in] HeadSpace The head space to be reserved.
|
| 1852 | @param[in] HeaderLen The length of the protocol header. The function
|
| 1853 | pulls this amount of data into a linear block.
|
| 1854 | @param[in] ExtFree The pointer to the caller provided free function.
|
| 1855 | @param[in] Arg The argument passed to ExtFree when ExtFree is called.
|
| 1856 |
|
| 1857 | @return The pointer to the net buffer built from the list of net
|
| 1858 | buffers.
|
| 1859 |
|
| 1860 | **/
|
| 1861 | NET_BUF *
|
| 1862 | EFIAPI
|
| 1863 | NetbufFromBufList (
|
| 1864 | IN LIST_ENTRY *BufList,
|
| 1865 | IN UINT32 HeadSpace,
|
| 1866 | IN UINT32 HeaderLen,
|
| 1867 | IN NET_VECTOR_EXT_FREE ExtFree,
|
| 1868 | IN VOID *Arg OPTIONAL
|
| 1869 | );
|
| 1870 |
|
| 1871 | /**
|
| 1872 | Free a list of net buffers.
|
| 1873 |
|
| 1874 | @param[in, out] Head The pointer to the head of linked net buffers.
|
| 1875 |
|
| 1876 | **/
|
| 1877 | VOID
|
| 1878 | EFIAPI
|
| 1879 | NetbufFreeList (
|
| 1880 | IN OUT LIST_ENTRY *Head
|
| 1881 | );
|
| 1882 |
|
| 1883 | /**
|
| 1884 | Initiate the net buffer queue.
|
| 1885 |
|
| 1886 | @param[in, out] NbufQue The pointer to the net buffer queue to be initialized.
|
| 1887 |
|
| 1888 | **/
|
| 1889 | VOID
|
| 1890 | EFIAPI
|
| 1891 | NetbufQueInit (
|
| 1892 | IN OUT NET_BUF_QUEUE *NbufQue
|
| 1893 | );
|
| 1894 |
|
| 1895 | /**
|
| 1896 | Allocate and initialize a net buffer queue.
|
| 1897 |
|
| 1898 | @return The pointer to the allocated net buffer queue, or NULL if the
|
| 1899 | allocation failed due to resource limit.
|
| 1900 |
|
| 1901 | **/
|
| 1902 | NET_BUF_QUEUE *
|
| 1903 | EFIAPI
|
| 1904 | NetbufQueAlloc (
|
| 1905 | VOID
|
| 1906 | );
|
| 1907 |
|
| 1908 | /**
|
| 1909 | Free a net buffer queue.
|
| 1910 |
|
| 1911 | Decrease the reference count of the net buffer queue by one. The real resource
|
| 1912 | free operation isn't performed until the reference count of the net buffer
|
| 1913 | queue is decreased to 0.
|
| 1914 |
|
| 1915 | @param[in] NbufQue The pointer to the net buffer queue to be freed.
|
| 1916 |
|
| 1917 | **/
|
| 1918 | VOID
|
| 1919 | EFIAPI
|
| 1920 | NetbufQueFree (
|
| 1921 | IN NET_BUF_QUEUE *NbufQue
|
| 1922 | );
|
| 1923 |
|
| 1924 | /**
|
| 1925 | Remove a net buffer from the head in the specific queue and return it.
|
| 1926 |
|
| 1927 | @param[in, out] NbufQue The pointer to the net buffer queue.
|
| 1928 |
|
| 1929 | @return The pointer to the net buffer removed from the specific queue,
|
| 1930 | or NULL if there is no net buffer in the specific queue.
|
| 1931 |
|
| 1932 | **/
|
| 1933 | NET_BUF *
|
| 1934 | EFIAPI
|
| 1935 | NetbufQueRemove (
|
| 1936 | IN OUT NET_BUF_QUEUE *NbufQue
|
| 1937 | );
|
| 1938 |
|
| 1939 | /**
|
| 1940 | Append a net buffer to the net buffer queue.
|
| 1941 |
|
| 1942 | @param[in, out] NbufQue The pointer to the net buffer queue.
|
| 1943 | @param[in, out] Nbuf The pointer to the net buffer to be appended.
|
| 1944 |
|
| 1945 | **/
|
| 1946 | VOID
|
| 1947 | EFIAPI
|
| 1948 | NetbufQueAppend (
|
| 1949 | IN OUT NET_BUF_QUEUE *NbufQue,
|
| 1950 | IN OUT NET_BUF *Nbuf
|
| 1951 | );
|
| 1952 |
|
| 1953 | /**
|
| 1954 | Copy Len bytes of data from the net buffer queue at the specific offset to the
|
| 1955 | destination memory.
|
| 1956 |
|
| 1957 | The copying operation is the same as NetbufCopy, but applies to the net buffer
|
| 1958 | queue instead of the net buffer.
|
| 1959 |
|
| 1960 | @param[in] NbufQue The pointer to the net buffer queue.
|
| 1961 | @param[in] Offset The sequence number of the first byte to copy.
|
| 1962 | @param[in] Len The length of the data to copy.
|
| 1963 | @param[out] Dest The destination of the data to copy to.
|
| 1964 |
|
| 1965 | @return The length of the actual copied data, or 0 if the offset
|
| 1966 | specified exceeds the total size of net buffer queue.
|
| 1967 |
|
| 1968 | **/
|
| 1969 | UINT32
|
| 1970 | EFIAPI
|
| 1971 | NetbufQueCopy (
|
| 1972 | IN NET_BUF_QUEUE *NbufQue,
|
| 1973 | IN UINT32 Offset,
|
| 1974 | IN UINT32 Len,
|
| 1975 | OUT UINT8 *Dest
|
| 1976 | );
|
| 1977 |
|
| 1978 | /**
|
| 1979 | Trim Len bytes of data from the buffer queue and free any net buffer
|
| 1980 | that is completely trimmed.
|
| 1981 |
|
| 1982 | The trimming operation is the same as NetbufTrim but applies to the net buffer
|
| 1983 | queue instead of the net buffer.
|
| 1984 |
|
| 1985 | @param[in, out] NbufQue The pointer to the net buffer queue.
|
| 1986 | @param[in] Len The length of the data to trim.
|
| 1987 |
|
| 1988 | @return The actual length of the data trimmed.
|
| 1989 |
|
| 1990 | **/
|
| 1991 | UINT32
|
| 1992 | EFIAPI
|
| 1993 | NetbufQueTrim (
|
| 1994 | IN OUT NET_BUF_QUEUE *NbufQue,
|
| 1995 | IN UINT32 Len
|
| 1996 | );
|
| 1997 |
|
| 1998 |
|
| 1999 | /**
|
| 2000 | Flush the net buffer queue.
|
| 2001 |
|
| 2002 | @param[in, out] NbufQue The pointer to the queue to be flushed.
|
| 2003 |
|
| 2004 | **/
|
| 2005 | VOID
|
| 2006 | EFIAPI
|
| 2007 | NetbufQueFlush (
|
| 2008 | IN OUT NET_BUF_QUEUE *NbufQue
|
| 2009 | );
|
| 2010 |
|
| 2011 | /**
|
| 2012 | Compute the checksum for a bulk of data.
|
| 2013 |
|
| 2014 | @param[in] Bulk The pointer to the data.
|
| 2015 | @param[in] Len The length of the data, in bytes.
|
| 2016 |
|
| 2017 | @return The computed checksum.
|
| 2018 |
|
| 2019 | **/
|
| 2020 | UINT16
|
| 2021 | EFIAPI
|
| 2022 | NetblockChecksum (
|
| 2023 | IN UINT8 *Bulk,
|
| 2024 | IN UINT32 Len
|
| 2025 | );
|
| 2026 |
|
| 2027 | /**
|
| 2028 | Add two checksums.
|
| 2029 |
|
| 2030 | @param[in] Checksum1 The first checksum to be added.
|
| 2031 | @param[in] Checksum2 The second checksum to be added.
|
| 2032 |
|
| 2033 | @return The new checksum.
|
| 2034 |
|
| 2035 | **/
|
| 2036 | UINT16
|
| 2037 | EFIAPI
|
| 2038 | NetAddChecksum (
|
| 2039 | IN UINT16 Checksum1,
|
| 2040 | IN UINT16 Checksum2
|
| 2041 | );
|
| 2042 |
|
| 2043 | /**
|
| 2044 | Compute the checksum for a NET_BUF.
|
| 2045 |
|
| 2046 | @param[in] Nbuf The pointer to the net buffer.
|
| 2047 |
|
| 2048 | @return The computed checksum.
|
| 2049 |
|
| 2050 | **/
|
| 2051 | UINT16
|
| 2052 | EFIAPI
|
| 2053 | NetbufChecksum (
|
| 2054 | IN NET_BUF *Nbuf
|
| 2055 | );
|
| 2056 |
|
| 2057 | /**
|
| 2058 | Compute the checksum for TCP/UDP pseudo header.
|
| 2059 |
|
| 2060 | Src and Dst are in network byte order, and Len is in host byte order.
|
| 2061 |
|
| 2062 | @param[in] Src The source address of the packet.
|
| 2063 | @param[in] Dst The destination address of the packet.
|
| 2064 | @param[in] Proto The protocol type of the packet.
|
| 2065 | @param[in] Len The length of the packet.
|
| 2066 |
|
| 2067 | @return The computed checksum.
|
| 2068 |
|
| 2069 | **/
|
| 2070 | UINT16
|
| 2071 | EFIAPI
|
| 2072 | NetPseudoHeadChecksum (
|
| 2073 | IN IP4_ADDR Src,
|
| 2074 | IN IP4_ADDR Dst,
|
| 2075 | IN UINT8 Proto,
|
| 2076 | IN UINT16 Len
|
| 2077 | );
|
| 2078 |
|
| 2079 | /**
|
| 2080 | Compute the checksum for the TCP6/UDP6 pseudo header.
|
| 2081 |
|
| 2082 | Src and Dst are in network byte order, and Len is in host byte order.
|
| 2083 |
|
| 2084 | @param[in] Src The source address of the packet.
|
| 2085 | @param[in] Dst The destination address of the packet.
|
| 2086 | @param[in] NextHeader The protocol type of the packet.
|
| 2087 | @param[in] Len The length of the packet.
|
| 2088 |
|
| 2089 | @return The computed checksum.
|
| 2090 |
|
| 2091 | **/
|
| 2092 | UINT16
|
| 2093 | EFIAPI
|
| 2094 | NetIp6PseudoHeadChecksum (
|
| 2095 | IN EFI_IPv6_ADDRESS *Src,
|
| 2096 | IN EFI_IPv6_ADDRESS *Dst,
|
| 2097 | IN UINT8 NextHeader,
|
| 2098 | IN UINT32 Len
|
| 2099 | );
|
| 2100 |
|
| 2101 | /**
|
| 2102 | The function frees the net buffer which allocated by the IP protocol. It releases
|
| 2103 | only the net buffer and doesn't call the external free function.
|
| 2104 |
|
| 2105 | This function should be called after finishing the process of mIpSec->ProcessExt()
|
| 2106 | for outbound traffic. The (EFI_IPSEC2_PROTOCOL)->ProcessExt() allocates a new
|
| 2107 | buffer for the ESP, so there needs a function to free the old net buffer.
|
| 2108 |
|
| 2109 | @param[in] Nbuf The network buffer to be freed.
|
| 2110 |
|
| 2111 | **/
|
| 2112 | VOID
|
| 2113 | NetIpSecNetbufFree (
|
| 2114 | NET_BUF *Nbuf
|
| 2115 | );
|
| 2116 |
|
| 2117 | /**
|
| 2118 | This function obtains the system guid from the smbios table.
|
| 2119 |
|
| 2120 | @param[out] SystemGuid The pointer of the returned system guid.
|
| 2121 |
|
| 2122 | @retval EFI_SUCCESS Successfully obtained the system guid.
|
| 2123 | @retval EFI_NOT_FOUND Did not find the SMBIOS table.
|
| 2124 |
|
| 2125 | **/
|
| 2126 | EFI_STATUS
|
| 2127 | EFIAPI
|
| 2128 | NetLibGetSystemGuid (
|
| 2129 | OUT EFI_GUID *SystemGuid
|
| 2130 | );
|
| 2131 |
|
| 2132 | #endif
|