Revision: 201001
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Mar 2010 09:53:48 +0200
changeset 16 0089b2f7ebd8
parent 4 28479eeba3fb
child 17 907b2fb7aa8e
Revision: 201001 Kit: 201011
bluetooth/btexample/test/cit/ROMConfig/src/cteststepbtromconfigremcon002.cpp
bluetooth/btlogger/btsnoophcilogger/public/hciframelogger.h
bluetooth/btstack/avdtp/avdtpStreamStates.cpp
bluetooth/btstack/l2cap/L2CapFecNegotiator.cpp
bluetooth/btstack/l2cap/L2CapFecNegotiator.h
bluetooth/btstack/l2cap/L2CapFecNegotiator.inl
bluetooth/btstack/l2cap/l2sap.cpp
bluetooth/btstack/l2cap/l2sapstates.cpp
bluetooth/btstack/linkmgr/ACLSAP.cpp
bluetooth/btstack/linkmgr/ACLSAP.h
bluetooth/btstack/linkmgr/physicallinks.cpp
bluetooth/btstack/rfcomm/rfcommsap.cpp
bluetooth/btstack/rfcomm/rfcommstates.cpp
bluetooth/btstack/rfcomm/rfcommstates.h
bluetooth/btstack/secman/btaccessrequester.cpp
bluetooth/btstack/secman/pairingserver.cpp
bluetooth/btstack/secman/pairingserver.h
bluetooth/btstack/secman/secman.cpp
bluetoothmgmt/btcommon/bluetooth.txt
bthci/bthci2/CommandsEvents/BWINS/commandseventsU.def
bthci/bthci2/CommandsEvents/generator/Commands.txt
bthci/bthci2/CommandsEvents/generator/CompleteEvents.txt
bthci/bthci2/CommandsEvents/generator/Events.txt
bthci/bthci2/CommandsEvents/interface/VendorDebugCommand.h
bthci/hci2implementations/hctls/bcsp/src/hctlbcspcontrollermanager.cpp
package_definition.xml
--- a/bluetooth/btexample/test/cit/ROMConfig/src/cteststepbtromconfigremcon002.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btexample/test/cit/ROMConfig/src/cteststepbtromconfigremcon002.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -66,7 +66,7 @@
 	if ( err!=expectedError )
 		{
 		INFO_PRINTF4(\
-			_L("Failed: Expected KErrNotFound (%d) and got %d when calling CRemConInterfaceSelector::OpenTargetL"),\
+			_L("Failed: Expected %S(%d) and got %d when calling CRemConInterfaceSelector::OpenTargetL"),\
 			expectedErrorDesPtr, expectedError, err);
 		SetTestStepResult(EFail);
 		}
--- a/bluetooth/btlogger/btsnoophcilogger/public/hciframelogger.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btlogger/btsnoophcilogger/public/hciframelogger.h	Fri Mar 19 09:53:48 2010 +0200
@@ -35,6 +35,9 @@
 static const TUint KHCILoggerACLDataFrame		= 0; // For future use if required
 static const TUint KHCILoggerSynchronousDataFrame = 0; // For future use if required
 
+//KHCILoggerGenericDataFrame can be used instead of the above two flags as BTSnoop logger does not 
+//differencaite between the different types of data frames
+static const TUint KHCILoggerGenericDataFrame 	= 0; 
 static const TUint KHCILoggerCommandOrEvent		= 0x00000002;
 
 static const TUint KHCILoggerFrameFragmented	= 0x80000000;
--- a/bluetooth/btstack/avdtp/avdtpStreamStates.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/avdtp/avdtpStreamStates.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -909,13 +909,17 @@
 // now we kick TCs into life
 	if (aResult)
 		{
-		// can return to Idle, user could try this operation again
-		// the way Open works means we have transport sessions interested in result of this
-		// they need to tell their sockets that their connects failed
-		
-		ChangeState(aStream, CAVStreamStateFactory::EStreamStateIdle);
-		
-		// no need to tell signalling session as Opening is not available to RGavdp
+		// late reply or connection problem, abort
+
+		CSignallingChannel* sigch = aStream.iProtocol.FindSignallingChannel(aStream.iRemoteAddress.BTAddr());
+		// should always have sigch here
+		__ASSERT_DEBUG(sigch, PanicInState(EAvdtpSignallingChannelShouldExist));
+		if (sigch)
+			{
+			sigch->SendAbort(aStream, aStream.RemoteSEID());
+			}
+
+       		// no need to tell signalling session as Opening is not available to RGavdp
 		// Opening is performed when the necessary sockets are created and connected in a stream
 		aStream.NotifyUserPlaneTransportSessionsError(NULL, aResult);
 		}
--- a/bluetooth/btstack/l2cap/L2CapFecNegotiator.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/l2cap/L2CapFecNegotiator.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -53,6 +53,26 @@
 	// Just send what we've got in Preferred.
 	}
 
