linklayerprotocols/tundriver/src/tundriverprovision.cpp
branchRCL_3
changeset 63 425d8f4f7fa5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/tundriver/src/tundriverprovision.cpp	Wed Sep 15 00:18:51 2010 +0300
@@ -0,0 +1,310 @@
+/**
+*   Copyright (c) 2010 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:
+*   Provision implemtation for Ipv4 and Ipv6 binders for tundriver.
+* 
+*
+*/
+
+/**
+ @file tundriverprovision.cpp
+ @internalTechnology
+*/
+
+#include <comms-infras/ss_log.h>
+#include <in_sock.h>
+#include <comms-infras/metadata.h>
+#include <comms-infras/coremcpractivities.h>
+#include <comms-infras/ss_tiermanagerutils.h>
+#include "tundrivermcpr.h"
+#include "tundriverprovision.h"
+
+using namespace ESock;
+
+void CTunDriverProtoProvision::InitialiseConfigL(CCommsDatIapView* aIapView)
+/**
+* CTunDriverProtoProvision::InitialiseConfigL is called from TunDriver MCPR to initialze
+* tundriver with values from comms database.
+* @param aIapView
+* @returns 
+*/ 
+	{
+	ProvisionNetworkConfigL(aIapView);
+	}
+
+void CTunDriverProtoProvision::ProvisionNetworkConfigL(CCommsDatIapView* aIapView)
+/**
+* CTunDriverProtoProvision::ProvisionNetworkConfigL is called from TunDriver MCPR to identify 
+* tundriver is associated with protocol IPv4 or IPv6
+* @param aIapView
+* @returns 
+*/
+    {
+    HBufC* buf = NULL;
+    aIapView->GetTextL(KCDTIdLANIfNetworks, buf);
+    CleanupStack::PushL(buf);
+    if (buf->Length() == 0)
+        {
+        User::Leave(KErrCorrupt);
+        }
+
+    TPtrC16 networks;
+    networks.Set(*buf);
+    TPtrC16 current;
+    TUint32 order = 0;
+    TInt commaPos = 0;
+    while (commaPos != KErrNotFound)
+        {
+        commaPos = networks.LocateF(',');
+        if (commaPos == KErrNotFound)
+            {
+            // take all of string
+            current.Set(networks);
+            }
+        else
+            {
+            current.Set(networks.Ptr(), commaPos);
+            }
+
+        if (current.CompareF(_L("ip")) == KErrNone)
+            {
+            ProvisionIp4ConfigL(aIapView, order);
+            }
+#ifdef IPV6SUPPORT
+        else if (current.CompareF(_L("ip6")) == KErrNone)
+            {
+            ProvisionIp6ConfigL(aIapView, order);
+            }
+#endif
+        else
+            {
+            User::Leave(KErrCorrupt);
+            }
+
+        order++;
+        networks.Set(networks.Mid(commaPos+1));
+        }
+
+    CleanupStack::PopAndDestroy(buf);
+    }
+
+
+void CTunDriverProtoProvision::ProvisionIp4ConfigL(CCommsDatIapView* aIapView, TUint32 aOrder)
+/**
+* CTunDriverProtoProvision::ProvisionIp4ConfigL will initialize with IPv4 Header values
+* for tundriver IPv4 configuration. like IPaddress, NetMask, Gateway and DNS Address. 
+* @param aIapView
+* @returns 
+*/
+    {
+    iIp4Provision.SetOrder(aOrder);
+
+    // Read IP address configuration parameters
+    TBool serverRequired;
+    aIapView->GetBoolL(KCDTIdLANIpAddrFromServer, serverRequired);
+
+    TUint32 addr;
+    TInt err; 
+
+    iIp4Provision.SetLocalAddr(KInetAddrNone);
+    iIp4Provision.SetNetMask(KInetAddrNone);
+    iIp4Provision.SetDefGateway(KInetAddrNone);
+    iIp4Provision.SetPrimaryDns(KInetAddrNone);
+    iIp4Provision.SetSecondaryDns(KInetAddrNone);
+    if (!serverRequired)
+        {
+        CAgentMetaConnectionProvider::GetIp4AddrL(aIapView, KCDTIdLANIpAddr, addr);
+        TInetAddr v4MappedAddr;
+        v4MappedAddr.SetV4MappedAddress(addr);
+        iIp4Provision.SetLocalAddr(v4MappedAddr);
+        err = CAgentMetaConnectionProvider::GetIp4Addr(aIapView, KCDTIdLANIpNetMask, addr);
+        if (err == KErrNone)
+            {
+            v4MappedAddr.SetV4MappedAddress(addr);
+            iIp4Provision.SetNetMask(v4MappedAddr);
+            }
+
+        err = CAgentMetaConnectionProvider::GetIp4Addr(aIapView, KCDTIdLANIpGateway, addr);
+        if (err == KErrNone)
+            {
+            v4MappedAddr.SetV4MappedAddress(addr);
+            iIp4Provision.SetDefGateway(v4MappedAddr);
+            }
+        else if (err == KErrNotFound || err == KErrArgument)
+            {
+            iIp4Provision.SetDefGateway(iIp4Provision.LocalAddr());
+            }
+        else
+            {
+            User::Leave(err);
+            }
+
+        // Because CommDB doesn't define a Broadcast Address field, we must
+        // calculate the broadcast address. This is based on the localAddr
+        // and the netMask.
+
+        TInetAddr localAddr;
+        localAddr.SetV4MappedAddress(iIp4Provision.LocalAddr().Address());
+        localAddr.SetPort(0);
+        TInetAddr netMask;
+        netMask.SetV4MappedAddress(iIp4Provision.NetMask().Address());
+        netMask.SetPort(0);
+        TInetAddr broadcast;
+        broadcast.SubNetBroadcast(localAddr, netMask);
+        iIp4Provision.SetBroadcastAddr(broadcast.Address());
+        }
+
+    aIapView->GetBoolL(KCDTIdLANIpDNSAddrFromServer, serverRequired);
+    if (!serverRequired)
+        {
+        err = CAgentMetaConnectionProvider::GetIp4Addr(aIapView, KCDTIdLANIpNameServer1, addr);
+        if (err == KErrNone)
+            {
+            TInetAddr primaryDns;
+            primaryDns.SetV4MappedAddress(addr);
+            iIp4Provision.SetPrimaryDns(primaryDns);
+            err = CAgentMetaConnectionProvider::GetIp4Addr(aIapView, KCDTIdLANIpNameServer2, addr);
+            if (err == KErrNone)
+                {
+                TInetAddr secondaryDns;
+                secondaryDns.SetV4MappedAddress(addr);
+                iIp4Provision.SetSecondaryDns(secondaryDns);
+                }
+            }
+
+        if (err != KErrNone && err != KErrNotFound && err != KErrArgument)
+            {
+            User::Leave(err);
+            }
+        }
+    }
+
+#ifdef IPV6SUPPORT
+void CTunDriverProtoProvision::ProvisionIp6ConfigL(CCommsDatIapView* aIapView, TUint32 aOrder)
+/**
+* CTunDriverProtoProvision::ProvisionIp6ConfigL will initialize with IPv4 Header values
+* for tundriver IPv6 configuration. like IPaddress, NetMask, Gateway and DNS Address. 
+* @param aIapView
+* @returns 
+*/
+    {
+    iIp6Provision.SetOrder(aOrder);
+
+    // Read IP address configuration parameters
+    TBool serverRequired;
+    aIapView->GetBoolL(KCDTIdLANIpAddrFromServer, serverRequired);
+
+    TIp6Addr addr;
+    TInetAddr inetAddress;
+    TInt err; 
+
+    iIp6Provision.SetLocalAddr(KInetAddrNone);
+    iIp6Provision.SetNetMask(KInetAddrNone);
+    iIp6Provision.SetDefGateway(KInetAddrNone);
+    iIp6Provision.SetPrimaryDns(KInetAddrNone);
+    iIp6Provision.SetSecondaryDns(KInetAddrNone);
+    if (!serverRequired)
+        {
+        CAgentMetaConnectionProvider::GetIp6AddrL(aIapView, KCDTIdLANIpAddr, addr);
+        inetAddress.SetAddress(addr);
+        iIp6Provision.SetLocalAddr(inetAddress);
+        err = CAgentMetaConnectionProvider::GetIp6Addr(aIapView, KCDTIdLANIpNetMask, addr);
+        if (err == KErrNone)
+            {
+            inetAddress.SetAddress(addr);
+            iIp6Provision.SetNetMask(inetAddress);
+            }
+        err = CAgentMetaConnectionProvider::GetIp6Addr(aIapView, KCDTIdLANIpGateway, addr);
+        if (err == KErrNone)
+            {
+            inetAddress.SetAddress(addr);
+            iIp6Provision.SetDefGateway(inetAddress);
+            }
+        else if (err == KErrNotFound || err == KErrArgument)
+            {
+            iIp6Provision.SetDefGateway(iIp6Provision.LocalAddr());
+            }
+        else
+            {
+            User::Leave(err);
+            }
+        err = CAgentMetaConnectionProvider::GetIp6Addr(aIapView, KCDTIdLANIpNameServer1, addr);
+        if(err == KErrNone)
+            {
+            inetAddress.SetAddress(addr);
+            iIp6Provision.SetPrimaryDns(inetAddress);
+            }
+        else
+            {
+            User::LeaveIfError(err);
+            }
+        err = CAgentMetaConnectionProvider::GetIp6Addr(aIapView, KCDTIdLANIpNameServer2, addr);
+        if(err == KErrNone)
+            {
+            inetAddress.SetAddress(addr);
+            iIp6Provision.SetSecondaryDns(inetAddress);
+            }
+        else
+            {
+            User::LeaveIfError(err);
+            }
+        // Because CommDB doesn't define a Broadcast Address field, we must
+        // calculate the broadcast address. This is based on the localAddr
+        // and the netMask.
+
+        TInetAddr localAddr;
+        localAddr = iIp6Provision.LocalAddr();
+        localAddr.SetPort(0);
+        TInetAddr netMask;
+        netMask = iIp6Provision.NetMask();
+        netMask.SetPort(0);
+        TInetAddr broadcast;
+        broadcast.SubNetBroadcast(localAddr, netMask);
+        iIp6Provision.SetBroadcastAddr(broadcast);
+        }
+
+    iIp6Provision.SetPrimaryDns(KInetAddrNone);
+    iIp6Provision.SetSecondaryDns(KInetAddrNone);
+
+    aIapView->GetBoolL(KCDTIdLANIpDNSAddrFromServer, serverRequired);
+    if (!serverRequired)
+        {
+        err = CAgentMetaConnectionProvider::GetIp6Addr(aIapView, KCDTIdLANIpNameServer1, addr);
+        if (err == KErrNone)
+            {
+            inetAddress.SetAddress(addr);
+            iIp6Provision.SetPrimaryDns(inetAddress);
+            err = CAgentMetaConnectionProvider::GetIp6Addr(aIapView, KCDTIdLANIpNameServer2, addr);
+            if (err == KErrNone)
+                {
+                inetAddress.SetAddress(addr);
+                iIp6Provision.SetSecondaryDns(inetAddress);
+                }
+            }
+
+        if (err != KErrNone && err != KErrNotFound && err != KErrArgument)
+            {
+            User::Leave(err);
+            }
+        }
+    }
+#endif
+
+//
+// Attribute table for provisioning structures passed to CFProtocol
+//
+
+START_ATTRIBUTE_TABLE(CTunDriverProtoProvision, CTunDriverProtoProvision::EUid, CTunDriverProtoProvision::ETypeId)
+// no attributes defined as no serialisation takes place.
+END_ATTRIBUTE_TABLE()