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

Reply via email to