networkingtestandutils/networkingunittest/dummynif/hungrynif.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingtestandutils/networkingunittest/dummynif/hungrynif.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,96 @@
+// Copyright (c) 2003-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:
+// The implementation of the hungry nif (based on the dummy nif)
+// 
+//
+
+#include "hungrynif.h"
+#include <es_mbuf.h>
+
+/**
+ * IPv4 interface binder class
+ */
+
+CHungryIf4::CHungryIf4(CHungryIfLink& aLink) : CDummyIf4(aLink)
+	{
+	CDummyIfLog::Printf(_L("CHungryIf4::CHungryIf4()"));
+
+	// generate my local ip address (ip4) - will overwrite that generated in CDummyIf
+	iLocalAddressBase = KHungryNifLocalAddressBase; // also used later in control method
+	iLocalAddress = iLocalAddressBase + ((TUint32)this)%255;
+
+	iIfName.Format(_L("hungrynif[0x%08x]"), this);
+	}
+
+void CHungryIf4::Recv(RMBufChain& aPdu)
+	{
+
+	// the whole idea of this nif is that it swallows packets for them never 
+	// to be seen again, hence do nothing here :-)
+
+	// except... want the stack to take ownership of the packet so we don't get a 
+	// panic, break pckt first by changing the checksum so it doesn't make it thru
+	// the whole stack - presumably the stack destroys it
+	//
+	// Later Note: it is also possible to just do aPdu.Free() (as in IPv6 binder).
+	// However, this may change the timing as it would be much faster and may
+	// cause sensitive tests to be re-worked if they fail as a result.
+
+	TInet6HeaderIP4* ip4 = (TInet6HeaderIP4*) aPdu.First()->Next()->Ptr();
+
+	if ((TUint)ip4->Protocol() == KProtocolInetUdp)
+		{
+		TInet6HeaderUDP* udp = (TInet6HeaderUDP*) ip4->EndPtr();
+
+		CDummyIfLog::Printf(_L("CHungryIf4::Recv(...): UDP length %d, src port %d, dst port %d"),
+			udp->Length(), udp->SrcPort(), udp->DstPort());
+		}
+	else
+		CDummyIfLog::Printf(_L("CHungryIf4::Recv(...): IPv4 length %d, protocol %d"),
+			ip4->TotalLength(), ip4->Protocol());
+
+
+
+	// zero should be fine... assuming not zero already!
+	TInt checksum = ip4->Checksum();
+	if (checksum != 0)
+		ip4->SetChecksum(0);
+	else
+		ip4->SetChecksum(1); // some other value
+	iProtocol->Process(aPdu, (CProtocolBase*)this);
+	}
+
+/*
+ * The link class
+ */
+
+CHungryIfLink::CHungryIfLink(CNifIfFactory& aFactory)
+	: CDummyIfLink(aFactory)
+	{}
+
+CNifIfBase* CHungryIfLink::GetBinderL(const TDesC& aName)
+	{
+	CDummyIfLog::Printf(_L("CHungryIfLink::GetBinderL(%S)"), &aName);
+	_LIT(KDescIp6, "ip6");
+	if (aName.CompareF(KDescIp6) == 0)
+		{
+		iNifIf6 = new(ELeave) CHungryIf6(*this);
+		return iNifIf6;
+		}
+	else
+		{	// ip4
+		iNifIf4 = new(ELeave) CHungryIf4(*this);
+		return iNifIf4;
+		}
+	}