diff --git a/daemon/sdp.c b/daemon/sdp.c index a771965e7..79dc9702b 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -299,6 +299,9 @@ const str rtpe_instance_id = STR_CONST(__id_buf); static void attr_free(struct sdp_attribute *p); static void attr_insert(struct sdp_attributes *attrs, struct sdp_attribute *attr); INLINE void chopper_append_c(struct sdp_chopper *c, const char *s); +void handle_sdp_media_attributes(GString *s, struct call_media *media, + struct packet_stream *rtp_ps, packet_stream_list *rtp_ps_link, + sdp_ng_flags *flags); /** * Checks whether an attribute removal request exists for a given session level. @@ -3675,6 +3678,41 @@ static void sdp_out_add_osrtp_media(GString *out, struct call_media *media, g_string_append_printf(out, "\r\n"); } +static void sdp_out_handle_osrtp1(GString *out, struct call_media *media, + unsigned int port, const struct transport_protocol *prtp, + struct packet_stream *rtp_ps, packet_stream_list *rtp_ps_link, + sdp_ng_flags *flags) +{ + if (!prtp) + return; + + if (MEDIA_ISSET(media, LEGACY_OSRTP) && !MEDIA_ISSET(media, LEGACY_OSRTP_REV)) + /* generate rejected m= line for accepted legacy OSRTP */ + sdp_out_add_osrtp_media(out, media, prtp, 0); + else if(flags->osrtp_offer_legacy && (flags->opmode == OP_OFFER || flags->opmode == OP_REQUEST)) { + const struct transport_protocol *proto = media->protocol; + media->protocol = prtp; + + sdp_out_add_osrtp_media(out, media, prtp, port); + /* add attributes and connection information only when audio is accepted */ + if (port != 0) + handle_sdp_media_attributes(out, media, rtp_ps, rtp_ps_link, flags); + + media->protocol = proto; + } +} + +static void sdp_out_handle_osrtp2(GString *out, struct call_media *media, + const struct transport_protocol *prtp) +{ + if (!prtp) + return; + + if (MEDIA_ISSET(media, LEGACY_OSRTP) && MEDIA_ISSET(media, LEGACY_OSRTP_REV)) + /* generate rejected m= line for accepted legacy OSRTP */ + sdp_out_add_osrtp_media(out, media, prtp, 0); +} + /** * TODO: after sdp_replace() is deprecated, move the content of this func * to `print_sdp_media_section()`. @@ -3771,22 +3809,8 @@ int sdp_create(str *out, struct call_monologue *monologue, sdp_ng_flags *flags) if (media->protocol && media->protocol->srtp) prtp = &transport_protocols[media->protocol->rtp_proto]; - if (prtp) { - if (MEDIA_ISSET(media, LEGACY_OSRTP) && !MEDIA_ISSET(media, LEGACY_OSRTP_REV)) - /* generate rejected m= line for accepted legacy OSRTP */ - sdp_out_add_osrtp_media(s, media, prtp, 0); - else if(flags->osrtp_offer_legacy && (flags->opmode == OP_OFFER || flags->opmode == OP_REQUEST)) { - const struct transport_protocol *proto = media->protocol; - media->protocol = prtp; - - sdp_out_add_osrtp_media(s, media, prtp, port); - /* add attributes and connection information only when audio is accepted */ - if (port != 0) - handle_sdp_media_attributes(s, media, rtp_ps, rtp_ps_link, flags); - - media->protocol = proto; - } - } + /* handle first OSRTP part */ + sdp_out_handle_osrtp1(s, media, port, prtp, rtp_ps, rtp_ps_link, flags); /* set: media type, port, protocol (e.g. RTP/SAVP) */ err = "Unknown media protocol"; @@ -3811,9 +3835,8 @@ int sdp_create(str *out, struct call_monologue *monologue, sdp_ng_flags *flags) if (port != 0) handle_sdp_media_attributes(s, media, rtp_ps, rtp_ps_link, flags); - if (prtp && MEDIA_ISSET(media, LEGACY_OSRTP) && MEDIA_ISSET(media, LEGACY_OSRTP_REV)) - /* generate rejected m= line for accepted legacy OSRTP */ - sdp_out_add_osrtp_media(s, media, prtp, 0); + /* handle second OSRTP part */ + sdp_out_handle_osrtp2(s, media, prtp); } /* The SDP version gets increased in case: