f9108665f82b59c99ac444815d75af51a14e46c7vboxsync/** @file
17bbfe820c22c3e599276890d8b7baa48c32abbbvboxsync IP6 internal functions and definitions to process the incoming packets.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
a49dafa13549ac5db76a3c7f5e44ba83485a1971vboxsync This program and the accompanying materials
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync are licensed and made available under the terms and conditions of the BSD License
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync which accompanies this distribution. The full text of the license may be found at
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync http://opensource.org/licenses/bsd-license.php.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync**/
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#ifndef __EFI_IP6_INPUT_H__
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define __EFI_IP6_INPUT_H__
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_MIN_HEADLEN 40
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_MAX_HEADLEN 120
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync///
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync/// 8(ESP header) + 16(max IV) + 16(max padding) + 2(ESP tail) + 12(max ICV) = 54
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync///
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_MAX_IPSEC_HEADLEN 54
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_ASSEMLE_HASH_SIZE 127
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync///
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync/// Lift time in seconds.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync///
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_FRAGMENT_LIFE 60
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_MAX_PACKET_SIZE 65535
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_GET_CLIP_INFO(Packet) ((IP6_CLIP_INFO *) ((Packet)->ProtoData))
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_ASSEMBLE_HASH(Dst, Src, Id) \
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync ((*((UINT32 *) (Dst)) + *((UINT32 *) (Src)) + (Id)) % IP6_ASSEMLE_HASH_SIZE)
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync#define IP6_RXDATA_WRAP_SIZE(NumFrag) \
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync (sizeof (IP6_RXDATA_WRAP) + sizeof (EFI_IP6_FRAGMENT_DATA) * ((NumFrag) - 1))
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync//
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// Per packet information for input process. LinkFlag specifies whether
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// the packet is received as Link layer unicast, multicast or broadcast.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// The CastType is the IP layer cast type, such as IP multicast or unicast.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// Start, End and Length are staffs used to assemble the packets. Start
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// is the sequence number of the first byte of data in the packet. Length
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// is the number of bytes of data. End = Start + Length, that is, the
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// sequence number of last byte + 1. Each assembled packet has a count down
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// life. If it isn't consumed before Life reaches zero, the packet is released.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync//
f9108665f82b59c99ac444815d75af51a14e46c7vboxsynctypedef struct {
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT32 LinkFlag;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync INT32 CastType;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync INT32 Start;
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync INT32 End;
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync INT32 Length;
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync UINT32 Life;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync EFI_STATUS Status;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT32 Id;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT16 HeadLen;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT8 NextHeader;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT8 LastFrag;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT32 FormerNextHeader;
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync} IP6_CLIP_INFO;
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync//
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// Structure used to assemble IP packets.
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync//
f9108665f82b59c99ac444815d75af51a14e46c7vboxsynctypedef struct {
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync LIST_ENTRY Link;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync LIST_ENTRY Fragments; // List of all the fragments of this packet
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync //
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync // Identity of one IP6 packet. Each fragment of a packet has
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync // the same (Dst, Src, Id).
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync //
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync EFI_IPv6_ADDRESS Dst;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync EFI_IPv6_ADDRESS Src;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT32 Id;
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT32 TotalLen;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync UINT32 CurLen;
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync UINT32 Life; // Count down life for the packet.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync EFI_IP6_HEADER *Head; // IP head of the first fragment
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync IP6_CLIP_INFO *Info; // Per packet information of the first fragment
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync NET_BUF *Packet; // The first fragment of the packet
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync} IP6_ASSEMBLE_ENTRY;
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync//
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// Each Ip service instance has an assemble table to reassemble
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync// the packets before delivery to its children. It is organized
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync// as hash table.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync//
f9108665f82b59c99ac444815d75af51a14e46c7vboxsynctypedef struct {
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync LIST_ENTRY Bucket[IP6_ASSEMLE_HASH_SIZE];
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync} IP6_ASSEMBLE_TABLE;
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync/**
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync The IP6 input routine. It is called by the IP6_INTERFACE when an
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync IP6 fragment is received from MNP.
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in] Packet The IP6 packet received.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in] IoStatus The return status of receive request.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in] Flag The link layer flag for the packet received, such
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync as multicast.
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync @param[in] Context The IP6 service instance that own the MNP.
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync**/
f9108665f82b59c99ac444815d75af51a14e46c7vboxsyncVOID
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsyncIp6AcceptFrame (
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync IN NET_BUF *Packet,
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync IN EFI_STATUS IoStatus,
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync IN UINT32 Flag,
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync IN VOID *Context
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync );
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync/**
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync Deliver the received packets to upper layer if there are both received
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync requests and enqueued packets. If the enqueued packet is shared, it will
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync duplicate it to a non-shared packet, release the shared packet, then
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync deliver the non-shared packet up.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @param[in] IpInstance The IP child to deliver the packet up.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate resources to deliver the
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync packets.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @retval EFI_SUCCESS All the enqueued packets that can be delivered
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync are delivered up.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync**/
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsyncEFI_STATUS
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsyncIp6InstanceDeliverPacket (
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync IN IP6_PROTOCOL *IpInstance
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync );
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync/**
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync The work function to locate the IPsec protocol to process the inbound or
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync outbound IP packets. The process routine handles the packet with the following
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync actions: bypass the packet, discard the packet, or protect the packet.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @param[in] IpSb The IP6 service instance.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @param[in, out] Head The caller-supplied IP6 header.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @param[in, out] LastHead The next header field of last IP header.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @param[in, out] Netbuf The IP6 packet to be processed by IPsec.
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync @param[in, out] ExtHdrs The caller-supplied options.
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync @param[in, out] ExtHdrsLen The length of the option.
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync @param[in] Direction The directionality in an SPD entry,
dbea238999d6a4b34b9d1bdd1292e29717dd14bevboxsync EfiIPsecInBound, or EfiIPsecOutBound.
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync @param[in] Context The token's wrap.
f72cbd6a549c34992fa79cce84600fe2b92b3299vboxsync
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync @retval EFI_SUCCESS The IPsec protocol is not available or disabled.
66ea7017a123b8b854e76bbfd919a320815058b3vboxsync @retval EFI_SUCCESS The packet was bypassed, and all buffers remain the same.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @retval EFI_SUCCESS The packet was protected.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @retval EFI_ACCESS_DENIED The packet was discarded.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @retval EFI_OUT_OF_RESOURCES There are not suffcient resources to complete the operation.
7a18d4bae4d9ff1216be13970ae7815604b3365bvboxsync @retval EFI_BUFFER_TOO_SMALL The number of non-empty blocks is bigger than the
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync number of input data blocks when building a fragment table.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync**/
628ddfbd43ad5365d69fddda4007598242956577vboxsyncEFI_STATUS
5364452eae1726b30b3af49a60c33b189da75494vboxsyncIp6IpSecProcessPacket (
5364452eae1726b30b3af49a60c33b189da75494vboxsync IN IP6_SERVICE *IpSb,
5364452eae1726b30b3af49a60c33b189da75494vboxsync IN OUT EFI_IP6_HEADER **Head,
5364452eae1726b30b3af49a60c33b189da75494vboxsync IN OUT UINT8 *LastHead,
5364452eae1726b30b3af49a60c33b189da75494vboxsync IN OUT NET_BUF **Netbuf,
af94231fb372dbcb6413fb0e4a6d8a82d0412fb3vboxsync IN OUT UINT8 **ExtHdrs,
5364452eae1726b30b3af49a60c33b189da75494vboxsync IN OUT UINT32 *ExtHdrsLen,
5364452eae1726b30b3af49a60c33b189da75494vboxsync IN EFI_IPSEC_TRAFFIC_DIR Direction,
5364452eae1726b30b3af49a60c33b189da75494vboxsync IN VOID *Context
5364452eae1726b30b3af49a60c33b189da75494vboxsync );
5364452eae1726b30b3af49a60c33b189da75494vboxsync
5364452eae1726b30b3af49a60c33b189da75494vboxsync/**
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync Initialize an already allocated assemble table. This is generally
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync the assemble table embedded in the IP6 service instance.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
628ddfbd43ad5365d69fddda4007598242956577vboxsync @param[in, out] Table The assemble table to initialize.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
e081d2eefdae89dce06cd6451f0ce45bf023e6e3vboxsync**/
f9108665f82b59c99ac444815d75af51a14e46c7vboxsyncVOID
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsyncIp6CreateAssembleTable (
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync IN OUT IP6_ASSEMBLE_TABLE *Table
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync );
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync/**
dbea238999d6a4b34b9d1bdd1292e29717dd14bevboxsync Clean up the assemble table: remove all the fragments
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync and assemble entries.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in, out] Table The assemble table to clean up.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync**/
f9108665f82b59c99ac444815d75af51a14e46c7vboxsyncVOID
f9108665f82b59c99ac444815d75af51a14e46c7vboxsyncIp6CleanAssembleTable (
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync IN OUT IP6_ASSEMBLE_TABLE *Table
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync );
dbea238999d6a4b34b9d1bdd1292e29717dd14bevboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync/**
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync Demultiple the packet. the packet delivery is processed in two
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync passes. The first pass will enque a shared copy of the packet
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync to each IP6 child that accepts the packet. The second pass will
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync deliver a non-shared copy of the packet to each IP6 child that
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync has pending receive requests. Data is copied if more than one
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync child wants to consume the packet bacause each IP child need
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync its own copy of the packet to make changes.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in] IpSb The IP6 service instance that received the packet.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in] Head The header of the received packet.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in] Packet The data of the received packet.
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @retval EFI_NOT_FOUND No IP child accepts the packet.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @retval EFI_SUCCESS The packet is enqueued or delivered to some IP
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync children.
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync**/
f9108665f82b59c99ac444815d75af51a14e46c7vboxsyncEFI_STATUS
f9108665f82b59c99ac444815d75af51a14e46c7vboxsyncIp6Demultiplex (
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync IN IP6_SERVICE *IpSb,
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync IN EFI_IP6_HEADER *Head,
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync IN NET_BUF *Packet
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync );
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync/**
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync Timeout the fragmented, enqueued, and transmitted packets.
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync @param[in] IpSb The IP6 service instance to timeout.
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
f9108665f82b59c99ac444815d75af51a14e46c7vboxsync**/
f9108665f82b59c99ac444815d75af51a14e46c7vboxsyncVOID
29830933677ee9718064e760adf8462b6e79ffdevboxsyncIp6PacketTimerTicking (
29830933677ee9718064e760adf8462b6e79ffdevboxsync IN IP6_SERVICE *IpSb
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync );
9fe7370f586fb762a5387f0efa192b1fd9d20af2vboxsync
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync#endif
dcea3eadf1ecc8f4ac868185a05a63be42a199e4vboxsync