diff --git a/src/source/PeerConnection/PeerConnection.c b/src/source/PeerConnection/PeerConnection.c index 82b374239a..b875fb8805 100644 --- a/src/source/PeerConnection/PeerConnection.c +++ b/src/source/PeerConnection/PeerConnection.c @@ -1343,6 +1343,7 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr ENTERS(); STATUS retStatus = STATUS_SUCCESS; PCHAR remoteIceUfrag = NULL, remoteIcePwd = NULL; + BOOL controlling = FALSE; UINT32 i, j; PSessionDescription pSessionDescription; @@ -1361,6 +1362,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) { @@ -1374,6 +1376,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; } } @@ -1430,7 +1435,7 @@ STATUS setRemoteDescription(PRtcPeerConnection pPeerConnection, PRtcSessionDescr // This starts the state machine timer callback that transitions states periodically CHK_STATUS(iceAgentStartAgent(pKvsPeerConnection->pIceAgent, pKvsPeerConnection->remoteIceUfrag, pKvsPeerConnection->remoteIcePwd, - pKvsPeerConnection->isOffer)); + controlling)); if (!pKvsPeerConnection->isOffer) { CHK_STATUS(setPayloadTypesFromOffer(pKvsPeerConnection->pCodecTable, pKvsPeerConnection->pRtxTable, pSessionDescription));