+void TModeSpecificFecOptionHandlerBase::BuildRequestBasedOnUnacceptableParamsResponse(
+											TRetransmissionAndFlowControlOption& aPreferred,
+											const TRetransmissionAndFlowControlOption& aPeer,
+											const TL2CapFecNegotiator& aFecNegotiator) const
+	{
+	LOG_FUNC
+	// In general the only negotiable parameter is channel mode - that's what we should
+	// take from the suggested response passed here in aPeer. The rest of the parameters are
+	// informative and we should use our own values, based on the mode - the remote can not
+	// reject informative parameters.
+	// Note on interop:
+	// Unfortunately <= 9.4 Symbian code _WILL_ reject if e.g. we send a MaxTransmit value
+	// which is greater than its own preference. To interoperate with those this method is
+	// overridden in the Legacy handler.
+
+	aPreferred = TRetransmissionAndFlowControlOption(aPeer.LinkMode(), ETrue);
+	SetMaxTransmit(aPreferred, aFecNegotiator.MaxTransmit());
+	ZeroUnspecifiedRequestFields(aPreferred);
+	}
+
 void TModeSpecificFecOptionHandlerBase::SetMaxTransmit(TRetransmissionAndFlowControlOption& aFecOption, TUint8 /*aMaxTransmit*/) const
 	{
 	LOG_FUNC
@@ -250,6 +270,47 @@
 							  aMaxTransmit);
 	}
 
+void TLegacyFecHandler::BuildRequestBasedOnUnacceptableParamsResponse(
+		TRetransmissionAndFlowControlOption& aPreferred,
+		const TRetransmissionAndFlowControlOption& aPeer,
+		const TL2CapFecNegotiator& aFecNegotiator) const
+    {
+    LOG_FUNC
+	// In general the only negotiable parameter is channel mode - that's what we should
+	// take from the suggested response passed here in aPeer. The rest of the parameters are
+	// informative and we should use our own values, based on the mode - the remote can not
+	// reject informative parameters.
+	//
+	// HOWEVER:
+	//
+	// Unfortunately <= 9.4 Symbian code _WILL_ reject if e.g. we send a MaxTransmit value
+	// which is greater than its own preference. To interoperate with those we take
+	// the whole FEC option suggested by the remote, including the informational parameters.
+	// <= 9.4 Symbian devices implement RTM and FC modes (and not ERTM and Streaming).
+	// Additionally, pretty much noone else in the market does - most people jumped from
+	// Basic straight to ERTM & Streaming. So it can be assumed that:
+	// Legacy (RTM & FC) ~= pre-ERTM Symbian. 
+
+	typedef TRetransmissionAndFlowControlOption TFec;	// just 'coz I'm lazy
+
+	// Use the remote's whole suggestion if all informational parameters look edible ...
+	if (aPeer.TxWindowSize()          >= TFec::KMinValidTxWindowSize &&
+		aPeer.MaxTransmit()           >= TFec::KMinValidNumberTransmit &&
+		aPeer.RetransmissionTimeout() >= TFec::KMinAcceptableRetransmissionTimeout &&
+		aPeer.MonitorTimeout()        >= TFec::KMinAcceptableMonitorTimeout &&
+		aPeer.MaximumPDUSize()        >= TFec::KMinValidMaximumPDUSize)
+		{
+		aPreferred = aPeer;
+		}
+	else // ... otherwise only use channel mode to prevent DoS attacks.
+		{
+		aPreferred = TRetransmissionAndFlowControlOption(aPeer.LinkMode(), ETrue);
+		SetMaxTransmit(aPreferred, aFecNegotiator.MaxTransmit());
+		ZeroUnspecifiedRequestFields(aPreferred);
+		}
+	}
+
+
 // Basic mode
 
 TBool TBasicFecHandler::IsOptionValid(const TRetransmissionAndFlowControlOption& /*aFecOption*/) const
@@ -476,9 +537,9 @@
 	 	if (aIsUnacceptableParameters)
 			{
 	 		iConfigStatus = EOptionConfigOutstanding;
-            // Only take the channel mode from peer's proposal and set informational
-            // (i.e. all other) parameters to our values.
-            BuildRequest(aFecOption.LinkMode(), iPreferred);
+	 		// Build a new request based on suggestion sent by the peer.
+	 		iFecNegotiator.ModeSpecificHandlers().BuildRequestBasedOnUnacceptableParamsResponse(
+	 				iPreferred, iPeer, iFecNegotiator);
 			}
 		else
 			{
--- a/bluetooth/btstack/l2cap/L2CapFecNegotiator.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/l2cap/L2CapFecNegotiator.h	Fri Mar 19 09:53:48 2010 +0200
@@ -46,6 +46,12 @@
 			   							const TRetransmissionAndFlowControlOption& aPeer) const;
 	virtual void BuildNegativeResponse(TRetransmissionAndFlowControlOption& aPreferred,
 									   const TRetransmissionAndFlowControlOption& aPeer) const;
