diff --git a/daemon/sdp.c b/daemon/sdp.c index 2da043573..c5231074e 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -271,14 +271,10 @@ struct attribute_t38faxudpecdepth { struct sdp_attribute { /* example: a=rtpmap:8 PCMA/8000 */ - str full_line; /* including a= and \r\n */ - str line_value; /* without a= and without \r\n */ - str name; /* just "rtpmap" */ - str value; /* just "8 PCMA/8000" */ - str key; /* "rtpmap:8" */ str param; /* "PCMA/8000" */ + struct sdp_attribute_strs strs; enum attr_id attr; union { @@ -351,11 +347,11 @@ static bool sdp_manipulate_remove_c(const char *attr_name, sdp_ng_flags *flags, static bool sdp_manipulate_remove_attr(struct sdp_manipulations *sdp_manipulations, const struct sdp_attribute *attr) { - if (sdp_manipulate_remove(sdp_manipulations, &attr->key)) + if (sdp_manipulate_remove(sdp_manipulations, &attr->strs.key)) return true; - if (sdp_manipulate_remove(sdp_manipulations, &attr->name)) + if (sdp_manipulate_remove(sdp_manipulations, &attr->strs.name)) return true; - if (sdp_manipulate_remove(sdp_manipulations, &attr->line_value)) + if (sdp_manipulate_remove(sdp_manipulations, &attr->strs.line_value)) return true; return false; } @@ -411,11 +407,11 @@ static str *sdp_manipulations_subst_attr(struct sdp_manipulations * sdp_manipula { str * cmd_subst_value; - if ((cmd_subst_value = sdp_manipulations_subst(sdp_manipulations, &attr->key))) + if ((cmd_subst_value = sdp_manipulations_subst(sdp_manipulations, &attr->strs.key))) return cmd_subst_value; - if ((cmd_subst_value = sdp_manipulations_subst(sdp_manipulations, &attr->name))) + if ((cmd_subst_value = sdp_manipulations_subst(sdp_manipulations, &attr->strs.name))) return cmd_subst_value; - if ((cmd_subst_value = sdp_manipulations_subst(sdp_manipulations, &attr->line_value))) + if ((cmd_subst_value = sdp_manipulations_subst(sdp_manipulations, &attr->strs.line_value))) return cmd_subst_value; return NULL; } @@ -490,7 +486,7 @@ static int parse_address(struct network_address *address) { output->field.parsed.ipv4.s_addr = 1; \ } } while (0) -#define PARSE_INIT str v_str = output->value; str *value_str = &v_str +#define PARSE_INIT str v_str = output->strs.value; str *value_str = &v_str static int parse_origin(str *value_str, struct sdp_origin *output) { if (output->parsed) @@ -587,7 +583,7 @@ static int parse_attribute_group(struct sdp_attribute *output) { output->attr = ATTR_GROUP; output->group.semantics = GROUP_OTHER; - if (output->value.len >= 7 && !strncmp(output->value.s, "BUNDLE ", 7)) + if (output->strs.value.len >= 7 && !strncmp(output->strs.value.s, "BUNDLE ", 7)) output->group.semantics = GROUP_BUNDLE; return 0; @@ -731,7 +727,7 @@ error: } static int parse_attribute_rtcp(struct sdp_attribute *output) { - if (!output->value.s) + if (!output->strs.value.s) goto err; output->attr = ATTR_RTCP; @@ -841,7 +837,9 @@ static int parse_attribute_candidate(struct sdp_attribute *output, bool extended // 1 = parsed ok but unsupported candidate type int sdp_parse_candidate(struct ice_candidate *cand, const str *s) { struct sdp_attribute attr = { - .value = *s, + .strs = { + .value = *s, + }, }; if (parse_attribute_candidate(&attr, true)) @@ -910,13 +908,13 @@ done: static int parse_attribute_setup(struct sdp_attribute *output) { output->attr = ATTR_SETUP; - if (!str_cmp(&output->value, "actpass")) + if (!str_cmp(&output->strs.value, "actpass")) output->setup.value = SETUP_ACTPASS; - else if (!str_cmp(&output->value, "active")) + else if (!str_cmp(&output->strs.value, "active")) output->setup.value = SETUP_ACTIVE; - else if (!str_cmp(&output->value, "passive")) + else if (!str_cmp(&output->strs.value, "passive")) output->setup.value = SETUP_PASSIVE; - else if (!str_cmp(&output->value, "holdconn")) + else if (!str_cmp(&output->strs.value, "holdconn")) output->setup.value = SETUP_HOLDCONN; return 0; @@ -1011,7 +1009,7 @@ static int parse_attribute_fmtp(struct sdp_attribute *output) { static int parse_attribute_int(struct sdp_attribute *output, enum attr_id attr_id, int defval) { output->attr = attr_id; - output->i = str_to_i(&output->value, defval); + output->i = str_to_i(&output->strs.value, defval); return 0; } @@ -1019,7 +1017,7 @@ static int parse_attribute_int(struct sdp_attribute *output, enum attr_id attr_i static int parse_attribute_t38faxudpec(struct sdp_attribute *output) { output->attr = ATTR_T38FAXUDPEC; - switch (__csh_lookup(&output->value)) { + switch (__csh_lookup(&output->strs.value)) { case CSH_LOOKUP("t38UDPNoEC"): output->t38faxudpec.ec = EC_NONE; break; @@ -1041,7 +1039,7 @@ static int parse_attribute_t38faxudpec(struct sdp_attribute *output) { static int parse_attribute_t38faxratemanagement(struct sdp_attribute *output) { output->attr = ATTR_T38FAXRATEMANAGEMENT; - switch (__csh_lookup(&output->value)) { + switch (__csh_lookup(&output->strs.value)) { case CSH_LOOKUP("localTFC"): output->t38faxratemanagement.rm = RM_LOCALTCF; break; @@ -1076,16 +1074,16 @@ static int parse_attribute_t38faxudpecdepth(struct sdp_attribute *output) { static int parse_attribute(struct sdp_attribute *a) { int ret; - a->name = a->line_value; - if (str_chr_str(&a->value, &a->name, ':')) { - a->name.len -= a->value.len; - a->value.s++; - a->value.len--; + a->strs.name = a->strs.line_value; + if (str_chr_str(&a->strs.value, &a->strs.name, ':')) { + a->strs.name.len -= a->strs.value.len; + a->strs.value.s++; + a->strs.value.len--; - a->key = a->name; - if (str_chr_str(&a->param, &a->value, ' ')) { - a->key.len += 1 + - (a->value.len - a->param.len); + a->strs.key = a->strs.name; + if (str_chr_str(&a->param, &a->strs.value, ' ')) { + a->strs.key.len += 1 + + (a->strs.value.len - a->param.len); a->param.s++; a->param.len--; @@ -1094,11 +1092,11 @@ static int parse_attribute(struct sdp_attribute *a) { a->param.s = NULL; } else - a->key.len += 1 + a->value.len; + a->strs.key.len += 1 + a->strs.value.len; } ret = 0; - switch (__csh_lookup(&a->name)) { + switch (__csh_lookup(&a->strs.name)) { case CSH_LOOKUP("mid"): a->attr = ATTR_MID; break; @@ -1338,8 +1336,8 @@ new_session: attr->full_line.s = b; attr->full_line.len = next_line ? (next_line - b) : (line_end - b); - attr->line_value.s = value; - attr->line_value.len = line_end - value; + attr->strs.line_value.s = value; + attr->strs.line_value.len = line_end - value; if (parse_attribute(attr)) { attr_free(attr); @@ -1568,7 +1566,7 @@ static void __sdp_ice(struct stream_params *sp, struct sdp_media *media) { attr = attr_get_by_id_m_s(media, ATTR_ICE_UFRAG); if (!attr) return; - sp->ice_ufrag = attr->value; + sp->ice_ufrag = attr->strs.value; SP_SET(sp, ICE); @@ -1588,7 +1586,7 @@ static void __sdp_ice(struct stream_params *sp, struct sdp_media *media) { no_cand: if ((attr = attr_get_by_id_m_s(media, ATTR_ICE_OPTIONS))) { - if (str_str(&attr->value, "trickle") >= 0) + if (str_str(&attr->strs.value, "trickle") >= 0) SP_SET(sp, TRICKLE_ICE); } else if (is_trickle_ice_address(&sp->rtp_endpoint)) @@ -1599,7 +1597,7 @@ no_cand: attr = attr_get_by_id_m_s(media, ATTR_ICE_PWD); if (attr) - sp->ice_pwd = attr->value; + sp->ice_pwd = attr->strs.value; } static void __sdp_t38(struct stream_params *sp, struct sdp_media *media) { @@ -1643,15 +1641,15 @@ static void __sdp_t38(struct stream_params *sp, struct sdp_media *media) { to->max_ifp = attr->i; attr = attr_get_by_id(&media->attributes, ATTR_T38FAXFILLBITREMOVAL); - if (attr && (!attr->value.len || str_cmp(&attr->value, "0"))) + if (attr && (!attr->strs.value.len || str_cmp(&attr->strs.value, "0"))) to->fill_bit_removal = 1; attr = attr_get_by_id(&media->attributes, ATTR_T38FAXTRANSCODINGMMR); - if (attr && (!attr->value.len || str_cmp(&attr->value, "0"))) + if (attr && (!attr->strs.value.len || str_cmp(&attr->strs.value, "0"))) to->transcoding_mmr = 1; attr = attr_get_by_id(&media->attributes, ATTR_T38FAXTRANSCODINGJBIG); - if (attr && (!attr->value.len || str_cmp(&attr->value, "0"))) + if (attr && (!attr->strs.value.len || str_cmp(&attr->strs.value, "0"))) to->transcoding_jbig = 1; attr = attr_get_by_id(&media->attributes, ATTR_T38FAXRATEMANAGEMENT); @@ -1794,8 +1792,8 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f // a=ptime attr = attr_get_by_id(&media->attributes, ATTR_PTIME); - if (attr && attr->value.s) - sp->ptime = str_to_i(&attr->value, 0); + if (attr && attr->strs.value.s) + sp->ptime = str_to_i(&attr->strs.value, 0); sp->format_str = media->formats; errstr = "Invalid RTP payload types"; @@ -1838,7 +1836,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f attrs = attr_list_get_by_id(&media->attributes, ATTR_EXTMAP); for (__auto_type ll = attrs ? attrs->head : NULL; ll; ll = ll->next) { attr = ll->data; - str * ret = str_dup(&attr->line_value); + str * ret = str_dup(&attr->strs.line_value); t_queue_push_tail(&sp->attributes, ret); } } @@ -1847,7 +1845,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f attrs = attr_list_get_by_id(&media->attributes, ATTR_OTHER); for (__auto_type ll = attrs ? attrs->head : NULL; ll; ll = ll->next) { attr = ll->data; - str * ret = str_dup(&attr->line_value); + str * ret = str_dup(&attr->strs.line_value); t_queue_push_tail(&sp->attributes, ret); } } @@ -1888,7 +1886,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f // a=tls-id attr = attr_get_by_id_m_s(media, ATTR_TLS_ID); if (attr) - sp->tls_id = attr->value; + sp->tls_id = attr->strs.value; // OSRTP (RFC 8643) if (sp->protocol && sp->protocol->rtp && !sp->protocol->srtp @@ -1904,7 +1902,7 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f // a=mid attr = attr_get_by_id(&media->attributes, ATTR_MID); if (attr) - sp->media_id = attr->value; + sp->media_id = attr->strs.value; // be ignorant about the contents if (attr_get_by_id(&media->attributes, ATTR_RTCP_FB)) @@ -3007,7 +3005,7 @@ void sdp_copy_session_attributes(struct call_monologue * src, struct call_monolo t_queue_clear_full(&dst->sdp_attributes, str_free); for (__auto_type ll = src_attributes ? src_attributes->head : NULL; ll; ll = ll->next) { attr = ll->data; - str * ret = str_dup(&attr->line_value); + str * ret = str_dup(&attr->strs.line_value); t_queue_push_tail(&dst->sdp_attributes, ret); } } @@ -3460,7 +3458,7 @@ int sdp_is_duplicate(sdp_sessions_q *sessions) { return 0; for (__auto_type ql = attr_list->head; ql; ql = ql->next) { struct sdp_attribute *attr = ql->data; - if (!str_cmp_str(&attr->value, &rtpe_instance_id)) + if (!str_cmp_str(&attr->strs.value, &rtpe_instance_id)) goto next; } return 0; diff --git a/include/sdp.h b/include/sdp.h index e8cd81e16..d7d17ff02 100644 --- a/include/sdp.h +++ b/include/sdp.h @@ -26,6 +26,14 @@ struct sdp_chopper { ssize_t offset; // for post-processing using chopper_replace }; +struct sdp_attribute_strs { + /* example: a=rtpmap:8 PCMA/8000 */ + str line_value; /* without a= and without \r\n */ + str name; /* just "rtpmap" */ + str value; /* just "8 PCMA/8000" */ + str key; /* "rtpmap:8" */ +}; + extern const str rtpe_instance_id;