bluetooth/btstack/l2cap/L2CapFecNegotiator.cpp
changeset 51 20ac952a623c
parent 35 14e279d2bbb7
--- a/bluetooth/btstack/l2cap/L2CapFecNegotiator.cpp	Thu Sep 23 17:06:47 2010 +0300
+++ b/bluetooth/btstack/l2cap/L2CapFecNegotiator.cpp	Wed Oct 13 16:20:29 2010 +0300
@@ -592,32 +592,40 @@
 TInt TL2CapOutgoingFecNegotiator::ProcessPeerValue(const TRetransmissionAndFlowControlOption& aFecOption)
 	{
 	LOG_FUNC
+	TInt err = KErrNone;
 
-	TInt err = KErrNone;
-	TBool disconnect = EFalse;
-	TBool peerModeAcceptable = IsPeerModeAcceptable(aFecOption.LinkMode(), disconnect);
-	
-	if (peerModeAcceptable)
+	if (!iFecNegotiator.ModeSpecificHandlers().IsOptionValid(aFecOption))
 		{
-		iPeer = aFecOption;
-		iIncludeValueInPositiveConfigResponse = iFecNegotiator.ModeSpecificHandlers().BuildPositiveResponse(iPreferred, iPeer);
-		iConfigStatus = EOptionConfigComplete;
+		iConfigStatus = EOptionConfigFailed;
+		err = KErrBadPacketReceived;
 		}
 	else
 		{
-		if (disconnect)
+		TBool disconnect = EFalse;
+		TBool peerModeAcceptable = IsPeerModeAcceptable(aFecOption.LinkMode(), disconnect);
+
+		if (peerModeAcceptable)
 			{
-			// Disconnect immediately without sending an Unacceptable Parameters response.
-			iConfigStatus = EOptionConfigFailed;
-			err = KErrConfigRejected;
+			iPeer = aFecOption;
+			iIncludeValueInPositiveConfigResponse = iFecNegotiator.ModeSpecificHandlers().BuildPositiveResponse(iPreferred, iPeer);
+			iConfigStatus = EOptionConfigComplete;
 			}
 		else
 			{
-            iPreferred.SetLinkMode(iFecNegotiator.DesiredMode());			
-			iFecNegotiator.ModeSpecificHandlers().BuildNegativeResponse(iPreferred, aFecOption);
-			// Cause an Unacceptable Parameters response.
-			iConfigStatus = EOptionConfigFailed;
-			// Preferred contains our desired FEC, it will be included in the Unaccepted Parameters response.
+			if (disconnect)
+				{
+				// Disconnect immediately without sending an Unacceptable Parameters response.
+				iConfigStatus = EOptionConfigFailed;
+				err = KErrConfigRejected;
+				}
+			else
+				{
+				iPreferred.SetLinkMode(iFecNegotiator.DesiredMode());			
+				iFecNegotiator.ModeSpecificHandlers().BuildNegativeResponse(iPreferred, aFecOption);
+				// Cause an Unacceptable Parameters response.
+				iConfigStatus = EOptionConfigFailed;
+				// Preferred contains our desired FEC, it will be included in the Unaccepted Parameters response.
+				}
 			}
 		}
 	LOG1(_L("\tOutgoing FEC Config Status is now %d"), iConfigStatus);