+
+	virtual void BuildRequestBasedOnUnacceptableParamsResponse(
+					TRetransmissionAndFlowControlOption& aPreferred,
+					const TRetransmissionAndFlowControlOption& aPeer,
+					const TL2CapFecNegotiator& aFecNegotiator) const;
+
 	// In general configuration procedure (spec chapter 7 General Procedures) if the remote accepts
 	// an option from our ConfigReq, it doesn't have to include it in the response. So before
 	// processing the options from a ConfigRsp we've received, we go through the preferred values
@@ -104,6 +110,11 @@
 	virtual TBool IsOptionValid(const TRetransmissionAndFlowControlOption& aFecOption) const;
 	virtual TBool IsPeerResponseAcceptable(const TRetransmissionAndFlowControlOption& aPreferred,
 										   const TRetransmissionAndFlowControlOption& aPeer) const;
+	virtual void BuildRequestBasedOnUnacceptableParamsResponse(
+                        TRetransmissionAndFlowControlOption& aPreferred,
+                        const TRetransmissionAndFlowControlOption& aPeer,
+                        const TL2CapFecNegotiator& aFecNegotiator) const;
+
 	virtual void SetMaxTransmit(TRetransmissionAndFlowControlOption& aFecOption, TUint8 aMaxTransmit) const;
 	};
 
@@ -132,6 +143,9 @@
 									   const TRetransmissionAndFlowControlOption& aPeer) const;
 	inline void BuildNegativeResponse(TRetransmissionAndFlowControlOption& aPreferred,
 									  const TRetransmissionAndFlowControlOption& aPeer) const;
+	inline void BuildRequestBasedOnUnacceptableParamsResponse(TRetransmissionAndFlowControlOption& aPreferred,
+															  const TRetransmissionAndFlowControlOption& aPeer,
+															  const TL2CapFecNegotiator& aFecNegotiator) const;
 	inline void PrepareImplicitPeerResponse(TRetransmissionAndFlowControlOption& aImplicitResponse,
 											const TRetransmissionAndFlowControlOption& aPreferred) const;
 	inline void SetMaxTransmit(TRetransmissionAndFlowControlOption& aFecOption, TUint8 aMaxTransmit) const;
--- a/bluetooth/btstack/l2cap/L2CapFecNegotiator.inl	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/l2cap/L2CapFecNegotiator.inl	Fri Mar 19 09:53:48 2010 +0200
@@ -72,6 +72,19 @@
 	Handler(aPreferred).BuildNegativeResponse(aPreferred, aPeer);
 	}
 
+inline void
+TFecOptionHandlerDelegator::BuildRequestBasedOnUnacceptableParamsResponse(
+		TRetransmissionAndFlowControlOption& aPreferred,
+		const TRetransmissionAndFlowControlOption& aPeer,
+		const TL2CapFecNegotiator& aFecNegotiator) const
+	{
+#ifdef __FLOG_ACTIVE
+	LogCurrentValues(aPreferred, aPeer);
+#endif
+	// Response has suggested mode, dispatch on that.
+	Handler(aPeer).BuildRequestBasedOnUnacceptableParamsResponse(aPreferred, aPeer, aFecNegotiator);
+	}
+
 inline void TFecOptionHandlerDelegator::PrepareImplicitPeerResponse(TRetransmissionAndFlowControlOption& aImplicitResponse,
 																	const TRetransmissionAndFlowControlOption& aPreferred) const
 	{
--- a/bluetooth/btstack/l2cap/l2sap.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/l2cap/l2sap.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -141,6 +141,8 @@
 			clone->SetState(iState->iFactory.GetState(CL2CAPSAPStateFactory::EPassiveLinkPending));
 			clone->SetListeningSAP(*this);
 			
+			clone->SetCodServiceBits(iCodServiceBits);
+			
 			// Copy the details required for security.
 			clone->iSecurity = iSecurity;
 			clone->iRemoteDev = aAddr; 
--- a/bluetooth/btstack/l2cap/l2sapstates.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/l2cap/l2sapstates.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -880,9 +880,11 @@
 	}
 
 // State Transition Actions.
-void TL2CAPSAPStateAccepting::Exit(CL2CAPConnectionSAP& /*aSAP*/) const
+void TL2CAPSAPStateAccepting::Exit(CL2CAPConnectionSAP& aSAP) const
 	{
 	LOG_FUNC
+	
+	aSAP.RegisterCodService();
 	}
 	
 /*************************************************************************/
--- a/bluetooth/btstack/linkmgr/ACLSAP.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/linkmgr/ACLSAP.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -60,6 +60,7 @@
 	iStates[EOpen]					=new (ELeave) TACLLinkStateOpen(*this);
 	iStates[EOpenParked]			=new (ELeave) TACLLinkStateOpenParked(*this);
 	iStates[EClosing]				=new (ELeave) TACLLinkStateClosing(*this);
+	iStates[EAcceptingClosing]		=new (ELeave) TACLLinkStateAcceptingClosing(*this);
 	}
 
 CACLLinkStateFactory::~CACLLinkStateFactory()
