diff --git a/src/source/PeerConnection/PeerConnection.c b/src/source/PeerConnection/PeerConnection.c index f9a5428bb4..7a2a68bbbf 100644 --- a/src/source/PeerConnection/PeerConnection.c +++ b/src/source/PeerConnection/PeerConnection.c @@ -1300,6 +1300,7 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr ENTERS(); STATUS retStatus = STATUS_SUCCESS; PCHAR remoteIceUfrag = NULL, remoteIcePwd = NULL; + BOOL controlling = FALSE; UINT32 i, j; PSessionDescription pSessionDescription; @@ -1315,6 +1316,7 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr NULLABLE_SET_VALUE(pKvsPeerConnection->canTrickleIce, FALSE); CHK_STATUS(deserializeSessionDescription(pSessionDescription, pSessionDescriptionInit->sdp)); + controlling = pKvsPeerConnection->isOffer; for (i = 0; i < pSessionDescription->sessionAttributesCount; i++) { if (STRCMP(pSessionDescription->sdpAttributes[i].attributeName, "fingerprint") == 0) { @@ -1328,6 +1330,9 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr } else if (STRCMP(pSessionDescription->sdpAttributes[i].attributeName, "ice-options") == 0 && STRSTR(pSessionDescription->sdpAttributes[i].attributeValue, "trickle") != NULL) { NULLABLE_SET_VALUE(pKvsPeerConnection->canTrickleIce, TRUE); + } else if (STRCMP(pSessionDescription->sdpAttributes[i].attributeName, "ice-lite") == 0) { + // if remote description says "ice-lite" we are always the ice controlling side + controlling = TRUE; } } @@ -1383,8 +1388,7 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr STRNCPY(pKvsPeerConnection->remoteIcePwd, remoteIcePwd, MAX_ICE_PWD_LEN); // This starts the state machine timer callback that transitions states periodically - CHK_STATUS(iceAgentStartAgent(pKvsPeerConnection->pIceAgent, pKvsPeerConnection->remoteIceUfrag, pKvsPeerConnection->remoteIcePwd, - pKvsPeerConnection->isOffer)); + CHK_STATUS(iceAgentStartAgent(pKvsPeerConnection->pIceAgent, pKvsPeerConnection->remoteIceUfrag, pKvsPeerConnection->remoteIcePwd, controlling)); if (!pKvsPeerConnection->isOffer) { CHK_STATUS(setPayloadTypesFromOffer(pKvsPeerConnection->pCodecTable, pKvsPeerConnection->pRtxTable, pSessionDescription));