mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 20:05:49 +00:00
Bug 942188 - Added parsing of ice-lite attribute and start ice checks as controlling if peer is ice-lite. r=abr
This commit is contained in:
parent
4296ce21ad
commit
efc993ca04
@ -520,6 +520,10 @@ nsresult NrIceCtx::SetControlling(Controlling controlling) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NrIceCtx::Controlling NrIceCtx::GetControlling() {
|
||||
return (peer_->controlling) ? ICE_CONTROLLING : ICE_CONTROLLED;
|
||||
}
|
||||
|
||||
nsresult NrIceCtx::SetStunServers(const std::vector<NrIceStunServer>&
|
||||
stun_servers) {
|
||||
if (stun_servers.empty())
|
||||
|
@ -225,6 +225,8 @@ class NrIceCtx {
|
||||
// Set whether we are controlling or not.
|
||||
nsresult SetControlling(Controlling controlling);
|
||||
|
||||
Controlling GetControlling();
|
||||
|
||||
// Set the STUN servers. Must be called before StartGathering
|
||||
// (if at all).
|
||||
nsresult SetStunServers(const std::vector<NrIceStunServer>& stun_servers);
|
||||
|
@ -800,12 +800,14 @@ short vcmGetIceParams(const char *peerconnection,
|
||||
* @param[in] peerconnection - the peerconnection in use
|
||||
* @param[in] ufrag - the ufrag
|
||||
* @param[in] pwd - the pwd
|
||||
* @param[in] icelite - is peer ice lite
|
||||
*
|
||||
* @return 0 for success; VCM_ERROR for failure
|
||||
*/
|
||||
static short vcmSetIceSessionParams_m(const char *peerconnection,
|
||||
char *ufrag,
|
||||
char *pwd)
|
||||
char *pwd,
|
||||
cc_boolean icelite)
|
||||
{
|
||||
CSFLogDebug( logTag, "%s: PC = %s", __FUNCTION__, peerconnection);
|
||||
|
||||
@ -818,7 +820,9 @@ static short vcmSetIceSessionParams_m(const char *peerconnection,
|
||||
attributes.push_back(ufrag);
|
||||
if (pwd)
|
||||
attributes.push_back(pwd);
|
||||
|
||||
if (icelite) {
|
||||
attributes.push_back("ice-lite");
|
||||
}
|
||||
nsresult res = pc.impl()->media()->ice_ctx()->
|
||||
ParseGlobalAttributes(attributes);
|
||||
|
||||
@ -837,12 +841,14 @@ static short vcmSetIceSessionParams_m(const char *peerconnection,
|
||||
* @param[in] peerconnection - the peerconnection in use
|
||||
* @param[in] ufrag - the ufrag
|
||||
* @param[in] pwd - the pwd
|
||||
* @param[in] icelite - is peer using ice-lite
|
||||
*
|
||||
* @return 0 success, error failure
|
||||
*/
|
||||
short vcmSetIceSessionParams(const char *peerconnection,
|
||||
char *ufrag,
|
||||
char *pwd)
|
||||
char *pwd,
|
||||
cc_boolean icelite)
|
||||
{
|
||||
short ret;
|
||||
|
||||
@ -851,6 +857,7 @@ short vcmSetIceSessionParams(const char *peerconnection,
|
||||
peerconnection,
|
||||
ufrag,
|
||||
pwd,
|
||||
icelite,
|
||||
&ret));
|
||||
|
||||
return ret;
|
||||
|
@ -1314,6 +1314,7 @@ fsmdef_init_dcb (fsmdef_dcb_t *dcb, callid_t call_id,
|
||||
|
||||
dcb->ice_ufrag = NULL;
|
||||
dcb->ice_pwd = NULL;
|
||||
dcb->peer_ice_lite = FALSE;
|
||||
dcb->ice_default_candidate_addr[0] = '\0';
|
||||
|
||||
dcb->digest_alg[0] = '\0';
|
||||
|
@ -7111,8 +7111,13 @@ gsmsdp_install_peer_ice_attributes(fsm_fcb_t *fcb_p)
|
||||
if (sdp_res != SDP_SUCCESS)
|
||||
pwd = NULL;
|
||||
|
||||
if (ufrag && pwd) {
|
||||
vcm_res = vcmSetIceSessionParams(dcb_p->peerconnection, ufrag, pwd);
|
||||
/* ice-lite is a session level attribute only, RFC 5245 15.3 */
|
||||
dcb_p->peer_ice_lite = sdp_attr_is_present(sdp_p->dest_sdp,
|
||||
SDP_ATTR_ICE_LITE, SDP_SESSION_LEVEL, 0);
|
||||
|
||||
if ((ufrag && pwd) || dcb_p->peer_ice_lite) {
|
||||
vcm_res = vcmSetIceSessionParams(dcb_p->peerconnection, ufrag, pwd,
|
||||
dcb_p->peer_ice_lite);
|
||||
if (vcm_res)
|
||||
return (CC_CAUSE_SETTING_ICE_SESSION_PARAMETERS_FAILED);
|
||||
}
|
||||
|
@ -428,6 +428,7 @@ typedef struct {
|
||||
|
||||
char *ice_ufrag;
|
||||
char *ice_pwd;
|
||||
boolean peer_ice_lite;
|
||||
char ice_default_candidate_addr[MAX_IPADDR_STR_LEN];
|
||||
|
||||
char digest_alg[FSMDEF_MAX_DIGEST_ALG_LEN];
|
||||
|
@ -3926,7 +3926,8 @@ lsm_connected (lsm_lcb_t *lcb, cc_state_data_connected_t *data)
|
||||
|
||||
/* Start ICE */
|
||||
if (start_ice) {
|
||||
short res = vcmStartIceChecks(dcb->peerconnection, !dcb->inbound);
|
||||
short res = vcmStartIceChecks(dcb->peerconnection,
|
||||
!dcb->inbound || dcb->peer_ice_lite);
|
||||
|
||||
/* TODO(emannion): Set state to dead here. */
|
||||
if (res)
|
||||
|
@ -1259,6 +1259,8 @@ extern tinybool sdp_attr_get_simple_boolean(void *sdp_ptr,
|
||||
extern sdp_result_e sdp_attr_set_simple_boolean(void *sdp_ptr,
|
||||
sdp_attr_e attr_type, u16 level, u8 cap_num,
|
||||
u16 inst_num, u32 bool_parm);
|
||||
extern tinybool sdp_attr_is_present (void *sdp_ptr, sdp_attr_e attr_type,
|
||||
u16 level, u8 cap_num);
|
||||
extern const char* sdp_attr_get_maxprate(void *sdp_ptr, u16 level,
|
||||
u16 inst_num);
|
||||
extern sdp_result_e sdp_attr_set_maxprate(void *sdp_ptr, u16 level,
|
||||
|
@ -4750,6 +4750,27 @@ sdp_result_e sdp_parse_attr_ice_attr (sdp_t *sdp_p, sdp_attr_t *attr_p, const ch
|
||||
}
|
||||
|
||||
|
||||
sdp_result_e sdp_build_attr_simple_flag (sdp_t *sdp_p, sdp_attr_t *attr_p,
|
||||
flex_string *fs) {
|
||||
flex_string_sprintf(fs, "a=%s\r\n", sdp_get_attr_name(attr_p->type));
|
||||
|
||||
return SDP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
sdp_result_e sdp_parse_attr_simple_flag (sdp_t *sdp_p, sdp_attr_t *attr_p,
|
||||
const char *ptr) {
|
||||
/* No parameters to parse. */
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
SDP_PRINT("%s Parsed a=%s", sdp_p->debug_str,
|
||||
sdp_get_attr_name(attr_p->type));
|
||||
}
|
||||
|
||||
return (SDP_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
sdp_result_e sdp_parse_attr_fingerprint_attr (sdp_t *sdp_p, sdp_attr_t *attr_p,
|
||||
const char *ptr)
|
||||
{
|
||||
|
@ -4010,6 +4010,43 @@ sdp_result_e sdp_attr_set_ice_attribute(void *sdp_ptr, u16 level,
|
||||
return (SDP_SUCCESS);
|
||||
}
|
||||
|
||||
/* Function: sdp_attr_is_present
|
||||
* Description: Returns a boolean value based on attribute being present or
|
||||
* not
|
||||
*
|
||||
* Parameters: sdp_ptr The SDP handle returned by sdp_init_description.
|
||||
* attr_type The attribute type.
|
||||
* level The level to check for the attribute.
|
||||
* cap_num The capability number associated with the
|
||||
* attribute if any. If none, should be zero.
|
||||
* Returns:
|
||||
* Boolean value.
|
||||
*/
|
||||
|
||||
tinybool sdp_attr_is_present (void *sdp_ptr, sdp_attr_e attr_type, u16 level,
|
||||
u8 cap_num)
|
||||
{
|
||||
sdp_t *sdp_p = (sdp_t *)sdp_ptr;
|
||||
sdp_attr_t *attr_p;
|
||||
|
||||
if (sdp_verify_sdp_ptr(sdp_p) == FALSE) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
attr_p = sdp_find_attr(sdp_p, level, cap_num, attr_type, 1);
|
||||
if (attr_p != NULL) {
|
||||
return (TRUE);
|
||||
}
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
CSFLogDebug(logTag, "%s Attribute %s, level %u not found.",
|
||||
sdp_p->debug_str, sdp_get_attr_name(attr_type), level);
|
||||
}
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Function: sdp_attr_get_rtcp_mux_attribute
|
||||
* Description: Returns the value of an rtcp-mux attribute at a given level
|
||||
*
|
||||
|
@ -164,6 +164,8 @@ const sdp_attrarray_t sdp_attr[SDP_MAX_ATTR_TYPES] =
|
||||
sdp_parse_attr_ice_attr, sdp_build_attr_ice_attr },
|
||||
{"ice-pwd", sizeof("ice-pwd"),
|
||||
sdp_parse_attr_ice_attr, sdp_build_attr_ice_attr},
|
||||
{"ice-lite", sizeof("ice-lite"),
|
||||
sdp_parse_attr_simple_flag, sdp_build_attr_simple_flag},
|
||||
{"rtcp-mux", sizeof("rtcp-mux"),
|
||||
sdp_parse_attr_rtcp_mux_attr, sdp_build_attr_rtcp_mux_attr},
|
||||
{"fingerprint", sizeof("fingerprint"),
|
||||
|
@ -212,6 +212,11 @@ extern sdp_result_e sdp_build_attr_ice_attr (
|
||||
extern sdp_result_e sdp_parse_attr_ice_attr (
|
||||
sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr);
|
||||
|
||||
extern sdp_result_e sdp_build_attr_simple_flag (
|
||||
sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs);
|
||||
extern sdp_result_e sdp_parse_attr_simple_flag (
|
||||
sdp_t *sdp_p, sdp_attr_t *attr_p, const char *ptr);
|
||||
|
||||
extern sdp_result_e sdp_build_attr_rtcp_mux_attr (
|
||||
sdp_t *sdp_p, sdp_attr_t *attr_p, flex_string *fs);
|
||||
extern sdp_result_e sdp_parse_attr_rtcp_mux_attr (
|
||||
|
@ -240,6 +240,7 @@ typedef enum {
|
||||
SDP_ATTR_ICE_CANDIDATE,
|
||||
SDP_ATTR_ICE_UFRAG,
|
||||
SDP_ATTR_ICE_PWD,
|
||||
SDP_ATTR_ICE_LITE,
|
||||
SDP_ATTR_RTCP_MUX,
|
||||
SDP_ATTR_DTLS_FINGERPRINT,
|
||||
SDP_ATTR_MAXPTIME,
|
||||
|
@ -466,10 +466,12 @@ short vcmGetIceParams(const char *peerconnection, char **ufragp, char **pwdp);
|
||||
* @param[in] peerconnection - the peerconnection in use
|
||||
* @param[in] ufrag - the ufrag
|
||||
* @param[in] pwd - the pwd
|
||||
* @param[in] icelite - is peer ice lite
|
||||
*
|
||||
* @return 0 success, error failure
|
||||
*/
|
||||
short vcmSetIceSessionParams(const char *peerconnection, char *ufrag, char *pwd);
|
||||
short vcmSetIceSessionParams(const char *peerconnection, char *ufrag, char *pwd,
|
||||
cc_boolean icelite);
|
||||
|
||||
/* Set ice candidate for trickle ICE.
|
||||
*
|
||||
|
@ -789,6 +789,27 @@ TEST_F(SdpTest, addFmtpMaxFsFr) {
|
||||
std::string::npos);
|
||||
}
|
||||
|
||||
TEST_F(SdpTest, addIceLite) {
|
||||
InitLocalSdp();
|
||||
u16 inst_num = 0;
|
||||
EXPECT_EQ(sdp_add_new_attr(sdp_ptr_, SDP_SESSION_LEVEL, 0,
|
||||
SDP_ATTR_ICE_LITE, &inst_num), SDP_SUCCESS);
|
||||
std::string body = SerializeSdp();
|
||||
ASSERT_NE(body.find("a=ice-lite\r\n"), std::string::npos);
|
||||
}
|
||||
|
||||
TEST_F(SdpTest, parseIceLite) {
|
||||
std::string sdp =
|
||||
"v=0\r\n"
|
||||
"o=- 137331303 2 IN IP4 127.0.0.1\r\n"
|
||||
"s=SIP Call\r\n"
|
||||
"t=0 0\r\n"
|
||||
"a=ice-lite\r\n";
|
||||
ParseSdp(sdp);
|
||||
ASSERT_TRUE(sdp_attr_is_present(sdp_ptr_, SDP_ATTR_ICE_LITE,
|
||||
SDP_SESSION_LEVEL, 0));
|
||||
}
|
||||
|
||||
} // End namespace test.
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
@ -45,6 +45,9 @@
|
||||
#include "stunserver.cpp"
|
||||
#include "PeerConnectionImplEnumsBinding.cpp"
|
||||
|
||||
#include "ice_ctx.h"
|
||||
#include "ice_peer_ctx.h"
|
||||
|
||||
#include "mtransport_test_utils.h"
|
||||
#include "gtest_ringbuffer_dumper.h"
|
||||
MtransportTestUtils *test_utils;
|
||||
@ -2501,6 +2504,44 @@ TEST_F(SignalingTest, AudioOnlyG711Call)
|
||||
|
||||
}
|
||||
|
||||
TEST_F(SignalingTest, IncomingOfferIceLite)
|
||||
{
|
||||
EnsureInit();
|
||||
|
||||
sipcc::MediaConstraints constraints;
|
||||
std::string offer =
|
||||
"v=0\r\n"
|
||||
"o=- 1936463 1936463 IN IP4 148.147.200.251\r\n"
|
||||
"s=-\r\n"
|
||||
"c=IN IP4 148.147.200.251\r\n"
|
||||
"t=0 0\r\n"
|
||||
"a=ice-lite\r\n"
|
||||
"a=fingerprint:sha-1 "
|
||||
"E7:FA:17:DA:3F:3C:1E:D8:E4:9C:8C:4C:13:B9:2E:D5:C6:78:AB:B3\r\n"
|
||||
"m=audio 40014 RTP/SAVPF 8 0 101\r\n"
|
||||
"a=rtpmap:8 PCMA/8000\r\n"
|
||||
"a=rtpmap:0 PCMU/8000\r\n"
|
||||
"a=rtpmap:101 telephone-event/8000\r\n"
|
||||
"a=fmtp:101 0-15\r\n"
|
||||
"a=ptime:20\r\n"
|
||||
"a=sendrecv\r\n"
|
||||
"a=ice-ufrag:bf2LAgqBZdiWFR2r\r\n"
|
||||
"a=ice-pwd:ScxgaNzdBOYScR0ORleAvt1x\r\n"
|
||||
"a=candidate:1661181211 1 udp 10 148.147.200.251 40014 typ host\r\n"
|
||||
"a=candidate:1661181211 2 udp 9 148.147.200.251 40015 typ host\r\n"
|
||||
"a=setup:actpass\r\n";
|
||||
|
||||
std::cout << "Setting offer to:" << std::endl << indent(offer) << std::endl;
|
||||
a2_->SetRemote(TestObserver::OFFER, offer);
|
||||
|
||||
std::cout << "Creating answer:" << std::endl;
|
||||
a2_->CreateAnswer(constraints, offer, OFFER_AUDIO | ANSWER_AUDIO);
|
||||
a2_->SetLocal(TestObserver::ANSWER, a2_->answer());
|
||||
|
||||
ASSERT_EQ(a2_->pc->media()->ice_ctx()->GetControlling(),
|
||||
NrIceCtx::ICE_CONTROLLING);
|
||||
}
|
||||
|
||||
// This test comes from Bug814038
|
||||
TEST_F(SignalingTest, ChromeOfferAnswer)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user