@@ -432,7 +433,7 @@
 	{
 	LOG_FUNC
 	// we're not wanted - close
-	ChangeState(aContext, CACLLinkStateFactory::EClosing);
+	ChangeState(aContext, CACLLinkStateFactory::EAcceptingClosing);
 	}
 
 //----------------------------------------------------------------------------------
@@ -497,7 +498,7 @@
 	{
 	LOG_FUNC
 	// just go
-	ChangeState(aContext, CACLLinkStateFactory::EClosing);
+	ChangeState(aContext, CACLLinkStateFactory::EAcceptingClosing);
 	}
 
 //----------------------------------------------------------------------------------
@@ -869,6 +870,38 @@
 
 //----------------------------------------------------------------------------------
 
+TACLLinkStateAcceptingClosing::TACLLinkStateAcceptingClosing(CACLLinkStateFactory& aFactory)
+: TACLLinkState(aFactory)
+	{
+	LOG_FUNC
+	STATENAME("AcceptingClosing");
+	}
+
+void TACLLinkStateAcceptingClosing::Shutdown(CACLLink& /*aContext*/, CServProviderBase::TCloseType /*aCloseType*/) const
+	{
+	LOG_FUNC
+	// we are!  just ignore and continue
+	}
+
+void TACLLinkStateAcceptingClosing::Deletion(CACLLink& aContext) const
+	{
+	LOG_FUNC
+	aContext.ListeningSAP()->RemoveChild(&aContext);
+	}
+
+void TACLLinkStateAcceptingClosing::Error(CACLLink& aContext, TInt /*aError*/) const
+	{
+	LOG_FUNC
+	// This method is reached by receiving a Disconnection Complete Event with Status field != EOk,
+	// in this case we don't want to error the socket - so instead it is just closed
+	aContext.ListeningSAP()->RemoveChild(&aContext);
+	ChangeState(aContext, CACLLinkStateFactory::EClosed);
+	aContext.Socket()->CanClose();
+	}
+
+
+//----------------------------------------------------------------------------------
+
 TACLLinkStateClosed::TACLLinkStateClosed(CACLLinkStateFactory& aFactory)
 : TACLLinkState(aFactory)
 	{
--- a/bluetooth/btstack/linkmgr/ACLSAP.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/linkmgr/ACLSAP.h	Fri Mar 19 09:53:48 2010 +0200
@@ -57,6 +57,7 @@
 		EOpen,	
 		EOpenParked,
 		EClosing,
+		EAcceptingClosing,
 	// *** keep next one last ***
 		EACLLinkMaxState,
 		};
@@ -229,6 +230,18 @@
 	void Error(CACLLink& aContext, TInt aError) const;
 	};
 
+NONSHARABLE_CLASS(TACLLinkStateAcceptingClosing) : public TACLLinkState
+	{
+public:
+	TACLLinkStateAcceptingClosing(CACLLinkStateFactory& aFactory);
+
+	void Shutdown(CACLLink& aContext, CServProviderBase::TCloseType aCloseType) const;
+	void Deletion(CACLLink& aContext) const;
+	
+	void Error(CACLLink& aContext, TInt aError) const;
+	};
+
+
 NONSHARABLE_CLASS(TACLLinkStateClosed) : public TACLLinkState
 	{
 public:
--- a/bluetooth/btstack/linkmgr/physicallinks.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/linkmgr/physicallinks.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -1038,6 +1038,28 @@
  			NotifyStateChange(event);
  			}
 
+		if (iACLLogicalLinks.Count() == 0)
+			{
+			// We don't already have an ACL logical link associated with this phy, 
+			// so, in order to not miss ACL data from the remote, associate this 
+			// phy with an ACL listener if there is one.
+			TLogicalLinkListener* listener = iLinksMan.FindListener(EACLLink);
+	
+			if (listener)
+				{
+				TBTConnect conn;
+		
+				conn.iBdaddr = iDevice.Address();
+				conn.iCoD = iDevice.DeviceClass().DeviceClass();
+				conn.iLinkType = EACLLink;
+		
+				// Ignore the return from ConnectRequest, if not accepted then we are in no
+				// worse situation than if we didn't try.
+				ASSERT_DEBUG(listener->iObserver);
+				(void)listener->iObserver->ConnectRequest(conn, *this);
+				}
+			}
+		
 		// tell the logical links
 		NotifyLogicalLinkUp(aConn);
 		iLinksMan.ArbitrateAllPhysicalLinks();
