MT#55283 rename SDP origin fields

and integrate them into the main struct

Change-Id: Ie5c0ed8e98bce4e20c801ff0413ff3245b0c9792
pull/2056/head
Richard Fuchs 2 months ago
parent 63a1c8e27d
commit d8915abc79

@ -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);

@ -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)

@ -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 */

@ -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;

@ -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 *);

Loading…
Cancel
Save