linklayerprotocols/pppnif/SPPP/ncpip6.cpp
changeset 0 af10295192d8
equal deleted inserted replaced
-1:000000000000 0:af10295192d8
       
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include <e32hal.h>	// UserHal::MachineInfo()
       
    17 #include <in_sock.h> // IPv6 enhanced in_sock.h: KProtocolInet6Ip
       
    18 #include <in6_if.h>	// KSoIface*, KIf*
       
    19 #include "ncpip6.h"	// This
       
    20 #include "ncpip.h" // for KSlashChar
       
    21 #include "PPPLOG.H"
       
    22 #include "PppProg.h"
       
    23 #include <commsdattypeinfov1_1.h>
       
    24 #include <networking/pppconfig.h>
       
    25 
       
    26 using namespace ESock;
       
    27 
       
    28 #if defined(__VC32__) && (_MSC_VER < 1300)
       
    29  #define PMF(x) x
       
    30 #else
       
    31  #define PMF(x) &x
       
    32 #endif
       
    33 
       
    34 #ifdef __FLOG_ACTIVE
       
    35 _LIT8(KNif,"Ppp");
       
    36 _LIT8(KPPPBinderIP6,"IP6");
       
    37 #endif
       
    38 
       
    39 #pragma warning (disable:4355)
       
    40 CPppBinderIp6::CPppBinderIp6(CPppLcp* aLcp)
       
    41 	:   MPppFsm(aLcp, EPppPhaseNetwork, KPppIdIp6cp),
       
    42         iPppNifSubConnectionFlow(aLcp),
       
    43 	    iIpRecvr(this, PMF(CPppBinderIp6::RecvIp), PMF(CPppBinderIp6::SendFlowOn), aLcp, EPppPhaseNetwork,
       
    44 			KPppIdIp6, PMF(CPppBinderIp6::Ip6FrameError), PMF(CPppBinderIp6::Ip6KillProtocol))
       
    45 {
       
    46 #if EPOC_SDK <= 0x06000000
       
    47 	__DECLARE_NAME(_S("CPppBinderIp6"));
       
    48 #endif
       
    49 	__DECLARE_FSM_NAME(_S("IP6CP"));
       
    50     __FLOG_OPEN(KNif, KPPPBinderIP6);
       
    51     __FLOG_2(_L8("this:%08x\tCPppBinderIp4::CPppBinderIp6(CPppLcp& %08x)"), this, &iPppNifSubConnectionFlow);
       
    52 
       
    53 }
       
    54 #pragma warning (default:4355)
       
    55 
       
    56 CPppBinderIp6* CPppBinderIp6::NewL(CPppLcp* aLcp)
       
    57 	{
       
    58 	CPppBinderIp6* pppBinderIp6 = new(ELeave) CPppBinderIp6(aLcp);
       
    59 	CleanupStack::PushL(pppBinderIp6);
       
    60 	pppBinderIp6->ConstructL();
       
    61 	CleanupStack::Pop(pppBinderIp6);
       
    62 	return pppBinderIp6;
       
    63 	}
       
    64 
       
    65 CPppBinderIp6::~CPppBinderIp6()
       
    66 {
       
    67 	Deregister();
       
    68 	iIpRecvr.Deregister();
       
    69 
       
    70 	delete iSendCallBack;
       
    71 	iSendQ.Free();
       
    72     __FLOG_CLOSE;
       
    73 }
       
    74 
       
    75 void CPppBinderIp6::ConstructL()
       
    76     {
       
    77     const CIPConfig* ncpConfig = Flow()->GetNcpConfig();
       
    78     if (NULL == ncpConfig)
       
    79         {
       
    80         User::Leave(KErrCorrupt);
       
    81         }
       
    82 
       
    83 	Register();
       
    84 	iIpRecvr.Register();
       
    85 
       
    86 	TCallBack scb(SendCallBack, this);
       
    87 	iSendCallBack = new(ELeave) CAsyncCallBack(scb, KIp6cpSendPriority);
       
    88 	FsmConstructL();
       
    89 	FsmOpen();
       
    90 
       
    91 	// Create a unique interface name
       
    92 	TBuf<KCommsDbSvrMaxColumnNameLength> port(ncpConfig->GetPortName());;
       
    93 	if (port.Length() != 0)
       
    94 		{
       
    95 		port.LowerCase();
       
    96 		iIfName.Format(_L("ipcp6::%S"), &port);
       
    97 		}
       
    98 	else
       
    99     	{
       
   100     	iIfName.Format(_L("ipcp6[0x%08x]"), this);
       
   101     	}
       
   102     }
       
   103 
       
   104 MLowerDataSender* CPppBinderIp6::BindL(MUpperDataReceiver& aUpperReceiver, MUpperControl& aControl)
       
   105 {
       
   106     __FLOG_1(_L8("CPppBinderIp6::Bind(MUpperDataReceiver %08x"), &aUpperReceiver);
       
   107 	if(iUpperControl)
       
   108 		User::Leave(KErrInUse);
       
   109     iUpperControl = &aControl;
       
   110 	iUpperReceiver = &aUpperReceiver;
       
   111 	return this;
       
   112 }
       
   113 
       
   114 void CPppBinderIp6::UnBind(MUpperDataReceiver& aUpperReceiver, MUpperControl& aUpperControl)
       
   115 	{
       
   116     __FLOG(_L8("CDummyNifBinder6:\tUnbind()"));
       
   117     (void)aUpperReceiver;
       
   118     (void)aUpperControl;
       
   119     ASSERT(&aUpperReceiver == iUpperReceiver);
       
   120     ASSERT(&aUpperControl == iUpperControl);
       
   121     iUpperReceiver = NULL;
       
   122     iUpperControl = NULL;
       
   123 	}
       
   124 
       
   125 TBool CPppBinderIp6::MatchesUpperControl(const MUpperControl* aUpperControl) const
       
   126 	{
       
   127 	return iUpperControl == aUpperControl;
       
   128 	}
       
   129 
       
   130 TInt CPppBinderIp6::Control(TUint /*aLevel*/, TUint /*aName*/, TDes8& /*aOption*/)
       
   131 {
       
   132 	return KErrNotSupported;
       
   133 }
       
   134 
       
   135 void CPppBinderIp6::SendFlowOn()
       
   136 {
       
   137 	iLowerFlowOn = ESendAccepted;
       
   138 
       
   139 	if (!iSendQ.IsEmpty())
       
   140 	{
       
   141 		iSendCallBack->CallBack();
       
   142 	}
       
   143 
       
   144 	if (iSendQ.IsEmpty() && iUpperControl)
       
   145 	{
       
   146 		iUpperFlowOn = ESendAccepted;
       
   147 		iUpperControl->StartSending();
       
   148 	}
       
   149 }
       
   150 
       
   151 void CPppBinderIp6::Error(TInt aError)
       
   152     {
       
   153     iUpperControl->Error(aError);
       
   154     }
       
   155 
       
   156 
       
   157 TInt CPppBinderIp6::SendCallBack(TAny* aCProtocol)
       
   158 {
       
   159 	((CPppBinderIp6*)aCProtocol)->DoSend();
       
   160 	return 0;
       
   161 }
       
   162 
       
   163 void CPppBinderIp6::FsmTerminationPhaseComplete()
       
   164 {
       
   165 }
       
   166 
       
   167 void CPppBinderIp6::DoSend()
       
   168 {
       
   169 	if (FsmIsThisLayerOpen())
       
   170 	{
       
   171 		RMBufPacket pkt;
       
   172 
       
   173 		while (iSendQ.Remove(pkt))
       
   174 		{
       
   175 			RMBufPktInfo*info = pkt.Unpack();
       
   176 			TPppAddr addr;
       
   177 
       
   178 			addr = info->iDstAddr;
       
   179             TUint protocol = addr.GetProtocol();
       
   180             pkt.Pack();
       
   181 
       
   182            	if (Flow()->Send(pkt, protocol) <= 0)
       
   183 			    {
       
   184 			    LOG( Flow()->iLogger->Printf(_L("IPCP Flow Off")); )
       
   185 			    iLowerFlowOn = ESendBlocked;
       
   186 			    break;
       
   187 			    }
       
   188 		}
       
   189 
       
   190 		if (iLowerFlowOn && !iUpperFlowOn)
       
   191 		{
       
   192 			iUpperFlowOn = ESendAccepted;
       
   193 			LOG( Flow()->iLogger->Printf(_L("StartSending to IP from DoSend()")); )
       
   194 			Flow()->StartSending();
       
   195 		}
       
   196 	}
       
   197 }
       
   198 
       
   199 MLowerDataSender::TSendResult CPppBinderIp6::Send(RMBufChain& aPacket)
       
   200 	{
       
   201 
       
   202 #if EPOC_SDK==0x06000000
       
   203 	iPppLcp->StartInactiveTimer();
       
   204 #endif
       
   205 
       
   206 	RMBufPacket packet;
       
   207 	packet.Assign(aPacket);
       
   208 	RMBufPktInfo* info = packet.Unpack();
       
   209 
       
   210 	TPppAddr addr;
       
   211 	addr.SetProtocol(KPppIdIp6);
       
   212 	info->iDstAddr = addr;
       
   213 
       
   214 	packet.Pack();
       
   215 
       
   216 	iSendQ.Append(packet);
       
   217 	iSendCallBack->CallBack();
       
   218 
       
   219 	if (!FsmIsThisLayerOpen() || !iLowerFlowOn)
       
   220 		{
       
   221 		iUpperFlowOn = ESendBlocked;
       
   222 		}
       
   223 
       
   224 	return iUpperFlowOn;
       
   225 	}
       
   226 
       
   227 //-=========================================================
       
   228 // MLowerControl methods
       
   229 //-=========================================================
       
   230 TInt CPppBinderIp6::GetName(TDes& aName)
       
   231     {
       
   232     __FLOG(_L8("CPppNifBinder6:\tGetName()"));
       
   233 
       
   234 	aName.Copy(iIfName);
       
   235 
       
   236 	return KErrNone;
       
   237     }
       
   238 
       
   239 TInt CPppBinderIp6::BlockFlow(MLowerControl::TBlockOption /*aOption*/)
       
   240     {
       
   241     iLowerFlowOn = ESendBlocked;
       
   242     return KErrNone;
       
   243     }
       
   244 
       
   245 TInt CPppBinderIp6::GetConfig(TBinderConfig& aConfig)
       
   246 	{
       
   247     TBinderConfig6* config = TBinderConfig::Cast<TBinderConfig6>(aConfig);
       
   248     
       
   249    	if(config == NULL)
       
   250    		{
       
   251    		return KErrNotSupported;
       
   252    		}	
       
   253 	
       
   254 	config->iFamily = KAfInet6;
       
   255 	
       
   256 	config->iInfo.iFeatures = KIfIsPointToPoint | KIfCanMulticast | KIfIsDialup;		/* Feature flags */
       
   257 	
       
   258 	TInt rxsz, txsz;
       
   259 	if (FsmIsThisLayerOpen())
       
   260 		{
       
   261 		iPppLcp->PppLink()->GetSendRecvSize(rxsz, txsz);
       
   262 		config->iInfo.iMtu = txsz==0 ? KPppDefaultFrameSize : txsz;
       
   263 		config->iInfo.iRMtu = rxsz==0 ? KPppDefaultFrameSize : rxsz;
       
   264 		config->iInfo.iSpeedMetric = iPppLcp->PppLink()->SpeedMetric() / 1024;
       
   265 		}
       
   266 	else
       
   267 		{
       
   268 		config->iInfo.iMtu = KPppDefaultFrameSize;
       
   269 		config->iInfo.iRMtu = KPppDefaultFrameSize;
       
   270 		config->iInfo.iSpeedMetric = 0;
       
   271 		}
       
   272 	iPppLcp->SetMaxTransferSize(config->iInfo.iMtu);
       
   273 	
       
   274 	TEui64Addr* ifId = (TEui64Addr*)&config->iLocalId;
       
   275 	
       
   276 	ifId->Init();
       
   277 	ifId->SetAddress(iLocalIfId);
       
   278 		
       
   279 	ifId = (TEui64Addr*)&config->iRemoteId;
       
   280 	ifId->Init();
       
   281 	ifId->SetAddress(iRemoteIfId);
       
   282 	
       
   283 	// Setup static DNS address if required
       
   284 	
       
   285 	if (!iPrimaryDns.IsUnspecified())
       
   286 		{
       
   287 		config->iNameSer1.SetAddress(iPrimaryDns);
       
   288 		if (!iSecondaryDns.IsUnspecified())
       
   289 			config->iNameSer2.SetAddress(iSecondaryDns);
       
   290 		}   
       
   291 	return KErrNone;
       
   292     }
       
   293 
       
   294 // ################################################################
       
   295 
       
   296 TInt CPppBinderIp6::FsmLayerStarted()
       
   297 {
       
   298 	iPppLcp->PppOpen();
       
   299 	return KErrNone;
       
   300 }
       
   301 
       
   302 #if EPOC_SDK >= 0x06010000
       
   303 void CPppBinderIp6::FsmLayerFinished(TInt aReason)
       
   304 #else
       
   305 void CPppBinderIp6::FsmLayerFinished(TInt /*aReason*/)
       
   306 #endif
       
   307 {
       
   308 #if EPOC_SDK >= 0x06010000
       
   309 	iPppLcp->PppClose(aReason);
       
   310 #else
       
   311 	iPppLcp->PppClose();
       
   312 #endif
       
   313     Flow()->Progress(EPppProgressLinkDown, KErrNone);
       
   314 }
       
   315 
       
   316 void CPppBinderIp6::FsmLayerUp()
       
   317 {
       
   318 	// PPP is up. Inform the stakeholders.
       
   319 	// Note:
       
   320     // It is important to signal Link Up first, then Flow On.
       
   321     // Some clients, (e.g SPUD) may make assumptions as to the order of these notifications.
       
   322     // Until LinkLayer Up is received, SPUD assumes that the NIF is not ready.
       
   323     // Sending Flow On before LinkLayer Up may cause these clients to make the wrong conclusions and misbehave.
       
   324 //	Flow()->FlowUp(); // Inform control path: Link is up.
       
   325 	iPppLcp->NcpUp(); // Inform control path: Link is up. 
       
   326     SendFlowOn(); // Inform data path: ready to process data.
       
   327 
       
   328     Flow()->Progress(EPppProgressLinkUp, KErrNone);
       
   329     Flow()->BinderLinkUp(CPppLcp::EPppIp6);
       
   330 }
       
   331 
       
   332 void CPppBinderIp6::FsmLayerDown(TInt aReason)
       
   333 {
       
   334 	LOG( iPppLcp->iLogger->Printf(_L("NCPIP6::FsmLayerDown reason[%d]. "),aReason); )
       
   335 
       
   336 	// Mobile IP Inter-PDSN Handoff support.
       
   337 	if(KErrNone == aReason)
       
   338 		{
       
   339 		Flow()->FlowDown(aReason, MNifIfNotify::ENoAction);
       
   340 		return;
       
   341 		}
       
   342 
       
   343 
       
   344 	// If the layer is down due to an error, it means that the FSM is terminating.
       
   345 
       
   346 	// RFC1661 compliant Termination sequence support:
       
   347  	if(iTerminateRequestEnabled || iTerminateAckEnabled)
       
   348 		{
       
   349 		// LCP signals the Down event on all NCPs:
       
   350  		// We don't want to signal to Nifman from here, because LCP is not finished yet.
       
   351  		// We let LCP handle disconnection notification to Nifman
       
   352 		return;
       
   353 		}
       
   354 
       
   355 	// Legacy shutdown support:
       
   356 	// Notify SCPR.
       
   357 	// When legacy shutdown is no longer required, this code can be safely removed.
       
   358 	if(KErrCommsLineFail == aReason && FsmIsThisLayerOpen())
       
   359 	    {
       
   360 	    // This is a legacy EReconnect scenario
       
   361 		Flow()->FlowDown(aReason, MNifIfNotify::EReconnect);
       
   362 	    }
       
   363     else
       
   364         {
       
   365     	Flow()->FlowDown(aReason, MNifIfNotify::EDisconnect);
       
   366         }
       
   367 
       
   368     Flow()->Progress(EPppProgressLinkDown, aReason);
       
   369 }
       
   370 
       
   371 
       
   372 void CPppBinderIp6::FsmFillinConfigRequestL(RPppOptionList& aReqList)
       
   373 {
       
   374 	const CIPConfig* ncpConfig = Flow()->GetNcpConfig();
       
   375 
       
   376 	// See whether we are configured to request a dynamic DNS address.
       
   377 	if(!ncpConfig->GetIp6DNSAddrFromServer())
       
   378 		{
       
   379 		// Setup static DNS addresses from CommDb
       
   380 		LOG(iPppLcp->iLogger->Printf(_L("Configuring static IPv6 DNS addresses"));)
       
   381 		iPrimaryDns = ncpConfig->GetIp6NameServer1();
       
   382 		iSecondaryDns = ncpConfig->GetIp6NameServer2();
       
   383 		}
       
   384 	else
       
   385 		{
       
   386 		// Ensure that static DNS addresses are set as unspecified,
       
   387 		// so they are not used in Control(KSoIfConfig).
       
   388 		iPrimaryDns = KInet6AddrNone;
       
   389 		iSecondaryDns = KInet6AddrNone;
       
   390 		}
       
   391 
       
   392 	RPppOption opt;
       
   393 	TMachineInfoV1Buf machineInfo;
       
   394 
       
   395 	//
       
   396 	// Use the 64 bit id of MARM machines as our interface id
       
   397 	//
       
   398 	UserHal::MachineInfo(machineInfo);
       
   399 	iLocalIfId.SetAddr(machineInfo().iMachineUniqueId);
       
   400 	iLocalIfId.SetUniversalBit(0);
       
   401 
       
   402 	//
       
   403 	// In WINS environment the id is zero which is no-no
       
   404 	//
       
   405 	if (iLocalIfId.IsZero())
       
   406 	{
       
   407 #ifdef NCPIP6_STATIC_ID
       
   408 		const TUint8 constantId[8] = { 0x1c, 0xe5, 0xb8, 0x4d, 0xd6, 0xfb, 0x10, 0x63 };
       
   409 		iLocalIfId.SetAddr(constantId, sizeof (constantId));
       
   410 #else
       
   411 		iLocalIfId.SetAddrRandomNZ();
       
   412 #endif
       
   413 	}
       
   414 
       
   415 	opt.SetL (KPppIp6cpOptInterfaceIdentifier, iLocalIfId.AddrPtr(), iLocalIfId.AddrLen());
       
   416 	aReqList.Append(opt);
       
   417 }
       
   418 
       
   419 void CPppBinderIp6::FsmCheckConfigRequest(RPppOptionList& aReqList, RPppOptionList& aAckList, RPppOptionList& aNakList, RPppOptionList& aRejList)
       
   420 {
       
   421 	RPppOption opt;
       
   422 
       
   423 	while (aReqList.Remove(opt))
       
   424 	{
       
   425 		switch (opt.OptType())
       
   426 		{
       
   427 		case KPppIp6cpOptCompressionProtocol:
       
   428 			aRejList.Append(opt);
       
   429 			break;
       
   430 
       
   431 		case KPppIp6cpOptInterfaceIdentifier:
       
   432 			{
       
   433 				iRemoteIfId.SetAddr(opt.ValuePtr(), opt.ValueLength());
       
   434 
       
   435 				if (iLocalIfId.Match(iRemoteIfId) || iRemoteIfId.IsZero())
       
   436 				{
       
   437 					iRemoteIfId.SetAddrRandomNZButNot(iLocalIfId);
       
   438 					Mem::Copy(opt.ValuePtr(), iRemoteIfId.AddrPtrC(), iRemoteIfId.AddrLen());
       
   439 					aNakList.Append(opt);
       
   440 				}
       
   441 				else
       
   442 				{
       
   443 					aAckList.Append(opt);
       
   444 
       
   445 				}
       
   446 			}
       
   447 			break;
       
   448 
       
   449 		default:
       
   450 			aRejList.Append(opt);
       
   451 			break;
       
   452 		}
       
   453 	}
       
   454 }
       
   455 
       
   456 void CPppBinderIp6::FsmApplyConfigRequest(RPppOptionList& aReqList)
       
   457 {
       
   458 	TMBufPktQIter iter(aReqList);
       
   459 	RPppOption opt;
       
   460 
       
   461 	while (opt = iter++, !opt.IsEmpty())
       
   462 	{
       
   463 		switch (opt.OptType())
       
   464 		{
       
   465 		case KPppIp6cpOptCompressionProtocol:
       
   466 			break;
       
   467 
       
   468 		case KPppIp6cpOptInterfaceIdentifier:
       
   469 			iRemoteIfId.SetAddr(opt.ValuePtr(), opt.ValueLength());
       
   470 			break;
       
   471 
       
   472 		default:
       
   473 			break;
       
   474 		}
       
   475 	}
       
   476 }
       
   477 
       
   478 void CPppBinderIp6::FsmRecvConfigAck(RPppOptionList& aRepList)
       
   479 {
       
   480 	TMBufPktQIter iter(aRepList);
       
   481 	RPppOption opt;
       
   482 
       
   483 	while (opt = iter++, !opt.IsEmpty())
       
   484 	{
       
   485 		switch (opt.OptType())
       
   486 		{
       
   487 		case KPppIp6cpOptCompressionProtocol:
       
   488 			break;
       
   489 
       
   490 		case KPppIp6cpOptInterfaceIdentifier:
       
   491 			iLocalIfId.SetAddr(opt.ValuePtr(), opt.ValueLength());
       
   492 			break;
       
   493 
       
   494 		default:
       
   495 			break;
       
   496 		}
       
   497 	}
       
   498 }
       
   499 
       
   500 void CPppBinderIp6::FsmRecvConfigNak(RPppOptionList& aRepList, RPppOptionList& aReqList)
       
   501 {
       
   502 	TMBufPktQIter iter(aRepList);
       
   503 	RPppOption opt;
       
   504 
       
   505 	while (opt = iter++, !opt.IsEmpty())
       
   506 	{
       
   507 		switch (opt.OptType())
       
   508 		{
       
   509 		case KPppIp6cpOptCompressionProtocol:
       
   510 			aReqList.ReplaceOption(opt);
       
   511 			break;
       
   512 
       
   513 		case KPppIp6cpOptInterfaceIdentifier:
       
   514 			{
       
   515 				TE64Addr iIfId(opt.ValuePtr(), opt.ValueLength());
       
   516 
       
   517 				if (iLocalIfId.Match(iIfId))
       
   518 				{
       
   519 					iLocalIfId.SetAddrRandomNZButNot(iIfId);
       
   520 					Mem::Copy(opt.ValuePtr(), iLocalIfId.AddrPtrC(), iLocalIfId.AddrLen());
       
   521 				}
       
   522 				else
       
   523 				{
       
   524 					iLocalIfId.SetAddr(iIfId);
       
   525 				}
       
   526 
       
   527 				aReqList.ReplaceOption(opt);
       
   528 			}
       
   529 
       
   530 			break;
       
   531 
       
   532 		default:
       
   533 			aReqList.ReplaceOption(opt);
       
   534 			break;
       
   535 		}
       
   536 	}
       
   537 }
       
   538 
       
   539 void CPppBinderIp6::FsmRecvConfigReject(RPppOptionList& aRepList, RPppOptionList& aReqList)
       
   540 {
       
   541 	TMBufPktQIter iter(aRepList);
       
   542 	RPppOption opt;
       
   543 
       
   544 	while (opt = iter++, !opt.IsEmpty())
       
   545 	{
       
   546 		switch (opt.OptType())
       
   547 		{
       
   548 		case KPppIp6cpOptCompressionProtocol:
       
   549 			aReqList.RemoveOption(opt);
       
   550 			break;
       
   551 
       
   552 		case KPppIp6cpOptInterfaceIdentifier:
       
   553 			FsmAbort(KErrNotReady);
       
   554 			break;
       
   555 
       
   556 		default:
       
   557 			aReqList.RemoveOption(opt);
       
   558 			break;
       
   559 		}
       
   560 	}
       
   561 }
       
   562 
       
   563 void CPppBinderIp6::KillProtocol()
       
   564 {
       
   565 	FsmAbort(KErrCouldNotConnect);
       
   566 	return;
       
   567 }
       
   568 
       
   569 TBool CPppBinderIp6::FsmRecvUnknownCode(TUint8 /*aCode*/, TUint8 /*aId*/, TInt /*aLength*/, RMBufChain& /*aPacket*/)
       
   570 {
       
   571 	return EFalse;
       
   572 }
       
   573 
       
   574 // ################################################################
       
   575 
       
   576 void CPppBinderIp6::RecvIp(RMBufChain& aPacket)
       
   577 {
       
   578 	if (iUpperReceiver)
       
   579 		iUpperReceiver->Process(aPacket);
       
   580 	else
       
   581 		aPacket.Free();
       
   582 }
       
   583 
       
   584 void CPppBinderIp6::Ip6KillProtocol()
       
   585 {
       
   586     __FLOG_2(_L8("this:%08x\tCPppBinderIp6::Ip6KillProtocol() - disconnecting because access was denied"), this, &iPppNifSubConnectionFlow);
       
   587 
       
   588     Flow()->FlowDown(KErrAccessDenied, MNifIfNotify::EDisconnect);
       
   589 	return;
       
   590 }
       
   591 
       
   592 void CPppBinderIp6::Ip6FrameError()
       
   593 {
       
   594 	return;
       
   595 }
       
   596 
       
   597 #if EPOC_SDK >= 0x06010000
       
   598 TInt CPppBinderIp6::Notification(TAgentToNifEventType aEvent)
       
   599 {
       
   600 	if (aEvent==EAgentToNifEventTypeModifyInitialTimer)
       
   601 	{
       
   602 		ChangeTimers(ETrue);
       
   603 	}
       
   604 	else
       
   605 	{
       
   606 		__ASSERT_DEBUG(EFalse, User::Invariant());
       
   607 	}
       
   608 	return KErrNone;
       
   609 }
       
   610 #endif