@@ -1533,15 +1555,15 @@
 			if(pairingState == CBTPairingsCache::EDeferred)
 				{
 				// We're still waiting for the Pairing Caches paired device list to be filled.
- 				// We'll respond when this is complete, so store details away for then.
+				// We'll respond when this is complete, so store details away for then.
 				LOG(_L("CPhysicalLink: Waiting for physical link manager's paired device list from Registry!"))
 				iPendingConnection = ETrue;
-    			iLastPendingConnection.iConnH = aConn.iConnH;
-			    iLastPendingConnection.iBdaddr = aConn.iBdaddr;
-			    iLastPendingConnection.iCoD = aConn.iCoD;
-			    iLastPendingConnection.iLinkType = aConn.iLinkType;
-			    iLastPendingConnection.iEncryptMode = aConn.iEncryptMode;
-			    // Return now as we are waiting and don't want to 'RejectConnection'
+				iLastPendingConnection.iConnH = aConn.iConnH;
+				iLastPendingConnection.iBdaddr = aConn.iBdaddr;
+				iLastPendingConnection.iCoD = aConn.iCoD;
+				iLastPendingConnection.iLinkType = aConn.iLinkType;
+				iLastPendingConnection.iEncryptMode = aConn.iEncryptMode;
+				// Return now as we are waiting and don't want to 'RejectConnection'
 				return;
 				}
 
@@ -1699,7 +1721,7 @@
 					return KErrArgument;
 					}
 				aOption = TPtrC8(reinterpret_cast<const TUint8*>(&iSniffInterval), sizeof(TBasebandTime));
-			    return KErrNone;
+				return KErrNone;
 
 			default:
 				return KErrNotSupported;
@@ -1720,26 +1742,26 @@
 	if ( aImmediately )
 		{
 		iArbitrationDelay->Cancel();
-        return DoArbitrate(aLocalPriority);		
+		return DoArbitrate(aLocalPriority);		
 		}
 	else if (iArbitrationDelay->IsActive())
 		{
 		return KErrNone;
 		}
-    else
-        {
-        iArbitrationDelay->Start(aLocalPriority);
-        return KErrNone;
-        }
-    }
+	else
+		{
+		iArbitrationDelay->Start(aLocalPriority);
+		return KErrNone;
+		}
+	}
 
 TInt CPhysicalLink::DoArbitrate(TBool aLocalPriority)
