res_pjsip: Apply outbound proxy to all SIP requests.
[asterisk/asterisk.git] / include / asterisk / res_pjsip.h
index 9ba2e90..b3701c0 100644 (file)
@@ -38,6 +38,8 @@
 #include <pjlib.h>
 /* Needed for ast_rtp_dtls_cfg struct */
 #include "asterisk/rtp_engine.h"
+/* Needed for AST_VECTOR macro */
+#include "asterisk/vector.h"
 
 /* Forward declarations of PJSIP stuff */
 struct pjsip_rx_data;
@@ -144,6 +146,8 @@ struct ast_sip_contact {
        AST_DECLARE_STRING_FIELDS(
                /*! Full URI of the contact */
                AST_STRING_FIELD(uri);
+               /*! Outbound proxy to use for qualify */
+               AST_STRING_FIELD(outbound_proxy);
        );
        /*! Absolute time that this contact is no longer valid after */
        struct timeval expiration_time;
@@ -180,17 +184,6 @@ struct ast_sip_contact_status {
 };
 
 /*!
- * \brief A transport to be used for messages to a contact
- */
-struct ast_sip_contact_transport {
-       AST_DECLARE_STRING_FIELDS(
-               /*! Full URI of the contact */
-               AST_STRING_FIELD(uri);
-       );
-       pjsip_transport *transport;
-};
-
-/*!
  * \brief A SIP address of record
  */
 struct ast_sip_aor {
@@ -199,6 +192,8 @@ struct ast_sip_aor {
        AST_DECLARE_STRING_FIELDS(
                /*! Voicemail boxes for this AOR */
                AST_STRING_FIELD(mailboxes);
+               /*! Outbound proxy for OPTIONS requests */
+               AST_STRING_FIELD(outbound_proxy);
        );
        /*! Minimum expiration time */
        unsigned int minimum_expiration;
@@ -270,12 +265,7 @@ struct ast_sip_auth {
        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;
-};
+AST_VECTOR(ast_sip_auth_vector, const char *);
 
 /*!
  * \brief Different methods by which incoming requests can be matched to endpoints
@@ -316,6 +306,15 @@ enum ast_sip_session_media_encryption {
        AST_SIP_MEDIA_ENCRYPT_DTLS,
 };
 
+enum ast_sip_session_redirect {
+       /*! User portion of the target URI should be used as the target in the dialplan */
+       AST_SIP_REDIRECT_USER = 0,
+       /*! Target URI should be used as the target in the dialplan */
+       AST_SIP_REDIRECT_URI_CORE,
+       /*! Target URI should be used as the target within chan_pjsip itself */
+       AST_SIP_REDIRECT_URI_PJSIP,
+};
+
 /*!
  * \brief Session timers options
  */
@@ -557,9 +556,9 @@ struct ast_sip_endpoint {
        /*! Call pickup configuration */
        struct ast_sip_endpoint_pickup_configuration pickup;
        /*! Inbound authentication credentials */
-       struct ast_sip_auth_array inbound_auths;
+       struct ast_sip_auth_vector inbound_auths;
        /*! Outbound authentication credentials */
-       struct ast_sip_auth_array outbound_auths;
+       struct ast_sip_auth_vector outbound_auths;
        /*! DTMF mode to use with this endpoint */
        enum ast_sip_dtmf_mode dtmf;
        /*! Method(s) by which the endpoint should be identified. */
@@ -574,24 +573,26 @@ struct ast_sip_endpoint {
        unsigned int faxdetect;
        /*! Determines if transfers (using REFER) are allowed by this endpoint */
        unsigned int allowtransfer;
+       /*! Method used when handling redirects */
+       enum ast_sip_session_redirect redirect_method;
 };
 
 /*!
- * \brief Initialize an auth array with the configured values.
+ * \brief Initialize an auth vector with the configured values.
  *
- * \param array Array to initialize
+ * \param vector Vector 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);
+int ast_sip_auth_vector_init(struct ast_sip_auth_vector *vector, const char *auth_names);
 
 /*!
- * \brief Free contents of an auth array.
+ * \brief Free contents of an auth vector.
  *
- * \param array Array whose contents are to be freed
+ * \param array Vector whose contents are to be freed
  */
-void ast_sip_auth_array_destroy(struct ast_sip_auth_array *array);
+void ast_sip_auth_vector_destroy(struct ast_sip_auth_vector *vector);
 
 /*!
  * \brief Possible returns from ast_sip_check_authentication
@@ -643,14 +644,14 @@ struct ast_sip_outbound_authenticator {
        /*!
         * \brief Create a new request with authentication credentials
         *
-        * \param auths An array of IDs of auth sorcery objects
+        * \param auths A vector of IDs of auth sorcery objects
         * \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 struct ast_sip_auth_array *auths, struct pjsip_rx_data *challenge,
+       int (*create_request_with_auth)(const struct ast_sip_auth_vector *auths, struct pjsip_rx_data *challenge,
                        struct pjsip_transaction *tsx, struct pjsip_tx_data **new_request);
 };
 
@@ -879,37 +880,6 @@ struct ast_sip_contact *ast_sip_location_retrieve_contact_from_aor_list(const ch
 struct ast_sip_contact *ast_sip_location_retrieve_contact(const char *contact_name);
 
 /*!
- * \brief Add a transport for a contact to use
- */
-
-void ast_sip_location_add_contact_transport(struct ast_sip_contact_transport *ct);
-
-/*!
- * \brief Delete a transport for a contact that went away
- */
-void ast_sip_location_delete_contact_transport(struct ast_sip_contact_transport *ct);
-
-/*!
- * \brief Retrieve a contact_transport, by URI
- *
- * \param contact_uri URI of the contact
- *
- * \retval NULL if not found
- * \retval non-NULL if found
- */
-struct ast_sip_contact_transport *ast_sip_location_retrieve_contact_transport_by_uri(const char *contact_uri);
-
-/*!
- * \brief Retrieve a contact_transport, by transport
- *
- * \param transport transport the contact uses
- *
- * \retval NULL if not found
- * \retval non-NULL if found
- */
-struct ast_sip_contact_transport *ast_sip_location_retrieve_contact_transport_by_transport(pjsip_transport *transport);
-
-/*!
  * \brief Add a new contact to an AOR
  *
  * \param aor Pointer to the AOR
@@ -1294,7 +1264,7 @@ enum ast_sip_check_auth_result ast_sip_check_authentication(struct ast_sip_endpo
  * 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 struct ast_sip_auth_array *auths, pjsip_rx_data *challenge,
+int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge,
                pjsip_transaction *tsx, pjsip_tx_data **new_request);
 
 /*!
@@ -1312,6 +1282,16 @@ int ast_sip_create_request_with_auth(const struct ast_sip_auth_array *auths, pjs
 struct ast_sip_endpoint *ast_sip_identify_endpoint(pjsip_rx_data *rdata);
 
 /*!
+ * \brief Set the outbound proxy for an outbound SIP message
+ *
+ * \param tdata The message to set the outbound proxy on
+ * \param proxy SIP uri of the proxy
+ * \retval 0 Success
+ * \retval -1 Failure
+ */
+int ast_sip_set_outbound_proxy(pjsip_tx_data *tdata, const char *proxy);
+
+/*!
  * \brief Add a header to an outbound SIP message
  *
  * \param tdata The message to add the header to
@@ -1338,7 +1318,7 @@ int ast_sip_add_body(pjsip_tx_data *tdata, const struct ast_sip_body *body);
 /*!
  * \brief Add a multipart body to an outbound SIP message
  *
- * This will treat each part of the input array as part of a multipart body and
+ * This will treat each part of the input vector as part of a multipart body and
  * add each part to the SIP message.
  *
  * \param tdata The message to add the body to
@@ -1403,12 +1383,19 @@ struct ast_sip_endpoint *ast_pjsip_rdata_get_endpoint(pjsip_rx_data *rdata);
 struct ao2_container *ast_sip_get_endpoints(void);
 
 /*!
+ * \brief Retrieve the default outbound endpoint.
+ *
+ * \retval The default outbound endpoint, NULL if not found.
+ */
+struct ast_sip_endpoint *ast_sip_default_outbound_endpoint(void);
+
+/*!
  * \brief Retrieve relevant SIP auth structures from sorcery
  *
- * \param auths Array of sorcery IDs of auth credentials to retrieve
+ * \param auths Vector of sorcery IDs of auth credentials to retrieve
  * \param[out] out The retrieved auths are stored here
  */
-int ast_sip_retrieve_auths(const struct ast_sip_auth_array *auths, struct ast_sip_auth **out);
+int ast_sip_retrieve_auths(const struct ast_sip_auth_vector *auths, struct ast_sip_auth **out);
 
 /*!
  * \brief Clean up retrieved auth structures from memory
@@ -1416,8 +1403,8 @@ int ast_sip_retrieve_auths(const struct ast_sip_auth_array *auths, struct ast_si
  * Call this function once you have completed operating on auths
  * retrieved from \ref ast_sip_retrieve_auths
  *
- * \param auths An array of auth structures to clean up
- * \param num_auths The number of auths in the array
+ * \param auths An vector of auth structures to clean up
+ * \param num_auths The number of auths in the vector
  */
 void ast_sip_cleanup_auths(struct ast_sip_auth *auths[], size_t num_auths);
 
@@ -1504,4 +1491,209 @@ int ast_sip_add_global_response_header(const char *name, const char *value, int
 
 int ast_sip_initialize_sorcery_global(struct ast_sorcery *sorcery);
 
+/*!
+ * \brief Retrieves the value associated with the given key.
+ *
+ * \param ht the hash table/dictionary to search
+ * \param key the key to find
+ *
+ * \retval the value associated with the key, NULL otherwise.
+ */
+void *ast_sip_dict_get(void *ht, const char *key);
+
+/*!
+ * \brief Using the dictionary stored in mod_data array at a given id,
+ *        retrieve the value associated with the given key.
+ *
+ * \param mod_data a module data array
+ * \param id the mod_data array index
+ * \param key the key to find
+ *
+ * \retval the value associated with the key, NULL otherwise.
+ */
+#define ast_sip_mod_data_get(mod_data, id, key)                \
+       ast_sip_dict_get(mod_data[id], key)
+
+/*!
+ * \brief Set the value for the given key.
+ *
+ * Note - if the hash table does not exist one is created first, the key/value
+ * pair is set, and the hash table returned.
+ *
+ * \param pool the pool to allocate memory in
+ * \param ht the hash table/dictionary in which to store the key/value pair
+ * \param key the key to associate a value with
+ * \param val the value to associate with a key
+ *
+ * \retval the given, or newly created, hash table.
+ */
+void *ast_sip_dict_set(pj_pool_t* pool, void *ht,
+                      const char *key, void *val);
+
+/*!
+ * \brief Utilizing a mod_data array for a given id, set the value
+ *        associated with the given key.
+ *
+ * For a given structure's mod_data array set the element indexed by id to
+ * be a dictionary containing the key/val pair.
+ *
+ * \param pool a memory allocation pool
+ * \param mod_data a module data array
+ * \param id the mod_data array index
+ * \param key the key to find
+ * \param val the value to associate with a key
+ */
+#define ast_sip_mod_data_set(pool, mod_data, id, key, val)             \
+       mod_data[id] = ast_sip_dict_set(pool, mod_data[id], key, val)
+
+/*!
+ * \brief Function pointer for contact callbacks.
+ */
+typedef int (*on_contact_t)(const struct ast_sip_aor *aor,
+                           const struct ast_sip_contact *contact,
+                           int last, void *arg);
+
+/*!
+ * \brief For every contact on an AOR call the given 'on_contact' handler.
+ *
+ * \param aor the aor containing a list of contacts to iterate
+ * \param on_contact callback on each contact on an AOR
+ * \param arg user data passed to handler
+ * \retval 0 Success, non-zero on failure
+ */
+int ast_sip_for_each_contact(const struct ast_sip_aor *aor,
+                            on_contact_t on_contact, void *arg);
+
+/*!
+ * \brief Handler used to convert a contact to a string.
+ *
+ * \param aor the aor containing a list of contacts to iterate
+ * \param contact the contact to convert
+ * \param last is this the last contact
+ * \param arg user data passed to handler
+ * \retval 0 Success, non-zero on failure
+ */
+int ast_sip_contact_to_str(const struct ast_sip_aor *aor,
+                          const struct ast_sip_contact *contact,
+                          int last, void *arg);
+
+/*!
+ * \brief For every aor in the comma separated aors string call the
+ *        given 'on_aor' handler.
+ *
+ * \param aors a comma separated list of aors
+ * \param on_aor callback for each aor
+ * \param arg user data passed to handler
+ * \retval 0 Success, non-zero on failure
+ */
+int ast_sip_for_each_aor(const char *aors, ao2_callback_fn on_aor, void *arg);
+
+/*!
+ * \brief For every auth in the array call the given 'on_auth' handler.
+ *
+ * \param array an array of auths
+ * \param on_auth callback for each auth
+ * \param arg user data passed to handler
+ * \retval 0 Success, non-zero on failure
+ */
+int ast_sip_for_each_auth(const struct ast_sip_auth_vector *array,
+                         ao2_callback_fn on_auth, void *arg);
+
+/*!
+ * \brief Converts the given auth type to a string
+ *
+ * \param type the auth type to convert
+ * \retval a string representative of the auth type
+ */
+const char *ast_sip_auth_type_to_str(enum ast_sip_auth_type type);
+
+/*!
+ * \brief Converts an auths array to a string of comma separated values
+ *
+ * \param auths an auth array
+ * \param buf the string buffer to write the object data
+ * \retval 0 Success, non-zero on failure
+ */
+int ast_sip_auths_to_str(const struct ast_sip_auth_vector *auths, char **buf);
+
+/*
+ * \brief AMI variable container
+ */
+struct ast_sip_ami {
+       /*! Manager session */
+       struct mansession *s;
+       /*! Manager message */
+       const struct message *m;
+       /*! user specified argument data */
+       void *arg;
+};
+
+/*!
+ * \brief Creates a string to store AMI event data in.
+ *
+ * \param event the event to set
+ * \param ami AMI session and message container
+ * \retval an initialized ast_str or NULL on error.
+ */
+struct ast_str *ast_sip_create_ami_event(const char *event,
+                                        struct ast_sip_ami *ami);
+
+/*!
+ * \brief An entity responsible formatting endpoint information.
+ */
+struct ast_sip_endpoint_formatter {
+       /*!
+        * \brief Callback used to format endpoint information over AMI.
+        */
+       int (*format_ami)(const struct ast_sip_endpoint *endpoint,
+                         struct ast_sip_ami *ami);
+       AST_RWLIST_ENTRY(ast_sip_endpoint_formatter) next;
+};
+
+/*!
+ * \brief Register an endpoint formatter.
+ *
+ * \param obj the formatter to register
+ * \retval 0 Success
+ * \retval -1 Failure
+ */
+int ast_sip_register_endpoint_formatter(struct ast_sip_endpoint_formatter *obj);
+
+/*!
+ * \brief Unregister an endpoint formatter.
+ *
+ * \param obj the formatter to unregister
+ */
+void ast_sip_unregister_endpoint_formatter(struct ast_sip_endpoint_formatter *obj);
+
+/*!
+ * \brief Converts a sorcery object to a string of object properties.
+ *
+ * \param obj the sorcery object to convert
+ * \param str the string buffer to write the object data
+ * \retval 0 Success, non-zero on failure
+ */
+int ast_sip_sorcery_object_to_ami(const void *obj, struct ast_str **buf);
+
+/*!
+ * \brief Formats the endpoint and sends over AMI.
+ *
+ * \param endpoint the endpoint to format and send
+ * \param endpoint ami AMI variable container
+ * \param count the number of formatters operated on
+ * \retval 0 Success, otherwise non-zero on error
+ */
+int ast_sip_format_endpoint_ami(struct ast_sip_endpoint *endpoint,
+                               struct ast_sip_ami *ami, int *count);
+
+/*!
+ * \brief Format auth details for AMI.
+ *
+ * \param auths an auth array
+ * \param ami ami variable container
+ * \retval 0 Success, non-zero on failure
+ */
+int ast_sip_format_auths_ami(const struct ast_sip_auth_vector *auths,
+                            struct ast_sip_ami *ami);
+
 #endif /* _RES_PJSIP_H */