networkingtestandutils/ipv6to4tunnel/src/6to4_listener.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingtestandutils/ipv6to4tunnel/src/6to4_listener.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,147 @@
+// Copyright (c) 2004-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:
+// Name        : 6to4_listener.cpp
+// Part of     : 6to4 plugin / 6to4.prt
+// Implements 6to4 automatic and configured tunnels, see
+// RFC 3056 & RFC 2893
+// Version     : 0.2
+//
+
+
+
+
+// INCLUDE FILES
+#include <inet6log.h>
+#include <in6_opt.h>
+#include "6to4_listener.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES  
+// CONSTANTS
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// UpdateAddress
+// ----------------------------------------------------------------------------
+static void UpdateAddress(MInterfaceManager &aIfMgr, const TIp6Addr &aAddr, TBool aDelete)
+	{
+	// Add or delete address to/from 6to4 interface
+	TPckgBuf<TSoInet6InterfaceInfo> opt;
+	TSoInet6InterfaceInfo &inf = opt();
+	inf.iName = K6to4;
+	inf.iDoState = 0;
+	inf.iDoId = 1;
+	inf.iDoPrefix = 0;
+	inf.iDoAnycast = 0;
+	inf.iDoProxy = 0;
+	inf.iAlias = 0;
+	inf.iDelete = aDelete;
+	inf.iAddress.SetAddress(aAddr);
+	inf.iDefGate.SetFamily(0);
+	inf.iNetMask.SetFamily(0);
+	inf.iNameSer1.SetFamily(0);
+	inf.iNameSer2.SetFamily(0);
+	inf.iMtu = 0;
+	inf.iSpeedMetric = 0;
+
+	const TInt res = aIfMgr.SetOption(KSolInetIfCtrl, KSoInetConfigInterface, opt);
+#ifdef _LOG
+	_LIT(KDelete, "Deleted");
+	_LIT(KAdded,  "Added");
+	TBuf<70> tmp;
+	inf.iAddress.Output(tmp);
+	Log::Printf(_L("%S 6to4 address %S (result=%d)"), aDelete ? &KDelete() : &KAdded(), &tmp, res);
+#else
+	(void)res;	// (silence unused warning)
+#endif
+	}
+
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+C6to4Listener::C6to4Listener (MNetworkService *const aNetwork, MEventService &aService) :
+	 CBase (), iNetwork(aNetwork), iService(aService)
+	{
+	// Register the listener to get the events when addresses are added/deleted
+	// to/from an interface.
+	iService.RegisterListener (this, EClassAddress);
+	}
+
+C6to4Listener::~C6to4Listener()
+	{
+	// Unregister the listener to not get the events anymore when addresses
+	// are added/deleted to/from an interface.
+	iService.RemoveListener (this);
+	}
+
+// ----------------------------------------------------------------------------
+// C6to4Listener::Notify
+// Notification handler. Handles interface address addings and deletions.
+// 
+// ----------------------------------------------------------------------------
+//
+void C6to4Listener::Notify (TUint aEventClass, TUint aEventType,
+							const void *aData)
+	{
+	if (aEventClass == EClassAddress)
+		{
+		TInetAddressInfo *info = (TInetAddressInfo *) aData;
+
+		if (info->iPrefixLen != 0 || !info->iAddress.IsV4Mapped())
+			// Only interested in IPv4 addressess
+			return;
+
+		const TBool remove = aEventType == EventTypeDelete;
+		if (!remove && aEventType != EventTypeAdd)
+			return;
+		
+		// Only Delete or Add events processed
+
+		// Build the ip address for the 6to4 virtual interface
+		// and just for automatic tunnels, since the 6to4 address
+		// for each interface IPv4 address has to be known by the 
+		// system for it to accept the packet.
+
+		TIp6Addr addr;
+		addr.u.iAddr8[0] = 0x20;
+		addr.u.iAddr8[1] = 0x02;
+		addr.u.iAddr8[2] = info->iAddress.u.iAddr8[12];
+		addr.u.iAddr8[3] = info->iAddress.u.iAddr8[13];
+		addr.u.iAddr8[4] = info->iAddress.u.iAddr8[14];
+		addr.u.iAddr8[5] = info->iAddress.u.iAddr8[15];
+		addr.u.iAddr8[6] = 0;
+		addr.u.iAddr8[7] = 0;
+		addr.u.iAddr8[8] = 0;
+		addr.u.iAddr8[9] = 0;
+		addr.u.iAddr8[10] = 0;
+		addr.u.iAddr8[11] = 0;
+		addr.u.iAddr8[12] = 0;
+		addr.u.iAddr8[13] = 0;
+		addr.u.iAddr8[14] = 0;
+		addr.u.iAddr8[15] = 1;
+
+		UpdateAddress(*NetworkService ()->Interfacer (), addr, remove);
+		}
+	}
+
+
+// ========================== OTHER EXPORTED FUNCTIONS ========================
+
+//  End of File