-    {
-    if (!IsConnected())
-        {
-        return KErrDisconnected;
-        }
-	    
+	{
+	if (!IsConnected())
+		{
+		return KErrDisconnected;
+		}
+
 	//start arbitrate process with what our local controller supports
 	TUint8 allowedModesMask = EHoldMode | EParkMode | ESniffMode; // local features sorted out later
 	TBool roleSwitchAllowed = EFalse;
@@ -2813,6 +2835,18 @@
 
 	SetAuthenticationPending(EPinRequestPending); // if not already set (because the remote initiated authentication).
 
+	__ASSERT_DEBUG(iSimplePairingMode != EPhySimplePairingEnabled, Panic(EBTSSPModeChangedDuringConnection));
+	if (iSimplePairingMode == EPhySimplePairingUndefined)
+		{
+		iSimplePairingMode = EPhySimplePairingDisabled;
+		}
+	
+	if (!IsConnected())
+		{
+		iPeerInSecurityMode3 = ETrue;
+		}
+
+	
 	if (iPinRequester)
 		{
 		return;
@@ -3432,12 +3466,12 @@
 	}
 
 void CArbitrationDelayTimer::Start(TBool aLocalPriority)
-    {
-    LOG_FUNC
-    // Work out what the local priority will be now
-    TBool localPriority = iLocalPriority || aLocalPriority;
-    Cancel(); // cancel current timer (will also reset priority so ...
-    iLocalPriority = localPriority; // set the new priority)
+	{
+	LOG_FUNC
+	// Work out what the local priority will be now
+	TBool localPriority = iLocalPriority || aLocalPriority;
+	Cancel(); // cancel current timer (will also reset priority so ...
+	iLocalPriority = localPriority; // set the new priority)
 	After(KBTArbitrationDelay);
 	}
 
@@ -3450,16 +3484,16 @@
 	LOG_FUNC
 	if (iParent)
 		{
-        iParent->DoArbitrate(iLocalPriority);
+		iParent->DoArbitrate(iLocalPriority);
 		}
 	}
 
 void CArbitrationDelayTimer::DoCancel()
-    {
-    LOG_FUNC
-    CTimer::DoCancel();
-    iLocalPriority = EFalse;
-    }
+	{
+	LOG_FUNC
+	CTimer::DoCancel();
+	iLocalPriority = EFalse;
+	}
 
 TInt CPhysicalLink::GetNumPendingHandles(TInt& aConnectionHandles, TLinkType aLinkType) const
 	{
--- a/bluetooth/btstack/rfcomm/rfcommsap.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/rfcomm/rfcommsap.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -597,6 +597,8 @@
 	//	Ensure the parent doesn't forget its clone
 	iClonedChildren.Append(clone);	
 
+	clone->SetCodServiceBits(iCodServiceBits);
+	
 	return clone;
 	}
 
--- a/bluetooth/btstack/rfcomm/rfcommstates.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/rfcomm/rfcommstates.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -1653,6 +1653,13 @@
 	ChangeState(aSAP,CRfcommStateFactory::ECloseOnStart);
 	}
 
+	
+void TRfcommStateWaitForStart::Exit(CRfcommSAP& aSAP)
+	{
+	aSAP.RegisterCodService();
+	}
+
+	
 /******************************************************************/
 /*
   The Close On Start state.
--- a/bluetooth/btstack/rfcomm/rfcommstates.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/rfcomm/rfcommstates.h	Fri Mar 19 09:53:48 2010 +0200
@@ -520,6 +520,7 @@
 	void DISC(CRfcommSAP& aSAP);
 	void Error(CRfcommSAP& aSAP, TInt aErr,
 				CRfcommSAP::TErrorTypes aType);
+	void Exit(CRfcommSAP& aSAP);
 	};
 
 /**
--- a/bluetooth/btstack/secman/btaccessrequester.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/secman/btaccessrequester.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -539,7 +539,7 @@
 		
 		// If MITM protection is required by a service, or the device is in paired only connections mode
 		// the require MITM protection.
-		if (iRequirements.MitmProtection() != EMitmNotRequired || iSecMan.ConnectionsManager().IsAcceptPairedOnlyMode())
+		if (iRequirements.MitmProtection() != EMitmNotRequired)
 			{
 			if (iAccessType == EDedicatedBonding)
 				{
--- a/bluetooth/btstack/secman/pairingserver.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/secman/pairingserver.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -775,11 +775,18 @@
 	iProxySap = CBTProxySAP::NewL(iPhysicalLinksManager, NULL);
 
 	CleanupStack::Pop(this); // the start message cleaner
-
+	
+	// Now we've entered the realm of not leaving with an error, since the connection
+	// process has started.  Errors from now on must be via the Error() function call.
 	iState = EInitialConnectionPending;
 	iProxySap->SetNotify(this);
 	iProxySap->SetRemName(addr);
 	iProxySap->ActiveOpen();
+	TRAPD(err, DoAccessRequestL());
+	if(err != KErrNone)
+		{
+		Error(err);
+		}
 	}
 
 void CDedicatedBondingSession::CleanupStartMessage(TAny* aPtr)
@@ -815,6 +822,11 @@
 			addr.SetBTAddr(iProxySap->RemoteAddress());
 			iProxySap->SetRemName(addr); // triggers finding a link again.
 			iProxySap->ActiveOpen();
+			TRAPD(err, DoAccessRequestL());
+			if(err != KErrNone)
+				{
+				Error(err);
+				}
 			break;
 			}
 		// else not deferred so complete now....
@@ -830,6 +842,12 @@
 			err = KErrAccessDenied;
 			}
 		break;
+	case EInitialConnectionPending:
+	case EFinalConnectionPending:
+		// Access request shouldn't successfully complete if the connection is still pending
+		__ASSERT_DEBUG(aResult != EBTSecManAccessGranted,  PANIC(KPairingServerFaultCat, EPairingServerUnexpectedAccessCallback));
+		// We should get the MSocketNotify::Error callback, so don't do anything else
+		break;
 	default:
 		LOG1(_L("Unexpected Access Request Complete in state %d"), iState);
 		__ASSERT_DEBUG(EFalse, PANIC(KPairingServerFaultCat, EPairingServerUnexpectedAccessCallback));
@@ -856,23 +874,26 @@
 	__ASSERT_DEBUG(EFalse, PANIC(KPairingServerFaultCat, EPairingServerUnexpectedSocketCallback));
 	}
 
-void CDedicatedBondingSession::ConnectCompleteL()
+void CDedicatedBondingSession::ConnectComplete()
 	{
 	LOG_FUNC
 	switch(iState)
 		{
 	case EInitialConnectionPending:
 		iState = EInitialConnection;
-		DoAccessRequestL();
 		break;
 	case EFinalConnectionPending:
 		iState = EFinalConnection;
-		DoAccessRequestL();
 		break;
 	case EInitialConnection:
 	case EFinalConnection:
 		// Apparently multiple connect completes are allowed by CSocket
 		break;
+	case EShutdown:
+		// If an error occurred just after the connection request then we
+		// might receive a connection complete before the async shutdown request
+		// has been executed.
+		break;
 	default:
 		LOG1(_L("Unexpected Connect Complete in state %d"), iState);
 		__ASSERT_DEBUG(EFalse, PANIC(KPairingServerFaultCat, EPairingServerUnexpectedSocketCallback));
@@ -880,16 +901,6 @@
 		}
 	}
 
-void CDedicatedBondingSession::ConnectComplete()
-	{
-	LOG_FUNC
-	TRAPD(err, ConnectCompleteL());
-	if(err != KErrNone)
-		{
-		Error(err);
-		}
-	}
-
 void CDedicatedBondingSession::ConnectComplete(const TDesC8& /*aConnectData*/)
 	{
 	LOG_FUNC
--- a/bluetooth/btstack/secman/pairingserver.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/secman/pairingserver.h	Fri Mar 19 09:53:48 2010 +0200
@@ -214,7 +214,6 @@
 
 	void StartBondingL(const RMessage2& aMessage);
 	void DoAccessRequestL();
-	void ConnectCompleteL();
 	void Shutdown();
 
 	void Complete(TInt aError);
--- a/bluetooth/btstack/secman/secman.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetooth/btstack/secman/secman.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -453,34 +453,22 @@
 				oobPresence = EOOBDataPresent;
 				}
 			THCIAuthenticationRequirement authReq = link->AuthenticationRequirement();
