diff --git a/daemon/call.c b/daemon/call.c index fa3429a54..9089f573a 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2757,13 +2757,12 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c /* consume sdp session parts */ { /* for cases with origin replacements, keep the very first used origin */ - if (other_ml && !other_ml->session_last_sdp_orig && flags->session_sdp_orig.parsed) - other_ml->session_last_sdp_orig = sdp_orig_dup(&flags->session_sdp_orig); + if (other_ml && !other_ml->sdp_orig_out.parsed && flags->session_sdp_orig.parsed) + other_ml->sdp_orig_out = sdp_orig_dup(&flags->session_sdp_orig); /* origin (name, version etc.) */ if (flags->session_sdp_orig.parsed) { - sdp_orig_free(ml->session_sdp_orig); - ml->session_sdp_orig = sdp_orig_dup(&flags->session_sdp_orig); + ml->sdp_orig_in = sdp_orig_dup(&flags->session_sdp_orig); } /* sdp session name */ @@ -4507,8 +4506,8 @@ int monologue_subscribe_request(const subscription_q *srms, struct call_monologu /* update last used origin: copy from source to the dest monologue */ struct call_monologue *src_ml = src_media->monologue; - if (src_ml->session_last_sdp_orig && !dst_ml->session_last_sdp_orig) - dst_ml->session_last_sdp_orig = sdp_orig_dup(src_ml->session_last_sdp_orig); + if (src_ml->sdp_orig_out.parsed && !dst_ml->sdp_orig_out.parsed) + dst_ml->sdp_orig_out = sdp_orig_dup(&src_ml->sdp_orig_out); } monologue_media_start(dst_ml); @@ -5274,8 +5273,6 @@ void __monologue_free(struct call_monologue *m) { t_hash_table_destroy(m->media_ids); if (m->last_out_sdp) g_string_free(m->last_out_sdp, TRUE); - sdp_orig_free(m->session_sdp_orig); - sdp_orig_free(m->session_last_sdp_orig); t_queue_clear_full(&m->generic_attributes, sdp_attr_free); t_queue_clear_full(&m->all_attributes, sdp_attr_free); t_queue_clear(&m->tag_aliases); diff --git a/daemon/redis.c b/daemon/redis.c index 31265bc48..7a507d37b 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -1583,41 +1583,37 @@ static int redis_tags(call_t *c, struct redis_list *tags, parser_arg arg) { ml->sdp_session_timing = call_str_cpy(&s); /* o= */ if (!redis_hash_get_str(&s, rh, "sdp_orig_parsed")) { - sdp_orig_free(ml->session_sdp_orig); - ml->session_sdp_orig = g_new0(__typeof(*ml->session_sdp_orig), 1); - ml->session_sdp_orig->parsed = 1; - redis_hash_get_llu(&ml->session_sdp_orig->version_num, rh, "sdp_orig_version_num"); + ml->sdp_orig_in.parsed = 1; + redis_hash_get_llu(&ml->sdp_orig_in.version_num, rh, "sdp_orig_version_num"); if (!redis_hash_get_str(&s, rh, "sdp_orig_username")) - ml->session_sdp_orig->username = call_str_cpy(&s); + ml->sdp_orig_in.username = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_session_id")) - ml->session_sdp_orig->session_id = call_str_cpy(&s); + ml->sdp_orig_in.session_id = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_version_str")) - ml->session_sdp_orig->version_str = call_str_cpy(&s); + ml->sdp_orig_in.version_str = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_address_network_type")) - ml->session_sdp_orig->address.network_type = call_str_cpy(&s); + ml->sdp_orig_in.address.network_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_address_address_type")) - ml->session_sdp_orig->address.address_type = call_str_cpy(&s); + ml->sdp_orig_in.address.address_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_address_address")) - ml->session_sdp_orig->address.address = call_str_cpy(&s); + ml->sdp_orig_in.address.address = call_str_cpy(&s); } /* o= last used of the other side*/ if (!redis_hash_get_str(&s, rh, "last_sdp_orig_parsed")) { - sdp_orig_free(ml->session_last_sdp_orig); - ml->session_last_sdp_orig = g_new0(__typeof(*ml->session_last_sdp_orig), 1); - ml->session_last_sdp_orig->parsed = 1; - redis_hash_get_llu(&ml->session_last_sdp_orig->version_num, rh, "last_sdp_orig_version_num"); + ml->sdp_orig_out.parsed = 1; + redis_hash_get_llu(&ml->sdp_orig_out.version_num, rh, "last_sdp_orig_version_num"); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_username")) - ml->session_last_sdp_orig->username = call_str_cpy(&s); + ml->sdp_orig_out.username = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_session_id")) - ml->session_last_sdp_orig->session_id = call_str_cpy(&s); + ml->sdp_orig_out.session_id = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_version_str")) - ml->session_last_sdp_orig->version_str = call_str_cpy(&s); + ml->sdp_orig_out.version_str = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_address_network_type")) - ml->session_last_sdp_orig->address.network_type = call_str_cpy(&s); + ml->sdp_orig_out.address.network_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_address_address_type")) - ml->session_last_sdp_orig->address.address_type = call_str_cpy(&s); + ml->sdp_orig_out.address.address_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_address_address")) - ml->session_last_sdp_orig->address.address = call_str_cpy(&s); + ml->sdp_orig_out.address.address = call_str_cpy(&s); } ml->sdp_session_bandwidth.as = (!redis_hash_get_ld(&il, rh, "sdp_session_as")) ? il : -1; @@ -2653,25 +2649,25 @@ static str redis_encode_json(ng_parser_ctx_t *ctx, call_t *c, void **to_free) { JSON_SET_SIMPLE_STR("sdp_session_name", &ml->sdp_session_name); JSON_SET_SIMPLE_STR("sdp_session_timing", &ml->sdp_session_timing); - if (ml->session_sdp_orig) { - JSON_SET_SIMPLE_STR("sdp_orig_username", &ml->session_sdp_orig->username); - JSON_SET_SIMPLE_STR("sdp_orig_session_id", &ml->session_sdp_orig->session_id); - JSON_SET_SIMPLE_STR("sdp_orig_version_str", &ml->session_sdp_orig->version_str); - JSON_SET_SIMPLE("sdp_orig_version_num", "%llu", (long long unsigned) ml->session_sdp_orig->version_num); - JSON_SET_SIMPLE("sdp_orig_parsed", "%u", (unsigned int) ml->session_sdp_orig->parsed); - JSON_SET_SIMPLE_STR("sdp_orig_address_network_type", &ml->session_sdp_orig->address.network_type); - JSON_SET_SIMPLE_STR("sdp_orig_address_address_type", &ml->session_sdp_orig->address.address_type); - JSON_SET_SIMPLE_STR("sdp_orig_address_address", &ml->session_sdp_orig->address.address); + if (ml->sdp_orig_in.parsed) { + JSON_SET_SIMPLE_STR("sdp_orig_username", &ml->sdp_orig_in.username); + JSON_SET_SIMPLE_STR("sdp_orig_session_id", &ml->sdp_orig_in.session_id); + JSON_SET_SIMPLE_STR("sdp_orig_version_str", &ml->sdp_orig_in.version_str); + JSON_SET_SIMPLE("sdp_orig_version_num", "%llu", ml->sdp_orig_in.version_num); + JSON_SET_SIMPLE("sdp_orig_parsed", "%u", ml->sdp_orig_in.parsed); + JSON_SET_SIMPLE_STR("sdp_orig_address_network_type", &ml->sdp_orig_in.address.network_type); + JSON_SET_SIMPLE_STR("sdp_orig_address_address_type", &ml->sdp_orig_in.address.address_type); + JSON_SET_SIMPLE_STR("sdp_orig_address_address", &ml->sdp_orig_in.address.address); } - if (ml->session_last_sdp_orig) { - JSON_SET_SIMPLE_STR("last_sdp_orig_username", &ml->session_last_sdp_orig->username); - JSON_SET_SIMPLE_STR("last_sdp_orig_session_id", &ml->session_last_sdp_orig->session_id); - JSON_SET_SIMPLE_STR("last_sdp_orig_version_str", &ml->session_last_sdp_orig->version_str); - JSON_SET_SIMPLE("last_sdp_orig_version_num", "%llu", (long long unsigned) ml->session_last_sdp_orig->version_num); - JSON_SET_SIMPLE("last_sdp_orig_parsed", "%u", (unsigned int) ml->session_last_sdp_orig->parsed); - JSON_SET_SIMPLE_STR("last_sdp_orig_address_network_type", &ml->session_last_sdp_orig->address.network_type); - JSON_SET_SIMPLE_STR("last_sdp_orig_address_address_type", &ml->session_last_sdp_orig->address.address_type); - JSON_SET_SIMPLE_STR("last_sdp_orig_address_address", &ml->session_last_sdp_orig->address.address); + if (ml->sdp_orig_out.parsed) { + JSON_SET_SIMPLE_STR("last_sdp_orig_username", &ml->sdp_orig_out.username); + JSON_SET_SIMPLE_STR("last_sdp_orig_session_id", &ml->sdp_orig_out.session_id); + JSON_SET_SIMPLE_STR("last_sdp_orig_version_str", &ml->sdp_orig_out.version_str); + JSON_SET_SIMPLE("last_sdp_orig_version_num", "%llu", ml->sdp_orig_out.version_num); + JSON_SET_SIMPLE("last_sdp_orig_parsed", "%u", ml->sdp_orig_out.parsed); + JSON_SET_SIMPLE_STR("last_sdp_orig_address_network_type", &ml->sdp_orig_out.address.network_type); + JSON_SET_SIMPLE_STR("last_sdp_orig_address_address_type", &ml->sdp_orig_out.address.address_type); + JSON_SET_SIMPLE_STR("last_sdp_orig_address_address", &ml->sdp_orig_out.address.address); } if (ml->sdp_session_bandwidth.as >= 0) diff --git a/daemon/sdp.c b/daemon/sdp.c index 705d23b63..7b6ac7374 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -1901,27 +1901,23 @@ void sdp_attr_free(struct sdp_attr *c) { g_free(c); } -sdp_origin *sdp_orig_dup(const sdp_origin *orig) { - sdp_origin *copy = g_new0(__typeof(*copy), 1); - copy->username = call_str_cpy(&orig->username); - copy->session_id = call_str_cpy(&orig->session_id); - copy->version_str = call_str_cpy(&orig->version_str); - copy->version_num = orig->version_num; - copy->version_output_pos = orig->version_output_pos; - copy->parsed = orig->parsed; +sdp_origin sdp_orig_dup(const sdp_origin *orig) { + sdp_origin copy = {}; + copy.username = call_str_cpy(&orig->username); + copy.session_id = call_str_cpy(&orig->session_id); + copy.version_str = call_str_cpy(&orig->version_str); + copy.version_num = orig->version_num; + copy.version_output_pos = orig->version_output_pos; + copy.parsed = orig->parsed; /* struct network_address */ - copy->address.network_type = call_str_cpy(&orig->address.network_type); - copy->address.address_type = call_str_cpy(&orig->address.address_type); - copy->address.address = call_str_cpy(&orig->address.address); - copy->address.parsed = orig->address.parsed; + copy.address.network_type = call_str_cpy(&orig->address.network_type); + copy.address.address_type = call_str_cpy(&orig->address.address_type); + copy.address.address = call_str_cpy(&orig->address.address); + copy.address.parsed = orig->address.parsed; return copy; } -void sdp_orig_free(sdp_origin *o) { - g_free(o); -} - static void sdp_attr_append1(sdp_attr_q *dst, const struct sdp_attribute *attr) { if (!attr) return; @@ -2744,14 +2740,14 @@ static void sdp_version_check(GString *s, struct call_monologue *monologue, struct call_monologue *source_ml, bool force_increase) { - if (!monologue->session_last_sdp_orig) + if (!monologue->sdp_orig_out.parsed) return; - sdp_origin *origin = monologue->session_last_sdp_orig; + sdp_origin *origin = &monologue->sdp_orig_out; sdp_origin *other_origin = NULL; - if (source_ml && source_ml->session_sdp_orig) - other_origin = source_ml->session_sdp_orig; + if (source_ml && source_ml->sdp_orig_in.parsed) + other_origin = &source_ml->sdp_orig_in; /* We really expect only a single session here, but we treat all the same regardless, * and use the same version number on all of them */ @@ -3017,20 +3013,20 @@ static void sdp_out_add_origin(GString *out, struct call_monologue *monologue, /* orig username * session_last_sdp_orig is stored on the other media always, * so if origin is meant for the A media, then it is stored on the B one */ - str * orig_username = (monologue->session_last_sdp_orig && + str * orig_username = (monologue->sdp_orig_out.parsed && (flags->replace_username || flags->replace_origin_full)) ? - &monologue->session_last_sdp_orig->username : &ml->session_sdp_orig->username; + &monologue->sdp_orig_out.username : &ml->sdp_orig_in.username; /* orig session id */ - str * orig_session_id = (monologue->session_last_sdp_orig && flags->replace_origin_full) ? - &monologue->session_last_sdp_orig->session_id : &ml->session_sdp_orig->session_id; + str * orig_session_id = (monologue->sdp_orig_out.parsed && flags->replace_origin_full) ? + &monologue->sdp_orig_out.session_id : &ml->sdp_orig_in.session_id; /* orig session ver * replacement is handled later in sdp_create() based on SDP changes */ - unsigned long long orig_session_version = ml->session_sdp_orig->version_num; + unsigned long long orig_session_version = ml->sdp_orig_in.version_num; /* record origin version position for replacements * + 4 - means: `o=` + 2 spaces between username and version / version and id */ - ml->session_sdp_orig->version_output_pos = out->len + orig_username->len + orig_session_id->len + 4; + ml->sdp_orig_in.version_output_pos = out->len + orig_username->len + orig_session_id->len + 4; /* orig IP family and address */ str orig_address_type; @@ -3040,8 +3036,8 @@ static void sdp_out_add_origin(GString *out, struct call_monologue *monologue, orig_address_type = STR(first_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name); orig_address = STR(sockaddr_print_buf(&first_ps->selected_sfd->local_intf->advertised_address.addr)); } else { - orig_address_type = ml->session_sdp_orig->address.address_type; - orig_address = ml->session_sdp_orig->address.address; + orig_address_type = ml->sdp_orig_in.address.address_type; + orig_address = ml->sdp_orig_in.address.address; } /* print it to the output sdp */ diff --git a/include/call.h b/include/call.h index 744441c44..13e9e3fcc 100644 --- a/include/call.h +++ b/include/call.h @@ -629,8 +629,8 @@ struct call_monologue { struct session_bandwidth sdp_session_bandwidth; GString *last_out_sdp; - sdp_origin * session_sdp_orig; /* actual origin belonging to this monologue */ - sdp_origin * session_last_sdp_orig; /* previously used origin by other other side */ + sdp_origin sdp_orig_in; /* actual origin belonging to this monologue */ + sdp_origin sdp_orig_out; /* previously used origin by other other side */ str sdp_session_name; str sdp_session_timing; diff --git a/include/sdp.h b/include/sdp.h index 61c6a516b..cc9323a85 100644 --- a/include/sdp.h +++ b/include/sdp.h @@ -41,8 +41,7 @@ void append_v_str_attr_to_gstring(GString *s, const str *name, const sdp_ng_flag #define sdp_append_attr(s, g, t, n, f, ...) append_v_str_attr_to_gstring(s, STR_PTR(n), g, t, f, ##__VA_ARGS__) void sdp_attr_free(struct sdp_attr *); -sdp_origin *sdp_orig_dup(const sdp_origin *orig); -void sdp_orig_free(sdp_origin *o); +sdp_origin sdp_orig_dup(const sdp_origin *orig); bool sdp_parse(str *body, sdp_sessions_q *sessions, const sdp_ng_flags *); bool sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_flags *);