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:
Anders Lund 2014-05-16 01:32:00 -05:00
parent 4296ce21ad
commit efc993ca04
16 changed files with 160 additions and 7 deletions

View File

@ -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())

View File

@ -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);

View File

@ -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;

View File

@ -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';

View File

@ -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);
}

View File

@ -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];

View File

@ -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)

View File

@ -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,

View File

@ -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)
{

View File

@ -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
*

View File

@ -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"),

View File

@ -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 (

View File

@ -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,

View File

@ -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.
*

View File

@ -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) {

View File

@ -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)
{