+/**\r
+ To types of ICMP error which consist of ICMP header, IP header and original \r
+ datagram's data, get length from sum of ICMP header length, IP header length \r
+ and first 64 bits of datagram's data length.\r
+ \r
+ @param[in] IpHdr A pointer to EFI_IP4_HEADER.\r
+ \r
+ @return The ICMP error length.\r
+**/\r
+#define ICMP_ERRLEN(IpHdr) \\r
+ (sizeof(IP4_ICMP_HEAD) + EFI_IP4_HEADER_LEN(IpHdr) + 8)\r
+\r
+/**\r
+ Get the packet header from NET_BUF.\r
+ \r
+ @param[out] Buf A pointer to NET_BUF.\r
+ @param[in] Type Header type.\r
+ \r
+ @return The pointer to packet header.\r
+**/\r
+#define NET_PROTO_HDR(Buf, Type) ((Type *) ((Buf)->BlockOp[0].Head))\r
+\r
+ \r
+extern EFI_IP4_CONFIG_DATA mIp4IoDefaultIpConfigData;\r
+extern EFI_IP6_CONFIG_DATA mIp6IoDefaultIpConfigData;\r
+\r
+\r
+///\r
+/// This error will be delivered to the\r
+/// listening transportation layer protocol\r
+/// that consumes IpIO.\r
+///\r
+\r
+#define ICMP_ERR_UNREACH_NET 0\r
+#define ICMP_ERR_UNREACH_HOST 1\r
+#define ICMP_ERR_UNREACH_PROTOCOL 2\r
+#define ICMP_ERR_UNREACH_PORT 3\r
+#define ICMP_ERR_MSGSIZE 4\r
+#define ICMP_ERR_UNREACH_SRCFAIL 5\r
+#define ICMP_ERR_TIMXCEED_INTRANS 6\r
+#define ICMP_ERR_TIMXCEED_REASS 7\r
+#define ICMP_ERR_QUENCH 8\r
+#define ICMP_ERR_PARAMPROB 9\r
+\r
+#define ICMP6_ERR_UNREACH_NET 0\r
+#define ICMP6_ERR_UNREACH_HOST 1\r
+#define ICMP6_ERR_UNREACH_PROTOCOL 2\r
+#define ICMP6_ERR_UNREACH_PORT 3\r
+#define ICMP6_ERR_PACKAGE_TOOBIG 4\r
+#define ICMP6_ERR_TIMXCEED_HOPLIMIT 5\r
+#define ICMP6_ERR_TIMXCEED_REASS 6\r
+#define ICMP6_ERR_PARAMPROB_HEADER 7\r
+#define ICMP6_ERR_PARAMPROB_NEXHEADER 8\r
+#define ICMP6_ERR_PARAMPROB_IPV6OPTION 9\r
+\r
+///\r
+/// The helper struct for IpIoGetIcmpErrStatus(). It is for internal use only.\r
+///\r
+typedef struct {\r
+ BOOLEAN IsHard;\r
+ BOOLEAN Notify;\r
+} ICMP_ERROR_INFO;\r
+\r
+typedef union {\r
+ EFI_IP4_COMPLETION_TOKEN Ip4Token;\r
+ EFI_IP6_COMPLETION_TOKEN Ip6Token;\r
+} IP_IO_IP_COMPLETION_TOKEN;\r
+\r
+typedef union {\r
+ EFI_IP4_TRANSMIT_DATA Ip4TxData;\r
+ EFI_IP6_TRANSMIT_DATA Ip6TxData;\r
+} IP_IO_IP_TX_DATA;\r
+\r
+typedef union {\r
+ EFI_IP4_RECEIVE_DATA Ip4RxData;\r
+ EFI_IP6_RECEIVE_DATA Ip6RxData;\r
+} IP_IO_IP_RX_DATA;\r
+\r
+typedef union {\r
+ EFI_IP4_OVERRIDE_DATA Ip4OverrideData;\r
+ EFI_IP6_OVERRIDE_DATA Ip6OverrideData;\r
+} IP_IO_OVERRIDE;\r
+\r
+typedef union {\r
+ EFI_IP4_CONFIG_DATA Ip4CfgData;\r
+ EFI_IP6_CONFIG_DATA Ip6CfgData;\r
+} IP_IO_IP_CONFIG_DATA;\r
+\r
+typedef union {\r
+ EFI_IP4_HEADER *Ip4Hdr;\r
+ EFI_IP6_HEADER *Ip6Hdr;\r
+} IP_IO_IP_HEADER;\r
+\r
+typedef union {\r
+ IP4_ADDR SubnetMask;\r
+ UINT8 PrefixLength;\r
+} IP_IO_IP_MASK;\r