diff --git a/daemon/sdp.c b/daemon/sdp.c index 60343acd4..50b198b32 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -758,15 +758,7 @@ void sdp_free(GQueue *sessions) { static int fill_stream_address(struct stream_input *si, struct sdp_media *media, struct sdp_ng_flags *flags) { struct sdp_session *session = media->session; - if (flags->media_address.s) { - if (is_addr_unspecified(&flags->parsed_media_address)) { - if (__parse_address(&flags->parsed_media_address, NULL, NULL, - &flags->media_address)) - return -1; - } - si->stream.ip46 = flags->parsed_media_address; - } - else if (!flags->trust_address) { + if (!flags->trust_address) { if (is_addr_unspecified(&flags->parsed_received_from)) { if (__parse_address(&flags->parsed_received_from, NULL, &flags->received_from_family, &flags->received_from_address)) @@ -1095,7 +1087,7 @@ static int insert_ice_address_alt(struct sdp_chopper *chop, struct streamrelay * } static int replace_network_address(struct sdp_chopper *chop, struct network_address *address, - struct streamrelay *sr) + struct streamrelay *sr, struct sdp_ng_flags *flags) { char buf[64]; int len; @@ -1106,9 +1098,20 @@ static int replace_network_address(struct sdp_chopper *chop, struct network_addr if (copy_up_to(chop, &address->address_type)) return -1; - mutex_lock(&sr->up->up->lock); - call_stream_address(buf, sr->up, SAF_NG, &len); - mutex_unlock(&sr->up->up->lock); + if (!is_addr_unspecified(&flags->parsed_media_address)) { + if (IN6_IS_ADDR_V4MAPPED(&flags->parsed_media_address)) + len = sprintf(buf, "IP4 " IPF, IPP(flags->parsed_media_address.s6_addr32[3])); + else { + memcpy(buf, "IP6 ", 4); + inet_ntop(AF_INET6, &flags->parsed_media_address, buf + 4, sizeof(buf)-4); + len = strlen(buf); + } + } + else { + mutex_lock(&sr->up->up->lock); + call_stream_address(buf, sr->up, SAF_NG, &len); + mutex_unlock(&sr->up->up->lock); + } chopper_append_dup(chop, buf, len); if (skip_over(chop, &address->address)) @@ -1454,6 +1457,13 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, off = opmode; m = call->callstreams->head; do_ice = (flags->ice_force || (!has_ice(sessions) && !flags->ice_remove)) ? 1 : 0; + if (flags->media_address.s) { + if (is_addr_unspecified(&flags->parsed_media_address)) { + if (__parse_address(&flags->parsed_media_address, NULL, NULL, + &flags->media_address)) + return -1; + } + } for (l = sessions->head; l; l = l->next) { session = l->data; @@ -1474,11 +1484,11 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, fill_relays(&rtp, &rtcp, m, off, NULL, NULL); if (session->origin.parsed && flags->replace_origin) { - if (replace_network_address(chop, &session->origin.address, rtp)) + if (replace_network_address(chop, &session->origin.address, rtp, flags)) goto error; } if (session->connection.parsed && sess_conn) { - if (replace_network_address(chop, &session->connection.address, rtp)) + if (replace_network_address(chop, &session->connection.address, rtp, flags)) goto error; } @@ -1515,7 +1525,7 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, goto error; if (media->connection.parsed) { - if (replace_network_address(chop, &media->connection.address, rtp)) + if (replace_network_address(chop, &media->connection.address, rtp, flags)) goto error; }