From e40af889d19915c13ac4aa16741f46d58141b291 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Mon, 8 Jul 2024 16:48:35 +0200 Subject: [PATCH] MT#60476 Move `call_subscribe_request_ng()` to `sdp_create()` Move the `call_subscribe_request_ng()` fully to a usage of the `sdp_create()` only. Carry the origin IP and net family via flags to the monologue, so can be reused later when creating SDP. Always use given SDP session origin IP address and family for the SDP being prepared, unless sdp origin replacement is required via given flags (in this case just used an advertised IP of rtpengine). Additionally: fix unit tests for subscribe cases accordingly to the policy. Change-Id: Ib7697876ce45e01597edd27764d4147d12f738c8 --- daemon/call.c | 15 ++++++++++++++ daemon/call_interfaces.c | 37 ++++++----------------------------- daemon/janus.c | 2 ++ daemon/sdp.c | 14 ++++++------- include/call.h | 9 ++++++--- t/auto-daemon-tests-pubsub.pl | 26 ++++++++++++------------ t/auto-daemon-tests-redis.pl | 2 +- t/auto-daemon-tests.pl | 2 +- 8 files changed, 51 insertions(+), 56 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 75f5a9b7f..1312ffe6d 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2630,11 +2630,26 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, sdp_ng_f /* consume sdp session parts */ { /* origin (name, version etc.) */ + /* TODO: rework the whole SDP origin into one structure */ if (!ml->sdp_username && flags->session_sdp_orig.username.len) + { ml->sdp_username = call_strdup_len(call, flags->session_sdp_orig.username.s, flags->session_sdp_orig.username.len); + } if (!ml->sdp_session_id && flags->session_sdp_orig.session_id.len) + { ml->sdp_session_id = str_to_ui(&flags->session_sdp_orig.session_id, 0); + } + if (!ml->sdp_origin_ip && flags->session_sdp_orig.address.address.len) + { + ml->sdp_origin_ip = call_strdup_len(call, flags->session_sdp_orig.address.address.s, + flags->session_sdp_orig.address.address.len); + } + if (!ml->sdp_origin_ip_family && flags->session_sdp_orig.address.address_type.len) + { + ml->sdp_origin_ip_family = call_strdup_len(call, flags->session_sdp_orig.address.address_type.s, + flags->session_sdp_orig.address.address_type.len); + } ml->sdp_version = flags->session_sdp_orig.version_num; if (ml->sdp_version == ULLONG_MAX) ml->sdp_version = (unsigned int)ssl_random(); diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index e6d16be98..069abca62 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -3728,17 +3728,6 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out if (!srms.length) return "No call participants specified (no medias found)"; - /* special case with just one source: we can use the original SDP - * TODO: deprecate it, since initially added for monologue subscriptions. - */ - struct call_monologue *sdp_ml = NULL; - if (srms.length == 1) { - struct media_subscription *ms = srms.head->data; - sdp_ml = ms->monologue; - if (!sdp_ml->last_in_sdp.len || !sdp_ml->last_in_sdp_parsed.length) - sdp_ml = NULL; - } - /* the `label=` option was possibly used above to select the from-tag -- * switch it out with `to-label=` or `set-label=` for monologue_subscribe_request * below which sets the label based on `label` for a newly created monologue */ @@ -3752,34 +3741,20 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out flags.to_tag = STR_CONST_INIT(rand_buf); rand_hex_str(flags.to_tag.s, flags.to_tag.len / 2); } - struct call_monologue *dest_ml = call_get_or_create_monologue(call, &flags.to_tag); - /* rewrite SDP, or create new? */ - struct sdp_chopper *chopper = NULL; - if (sdp_ml) { - chopper = sdp_chopper_new(&sdp_ml->last_in_sdp); - bencode_buffer_destroy_add(output->buffer, (free_func_t) sdp_chopper_destroy, chopper); - } + struct call_monologue *dest_ml = call_get_or_create_monologue(call, &flags.to_tag); int ret = monologue_subscribe_request(&srms, dest_ml, &flags); if (ret) return "Failed to request subscription"; - if (chopper && sdp_ml) { - ret = sdp_replace(chopper, &sdp_ml->last_in_sdp_parsed, dest_ml, &flags); - if (ret) - return "Failed to rewrite SDP"; - } else { - /* create new SDP */ - ret = sdp_create(&sdp_out, dest_ml, &flags); - } + /* create new SDP */ + ret = sdp_create(&sdp_out, dest_ml, &flags); + if (ret) + return "Failed to create SDP"; /* place return output SDP */ - if (chopper) { - if (chopper->output->len) - bencode_dictionary_add_string_len(output, "sdp", chopper->output->str, - chopper->output->len); - } else if (sdp_out.len) { + if (sdp_out.len) { bencode_buffer_destroy_add(output->buffer, g_free, sdp_out.s); bencode_dictionary_add_str(output, "sdp", &sdp_out); sdp_out = STR_NULL; /* ownership passed to output */ diff --git a/daemon/janus.c b/daemon/janus.c index 426ae8257..335f38411 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -630,6 +630,7 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan flags.generate_mid = 1; flags.rtcp_mirror = 1; + flags.replace_origin = 1; if (!plain_offer) ng_flags_webrtc(&flags); @@ -866,6 +867,7 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc // accept unsupported codecs if necessary flags.accept_any = 1; + flags.replace_origin = 1; int ret = monologue_publish(ml, &streams, &flags); if (ret) diff --git a/daemon/sdp.c b/daemon/sdp.c index 59cf6f745..b0a41e529 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -3413,14 +3413,14 @@ static void sdp_out_add_origin(GString *out, struct call_monologue *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)) + /* by default set to what's parsed from SDP + * but only if a replacement of origin isn't requested */ + if (!flags->replace_origin) { - origin_address = sockaddr_print_buf(&flags->parsed_media_address); + if (ml->sdp_origin_ip) + origin_address = ml->sdp_origin_ip; + if (ml->sdp_origin_ip_family) + origin_address_type = ml->sdp_origin_ip_family; } } diff --git a/include/call.h b/include/call.h index fa4ad5cc6..6a92c94ac 100644 --- a/include/call.h +++ b/include/call.h @@ -604,14 +604,17 @@ struct call_monologue { GHashTable *media_ids; struct media_player *player; struct media_player *rec_player; - unsigned long long sdp_session_id; - unsigned long long sdp_version; + /* TODO: cover all parts related to the SDP origin into one struct */ + unsigned long long sdp_session_id; /* sdp origin session id */ + unsigned long long sdp_version; /* sdp origin session ver */ int sdp_session_rr, sdp_session_rs; str last_in_sdp; sdp_sessions_q last_in_sdp_parsed; /* last parsed `sdp_session` */ sdp_streams_q last_in_sdp_streams; /* last parsed `stream_params` */ GString *last_out_sdp; - char *sdp_username; + char *sdp_username; /* sdp origin session name */ + char *sdp_origin_ip; /* sdp origin ip */ + char *sdp_origin_ip_family; /* sdp origin ip family */ char *sdp_session_name; char *sdp_session_timing; struct ssrc_hash *ssrc_hash; diff --git a/t/auto-daemon-tests-pubsub.pl b/t/auto-daemon-tests-pubsub.pl index 91a961d3c..511799640 100755 --- a/t/auto-daemon-tests-pubsub.pl +++ b/t/auto-daemon-tests-pubsub.pl @@ -105,9 +105,9 @@ snd($sock_a, $port_b, rtp(0, 4000, 7000, 0x6543, "\x00" x 160)); rcv_no($sock_c); (undef, $ttr, undef, undef, undef, $port_c) = subscribe_request('SIPREC pause/resume', - { 'from-tag' => ft(), flags => ['SIPREC'] }, < ft(), flags => ['SIPREC', 'replace-origin'] }, < ['all', 'SIPREC'] }, < ['all', 'SIPREC', 'replace-origin'] }, < ['all', 'SIPREC'] }, < ['all'] }, < [ft(), tt()] }, < ['from-tags-' . ft(), 'from-tags-' . tt()] }, < [tt(), ft()] }, < ['all', 'SIPREC'] }, < ['all', 'SIPREC'], 'to-tag' => $ttr }, < ['all', 'SIPREC'], 'to-tag' => $ttr }, < ['all', 'SIPREC'], 'to-tag' => $ttr }, < [ $ftr, $fts ] }, < [ft(), tt()] }, < [qw/SIPREC all/]}, <