res_pjsip_sdp_rtp: include ice in ANSWER only if offered
authorTorrey Searle <torrey@voxbone.com>
Mon, 9 Jul 2018 09:42:11 +0000 (11:42 +0200)
committerTorrey Searle <tsearle@gmail.com>
Fri, 13 Jul 2018 08:03:40 +0000 (03:03 -0500)
Keep track if ICE candidates were in the SDP offer & only put them
in the corresponding SDP answer if the offer condaind ICE candidates

ASTERISK-27957 #close

Change-Id: Idf2597ee48e9a287e07aa4030bfa705430a13a92

include/asterisk/res_pjsip_session.h
res/res_pjsip_sdp_rtp.c
res/res_pjsip_session.c

index f6ee0f0..6c8cda6 100644 (file)
@@ -93,6 +93,8 @@ struct ast_sip_session_media {
        unsigned int locally_held:1;
        /*! \brief Does remote support rtcp_mux */
        unsigned int remote_rtcp_mux:1;
+       /*! \brief Does remote support ice */
+       unsigned int remote_ice:1;
        /*! \brief Media type of this session media */
        enum ast_media_type type;
        /*! \brief The write callback when writing frames */
index 9c32b5c..aff8b83 100644 (file)
@@ -585,6 +585,10 @@ static void add_ice_to_stream(struct ast_sip_session *session, struct ast_sip_se
                return;
        }
 
+       if (!session_media->remote_ice) {
+               return;
+       }
+
        if ((username = ice->get_ufrag(session_media->rtp))) {
                attr = pjmedia_sdp_attr_create(pool, "ice-ufrag", pj_cstr(&stmp, username));
                media->attr[media->attr_count++] = attr;
@@ -639,6 +643,33 @@ static void add_ice_to_stream(struct ast_sip_session *session, struct ast_sip_se
        ao2_ref(candidates, -1);
 }
 
+/*! \brief Function which checks for ice attributes in an audio stream */
+static void check_ice_support(struct ast_sip_session *session, struct ast_sip_session_media *session_media,
+                                  const struct pjmedia_sdp_media *remote_stream)
+{
+       struct ast_rtp_engine_ice *ice;
+       const pjmedia_sdp_attr *attr;
+       unsigned int attr_i;
+
+       if (!session->endpoint->media.rtp.ice_support || !(ice = ast_rtp_instance_get_ice(session_media->rtp))) {
+               session_media->remote_ice = 0;
+               return;
+       }
+
+       /* Find all of the candidates */
+       for (attr_i = 0; attr_i < remote_stream->attr_count; ++attr_i) {
+               attr = remote_stream->attr[attr_i];
+               if (!pj_strcmp2(&attr->name, "candidate")) {
+                       session_media->remote_ice = 1;
+                       break;
+               }
+       }
+
+       if (attr_i == remote_stream->attr_count) {
+               session_media->remote_ice = 0;
+       }
+}
+
 /*! \brief Function which processes ICE attributes in an audio stream */
 static void process_ice_attributes(struct ast_sip_session *session, struct ast_sip_session_media *session_media,
                                   const struct pjmedia_sdp_session *remote, const struct pjmedia_sdp_media *remote_stream)
@@ -1355,6 +1386,9 @@ static int negotiate_incoming_sdp_stream(struct ast_sip_session *session,
                enable_rtcp(session, session_media, stream);
        }
 
+       /* If ICE support is enabled find all the needed attributes */
+       check_ice_support(session, session_media, stream);
+
        if (set_caps(session, session_media, session_media_transport, stream, 1, asterisk_stream)) {
                return 0;
        }
index c89a7a3..1300850 100644 (file)
@@ -444,6 +444,7 @@ struct ast_sip_session_media *ast_sip_session_media_state_add(struct ast_sip_ses
                }
 
                session_media->encryption = session->endpoint->media.rtp.encryption;
+               session_media->remote_ice = session->endpoint->media.rtp.ice_support;
                session_media->keepalive_sched_id = -1;
                session_media->timeout_sched_id = -1;
                session_media->type = type;