-			if(ConnectionsManager().IsAcceptPairedOnlyMode())
+			switch(authReq)
 				{
-				// in paired only mode, only MITM pairings are acceptable.
-				switch(authReq)
-					{
 				case EMitmNotReqNoBonding:
-				case EMitmReqNoBonding:
-					authReq = EMitmReqNoBonding;
-					break;
 				case EMitmNotReqDedicatedBonding:
-				case EMitmReqDedicatedBonding:
-					authReq = EMitmReqDedicatedBonding;
-					break;
 				case EMitmNotReqGeneralBonding:
-				case EMitmReqGeneralBonding:
-					authReq = EMitmReqGeneralBonding;
+					link->SetLocalMITM(EFalse);
 					break;
-	            default:
-	                PANIC(KBTSecPanic, EBTSecUnexpectedIoCapability);
-	                break;
-					}
-				link->SetLocalMITM(ETrue);
+				case EMitmReqNoBonding:
+				case EMitmReqDedicatedBonding:
+				case EMitmReqGeneralBonding:
+					link->SetLocalMITM(ETrue);
+					break;
+				default:
+					PANIC(KBTSecPanic, EBTSecUnexpectedIoCapability);
+					break;    
 				}
-			else
-				{
-				link->SetLocalMITM(EFalse);
-				}
-		
 			TRAP_IGNORE(iCommandController->IOCapabilityRequestReplyL(aAddr, EIOCapsDisplayYesNo, oobPresence, authReq));
 			}
 		else
--- a/bluetoothmgmt/btcommon/bluetooth.txt	Tue Feb 02 01:12:20 2010 +0200
+++ b/bluetoothmgmt/btcommon/bluetooth.txt	Fri Mar 19 09:53:48 2010 +0200
@@ -1,7 +1,7 @@
 # Copyright (c) 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"
+# under the terms of the License "Eclipse Public License v1.0"
 # which accompanies this distribution, and is available
 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
 #
--- a/bthci/bthci2/CommandsEvents/BWINS/commandseventsU.def	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/bthci2/CommandsEvents/BWINS/commandseventsU.def	Fri Mar 19 09:53:48 2010 +0200
@@ -1105,10 +1105,10 @@
 	??0CVendorDebugCommand@@IAE@G@Z @ 1104 NONAME ; CVendorDebugCommand::CVendorDebugCommand(unsigned short)
 	?ConstructL@CVendorDebugCommand@@IAEXXZ @ 1105 NONAME ; void CVendorDebugCommand::ConstructL(void)
 	?Extension_@CVendorDebugCommand@@UAEHIAAPAXPAX@Z @ 1106 NONAME ; int CVendorDebugCommand::Extension_(unsigned int, void * &, void *)
-	?SetCreditsConsumed@CVendorDebugCommand@@IAEXI@Z @ 1107 NONAME ; void CVendorDebugCommand::SetCreditsConsumed(unsigned int)
-	?SetExpectsCommandCompleteEvent@CVendorDebugCommand@@IAEXH@Z @ 1108 NONAME ; void CVendorDebugCommand::SetExpectsCommandCompleteEvent(int)
-	?SetExpectsCommandStatusEvent@CVendorDebugCommand@@IAEXH@Z @ 1109 NONAME ; void CVendorDebugCommand::SetExpectsCommandStatusEvent(int)
-	?SetExpectsCompletingEvent@CVendorDebugCommand@@IAEHH@Z @ 1110 NONAME ; int CVendorDebugCommand::SetExpectsCompletingEvent(int)
+	?SetCreditsConsumed@CVendorDebugCommand@@QAEXI@Z @ 1107  NONAME ; void CVendorDebugCommand::SetCreditsConsumed(unsigned int)
+	?SetExpectsCommandCompleteEvent@CVendorDebugCommand@@QAEXH@Z @ 1108  NONAME ; void CVendorDebugCommand::SetExpectsCommandCompleteEvent(int)
+	?SetExpectsCommandStatusEvent@CVendorDebugCommand@@QAEXH@Z @ 1109  NONAME ; void CVendorDebugCommand::SetExpectsCommandStatusEvent(int)
+	?SetExpectsCompletingEvent@CVendorDebugCommand@@QAEHH@Z @ 1110  NONAME ; int CVendorDebugCommand::SetExpectsCompletingEvent(int)
 	?VendorDebugEvent@TVendorDebugCompleteEvent@@QBE?AVTPtrC8@@XZ @ 1111 NONAME ; class TPtrC8 TVendorDebugCompleteEvent::VendorDebugEvent(void) const
 	?AsNullTerminatedString@THCIEventBase@@IBE?AVTPtrC8@@H@Z @ 1112 NONAME ; class TPtrC8 THCIEventBase::AsNullTerminatedString(int) const
 	??0TNopCompleteEvent@@QAE@ABVTDesC8@@@Z @ 1113 NONAME ; TNopCompleteEvent::TNopCompleteEvent(class TDesC8 const &)
