Author: mmichelson Date: Tue Jul 30 10:17:56 2013 New Revision: 395748 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395748 Log: Reorganize the ast_sip_endpoint structure into substructures.
(closes issue ASTERISK-22135) reported by Matt Jordan Review: https://reviewboard.asterisk.org/r/2707 Modified: trunk/channels/chan_gulp.c trunk/include/asterisk/res_sip.h trunk/res/res_sip.c trunk/res/res_sip.exports.in trunk/res/res_sip/sip_configuration.c trunk/res/res_sip/sip_distributor.c trunk/res/res_sip/sip_options.c trunk/res/res_sip/sip_outbound_auth.c trunk/res/res_sip_authenticator_digest.c trunk/res/res_sip_caller_id.c trunk/res/res_sip_diversion.c trunk/res/res_sip_messaging.c trunk/res/res_sip_mwi.c trunk/res/res_sip_nat.c trunk/res/res_sip_one_touch_record_info.c trunk/res/res_sip_outbound_authenticator_digest.c trunk/res/res_sip_outbound_registration.c trunk/res/res_sip_pubsub.c trunk/res/res_sip_sdp_rtp.c trunk/res/res_sip_session.c trunk/res/res_sip_t38.c Modified: trunk/channels/chan_gulp.c URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_gulp.c?view=diff&rev=395748&r1=395747&r2=395748 ============================================================================== --- trunk/channels/chan_gulp.c (original) +++ trunk/channels/chan_gulp.c Tue Jul 30 10:17:56 2013 @@ -386,11 +386,11 @@ ao2_ref(*instance, +1); ast_assert(endpoint != NULL); - if (endpoint->media_encryption != AST_SIP_MEDIA_ENCRYPT_NONE) { + if (endpoint->media.rtp.encryption != AST_SIP_MEDIA_ENCRYPT_NONE) { return AST_RTP_GLUE_RESULT_FORBID; } - if (endpoint->direct_media) { + if (endpoint->media.direct_media.enabled) { return AST_RTP_GLUE_RESULT_REMOTE; } @@ -414,7 +414,7 @@ ao2_ref(*instance, +1); ast_assert(endpoint != NULL); - if (endpoint->media_encryption != AST_SIP_MEDIA_ENCRYPT_NONE) { + if (endpoint->media.rtp.encryption != AST_SIP_MEDIA_ENCRYPT_NONE) { return AST_RTP_GLUE_RESULT_FORBID; } @@ -426,14 +426,15 @@ { struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan); - ast_format_cap_copy(result, channel->session->endpoint->codecs); + ast_format_cap_copy(result, channel->session->endpoint->media.codecs); } static int send_direct_media_request(void *data) { RAII_VAR(struct ast_sip_session *, session, data, ao2_cleanup); - return ast_sip_session_refresh(session, NULL, NULL, NULL, session->endpoint->direct_media_method, 1); + return ast_sip_session_refresh(session, NULL, NULL, NULL, + session->endpoint->media.direct_media.method, 1); } static struct ast_datastore_info direct_media_mitigation_info = { }; @@ -442,7 +443,7 @@ { RAII_VAR(struct ast_datastore *, datastore, NULL, ao2_cleanup); - if (session->endpoint->direct_media_glare_mitigation == + if (session->endpoint->media.direct_media.glare_mitigation == AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE) { return 0; } @@ -455,10 +456,10 @@ /* Removing the datastore ensures we won't try to mitigate glare on subsequent reinvites */ ast_sip_session_remove_datastore(session, "direct_media_glare_mitigation"); - if ((session->endpoint->direct_media_glare_mitigation == + if ((session->endpoint->media.direct_media.glare_mitigation == AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING && session->inv_session->role == PJSIP_ROLE_UAC) || - (session->endpoint->direct_media_glare_mitigation == + (session->endpoint->media.direct_media.glare_mitigation == AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING && session->inv_session->role == PJSIP_ROLE_UAS)) { return 1; @@ -511,7 +512,7 @@ } ast_channel_cleanup(bridge_peer); - if (nat_active && session->endpoint->disable_direct_media_on_nat) { + if (nat_active && session->endpoint->media.direct_media.disable_on_nat) { return 0; } @@ -589,13 +590,13 @@ ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_VIDEO]->rtp, ast_channel_uniqueid(chan)); } - if (ast_format_cap_is_empty(session->req_caps) || !ast_format_cap_has_joint(session->req_caps, session->endpoint->codecs)) { - ast_format_cap_copy(ast_channel_nativeformats(chan), session->endpoint->codecs); + if (ast_format_cap_is_empty(session->req_caps) || !ast_format_cap_has_joint(session->req_caps, session->endpoint->media.codecs)) { + ast_format_cap_copy(ast_channel_nativeformats(chan), session->endpoint->media.codecs); } else { ast_format_cap_copy(ast_channel_nativeformats(chan), session->req_caps); } - ast_codec_choose(&session->endpoint->prefs, ast_channel_nativeformats(chan), 1, &fmt); + ast_codec_choose(&session->endpoint->media.prefs, ast_channel_nativeformats(chan), 1, &fmt); ast_format_copy(ast_channel_writeformat(chan), &fmt); ast_format_copy(ast_channel_rawwriteformat(chan), &fmt); ast_format_copy(ast_channel_readformat(chan), &fmt); @@ -611,11 +612,11 @@ ast_channel_exten_set(chan, S_OR(exten, "s")); ast_channel_priority_set(chan, 1); - ast_channel_callgroup_set(chan, session->endpoint->callgroup); - ast_channel_pickupgroup_set(chan, session->endpoint->pickupgroup); - - ast_channel_named_callgroups_set(chan, session->endpoint->named_callgroups); - ast_channel_named_pickupgroups_set(chan, session->endpoint->named_pickupgroups); + ast_channel_callgroup_set(chan, session->endpoint->pickup.callgroup); + ast_channel_pickupgroup_set(chan, session->endpoint->pickup.pickupgroup); + + ast_channel_named_callgroups_set(chan, session->endpoint->pickup.named_callgroups); + ast_channel_named_pickupgroups_set(chan, session->endpoint->pickup.named_pickupgroups); if (!ast_strlen_zero(session->endpoint->language)) { ast_channel_language_set(chan, session->endpoint->language); @@ -942,7 +943,7 @@ switch (option) { case AST_OPTION_T38_STATE: - if (session->endpoint->t38udptl) { + if (session->endpoint->media.t38.enabled) { switch (session->t38state) { case T38_LOCAL_REINVITE: case T38_PEER_REINVITE: @@ -1085,7 +1086,7 @@ } } } else { - enum ast_sip_session_refresh_method method = session->endpoint->connected_line_method; + enum ast_sip_session_refresh_method method = session->endpoint->id.refresh_method; if (session->inv_session->invite_tsx && (session->inv_session->options & PJSIP_INV_SUPPORT_UPDATE)) { method = AST_SIP_SESSION_REFRESH_METHOD_UPDATE; @@ -1891,7 +1892,7 @@ { RAII_VAR(struct ast_datastore *, datastore, NULL, ao2_cleanup); - if (session->endpoint->direct_media_glare_mitigation == + if (session->endpoint->media.direct_media.glare_mitigation == AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE) { return; } @@ -2007,7 +2008,7 @@ static int gulp_incoming_ack(struct ast_sip_session *session, struct pjsip_rx_data *rdata) { if (rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD) { - if (session->endpoint->direct_media) { + if (session->endpoint->media.direct_media.enabled) { ast_queue_control(session->channel, AST_CONTROL_SRCCHANGE); } } Modified: trunk/include/asterisk/res_sip.h URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/res_sip.h?view=diff&rev=395748&r1=395747&r2=395748 ============================================================================== --- trunk/include/asterisk/res_sip.h (original) +++ trunk/include/asterisk/res_sip.h Tue Jul 30 10:17:56 2013 @@ -270,14 +270,19 @@ enum ast_sip_auth_type type; }; +struct ast_sip_auth_array { + /*! Array of Sorcery IDs of auth sections */ + const char **names; + /*! Number of credentials in the array */ + unsigned int num; +}; + /*! * \brief Different methods by which incoming requests can be matched to endpoints */ enum ast_sip_endpoint_identifier_type { /*! Identify based on user name in From header */ AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME = (1 << 0), - /*! Identify based on source location of the SIP message */ - AST_SIP_ENDPOINT_IDENTIFY_BY_LOCATION = (1 << 1), }; enum ast_sip_session_refresh_method { @@ -312,6 +317,207 @@ }; /*! + * \brief Session timers options + */ +struct ast_sip_timer_options { + /*! Minimum session expiration period, in seconds */ + unsigned int min_se; + /*! Session expiration period, in seconds */ + unsigned int sess_expires; +}; + +/*! + * \brief Endpoint configuration for SIP extensions. + * + * SIP extensions, in this case refers to features + * indicated in Supported or Required headers. + */ +struct ast_sip_endpoint_extensions { + /*! Enabled SIP extensions */ + unsigned int flags; + /*! Timer options */ + struct ast_sip_timer_options timer; +}; + +/*! + * \brief Endpoint configuration for unsolicited MWI + */ +struct ast_sip_mwi_configuration { + AST_DECLARE_STRING_FIELDS( + /*! Configured voicemail boxes for this endpoint. Used for MWI */ + AST_STRING_FIELD(mailboxes); + /*! Username to use when sending MWI NOTIFYs to this endpoint */ + AST_STRING_FIELD(fromuser); + ); + /* Should mailbox states be combined into a single notification? */ + unsigned int aggregate; +}; + +/*! + * \brief Endpoint subscription configuration + */ +struct ast_sip_endpoint_subscription_configuration { + /*! Indicates if endpoint is allowed to initiate subscriptions */ + unsigned int allow; + /*! The minimum allowed expiration for subscriptions from endpoint */ + unsigned int minexpiry; + /*! Message waiting configuration */ + struct ast_sip_mwi_configuration mwi; +}; + +/*! + * \brief NAT configuration options for endpoints + */ +struct ast_sip_endpoint_nat_configuration { + /*! Whether to force using the source IP address/port for sending responses */ + unsigned int force_rport; + /*! Whether to rewrite the Contact header with the source IP address/port or not */ + unsigned int rewrite_contact; +}; + +/*! + * \brief Party identification options for endpoints + * + * This includes caller ID, connected line, and redirecting-related options + */ +struct ast_sip_endpoint_id_configuration { + struct ast_party_id self; + /*! Do we accept identification information from this endpoint */ + unsigned int trust_inbound; + /*! Do we send private identification information to this endpoint? */ + unsigned int trust_outbound; + /*! Do we send P-Asserted-Identity headers to this endpoint? */ + unsigned int send_pai; + /*! Do we send Remote-Party-ID headers to this endpoint? */ + unsigned int send_rpid; + /*! Do we add Diversion headers to applicable outgoing requests/responses? */ + unsigned int send_diversion; + /*! When performing connected line update, which method should be used */ + enum ast_sip_session_refresh_method refresh_method; +}; + +/*! + * \brief Call pickup configuration options for endpoints + */ +struct ast_sip_endpoint_pickup_configuration { + /*! Call group */ + ast_group_t callgroup; + /*! Pickup group */ + ast_group_t pickupgroup; + /*! Named call group */ + struct ast_namedgroups *named_callgroups; + /*! Named pickup group */ + struct ast_namedgroups *named_pickupgroups; +}; + +/*! + * \brief Configuration for one-touch INFO recording + */ +struct ast_sip_info_recording_configuration { + AST_DECLARE_STRING_FIELDS( + /*! Feature to enact when one-touch recording INFO with Record: On is received */ + AST_STRING_FIELD(onfeature); + /*! Feature to enact when one-touch recording INFO with Record: Off is received */ + AST_STRING_FIELD(offfeature); + ); + /*! Is one-touch recording permitted? */ + unsigned int enabled; +}; + +/*! + * \brief Endpoint configuration options for INFO packages + */ +struct ast_sip_endpoint_info_configuration { + /*! Configuration for one-touch recording */ + struct ast_sip_info_recording_configuration recording; +}; + +/*! + * \brief RTP configuration for SIP endpoints + */ +struct ast_sip_media_rtp_configuration { + AST_DECLARE_STRING_FIELDS( + /*! Configured RTP engine for this endpoint. */ + AST_STRING_FIELD(engine); + ); + /*! Whether IPv6 RTP is enabled or not */ + unsigned int ipv6; + /*! Whether symmetric RTP is enabled or not */ + unsigned int symmetric; + /*! Whether ICE support is enabled or not */ + unsigned int ice_support; + /*! Whether to use the "ptime" attribute received from the endpoint or not */ + unsigned int use_ptime; + /*! Do we use AVPF exclusively for this endpoint? */ + unsigned int use_avpf; + /*! \brief DTLS-SRTP configuration information */ + struct ast_rtp_dtls_cfg dtls_cfg; + /*! Should SRTP use a 32 byte tag instead of an 80 byte tag? */ + unsigned int srtp_tag_32; + /*! Do we use media encryption? what type? */ + enum ast_sip_session_media_encryption encryption; +}; + +/*! + * \brief Direct media options for SIP endpoints + */ +struct ast_sip_direct_media_configuration { + /*! Boolean indicating if direct_media is permissible */ + unsigned int enabled; + /*! When using direct media, which method should be used */ + enum ast_sip_session_refresh_method method; + /*! Take steps to mitigate glare for direct media */ + enum ast_sip_direct_media_glare_mitigation glare_mitigation; + /*! Do not attempt direct media session refreshes if a media NAT is detected */ + unsigned int disable_on_nat; +}; + +struct ast_sip_t38_configuration { + /*! Whether T.38 UDPTL support is enabled or not */ + unsigned int enabled; + /*! Error correction setting for T.38 UDPTL */ + enum ast_t38_ec_modes error_correction; + /*! Explicit T.38 max datagram value, may be 0 to indicate the remote side can be trusted */ + unsigned int maxdatagram; + /*! Whether NAT Support is enabled for T.38 UDPTL sessions or not */ + unsigned int nat; + /*! Whether to use IPv6 for UDPTL or not */ + unsigned int ipv6; +}; + +/*! + * \brief Media configuration for SIP endpoints + */ +struct ast_sip_endpoint_media_configuration { + AST_DECLARE_STRING_FIELDS( + /*! Optional external media address to use in SDP */ + AST_STRING_FIELD(external_address); + /*! SDP origin username */ + AST_STRING_FIELD(sdpowner); + /*! SDP session name */ + AST_STRING_FIELD(sdpsession); + ); + /*! RTP media configuration */ + struct ast_sip_media_rtp_configuration rtp; + /*! Direct media options */ + struct ast_sip_direct_media_configuration direct_media; + /*! T.38 (FoIP) options */ + struct ast_sip_t38_configuration t38; + /*! Codec preferences */ + struct ast_codec_pref prefs; + /*! Configured codecs */ + struct ast_format_cap *codecs; + /*! DSCP TOS bits for audio streams */ + unsigned int tos_audio; + /*! Priority for audio streams */ + unsigned int cos_audio; + /*! DSCP TOS bits for video streams */ + unsigned int tos_video; + /*! Priority for video streams */ + unsigned int cos_video; +}; + +/*! * \brief An entity with which Asterisk communicates */ struct ast_sip_endpoint { @@ -325,148 +531,67 @@ AST_STRING_FIELD(outbound_proxy); /*! Explicit AORs to dial if none are specified */ AST_STRING_FIELD(aors); - /*! Musiconhold class to suggest that the other side use when placing on hold */ - AST_STRING_FIELD(mohsuggest); - /*! Optional external media address to use in SDP */ - AST_STRING_FIELD(external_media_address); - /*! Configured voicemail boxes for this endpoint. Used for MWI */ - AST_STRING_FIELD(mailboxes); - /*! Configured RTP engine for this endpoint. */ - AST_STRING_FIELD(rtp_engine); + /*! Musiconhold class to suggest that the other side use when placing on hold */ + AST_STRING_FIELD(mohsuggest); /*! Configured tone zone for this endpoint. */ AST_STRING_FIELD(zone); /*! Configured language for this endpoint. */ AST_STRING_FIELD(language); - /*! Feature to enact when one-touch recording INFO with Record: On is received */ - AST_STRING_FIELD(recordonfeature); - /*! Feature to enact when one-touch recording INFO with Record: Off is received */ - AST_STRING_FIELD(recordofffeature); - /*! SDP origin username */ - AST_STRING_FIELD(sdpowner); - /*! SDP session name */ - AST_STRING_FIELD(sdpsession); /*! Default username to place in From header */ AST_STRING_FIELD(fromuser); /*! Domain to place in From header */ AST_STRING_FIELD(fromdomain); - /*! Username to use when sending MWI NOTIFYs to this endpoint */ - AST_STRING_FIELD(mwi_from); ); - /*! Identification information for this endpoint */ - struct ast_party_id id; - /*! Domain to which this endpoint belongs */ - struct ast_sip_domain *domain; - /*! Address of record for incoming registrations */ - struct ast_sip_aor *aor; - /*! Codec preferences */ - struct ast_codec_pref prefs; - /*! Configured codecs */ - struct ast_format_cap *codecs; - /*! Names of inbound authentication credentials */ - const char **sip_inbound_auths; - /*! Number of configured auths */ - size_t num_inbound_auths; - /*! Names of outbound authentication credentials */ - const char **sip_outbound_auths; - /*! Number of configured outbound auths */ - size_t num_outbound_auths; + /*! Configuration for extensions */ + struct ast_sip_endpoint_extensions extensions; + /*! Configuration relating to media */ + struct ast_sip_endpoint_media_configuration media; + /*! SUBSCRIBE/NOTIFY configuration options */ + struct ast_sip_endpoint_subscription_configuration subscription; + /*! NAT configuration */ + struct ast_sip_endpoint_nat_configuration nat; + /*! Party identification options */ + struct ast_sip_endpoint_id_configuration id; + /*! Configuration options for INFO packages */ + struct ast_sip_endpoint_info_configuration info; + /*! Call pickup configuration */ + struct ast_sip_endpoint_pickup_configuration pickup; + /*! Inbound authentication credentials */ + struct ast_sip_auth_array inbound_auths; + /*! Outbound authentication credentials */ + struct ast_sip_auth_array outbound_auths; /*! DTMF mode to use with this endpoint */ enum ast_sip_dtmf_mode dtmf; - /*! Whether IPv6 RTP is enabled or not */ - unsigned int rtp_ipv6; - /*! Whether symmetric RTP is enabled or not */ - unsigned int rtp_symmetric; - /*! Whether ICE support is enabled or not */ - unsigned int ice_support; - /*! Whether to use the "ptime" attribute received from the endpoint or not */ - unsigned int use_ptime; - /*! Whether to force using the source IP address/port for sending responses */ - unsigned int force_rport; - /*! Whether to rewrite the Contact header with the source IP address/port or not */ - unsigned int rewrite_contact; - /*! Enabled SIP extensions */ - unsigned int extensions; - /*! Minimum session expiration period, in seconds */ - unsigned int min_se; - /*! Session expiration period, in seconds */ - unsigned int sess_expires; - /*! List of outbound registrations */ - AST_LIST_HEAD_NOLOCK(, ast_sip_registration) registrations; /*! Method(s) by which the endpoint should be identified. */ enum ast_sip_endpoint_identifier_type ident_method; - /*! Boolean indicating if direct_media is permissible */ - unsigned int direct_media; - /*! When using direct media, which method should be used */ - enum ast_sip_session_refresh_method direct_media_method; - /*! When performing connected line update, which method should be used */ - enum ast_sip_session_refresh_method connected_line_method; - /*! Take steps to mitigate glare for direct media */ - enum ast_sip_direct_media_glare_mitigation direct_media_glare_mitigation; - /*! Do not attempt direct media session refreshes if a media NAT is detected */ - unsigned int disable_direct_media_on_nat; - /*! Do we trust the endpoint with our outbound identity? */ - unsigned int trust_id_outbound; - /*! Do we trust identity information that originates externally (e.g. P-Asserted-Identity header)? */ - unsigned int trust_id_inbound; - /*! Do we send P-Asserted-Identity headers to this endpoint? */ - unsigned int send_pai; - /*! Do we send Remote-Party-ID headers to this endpoint? */ - unsigned int send_rpid; - /*! Do we add Diversion headers to applicable outgoing requests/responses? */ - unsigned int send_diversion; - /*! Should unsolicited MWI be aggregated into a single NOTIFY? */ - unsigned int aggregate_mwi; - /*! Do we use media encryption? what type? */ - enum ast_sip_session_media_encryption media_encryption; - /*! Do we use AVPF exclusively for this endpoint? */ - unsigned int use_avpf; - /*! Is one-touch recording permitted? */ - unsigned int one_touch_recording; /*! Boolean indicating if ringing should be sent as inband progress */ unsigned int inband_progress; - /*! Call group */ - ast_group_t callgroup; - /*! Pickup group */ - ast_group_t pickupgroup; - /*! Named call group */ - struct ast_namedgroups *named_callgroups; - /*! Named pickup group */ - struct ast_namedgroups *named_pickupgroups; /*! Pointer to the persistent Asterisk endpoint */ struct ast_endpoint *persistent; /*! The number of channels at which busy device state is returned */ unsigned int devicestate_busy_at; - /*! Whether T.38 UDPTL support is enabled or not */ - unsigned int t38udptl; - /*! Error correction setting for T.38 UDPTL */ - enum ast_t38_ec_modes t38udptl_ec; - /*! Explicit T.38 max datagram value, may be 0 to indicate the remote side can be trusted */ - unsigned int t38udptl_maxdatagram; /*! Whether fax detection is enabled or not (CNG tone detection) */ unsigned int faxdetect; - /*! Whether NAT Support is enabled for T.38 UDPTL sessions or not */ - unsigned int t38udptl_nat; - /*! Whether to use IPv6 for UDPTL or not */ - unsigned int t38udptl_ipv6; /*! Determines if transfers (using REFER) are allowed by this endpoint */ unsigned int allowtransfer; - /*! DSCP TOS bits for audio streams */ - unsigned int tos_audio; - /*! Priority for audio streams */ - unsigned int cos_audio; - /*! DSCP TOS bits for video streams */ - unsigned int tos_video; - /*! Priority for video streams */ - unsigned int cos_video; - /*! Indicates if endpoint is allowed to initiate subscriptions */ - unsigned int allowsubscribe; - /*! The minimum allowed expiration for subscriptions from endpoint */ - unsigned int subminexpiry; - /*! \brief DTLS-SRTP configuration information */ - struct ast_rtp_dtls_cfg dtls_cfg; - /*! Should SRTP use a 32 byte tag instead of an 80 byte tag? */ - unsigned int srtp_tag_32; -}; +}; + +/*! + * \brief Initialize an auth array with the configured values. + * + * \param array Array to initialize + * \param auth_names Comma-separated list of names to set in the array + * \retval 0 Success + * \retval non-zero Failure + */ +int ast_sip_auth_array_init(struct ast_sip_auth_array *array, const char *auth_names); + +/*! + * \brief Free contents of an auth array. + * + * \param array Array whose contents are to be freed + */ +void ast_sip_auth_array_destroy(struct ast_sip_auth_array *array); /*! * \brief Possible returns from ast_sip_check_authentication @@ -519,14 +644,13 @@ * \brief Create a new request with authentication credentials * * \param auths An array of IDs of auth sorcery objects - * \param num_auths The number of IDs in the array * \param challenge The SIP response with authentication challenge(s) * \param tsx The transaction in which the challenge was received * \param new_request The new SIP request with challenge response(s) * \retval 0 Successfully created new request * \retval -1 Failed to create a new request */ - int (*create_request_with_auth)(const char **auths, size_t num_auths, struct pjsip_rx_data *challenge, + int (*create_request_with_auth)(const struct ast_sip_auth_array *auths, struct pjsip_rx_data *challenge, struct pjsip_transaction *tsx, struct pjsip_tx_data **new_request); }; @@ -1183,7 +1307,7 @@ * callback in the \ref ast_sip_outbound_authenticator structure for details about * the parameters and return values. */ -int ast_sip_create_request_with_auth(const char **auths, size_t num_auths, pjsip_rx_data *challenge, +int ast_sip_create_request_with_auth(const struct ast_sip_auth_array *auths, pjsip_rx_data *challenge, pjsip_transaction *tsx, pjsip_tx_data **new_request); /*! @@ -1294,11 +1418,10 @@ /*! * \brief Retrieve relevant SIP auth structures from sorcery * - * \param auth_names The sorcery IDs of auths to retrieve - * \param num_auths The number of auths to retrieve + * \param auths Array of sorcery IDs of auth credentials to retrieve * \param[out] out The retrieved auths are stored here */ -int ast_sip_retrieve_auths(const char *auth_names[], size_t num_auths, struct ast_sip_auth **out); +int ast_sip_retrieve_auths(const struct ast_sip_auth_array *auths, struct ast_sip_auth **out); /*! * \brief Clean up retrieved auth structures from memory Modified: trunk/res/res_sip.c URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_sip.c?view=diff&rev=395748&r1=395747&r2=395748 ============================================================================== --- trunk/res/res_sip.c (original) +++ trunk/res/res_sip.c Tue Jul 30 10:17:56 2013 @@ -1068,14 +1068,14 @@ ast_module_unref(ast_module_info->self); } -int ast_sip_create_request_with_auth(const char **auths, size_t num_auths, pjsip_rx_data *challenge, +int ast_sip_create_request_with_auth(const struct ast_sip_auth_array *auths, pjsip_rx_data *challenge, pjsip_transaction *tsx, pjsip_tx_data **new_request) { if (!registered_outbound_authenticator) { ast_log(LOG_WARNING, "No SIP outbound authenticator registered. Cannot respond to authentication challenge\n"); return -1; } - return registered_outbound_authenticator->create_request_with_auth(auths, num_auths, challenge, tsx, new_request); + return registered_outbound_authenticator->create_request_with_auth(auths, challenge, tsx, new_request); } struct endpoint_identifier_list { @@ -1475,7 +1475,7 @@ return; } - if (!ast_sip_create_request_with_auth(endpoint->sip_outbound_auths, endpoint->num_outbound_auths, challenge, tsx, &tdata)) { + if (!ast_sip_create_request_with_auth(&endpoint->outbound_auths, challenge, tsx, &tdata)) { pjsip_endpt_send_request(ast_sip_get_pjsip_endpoint(), tdata, -1, NULL, NULL); } } Modified: trunk/res/res_sip.exports.in URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_sip.exports.in?view=diff&rev=395748&r1=395747&r2=395748 ============================================================================== --- trunk/res/res_sip.exports.in (original) +++ trunk/res/res_sip.exports.in Tue Jul 30 10:17:56 2013 @@ -65,6 +65,8 @@ LINKER_SYMBOL_PREFIXast_sip_add_global_request_header; LINKER_SYMBOL_PREFIXast_sip_add_global_response_header; LINKER_SYMBOL_PREFIXast_sip_initialize_sorcery_global; + LINKER_SYMBOL_PREFIXast_sip_auth_array_init; + LINKER_SYMBOL_PREFIXast_sip_auth_array_destroy; local: *; }; Modified: trunk/res/res_sip/sip_configuration.c URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_sip/sip_configuration.c?view=diff&rev=395748&r1=395747&r2=395748 ============================================================================== --- trunk/res/res_sip/sip_configuration.c (original) +++ trunk/res/res_sip/sip_configuration.c Tue Jul 30 10:17:56 2013 @@ -247,11 +247,11 @@ struct ast_sip_endpoint *endpoint = obj; if (ast_true(var->value)) { - endpoint->extensions |= PJSIP_INV_SUPPORT_100REL; + endpoint->extensions.flags |= PJSIP_INV_SUPPORT_100REL; } else if (ast_false(var->value)) { - endpoint->extensions &= PJSIP_INV_SUPPORT_100REL; + endpoint->extensions.flags &= PJSIP_INV_SUPPORT_100REL; } else if (!strcasecmp(var->value, "required")) { - endpoint->extensions |= PJSIP_INV_REQUIRE_100REL; + endpoint->extensions.flags |= PJSIP_INV_REQUIRE_100REL; } else { return -1; } @@ -264,21 +264,21 @@ struct ast_sip_endpoint *endpoint = obj; if (ast_true(var->value)) { - endpoint->extensions |= PJSIP_INV_SUPPORT_TIMER; + endpoint->extensions.flags |= PJSIP_INV_SUPPORT_TIMER; } else if (ast_false(var->value)) { - endpoint->extensions &= PJSIP_INV_SUPPORT_TIMER; + endpoint->extensions.flags &= PJSIP_INV_SUPPORT_TIMER; } else if (!strcasecmp(var->value, "required")) { - endpoint->extensions |= PJSIP_INV_REQUIRE_TIMER; + endpoint->extensions.flags |= PJSIP_INV_REQUIRE_TIMER; } else if (!strcasecmp(var->value, "always")) { - endpoint->extensions |= PJSIP_INV_ALWAYS_USE_TIMER; - } else { - return -1; - } - - return 0; -} - -static void destroy_auths(const char **auths, size_t num_auths) + endpoint->extensions.flags |= PJSIP_INV_ALWAYS_USE_TIMER; + } else { + return -1; + } + + return 0; +} + +void ast_sip_auth_array_destroy(struct ast_sip_auth_array *auths) { int i; @@ -286,63 +286,57 @@ return; } - for (i = 0; i < num_auths; ++i) { - ast_free((char *) auths[i]); - } - ast_free(auths); + for (i = 0; i < auths->num; ++i) { + ast_free((char *) auths->names[i]); + } + ast_free(auths->names); + auths->num = 0; } #define AUTH_INCREMENT 4 -static const char **auth_alloc(const char *value, size_t *num_auths) -{ - char *auths = ast_strdupa(value); +int ast_sip_auth_array_init(struct ast_sip_auth_array *auths, const char *value) +{ + char *auth_names = ast_strdupa(value); char *val; int num_alloced = 0; const char **alloced_auths = NULL; - while ((val = strsep(&auths, ","))) { - if (*num_auths >= num_alloced) { + while ((val = strsep(&auth_names, ","))) { + if (auths->num >= num_alloced) { size_t size; num_alloced += AUTH_INCREMENT; size = num_alloced * sizeof(char *); - alloced_auths = ast_realloc(alloced_auths, size); - if (!alloced_auths) { + auths->names = ast_realloc(alloced_auths, size); + if (!auths->names) { goto failure; } } - alloced_auths[*num_auths] = ast_strdup(val); - if (!alloced_auths[*num_auths]) { + auths->names[auths->num] = ast_strdup(val); + if (!auths->names[auths->num]) { goto failure; } - ++(*num_auths); - } - return alloced_auths; + ++auths->num; + } + return 0; failure: - destroy_auths(alloced_auths, *num_auths); - return NULL; + ast_sip_auth_array_destroy(auths); + return -1; } static int inbound_auth_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) { struct ast_sip_endpoint *endpoint = obj; - endpoint->sip_inbound_auths = auth_alloc(var->value, &endpoint->num_inbound_auths); - if (!endpoint->sip_inbound_auths) { - return -1; - } - return 0; -} + return ast_sip_auth_array_init(&endpoint->inbound_auths, var->value); +} + static int outbound_auth_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) { struct ast_sip_endpoint *endpoint = obj; - endpoint->sip_outbound_auths = auth_alloc(var->value, &endpoint->num_outbound_auths); - if (!endpoint->sip_outbound_auths) { - return -1; - } - return 0; + return ast_sip_auth_array_init(&endpoint->outbound_auths, var->value); } static int ident_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) @@ -354,8 +348,6 @@ while ((val = strsep(&idents, ","))) { if (!strcasecmp(val, "username")) { endpoint->ident_method |= AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME; - } else if (!strcasecmp(val, "location")) { - endpoint->ident_method |= AST_SIP_ENDPOINT_IDENTIFY_BY_LOCATION; } else { ast_log(LOG_ERROR, "Unrecognized identification method %s specified for endpoint %s\n", val, ast_sorcery_object_get_id(endpoint)); @@ -370,9 +362,9 @@ struct ast_sip_endpoint *endpoint = obj; if (!strcasecmp(var->value, "invite") || !strcasecmp(var->value, "reinvite")) { - endpoint->direct_media_method = AST_SIP_SESSION_REFRESH_METHOD_INVITE; + endpoint->media.direct_media.method = AST_SIP_SESSION_REFRESH_METHOD_INVITE; } else if (!strcasecmp(var->value, "update")) { - endpoint->direct_media_method = AST_SIP_SESSION_REFRESH_METHOD_UPDATE; + endpoint->media.direct_media.method = AST_SIP_SESSION_REFRESH_METHOD_UPDATE; } else { ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n", var->value, var->name, ast_sorcery_object_get_id(endpoint)); @@ -386,9 +378,9 @@ struct ast_sip_endpoint *endpoint = obj; if (!strcasecmp(var->value, "invite") || !strcasecmp(var->value, "reinvite")) { - endpoint->connected_line_method = AST_SIP_SESSION_REFRESH_METHOD_INVITE; + endpoint->id.refresh_method = AST_SIP_SESSION_REFRESH_METHOD_INVITE; } else if (!strcasecmp(var->value, "update")) { - endpoint->connected_line_method = AST_SIP_SESSION_REFRESH_METHOD_UPDATE; + endpoint->id.refresh_method = AST_SIP_SESSION_REFRESH_METHOD_UPDATE; } else { ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n", var->value, var->name, ast_sorcery_object_get_id(endpoint)); @@ -402,11 +394,11 @@ struct ast_sip_endpoint *endpoint = obj; if (!strcasecmp(var->value, "none")) { - endpoint->direct_media_glare_mitigation = AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE; + endpoint->media.direct_media.glare_mitigation = AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE; } else if (!strcasecmp(var->value, "outgoing")) { - endpoint->direct_media_glare_mitigation = AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING; + endpoint->media.direct_media.glare_mitigation = AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING; } else if (!strcasecmp(var->value, "incoming")) { - endpoint->direct_media_glare_mitigation = AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING; + endpoint->media.direct_media.glare_mitigation = AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING; } else { ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n", var->value, var->name, ast_sorcery_object_get_id(endpoint)); @@ -424,18 +416,18 @@ ast_callerid_split(var->value, cid_name, sizeof(cid_name), cid_num, sizeof(cid_num)); if (!ast_strlen_zero(cid_name)) { - endpoint->id.name.str = ast_strdup(cid_name); - if (!endpoint->id.name.str) { + endpoint->id.self.name.str = ast_strdup(cid_name); + if (!endpoint->id.self.name.str) { return -1; } - endpoint->id.name.valid = 1; + endpoint->id.self.name.valid = 1; } if (!ast_strlen_zero(cid_num)) { - endpoint->id.number.str = ast_strdup(cid_num); - if (!endpoint->id.number.str) { + endpoint->id.self.number.str = ast_strdup(cid_num); + if (!endpoint->id.self.number.str) { return -1; } - endpoint->id.number.valid = 1; + endpoint->id.self.number.valid = 1; } return 0; } @@ -447,16 +439,16 @@ if (callingpres == -1 && sscanf(var->value, "%d", &callingpres) != 1) { return -1; } - endpoint->id.number.presentation = callingpres; - endpoint->id.name.presentation = callingpres; + endpoint->id.self.number.presentation = callingpres; + endpoint->id.self.name.presentation = callingpres; return 0; } static int caller_id_tag_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) { struct ast_sip_endpoint *endpoint = obj; - endpoint->id.tag = ast_strdup(var->value); - return endpoint->id.tag ? 0 : -1; + endpoint->id.self.tag = ast_strdup(var->value); + return endpoint->id.self.tag ? 0 : -1; } static int media_encryption_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) @@ -464,12 +456,12 @@ struct ast_sip_endpoint *endpoint = obj; if (!strcasecmp("no", var->value)) { - endpoint->media_encryption = AST_SIP_MEDIA_ENCRYPT_NONE; + endpoint->media.rtp.encryption = AST_SIP_MEDIA_ENCRYPT_NONE; } else if (!strcasecmp("sdes", var->value)) { - endpoint->media_encryption = AST_SIP_MEDIA_ENCRYPT_SDES; + endpoint->media.rtp.encryption = AST_SIP_MEDIA_ENCRYPT_SDES; } else if (!strcasecmp("dtls", var->value)) { - endpoint->media_encryption = AST_SIP_MEDIA_ENCRYPT_DTLS; - ast_rtp_dtls_cfg_parse(&endpoint->dtls_cfg, "dtlsenable", "yes"); + endpoint->media.rtp.encryption = AST_SIP_MEDIA_ENCRYPT_DTLS; + ast_rtp_dtls_cfg_parse(&endpoint->media.rtp.dtls_cfg, "dtlsenable", "yes"); } else { return -1; } @@ -483,11 +475,11 @@ struct ast_sip_endpoint *endpoint = obj; if (!strncmp(var->name, "callgroup", 9)) { - if (!(endpoint->callgroup = ast_get_group(var->value))) { + if (!(endpoint->pickup.callgroup = ast_get_group(var->value))) { return -1; } } else if (!strncmp(var->name, "pickupgroup", 11)) { - if (!(endpoint->pickupgroup = ast_get_group(var->value))) { + if (!(endpoint->pickup.pickupgroup = ast_get_group(var->value))) { return -1; } } else { @@ -503,12 +495,12 @@ struct ast_sip_endpoint *endpoint = obj; if (!strncmp(var->name, "namedcallgroup", 14)) { - if (!(endpoint->named_callgroups = + if (!(endpoint->pickup.named_callgroups = ast_get_namedgroups(var->value))) { return -1; } } else if (!strncmp(var->name, "namedpickupgroup", 16)) { - if (!(endpoint->named_pickupgroups = + if (!(endpoint->pickup.named_pickupgroups = ast_get_namedgroups(var->value))) { return -1; } @@ -524,7 +516,7 @@ { struct ast_sip_endpoint *endpoint = obj; - return ast_rtp_dtls_cfg_parse(&endpoint->dtls_cfg, var->name, var->value); + return ast_rtp_dtls_cfg_parse(&endpoint->media.rtp.dtls_cfg, var->name, var->value); } static int t38udptl_ec_handler(const struct aco_option *opt, @@ -533,11 +525,11 @@ struct ast_sip_endpoint *endpoint = obj; if (!strcmp(var->value, "none")) { - endpoint->t38udptl_ec = UDPTL_ERROR_CORRECTION_NONE; + endpoint->media.t38.error_correction = UDPTL_ERROR_CORRECTION_NONE; } else if (!strcmp(var->value, "fec")) { - endpoint->t38udptl_ec = UDPTL_ERROR_CORRECTION_FEC; + endpoint->media.t38.error_correction = UDPTL_ERROR_CORRECTION_FEC; } else if (!strcmp(var->value, "redundancy")) { - endpoint->t38udptl_ec = UDPTL_ERROR_CORRECTION_REDUNDANCY; + endpoint->media.t38.error_correction = UDPTL_ERROR_CORRECTION_REDUNDANCY; } else { return -1; } @@ -640,75 +632,74 @@ ast_sorcery_object_field_register(sip_sorcery, "endpoint", "type", "", OPT_NOOP_T, 0, 0); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "context", "default", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, context)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "disallow", "", OPT_CODEC_T, 0, FLDSET(struct ast_sip_endpoint, prefs, codecs)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow", "", OPT_CODEC_T, 1, FLDSET(struct ast_sip_endpoint, prefs, codecs)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "disallow", "", OPT_CODEC_T, 0, FLDSET(struct ast_sip_endpoint, media.prefs, media.codecs)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow", "", OPT_CODEC_T, 1, FLDSET(struct ast_sip_endpoint, media.prefs, media.codecs)); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtmfmode", "rfc4733", dtmf_handler, NULL, 0, 0); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, rtp_ipv6)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_symmetric", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, rtp_symmetric)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "ice_support", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, ice_support)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "use_ptime", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, use_ptime)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "force_rport", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, force_rport)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rewrite_contact", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, rewrite_contact)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.ipv6)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_symmetric", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.symmetric)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "ice_support", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.ice_support)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "use_ptime", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.use_ptime)); [... 1166 lines stripped ...] -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits
