]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6Input.h
Add NetworkPkg (P.UDK2010.UP3.Network.P1)
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6Input.h
diff --git a/NetworkPkg/Ip6Dxe/Ip6Input.h b/NetworkPkg/Ip6Dxe/Ip6Input.h
new file mode 100644 (file)
index 0000000..8594896
--- /dev/null
@@ -0,0 +1,235 @@
+/** @file\r
+  IP6 internal functions and definitions to process the incoming packets.\r
+\r
+  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+\r
+  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_IP6_INPUT_H__\r
+#define __EFI_IP6_INPUT_H__\r
+\r
+#define IP6_MIN_HEADLEN       40\r
+#define IP6_MAX_HEADLEN       120\r
+///\r
+/// 8(ESP header) + 16(max IV) + 16(max padding) + 2(ESP tail) + 12(max ICV) = 54\r
+///\r
+#define IP6_MAX_IPSEC_HEADLEN 54\r
+\r
+\r
+#define IP6_ASSEMLE_HASH_SIZE 127\r
+///\r
+/// Lift time in seconds.\r
+///\r
+#define IP6_FRAGMENT_LIFE     60\r
+#define IP6_MAX_PACKET_SIZE   65535\r
+\r
+\r
+#define IP6_GET_CLIP_INFO(Packet) ((IP6_CLIP_INFO *) ((Packet)->ProtoData))\r
+\r
+#define IP6_ASSEMBLE_HASH(Dst, Src, Id)  \\r
+          ((*((UINT32 *) (Dst)) + *((UINT32 *) (Src)) + (Id)) % IP6_ASSEMLE_HASH_SIZE)\r
+\r
+#define IP6_RXDATA_WRAP_SIZE(NumFrag) \\r
+          (sizeof (IP6_RXDATA_WRAP) + sizeof (EFI_IP6_FRAGMENT_DATA) * ((NumFrag) - 1))\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
+  UINT32                    LinkFlag;\r
+  INT32                     CastType;\r
+  INT32                     Start;\r
+  INT32                     End;\r
+  INT32                     Length;\r
+  UINT32                    Life;\r
+  EFI_STATUS                Status;\r
+  UINT32                    Id;\r
+  UINT16                    HeadLen;\r
+  UINT8                     NextHeader;\r
+  UINT8                     LastFrag;\r
+  UINT32                    FormerNextHeader;\r
+} IP6_CLIP_INFO;\r
+\r
+//\r
+// Structure used to assemble IP packets.\r
+//\r
+typedef struct {\r
+  LIST_ENTRY                Link;\r
+  LIST_ENTRY                Fragments;  // List of all the fragments of this packet\r
+\r
+  //\r
+  // Identity of one IP6 packet. Each fragment of a packet has\r
+  // the same (Dst, Src, Id).\r
+  //\r
+  EFI_IPv6_ADDRESS          Dst;\r
+  EFI_IPv6_ADDRESS          Src;\r
+  UINT32                    Id;\r
+\r
+  UINT32                    TotalLen;\r
+  UINT32                    CurLen;\r
+  UINT32                    Life;       // Count down life for the packet.\r
+\r
+  EFI_IP6_HEADER            *Head;      // IP head of the first fragment\r
+  IP6_CLIP_INFO             *Info;      // Per packet information of the first fragment\r
+  NET_BUF                   *Packet;    // The first fragment of the packet\r
+} IP6_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[IP6_ASSEMLE_HASH_SIZE];\r
+} IP6_ASSEMBLE_TABLE;\r
+\r
+/**\r
+  The IP6 input routine. It is called by the IP6_INTERFACE when an\r
+  IP6 fragment is received from MNP.\r
+\r
+  @param[in]  Packet             The IP6 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 IP6 service instance that own the MNP.\r
+\r
+**/\r
+VOID\r
+Ip6AcceptFrame (\r
+  IN NET_BUF                *Packet,\r
+  IN EFI_STATUS             IoStatus,\r
+  IN UINT32                 Flag,\r
+  IN VOID                   *Context\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
+Ip6InstanceDeliverPacket (\r
+  IN IP6_PROTOCOL           *IpInstance\r
+  );\r
+\r
+/**\r
+  The work function to locate IPsec protocol to process the inbound or\r
+  outbound IP packets. The process routine handls the packet with the following\r
+  actions: bypass the packet, discard the packet, or protect the packet.\r
+\r
+  @param[in]       IpSb          The IP6 service instance.\r
+  @param[in]       Head          The caller supplied IP6 header.\r
+  @param[in, out]  LastHead      The next header field of last IP header.\r
+  @param[in, out]  Netbuf        The IP6 packet to be processed by IPsec.\r
+  @param[in]       ExtHdrs       The caller supplied options.\r
+  @param[in]       ExtHdrsLen    The length of the option.\r
+  @param[in]       Direction     The directionality in an SPD entry,\r
+                                 EfiIPsecInBound or EfiIPsecOutBound.\r
+  @param[in]       Context       The token's wrap.\r
+\r
+  @retval EFI_SUCCESS            The IPsec protocol is not available or disabled.\r
+  @retval EFI_SUCCESS            The packet was bypassed and all buffers remain the same.\r
+  @retval EFI_SUCCESS            The packet was protected.\r
+  @retval EFI_ACCESS_DENIED      The packet was discarded.\r
+  @retval EFI_OUT_OF_RESOURCES   There are not suffcient resources to complete the operation.\r
+  @retval EFI_BUFFER_TOO_SMALL   The number of non-empty block is bigger than the\r
+                                 number of input data blocks when building a fragment table.\r
+\r
+**/\r
+EFI_STATUS\r
+Ip6IpSecProcessPacket (\r
+  IN IP6_SERVICE            *IpSb,\r
+  IN EFI_IP6_HEADER         *Head,\r
+  IN OUT UINT8              *LastHead,\r
+  IN OUT NET_BUF            **Netbuf,\r
+  IN VOID                   *ExtHdrs,\r
+  IN UINT32                 ExtHdrsLen,\r
+  IN EFI_IPSEC_TRAFFIC_DIR  Direction,\r
+  IN VOID                   *Context\r
+  );\r
+\r
+/**\r
+  Initialize an already allocated assemble table. This is generally\r
+  the assemble table embedded in the IP6 service instance.\r
+\r
+  @param[in, out]  Table    The assemble table to initialize.\r
+\r
+**/\r
+VOID\r
+Ip6CreateAssembleTable (\r
+  IN OUT IP6_ASSEMBLE_TABLE *Table\r
+  );\r
+\r
+/**\r
+  Clean up the assemble table: remove all the fragments\r
+  and assemble entries.\r
+\r
+  @param[in, out]  Table    The assemble table to clean up.\r
+\r
+**/\r
+VOID\r
+Ip6CleanAssembleTable (\r
+  IN OUT IP6_ASSEMBLE_TABLE *Table\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 IP6 child that accepts the packet. The second pass will\r
+  deliver a non-shared copy of the packet to each IP6 child that\r
+  has pending receive requests. Data is copied if more than one\r
+  child wants to consume the packet bacause each IP child need\r
+  its own copy of the packet to make changes.\r
+\r
+  @param[in]  IpSb          The IP6 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
+Ip6Demultiplex (\r
+  IN IP6_SERVICE            *IpSb,\r
+  IN EFI_IP6_HEADER         *Head,\r
+  IN NET_BUF                *Packet\r
+  );\r
+\r
+/**\r
+  Timeout the fragmented, enqueued, and transmitted packets.\r
+\r
+  @param[in]  IpSb          The IP6 service instance to timeout.\r
+\r
+**/\r
+VOID\r
+Ip6PacketTimerTicking (\r
+  IN IP6_SERVICE            *IpSb\r
+  );\r
+\r
+#endif\r