--- a/bthci/bthci2/CommandsEvents/generator/Commands.txt	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/bthci2/CommandsEvents/generator/Commands.txt	Fri Mar 19 09:53:48 2010 +0200
@@ -1,7 +1,7 @@
 # Copyright (c) 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"
+# under the terms of the License "Eclipse Public License v1.0"
 # which accompanies this distribution, and is available
 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
 #
--- a/bthci/bthci2/CommandsEvents/generator/CompleteEvents.txt	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/bthci2/CommandsEvents/generator/CompleteEvents.txt	Fri Mar 19 09:53:48 2010 +0200
@@ -1,7 +1,7 @@
 # Copyright (c) 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"
+# under the terms of the License "Eclipse Public License v1.0"
 # which accompanies this distribution, and is available
 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
 #
--- a/bthci/bthci2/CommandsEvents/generator/Events.txt	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/bthci2/CommandsEvents/generator/Events.txt	Fri Mar 19 09:53:48 2010 +0200
@@ -1,7 +1,7 @@
 # Copyright (c) 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"
+# under the terms of the License "Eclipse Public License v1.0"
 # which accompanies this distribution, and is available
 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
 #
--- a/bthci/bthci2/CommandsEvents/interface/VendorDebugCommand.h	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/bthci2/CommandsEvents/interface/VendorDebugCommand.h	Fri Mar 19 09:53:48 2010 +0200
@@ -77,14 +77,14 @@
 	IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny*& aInterface, TAny* aData);
 	void Match(const THCIEventBase& aEvent, TBool& aMatchesCmd, TBool& aConcludesCmd, TBool& aContinueMatching) const;
 	IMPORT_C void SetMatcher(MVendorDebugCommandMatcher* aMatcher);
+	IMPORT_C void SetCreditsConsumed(TUint aConsumedCredits);
+	IMPORT_C void SetExpectsCommandStatusEvent(TBool aExpectsCmdStatus);
+	IMPORT_C void SetExpectsCommandCompleteEvent(TBool aExpectsCmdComplete);
+	IMPORT_C TInt SetExpectsCompletingEvent(TBool aExpectsCompletingEvent);
 	
 protected:	
 	IMPORT_C CVendorDebugCommand(const TUint16 opcode);
 	IMPORT_C void ConstructL();
-	IMPORT_C void SetCreditsConsumed(TUint aConsumedCredits);
-	IMPORT_C void SetExpectsCommandStatusEvent(TBool aExpectsCmdStatus);
-	IMPORT_C void SetExpectsCommandCompleteEvent(TBool aExpectsCmdComplete);
-	IMPORT_C TInt SetExpectsCompletingEvent(TBool aExpectsCompletingEvent);
 
 private:
 	void Format(CHctlCommandFrame& aCommandFrame) const;
--- a/bthci/hci2implementations/hctls/bcsp/src/hctlbcspcontrollermanager.cpp	Tue Feb 02 01:12:20 2010 +0200
+++ b/bthci/hci2implementations/hctls/bcsp/src/hctlbcspcontrollermanager.cpp	Fri Mar 19 09:53:48 2010 +0200
@@ -190,11 +190,10 @@
 	switch(aState)
 		{
 		case EBTOff:
-			{
-			iHCTLBcsp.WriteBcCmd(iColdHaltCommand); //this should not produce a response
+			{			
 			iPowerDownCallback->CallBack();	//allows asynch callback to BTClient.
 			iCurrentTask = EPowerDown;
-			iControllerManagerState = EWaiting;
+			iControllerManagerState = EResetHardware;
 			iHCTLBcsp.Choke();
 			}
 			break;
--- a/package_definition.xml	Tue Feb 02 01:12:20 2010 +0200
+++ b/package_definition.xml	Fri Mar 19 09:53:48 2010 +0200
@@ -70,6 +70,11 @@
         <unit mrp="bluetoothapitest/bluetoothsvs/group/bluetoothsvs.mrp" bldFile="bluetoothapitest/bluetoothsvs/group"/>
       </component>
     </collection>
+    <collection id="atext" name="AT Extensions" level="server">
+      <component id="atext_build" name="AT Extension Build" introduced="^3" purpose="optional" filter="s60">
+        <unit bldFile="atext/group"/>
+      </component>
+    </collection>
     <collection id="bt_info" name="Bluetooth Info" level="app-if">
       <component id="bt_plat" filter="s60" class="api">
         <unit bldFile="bt_plat/group"/>