diff -r 000000000000 -r af10295192d8 networkprotocols/tcpipv4v6prt/src/in_fmly.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkprotocols/tcpipv4v6prt/src/in_fmly.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,159 @@ +// 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: +// in_fmly.cpp - internet protocol family +// + +#include "icmp6.h" +#include "ip6.h" +#include "udp.h" +#include "tcp.h" +#include "res.h" +#include "iface.h" +#include "in_fmly.h" +#include "rawip.h" + +// +// CProtocolFamilyInet6 +// ******************** +// Internal to this implementation, no need to be defined in headers! +// +class CProtocolFamilyInet6 : public CProtocolFamilyBase + { +public: + CProtocolFamilyInet6(); + virtual ~CProtocolFamilyInet6(); + + virtual TInt Install(); + virtual TUint ProtocolList(TServerProtocolDesc *& aProtocolList); + virtual CProtocolBase* NewProtocolL(TUint aSockType,TUint aProtocol); +private: + CIfManager *iInterfacer; // Interface Manager (created in Install()) + }; + + + + + + +// Force export of non-mangled name +extern "C" { IMPORT_C CProtocolFamilyBase *Install(void); } +EXPORT_C CProtocolFamilyBase *Install() + { + return new CProtocolFamilyInet6; + } + + + +void Panic(TInet6Panic aPanic) + { + _LIT(KTcpIp6, "TCPIP6"); + User::Panic(KTcpIp6, aPanic); + } + + +CProtocolFamilyInet6::CProtocolFamilyInet6() + { + } + +CProtocolFamilyInet6::~CProtocolFamilyInet6() + { + delete iInterfacer; + } + +// +// CProtocolFamilyInet6::Install +// ***************************** +// The "non-leaving" Install() is called from ESOCK +// +TInt CProtocolFamilyInet6::Install() + { + TRAPD(err, iInterfacer = CIfManager::NewL()); + return err; + } + + +TUint CProtocolFamilyInet6::ProtocolList(TServerProtocolDesc *& aProtocolList) + { + // This function should be a leaving fn + // apparently it is OK for it to leave + TServerProtocolDesc *p = new (ELeave) TServerProtocolDesc[8]; // Esock catches this leave + + IP6::Identify(p[0], KProtocolInet6Ip); + ICMP6::Identify(p[1], KProtocolInet6Icmp); + CProtocolUDP6::Describe(p[2]); + CProtocolTCP6::Describe(p[3]); + RES::Identify(p[4]); + // + // IPv4 versions of dual stack at end for the time being... + // + IP6::Identify(p[5], KProtocolInetIp); + ICMP6::Identify(p[6], KProtocolInetIcmp); + RAWIP::Identify(p[7]); + aProtocolList = p; + return 8; + } + +CProtocolBase* CProtocolFamilyInet6::NewProtocolL(TUint aSockType,TUint aProtocol) + { + if (iInterfacer) + { + // Is this test for Undefined protocol required? Does SocketServer + // already do this. Although, how can it know which of the datagram + // protocols (IP, IP6, ICMP, ICMP6 and UDP) is actually the preferred + // one...? -- msa + if (aProtocol == KUndefinedProtocol) + { + if (aSockType == KSockDatagram) + aProtocol = KProtocolInetUdp; + else if (aSockType == KSockStream) + aProtocol = KProtocolInetTcp; + else + goto no_support; + } + + switch (aProtocol) + { + case KProtocolInet6Ip: // IPv6 support for the dual stack + case KProtocolInetIp: // IPv4 support for the dual stack + if (aSockType == KSockDatagram) + return IP6::NewL(iInterfacer, aProtocol); + break; + case KProtocolInetRawIp: + if (aSockType == KSockRaw) + return RAWIP::NewL(); + break; + case KProtocolInet6Icmp: + case KProtocolInetIcmp: + if (aSockType == KSockDatagram) + return ICMP6::NewL(aProtocol); + break; + case KProtocolInetUdp: + if (aSockType == KSockDatagram) + return new (ELeave) CProtocolUDP6; + break; + case KProtocolInetTcp: + if (aSockType == KSockStream) + return new (ELeave) CProtocolTCP6; + break; + case KProtocolInet6Res: + return RES::NewL(iInterfacer); + default: + break; + } + } +no_support: + User::Leave(KErrNotSupported); + // NOTREACHED + return 0; // To keep compiler happy... + }