-/** @file
-
-Copyright (c) 2005 - 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- Ip4Input.h
-
-Abstract:
-
-
-**/
-
-#ifndef __EFI_IP4_INPUT_H__
-#define __EFI_IP4_INPUT_H__
-
-enum {
- IP4_MIN_HEADLEN = 20,
- IP4_MAX_HEADLEN = 60,
-
- IP4_ASSEMLE_HASH_SIZE = 31,
- IP4_FRAGMENT_LIFE = 120,
- IP4_MAX_PACKET_SIZE = 65535
-};
-
-//
-// Per packet information for input process. LinkFlag specifies whether
-// the packet is received as Link layer unicast, multicast or broadcast.
-// The CastType is the IP layer cast type, such as IP multicast or unicast.
-// Start, End and Length are staffs used to assemble the packets. Start
-// is the sequence number of the first byte of data in the packet. Length
-// is the number of bytes of data. End = Start + Length, that is, the
-// sequence number of last byte + 1. Each assembled packet has a count down
-// life. If it isn't consumed before Life reaches zero, the packet is released.
-//
-typedef struct {
- UINTN LinkFlag;
- INTN CastType;
- INTN Start;
- INTN End;
- INTN Length;
- UINT32 Life;
- EFI_STATUS Status;
-} IP4_CLIP_INFO;
-
-//
-// Structure used to assemble IP packets.
-//
-typedef struct {
- NET_LIST_ENTRY Link;
-
- //
- // Identity of one IP4 packet. Each fragment of a packet has
- // the same (Dst, Src, Id, Protocol).
- //
- IP4_ADDR Dst;
- IP4_ADDR Src;
- UINT16 Id;
- UINT8 Protocol;
-
- INTN TotalLen;
- INTN CurLen;
- NET_LIST_ENTRY Fragments; // List of all the fragments of this packet
-
- IP4_HEAD *Head; // IP head of the first fragment
- IP4_CLIP_INFO *Info; // Per packet info of the first fragment
- INTN Life; // Count down life for the packet.
-} IP4_ASSEMBLE_ENTRY;
-
-//
-// Each Ip service instance has an assemble table to reassemble
-// the packets before delivery to its children. It is organized
-// as hash table.
-//
-typedef struct {
- NET_LIST_ENTRY Bucket[IP4_ASSEMLE_HASH_SIZE];
-} IP4_ASSEMBLE_TABLE;
-
-#define IP4_GET_CLIP_INFO(Packet) ((IP4_CLIP_INFO *) ((Packet)->ProtoData))
-
-#define IP4_ASSEMBLE_HASH(Dst, Src, Id, Proto) \
- (((Dst) + (Src) + ((Id) << 16) + (Proto)) % IP4_ASSEMLE_HASH_SIZE)
-
-#define IP4_RXDATA_WRAP_SIZE(NumFrag) \
- (sizeof (IP4_RXDATA_WRAP) + sizeof (EFI_IP4_FRAGMENT_DATA) * ((NumFrag) - 1))
-
-VOID
-Ip4InitAssembleTable (
- IN IP4_ASSEMBLE_TABLE *Table
- );
-
-VOID
-Ip4CleanAssembleTable (
- IN IP4_ASSEMBLE_TABLE *Table
- );
-
-VOID
-Ip4AccpetFrame (
- IN IP4_PROTOCOL *Ip4Instance,
- IN NET_BUF *Packet,
- IN EFI_STATUS IoStatus,
- IN UINT32 Flag,
- IN VOID *Context
- );
-
-EFI_STATUS
-Ip4Demultiplex (
- IN IP4_SERVICE *SbInstance,
- IN IP4_HEAD *Head,
- IN NET_BUF *Packet
- );
-
-INTN
-Ip4InterfaceEnquePacket (
- IN IP4_SERVICE *SbInstance,
- IN IP4_HEAD *Head,
- IN NET_BUF *Packet,
- IN IP4_INTERFACE *Interface
- );
-
-EFI_STATUS
-Ip4InstanceDeliverPacket (
- IN IP4_PROTOCOL *Ip4Instance
- );
-
-VOID
-Ip4PacketTimerTicking (
- IN IP4_SERVICE *IpSb
- );
-
-#endif
+/** @file\r
+\r
+Copyright (c) 2005 - 2009, Intel Corporation.<BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EFI_IP4_INPUT_H__\r
+#define __EFI_IP4_INPUT_H__\r
+\r
+#define IP4_MIN_HEADLEN 20\r
+#define IP4_MAX_HEADLEN 60\r
+\r
+#define IP4_ASSEMLE_HASH_SIZE 31\r
+#define IP4_FRAGMENT_LIFE 120\r
+#define IP4_MAX_PACKET_SIZE 65535\r
+\r
+///\r
+/// Per packet information for input process. LinkFlag specifies whether\r
+/// the packet is received as Link layer unicast, multicast or broadcast.\r
+/// The CastType is the IP layer cast type, such as IP multicast or unicast.\r
+/// Start, End and Length are staffs used to assemble the packets. Start\r
+/// is the sequence number of the first byte of data in the packet. Length\r
+/// is the number of bytes of data. End = Start + Length, that is, the\r
+/// sequence number of last byte + 1. Each assembled packet has a count down\r
+/// life. If it isn't consumed before Life reaches zero, the packet is released.\r
+///\r
+typedef struct {\r
+ UINTN LinkFlag;\r
+ INTN CastType;\r
+ INTN Start;\r
+ INTN End;\r
+ INTN Length;\r
+ UINT32 Life;\r
+ EFI_STATUS Status;\r
+} IP4_CLIP_INFO;\r
+\r
+///\r
+/// Structure used to assemble IP packets.\r
+///\r
+typedef struct {\r
+ LIST_ENTRY Link;\r
+\r
+ //\r
+ // Identity of one IP4 packet. Each fragment of a packet has\r
+ // the same (Dst, Src, Id, Protocol).\r
+ //\r
+ IP4_ADDR Dst;\r
+ IP4_ADDR Src;\r
+ UINT16 Id;\r
+ UINT8 Protocol;\r
+\r
+ INTN TotalLen;\r
+ INTN CurLen;\r
+ LIST_ENTRY Fragments; // List of all the fragments of this packet\r
+\r
+ IP4_HEAD *Head; // IP head of the first fragment\r
+ IP4_CLIP_INFO *Info; // Per packet info of the first fragment\r
+ INTN Life; // Count down life for the packet.\r
+} IP4_ASSEMBLE_ENTRY;\r
+\r
+///\r
+/// Each Ip service instance has an assemble table to reassemble\r
+/// the packets before delivery to its children. It is organized\r
+/// as hash table.\r
+///\r
+typedef struct {\r
+ LIST_ENTRY Bucket[IP4_ASSEMLE_HASH_SIZE];\r
+} IP4_ASSEMBLE_TABLE;\r
+\r
+#define IP4_GET_CLIP_INFO(Packet) ((IP4_CLIP_INFO *) ((Packet)->ProtoData))\r
+\r
+#define IP4_ASSEMBLE_HASH(Dst, Src, Id, Proto) \\r
+ (((Dst) + (Src) + ((Id) << 16) + (Proto)) % IP4_ASSEMLE_HASH_SIZE)\r
+\r
+#define IP4_RXDATA_WRAP_SIZE(NumFrag) \\r
+ (sizeof (IP4_RXDATA_WRAP) + sizeof (EFI_IP4_FRAGMENT_DATA) * ((NumFrag) - 1))\r
+\r
+/**\r
+ Initialize an already allocated assemble table. This is generally\r
+ the assemble table embedded in the IP4 service instance.\r
+\r
+ @param[in, out] Table The assemble table to initialize.\r
+\r
+**/\r
+VOID\r
+Ip4InitAssembleTable (\r
+ IN OUT IP4_ASSEMBLE_TABLE *Table\r
+ );\r
+\r
+/**\r
+ Clean up the assemble table: remove all the fragments\r
+ and assemble entries.\r
+\r
+ @param[in] Table The assemble table to clean up\r
+\r
+**/\r
+VOID\r
+Ip4CleanAssembleTable (\r
+ IN IP4_ASSEMBLE_TABLE *Table\r
+ );\r
+\r
+/**\r
+ The IP4 input routine. It is called by the IP4_INTERFACE when a\r
+ IP4 fragment is received from MNP.\r
+\r
+ @param[in] Ip4Instance The IP4 child that request the receive, most like\r
+ it is NULL.\r
+ @param[in] Packet The IP4 packet received.\r
+ @param[in] IoStatus The return status of receive request.\r
+ @param[in] Flag The link layer flag for the packet received, such\r
+ as multicast.\r
+ @param[in] Context The IP4 service instance that own the MNP.\r
+\r
+**/\r
+VOID\r
+Ip4AccpetFrame (\r
+ IN IP4_PROTOCOL *Ip4Instance,\r
+ IN NET_BUF *Packet,\r
+ IN EFI_STATUS IoStatus,\r
+ IN UINT32 Flag,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Demultiple the packet. the packet delivery is processed in two\r
+ passes. The first pass will enque a shared copy of the packet\r
+ to each IP4 child that accepts the packet. The second pass will\r
+ deliver a non-shared copy of the packet to each IP4 child that\r
+ has pending receive requests. Data is copied if more than one\r
+ child wants to consume the packet because each IP child needs\r
+ its own copy of the packet to make changes.\r
+\r
+ @param[in] IpSb The IP4 service instance that received the packet\r
+ @param[in] Head The header of the received packet\r
+ @param[in] Packet The data of the received packet\r
+\r
+ @retval EFI_NOT_FOUND No IP child accepts the packet\r
+ @retval EFI_SUCCESS The packet is enqueued or delivered to some IP\r
+ children.\r
+\r
+**/\r
+EFI_STATUS\r
+Ip4Demultiplex (\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet\r
+ );\r
+\r
+/**\r
+ Enqueue a received packet to all the IP children that share\r
+ the same interface.\r
+\r
+ @param[in] IpSb The IP4 service instance that receive the packet\r
+ @param[in] Head The header of the received packet\r
+ @param[in] Packet The data of the received packet\r
+ @param[in] IpIf The interface to enqueue the packet to\r
+\r
+ @return The number of the IP4 children that accepts the packet\r
+\r
+**/\r
+INTN\r
+Ip4InterfaceEnquePacket (\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet,\r
+ IN IP4_INTERFACE *IpIf\r
+ );\r
+\r
+/**\r
+ Deliver the received packets to upper layer if there are both received\r
+ requests and enqueued packets. If the enqueued packet is shared, it will\r
+ duplicate it to a non-shared packet, release the shared packet, then\r
+ deliver the non-shared packet up.\r
+\r
+ @param[in] IpInstance The IP child to deliver the packet up.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resources to deliver the\r
+ packets.\r
+ @retval EFI_SUCCESS All the enqueued packets that can be delivered\r
+ are delivered up.\r
+\r
+**/\r
+EFI_STATUS\r
+Ip4InstanceDeliverPacket (\r
+ IN IP4_PROTOCOL *IpInstance\r
+ );\r
+\r
+/**\r
+ Timeout the fragment and enqueued packets.\r
+\r
+ @param[in] IpSb The IP4 service instance to timeout\r
+\r
+**/\r
+VOID\r
+Ip4PacketTimerTicking (\r
+ IN IP4_SERVICE *IpSb\r
+ );\r
+\r
+#endif\r