/* * Asterisk -- An open source telephony toolkit. * * Copyright (C) 2017, Digium, Inc. * * Mark Michelson * * See http://www.asterisk.org for more information about * the Asterisk project. Please do not directly contact * any of the maintainers of this project for assistance; * the project provides a web site, mailing lists and IRC * channels for your use. * * This program is free software, distributed under the terms of * the GNU General Public License Version 2. See the LICENSE file * at the top of the source tree. */ #ifndef _ASTERISK_SDP_OPTIONS_H #define _ASTERISK_SDP_OPTIONS_H #include "asterisk/udptl.h" #include "asterisk/format_cap.h" struct ast_sdp_options; /*! * \brief SDP DTMF mode options */ enum ast_sdp_options_dtmf { /*! No DTMF to be used */ AST_SDP_DTMF_NONE, /*! Use RFC 4733 events for DTMF */ AST_SDP_DTMF_RFC_4733, /*! Use DTMF in the audio stream */ AST_SDP_DTMF_INBAND, /*! Use SIP 4733 if supported by the other side or INBAND if not */ AST_SDP_DTMF_AUTO, }; /*! * \brief ICE options * * This is an enum because it will support a TRICKLE-ICE option * in the future. */ enum ast_sdp_options_ice { /*! ICE is not enabled on this session */ AST_SDP_ICE_DISABLED, /*! Standard ICE is enabled on this session */ AST_SDP_ICE_ENABLED_STANDARD, }; /*! * \brief Implementation of the SDP * * Users of the SDP API set the implementation based on what they * natively handle. This indicates the type of SDP that the API expects * when being given an SDP, and it indicates the type of SDP that the API * returns when asked for one. */ enum ast_sdp_options_impl { /*! SDP is represented as a string */ AST_SDP_IMPL_STRING, /*! SDP is represented as a pjmedia_sdp_session */ AST_SDP_IMPL_PJMEDIA, /*! End of the list */ AST_SDP_IMPL_END, }; /*! * \brief SDP encryption options */ enum ast_sdp_options_encryption { /*! No encryption */ AST_SDP_ENCRYPTION_DISABLED, /*! SRTP SDES encryption */ AST_SDP_ENCRYPTION_SRTP_SDES, /*! DTLS encryption */ AST_SDP_ENCRYPTION_DTLS, }; /*! * \brief Callback when processing an offer SDP for our answer SDP. * \since 15.0.0 * * \details * This callback is called after merging our last negotiated topology * with the remote's offer topology and before we have sent our answer * SDP. At this point you can alter new_topology streams. You can * decline, remove formats, or rename streams. Changing anything else * on the streams is likely to not end well. * * * To decline a stream simply set the stream state to * AST_STREAM_STATE_REMOVED. You could implement a maximum number * of active streams of a given type policy. * * * To remove formats use the format API to remove any formats from a * stream. The streams have the current joint negotiated formats. * Most likely you would want to remove all but the first format. * * * To rename a stream you need to clone the stream and give it a * new name and then set it in new_topology using * ast_stream_topology_set_stream(). * * \note Removing all formats is an error. You should decline the * stream instead. * * \param context User supplied context data pointer for the SDP * state. * \param old_topology Active negotiated topology. NULL if this is * the first SDP negotiation. The old topology is available so you * can tell if any streams are new or changing type. * \param new_topology New negotiated topology that we intend to * generate the answer SDP. * * \return Nothing */ typedef void (*ast_sdp_answerer_modify_cb)(void *context, const struct ast_stream_topology *old_topology, struct ast_stream_topology *new_topology); /*! * \internal * \brief Callback when generating a topology for our SDP offer. * \since 15.0.0 * * \details * This callback is called after merging any topology updates from the * system by ast_sdp_state_update_local_topology() and before we have * sent our offer SDP. At this point you can alter new_topology * streams. You can decline, add/remove/update formats, or rename * streams. Changing anything else on the streams is likely to not * end well. * * * To decline a stream simply set the stream state to * AST_STREAM_STATE_REMOVED. You could implement a maximum number * of active streams of a given type policy. * * * To update formats use the format API to change formats of the * streams. The streams have the current proposed formats. You * could do whatever you want for formats but you should stay within * the configured formats for the stream type's endpoint. However, * you should use ast_sdp_state_update_local_topology() instead of * this backdoor method. * * * To rename a stream you need to clone the stream and give it a * new name and then set it in new_topology using * ast_stream_topology_set_stream(). * * \note Removing all formats is an error. You should decline the * stream instead. * * \note Declined new streams that are in slots higher than present in * old_topology are removed so the SDP can be smaller. The remote has * never seen those slots so we shouldn't bother keeping them. * * \param context User supplied context data pointer for the SDP * state. * \param old_topology Active negotiated topology. NULL if this is * the first SDP negotiation. The old topology is available so you * can tell if any streams are new or changing type. * \param new_topology Merged topology that we intend to generate the * offer SDP. * * \return Nothing */ typedef void (*ast_sdp_offerer_modify_cb)(void *context, const struct ast_stream_topology *old_topology, struct ast_stream_topology *new_topology); /*! * \brief Callback when generating an offer SDP to configure extra stream data. * \since 15.0.0 * * \details * This callback is called after any ast_sdp_offerer_modify_cb * callback and before we have sent our offer SDP. The callback can * call several SDP API calls to configure the proposed capabilities * of streams before we create the SDP offer. For example, the * callback could configure a stream specific connection address, T.38 * parameters, RTP instance, or UDPTL instance parameters. * * \param context User supplied context data pointer for the SDP * state. * \param topology Topology ready to configure extra stream options. * * \return Nothing */ typedef void (*ast_sdp_offerer_config_cb)(void *context, const struct ast_stream_topology *topology); /*! * \brief Callback before applying a topology. * \since 15.0.0 * * \details * This callback is called before the topology is applied so the * using module can do what is necessary before the topology becomes * active. * * \param context User supplied context data pointer for the SDP * state. * \param topology Topology ready to be applied. * * \return Nothing */ typedef void (*ast_sdp_preapply_cb)(void *context, const struct ast_stream_topology *topology); /*! * \brief Callback after applying a topology. * \since 15.0.0 * * \details * This callback is called after the topology is applied so the * using module can do what is necessary after the topology becomes * active. * * \param context User supplied context data pointer for the SDP * state. * \param topology Topology already applied. * * \return Nothing */ typedef void (*ast_sdp_postapply_cb)(void *context, const struct ast_stream_topology *topology); /*! * \since 15.0.0 * \brief Allocate a new SDP options structure. * * This will heap-allocate an SDP options structure and * initialize it to a set of default values. * * \retval NULL Allocation failure * \retval non-NULL Newly allocated SDP options */ struct ast_sdp_options *ast_sdp_options_alloc(void); /*! * \since 15.0.0 * \brief Free an SDP options structure. * * \note This only needs to be called if an error occurs between * options allocation and a call to ast_sdp_state_alloc() * Otherwise, the SDP state will take care of freeing the * options for you. * * \param options The options to free */ void ast_sdp_options_free(struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options media_address * * \param options SDP Options * \param media_address */ void ast_sdp_options_set_media_address(struct ast_sdp_options *options, const char *media_address); /*! * \since 15.0.0 * \brief Get SDP Options media_address * * \param options SDP Options * * \returns media_address */ const char *ast_sdp_options_get_media_address(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options interface_address * * \param options SDP Options * \param interface_address */ void ast_sdp_options_set_interface_address(struct ast_sdp_options *options, const char *interface_address); /*! * \since 15.0.0 * \brief Get SDP Options interface_address * * \param options SDP Options * * \returns interface_address */ const char *ast_sdp_options_get_interface_address(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options sdpowner * * \param options SDP Options * \param sdpowner */ void ast_sdp_options_set_sdpowner(struct ast_sdp_options *options, const char *sdpowner); /*! * \since 15.0.0 * \brief Get SDP Options sdpowner * * \param options SDP Options * * \returns sdpowner */ const char *ast_sdp_options_get_sdpowner(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options sdpsession * * \param options SDP Options * \param sdpsession */ void ast_sdp_options_set_sdpsession(struct ast_sdp_options *options, const char *sdpsession); /*! * \since 15.0.0 * \brief Get SDP Options sdpsession * * \param options SDP Options * * \returns sdpsession */ const char *ast_sdp_options_get_sdpsession(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options rtp_engine * * \param options SDP Options * \param rtp_engine */ void ast_sdp_options_set_rtp_engine(struct ast_sdp_options *options, const char *rtp_engine); /*! * \since 15.0.0 * \brief Get SDP Options rtp_engine * * \param options SDP Options * * \returns rtp_engine */ const char *ast_sdp_options_get_rtp_engine(const struct ast_sdp_options *options); void ast_sdp_options_set_state_context(struct ast_sdp_options *options, void *state_context); void *ast_sdp_options_get_state_context(const struct ast_sdp_options *options); void ast_sdp_options_set_answerer_modify_cb(struct ast_sdp_options *options, ast_sdp_answerer_modify_cb answerer_modify_cb); ast_sdp_answerer_modify_cb ast_sdp_options_get_answerer_modify_cb(const struct ast_sdp_options *options); void ast_sdp_options_set_offerer_modify_cb(struct ast_sdp_options *options, ast_sdp_offerer_modify_cb offerer_modify_cb); ast_sdp_offerer_modify_cb ast_sdp_options_get_offerer_modify_cb(const struct ast_sdp_options *options); void ast_sdp_options_set_offerer_config_cb(struct ast_sdp_options *options, ast_sdp_offerer_config_cb offerer_config_cb); ast_sdp_offerer_config_cb ast_sdp_options_get_offerer_config_cb(const struct ast_sdp_options *options); void ast_sdp_options_set_preapply_cb(struct ast_sdp_options *options, ast_sdp_preapply_cb preapply_cb); ast_sdp_preapply_cb ast_sdp_options_get_preapply_cb(const struct ast_sdp_options *options); void ast_sdp_options_set_postapply_cb(struct ast_sdp_options *options, ast_sdp_postapply_cb postapply_cb); ast_sdp_postapply_cb ast_sdp_options_get_postapply_cb(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options rtp_symmetric * * \param options SDP Options * \param rtp_symmetric */ void ast_sdp_options_set_rtp_symmetric(struct ast_sdp_options *options, unsigned int rtp_symmetric); /*! * \since 15.0.0 * \brief Get SDP Options rtp_symmetric * * \param options SDP Options * * \returns rtp_symmetric */ unsigned int ast_sdp_options_get_rtp_symmetric(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options rtp_ipv6 * * \param options SDP Options * \param rtp_ipv6 */ void ast_sdp_options_set_rtp_ipv6(struct ast_sdp_options *options, unsigned int rtp_ipv6); /*! * \since 15.0.0 * \brief Get SDP Options rtp_ipv6 * * \param options SDP Options * * \returns rtp_ipv6 */ unsigned int ast_sdp_options_get_rtp_ipv6(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options g726_non_standard * * \param options SDP Options * \param g726_non_standard */ void ast_sdp_options_set_g726_non_standard(struct ast_sdp_options *options, unsigned int g726_non_standard); /*! * \since 15.0.0 * \brief Get SDP Options g726_non_standard * * \param options SDP Options * * \returns g726_non_standard */ unsigned int ast_sdp_options_get_g726_non_standard(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options tos_audio * * \param options SDP Options * \param tos_audio */ void ast_sdp_options_set_tos_audio(struct ast_sdp_options *options, unsigned int tos_audio); /*! * \since 15.0.0 * \brief Get SDP Options tos_audio * * \param options SDP Options * * \returns tos_audio */ unsigned int ast_sdp_options_get_tos_audio(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options cos_audio * * \param options SDP Options * \param cos_audio */ void ast_sdp_options_set_cos_audio(struct ast_sdp_options *options, unsigned int cos_audio); /*! * \since 15.0.0 * \brief Get SDP Options cos_audio * * \param options SDP Options * * \returns cos_audio */ unsigned int ast_sdp_options_get_cos_audio(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options tos_video * * \param options SDP Options * \param tos_video */ void ast_sdp_options_set_tos_video(struct ast_sdp_options *options, unsigned int tos_video); /*! * \since 15.0.0 * \brief Get SDP Options tos_video * * \param options SDP Options * * \returns tos_video */ unsigned int ast_sdp_options_get_tos_video(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options cos_video * * \param options SDP Options * \param cos_video */ void ast_sdp_options_set_cos_video(struct ast_sdp_options *options, unsigned int cos_video); /*! * \since 15.0.0 * \brief Get SDP Options cos_video * * \param options SDP Options * * \returns cos_video */ unsigned int ast_sdp_options_get_cos_video(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options dtmf * * \param options SDP Options * \param dtmf */ void ast_sdp_options_set_dtmf(struct ast_sdp_options *options, enum ast_sdp_options_dtmf dtmf); /*! * \since 15.0.0 * \brief Get SDP Options dtmf * * \param options SDP Options * * \returns dtmf */ enum ast_sdp_options_dtmf ast_sdp_options_get_dtmf(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options ice * * \param options SDP Options * \param ice */ void ast_sdp_options_set_ice(struct ast_sdp_options *options, enum ast_sdp_options_ice ice); /*! * \since 15.0.0 * \brief Get SDP Options ice * * \param options SDP Options * * \returns ice */ enum ast_sdp_options_ice ast_sdp_options_get_ice(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options impl * * \param options SDP Options * \param impl */ void ast_sdp_options_set_impl(struct ast_sdp_options *options, enum ast_sdp_options_impl impl); /*! * \since 15.0.0 * \brief Get SDP Options impl * * \param options SDP Options * * \returns impl */ enum ast_sdp_options_impl ast_sdp_options_get_impl(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options encryption * * \param options SDP Options * \param encryption */ void ast_sdp_options_set_encryption(struct ast_sdp_options *options, enum ast_sdp_options_encryption encryption); /*! * \since 15.0.0 * \brief Get SDP Options encryption * * \param options SDP Options * * \returns encryption */ enum ast_sdp_options_encryption ast_sdp_options_get_encryption(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Get SDP Options RTCP MUX * * \param options SDP Options * * \returns Boolean indicating if RTCP MUX is enabled. */ unsigned int ast_sdp_options_get_rtcp_mux(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options RTCP MUX * * \param options SDP Options * \param value Boolean that indicates if RTCP MUX should be enabled. */ void ast_sdp_options_set_rtcp_mux(struct ast_sdp_options *options, unsigned int value); /*! * \since 15.0.0 * \brief Set SDP Options udptl_symmetric * * \param options SDP Options * \param udptl_symmetric */ void ast_sdp_options_set_udptl_symmetric(struct ast_sdp_options *options, unsigned int udptl_symmetric); /*! * \since 15.0.0 * \brief Get SDP Options udptl_symmetric * * \param options SDP Options * * \returns udptl_symmetric */ unsigned int ast_sdp_options_get_udptl_symmetric(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options udptl_error_correction * * \param options SDP Options * \param error_correction */ void ast_sdp_options_set_udptl_error_correction(struct ast_sdp_options *options, enum ast_t38_ec_modes error_correction); /*! * \since 15.0.0 * \brief Get SDP Options udptl_error_correction * * \param options SDP Options * * \returns udptl_error_correction */ enum ast_t38_ec_modes ast_sdp_options_get_udptl_error_correction(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options udptl_far_max_datagram * * \param options SDP Options * \param far_max_datagram */ void ast_sdp_options_set_udptl_far_max_datagram(struct ast_sdp_options *options, unsigned int far_max_datagram); /*! * \since 15.0.0 * \brief Get SDP Options udptl_far_max_datagram * * \param options SDP Options * * \returns udptl_far_max_datagram */ unsigned int ast_sdp_options_get_udptl_far_max_datagram(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Set SDP Options max_streams * * \param options SDP Options * \param max_streams */ void ast_sdp_options_set_max_streams(struct ast_sdp_options *options, unsigned int max_streams); /*! * \since 15.0.0 * \brief Get SDP Options max_streams * * \param options SDP Options * * \returns max_streams */ unsigned int ast_sdp_options_get_max_streams(const struct ast_sdp_options *options); /*! * \since 15.0.0 * \brief Enable setting SSRC level attributes on SDPs * * \param options SDP Options * \param ssrc Boolean indicating if SSRC attributes should be included in generated SDPs */ void ast_sdp_options_set_ssrc(struct ast_sdp_options *options, unsigned int ssrc); /*! * \since 15.0.0 * \brief Get SDP Options ssrc * * \param options SDP Options * * \returns Whether SSRC-level attributes will be added to our SDP. */ unsigned int ast_sdp_options_get_ssrc(const struct ast_sdp_options *options); /*! * \brief Set the SDP options scheduler context used to create new streams of the type. * \since 15.0.0 * * \param options SDP Options * \param type Media type the scheduler context is for. * \param sched Scheduler context to use for the specified media type. * * \return Nothing */ void ast_sdp_options_set_sched_type(struct ast_sdp_options *options, enum ast_media_type type, struct ast_sched_context *sched); /*! * \brief Get the SDP options scheduler context used to create new streams of the type. * \since 15.0.0 * * \param options SDP Options * \param type Media type the format cap represents. * * \return The stored scheduler context to create new streams of the type. */ struct ast_sched_context *ast_sdp_options_get_sched_type(const struct ast_sdp_options *options, enum ast_media_type type); /*! * \brief Set all allowed stream types to create new streams. * \since 15.0.0 * * \param options SDP Options * \param cap Format capabilities to set all allowed stream types at once. * Could be NULL to disable creating any new streams. * * \return Nothing */ void ast_sdp_options_set_format_caps(struct ast_sdp_options *options, struct ast_format_cap *cap); /*! * \brief Set the SDP options format cap used to create new streams of the type. * \since 15.0.0 * * \param options SDP Options * \param type Media type the format cap represents. * \param cap Format capabilities to use for the specified media type. * Could be NULL to disable creating new streams of type. * * \return Nothing */ void ast_sdp_options_set_format_cap_type(struct ast_sdp_options *options, enum ast_media_type type, struct ast_format_cap *cap); /*! * \brief Get the SDP options format cap used to create new streams of the type. * \since 15.0.0 * * \param options SDP Options * \param type Media type the format cap represents. * * \retval NULL if stream not allowed to be created. * \retval cap to use in negotiating the new stream. * * \note The returned cap does not have its own ao2 ref. */ struct ast_format_cap *ast_sdp_options_get_format_cap_type(const struct ast_sdp_options *options, enum ast_media_type type); #endif /* _ASTERISK_SDP_OPTIONS_H */