vpnengine/kmdserver/src/secpolpayload.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/kmdserver/src/secpolpayload.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,275 @@
+/*
+* Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Security policy module payload structures
+*
+*/
+
+
+#include <ext_hdr.h>
+#include <tcp_hdr.h>
+#include <udp_hdr.h>
+#include <icmp6_hdr.h>
+
+// CLASS HEADER
+#include "secpolpayload.h"
+
+// ======== LOCAL FUNCTIONS ========
+
+#ifdef _DEBUG
+static TInt IsShort( TDes &aStr, const TDesC &aName, TInt aMin, TInt aLength )
+    {
+    aStr.Append( aName );
+    if ( aMin <= aLength )
+        {
+        return 0;
+        }
+    aStr.Append(_L(".. truncated"));
+    return 1;
+    }
+#endif  
+
+// ======== MEMBER FUNCTIONS ========
+
+//
+// IPv4 HDR Dump routine
+//
+void THdrIP4::Dump( TDes &aStr, TInt /*aLength*/ )
+    {
+#ifndef _DEBUG
+    (void)aStr;
+#endif
+
+#ifdef _DEBUG
+    const TInt KMaxBufLength( 40 );
+    TBuf<KMaxBufLength> buf;
+    TInetAddr addr;
+
+    addr.SetAddress( SrcAddr() );
+    addr.OutputWithScope( buf );
+    aStr.Append( _L(" src=") );
+    aStr.Append( buf );
+    addr.SetAddress( DstAddr() );
+    addr.OutputWithScope( buf );
+    aStr.Append( _L(" dst=") );
+    aStr.Append( buf );
+#endif
+    }
+
+TBool THdrIP4::IsUnicast()
+    {
+    TInetAddr addr;
+    TUint32 ip4Addr = DstAddr();    
+    addr.SetAddress( ip4Addr );
+    TBool status = addr.IsUnicast();
+    if ( status != KErrNone )
+        {
+        //
+        // If at least 7 leftmost bits in address are set to 1 this
+        // address is interpreted to be IPv4 subnet broadcast
+        //
+        status = ( ( ip4Addr & 0x7f ) != 0x7f );
+        }   
+    return status;
+    }   
+
+//
+// IPv6 HDR Dump routine
+//
+void THdrIP6::Dump( TDes &aStr, TInt /*aLength*/ )
+    {
+#ifndef _DEBUG
+    (void)aStr;
+#endif
+
+#ifdef _DEBUG
+    const TInt KMaxBufLength( 40 );
+    TBuf<KMaxBufLength> buf;
+    TInetAddr addr;
+
+    addr.SetAddress( SrcAddr() );
+    addr.OutputWithScope( buf );
+    aStr.Append( _L(" src=") );
+    aStr.Append( buf );
+    addr.SetAddress( DstAddr() );
+    addr.OutputWithScope( buf );
+    aStr.Append( _L(" dst=") );
+    aStr.Append( buf );
+#endif
+    }
+
+TBool THdrIP6::IsUnicast()
+    {
+    TInetAddr addr;
+    addr.SetAddress( DstAddr() );
+    return addr.IsUnicast();
+    }
+
+TSecpolPayload::TSecpolPayload( const TUint8* aPtr )
+ : iRaw( aPtr )
+     {     
+     }
+
+void TSecpolPayload::Dump( TDes &aStr, TInt aLength, TInt aProtocol )
+    {
+#ifndef _DEBUG
+    (void)aStr;
+    (void)aLength;
+    (void)aProtocol;
+#endif
+
+#ifdef _DEBUG
+    for (;;)
+        {
+        TInt skip;
+        switch ( aProtocol )
+            {
+            case 50:    // ESP
+                if ( IsShort( aStr,
+                              _L(" ESP"),
+                              iESP->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                aStr.AppendFormat( _L("(spi=%x,seq=%d)"),
+                                    ByteOrder::Swap32( iESP->SPI() ),
+                                    iESP->Sequence() );
+                return; // Cannot go past ESP
+            case 51:
+                if ( IsShort( aStr,
+                              _L(" AH"),
+                              iAH->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                aStr.AppendFormat(_L("(spi=%x,seq=%d,protcol=%d)"),
+                        iAH->SPI(), iAH->Sequence(), iAH->NextHeader() );
+                skip = iAH->HeaderLength();
+                aProtocol = iAH->NextHeader();
+                break;  // AH
+            case 4:
+                if ( IsShort( aStr,
+                              _L(" IP4-in-IP"),
+                              iIP4->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                ((THdrIP4 *)iIP4)->Dump(aStr, aLength);
+                skip = iIP4->HeaderLength();
+                aProtocol = iIP4->Protocol();
+                break;
+            case 1: // Fall through
+            case 58:
+                if ( IsShort( aStr,
+                              _L(" ICMP"),
+                              iICMP->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                aStr.AppendFormat(_L("(type=%d,code=%d)"),
+                        iICMP->Type(), iICMP->Code() );
+                return;
+            case 6:
+                if ( IsShort( aStr,
+                              _L(" TCP"),
+                              iTCP->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                aStr.AppendFormat(_L("(src=%d,dst=%d)"),
+                    iTCP->SrcPort(), iTCP->DstPort());
+                return;
+            case 17:
+                if ( IsShort( aStr,
+                              _L(" UDP"),
+                              iUDP->MinHeaderLength(),
+                              aLength ) )
+                    return;
+                aStr.AppendFormat(_L("(src=%d,dst=%d)"),
+                    iUDP->SrcPort(), iUDP->DstPort());
+                return;
+            case KProtocolInet6Ipip:
+                if ( IsShort( aStr,
+                              _L(" IP6-in-IP"),
+                              iIP6->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                ((THdrIP6 *)iIP6)->Dump( aStr, aLength );
+                skip = iIP6->HeaderLength();
+                aProtocol = iIP6->NextHeader();
+                break;
+            case KProtocolInet6HopOptions:
+                if ( IsShort( aStr,
+                              _L(" HBH"),
+                              iOPT->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                skip = iOPT->HeaderLength();
+                aProtocol = iOPT->NextHeader();
+                break;
+            case KProtocolInet6RoutingHeader:
+                if ( IsShort( aStr,
+                              _L(" RTH"),
+                              iRTH->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                aProtocol = iRTH->NextHeader();
+                skip = iRTH->HeaderLength();
+                break;
+            case KProtocolInet6Fragment:
+                if ( IsShort( aStr,
+                              _L(" FRAG"),
+                              iFRH->MinHeaderLength(),
+                              aLength ) )
+                    {
+                    return;
+                    }
+                aStr.AppendFormat(_L("(prot=%d,id=%d,offset=%d)"),
+                    iFRH->NextHeader(), iFRH->Id(), iFRH->FragmentOffset());
+                if ( iFRH->MFlag() )
+                    {
+                    aStr.Append(_L(" More"));
+                    }
+                return;
+            case KProtocolInet6NoNextHeader:
+                aStr.AppendFormat(_L(" NNH"));
+                return;
+            case KProtocolInet6DestinationOptions:
+                if ( IsShort( aStr,
+                              _L(" DOP"),
+                              iOPT->MinHeaderLength(),
+                              aLength ) )
+                    return;
+                skip = iOPT->HeaderLength();
+                aProtocol = iOPT->NextHeader();
+                break;
+            default:
+                aStr.AppendFormat(_L(" protocol=%d"), aProtocol);
+                return;
+            }
+        aLength -= skip;
+        iRaw += skip;
+        }
+#endif      
+    }