From fa8be542d39939793892f2641ad11a4b4c42ec6c Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Fri, 10 May 2024 15:07:34 +0200 Subject: [PATCH] MT#56465 Rework the `sdp_out_add_origin()` func Rework the `sdp_out_add_origin()` func so, that it's compatible with offer/answer model. Additionally it uses the previously existing logic for the PUBLISH operations always, regardless any conditions. Additionally: fix auto-daemon-tests-websocket accordingly. Change-Id: I0bddc67f4ebe47a24063ccc82428929aeb6cc37a --- daemon/sdp.c | 56 +++++++++++++++++++------------- t/auto-daemon-tests-websocket.py | 9 +++-- t/auto-daemon-tests.pl | 2 +- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/daemon/sdp.c b/daemon/sdp.c index 795510a0ab..e7330c5580 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -3373,36 +3373,46 @@ int sdp_replace(struct sdp_chopper *chop, sdp_sessions_q *sessions, struct call_ } static void sdp_out_add_origin(GString *out, struct call_monologue *monologue, - struct packet_stream *first_ps, sdp_ng_flags *flags) + struct packet_stream *first_ps, sdp_ng_flags *flags) { - const char * origin_address; - const char * origin_address_type; + struct call_monologue *ml = monologue; + const char *origin_address = NULL; + const char *origin_address_type = first_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name; - /* init session params */ - if (!monologue->sdp_session_id) - monologue->sdp_session_id = (unsigned long long) rtpe_now.tv_sec << 32 | rtpe_now.tv_usec; - if (!monologue->sdp_version) - monologue->sdp_version = monologue->sdp_session_id; + /* for the offer/answer model or subscribe don't use the given monologues SDP, + * but try the one of the subscription, because the given monologue itself + * has likely no session attributes set yet */ + struct media_subscription *ms = call_get_top_media_subscription(monologue); + if (ms && ms->monologue) { + ml = ms->monologue; + + if (flags->media_address.s && is_addr_unspecified(&flags->parsed_media_address)) + __parse_address(&flags->parsed_media_address, NULL, NULL, &flags->media_address); + if (flags->session_sdp_orig.parsed && + flags->replace_origin && + flags->ice_option != ICE_FORCE_RELAY && + !is_addr_unspecified(&flags->parsed_media_address)) + { + origin_address = sockaddr_print_buf(&flags->parsed_media_address); + } + } - origin_address = sockaddr_print_buf(&first_ps->selected_sfd->local_intf->advertised_address.addr); - origin_address_type = first_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name; + if (!origin_address) + /* by default for PUBLISH */ + origin_address = sockaddr_print_buf(&first_ps->selected_sfd->local_intf->advertised_address.addr); - /* replace origin */ - if (flags->media_address.s && is_addr_unspecified(&flags->parsed_media_address)) - __parse_address(&flags->parsed_media_address, NULL, NULL, &flags->media_address); - if (flags->session_sdp_orig.parsed && - flags->replace_origin && - flags->ice_option != ICE_FORCE_RELAY && - !is_addr_unspecified(&flags->parsed_media_address)) - { - origin_address = sockaddr_print_buf(&flags->parsed_media_address); - } + if (!ml->sdp_username) + ml->sdp_username = "-"; + if (!ml->sdp_session_id) + ml->sdp_session_id = (unsigned long long) rtpe_now.tv_sec << 32 | rtpe_now.tv_usec; + if (!ml->sdp_version) + ml->sdp_version = ml->sdp_session_id; g_string_append_printf(out, "o=%s %llu %llu IN %s %s\r\n", - (monologue->sdp_username ? : "-"), /* just set a dash if still absent */ - monologue->sdp_session_id, - monologue->sdp_version, + ml->sdp_username, + ml->sdp_session_id, + ml->sdp_version, origin_address_type, origin_address); } diff --git a/t/auto-daemon-tests-websocket.py b/t/auto-daemon-tests-websocket.py index 568285e6bd..24b29ae3fa 100644 --- a/t/auto-daemon-tests-websocket.py +++ b/t/auto-daemon-tests-websocket.py @@ -613,7 +613,7 @@ def testVideoroomWebRTC(self): sdp, re.compile( "^v=0\r\n" - "o=- \d+ \d+ IN IP4 203.0.113.1\r\n" + "o=x \d+ \d+ IN IP4 203.0.113.1\r\n" "s=foobar\r\n" "t=0 0\r\n" "m=audio \d+ UDP/TLS/RTP/SAVPF 8\r\n" @@ -901,7 +901,7 @@ def testVideoroomWebRTCAlt(self): sdp, re.compile( "^v=0\r\n" - "o=- \d+ \d+ IN IP4 203.0.113.1\r\n" + "o=x \d+ \d+ IN IP4 203.0.113.1\r\n" "s=foobar\r\n" "t=0 0\r\n" "m=audio \d+ UDP/TLS/RTP/SAVPF 8\r\n" @@ -2019,7 +2019,7 @@ def testVideoroomICE(self): sdp, re.compile( "^v=0\r\n" - "o=- \d+ \d+ IN IP4 203.0.113.1\r\n" + "o=x \d+ \d+ IN IP4 203.0.113.1\r\n" "s=foobar\r\n" "t=0 0\r\n" "m=audio \d+ UDP/TLS/RTP/SAVPF 8\r\n" @@ -2627,7 +2627,6 @@ def testVideoroomMultiConn(self): eventloop.run_until_complete(testIJanus(self, 1)) sdp = self._res["jsep"]["sdp"] self.assertIsInstance(sdp, str) - match_re = re.compile( "^v=0\r\n" "o=x \d+ \d+ IN IP4 203.0.113.1\r\n" @@ -3152,7 +3151,7 @@ def testVideoroomMute(self): match_re = re.compile( "^v=0\r\n" - "o=- \d+ \d+ IN IP4 203.0.113.1\r\n" + "o=x \d+ \d+ IN IP4 203.0.113.1\r\n" "s=foobar\r\n" "t=0 0\r\n" "m=audio (\d+) RTP/AVP 96\r\n" diff --git a/t/auto-daemon-tests.pl b/t/auto-daemon-tests.pl index 2929988a54..69c8b1d3f7 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -1554,7 +1554,7 @@ sub stun_succ { subscribe_request('AMR asymmetric', {flags => [qw/SIPREC all/]}, <