Asterisk - The Open Source Telephony Project GIT-master-b023714
Loading...
Searching...
No Matches
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
res_pjsip.h File Reference
#include <pjsip.h>
#include <pjsip_simple.h>
#include <pjsip/sip_transaction.h>
#include <pj/timer.h>
#include <pjlib.h>
#include "asterisk/stringfields.h"
#include "asterisk/netsock2.h"
#include "asterisk/linkedlists.h"
#include "asterisk/channel.h"
#include "asterisk/sorcery.h"
#include "asterisk/dnsmgr.h"
#include "asterisk/endpoints.h"
#include "asterisk/udptl.h"
#include "asterisk/rtp_engine.h"
#include "asterisk/vector.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/stasis_endpoints.h"
#include "asterisk/stream.h"
Include dependency graph for res_pjsip.h:

Go to the source code of this file.

Data Structures

struct  ast_sip_ami
 AMI variable container. More...
 
struct  ast_sip_aor
 A SIP address of record. More...
 
struct  ast_sip_auth
 
struct  ast_sip_auth_objects_vector
 
struct  ast_sip_auth_password_digest
 
struct  ast_sip_auth_vector
 
struct  ast_sip_authenticator
 An interchangeable way of handling digest authentication for SIP. More...
 
struct  ast_sip_body
 SIP body description. More...
 
struct  ast_sip_contact
 Contact associated with an address of record. More...
 
struct  ast_sip_contact_status
 A contact's status. More...
 
struct  ast_sip_contact_wrapper
 A wrapper for contact that adds the aor_id and a consistent contact id. Used by ast_sip_for_each_contact. More...
 
struct  ast_sip_direct_media_configuration
 Direct media options for SIP endpoints. More...
 
struct  ast_sip_domain_alias
 
struct  ast_sip_endpoint
 An entity with which Asterisk communicates. More...
 
struct  ast_sip_endpoint_extensions
 Endpoint configuration for SIP extensions. More...
 
struct  ast_sip_endpoint_formatter
 An entity responsible formatting endpoint information. More...
 
struct  ast_sip_endpoint_id_configuration
 Party identification options for endpoints. More...
 
struct  ast_sip_endpoint_identifier
 An entity responsible for identifying the source of a SIP message. More...
 
struct  ast_sip_endpoint_info_configuration
 Endpoint configuration options for INFO packages. More...
 
struct  ast_sip_endpoint_media_configuration
 Media configuration for SIP endpoints. More...
 
struct  ast_sip_endpoint_nat_configuration
 NAT configuration options for endpoints. More...
 
struct  ast_sip_endpoint_pickup_configuration
 Call pickup configuration options for endpoints. More...
 
struct  ast_sip_endpoint_subscription_configuration
 Endpoint subscription configuration. More...
 
struct  ast_sip_identify_by_vector
 
struct  ast_sip_info_recording_configuration
 Configuration for one-touch INFO recording. More...
 
struct  ast_sip_media_rtp_configuration
 RTP configuration for SIP endpoints. More...
 
struct  ast_sip_mwi_configuration
 Endpoint configuration for unsolicited MWI. More...
 
struct  ast_sip_nat_hook
 Structure for SIP nat hook information. More...
 
struct  ast_sip_outbound_authenticator
 an interchangeable way of responding to authentication challenges More...
 
struct  ast_sip_request_transport_details
 Structure which contains information about a transport. More...
 
struct  ast_sip_security_mechanism
 Structure representing a security mechanism as defined in RFC 3329. More...
 
struct  ast_sip_security_mechanism_vector
 
struct  ast_sip_service_route_vector
 
struct  ast_sip_supplement
 A supplement to SIP message processing. More...
 
struct  ast_sip_t38_configuration
 
struct  ast_sip_timer_options
 Session timers options. More...
 
struct  ast_sip_tpmgr_state_callback
 
struct  ast_sip_transport
 Transport to bind to. More...
 
struct  ast_sip_transport_state
 Structure for SIP transport information. More...
 
struct  pjsip_auth_algorithm
 
struct  pjsip_auth_algorithm_type_vector
 

Macros

#define AST_SIP_AUTH_MAX_REALM_LENGTH   255 /* From the auth/realm realtime column size */
 
#define AST_SIP_AUTH_MAX_SUPPORTED_ALGORITHMS_LENGTH   (255) /* From the supported algorithms realtime column size */
 
#define ast_sip_call_codec_pref_test(__param, __codec_pref)   (!!(ast_test_flag( &__param, AST_SIP_CALL_CODEC_PREF_ ## __codec_pref )))
 Returns true if the preference is set in the parameter.
 
#define ast_sip_cleanup_auth_objects_vector(auth_objects)   AST_VECTOR_RESET(auth_objects, ao2_cleanup)
 Clean up retrieved auth objects in vector.
 
#define AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(_transport, _dest)    pj_sockaddr_print(&_transport->key.rem_addr, _dest, sizeof(_dest), 1);
 Fill a buffer with a pjsip transport's remote ip address and port.
 
#define ast_sip_mod_data_get(mod_data, id, key)    ast_sip_dict_get(mod_data[id], key)
 Using the dictionary stored in mod_data array at a given id, retrieve the value associated with the given 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)
 Utilizing a mod_data array for a given id, set the value associated with the given key.
 
#define ast_sip_transport_is_local(transport_state, addr)    (transport_state->localnet && ast_apply_ha(transport_state->localnet, addr) != AST_SENSE_ALLOW)
 
#define ast_sip_transport_is_nonlocal(transport_state, addr)    (!transport_state->localnet || ast_apply_ha(transport_state->localnet, addr) == AST_SENSE_ALLOW)
 
#define AST_SIP_USER_OPTIONS_TRUNCATE_CHECK(str)
 Truncate the URI user field options string if enabled.
 
#define AST_SIP_X_AST_TXP   "x-ast-txp"
 
#define AST_SIP_X_AST_TXP_LEN   9
 
#define COLON_PORT_STRLEN   6
 
#define IP6ADDR_COLON_PORT_BUFLEN   (PJ_INET6_ADDRSTRLEN + COLON_PORT_STRLEN)
 
#define MAX_RX_CHALLENGES   10
 
#define PJSIP_EXPIRES_NOT_SPECIFIED   ((pj_uint32_t)-1)
 
#define PJSIP_MINVERSION(m, n, p)   (((m << 24) | (n << 16) | (p << 8)) >= PJ_VERSION_NUM)
 
#define PJSTR_PRINTF_SPEC   "%.*s"
 
#define PJSTR_PRINTF_VAR(_v)   ((int)(_v).slen), ((_v).ptr)
 
#define SIP_SORCERY_AUTH_TYPE   "auth"
 
#define SIP_SORCERY_DOMAIN_ALIAS_TYPE   "domain_alias"
 
#define SIP_TLS_MAX_CIPHERS   64
 Maximum number of ciphers supported for a TLS transport.
 

Typedefs

typedef int(* ast_sip_dialog_outbound_auth_cb) (pjsip_dialog *dlg, pjsip_tx_data *tdata, void *user_data)
 Callback called when an outbound request with authentication credentials is to be sent in dialog.
 
typedef int(* ast_sip_task) (void *user_data)
 
typedef int(* ast_transport_monitor_data_matcher) (void *a, void *b)
 Transport shutdown monitor data matcher.
 
typedef void(* ast_transport_monitor_shutdown_cb) (void *data)
 Transport shutdown monitor callback.
 
typedef struct pjsip_auth_algorithm pjsip_auth_algorithm
 
typedef enum pjsip_auth_algorithm_type pjsip_auth_algorithm_type
 

Enumerations

enum  ast_sip_100rel_mode { AST_SIP_100REL_UNSUPPORTED = 0 , AST_SIP_100REL_SUPPORTED , AST_SIP_100REL_PEER_SUPPORTED , AST_SIP_100REL_REQUIRED }
 100rel modes for SIP endpoints More...
 
enum  ast_sip_auth_cred_usage { AST_SIP_AUTH_CRED_USAGE_UAC , AST_SIP_AUTH_CRED_USAGE_UAS }
 
enum  ast_sip_auth_type {
  AST_SIP_AUTH_TYPE_NONE = -1 , AST_SIP_AUTH_TYPE_USER_PASS = 0 , AST_SIP_AUTH_TYPE_MD5 , AST_SIP_AUTH_TYPE_GOOGLE_OAUTH ,
  AST_SIP_AUTH_TYPE_ARTIFICIAL , AST_SIP_AUTH_TYPE_DIGEST
}
 Authentication methods. More...
 
enum  ast_sip_call_codec_pref {
  AST_SIP_CALL_CODEC_PREF_INTERSECT = 1 << 0 , AST_SIP_CALL_CODEC_PREF_UNION = 1 << 1 , AST_SIP_CALL_CODEC_PREF_ALL = 1 << 2 , AST_SIP_CALL_CODEC_PREF_FIRST = 1 << 3 ,
  AST_SIP_CALL_CODEC_PREF_LOCAL = 1 << 4 , AST_SIP_CALL_CODEC_PREF_REMOTE = 1 << 5
}
 Incoming/Outgoing call offer/answer joint codec preference. More...
 
enum  ast_sip_check_auth_result { AST_SIP_AUTHENTICATION_CHALLENGE , AST_SIP_AUTHENTICATION_SUCCESS , AST_SIP_AUTHENTICATION_FAILED , AST_SIP_AUTHENTICATION_ERROR }
 Possible returns from ast_sip_check_authentication. More...
 
enum  ast_sip_contact_filter { AST_SIP_CONTACT_FILTER_DEFAULT = 0 , AST_SIP_CONTACT_FILTER_REACHABLE = (1 << 0) }
 Contact retrieval filtering flags. More...
 
enum  ast_sip_contact_status_type {
  UNAVAILABLE , AVAILABLE , UNKNOWN , CREATED ,
  REMOVED
}
 Status type for a contact. More...
 
enum  ast_sip_direct_media_glare_mitigation { AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE , AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING , AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING }
 
enum  ast_sip_dtmf_mode {
  AST_SIP_DTMF_NONE , AST_SIP_DTMF_RFC_4733 , AST_SIP_DTMF_INBAND , AST_SIP_DTMF_INFO ,
  AST_SIP_DTMF_AUTO , AST_SIP_DTMF_AUTO_INFO
}
 DTMF modes for SIP endpoints. More...
 
enum  ast_sip_endpoint_identifier_type {
  AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME = (1 << 0) , AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME = (1 << 1) , AST_SIP_ENDPOINT_IDENTIFY_BY_IP = (1 << 2) , AST_SIP_ENDPOINT_IDENTIFY_BY_HEADER = (1 << 3) ,
  AST_SIP_ENDPOINT_IDENTIFY_BY_REQUEST_URI = (1 << 4)
}
 Different methods by which incoming requests can be matched to endpoints. More...
 
enum  ast_sip_scheduler_task_flags {
  AST_SIP_SCHED_TASK_DEFAULTS = (0 << 0) , AST_SIP_SCHED_TASK_FIXED = (0 << 0) , AST_SIP_SCHED_TASK_VARIABLE = (1 << 0) , AST_SIP_SCHED_TASK_ONESHOT = (1 << 6) ,
  AST_SIP_SCHED_TASK_DATA_NOT_AO2 = (0 << 1) , AST_SIP_SCHED_TASK_DATA_AO2 = (1 << 1) , AST_SIP_SCHED_TASK_DATA_NO_CLEANUP = (0 << 3) , AST_SIP_SCHED_TASK_DATA_FREE = ( 1 << 3 ) ,
  AST_SIP_SCHED_TASK_PERIODIC = (0 << 4) , AST_SIP_SCHED_TASK_DELAY = (1 << 4) , AST_SIP_SCHED_TASK_TRACK = (1 << 5)
}
 Task flags for the res_pjsip scheduler. More...
 
enum  ast_sip_security_mechanism_type { AST_SIP_SECURITY_MECH_NONE = 0 , AST_SIP_SECURITY_MECH_MSRP_TLS , AST_SIP_SECURITY_MECH_SDES_SRTP , AST_SIP_SECURITY_MECH_DTLS_SRTP }
 The security mechanism type. More...
 
enum  ast_sip_security_negotiation { AST_SIP_SECURITY_NEG_NONE = 0 , AST_SIP_SECURITY_NEG_MEDIASEC }
 The kind of security negotiation. More...
 
enum  ast_sip_session_media_encryption { AST_SIP_MEDIA_TRANSPORT_INVALID = 0 , AST_SIP_MEDIA_ENCRYPT_NONE , AST_SIP_MEDIA_ENCRYPT_SDES , AST_SIP_MEDIA_ENCRYPT_DTLS }
 
enum  ast_sip_session_redirect { AST_SIP_REDIRECT_USER = 0 , AST_SIP_REDIRECT_URI_CORE , AST_SIP_REDIRECT_URI_PJSIP }
 
enum  ast_sip_session_refresh_method { AST_SIP_SESSION_REFRESH_METHOD_INVITE , AST_SIP_SESSION_REFRESH_METHOD_UPDATE }
 
enum  ast_sip_supplement_priority { AST_SIP_SUPPLEMENT_PRIORITY_FIRST = 0 , AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL = 1000000 , AST_SIP_SUPPLEMENT_PRIORITY_LAST = INT_MAX }
 
enum  ast_transport_monitor_reg { AST_TRANSPORT_MONITOR_REG_SUCCESS , AST_TRANSPORT_MONITOR_REG_REPLACED , AST_TRANSPORT_MONITOR_REG_NOT_FOUND , AST_TRANSPORT_MONITOR_REG_FAILED }
 
enum  pjsip_auth_algorithm_type {
  PJSIP_AUTH_ALGORITHM_NOT_SET = 0 , PJSIP_AUTH_ALGORITHM_MD5 , PJSIP_AUTH_ALGORITHM_SHA256 , PJSIP_AUTH_ALGORITHM_SHA512_256 ,
  PJSIP_AUTH_ALGORITHM_AKAV1_MD5 , PJSIP_AUTH_ALGORITHM_COUNT
}
 

Functions

void ast_copy_pj_str (char *dest, const pj_str_t *src, size_t size)
 Copy a pj_str_t into a standard character buffer.
 
int ast_copy_pj_str2 (char **dest, const pj_str_t *src)
 Create and copy a pj_str_t into a standard character buffer.
 
struct ast_sip_endpointast_pjsip_rdata_get_endpoint (pjsip_rx_data *rdata)
 Get the looked-up endpoint on an out-of dialog request or response.
 
int ast_sip_add_body (pjsip_tx_data *tdata, const struct ast_sip_body *body)
 Add a body to an outbound SIP message.
 
int ast_sip_add_body_multipart (pjsip_tx_data *tdata, const struct ast_sip_body *bodies[], int num_bodies)
 Add a multipart body to an outbound SIP message.
 
void ast_sip_add_date_header (pjsip_tx_data *tdata)
 Adds a Date header to the tdata, formatted like: Date: Wed, 01 Jan 2021 14:53:01 GMT.
 
int ast_sip_add_global_request_header (const char *name, const char *value, int replace)
 
int ast_sip_add_global_response_header (const char *name, const char *value, int replace)
 
int ast_sip_add_header (pjsip_tx_data *tdata, const char *name, const char *value)
 Add a header to an outbound SIP message.
 
pjsip_generic_string_hdr * ast_sip_add_header2 (pjsip_tx_data *tdata, const char *name, const char *value)
 Add a header to an outbound SIP message, returning a pointer to the header.
 
int ast_sip_add_security_headers (struct ast_sip_security_mechanism_vector *security_mechanisms, const char *header_name, int add_qval, pjsip_tx_data *tdata)
 Add security headers to transmission data.
 
void ast_sip_add_usereqphone (const struct ast_sip_endpoint *endpoint, pj_pool_t *pool, pjsip_uri *uri)
 Add 'user=phone' parameter to URI if enabled and user is a phone number.
 
int ast_sip_append_body (pjsip_tx_data *tdata, const char *body_text)
 Append body data to a SIP message.
 
int ast_sip_are_media_types_equal (pjsip_media_type *a, pjsip_media_type *b)
 Compare pjsip media types.
 
int ast_sip_auth_digest_algorithms_vector_init (const char *id, struct pjsip_auth_algorithm_type_vector *algorithms, const char *agent_type, const char *value)
 Populate a vector of algorithm types from a string.
 
int ast_sip_auth_digest_algorithms_vector_to_str (const struct pjsip_auth_algorithm_type_vector *algorithms, char **buf)
 Dump a vector of algorithm types to a string.
 
const pjsip_auth_algorithmast_sip_auth_get_algorithm_by_iana_name (const pj_str_t *iana_name)
 Get algorithm by IANA name.
 
const pjsip_auth_algorithmast_sip_auth_get_algorithm_by_type (pjsip_auth_algorithm_type algorithm_type)
 Get algorithm by algorithm type.
 
const char * ast_sip_auth_get_creds (const struct ast_sip_auth *auth, const pjsip_auth_algorithm_type algorithm_type, int *cred_type)
 Get the plain text or digest password from an auth object.
 
int ast_sip_auth_is_algorithm_available (const struct ast_sip_auth *auth, const struct pjsip_auth_algorithm_type_vector *algorithms, pjsip_auth_algorithm_type algorithm_type)
 Checks an pjsip_auth_algorithm_type_vector to see if it contains an algorithm.
 
pj_bool_t ast_sip_auth_is_algorithm_supported (pjsip_auth_algorithm_type algorithm_type)
 Is algorithm supported by OpenSSL and pjproject?
 
const char * ast_sip_auth_type_to_str (enum ast_sip_auth_type type)
 Converts the given auth type to a string.
 
void ast_sip_auth_vector_destroy (struct ast_sip_auth_vector *vector)
 Free contents of an auth vector.
 
int ast_sip_auth_vector_init (struct ast_sip_auth_vector *vector, const char *auth_names)
 Initialize an auth vector with the configured values.
 
int ast_sip_auths_to_str (const struct ast_sip_auth_vector *auths, char **buf)
 Converts an auths array to a string of comma separated values.
 
const char * ast_sip_call_codec_pref_to_str (struct ast_flags pref)
 Convert the call codec preference flags to a string.
 
int ast_sip_call_codec_str_to_pref (struct ast_flags *pref, const char *pref_str, int is_outgoing)
 Convert a call codec preference string to preference flags.
 
enum ast_sip_check_auth_result ast_sip_check_authentication (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata)
 Method to determine authentication status of an incoming request.
 
void ast_sip_cleanup_auths (struct ast_sip_auth *auths[], size_t num_auths)
 Clean up retrieved auth structures from memory.
 
int ast_sip_contact_to_str (void *object, void *arg, int flags)
 Handler used to convert a contact to a string.
 
struct ast_strast_sip_create_ami_event (const char *event, struct ast_sip_ami *ami)
 Creates a string to store AMI event data in.
 
pjsip_dialog * ast_sip_create_dialog_uac (const struct ast_sip_endpoint *endpoint, const char *aor_name, const char *request_user)
 General purpose method for creating a UAC dialog with an endpoint.
 
pjsip_dialog * ast_sip_create_dialog_uas (const struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pj_status_t *status)
 General purpose method for creating a UAS dialog with an endpoint.
 
pjsip_dialog * ast_sip_create_dialog_uas_locked (const struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pj_status_t *status)
 General purpose method for creating a UAS dialog with an endpoint.
 
int ast_sip_create_rdata (pjsip_rx_data *rdata, char *packet, const char *src_name, int src_port, char *transport_type, const char *local_name, int local_port)
 General purpose method for creating an rdata structure using specific information.
 
int ast_sip_create_rdata_with_contact (pjsip_rx_data *rdata, char *packet, const char *src_name, int src_port, char *transport_type, const char *local_name, int local_port, const char *contact_uri)
 General purpose method for creating an rdata structure using specific information.
 
int ast_sip_create_request (const char *method, struct pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint, const char *uri, struct ast_sip_contact *contact, pjsip_tx_data **tdata)
 General purpose method for creating a SIP request.
 
int ast_sip_create_request_with_auth (const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge, pjsip_tx_data *tdata, pjsip_tx_data **new_request)
 Create a response to an authentication challenge.
 
int ast_sip_create_response (const pjsip_rx_data *rdata, int st_code, struct ast_sip_contact *contact, pjsip_tx_data **p_tdata)
 General purpose method for creating a SIP response.
 
struct ast_taskprocessorast_sip_create_serializer (const char *name)
 Create a new serializer for SIP tasks.
 
struct ast_taskprocessorast_sip_create_serializer_group (const char *name, struct ast_serializer_shutdown_group *shutdown_group)
 Create a new serializer for SIP tasks.
 
struct ast_sip_endpointast_sip_default_outbound_endpoint (void)
 Retrieve the default outbound endpoint.
 
struct ast_sip_endpointast_sip_dialog_get_endpoint (pjsip_dialog *dlg)
 Get the endpoint associated with this dialog.
 
void ast_sip_dialog_set_endpoint (pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint)
 Set an endpoint on a SIP dialog so in-dialog requests do not undergo endpoint lookup.
 
void ast_sip_dialog_set_serializer (pjsip_dialog *dlg, struct ast_taskprocessor *serializer)
 Set a serializer on a SIP dialog so requests and responses are automatically serialized.
 
int ast_sip_dialog_setup_outbound_authentication (pjsip_dialog *dlg, const struct ast_sip_endpoint *endpoint, ast_sip_dialog_outbound_auth_cb cb, void *user_data)
 Set up outbound authentication on a SIP dialog.
 
void * ast_sip_dict_get (void *ht, const char *key)
 Retrieves the value associated with the given key.
 
void * ast_sip_dict_set (pj_pool_t *pool, void *ht, const char *key, void *val)
 Set the value for the given key.
 
int ast_sip_dlg_set_transport (const struct ast_sip_endpoint *endpoint, pjsip_dialog *dlg, pjsip_tpselector *selector)
 Set the transport on a dialog.
 
int ast_sip_dtmf_to_str (const enum ast_sip_dtmf_mode dtmf, char *buf, size_t buf_len)
 Convert the DTMF mode enum value into a string.
 
void * ast_sip_endpoint_alloc (const char *name)
 Allocate a new SIP endpoint.
 
int ast_sip_failover_request (pjsip_tx_data *tdata)
 Set a request to use the next value in the list of resolved addresses.
 
struct ast_sip_transport_stateast_sip_find_transport_state_in_use (struct ast_sip_request_transport_details *details)
 Returns the transport state currently in use based on request transport details.
 
int ast_sip_for_each_aor (const char *aors, ao2_callback_fn on_aor, void *arg)
 For every aor in the comma separated aors string call the given 'on_aor' handler.
 
int ast_sip_for_each_auth (const struct ast_sip_auth_vector *array, ao2_callback_fn on_auth, void *arg)
 For every auth in the array call the given 'on_auth' handler.
 
int ast_sip_for_each_channel (const struct ast_sip_endpoint *endpoint, ao2_callback_fn on_channel_snapshot, void *arg)
 For every channel snapshot on an endpoint all the given 'on_channel_snapshot' handler.
 
int ast_sip_for_each_channel_snapshot (const struct ast_endpoint_snapshot *endpoint_snapshot, ao2_callback_fn on_channel_snapshot, void *arg)
 For every channel snapshot on an endpoint snapshot call the given 'on_channel_snapshot' handler.
 
int ast_sip_for_each_contact (const struct ast_sip_aor *aor, ao2_callback_fn on_contact, void *arg)
 For every contact on an AOR call the given 'on_contact' handler.
 
int ast_sip_format_auths_ami (const struct ast_sip_auth_vector *auths, struct ast_sip_ami *ami)
 Format auth details for AMI.
 
int ast_sip_format_contact_ami (void *obj, void *arg, int flags)
 Formats the contact and sends over AMI.
 
int ast_sip_format_endpoint_ami (struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami, int *count)
 Formats the endpoint and sends over AMI.
 
unsigned int ast_sip_get_all_codecs_on_empty_reinvite (void)
 Retrieve the system setting 'all_codecs_on_empty_reinvite'.
 
unsigned int ast_sip_get_allow_sending_180_after_183 (void)
 Retrieve the global setting 'allow_sending_180_after_183'.
 
struct ast_sip_authast_sip_get_artificial_auth (void)
 Retrieves a reference to the artificial auth.
 
struct ast_sip_endpointast_sip_get_artificial_endpoint (void)
 Retrieves a reference to the artificial endpoint.
 
unsigned int ast_sip_get_contact_expiration_check_interval (void)
 Retrieve the system contact expiration check interval setting.
 
const char * ast_sip_get_contact_short_status_label (const enum ast_sip_contact_status_type status)
 
pjsip_sip_uri * ast_sip_get_contact_sip_uri (pjsip_tx_data *tdata)
 Return the SIP URI of the Contact header.
 
struct ast_sip_contact_statusast_sip_get_contact_status (const struct ast_sip_contact *contact)
 Retrieve the current status for a contact.
 
const char * ast_sip_get_contact_status_label (const enum ast_sip_contact_status_type status)
 translate ast_sip_contact_status_type to character string.
 
char * ast_sip_get_debug (void)
 Retrieve the system debug setting (yes|no|host).
 
void ast_sip_get_default_auth_algorithms_uac (char *default_auth_algorithms_uac, size_t size)
 Retrieve the global auth algorithms for UAC.
 
void ast_sip_get_default_auth_algorithms_uas (char *default_auth_algorithms_uas, size_t size)
 Retrieve the global auth algorithms for UAS.
 
void ast_sip_get_default_from_user (char *from_user, size_t size)
 Retrieve the global default from user.
 
void ast_sip_get_default_realm (char *realm, size_t size)
 Retrieve the global default realm.
 
char * ast_sip_get_default_voicemail_extension (void)
 Retrieve the default voicemail extension.
 
const char * ast_sip_get_device_state (const struct ast_sip_endpoint *endpoint)
 Retrieve the device state for an endpoint.
 
unsigned int ast_sip_get_disable_multi_domain (void)
 Retrieve the system setting 'disable multi domain'.
 
struct ast_taskprocessorast_sip_get_distributor_serializer (pjsip_rx_data *rdata)
 Determine the distributor serializer for the SIP message.
 
struct ast_sip_endpointast_sip_get_endpoint (const char *to, int get_default_outbound, char **uri)
 Retrieves an endpoint and URI from the "to" string.
 
char * ast_sip_get_endpoint_identifier_order (void)
 Retrieve the global endpoint_identifier_order setting.
 
struct ast_endpoint_snapshotast_sip_get_endpoint_snapshot (const struct ast_sip_endpoint *endpoint)
 Retrieve the endpoint snapshot for an endpoint.
 
struct ao2_containerast_sip_get_endpoints (void)
 Retrieve any endpoints available to sorcery.
 
int ast_sip_get_host_ip (int af, pj_sockaddr *addr)
 Retrieve the local host address in IP form.
 
const char * ast_sip_get_host_ip_string (int af)
 Retrieve the local host address in string form.
 
unsigned int ast_sip_get_ignore_uri_user_options (void)
 Retrieve the global setting 'ignore_uri_user_options'.
 
unsigned int ast_sip_get_keep_alive_interval (void)
 Retrieve the system keep alive interval setting.
 
unsigned int ast_sip_get_max_initial_qualify_time (void)
 Retrieve the system max initial qualify time.
 
unsigned int ast_sip_get_mwi_disable_initial_unsolicited (void)
 Retrieve the global setting 'disable sending unsolicited mwi on startup'.
 
unsigned int ast_sip_get_mwi_tps_queue_high (void)
 Retrieve the global MWI taskprocessor high water alert trigger level.
 
int ast_sip_get_mwi_tps_queue_low (void)
 Retrieve the global MWI taskprocessor low water clear alert level.
 
unsigned int ast_sip_get_norefersub (void)
 Retrieve the global setting 'norefersub'.
 
pjsip_endpoint * ast_sip_get_pjsip_endpoint (void)
 Get a pointer to the PJSIP endpoint.
 
char * ast_sip_get_regcontext (void)
 Retrieve the global regcontext setting.
 
unsigned int ast_sip_get_send_contact_status_on_update_registration (void)
 Retrieve the global setting 'send_contact_status_on_update_registration'.
 
struct ast_sorceryast_sip_get_sorcery (void)
 Get a pointer to the SIP sorcery structure.
 
int ast_sip_get_transport_name (const struct ast_sip_endpoint *endpoint, pjsip_sip_uri *sip_uri, char *buf, size_t buf_len)
 Get the transport name from an endpoint or request uri.
 
struct ast_sip_transport_stateast_sip_get_transport_state (const char *transport_id)
 Retrieve transport state.
 
struct ao2_containerast_sip_get_transport_states (void)
 Retrieves all transport states.
 
void ast_sip_get_unidentified_request_thresholds (unsigned int *count, unsigned int *period, unsigned int *prune_interval)
 Retrieve the unidentified request security event thresholds.
 
unsigned int ast_sip_get_use_callerid_contact (void)
 Retrieve the global setting 'use_callerid_contact'.
 
const int ast_sip_hangup_sip2cause (int cause)
 Convert SIP hangup causes to Asterisk hangup causes.
 
void ast_sip_header_to_security_mechanism (const pjsip_generic_string_hdr *hdr, struct ast_sip_security_mechanism_vector *security_mechanisms)
 Append to security mechanism vector from SIP header.
 
struct ast_sip_endpointast_sip_identify_endpoint (pjsip_rx_data *rdata)
 Determine the endpoint that has sent a SIP message.
 
int ast_sip_is_allowed_uri (pjsip_uri *uri)
 Check whether a pjsip_uri is allowed or not.
 
int ast_sip_is_content_type (pjsip_media_type *content_type, char *type, char *subtype)
 Checks if the given content type matches type/subtype.
 
int ast_sip_is_media_type_in (pjsip_media_type *a,...) attribute_sentinel
 Check if a media type is in a list of others.
 
int ast_sip_is_uri_sip_sips (pjsip_uri *uri)
 Check whether a pjsip_uri is SIP/SIPS or not.
 
int ast_sip_location_add_contact (struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, struct ast_sip_endpoint *endpoint)
 Add a new contact to an AOR.
 
int ast_sip_location_add_contact_nolock (struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, struct ast_sip_endpoint *endpoint)
 Add a new contact to an AOR without locking the AOR.
 
struct ast_sip_contactast_sip_location_create_contact (struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, int prune_on_boot, struct ast_sip_endpoint *endpoint)
 Create a new contact for an AOR without locking the AOR.
 
int ast_sip_location_delete_contact (struct ast_sip_contact *contact)
 Delete a contact.
 
void ast_sip_location_prune_boot_contacts (void)
 Prune the prune_on_boot contacts.
 
struct ast_sip_aorast_sip_location_retrieve_aor (const char *aor_name)
 Retrieve a named AOR.
 
struct ao2_containerast_sip_location_retrieve_aor_contacts (const struct ast_sip_aor *aor)
 Retrieve all contacts currently available for an AOR.
 
struct ao2_containerast_sip_location_retrieve_aor_contacts_filtered (const struct ast_sip_aor *aor, unsigned int flags)
 Retrieve all contacts currently available for an AOR and filter based on flags.
 
struct ao2_containerast_sip_location_retrieve_aor_contacts_nolock (const struct ast_sip_aor *aor)
 Retrieve all contacts currently available for an AOR without locking the AOR.
 
struct ao2_containerast_sip_location_retrieve_aor_contacts_nolock_filtered (const struct ast_sip_aor *aor, unsigned int flags)
 Retrieve all contacts currently available for an AOR without locking the AOR and filter based on flags.
 
struct ast_sip_contactast_sip_location_retrieve_contact (const char *contact_name)
 Retrieve a named contact.
 
void ast_sip_location_retrieve_contact_and_aor_from_list (const char *aor_list, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
 Retrieve the first bound contact AND the AOR chosen from a list of AORs.
 
void ast_sip_location_retrieve_contact_and_aor_from_list_filtered (const char *aor_list, unsigned int flags, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
 Retrieve the first bound contact AND the AOR chosen from a list of AORs and filter based on flags.
 
struct ast_sip_contactast_sip_location_retrieve_contact_from_aor_list (const char *aor_list)
 Retrieve the first bound contact from a list of AORs.
 
struct ao2_containerast_sip_location_retrieve_contacts_from_aor_list (const char *aor_list)
 Retrieve all contacts from a list of AORs.
 
struct ast_sip_contactast_sip_location_retrieve_first_aor_contact (const struct ast_sip_aor *aor)
 Retrieve the first bound contact for an AOR.
 
struct ast_sip_contactast_sip_location_retrieve_first_aor_contact_filtered (const struct ast_sip_aor *aor, unsigned int flags)
 Retrieve the first bound contact for an AOR and filter based on flags.
 
int ast_sip_location_update_contact (struct ast_sip_contact *contact)
 Update a contact.
 
void ast_sip_message_apply_transport (const char *transport_name, pjsip_tx_data *tdata)
 Apply the configuration for a transport to an outgoing message.
 
void ast_sip_modify_id_header (pj_pool_t *pool, pjsip_fromto_hdr *id_hdr, const struct ast_party_id *id)
 Set name and number information on an identity header.
 
void ast_sip_persistent_endpoint_publish_contact_state (const char *endpoint_name, const struct ast_sip_contact_status *contact_status)
 Publish the change of state for a contact.
 
int ast_sip_persistent_endpoint_update_state (const char *endpoint_name, enum ast_endpoint_state state)
 Change state of a persistent endpoint.
 
const pj_str_t * ast_sip_pjsip_uri_get_hostname (pjsip_uri *uri)
 Get the host portion of the pjsip_uri.
 
struct pjsip_param * ast_sip_pjsip_uri_get_other_param (pjsip_uri *uri, const pj_str_t *param_str)
 Find an 'other' SIP/SIPS URI parameter by name.
 
const pj_str_t * ast_sip_pjsip_uri_get_username (pjsip_uri *uri)
 Get the user portion of the pjsip_uri.
 
int ast_sip_push_task (struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
 Pushes a task to SIP servants.
 
int ast_sip_push_task_synchronous (struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
 Push a task to SIP servants and wait for it to complete.
 
int ast_sip_push_task_wait_serializer (struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
 Push a task to the serializer and wait for it to complete.
 
int ast_sip_push_task_wait_servant (struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
 Push a task to SIP servants and wait for it to complete.
 
char * ast_sip_rdata_get_header_value (pjsip_rx_data *rdata, const pj_str_t str)
 Get a specific header value from rdata.
 
int ast_sip_register_authenticator (struct ast_sip_authenticator *auth)
 Register a SIP authenticator.
 
void ast_sip_register_endpoint_formatter (struct ast_sip_endpoint_formatter *obj)
 Register an endpoint formatter.
 
int ast_sip_register_endpoint_identifier (struct ast_sip_endpoint_identifier *identifier)
 Register a SIP endpoint identifier.
 
int ast_sip_register_endpoint_identifier_with_name (struct ast_sip_endpoint_identifier *identifier, const char *name)
 Register a SIP endpoint identifier with a name.
 
int ast_sip_register_outbound_authenticator (struct ast_sip_outbound_authenticator *outbound_auth)
 Register an outbound SIP authenticator.
 
int ast_sip_register_service (pjsip_module *module)
 Register a SIP service in Asterisk.
 
void ast_sip_register_supplement (struct ast_sip_supplement *supplement)
 Register a supplement to SIP out of dialog processing.
 
void ast_sip_remove_headers_by_name_and_value (pjsip_msg *msg, const pj_str_t *hdr_name, const char *value)
 Removes all headers of a specific name and value from a pjsip_msg.
 
void ast_sip_report_auth_challenge_sent (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata)
 Send a security event notification for when an authentication challenge is sent.
 
void ast_sip_report_auth_failed_challenge_response (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
 Send a security event notification for when a challenge response has failed.
 
void ast_sip_report_auth_success (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
 Send a security event notification for when authentication succeeds.
 
void ast_sip_report_failed_acl (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, const char *name)
 Send a security event notification for when an ACL check fails.
 
void ast_sip_report_invalid_endpoint (const char *name, pjsip_rx_data *rdata)
 Send a security event notification for when an invalid endpoint is requested.
 
void ast_sip_report_mem_limit (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
 Send a security event notification for when a memory limit is hit.
 
void ast_sip_report_req_no_support (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, const char *req_type)
 Send a security event notification for when a request is not supported.
 
int ast_sip_requires_authentication (struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
 Determine if an incoming request requires authentication.
 
int ast_sip_retrieve_auths (const struct ast_sip_auth_vector *auths, struct ast_sip_auth **out)
 Retrieve relevant SIP auth structures from sorcery.
 
int ast_sip_retrieve_auths_vector (const struct ast_sip_auth_vector *auth_ids, struct ast_sip_auth_objects_vector *auth_objects)
 Retrieve relevant SIP auth structures from sorcery as a vector.
 
int ast_sip_rewrite_uri_to_local (pjsip_sip_uri *uri, pjsip_tx_data *tdata)
 Replace domain and port of SIP URI to point to (external) signaling address of this Asterisk instance.
 
int ast_sip_sched_is_task_running (struct ast_sip_sched_task *schtd)
 Checks if the task is currently running.
 
int ast_sip_sched_is_task_running_by_name (const char *name)
 Checks if the task is currently running.
 
int ast_sip_sched_task_cancel (struct ast_sip_sched_task *schtd)
 Cancels the next invocation of a task.
 
int ast_sip_sched_task_cancel_by_name (const char *name)
 Cancels the next invocation of a task by name.
 
int ast_sip_sched_task_get_name (struct ast_sip_sched_task *schtd, char *name, size_t maxlen)
 Gets the task name.
 
int ast_sip_sched_task_get_next_run (struct ast_sip_sched_task *schtd)
 Gets the number of milliseconds until the next invocation.
 
int ast_sip_sched_task_get_next_run_by_name (const char *name)
 Gets the number of milliseconds until the next invocation.
 
int ast_sip_sched_task_get_times (struct ast_sip_sched_task *schtd, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end)
 Gets the last start and end times of the task.
 
int ast_sip_sched_task_get_times2 (struct ast_sip_sched_task *schtd, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end, int *interval, int *time_left, struct timeval *next_start)
 Gets the queued, last start, last_end, time left, interval, next run.
 
int ast_sip_sched_task_get_times_by_name (const char *name, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end)
 Gets the last start and end times of the task by name.
 
int ast_sip_sched_task_get_times_by_name2 (const char *name, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end, int *interval, int *time_left, struct timeval *next_start)
 Gets the queued, last start, last_end, time left, interval, next run by task name.
 
struct ast_sip_sched_taskast_sip_schedule_task (struct ast_taskprocessor *serializer, int interval, ast_sip_task sip_task, const char *name, void *task_data, enum ast_sip_scheduler_task_flags flags)
 Schedule a task to run in the res_pjsip thread pool.
 
int ast_sip_security_mechanism_vector_init (struct ast_sip_security_mechanism_vector *security_mechanism, const char *value)
 Initialize security mechanism vector from string of security mechanisms.
 
int ast_sip_security_mechanisms_to_str (const struct ast_sip_security_mechanism_vector *security_mechanisms, int add_qvalue, char **buf)
 Writes the security mechanisms of an endpoint into a buffer as a string and returns the buffer.
 
void ast_sip_security_mechanisms_vector_copy (struct ast_sip_security_mechanism_vector *dst, const struct ast_sip_security_mechanism_vector *src)
 Duplicate a security mechanism.
 
void ast_sip_security_mechanisms_vector_destroy (struct ast_sip_security_mechanism_vector *security_mechanisms)
 Free contents of a security mechanism vector.
 
int ast_sip_send_out_of_dialog_request (pjsip_tx_data *tdata, struct ast_sip_endpoint *endpoint, int timeout, void *token, void(*callback)(void *token, pjsip_event *e))
 General purpose method for sending an Out-Of-Dialog SIP request.
 
int ast_sip_send_request (pjsip_tx_data *tdata, struct pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint, void *token, void(*callback)(void *token, pjsip_event *e))
 General purpose method for sending a SIP request.
 
int ast_sip_send_response (pjsip_response_addr *res_addr, pjsip_tx_data *tdata, struct ast_sip_endpoint *sip_endpoint)
 Send a response to an out of dialog request.
 
int ast_sip_send_stateful_response (pjsip_rx_data *rdata, pjsip_tx_data *tdata, struct ast_sip_endpoint *sip_endpoint)
 Send a stateful response to an out of dialog request.
 
struct ast_sip_service_route_vectorast_sip_service_route_vector_alloc (void)
 Allocate a vector of service routes.
 
void ast_sip_service_route_vector_destroy (struct ast_sip_service_route_vector *service_routes)
 Destroy a vector of service routes.
 
int ast_sip_set_id_connected_line (struct pjsip_rx_data *rdata, struct ast_party_id *id)
 Set the ID for a connected line update.
 
int ast_sip_set_id_from_invite (struct pjsip_rx_data *rdata, struct ast_party_id *id, struct ast_party_id *default_id, int trust_inbound)
 Set the ID from an INVITE.
 
int ast_sip_set_outbound_proxy (pjsip_tx_data *tdata, const char *proxy)
 Set the outbound proxy for an outbound SIP message.
 
int ast_sip_set_request_transport_details (struct ast_sip_request_transport_details *details, pjsip_tx_data *tdata, int use_ipv6)
 Sets request transport details based on tdata.
 
int ast_sip_set_security_negotiation (enum ast_sip_security_negotiation *security_negotiation, const char *val)
 Set the security negotiation based on a given string.
 
int ast_sip_set_tpselector_from_ep_or_uri (const struct ast_sip_endpoint *endpoint, pjsip_sip_uri *sip_uri, pjsip_tpselector *selector)
 Sets pjsip_tpselector from an endpoint or uri.
 
int ast_sip_set_tpselector_from_transport (const struct ast_sip_transport *transport, pjsip_tpselector *selector)
 Sets pjsip_tpselector from ast_sip_transport.
 
int ast_sip_set_tpselector_from_transport_name (const char *transport_name, pjsip_tpselector *selector)
 Sets pjsip_tpselector from ast_sip_transport.
 
int ast_sip_sorcery_object_to_ami (const void *obj, struct ast_str **buf)
 Converts a sorcery object to a string of object properties.
 
int ast_sip_str2rc (const char *name)
 Convert name to SIP response code.
 
int ast_sip_str_to_dtmf (const char *dtmf_mode)
 Convert the DTMF mode name into an enum.
 
int ast_sip_str_to_security_mechanism (struct ast_sip_security_mechanism **security_mechanism, const char *value)
 Allocate a security mechanism from a string.
 
int ast_sip_thread_is_servant (void)
 Determine if the current thread is a SIP servant thread.
 
struct ast_threadpoolast_sip_threadpool (void)
 Retrieve the SIP threadpool object.
 
long ast_sip_threadpool_queue_size (void)
 Return the size of the SIP threadpool's task queue.
 
void ast_sip_tpselector_unref (pjsip_tpselector *selector)
 Unreference a pjsip_tpselector.
 
enum ast_transport_monitor_reg ast_sip_transport_monitor_register (pjsip_transport *transport, ast_transport_monitor_shutdown_cb cb, void *ao2_data)
 Register a reliable transport shutdown monitor callback.
 
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_key (const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *ao2_data)
 Register a reliable transport shutdown monitor callback.
 
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace (pjsip_transport *transport, ast_transport_monitor_shutdown_cb cb, void *ao2_data, ast_transport_monitor_data_matcher matches)
 Register a reliable transport shutdown monitor callback replacing any duplicate.
 
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace_key (const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *ao2_data, ast_transport_monitor_data_matcher matches)
 Register a reliable transport shutdown monitor callback replacing any duplicate.
 
void ast_sip_transport_monitor_unregister (pjsip_transport *transport, ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches)
 Unregister a reliable transport shutdown monitor.
 
void ast_sip_transport_monitor_unregister_all (ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches)
 Unregister a transport shutdown monitor from all reliable transports.
 
void ast_sip_transport_monitor_unregister_key (const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches)
 Unregister a reliable transport shutdown monitor.
 
void ast_sip_transport_state_register (struct ast_sip_tpmgr_state_callback *element)
 Register a transport state notification callback element.
 
int ast_sip_transport_state_set_preferred_identity (const char *transport_name, const char *identity)
 Sets the P-Preferred-Identity on a child transport.
 
int ast_sip_transport_state_set_service_routes (const char *transport_name, struct ast_sip_service_route_vector *service_routes)
 Sets the service routes on a child transport.
 
int ast_sip_transport_state_set_transport (const char *transport_name, pjsip_transport *transport)
 Sets the PJSIP transport on a child transport.
 
void ast_sip_transport_state_unregister (struct ast_sip_tpmgr_state_callback *element)
 Unregister a transport state notification callback element.
 
void ast_sip_unregister_authenticator (struct ast_sip_authenticator *auth)
 Unregister a SIP authenticator.
 
void ast_sip_unregister_endpoint_formatter (struct ast_sip_endpoint_formatter *obj)
 Unregister an endpoint formatter.
 
void ast_sip_unregister_endpoint_identifier (struct ast_sip_endpoint_identifier *identifier)
 Unregister a SIP endpoint identifier.
 
void ast_sip_unregister_outbound_authenticator (struct ast_sip_outbound_authenticator *auth)
 Unregister an outbound SIP authenticator.
 
void ast_sip_unregister_service (pjsip_module *module)
 
void ast_sip_unregister_supplement (struct ast_sip_supplement *supplement)
 Unregister a an supplement to SIP out of dialog processing.
 
int ast_sip_update_from (pjsip_tx_data *tdata, char *from)
 Overwrite fields in the outbound 'From' header.
 
int ast_sip_update_to_uri (pjsip_tx_data *tdata, const char *to)
 Replace the To URI in the tdata with the supplied one.
 

Variables

static const pj_str_t AST_PJ_STR_EMPTY = { "", 0 }
 
pjsip_media_type pjsip_media_type_application_cpim_xpidf_xml
 
pjsip_media_type pjsip_media_type_application_json
 
pjsip_media_type pjsip_media_type_application_media_control_xml
 
pjsip_media_type pjsip_media_type_application_pidf_xml
 
pjsip_media_type pjsip_media_type_application_rlmi_xml
 
pjsip_media_type pjsip_media_type_application_sdp
 
pjsip_media_type pjsip_media_type_application_simple_message_summary
 
pjsip_media_type pjsip_media_type_application_xpidf_xml
 
pjsip_media_type pjsip_media_type_multipart_alternative
 
pjsip_media_type pjsip_media_type_multipart_mixed
 
pjsip_media_type pjsip_media_type_multipart_related
 
pjsip_media_type pjsip_media_type_text_plain
 

Macro Definition Documentation

◆ AST_SIP_AUTH_MAX_REALM_LENGTH

#define AST_SIP_AUTH_MAX_REALM_LENGTH   255 /* From the auth/realm realtime column size */

Definition at line 74 of file res_pjsip.h.

◆ AST_SIP_AUTH_MAX_SUPPORTED_ALGORITHMS_LENGTH

#define AST_SIP_AUTH_MAX_SUPPORTED_ALGORITHMS_LENGTH   (255) /* From the supported algorithms realtime column size */

Definition at line 75 of file res_pjsip.h.

◆ ast_sip_call_codec_pref_test

#define ast_sip_call_codec_pref_test (   __param,
  __codec_pref 
)    (!!(ast_test_flag( &__param, AST_SIP_CALL_CODEC_PREF_ ## __codec_pref )))

Returns true if the preference is set in the parameter.

Since
18.0.0
Parameters
__paramA ast_flags struct with one or more of enum ast_sip_call_codec_pref set
__codec_prefThe last component of one of the enum values
Return values
1if the enum value is set
0if not

Definition at line 787 of file res_pjsip.h.

◆ ast_sip_cleanup_auth_objects_vector

#define ast_sip_cleanup_auth_objects_vector (   auth_objects)    AST_VECTOR_RESET(auth_objects, ao2_cleanup)

Clean up retrieved auth objects in vector.

Call this function once you have completed operating on auths retrieved from ast_sip_retrieve_auths_vector. All auth objects will have their reference counts decremented and the vector size will be reset to 0. You must still call AST_VECTOR_FREE() on the vector itself.

Parameters
auth_objectsA vector of auth structures to clean up

Definition at line 2967 of file res_pjsip.h.

◆ AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR

#define AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR (   _transport,
  _dest 
)     pj_sockaddr_print(&_transport->key.rem_addr, _dest, sizeof(_dest), 1);

Fill a buffer with a pjsip transport's remote ip address and port.

Parameters
_transportThe pjsip_transport to use
_destThe destination buffer of at least IP6ADDR_COLON_PORT_BUFLEN bytes

Definition at line 91 of file res_pjsip.h.

111 { "", 0 };
112
113/*!
114 * \brief Structure for SIP transport information
115 */
117 /*! \brief Transport itself */
118 struct pjsip_transport *transport;
119 /*! \brief Transport factory */
120 struct pjsip_tpfactory *factory;
121 /*!
122 * Transport id
123 * \since 13.8.0
124 */
125 char *id;
126 /*!
127 * Transport type
128 * \since 13.8.0
129 */
130 enum ast_transport type;
131 /*!
132 * Address and port to bind to
133 * \since 13.8.0
134 */
135 pj_sockaddr host;
136 /*!
137 * TLS settings
138 * \since 13.8.0
139 */
140 pjsip_tls_setting tls;
141 /*!
142 * Configured TLS ciphers
143 * \since 13.8.0
144 */
145 pj_ssl_cipher ciphers[SIP_TLS_MAX_CIPHERS];
146 /*!
147 * Optional local network information, used for NAT purposes.
148 * "deny" (set) means that it's in the local network. Use the
149 * ast_sip_transport_is_nonlocal and ast_sip_transport_is_local
150 * macro's.
151 * \since 13.8.0
152 */
153 struct ast_ha *localnet;
154 /*!
155 * DNS manager for refreshing the external signaling address
156 * \since 13.8.0
157 */
159 /*!
160 * Optional external signaling address information
161 * \since 13.8.0
162 */
164 /*!
165 * DNS manager for refreshing the external media address
166 * \since 13.18.0
167 */
169 /*!
170 * Optional external signaling address information
171 * \since 13.18.0
172 */
174 /*!
175 * Set when this transport is a flow of signaling to a target
176 * \since 17.0.0
177 */
178 int flow;
179 /*!
180 * The P-Preferred-Identity to use on traffic using this transport
181 * \since 17.0.0
182 */
183 char *preferred_identity;
184 /*!
185 * The Service Routes to use on traffic using this transport
186 * \since 17.0.0
187 */
189 /*!
190 * Disregard RFC5922 7.2, and allow wildcard certs (TLS only)
191 */
193 /*!
194 * If true, fail if server certificate cannot verify (TLS only)
195 */
196 int verify_server;
197#ifdef HAVE_PJSIP_TLS_TRANSPORT_RESTART
198 /*!
199 * The stats information for the certificate file, if configured
200 */
201 struct stat cert_file_stat;
202 /*!
203 * The stats information for the private key file, if configured
204 */
205 struct stat privkey_file_stat;
206#endif
207};
208
209#define ast_sip_transport_is_nonlocal(transport_state, addr) \
210 (!transport_state->localnet || ast_apply_ha(transport_state->localnet, addr) == AST_SENSE_ALLOW)
211
212#define ast_sip_transport_is_local(transport_state, addr) \
213 (transport_state->localnet && ast_apply_ha(transport_state->localnet, addr) != AST_SENSE_ALLOW)
214
215/*!
216 * \brief Transport to bind to
217 */
218struct ast_sip_transport {
219 /*! Sorcery object details */
220 SORCERY_OBJECT(details);
222 /*! Certificate of authority list file */
224 /*! Certificate of authority list path */
226 /*! Public certificate file */
228 /*! Optional private key of the certificate file */
230 /*! Password to open the private key */
232 /*! External signaling address */
234 /*! External media address */
236 /*! Optional domain to use for messages if provided could not be found */
238 );
239 /*! Type of transport */
240 enum ast_transport type;
241 /*!
242 * \deprecated Moved to ast_sip_transport_state
243 * \version 13.8.0 deprecated
244 * Address and port to bind to
245 */
246 pj_sockaddr host;
247 /*! Number of simultaneous asynchronous operations */
248 unsigned int async_operations;
249 /*! Optional external port for signaling */
250 unsigned int external_signaling_port;
251 /*!
252 * \deprecated Moved to ast_sip_transport_state
253 * \version 13.7.1 deprecated
254 * TLS settings
255 */
256 pjsip_tls_setting tls;
257 /*!
258 * \deprecated Moved to ast_sip_transport_state
259 * \version 13.7.1 deprecated
260 * Configured TLS ciphers
261 */
262 pj_ssl_cipher ciphers[SIP_TLS_MAX_CIPHERS];
263 /*!
264 * \deprecated Moved to ast_sip_transport_state
265 * \version 13.7.1 deprecated
266 * Optional local network information, used for NAT purposes
267 */
268 struct ast_ha *localnet;
269 /*!
270 * \deprecated Moved to ast_sip_transport_state
271 * \version 13.7.1 deprecated
272 * DNS manager for refreshing the external address
273 */
275 /*!
276 * \deprecated Moved to ast_sip_transport_state
277 * \version 13.7.1 deprecated
278 * Optional external address information
279 */
281 /*!
282 * \deprecated
283 * \version 13.7.1 deprecated
284 * Transport state information
285 */
287 /*! QOS DSCP TOS bits */
288 unsigned int tos;
289 /*! QOS COS value */
290 unsigned int cos;
291 /*! Write timeout */
292 int write_timeout;
293 /*! Allow reload */
294 int allow_reload;
295 /*! Automatically send requests out the same transport requests have come in on */
297 /*! This is a flow to another target */
298 int flow;
299 /*! Enable TCP keepalive */
301 /*! Time in seconds the connection needs to remain idle before TCP starts sending keepalive probes */
303 /*! The time in seconds between individual keepalive probes */
305 /*! The maximum number of keepalive probes TCP should send before dropping the connection */
307};
308
309#define SIP_SORCERY_DOMAIN_ALIAS_TYPE "domain_alias"
310
311/*!
312 * Details about a SIP domain alias
313 */
315 /*! Sorcery object details */
316 SORCERY_OBJECT(details);
318 /*! Domain to be aliased to */
320 );
321};
322
323/*!
324 * \brief Structure for SIP nat hook information
325 */
326struct ast_sip_nat_hook {
327 /*! Sorcery object details */
328 SORCERY_OBJECT(details);
329 /*! Callback for when a message is going outside of our local network */
330 void (*outgoing_external_message)(struct pjsip_tx_data *tdata, struct ast_sip_transport *transport);
331};
332
333/*! \brief Structure which contains information about a transport */
335 /*! \brief Type of transport */
336 enum ast_transport type;
337 /*! \brief Potential pointer to the transport itself, if UDP */
338 pjsip_transport *transport;
339 /*! \brief Potential pointer to the transport factory itself, if TCP/TLS */
340 pjsip_tpfactory *factory;
341 /*! \brief Local address for transport */
342 pj_str_t local_address;
343 /*! \brief Local port for transport */
344 int local_port;
345};
346
347/*!
348 * \brief The kind of security negotiation
349 */
351 /*! No security mechanism negotiation */
353 /*! Use mediasec security mechanism negotiation */
355 /* Add RFC 3329 (sec-agree) mechanism negotiation in the future */
356};
357
358/*!
359 * \brief The security mechanism type
360 */
363 /* Use msrp-tls as security mechanism */
365 /* Use sdes-srtp as security mechanism */
367 /* Use dtls-srtp as security mechanism */
369 /* Add RFC 3329 (sec-agree) mechanisms like tle, digest, ipsec-ike in the future */
370};
371
372/*!
373 * \brief Structure representing a security mechanism as defined in RFC 3329
374 */
376 /* Used to determine which security mechanism to use. */
378 /* The preference of this security mechanism. The higher the value, the more preferred. */
379 float qvalue;
380 /* Optional mechanism parameters. */
382};
383
385
386/*!
387 * \brief Contact associated with an address of record
388 */
389struct ast_sip_contact {
390 /*! Sorcery object details, the id is the aor name plus a random string */
391 SORCERY_OBJECT(details);
393 /*! Full URI of the contact */
395 /*! Outbound proxy to use for qualify */
397 /*! Path information to place in Route headers */
399 /*! Content of the User-Agent header in REGISTER request */
401 /*! The name of the aor this contact belongs to */
403 /*! Asterisk Server name */
405 /*! IP-address of the Via header in REGISTER request */
407 /*! Content of the Call-ID header in REGISTER request */
409 /*! The name of the endpoint that added the contact */
411 );
412 /*! Absolute time that this contact is no longer valid after */
413 struct timeval expiration_time;
414 /*! Frequency to send OPTIONS requests to contact. 0 is disabled. */
415 unsigned int qualify_frequency;
416 /*! If true authenticate the qualify challenge response if needed */
418 /*! Qualify timeout. 0 is diabled. */
419 double qualify_timeout;
420 /*! Endpoint that added the contact, only available in observers */
422 /*! Port of the Via header in REGISTER request */
423 int via_port;
424 /*! If true delete the contact on Asterisk restart/boot */
425 int prune_on_boot;
426 /*! If true only authenticate if OPTIONS response is 2XX */
428};
429
430/*!
431 * \brief Status type for a contact.
432 */
434 /*! Frequency > 0, but no response from remote uri */
436 /*! Frequency > 0, and got response from remote uri */
437 AVAILABLE,
438 /*! Default last status, and when a contact status object is not found */
439 UNKNOWN,
440 /*! Frequency == 0, has a contact, but don't know status (non-qualified) */
441 CREATED,
442 REMOVED,
443};
444
445/*!
446 * \brief A contact's status.
447 *
448 * Maintains a contact's current status and round trip time if available.
449 */
452 /*! The original contact's URI */
454 /*! The name of the aor this contact_status belongs to */
456 );
457 /*! The round trip time in microseconds */
458 int64_t rtt;
459 /*!
460 * The security mechanism list of the contact (RFC 3329).
461 * Stores the values of Security-Server headers in 401/421/494 responses to an
462 * in-dialog request or successful outbound registration which will be used to
463 * set the Security-Verify headers of all subsequent requests to the contact.
464 */
466 /*! Current status for a contact (default - unavailable) */
468 /*! Last status for a contact (default - unavailable) */
470 /*! Name of the contact */
471 char name[0];
472};
473
474/*!
475 * \brief A SIP address of record
476 */
477struct ast_sip_aor {
478 /*! Sorcery object details, the id is the AOR name */
479 SORCERY_OBJECT(details);
481 /*! Voicemail boxes for this AOR */
483 /*! Outbound proxy for OPTIONS requests */
485 );
486 /*! Minimum expiration time */
487 unsigned int minimum_expiration;
488 /*! Maximum expiration time */
489 unsigned int maximum_expiration;
490 /*! Default contact expiration if one is not provided in the contact */
491 unsigned int default_expiration;
492 /*! Frequency to send OPTIONS requests to AOR contacts. 0 is disabled. */
493 unsigned int qualify_frequency;
494 /*! If true authenticate the qualify challenge response if needed */
496 /*! Maximum number of external contacts, 0 to disable */
497 unsigned int max_contacts;
498 /*! Whether to remove any existing contacts not related to an incoming REGISTER when it comes in */
499 unsigned int remove_existing;
500 /*! Any permanent configured contacts */
502 /*! Determines whether SIP Path headers are supported */
503 unsigned int support_path;
504 /*! Qualify timeout. 0 is diabled. */
505 double qualify_timeout;
506 /*! Voicemail extension to set in Message-Account */
508 /*! Whether to remove unavailable contacts over max_contacts at all or first if remove_existing is enabled */
509 unsigned int remove_unavailable;
510 /*! If true only authenticate if OPTIONS response is 2XX */
512};
513
514/*!
515 * \brief A wrapper for contact that adds the aor_id and
516 * a consistent contact id. Used by ast_sip_for_each_contact.
517 */
519 /*! The id of the parent aor. */
520 char *aor_id;
521 /*! The id of contact in form of aor_id/contact_uri. */
522 char *contact_id;
523 /*! Pointer to the actual contact. */
524 struct ast_sip_contact *contact;
525};
526
527/*!
528 * \brief 100rel modes for SIP endpoints
529 */
531 /*! Do not support 100rel. (no) */
533 /*! As UAC, indicate 100rel support in Supported header. (yes) */
535 /*! As UAS, send 1xx responses reliably, if the UAC indicated its support. Otherwise same as AST_SIP_100REL_SUPPORTED. (peer_supported) */
537 /*! Require the use of 100rel. (required) */
539};
540
541/*!
542 * \brief DTMF modes for SIP endpoints
543 */
545 /*! No DTMF to be used */
547 /* XXX Should this be 2833 instead? */
548 /*! Use RFC 4733 events for DTMF */
550 /*! Use DTMF in the audio stream */
552 /*! Use SIP INFO DTMF (blech) */
554 /*! Use SIP 4733 if supported by the other side or INBAND if not */
556 /*! Use SIP 4733 if supported by the other side or INFO DTMF (blech) if not */
558};
559
560/*!
561 * \brief Authentication methods.
562 *
563 * The meaning of this type has changed. It used to indicate how
564 * the credentials were stored, but now it indicates which authentication
565 * method will be used... Google Oauth, Artificial (fake auth) or Digest.
566 * The USER_PASS and MD5 types are still used for backwards compatibility
567 * but will map to DIGEST.
568 */
571 /*!
572 * Credentials stored as a username and password combination
573 * \deprecated Now automatically determined
574 */
576 /*!
577 * Credentials stored as an MD5 sum
578 * \deprecated Use AST_SIP_AUTH_TYPE_DIGEST instead
579 */
581 /*! Google Oauth */
583 /*! Credentials not stored this is a fake auth */
585 /*! Digest method will be used */
587};
588
590 /*! The credentials used as a UAC */
592 /*! The credentials used as a UAS */
594};
595
596#define SIP_SORCERY_AUTH_TYPE "auth"
597
598#ifndef HAVE_PJSIP_AUTH_NEW_DIGESTS
599/*
600 * These are needed if the version of pjproject in use
601 * does not have the new digests.
602 * NOTE: We don't support AKAV1_MD5 but we need to specify
603 * it to be compatible with the pjproject definition.
604 */
605typedef enum pjsip_auth_algorithm_type
606{
614
615typedef struct pjsip_auth_algorithm
616{
618 pj_str_t iana_name;
619 const char *openssl_name;
620 unsigned digest_length;
621 unsigned digest_str_length;
623#endif
624
625/*!
626 * \brief Get algorithm by algorithm type
627 *
628 * \param algorithm_type The algorithm type
629 * \retval The algorithm or NULL if not found
630 */
632 pjsip_auth_algorithm_type algorithm_type);
633
634/*!
635 * \brief Get algorithm by IANA name
636 *
637 * \param iana_name The algorithm IANA name
638 * \retval The algorithm or NULL if not found
639 */
641 const pj_str_t *iana_name);
642
643/*!
644 * \brief Is algorithm supported by OpenSSL and pjproject?
645 *
646 * \param algorithm_type The algorithm IANA name
647 * \retval The algorithm or NULL if not found
648 */
650 pjsip_auth_algorithm_type algorithm_type);
651
653
656 char digest[0];
657};
658
659struct ast_sip_auth {
660 /*! Sorcery ID of the auth is its name */
661 SORCERY_OBJECT(details);
663 /*! Identification for these credentials */
665 /*! Authentication username */
667 /*! Authentication password */
669 /*!
670 * Authentication credentials in MD5 format (hash of user:realm:pass)
671 * \deprecated Use password_digests[PJSIP_AUTH_ALGORITHM_MD5] instead.
672 */
674 /*! Refresh token to use for OAuth authentication */
676 /*! Client ID to use for OAuth authentication */
678 /*! Secret to use for OAuth authentication */
680 );
681 /*! The time period (in seconds) that a nonce may be reused */
682 unsigned int nonce_lifetime;
683 /*! Used to determine what to use when authenticating */
685 /*! Digest algorithms to support when UAC */
687 /*! Digest algorithms to send challenges for when UAS */
689 /*! Array of pre-digested passwords indexed by pjsip_auth_algorithm_type */
691};
692
693AST_VECTOR(ast_sip_auth_vector, const char *);
694
695/*!
696 * \brief Different methods by which incoming requests can be matched to endpoints
697 */
699 /*! Identify based on user name in From header */
701 /*! Identify based on user name in Auth header first, then From header */
703 /*! Identify based on source IP address */
705 /*! Identify based on arbitrary headers */
707 /*! Identify based on request uri */
709};
711
713 /*! Use reinvite to negotiate direct media */
715 /*! Use UPDATE to negotiate direct media */
717};
718
720 /*! Take no special action to mitigate reinvite glare */
722 /*! Do not send an initial direct media session refresh on outgoing call legs
723 * Subsequent session refreshes will be sent no matter the session direction
724 */
726 /*! Do not send an initial direct media session refresh on incoming call legs
727 * Subsequent session refreshes will be sent no matter the session direction
728 */
730};
731
733 /*! Invalid media encryption configuration */
735 /*! Do not allow any encryption of session media */
737 /*! Offer SDES-encrypted session media */
739 /*! Offer encrypted session media with datagram TLS key exchange */
741};
742
744 /*! User portion of the target URI should be used as the target in the dialplan */
746 /*! Target URI should be used as the target in the dialplan */
748 /*! Target URI should be used as the target within chan_pjsip itself */
750};
751
752/*!
753 * \brief Incoming/Outgoing call offer/answer joint codec preference.
754 *
755 * The default is INTERSECT ALL LOCAL.
756 */
758 /*! Two bits for merge */
759 /*! Intersection of local and remote */
761 /*! Union of local and remote */
763
764 /*! Two bits for filter */
765 /*! No filter */
767 /*! Only the first */
769
770 /*! Two bits for preference and sort */
771 /*! Prefer, and order by local values */
773 /*! Prefer, and order by remote values */
775};
776
777/*!
778 * \brief Returns true if the preference is set in the parameter
779 * \since 18.0.0
780 *
781 * \param __param A ast_flags struct with one or more of enum ast_sip_call_codec_pref set
782 * \param __codec_pref The last component of one of the enum values
783 * \retval 1 if the enum value is set
784 * \retval 0 if not
785 */
786#define ast_sip_call_codec_pref_test(__param, __codec_pref) (!!(ast_test_flag( &__param, AST_SIP_CALL_CODEC_PREF_ ## __codec_pref )))
787
788/*!
789 * \brief Session timers options
790 */
792 /*! Minimum session expiration period, in seconds */
793 unsigned int min_se;
794 /*! Session expiration period, in seconds */
795 unsigned int sess_expires;
796};
797
798/*!
799 * \brief Endpoint configuration for SIP extensions.
800 *
801 * SIP extensions, in this case refers to features
802 * indicated in Supported or Required headers.
803 */
805 /*! Enabled SIP extensions */
806 unsigned int flags;
807 /*! Timer options */
809};
810
811/*!
812 * \brief Endpoint configuration for unsolicited MWI
813 */
816 /*! Configured voicemail boxes for this endpoint. Used for MWI */
818 /*! Username to use when sending MWI NOTIFYs to this endpoint */
820 );
821 /*! Should mailbox states be combined into a single notification? */
822 unsigned int aggregate;
823 /*! Should a subscribe replace unsolicited notifies? */
825 /*! Voicemail extension to set in Message-Account */
827};
828
829/*!
830 * \brief Endpoint subscription configuration
831 */
833 /*! Indicates if endpoint is allowed to initiate subscriptions */
834 unsigned int allow;
835 /*! The minimum allowed expiration for subscriptions from endpoint */
836 unsigned int minexpiry;
837 /*! Message waiting configuration */
839 /*! Context for SUBSCRIBE requests */
841};
842
843/*!
844 * \brief NAT configuration options for endpoints
845 */
847 /*! Whether to force using the source IP address/port for sending responses */
848 unsigned int force_rport;
849 /*! Whether to rewrite the Contact header with the source IP address/port or not */
850 unsigned int rewrite_contact;
851};
852
853/*!
854 * \brief Party identification options for endpoints
855 *
856 * This includes caller ID, connected line, and redirecting-related options
857 */
859 struct ast_party_id self;
860 /*! Do we accept identification information from this endpoint */
861 unsigned int trust_inbound;
862 /*! Do we send private identification information to this endpoint? */
863 unsigned int trust_outbound;
864 /*! Do we send P-Asserted-Identity headers to this endpoint? */
865 unsigned int send_pai;
866 /*! Do we send Remote-Party-ID headers to this endpoint? */
867 unsigned int send_rpid;
868 /*! Do we send messages for connected line updates for unanswered incoming calls immediately to this endpoint? */
869 unsigned int rpid_immediate;
870 /*! Do we add Diversion headers to applicable outgoing requests/responses? */
871 unsigned int send_diversion;
872 /*! Do we accept connected line updates from this endpoint? */
873 unsigned int trust_connected_line;
874 /*! Do we send connected line updates to this endpoint? */
875 unsigned int send_connected_line;
876 /*! When performing connected line update, which method should be used */
878 /*! Do we add History-Info headers to applicable outgoing requests/responses? */
879 unsigned int send_history_info;
880};
881
882/*!
883 * \brief Call pickup configuration options for endpoints
884 */
886 /*! Call group */
888 /*! Pickup group */
890 /*! Named call group */
891 struct ast_namedgroups *named_callgroups;
892 /*! Named pickup group */
893 struct ast_namedgroups *named_pickupgroups;
894};
895
896/*!
897 * \brief Configuration for one-touch INFO recording
898 */
901 /*! Feature to enact when one-touch recording INFO with Record: On is received */
903 /*! Feature to enact when one-touch recording INFO with Record: Off is received */
905 );
906 /*! Is one-touch recording permitted? */
907 unsigned int enabled;
908};
909
910/*!
911 * \brief Endpoint configuration options for INFO packages
912 */
914 /*! Configuration for one-touch recording */
916};
917
918/*!
919 * \brief RTP configuration for SIP endpoints
920 */
923 /*! Configured RTP engine for this endpoint. */
925 );
926 /*! Whether IPv6 RTP is enabled or not */
927 unsigned int ipv6;
928 /*! Whether symmetric RTP is enabled or not */
929 unsigned int symmetric;
930 /*! Whether ICE support is enabled or not */
931 unsigned int ice_support;
932 /*! Whether to use the "ptime" attribute received from the endpoint or not */
933 unsigned int use_ptime;
934 /*! Do we use AVPF exclusively for this endpoint? */
935 unsigned int use_avpf;
936 /*! Do we force AVP, AVPF, SAVP, or SAVPF even for DTLS media streams? */
937 unsigned int force_avp;
938 /*! Do we use the received media transport in our answer SDP */
939 unsigned int use_received_transport;
940 /*! \brief DTLS-SRTP configuration information */
942 /*! Should SRTP use a 32 byte tag instead of an 80 byte tag? */
943 unsigned int srtp_tag_32;
944 /*! Do we use media encryption? what type? */
946 /*! Do we want to optimistically support encryption if possible? */
947 unsigned int encryption_optimistic;
948 /*! Number of seconds between RTP keepalive packets */
949 unsigned int keepalive;
950 /*! Number of seconds before terminating channel due to lack of RTP (when not on hold) */
951 unsigned int timeout;
952 /*! Number of seconds before terminating channel due to lack of RTP (when on hold) */
953 unsigned int timeout_hold;
954 /*! Follow forked media with a different To tag */
955 unsigned int follow_early_media_fork;
956 /*! Accept updated SDPs on non-100rel 18X and 2XX responses with the same To tag */
957 unsigned int accept_multiple_sdp_answers;
958};
959
960/*!
961 * \brief Direct media options for SIP endpoints
962 */
964 /*! Boolean indicating if direct_media is permissible */
965 unsigned int enabled;
966 /*! When using direct media, which method should be used */
968 /*! Take steps to mitigate glare for direct media */
970 /*! Do not attempt direct media session refreshes if a media NAT is detected */
971 unsigned int disable_on_nat;
972};
973
975 /*! Whether T.38 UDPTL support is enabled or not */
976 unsigned int enabled;
977 /*! Error correction setting for T.38 UDPTL */
979 /*! Explicit T.38 max datagram value, may be 0 to indicate the remote side can be trusted */
980 unsigned int maxdatagram;
981 /*! Whether NAT Support is enabled for T.38 UDPTL sessions or not */
982 unsigned int nat;
983 /*! Whether to use IPv6 for UDPTL or not */
984 unsigned int ipv6;
985 /*! Bind the UDPTL instance to the media_address */
986 unsigned int bind_udptl_to_media_address;
987};
988
989/*!
990 * \brief Media configuration for SIP endpoints
991 */
994 /*! Optional media address to use in SDP */
996 /*! SDP origin username */
998 /*! SDP session name */
1000 );
1001 /*! RTP media configuration */
1003 /*! Direct media options */
1005 /*! T.38 (FoIP) options */
1007 /*! Configured codecs */
1008 struct ast_format_cap *codecs;
1009 /*! Capabilities in topology form */
1011 /*! DSCP TOS bits for audio streams */
1012 unsigned int tos_audio;
1013 /*! Priority for audio streams */
1014 unsigned int cos_audio;
1015 /*! DSCP TOS bits for video streams */
1016 unsigned int tos_video;
1017 /*! Priority for video streams */
1018 unsigned int cos_video;
1019 /*! Is g.726 packed in a non standard way */
1020 unsigned int g726_non_standard;
1021 /*! Bind the RTP instance to the media_address */
1022 unsigned int bind_rtp_to_media_address;
1023 /*! Use RTCP-MUX */
1024 unsigned int rtcp_mux;
1025 /*! Maximum number of audio streams to offer/accept */
1026 unsigned int max_audio_streams;
1027 /*! Maximum number of video streams to offer/accept */
1028 unsigned int max_video_streams;
1029 /*! Use BUNDLE */
1030 unsigned int bundle;
1031 /*! Enable webrtc settings and defaults */
1032 unsigned int webrtc;
1033 /*! Codec preference for an incoming offer */
1035 /*! Codec preference for an outgoing offer */
1037 /*! Codec negotiation prefs for incoming offers */
1039 /*! Codec negotiation prefs for outgoing offers */
1041 /*! Codec negotiation prefs for incoming answers */
1043 /*! Codec negotiation prefs for outgoing answers */
1045};
1046
1047/*!
1048 * \brief An entity with which Asterisk communicates
1049 */
1050struct ast_sip_endpoint {
1051 SORCERY_OBJECT(details);
1053 /*! Context to send incoming calls to */
1055 /*! Name of an explicit transport to use */
1057 /*! Outbound proxy to use */
1059 /*! Explicit AORs to dial if none are specified */
1061 /*! Musiconhold class to suggest that the other side use when placing on hold */
1063 /*! Configured tone zone for this endpoint. */
1065 /*! Configured language for this endpoint. */
1067 /*! Default username to place in From header */
1069 /*! Domain to place in From header */
1071 /*! Context to route incoming MESSAGE requests to */
1073 /*! Accountcode to auto-set on channels */
1075 /*! If set, we'll push incoming MWI NOTIFYs to stasis using this mailbox */
1077 /*! STIR/SHAKEN profile to use */
1079 );
1080 /*! Configuration for extensions */
1082 /*! Configuration relating to media */
1084 /*! SUBSCRIBE/NOTIFY configuration options */
1086 /*! NAT configuration */
1088 /*! Party identification options */
1090 /*! Configuration options for INFO packages */
1092 /*! Call pickup configuration */
1094 /*! Inbound authentication credentials */
1096 /*! Outbound authentication credentials */
1098 /*! DTMF mode to use with this endpoint */
1100 /*! Method(s) by which the endpoint should be identified. */
1102 /*! Order of the method(s) by which the endpoint should be identified. */
1104 /*! Boolean indicating if ringing should be sent as inband progress */
1105 unsigned int inband_progress;
1106 /*! Pointer to the persistent Asterisk endpoint */
1107 struct ast_endpoint *persistent;
1108 /*! The number of channels at which busy device state is returned */
1109 unsigned int devicestate_busy_at;
1110 /*! Whether fax detection is enabled or not (CNG tone detection) */
1111 unsigned int faxdetect;
1112 /*! Determines if transfers (using REFER) are allowed by this endpoint */
1113 unsigned int allowtransfer;
1114 /*! Method used when handling redirects */
1116 /*! Variables set on channel creation */
1117 struct ast_variable *channel_vars;
1118 /*! Whether to place a 'user=phone' parameter into the request URI if user is a number */
1119 unsigned int usereqphone;
1120 /*! Whether to pass through hold and unhold using re-invites with recvonly and sendrecv */
1121 unsigned int moh_passthrough;
1122 /*! Access control list */
1123 struct ast_acl_list *acl;
1124 /*! Restrict what IPs are allowed in the Contact header (for registration) */
1125 struct ast_acl_list *contact_acl;
1126 /*! The number of seconds into call to disable fax detection. (0 = disabled) */
1127 unsigned int faxdetect_timeout;
1128 /*! Override the user on the outgoing Contact header with this value. */
1129 char *contact_user;
1130 /*! Whether to response SDP offer with single most preferred codec. */
1131 unsigned int preferred_codec_only;
1132 /*! Do we allow an asymmetric RTP codec? */
1133 unsigned int asymmetric_rtp_codec;
1134 /*! Do we allow overlap dialling? */
1135 unsigned int allow_overlap;
1136 /*! Whether to notifies all the progress details on blind transfer */
1137 unsigned int refer_blind_progress;
1138 /*! Whether to notifies dialog-info 'early' on INUSE && RINGING state */
1139 unsigned int notify_early_inuse_ringing;
1140 /*! Suppress Q.850 Reason headers on this endpoint */
1141 unsigned int suppress_q850_reason_headers;
1142 /*! Ignore 183 if no SDP is present */
1143 unsigned int ignore_183_without_sdp;
1144 /*! Type of security negotiation to use (RFC 3329). */
1146 /*! Client security mechanisms (RFC 3329). */
1148 /*! Set which STIR/SHAKEN behaviors we want on this endpoint */
1149 unsigned int stir_shaken;
1150 /*! Should we authenticate OPTIONS requests per RFC 3261? */
1151 unsigned int allow_unauthenticated_options;
1152 /*! The name of the geoloc profile to apply when Asterisk receives a call from this endpoint */
1153 AST_STRING_FIELD_EXTENDED(geoloc_incoming_call_profile);
1154 /*! The name of the geoloc profile to apply when Asterisk sends a call to this endpoint */
1155 AST_STRING_FIELD_EXTENDED(geoloc_outgoing_call_profile);
1156 /*! The context to use for overlap dialing, if different from the endpoint's context */
1157 AST_STRING_FIELD_EXTENDED(overlap_context);
1158 /*! 100rel mode to use with this endpoint */
1160 /*! Send Advice-of-Charge messages */
1161 unsigned int send_aoc;
1162 /*! Tenant ID for the endpoint */
1163 AST_STRING_FIELD_EXTENDED(tenantid);
1164 /*! Ignore remote hold requests */
1166};
1167
1168/*! URI parameter for symmetric transport */
1169#define AST_SIP_X_AST_TXP "x-ast-txp"
1170#define AST_SIP_X_AST_TXP_LEN 9
1171
1172/*! Common media types used throughout res_pjsip and pjproject */
1173extern pjsip_media_type pjsip_media_type_application_json;
1175extern pjsip_media_type pjsip_media_type_application_pidf_xml;
1176extern pjsip_media_type pjsip_media_type_application_xpidf_xml;
1177extern pjsip_media_type pjsip_media_type_application_cpim_xpidf_xml;
1178extern pjsip_media_type pjsip_media_type_application_rlmi_xml;
1180extern pjsip_media_type pjsip_media_type_application_sdp;
1181extern pjsip_media_type pjsip_media_type_multipart_alternative;
1182extern pjsip_media_type pjsip_media_type_multipart_mixed;
1183extern pjsip_media_type pjsip_media_type_multipart_related;
1184extern pjsip_media_type pjsip_media_type_text_plain;
1185
1186/*!
1187 * \brief Compare pjsip media types
1188 *
1189 * \param a the first media type
1190 * \param b the second media type
1191 * \retval 1 Media types are equal
1192 * \retval 0 Media types are not equal
1193 */
1194int ast_sip_are_media_types_equal(pjsip_media_type *a, pjsip_media_type *b);
1195
1196/*!
1197 * \brief Check if a media type is in a list of others
1198 *
1199 * \param a pjsip_media_type to search for
1200 * \param ... one or more pointers to pjsip_media_types the last of which must be "SENTINEL"
1201 * \retval 1 Media types are equal
1202 * \retval 0 Media types are not equal
1203 */
1204int ast_sip_is_media_type_in(pjsip_media_type *a, ...) attribute_sentinel;
1205
1206/*!
1207 * \brief Add security headers to transmission data
1208 *
1209 * \param security_mechanisms Vector of security mechanisms.
1210 * \param header_name The header name under which to add the security mechanisms.
1211 * One of Security-Client, Security-Server, Security-Verify.
1212 * \param add_qval If zero, don't add the q-value to the header.
1213 * \param tdata The transmission data.
1214 * \retval 0 Success
1215 * \retval non-zero Failure
1216 */
1218 const char *header_name, int add_qval, pjsip_tx_data *tdata);
1219
1220/*!
1221 * \brief Append to security mechanism vector from SIP header
1222 *
1223 * \param hdr The header of the security mechanisms.
1224 * \param security_mechanisms Vector of security mechanisms to append to.
1225 * Header name must be one of Security-Client, Security-Server, Security-Verify.
1226 */
1227void ast_sip_header_to_security_mechanism(const pjsip_generic_string_hdr *hdr,
1228 struct ast_sip_security_mechanism_vector *security_mechanisms);
1229
1230/*!
1231 * \brief Initialize security mechanism vector from string of security mechanisms.
1232 *
1233 * \param security_mechanism Pointer to vector of security mechanisms to initialize.
1234 * \param value String of security mechanisms as defined in RFC 3329.
1235 * \retval 0 Success
1236 * \retval non-zero Failure
1237 */
1238int ast_sip_security_mechanism_vector_init(struct ast_sip_security_mechanism_vector *security_mechanism, const char *value);
1239
1240/*!
1241 * \brief Removes all headers of a specific name and value from a pjsip_msg.
1242 *
1243 * \param msg PJSIP message from which to remove headers.
1244 * \param hdr_name Name of the header to remove.
1245 * \param value Optional string value of the header to remove.
1246 * If NULL, remove all headers of given hdr_name.
1247 */
1248void ast_sip_remove_headers_by_name_and_value(pjsip_msg *msg, const pj_str_t *hdr_name, const char* value);
1249
1250/*!
1251 * \brief Duplicate a security mechanism.
1252 *
1253 * \param dst Security mechanism to duplicate to.
1254 * \param src Security mechanism to duplicate.
1255 */
1257 const struct ast_sip_security_mechanism_vector *src);
1258
1259/*!
1260 * \brief Free contents of a security mechanism vector.
1261 *
1262 * \param security_mechanisms Vector whose contents are to be freed
1263 */
1265
1266/*!
1267 * \brief Allocate a security mechanism from a string.
1268 *
1269 * \param security_mechanism Pointer-pointer to the security mechanism to allocate.
1270 * \param value The security mechanism string as defined in RFC 3329 (section 2.2)
1271 * in the form <mechanism_name>;q=<q_value>;<mechanism_parameters>
1272 * \retval 0 Success
1273 * \retval non-zero Failure
1274 */
1275int ast_sip_str_to_security_mechanism(struct ast_sip_security_mechanism **security_mechanism, const char *value);
1276
1277/*!
1278 * \brief Writes the security mechanisms of an endpoint into a buffer as a string and returns the buffer.
1279 *
1280 * \note The buffer must be freed by the caller.
1281 *
1282 * \param endpoint Pointer to endpoint.
1283 * \param add_qvalue If non-zero, the q-value is printed as well
1284 * \param buf The buffer to write the string into
1285 * \retval 0 Success
1286 * \retval non-zero Failure
1287 */
1288int ast_sip_security_mechanisms_to_str(const struct ast_sip_security_mechanism_vector *security_mechanisms, int add_qvalue, char **buf);
1289
1290/*!
1291 * \brief Set the security negotiation based on a given string.
1292 *
1293 * \param security_negotiation Security negotiation enum to set.
1294 * \param val String that represents a security_negotiation value.
1295 * \retval 0 Success
1296 * \retval non-zero Failure
1297 */
1298int ast_sip_set_security_negotiation(enum ast_sip_security_negotiation *security_negotiation, const char *val);
1299
1300/*!
1301 * \brief Initialize an auth vector with the configured values.
1302 *
1303 * \param vector Vector to initialize
1304 * \param auth_names Comma-separated list of names to set in the array
1305 * \retval 0 Success
1306 * \retval non-zero Failure
1307 */
1308int ast_sip_auth_vector_init(struct ast_sip_auth_vector *vector, const char *auth_names);
1309
1310/*!
1311 * \brief Free contents of an auth vector.
1312 *
1313 * \param vector Vector whose contents are to be freed
1314 */
1316
1317/*!
1318 * \brief Possible returns from ast_sip_check_authentication
1319 */
1321 /*! Authentication needs to be challenged */
1323 /*! Authentication succeeded */
1325 /*! Authentication failed */
1327 /*! Authentication encountered some internal error */
1329};
1330
1331/*!
1332 * \brief Populate a vector of algorithm types from a string.
1333 *
1334 * \param id The object id to use in error messages
1335 * \param algorithms The initialized but empty vector to populate
1336 * \param agent_type The type of agent to use in error messages ("UAC" or "UAS")
1337 * \param value The comma-separated string to parse for algorithms
1338 *
1339 * \retval 0 Success
1340 * \retval non-zero Failure
1341 */
1343 struct pjsip_auth_algorithm_type_vector *algorithms, const char *agent_type, const char *value);
1344
1345/*!
1346 * \brief Dump a vector of algorithm types to a string.
1347 *
1348 * \param algorithms The vector to dump
1349 * \param[out] buf Pointer to the buffer to dump the algorithms to
1350 * Must be freed by the caller.
1351 *
1352 * \retval 0 Success
1353 * \retval non-zero Failure
1354 */
1356 const struct pjsip_auth_algorithm_type_vector *algorithms, char **buf);
1357
1358/*!
1359 * \brief An interchangeable way of handling digest authentication for SIP.
1360 *
1361 * An authenticator is responsible for filling in the callbacks provided below. Each is called from a publicly available
1362 * function in res_sip. The authenticator can use configuration or other local policy to determine whether authentication
1363 * should take place and what credentials should be used when challenging and authenticating a request.
1364 */
1365struct ast_sip_authenticator {
1366 /*!
1367 * \brief Check if a request requires authentication
1368 * See ast_sip_requires_authentication for more details
1369 */
1370 int (*requires_authentication)(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata);
1371 /*!
1372 * \brief Check that an incoming request passes authentication.
1373 *
1374 * The tdata parameter is useful for adding information such as digest challenges.
1375 *
1376 * \param endpoint The endpoint sending the incoming request
1377 * \param rdata The incoming request
1378 * \param tdata Tentative outgoing request.
1379 */
1381 pjsip_rx_data *rdata, pjsip_tx_data *tdata);
1382};
1383
1384/*!
1385 * \brief an interchangeable way of responding to authentication challenges
1386 *
1387 * An outbound authenticator takes incoming challenges and formulates a new SIP request with
1388 * credentials.
1389 */
1391 /*!
1392 * \brief Create a new request with authentication credentials
1393 *
1394 * \param auths A vector of IDs of auth sorcery objects
1395 * \param challenge The SIP response with authentication challenge(s)
1396 * \param old_request The request that received the auth challenge(s)
1397 * \param new_request The new SIP request with challenge response(s)
1398 * \retval 0 Successfully created new request
1399 * \retval -1 Failed to create a new request
1400 */
1401 int (*create_request_with_auth)(const struct ast_sip_auth_vector *auths, struct pjsip_rx_data *challenge,
1402 struct pjsip_tx_data *old_request, struct pjsip_tx_data **new_request);
1403};
1404
1405/*!
1406 * \brief An entity responsible for identifying the source of a SIP message
1407 */
1409 /*!
1410 * \brief Callback used to identify the source of a message.
1411 * See ast_sip_identify_endpoint for more details
1412 */
1413 struct ast_sip_endpoint *(*identify_endpoint)(pjsip_rx_data *rdata);
1414};
1415
1416/*!
1417 * \brief Contact retrieval filtering flags
1418 */
1420 /*! \brief Default filter flags */
1422
1423 /*! \brief Return only reachable or unknown contacts */
1425};
1426
1427/*!
1428 * \brief Adds a Date header to the tdata, formatted like:
1429 * Date: Wed, 01 Jan 2021 14:53:01 GMT
1430 * \since 16.19.0
1431 *
1432 * \note There is no checking done to see if the header already exists
1433 * before adding it. It's up to the caller of this function to determine
1434 * if that needs to be done or not.
1435 */
1436void ast_sip_add_date_header(pjsip_tx_data *tdata);
1437
1438/*!
1439 * \brief Register a SIP service in Asterisk.
1440 *
1441 * This is more-or-less a wrapper around pjsip_endpt_register_module().
1442 * Registering a service makes it so that PJSIP will call into the
1443 * service at appropriate times. For more information about PJSIP module
1444 * callbacks, see the PJSIP documentation. Asterisk modules that call
1445 * this function will likely do so at module load time.
1446 *
1447 * \param module The module that is to be registered with PJSIP
1448 * \retval 0 Success
1449 * \retval -1 Failure
1450 */
1451int ast_sip_register_service(pjsip_module *module);
1452
1453/*!
1454 * This is the opposite of ast_sip_register_service(). Unregistering a
1455 * service means that PJSIP will no longer call into the module any more.
1456 * This will likely occur when an Asterisk module is unloaded.
1457 *
1458 * \param module The PJSIP module to unregister
1459 */
1460void ast_sip_unregister_service(pjsip_module *module);
1461
1462/*!
1463 * \brief Register a SIP authenticator
1464 *
1465 * An authenticator has three main purposes:
1466 * 1) Determining if authentication should be performed on an incoming request
1467 * 2) Gathering credentials necessary for issuing an authentication challenge
1468 * 3) Authenticating a request that has credentials
1469 *
1470 * Asterisk provides a default authenticator, but it may be replaced by a
1471 * custom one if desired.
1472 *
1473 * \param auth The authenticator to register
1474 * \retval 0 Success
1475 * \retval -1 Failure
1476 */
1478
1479/*!
1480 * \brief Unregister a SIP authenticator
1481 *
1482 * When there is no authenticator registered, requests cannot be challenged
1483 * or authenticated.
1484 *
1485 * \param auth The authenticator to unregister
1486 */
1488
1489 /*!
1490 * \brief Register an outbound SIP authenticator
1491 *
1492 * An outbound authenticator is responsible for creating responses to
1493 * authentication challenges by remote endpoints.
1494 *
1495 * \param outbound_auth The authenticator to register
1496 * \retval 0 Success
1497 * \retval -1 Failure
1498 */
1500
1501/*!
1502 * \brief Unregister an outbound SIP authenticator
1503 *
1504 * When there is no outbound authenticator registered, authentication challenges
1505 * will be handled as any other final response would be.
1506 *
1507 * \param auth The authenticator to unregister
1508 */
1510
1511/*!
1512 * \brief Register a SIP endpoint identifier with a name.
1513 *
1514 * An endpoint identifier's purpose is to determine which endpoint a given SIP
1515 * message has come from.
1516 *
1517 * Multiple endpoint identifiers may be registered so that if an endpoint
1518 * cannot be identified by one identifier, it may be identified by another.
1519 *
1520 * \param identifier The SIP endpoint identifier to register
1521 * \param name The name of the endpoint identifier
1522 * \retval 0 Success
1523 * \retval -1 Failure
1524 */
1526 const char *name);
1527
1528/*!
1529 * \brief Register a SIP endpoint identifier
1530 *
1531 * An endpoint identifier's purpose is to determine which endpoint a given SIP
1532 * message has come from.
1533 *
1534 * Multiple endpoint identifiers may be registered so that if an endpoint
1535 * cannot be identified by one identifier, it may be identified by another.
1536 *
1537 * Asterisk provides two endpoint identifiers. One identifies endpoints based
1538 * on the user part of the From header URI. The other identifies endpoints based
1539 * on the source IP address.
1540 *
1541 * If the order in which endpoint identifiers is run is important to you, then
1542 * be sure to load individual endpoint identifier modules in the order you wish
1543 * for them to be run in modules.conf
1544 *
1545 * \note endpoint identifiers registered using this method (no name specified)
1546 * are placed at the front of the endpoint identifiers list ahead of any
1547 * named identifiers.
1548 *
1549 * \param identifier The SIP endpoint identifier to register
1550 * \retval 0 Success
1551 * \retval -1 Failure
1552 */
1554
1555/*!
1556 * \brief Unregister a SIP endpoint identifier
1557 *
1558 * This stops an endpoint identifier from being used.
1559 *
1560 * \param identifier The SIP endoint identifier to unregister
1561 */
1563
1564/*!
1565 * \brief Allocate a new SIP endpoint
1566 *
1567 * This will return an endpoint with its refcount increased by one. This reference
1568 * can be released using ao2_ref().
1569 *
1570 * \param name The name of the endpoint.
1571 * \retval NULL Endpoint allocation failed
1572 * \retval non-NULL The newly allocated endpoint
1573 */
1574void *ast_sip_endpoint_alloc(const char *name);
1575
1576/*!
1577 * \brief Change state of a persistent endpoint.
1578 *
1579 * \param endpoint_name The SIP endpoint name to change state.
1580 * \param state The new state
1581 * \retval 0 Success
1582 * \retval -1 Endpoint not found
1583 */
1584int ast_sip_persistent_endpoint_update_state(const char *endpoint_name, enum ast_endpoint_state state);
1585
1586/*!
1587 * \brief Publish the change of state for a contact.
1588 *
1589 * \param endpoint_name The SIP endpoint name.
1590 * \param contact_status The contact status.
1591 */
1592void ast_sip_persistent_endpoint_publish_contact_state(const char *endpoint_name, const struct ast_sip_contact_status *contact_status);
1593
1594/*!
1595 * \brief Retrieve the current status for a contact.
1596 *
1597 * \param contact The contact.
1598 *
1599 * \retval non-NULL Success
1600 * \retval NULL Status information not found
1601 *
1602 * \note The returned contact status object is immutable.
1603 */
1605
1606/*!
1607 * \brief Get a pointer to the PJSIP endpoint.
1608 *
1609 * This is useful when modules have specific information they need
1610 * to register with the PJSIP core.
1611 * \retval NULL endpoint has not been created yet.
1612 * \retval non-NULL PJSIP endpoint.
1613 */
1614pjsip_endpoint *ast_sip_get_pjsip_endpoint(void);
1615
1616/*!
1617 * \brief Get a pointer to the SIP sorcery structure.
1618 *
1619 * \retval NULL sorcery has not been initialized
1620 * \retval non-NULL sorcery structure
1621 */
1622struct ast_sorcery *ast_sip_get_sorcery(void);
1623
1624/*!
1625 * \brief Retrieve a named AOR
1626 *
1627 * \param aor_name Name of the AOR
1628 *
1629 * \retval NULL if not found
1630 * \retval non-NULL if found
1631 */
1632struct ast_sip_aor *ast_sip_location_retrieve_aor(const char *aor_name);
1633
1634/*!
1635 * \brief Retrieve the first bound contact for an AOR
1636 *
1637 * \param aor Pointer to the AOR
1638 * \retval NULL if no contacts available
1639 * \retval non-NULL if contacts available
1640 */
1642
1643/*!
1644 * \brief Retrieve the first bound contact for an AOR and filter based on flags
1645 * \since 13.16.0
1646 *
1647 * \param aor Pointer to the AOR
1648 * \param flags Filtering flags
1649 * \retval NULL if no contacts available
1650 * \retval non-NULL if contacts available
1651 */
1653 unsigned int flags);
1654
1655/*!
1656 * \brief Retrieve all contacts currently available for an AOR
1657 *
1658 * \param aor Pointer to the AOR
1659 *
1660 * \retval NULL if no contacts available
1661 * \retval non-NULL if contacts available
1662 *
1663 * \warning
1664 * Since this function prunes expired contacts before returning, it holds a named write
1665 * lock on the aor. If you already hold the lock, call ast_sip_location_retrieve_aor_contacts_nolock instead.
1666 */
1668
1669/*!
1670 * \brief Retrieve all contacts currently available for an AOR and filter based on flags
1671 * \since 13.16.0
1672 *
1673 * \param aor Pointer to the AOR
1674 * \param flags Filtering flags
1675 *
1676 * \retval NULL if no contacts available
1677 * \retval non-NULL if contacts available
1678 *
1679 * \warning
1680 * Since this function prunes expired contacts before returning, it holds a named write
1681 * lock on the aor. If you already hold the lock, call ast_sip_location_retrieve_aor_contacts_nolock instead.
1682 */
1684 unsigned int flags);
1685
1686/*!
1687 * \brief Retrieve all contacts currently available for an AOR without locking the AOR
1688 * \since 13.9.0
1689 *
1690 * \param aor Pointer to the AOR
1691 *
1692 * \retval NULL if no contacts available
1693 * \retval non-NULL if contacts available
1694 *
1695 * \warning
1696 * This function should only be called if you already hold a named write lock on the aor.
1697 */
1699
1700/*!
1701 * \brief Retrieve all contacts currently available for an AOR without locking the AOR and filter based on flags
1702 * \since 13.16.0
1703 *
1704 * \param aor Pointer to the AOR
1705 * \param flags Filtering flags
1706 *
1707 * \retval NULL if no contacts available
1708 * \retval non-NULL if contacts available
1709 *
1710 * \warning
1711 * This function should only be called if you already hold a named write lock on the aor.
1712 */
1714 unsigned int flags);
1715
1716/*!
1717 * \brief Retrieve the first bound contact from a list of AORs
1718 *
1719 * \param aor_list A comma-separated list of AOR names
1720 * \retval NULL if no contacts available
1721 * \retval non-NULL if contacts available
1722 */
1724
1725/*!
1726 * \brief Retrieve all contacts from a list of AORs
1727 *
1728 * \param aor_list A comma-separated list of AOR names
1729 * \retval NULL if no contacts available
1730 * \retval non-NULL container (which must be freed) if contacts available
1731 */
1733
1734/*!
1735 * \brief Retrieve the first bound contact AND the AOR chosen from a list of AORs
1736 *
1737 * \param aor_list A comma-separated list of AOR names
1738 * \param aor The chosen AOR
1739 * \param contact The chosen contact
1740 */
1741 void ast_sip_location_retrieve_contact_and_aor_from_list(const char *aor_list, struct ast_sip_aor **aor,
1742 struct ast_sip_contact **contact);
1743
1744/*!
1745 * \brief Retrieve the first bound contact AND the AOR chosen from a list of AORs and filter based on flags
1746 * \since 13.16.0
1747 *
1748 * \param aor_list A comma-separated list of AOR names
1749 * \param flags Filtering flags
1750 * \param aor The chosen AOR
1751 * \param contact The chosen contact
1752 */
1753void ast_sip_location_retrieve_contact_and_aor_from_list_filtered(const char *aor_list, unsigned int flags,
1754 struct ast_sip_aor **aor, struct ast_sip_contact **contact);
1755
1756/*!
1757 * \brief Retrieve a named contact
1758 *
1759 * \param contact_name Name of the contact
1760 *
1761 * \retval NULL if not found
1762 * \retval non-NULL if found
1763 */
1764struct ast_sip_contact *ast_sip_location_retrieve_contact(const char *contact_name);
1765
1766/*!
1767 * \brief Add a new contact to an AOR
1768 *
1769 * \param aor Pointer to the AOR
1770 * \param uri Full contact URI
1771 * \param expiration_time Optional expiration time of the contact
1772 * \param path_info Path information
1773 * \param user_agent User-Agent header from REGISTER request
1774 * \param via_addr
1775 * \param via_port
1776 * \param call_id
1777 * \param endpoint The endpoint that resulted in the contact being added
1778 *
1779 * \retval -1 failure
1780 * \retval 0 success
1781 *
1782 * \warning
1783 * This function holds a named write lock on the aor. If you already hold the lock
1784 * you should call ast_sip_location_add_contact_nolock instead.
1785 */
1786int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri,
1787 struct timeval expiration_time, const char *path_info, const char *user_agent,
1788 const char *via_addr, int via_port, const char *call_id,
1789 struct ast_sip_endpoint *endpoint);
1790
1791/*!
1792 * \brief Add a new contact to an AOR without locking the AOR
1793 * \since 13.9.0
1794 *
1795 * \param aor Pointer to the AOR
1796 * \param uri Full contact URI
1797 * \param expiration_time Optional expiration time of the contact
1798 * \param path_info Path information
1799 * \param user_agent User-Agent header from REGISTER request
1800 * \param via_addr
1801 * \param via_port
1802 * \param call_id
1803 * \param endpoint The endpoint that resulted in the contact being added
1804 *
1805 * \retval -1 failure
1806 * \retval 0 success
1807 *
1808 * \warning
1809 * This function should only be called if you already hold a named write lock on the aor.
1810 */
1812 struct timeval expiration_time, const char *path_info, const char *user_agent,
1813 const char *via_addr, int via_port, const char *call_id,
1814 struct ast_sip_endpoint *endpoint);
1815
1816/*!
1817 * \brief Create a new contact for an AOR without locking the AOR
1818 * \since 13.18.0
1819 *
1820 * \param aor Pointer to the AOR
1821 * \param uri Full contact URI
1822 * \param expiration_time Optional expiration time of the contact
1823 * \param path_info Path information
1824 * \param user_agent User-Agent header from REGISTER request
1825 * \param via_addr
1826 * \param via_port
1827 * \param call_id
1828 * \param prune_on_boot Non-zero if the contact cannot survive a restart/boot.
1829 * \param endpoint The endpoint that resulted in the contact being added
1830 *
1831 * \return The created contact or NULL on failure.
1832 *
1833 * \warning
1834 * This function should only be called if you already hold a named write lock on the aor.
1835 */
1837 const char *uri, struct timeval expiration_time, const char *path_info,
1838 const char *user_agent, const char *via_addr, int via_port, const char *call_id,
1840
1841/*!
1842 * \brief Update a contact
1843 *
1844 * \param contact New contact object with details
1845 *
1846 * \retval -1 failure
1847 * \retval 0 success
1848 */
1850
1851/*!
1852* \brief Delete a contact
1853*
1854* \param contact Contact object to delete
1855*
1856* \retval -1 failure
1857* \retval 0 success
1858*/
1860
1861/*!
1862 * \brief Prune the prune_on_boot contacts
1863 * \since 13.18.0
1864 */
1866
1867/*!
1868 * \brief Callback called when an outbound request with authentication credentials is to be sent in dialog
1869 *
1870 * This callback will have the created request on it. The callback's purpose is to do any extra
1871 * housekeeping that needs to be done as well as to send the request out.
1872 *
1873 * This callback is only necessary if working with a PJSIP API that sits between the application
1874 * and the dialog layer.
1875 *
1876 * \param dlg The dialog to which the request belongs
1877 * \param tdata The created request to be sent out
1878 * \param user_data Data supplied with the callback
1879 *
1880 * \retval 0 Success
1881 * \retval -1 Failure
1882 */
1883typedef int (*ast_sip_dialog_outbound_auth_cb)(pjsip_dialog *dlg, pjsip_tx_data *tdata, void *user_data);
1884
1885/*!
1886 * \brief Set up outbound authentication on a SIP dialog
1887 *
1888 * This sets up the infrastructure so that all requests associated with a created dialog
1889 * can be re-sent with authentication credentials if the original request is challenged.
1890 *
1891 * \param dlg The dialog on which requests will be authenticated
1892 * \param endpoint The endpoint whom this dialog pertains to
1893 * \param cb Callback to call to send requests with authentication
1894 * \param user_data Data to be provided to the callback when it is called
1895 *
1896 * \retval 0 Success
1897 * \retval -1 Failure
1898 */
1900 ast_sip_dialog_outbound_auth_cb cb, void *user_data);
1901
1902/*!
1903 * \brief Retrieves a reference to the artificial auth.
1904 *
1905 * \retval The artificial auth
1906 */
1908
1909/*!
1910 * \brief Retrieves a reference to the artificial endpoint.
1911 *
1912 * \retval The artificial endpoint
1913 */
1915
1916/*! \defgroup pjsip_threading PJSIP Threading Model
1917 * @{
1918 * \page PJSIP PJSIP Threading Model
1919 *
1920 * There are three major types of threads that SIP will have to deal with:
1921 * \li Asterisk threads
1922 * \li PJSIP threads
1923 * \li SIP threadpool threads (a.k.a. "servants")
1924 *
1925 * \par Asterisk Threads
1926 *
1927 * Asterisk threads are those that originate from outside of SIP but within
1928 * Asterisk. The most common of these threads are PBX (channel) threads and
1929 * the autoservice thread. Most interaction with these threads will be through
1930 * channel technology callbacks. Within these threads, it is fine to handle
1931 * Asterisk data from outside of SIP, but any handling of SIP data should be
1932 * left to servants, \b especially if you wish to call into PJSIP for anything.
1933 * Asterisk threads are not registered with PJLIB, so attempting to call into
1934 * PJSIP will cause an assertion to be triggered, thus causing the program to
1935 * crash.
1936 *
1937 * \par PJSIP Threads
1938 *
1939 * PJSIP threads are those that originate from handling of PJSIP events, such
1940 * as an incoming SIP request or response, or a transaction timeout. The role
1941 * of these threads is to process information as quickly as possible so that
1942 * the next item on the SIP socket(s) can be serviced. On incoming messages,
1943 * Asterisk automatically will push the request to a servant thread. When your
1944 * module callback is called, processing will already be in a servant. However,
1945 * for other PJSIP events, such as transaction state changes due to timer
1946 * expirations, your module will be called into from a PJSIP thread. If you
1947 * are called into from a PJSIP thread, then you should push whatever processing
1948 * is needed to a servant as soon as possible. You can discern if you are currently
1949 * in a SIP servant thread using the \ref ast_sip_thread_is_servant function.
1950 *
1951 * \par Servants
1952 *
1953 * Servants are where the bulk of SIP work should be performed. These threads
1954 * exist in order to do the work that Asterisk threads and PJSIP threads hand
1955 * off to them. Servant threads register themselves with PJLIB, meaning that
1956 * they are capable of calling PJSIP and PJLIB functions if they wish.
1957 *
1958 * \par Serializer
1959 *
1960 * Tasks are handed off to servant threads using the API call \ref ast_sip_push_task.
1961 * The first parameter of this call is a serializer. If this pointer
1962 * is NULL, then the work will be handed off to whatever servant can currently handle
1963 * the task. If this pointer is non-NULL, then the task will not be executed until
1964 * previous tasks pushed with the same serializer have completed. For more information
1965 * on serializers and the benefits they provide, see \ref ast_threadpool_serializer
1966 *
1967 * \par Scheduler
1968 *
1969 * Some situations require that a task run periodically or at a future time. Normally
1970 * the ast_sched functionality would be used but ast_sched only uses 1 thread for all
1971 * tasks and that thread isn't registered with PJLIB and therefore can't do any PJSIP
1972 * related work.
1973 *
1974 * ast_sip_sched uses ast_sched only as a scheduled queue. When a task is ready to run,
1975 * it's pushed to a Serializer to be invoked asynchronously by a Servant. This ensures
1976 * that the task is executed in a PJLIB registered thread and allows the ast_sched thread
1977 * to immediately continue processing the queue. The Serializer used by ast_sip_sched
1978 * is one of your choosing or a random one from the res_pjsip pool if you don't choose one.
1979 *
1980 * \note
1981 *
1982 * Do not make assumptions about individual threads based on a corresponding serializer.
1983 * In other words, just because several tasks use the same serializer when being pushed
1984 * to servants, it does not mean that the same thread is necessarily going to execute those
1985 * tasks, even though they are all guaranteed to be executed in sequence.
1986 */
1987
1988typedef int (*ast_sip_task)(void *user_data);
1989
1990/*!
1991 * \brief Create a new serializer for SIP tasks
1992 * \since 13.8.0
1993 *
1994 * See \ref ast_threadpool_serializer for more information on serializers.
1995 * SIP creates serializers so that tasks operating on similar data will run
1996 * in sequence.
1997 *
1998 * \param name Name of the serializer. (must be unique)
1999 *
2000 * \retval NULL Failure
2001 * \retval non-NULL Newly-created serializer
2002 */
2004
2006
2007/*!
2008 * \brief Create a new serializer for SIP tasks
2009 * \since 13.8.0
2010 *
2011 * See \ref ast_threadpool_serializer for more information on serializers.
2012 * SIP creates serializers so that tasks operating on similar data will run
2013 * in sequence.
2014 *
2015 * \param name Name of the serializer. (must be unique)
2016 * \param shutdown_group Group shutdown controller. (NULL if no group association)
2017 *
2018 * \retval NULL Failure
2019 * \retval non-NULL Newly-created serializer
2020 */
2022
2023/*!
2024 * \brief Determine the distributor serializer for the SIP message.
2025 * \since 13.10.0
2026 *
2027 * \param rdata The incoming message.
2028 *
2029 * \retval Calculated distributor serializer on success.
2030 * \retval NULL on error.
2031 */
2032struct ast_taskprocessor *ast_sip_get_distributor_serializer(pjsip_rx_data *rdata);
2033
2034/*!
2035 * \brief Set a serializer on a SIP dialog so requests and responses are automatically serialized
2036 *
2037 * Passing a NULL serializer is a way to remove a serializer from a dialog.
2038 *
2039 * \param dlg The SIP dialog itself
2040 * \param serializer The serializer to use
2041 */
2042void ast_sip_dialog_set_serializer(pjsip_dialog *dlg, struct ast_taskprocessor *serializer);
2043
2044/*!
2045 * \brief Set an endpoint on a SIP dialog so in-dialog requests do not undergo endpoint lookup.
2046 *
2047 * \param dlg The SIP dialog itself
2048 * \param endpoint The endpoint that this dialog is communicating with
2049 */
2050void ast_sip_dialog_set_endpoint(pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint);
2051
2052/*!
2053 * \brief Get the endpoint associated with this dialog
2054 *
2055 * This function increases the refcount of the endpoint by one. Release
2056 * the reference once you are finished with the endpoint.
2057 *
2058 * \param dlg The SIP dialog from which to retrieve the endpoint
2059 * \retval NULL No endpoint associated with this dialog
2060 * \retval non-NULL The endpoint.
2061 */
2062struct ast_sip_endpoint *ast_sip_dialog_get_endpoint(pjsip_dialog *dlg);
2063
2064/*!
2065 * \brief Pushes a task to SIP servants
2066 *
2067 * This uses the serializer provided to determine how to push the task.
2068 * If the serializer is NULL, then the task will be pushed to the
2069 * servants directly. If the serializer is non-NULL, then the task will be
2070 * queued behind other tasks associated with the same serializer.
2071 *
2072 * \param serializer The serializer to which the task belongs. Can be NULL
2073 * \param sip_task The task to execute
2074 * \param task_data The parameter to pass to the task when it executes
2075 * \retval 0 Success
2076 * \retval -1 Failure
2077 */
2078int ast_sip_push_task(struct ast_taskprocessor *serializer, int (*sip_task)(void *), void *task_data);
2079
2080/*!
2081 * \brief Push a task to SIP servants and wait for it to complete.
2082 *
2083 * Like \ref ast_sip_push_task except that it blocks until the task
2084 * completes. If the current thread is a SIP servant thread then the
2085 * task executes immediately. Otherwise, the specified serializer
2086 * executes the task and the current thread waits for it to complete.
2087 *
2088 * \note PJPROJECT callbacks tend to have locks already held when
2089 * called.
2090 *
2091 * \warning \b Never hold locks that may be acquired by a SIP servant
2092 * thread when calling this function. Doing so may cause a deadlock
2093 * if all SIP servant threads are blocked waiting to acquire the lock
2094 * while the thread holding the lock is waiting for a free SIP servant
2095 * thread.
2096 *
2097 * \warning \b Use of this function in an ao2 destructor callback is a
2098 * bad idea. You don't have control over which thread executes the
2099 * destructor. Attempting to shift execution to another thread with
2100 * this function is likely to cause deadlock.
2101 *
2102 * \param serializer The SIP serializer to execute the task if the
2103 * current thread is not a SIP servant. NULL if any of the default
2104 * serializers can be used.
2105 * \param sip_task The task to execute
2106 * \param task_data The parameter to pass to the task when it executes
2107 *
2108 * \note The sip_task() return value may need to be distinguished from
2109 * the failure to push the task.
2110 *
2111 * \return sip_task() return value on success.
2112 * \retval -1 Failure to push the task.
2113 */
2114int ast_sip_push_task_wait_servant(struct ast_taskprocessor *serializer, int (*sip_task)(void *), void *task_data);
2115
2116/*!
2117 * \brief Push a task to SIP servants and wait for it to complete.
2118 * \deprecated Replaced with ast_sip_push_task_wait_servant().
2119 */
2120int ast_sip_push_task_synchronous(struct ast_taskprocessor *serializer, int (*sip_task)(void *), void *task_data);
2121
2122/*!
2123 * \brief Push a task to the serializer and wait for it to complete.
2124 *
2125 * Like \ref ast_sip_push_task except that it blocks until the task is
2126 * completed by the specified serializer. If the specified serializer
2127 * is the current thread then the task executes immediately.
2128 *
2129 * \note PJPROJECT callbacks tend to have locks already held when
2130 * called.
2131 *
2132 * \warning \b Never hold locks that may be acquired by a SIP servant
2133 * thread when calling this function. Doing so may cause a deadlock
2134 * if all SIP servant threads are blocked waiting to acquire the lock
2135 * while the thread holding the lock is waiting for a free SIP servant
2136 * thread for the serializer to execute in.
2137 *
2138 * \warning \b Never hold locks that may be acquired by the serializer
2139 * when calling this function. Doing so will cause a deadlock.
2140 *
2141 * \warning \b Never use this function in the pjsip monitor thread (It
2142 * is a SIP servant thread). This is likely to cause a deadlock.
2143 *
2144 * \warning \b Use of this function in an ao2 destructor callback is a
2145 * bad idea. You don't have control over which thread executes the
2146 * destructor. Attempting to shift execution to another thread with
2147 * this function is likely to cause deadlock.
2148 *
2149 * \param serializer The SIP serializer to execute the task. NULL if
2150 * any of the default serializers can be used.
2151 * \param sip_task The task to execute
2152 * \param task_data The parameter to pass to the task when it executes
2153 *
2154 * \note It is generally better to call
2155 * ast_sip_push_task_wait_servant() if you pass NULL for the
2156 * serializer parameter.
2157 *
2158 * \note The sip_task() return value may need to be distinguished from
2159 * the failure to push the task.
2160 *
2161 * \return sip_task() return value on success.
2162 * \retval -1 Failure to push the task.
2163 */
2164int ast_sip_push_task_wait_serializer(struct ast_taskprocessor *serializer, int (*sip_task)(void *), void *task_data);
2165
2166/*!
2167 * \brief Determine if the current thread is a SIP servant thread
2168 *
2169 * \retval 0 This is not a SIP servant thread
2170 * \retval 1 This is a SIP servant thread
2171 */
2173
2174/*!
2175 * \brief Task flags for the res_pjsip scheduler
2176 *
2177 * The default is AST_SIP_SCHED_TASK_FIXED
2178 * | AST_SIP_SCHED_TASK_DATA_NOT_AO2
2179 * | AST_SIP_SCHED_TASK_DATA_NO_CLEANUP
2180 * | AST_SIP_SCHED_TASK_PERIODIC
2181 */
2183 /*!
2184 * The defaults
2185 */
2186 AST_SIP_SCHED_TASK_DEFAULTS = (0 << 0),
2187
2188 /*!
2189 * Run at a fixed interval.
2190 * Stop scheduling if the callback returns <= 0.
2191 * Any other value is ignored.
2192 */
2193 AST_SIP_SCHED_TASK_FIXED = (0 << 0),
2194 /*!
2195 * Run at a variable interval.
2196 * Stop scheduling if the callback returns <= 0.
2197 * Any other return value is used as the new interval.
2198 */
2199 AST_SIP_SCHED_TASK_VARIABLE = (1 << 0),
2200
2201 /*!
2202 * Run just once.
2203 * Return values are ignored.
2204 */
2205 AST_SIP_SCHED_TASK_ONESHOT = (1 << 6),
2206
2207 /*!
2208 * The task data is not an AO2 object.
2209 */
2211 /*!
2212 * The task data is an AO2 object.
2213 * A reference count will be held by the scheduler until
2214 * after the task has run for the final time (if ever).
2215 */
2216 AST_SIP_SCHED_TASK_DATA_AO2 = (1 << 1),
2217
2218 /*!
2219 * Don't take any cleanup action on the data
2220 */
2222 /*!
2223 * If AST_SIP_SCHED_TASK_DATA_AO2 is set, decrement the reference count
2224 * otherwise call ast_free on it.
2225 */
2226 AST_SIP_SCHED_TASK_DATA_FREE = ( 1 << 3 ),
2227
2228 /*!
2229 * \brief The task is scheduled at multiples of interval
2230 * \see Interval
2231 */
2232 AST_SIP_SCHED_TASK_PERIODIC = (0 << 4),
2233 /*!
2234 * \brief The next invocation of the task is at last finish + interval
2235 * \see Interval
2236 */
2237 AST_SIP_SCHED_TASK_DELAY = (1 << 4),
2238 /*!
2239 * \brief The scheduled task's events are tracked in the debug log.
2240 * \details
2241 * Schedule events such as scheduling, running, rescheduling, canceling,
2242 * and destroying are logged about the task.
2243 */
2244 AST_SIP_SCHED_TASK_TRACK = (1 << 5),
2245};
2246
2247/*!
2248 * \brief Scheduler task data structure
2249 */
2250struct ast_sip_sched_task;
2251
2252/*!
2253 * \brief Schedule a task to run in the res_pjsip thread pool
2254 * \since 13.9.0
2255 *
2256 * \param serializer The serializer to use. If NULL, don't use a serializer (see note below)
2257 * \param interval The invocation interval in milliseconds (see note below)
2258 * \param sip_task The task to invoke
2259 * \param name An optional name to associate with the task
2260 * \param task_data Optional data to pass to the task
2261 * \param flags One of enum ast_sip_scheduler_task_type
2262 *
2263 * \returns Pointer to \ref ast_sip_sched_task ao2 object which must be dereferenced when done.
2264 *
2265 * \par Serialization
2266 *
2267 * Specifying a serializer guarantees serialized execution but NOT specifying a serializer
2268 * may still result in tasks being effectively serialized if the thread pool is busy.
2269 * The point of the serializer BTW is not to prevent parallel executions of the SAME task.
2270 * That happens automatically (see below). It's to prevent the task from running at the same
2271 * time as other work using the same serializer, whether or not it's being run by the scheduler.
2272 *
2273 * \par Interval
2274 *
2275 * The interval is used to calculate the next time the task should run. There are two models.
2276 *
2277 * \ref AST_SIP_SCHED_TASK_PERIODIC specifies that the invocations of the task occur at the
2278 * specific interval. That is, every \p interval milliseconds, regardless of how long the task
2279 * takes. If the task takes longer than \p interval, it will be scheduled at the next available
2280 * multiple of \p interval. For example: If the task has an interval of 60 seconds and the task
2281 * takes 70 seconds, the next invocation will happen at 120 seconds.
2282 *
2283 * \ref AST_SIP_SCHED_TASK_DELAY specifies that the next invocation of the task should start
2284 * at \p interval milliseconds after the current invocation has finished.
2285 *
2286 */
2288 int interval, ast_sip_task sip_task, const char *name, void *task_data,
2290
2291/*!
2292 * \brief Cancels the next invocation of a task
2293 * \since 13.9.0
2294 *
2295 * \param schtd The task structure pointer
2296 * \retval 0 Success
2297 * \retval -1 Failure
2298 * \note Only cancels future invocations not the currently running invocation.
2299 */
2301
2302/*!
2303 * \brief Cancels the next invocation of a task by name
2304 * \since 13.9.0
2305 *
2306 * \param name The task name
2307 * \retval 0 Success
2308 * \retval -1 Failure
2309 * \note Only cancels future invocations not the currently running invocation.
2310 */
2312
2313/*!
2314 * \brief Gets the last start and end times of the task
2315 * \since 13.9.0
2316 *
2317 * \param schtd The task structure pointer
2318 * \param[out] when_queued Pointer to a timeval structure to contain the time when queued
2319 * \param[out] last_start Pointer to a timeval structure to contain the time when last started
2320 * \param[out] last_end Pointer to a timeval structure to contain the time when last ended
2321 * \retval 0 Success
2322 * \retval -1 Failure
2323 * \note Any of the pointers can be NULL if you don't need them.
2324 */
2326 struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end);
2327
2328/*!
2329 * \brief Gets the queued, last start, last_end, time left, interval, next run
2330 * \since 16.15.0
2331 * \since 18.1.0
2332 *
2333 * \param schtd The task structure pointer
2334 * \param[out] when_queued Pointer to a timeval structure to contain the time when queued
2335 * \param[out] last_start Pointer to a timeval structure to contain the time when last started
2336 * \param[out] last_end Pointer to a timeval structure to contain the time when last ended
2337 * \param[out] interval Pointer to an int to contain the interval in ms
2338 * \param[out] time_left Pointer to an int to contain the ms left to the next run
2339 * \param[out] next_start Pointer to a timeval structure to contain the next run time
2340 * \retval 0 Success
2341 * \retval -1 Failure
2342 * \note Any of the pointers can be NULL if you don't need them.
2343 */
2345 struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end,
2346 int *interval, int *time_left, struct timeval *next_start);
2347
2348/*!
2349 * \brief Gets the last start and end times of the task by name
2350 * \since 13.9.0
2351 *
2352 * \param name The task name
2353 * \param[out] when_queued Pointer to a timeval structure to contain the time when queued
2354 * \param[out] last_start Pointer to a timeval structure to contain the time when last started
2355 * \param[out] last_end Pointer to a timeval structure to contain the time when last ended
2356 * \retval 0 Success
2357 * \retval -1 Failure
2358 * \note Any of the pointers can be NULL if you don't need them.
2359 */
2361 struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end);
2362
2363/*!
2364 * \brief Gets the queued, last start, last_end, time left, interval, next run by task name
2365 * \since 16.15.0
2366 * \since 18.1.0
2367 *
2368 * \param name The task name
2369 * \param[out] when_queued Pointer to a timeval structure to contain the time when queued
2370 * \param[out] last_start Pointer to a timeval structure to contain the time when last started
2371 * \param[out] last_end Pointer to a timeval structure to contain the time when last ended
2372 * \param[out] interval Pointer to an int to contain the interval in ms
2373 * \param[out] time_left Pointer to an int to contain the ms left to the next run
2374 * \param[out] next_start Pointer to a timeval structure to contain the next run time
2375 * \retval 0 Success
2376 * \retval -1 Failure
2377 * \note Any of the pointers can be NULL if you don't need them.
2378 */
2380 struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end,
2381 int *interval, int *time_left, struct timeval *next_start);
2382
2383/*!
2384 * \brief Gets the number of milliseconds until the next invocation
2385 * \since 13.9.0
2386 *
2387 * \param schtd The task structure pointer
2388 * \return The number of milliseconds until the next invocation or -1 if the task isn't scheduled
2389 */
2391
2392/*!
2393 * \brief Gets the number of milliseconds until the next invocation
2394 * \since 13.9.0
2395 *
2396 * \param name The task name
2397 * \return The number of milliseconds until the next invocation or -1 if the task isn't scheduled
2398 */
2400
2401/*!
2402 * \brief Checks if the task is currently running
2403 * \since 13.9.0
2404 *
2405 * \param schtd The task structure pointer
2406 * \retval 0 not running
2407 * \retval 1 running
2408 */
2410
2411/*!
2412 * \brief Checks if the task is currently running
2413 * \since 13.9.0
2414 *
2415 * \param name The task name
2416 * \retval 0 not running or not found
2417 * \retval 1 running
2418 */
2420
2421/*!
2422 * \brief Gets the task name
2423 * \since 13.9.0
2424 *
2425 * \param schtd The task structure pointer
2426 * \param name, maxlen
2427 * \retval 0 success
2428 * \retval 1 failure
2429 */
2430int ast_sip_sched_task_get_name(struct ast_sip_sched_task *schtd, char *name, size_t maxlen);
2431
2432/*!
2433 * @}
2434 */
2435
2436/*!
2437 * \brief SIP body description
2438 *
2439 * This contains a type and subtype that will be added as
2440 * the "Content-Type" for the message as well as the body
2441 * text.
2442 */
2443struct ast_sip_body {
2444 /*! Type of the body, such as "application" */
2445 const char *type;
2446 /*! Subtype of the body, such as "sdp" */
2447 const char *subtype;
2448 /*! The text to go in the body */
2449 const char *body_text;
2450};
2451
2452/*!
2453 * \brief General purpose method for creating a UAC dialog with an endpoint
2454 *
2455 * \param endpoint A pointer to the endpoint
2456 * \param aor_name Optional name of the AOR to target, may even be an explicit SIP URI
2457 * \param request_user Optional user to place into the target URI
2458 *
2459 * \retval non-NULL success
2460 * \retval NULL failure
2461 */
2462pjsip_dialog *ast_sip_create_dialog_uac(const struct ast_sip_endpoint *endpoint, const char *aor_name, const char *request_user);
2463
2464/*!
2465 * \brief General purpose method for creating a UAS dialog with an endpoint
2466 *
2467 * \deprecated This function is unsafe (due to the returned object not being locked nor
2468 * having its reference incremented) and should no longer be used. Instead
2469 * use ast_sip_create_dialog_uas_locked so a properly locked and referenced
2470 * object is returned.
2471 *
2472 * \param endpoint A pointer to the endpoint
2473 * \param rdata The request that is starting the dialog
2474 * \param[out] status On failure, the reason for failure in creating the dialog
2475 */
2476pjsip_dialog *ast_sip_create_dialog_uas(const struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pj_status_t *status);
2477
2478/*!
2479 * \brief General purpose method for creating a UAS dialog with an endpoint
2480 *
2481 * This function creates and returns a locked, and referenced counted pjsip
2482 * dialog object. The caller is thus responsible for freeing the allocated
2483 * memory, decrementing the reference, and releasing the lock when done with
2484 * the returned object.
2485 *
2486 * \note The safest way to unlock the object, and decrement its reference is by
2487 * calling pjsip_dlg_dec_lock. Alternatively, pjsip_dlg_dec_session can be
2488 * used to decrement the reference only.
2489 *
2490 * The dialog is returned locked and with a reference in order to ensure that the
2491 * dialog object, and any of its associated objects (e.g. transaction) are not
2492 * untimely destroyed. For instance, that could happen when a transport error
2493 * occurs.
2494 *
2495 * As long as the caller maintains a reference to the dialog there should be no
2496 * worry that it might unknowingly be destroyed. However, once the caller unlocks
2497 * the dialog there is a danger that some of the dialog's internal objects could
2498 * be lost and/or compromised. For example, when the aforementioned transport error
2499 * occurs the dialog's associated transaction gets destroyed (see pjsip_dlg_on_tsx_state
2500 * in sip_dialog.c, and mod_inv_on_tsx_state in sip_inv.c).
2501 *
2502 * In this case and before using the dialog again the caller should re-lock the
2503 * dialog, check to make sure the dialog is still established, and the transaction
2504 * still exists and has not been destroyed.
2505 *
2506 * \param endpoint A pointer to the endpoint
2507 * \param rdata The request that is starting the dialog
2508 * \param[out] status On failure, the reason for failure in creating the dialog
2509 *
2510 * \retval A locked, and reference counted pjsip_dialog object.
2511 * \retval NULL on failure
2512 */
2513pjsip_dialog *ast_sip_create_dialog_uas_locked(const struct ast_sip_endpoint *endpoint,
2514 pjsip_rx_data *rdata, pj_status_t *status);
2515
2516/*!
2517 * \brief General purpose method for creating an rdata structure using specific information
2518 * \since 13.15.0
2519 *
2520 * \param[out] rdata The rdata structure that will be populated
2521 * \param packet A SIP message
2522 * \param src_name The source IP address of the message
2523 * \param src_port The source port of the message
2524 * \param transport_type The type of transport the message was received on
2525 * \param local_name The local IP address the message was received on
2526 * \param local_port The local port the message was received on
2527 * \param contact_uri The contact URI of the message
2528 *
2529 * \retval 0 success
2530 * \retval -1 failure
2531 */
2532int ast_sip_create_rdata_with_contact(pjsip_rx_data *rdata, char *packet,
2533 const char *src_name, int src_port, char *transport_type, const char *local_name,
2534 int local_port, const char *contact_uri);
2535
2536/*!
2537 * \brief General purpose method for creating an rdata structure using specific information
2538 *
2539 * \param[out] rdata The rdata structure that will be populated
2540 * \param packet A SIP message
2541 * \param src_name The source IP address of the message
2542 * \param src_port The source port of the message
2543 * \param transport_type The type of transport the message was received on
2544 * \param local_name The local IP address the message was received on
2545 * \param local_port The local port the message was received on
2546 *
2547 * \retval 0 success
2548 * \retval -1 failure
2549 */
2550int ast_sip_create_rdata(pjsip_rx_data *rdata, char *packet, const char *src_name,
2551 int src_port, char *transport_type, const char *local_name, int local_port);
2552
2553/*!
2554 * \brief General purpose method for creating a SIP request
2555 *
2556 * Its typical use would be to create one-off requests such as an out of dialog
2557 * SIP MESSAGE.
2558 *
2559 * The request can either be in- or out-of-dialog. If in-dialog, the
2560 * dlg parameter MUST be present. If out-of-dialog the endpoint parameter
2561 * MUST be present. If both are present, then we will assume that the message
2562 * is to be sent in-dialog.
2563 *
2564 * The uri parameter can be specified if the request should be sent to an explicit
2565 * URI rather than one configured on the endpoint.
2566 *
2567 * \param method The method of the SIP request to send
2568 * \param dlg Optional. If specified, the dialog on which to request the message.
2569 * \param endpoint Optional. If specified, the request will be created out-of-dialog to the endpoint.
2570 * \param uri Optional. If specified, the request will be sent to this URI rather
2571 * than one configured for the endpoint.
2572 * \param contact The contact with which this request is associated for out-of-dialog requests.
2573 * \param[out] tdata The newly-created request
2574 *
2575 * The provided contact is attached to tdata with its reference bumped, but will
2576 * not survive for the entire lifetime of tdata since the contact is cleaned up
2577 * when all supplements have completed execution.
2578 *
2579 * \retval 0 Success
2580 * \retval -1 Failure
2581 */
2582int ast_sip_create_request(const char *method, struct pjsip_dialog *dlg,
2583 struct ast_sip_endpoint *endpoint, const char *uri,
2584 struct ast_sip_contact *contact, pjsip_tx_data **tdata);
2585
2586/*!
2587 * \brief General purpose method for sending a SIP request
2588 *
2589 * This is a companion function for \ref ast_sip_create_request. The request
2590 * created there can be passed to this function, though any request may be
2591 * passed in.
2592 *
2593 * This will automatically set up handling outbound authentication challenges if
2594 * they arrive.
2595 *
2596 * \param tdata The request to send
2597 * \param dlg Optional. The dialog in which the request is sent. Otherwise it is out-of-dialog.
2598 * \param endpoint Optional. If specified, the out-of-dialog request is sent to the endpoint.
2599 * \param token Data to be passed to the callback upon receipt of out-of-dialog response.
2600 * \param callback Callback to be called upon receipt of out-of-dialog response.
2601 *
2602 * \retval 0 Success
2603 * \retval -1 Failure (out-of-dialog callback will not be called.)
2604 */
2605int ast_sip_send_request(pjsip_tx_data *tdata, struct pjsip_dialog *dlg,
2606 struct ast_sip_endpoint *endpoint, void *token,
2607 void (*callback)(void *token, pjsip_event *e));
2608
2609/*!
2610 * \brief General purpose method for sending an Out-Of-Dialog SIP request
2611 *
2612 * This is a companion function for \ref ast_sip_create_request. The request
2613 * created there can be passed to this function, though any request may be
2614 * passed in.
2615 *
2616 * This will automatically set up handling outbound authentication challenges if
2617 * they arrive.
2618 *
2619 * \param tdata The request to send
2620 * \param endpoint Optional. If specified, the out-of-dialog request is sent to the endpoint.
2621 * \param timeout If non-zero, after the timeout the transaction will be terminated
2622 * and the callback will be called with the PJSIP_EVENT_TIMER type.
2623 * \param token Data to be passed to the callback upon receipt of out-of-dialog response.
2624 * \param callback Callback to be called upon receipt of out-of-dialog response.
2625 *
2626 * \retval 0 Success
2627 * \retval -1 Failure (out-of-dialog callback will not be called.)
2628 *
2629 * \note Timeout processing:
2630 * There are 2 timers associated with this request, PJSIP timer_b which is
2631 * set globally in the "system" section of pjsip.conf, and the timeout specified
2632 * on this call. The timer that expires first (before normal completion) will
2633 * cause the callback to be run with e->body.tsx_state.type = PJSIP_EVENT_TIMER.
2634 * The timer that expires second is simply ignored and the callback is not run again.
2635 */
2636int ast_sip_send_out_of_dialog_request(pjsip_tx_data *tdata,
2637 struct ast_sip_endpoint *endpoint, int timeout, void *token,
2638 void (*callback)(void *token, pjsip_event *e));
2639
2640/*!
2641 * \brief General purpose method for creating a SIP response
2642 *
2643 * Its typical use would be to create responses for out of dialog
2644 * requests.
2645 *
2646 * \param rdata The rdata from the incoming request.
2647 * \param st_code The response code to transmit.
2648 * \param contact The contact with which this request is associated.
2649 * \param[out] p_tdata The newly-created response
2650 *
2651 * The provided contact is attached to tdata with its reference bumped, but will
2652 * not survive for the entire lifetime of tdata since the contact is cleaned up
2653 * when all supplements have completed execution.
2654 *
2655 * \retval 0 Success
2656 * \retval -1 Failure
2657 */
2658int ast_sip_create_response(const pjsip_rx_data *rdata, int st_code,
2659 struct ast_sip_contact *contact, pjsip_tx_data **p_tdata);
2660
2661/*!
2662 * \brief Send a response to an out of dialog request
2663 *
2664 * Use this function sparingly, since this does not create a transaction
2665 * within PJSIP. This means that if the request is retransmitted, it is
2666 * your responsibility to detect this and not process the same request
2667 * twice, and to send the same response for each retransmission.
2668 *
2669 * \param res_addr The response address for this response
2670 * \param tdata The response to send
2671 * \param sip_endpoint The ast_sip_endpoint associated with this response
2672 *
2673 * \retval 0 Success
2674 * \retval -1 Failure
2675 */
2676int ast_sip_send_response(pjsip_response_addr *res_addr, pjsip_tx_data *tdata, struct ast_sip_endpoint *sip_endpoint);
2677
2678/*!
2679 * \brief Send a stateful response to an out of dialog request
2680 *
2681 * This creates a transaction within PJSIP, meaning that if the request
2682 * that we are responding to is retransmitted, we will not attempt to
2683 * re-handle the request.
2684 *
2685 * \param rdata The request that is being responded to
2686 * \param tdata The response to send
2687 * \param sip_endpoint The ast_sip_endpoint associated with this response
2688 *
2689 * \since 13.4.0
2690 *
2691 * \retval 0 Success
2692 * \retval -1 Failure
2693 */
2694int ast_sip_send_stateful_response(pjsip_rx_data *rdata, pjsip_tx_data *tdata, struct ast_sip_endpoint *sip_endpoint);
2695
2696/*!
2697 * \brief Determine if an incoming request requires authentication
2698 *
2699 * This calls into the registered authenticator's requires_authentication callback
2700 * in order to determine if the request requires authentication.
2701 *
2702 * If there is no registered authenticator, then authentication will be assumed
2703 * not to be required.
2704 *
2705 * \param endpoint The endpoint from which the request originates
2706 * \param rdata The incoming SIP request
2707 * \retval non-zero The request requires authentication
2708 * \retval 0 The request does not require authentication
2709 */
2710int ast_sip_requires_authentication(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata);
2711
2712/*!
2713 * \brief Method to determine authentication status of an incoming request
2714 *
2715 * This will call into a registered authenticator. The registered authenticator will
2716 * do what is necessary to determine whether the incoming request passes authentication.
2717 * A tentative response is passed into this function so that if, say, a digest authentication
2718 * challenge should be sent in the ensuing response, it can be added to the response.
2719 *
2720 * \param endpoint The endpoint from the request was sent
2721 * \param rdata The request to potentially authenticate
2722 * \param tdata Tentative response to the request
2723 * \return The result of checking authentication.
2724 */
2726 pjsip_rx_data *rdata, pjsip_tx_data *tdata);
2727
2728/*!
2729 * \brief Create a response to an authentication challenge
2730 *
2731 * This will call into an outbound authenticator's create_request_with_auth callback
2732 * to create a new request with authentication credentials. See the create_request_with_auth
2733 * callback in the \ref ast_sip_outbound_authenticator structure for details about
2734 * the parameters and return values.
2735 */
2736int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge,
2737 pjsip_tx_data *tdata, pjsip_tx_data **new_request);
2738
2739/*!
2740 * \brief Determine the endpoint that has sent a SIP message
2741 *
2742 * This will call into each of the registered endpoint identifiers'
2743 * identify_endpoint() callbacks until one returns a non-NULL endpoint.
2744 * This will return an ao2 object. Its reference count will need to be
2745 * decremented when completed using the endpoint.
2746 *
2747 * \param rdata The inbound SIP message to use when identifying the endpoint.
2748 * \retval NULL No matching endpoint
2749 * \retval non-NULL The matching endpoint
2750 */
2751struct ast_sip_endpoint *ast_sip_identify_endpoint(pjsip_rx_data *rdata);
2752
2753/*!
2754 * \brief Get a specific header value from rdata
2755 *
2756 * \note The returned value does not need to be freed since it's from the rdata pool
2757 *
2758 * \param rdata The rdata
2759 * \param str The header to find
2760 *
2761 * \retval NULL on failure
2762 * \retval The header value on success
2763 */
2764char *ast_sip_rdata_get_header_value(pjsip_rx_data *rdata, const pj_str_t str);
2765
2766/*!
2767 * \brief Set the outbound proxy for an outbound SIP message
2768 *
2769 * \param tdata The message to set the outbound proxy on
2770 * \param proxy SIP uri of the proxy
2771 * \retval 0 Success
2772 * \retval -1 Failure
2773 */
2774int ast_sip_set_outbound_proxy(pjsip_tx_data *tdata, const char *proxy);
2775
2776/*!
2777 * \brief Add a header to an outbound SIP message
2778 *
2779 * \param tdata The message to add the header to
2780 * \param name The header name
2781 * \param value The header value
2782 * \retval 0 Success
2783 * \retval -1 Failure
2784 */
2785int ast_sip_add_header(pjsip_tx_data *tdata, const char *name, const char *value);
2786
2787/*!
2788 * \brief Add a header to an outbound SIP message, returning a pointer to the header
2789 *
2790 * \param tdata The message to add the header to
2791 * \param name The header name
2792 * \param value The header value
2793 * \return The pjsip_generic_string_hdr * added.
2794 */
2795pjsip_generic_string_hdr *ast_sip_add_header2(pjsip_tx_data *tdata,
2796 const char *name, const char *value);
2797
2798/*!
2799 * \brief Add a body to an outbound SIP message
2800 *
2801 * If this is called multiple times, the latest body will replace the current
2802 * body.
2803 *
2804 * \param tdata The message to add the body to
2805 * \param body The message body to add
2806 * \retval 0 Success
2807 * \retval -1 Failure
2808 */
2809int ast_sip_add_body(pjsip_tx_data *tdata, const struct ast_sip_body *body);
2810
2811/*!
2812 * \brief Add a multipart body to an outbound SIP message
2813 *
2814 * This will treat each part of the input vector as part of a multipart body and
2815 * add each part to the SIP message.
2816 *
2817 * \param tdata The message to add the body to
2818 * \param bodies The message bodies to add
2819 * \param num_bodies The parts of the body to add
2820 * \retval 0 Success
2821 * \retval -1 Failure
2822 */
2823int ast_sip_add_body_multipart(pjsip_tx_data *tdata, const struct ast_sip_body *bodies[], int num_bodies);
2824
2825/*!
2826 * \brief Append body data to a SIP message
2827 *
2828 * This acts mostly the same as ast_sip_add_body, except that rather than replacing
2829 * a body if it currently exists, it appends data to an existing body.
2830 *
2831 * \param tdata The message to append the body to
2832 * \param body_text The string to append to the end of the current body
2833 * \retval 0 Success
2834 * \retval -1 Failure
2835 */
2836int ast_sip_append_body(pjsip_tx_data *tdata, const char *body_text);
2837
2838/*!
2839 * \brief Copy a pj_str_t into a standard character buffer.
2840 *
2841 * pj_str_t is not NULL-terminated. Any place that expects a NULL-
2842 * terminated string needs to have the pj_str_t copied into a separate
2843 * buffer.
2844 *
2845 * This method copies the pj_str_t contents into the destination buffer
2846 * and NULL-terminates the buffer.
2847 *
2848 * \param dest The destination buffer
2849 * \param src The pj_str_t to copy
2850 * \param size The size of the destination buffer.
2851 */
2852void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size);
2853
2854/*!
2855 * \brief Create and copy a pj_str_t into a standard character buffer.
2856 *
2857 * pj_str_t is not NULL-terminated. Any place that expects a NULL-
2858 * terminated string needs to have the pj_str_t copied into a separate
2859 * buffer.
2860 *
2861 * Copies the pj_str_t contents into a newly allocated buffer pointed to
2862 * by dest. NULL-terminates the buffer.
2863 *
2864 * \note Caller is responsible for freeing the allocated memory.
2865 *
2866 * \param[out] dest The destination buffer
2867 * \param src The pj_str_t to copy
2868 * \return Number of characters copied or negative value on error
2869 */
2870int ast_copy_pj_str2(char **dest, const pj_str_t *src);
2871
2872/*!
2873 * \brief Get the looked-up endpoint on an out-of dialog request or response
2874 *
2875 * The function may ONLY be called on out-of-dialog requests or responses. For
2876 * in-dialog requests and responses, it is required that the user of the dialog
2877 * has the looked-up endpoint stored locally.
2878 *
2879 * This function should never return NULL if the message is out-of-dialog. It will
2880 * always return NULL if the message is in-dialog.
2881 *
2882 * This function will increase the reference count of the returned endpoint by one.
2883 * Release your reference using the ao2_ref function when finished.
2884 *
2885 * \param rdata Out-of-dialog request or response
2886 * \return The looked up endpoint
2887 */
2888struct ast_sip_endpoint *ast_pjsip_rdata_get_endpoint(pjsip_rx_data *rdata);
2889
2890/*!
2891 * \brief Add 'user=phone' parameter to URI if enabled and user is a phone number.
2892 *
2893 * \param endpoint The endpoint to use for configuration
2894 * \param pool The memory pool to allocate the parameter from
2895 * \param uri The URI to check for user and to add parameter to
2896 */
2897void ast_sip_add_usereqphone(const struct ast_sip_endpoint *endpoint, pj_pool_t *pool, pjsip_uri *uri);
2898
2899/*!
2900 * \brief Retrieve any endpoints available to sorcery.
2901 *
2902 * \retval Endpoints available to sorcery, NULL if no endpoints found.
2903 */
2905
2906/*!
2907 * \brief Retrieve the default outbound endpoint.
2908 *
2909 * \retval The default outbound endpoint, NULL if not found.
2910 */
2912
2913/*!
2914 * \brief Retrieve relevant SIP auth structures from sorcery
2915 *
2916 * \param auths Vector of sorcery IDs of auth credentials to retrieve
2917 * \param[out] out The retrieved auths are stored here
2918 */
2919int ast_sip_retrieve_auths(const struct ast_sip_auth_vector *auths, struct ast_sip_auth **out);
2920
2921/*!
2922 * \brief Clean up retrieved auth structures from memory
2923 *
2924 * Call this function once you have completed operating on auths
2925 * retrieved from \ref ast_sip_retrieve_auths
2926 *
2927 * \param auths An array of auth object pointers to clean up
2928 * \param num_auths The number of auths in the array
2929 */
2930void ast_sip_cleanup_auths(struct ast_sip_auth *auths[], size_t num_auths);
2931
2933/*!
2934 * \brief Retrieve relevant SIP auth structures from sorcery as a vector
2935 *
2936 * \param auth_ids Vector of sorcery IDs of auth credentials to retrieve
2937 * \param[out] auth_objects A pointer ast_sip_auth_objects_vector to hold the objects
2938 *
2939 * \retval 0 Success
2940 * \retval -1 Number of auth objects found is less than the number of names supplied.
2941 *
2942 * \warning The number of auth objects retrieved may be less than the
2943 * number of auth ids supplied if auth objects couldn't be found for
2944 * some of them.
2945 *
2946 * \note Since the ref count on all auth objects returned has been
2947 * bumped, you must call ast_sip_cleanup_auth_objects_vector() to decrement
2948 * the ref count on all of the auth objects in the vector,
2949 * then call AST_VECTOR_FREE() on the vector itself.
2950 *
2951 */
2952int ast_sip_retrieve_auths_vector(const struct ast_sip_auth_vector *auth_ids,
2953 struct ast_sip_auth_objects_vector *auth_objects);
2954
2955/*!
2956 * \brief Clean up retrieved auth objects in vector
2957 *
2958 * Call this function once you have completed operating on auths
2959 * retrieved from \ref ast_sip_retrieve_auths_vector. All
2960 * auth objects will have their reference counts decremented and
2961 * the vector size will be reset to 0. You must still call
2962 * AST_VECTOR_FREE() on the vector itself.
2963 *
2964 * \param auth_objects A vector of auth structures to clean up
2965 */
2966#define ast_sip_cleanup_auth_objects_vector(auth_objects) AST_VECTOR_RESET(auth_objects, ao2_cleanup)
2967
2968/*!
2969 * \brief Checks if the given content type matches type/subtype.
2970 *
2971 * Compares the pjsip_media_type with the passed type and subtype and
2972 * returns the result of that comparison. The media type parameters are
2973 * ignored.
2974 *
2975 * \param content_type The pjsip_media_type structure to compare
2976 * \param type The media type to compare
2977 * \param subtype The media subtype to compare
2978 * \retval 0 No match
2979 * \retval -1 Match
2980 */
2981int ast_sip_is_content_type(pjsip_media_type *content_type, char *type, char *subtype);
2982
2983/*!
2984 * \brief Send a security event notification for when an invalid endpoint is requested
2985 *
2986 * \param name Name of the endpoint requested
2987 * \param rdata Received message
2988 */
2989void ast_sip_report_invalid_endpoint(const char *name, pjsip_rx_data *rdata);
2990
2991/*!
2992 * \brief Send a security event notification for when an ACL check fails
2993 *
2994 * \param endpoint Pointer to the endpoint in use
2995 * \param rdata Received message
2996 * \param name Name of the ACL
2997 */
2998void ast_sip_report_failed_acl(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, const char *name);
2999
3000/*!
3001 * \brief Send a security event notification for when a challenge response has failed
3002 *
3003 * \param endpoint Pointer to the endpoint in use
3004 * \param rdata Received message
3005 */
3006void ast_sip_report_auth_failed_challenge_response(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata);
3007
3008/*!
3009 * \brief Send a security event notification for when authentication succeeds
3010 *
3011 * \param endpoint Pointer to the endpoint in use
3012 * \param rdata Received message
3013 */
3014void ast_sip_report_auth_success(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata);
3015
3016/*!
3017 * \brief Send a security event notification for when an authentication challenge is sent
3018 *
3019 * \param endpoint Pointer to the endpoint in use
3020 * \param rdata Received message
3021 * \param tdata Sent message
3022 */
3023void ast_sip_report_auth_challenge_sent(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata);
3024
3025/*!
3026 * \brief Send a security event notification for when a request is not supported
3027 *
3028 * \param endpoint Pointer to the endpoint in use
3029 * \param rdata Received message
3030 * \param req_type the type of request
3031 */
3032void ast_sip_report_req_no_support(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata,
3033 const char* req_type);
3034
3035/*!
3036 * \brief Send a security event notification for when a memory limit is hit.
3037 *
3038 * \param endpoint Pointer to the endpoint in use
3039 * \param rdata Received message
3040 */
3041void ast_sip_report_mem_limit(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata);
3042
3043int ast_sip_add_global_request_header(const char *name, const char *value, int replace);
3044int ast_sip_add_global_response_header(const char *name, const char *value, int replace);
3045
3046/*!
3047 * \brief Retrieves the value associated with the given key.
3048 *
3049 * \param ht the hash table/dictionary to search
3050 * \param key the key to find
3051 *
3052 * \retval the value associated with the key, NULL otherwise.
3053 */
3054void *ast_sip_dict_get(void *ht, const char *key);
3055
3056/*!
3057 * \brief Using the dictionary stored in mod_data array at a given id,
3058 * retrieve the value associated with the given key.
3059 *
3060 * \param mod_data a module data array
3061 * \param id the mod_data array index
3062 * \param key the key to find
3063 *
3064 * \retval the value associated with the key, NULL otherwise.
3065 */
3066#define ast_sip_mod_data_get(mod_data, id, key) \
3067 ast_sip_dict_get(mod_data[id], key)
3068
3069/*!
3070 * \brief Set the value for the given key.
3071 *
3072 * Note - if the hash table does not exist one is created first, the key/value
3073 * pair is set, and the hash table returned.
3074 *
3075 * \param pool the pool to allocate memory in
3076 * \param ht the hash table/dictionary in which to store the key/value pair
3077 * \param key the key to associate a value with
3078 * \param val the value to associate with a key
3079 *
3080 * \retval the given, or newly created, hash table.
3081 */
3082void *ast_sip_dict_set(pj_pool_t* pool, void *ht,
3083 const char *key, void *val);
3084
3085/*!
3086 * \brief Utilizing a mod_data array for a given id, set the value
3087 * associated with the given key.
3088 *
3089 * For a given structure's mod_data array set the element indexed by id to
3090 * be a dictionary containing the key/val pair.
3091 *
3092 * \param pool a memory allocation pool
3093 * \param mod_data a module data array
3094 * \param id the mod_data array index
3095 * \param key the key to find
3096 * \param val the value to associate with a key
3097 */
3098#define ast_sip_mod_data_set(pool, mod_data, id, key, val) \
3099 mod_data[id] = ast_sip_dict_set(pool, mod_data[id], key, val)
3100
3101/*!
3102 * \brief For every contact on an AOR call the given 'on_contact' handler.
3103 *
3104 * \param aor the aor containing a list of contacts to iterate
3105 * \param on_contact callback on each contact on an AOR. The object
3106 * received by the callback will be a ast_sip_contact_wrapper structure.
3107 * \param arg user data passed to handler
3108 * \retval 0 Success, non-zero on failure
3109 */
3110int ast_sip_for_each_contact(const struct ast_sip_aor *aor,
3111 ao2_callback_fn on_contact, void *arg);
3112
3113/*!
3114 * \brief Handler used to convert a contact to a string.
3115 *
3116 * \param object the ast_sip_aor_contact_pair containing a list of contacts to iterate and the contact
3117 * \param arg user data passed to handler
3118 * \param flags
3119 * \retval 0 Success, non-zero on failure
3120 */
3121int ast_sip_contact_to_str(void *object, void *arg, int flags);
3122
3123/*!
3124 * \brief For every aor in the comma separated aors string call the
3125 * given 'on_aor' handler.
3126 *
3127 * \param aors a comma separated list of aors
3128 * \param on_aor callback for each aor
3129 * \param arg user data passed to handler
3130 * \retval 0 Success, non-zero on failure
3131 */
3132int ast_sip_for_each_aor(const char *aors, ao2_callback_fn on_aor, void *arg);
3133
3134/*!
3135 * \brief For every auth in the array call the given 'on_auth' handler.
3136 *
3137 * \param array an array of auths
3138 * \param on_auth callback for each auth
3139 * \param arg user data passed to handler
3140 * \retval 0 Success, non-zero on failure
3141 */
3143 ao2_callback_fn on_auth, void *arg);
3144
3145/*!
3146 * \brief Converts the given auth type to a string
3147 *
3148 * \param type the auth type to convert
3149 * \retval a string representative of the auth type
3150 */
3152
3153/*!
3154 * \brief Converts an auths array to a string of comma separated values
3155 *
3156 * \param auths an auth array
3157 * \param buf the string buffer to write the object data
3158 * \retval 0 Success, non-zero on failure
3159 */
3160int ast_sip_auths_to_str(const struct ast_sip_auth_vector *auths, char **buf);
3161
3162/*!
3163 * \brief Checks an pjsip_auth_algorithm_type_vector to see if it contains an algorithm
3164 *
3165 * \param auth The auth object
3166 * \param algorithms The auth object's supported_algorithms_uac or supported_algorithms_uas
3167 * \param algorithm_type The algorithm_type to check
3168 *
3169 * \retval 1 The algorithm-type is in the vector
3170 * \retval 0 The algorithm-type is not in the vector
3171 */
3173 const struct pjsip_auth_algorithm_type_vector *algorithms,
3174 pjsip_auth_algorithm_type algorithm_type);
3175
3176/*!
3177 * \brief Get the plain text or digest password from an auth object
3178 *
3179 * \param auth The auth object
3180 * \param algorithm_type The algorithm type to retrieve the password for
3181 * \param cred_type [out]Pointer to an int to receive the credential type
3182 *
3183 * \note cred_type will contain one of the following values:
3184 * - PJSIP_CRED_DATA_DIGEST
3185 * - PJSIP_CRED_DATA_PLAIN_PASSWD
3186
3187 * If a password digest is available for the algorithm type it will
3188 * be returned, otherwise if a plain text password is available
3189 * that will be returned instead.
3190 *
3191 * \retval The plain text or digest password or NULL if not found for the algorithm type
3192 */
3193const char *ast_sip_auth_get_creds(const struct ast_sip_auth *auth,
3194 const pjsip_auth_algorithm_type algorithm_type, int *cred_type);
3195
3196/*!
3197 * \brief AMI variable container
3198 */
3199struct ast_sip_ami {
3200 /*! Manager session */
3201 struct mansession *s;
3202 /*! Manager message */
3203 const struct message *m;
3204 /*! Manager Action ID */
3205 const char *action_id;
3206 /*! user specified argument data */
3207 void *arg;
3208 /*! count of objects */
3209 int count;
3210};
3211
3212/*!
3213 * \brief Creates a string to store AMI event data in.
3214 *
3215 * \param event the event to set
3216 * \param ami AMI session and message container
3217 * \retval an initialized ast_str or NULL on error.
3218 */
3219struct ast_str *ast_sip_create_ami_event(const char *event,
3220 struct ast_sip_ami *ami);
3221
3222/*!
3223 * \brief An entity responsible formatting endpoint information.
3224 */
3226 /*!
3227 * \brief Callback used to format endpoint information over AMI.
3228 */
3229 int (*format_ami)(const struct ast_sip_endpoint *endpoint,
3230 struct ast_sip_ami *ami);
3232};
3233
3234/*!
3235 * \brief Register an endpoint formatter.
3236 *
3237 * \param obj the formatter to register
3238 */
3240
3241/*!
3242 * \brief Unregister an endpoint formatter.
3243 *
3244 * \param obj the formatter to unregister
3245 */
3247
3248/*!
3249 * \brief Converts a sorcery object to a string of object properties.
3250 *
3251 * \param obj the sorcery object to convert
3252 * \param buf the string buffer to write the object data
3253 * \retval 0 Success, non-zero on failure
3254 */
3255int ast_sip_sorcery_object_to_ami(const void *obj, struct ast_str **buf);
3256
3257/*!
3258 * \brief Formats the endpoint and sends over AMI.
3259 *
3260 * \param endpoint the endpoint to format and send
3261 * \param ami AMI variable container
3262 * \param count the number of formatters operated on
3263 * \retval 0 Success, otherwise non-zero on error
3264 */
3266 struct ast_sip_ami *ami, int *count);
3267
3268/*!
3269 * \brief Formats the contact and sends over AMI.
3270 *
3271 * \param obj a pointer an ast_sip_contact_wrapper structure
3272 * \param arg a pointer to an ast_sip_ami structure
3273 * \param flags ignored
3274 * \retval 0 Success, otherwise non-zero on error
3275 */
3276int ast_sip_format_contact_ami(void *obj, void *arg, int flags);
3277
3278/*!
3279 * \brief Format auth details for AMI.
3280 *
3281 * \param auths an auth array
3282 * \param ami ami variable container
3283 * \retval 0 Success, non-zero on failure
3284 */
3285int ast_sip_format_auths_ami(const struct ast_sip_auth_vector *auths,
3286 struct ast_sip_ami *ami);
3287
3288/*!
3289 * \brief Retrieve the endpoint snapshot for an endpoint
3290 *
3291 * \param endpoint The endpoint whose snapshot is to be retrieved.
3292 * \retval The endpoint snapshot
3293 */
3295 const struct ast_sip_endpoint *endpoint);
3296
3297/*!
3298 * \brief Retrieve the device state for an endpoint.
3299 *
3300 * \param endpoint The endpoint whose state is to be retrieved.
3301 * \retval The device state.
3302 */
3303const char *ast_sip_get_device_state(const struct ast_sip_endpoint *endpoint);
3304
3305/*!
3306 * \brief For every channel snapshot on an endpoint snapshot call the given
3307 * 'on_channel_snapshot' handler.
3308 *
3309 * \param endpoint_snapshot snapshot of an endpoint
3310 * \param on_channel_snapshot callback for each channel snapshot
3311 * \param arg user data passed to handler
3312 * \retval 0 Success, non-zero on failure
3313 */
3314int ast_sip_for_each_channel_snapshot(const struct ast_endpoint_snapshot *endpoint_snapshot,
3315 ao2_callback_fn on_channel_snapshot,
3316 void *arg);
3317
3318/*!
3319 * \brief For every channel snapshot on an endpoint all the given
3320 * 'on_channel_snapshot' handler.
3321 *
3322 * \param endpoint endpoint
3323 * \param on_channel_snapshot callback for each channel snapshot
3324 * \param arg user data passed to handler
3325 * \retval 0 Success, non-zero on failure
3326 */
3327int ast_sip_for_each_channel(const struct ast_sip_endpoint *endpoint,
3328 ao2_callback_fn on_channel_snapshot,
3329 void *arg);
3330
3332 /*! Top priority. Supplements with this priority are those that need to run before any others */
3334 /*! Channel creation priority.
3335 * chan_pjsip creates a channel at this priority. If your supplement depends on being run before
3336 * or after channel creation, then set your priority to be lower or higher than this value.
3337 */
3339 /*! Lowest priority. Supplements with this priority should be run after all other supplements */
3341};
3342
3343/*!
3344 * \brief A supplement to SIP message processing
3345 *
3346 * These can be registered by any module in order to add
3347 * processing to incoming and outgoing SIP out of dialog
3348 * requests and responses
3349 */
3350struct ast_sip_supplement {
3351 /*! Method on which to call the callbacks. If NULL, call on all methods */
3352 const char *method;
3353 /*! Priority for this supplement. Lower numbers are visited before higher numbers */
3355 /*!
3356 * \brief Called on incoming SIP request
3357 * This method can indicate a failure in processing in its return. If there
3358 * is a failure, it is required that this method sends a response to the request.
3359 * This method is always called from a SIP servant thread.
3360 *
3361 * \note
3362 * The following PJSIP methods will not work properly:
3363 * pjsip_rdata_get_dlg()
3364 * pjsip_rdata_get_tsx()
3365 * The reason is that the rdata passed into this function is a cloned rdata structure,
3366 * and its module data is not copied during the cloning operation.
3367 * If you need to get the dialog, you can get it via session->inv_session->dlg.
3368 *
3369 * \note
3370 * There is no guarantee that a channel will be present on the session when this is called.
3371 */
3372 int (*incoming_request)(struct ast_sip_endpoint *endpoint, struct pjsip_rx_data *rdata);
3373 /*!
3374 * \brief Called on an incoming SIP response
3375 * This method is always called from a SIP servant thread.
3376 *
3377 * \note
3378 * The following PJSIP methods will not work properly:
3379 * pjsip_rdata_get_dlg()
3380 * pjsip_rdata_get_tsx()
3381 * The reason is that the rdata passed into this function is a cloned rdata structure,
3382 * and its module data is not copied during the cloning operation.
3383 * If you need to get the dialog, you can get it via session->inv_session->dlg.
3384 *
3385 * \note
3386 * There is no guarantee that a channel will be present on the session when this is called.
3387 */
3388 void (*incoming_response)(struct ast_sip_endpoint *endpoint, struct pjsip_rx_data *rdata);
3389 /*!
3390 * \brief Called on an outgoing SIP request
3391 * This method is always called from a SIP servant thread.
3392 */
3393 void (*outgoing_request)(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact, struct pjsip_tx_data *tdata);
3394 /*!
3395 * \brief Called on an outgoing SIP response
3396 * This method is always called from a SIP servant thread.
3397 */
3398 void (*outgoing_response)(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact, struct pjsip_tx_data *tdata);
3399 /*! Next item in the list */
3401};
3402
3403/*!
3404 * \brief Register a supplement to SIP out of dialog processing
3405 *
3406 * This allows for someone to insert themselves in the processing of out
3407 * of dialog SIP requests and responses. This, for example could allow for
3408 * a module to set channel data based on headers in an incoming message.
3409 * Similarly, a module could reject an incoming request if desired.
3410 *
3411 * \param supplement The supplement to register
3412 */
3413void ast_sip_register_supplement(struct ast_sip_supplement *supplement);
3414
3415/*!
3416 * \brief Unregister a an supplement to SIP out of dialog processing
3417 *
3418 * \param supplement The supplement to unregister
3419 */
3420void ast_sip_unregister_supplement(struct ast_sip_supplement *supplement);
3421
3422/*!
3423 * \brief Retrieve the global MWI taskprocessor high water alert trigger level.
3424 *
3425 * \since 13.12.0
3426 *
3427 * \retval the system MWI taskprocessor high water alert trigger level
3428 */
3429unsigned int ast_sip_get_mwi_tps_queue_high(void);
3430
3431/*!
3432 * \brief Retrieve the global MWI taskprocessor low water clear alert level.
3433 *
3434 * \since 13.12.0
3435 *
3436 * \retval the system MWI taskprocessor low water clear alert level
3437 */
3439
3440/*!
3441 * \brief Retrieve the global setting 'disable sending unsolicited mwi on startup'.
3442 * \since 13.12.0
3443 *
3444 * \retval non zero if disable.
3445 */
3447
3448/*!
3449 * \brief Retrieve the global setting 'allow_sending_180_after_183'.
3450 *
3451 * \retval non zero if disable.
3452 */
3454
3455/*!
3456 * \brief Retrieve the global setting 'use_callerid_contact'.
3457 * \since 13.24.0
3458 *
3459 * \retval non zero if CALLERID(num) is to be used as the default username in the contact
3460 */
3461unsigned int ast_sip_get_use_callerid_contact(void);
3462
3463/*!
3464 * \brief Retrieve the global setting 'norefersub'.
3465 *
3466 * \retval non zero if norefersub is to be sent in "Supported" Headers
3467 */
3468unsigned int ast_sip_get_norefersub(void);
3469
3470/*!
3471 * \brief Retrieve the global setting 'ignore_uri_user_options'.
3472 * \since 13.12.0
3473 *
3474 * \retval non zero if ignore the user field options.
3475 */
3476unsigned int ast_sip_get_ignore_uri_user_options(void);
3477
3478/*!
3479 * \brief Retrieve the global setting 'send_contact_status_on_update_registration'.
3480 * \since 16.2.0
3481 *
3482 * \retval non zero if need to send AMI ContactStatus event when a contact is updated.
3483 */
3485
3486
3487/*!
3488 * \brief Truncate the URI user field options string if enabled.
3489 * \since 13.12.0
3490 *
3491 * \param str URI user field string to truncate if enabled
3492 *
3493 * \details
3494 * We need to be able to handle URI's looking like
3495 * "sip:1235557890;phone-context=national@x.x.x.x;user=phone"
3496 *
3497 * Where the URI user field is:
3498 * "1235557890;phone-context=national"
3499 *
3500 * When truncated the string will become:
3501 * "1235557890"
3502 */
3503#define AST_SIP_USER_OPTIONS_TRUNCATE_CHECK(str) \
3504 do { \
3505 char *__semi = strchr((str), ';'); \
3506 if (__semi && ast_sip_get_ignore_uri_user_options()) { \
3507 *__semi = '\0'; \
3508 } \
3509 } while (0)
3510
3511/*!
3512 * \brief Retrieve the system debug setting (yes|no|host).
3513 *
3514 * \note returned string needs to be de-allocated by caller.
3515 *
3516 * \retval the system debug setting.
3517 */
3518char *ast_sip_get_debug(void);
3519
3520/*!
3521 * \brief Retrieve the global regcontext setting.
3522 *
3523 * \since 13.8.0
3524 *
3525 * \note returned string needs to be de-allocated by caller.
3526 *
3527 * \retval the global regcontext setting
3528 */
3529char *ast_sip_get_regcontext(void);
3530
3531/*!
3532 * \brief Retrieve the global endpoint_identifier_order setting.
3533 *
3534 * Specifies the order by which endpoint identifiers should be regarded.
3535 *
3536 * \retval the global endpoint_identifier_order value
3537 */
3539
3540/*!
3541 * \brief Retrieve the default voicemail extension.
3542 * \since 13.9.0
3543 *
3544 * \note returned string needs to be de-allocated by caller.
3545 *
3546 * \retval the default voicemail extension
3547 */
3549
3550/*!
3551 * \brief Retrieve the global default realm.
3552 *
3553 * This is the value placed in outbound challenges' realm if there
3554 * is no better option (such as an auth-configured realm).
3555 *
3556 * \param[out] realm The default realm
3557 * \param size The buffer size of realm
3558 */
3559void ast_sip_get_default_realm(char *realm, size_t size);
3560
3561/*!
3562 * \brief Retrieve the global auth algorithms for UAS.
3563 *
3564 * \param[out] default_auth_algorithms_uas The default algorithms
3565 * \param size The buffer size of default_auth_algorithms_uas
3566 */
3567void ast_sip_get_default_auth_algorithms_uas(char *default_auth_algorithms_uas, size_t size);
3568
3569/*!
3570 * \brief Retrieve the global auth algorithms for UAC.
3571 *
3572 * \param[out] default_auth_algorithms_uac The default algorithms
3573 * \param size The buffer size of default_auth_algorithms_uac
3574 */
3575void ast_sip_get_default_auth_algorithms_uac(char *default_auth_algorithms_uac, size_t size);
3576
3577/*!
3578 * \brief Retrieve the global default from user.
3579 *
3580 * This is the value placed in outbound requests' From header if there
3581 * is no better option (such as an endpoint-configured from_user or
3582 * caller ID number).
3583 *
3584 * \param[out] from_user The default from user
3585 * \param size The buffer size of from_user
3586 */
3587void ast_sip_get_default_from_user(char *from_user, size_t size);
3588
3589/*!
3590 * \brief Retrieve the system keep alive interval setting.
3591 *
3592 * \retval the keep alive interval.
3593 */
3594unsigned int ast_sip_get_keep_alive_interval(void);
3595
3596/*!
3597 * \brief Retrieve the system contact expiration check interval setting.
3598 *
3599 * \retval the contact expiration check interval.
3600 */
3602
3603/*!
3604 * \brief Retrieve the system setting 'disable multi domain'.
3605 * \since 13.9.0
3606 *
3607 * \retval non zero if disable multi domain.
3608 */
3609unsigned int ast_sip_get_disable_multi_domain(void);
3610
3611/*!
3612 * \brief Retrieve the system max initial qualify time.
3613 *
3614 * \retval the maximum initial qualify time.
3615 */
3616unsigned int ast_sip_get_max_initial_qualify_time(void);
3617
3618/*!
3619 * \brief translate ast_sip_contact_status_type to character string.
3620 *
3621 * \retval the character string equivalent.
3622 */
3623
3626
3627/*!
3628 * \brief Set a request to use the next value in the list of resolved addresses.
3629 *
3630 * \param tdata the tx data from the original request
3631 * \retval 0 No more addresses to try
3632 * \retval 1 The request was successfully re-intialized
3633 */
3634int ast_sip_failover_request(pjsip_tx_data *tdata);
3635
3636/*!
3637 * \brief Retrieve the local host address in IP form
3638 *
3639 * \param af The address family to retrieve
3640 * \param addr A place to store the local host address
3641 *
3642 * \retval 0 success
3643 * \retval -1 failure
3644 *
3645 * \since 13.6.0
3646 */
3647int ast_sip_get_host_ip(int af, pj_sockaddr *addr);
3648
3649/*!
3650 * \brief Retrieve the local host address in string form
3651 *
3652 * \param af The address family to retrieve
3653 *
3654 * \retval non-NULL success
3655 * \retval NULL failure
3656 *
3657 * \since 13.6.0
3658 *
3659 * \note An empty string may be returned if the address family is valid but no local address exists
3660 */
3661const char *ast_sip_get_host_ip_string(int af);
3662
3663/*!
3664 * \brief Return the size of the SIP threadpool's task queue
3665 * \since 13.7.0
3666 */
3668
3669/*!
3670 * \brief Retrieve the SIP threadpool object
3671 */
3673
3674/*!
3675 * \brief Retrieve transport state
3676 * \since 13.7.1
3677 *
3678 * \param transport_id
3679 * \retval transport_state
3680 *
3681 * \note ao2_cleanup(...) or ao2_ref(..., -1) must be called on the returned object
3682 */
3683struct ast_sip_transport_state *ast_sip_get_transport_state(const char *transport_id);
3684
3685/*!
3686 * \brief Return the SIP URI of the Contact header
3687 *
3688 * \param tdata
3689 * \retval Pointer to SIP URI of Contact
3690 * \retval NULL if Contact header not found or not a SIP(S) URI
3691 *
3692 * \note Do not free the returned object.
3693 */
3694pjsip_sip_uri *ast_sip_get_contact_sip_uri(pjsip_tx_data *tdata);
3695
3696/*!
3697 * \brief Returns the transport state currently in use based on request transport details
3698 *
3699 * \param details
3700 * \retval transport_state
3701 *
3702 * \note ao2_cleanup(...) or ao2_ref(..., -1) must be called on the returned object
3703 */
3705
3706/*!
3707 * \brief Sets request transport details based on tdata
3708 *
3709 * \param details pre-allocated request transport details to set
3710 * \param tdata
3711 * \param use_ipv6 if non-zero, ipv6 transports will be considered
3712 * \retval 0 success
3713 * \retval -1 failure
3714 */
3715int ast_sip_set_request_transport_details(struct ast_sip_request_transport_details *details, pjsip_tx_data *tdata, int use_ipv6);
3716
3717/*!
3718 * \brief Replace domain and port of SIP URI to point to (external) signaling address of this Asterisk instance
3719 *
3720 * \param uri
3721 * \param tdata
3722 *
3723 * \retval 0 success
3724 * \retval -1 failure
3725 *
3726 * \note Uses domain and port in Contact header if it exists, otherwise the local URI of the dialog is used if the
3727 * message is sent within the context of a dialog. Further, NAT settings are considered - i.e. if the target
3728 * is not in the localnet, the external_signaling_address and port are used.
3729 */
3730int ast_sip_rewrite_uri_to_local(pjsip_sip_uri *uri, pjsip_tx_data *tdata);
3731
3732/*!
3733 * \brief Retrieves all transport states
3734 * \since 13.7.1
3735 *
3736 * \retval ao2_container
3737 *
3738 * \note ao2_cleanup(...) or ao2_ref(..., -1) must be called on the returned object
3739 */
3741
3742/*!
3743 * \brief Sets pjsip_tpselector from ast_sip_transport
3744 * \since 13.8.0
3745 *
3746 * \param transport The transport to be used
3747 * \param selector The selector to be populated
3748 * \retval 0 success
3749 * \retval -1 failure
3750 *
3751 * \note The transport selector must be unreffed using ast_sip_tpselector_unref
3752 */
3753int ast_sip_set_tpselector_from_transport(const struct ast_sip_transport *transport, pjsip_tpselector *selector);
3754
3755/*!
3756 * \brief Sets pjsip_tpselector from ast_sip_transport
3757 * \since 13.8.0
3758 *
3759 * \param transport_name The name of the transport to be used
3760 * \param selector The selector to be populated
3761 * \retval 0 success
3762 * \retval -1 failure
3763 *
3764 * \note The transport selector must be unreffed using ast_sip_tpselector_unref
3765 */
3766int ast_sip_set_tpselector_from_transport_name(const char *transport_name, pjsip_tpselector *selector);
3767
3768/*!
3769 * \brief Unreference a pjsip_tpselector
3770 * \since 17.0.0
3771 *
3772 * \param selector The selector to be unreffed
3773 */
3774void ast_sip_tpselector_unref(pjsip_tpselector *selector);
3775
3776/*!
3777 * \brief Sets the PJSIP transport on a child transport
3778 * \since 17.0.0
3779 *
3780 * \param transport_name The name of the transport to be updated
3781 * \param transport The PJSIP transport
3782 * \retval 0 success
3783 * \retval -1 failure
3784 */
3785int ast_sip_transport_state_set_transport(const char *transport_name, pjsip_transport *transport);
3786
3787/*!
3788 * \brief Sets the P-Preferred-Identity on a child transport
3789 * \since 17.0.0
3790 *
3791 * \param transport_name The name of the transport to be set on
3792 * \param identity The P-Preferred-Identity to use on requests on this transport
3793 * \retval 0 success
3794 * \retval -1 failure
3795 */
3796int ast_sip_transport_state_set_preferred_identity(const char *transport_name, const char *identity);
3797
3798/*!
3799 * \brief Sets the service routes on a child transport
3800 * \since 17.0.0
3801 *
3802 * \param transport_name The name of the transport to be set on
3803 * \param service_routes A vector of service routes
3804 * \retval 0 success
3805 * \retval -1 failure
3806 *
3807 * \note This assumes ownership of the service routes in both success and failure scenarios
3808 */
3809int ast_sip_transport_state_set_service_routes(const char *transport_name, struct ast_sip_service_route_vector *service_routes);
3810
3811/*!
3812 * \brief Apply the configuration for a transport to an outgoing message
3813 * \since 17.0.0
3814 *
3815 * \param transport_name The name of the transport to apply configuration from
3816 * \param tdata The SIP message
3817 */
3818void ast_sip_message_apply_transport(const char *transport_name, pjsip_tx_data *tdata);
3819
3820/*!
3821 * \brief Allocate a vector of service routes
3822 * \since 17.0.0
3823 *
3824 * \retval non-NULL success
3825 * \retval NULL failure
3826 */
3828
3829/*!
3830 * \brief Destroy a vector of service routes
3831 * \since 17.0.0
3832 *
3833 * \param service_routes A vector of service routes
3834 */
3836
3837/*!
3838 * \brief Set the ID for a connected line update
3839 *
3840 * \retval -1 on failure, 0 on success
3841 */
3842int ast_sip_set_id_connected_line(struct pjsip_rx_data *rdata, struct ast_party_id *id);
3843
3844/*!
3845 * \brief Set the ID from an INVITE
3846 *
3847 * \param rdata
3848 * \param id ID structure to fill
3849 * \param default_id Default ID structure with data to use (for non-trusted endpoints)
3850 * \param trust_inbound Whether or not the endpoint is trusted (controls whether PAI or RPID can be used)
3851 *
3852 * \retval -1 on failure, 0 on success
3853 */
3854int ast_sip_set_id_from_invite(struct pjsip_rx_data *rdata, struct ast_party_id *id, struct ast_party_id *default_id, int trust_inbound);
3855
3856/*!
3857 * \brief Set name and number information on an identity header.
3858 *
3859 * \param pool Memory pool to use for string duplication
3860 * \param id_hdr A From, P-Asserted-Identity, or Remote-Party-ID header to modify
3861 * \param id The identity information to apply to the header
3862 */
3863void ast_sip_modify_id_header(pj_pool_t *pool, pjsip_fromto_hdr *id_hdr,
3864 const struct ast_party_id *id);
3865
3866/*!
3867 * \brief Retrieves an endpoint and URI from the "to" string.
3868 *
3869 * This URI is used as the Request URI.
3870 *
3871 * Expects the given 'to' to be in one of the following formats:
3872 * Why we allow so many is a mystery.
3873 *
3874 * Basic:
3875 *
3876 * endpoint : We'll get URI from the default aor/contact
3877 * endpoint/aor : We'll get the URI from the specific aor/contact
3878 * endpoint@domain : We toss the domain part and just use the endpoint
3879 *
3880 * These all use the endpoint and specified URI:
3881 * \verbatim
3882 endpoint/<sip[s]:host>
3883 endpoint/<sip[s]:user@host>
3884 endpoint/"Bob" <sip[s]:host>
3885 endpoint/"Bob" <sip[s]:user@host>
3886 endpoint/sip[s]:host
3887 endpoint/sip[s]:user@host
3888 endpoint/host
3889 endpoint/user@host
3890 \endverbatim
3891 *
3892 * These all use the default endpoint and specified URI:
3893 * \verbatim
3894 <sip[s]:host>
3895 <sip[s]:user@host>
3896 "Bob" <sip[s]:host>
3897 "Bob" <sip[s]:user@host>
3898 sip[s]:host
3899 sip[s]:user@host
3900 \endverbatim
3901 *
3902 * These use the default endpoint and specified host:
3903 * \verbatim
3904 host
3905 user@host
3906 \endverbatim
3907 *
3908 * This form is similar to a dialstring:
3909 * \verbatim
3910 PJSIP/user@endpoint
3911 \endverbatim
3912 *
3913 * In this case, the user will be added to the endpoint contact's URI.
3914 * If the contact URI already has a user, it will be replaced.
3915 *
3916 * The ones that have the sip[s] scheme are the easiest to parse.
3917 * The rest all have some issue.
3918 *
3919 * endpoint vs host : We have to test for endpoint first
3920 * endpoint/aor vs endpoint/host : We have to test for aor first
3921 * What if there's an aor with the same
3922 * name as the host?
3923 * endpoint@domain vs user@host : We have to test for endpoint first.
3924 * What if there's an endpoint with the
3925 * same name as the user?
3926 *
3927 * \param to 'To' field with possible endpoint
3928 * \param get_default_outbound If nonzero, try to retrieve the default
3929 * outbound endpoint if no endpoint was found.
3930 * Otherwise, return NULL if no endpoint was found.
3931 * \param uri Pointer to a char* which will be set to the URI.
3932 * Always must be ast_free'd by the caller - even if the return value is NULL!
3933 *
3934 * \note The logic below could probably be condensed but then it wouldn't be
3935 * as clear.
3936 */
3937struct ast_sip_endpoint *ast_sip_get_endpoint(const char *to, int get_default_outbound, char **uri);
3938
3939/*!
3940 * \brief Replace the To URI in the tdata with the supplied one
3941 *
3942 * \param tdata the outbound message data structure
3943 * \param to URI to replace the To URI with. Must be a valid SIP URI.
3944 *
3945 * \retval 0: success, -1: failure
3946 */
3947int ast_sip_update_to_uri(pjsip_tx_data *tdata, const char *to);
3948
3949/*!
3950 * \brief Overwrite fields in the outbound 'From' header
3951 *
3952 * The outbound 'From' header is created/added in ast_sip_create_request with
3953 * default data. If available that data may be info specified in the 'from_user'
3954 * and 'from_domain' options found on the endpoint. That information will be
3955 * overwritten with data in the given 'from' parameter.
3956 *
3957 * \param tdata the outbound message data structure
3958 * \param from info to copy into the header.
3959 * Can be either a SIP URI, or in the format user[@domain]
3960 *
3961 * \retval 0: success, -1: failure
3962 */
3963int ast_sip_update_from(pjsip_tx_data *tdata, char *from);
3964
3965/*!
3966 * \brief Retrieve the unidentified request security event thresholds
3967 * \since 13.8.0
3968 *
3969 * \param count The maximum number of unidentified requests per source ip to accumulate before emitting a security event
3970 * \param period The period in seconds over which to accumulate unidentified requests
3971 * \param prune_interval The interval in seconds at which expired entries will be pruned
3972 */
3973void ast_sip_get_unidentified_request_thresholds(unsigned int *count, unsigned int *period,
3974 unsigned int *prune_interval);
3975
3976/*!
3977 * \brief Get the transport name from an endpoint or request uri
3978 * \since 13.15.0
3979 *
3980 * \param endpoint
3981 * \param sip_uri
3982 * \param buf Buffer to receive transport name
3983 * \param buf_len Buffer length
3984 *
3985 * \retval 0 Success
3986 * \retval -1 Failure
3987 *
3988 * \note
3989 * If endpoint->transport is not NULL, it is returned in buf.
3990 * Otherwise if sip_uri has an 'x-ast-txp' parameter AND the sip_uri host is
3991 * an ip4 or ip6 address, its value is returned,
3992 */
3993int ast_sip_get_transport_name(const struct ast_sip_endpoint *endpoint,
3994 pjsip_sip_uri *sip_uri, char *buf, size_t buf_len);
3995
3996/*!
3997 * \brief Sets pjsip_tpselector from an endpoint or uri
3998 * \since 13.15.0
3999 *
4000 * \param endpoint If endpoint->transport is set, it's used
4001 * \param sip_uri If sip_uri contains a x-ast-txp parameter, it's used
4002 * \param selector The selector to be populated
4003 *
4004 * \retval 0 success
4005 * \retval -1 failure
4006 */
4008 pjsip_sip_uri *sip_uri, pjsip_tpselector *selector);
4009
4010/*!
4011 * \brief Set the transport on a dialog
4012 * \since 13.15.0
4013 *
4014 * \param endpoint
4015 * \param dlg
4016 * \param selector (optional)
4017 *
4018 * \note
4019 * This API calls ast_sip_get_transport_name(endpoint, dlg->target) and if the result is
4020 * non-NULL, calls pjsip_dlg_set_transport. If 'selector' is non-NULL, it is updated with
4021 * the selector used.
4022 *
4023 * \note
4024 * It is the responsibility of the caller to unref the passed in selector if one is provided.
4025 */
4026int ast_sip_dlg_set_transport(const struct ast_sip_endpoint *endpoint, pjsip_dialog *dlg,
4027 pjsip_tpselector *selector);
4028
4029/*!
4030 * \brief Convert the DTMF mode enum value into a string
4031 * \since 13.18.0
4032 *
4033 * \param dtmf the dtmf mode
4034 * \param buf Buffer to receive dtmf mode string
4035 * \param buf_len Buffer length
4036 *
4037 * \retval 0 Success
4038 * \retval -1 Failure
4039 *
4040 */
4042 char *buf, size_t buf_len);
4043
4044/*!
4045 * \brief Convert the DTMF mode name into an enum
4046 * \since 13.18.0
4047 *
4048 * \param dtmf_mode dtmf mode as a string
4049 *
4050 * \retval >= 0 The enum value
4051 * \retval -1 Failure
4052 *
4053 */
4054int ast_sip_str_to_dtmf(const char *dtmf_mode);
4055
4056/*!
4057 * \brief Convert the call codec preference flags to a string
4058 * \since 18.0.0
4059 *
4060 * \param pref the call codec preference setting
4061 *
4062 * \returns a constant string with either the setting value or 'unknown'
4063 * \note Don't try to free the string!
4064 *
4065 */
4066const char *ast_sip_call_codec_pref_to_str(struct ast_flags pref);
4067
4068/*!
4069 * \brief Convert a call codec preference string to preference flags
4070 * \since 18.0.0
4071 *
4072 * \param pref A pointer to an ast_flags structure to receive the preference flags
4073 * \param pref_str The call codec preference setting string
4074 * \param is_outgoing Is for outgoing calls?
4075 *
4076 * \retval 0 The string was parsed successfully
4077 * \retval -1 The string option was invalid
4078 */
4079int ast_sip_call_codec_str_to_pref(struct ast_flags *pref, const char *pref_str, int is_outgoing);
4080
4081/*!
4082 * \brief Transport shutdown monitor callback.
4083 * \since 13.18.0
4084 *
4085 * \param data User data to know what to do when transport shuts down.
4086 *
4087 * \note The callback does not need to care that data is an ao2 object.
4088 */
4089typedef void (*ast_transport_monitor_shutdown_cb)(void *data);
4090
4091/*!
4092 * \brief Transport shutdown monitor data matcher
4093 * \since 13.20.0
4094 *
4095 * \param a User data to compare.
4096 * \param b User data to compare.
4097 *
4098 * \retval 1 The data objects match
4099 * \retval 0 The data objects don't match
4100 */
4101typedef int (*ast_transport_monitor_data_matcher)(void *a, void *b);
4102
4104 /*! \brief Successfully registered the transport monitor */
4106 /*! \brief Replaced the already existing transport monitor with new one. */
4108 /*!
4109 * \brief Transport not found to monitor.
4110 * \note Transport is either already shutdown or is not reliable.
4111 */
4113 /*! \brief Error while registering transport monitor. */
4115};
4116
4117/*!
4118 * \brief Register a reliable transport shutdown monitor callback.
4119 * \deprecated Replaced with ast_sip_transport_monitor_register_key().
4120 * \since 13.20.0
4121 *
4122 * \param transport Transport to monitor for shutdown.
4123 * \param cb Who to call when transport is shutdown.
4124 * \param ao2_data Data to pass with the callback.
4125 *
4126 * \note The data object passed will have its reference count automatically
4127 * incremented by this call and automatically decremented after the callback
4128 * runs or when the callback is unregistered.
4129 *
4130 * There is no checking for duplicate registrations.
4131 *
4132 * \return enum ast_transport_monitor_reg
4133 */
4135 ast_transport_monitor_shutdown_cb cb, void *ao2_data);
4136
4137/*!
4138 * \brief Register a reliable transport shutdown monitor callback.
4139 *
4140 * \param transport_key Key for the transport to monitor for shutdown.
4141 * Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
4142 * \param cb Who to call when transport is shutdown.
4143 * \param ao2_data Data to pass with the callback.
4144 *
4145 * \note The data object passed will have its reference count automatically
4146 * incremented by this call and automatically decremented after the callback
4147 * runs or when the callback is unregistered.
4148 *
4149 * There is no checking for duplicate registrations.
4150 *
4151 * \return enum ast_transport_monitor_reg
4152 */
4154 const char *transport_key, ast_transport_monitor_shutdown_cb cb,
4155 void *ao2_data);
4156
4157/*!
4158 * \brief Register a reliable transport shutdown monitor callback replacing any duplicate.
4159 * \deprecated Replaced with ast_sip_transport_monitor_register_replace_key().
4160 * \since 13.26.0
4161 * \since 16.3.0
4162 *
4163 * \param transport Transport to monitor for shutdown.
4164 * \param cb Who to call when transport is shutdown.
4165 * \param ao2_data Data to pass with the callback.
4166 * \param matches Matcher function that returns true if data matches a previously
4167 * registered data object
4168 *
4169 * \note The data object passed will have its reference count automatically
4170 * incremented by this call and automatically decremented after the callback
4171 * runs or when the callback is unregistered.
4172 *
4173 * This function checks for duplicates, and overwrites/replaces the old monitor
4174 * with the given one.
4175 *
4176 * \return enum ast_transport_monitor_reg
4177 */
4180
4181/*!
4182 * \brief Register a reliable transport shutdown monitor callback replacing any duplicate.
4183 *
4184 * \param transport_key Key for the transport to monitor for shutdown.
4185 * Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
4186 * \param cb Who to call when transport is shutdown.
4187 * \param ao2_data Data to pass with the callback.
4188 * \param matches Matcher function that returns true if data matches a previously
4189 * registered data object
4190 *
4191 * \note The data object passed will have its reference count automatically
4192 * incremented by this call and automatically decremented after the callback
4193 * runs or when the callback is unregistered.
4194 *
4195 * This function checks for duplicates, and overwrites/replaces the old monitor
4196 * with the given one.
4197 *
4198 * \return enum ast_transport_monitor_reg
4199 */
4201 const char *transport_key, ast_transport_monitor_shutdown_cb cb,
4202 void *ao2_data, ast_transport_monitor_data_matcher matches);
4203
4204/*!
4205 * \brief Unregister a reliable transport shutdown monitor
4206 * \deprecated Replaced with ast_sip_transport_monitor_unregister_key().
4207 * \since 13.20.0
4208 *
4209 * \param transport Transport to monitor for shutdown.
4210 * \param cb The callback that was used for the original register.
4211 * \param data Data to pass to the matcher. May be NULL and does NOT need to be an ao2 object.
4212 * If NULL, all monitors with the provided callback are unregistered.
4213 * \param matches Matcher function that returns true if data matches the previously
4214 * registered data object. If NULL, a simple pointer comparison is done.
4215 *
4216 * \note The data object passed into the original register will have its reference count
4217 * automatically decremented.
4218 */
4221
4222/*!
4223 * \brief Unregister a reliable transport shutdown monitor
4224 *
4225 * \param transport_key Key for the transport to monitor for shutdown.
4226 * Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
4227 * \param cb The callback that was used for the original register.
4228 * \param data Data to pass to the matcher. May be NULL and does NOT need to be an ao2 object.
4229 * If NULL, all monitors with the provided callback are unregistered.
4230 * \param matches Matcher function that returns true if data matches the previously
4231 * registered data object. If NULL, a simple pointer comparison is done.
4232 *
4233 * \note The data object passed into the original register will have its reference count
4234 * automatically decremented.
4235 */
4236void ast_sip_transport_monitor_unregister_key(const char *transport_key,
4238
4239/*!
4240 * \brief Unregister a transport shutdown monitor from all reliable transports
4241 * \since 13.20.0
4242 *
4243 * \param cb The callback that was used for the original register.
4244 * \param data Data to pass to the matcher. May be NULL and does NOT need to be an ao2 object.
4245 * If NULL, all monitors with the provided callback are unregistered.
4246 * \param matches Matcher function that returns true if ao2_data matches the previously
4247 * registered data object. If NULL, a simple pointer comparison is done.
4248 *
4249 * \note The data object passed into the original register will have its reference count
4250 * automatically decremented.
4251 */
4253 void *data, ast_transport_monitor_data_matcher matches);
4254
4255/*! Transport state notification registration element. */
4257 /*! PJPROJECT transport state notification callback */
4258 pjsip_tp_state_callback cb;
4260};
4261
4262/*!
4263 * \brief Register a transport state notification callback element.
4264 * \since 13.18.0
4265 *
4266 * \param element What we are registering.
4267 */
4269
4270/*!
4271 * \brief Unregister a transport state notification callback element.
4272 * \since 13.18.0
4273 *
4274 * \param element What we are unregistering.
4275 */
4277
4278/*!
4279 * \brief Check whether a pjsip_uri is SIP/SIPS or not
4280 * \since 16.28.0
4281 *
4282 * \param uri The pjsip_uri to check
4283 *
4284 * \retval 1 if true
4285 * \retval 0 if false
4286 */
4287int ast_sip_is_uri_sip_sips(pjsip_uri *uri);
4288
4289/*!
4290 * \brief Check whether a pjsip_uri is allowed or not
4291 * \since 16.28.0
4292 *
4293 * \param uri The pjsip_uri to check
4294 *
4295 * \retval 1 if allowed
4296 * \retval 0 if not allowed
4297 */
4298int ast_sip_is_allowed_uri(pjsip_uri *uri);
4299
4300/*!
4301 * \brief Get the user portion of the pjsip_uri
4302 * \since 16.28.0
4303 *
4304 * \param uri The pjsip_uri to get the user from
4305 *
4306 * \note This function will check what kind of URI it receives and return
4307 * the user based off of that
4308 *
4309 * \return User string or empty string if not present
4310 */
4311const pj_str_t *ast_sip_pjsip_uri_get_username(pjsip_uri *uri);
4312
4313/*!
4314 * \brief Get the host portion of the pjsip_uri
4315 * \since 16.28.0
4316 *
4317 * \param uri The pjsip_uri to get the host from
4318 *
4319 * \note This function will check what kind of URI it receives and return
4320 * the host based off of that
4321 *
4322 * \return Host string or empty string if not present
4323 */
4324const pj_str_t *ast_sip_pjsip_uri_get_hostname(pjsip_uri *uri);
4325
4326/*!
4327 * \brief Find an 'other' SIP/SIPS URI parameter by name
4328 * \since 16.28.0
4329 *
4330 * A convenience function to find a named parameter from a SIP/SIPS URI. This
4331 * function will not find the following standard SIP/SIPS URI parameters which
4332 * are stored separately by PJSIP:
4333 *
4334 * \li `user`
4335 * \li `method`
4336 * \li `transport`
4337 * \li `ttl`
4338 * \li `lr`
4339 * \li `maddr`
4340 *
4341 * \param uri The pjsip_uri to get the parameter from
4342 * \param param_str The name of the parameter to find
4343 *
4344 * \note This function will check what kind of URI it receives and return
4345 * the parameter based off of that
4346 *
4347 * \return Find parameter or NULL if not present
4348 */
4349struct pjsip_param *ast_sip_pjsip_uri_get_other_param(pjsip_uri *uri, const pj_str_t *param_str);
4350
4351/*!
4352 * \brief Retrieve the system setting 'all_codecs_on_empty_reinvite'.
4353 *
4354 * \retval non zero if we should return all codecs on empty re-INVITE
4355 */
4357
4358
4359/*!
4360 * \brief Convert SIP hangup causes to Asterisk hangup causes
4361 *
4362 * \param cause SIP cause
4363 *
4364 * \retval matched cause code from causes.h
4365 */
4366const int ast_sip_hangup_sip2cause(int cause);
4367
4368/*!
4369 * \brief Convert name to SIP response code
4370 *
4371 * \param name SIP response code name matching one of the
4372 * enum names defined in "enum pjsip_status_code"
4373 * defined in sip_msg.h. May be specified with or
4374 * without the PJSIP_SC_ prefix.
4375 *
4376 * \retval SIP response code
4377 * \retval -1 if matching code not found
4378 */
4379int ast_sip_str2rc(const char *name);
4380
4381#endif /* _RES_PJSIP_H */
static struct aco_type agent_type
jack_status_t status
Definition app_jack.c:149
const char * str
Definition app_jack.c:150
int() ao2_callback_fn(void *obj, void *arg, int flags)
Type of a generic callback function.
Definition astobj2.h:1226
static const char type[]
unsigned long long ast_group_t
Definition channel.h:215
#define AST_MAX_CONTEXT
Definition channel.h:135
static struct ast_channel * callback(struct ast_channelstorage_instance *driver, ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
#define attribute_sentinel
Definition compiler.h:65
char buf[BUFSIZE]
Definition eagi_proxy.c:66
ast_endpoint_state
Valid states for an endpoint.
Definition endpoints.h:51
char * address
Definition f2c.h:59
static const char name[]
Definition format_mp3.c:68
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
static int array(struct ast_channel *chan, const char *cmd, char *var, const char *value)
struct ast_sip_endpoint * ast_sip_dialog_get_endpoint(pjsip_dialog *dlg)
Get the endpoint associated with this dialog.
int(* ast_sip_task)(void *user_data)
Definition res_pjsip.h:1989
int ast_sip_sched_task_get_times2(struct ast_sip_sched_task *schtd, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end, int *interval, int *time_left, struct timeval *next_start)
Gets the queued, last start, last_end, time left, interval, next run.
struct ast_taskprocessor * ast_sip_get_distributor_serializer(pjsip_rx_data *rdata)
Determine the distributor serializer for the SIP message.
ast_sip_scheduler_task_flags
Task flags for the res_pjsip scheduler.
Definition res_pjsip.h:2183
int ast_sip_sched_task_cancel_by_name(const char *name)
Cancels the next invocation of a task by name.
int ast_sip_push_task(struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
Pushes a task to SIP servants.
Definition res_pjsip.c:2099
struct ast_taskprocessor * ast_sip_create_serializer(const char *name)
Create a new serializer for SIP tasks.
Definition res_pjsip.c:2094
struct ast_taskprocessor * ast_sip_create_serializer_group(const char *name, struct ast_serializer_shutdown_group *shutdown_group)
Create a new serializer for SIP tasks.
Definition res_pjsip.c:2089
struct ast_sip_sched_task * ast_sip_schedule_task(struct ast_taskprocessor *serializer, int interval, ast_sip_task sip_task, const char *name, void *task_data, enum ast_sip_scheduler_task_flags flags)
Schedule a task to run in the res_pjsip thread pool.
void ast_sip_dialog_set_endpoint(pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint)
Set an endpoint on a SIP dialog so in-dialog requests do not undergo endpoint lookup.
int ast_sip_sched_task_cancel(struct ast_sip_sched_task *schtd)
Cancels the next invocation of a task.
int ast_sip_sched_is_task_running(struct ast_sip_sched_task *schtd)
Checks if the task is currently running.
int ast_sip_thread_is_servant(void)
Determine if the current thread is a SIP servant thread.
Definition res_pjsip.c:2310
int ast_sip_sched_task_get_name(struct ast_sip_sched_task *schtd, char *name, size_t maxlen)
Gets the task name.
int ast_sip_sched_task_get_next_run(struct ast_sip_sched_task *schtd)
Gets the number of milliseconds until the next invocation.
void ast_sip_dialog_set_serializer(pjsip_dialog *dlg, struct ast_taskprocessor *serializer)
Set a serializer on a SIP dialog so requests and responses are automatically serialized.
int ast_sip_push_task_synchronous(struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
Push a task to SIP servants and wait for it to complete.
Definition res_pjsip.c:2174
int ast_sip_sched_task_get_times(struct ast_sip_sched_task *schtd, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end)
Gets the last start and end times of the task.
int ast_sip_push_task_wait_servant(struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
Push a task to SIP servants and wait for it to complete.
Definition res_pjsip.c:2165
int ast_sip_sched_task_get_next_run_by_name(const char *name)
Gets the number of milliseconds until the next invocation.
int ast_sip_push_task_wait_serializer(struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
Push a task to the serializer and wait for it to complete.
Definition res_pjsip.c:2179
int ast_sip_sched_is_task_running_by_name(const char *name)
Checks if the task is currently running.
int ast_sip_sched_task_get_times_by_name2(const char *name, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end, int *interval, int *time_left, struct timeval *next_start)
Gets the queued, last start, last_end, time left, interval, next run by task name.
int ast_sip_sched_task_get_times_by_name(const char *name, struct timeval *when_queued, struct timeval *last_start, struct timeval *last_end)
Gets the last start and end times of the task by name.
@ AST_SIP_SCHED_TASK_ONESHOT
Definition res_pjsip.h:2206
@ AST_SIP_SCHED_TASK_DELAY
The next invocation of the task is at last finish + interval.
Definition res_pjsip.h:2238
@ AST_SIP_SCHED_TASK_TRACK
The scheduled task's events are tracked in the debug log.
Definition res_pjsip.h:2245
@ AST_SIP_SCHED_TASK_DATA_NOT_AO2
Definition res_pjsip.h:2211
@ AST_SIP_SCHED_TASK_DEFAULTS
Definition res_pjsip.h:2187
@ AST_SIP_SCHED_TASK_FIXED
Definition res_pjsip.h:2194
@ AST_SIP_SCHED_TASK_PERIODIC
The task is scheduled at multiples of interval.
Definition res_pjsip.h:2233
@ AST_SIP_SCHED_TASK_DATA_AO2
Definition res_pjsip.h:2217
@ AST_SIP_SCHED_TASK_DATA_FREE
Definition res_pjsip.h:2227
@ AST_SIP_SCHED_TASK_DATA_NO_CLEANUP
Definition res_pjsip.h:2222
@ AST_SIP_SCHED_TASK_VARIABLE
Definition res_pjsip.h:2200
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define AST_RWLIST_ENTRY
ast_transport
Definition netsock2.h:59
static struct ast_serializer_shutdown_group * shutdown_group
Shutdown group for options serializers.
const char * method
Definition res_pjsip.c:1279
ast_sip_security_mechanism_type
The security mechanism type.
Definition res_pjsip.h:362
@ AST_SIP_SECURITY_MECH_DTLS_SRTP
Definition res_pjsip.h:369
@ AST_SIP_SECURITY_MECH_SDES_SRTP
Definition res_pjsip.h:367
@ AST_SIP_SECURITY_MECH_MSRP_TLS
Definition res_pjsip.h:365
@ AST_SIP_SECURITY_MECH_NONE
Definition res_pjsip.h:363
struct ast_sip_auth * ast_sip_get_artificial_auth(void)
Retrieves a reference to the artificial auth.
int ast_sip_dialog_setup_outbound_authentication(pjsip_dialog *dlg, const struct ast_sip_endpoint *endpoint, ast_sip_dialog_outbound_auth_cb cb, void *user_data)
Set up outbound authentication on a SIP dialog.
void ast_sip_unregister_supplement(struct ast_sip_supplement *supplement)
Unregister a an supplement to SIP out of dialog processing.
Definition res_pjsip.c:1476
pjsip_auth_algorithm_type
Definition res_pjsip.h:607
@ PJSIP_AUTH_ALGORITHM_COUNT
Definition res_pjsip.h:613
@ PJSIP_AUTH_ALGORITHM_AKAV1_MD5
Definition res_pjsip.h:612
@ PJSIP_AUTH_ALGORITHM_NOT_SET
Definition res_pjsip.h:608
@ PJSIP_AUTH_ALGORITHM_SHA512_256
Definition res_pjsip.h:611
@ PJSIP_AUTH_ALGORITHM_SHA256
Definition res_pjsip.h:610
@ PJSIP_AUTH_ALGORITHM_MD5
Definition res_pjsip.h:609
struct ast_sip_endpoint * ast_sip_get_endpoint(const char *to, int get_default_outbound, char **uri)
Retrieves an endpoint and URI from the "to" string.
Definition res_pjsip.c:3249
void ast_sip_add_usereqphone(const struct ast_sip_endpoint *endpoint, pj_pool_t *pool, pjsip_uri *uri)
Add 'user=phone' parameter to URI if enabled and user is a phone number.
Definition res_pjsip.c:930
unsigned int ast_sip_get_norefersub(void)
Retrieve the global setting 'norefersub'.
struct pjsip_param * ast_sip_pjsip_uri_get_other_param(pjsip_uri *uri, const pj_str_t *param_str)
Find an 'other' SIP/SIPS URI parameter by name.
Definition res_pjsip.c:3511
const pjsip_auth_algorithm * ast_sip_auth_get_algorithm_by_iana_name(const pj_str_t *iana_name)
Get algorithm by IANA name.
Definition config_auth.c:83
const pj_str_t * ast_sip_pjsip_uri_get_username(pjsip_uri *uri)
Get the user portion of the pjsip_uri.
Definition res_pjsip.c:3477
void ast_sip_header_to_security_mechanism(const pjsip_generic_string_hdr *hdr, struct ast_sip_security_mechanism_vector *security_mechanisms)
Append to security mechanism vector from SIP header.
unsigned int ast_sip_get_max_initial_qualify_time(void)
Retrieve the system max initial qualify time.
unsigned int ast_sip_get_keep_alive_interval(void)
Retrieve the system keep alive interval setting.
void ast_sip_persistent_endpoint_publish_contact_state(const char *endpoint_name, const struct ast_sip_contact_status *contact_status)
Publish the change of state for a contact.
int ast_sip_set_security_negotiation(enum ast_sip_security_negotiation *security_negotiation, const char *val)
Set the security negotiation based on a given string.
void ast_sip_unregister_service(pjsip_module *module)
Definition res_pjsip.c:133
const pjsip_auth_algorithm * ast_sip_auth_get_algorithm_by_type(pjsip_auth_algorithm_type algorithm_type)
Get algorithm by algorithm type.
Definition config_auth.c:66
unsigned int ast_sip_get_allow_sending_180_after_183(void)
Retrieve the global setting 'allow_sending_180_after_183'.
ast_sip_endpoint_identifier_type
Different methods by which incoming requests can be matched to endpoints.
Definition res_pjsip.h:699
@ AST_SIP_ENDPOINT_IDENTIFY_BY_HEADER
Definition res_pjsip.h:707
@ AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME
Definition res_pjsip.h:701
@ AST_SIP_ENDPOINT_IDENTIFY_BY_REQUEST_URI
Definition res_pjsip.h:709
@ AST_SIP_ENDPOINT_IDENTIFY_BY_IP
Definition res_pjsip.h:705
@ AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME
Definition res_pjsip.h:703
const char * ast_sip_get_host_ip_string(int af)
Retrieve the local host address in string form.
Definition res_pjsip.c:2493
char * ast_sip_get_endpoint_identifier_order(void)
Retrieve the global endpoint_identifier_order setting.
int(* ast_transport_monitor_data_matcher)(void *a, void *b)
Transport shutdown monitor data matcher.
Definition res_pjsip.h:4102
void ast_sip_security_mechanisms_vector_copy(struct ast_sip_security_mechanism_vector *dst, const struct ast_sip_security_mechanism_vector *src)
Duplicate a security mechanism.
pjsip_media_type pjsip_media_type_application_media_control_xml
Definition res_pjsip.c:3910
int ast_sip_call_codec_str_to_pref(struct ast_flags *pref, const char *pref_str, int is_outgoing)
Convert a call codec preference string to preference flags.
Definition res_pjsip.c:2577
int ast_sip_transport_state_set_transport(const char *transport_name, pjsip_transport *transport)
Sets the PJSIP transport on a child transport.
char * ast_sip_rdata_get_header_value(pjsip_rx_data *rdata, const pj_str_t str)
Get a specific header value from rdata.
Definition res_pjsip.c:345
pjsip_dialog * ast_sip_create_dialog_uas(const struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pj_status_t *status)
General purpose method for creating a UAS dialog with an endpoint.
Definition res_pjsip.c:1176
struct ast_sip_contact * ast_sip_location_retrieve_contact_from_aor_list(const char *aor_list)
Retrieve the first bound contact from a list of AORs.
Definition location.c:304
int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, struct ast_sip_endpoint *endpoint)
Add a new contact to an AOR.
Definition location.c:430
void ast_sip_location_retrieve_contact_and_aor_from_list(const char *aor_list, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
Retrieve the first bound contact AND the AOR chosen from a list of AORs.
Definition location.c:266
struct ast_sip_endpoint * ast_sip_get_artificial_endpoint(void)
Retrieves a reference to the artificial endpoint.
pjsip_media_type pjsip_media_type_application_json
Definition res_pjsip.c:3909
int ast_sip_requires_authentication(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Determine if an incoming request requires authentication.
Definition res_pjsip.c:163
void ast_sip_report_mem_limit(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Send a security event notification for when a memory limit is hit.
int ast_sip_send_response(pjsip_response_addr *res_addr, pjsip_tx_data *tdata, struct ast_sip_endpoint *sip_endpoint)
Send a response to an out of dialog request.
Definition res_pjsip.c:2396
pjsip_generic_string_hdr * ast_sip_add_header2(pjsip_tx_data *tdata, const char *name, const char *value)
Add a header to an outbound SIP message, returning a pointer to the header.
Definition res_pjsip.c:2023
void ast_sip_report_req_no_support(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, const char *req_type)
Send a security event notification for when a request is not supported.
struct ao2_container * ast_sip_get_endpoints(void)
Retrieve any endpoints available to sorcery.
int ast_copy_pj_str2(char **dest, const pj_str_t *src)
Create and copy a pj_str_t into a standard character buffer.
Definition res_pjsip.c:2208
int ast_sip_get_host_ip(int af, pj_sockaddr *addr)
Retrieve the local host address in IP form.
Definition res_pjsip.c:2480
int ast_sip_for_each_auth(const struct ast_sip_auth_vector *array, ao2_callback_fn on_auth, void *arg)
For every auth in the array call the given 'on_auth' handler.
void ast_sip_report_auth_success(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Send a security event notification for when authentication succeeds.
struct ao2_container * ast_sip_get_transport_states(void)
Retrieves all transport states.
ast_sip_session_redirect
Definition res_pjsip.h:744
@ AST_SIP_REDIRECT_URI_CORE
Definition res_pjsip.h:748
@ AST_SIP_REDIRECT_URI_PJSIP
Definition res_pjsip.h:750
@ AST_SIP_REDIRECT_USER
Definition res_pjsip.h:746
int ast_sip_create_response(const pjsip_rx_data *rdata, int st_code, struct ast_sip_contact *contact, pjsip_tx_data **p_tdata)
General purpose method for creating a SIP response.
Definition res_pjsip.c:2468
int ast_sip_register_service(pjsip_module *module)
Register a SIP service in Asterisk.
Definition res_pjsip.c:117
void * ast_sip_endpoint_alloc(const char *name)
Allocate a new SIP endpoint.
struct ast_sip_aor * ast_sip_location_retrieve_aor(const char *aor_name)
Retrieve a named AOR.
Definition location.c:147
int ast_sip_is_allowed_uri(pjsip_uri *uri)
Check whether a pjsip_uri is allowed or not.
Definition res_pjsip.c:3472
pjsip_dialog * ast_sip_create_dialog_uac(const struct ast_sip_endpoint *endpoint, const char *aor_name, const char *request_user)
General purpose method for creating a UAC dialog with an endpoint.
Definition res_pjsip.c:964
int ast_sip_for_each_channel_snapshot(const struct ast_endpoint_snapshot *endpoint_snapshot, ao2_callback_fn on_channel_snapshot, void *arg)
For every channel snapshot on an endpoint snapshot call the given 'on_channel_snapshot' handler.
struct ao2_container * ast_sip_location_retrieve_aor_contacts_nolock_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve all contacts currently available for an AOR without locking the AOR and filter based on flag...
Definition location.c:219
void ast_sip_transport_state_register(struct ast_sip_tpmgr_state_callback *element)
Register a transport state notification callback element.
void ast_sip_cleanup_auths(struct ast_sip_auth *auths[], size_t num_auths)
Clean up retrieved auth structures from memory.
int ast_sip_for_each_contact(const struct ast_sip_aor *aor, ao2_callback_fn on_contact, void *arg)
For every contact on an AOR call the given 'on_contact' handler.
Definition location.c:723
const int ast_sip_hangup_sip2cause(int cause)
Convert SIP hangup causes to Asterisk hangup causes.
Definition res_pjsip.c:3531
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_key(const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *ao2_data)
Register a reliable transport shutdown monitor callback.
int ast_sip_rewrite_uri_to_local(pjsip_sip_uri *uri, pjsip_tx_data *tdata)
Replace domain and port of SIP URI to point to (external) signaling address of this Asterisk instance...
Definition res_pjsip.c:605
int ast_sip_format_auths_ami(const struct ast_sip_auth_vector *auths, struct ast_sip_ami *ami)
Format auth details for AMI.
int ast_sip_create_request_with_auth(const struct ast_sip_auth_vector *auths, pjsip_rx_data *challenge, pjsip_tx_data *tdata, pjsip_tx_data **new_request)
Create a response to an authentication challenge.
Definition res_pjsip.c:214
int ast_sip_for_each_aor(const char *aors, ao2_callback_fn on_aor, void *arg)
For every aor in the comma separated aors string call the given 'on_aor' handler.
Definition location.c:688
struct ast_sip_contact * ast_sip_location_retrieve_first_aor_contact_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve the first bound contact for an AOR and filter based on flags.
Definition location.c:199
int ast_sip_set_id_connected_line(struct pjsip_rx_data *rdata, struct ast_party_id *id)
Set the ID for a connected line update.
Definition res_pjsip.c:2822
pjsip_media_type pjsip_media_type_application_sdp
Definition res_pjsip.c:3916
ast_sip_session_media_encryption
Definition res_pjsip.h:733
@ AST_SIP_MEDIA_ENCRYPT_SDES
Definition res_pjsip.h:739
@ AST_SIP_MEDIA_TRANSPORT_INVALID
Definition res_pjsip.h:735
@ AST_SIP_MEDIA_ENCRYPT_NONE
Definition res_pjsip.h:737
@ AST_SIP_MEDIA_ENCRYPT_DTLS
Definition res_pjsip.h:741
void ast_sip_register_supplement(struct ast_sip_supplement *supplement)
Register a supplement to SIP out of dialog processing.
Definition res_pjsip.c:1456
void ast_sip_add_date_header(pjsip_tx_data *tdata)
Adds a Date header to the tdata, formatted like: Date: Wed, 01 Jan 2021 14:53:01 GMT.
Definition res_pjsip.c:90
ast_sip_auth_cred_usage
Definition res_pjsip.h:590
@ AST_SIP_AUTH_CRED_USAGE_UAS
Definition res_pjsip.h:594
@ AST_SIP_AUTH_CRED_USAGE_UAC
Definition res_pjsip.h:592
pjsip_media_type pjsip_media_type_text_plain
Definition res_pjsip.c:3920
void ast_sip_report_auth_challenge_sent(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata)
Send a security event notification for when an authentication challenge is sent.
void ast_sip_message_apply_transport(const char *transport_name, pjsip_tx_data *tdata)
Apply the configuration for a transport to an outgoing message.
void ast_sip_unregister_outbound_authenticator(struct ast_sip_outbound_authenticator *auth)
Unregister an outbound SIP authenticator.
Definition res_pjsip.c:203
int ast_sip_set_id_from_invite(struct pjsip_rx_data *rdata, struct ast_party_id *id, struct ast_party_id *default_id, int trust_inbound)
Set the ID from an INVITE.
Definition res_pjsip.c:2827
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace(pjsip_transport *transport, ast_transport_monitor_shutdown_cb cb, void *ao2_data, ast_transport_monitor_data_matcher matches)
Register a reliable transport shutdown monitor callback replacing any duplicate.
pjsip_media_type pjsip_media_type_application_pidf_xml
Definition res_pjsip.c:3911
void ast_sip_transport_monitor_unregister(pjsip_transport *transport, ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches)
Unregister a reliable transport shutdown monitor.
int ast_sip_auths_to_str(const struct ast_sip_auth_vector *auths, char **buf)
Converts an auths array to a string of comma separated values.
int ast_sip_auth_digest_algorithms_vector_init(const char *id, struct pjsip_auth_algorithm_type_vector *algorithms, const char *agent_type, const char *value)
Populate a vector of algorithm types from a string.
int ast_sip_create_rdata(pjsip_rx_data *rdata, char *packet, const char *src_name, int src_port, char *transport_type, const char *local_name, int local_port)
General purpose method for creating an rdata structure using specific information.
Definition res_pjsip.c:1266
enum ast_sip_check_auth_result ast_sip_check_authentication(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata)
Method to determine authentication status of an incoming request.
Definition res_pjsip.c:179
pjsip_endpoint * ast_sip_get_pjsip_endpoint(void)
Get a pointer to the PJSIP endpoint.
Definition res_pjsip.c:520
int ast_sip_register_endpoint_identifier(struct ast_sip_endpoint_identifier *identifier)
Register a SIP endpoint identifier.
Definition res_pjsip.c:310
struct ast_endpoint_snapshot * ast_sip_get_endpoint_snapshot(const struct ast_sip_endpoint *endpoint)
Retrieve the endpoint snapshot for an endpoint.
void * ast_sip_dict_get(void *ht, const char *key)
Retrieves the value associated with the given key.
Definition res_pjsip.c:2327
unsigned int ast_sip_get_send_contact_status_on_update_registration(void)
Retrieve the global setting 'send_contact_status_on_update_registration'.
int ast_sip_update_from(pjsip_tx_data *tdata, char *from)
Overwrite fields in the outbound 'From' header.
Definition res_pjsip.c:3383
ast_sip_supplement_priority
Definition res_pjsip.h:3332
@ AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL
Definition res_pjsip.h:3339
@ AST_SIP_SUPPLEMENT_PRIORITY_FIRST
Definition res_pjsip.h:3334
@ AST_SIP_SUPPLEMENT_PRIORITY_LAST
Definition res_pjsip.h:3341
int ast_sip_format_endpoint_ami(struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami, int *count)
Formats the endpoint and sends over AMI.
Definition res_pjsip.c:501
int ast_sip_dtmf_to_str(const enum ast_sip_dtmf_mode dtmf, char *buf, size_t buf_len)
Convert the DTMF mode enum value into a string.
Definition res_pjsip.c:2504
int ast_sip_str2rc(const char *name)
Convert name to SIP response code.
Definition res_pjsip.c:3714
int ast_sip_set_tpselector_from_transport(const struct ast_sip_transport *transport, pjsip_tpselector *selector)
Sets pjsip_tpselector from ast_sip_transport.
Definition res_pjsip.c:843
int ast_sip_retrieve_auths(const struct ast_sip_auth_vector *auths, struct ast_sip_auth **out)
Retrieve relevant SIP auth structures from sorcery.
struct ast_sip_endpoint * ast_pjsip_rdata_get_endpoint(pjsip_rx_data *rdata)
Get the looked-up endpoint on an out-of dialog request or response.
int ast_sip_is_uri_sip_sips(pjsip_uri *uri)
Check whether a pjsip_uri is SIP/SIPS or not.
Definition res_pjsip.c:3467
int ast_sip_set_tpselector_from_ep_or_uri(const struct ast_sip_endpoint *endpoint, pjsip_sip_uri *sip_uri, pjsip_tpselector *selector)
Sets pjsip_tpselector from an endpoint or uri.
Definition res_pjsip.c:911
void ast_sip_service_route_vector_destroy(struct ast_sip_service_route_vector *service_routes)
Destroy a vector of service routes.
void ast_sip_unregister_endpoint_identifier(struct ast_sip_endpoint_identifier *identifier)
Unregister a SIP endpoint identifier.
Definition res_pjsip.c:315
pj_bool_t ast_sip_auth_is_algorithm_supported(pjsip_auth_algorithm_type algorithm_type)
Is algorithm supported by OpenSSL and pjproject?
const char * ast_sip_get_contact_short_status_label(const enum ast_sip_contact_status_type status)
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
Definition res_pjsip.c:2201
void ast_sip_security_mechanisms_vector_destroy(struct ast_sip_security_mechanism_vector *security_mechanisms)
Free contents of a security mechanism vector.
void ast_sip_transport_monitor_unregister_all(ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches)
Unregister a transport shutdown monitor from all reliable transports.
const char * ast_sip_call_codec_pref_to_str(struct ast_flags pref)
Convert the call codec preference flags to a string.
Definition res_pjsip.c:2554
struct ast_sip_endpoint * ast_sip_identify_endpoint(pjsip_rx_data *rdata)
Determine the endpoint that has sent a SIP message.
Definition res_pjsip.c:330
int ast_sip_send_out_of_dialog_request(pjsip_tx_data *tdata, struct ast_sip_endpoint *endpoint, int timeout, void *token, void(*callback)(void *token, pjsip_event *e))
General purpose method for sending an Out-Of-Dialog SIP request.
Definition res_pjsip.c:1938
pjsip_dialog * ast_sip_create_dialog_uas_locked(const struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pj_status_t *status)
General purpose method for creating a UAS dialog with an endpoint.
Definition res_pjsip.c:1192
pjsip_media_type pjsip_media_type_application_simple_message_summary
Definition res_pjsip.c:3915
struct ast_sip_transport_state * ast_sip_find_transport_state_in_use(struct ast_sip_request_transport_details *details)
Returns the transport state currently in use based on request transport details.
Definition res_pjsip.c:595
int ast_sip_format_contact_ami(void *obj, void *arg, int flags)
Formats the contact and sends over AMI.
#define SIP_TLS_MAX_CIPHERS
Maximum number of ciphers supported for a TLS transport.
Definition res_pjsip.h:105
int ast_sip_dlg_set_transport(const struct ast_sip_endpoint *endpoint, pjsip_dialog *dlg, pjsip_tpselector *selector)
Set the transport on a dialog.
Definition res_pjsip.c:727
int ast_sip_is_media_type_in(pjsip_media_type *a,...) attribute_sentinel
Check if a media type is in a list of others.
Definition res_pjsip.c:2228
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace_key(const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *ao2_data, ast_transport_monitor_data_matcher matches)
Register a reliable transport shutdown monitor callback replacing any duplicate.
unsigned int ast_sip_get_use_callerid_contact(void)
Retrieve the global setting 'use_callerid_contact'.
char * ast_sip_get_default_voicemail_extension(void)
Retrieve the default voicemail extension.
ast_sip_contact_filter
Contact retrieval filtering flags.
Definition res_pjsip.h:1420
@ AST_SIP_CONTACT_FILTER_REACHABLE
Return only reachable or unknown contacts.
Definition res_pjsip.h:1425
@ AST_SIP_CONTACT_FILTER_DEFAULT
Default filter flags.
Definition res_pjsip.h:1422
void ast_sip_unregister_authenticator(struct ast_sip_authenticator *auth)
Unregister a SIP authenticator.
Definition res_pjsip.c:152
unsigned int ast_sip_get_contact_expiration_check_interval(void)
Retrieve the system contact expiration check interval setting.
int ast_sip_persistent_endpoint_update_state(const char *endpoint_name, enum ast_endpoint_state state)
Change state of a persistent endpoint.
int ast_sip_send_request(pjsip_tx_data *tdata, struct pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint, void *token, void(*callback)(void *token, pjsip_event *e))
General purpose method for sending a SIP request.
Definition res_pjsip.c:1979
const char * ast_sip_get_device_state(const struct ast_sip_endpoint *endpoint)
Retrieve the device state for an endpoint.
long ast_sip_threadpool_queue_size(void)
Return the size of the SIP threadpool's task queue.
Definition res_pjsip.c:3457
struct ast_sip_endpoint * ast_sip_default_outbound_endpoint(void)
Retrieve the default outbound endpoint.
int ast_sip_set_request_transport_details(struct ast_sip_request_transport_details *details, pjsip_tx_data *tdata, int use_ipv6)
Sets request transport details based on tdata.
Definition res_pjsip.c:648
void ast_sip_report_invalid_endpoint(const char *name, pjsip_rx_data *rdata)
Send a security event notification for when an invalid endpoint is requested.
int ast_sip_register_outbound_authenticator(struct ast_sip_outbound_authenticator *outbound_auth)
Register an outbound SIP authenticator.
Definition res_pjsip.c:191
void ast_sip_register_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Register an endpoint formatter.
Definition res_pjsip.c:481
int ast_sip_add_global_request_header(const char *name, const char *value, int replace)
int ast_sip_add_body(pjsip_tx_data *tdata, const struct ast_sip_body *body)
Add a body to an outbound SIP message.
Definition res_pjsip.c:2052
int ast_sip_security_mechanisms_to_str(const struct ast_sip_security_mechanism_vector *security_mechanisms, int add_qvalue, char **buf)
Writes the security mechanisms of an endpoint into a buffer as a string and returns the buffer.
void * ast_sip_dict_set(pj_pool_t *pool, void *ht, const char *key, void *val)
Set the value for the given key.
Definition res_pjsip.c:2338
int ast_sip_are_media_types_equal(pjsip_media_type *a, pjsip_media_type *b)
Compare pjsip media types.
Definition res_pjsip.c:2219
void ast_sip_tpselector_unref(pjsip_tpselector *selector)
Unreference a pjsip_tpselector.
Definition res_pjsip.c:923
void ast_sip_get_default_realm(char *realm, size_t size)
Retrieve the global default realm.
struct ao2_container * ast_sip_location_retrieve_aor_contacts_nolock(const struct ast_sip_aor *aor)
Retrieve all contacts currently available for an AOR without locking the AOR.
Definition location.c:214
int ast_sip_auth_digest_algorithms_vector_to_str(const struct pjsip_auth_algorithm_type_vector *algorithms, char **buf)
Dump a vector of algorithm types to a string.
int ast_sip_get_transport_name(const struct ast_sip_endpoint *endpoint, pjsip_sip_uri *sip_uri, char *buf, size_t buf_len)
Get the transport name from an endpoint or request uri.
Definition res_pjsip.c:698
unsigned int ast_sip_get_disable_multi_domain(void)
Retrieve the system setting 'disable multi domain'.
void ast_sip_unregister_endpoint_formatter(struct ast_sip_endpoint_formatter *obj)
Unregister an endpoint formatter.
Definition res_pjsip.c:487
int ast_sip_retrieve_auths_vector(const struct ast_sip_auth_vector *auth_ids, struct ast_sip_auth_objects_vector *auth_objects)
Retrieve relevant SIP auth structures from sorcery as a vector.
ast_sip_dtmf_mode
DTMF modes for SIP endpoints.
Definition res_pjsip.h:545
@ AST_SIP_DTMF_NONE
Definition res_pjsip.h:547
@ AST_SIP_DTMF_AUTO_INFO
Definition res_pjsip.h:558
@ AST_SIP_DTMF_AUTO
Definition res_pjsip.h:556
@ AST_SIP_DTMF_INBAND
Definition res_pjsip.h:552
@ AST_SIP_DTMF_INFO
Definition res_pjsip.h:554
@ AST_SIP_DTMF_RFC_4733
Definition res_pjsip.h:550
unsigned int ast_sip_get_ignore_uri_user_options(void)
Retrieve the global setting 'ignore_uri_user_options'.
int ast_sip_register_authenticator(struct ast_sip_authenticator *auth)
Register a SIP authenticator.
Definition res_pjsip.c:140
struct ast_sip_service_route_vector * ast_sip_service_route_vector_alloc(void)
Allocate a vector of service routes.
struct ast_sip_contact * ast_sip_location_retrieve_contact(const char *contact_name)
Retrieve a named contact.
Definition location.c:350
enum ast_transport_monitor_reg ast_sip_transport_monitor_register(pjsip_transport *transport, ast_transport_monitor_shutdown_cb cb, void *ao2_data)
Register a reliable transport shutdown monitor callback.
int ast_sip_str_to_security_mechanism(struct ast_sip_security_mechanism **security_mechanism, const char *value)
Allocate a security mechanism from a string.
int ast_sip_sorcery_object_to_ami(const void *obj, struct ast_str **buf)
Converts a sorcery object to a string of object properties.
void ast_sip_transport_state_unregister(struct ast_sip_tpmgr_state_callback *element)
Unregister a transport state notification callback element.
int ast_sip_add_body_multipart(pjsip_tx_data *tdata, const struct ast_sip_body *bodies[], int num_bodies)
Add a multipart body to an outbound SIP message.
Definition res_pjsip.c:2059
ast_sip_auth_type
Authentication methods.
Definition res_pjsip.h:570
@ AST_SIP_AUTH_TYPE_GOOGLE_OAUTH
Definition res_pjsip.h:583
@ AST_SIP_AUTH_TYPE_NONE
Definition res_pjsip.h:571
@ AST_SIP_AUTH_TYPE_ARTIFICIAL
Definition res_pjsip.h:585
@ AST_SIP_AUTH_TYPE_DIGEST
Definition res_pjsip.h:587
@ AST_SIP_AUTH_TYPE_MD5
Definition res_pjsip.h:581
@ AST_SIP_AUTH_TYPE_USER_PASS
Definition res_pjsip.h:576
pjsip_media_type pjsip_media_type_application_rlmi_xml
Definition res_pjsip.c:3914
ast_transport_monitor_reg
Definition res_pjsip.h:4104
@ AST_TRANSPORT_MONITOR_REG_NOT_FOUND
Transport not found to monitor.
Definition res_pjsip.h:4113
@ AST_TRANSPORT_MONITOR_REG_REPLACED
Replaced the already existing transport monitor with new one.
Definition res_pjsip.h:4108
@ AST_TRANSPORT_MONITOR_REG_FAILED
Error while registering transport monitor.
Definition res_pjsip.h:4115
@ AST_TRANSPORT_MONITOR_REG_SUCCESS
Successfully registered the transport monitor.
Definition res_pjsip.h:4106
void(* ast_transport_monitor_shutdown_cb)(void *data)
Transport shutdown monitor callback.
Definition res_pjsip.h:4090
int ast_sip_add_global_response_header(const char *name, const char *value, int replace)
struct ao2_container * ast_sip_location_retrieve_contacts_from_aor_list(const char *aor_list)
Retrieve all contacts from a list of AORs.
Definition location.c:335
int ast_sip_update_to_uri(pjsip_tx_data *tdata, const char *to)
Replace the To URI in the tdata with the supplied one.
Definition res_pjsip.c:3323
pjsip_media_type pjsip_media_type_multipart_mixed
Definition res_pjsip.c:3918
void ast_sip_report_auth_failed_challenge_response(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Send a security event notification for when a challenge response has failed.
void ast_sip_remove_headers_by_name_and_value(pjsip_msg *msg, const pj_str_t *hdr_name, const char *value)
Removes all headers of a specific name and value from a pjsip_msg.
pjsip_media_type pjsip_media_type_application_xpidf_xml
Definition res_pjsip.c:3912
void ast_sip_location_retrieve_contact_and_aor_from_list_filtered(const char *aor_list, unsigned int flags, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
Retrieve the first bound contact AND the AOR chosen from a list of AORs and filter based on flags.
Definition location.c:272
int ast_sip_set_outbound_proxy(pjsip_tx_data *tdata, const char *proxy)
Set the outbound proxy for an outbound SIP message.
Definition res_pjsip.c:1992
struct ast_sip_transport_state * ast_sip_get_transport_state(const char *transport_id)
Retrieve transport state.
unsigned int ast_sip_get_mwi_disable_initial_unsolicited(void)
Retrieve the global setting 'disable sending unsolicited mwi on startup'.
void ast_sip_auth_vector_destroy(struct ast_sip_auth_vector *vector)
Free contents of an auth vector.
struct ast_threadpool * ast_sip_threadpool(void)
Retrieve the SIP threadpool object.
Definition res_pjsip.c:3462
int ast_sip_register_endpoint_identifier_with_name(struct ast_sip_endpoint_identifier *identifier, const char *name)
Register a SIP endpoint identifier with a name.
Definition res_pjsip.c:233
pjsip_media_type pjsip_media_type_multipart_alternative
Definition res_pjsip.c:3917
ast_sip_security_negotiation
The kind of security negotiation.
Definition res_pjsip.h:351
@ AST_SIP_SECURITY_NEG_MEDIASEC
Definition res_pjsip.h:355
@ AST_SIP_SECURITY_NEG_NONE
Definition res_pjsip.h:353
int ast_sip_set_tpselector_from_transport_name(const char *transport_name, pjsip_tpselector *selector)
Sets pjsip_tpselector from ast_sip_transport.
Definition res_pjsip.c:893
int ast_sip_create_request(const char *method, struct pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint, const char *uri, struct ast_sip_contact *contact, pjsip_tx_data **tdata)
General purpose method for creating a SIP request.
Definition res_pjsip.c:1435
struct ast_str * ast_sip_create_ami_event(const char *event, struct ast_sip_ami *ami)
Creates a string to store AMI event data in.
int ast_sip_get_mwi_tps_queue_low(void)
Retrieve the global MWI taskprocessor low water clear alert level.
const char * ast_sip_auth_get_creds(const struct ast_sip_auth *auth, const pjsip_auth_algorithm_type algorithm_type, int *cred_type)
Get the plain text or digest password from an auth object.
struct ast_sip_contact * ast_sip_location_create_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, int prune_on_boot, struct ast_sip_endpoint *endpoint)
Create a new contact for an AOR without locking the AOR.
Definition location.c:355
int ast_sip_auth_is_algorithm_available(const struct ast_sip_auth *auth, const struct pjsip_auth_algorithm_type_vector *algorithms, pjsip_auth_algorithm_type algorithm_type)
Checks an pjsip_auth_algorithm_type_vector to see if it contains an algorithm.
int ast_sip_str_to_dtmf(const char *dtmf_mode)
Convert the DTMF mode name into an enum.
Definition res_pjsip.c:2533
int ast_sip_add_header(pjsip_tx_data *tdata, const char *name, const char *value)
Add a header to an outbound SIP message.
Definition res_pjsip.c:2008
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
const pj_str_t * ast_sip_pjsip_uri_get_hostname(pjsip_uri *uri)
Get the host portion of the pjsip_uri.
Definition res_pjsip.c:3496
char * ast_sip_get_regcontext(void)
Retrieve the global regcontext setting.
ast_sip_check_auth_result
Possible returns from ast_sip_check_authentication.
Definition res_pjsip.h:1321
@ AST_SIP_AUTHENTICATION_CHALLENGE
Definition res_pjsip.h:1323
@ AST_SIP_AUTHENTICATION_ERROR
Definition res_pjsip.h:1329
@ AST_SIP_AUTHENTICATION_SUCCESS
Definition res_pjsip.h:1325
@ AST_SIP_AUTHENTICATION_FAILED
Definition res_pjsip.h:1327
ast_sip_call_codec_pref
Incoming/Outgoing call offer/answer joint codec preference.
Definition res_pjsip.h:758
@ AST_SIP_CALL_CODEC_PREF_ALL
Definition res_pjsip.h:767
@ AST_SIP_CALL_CODEC_PREF_LOCAL
Definition res_pjsip.h:773
@ AST_SIP_CALL_CODEC_PREF_REMOTE
Definition res_pjsip.h:775
@ AST_SIP_CALL_CODEC_PREF_UNION
Definition res_pjsip.h:763
@ AST_SIP_CALL_CODEC_PREF_FIRST
Definition res_pjsip.h:769
@ AST_SIP_CALL_CODEC_PREF_INTERSECT
Definition res_pjsip.h:761
const char * ast_sip_auth_type_to_str(enum ast_sip_auth_type type)
Converts the given auth type to a string.
struct ast_sip_contact_status * ast_sip_get_contact_status(const struct ast_sip_contact *contact)
Retrieve the current status for a contact.
int(* ast_sip_dialog_outbound_auth_cb)(pjsip_dialog *dlg, pjsip_tx_data *tdata, void *user_data)
Callback called when an outbound request with authentication credentials is to be sent in dialog.
Definition res_pjsip.h:1884
int ast_sip_security_mechanism_vector_init(struct ast_sip_security_mechanism_vector *security_mechanism, const char *value)
Initialize security mechanism vector from string of security mechanisms.
int ast_sip_location_update_contact(struct ast_sip_contact *contact)
Update a contact.
Definition location.c:446
void ast_sip_get_default_auth_algorithms_uac(char *default_auth_algorithms_uac, size_t size)
Retrieve the global auth algorithms for UAC.
const char * ast_sip_get_contact_status_label(const enum ast_sip_contact_status_type status)
translate ast_sip_contact_status_type to character string.
int ast_sip_send_stateful_response(pjsip_rx_data *rdata, pjsip_tx_data *tdata, struct ast_sip_endpoint *sip_endpoint)
Send a stateful response to an out of dialog request.
Definition res_pjsip.c:2424
int ast_sip_for_each_channel(const struct ast_sip_endpoint *endpoint, ao2_callback_fn on_channel_snapshot, void *arg)
For every channel snapshot on an endpoint all the given 'on_channel_snapshot' handler.
int ast_sip_auth_vector_init(struct ast_sip_auth_vector *vector, const char *auth_names)
Initialize an auth vector with the configured values.
ast_sip_contact_status_type
Status type for a contact.
Definition res_pjsip.h:434
@ AVAILABLE
Definition res_pjsip.h:438
@ UNAVAILABLE
Definition res_pjsip.h:436
@ REMOVED
Definition res_pjsip.h:443
@ UNKNOWN
Definition res_pjsip.h:440
@ CREATED
Definition res_pjsip.h:442
void ast_sip_get_default_from_user(char *from_user, size_t size)
Retrieve the global default from user.
unsigned int ast_sip_get_mwi_tps_queue_high(void)
Retrieve the global MWI taskprocessor high water alert trigger level.
int ast_sip_is_content_type(pjsip_media_type *content_type, char *type, char *subtype)
Checks if the given content type matches type/subtype.
Definition res_pjsip.c:2248
void ast_sip_transport_monitor_unregister_key(const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches)
Unregister a reliable transport shutdown monitor.
int ast_sip_append_body(pjsip_tx_data *tdata, const char *body_text)
Append body data to a SIP message.
Definition res_pjsip.c:2075
int ast_sip_add_security_headers(struct ast_sip_security_mechanism_vector *security_mechanisms, const char *header_name, int add_qval, pjsip_tx_data *tdata)
Add security headers to transmission data.
int ast_sip_contact_to_str(void *object, void *arg, int flags)
Handler used to convert a contact to a string.
Definition location.c:771
struct ast_sip_contact * ast_sip_location_retrieve_first_aor_contact(const struct ast_sip_aor *aor)
Retrieve the first bound contact for an AOR.
Definition location.c:194
int ast_sip_transport_state_set_preferred_identity(const char *transport_name, const char *identity)
Sets the P-Preferred-Identity on a child transport.
unsigned int ast_sip_get_all_codecs_on_empty_reinvite(void)
Retrieve the system setting 'all_codecs_on_empty_reinvite'.
void ast_sip_location_prune_boot_contacts(void)
Prune the prune_on_boot contacts.
Definition location.c:470
ast_sip_100rel_mode
100rel modes for SIP endpoints
Definition res_pjsip.h:531
@ AST_SIP_100REL_PEER_SUPPORTED
Definition res_pjsip.h:537
@ AST_SIP_100REL_UNSUPPORTED
Definition res_pjsip.h:533
@ AST_SIP_100REL_SUPPORTED
Definition res_pjsip.h:535
@ AST_SIP_100REL_REQUIRED
Definition res_pjsip.h:539
struct ao2_container * ast_sip_location_retrieve_aor_contacts(const struct ast_sip_aor *aor)
Retrieve all contacts currently available for an AOR.
Definition location.c:247
ast_sip_direct_media_glare_mitigation
Definition res_pjsip.h:720
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE
Definition res_pjsip.h:722
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING
Definition res_pjsip.h:730
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING
Definition res_pjsip.h:726
pjsip_media_type pjsip_media_type_application_cpim_xpidf_xml
Definition res_pjsip.c:3913
void ast_sip_get_default_auth_algorithms_uas(char *default_auth_algorithms_uas, size_t size)
Retrieve the global auth algorithms for UAS.
struct ao2_container * ast_sip_location_retrieve_aor_contacts_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve all contacts currently available for an AOR and filter based on flags.
Definition location.c:252
pjsip_sip_uri * ast_sip_get_contact_sip_uri(pjsip_tx_data *tdata)
Return the SIP URI of the Contact header.
Definition res_pjsip.c:564
int ast_sip_location_delete_contact(struct ast_sip_contact *contact)
Delete a contact.
Definition location.c:451
int ast_sip_create_rdata_with_contact(pjsip_rx_data *rdata, char *packet, const char *src_name, int src_port, char *transport_type, const char *local_name, int local_port, const char *contact_uri)
General purpose method for creating an rdata structure using specific information.
Definition res_pjsip.c:1214
pjsip_media_type pjsip_media_type_multipart_related
Definition res_pjsip.c:3919
int ast_sip_failover_request(pjsip_tx_data *tdata)
Set a request to use the next value in the list of resolved addresses.
Definition res_pjsip.c:1816
void ast_sip_report_failed_acl(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, const char *name)
Send a security event notification for when an ACL check fails.
int ast_sip_location_add_contact_nolock(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, struct ast_sip_endpoint *endpoint)
Add a new contact to an AOR without locking the AOR.
Definition location.c:417
int ast_sip_transport_state_set_service_routes(const char *transport_name, struct ast_sip_service_route_vector *service_routes)
Sets the service routes on a child transport.
ast_sip_session_refresh_method
Definition res_pjsip.h:713
@ AST_SIP_SESSION_REFRESH_METHOD_UPDATE
Definition res_pjsip.h:717
@ AST_SIP_SESSION_REFRESH_METHOD_INVITE
Definition res_pjsip.h:715
void ast_sip_get_unidentified_request_thresholds(unsigned int *count, unsigned int *period, unsigned int *prune_interval)
Retrieve the unidentified request security event thresholds.
char * ast_sip_get_debug(void)
Retrieve the system debug setting (yes|no|host).
void ast_sip_modify_id_header(pj_pool_t *pool, pjsip_fromto_hdr *id_hdr, const struct ast_party_id *id)
Set name and number information on an identity header.
Definition res_pjsip.c:2850
static void challenge(const char *endpoint_id, struct ast_sip_auth *auth, pjsip_tx_data *tdata, const pjsip_rx_data *rdata, int is_stale, const pjsip_auth_algorithm *algorithm)
Send a WWW-Authenticate challenge.
#define SORCERY_OBJECT(details)
Macro which must be used at the beginning of each sorcery capable object.
Definition sorcery.h:356
#define AST_DECLARE_STRING_FIELDS(field_list)
Declare the fields needed in a structure.
#define AST_STRING_FIELD(name)
Declare a string field.
#define AST_STRING_FIELD_EXTENDED(name)
Declare an extended string field.
Generic container type.
Wrapper for an ast_acl linked list.
Definition acl.h:76
Definition dnsmgr.c:66
A snapshot of an endpoint's state.
Structure used to handle boolean flags.
Definition utils.h:217
Format capabilities structure, holds formats + preference order + etc.
Definition format_cap.c:54
internal representation of ACL entries In principle user applications would have no need for this,...
Definition acl.h:51
Information needed to identify an endpoint in a call.
Definition channel.h:340
DTLS configuration structure.
Definition rtp_engine.h:605
AMI variable container.
Definition res_pjsip.h:3200
const char * action_id
Definition res_pjsip.h:3206
struct mansession * s
Definition res_pjsip.h:3202
const struct message * m
Definition res_pjsip.h:3204
A SIP address of record.
Definition res_pjsip.h:478
unsigned int minimum_expiration
Definition res_pjsip.h:488
unsigned int remove_existing
Definition res_pjsip.h:500
double qualify_timeout
Definition res_pjsip.h:506
char * voicemail_extension
Definition res_pjsip.h:508
unsigned int max_contacts
Definition res_pjsip.h:498
int qualify_2xx_only
Definition res_pjsip.h:512
unsigned int support_path
Definition res_pjsip.h:504
struct ao2_container * permanent_contacts
Definition res_pjsip.h:502
unsigned int remove_unavailable
Definition res_pjsip.h:510
const ast_string_field outbound_proxy
Definition res_pjsip.h:486
unsigned int maximum_expiration
Definition res_pjsip.h:490
const ast_string_field mailboxes
Definition res_pjsip.h:486
unsigned int default_expiration
Definition res_pjsip.h:492
int authenticate_qualify
Definition res_pjsip.h:496
unsigned int qualify_frequency
Definition res_pjsip.h:494
pjsip_auth_algorithm_type algorithm_type
Definition res_pjsip.h:656
struct pjsip_auth_algorithm_type_vector supported_algorithms_uac
Definition res_pjsip.h:687
const ast_string_field oauth_clientid
Definition res_pjsip.h:681
const ast_string_field oauth_secret
Definition res_pjsip.h:681
const ast_string_field md5_creds
Definition res_pjsip.h:681
const ast_string_field realm
Definition res_pjsip.h:681
unsigned int nonce_lifetime
Definition res_pjsip.h:683
const ast_string_field auth_user
Definition res_pjsip.h:681
struct ast_sip_auth_password_digest * password_digests[PJSIP_AUTH_ALGORITHM_COUNT]
Definition res_pjsip.h:691
struct pjsip_auth_algorithm_type_vector supported_algorithms_uas
Definition res_pjsip.h:689
const ast_string_field refresh_token
Definition res_pjsip.h:681
const ast_string_field auth_pass
Definition res_pjsip.h:681
enum ast_sip_auth_type type
Definition res_pjsip.h:685
An interchangeable way of handling digest authentication for SIP.
Definition res_pjsip.h:1366
enum ast_sip_check_auth_result(* check_authentication)(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata)
Check that an incoming request passes authentication.
Definition res_pjsip.h:1381
int(* requires_authentication)(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Check if a request requires authentication See ast_sip_requires_authentication for more details.
Definition res_pjsip.h:1371
SIP body description.
Definition res_pjsip.h:2444
const char * type
Definition res_pjsip.h:2446
const char * body_text
Definition res_pjsip.h:2450
const char * subtype
Definition res_pjsip.h:2448
A contact's status.
Definition res_pjsip.h:451
const ast_string_field uri
Definition res_pjsip.h:457
enum ast_sip_contact_status_type status
Definition res_pjsip.h:468
enum ast_sip_contact_status_type last_status
Definition res_pjsip.h:470
const ast_string_field aor
Definition res_pjsip.h:457
struct ast_sip_security_mechanism_vector security_mechanisms
Definition res_pjsip.h:466
A wrapper for contact that adds the aor_id and a consistent contact id. Used by ast_sip_for_each_cont...
Definition res_pjsip.h:519
struct ast_sip_contact * contact
Definition res_pjsip.h:525
Contact associated with an address of record.
Definition res_pjsip.h:390
const ast_string_field uri
Definition res_pjsip.h:412
double qualify_timeout
Definition res_pjsip.h:420
struct ast_sip_endpoint * endpoint
Definition res_pjsip.h:422
const ast_string_field via_addr
Definition res_pjsip.h:412
const ast_string_field call_id
Definition res_pjsip.h:412
const ast_string_field aor
Definition res_pjsip.h:412
const ast_string_field outbound_proxy
Definition res_pjsip.h:412
struct timeval expiration_time
Definition res_pjsip.h:414
const ast_string_field path
Definition res_pjsip.h:412
const ast_string_field endpoint_name
Definition res_pjsip.h:412
int authenticate_qualify
Definition res_pjsip.h:418
const ast_string_field reg_server
Definition res_pjsip.h:412
const ast_string_field user_agent
Definition res_pjsip.h:412
unsigned int qualify_frequency
Definition res_pjsip.h:416
Direct media options for SIP endpoints.
Definition res_pjsip.h:964
enum ast_sip_direct_media_glare_mitigation glare_mitigation
Definition res_pjsip.h:970
enum ast_sip_session_refresh_method method
Definition res_pjsip.h:968
const ast_string_field domain
Definition res_pjsip.h:321
Endpoint configuration for SIP extensions.
Definition res_pjsip.h:805
struct ast_sip_timer_options timer
Definition res_pjsip.h:809
An entity responsible formatting endpoint information.
Definition res_pjsip.h:3226
struct ast_sip_endpoint_formatter * next
Definition res_pjsip.h:3232
int(* format_ami)(const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
Callback used to format endpoint information over AMI.
Definition res_pjsip.h:3230
Party identification options for endpoints.
Definition res_pjsip.h:859
enum ast_sip_session_refresh_method refresh_method
Definition res_pjsip.h:878
An entity responsible for identifying the source of a SIP message.
Definition res_pjsip.h:1409
Endpoint configuration options for INFO packages.
Definition res_pjsip.h:914
struct ast_sip_info_recording_configuration recording
Definition res_pjsip.h:916
Media configuration for SIP endpoints.
Definition res_pjsip.h:993
struct ast_sip_media_rtp_configuration rtp
Definition res_pjsip.h:1003
struct ast_stream_topology * topology
Definition res_pjsip.h:1011
struct ast_format_cap * codecs
Definition res_pjsip.h:1009
const ast_string_field sdpowner
Definition res_pjsip.h:1001
struct ast_stream_codec_negotiation_prefs codec_prefs_incoming_offer
Definition res_pjsip.h:1039
struct ast_stream_codec_negotiation_prefs codec_prefs_incoming_answer
Definition res_pjsip.h:1043
struct ast_sip_direct_media_configuration direct_media
Definition res_pjsip.h:1005
struct ast_stream_codec_negotiation_prefs codec_prefs_outgoing_offer
Definition res_pjsip.h:1041
struct ast_flags incoming_call_offer_pref
Definition res_pjsip.h:1035
struct ast_flags outgoing_call_offer_pref
Definition res_pjsip.h:1037
struct ast_sip_t38_configuration t38
Definition res_pjsip.h:1007
const ast_string_field sdpsession
Definition res_pjsip.h:1001
struct ast_stream_codec_negotiation_prefs codec_prefs_outgoing_answer
Definition res_pjsip.h:1045
NAT configuration options for endpoints.
Definition res_pjsip.h:847
Call pickup configuration options for endpoints.
Definition res_pjsip.h:886
struct ast_namedgroups * named_pickupgroups
Definition res_pjsip.h:894
struct ast_namedgroups * named_callgroups
Definition res_pjsip.h:892
Endpoint subscription configuration.
Definition res_pjsip.h:833
struct ast_sip_mwi_configuration mwi
Definition res_pjsip.h:839
An entity with which Asterisk communicates.
Definition res_pjsip.h:1051
struct ast_sip_auth_vector outbound_auths
Definition res_pjsip.h:1098
const ast_string_field language
Definition res_pjsip.h:1080
const ast_string_field zone
Definition res_pjsip.h:1080
enum ast_sip_endpoint_identifier_type ident_method
Definition res_pjsip.h:1102
struct ast_endpoint * persistent
Definition res_pjsip.h:1108
enum ast_sip_session_redirect redirect_method
Definition res_pjsip.h:1116
unsigned int faxdetect_timeout
Definition res_pjsip.h:1128
const ast_string_field incoming_mwi_mailbox
Definition res_pjsip.h:1080
const ast_string_field transport
Definition res_pjsip.h:1080
struct ast_sip_endpoint_id_configuration id
Definition res_pjsip.h:1090
const ast_string_field mohsuggest
Definition res_pjsip.h:1080
const ast_string_field aors
Definition res_pjsip.h:1080
const ast_string_field accountcode
Definition res_pjsip.h:1080
unsigned int send_aoc
Definition res_pjsip.h:1162
unsigned int moh_passthrough
Definition res_pjsip.h:1122
struct ast_sip_endpoint_pickup_configuration pickup
Definition res_pjsip.h:1094
enum ast_sip_security_negotiation security_negotiation
Definition res_pjsip.h:1146
unsigned int refer_blind_progress
Definition res_pjsip.h:1138
unsigned int preferred_codec_only
Definition res_pjsip.h:1132
struct ast_sip_identify_by_vector ident_method_order
Definition res_pjsip.h:1104
struct ast_sip_endpoint_extensions extensions
Definition res_pjsip.h:1082
struct ast_sip_auth_vector inbound_auths
Definition res_pjsip.h:1096
const ast_string_field context
Definition res_pjsip.h:1080
const ast_string_field message_context
Definition res_pjsip.h:1080
struct ast_sip_endpoint_media_configuration media
Definition res_pjsip.h:1084
int suppress_moh_on_sendonly
Definition res_pjsip.h:1166
const ast_string_field outbound_proxy
Definition res_pjsip.h:1080
unsigned int notify_early_inuse_ringing
Definition res_pjsip.h:1140
const ast_string_field fromdomain
Definition res_pjsip.h:1080
unsigned int stir_shaken
Definition res_pjsip.h:1150
const ast_string_field stir_shaken_profile
Definition res_pjsip.h:1080
unsigned int suppress_q850_reason_headers
Definition res_pjsip.h:1142
unsigned int ignore_183_without_sdp
Definition res_pjsip.h:1144
unsigned int allow_unauthenticated_options
Definition res_pjsip.h:1152
struct ast_acl_list * contact_acl
Definition res_pjsip.h:1126
unsigned int allow_overlap
Definition res_pjsip.h:1136
unsigned int usereqphone
Definition res_pjsip.h:1120
enum ast_sip_dtmf_mode dtmf
Definition res_pjsip.h:1100
struct ast_acl_list * acl
Definition res_pjsip.h:1124
const ast_string_field fromuser
Definition res_pjsip.h:1080
unsigned int inband_progress
Definition res_pjsip.h:1106
struct ast_sip_endpoint_subscription_configuration subscription
Definition res_pjsip.h:1086
struct ast_sip_endpoint_nat_configuration nat
Definition res_pjsip.h:1088
enum ast_sip_100rel_mode rel100
Definition res_pjsip.h:1160
unsigned int allowtransfer
Definition res_pjsip.h:1114
struct ast_sip_endpoint_info_configuration info
Definition res_pjsip.h:1092
unsigned int devicestate_busy_at
Definition res_pjsip.h:1110
unsigned int asymmetric_rtp_codec
Definition res_pjsip.h:1134
unsigned int faxdetect
Definition res_pjsip.h:1112
struct ast_sip_security_mechanism_vector security_mechanisms
Definition res_pjsip.h:1148
struct ast_variable * channel_vars
Definition res_pjsip.h:1118
Configuration for one-touch INFO recording.
Definition res_pjsip.h:900
const ast_string_field onfeature
Definition res_pjsip.h:906
const ast_string_field offfeature
Definition res_pjsip.h:906
RTP configuration for SIP endpoints.
Definition res_pjsip.h:922
struct ast_rtp_dtls_cfg dtls_cfg
DTLS-SRTP configuration information.
Definition res_pjsip.h:942
const ast_string_field engine
Definition res_pjsip.h:926
enum ast_sip_session_media_encryption encryption
Definition res_pjsip.h:946
unsigned int accept_multiple_sdp_answers
Definition res_pjsip.h:958
Endpoint configuration for unsolicited MWI.
Definition res_pjsip.h:815
const ast_string_field mailboxes
Definition res_pjsip.h:821
const ast_string_field fromuser
Definition res_pjsip.h:821
unsigned int subscribe_replaces_unsolicited
Definition res_pjsip.h:825
Structure for SIP nat hook information.
Definition res_pjsip.h:327
void(* outgoing_external_message)(struct pjsip_tx_data *tdata, struct ast_sip_transport *transport)
Definition res_pjsip.h:331
an interchangeable way of responding to authentication challenges
Definition res_pjsip.h:1391
int(* create_request_with_auth)(const struct ast_sip_auth_vector *auths, struct pjsip_rx_data *challenge, struct pjsip_tx_data *old_request, struct pjsip_tx_data **new_request)
Create a new request with authentication credentials.
Definition res_pjsip.h:1402
Structure which contains information about a transport.
Definition res_pjsip.h:335
int local_port
Local port for transport.
Definition res_pjsip.h:345
pjsip_transport * transport
Potential pointer to the transport itself, if UDP.
Definition res_pjsip.h:339
enum ast_transport type
Type of transport.
Definition res_pjsip.h:337
pjsip_tpfactory * factory
Potential pointer to the transport factory itself, if TCP/TLS.
Definition res_pjsip.h:341
pj_str_t local_address
Local address for transport.
Definition res_pjsip.h:343
struct timeval last_start
struct timeval when_queued
struct timeval last_end
enum ast_sip_scheduler_task_flags flags
Structure representing a security mechanism as defined in RFC 3329.
Definition res_pjsip.h:376
struct ast_vector_string mechanism_parameters
Definition res_pjsip.h:382
enum ast_sip_security_mechanism_type type
Definition res_pjsip.h:378
A supplement to SIP message processing.
Definition res_pjsip.h:3351
void(* outgoing_request)(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact, struct pjsip_tx_data *tdata)
Called on an outgoing SIP request This method is always called from a SIP servant thread.
Definition res_pjsip.h:3394
int(* incoming_request)(struct ast_sip_endpoint *endpoint, struct pjsip_rx_data *rdata)
Called on incoming SIP request This method can indicate a failure in processing in its return....
Definition res_pjsip.h:3373
void(* outgoing_response)(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact, struct pjsip_tx_data *tdata)
Called on an outgoing SIP response This method is always called from a SIP servant thread.
Definition res_pjsip.h:3399
void(* incoming_response)(struct ast_sip_endpoint *endpoint, struct pjsip_rx_data *rdata)
Called on an incoming SIP response This method is always called from a SIP servant thread.
Definition res_pjsip.h:3389
const char * method
Definition res_pjsip.h:3353
enum ast_sip_supplement_priority priority
Definition res_pjsip.h:3355
struct ast_sip_supplement * next
Definition res_pjsip.h:3401
unsigned int bind_udptl_to_media_address
Definition res_pjsip.h:987
enum ast_t38_ec_modes error_correction
Definition res_pjsip.h:979
Session timers options.
Definition res_pjsip.h:792
unsigned int sess_expires
Definition res_pjsip.h:796
unsigned int min_se
Definition res_pjsip.h:794
struct ast_sip_tpmgr_state_callback::@276 node
pjsip_tp_state_callback cb
Definition res_pjsip.h:4259
Structure for SIP transport information.
Definition res_pjsip.h:117
struct pjsip_tpfactory * factory
Transport factory.
Definition res_pjsip.h:121
pjsip_tls_setting tls
Definition res_pjsip.h:141
struct ast_dnsmgr_entry * external_media_address_refresher
Definition res_pjsip.h:169
enum ast_transport type
Definition res_pjsip.h:131
struct ast_sip_service_route_vector * service_routes
Definition res_pjsip.h:189
struct pjsip_transport * transport
Transport itself.
Definition res_pjsip.h:119
struct ast_ha * localnet
Definition res_pjsip.h:154
struct ast_dnsmgr_entry * external_signaling_address_refresher
Definition res_pjsip.h:159
pj_ssl_cipher ciphers[SIP_TLS_MAX_CIPHERS]
Definition res_pjsip.h:146
struct ast_sockaddr external_signaling_address
Definition res_pjsip.h:164
struct ast_sockaddr external_media_address
Definition res_pjsip.h:174
Transport to bind to.
Definition res_pjsip.h:219
unsigned int tos
Definition res_pjsip.h:289
pjsip_tls_setting tls
Definition res_pjsip.h:257
struct ast_sockaddr external_address
Definition res_pjsip.h:281
const ast_string_field privkey_file
Definition res_pjsip.h:239
const ast_string_field ca_list_path
Definition res_pjsip.h:239
const ast_string_field domain
Definition res_pjsip.h:239
enum ast_transport type
Definition res_pjsip.h:241
const ast_string_field cert_file
Definition res_pjsip.h:239
const ast_string_field password
Definition res_pjsip.h:239
int tcp_keepalive_probe_count
Definition res_pjsip.h:307
const ast_string_field external_signaling_address
Definition res_pjsip.h:239
const ast_string_field ca_list_file
Definition res_pjsip.h:239
unsigned int external_signaling_port
Definition res_pjsip.h:251
struct ast_sip_transport_state * state
Definition res_pjsip.h:287
struct ast_ha * localnet
Definition res_pjsip.h:269
unsigned int async_operations
Definition res_pjsip.h:249
pj_sockaddr host
Definition res_pjsip.h:247
pj_ssl_cipher ciphers[SIP_TLS_MAX_CIPHERS]
Definition res_pjsip.h:263
const ast_string_field external_media_address
Definition res_pjsip.h:239
int tcp_keepalive_interval_time
Definition res_pjsip.h:305
struct ast_dnsmgr_entry * external_address_refresher
Definition res_pjsip.h:275
int tcp_keepalive_idle_time
Definition res_pjsip.h:303
unsigned int cos
Definition res_pjsip.h:291
Socket address structure.
Definition netsock2.h:97
Full structure for sorcery.
Definition sorcery.c:231
Support for dynamic strings.
Definition strings.h:623
A ast_taskprocessor structure is a singleton by name.
An opaque threadpool structure.
Definition threadpool.c:36
Structure for variables, used for configurations and for channel variables.
String vector definitions.
Definition vector.h:55
In case you didn't read that giant block of text above the mansession_session struct,...
Definition manager.c:323
const char * openssl_name
Definition res_pjsip.h:620
pjsip_auth_algorithm_type algorithm_type
Definition res_pjsip.h:618
unsigned digest_str_length
Definition res_pjsip.h:622
userdata associated with baseline taskprocessor test
int value
Definition syslog.c:37
static struct test_val b
static struct test_val a
ast_t38_ec_modes
Definition udptl.h:37
FILE * out
Definition utils/frame.c:33
#define AST_VECTOR(name, type)
Define a vector structure.
Definition vector.h:44

◆ ast_sip_mod_data_get

#define ast_sip_mod_data_get (   mod_data,
  id,
  key 
)     ast_sip_dict_get(mod_data[id], key)

Using the dictionary stored in mod_data array at a given id, retrieve the value associated with the given key.

Parameters
mod_dataa module data array
idthe mod_data array index
keythe key to find
Return values
thevalue associated with the key, NULL otherwise.

Definition at line 3067 of file res_pjsip.h.

◆ ast_sip_mod_data_set

#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)

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.

Parameters
poola memory allocation pool
mod_dataa module data array
idthe mod_data array index
keythe key to find
valthe value to associate with a key

Definition at line 3099 of file res_pjsip.h.

◆ ast_sip_transport_is_local

#define ast_sip_transport_is_local (   transport_state,
  addr 
)     (transport_state->localnet && ast_apply_ha(transport_state->localnet, addr) != AST_SENSE_ALLOW)

Definition at line 213 of file res_pjsip.h.

◆ ast_sip_transport_is_nonlocal

#define ast_sip_transport_is_nonlocal (   transport_state,
  addr 
)     (!transport_state->localnet || ast_apply_ha(transport_state->localnet, addr) == AST_SENSE_ALLOW)

Definition at line 210 of file res_pjsip.h.

◆ AST_SIP_USER_OPTIONS_TRUNCATE_CHECK

#define AST_SIP_USER_OPTIONS_TRUNCATE_CHECK (   str)

Truncate the URI user field options string if enabled.

Since
13.12.0
Parameters
strURI user field string to truncate if enabled

We need to be able to handle URI's looking like "sip:1235557890;phone-context=national@x.x.x.x;user=phone"

Where the URI user field is: "1235557890;phone-context=national"

When truncated the string will become: "1235557890"

Definition at line 3504 of file res_pjsip.h.

3505 { \
3506 char *__semi = strchr((str), ';'); \
3507 if (__semi && ast_sip_get_ignore_uri_user_options()) { \
3508 *__semi = '\0'; \
3509 } \
3510 } while (0)

◆ AST_SIP_X_AST_TXP

#define AST_SIP_X_AST_TXP   "x-ast-txp"

URI parameter for symmetric transport

Definition at line 1170 of file res_pjsip.h.

◆ AST_SIP_X_AST_TXP_LEN

#define AST_SIP_X_AST_TXP_LEN   9

Definition at line 1171 of file res_pjsip.h.

◆ COLON_PORT_STRLEN

#define COLON_PORT_STRLEN   6

Definition at line 78 of file res_pjsip.h.

◆ IP6ADDR_COLON_PORT_BUFLEN

#define IP6ADDR_COLON_PORT_BUFLEN   (PJ_INET6_ADDRSTRLEN + COLON_PORT_STRLEN)

Definition at line 83 of file res_pjsip.h.

◆ MAX_RX_CHALLENGES

#define MAX_RX_CHALLENGES   10

Maximum number of challenges before assuming that we are in a loop

Definition at line 108 of file res_pjsip.h.

◆ PJSIP_EXPIRES_NOT_SPECIFIED

#define PJSIP_EXPIRES_NOT_SPECIFIED   ((pj_uint32_t)-1)

Definition at line 68 of file res_pjsip.h.

◆ PJSIP_MINVERSION

#define PJSIP_MINVERSION (   m,
  n,
 
)    (((m << 24) | (n << 16) | (p << 8)) >= PJ_VERSION_NUM)

Definition at line 59 of file res_pjsip.h.

◆ PJSTR_PRINTF_SPEC

#define PJSTR_PRINTF_SPEC   "%.*s"

Definition at line 71 of file res_pjsip.h.

◆ PJSTR_PRINTF_VAR

#define PJSTR_PRINTF_VAR (   _v)    ((int)(_v).slen), ((_v).ptr)

Definition at line 72 of file res_pjsip.h.

◆ SIP_SORCERY_AUTH_TYPE

#define SIP_SORCERY_AUTH_TYPE   "auth"

Definition at line 597 of file res_pjsip.h.

◆ SIP_SORCERY_DOMAIN_ALIAS_TYPE

#define SIP_SORCERY_DOMAIN_ALIAS_TYPE   "domain_alias"

Definition at line 310 of file res_pjsip.h.

◆ SIP_TLS_MAX_CIPHERS

#define SIP_TLS_MAX_CIPHERS   64

Maximum number of ciphers supported for a TLS transport.

Definition at line 105 of file res_pjsip.h.

Typedef Documentation

◆ ast_sip_dialog_outbound_auth_cb

typedef int(* ast_sip_dialog_outbound_auth_cb) (pjsip_dialog *dlg, pjsip_tx_data *tdata, void *user_data)

Callback called when an outbound request with authentication credentials is to be sent in dialog.

This callback will have the created request on it. The callback's purpose is to do any extra housekeeping that needs to be done as well as to send the request out.

This callback is only necessary if working with a PJSIP API that sits between the application and the dialog layer.

Parameters
dlgThe dialog to which the request belongs
tdataThe created request to be sent out
user_dataData supplied with the callback
Return values
0Success
-1Failure

Definition at line 1884 of file res_pjsip.h.

◆ ast_transport_monitor_data_matcher

typedef int(* ast_transport_monitor_data_matcher) (void *a, void *b)

Transport shutdown monitor data matcher.

Since
13.20.0
Parameters
aUser data to compare.
bUser data to compare.
Return values
1The data objects match
0The data objects don't match

Definition at line 4102 of file res_pjsip.h.

◆ ast_transport_monitor_shutdown_cb

typedef void(* ast_transport_monitor_shutdown_cb) (void *data)

Transport shutdown monitor callback.

Since
13.18.0
Parameters
dataUser data to know what to do when transport shuts down.
Note
The callback does not need to care that data is an ao2 object.

Definition at line 4090 of file res_pjsip.h.

◆ pjsip_auth_algorithm

◆ pjsip_auth_algorithm_type

Enumeration Type Documentation

◆ ast_sip_100rel_mode

100rel modes for SIP endpoints

Enumerator
AST_SIP_100REL_UNSUPPORTED 

Do not support 100rel. (no)

AST_SIP_100REL_SUPPORTED 

As UAC, indicate 100rel support in Supported header. (yes)

AST_SIP_100REL_PEER_SUPPORTED 

As UAS, send 1xx responses reliably, if the UAC indicated its support. Otherwise same as AST_SIP_100REL_SUPPORTED. (peer_supported)

AST_SIP_100REL_REQUIRED 

Require the use of 100rel. (required)

Definition at line 531 of file res_pjsip.h.

531 {
532 /*! Do not support 100rel. (no) */
534 /*! As UAC, indicate 100rel support in Supported header. (yes) */
536 /*! As UAS, send 1xx responses reliably, if the UAC indicated its support. Otherwise same as AST_SIP_100REL_SUPPORTED. (peer_supported) */
538 /*! Require the use of 100rel. (required) */
540};

◆ ast_sip_auth_cred_usage

Enumerator
AST_SIP_AUTH_CRED_USAGE_UAC 

The credentials used as a UAC

AST_SIP_AUTH_CRED_USAGE_UAS 

The credentials used as a UAS

Definition at line 590 of file res_pjsip.h.

590 {
591 /*! The credentials used as a UAC */
593 /*! The credentials used as a UAS */
595};

◆ ast_sip_auth_type

Authentication methods.

The meaning of this type has changed. It used to indicate how the credentials were stored, but now it indicates which authentication method will be used... Google Oauth, Artificial (fake auth) or Digest. The USER_PASS and MD5 types are still used for backwards compatibility but will map to DIGEST.

Enumerator
AST_SIP_AUTH_TYPE_NONE 
AST_SIP_AUTH_TYPE_USER_PASS 

Credentials stored as a username and password combination

Deprecated:
Now automatically determined
AST_SIP_AUTH_TYPE_MD5 

Credentials stored as an MD5 sum

Deprecated:
Use AST_SIP_AUTH_TYPE_DIGEST instead
AST_SIP_AUTH_TYPE_GOOGLE_OAUTH 

Google Oauth

AST_SIP_AUTH_TYPE_ARTIFICIAL 

Credentials not stored this is a fake auth

AST_SIP_AUTH_TYPE_DIGEST 

Digest method will be used

Definition at line 570 of file res_pjsip.h.

570 {
572 /*!
573 * Credentials stored as a username and password combination
574 * \deprecated Now automatically determined
575 */
577 /*!
578 * Credentials stored as an MD5 sum
579 * \deprecated Use AST_SIP_AUTH_TYPE_DIGEST instead
580 */
582 /*! Google Oauth */
584 /*! Credentials not stored this is a fake auth */
586 /*! Digest method will be used */
588};

◆ ast_sip_call_codec_pref

Incoming/Outgoing call offer/answer joint codec preference.

The default is INTERSECT ALL LOCAL.

Enumerator
AST_SIP_CALL_CODEC_PREF_INTERSECT 

Two bits for merge

Intersection of local and remote

AST_SIP_CALL_CODEC_PREF_UNION 

Union of local and remote

AST_SIP_CALL_CODEC_PREF_ALL 

Two bits for filter

No filter

AST_SIP_CALL_CODEC_PREF_FIRST 

Only the first

AST_SIP_CALL_CODEC_PREF_LOCAL 

Two bits for preference and sort

Prefer, and order by local values

AST_SIP_CALL_CODEC_PREF_REMOTE 

Prefer, and order by remote values

Definition at line 758 of file res_pjsip.h.

758 {
759 /*! Two bits for merge */
760 /*! Intersection of local and remote */
762 /*! Union of local and remote */
764
765 /*! Two bits for filter */
766 /*! No filter */
768 /*! Only the first */
770
771 /*! Two bits for preference and sort */
772 /*! Prefer, and order by local values */
774 /*! Prefer, and order by remote values */
776};

◆ ast_sip_check_auth_result

Possible returns from ast_sip_check_authentication.

Enumerator
AST_SIP_AUTHENTICATION_CHALLENGE 

Authentication needs to be challenged

AST_SIP_AUTHENTICATION_SUCCESS 

Authentication succeeded

AST_SIP_AUTHENTICATION_FAILED 

Authentication failed

AST_SIP_AUTHENTICATION_ERROR 

Authentication encountered some internal error

Definition at line 1321 of file res_pjsip.h.

1321 {
1322 /*! Authentication needs to be challenged */
1324 /*! Authentication succeeded */
1326 /*! Authentication failed */
1328 /*! Authentication encountered some internal error */
1330};

◆ ast_sip_contact_filter

Contact retrieval filtering flags.

Enumerator
AST_SIP_CONTACT_FILTER_DEFAULT 

Default filter flags.

AST_SIP_CONTACT_FILTER_REACHABLE 

Return only reachable or unknown contacts.

Definition at line 1420 of file res_pjsip.h.

1420 {
1421 /*! \brief Default filter flags */
1423
1424 /*! \brief Return only reachable or unknown contacts */
1426};

◆ ast_sip_contact_status_type

Status type for a contact.

Enumerator
UNAVAILABLE 

Frequency > 0, but no response from remote uri

AVAILABLE 

Frequency > 0, and got response from remote uri

UNKNOWN 

Default last status, and when a contact status object is not found

CREATED 

Frequency == 0, has a contact, but don't know status (non-qualified)

REMOVED 

Definition at line 434 of file res_pjsip.h.

434 {
435 /*! Frequency > 0, but no response from remote uri */
437 /*! Frequency > 0, and got response from remote uri */
438 AVAILABLE,
439 /*! Default last status, and when a contact status object is not found */
440 UNKNOWN,
441 /*! Frequency == 0, has a contact, but don't know status (non-qualified) */
442 CREATED,
443 REMOVED,
444};

◆ ast_sip_direct_media_glare_mitigation

Enumerator
AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE 

Take no special action to mitigate reinvite glare

AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING 

Do not send an initial direct media session refresh on outgoing call legs Subsequent session refreshes will be sent no matter the session direction

AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING 

Do not send an initial direct media session refresh on incoming call legs Subsequent session refreshes will be sent no matter the session direction

Definition at line 720 of file res_pjsip.h.

720 {
721 /*! Take no special action to mitigate reinvite glare */
723 /*! Do not send an initial direct media session refresh on outgoing call legs
724 * Subsequent session refreshes will be sent no matter the session direction
725 */
727 /*! Do not send an initial direct media session refresh on incoming call legs
728 * Subsequent session refreshes will be sent no matter the session direction
729 */
731};

◆ ast_sip_dtmf_mode

DTMF modes for SIP endpoints.

Enumerator
AST_SIP_DTMF_NONE 

No DTMF to be used

AST_SIP_DTMF_RFC_4733 

Use RFC 4733 events for DTMF

AST_SIP_DTMF_INBAND 

Use DTMF in the audio stream

AST_SIP_DTMF_INFO 

Use SIP INFO DTMF (blech)

AST_SIP_DTMF_AUTO 

Use SIP 4733 if supported by the other side or INBAND if not

AST_SIP_DTMF_AUTO_INFO 

Use SIP 4733 if supported by the other side or INFO DTMF (blech) if not

Definition at line 545 of file res_pjsip.h.

545 {
546 /*! No DTMF to be used */
548 /* XXX Should this be 2833 instead? */
549 /*! Use RFC 4733 events for DTMF */
551 /*! Use DTMF in the audio stream */
553 /*! Use SIP INFO DTMF (blech) */
555 /*! Use SIP 4733 if supported by the other side or INBAND if not */
557 /*! Use SIP 4733 if supported by the other side or INFO DTMF (blech) if not */
559};

◆ ast_sip_endpoint_identifier_type

Different methods by which incoming requests can be matched to endpoints.

Enumerator
AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME 

Identify based on user name in From header

AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME 

Identify based on user name in Auth header first, then From header

AST_SIP_ENDPOINT_IDENTIFY_BY_IP 

Identify based on source IP address

AST_SIP_ENDPOINT_IDENTIFY_BY_HEADER 

Identify based on arbitrary headers

AST_SIP_ENDPOINT_IDENTIFY_BY_REQUEST_URI 

Identify based on request uri

Definition at line 699 of file res_pjsip.h.

699 {
700 /*! Identify based on user name in From header */
702 /*! Identify based on user name in Auth header first, then From header */
704 /*! Identify based on source IP address */
706 /*! Identify based on arbitrary headers */
708 /*! Identify based on request uri */
710};

◆ ast_sip_security_mechanism_type

The security mechanism type.

Enumerator
AST_SIP_SECURITY_MECH_NONE 
AST_SIP_SECURITY_MECH_MSRP_TLS 
AST_SIP_SECURITY_MECH_SDES_SRTP 
AST_SIP_SECURITY_MECH_DTLS_SRTP 

Definition at line 362 of file res_pjsip.h.

362 {
364 /* Use msrp-tls as security mechanism */
366 /* Use sdes-srtp as security mechanism */
368 /* Use dtls-srtp as security mechanism */
370 /* Add RFC 3329 (sec-agree) mechanisms like tle, digest, ipsec-ike in the future */
371};

◆ ast_sip_security_negotiation

The kind of security negotiation.

Enumerator
AST_SIP_SECURITY_NEG_NONE 

No security mechanism negotiation

AST_SIP_SECURITY_NEG_MEDIASEC 

Use mediasec security mechanism negotiation

Definition at line 351 of file res_pjsip.h.

351 {
352 /*! No security mechanism negotiation */
354 /*! Use mediasec security mechanism negotiation */
356 /* Add RFC 3329 (sec-agree) mechanism negotiation in the future */
357};

◆ ast_sip_session_media_encryption

Enumerator
AST_SIP_MEDIA_TRANSPORT_INVALID 

Invalid media encryption configuration

AST_SIP_MEDIA_ENCRYPT_NONE 

Do not allow any encryption of session media

AST_SIP_MEDIA_ENCRYPT_SDES 

Offer SDES-encrypted session media

AST_SIP_MEDIA_ENCRYPT_DTLS 

Offer encrypted session media with datagram TLS key exchange

Definition at line 733 of file res_pjsip.h.

733 {
734 /*! Invalid media encryption configuration */
736 /*! Do not allow any encryption of session media */
738 /*! Offer SDES-encrypted session media */
740 /*! Offer encrypted session media with datagram TLS key exchange */
742};

◆ ast_sip_session_redirect

Enumerator
AST_SIP_REDIRECT_USER 

User portion of the target URI should be used as the target in the dialplan

AST_SIP_REDIRECT_URI_CORE 

Target URI should be used as the target in the dialplan

AST_SIP_REDIRECT_URI_PJSIP 

Target URI should be used as the target within chan_pjsip itself

Definition at line 744 of file res_pjsip.h.

744 {
745 /*! User portion of the target URI should be used as the target in the dialplan */
747 /*! Target URI should be used as the target in the dialplan */
749 /*! Target URI should be used as the target within chan_pjsip itself */
751};

◆ ast_sip_session_refresh_method

Enumerator
AST_SIP_SESSION_REFRESH_METHOD_INVITE 

Use reinvite to negotiate direct media

AST_SIP_SESSION_REFRESH_METHOD_UPDATE 

Use UPDATE to negotiate direct media

Definition at line 713 of file res_pjsip.h.

713 {
714 /*! Use reinvite to negotiate direct media */
716 /*! Use UPDATE to negotiate direct media */
718};

◆ ast_sip_supplement_priority

Enumerator
AST_SIP_SUPPLEMENT_PRIORITY_FIRST 

Top priority. Supplements with this priority are those that need to run before any others

AST_SIP_SUPPLEMENT_PRIORITY_CHANNEL 

Channel creation priority. chan_pjsip creates a channel at this priority. If your supplement depends on being run before or after channel creation, then set your priority to be lower or higher than this value.

AST_SIP_SUPPLEMENT_PRIORITY_LAST 

Lowest priority. Supplements with this priority should be run after all other supplements

Definition at line 3332 of file res_pjsip.h.

3332 {
3333 /*! Top priority. Supplements with this priority are those that need to run before any others */
3335 /*! Channel creation priority.
3336 * chan_pjsip creates a channel at this priority. If your supplement depends on being run before
3337 * or after channel creation, then set your priority to be lower or higher than this value.
3338 */
3340 /*! Lowest priority. Supplements with this priority should be run after all other supplements */
3342};

◆ ast_transport_monitor_reg

Enumerator
AST_TRANSPORT_MONITOR_REG_SUCCESS 

Successfully registered the transport monitor.

AST_TRANSPORT_MONITOR_REG_REPLACED 

Replaced the already existing transport monitor with new one.

AST_TRANSPORT_MONITOR_REG_NOT_FOUND 

Transport not found to monitor.

Note
Transport is either already shutdown or is not reliable.
AST_TRANSPORT_MONITOR_REG_FAILED 

Error while registering transport monitor.

Definition at line 4104 of file res_pjsip.h.

4104 {
4105 /*! \brief Successfully registered the transport monitor */
4107 /*! \brief Replaced the already existing transport monitor with new one. */
4109 /*!
4110 * \brief Transport not found to monitor.
4111 * \note Transport is either already shutdown or is not reliable.
4112 */
4114 /*! \brief Error while registering transport monitor. */
4116};

◆ pjsip_auth_algorithm_type

Enumerator
PJSIP_AUTH_ALGORITHM_NOT_SET 
PJSIP_AUTH_ALGORITHM_MD5 
PJSIP_AUTH_ALGORITHM_SHA256 
PJSIP_AUTH_ALGORITHM_SHA512_256 
PJSIP_AUTH_ALGORITHM_AKAV1_MD5 
PJSIP_AUTH_ALGORITHM_COUNT 

Definition at line 606 of file res_pjsip.h.

Function Documentation

◆ ast_copy_pj_str()

void ast_copy_pj_str ( char *  dest,
const pj_str_t *  src,
size_t  size 
)

Copy a pj_str_t into a standard character buffer.

pj_str_t is not NULL-terminated. Any place that expects a NULL- terminated string needs to have the pj_str_t copied into a separate buffer.

This method copies the pj_str_t contents into the destination buffer and NULL-terminates the buffer.

Parameters
destThe destination buffer
srcThe pj_str_t to copy
sizeThe size of the destination buffer.

Definition at line 2201 of file res_pjsip.c.

2202{
2203 size_t chars_to_copy = MIN(size - 1, pj_strlen(src));
2204 memcpy(dest, pj_strbuf(src), chars_to_copy);
2205 dest[chars_to_copy] = '\0';
2206}
#define MIN(a, b)
Definition utils.h:249

References MIN.

Referenced by apply_dtls_attrib(), apply_negotiated_sdp_stream(), apply_negotiated_sdp_stream(), assign_uuid(), ast_sip_get_transport_name(), ast_sip_header_to_security_mechanism(), ast_sip_report_auth_challenge_sent(), ast_sip_report_auth_failed_challenge_response(), chan_pjsip_get_uniqueid(), change_outgoing_sdp_stream_media_address(), change_outgoing_sdp_stream_media_address(), channel_read_pjsip(), cli_complete_subscription_common(), cli_list_subscriptions_detail(), cli_show_subscriptions_detail(), copy_string(), determine_sip_publish_type(), dialog_info_generate_body_content(), endpoint_lookup(), evaluate_like(), extract_contact_addr(), extract_contact_addr(), extract_oli(), find_aor2(), find_aor_name(), find_authorization(), get_auth_header(), get_codecs(), get_dest_tn(), get_destination(), get_endpoint_details(), get_from_header(), get_mid_bundle_group(), get_user_agent(), handle_incoming_request(), handle_incoming_sdp(), handle_negotiated_sdp_session_media(), handle_registration_response(), headers_to_vars(), incoming_in_dialog_request(), log_failed_request(), negotiate_incoming_sdp_stream(), negotiate_incoming_sdp_stream(), options_on_rx_request(), parse_uri_cb(), process_extmap_attributes(), process_ice_attributes(), process_ice_auth_attrb(), process_ssrc_attributes(), publish_request_initial(), pubsub_on_rx_publish_request(), pubsub_on_rx_subscribe_request(), refer_blind_callback(), refer_incoming_ari_request(), refer_incoming_blind_request(), refer_incoming_refer_request(), register_aor_core(), rfc3326_use_reason_header(), rfc3329_incoming_response(), rx_data_to_ast_msg(), save_response_fields_to_transport(), sdp_requires_deferral(), security_event_populate(), session_inv_on_redirected(), session_outgoing_nat_hook(), set_id_from_hdr(), set_mid_and_bundle_group(), set_redirecting_value(), set_remote_mslabel_and_stream_group(), set_sipdomain_variable(), sip_subscription_to_ami(), sub_persistence_recreate(), subscription_get_generator_from_rdata(), subscription_get_handler_from_rdata(), subscription_persistence_create(), subscription_persistence_update(), and transfer_refer().

◆ ast_copy_pj_str2()

int ast_copy_pj_str2 ( char **  dest,
const pj_str_t *  src 
)

Create and copy a pj_str_t into a standard character buffer.

pj_str_t is not NULL-terminated. Any place that expects a NULL- terminated string needs to have the pj_str_t copied into a separate buffer.

Copies the pj_str_t contents into a newly allocated buffer pointed to by dest. NULL-terminates the buffer.

Note
Caller is responsible for freeing the allocated memory.
Parameters
[out]destThe destination buffer
srcThe pj_str_t to copy
Returns
Number of characters copied or negative value on error

Definition at line 2208 of file res_pjsip.c.

2209{
2210 int res = ast_asprintf(dest, "%.*s", (int)pj_strlen(src), pj_strbuf(src));
2211
2212 if (res < 0) {
2213 *dest = NULL;
2214 }
2215
2216 return res;
2217}
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition astmm.h:267
#define NULL
Definition resample.c:96

References ast_asprintf, and NULL.

◆ ast_pjsip_rdata_get_endpoint()

struct ast_sip_endpoint * ast_pjsip_rdata_get_endpoint ( pjsip_rx_data *  rdata)

Get the looked-up endpoint on an out-of dialog request or response.

The function may ONLY be called on out-of-dialog requests or responses. For in-dialog requests and responses, it is required that the user of the dialog has the looked-up endpoint stored locally.

This function should never return NULL if the message is out-of-dialog. It will always return NULL if the message is in-dialog.

This function will increase the reference count of the returned endpoint by one. Release your reference using the ao2_ref function when finished.

Parameters
rdataOut-of-dialog request or response
Returns
The looked up endpoint

Definition at line 981 of file pjsip_distributor.c.

982{
983 struct ast_sip_endpoint *endpoint = rdata->endpt_info.mod_data[endpoint_mod.id];
984 if (endpoint) {
985 ao2_ref(endpoint, +1);
986 }
987 return endpoint;
988}
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
static pjsip_module endpoint_mod

References ao2_ref, and endpoint_mod.

Referenced by authenticate(), handle_new_invite_request(), nat_on_rx_message(), options_on_rx_request(), pubsub_on_rx_mwi_notify_request(), pubsub_on_rx_publish_request(), pubsub_on_rx_refresh(), pubsub_on_rx_subscribe_request(), registrar_on_rx_request(), rx_data_to_ast_msg(), send_options_response(), send_response(), and supplement_on_rx_request().

◆ ast_sip_add_body()

int ast_sip_add_body ( pjsip_tx_data *  tdata,
const struct ast_sip_body body 
)

Add a body to an outbound SIP message.

If this is called multiple times, the latest body will replace the current body.

Parameters
tdataThe message to add the body to
bodyThe message body to add
Return values
0Success
-1Failure

Definition at line 2052 of file res_pjsip.c.

2053{
2054 pjsip_msg_body *pjsip_body = ast_body_to_pjsip_body(tdata->pool, body);
2055 tdata->msg->body = pjsip_body;
2056 return 0;
2057}
static pjsip_msg_body * ast_body_to_pjsip_body(pj_pool_t *pool, const struct ast_sip_body *body)
Definition res_pjsip.c:2039

References ast_body_to_pjsip_body().

Referenced by aoc_bye_outgoing_request(), aoc_bye_outgoing_response(), aoc_send_as_xml(), build_notify_body(), msg_send(), send_unsolicited_mwi_notify_to_contact(), sendtext(), sip_publisher_service_queue(), transmit_info_dtmf(), and transmit_info_with_vidupdate().

◆ ast_sip_add_body_multipart()

int ast_sip_add_body_multipart ( pjsip_tx_data *  tdata,
const struct ast_sip_body bodies[],
int  num_bodies 
)

Add a multipart body to an outbound SIP message.

This will treat each part of the input vector as part of a multipart body and add each part to the SIP message.

Parameters
tdataThe message to add the body to
bodiesThe message bodies to add
num_bodiesThe parts of the body to add
Return values
0Success
-1Failure

Definition at line 2059 of file res_pjsip.c.

2060{
2061 int i;
2062 /* NULL for type and subtype automatically creates "multipart/mixed" */
2063 pjsip_msg_body *body = pjsip_multipart_create(tdata->pool, NULL, NULL);
2064
2065 for (i = 0; i < num_bodies; ++i) {
2066 pjsip_multipart_part *part = pjsip_multipart_create_part(tdata->pool);
2067 part->body = ast_body_to_pjsip_body(tdata->pool, bodies[i]);
2068 pjsip_multipart_add_part(tdata->pool, body, part);
2069 }
2070
2071 tdata->msg->body = body;
2072 return 0;
2073}

References ast_body_to_pjsip_body(), and NULL.

◆ ast_sip_add_date_header()

void ast_sip_add_date_header ( pjsip_tx_data *  tdata)

Adds a Date header to the tdata, formatted like: Date: Wed, 01 Jan 2021 14:53:01 GMT.

Since
16.19.0
Note
There is no checking done to see if the header already exists before adding it. It's up to the caller of this function to determine if that needs to be done or not.

Definition at line 90 of file res_pjsip.c.

91{
92 char date[256];
93 struct tm tm;
94 time_t t = time(NULL);
95
96 gmtime_r(&t, &tm);
97 strftime(date, sizeof(date), "%a, %d %b %Y %T GMT", &tm);
98
99 ast_sip_add_header(tdata, "Date", date);
100}
int ast_sip_add_header(pjsip_tx_data *tdata, const char *name, const char *value)
Add a header to an outbound SIP message.
Definition res_pjsip.c:2008

References ast_sip_add_header(), and NULL.

Referenced by add_date_header(), and register_aor_core().

◆ ast_sip_add_global_request_header()

int ast_sip_add_global_request_header ( const char *  name,
const char *  value,
int  replace 
)

Definition at line 153 of file pjsip_global_headers.c.

154{
156}
static int add_header(struct header_list *headers, const char *name, const char *value, int replace)
static struct header_list request_headers

References add_header(), name, replace(), request_headers, and value.

Referenced by global_apply().

◆ ast_sip_add_global_response_header()

int ast_sip_add_global_response_header ( const char *  name,
const char *  value,
int  replace 
)

Definition at line 158 of file pjsip_global_headers.c.

159{
161}
static struct header_list response_headers

References add_header(), name, replace(), response_headers, and value.

Referenced by global_apply().

◆ ast_sip_add_header()

int ast_sip_add_header ( pjsip_tx_data *  tdata,
const char *  name,
const char *  value 
)

Add a header to an outbound SIP message.

Parameters
tdataThe message to add the header to
nameThe header name
valueThe header value
Return values
0Success
-1Failure

Definition at line 2008 of file res_pjsip.c.

2009{
2010 pj_str_t hdr_name;
2011 pj_str_t hdr_value;
2012 pjsip_generic_string_hdr *hdr;
2013
2014 pj_cstr(&hdr_name, name);
2015 pj_cstr(&hdr_value, value);
2016
2017 hdr = pjsip_generic_string_hdr_create(tdata->pool, &hdr_name, &hdr_value);
2018
2019 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *) hdr);
2020 return 0;
2021}

References name, and value.

Referenced by add_header_from_channel_var(), add_headers_to_message(), ast_sip_add_date_header(), ast_sip_add_security_headers(), ast_sip_message_apply_transport(), build_notify(), handle_outgoing_request(), notify_channel(), notify_contact(), notify_uri(), options_incoming_request(), rfc3326_add_reason_header(), send_options_response(), sip_publication_respond(), transfer_refer(), vars_to_headers(), and vars_to_headers().

◆ ast_sip_add_header2()

pjsip_generic_string_hdr * ast_sip_add_header2 ( pjsip_tx_data *  tdata,
const char *  name,
const char *  value 
)

Add a header to an outbound SIP message, returning a pointer to the header.

Parameters
tdataThe message to add the header to
nameThe header name
valueThe header value
Returns
The pjsip_generic_string_hdr * added.

Definition at line 2023 of file res_pjsip.c.

2025{
2026 pj_str_t hdr_name;
2027 pj_str_t hdr_value;
2028 pjsip_generic_string_hdr *hdr;
2029
2030 pj_cstr(&hdr_name, name);
2031 pj_cstr(&hdr_value, value);
2032
2033 hdr = pjsip_generic_string_hdr_create(tdata->pool, &hdr_name, &hdr_value);
2034
2035 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *) hdr);
2036 return hdr;
2037}

References name, and value.

Referenced by handle_outgoing_request().

◆ ast_sip_add_security_headers()

int ast_sip_add_security_headers ( struct ast_sip_security_mechanism_vector security_mechanisms,
const char *  header_name,
int  add_qval,
pjsip_tx_data *  tdata 
)

Add security headers to transmission data.

Parameters
security_mechanismsVector of security mechanisms.
header_nameThe header name under which to add the security mechanisms. One of Security-Client, Security-Server, Security-Verify.
add_qvalIf zero, don't add the q-value to the header.
tdataThe transmission data.
Return values
0Success
non-zeroFailure

Definition at line 290 of file security_agreements.c.

291 {
292 struct ast_sip_security_mechanism *mech;
293 char *buf;
294 int mech_cnt;
295 int i;
296 int add_qvalue = 1;
297 static const pj_str_t proxy_require = { "Proxy-Require", 13 };
298 static const pj_str_t require = { "Require", 7 };
299
300 if (!security_mechanisms || !tdata) {
301 return EINVAL;
302 }
303
304 if (!strcmp(header_name, "Security-Client")) {
305 add_qvalue = 0;
306 } else if (strcmp(header_name, "Security-Server") &&
307 strcmp(header_name, "Security-Verify")) {
308 return EINVAL;
309 }
310 /* If we're adding Security-Client headers, don't add q-value
311 * even if the function caller requested it. */
312 add_qvalue = add_qvalue && add_qval;
313
314 mech_cnt = AST_VECTOR_SIZE(security_mechanisms);
315 for (i = 0; i < mech_cnt; ++i) {
316 mech = AST_VECTOR_GET(security_mechanisms, i);
317 if (security_mechanism_to_str(mech, add_qvalue, &buf)) {
318 continue;
319 }
320 ast_sip_add_header(tdata, header_name, buf);
321 ast_free(buf);
322 }
323
324 if (pjsip_msg_find_hdr_by_name(tdata->msg, &require, NULL) == NULL) {
325 ast_sip_add_header(tdata, "Require", "mediasec");
326 }
327 if (pjsip_msg_find_hdr_by_name(tdata->msg, &proxy_require, NULL) == NULL) {
328 ast_sip_add_header(tdata, "Proxy-Require", "mediasec");
329 }
330 return 0;
331}
#define ast_free(a)
Definition astmm.h:180
static int security_mechanism_to_str(const struct ast_sip_security_mechanism *security_mechanism, int add_qvalue, char **buf)
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition vector.h:620
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition vector.h:691

References ast_free, ast_sip_add_header(), AST_VECTOR_GET, AST_VECTOR_SIZE, buf, NULL, and security_mechanism_to_str().

Referenced by add_outgoing_request_headers(), and add_security_headers().

◆ ast_sip_add_usereqphone()

void ast_sip_add_usereqphone ( const struct ast_sip_endpoint endpoint,
pj_pool_t *  pool,
pjsip_uri *  uri 
)

Add 'user=phone' parameter to URI if enabled and user is a phone number.

Parameters
endpointThe endpoint to use for configuration
poolThe memory pool to allocate the parameter from
uriThe URI to check for user and to add parameter to

Definition at line 930 of file res_pjsip.c.

931{
932 pjsip_sip_uri *sip_uri;
933 int i = 0;
934 static const pj_str_t STR_PHONE = { "phone", 5 };
935
936 if (!endpoint || !endpoint->usereqphone || (!PJSIP_URI_SCHEME_IS_SIP(uri) && !PJSIP_URI_SCHEME_IS_SIPS(uri))) {
937 return;
938 }
939
940 sip_uri = pjsip_uri_get_uri(uri);
941
942 if (!pj_strlen(&sip_uri->user)) {
943 return;
944 }
945
946 if (pj_strbuf(&sip_uri->user)[0] == '+') {
947 i = 1;
948 }
949
950 /* Test URI user against allowed characters in AST_DIGIT_ANY */
951 for (; i < pj_strlen(&sip_uri->user); i++) {
952 if (!strchr(AST_DIGIT_ANY, pj_strbuf(&sip_uri->user)[i])) {
953 break;
954 }
955 }
956
957 if (i < pj_strlen(&sip_uri->user)) {
958 return;
959 }
960
961 sip_uri->user_param = STR_PHONE;
962}
#define AST_DIGIT_ANY
Definition file.h:48

References AST_DIGIT_ANY, and ast_sip_endpoint::usereqphone.

Referenced by ast_sip_create_dialog_uac(), create_out_of_dialog_request(), and set_from_header().

◆ ast_sip_append_body()

int ast_sip_append_body ( pjsip_tx_data *  tdata,
const char *  body_text 
)

Append body data to a SIP message.

This acts mostly the same as ast_sip_add_body, except that rather than replacing a body if it currently exists, it appends data to an existing body.

Parameters
tdataThe message to append the body to
body_textThe string to append to the end of the current body
Return values
0Success
-1Failure

Definition at line 2075 of file res_pjsip.c.

2076{
2077 size_t combined_size = strlen(body_text) + tdata->msg->body->len;
2078 struct ast_str *body_buffer = ast_str_alloca(combined_size);
2079
2080 ast_str_set(&body_buffer, 0, "%.*s%s", (int) tdata->msg->body->len, (char *) tdata->msg->body->data, body_text);
2081
2082 tdata->msg->body->data = pj_pool_alloc(tdata->pool, combined_size);
2083 pj_memcpy(tdata->msg->body->data, ast_str_buffer(body_buffer), combined_size);
2084 tdata->msg->body->len = combined_size;
2085
2086 return 0;
2087}
#define ast_str_alloca(init_len)
Definition strings.h:848
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition strings.h:1113
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761

References ast_str_alloca, ast_str_buffer(), and ast_str_set().

◆ ast_sip_are_media_types_equal()

int ast_sip_are_media_types_equal ( pjsip_media_type *  a,
pjsip_media_type *  b 
)

Compare pjsip media types.

Parameters
athe first media type
bthe second media type
Return values
1Media types are equal
0Media types are not equal

Definition at line 2219 of file res_pjsip.c.

2220{
2221 int rc = 0;
2222 if (a != NULL && b != NULL) {
2223 rc = pjsip_media_type_cmp(a, b, 0) ? 0 : 1;
2224 }
2225 return rc;
2226}

References a, b, and NULL.

Referenced by find_pidf(), and video_info_incoming_request().

◆ ast_sip_auth_digest_algorithms_vector_init()

int ast_sip_auth_digest_algorithms_vector_init ( const char *  id,
struct pjsip_auth_algorithm_type_vector algorithms,
const char *  agent_type,
const char *  value 
)

Populate a vector of algorithm types from a string.

Parameters
idThe object id to use in error messages
algorithmsThe initialized but empty vector to populate
agent_typeThe type of agent to use in error messages ("UAC" or "UAS")
valueThe comma-separated string to parse for algorithms
Return values
0Success
non-zeroFailure

Definition at line 192 of file config_auth.c.

195{
196 char *iana_names = ast_strdupa(value);
197 pj_str_t val;
198 int res = 0;
199
200 ast_assert(algorithms != NULL);
201
202 while ((val.ptr = ast_strip(strsep(&iana_names, ",")))) {
203 const pjsip_auth_algorithm *algo;
204
205 if (ast_strlen_zero(val.ptr)) {
206 continue;
207 }
208 val.slen = strlen(val.ptr);
209
211 if (!algo) {
212 ast_log(LOG_WARNING, "%s: Unknown %s digest algorithm '%s' specified\n",
213 id, agent_type, val.ptr);
214 res = -1;
215 continue;
216 }
218 ast_log(LOG_WARNING, "%s: %s digest algorithm '%s' is not supported by the version of OpenSSL in use\n",
219 id, agent_type, val.ptr);
220 res = -1;
221 continue;
222 }
223
224 if (AST_VECTOR_APPEND(algorithms, algo->algorithm_type)) {
225 AST_VECTOR_FREE(algorithms);
226 return -1;
227 }
228 }
229 return res;
230}
char * strsep(char **str, const char *delims)
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
#define ast_log
Definition astobj2.c:42
const pjsip_auth_algorithm * ast_sip_auth_get_algorithm_by_iana_name(const pj_str_t *iana_name)
Get algorithm by IANA name.
Definition config_auth.c:83
pj_bool_t ast_sip_auth_is_algorithm_supported(pjsip_auth_algorithm_type algorithm_type)
Is algorithm supported by OpenSSL and pjproject?
#define LOG_WARNING
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition strings.h:223
#define ast_assert(a)
Definition utils.h:776
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition vector.h:185
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition vector.h:267

References agent_type, pjsip_auth_algorithm::algorithm_type, ast_assert, ast_log, ast_sip_auth_get_algorithm_by_iana_name(), ast_sip_auth_is_algorithm_supported(), ast_strdupa, ast_strip(), ast_strlen_zero(), AST_VECTOR_APPEND, AST_VECTOR_FREE, LOG_WARNING, NULL, strsep(), and value.

Referenced by alloc_artificial_auth(), auth_apply(), global_apply(), uac_algorithms_handler(), and uas_algorithms_handler().

◆ ast_sip_auth_digest_algorithms_vector_to_str()

int ast_sip_auth_digest_algorithms_vector_to_str ( const struct pjsip_auth_algorithm_type_vector algorithms,
char **  buf 
)

Dump a vector of algorithm types to a string.

Parameters
algorithmsThe vector to dump
[out]bufPointer to the buffer to dump the algorithms to Must be freed by the caller.
Return values
0Success
non-zeroFailure

Definition at line 248 of file config_auth.c.

250{
251 struct ast_str *str = NULL;
252 int i = 0;
253
254 if (!algorithms || !AST_VECTOR_SIZE(algorithms)) {
255 return 0;
256 }
257
258 str = ast_str_alloca(256);
259 if (!str) {
260 return -1;
261 }
262
263 for (i = 0; i < AST_VECTOR_SIZE(algorithms); ++i) {
265 AST_VECTOR_GET(algorithms, i));
266 ast_str_append(&str, 0, "%s" PJSTR_PRINTF_SPEC, i > 0 ? "," : "",
267 PJSTR_PRINTF_VAR(algo->iana_name));
268 }
269
271
272 return *buf ? 0 : -1;
273}
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
const pjsip_auth_algorithm * ast_sip_auth_get_algorithm_by_type(pjsip_auth_algorithm_type algorithm_type)
Get algorithm by algorithm type.
Definition config_auth.c:66
#define PJSTR_PRINTF_VAR(_v)
Definition res_pjsip.h:72
#define PJSTR_PRINTF_SPEC
Definition res_pjsip.h:71
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition strings.h:1139

References ast_sip_auth_get_algorithm_by_type(), ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_strdup, AST_VECTOR_GET, AST_VECTOR_SIZE, buf, pjsip_auth_algorithm::iana_name, NULL, PJSTR_PRINTF_SPEC, PJSTR_PRINTF_VAR, and str.

Referenced by uac_algorithms_to_str(), and uas_algorithms_to_str().

◆ ast_sip_auth_get_algorithm_by_iana_name()

const pjsip_auth_algorithm * ast_sip_auth_get_algorithm_by_iana_name ( const pj_str_t *  iana_name)

Get algorithm by IANA name.

Parameters
iana_nameThe algorithm IANA name
Return values
Thealgorithm or NULL if not found

Definition at line 83 of file config_auth.c.

85{
86#ifdef HAVE_PJSIP_AUTH_NEW_DIGESTS
87 return pjsip_auth_get_algorithm_by_iana_name(iana_name);
88#else
89 if (!iana_name) {
90 return NULL;
91 }
92 /*
93 * If we don't have a pjproject with the new algorithms, the
94 * only one we support is MD5. If iana_name is empty (but not NULL),
95 * the default is MD5.
96 */
97 if (iana_name->slen == 0 || pj_stricmp2(iana_name, "MD5") == 0) {
99 }
100 return NULL;
101#endif
102}
const pjsip_auth_algorithm pjsip_auth_algorithms[]
Definition config_auth.c:46

References NULL, PJSIP_AUTH_ALGORITHM_MD5, and pjsip_auth_algorithms.

Referenced by ast_sip_auth_digest_algorithms_vector_init(), digest_lookup(), get_supported_algorithm(), and password_digest_handler().

◆ ast_sip_auth_get_algorithm_by_type()

const pjsip_auth_algorithm * ast_sip_auth_get_algorithm_by_type ( pjsip_auth_algorithm_type  algorithm_type)

Get algorithm by algorithm type.

Parameters
algorithm_typeThe algorithm type
Return values
Thealgorithm or NULL if not found

Definition at line 66 of file config_auth.c.

68{
69#ifdef HAVE_PJSIP_AUTH_NEW_DIGESTS
70 return pjsip_auth_get_algorithm_by_type(algorithm_type);
71#else
72 /*
73 * If we don't have a pjproject with the new algorithms, the
74 * only one we support is MD5.
75 */
76 if (algorithm_type == PJSIP_AUTH_ALGORITHM_MD5) {
77 return &pjsip_auth_algorithms[algorithm_type];
78 }
79 return NULL;
80#endif
81}

References NULL, PJSIP_AUTH_ALGORITHM_MD5, and pjsip_auth_algorithms.

Referenced by ast_sip_auth_digest_algorithms_vector_to_str(), check_algorithm(), digest_check_auth(), and password_digest_to_str().

◆ ast_sip_auth_get_creds()

const char * ast_sip_auth_get_creds ( const struct ast_sip_auth auth,
const pjsip_auth_algorithm_type  algorithm_type,
int *  cred_type 
)

Get the plain text or digest password from an auth object.

Parameters
authThe auth object
algorithm_typeThe algorithm type to retrieve the password for
cred_type[out]Pointer to an int to receive the credential type
Note
cred_type will contain one of the following values:
  • PJSIP_CRED_DATA_DIGEST
  • PJSIP_CRED_DATA_PLAIN_PASSWD

If a password digest is available for the algorithm type it will be returned, otherwise if a plain text password is available that will be returned instead.

Return values
Theplain text or digest password or NULL if not found for the algorithm type

Definition at line 407 of file config_auth.c.

409{
410 struct ast_sip_auth_password_digest *pw_digest =
412
413 if (pw_digest) {
414 *cred_type = PJSIP_CRED_DATA_DIGEST;
415 return pw_digest->digest;
416 }
417
418 *cred_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
419 return auth->auth_pass;
420}

References ast_sip_auth_password_digest::algorithm_type, ast_sip_auth::auth_pass, ast_sip_auth_password_digest::digest, and ast_sip_auth::password_digests.

Referenced by digest_lookup(), and get_creds_for_header().

◆ ast_sip_auth_is_algorithm_available()

int ast_sip_auth_is_algorithm_available ( const struct ast_sip_auth auth,
const struct pjsip_auth_algorithm_type_vector algorithms,
pjsip_auth_algorithm_type  algorithm_type 
)

Checks an pjsip_auth_algorithm_type_vector to see if it contains an algorithm.

Parameters
authThe auth object
algorithmsThe auth object's supported_algorithms_uac or supported_algorithms_uas
algorithm_typeThe algorithm_type to check
Return values
1The algorithm-type is in the vector
0The algorithm-type is not in the vector

Definition at line 386 of file config_auth.c.

389{
390 int i;
391
392 if (!algorithms) {
393 return 0;
394 }
395
396 for (i = 0; i < AST_VECTOR_SIZE(algorithms); ++i) {
397 if (AST_VECTOR_GET(algorithms, i) == algorithm_type) {
398 if (auth->password_digests[algorithm_type] || !ast_strlen_zero(auth->auth_pass)) {
399 return 1;
400 }
401 }
402 }
403
404 return 0;
405}

References ast_strlen_zero(), AST_VECTOR_GET, AST_VECTOR_SIZE, ast_sip_auth::auth_pass, and ast_sip_auth::password_digests.

Referenced by digest_lookup(), and get_creds_for_header().

◆ ast_sip_auth_is_algorithm_supported()

pj_bool_t ast_sip_auth_is_algorithm_supported ( pjsip_auth_algorithm_type  algorithm_type)

Is algorithm supported by OpenSSL and pjproject?

Parameters
algorithm_typeThe algorithm IANA name
Return values
Thealgorithm or NULL if not found

Definition at line 104 of file config_auth.c.

106{
107#ifdef HAVE_PJSIP_AUTH_NEW_DIGESTS
108 return pjsip_auth_is_algorithm_supported(algorithm_type);
109#else
110 return algorithm_type == PJSIP_AUTH_ALGORITHM_MD5;
111#endif
112}

References PJSIP_AUTH_ALGORITHM_MD5.

Referenced by ast_sip_auth_digest_algorithms_vector_init(), get_supported_algorithm(), and password_digest_handler().

◆ ast_sip_auth_type_to_str()

const char * ast_sip_auth_type_to_str ( enum ast_sip_auth_type  type)

Converts the given auth type to a string.

Parameters
typethe auth type to convert
Return values
astring representative of the auth type

Definition at line 179 of file config_auth.c.

180{
182 auth_types_map[type] : "";
183}
static const char * auth_types_map[]
#define ARRAY_IN_BOUNDS(v, a)
Checks to see if value is within the bounds of the given array.
Definition utils.h:724

References ARRAY_IN_BOUNDS, auth_types_map, and type.

Referenced by auth_type_to_str().

◆ ast_sip_auth_vector_destroy()

void ast_sip_auth_vector_destroy ( struct ast_sip_auth_vector vector)

Free contents of an auth vector.

Parameters
vectorVector whose contents are to be freed

Definition at line 306 of file pjsip_configuration.c.

307{
308 int i;
309 size_t size;
310
311 if (!auths) {
312 return;
313 }
314
315 size = AST_VECTOR_SIZE(auths);
316
317 for (i = 0; i < size; ++i) {
318 const char *name = AST_VECTOR_REMOVE_UNORDERED(auths, 0);
319 ast_free((char *) name);
320 }
321 AST_VECTOR_FREE(auths);
322}
#define AST_VECTOR_REMOVE_UNORDERED(vec, idx)
Remove an element from an unordered vector by index.
Definition vector.h:449

References ast_free, AST_VECTOR_FREE, AST_VECTOR_REMOVE_UNORDERED, AST_VECTOR_SIZE, and name.

Referenced by ast_sip_auth_vector_init(), endpoint_destructor(), handle_client_state_destruction(), sip_outbound_publish_destroy(), sip_outbound_registration_destroy(), and sip_outbound_registration_perform().

◆ ast_sip_auth_vector_init()

int ast_sip_auth_vector_init ( struct ast_sip_auth_vector vector,
const char *  auth_names 
)

Initialize an auth vector with the configured values.

Parameters
vectorVector to initialize
auth_namesComma-separated list of names to set in the array
Return values
0Success
non-zeroFailure

Definition at line 324 of file pjsip_configuration.c.

325{
326 char *auth_names = ast_strdupa(value);
327 char *val;
328
329 ast_assert(auths != NULL);
330
331 if (AST_VECTOR_SIZE(auths)) {
333 }
334 if (AST_VECTOR_INIT(auths, 1)) {
335 return -1;
336 }
337
338 while ((val = ast_strip(strsep(&auth_names, ",")))) {
339 if (ast_strlen_zero(val)) {
340 continue;
341 }
342
343 val = ast_strdup(val);
344 if (!val) {
345 goto failure;
346 }
347 if (AST_VECTOR_APPEND(auths, val)) {
348 ast_free(val);
349
350 goto failure;
351 }
352 }
353 return 0;
354
355failure:
357 return -1;
358}
void ast_sip_auth_vector_destroy(struct ast_sip_auth_vector *auths)
Free contents of an auth vector.
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition vector.h:124

References ast_assert, ast_free, ast_sip_auth_vector_destroy(), ast_strdup, ast_strdupa, ast_strip(), ast_strlen_zero(), AST_VECTOR_APPEND, AST_VECTOR_INIT, AST_VECTOR_SIZE, NULL, strsep(), and value.

Referenced by inbound_auth_handler(), outbound_auth_handler(), outbound_auth_handler(), and outbound_auth_handler().

◆ ast_sip_auths_to_str()

int ast_sip_auths_to_str ( const struct ast_sip_auth_vector auths,
char **  buf 
)

Converts an auths array to a string of comma separated values.

Parameters
authsan auth array
bufthe string buffer to write the object data
Return values
0Success, non-zero on failure

Definition at line 374 of file pjsip_configuration.c.

375{
376 if (!auths || !AST_VECTOR_SIZE(auths)) {
377 return 0;
378 }
379
380 if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
381 return -1;
382 }
383
384 /* I feel like accessing the vector's elem array directly is cheating...*/
386 return 0;
387}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define MAX_OBJECT_FIELD
Maximum length of an object field name.
Definition sorcery.h:110
void ast_join_delim(char *s, size_t len, const char *const w[], unsigned int size, char delim)
Join an array of strings into a single string.
Definition utils.c:2414
const char ** elems
Definition res_pjsip.h:694

References ast_calloc, ast_join_delim(), AST_VECTOR_SIZE, buf, ast_sip_auth_vector::elems, and MAX_OBJECT_FIELD.

Referenced by format_str_append_auth(), inbound_auths_to_str(), outbound_auths_to_str(), and outbound_auths_to_str().

◆ ast_sip_call_codec_pref_to_str()

const char * ast_sip_call_codec_pref_to_str ( struct ast_flags  pref)

Convert the call codec preference flags to a string.

Since
18.0.0
Parameters
prefthe call codec preference setting
Returns
a constant string with either the setting value or 'unknown'
Note
Don't try to free the string!

Definition at line 2554 of file res_pjsip.c.

2555{
2556 const char *value;
2557
2558 if (ast_sip_call_codec_pref_test(pref, LOCAL) && ast_sip_call_codec_pref_test(pref, INTERSECT) && ast_sip_call_codec_pref_test(pref, ALL)) {
2559 value = "local";
2560 } else if (ast_sip_call_codec_pref_test(pref, LOCAL) && ast_sip_call_codec_pref_test(pref, UNION) && ast_sip_call_codec_pref_test(pref, ALL)) {
2561 value = "local_merge";
2562 } else if (ast_sip_call_codec_pref_test(pref, LOCAL) && ast_sip_call_codec_pref_test(pref, INTERSECT) && ast_sip_call_codec_pref_test(pref, FIRST)) {
2563 value = "local_first";
2564 } else if (ast_sip_call_codec_pref_test(pref, REMOTE) && ast_sip_call_codec_pref_test(pref, INTERSECT) && ast_sip_call_codec_pref_test(pref, ALL)) {
2565 value = "remote";
2566 } else if (ast_sip_call_codec_pref_test(pref, REMOTE) && ast_sip_call_codec_pref_test(pref, UNION) && ast_sip_call_codec_pref_test(pref, ALL)) {
2567 value = "remote_merge";
2568 } else if (ast_sip_call_codec_pref_test(pref, REMOTE) && ast_sip_call_codec_pref_test(pref, UNION) && ast_sip_call_codec_pref_test(pref, FIRST)) {
2569 value = "remote_first";
2570 } else {
2571 value = "unknown";
2572 }
2573
2574 return value;
2575}
#define ast_sip_call_codec_pref_test(__param, __codec_pref)
Returns true if the preference is set in the parameter.
Definition res_pjsip.h:787

References ast_sip_call_codec_pref_test, and value.

Referenced by incoming_call_offer_pref_to_str(), log_caps(), and outgoing_call_offer_pref_to_str().

◆ ast_sip_call_codec_str_to_pref()

int ast_sip_call_codec_str_to_pref ( struct ast_flags pref,
const char *  pref_str,
int  is_outgoing 
)

Convert a call codec preference string to preference flags.

Since
18.0.0
Parameters
prefA pointer to an ast_flags structure to receive the preference flags
pref_strThe call codec preference setting string
is_outgoingIs for outgoing calls?
Return values
0The string was parsed successfully
-1The string option was invalid

Definition at line 2577 of file res_pjsip.c.

2578{
2579 pref->flags = 0;
2580
2581 if (strcmp(pref_str, "local") == 0) {
2583 } else if (is_outgoing && strcmp(pref_str, "local_merge") == 0) {
2585 } else if (strcmp(pref_str, "local_first") == 0) {
2587 } else if (strcmp(pref_str, "remote") == 0) {
2589 } else if (is_outgoing && strcmp(pref_str, "remote_merge") == 0) {
2591 } else if (strcmp(pref_str, "remote_first") == 0) {
2593 } else {
2594 return -1;
2595 }
2596
2597 return 0;
2598}
unsigned int flags
Definition utils.h:218
#define ast_set_flag(p, flag)
Definition utils.h:70

References ast_set_flag, AST_SIP_CALL_CODEC_PREF_ALL, AST_SIP_CALL_CODEC_PREF_FIRST, AST_SIP_CALL_CODEC_PREF_INTERSECT, AST_SIP_CALL_CODEC_PREF_LOCAL, AST_SIP_CALL_CODEC_PREF_REMOTE, AST_SIP_CALL_CODEC_PREF_UNION, and ast_flags::flags.

Referenced by call_offer_pref_handler(), and test_create_joint().

◆ ast_sip_check_authentication()

enum ast_sip_check_auth_result ast_sip_check_authentication ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata,
pjsip_tx_data *  tdata 
)

Method to determine authentication status of an incoming request.

This will call into a registered authenticator. The registered authenticator will do what is necessary to determine whether the incoming request passes authentication. A tentative response is passed into this function so that if, say, a digest authentication challenge should be sent in the ensuing response, it can be added to the response.

Parameters
endpointThe endpoint from the request was sent
rdataThe request to potentially authenticate
tdataTentative response to the request
Returns
The result of checking authentication.

Definition at line 179 of file res_pjsip.c.

181{
183 ast_log(LOG_WARNING, "No SIP authenticator registered. Assuming authentication is successful\n");
185 }
186 return registered_authenticator->check_authentication(endpoint, rdata, tdata);
187}
static struct ast_sip_authenticator * registered_authenticator
Definition res_pjsip.c:138

References ast_log, AST_SIP_AUTHENTICATION_SUCCESS, ast_sip_authenticator::check_authentication, LOG_WARNING, and registered_authenticator.

Referenced by authenticate().

◆ ast_sip_cleanup_auths()

void ast_sip_cleanup_auths ( struct ast_sip_auth auths[],
size_t  num_auths 
)

Clean up retrieved auth structures from memory.

Call this function once you have completed operating on auths retrieved from ast_sip_retrieve_auths

Parameters
authsAn array of auth object pointers to clean up
num_authsThe number of auths in the array

Definition at line 2544 of file pjsip_configuration.c.

2545{
2546 int i;
2547 for (i = 0; i < num_auths; ++i) {
2548 ao2_cleanup(auths[i]);
2549 }
2550}
#define ao2_cleanup(obj)
Definition astobj2.h:1934

References ao2_cleanup.

Referenced by digest_check_auth(), and set_outbound_initial_authentication_credentials().

◆ ast_sip_contact_to_str()

int ast_sip_contact_to_str ( void *  object,
void *  arg,
int  flags 
)

Handler used to convert a contact to a string.

Parameters
objectthe ast_sip_aor_contact_pair containing a list of contacts to iterate and the contact
arguser data passed to handler
flags
Return values
0Success, non-zero on failure

Definition at line 771 of file location.c.

772{
773 struct ast_sip_contact_wrapper *wrapper = object;
774 struct ast_str **buf = arg;
775
776 ast_str_append(buf, 0, "%s,", wrapper->contact_id);
777
778 return 0;
779}

References ast_str_append(), buf, and ast_sip_contact_wrapper::contact_id.

Referenced by contacts_to_str(), sip_contact_to_str(), and sip_endpoints_aors_ami().

◆ ast_sip_create_ami_event()

struct ast_str * ast_sip_create_ami_event ( const char *  event,
struct ast_sip_ami ami 
)

Creates a string to store AMI event data in.

Parameters
eventthe event to set
amiAMI session and message container
Return values
aninitialized ast_str or NULL on error.

Definition at line 1726 of file pjsip_configuration.c.

1727{
1729
1730 if (!(buf)) {
1731 astman_send_error_va(ami->s, ami->m, "Unable create event "
1732 "for %s\n", event);
1733 return NULL;
1734 }
1735
1736 ast_str_set(&buf, 0, "Event: %s\r\n", event);
1737 if (!ast_strlen_zero(ami->action_id)) {
1738 ast_str_append(&buf, 0, "ActionID: %s\r\n", ami->action_id);
1739 }
1740 return buf;
1741}
void astman_send_error_va(struct mansession *s, const struct message *m, const char *fmt,...)
Send error in manager transaction (with va_args support)
Definition manager.c:1987
#define AMI_DEFAULT_STR_SIZE
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659

References ast_sip_ami::action_id, AMI_DEFAULT_STR_SIZE, ast_str_append(), ast_str_create, ast_str_set(), ast_strlen_zero(), astman_send_error_va(), buf, ast_sip_ami::m, NULL, and ast_sip_ami::s.

Referenced by ami_outbound_registration_task(), ami_registrations_aor(), ami_subscription_detail(), ast_sip_format_contact_ami(), format_ami_aor_handler(), format_ami_aorlist_handler(), format_ami_auth_handler(), format_ami_authlist_handler(), format_ami_contactlist_handler(), format_ami_endpoint(), format_ami_endpoint_transport(), format_ami_endpoints(), format_ami_resource_lists(), and send_identify_ami_event().

◆ ast_sip_create_dialog_uac()

pjsip_dialog * ast_sip_create_dialog_uac ( const struct ast_sip_endpoint endpoint,
const char *  aor_name,
const char *  request_user 
)

General purpose method for creating a UAC dialog with an endpoint.

Parameters
endpointA pointer to the endpoint
aor_nameOptional name of the AOR to target, may even be an explicit SIP URI
request_userOptional user to place into the target URI
Return values
non-NULLsuccess
NULLfailure

Definition at line 964 of file res_pjsip.c.

966{
967 char enclosed_uri[PJSIP_MAX_URL_SIZE];
968 pj_str_t local_uri = { "sip:temp@temp", 13 }, remote_uri, target_uri;
969 pj_status_t res;
970 pjsip_dialog *dlg = NULL;
971 const char *outbound_proxy = endpoint->outbound_proxy;
972 pjsip_tpselector selector = { .type = PJSIP_TPSELECTOR_NONE, };
973 static const pj_str_t HCONTACT = { "Contact", 7 };
974
975 if (!ast_begins_with(uri, "<")) {
976 snprintf(enclosed_uri, sizeof(enclosed_uri), "<%s>", uri);
977 } else {
978 snprintf(enclosed_uri, sizeof(enclosed_uri), "%s", uri);
979 }
980 pj_cstr(&remote_uri, enclosed_uri);
981
982 pj_cstr(&target_uri, uri);
983
984 res = pjsip_dlg_create_uac(pjsip_ua_instance(), &local_uri, NULL, &remote_uri, &target_uri, &dlg);
985 if (res == PJ_SUCCESS && !(PJSIP_URI_SCHEME_IS_SIP(dlg->target) || PJSIP_URI_SCHEME_IS_SIPS(dlg->target))) {
986 /* dlg->target is a pjsip_other_uri, but it's assumed to be a
987 * pjsip_sip_uri below. Fail fast. */
988 res = PJSIP_EINVALIDURI;
989 pjsip_dlg_terminate(dlg);
990 }
991 if (res != PJ_SUCCESS) {
992 if (res == PJSIP_EINVALIDURI) {
994 "Endpoint '%s': Could not create dialog to invalid URI '%s'. Is endpoint registered and reachable?\n",
995 ast_sorcery_object_get_id(endpoint), uri);
996 }
997 return NULL;
998 }
999
1000 /* We have to temporarily bump up the sess_count here so the dialog is not prematurely destroyed */
1001 dlg->sess_count++;
1002
1003 ast_sip_dlg_set_transport(endpoint, dlg, &selector);
1004
1005 if (sip_dialog_create_from(dlg->pool, &local_uri, endpoint->fromuser, endpoint->fromdomain, &remote_uri, &selector)) {
1006 dlg->sess_count--;
1007 pjsip_dlg_terminate(dlg);
1008 ast_sip_tpselector_unref(&selector);
1009 return NULL;
1010 }
1011
1012 ast_sip_tpselector_unref(&selector);
1013
1014 /* Update the dialog with the new local URI, we do it afterwards so we can use the dialog pool for construction */
1015 pj_strdup_with_null(dlg->pool, &dlg->local.info_str, &local_uri);
1016 dlg->local.info->uri = pjsip_parse_uri(dlg->pool, dlg->local.info_str.ptr, dlg->local.info_str.slen, 0);
1017 if (!dlg->local.info->uri) {
1019 "Could not parse URI '%s' for endpoint '%s'\n",
1020 dlg->local.info_str.ptr, ast_sorcery_object_get_id(endpoint));
1021 dlg->sess_count--;
1022 pjsip_dlg_terminate(dlg);
1023 return NULL;
1024 }
1025
1026 dlg->local.contact = pjsip_parse_hdr(dlg->pool, &HCONTACT, local_uri.ptr, local_uri.slen, NULL);
1027
1028 if (!ast_strlen_zero(endpoint->contact_user)) {
1029 pjsip_sip_uri *sip_uri;
1030
1031 sip_uri = pjsip_uri_get_uri(dlg->local.contact->uri);
1032 pj_strdup2(dlg->pool, &sip_uri->user, endpoint->contact_user);
1033 }
1034
1035 /* If a request user has been specified and we are permitted to change it, do so */
1036 if (!ast_strlen_zero(request_user)) {
1037 pjsip_sip_uri *sip_uri;
1038
1039 if (PJSIP_URI_SCHEME_IS_SIP(dlg->target) || PJSIP_URI_SCHEME_IS_SIPS(dlg->target)) {
1040 sip_uri = pjsip_uri_get_uri(dlg->target);
1041 pj_strdup2(dlg->pool, &sip_uri->user, request_user);
1042 }
1043 if (PJSIP_URI_SCHEME_IS_SIP(dlg->remote.info->uri) || PJSIP_URI_SCHEME_IS_SIPS(dlg->remote.info->uri)) {
1044 sip_uri = pjsip_uri_get_uri(dlg->remote.info->uri);
1045 pj_strdup2(dlg->pool, &sip_uri->user, request_user);
1046 }
1047 }
1048
1049 /* Add the user=phone parameter if applicable */
1050 ast_sip_add_usereqphone(endpoint, dlg->pool, dlg->target);
1051 ast_sip_add_usereqphone(endpoint, dlg->pool, dlg->remote.info->uri);
1052 ast_sip_add_usereqphone(endpoint, dlg->pool, dlg->local.info->uri);
1053
1054 if (!ast_strlen_zero(outbound_proxy)) {
1055 pjsip_route_hdr route_set, *route;
1056 static const pj_str_t ROUTE_HNAME = { "Route", 5 };
1057 pj_str_t tmp;
1058
1059 pj_list_init(&route_set);
1060
1061 pj_strdup2_with_null(dlg->pool, &tmp, outbound_proxy);
1062 if (!(route = pjsip_parse_hdr(dlg->pool, &ROUTE_HNAME, tmp.ptr, tmp.slen, NULL))) {
1063 ast_log(LOG_ERROR, "Could not create dialog to endpoint '%s' as outbound proxy URI '%s' is not valid\n",
1064 ast_sorcery_object_get_id(endpoint), outbound_proxy);
1065 dlg->sess_count--;
1066 pjsip_dlg_terminate(dlg);
1067 return NULL;
1068 }
1069 pj_list_insert_nodes_before(&route_set, route);
1070
1071 pjsip_dlg_set_route_set(dlg, &route_set);
1072 }
1073
1074 dlg->sess_count--;
1075
1076 return dlg;
1077}
#define LOG_ERROR
void ast_sip_add_usereqphone(const struct ast_sip_endpoint *endpoint, pj_pool_t *pool, pjsip_uri *uri)
Add 'user=phone' parameter to URI if enabled and user is a phone number.
Definition res_pjsip.c:930
int ast_sip_dlg_set_transport(const struct ast_sip_endpoint *endpoint, pjsip_dialog *dlg, pjsip_tpselector *selector)
Set the transport on a dialog.
Definition res_pjsip.c:727
void ast_sip_tpselector_unref(pjsip_tpselector *selector)
Unreference a pjsip_tpselector.
Definition res_pjsip.c:923
static int sip_dialog_create_from(pj_pool_t *pool, pj_str_t *from, const char *user, const char *domain, const pj_str_t *target, pjsip_tpselector *selector)
Definition res_pjsip.c:749
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition sorcery.c:2381
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
Definition strings.h:97

References ast_begins_with(), ast_log, ast_sip_add_usereqphone(), ast_sip_dlg_set_transport(), ast_sip_tpselector_unref(), ast_sorcery_object_get_id(), ast_strlen_zero(), ast_sip_endpoint::contact_user, ast_sip_endpoint::fromdomain, ast_sip_endpoint::fromuser, ast_sip_endpoint::info, LOG_ERROR, NULL, ast_sip_endpoint::outbound_proxy, and sip_dialog_create_from().

Referenced by ast_sip_create_subscription(), ast_sip_session_create_outgoing(), and refer_send().

◆ ast_sip_create_dialog_uas()

pjsip_dialog * ast_sip_create_dialog_uas ( const struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata,
pj_status_t *  status 
)

General purpose method for creating a UAS dialog with an endpoint.

Deprecated:
This function is unsafe (due to the returned object not being locked nor having its reference incremented) and should no longer be used. Instead use ast_sip_create_dialog_uas_locked so a properly locked and referenced object is returned.
Parameters
endpointA pointer to the endpoint
rdataThe request that is starting the dialog
[out]statusOn failure, the reason for failure in creating the dialog

Definition at line 1176 of file res_pjsip.c.

1177{
1178#ifdef HAVE_PJSIP_DLG_CREATE_UAS_AND_INC_LOCK
1179 pjsip_dialog *dlg;
1180
1181 dlg = create_dialog_uas(endpoint, rdata, status, pjsip_dlg_create_uas_and_inc_lock);
1182 if (dlg) {
1183 pjsip_dlg_dec_lock(dlg);
1184 }
1185
1186 return dlg;
1187#else
1188 return create_dialog_uas(endpoint, rdata, status, pjsip_dlg_create_uas);
1189#endif
1190}
static pjsip_dialog * create_dialog_uas(const struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pj_status_t *status, create_dlg_uac create_fun)
Definition res_pjsip.c:1118

References create_dialog_uas(), and status.

◆ ast_sip_create_dialog_uas_locked()

pjsip_dialog * ast_sip_create_dialog_uas_locked ( const struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata,
pj_status_t *  status 
)

General purpose method for creating a UAS dialog with an endpoint.

This function creates and returns a locked, and referenced counted pjsip dialog object. The caller is thus responsible for freeing the allocated memory, decrementing the reference, and releasing the lock when done with the returned object.

Note
The safest way to unlock the object, and decrement its reference is by calling pjsip_dlg_dec_lock. Alternatively, pjsip_dlg_dec_session can be used to decrement the reference only.

The dialog is returned locked and with a reference in order to ensure that the dialog object, and any of its associated objects (e.g. transaction) are not untimely destroyed. For instance, that could happen when a transport error occurs.

As long as the caller maintains a reference to the dialog there should be no worry that it might unknowingly be destroyed. However, once the caller unlocks the dialog there is a danger that some of the dialog's internal objects could be lost and/or compromised. For example, when the aforementioned transport error occurs the dialog's associated transaction gets destroyed (see pjsip_dlg_on_tsx_state in sip_dialog.c, and mod_inv_on_tsx_state in sip_inv.c).

In this case and before using the dialog again the caller should re-lock the dialog, check to make sure the dialog is still established, and the transaction still exists and has not been destroyed.

Parameters
endpointA pointer to the endpoint
rdataThe request that is starting the dialog
[out]statusOn failure, the reason for failure in creating the dialog
Return values
Alocked, and reference counted pjsip_dialog object.
NULLon failure

Definition at line 1192 of file res_pjsip.c.

1194{
1195#ifdef HAVE_PJSIP_DLG_CREATE_UAS_AND_INC_LOCK
1196 return create_dialog_uas(endpoint, rdata, status, pjsip_dlg_create_uas_and_inc_lock);
1197#else
1198 /*
1199 * This is put here in order to be compatible with older versions of pjproject.
1200 * Best we can do in this case is immediately lock after getting the dialog.
1201 * However, that does leave a "gap" between creating and locking.
1202 */
1203 pjsip_dialog *dlg;
1204
1205 dlg = create_dialog_uas(endpoint, rdata, status, pjsip_dlg_create_uas);
1206 if (dlg) {
1207 pjsip_dlg_inc_lock(dlg);
1208 }
1209
1210 return dlg;
1211#endif
1212 }

References create_dialog_uas(), and status.

Referenced by create_subscription_tree(), and pre_session_setup().

◆ ast_sip_create_rdata()

int ast_sip_create_rdata ( pjsip_rx_data *  rdata,
char *  packet,
const char *  src_name,
int  src_port,
char *  transport_type,
const char *  local_name,
int  local_port 
)

General purpose method for creating an rdata structure using specific information.

Parameters
[out]rdataThe rdata structure that will be populated
packetA SIP message
src_nameThe source IP address of the message
src_portThe source port of the message
transport_typeThe type of transport the message was received on
local_nameThe local IP address the message was received on
local_portThe local port the message was received on
Return values
0success
-1failure

Definition at line 1266 of file res_pjsip.c.

1268{
1269 return ast_sip_create_rdata_with_contact(rdata, packet, src_name, src_port, transport_type,
1270 local_name, local_port, NULL);
1271}
int ast_sip_create_rdata_with_contact(pjsip_rx_data *rdata, char *packet, const char *src_name, int src_port, char *transport_type, const char *local_name, int local_port, const char *contact)
General purpose method for creating an rdata structure using specific information.
Definition res_pjsip.c:1214

References ast_sip_create_rdata_with_contact(), and NULL.

◆ ast_sip_create_rdata_with_contact()

int ast_sip_create_rdata_with_contact ( pjsip_rx_data *  rdata,
char *  packet,
const char *  src_name,
int  src_port,
char *  transport_type,
const char *  local_name,
int  local_port,
const char *  contact_uri 
)

General purpose method for creating an rdata structure using specific information.

Since
13.15.0
Parameters
[out]rdataThe rdata structure that will be populated
packetA SIP message
src_nameThe source IP address of the message
src_portThe source port of the message
transport_typeThe type of transport the message was received on
local_nameThe local IP address the message was received on
local_portThe local port the message was received on
contact_uriThe contact URI of the message
Return values
0success
-1failure

Definition at line 1214 of file res_pjsip.c.

1216{
1217 pj_str_t tmp;
1218
1219 /*
1220 * Initialize the error list in case there is a parse error
1221 * in the given packet.
1222 */
1223 pj_list_init(&rdata->msg_info.parse_err);
1224
1225 rdata->tp_info.transport = PJ_POOL_ZALLOC_T(rdata->tp_info.pool, pjsip_transport);
1226 if (!rdata->tp_info.transport) {
1227 return -1;
1228 }
1229
1230 ast_copy_string(rdata->pkt_info.packet, packet, sizeof(rdata->pkt_info.packet));
1231 ast_copy_string(rdata->pkt_info.src_name, src_name, sizeof(rdata->pkt_info.src_name));
1232 rdata->pkt_info.src_port = src_port;
1233 pj_sockaddr_parse(pj_AF_UNSPEC(), 0, pj_cstr(&tmp, src_name), &rdata->pkt_info.src_addr);
1234 pj_sockaddr_set_port(&rdata->pkt_info.src_addr, src_port);
1235
1236 pjsip_parse_rdata(packet, strlen(packet), rdata);
1237 if (!rdata->msg_info.msg || !pj_list_empty(&rdata->msg_info.parse_err)) {
1238 return -1;
1239 }
1240
1241 if (!ast_strlen_zero(contact)) {
1242 pjsip_contact_hdr *contact_hdr;
1243
1244 contact_hdr = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, NULL);
1245 if (contact_hdr) {
1246 contact_hdr->uri = pjsip_parse_uri(rdata->tp_info.pool, (char *)contact,
1247 strlen(contact), PJSIP_PARSE_URI_AS_NAMEADDR);
1248 if (!contact_hdr->uri) {
1249 ast_log(LOG_WARNING, "Unable to parse contact URI from '%s'.\n", contact);
1250 return -1;
1251 }
1252 }
1253 }
1254
1255 pj_strdup2(rdata->tp_info.pool, &rdata->msg_info.via->recvd_param, rdata->pkt_info.src_name);
1256 rdata->msg_info.via->rport_param = -1;
1257
1258 rdata->tp_info.transport->key.type = pjsip_transport_get_type_from_name(pj_cstr(&tmp, transport_type));
1259 rdata->tp_info.transport->type_name = transport_type;
1260 pj_strdup2(rdata->tp_info.pool, &rdata->tp_info.transport->local_name.host, local_name);
1261 rdata->tp_info.transport->local_name.port = local_port;
1262
1263 return 0;
1264}
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425

References ast_copy_string(), ast_log, ast_strlen_zero(), LOG_WARNING, and NULL.

Referenced by ast_sip_create_rdata(), and subscription_persistence_recreate().

◆ ast_sip_create_request()

int ast_sip_create_request ( const char *  method,
struct pjsip_dialog *  dlg,
struct ast_sip_endpoint endpoint,
const char *  uri,
struct ast_sip_contact contact,
pjsip_tx_data **  tdata 
)

General purpose method for creating a SIP request.

Its typical use would be to create one-off requests such as an out of dialog SIP MESSAGE.

The request can either be in- or out-of-dialog. If in-dialog, the dlg parameter MUST be present. If out-of-dialog the endpoint parameter MUST be present. If both are present, then we will assume that the message is to be sent in-dialog.

The uri parameter can be specified if the request should be sent to an explicit URI rather than one configured on the endpoint.

Parameters
methodThe method of the SIP request to send
dlgOptional. If specified, the dialog on which to request the message.
endpointOptional. If specified, the request will be created out-of-dialog to the endpoint.
uriOptional. If specified, the request will be sent to this URI rather than one configured for the endpoint.
contactThe contact with which this request is associated for out-of-dialog requests.
[out]tdataThe newly-created request

The provided contact is attached to tdata with its reference bumped, but will not survive for the entire lifetime of tdata since the contact is cleaned up when all supplements have completed execution.

Return values
0Success
-1Failure

Definition at line 1435 of file res_pjsip.c.

1438{
1439 const pjsip_method *pmethod = get_pjsip_method(method);
1440
1441 if (!pmethod) {
1442 ast_log(LOG_WARNING, "Unknown method '%s'. Cannot send request\n", method);
1443 return -1;
1444 }
1445
1446 if (dlg) {
1447 return create_in_dialog_request(pmethod, dlg, tdata);
1448 } else {
1449 ast_assert(endpoint != NULL);
1450 return create_out_of_dialog_request(pmethod, endpoint, uri, contact, tdata);
1451 }
1452}
static int create_in_dialog_request(const pjsip_method *method, struct pjsip_dialog *dlg, pjsip_tx_data **tdata)
Definition res_pjsip.c:1307
static const pjsip_method * get_pjsip_method(const char *method)
Definition res_pjsip.c:1296
static int create_out_of_dialog_request(const pjsip_method *method, struct ast_sip_endpoint *endpoint, const char *uri, struct ast_sip_contact *provided_contact, pjsip_tx_data **tdata)
Definition res_pjsip.c:1325
const pjsip_method * pmethod
Definition res_pjsip.c:1280

References ast_assert, ast_log, create_in_dialog_request(), create_out_of_dialog_request(), get_pjsip_method(), LOG_WARNING, method, NULL, and pmethod.

Referenced by aoc_send_as_xml(), msg_send(), notify_channel(), notify_contact(), notify_uri(), send_unsolicited_mwi_notify_to_contact(), sendtext(), sip_options_qualify_contact(), transmit_info_dtmf(), and transmit_info_with_vidupdate().

◆ ast_sip_create_request_with_auth()

int ast_sip_create_request_with_auth ( const struct ast_sip_auth_vector auths,
pjsip_rx_data *  challenge,
pjsip_tx_data *  tdata,
pjsip_tx_data **  new_request 
)

Create a response to an authentication challenge.

This will call into an outbound authenticator's create_request_with_auth callback to create a new request with authentication credentials. See the create_request_with_auth callback in the ast_sip_outbound_authenticator structure for details about the parameters and return values.

Definition at line 214 of file res_pjsip.c.

216{
218 ast_log(LOG_WARNING, "No SIP outbound authenticator registered. Cannot respond to authentication challenge\n");
219 return -1;
220 }
221 return registered_outbound_authenticator->create_request_with_auth(auths, challenge, old_request, new_request);
222}
static struct ast_sip_outbound_authenticator * registered_outbound_authenticator
Definition res_pjsip.c:189

References ast_log, challenge(), ast_sip_outbound_authenticator::create_request_with_auth, LOG_WARNING, and registered_outbound_authenticator.

Referenced by check_request_status(), handle_registration_response(), outbound_invite_auth(), refer_client_on_evsub_state(), session_inv_on_tsx_state_changed(), and sip_outbound_publish_callback().

◆ ast_sip_create_response()

int ast_sip_create_response ( const pjsip_rx_data *  rdata,
int  st_code,
struct ast_sip_contact contact,
pjsip_tx_data **  p_tdata 
)

General purpose method for creating a SIP response.

Its typical use would be to create responses for out of dialog requests.

Parameters
rdataThe rdata from the incoming request.
st_codeThe response code to transmit.
contactThe contact with which this request is associated.
[out]p_tdataThe newly-created response

The provided contact is attached to tdata with its reference bumped, but will not survive for the entire lifetime of tdata since the contact is cleaned up when all supplements have completed execution.

Return values
0Success
-1Failure

Definition at line 2468 of file res_pjsip.c.

2470{
2471 int res = pjsip_endpt_create_response(ast_sip_get_pjsip_endpoint(), rdata, st_code, NULL, tdata);
2472
2473 if (!res) {
2474 ast_sip_mod_data_set((*tdata)->pool, (*tdata)->mod_data, supplement_module.id, MOD_DATA_CONTACT, ao2_bump(contact));
2475 }
2476
2477 return res;
2478}
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition astobj2.h:480
#define MOD_DATA_CONTACT
Definition res_pjsip.c:66
pjsip_endpoint * ast_sip_get_pjsip_endpoint(void)
Get a pointer to the PJSIP endpoint.
Definition res_pjsip.c:520
static pjsip_module supplement_module
Definition res_pjsip.c:1318
#define ast_sip_mod_data_set(pool, mod_data, id, key, val)
Utilizing a mod_data array for a given id, set the value associated with the given key.
Definition res_pjsip.h:3099

References ao2_bump, ast_sip_get_pjsip_endpoint(), ast_sip_mod_data_set, MOD_DATA_CONTACT, NULL, and supplement_module.

Referenced by register_aor_core(), send_options_response(), and send_response().

◆ ast_sip_default_outbound_endpoint()

struct ast_sip_endpoint * ast_sip_default_outbound_endpoint ( void  )

Retrieve the default outbound endpoint.

Return values
Thedefault outbound endpoint, NULL if not found.

Definition at line 2520 of file pjsip_configuration.c.

2521{
2524 sip_sorcery, "endpoint", name);
2525}
char * ast_sip_global_default_outbound_endpoint(void)
static struct ast_sorcery * sip_sorcery
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
Definition sorcery.c:1917
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition utils.h:978

References ast_free, ast_sip_global_default_outbound_endpoint(), ast_sorcery_retrieve_by_id(), ast_strlen_zero(), name, NULL, RAII_VAR, and sip_sorcery.

Referenced by ast_sip_get_endpoint(), handle_atsign(), handle_single_token(), and notify_uri().

◆ ast_sip_dialog_setup_outbound_authentication()

int ast_sip_dialog_setup_outbound_authentication ( pjsip_dialog *  dlg,
const struct ast_sip_endpoint endpoint,
ast_sip_dialog_outbound_auth_cb  cb,
void *  user_data 
)

Set up outbound authentication on a SIP dialog.

This sets up the infrastructure so that all requests associated with a created dialog can be re-sent with authentication credentials if the original request is challenged.

Parameters
dlgThe dialog on which requests will be authenticated
endpointThe endpoint whom this dialog pertains to
cbCallback to call to send requests with authentication
user_dataData to be provided to the callback when it is called
Return values
0Success
-1Failure

◆ ast_sip_dict_get()

void * ast_sip_dict_get ( void *  ht,
const char *  key 
)

Retrieves the value associated with the given key.

Parameters
htthe hash table/dictionary to search
keythe key to find
Return values
thevalue associated with the key, NULL otherwise.

Definition at line 2327 of file res_pjsip.c.

2328{
2329 unsigned int hval = 0;
2330
2331 if (!ht) {
2332 return NULL;
2333 }
2334
2335 return pj_hash_get(ht, key, PJ_HASH_KEY_STRING, &hval);
2336}

References NULL.

◆ ast_sip_dict_set()

void * ast_sip_dict_set ( pj_pool_t *  pool,
void *  ht,
const char *  key,
void *  val 
)

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.

Parameters
poolthe pool to allocate memory in
htthe hash table/dictionary in which to store the key/value pair
keythe key to associate a value with
valthe value to associate with a key
Return values
thegiven, or newly created, hash table.

Definition at line 2338 of file res_pjsip.c.

2340{
2341 if (!ht) {
2342 ht = pj_hash_create(pool, 11);
2343 }
2344
2345 pj_hash_set(pool, ht, key, PJ_HASH_KEY_STRING, 0, val);
2346
2347 return ht;
2348}

◆ ast_sip_dlg_set_transport()

int ast_sip_dlg_set_transport ( const struct ast_sip_endpoint endpoint,
pjsip_dialog *  dlg,
pjsip_tpselector *  selector 
)

Set the transport on a dialog.

Since
13.15.0
Parameters
endpoint
dlg
selector(optional)
Note
This API calls ast_sip_get_transport_name(endpoint, dlg->target) and if the result is non-NULL, calls pjsip_dlg_set_transport. If 'selector' is non-NULL, it is updated with the selector used.
It is the responsibility of the caller to unref the passed in selector if one is provided.

Definition at line 727 of file res_pjsip.c.

729{
730 pjsip_sip_uri *uri;
731 pjsip_tpselector sel = { .type = PJSIP_TPSELECTOR_NONE, };
732
733 uri = pjsip_uri_get_uri(dlg->target);
734 if (!selector) {
735 selector = &sel;
736 }
737
738 ast_sip_set_tpselector_from_ep_or_uri(endpoint, uri, selector);
739
740 pjsip_dlg_set_transport(dlg, selector);
741
742 if (selector == &sel) {
744 }
745
746 return 0;
747}
int ast_sip_set_tpselector_from_ep_or_uri(const struct ast_sip_endpoint *endpoint, pjsip_sip_uri *sip_uri, pjsip_tpselector *selector)
Sets pjsip_tpselector from an endpoint or uri.
Definition res_pjsip.c:911

References ast_sip_set_tpselector_from_ep_or_uri(), and ast_sip_tpselector_unref().

Referenced by ast_sip_create_dialog_uac().

◆ ast_sip_dtmf_to_str()

int ast_sip_dtmf_to_str ( const enum ast_sip_dtmf_mode  dtmf,
char *  buf,
size_t  buf_len 
)

Convert the DTMF mode enum value into a string.

Since
13.18.0
Parameters
dtmfthe dtmf mode
bufBuffer to receive dtmf mode string
buf_lenBuffer length
Return values
0Success
-1Failure

Definition at line 2504 of file res_pjsip.c.

2506{
2507 switch (dtmf) {
2508 case AST_SIP_DTMF_NONE:
2509 ast_copy_string(buf, "none", buf_len);
2510 break;
2512 ast_copy_string(buf, "rfc4733", buf_len);
2513 break;
2515 ast_copy_string(buf, "inband", buf_len);
2516 break;
2517 case AST_SIP_DTMF_INFO:
2518 ast_copy_string(buf, "info", buf_len);
2519 break;
2520 case AST_SIP_DTMF_AUTO:
2521 ast_copy_string(buf, "auto", buf_len);
2522 break;
2524 ast_copy_string(buf, "auto_info", buf_len);
2525 break;
2526 default:
2527 buf[0] = '\0';
2528 return -1;
2529 }
2530 return 0;
2531}

References ast_copy_string(), AST_SIP_DTMF_AUTO, AST_SIP_DTMF_AUTO_INFO, AST_SIP_DTMF_INBAND, AST_SIP_DTMF_INFO, AST_SIP_DTMF_NONE, AST_SIP_DTMF_RFC_4733, and buf.

Referenced by dtmf_to_str(), and pjsip_acf_dtmf_mode_read().

◆ ast_sip_endpoint_alloc()

void * ast_sip_endpoint_alloc ( const char *  name)

Allocate a new SIP endpoint.

This will return an endpoint with its refcount increased by one. This reference can be released using ao2_ref().

Parameters
nameThe name of the endpoint.
Return values
NULLEndpoint allocation failed
non-NULLThe newly allocated endpoint

Definition at line 2459 of file pjsip_configuration.c.

2460{
2461 struct ast_sip_endpoint *endpoint = ast_sorcery_generic_alloc(sizeof(*endpoint), endpoint_destructor);
2462 if (!endpoint) {
2463 return NULL;
2464 }
2465 if (ast_string_field_init(endpoint, 128)) {
2466 ao2_cleanup(endpoint);
2467 return NULL;
2468 }
2469
2470 if (ast_string_field_init_extended(endpoint, geoloc_incoming_call_profile) ||
2471 ast_string_field_init_extended(endpoint, geoloc_outgoing_call_profile)) {
2472 ao2_cleanup(endpoint);
2473 return NULL;
2474 }
2475 if (ast_string_field_init_extended(endpoint, overlap_context)) {
2476 ao2_cleanup(endpoint);
2477 return NULL;
2478 }
2479 if (ast_string_field_init_extended(endpoint, tenantid)) {
2480 ao2_cleanup(endpoint);
2481 return NULL;
2482 }
2483
2485 ao2_cleanup(endpoint);
2486 return NULL;
2487 }
2489 ao2_cleanup(endpoint);
2490 return NULL;
2491 }
2492 if (init_info_configuration(&endpoint->info)) {
2493 ao2_cleanup(endpoint);
2494 return NULL;
2495 }
2496 if (init_media_configuration(&endpoint->media)) {
2497 ao2_cleanup(endpoint);
2498 return NULL;
2499 }
2500
2501 ast_party_id_init(&endpoint->id.self);
2502 endpoint->id.self.tag = ast_strdup("");
2503
2504 if (AST_VECTOR_INIT(&endpoint->ident_method_order, 1)) {
2505 return NULL;
2506 }
2507
2508 return endpoint;
2509}
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition channel.c:1725
@ AST_FORMAT_CAP_FLAG_DEFAULT
Definition format_cap.h:38
#define ast_format_cap_alloc(flags)
Allocate a new ast_format_cap structure.
Definition format_cap.h:49
static int init_info_configuration(struct ast_sip_endpoint_info_configuration *info)
static int init_media_configuration(struct ast_sip_endpoint_media_configuration *media)
static int init_subscription_configuration(struct ast_sip_endpoint_subscription_configuration *subscription)
static void endpoint_destructor(void *obj)
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
Definition sorcery.c:1792
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
#define ast_string_field_init_extended(x, field)
Initialize an extended string field.
char * tag
User-set "tag".
Definition channel.h:356

References ao2_cleanup, ast_format_cap_alloc, AST_FORMAT_CAP_FLAG_DEFAULT, ast_party_id_init(), ast_sorcery_generic_alloc(), ast_strdup, ast_string_field_init, ast_string_field_init_extended, AST_VECTOR_INIT, ast_sip_endpoint_media_configuration::codecs, endpoint_destructor(), ast_sip_endpoint::id, ast_sip_endpoint::ident_method_order, ast_sip_endpoint::info, init_info_configuration(), init_media_configuration(), init_subscription_configuration(), ast_sip_endpoint::media, NULL, ast_sip_endpoint_id_configuration::self, ast_sip_endpoint::subscription, and ast_party_id::tag.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ast_sip_failover_request()

int ast_sip_failover_request ( pjsip_tx_data *  tdata)

Set a request to use the next value in the list of resolved addresses.

Parameters
tdatathe tx data from the original request
Return values
0No more addresses to try
1The request was successfully re-intialized

Definition at line 1816 of file res_pjsip.c.

1817{
1818 pjsip_via_hdr *via;
1819
1820 if (!tdata || !tdata->dest_info.addr.count
1821 || (tdata->dest_info.cur_addr == tdata->dest_info.addr.count - 1)) {
1822 /* No more addresses to try */
1823 return 0;
1824 }
1825
1826 /* Try next address */
1827 ++tdata->dest_info.cur_addr;
1828
1829 via = (pjsip_via_hdr*)pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL);
1830 via->branch_param.slen = 0;
1831
1832 pjsip_tx_data_invalidate_msg(tdata);
1833
1834 return 1;
1835}

References NULL, and send_request_wrapper::tdata.

Referenced by check_request_status(), check_request_status(), and handle_registration_response().

◆ ast_sip_find_transport_state_in_use()

struct ast_sip_transport_state * ast_sip_find_transport_state_in_use ( struct ast_sip_request_transport_details details)

Returns the transport state currently in use based on request transport details.

Parameters
details
Return values
transport_state
Note
ao2_cleanup(...) or ao2_ref(..., -1) must be called on the returned object

Definition at line 595 of file res_pjsip.c.

595 {
597
599 return NULL;
600 }
601
603}
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
Definition astobj2.h:1693
static struct ao2_container * transport_states
static int find_transport_state_in_use(void *obj, void *arg, int flags)
Callback function for finding the transport the request is going out on.
Definition res_pjsip.c:576

References ao2_callback, ao2_cleanup, ast_sip_get_transport_states(), find_transport_state_in_use(), NULL, RAII_VAR, and transport_states.

Referenced by ast_sip_rewrite_uri_to_local(), and process_nat().

◆ ast_sip_for_each_aor()

int ast_sip_for_each_aor ( const char *  aors,
ao2_callback_fn  on_aor,
void *  arg 
)

For every aor in the comma separated aors string call the given 'on_aor' handler.

Parameters
aorsa comma separated list of aors
on_aorcallback for each aor
arguser data passed to handler
Return values
0Success, non-zero on failure

Definition at line 688 of file location.c.

689{
690 char *copy;
691 char *name;
692 int res;
693
694 if (!on_aor || ast_strlen_zero(aors)) {
695 return 0;
696 }
697
698 copy = ast_strdupa(aors);
699 while ((name = ast_strip(strsep(&copy, ",")))) {
700 struct ast_sip_aor *aor;
701
703 if (aor) {
704 res = on_aor(aor, arg, 0);
705 ao2_ref(aor, -1);
706 if (res) {
707 return -1;
708 }
709 }
710 }
711 return 0;
712}
static int copy(char *infile, char *outfile)
Utility function to copy a file.
struct ast_sip_aor * ast_sip_location_retrieve_aor(const char *aor_name)
Retrieve a named AOR.
Definition location.c:147

References ao2_ref, ast_sip_location_retrieve_aor(), ast_strdupa, ast_strip(), ast_strlen_zero(), copy(), name, and strsep().

Referenced by ami_registrations_endpoint(), ast_sip_location_retrieve_contacts_from_aor_list(), cli_aor_iterate(), format_ami_contact_status(), format_ami_endpoint_aor(), format_ami_endpoints(), mwi_new_subscribe(), and mwi_subscribe_all().

◆ ast_sip_for_each_auth()

int ast_sip_for_each_auth ( const struct ast_sip_auth_vector array,
ao2_callback_fn  on_auth,
void *  arg 
)

For every auth in the array call the given 'on_auth' handler.

Parameters
arrayan array of auths
on_authcallback for each auth
arguser data passed to handler
Return values
0Success, non-zero on failure

Definition at line 484 of file config_auth.c.

486{
487 int i;
488
489 if (!vector || !AST_VECTOR_SIZE(vector)) {
490 return 0;
491 }
492
493 for (i = 0; i < AST_VECTOR_SIZE(vector); ++i) {
494 /* AST_VECTOR_GET is safe to use since the vector is immutable */
497 AST_VECTOR_GET(vector,i)), ao2_cleanup);
498
499 if (!auth) {
500 continue;
501 }
502
503 if (on_auth(auth, arg, 0)) {
504 return -1;
505 }
506 }
507
508 return 0;
509}
#define SIP_SORCERY_AUTH_TYPE
Definition res_pjsip.h:597

References ao2_cleanup, ast_sip_get_sorcery(), ast_sorcery_retrieve_by_id(), AST_VECTOR_GET, AST_VECTOR_SIZE, RAII_VAR, and SIP_SORCERY_AUTH_TYPE.

Referenced by ast_sip_format_auths_ami(), and cli_iterator().

◆ ast_sip_for_each_channel()

int ast_sip_for_each_channel ( const struct ast_sip_endpoint endpoint,
ao2_callback_fn  on_channel_snapshot,
void *  arg 
)

For every channel snapshot on an endpoint all the given 'on_channel_snapshot' handler.

Parameters
endpointendpoint
on_channel_snapshotcallback for each channel snapshot
arguser data passed to handler
Return values
0Success, non-zero on failure

Definition at line 1705 of file pjsip_configuration.c.

1708{
1709 RAII_VAR(struct ast_endpoint_snapshot *, endpoint_snapshot, ast_sip_get_endpoint_snapshot(endpoint), ao2_cleanup);
1710 return ast_sip_for_each_channel_snapshot(endpoint_snapshot, on_channel_snapshot, arg);
1711}
int ast_sip_for_each_channel_snapshot(const struct ast_endpoint_snapshot *endpoint_snapshot, ao2_callback_fn on_channel_snapshot, void *arg)
For every channel snapshot on an endpoint snapshot call the given 'on_channel_snapshot' handler.
struct ast_endpoint_snapshot * ast_sip_get_endpoint_snapshot(const struct ast_sip_endpoint *endpoint)
Retrieve the endpoint snapshot for an endpoint.

References ao2_cleanup, ast_sip_for_each_channel_snapshot(), ast_sip_get_endpoint_snapshot(), and RAII_VAR.

Referenced by cli_channel_iterate(), and cli_channelstats_iterate().

◆ ast_sip_for_each_channel_snapshot()

int ast_sip_for_each_channel_snapshot ( const struct ast_endpoint_snapshot endpoint_snapshot,
ao2_callback_fn  on_channel_snapshot,
void *  arg 
)

For every channel snapshot on an endpoint snapshot call the given 'on_channel_snapshot' handler.

Parameters
endpoint_snapshotsnapshot of an endpoint
on_channel_snapshotcallback for each channel snapshot
arguser data passed to handler
Return values
0Success, non-zero on failure

Definition at line 1678 of file pjsip_configuration.c.

1681{
1682 int num, num_channels = endpoint_snapshot->num_channels;
1683
1684 if (!on_channel_snapshot || !num_channels) {
1685 return 0;
1686 }
1687
1688 for (num = 0; num < num_channels; ++num) {
1689 RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
1690 int res;
1691
1692 snapshot = ast_channel_snapshot_get_latest(endpoint_snapshot->channel_ids[num]);
1693 if (!snapshot) {
1694 continue;
1695 }
1696
1697 res = on_channel_snapshot(snapshot, arg, 0);
1698 if (res) {
1699 return -1;
1700 }
1701 }
1702 return 0;
1703}
struct ast_channel_snapshot * ast_channel_snapshot_get_latest(const char *uniqueid)
Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object,...
Structure representing a snapshot of channel state.

References ao2_cleanup, ast_channel_snapshot_get_latest(), ast_endpoint_snapshot::channel_ids, NULL, ast_endpoint_snapshot::num_channels, and RAII_VAR.

Referenced by ast_sip_for_each_channel().

◆ ast_sip_for_each_contact()

int ast_sip_for_each_contact ( const struct ast_sip_aor aor,
ao2_callback_fn  on_contact,
void *  arg 
)

For every contact on an AOR call the given 'on_contact' handler.

Parameters
aorthe aor containing a list of contacts to iterate
on_contactcallback on each contact on an AOR. The object received by the callback will be a ast_sip_contact_wrapper structure.
arguser data passed to handler
Return values
0Success, non-zero on failure

Definition at line 723 of file location.c.

725{
726 struct ao2_container *contacts;
727 struct ao2_iterator i;
728 int res = 0;
729 void *object = NULL;
730
731 if (!on_contact ||
732 !(contacts = ast_sip_location_retrieve_aor_contacts(aor))) {
733 return 0;
734 }
735
736 i = ao2_iterator_init(contacts, 0);
737 while ((object = ao2_iterator_next(&i))) {
738 RAII_VAR(struct ast_sip_contact *, contact, object, ao2_cleanup);
740 const char *aor_id = ast_sorcery_object_get_id(aor);
741
742 wrapper = ao2_alloc_options(sizeof(struct ast_sip_contact_wrapper),
744 if (!wrapper) {
745 res = -1;
746 break;
747 }
748 wrapper->contact_id = ast_malloc(strlen(aor_id) + strlen(contact->uri) + 2);
749 if (!wrapper->contact_id) {
750 res = -1;
751 break;
752 }
753 sprintf(wrapper->contact_id, "%s/%s", aor_id, contact->uri);
754 wrapper->aor_id = ast_strdup(aor_id);
755 if (!wrapper->aor_id) {
756 res = -1;
757 break;
758 }
759 wrapper->contact = contact;
760 ao2_bump(wrapper->contact);
761
762 if ((res = on_contact(wrapper, arg, 0))) {
763 break;
764 }
765 }
767 ao2_ref(contacts, -1);
768 return res;
769}
#define ast_malloc(len)
A wrapper for malloc()
Definition astmm.h:191
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition astobj2.h:404
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
static void contact_wrapper_destroy(void *obj)
Definition location.c:714
struct ao2_container * ast_sip_location_retrieve_aor_contacts(const struct ast_sip_aor *aor)
Retrieve all contacts currently available for an AOR.
Definition location.c:247
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_bump, ao2_cleanup, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_malloc, ast_sip_location_retrieve_aor_contacts(), ast_sorcery_object_get_id(), ast_strdup, contact_wrapper_destroy(), NULL, and RAII_VAR.

Referenced by ami_registrations_aor(), cli_aor_gather_contacts(), cli_contact_iterate(), contacts_to_str(), contacts_to_var_list(), format_contact_status_for_aor(), and sip_endpoints_aors_ami().

◆ ast_sip_format_auths_ami()

int ast_sip_format_auths_ami ( const struct ast_sip_auth_vector auths,
struct ast_sip_ami ami 
)

Format auth details for AMI.

Parameters
authsan auth array
amiami variable container
Return values
0Success, non-zero on failure

Definition at line 544 of file config_auth.c.

546{
548}
static int format_ami_auth_handler(void *obj, void *arg, int flags)
int ast_sip_for_each_auth(const struct ast_sip_auth_vector *vector, ao2_callback_fn on_auth, void *arg)
For every auth in the array call the given 'on_auth' handler.

References ast_sip_for_each_auth(), and format_ami_auth_handler().

Referenced by ami_outbound_registration_task(), and format_ami_endpoint_auth().

◆ ast_sip_format_contact_ami()

int ast_sip_format_contact_ami ( void *  obj,
void *  arg,
int  flags 
)

Formats the contact and sends over AMI.

Parameters
obja pointer an ast_sip_contact_wrapper structure
arga pointer to an ast_sip_ami structure
flagsignored
Return values
0Success, otherwise non-zero on error

Definition at line 2730 of file pjsip_options.c.

2731{
2732 struct ast_sip_contact_wrapper *wrapper = obj;
2733 struct ast_sip_contact *contact = wrapper->contact;
2734 struct ast_sip_ami *ami = arg;
2736 struct ast_str *buf;
2737 const struct ast_sip_endpoint *endpoint = ami->arg;
2738 char secs[AST_TIME_T_LEN];
2739
2740 buf = ast_sip_create_ami_event("ContactStatusDetail", ami);
2741 if (!buf) {
2742 return -1;
2743 }
2744
2746
2747 ast_str_append(&buf, 0, "AOR: %s\r\n", wrapper->aor_id);
2748 ast_str_append(&buf, 0, "URI: %s\r\n", contact->uri);
2749 ast_str_append(&buf, 0, "UserAgent: %s\r\n", contact->user_agent);
2750 ast_time_t_to_string(contact->expiration_time.tv_sec, secs, sizeof(secs));
2751 ast_str_append(&buf, 0, "RegExpire: %s\r\n", secs);
2752 if (!ast_strlen_zero(contact->via_addr)) {
2753 ast_str_append(&buf, 0, "ViaAddress: %s", contact->via_addr);
2754 if (contact->via_port) {
2755 ast_str_append(&buf, 0, ":%d", contact->via_port);
2756 }
2757 ast_str_append(&buf, 0, "\r\n");
2758 }
2759 if (!ast_strlen_zero(contact->call_id)) {
2760 ast_str_append(&buf, 0, "CallID: %s\r\n", contact->call_id);
2761 }
2762 ast_str_append(&buf, 0, "Status: %s\r\n",
2764 if (!status || status->status != AVAILABLE) {
2765 ast_str_append(&buf, 0, "RoundtripUsec: N/A\r\n");
2766 } else {
2767 ast_str_append(&buf, 0, "RoundtripUsec: %" PRId64 "\r\n", status->rtt);
2768 }
2769 ast_str_append(&buf, 0, "EndpointName: %s\r\n",
2770 endpoint ? ast_sorcery_object_get_id(endpoint) : S_OR(contact->endpoint_name, ""));
2771
2772 ast_str_append(&buf, 0, "ID: %s\r\n", ast_sorcery_object_get_id(contact));
2773 ast_str_append(&buf, 0, "AuthenticateQualify: %d\r\n", contact->authenticate_qualify);
2774 ast_str_append(&buf, 0, "OutboundProxy: %s\r\n", contact->outbound_proxy);
2775 ast_str_append(&buf, 0, "Path: %s\r\n", contact->path);
2776 ast_str_append(&buf, 0, "QualifyFrequency: %u\r\n", contact->qualify_frequency);
2777 ast_str_append(&buf, 0, "QualifyTimeout: %.3f\r\n", contact->qualify_timeout);
2778 ast_str_append(&buf, 0, "Qualify2xxOnly: %d\r\n", contact->qualify_2xx_only);
2779
2780 astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
2781 ami->count++;
2782
2783 ast_free(buf);
2785 return 0;
2786}
void astman_append(struct mansession *s, const char *fmt,...)
Definition manager.c:1903
struct ast_sip_contact_status * ast_sip_get_contact_status(const struct ast_sip_contact *contact)
Retrieve the current status for a contact.
const char * ast_sip_get_contact_status_label(const enum ast_sip_contact_status_type status)
translate ast_sip_contact_status_type to character string.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
int ast_time_t_to_string(time_t time, char *buf, size_t length)
Converts to a string representation of a time_t as decimal seconds since the epoch....
Definition time.c:152
#define AST_TIME_T_LEN
Definition time.h:45

References ao2_cleanup, ast_sip_contact_wrapper::aor_id, ast_sip_ami::arg, ast_free, ast_sip_create_ami_event(), ast_sip_get_contact_status(), ast_sip_get_contact_status_label(), ast_sorcery_object_get_id(), ast_str_append(), ast_str_buffer(), ast_strlen_zero(), AST_TIME_T_LEN, ast_time_t_to_string(), astman_append(), ast_sip_contact::authenticate_qualify, AVAILABLE, buf, ast_sip_contact::call_id, ast_sip_contact_wrapper::contact, ast_sip_ami::count, ast_sip_contact::endpoint_name, ast_sip_contact::expiration_time, ast_sip_contact::outbound_proxy, ast_sip_contact::path, ast_sip_contact::qualify_2xx_only, ast_sip_contact::qualify_frequency, ast_sip_contact::qualify_timeout, ast_sip_ami::s, S_OR, status, UNKNOWN, ast_sip_contact::uri, ast_sip_contact::user_agent, ast_sip_contact::via_addr, and ast_sip_contact::via_port.

Referenced by ami_show_registration_contact_statuses(), and format_contact_status_for_aor().

◆ ast_sip_format_endpoint_ami()

int ast_sip_format_endpoint_ami ( struct ast_sip_endpoint endpoint,
struct ast_sip_ami ami,
int *  count 
)

Formats the endpoint and sends over AMI.

Parameters
endpointthe endpoint to format and send
amiAMI variable container
countthe number of formatters operated on
Return values
0Success, otherwise non-zero on error

Definition at line 501 of file res_pjsip.c.

503{
504 int res = 0;
507 *count = 0;
509 if (i->format_ami && ((res = i->format_ami(endpoint, ami)) < 0)) {
510 return res;
511 }
512
513 if (!res) {
514 (*count)++;
515 }
516 }
517 return 0;
518}
ast_mutex_t lock
Definition app_sla.c:337
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition linkedlists.h:78
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
#define AST_RWLIST_TRAVERSE
#define SCOPED_LOCK(varname, lock, lockfunc, unlockfunc)
Scoped Locks.
Definition lock.h:590

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_sip_endpoint_formatter::format_ami, lock, ast_sip_endpoint_formatter::next, and SCOPED_LOCK.

Referenced by ami_show_endpoint().

◆ ast_sip_get_all_codecs_on_empty_reinvite()

unsigned int ast_sip_get_all_codecs_on_empty_reinvite ( void  )

Retrieve the system setting 'all_codecs_on_empty_reinvite'.

Return values
nonzero if we should return all codecs on empty re-INVITE

Definition at line 596 of file config_global.c.

597{
598 unsigned int all_codecs_on_empty_reinvite;
599 struct global_config *cfg;
600
601 cfg = get_global_cfg();
602 if (!cfg) {
604 }
605
607 ao2_ref(cfg, -1);
609}
static struct global_config * get_global_cfg(void)
#define DEFAULT_ALL_CODECS_ON_EMPTY_REINVITE
unsigned int all_codecs_on_empty_reinvite

References global_config::all_codecs_on_empty_reinvite, ao2_ref, DEFAULT_ALL_CODECS_ON_EMPTY_REINVITE, and get_global_cfg().

Referenced by session_inv_on_create_offer().

◆ ast_sip_get_allow_sending_180_after_183()

unsigned int ast_sip_get_allow_sending_180_after_183 ( void  )

Retrieve the global setting 'allow_sending_180_after_183'.

Return values
nonzero if disable.

Definition at line 506 of file config_global.c.

507{
508 unsigned int allow_sending_180_after_183;
509 struct global_config *cfg;
510
511 cfg = get_global_cfg();
512 if (!cfg) {
514 }
515
517 ao2_ref(cfg, -1);
519}
#define DEFAULT_ALLOW_SENDING_180_AFTER_183
unsigned int allow_sending_180_after_183

References global_config::allow_sending_180_after_183, ao2_ref, DEFAULT_ALLOW_SENDING_180_AFTER_183, and get_global_cfg().

Referenced by chan_pjsip_indicate().

◆ ast_sip_get_artificial_auth()

struct ast_sip_auth * ast_sip_get_artificial_auth ( void  )

Retrieves a reference to the artificial auth.

Return values
Theartificial auth

Definition at line 643 of file pjsip_distributor.c.

644{
645 return ao2_global_obj_ref(artificial_auth);
646}
#define ao2_global_obj_ref(holder)
Get a reference to the object stored in the global holder.
Definition astobj2.h:918

References ao2_global_obj_ref.

Referenced by digest_check_auth().

◆ ast_sip_get_artificial_endpoint()

struct ast_sip_endpoint * ast_sip_get_artificial_endpoint ( void  )

Retrieves a reference to the artificial endpoint.

Return values
Theartificial endpoint

Definition at line 666 of file pjsip_distributor.c.

667{
669 return artificial_endpoint;
670}
static struct ast_sip_endpoint * artificial_endpoint

References ao2_ref, and artificial_endpoint.

Referenced by digest_check_auth(), digest_requires_authentication(), endpoint_lookup(), and get_account_id().

◆ ast_sip_get_contact_expiration_check_interval()

unsigned int ast_sip_get_contact_expiration_check_interval ( void  )

Retrieve the system contact expiration check interval setting.

Return values
thecontact expiration check interval.

Definition at line 342 of file config_global.c.

343{
344 unsigned int interval;
345 struct global_config *cfg;
346
347 cfg = get_global_cfg();
348 if (!cfg) {
350 }
351
352 interval = cfg->contact_expiration_check_interval;
353 ao2_ref(cfg, -1);
354 return interval;
355}
#define DEFAULT_CONTACT_EXPIRATION_CHECK_INTERVAL
unsigned int contact_expiration_check_interval

References ao2_ref, global_config::contact_expiration_check_interval, DEFAULT_CONTACT_EXPIRATION_CHECK_INTERVAL, and get_global_cfg().

Referenced by expiration_global_loaded().

◆ ast_sip_get_contact_short_status_label()

const char * ast_sip_get_contact_short_status_label ( const enum ast_sip_contact_status_type  status)

Definition at line 341 of file pjsip_options.c.

342{
344 return short_status_map[status];
345}
static const char * short_status_map[]
#define ARRAY_LEN(a)
Definition utils.h:703

References ARRAY_LEN, ast_assert, short_status_map, and status.

Referenced by cli_contact_print_body().

◆ ast_sip_get_contact_sip_uri()

pjsip_sip_uri * ast_sip_get_contact_sip_uri ( pjsip_tx_data *  tdata)

Return the SIP URI of the Contact header.

Parameters
tdata
Return values
Pointerto SIP URI of Contact
NULLif Contact header not found or not a SIP(S) URI
Note
Do not free the returned object.

Definition at line 564 of file res_pjsip.c.

565{
566 pjsip_contact_hdr *contact = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_CONTACT, NULL);
567
568 if (!contact || (!PJSIP_URI_SCHEME_IS_SIP(contact->uri) && !PJSIP_URI_SCHEME_IS_SIPS(contact->uri))) {
569 return NULL;
570 }
571
572 return pjsip_uri_get_uri(contact->uri);
573}

References NULL.

Referenced by ast_sip_rewrite_uri_to_local(), ast_sip_set_request_transport_details(), and process_nat().

◆ ast_sip_get_contact_status()

struct ast_sip_contact_status * ast_sip_get_contact_status ( const struct ast_sip_contact contact)

Retrieve the current status for a contact.

Parameters
contactThe contact.
Return values
non-NULLSuccess
NULLStatus information not found
Note
The returned contact status object is immutable.

Definition at line 527 of file pjsip_options.c.

528{
531}
#define ao2_find(container, arg, flags)
Definition astobj2.h:1736
@ OBJ_SEARCH_KEY
The arg parameter is a search key, but is not an object.
Definition astobj2.h:1101
static struct ao2_container * sip_options_contact_statuses

References ao2_find, ast_sorcery_object_get_id(), OBJ_SEARCH_KEY, and sip_options_contact_statuses.

Referenced by add_outgoing_request_headers(), ast_sip_format_contact_ami(), cli_contact_print_body(), contact_add_security_headers_to_status(), contact_has_security_mechanisms(), contact_remove_unreachable(), format_ami_contactlist_handler(), pjsip_contact_function_read(), registrar_add_unreachable(), rfc3329_incoming_response(), sip_options_contact_update_task(), and vec_contact_cmp().

◆ ast_sip_get_contact_status_label()

const char * ast_sip_get_contact_status_label ( const enum ast_sip_contact_status_type  status)

◆ ast_sip_get_debug()

char * ast_sip_get_debug ( void  )

Retrieve the system debug setting (yes|no|host).

Note
returned string needs to be de-allocated by caller.
Return values
thesystem debug setting.

Definition at line 265 of file config_global.c.

266{
267 char *res;
268 struct global_config *cfg;
269
270 cfg = get_global_cfg();
271 if (!cfg) {
273 }
274
275 res = ast_strdup(cfg->debug);
276 ao2_ref(cfg, -1);
277 return res;
278}
#define DEFAULT_DEBUG
const ast_string_field debug

References ao2_ref, ast_strdup, global_config::debug, DEFAULT_DEBUG, and get_global_cfg().

Referenced by check_debug().

◆ ast_sip_get_default_auth_algorithms_uac()

void ast_sip_get_default_auth_algorithms_uac ( char *  default_auth_algorithms_uac,
size_t  size 
)

Retrieve the global auth algorithms for UAC.

Parameters
[out]default_auth_algorithms_uacThe default algorithms
sizeThe buffer size of default_auth_algorithms_uac

Definition at line 434 of file config_global.c.

435{
436 struct global_config *cfg;
437
438 cfg = get_global_cfg();
439 if (!cfg) {
441 } else {
443 ao2_ref(cfg, -1);
444 }
445}
#define DEFAULT_AUTH_ALGORITHMS_UAC
const ast_string_field default_auth_algorithms_uac

References ao2_ref, ast_copy_string(), DEFAULT_AUTH_ALGORITHMS_UAC, global_config::default_auth_algorithms_uac, and get_global_cfg().

Referenced by auth_apply(), and create_artificial_auth().

◆ ast_sip_get_default_auth_algorithms_uas()

void ast_sip_get_default_auth_algorithms_uas ( char *  default_auth_algorithms_uas,
size_t  size 
)

Retrieve the global auth algorithms for UAS.

Parameters
[out]default_auth_algorithms_uasThe default algorithms
sizeThe buffer size of default_auth_algorithms_uas

Definition at line 421 of file config_global.c.

422{
423 struct global_config *cfg;
424
425 cfg = get_global_cfg();
426 if (!cfg) {
428 } else {
430 ao2_ref(cfg, -1);
431 }
432}
#define DEFAULT_AUTH_ALGORITHMS_UAS
const ast_string_field default_auth_algorithms_uas

References ao2_ref, ast_copy_string(), DEFAULT_AUTH_ALGORITHMS_UAS, global_config::default_auth_algorithms_uas, and get_global_cfg().

Referenced by auth_apply(), and create_artificial_auth().

◆ ast_sip_get_default_from_user()

void ast_sip_get_default_from_user ( char *  from_user,
size_t  size 
)

Retrieve the global default from user.

This is the value placed in outbound requests' From header if there is no better option (such as an endpoint-configured from_user or caller ID number).

Parameters
[out]from_userThe default from user
sizeThe buffer size of from_user

Definition at line 447 of file config_global.c.

448{
449 struct global_config *cfg;
450
451 cfg = get_global_cfg();
452 if (!cfg) {
453 ast_copy_string(from_user, DEFAULT_FROM_USER, size);
454 } else {
455 ast_copy_string(from_user, cfg->default_from_user, size);
456 ao2_ref(cfg, -1);
457 }
458}
#define DEFAULT_FROM_USER
const ast_string_field default_from_user

References ao2_ref, ast_copy_string(), DEFAULT_FROM_USER, global_config::default_from_user, and get_global_cfg().

Referenced by sip_dialog_create_from().

◆ ast_sip_get_default_realm()

void ast_sip_get_default_realm ( char *  realm,
size_t  size 
)

Retrieve the global default realm.

This is the value placed in outbound challenges' realm if there is no better option (such as an auth-configured realm).

Parameters
[out]realmThe default realm
sizeThe buffer size of realm

Definition at line 408 of file config_global.c.

409{
410 struct global_config *cfg;
411
412 cfg = get_global_cfg();
413 if (!cfg) {
414 ast_copy_string(realm, DEFAULT_REALM, size);
415 } else {
416 ast_copy_string(realm, cfg->default_realm, size);
417 ao2_ref(cfg, -1);
418 }
419}
#define DEFAULT_REALM
const ast_string_field default_realm

References ao2_ref, ast_copy_string(), DEFAULT_REALM, global_config::default_realm, and get_global_cfg().

Referenced by create_artificial_auth(), and global_loaded().

◆ ast_sip_get_default_voicemail_extension()

char * ast_sip_get_default_voicemail_extension ( void  )

Retrieve the default voicemail extension.

Since
13.9.0
Note
returned string needs to be de-allocated by caller.
Return values
thedefault voicemail extension

Definition at line 296 of file config_global.c.

297{
298 char *res;
299 struct global_config *cfg;
300
301 cfg = get_global_cfg();
302 if (!cfg) {
304 }
305
307 ao2_ref(cfg, -1);
308
309 return res;
310}
#define DEFAULT_VOICEMAIL_EXTENSION
const ast_string_field default_voicemail_extension

References ao2_ref, ast_strdup, DEFAULT_VOICEMAIL_EXTENSION, global_config::default_voicemail_extension, and get_global_cfg().

Referenced by global_loaded().

◆ ast_sip_get_device_state()

const char * ast_sip_get_device_state ( const struct ast_sip_endpoint endpoint)

Retrieve the device state for an endpoint.

Parameters
endpointThe endpoint whose state is to be retrieved.
Return values
Thedevice state.

Definition at line 1662 of file pjsip_configuration.c.

1663{
1664 char device[MAX_OBJECT_FIELD];
1665
1666 snprintf(device, MAX_OBJECT_FIELD, "PJSIP/%s", ast_sorcery_object_get_id(endpoint));
1667 return ast_devstate2str(ast_device_state(device));
1668}
const char * ast_devstate2str(enum ast_device_state devstate) attribute_pure
Convert device state to text string for output.
ast_device_state
Device States.
Definition devicestate.h:52

References ast_devstate2str(), ast_sorcery_object_get_id(), and MAX_OBJECT_FIELD.

Referenced by cli_endpoint_print_body(), format_ami_endpoints(), and sip_endpoint_to_ami().

◆ ast_sip_get_disable_multi_domain()

unsigned int ast_sip_get_disable_multi_domain ( void  )

Retrieve the system setting 'disable multi domain'.

Since
13.9.0
Return values
nonzero if disable multi domain.

Definition at line 357 of file config_global.c.

358{
359 unsigned int disable_multi_domain;
360 struct global_config *cfg;
361
362 cfg = get_global_cfg();
363 if (!cfg) {
365 }
366
368 ao2_ref(cfg, -1);
370}
#define DEFAULT_DISABLE_MULTI_DOMAIN
unsigned int disable_multi_domain

References ao2_ref, DEFAULT_DISABLE_MULTI_DOMAIN, global_config::disable_multi_domain, and get_global_cfg().

Referenced by anonymous_identify(), find_endpoint(), request(), and sip_dialog_create_from().

◆ ast_sip_get_endpoint()

struct ast_sip_endpoint * ast_sip_get_endpoint ( const char *  to,
int  get_default_outbound,
char **  uri 
)

Retrieves an endpoint and URI from the "to" string.

This URI is used as the Request URI.

Expects the given 'to' to be in one of the following formats: Why we allow so many is a mystery.

Basic:

 endpoint        : We'll get URI from the default aor/contact
 endpoint/aor    : We'll get the URI from the specific aor/contact
 endpoint@domain : We toss the domain part and just use the endpoint

These all use the endpoint and specified URI:

     endpoint/<sip[s]:host>
     endpoint/<sip[s]:user@host>
     endpoint/"Bob" <sip[s]:host>
     endpoint/"Bob" <sip[s]:user@host>
     endpoint/sip[s]:host
     endpoint/sip[s]:user@host
     endpoint/host
     endpoint/user@host

These all use the default endpoint and specified URI:

     <sip[s]:host>
     <sip[s]:user@host>
     "Bob" <sip[s]:host>
     "Bob" <sip[s]:user@host>
     sip[s]:host
     sip[s]:user@host

These use the default endpoint and specified host:

     host
     user@host

This form is similar to a dialstring:

     PJSIP/user@endpoint

In this case, the user will be added to the endpoint contact's URI. If the contact URI already has a user, it will be replaced.

The ones that have the sip[s] scheme are the easiest to parse. The rest all have some issue.

 endpoint vs host              : We have to test for endpoint first
 endpoint/aor vs endpoint/host : We have to test for aor first
                                 What if there's an aor with the same
                                 name as the host?
 endpoint@domain vs user@host  : We have to test for endpoint first.
                                 What if there's an endpoint with the
                                 same name as the user?
Parameters
to'To' field with possible endpoint
get_default_outboundIf nonzero, try to retrieve the default outbound endpoint if no endpoint was found. Otherwise, return NULL if no endpoint was found.
uriPointer to a char* which will be set to the URI. Always must be ast_free'd by the caller - even if the return value is NULL!
Note
The logic below could probably be condensed but then it wouldn't be as clear.

Definition at line 3249 of file res_pjsip.c.

3250{
3251 char *destination;
3252 char *slash = NULL;
3253 char *atsign = NULL;
3254 char *scheme = NULL;
3255 struct ast_sip_endpoint *endpoint = NULL;
3256
3257 destination = ast_strdupa(to);
3258
3259 slash = strchr(destination, '/');
3260 atsign = strchr(destination, '@');
3261 scheme = S_OR(strstr(destination, "sip:"), strstr(destination, "sips:"));
3262
3263 if (!slash && !atsign && !scheme) {
3264 /*
3265 * If there's only a single token, it can be either...
3266 * endpoint
3267 * host
3268 */
3269 return handle_single_token(to, destination, get_default_outbound, uri);
3270 }
3271
3272 if (slash) {
3273 /*
3274 * If there's a '/', then the form must be one of the following...
3275 * PJSIP/user@endpoint
3276 * endpoint/aor
3277 * endpoint/uri
3278 */
3279 return handle_slash(to, destination, uri, slash, atsign, scheme);
3280 }
3281
3282 if (atsign && !scheme) {
3283 /*
3284 * If there's an '@' but no scheme then it's either following an endpoint name
3285 * and being followed by a domain name (which we discard).
3286 * OR is's a user@host uri without a scheme. It's probably the latter but because
3287 * endpoint@domain looks just like user@host, we'll test for endpoint first.
3288 */
3289 return handle_atsign(to, destination, uri, slash, atsign, scheme, get_default_outbound);
3290 }
3291
3292 /*
3293 * If all else fails, we assume it's a URI or just a hostname.
3294 */
3295 if (scheme) {
3296 *uri = ast_strdup(destination);
3297 if (!(*uri)) {
3298 goto failure;
3299 }
3300 ast_debug(3, "Dest: '%s' Didn't find an endpoint but did find a scheme so using URI '%s'%s\n",
3301 to, *uri, get_default_outbound ? " with default endpoint" : "");
3302 } else {
3303 *uri = ast_malloc(strlen(destination) + strlen("sip:") + 1);
3304 if (!(*uri)) {
3305 goto failure;
3306 }
3307 sprintf(*uri, "sip:%s", destination);
3308 ast_debug(3, "Dest: '%s' Didn't find an endpoint and didn't find scheme so adding scheme and using URI '%s'%s\n",
3309 to, *uri, get_default_outbound ? " with default endpoint" : "");
3310 }
3311 if (get_default_outbound) {
3313 }
3314
3315 return endpoint;
3316
3317failure:
3318 ao2_cleanup(endpoint);
3319 *uri = NULL;
3320 return NULL;
3321}
#define ast_debug(level,...)
Log a DEBUG message.
static struct ast_sip_endpoint * handle_slash(const char *to, char *destination, char **uri, char *slash, char *atsign, char *scheme)
Definition res_pjsip.c:3034
static struct ast_sip_endpoint * handle_single_token(const char *to, char *destination, int get_default_outbound, char **uri)
Definition res_pjsip.c:2955
static struct ast_sip_endpoint * handle_atsign(const char *to, char *destination, char **uri, char *slash, char *atsign, char *scheme, int get_default_outbound)
Definition res_pjsip.c:3191

References ao2_cleanup, ast_debug, ast_malloc, ast_sip_default_outbound_endpoint(), ast_strdup, ast_strdupa, handle_atsign(), handle_single_token(), handle_slash(), NULL, and S_OR.

Referenced by msg_send(), and refer_send().

◆ ast_sip_get_endpoint_identifier_order()

char * ast_sip_get_endpoint_identifier_order ( void  )

Retrieve the global endpoint_identifier_order setting.

Specifies the order by which endpoint identifiers should be regarded.

Return values
theglobal endpoint_identifier_order value

Definition at line 312 of file config_global.c.

313{
314 char *res;
315 struct global_config *cfg;
316
317 cfg = get_global_cfg();
318 if (!cfg) {
320 }
321
323 ao2_ref(cfg, -1);
324 return res;
325}
#define DEFAULT_ENDPOINT_IDENTIFIER_ORDER
const ast_string_field endpoint_identifier_order

References ao2_ref, ast_strdup, DEFAULT_ENDPOINT_IDENTIFIER_ORDER, global_config::endpoint_identifier_order, and get_global_cfg().

Referenced by ast_sip_register_endpoint_identifier_with_name(), and global_loaded().

◆ ast_sip_get_endpoint_snapshot()

struct ast_endpoint_snapshot * ast_sip_get_endpoint_snapshot ( const struct ast_sip_endpoint endpoint)

Retrieve the endpoint snapshot for an endpoint.

Parameters
endpointThe endpoint whose snapshot is to be retrieved.
Return values
Theendpoint snapshot

Definition at line 1670 of file pjsip_configuration.c.

1672{
1676}
const char * ast_endpoint_get_tech(const struct ast_endpoint *endpoint)
Gets the technology of the given endpoint.
const char * ast_endpoint_get_resource(const struct ast_endpoint *endpoint)
Gets the resource name of the given endpoint.
struct ast_endpoint_snapshot * ast_endpoint_latest_snapshot(const char *tech, const char *resource)
Retrieve the most recent snapshot for the endpoint with the given name.

References ast_endpoint_get_resource(), ast_endpoint_get_tech(), ast_endpoint_latest_snapshot(), and ast_sip_endpoint::persistent.

Referenced by active_channels_to_str(), ast_sip_for_each_channel(), and cli_endpoint_print_body().

◆ ast_sip_get_endpoints()

struct ao2_container * ast_sip_get_endpoints ( void  )

Retrieve any endpoints available to sorcery.

Return values
Endpointsavailable to sorcery, NULL if no endpoints found.

Definition at line 2511 of file pjsip_configuration.c.

2512{
2513 struct ao2_container *endpoints;
2514
2516
2517 return endpoints;
2518}
static struct ao2_container * endpoints
@ AST_RETRIEVE_FLAG_MULTIPLE
Return all matching objects.
Definition sorcery.h:120
@ AST_RETRIEVE_FLAG_ALL
Perform no matching, return all objects.
Definition sorcery.h:123
void * ast_sorcery_retrieve_by_fields(const struct ast_sorcery *sorcery, const char *type, unsigned int flags, struct ast_variable *fields)
Retrieve an object or multiple objects using specific fields.
Definition sorcery.c:1961

References AST_RETRIEVE_FLAG_ALL, AST_RETRIEVE_FLAG_MULTIPLE, ast_sorcery_retrieve_by_fields(), endpoints, NULL, and sip_sorcery.

Referenced by ami_registrations_endpoints(), ami_show_endpoints(), and load_module().

◆ ast_sip_get_host_ip()

int ast_sip_get_host_ip ( int  af,
pj_sockaddr *  addr 
)

Retrieve the local host address in IP form.

Parameters
afThe address family to retrieve
addrA place to store the local host address
Return values
0success
-1failure
Since
13.6.0

Definition at line 2480 of file res_pjsip.c.

2481{
2482 if (af == pj_AF_INET() && !ast_strlen_zero(host_ip_ipv4_string)) {
2483 pj_sockaddr_copy_addr(addr, &host_ip_ipv4);
2484 return 0;
2485 } else if (af == pj_AF_INET6() && !ast_strlen_zero(host_ip_ipv6_string)) {
2486 pj_sockaddr_copy_addr(addr, &host_ip_ipv6);
2487 return 0;
2488 }
2489
2490 return -1;
2491}
static pj_sockaddr host_ip_ipv4
Definition res_pjsip.c:79
static char host_ip_ipv6_string[PJ_INET6_ADDRSTRLEN]
Definition res_pjsip.c:88
static pj_sockaddr host_ip_ipv6
Definition res_pjsip.c:85
static char host_ip_ipv4_string[PJ_INET6_ADDRSTRLEN]
Definition res_pjsip.c:82

References ast_strlen_zero(), host_ip_ipv4, host_ip_ipv4_string, host_ip_ipv6, and host_ip_ipv6_string.

◆ ast_sip_get_host_ip_string()

const char * ast_sip_get_host_ip_string ( int  af)

Retrieve the local host address in string form.

Parameters
afThe address family to retrieve
Return values
non-NULLsuccess
NULLfailure
Since
13.6.0
Note
An empty string may be returned if the address family is valid but no local address exists

Definition at line 2493 of file res_pjsip.c.

2494{
2495 if (af == pj_AF_INET()) {
2496 return host_ip_ipv4_string;
2497 } else if (af == pj_AF_INET6()) {
2498 return host_ip_ipv6_string;
2499 }
2500
2501 return NULL;
2502}

References host_ip_ipv4_string, host_ip_ipv6_string, and NULL.

Referenced by create_local_sdp(), create_outgoing_sdp_stream(), create_outgoing_sdp_stream(), and multihomed_rewrite_sdp().

◆ ast_sip_get_ignore_uri_user_options()

unsigned int ast_sip_get_ignore_uri_user_options ( void  )

Retrieve the global setting 'ignore_uri_user_options'.

Since
13.12.0
Return values
nonzero if ignore the user field options.

Definition at line 521 of file config_global.c.

522{
523 unsigned int ignore_uri_user_options;
524 struct global_config *cfg;
525
526 cfg = get_global_cfg();
527 if (!cfg) {
529 }
530
532 ao2_ref(cfg, -1);
534}
#define DEFAULT_IGNORE_URI_USER_OPTIONS
unsigned int ignore_uri_user_options

References ao2_ref, DEFAULT_IGNORE_URI_USER_OPTIONS, get_global_cfg(), and global_config::ignore_uri_user_options.

Referenced by find_registrar_aor().

◆ ast_sip_get_keep_alive_interval()

unsigned int ast_sip_get_keep_alive_interval ( void  )

Retrieve the system keep alive interval setting.

Return values
thekeep alive interval.

Definition at line 327 of file config_global.c.

328{
329 unsigned int interval;
330 struct global_config *cfg;
331
332 cfg = get_global_cfg();
333 if (!cfg) {
335 }
336
337 interval = cfg->keep_alive_interval;
338 ao2_ref(cfg, -1);
339 return interval;
340}
#define DEFAULT_KEEPALIVE_INTERVAL
unsigned int keep_alive_interval

References ao2_ref, DEFAULT_KEEPALIVE_INTERVAL, get_global_cfg(), and global_config::keep_alive_interval.

Referenced by keepalive_global_loaded().

◆ ast_sip_get_max_initial_qualify_time()

unsigned int ast_sip_get_max_initial_qualify_time ( void  )

Retrieve the system max initial qualify time.

Return values
themaximum initial qualify time.

Definition at line 372 of file config_global.c.

373{
374 unsigned int time;
375 struct global_config *cfg;
376
377 cfg = get_global_cfg();
378 if (!cfg) {
380 }
381
382 time = cfg->max_initial_qualify_time;
383 ao2_ref(cfg, -1);
384 return time;
385}
#define DEFAULT_MAX_INITIAL_QUALIFY_TIME
unsigned int max_initial_qualify_time

References ao2_ref, DEFAULT_MAX_INITIAL_QUALIFY_TIME, get_global_cfg(), and global_config::max_initial_qualify_time.

Referenced by sip_options_determine_initial_qualify_time().

◆ ast_sip_get_mwi_disable_initial_unsolicited()

unsigned int ast_sip_get_mwi_disable_initial_unsolicited ( void  )

Retrieve the global setting 'disable sending unsolicited mwi on startup'.

Since
13.12.0
Return values
nonzero if disable.

Definition at line 491 of file config_global.c.

492{
493 unsigned int disable_initial_unsolicited;
494 struct global_config *cfg;
495
496 cfg = get_global_cfg();
497 if (!cfg) {
499 }
500
502 ao2_ref(cfg, -1);
504}
#define DEFAULT_MWI_DISABLE_INITIAL_UNSOLICITED
unsigned int disable_initial_unsolicited
struct global_config::@489 mwi

References ao2_ref, DEFAULT_MWI_DISABLE_INITIAL_UNSOLICITED, global_config::disable_initial_unsolicited, get_global_cfg(), and global_config::mwi.

Referenced by load_module(), and reload().

◆ ast_sip_get_mwi_tps_queue_high()

unsigned int ast_sip_get_mwi_tps_queue_high ( void  )

Retrieve the global MWI taskprocessor high water alert trigger level.

Since
13.12.0
Return values
thesystem MWI taskprocessor high water alert trigger level

Definition at line 461 of file config_global.c.

462{
463 unsigned int tps_queue_high;
464 struct global_config *cfg;
465
466 cfg = get_global_cfg();
467 if (!cfg) {
469 }
470
472 ao2_ref(cfg, -1);
473 return tps_queue_high;
474}
#define DEFAULT_MWI_TPS_QUEUE_HIGH
unsigned int tps_queue_high

References ao2_ref, DEFAULT_MWI_TPS_QUEUE_HIGH, get_global_cfg(), global_config::mwi, and global_config::tps_queue_high.

Referenced by global_loaded().

◆ ast_sip_get_mwi_tps_queue_low()

int ast_sip_get_mwi_tps_queue_low ( void  )

Retrieve the global MWI taskprocessor low water clear alert level.

Since
13.12.0
Return values
thesystem MWI taskprocessor low water clear alert level

Definition at line 476 of file config_global.c.

477{
478 int tps_queue_low;
479 struct global_config *cfg;
480
481 cfg = get_global_cfg();
482 if (!cfg) {
484 }
485
487 ao2_ref(cfg, -1);
488 return tps_queue_low;
489}
#define DEFAULT_MWI_TPS_QUEUE_LOW

References ao2_ref, DEFAULT_MWI_TPS_QUEUE_LOW, get_global_cfg(), global_config::mwi, and global_config::tps_queue_low.

Referenced by global_loaded().

◆ ast_sip_get_norefersub()

unsigned int ast_sip_get_norefersub ( void  )

Retrieve the global setting 'norefersub'.

Return values
nonzero if norefersub is to be sent in "Supported" Headers

Definition at line 581 of file config_global.c.

582{
583 unsigned int norefersub;
584 struct global_config *cfg;
585
586 cfg = get_global_cfg();
587 if (!cfg) {
588 return DEFAULT_NOREFERSUB;
589 }
590
591 norefersub = cfg->norefersub;
592 ao2_ref(cfg, -1);
593 return norefersub;
594}
#define DEFAULT_NOREFERSUB
unsigned int norefersub

References ao2_ref, DEFAULT_NOREFERSUB, get_global_cfg(), and global_config::norefersub.

Referenced by load_module().

◆ ast_sip_get_pjsip_endpoint()

pjsip_endpoint * ast_sip_get_pjsip_endpoint ( void  )

Get a pointer to the PJSIP endpoint.

This is useful when modules have specific information they need to register with the PJSIP core.

Return values
NULLendpoint has not been created yet.
non-NULLPJSIP endpoint.

Definition at line 520 of file res_pjsip.c.

521{
522 return ast_pjsip_endpoint;
523}
static pjsip_endpoint * ast_pjsip_endpoint
Definition res_pjsip.c:74

References ast_pjsip_endpoint.

Referenced by acl_on_rx_msg(), aoc_release_pool(), aoc_send_as_xml(), ast_res_pjsip_cleanup_options_handling(), ast_res_pjsip_init_options_handling(), ast_sip_create_response(), ast_sip_destroy_transport_events(), ast_sip_initialize_transport_events(), ast_sip_pubsub_register_body_generator(), ast_sip_send_response(), ast_sip_send_stateful_response(), ast_sip_session_defer_termination(), ast_sip_session_resume_reinvite(), authenticate(), cancel_publish_refresh(), cancel_registration(), channel_read_pjsip(), create_out_of_dialog_request(), digest_create_request_with_auth(), distribute(), distributor(), do_cli_dump_endpt(), endpoint_lookup(), endpt_send_request(), endpt_send_request_cb(), exten_state_data_alloc(), exten_state_data_destructor(), exten_state_publisher_cb(), filter_on_tx_message(), find_registrar_aor(), insert_user_in_contact_uri(), keepalive_transport_send_keepalive(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), logging_on_rx_msg(), logging_on_tx_msg(), notify_task(), on_rx_process_uris(), options_incoming_request(), parse_uri_cb(), pool_destroy_callback(), pre_session_setup(), publish_request_initial(), pubsub_on_rx_mwi_notify_request(), pubsub_on_rx_publish_request(), pubsub_on_rx_subscribe_request(), register_aor(), register_aor_core(), registrar_on_rx_request(), reschedule_reinvite(), schedule_publish_refresh(), schedule_registration(), send_options_response(), session_reinvite_on_rx_request(), sip_dialog_create_contact(), sip_dialog_create_from(), sip_outbound_publisher_init(), sip_outbound_registration_regc_alloc(), sip_publication_respond(), sip_session_defer_termination_stop_timer(), subscription_persistence_load(), system_create_resolver_and_set_nameservers(), t38_change_state(), transport_apply(), and transport_create().

◆ ast_sip_get_regcontext()

char * ast_sip_get_regcontext ( void  )

Retrieve the global regcontext setting.

Since
13.8.0
Note
returned string needs to be de-allocated by caller.
Return values
theglobal regcontext setting

Definition at line 280 of file config_global.c.

281{
282 char *res;
283 struct global_config *cfg;
284
285 cfg = get_global_cfg();
286 if (!cfg) {
288 }
289
290 res = ast_strdup(cfg->regcontext);
291 ao2_ref(cfg, -1);
292
293 return res;
294}
#define DEFAULT_REGCONTEXT
const ast_string_field regcontext

References ao2_ref, ast_strdup, DEFAULT_REGCONTEXT, get_global_cfg(), and global_config::regcontext.

Referenced by ast_sip_persistent_endpoint_update_state().

◆ ast_sip_get_send_contact_status_on_update_registration()

unsigned int ast_sip_get_send_contact_status_on_update_registration ( void  )

Retrieve the global setting 'send_contact_status_on_update_registration'.

Since
16.2.0
Return values
nonzero if need to send AMI ContactStatus event when a contact is updated.

Definition at line 551 of file config_global.c.

552{
553 unsigned int send_contact_status_on_update_registration;
554 struct global_config *cfg;
555
556 cfg = get_global_cfg();
557 if (!cfg) {
559 }
560
562 ao2_ref(cfg, -1);
564}
#define DEFAULT_SEND_CONTACT_STATUS_ON_UPDATE_REGISTRATION
unsigned int send_contact_status_on_update_registration

References ao2_ref, DEFAULT_SEND_CONTACT_STATUS_ON_UPDATE_REGISTRATION, get_global_cfg(), and global_config::send_contact_status_on_update_registration.

Referenced by contact_observer_updated().

◆ ast_sip_get_sorcery()

struct ast_sorcery * ast_sip_get_sorcery ( void  )

Get a pointer to the SIP sorcery structure.

Return values
NULLsorcery has not been initialized
non-NULLsorcery structure

Definition at line 2571 of file pjsip_configuration.c.

2572{
2573 return sip_sorcery;
2574}

References sip_sorcery.

Referenced by acl_change_stasis_cb(), acl_on_rx_msg(), add_security_headers(), alloc_artificial_auth(), ami_show_endpoint(), ami_show_registration_contact_statuses(), ami_show_resource_lists(), ami_sip_qualify(), anonymous_identify(), aor_deleted_observer(), ast_res_pjsip_cleanup_options_handling(), ast_sip_cli_print_sorcery_objectset(), ast_sip_destroy_distributor(), ast_sip_destroy_sorcery_auth(), ast_sip_destroy_sorcery_global(), ast_sip_destroy_sorcery_location(), ast_sip_destroy_transport_management(), ast_sip_for_each_auth(), ast_sip_initialize_distributor(), ast_sip_initialize_sorcery_auth(), ast_sip_initialize_sorcery_domain_alias(), ast_sip_initialize_sorcery_global(), ast_sip_initialize_sorcery_location(), ast_sip_initialize_sorcery_transport(), ast_sip_initialize_transport_management(), ast_sip_location_create_contact(), ast_sip_location_delete_contact(), ast_sip_location_prune_boot_contacts(), ast_sip_location_retrieve_aor(), ast_sip_location_retrieve_aor_contacts_nolock_filtered(), ast_sip_location_retrieve_contact(), ast_sip_location_update_contact(), ast_sip_retrieve_auths(), ast_sip_retrieve_auths_vector(), ast_sip_rewrite_uri_to_local(), ast_sip_set_tpselector_from_transport_name(), ast_sip_sorcery_object_to_ami(), asterisk_publication_devicestate_state_change(), asterisk_publication_mwi_state_change(), asterisk_publication_new(), asterisk_publication_send_refresh(), auth_observer(), can_reuse_registration(), chan_pjsip_devicestate(), check_expiration_thread(), check_state(), cli_aor_get_container(), cli_aor_retrieve_by_id(), cli_complete_endpoint(), cli_complete_registration(), cli_contact_get_container(), cli_endpoint_retrieve_by_id(), cli_get_aors(), cli_get_auths(), cli_get_container(), cli_get_container(), cli_get_container(), cli_get_container(), cli_iterate(), cli_iterator(), cli_qualify(), cli_reload_qualify_aor(), cli_reload_qualify_endpoint(), cli_retrieve_by_id(), cli_retrieve_by_id(), cli_retrieve_by_id(), cli_retrieve_by_id(), cli_show_qualify_endpoint(), common_identify(), contact_observer_updated(), create_artificial_endpoint(), create_mwi_subscriptions(), create_rtp(), find_aor2(), find_aor_name(), find_endpoint(), format_ami_endpoint_identify(), format_ami_endpoint_transport(), get_all_contacts(), get_publishes_and_update_state(), get_registrations(), get_write_timeout(), global_loaded(), handle_atsign(), handle_export_primitives(), handle_registration_response(), handle_single_token(), handle_slash(), line_identify(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), mwi_contact_changed(), mwi_contact_deleted(), mwi_subscription_shutdown(), on_rx_process_symmetric_transport(), permanent_uri_handler(), pjsip_acf_dial_contacts_read(), pjsip_aor_function_read(), pjsip_contact_function_read(), pjsip_endpoint_function_read(), pjsip_outbound_registration_metrics_init(), pjsip_outbound_registration_metrics_unload_cb(), process_nat(), publish_request_initial(), push_notify(), register_aor_core(), reload_module(), reload_module(), reload_module(), reload_module(), reload_module(), request(), reregister_all(), retrieve_resource_list(), send_unsolicited_mwi_notify(), sip_aor_to_ami(), sip_cli_print_global(), sip_options_aor_observer_modified_task(), sip_options_apply_aor_configuration(), sip_options_contact_add_management_task(), sip_options_init_task(), sip_options_qualify_contact(), sip_options_synchronize_task(), sub_persistence_recreate(), subscription_persistence_create(), subscription_persistence_load(), subscription_persistence_recreate(), subscription_persistence_remove(), subscription_persistence_update(), t38_initialize_session(), transfer(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), and unload_module().

◆ ast_sip_get_transport_name()

int ast_sip_get_transport_name ( const struct ast_sip_endpoint endpoint,
pjsip_sip_uri *  sip_uri,
char *  buf,
size_t  buf_len 
)

Get the transport name from an endpoint or request uri.

Since
13.15.0
Parameters
endpoint
sip_uri
bufBuffer to receive transport name
buf_lenBuffer length
Return values
0Success
-1Failure
Note
If endpoint->transport is not NULL, it is returned in buf. Otherwise if sip_uri has an 'x-ast-txp' parameter AND the sip_uri host is an ip4 or ip6 address, its value is returned,

Definition at line 698 of file res_pjsip.c.

700{
701 char *host = NULL;
702 static const pj_str_t x_name = { AST_SIP_X_AST_TXP, AST_SIP_X_AST_TXP_LEN };
703 pjsip_param *x_transport;
704
705 if (!ast_strlen_zero(endpoint->transport)) {
706 ast_copy_string(buf, endpoint->transport, buf_len);
707 return 0;
708 }
709
710 x_transport = pjsip_param_find(&sip_uri->other_param, &x_name);
711 if (!x_transport) {
712 return -1;
713 }
714
715 /* Only use x_transport if the uri host is an ip (4 or 6) address */
716 host = ast_alloca(sip_uri->host.slen + 1);
717 ast_copy_pj_str(host, &sip_uri->host, sip_uri->host.slen + 1);
719 return -1;
720 }
721
722 ast_copy_pj_str(buf, &x_transport->value, buf_len);
723
724 return 0;
725}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition netsock2.c:230
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
Definition res_pjsip.c:2201
#define AST_SIP_X_AST_TXP
Definition res_pjsip.h:1170
#define AST_SIP_X_AST_TXP_LEN
Definition res_pjsip.h:1171

References ast_alloca, ast_copy_pj_str(), ast_copy_string(), AST_SIP_X_AST_TXP, AST_SIP_X_AST_TXP_LEN, ast_sockaddr_parse(), ast_strlen_zero(), buf, NULL, PARSE_PORT_FORBID, and ast_sip_endpoint::transport.

Referenced by ast_sip_set_tpselector_from_ep_or_uri().

◆ ast_sip_get_transport_state()

struct ast_sip_transport_state * ast_sip_get_transport_state ( const char *  transport_id)

Retrieve transport state.

Since
13.7.1
Parameters
transport_id
Return values
transport_state
Note
ao2_cleanup(...) or ao2_ref(..., -1) must be called on the returned object

Definition at line 1744 of file config_transport.c.

1745{
1746 struct internal_state *state = NULL;
1747 struct ast_sip_transport_state *trans_state;
1748
1749 if (!transport_states) {
1750 return NULL;
1751 }
1752
1754 if (!state) {
1755 return NULL;
1756 }
1757
1758 trans_state = ao2_bump(state->state);
1759 ao2_ref(state, -1);
1760
1761 /* If this is a child transport see if the transport is actually dead */
1762 if (trans_state->flow) {
1763 ao2_lock(trans_state);
1764 if (trans_state->transport && trans_state->transport->is_shutdown == PJ_TRUE) {
1765 pjsip_transport_dec_ref(trans_state->transport);
1766 trans_state->transport = NULL;
1767 }
1768 ao2_unlock(trans_state);
1769 }
1770
1771 return trans_state;
1772}
#define ao2_unlock(a)
Definition astobj2.h:729
#define ao2_lock(a)
Definition astobj2.h:717

References ao2_bump, ao2_find, ao2_lock, ao2_ref, ao2_unlock, ast_sip_transport_state::flow, NULL, OBJ_SEARCH_KEY, ast_sip_transport_state::transport, and transport_states.

Referenced by ast_sip_message_apply_transport(), ast_sip_set_tpselector_from_transport(), ast_sip_transport_state_set_preferred_identity(), ast_sip_transport_state_set_service_routes(), ast_sip_transport_state_set_transport(), change_outgoing_sdp_stream_media_address(), change_outgoing_sdp_stream_media_address(), create_rtp(), session_outgoing_nat_hook(), t38_initialize_session(), and transport_tls_verify().

◆ ast_sip_get_transport_states()

struct ao2_container * ast_sip_get_transport_states ( void  )

Retrieves all transport states.

Since
13.7.1
Return values
ao2_container
Note
ao2_cleanup(...) or ao2_ref(..., -1) must be called on the returned object

Definition at line 1784 of file config_transport.c.

1785{
1788
1789 if (!states) {
1790 return NULL;
1791 }
1792
1794 return states;
1795}
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition astobj2.h:363
@ OBJ_NODATA
Definition astobj2.h:1044
@ OBJ_MULTIPLE
Definition astobj2.h:1049
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
Definition astobj2.h:1303
static int transport_state_hash(const void *obj, const int flags)
hashing function for state objects
static int transport_state_cmp(void *obj, void *arg, int flags)
comparator function for state objects
#define DEFAULT_STATE_BUCKETS
Default number of state container buckets.
static int populate_transport_states(void *obj, void *arg, int flags)

References AO2_ALLOC_OPT_LOCK_MUTEX, ao2_callback, ao2_container_alloc_hash, DEFAULT_STATE_BUCKETS, NULL, OBJ_MULTIPLE, OBJ_NODATA, populate_transport_states(), transport_state_cmp(), transport_state_hash(), and transport_states.

Referenced by anonymous_identify(), ast_sip_find_transport_state_in_use(), find_endpoint(), get_udp_transport(), and get_write_timeout().

◆ ast_sip_get_unidentified_request_thresholds()

void ast_sip_get_unidentified_request_thresholds ( unsigned int *  count,
unsigned int *  period,
unsigned int *  prune_interval 
)

Retrieve the unidentified request security event thresholds.

Since
13.8.0
Parameters
countThe maximum number of unidentified requests per source ip to accumulate before emitting a security event
periodThe period in seconds over which to accumulate unidentified requests
prune_intervalThe interval in seconds at which expired entries will be pruned

Definition at line 387 of file config_global.c.

389{
390 struct global_config *cfg;
391
392 cfg = get_global_cfg();
393 if (!cfg) {
397 return;
398 }
399
400 *count = cfg->unidentified_request_count;
401 *period = cfg->unidentified_request_period;
402 *prune_interval = cfg->unidentified_request_prune_interval;
403
404 ao2_ref(cfg, -1);
405 return;
406}
#define DEFAULT_UNIDENTIFIED_REQUEST_COUNT
#define DEFAULT_UNIDENTIFIED_REQUEST_PRUNE_INTERVAL
#define DEFAULT_UNIDENTIFIED_REQUEST_PERIOD
unsigned int unidentified_request_prune_interval
unsigned int unidentified_request_count
unsigned int unidentified_request_period

References ao2_ref, DEFAULT_UNIDENTIFIED_REQUEST_COUNT, DEFAULT_UNIDENTIFIED_REQUEST_PERIOD, DEFAULT_UNIDENTIFIED_REQUEST_PRUNE_INTERVAL, get_global_cfg(), global_config::unidentified_request_count, global_config::unidentified_request_period, and global_config::unidentified_request_prune_interval.

Referenced by global_loaded(), and prune_task().

◆ ast_sip_get_use_callerid_contact()

unsigned int ast_sip_get_use_callerid_contact ( void  )

Retrieve the global setting 'use_callerid_contact'.

Since
13.24.0
Return values
nonzero if CALLERID(num) is to be used as the default username in the contact

Definition at line 536 of file config_global.c.

537{
538 unsigned int use_callerid_contact;
539 struct global_config *cfg;
540
541 cfg = get_global_cfg();
542 if (!cfg) {
544 }
545
547 ao2_ref(cfg, -1);
549}
#define DEFAULT_USE_CALLERID_CONTACT
unsigned int use_callerid_contact

References ao2_ref, DEFAULT_USE_CALLERID_CONTACT, get_global_cfg(), and global_config::use_callerid_contact.

Referenced by set_from_header().

◆ ast_sip_hangup_sip2cause()

const int ast_sip_hangup_sip2cause ( int  cause)

Convert SIP hangup causes to Asterisk hangup causes.

Parameters
causeSIP cause
Return values
matchedcause code from causes.h

Definition at line 3531 of file res_pjsip.c.

3532{
3533 /* Possible values taken from causes.h */
3534
3535 switch(cause) {
3536 case 401: /* Unauthorized */
3538 case 403: /* Not found */
3540 case 404: /* Not found */
3541 return AST_CAUSE_UNALLOCATED;
3542 case 405: /* Method not allowed */
3544 case 407: /* Proxy authentication required */
3546 case 408: /* No reaction */
3548 case 409: /* Conflict */
3550 case 410: /* Gone */
3552 case 411: /* Length required */
3554 case 413: /* Request entity too large */
3556 case 414: /* Request URI too large */
3558 case 415: /* Unsupported media type */
3560 case 420: /* Bad extension */
3562 case 480: /* No answer */
3563 return AST_CAUSE_NO_ANSWER;
3564 case 481: /* No answer */
3566 case 482: /* Loop detected */
3568 case 483: /* Too many hops */
3569 return AST_CAUSE_NO_ANSWER;
3570 case 484: /* Address incomplete */
3572 case 485: /* Ambiguous */
3573 return AST_CAUSE_UNALLOCATED;
3574 case 486: /* Busy everywhere */
3575 return AST_CAUSE_BUSY;
3576 case 487: /* Request terminated */
3578 case 488: /* No codecs approved */
3580 case 491: /* Request pending */
3582 case 493: /* Undecipherable */
3584 case 500: /* Server internal failure */
3585 return AST_CAUSE_FAILURE;
3586 case 501: /* Call rejected */
3588 case 502:
3590 case 503: /* Service unavailable */
3591 return AST_CAUSE_CONGESTION;
3592 case 504: /* Gateway timeout */
3594 case 505: /* SIP version not supported */
3596 case 600: /* Busy everywhere */
3597 return AST_CAUSE_USER_BUSY;
3598 case 603: /* Decline */
3600 case 604: /* Does not exist anywhere */
3601 return AST_CAUSE_UNALLOCATED;
3602 case 606: /* Not acceptable */
3604 default:
3605 if (cause < 500 && cause >= 400) {
3606 /* 4xx class error that is unknown - someting wrong with our request */
3608 } else if (cause < 600 && cause >= 500) {
3609 /* 5xx class error - problem in the remote end */
3610 return AST_CAUSE_CONGESTION;
3611 } else if (cause < 700 && cause >= 600) {
3612 /* 6xx - global errors in the 4xx class */
3614 }
3615 return AST_CAUSE_NORMAL;
3616 }
3617 /* Never reached */
3618 return 0;
3619}
#define AST_CAUSE_CONGESTION
Definition causes.h:153
#define AST_CAUSE_UNALLOCATED
Definition causes.h:98
#define AST_CAUSE_INTERWORKING
Definition causes.h:146
#define AST_CAUSE_NUMBER_CHANGED
Definition causes.h:112
#define AST_CAUSE_BEARERCAPABILITY_NOTAVAIL
Definition causes.h:130
#define AST_CAUSE_INVALID_NUMBER_FORMAT
Definition causes.h:116
#define AST_CAUSE_FAILURE
Definition causes.h:150
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
Definition causes.h:115
#define AST_CAUSE_NO_USER_RESPONSE
Definition causes.h:108
#define AST_CAUSE_NORMAL_TEMPORARY_FAILURE
Definition causes.h:122
#define AST_CAUSE_NORMAL
Definition causes.h:151
#define AST_CAUSE_CALL_REJECTED
Definition causes.h:111
#define AST_CAUSE_FACILITY_REJECTED
Definition causes.h:117
#define AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE
Definition causes.h:143
#define AST_CAUSE_NO_ROUTE_DESTINATION
Definition causes.h:100
#define AST_CAUSE_BUSY
Definition causes.h:149
#define AST_CAUSE_NO_ANSWER
Definition causes.h:109
#define AST_CAUSE_USER_BUSY
Definition causes.h:107

References AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, AST_CAUSE_BUSY, AST_CAUSE_CALL_REJECTED, AST_CAUSE_CONGESTION, AST_CAUSE_DESTINATION_OUT_OF_ORDER, AST_CAUSE_FACILITY_REJECTED, AST_CAUSE_FAILURE, AST_CAUSE_INTERWORKING, AST_CAUSE_INVALID_NUMBER_FORMAT, AST_CAUSE_NO_ANSWER, AST_CAUSE_NO_ROUTE_DESTINATION, AST_CAUSE_NO_USER_RESPONSE, AST_CAUSE_NORMAL, AST_CAUSE_NORMAL_TEMPORARY_FAILURE, AST_CAUSE_NUMBER_CHANGED, AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, AST_CAUSE_UNALLOCATED, and AST_CAUSE_USER_BUSY.

Referenced by chan_pjsip_incoming_response_update_cause(), chan_pjsip_session_end(), and rfc3326_use_reason_header().

◆ ast_sip_header_to_security_mechanism()

void ast_sip_header_to_security_mechanism ( const pjsip_generic_string_hdr *  hdr,
struct ast_sip_security_mechanism_vector security_mechanisms 
)

Append to security mechanism vector from SIP header.

Parameters
hdrThe header of the security mechanisms.
security_mechanismsVector of security mechanisms to append to. Header name must be one of Security-Client, Security-Server, Security-Verify.

Definition at line 333 of file security_agreements.c.

334 {
335
336 struct ast_sip_security_mechanism *mech;
337 char buf[512];
338 char *hdr_val;
339 char *mechanism;
340
341 if (!security_mechanisms || !hdr) {
342 return;
343 }
344
345 if (pj_stricmp2(&hdr->name, "Security-Client") && pj_stricmp2(&hdr->name, "Security-Server") &&
346 pj_stricmp2(&hdr->name, "Security-Verify")) {
347 return;
348 }
349
350 ast_copy_pj_str(buf, &hdr->hvalue, sizeof(buf));
351 hdr_val = ast_skip_blanks(buf);
352
353 while ((mechanism = ast_strsep(&hdr_val, ',', AST_STRSEP_ALL))) {
354 if (!ast_sip_str_to_security_mechanism(&mech, mechanism)) {
355 AST_VECTOR_APPEND(security_mechanisms, mech);
356 }
357 }
358}
int ast_sip_str_to_security_mechanism(struct ast_sip_security_mechanism **security_mechanism, const char *value)
Allocate a security mechanism from a string.
@ AST_STRSEP_ALL
Definition strings.h:258
char * ast_strsep(char **s, const char sep, uint32_t flags)
Act like strsep but ignore separators inside quotes.
Definition utils.c:1871
char *attribute_pure ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition strings.h:161

References ast_copy_pj_str(), ast_sip_str_to_security_mechanism(), ast_skip_blanks(), ast_strsep(), AST_STRSEP_ALL, AST_VECTOR_APPEND, and buf.

Referenced by contact_add_security_headers_to_status(), and handle_registration_response().

◆ ast_sip_identify_endpoint()

struct ast_sip_endpoint * ast_sip_identify_endpoint ( pjsip_rx_data *  rdata)

Determine the endpoint that has sent a SIP message.

This will call into each of the registered endpoint identifiers' identify_endpoint() callbacks until one returns a non-NULL endpoint. This will return an ao2 object. Its reference count will need to be decremented when completed using the endpoint.

Parameters
rdataThe inbound SIP message to use when identifying the endpoint.
Return values
NULLNo matching endpoint
non-NULLThe matching endpoint

Definition at line 330 of file res_pjsip.c.

331{
332 struct endpoint_identifier_list *iter;
333 struct ast_sip_endpoint *endpoint = NULL;
337 endpoint = iter->identifier->identify_endpoint(rdata);
338 if (endpoint) {
339 break;
340 }
341 }
342 return endpoint;
343}
struct ast_sip_endpoint *(* identify_endpoint)(pjsip_rx_data *rdata)
Callback used to identify the source of a message. See ast_sip_identify_endpoint for more details.
Definition res_pjsip.h:1414
struct ast_sip_endpoint_identifier * identifier
Definition res_pjsip.c:227

References ast_assert, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, endpoint_identifier_list::identifier, ast_sip_endpoint_identifier::identify_endpoint, lock, NULL, and SCOPED_LOCK.

Referenced by endpoint_lookup().

◆ ast_sip_is_allowed_uri()

int ast_sip_is_allowed_uri ( pjsip_uri *  uri)

Check whether a pjsip_uri is allowed or not.

Since
16.28.0
Parameters
uriThe pjsip_uri to check
Return values
1if allowed
0if not allowed

Definition at line 3472 of file res_pjsip.c.

3473{
3474 return (ast_sip_is_uri_sip_sips(uri) || PJSIP_URI_SCHEME_IS_TEL(uri));
3475}
int ast_sip_is_uri_sip_sips(pjsip_uri *uri)
Check whether a pjsip_uri is SIP/SIPS or not.
Definition res_pjsip.c:3467

References ast_sip_is_uri_sip_sips().

Referenced by endpoint_lookup(), get_destination(), on_rx_process_uris(), options_on_rx_request(), rx_data_to_ast_msg(), and set_redirecting_reason_by_cause().

◆ ast_sip_is_content_type()

int ast_sip_is_content_type ( pjsip_media_type *  content_type,
char *  type,
char *  subtype 
)

Checks if the given content type matches type/subtype.

Compares the pjsip_media_type with the passed type and subtype and returns the result of that comparison. The media type parameters are ignored.

Parameters
content_typeThe pjsip_media_type structure to compare
typeThe media type to compare
subtypeThe media subtype to compare
Return values
0No match
-1Match

Definition at line 2248 of file res_pjsip.c.

2249{
2250 pjsip_media_type compare;
2251
2252 if (!content_type) {
2253 return 0;
2254 }
2255
2256 pjsip_media_type_init2(&compare, type, subtype);
2257
2258 return pjsip_media_type_cmp(content_type, &compare, 0) ? 0 : -1;
2259}
static int compare(const char *text, const char *template)

References compare(), and type.

Referenced by asterisk_publication_devicestate_state_change(), asterisk_publication_mwi_state_change(), check_content_type(), and pubsub_on_rx_notify_request().

◆ ast_sip_is_media_type_in()

int ast_sip_is_media_type_in ( pjsip_media_type *  a,
  ... 
)

Check if a media type is in a list of others.

Parameters
apjsip_media_type to search for
...one or more pointers to pjsip_media_types the last of which must be "SENTINEL"
Return values
1Media types are equal
0Media types are not equal

Definition at line 2228 of file res_pjsip.c.

2229{
2230 int rc = 0;
2231 pjsip_media_type *b = NULL;
2232 va_list ap;
2233
2234 ast_assert(a != NULL);
2235 va_start(ap, a);
2236
2237 while ((b = va_arg(ap, pjsip_media_type *)) != (pjsip_media_type *)SENTINEL) {
2238 if (pjsip_media_type_cmp(a, b, 0) == 0) {
2239 rc = 1;
2240 break;
2241 }
2242 }
2243 va_end(ap);
2244
2245 return rc;
2246}
#define SENTINEL
Definition compiler.h:87

References a, ast_assert, b, NULL, and SENTINEL.

Referenced by check_content_disposition().

◆ ast_sip_is_uri_sip_sips()

int ast_sip_is_uri_sip_sips ( pjsip_uri *  uri)

Check whether a pjsip_uri is SIP/SIPS or not.

Since
16.28.0
Parameters
uriThe pjsip_uri to check
Return values
1if true
0if false

Definition at line 3467 of file res_pjsip.c.

3468{
3469 return (PJSIP_URI_SCHEME_IS_SIP(uri) || PJSIP_URI_SCHEME_IS_SIPS(uri));
3470}

Referenced by ast_sip_is_allowed_uri(), ast_sip_pjsip_uri_get_hostname(), ast_sip_pjsip_uri_get_other_param(), ast_sip_pjsip_uri_get_username(), filter_on_tx_message(), get_endpoint_details(), get_from_header(), publish_request_initial(), pubsub_on_rx_subscribe_request(), sanitize_tdata(), and set_id_from_oli().

◆ ast_sip_location_add_contact()

int ast_sip_location_add_contact ( struct ast_sip_aor aor,
const char *  uri,
struct timeval  expiration_time,
const char *  path_info,
const char *  user_agent,
const char *  via_addr,
int  via_port,
const char *  call_id,
struct ast_sip_endpoint endpoint 
)

Add a new contact to an AOR.

Parameters
aorPointer to the AOR
uriFull contact URI
expiration_timeOptional expiration time of the contact
path_infoPath information
user_agentUser-Agent header from REGISTER request
via_addr
via_port
call_id
endpointThe endpoint that resulted in the contact being added
Return values
-1failure
0success
Warning
This function holds a named write lock on the aor. If you already hold the lock you should call ast_sip_location_add_contact_nolock instead.

Definition at line 430 of file location.c.

434{
435 int res;
436
437 ao2_lock(aor);
438 res = ast_sip_location_add_contact_nolock(aor, uri, expiration_time, path_info, user_agent,
439 via_addr, via_port, call_id,
440 endpoint);
441 ao2_unlock(aor);
442
443 return res;
444}
int ast_sip_location_add_contact_nolock(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, struct ast_sip_endpoint *endpoint)
Add a new contact to an AOR without locking the AOR.
Definition location.c:417

References ao2_lock, ao2_unlock, ast_sip_contact::aor, ast_sip_location_add_contact_nolock(), ast_sip_contact::call_id, ast_sip_contact::endpoint, ast_sip_contact::expiration_time, ast_sip_contact::uri, ast_sip_contact::user_agent, ast_sip_contact::via_addr, and ast_sip_contact::via_port.

◆ ast_sip_location_add_contact_nolock()

int ast_sip_location_add_contact_nolock ( struct ast_sip_aor aor,
const char *  uri,
struct timeval  expiration_time,
const char *  path_info,
const char *  user_agent,
const char *  via_addr,
int  via_port,
const char *  call_id,
struct ast_sip_endpoint endpoint 
)

Add a new contact to an AOR without locking the AOR.

Since
13.9.0
Parameters
aorPointer to the AOR
uriFull contact URI
expiration_timeOptional expiration time of the contact
path_infoPath information
user_agentUser-Agent header from REGISTER request
via_addr
via_port
call_id
endpointThe endpoint that resulted in the contact being added
Return values
-1failure
0success
Warning
This function should only be called if you already hold a named write lock on the aor.

Definition at line 417 of file location.c.

421{
422 struct ast_sip_contact *contact;
423
426 ao2_cleanup(contact);
427 return contact ? 0 : -1;
428}
struct ast_sip_contact * ast_sip_location_create_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, const char *path_info, const char *user_agent, const char *via_addr, int via_port, const char *call_id, int prune_on_boot, struct ast_sip_endpoint *endpoint)
Create a new contact for an AOR without locking the AOR.
Definition location.c:355

References ao2_cleanup, ast_sip_contact::aor, ast_sip_location_create_contact(), ast_sip_contact::call_id, ast_sip_contact::endpoint, ast_sip_contact::expiration_time, ast_sip_contact::uri, ast_sip_contact::user_agent, ast_sip_contact::via_addr, and ast_sip_contact::via_port.

Referenced by ast_sip_location_add_contact().

◆ ast_sip_location_create_contact()

struct ast_sip_contact * ast_sip_location_create_contact ( struct ast_sip_aor aor,
const char *  uri,
struct timeval  expiration_time,
const char *  path_info,
const char *  user_agent,
const char *  via_addr,
int  via_port,
const char *  call_id,
int  prune_on_boot,
struct ast_sip_endpoint endpoint 
)

Create a new contact for an AOR without locking the AOR.

Since
13.18.0
Parameters
aorPointer to the AOR
uriFull contact URI
expiration_timeOptional expiration time of the contact
path_infoPath information
user_agentUser-Agent header from REGISTER request
via_addr
via_port
call_id
prune_on_bootNon-zero if the contact cannot survive a restart/boot.
endpointThe endpoint that resulted in the contact being added
Returns
The created contact or NULL on failure.
Warning
This function should only be called if you already hold a named write lock on the aor.

Definition at line 355 of file location.c.

359{
360 struct ast_sip_contact *contact;
361 char name[MAX_OBJECT_FIELD * 2 + 3];
362 char hash[33];
363
364 ast_md5_hash(hash, uri);
365 snprintf(name, sizeof(name), "%s;@%s", ast_sorcery_object_get_id(aor), hash);
366
367 contact = ast_sorcery_alloc(ast_sip_get_sorcery(), "contact", name);
368 if (!contact) {
369 return NULL;
370 }
371
372 ast_string_field_set(contact, uri, uri);
374 contact->qualify_frequency = aor->qualify_frequency;
375 contact->qualify_timeout = aor->qualify_timeout;
376 contact->qualify_2xx_only = aor->qualify_2xx_only;
377 contact->authenticate_qualify = aor->authenticate_qualify;
378 if (path_info && aor->support_path) {
379 ast_string_field_set(contact, path, path_info);
380 }
381
382 if (!ast_strlen_zero(aor->outbound_proxy)) {
383 ast_string_field_set(contact, outbound_proxy, aor->outbound_proxy);
384 }
385
388 }
389
392 }
393
396 }
397 contact->via_port = via_port;
398
399 if (!ast_strlen_zero(call_id)) {
401 }
402
403 contact->endpoint = ao2_bump(endpoint);
404 if (endpoint) {
406 }
407
408 contact->prune_on_boot = prune_on_boot;
409
410 if (ast_sorcery_create(ast_sip_get_sorcery(), contact)) {
411 ao2_ref(contact, -1);
412 return NULL;
413 }
414 return contact;
415}
const char * ast_config_AST_SYSTEM_NAME
Definition options.c:171
int ast_sorcery_create(const struct ast_sorcery *sorcery, void *object)
Create and potentially persist an object using an available wizard.
Definition sorcery.c:2126
void * ast_sorcery_alloc(const struct ast_sorcery *sorcery, const char *type, const char *id)
Allocate an object.
Definition sorcery.c:1808
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
void ast_md5_hash(char *output, const char *input)
Produces MD5 hash based on input string.
Definition utils.c:250

References ao2_bump, ao2_ref, ast_sip_contact::aor, ast_config_AST_SYSTEM_NAME, ast_md5_hash(), ast_sip_get_sorcery(), ast_sorcery_alloc(), ast_sorcery_create(), ast_sorcery_object_get_id(), ast_string_field_set, ast_strlen_zero(), ast_sip_contact::authenticate_qualify, ast_sip_contact::call_id, ast_sip_contact::endpoint, ast_sip_contact::endpoint_name, ast_sip_contact::expiration_time, MAX_OBJECT_FIELD, name, NULL, ast_sip_contact::outbound_proxy, ast_sip_contact::path, ast_sip_contact::prune_on_boot, ast_sip_contact::qualify_2xx_only, ast_sip_contact::qualify_frequency, ast_sip_contact::qualify_timeout, ast_sip_contact::reg_server, ast_sip_contact::uri, ast_sip_contact::user_agent, ast_sip_contact::via_addr, and ast_sip_contact::via_port.

Referenced by ast_sip_location_add_contact_nolock(), and register_aor_core().

◆ ast_sip_location_delete_contact()

int ast_sip_location_delete_contact ( struct ast_sip_contact contact)

Delete a contact.

Parameters
contactContact object to delete
Return values
-1failure
0success

Definition at line 451 of file location.c.

452{
453 return ast_sorcery_delete(ast_sip_get_sorcery(), contact);
454}
int ast_sorcery_delete(const struct ast_sorcery *sorcery, void *object)
Delete an object.
Definition sorcery.c:2302

References ast_sip_get_sorcery(), and ast_sorcery_delete().

Referenced by contact_expire(), destroy_contact(), prune_boot_contacts_cb(), and registrar_contact_delete().

◆ ast_sip_location_prune_boot_contacts()

void ast_sip_location_prune_boot_contacts ( void  )

Prune the prune_on_boot contacts.

Since
13.18.0

Definition at line 470 of file location.c.

471{
472 struct ao2_container *contacts;
473
476 if (contacts) {
478 ao2_ref(contacts, -1);
479 }
480}
static int prune_boot_contacts_cb(void *obj, void *arg, int flags)
Definition location.c:456

References ao2_callback, ao2_ref, AST_RETRIEVE_FLAG_ALL, AST_RETRIEVE_FLAG_MULTIPLE, ast_sip_get_sorcery(), ast_sorcery_retrieve_by_fields(), NULL, and prune_boot_contacts_cb().

Referenced by load_module().

◆ ast_sip_location_retrieve_aor()

struct ast_sip_aor * ast_sip_location_retrieve_aor ( const char *  aor_name)

◆ ast_sip_location_retrieve_aor_contacts()

struct ao2_container * ast_sip_location_retrieve_aor_contacts ( const struct ast_sip_aor aor)

Retrieve all contacts currently available for an AOR.

Parameters
aorPointer to the AOR
Return values
NULLif no contacts available
non-NULLif contacts available
Warning
Since this function prunes expired contacts before returning, it holds a named write lock on the aor. If you already hold the lock, call ast_sip_location_retrieve_aor_contacts_nolock instead.

Definition at line 247 of file location.c.

248{
250}
struct ao2_container * ast_sip_location_retrieve_aor_contacts_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve all contacts currently available for an AOR and filter based on flags.
Definition location.c:252

References AST_SIP_CONTACT_FILTER_DEFAULT, and ast_sip_location_retrieve_aor_contacts_filtered().

Referenced by ast_sip_for_each_contact(), find_contact(), format_ami_aor_handler(), gather_contacts_for_aor(), notify_endpoint(), pjsip_aor_function_read(), and send_unsolicited_mwi_notify().

◆ ast_sip_location_retrieve_aor_contacts_filtered()

struct ao2_container * ast_sip_location_retrieve_aor_contacts_filtered ( const struct ast_sip_aor aor,
unsigned int  flags 
)

Retrieve all contacts currently available for an AOR and filter based on flags.

Since
13.16.0
Parameters
aorPointer to the AOR
flagsFiltering flags
Return values
NULLif no contacts available
non-NULLif contacts available
Warning
Since this function prunes expired contacts before returning, it holds a named write lock on the aor. If you already hold the lock, call ast_sip_location_retrieve_aor_contacts_nolock instead.

Definition at line 252 of file location.c.

254{
255 struct ao2_container *contacts;
256
257 /* ao2_lock / ao2_unlock do not actually write aor since it has an ao2 lockobj. */
258 ao2_lock((void*)aor);
260 ao2_unlock((void*)aor);
261
262 return contacts;
263}
struct ao2_container * ast_sip_location_retrieve_aor_contacts_nolock_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve all contacts currently available for an AOR without locking the AOR and filter based on flag...
Definition location.c:219

References ao2_lock, ao2_unlock, and ast_sip_location_retrieve_aor_contacts_nolock_filtered().

Referenced by ast_sip_location_retrieve_aor_contacts(), ast_sip_location_retrieve_first_aor_contact_filtered(), and pjsip_acf_dial_contacts_read().

◆ ast_sip_location_retrieve_aor_contacts_nolock()

struct ao2_container * ast_sip_location_retrieve_aor_contacts_nolock ( const struct ast_sip_aor aor)

Retrieve all contacts currently available for an AOR without locking the AOR.

Since
13.9.0
Parameters
aorPointer to the AOR
Return values
NULLif no contacts available
non-NULLif contacts available
Warning
This function should only be called if you already hold a named write lock on the aor.

Definition at line 214 of file location.c.

References AST_SIP_CONTACT_FILTER_DEFAULT, and ast_sip_location_retrieve_aor_contacts_nolock_filtered().

Referenced by register_aor().

◆ ast_sip_location_retrieve_aor_contacts_nolock_filtered()

struct ao2_container * ast_sip_location_retrieve_aor_contacts_nolock_filtered ( const struct ast_sip_aor aor,
unsigned int  flags 
)

Retrieve all contacts currently available for an AOR without locking the AOR and filter based on flags.

Since
13.16.0
Parameters
aorPointer to the AOR
flagsFiltering flags
Return values
NULLif no contacts available
non-NULLif contacts available
Warning
This function should only be called if you already hold a named write lock on the aor.

Definition at line 219 of file location.c.

221{
222 /* Give enough space for ;@ at the end, since that is our object naming scheme */
223 size_t prefix_len = strlen(ast_sorcery_object_get_id(aor)) + sizeof(";@") - 1;
224 char prefix[prefix_len + 1];
225 struct ao2_container *contacts;
226
227 sprintf(prefix, "%s;@", ast_sorcery_object_get_id(aor)); /* Safe */
228 if (!(contacts = ast_sorcery_retrieve_by_prefix(ast_sip_get_sorcery(), "contact", prefix, prefix_len))) {
229 return NULL;
230 }
231
232 /* Prune any expired contacts and delete them, we do this first because static contacts can never expire */
234
235 /* Add any permanent contacts from the AOR */
236 if (aor->permanent_contacts) {
238 }
239
242 }
243
244 return contacts;
245}
@ OBJ_UNLINK
Definition astobj2.h:1039
static char prefix[MAX_PREFIX]
Definition http.c:144
static int contact_link_static(void *obj, void *arg, int flags)
Internal callback function which links static contacts into another container.
Definition location.c:168
static int contact_remove_unreachable(void *obj, void *arg, int flags)
Internal callback function which removes any contact which is unreachable.
Definition location.c:177
static int contact_expire(void *obj, void *arg, int flags)
Internal callback function which deletes and unlinks any expired contacts.
Definition location.c:153
struct ao2_container * ast_sorcery_retrieve_by_prefix(const struct ast_sorcery *sorcery, const char *type, const char *prefix, const size_t prefix_len)
Retrieve multiple objects whose id begins with the specified prefix.
Definition sorcery.c:2053

References ao2_callback, AST_SIP_CONTACT_FILTER_REACHABLE, ast_sip_get_sorcery(), ast_sorcery_object_get_id(), ast_sorcery_retrieve_by_prefix(), contact_expire(), contact_link_static(), contact_remove_unreachable(), NULL, OBJ_MULTIPLE, OBJ_NODATA, OBJ_UNLINK, ast_sip_aor::permanent_contacts, and prefix.

Referenced by ast_sip_location_retrieve_aor_contacts_filtered(), and ast_sip_location_retrieve_aor_contacts_nolock().

◆ ast_sip_location_retrieve_contact()

struct ast_sip_contact * ast_sip_location_retrieve_contact ( const char *  contact_name)

Retrieve a named contact.

Parameters
contact_nameName of the contact
Return values
NULLif not found
non-NULLif found

Definition at line 350 of file location.c.

351{
352 return ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "contact", contact_name);
353}

References ast_sip_get_sorcery(), and ast_sorcery_retrieve_by_id().

Referenced by register_contact_transport_remove_cb().

◆ ast_sip_location_retrieve_contact_and_aor_from_list()

void ast_sip_location_retrieve_contact_and_aor_from_list ( const char *  aor_list,
struct ast_sip_aor **  aor,
struct ast_sip_contact **  contact 
)

Retrieve the first bound contact AND the AOR chosen from a list of AORs.

Parameters
aor_listA comma-separated list of AOR names
aorThe chosen AOR
contactThe chosen contact

Definition at line 266 of file location.c.

268{
270}
void ast_sip_location_retrieve_contact_and_aor_from_list_filtered(const char *aor_list, unsigned int flags, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
Retrieve the first bound contact AND the AOR chosen from a list of AORs and filter based on flags.
Definition location.c:272

References AST_SIP_CONTACT_FILTER_DEFAULT, and ast_sip_location_retrieve_contact_and_aor_from_list_filtered().

Referenced by ast_sip_location_retrieve_contact_from_aor_list().

◆ ast_sip_location_retrieve_contact_and_aor_from_list_filtered()

void ast_sip_location_retrieve_contact_and_aor_from_list_filtered ( const char *  aor_list,
unsigned int  flags,
struct ast_sip_aor **  aor,
struct ast_sip_contact **  contact 
)

Retrieve the first bound contact AND the AOR chosen from a list of AORs and filter based on flags.

Since
13.16.0
Parameters
aor_listA comma-separated list of AOR names
flagsFiltering flags
aorThe chosen AOR
contactThe chosen contact

Definition at line 272 of file location.c.

274{
275 char *aor_name;
276 char *rest;
277
278 /* If the location is still empty we have nowhere to go */
279 if (ast_strlen_zero(aor_list) || !(rest = ast_strdupa(aor_list))) {
280 ast_log(LOG_WARNING, "Unable to determine contacts from empty aor list\n");
281 return;
282 }
283
284 *aor = NULL;
285 *contact = NULL;
286
287 while ((aor_name = ast_strip(strsep(&rest, ",")))) {
288 *aor = ast_sip_location_retrieve_aor(aor_name);
289
290 if (!(*aor)) {
291 continue;
292 }
294 /* If a valid contact is available use its URI for dialing */
295 if (*contact) {
296 break;
297 }
298
299 ao2_ref(*aor, -1);
300 *aor = NULL;
301 }
302}
struct ast_sip_contact * ast_sip_location_retrieve_first_aor_contact_filtered(const struct ast_sip_aor *aor, unsigned int flags)
Retrieve the first bound contact for an AOR and filter based on flags.
Definition location.c:199

References ao2_ref, ast_log, ast_sip_location_retrieve_aor(), ast_sip_location_retrieve_first_aor_contact_filtered(), ast_strdupa, ast_strip(), ast_strlen_zero(), LOG_WARNING, NULL, and strsep().

Referenced by ast_sip_location_retrieve_contact_and_aor_from_list(), and ast_sip_session_create_outgoing().

◆ ast_sip_location_retrieve_contact_from_aor_list()

struct ast_sip_contact * ast_sip_location_retrieve_contact_from_aor_list ( const char *  aor_list)

Retrieve the first bound contact from a list of AORs.

Parameters
aor_listA comma-separated list of AOR names
Return values
NULLif no contacts available
non-NULLif contacts available

Definition at line 304 of file location.c.

305{
306 struct ast_sip_aor *aor;
307 struct ast_sip_contact *contact;
308
310
312
313 return contact;
314}
void ast_sip_location_retrieve_contact_and_aor_from_list(const char *aor_list, struct ast_sip_aor **aor, struct ast_sip_contact **contact)
Retrieve the first bound contact AND the AOR chosen from a list of AORs.
Definition location.c:266

References ao2_cleanup, ast_sip_contact::aor, and ast_sip_location_retrieve_contact_and_aor_from_list().

Referenced by ast_sip_create_subscription(), create_out_of_dialog_request(), handle_atsign(), handle_single_token(), insert_user_in_contact_uri(), mwi_contact_deleted(), and transfer().

◆ ast_sip_location_retrieve_contacts_from_aor_list()

struct ao2_container * ast_sip_location_retrieve_contacts_from_aor_list ( const char *  aor_list)

Retrieve all contacts from a list of AORs.

Parameters
aor_listA comma-separated list of AOR names
Return values
NULLif no contacts available
non-NULLcontainer (which must be freed) if contacts available

Definition at line 335 of file location.c.

336{
337 struct ao2_container *contacts;
338
341 if (!contacts) {
342 return NULL;
343 }
344
346
347 return contacts;
348}
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition astobj2.h:1327
@ AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT
Reject objects with duplicate keys in container.
Definition astobj2.h:1188
int ast_sip_for_each_aor(const char *aors, ao2_callback_fn on_aor, void *arg)
For every aor in the comma separated aors string call the given 'on_aor' handler.
Definition location.c:688
static int permanent_uri_sort_fn(const void *obj_left, const void *obj_right, int flags)
Definition location.c:499
static int gather_contacts_for_aor(void *obj, void *arg, int flags)
Definition location.c:319

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_container_alloc_list, AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, ast_sip_for_each_aor(), gather_contacts_for_aor(), NULL, and permanent_uri_sort_fn().

Referenced by add_security_headers(), and handle_registration_response().

◆ ast_sip_location_retrieve_first_aor_contact()

struct ast_sip_contact * ast_sip_location_retrieve_first_aor_contact ( const struct ast_sip_aor aor)

Retrieve the first bound contact for an AOR.

Parameters
aorPointer to the AOR
Return values
NULLif no contacts available
non-NULLif contacts available

Definition at line 194 of file location.c.

References ast_sip_contact::aor, AST_SIP_CONTACT_FILTER_DEFAULT, and ast_sip_location_retrieve_first_aor_contact_filtered().

Referenced by handle_slash().

◆ ast_sip_location_retrieve_first_aor_contact_filtered()

struct ast_sip_contact * ast_sip_location_retrieve_first_aor_contact_filtered ( const struct ast_sip_aor aor,
unsigned int  flags 
)

Retrieve the first bound contact for an AOR and filter based on flags.

Since
13.16.0
Parameters
aorPointer to the AOR
flagsFiltering flags
Return values
NULLif no contacts available
non-NULLif contacts available

Definition at line 199 of file location.c.

201{
202 struct ao2_container *contacts;
203 struct ast_sip_contact *contact = NULL;
204
206 if (contacts && ao2_container_count(contacts)) {
207 /* Get the first AOR contact in the container. */
208 contact = ao2_callback(contacts, 0, NULL, NULL);
209 }
210 ao2_cleanup(contacts);
211 return contact;
212}
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.

References ao2_callback, ao2_cleanup, ao2_container_count(), ast_sip_contact::aor, ast_sip_location_retrieve_aor_contacts_filtered(), and NULL.

Referenced by ast_sip_location_retrieve_contact_and_aor_from_list_filtered(), and ast_sip_location_retrieve_first_aor_contact().

◆ ast_sip_location_update_contact()

int ast_sip_location_update_contact ( struct ast_sip_contact contact)

Update a contact.

Parameters
contactNew contact object with details
Return values
-1failure
0success

Definition at line 446 of file location.c.

447{
448 return ast_sorcery_update(ast_sip_get_sorcery(), contact);
449}
int ast_sorcery_update(const struct ast_sorcery *sorcery, void *object)
Update an object.
Definition sorcery.c:2214

References ast_sip_get_sorcery(), and ast_sorcery_update().

Referenced by register_aor_core().

◆ ast_sip_message_apply_transport()

void ast_sip_message_apply_transport ( const char *  transport_name,
pjsip_tx_data *  tdata 
)

Apply the configuration for a transport to an outgoing message.

Since
17.0.0
Parameters
transport_nameThe name of the transport to apply configuration from
tdataThe SIP message

Definition at line 301 of file config_transport.c.

302{
303 struct ast_sip_transport_state *transport_state;
304
305 if (ast_strlen_zero(transport_name)) {
306 return;
307 }
308
309 /* We only currently care about requests that are of the INVITE, CANCEL, or OPTIONS
310 * type but in the future we could support other messages.
311 */
312 if (tdata->msg->type != PJSIP_REQUEST_MSG ||
313 (pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_invite_method) &&
314 pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_cancel_method) &&
315 pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_options_method))) {
316 return;
317 }
318
319 transport_state = ast_sip_get_transport_state(transport_name);
320 if (!transport_state) {
321 return;
322 }
323
324 if (!transport_state->flow) {
325 ao2_ref(transport_state, -1);
326 return;
327 }
328
329 ao2_lock(transport_state);
330
331 /* If a Preferred Identity has been set then add it to the request */
332 if (transport_state->preferred_identity) {
333 ast_sip_add_header(tdata, "P-Preferred-Identity", transport_state->preferred_identity);
334 }
335
336 /* If Service Routes have been set then add them to the request */
337 if (transport_state->service_routes) {
338 int idx;
339
340 for (idx = 0; idx < AST_VECTOR_SIZE(transport_state->service_routes); ++idx) {
341 char *service_route = AST_VECTOR_GET(transport_state->service_routes, idx);
342
343 ast_sip_add_header(tdata, "Route", service_route);
344 }
345 }
346
347 ao2_unlock(transport_state);
348
349 ao2_ref(transport_state, -1);
350}
struct ast_sip_transport_state * ast_sip_get_transport_state(const char *transport_id)
Retrieve transport state.

References ao2_lock, ao2_ref, ao2_unlock, ast_sip_add_header(), ast_sip_get_transport_state(), ast_strlen_zero(), AST_VECTOR_GET, AST_VECTOR_SIZE, ast_sip_transport_state::flow, ast_sip_transport_state::preferred_identity, and ast_sip_transport_state::service_routes.

Referenced by ast_sip_send_out_of_dialog_request(), handle_outgoing_request(), handle_outgoing_response(), and supplement_outgoing_response().

◆ ast_sip_modify_id_header()

void ast_sip_modify_id_header ( pj_pool_t *  pool,
pjsip_fromto_hdr *  id_hdr,
const struct ast_party_id id 
)

Set name and number information on an identity header.

Parameters
poolMemory pool to use for string duplication
id_hdrA From, P-Asserted-Identity, or Remote-Party-ID header to modify
idThe identity information to apply to the header

Definition at line 2850 of file res_pjsip.c.

2851{
2852 pjsip_name_addr *id_name_addr;
2853 pjsip_sip_uri *id_uri;
2854
2855 id_name_addr = (pjsip_name_addr *) id_hdr->uri;
2856 id_uri = pjsip_uri_get_uri(id_name_addr->uri);
2857
2858 if (id->name.valid) {
2859 if (!ast_strlen_zero(id->name.str)) {
2860 int name_buf_len = strlen(id->name.str) * 2 + 1;
2861 char *name_buf = ast_alloca(name_buf_len);
2862
2863 ast_escape_quoted(id->name.str, name_buf, name_buf_len);
2864 pj_strdup2(pool, &id_name_addr->display, name_buf);
2865 } else {
2866 pj_strdup2(pool, &id_name_addr->display, NULL);
2867 }
2868 }
2869
2870 if (id->number.valid) {
2871 pj_strdup2(pool, &id_uri->user, id->number.str);
2872 }
2873}
enum queue_result id
Definition app_queue.c:1767
char * ast_escape_quoted(const char *string, char *outbuf, int buflen)
Escape characters found in a quoted string.
Definition utils.c:817

References ast_alloca, ast_escape_quoted(), ast_strlen_zero(), id, and NULL.

Referenced by add_pai_header(), add_rpid_header(), and set_from_header().

◆ ast_sip_persistent_endpoint_publish_contact_state()

void ast_sip_persistent_endpoint_publish_contact_state ( const char *  endpoint_name,
const struct ast_sip_contact_status contact_status 
)

Publish the change of state for a contact.

Parameters
endpoint_nameThe SIP endpoint name.
contact_statusThe contact status.

Definition at line 1504 of file pjsip_configuration.c.

1505{
1506 struct sip_persistent_endpoint *persistent;
1507 struct ast_json *blob;
1508 char rtt[32];
1509
1510 persistent = ao2_find(persistent_endpoints, endpoint_name, OBJ_SEARCH_KEY);
1511 if (!persistent) {
1512 return;
1513 }
1514
1515 snprintf(rtt, sizeof(rtt), "%" PRId64, contact_status->rtt);
1516 blob = ast_json_pack("{s: s, s: s, s: s, s: s, s: s}",
1517 "contact_status", ast_sip_get_contact_status_label(contact_status->status),
1518 "aor", contact_status->aor,
1519 "uri", contact_status->uri,
1520 "roundtrip_usec", rtt,
1521 "endpoint_name", ast_endpoint_get_resource(persistent->endpoint));
1522 if (blob) {
1524 ast_json_unref(blob);
1525 }
1526
1527 ao2_ref(persistent, -1);
1528}
void ast_endpoint_blob_publish(struct ast_endpoint *endpoint, struct stasis_message_type *type, struct ast_json *blob)
Creates and publishes a ast_endpoint_blob message.
struct stasis_message_type * ast_endpoint_contact_state_type(void)
Message type for endpoint contact state changes.
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition json.c:73
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition json.c:612
static struct ao2_container * persistent_endpoints
Container for persistent endpoint information.
Abstract JSON element (object, array, string, int, ...).
Persistent endpoint information.
struct ast_endpoint * endpoint
Asterisk endpoint itself.

References ao2_find, ao2_ref, ast_sip_contact_status::aor, ast_endpoint_blob_publish(), ast_endpoint_contact_state_type(), ast_endpoint_get_resource(), ast_json_pack(), ast_json_unref(), ast_sip_get_contact_status_label(), sip_persistent_endpoint::endpoint, OBJ_SEARCH_KEY, persistent_endpoints, ast_sip_contact_status::rtt, ast_sip_contact_status::status, and ast_sip_contact_status::uri.

Referenced by sip_options_publish_contact_state().

◆ ast_sip_persistent_endpoint_update_state()

int ast_sip_persistent_endpoint_update_state ( const char *  endpoint_name,
enum ast_endpoint_state  state 
)

Change state of a persistent endpoint.

Parameters
endpoint_nameThe SIP endpoint name to change state.
stateThe new state
Return values
0Success
-1Endpoint not found

Definition at line 1447 of file pjsip_configuration.c.

1448{
1449 struct sip_persistent_endpoint *persistent;
1450 struct ast_json *blob;
1451 char *regcontext;
1452
1453 persistent = ao2_find(persistent_endpoints, endpoint_name, OBJ_SEARCH_KEY);
1454 if (!persistent) {
1455 return -1;
1456 }
1457
1458 /* If there was no state change, don't publish anything. */
1459 if (ast_endpoint_get_state(persistent->endpoint) == state) {
1460 ao2_ref(persistent, -1);
1461 return 0;
1462 }
1463
1465
1466 if (state == AST_ENDPOINT_ONLINE) {
1468 blob = ast_json_pack("{s: s}", "peer_status", "Reachable");
1469
1473 "Noop", ast_strdup(ast_endpoint_get_resource(persistent->endpoint)), ast_free_ptr, "PJSIP");
1474 }
1475 }
1476
1477 ast_verb(2, "Endpoint %s is now Reachable\n", ast_endpoint_get_resource(persistent->endpoint));
1478 } else {
1480 blob = ast_json_pack("{s: s}", "peer_status", "Unreachable");
1481
1483 struct pbx_find_info q = { .stacklen = 0 };
1484
1487 }
1488 }
1489
1490 ast_verb(2, "Endpoint %s is now Unreachable\n", ast_endpoint_get_resource(persistent->endpoint));
1491 }
1492
1494
1496 ast_json_unref(blob);
1498
1499 ao2_ref(persistent, -1);
1500
1501 return 0;
1502}
void ast_free_ptr(void *ptr)
free() wrapper
Definition astmm.c:1739
static char regcontext[AST_MAX_CONTEXT]
Definition chan_iax2.c:349
@ AST_DEVSTATE_CACHABLE
Definition devicestate.h:70
int ast_devstate_changed(enum ast_device_state state, enum ast_devstate_cache cachable, const char *fmt,...)
Tells Asterisk the State for Device is changed.
@ AST_DEVICE_UNKNOWN
Definition devicestate.h:53
@ AST_ENDPOINT_OFFLINE
Definition endpoints.h:55
@ AST_ENDPOINT_ONLINE
Definition endpoints.h:57
void ast_endpoint_set_state(struct ast_endpoint *endpoint, enum ast_endpoint_state state)
Updates the state of the given endpoint.
enum ast_endpoint_state ast_endpoint_get_state(const struct ast_endpoint *endpoint)
Gets the state of the given endpoint.
@ E_MATCH
Definition extconf.h:217
struct stasis_message_type * ast_endpoint_state_type(void)
Message type for endpoint state changes.
#define ast_verb(level,...)
int ast_add_extension(const char *context, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar)
Add and extension to an extension context.
Definition pbx.c:6949
int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Determine whether an extension exists.
Definition pbx.c:4196
int ast_context_remove_extension(const char *context, const char *extension, int priority, const char *registrar)
Simply remove extension from context.
Definition pbx.c:4969
struct ast_exten * pbx_find_extension(struct ast_channel *chan, struct ast_context *bypass, struct pbx_find_info *q, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
Definition ael_main.c:152

References ao2_find, ao2_ref, ast_add_extension(), ast_context_remove_extension(), AST_DEVICE_UNKNOWN, AST_DEVSTATE_CACHABLE, ast_devstate_changed(), ast_endpoint_blob_publish(), ast_endpoint_get_resource(), ast_endpoint_get_state(), AST_ENDPOINT_OFFLINE, AST_ENDPOINT_ONLINE, ast_endpoint_set_state(), ast_endpoint_state_type(), ast_exists_extension(), ast_free, ast_free_ptr(), ast_json_pack(), ast_json_unref(), ast_sip_get_regcontext(), ast_strdup, ast_strlen_zero(), ast_verb, E_MATCH, sip_persistent_endpoint::endpoint, NULL, OBJ_SEARCH_KEY, pbx_find_extension(), persistent_endpoints, regcontext, and pbx_find_info::stacklen.

Referenced by sip_options_synchronize_endpoint(), sip_options_unused_endpoint_state_compositor(), and sip_options_update_endpoint_state_compositor_aor().

◆ ast_sip_pjsip_uri_get_hostname()

const pj_str_t * ast_sip_pjsip_uri_get_hostname ( pjsip_uri *  uri)

Get the host portion of the pjsip_uri.

Since
16.28.0
Parameters
uriThe pjsip_uri to get the host from
Note
This function will check what kind of URI it receives and return the host based off of that
Returns
Host string or empty string if not present

Definition at line 3496 of file res_pjsip.c.

3497{
3498 if (ast_sip_is_uri_sip_sips(uri)) {
3499 pjsip_sip_uri *sip_uri = pjsip_uri_get_uri(uri);
3500 if (!sip_uri) {
3501 return &AST_PJ_STR_EMPTY;
3502 }
3503 return &sip_uri->host;
3504 } else if (PJSIP_URI_SCHEME_IS_TEL(uri)) {
3505 return &AST_PJ_STR_EMPTY;
3506 }
3507
3508 return &AST_PJ_STR_EMPTY;
3509}
static const pj_str_t AST_PJ_STR_EMPTY
Definition res_pjsip.h:112

References AST_PJ_STR_EMPTY, and ast_sip_is_uri_sip_sips().

Referenced by dialog_info_generate_body_content(), find_aor2(), get_endpoint_details(), get_from_header(), rx_data_to_ast_msg(), and set_sipdomain_variable().

◆ ast_sip_pjsip_uri_get_other_param()

struct pjsip_param * ast_sip_pjsip_uri_get_other_param ( pjsip_uri *  uri,
const pj_str_t *  param_str 
)

Find an 'other' SIP/SIPS URI parameter by name.

Since
16.28.0

A convenience function to find a named parameter from a SIP/SIPS URI. This function will not find the following standard SIP/SIPS URI parameters which are stored separately by PJSIP:

  • user
  • method
  • transport
  • ttl
  • lr
  • maddr
Parameters
uriThe pjsip_uri to get the parameter from
param_strThe name of the parameter to find
Note
This function will check what kind of URI it receives and return the parameter based off of that
Returns
Find parameter or NULL if not present

Definition at line 3511 of file res_pjsip.c.

3512{
3513 if (ast_sip_is_uri_sip_sips(uri)) {
3514 pjsip_sip_uri *sip_uri = pjsip_uri_get_uri(uri);
3515 if (!sip_uri) {
3516 return NULL;
3517 }
3518 return pjsip_param_find(&sip_uri->other_param, param_str);
3519 } else if (PJSIP_URI_SCHEME_IS_TEL(uri)) {
3520 pjsip_tel_uri *tel_uri = pjsip_uri_get_uri(uri);
3521 if (!tel_uri) {
3522 return NULL;
3523 }
3524 return pjsip_param_find(&tel_uri->other_param, param_str);
3525 }
3526
3527 return NULL;
3528}

References ast_sip_is_uri_sip_sips(), and NULL.

Referenced by get_uri_option_line(), and set_redirecting_reason_by_cause().

◆ ast_sip_pjsip_uri_get_username()

const pj_str_t * ast_sip_pjsip_uri_get_username ( pjsip_uri *  uri)

Get the user portion of the pjsip_uri.

Since
16.28.0
Parameters
uriThe pjsip_uri to get the user from
Note
This function will check what kind of URI it receives and return the user based off of that
Returns
User string or empty string if not present

Definition at line 3477 of file res_pjsip.c.

3478{
3479 if (ast_sip_is_uri_sip_sips(uri)) {
3480 pjsip_sip_uri *sip_uri = pjsip_uri_get_uri(uri);
3481 if (!sip_uri) {
3482 return &AST_PJ_STR_EMPTY;
3483 }
3484 return &sip_uri->user;
3485 } else if (PJSIP_URI_SCHEME_IS_TEL(uri)) {
3486 pjsip_tel_uri *tel_uri = pjsip_uri_get_uri(uri);
3487 if (!tel_uri) {
3488 return &AST_PJ_STR_EMPTY;
3489 }
3490 return &tel_uri->number;
3491 }
3492
3493 return &AST_PJ_STR_EMPTY;
3494}

References AST_PJ_STR_EMPTY, and ast_sip_is_uri_sip_sips().

Referenced by add_diversion_header(), endpoint_lookup(), find_aor2(), get_destination(), get_from_header(), options_on_rx_request(), publish_request_initial(), pubsub_on_rx_subscribe_request(), rx_data_to_ast_msg(), set_id_from_hdr(), and sub_persistence_recreate().

◆ ast_sip_rdata_get_header_value()

char * ast_sip_rdata_get_header_value ( pjsip_rx_data *  rdata,
const pj_str_t  str 
)

Get a specific header value from rdata.

Note
The returned value does not need to be freed since it's from the rdata pool
Parameters
rdataThe rdata
strThe header to find
Return values
NULLon failure
Theheader value on success

Definition at line 345 of file res_pjsip.c.

346{
347 pjsip_generic_string_hdr *hdr;
348 pj_str_t hdr_val;
349
350 hdr = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str, NULL);
351 if (!hdr) {
352 return NULL;
353 }
354
355 pj_strdup_with_null(rdata->tp_info.pool, &hdr_val, &hdr->hvalue);
356
357 return hdr_val.ptr;
358}

References NULL, and str.

Referenced by stir_shaken_incoming_request().

◆ ast_sip_register_authenticator()

int ast_sip_register_authenticator ( struct ast_sip_authenticator auth)

Register a SIP authenticator.

An authenticator has three main purposes: 1) Determining if authentication should be performed on an incoming request 2) Gathering credentials necessary for issuing an authentication challenge 3) Authenticating a request that has credentials

Asterisk provides a default authenticator, but it may be replaced by a custom one if desired.

Parameters
authThe authenticator to register
Return values
0Success
-1Failure

Definition at line 140 of file res_pjsip.c.

141{
143 ast_log(LOG_WARNING, "Authenticator %p is already registered. Cannot register a new one\n", registered_authenticator);
144 return -1;
145 }
147 ast_debug(1, "Registered SIP authenticator module %p\n", auth);
148
149 return 0;
150}

References ast_debug, ast_log, LOG_WARNING, and registered_authenticator.

Referenced by load_module().

◆ ast_sip_register_endpoint_formatter()

void ast_sip_register_endpoint_formatter ( struct ast_sip_endpoint_formatter obj)

Register an endpoint formatter.

Parameters
objthe formatter to register

Definition at line 481 of file res_pjsip.c.

482{
485}
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition linkedlists.h:52
#define AST_RWLIST_INSERT_TAIL

References AST_RWLIST_INSERT_TAIL, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, lock, ast_cli_entry::next, and SCOPED_LOCK.

Referenced by ast_res_pjsip_init_options_handling(), ast_sip_initialize_sorcery_auth(), ast_sip_initialize_sorcery_location(), ast_sip_initialize_sorcery_transport(), and load_module().

◆ ast_sip_register_endpoint_identifier()

int ast_sip_register_endpoint_identifier ( struct ast_sip_endpoint_identifier identifier)

Register a SIP endpoint identifier.

An endpoint identifier's purpose is to determine which endpoint a given SIP message has come from.

Multiple endpoint identifiers may be registered so that if an endpoint cannot be identified by one identifier, it may be identified by another.

Asterisk provides two endpoint identifiers. One identifies endpoints based on the user part of the From header URI. The other identifies endpoints based on the source IP address.

If the order in which endpoint identifiers is run is important to you, then be sure to load individual endpoint identifier modules in the order you wish for them to be run in modules.conf

Note
endpoint identifiers registered using this method (no name specified) are placed at the front of the endpoint identifiers list ahead of any named identifiers.
Parameters
identifierThe SIP endpoint identifier to register
Return values
0Success
-1Failure

Definition at line 310 of file res_pjsip.c.

311{
313}
int ast_sip_register_endpoint_identifier_with_name(struct ast_sip_endpoint_identifier *identifier, const char *name)
Register a SIP endpoint identifier with a name.
Definition res_pjsip.c:233

References ast_sip_register_endpoint_identifier_with_name(), endpoint_identifier_list::identifier, and NULL.

Referenced by load_module().

◆ ast_sip_register_endpoint_identifier_with_name()

int ast_sip_register_endpoint_identifier_with_name ( struct ast_sip_endpoint_identifier identifier,
const char *  name 
)

Register a SIP endpoint identifier with a name.

An endpoint identifier's purpose is to determine which endpoint a given SIP message has come from.

Multiple endpoint identifiers may be registered so that if an endpoint cannot be identified by one identifier, it may be identified by another.

Parameters
identifierThe SIP endpoint identifier to register
nameThe name of the endpoint identifier
Return values
0Success
-1Failure

Definition at line 233 of file res_pjsip.c.

235{
236 char *prev, *current, *identifier_order;
237 struct endpoint_identifier_list *iter, *id_list_item;
239
240 id_list_item = ast_calloc(1, sizeof(*id_list_item));
241 if (!id_list_item) {
242 ast_log(LOG_ERROR, "Unable to add endpoint identifier. Out of memory.\n");
243 return -1;
244 }
245 id_list_item->identifier = identifier;
246 id_list_item->name = name;
247
248 ast_debug(1, "Register endpoint identifier %s(%p)\n", name ?: "", identifier);
249
250 if (ast_strlen_zero(name)) {
251 /* if an identifier has no name then place in front */
253 return 0;
254 }
255
256 /* see if the name of the identifier is in the global endpoint_identifier_order list */
257 identifier_order = prev = current = ast_sip_get_endpoint_identifier_order();
258
259 if (ast_strlen_zero(identifier_order)) {
260 id_list_item->priority = UINT_MAX;
262 ast_free(identifier_order);
263 return 0;
264 }
265
266 id_list_item->priority = 0;
267 while ((current = strchr(current, ','))) {
268 ++id_list_item->priority;
269 if (!strncmp(prev, name, current - prev)
270 && strlen(name) == current - prev) {
271 break;
272 }
273 prev = ++current;
274 }
275
276 if (!current) {
277 /* check to see if it is the only or last item */
278 if (!strcmp(prev, name)) {
279 ++id_list_item->priority;
280 } else {
281 id_list_item->priority = UINT_MAX;
282 }
283 }
284
285 if (id_list_item->priority == UINT_MAX || AST_RWLIST_EMPTY(&endpoint_identifiers)) {
286 /* if not in the endpoint_identifier_order list then consider it less in
287 priority and add it to the end */
289 ast_free(identifier_order);
290 return 0;
291 }
292
294 if (id_list_item->priority < iter->priority) {
296 break;
297 }
298
299 if (!AST_RWLIST_NEXT(iter, list)) {
301 break;
302 }
303 }
305
306 ast_free(identifier_order);
307 return 0;
308}
size_t current
#define AST_RWLIST_EMPTY
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_RWLIST_INSERT_AFTER
#define AST_RWLIST_NEXT
#define AST_RWLIST_TRAVERSE_SAFE_END
#define AST_RWLIST_INSERT_HEAD
#define AST_RWLIST_INSERT_BEFORE_CURRENT
struct endpoint_identifier_list::@488 list

References ast_calloc, ast_debug, ast_free, ast_log, AST_RWLIST_EMPTY, AST_RWLIST_INSERT_AFTER, AST_RWLIST_INSERT_BEFORE_CURRENT, AST_RWLIST_INSERT_HEAD, AST_RWLIST_INSERT_TAIL, AST_RWLIST_NEXT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_sip_get_endpoint_identifier_order(), ast_strlen_zero(), current, endpoint_identifier_list::identifier, endpoint_identifier_list::list, lock, LOG_ERROR, name, endpoint_identifier_list::name, endpoint_identifier_list::priority, and SCOPED_LOCK.

Referenced by ast_sip_register_endpoint_identifier(), load_module(), load_module(), and load_module().

◆ ast_sip_register_outbound_authenticator()

int ast_sip_register_outbound_authenticator ( struct ast_sip_outbound_authenticator outbound_auth)

Register an outbound SIP authenticator.

An outbound authenticator is responsible for creating responses to authentication challenges by remote endpoints.

Parameters
outbound_authThe authenticator to register
Return values
0Success
-1Failure

Definition at line 191 of file res_pjsip.c.

192{
194 ast_log(LOG_WARNING, "Outbound authenticator %p is already registered. Cannot register a new one\n", registered_outbound_authenticator);
195 return -1;
196 }
198 ast_debug(1, "Registered SIP outbound authenticator module %p\n", auth);
199
200 return 0;
201}

References ast_debug, ast_log, LOG_WARNING, and registered_outbound_authenticator.

Referenced by load_module().

◆ ast_sip_register_service()

int ast_sip_register_service ( pjsip_module *  module)

Register a SIP service in Asterisk.

This is more-or-less a wrapper around pjsip_endpt_register_module(). Registering a service makes it so that PJSIP will call into the service at appropriate times. For more information about PJSIP module callbacks, see the PJSIP documentation. Asterisk modules that call this function will likely do so at module load time.

Parameters
moduleThe module that is to be registered with PJSIP
Return values
0Success
-1Failure

Definition at line 117 of file res_pjsip.c.

118{
120}
static int register_service(void *data)
Definition res_pjsip.c:102

References ast_sip_push_task_wait_servant(), NULL, and register_service().

Referenced by ast_res_pjsip_init_message_filter(), ast_sip_initialize_distributor(), ast_sip_initialize_global_headers(), ast_sip_initialize_transport_management(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), load_module(), and load_module().

◆ ast_sip_register_supplement()

void ast_sip_register_supplement ( struct ast_sip_supplement supplement)

Register a supplement to SIP out of dialog processing.

This allows for someone to insert themselves in the processing of out of dialog SIP requests and responses. This, for example could allow for a module to set channel data based on headers in an incoming message. Similarly, a module could reject an incoming request if desired.

Parameters
supplementThe supplement to register

Definition at line 1456 of file res_pjsip.c.

1457{
1458 struct ast_sip_supplement *iter;
1459 int inserted = 0;
1461
1463 if (iter->priority > supplement->priority) {
1465 inserted = 1;
1466 break;
1467 }
1468 }
1470
1471 if (!inserted) {
1473 }
1474}

References AST_RWLIST_INSERT_BEFORE_CURRENT, AST_RWLIST_INSERT_TAIL, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, lock, ast_sip_supplement::next, ast_sip_supplement::priority, and SCOPED_LOCK.

Referenced by ast_res_pjsip_init_message_filter(), load_module(), and load_module().

◆ ast_sip_remove_headers_by_name_and_value()

void ast_sip_remove_headers_by_name_and_value ( pjsip_msg *  msg,
const pj_str_t *  hdr_name,
const char *  value 
)

Removes all headers of a specific name and value from a pjsip_msg.

Parameters
msgPJSIP message from which to remove headers.
hdr_nameName of the header to remove.
valueOptional string value of the header to remove. If NULL, remove all headers of given hdr_name.

Definition at line 203 of file security_agreements.c.

204{
205 struct pjsip_generic_string_hdr *hdr = pjsip_msg_find_hdr_by_name(msg, hdr_name, NULL);
206 for (; hdr; hdr = pjsip_msg_find_hdr_by_name(msg, hdr_name, hdr->next)) {
207 if (value == NULL || !pj_strcmp2(&hdr->hvalue, value)) {
208 pj_list_erase(hdr);
209 }
210 if (hdr->next == hdr) {
211 break;
212 }
213 }
214}

References NULL, and value.

Referenced by add_security_headers().

◆ ast_sip_report_auth_challenge_sent()

void ast_sip_report_auth_challenge_sent ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata,
pjsip_tx_data *  tdata 
)

Send a security event notification for when an authentication challenge is sent.

Parameters
endpointPointer to the endpoint in use
rdataReceived message
tdataSent message

Definition at line 197 of file res/res_pjsip/security_events.c.

198{
199 pjsip_www_authenticate_hdr *auth = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_WWW_AUTHENTICATE, NULL);
200 enum ast_transport transport = security_event_get_transport(rdata);
201 char nonce[64] = "", call_id[pj_strlen(&rdata->msg_info.cid->id) + 1];
202 struct ast_sockaddr local, remote;
203
204 struct ast_security_event_chal_sent chal_sent = {
206 .common.version = AST_SECURITY_EVENT_CHAL_SENT_VERSION,
207 .common.service = "PJSIP",
208 .common.account_id = get_account_id(endpoint),
209 .common.local_addr = {
210 .addr = &local,
211 .transport = transport,
212 },
213 .common.remote_addr = {
214 .addr = &remote,
215 .transport = transport,
216 },
217 .common.session_id = call_id,
218 .challenge = nonce,
219 };
220
221 if (auth && !pj_strcmp2(&auth->scheme, "digest")) {
222 ast_copy_pj_str(nonce, &auth->challenge.digest.nonce, sizeof(nonce));
223 }
224
225 security_event_populate(rdata, call_id, sizeof(call_id), &local, &remote);
226
228}
static const char * get_account_id(struct ast_sip_endpoint *endpoint)
static void security_event_populate(pjsip_rx_data *rdata, char *call_id, size_t call_id_size, struct ast_sockaddr *local, struct ast_sockaddr *remote)
static enum ast_transport security_event_get_transport(pjsip_rx_data *rdata)
int ast_security_event_report(const struct ast_security_event_common *sec)
Report a security event.
@ AST_SECURITY_EVENT_CHAL_SENT
Challenge was sent out, informational.
#define AST_SECURITY_EVENT_CHAL_SENT_VERSION
Event descriptor version.
#define AST_SEC_EVT(e)
A challenge was sent out.
struct ast_security_event_common common
Common security event descriptor elements.
enum ast_security_event_type event_type
The security event sub-type.

References ast_copy_pj_str(), AST_SEC_EVT, AST_SECURITY_EVENT_CHAL_SENT, AST_SECURITY_EVENT_CHAL_SENT_VERSION, ast_security_event_report(), ast_security_event_chal_sent::common, ast_security_event_common::event_type, get_account_id(), NULL, security_event_get_transport(), and security_event_populate().

Referenced by authenticate().

◆ ast_sip_report_auth_failed_challenge_response()

void ast_sip_report_auth_failed_challenge_response ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata 
)

Send a security event notification for when a challenge response has failed.

Parameters
endpointPointer to the endpoint in use
rdataReceived message

Definition at line 130 of file res/res_pjsip/security_events.c.

131{
132 pjsip_authorization_hdr *auth = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_AUTHORIZATION, NULL);
133 enum ast_transport transport = security_event_get_transport(rdata);
134 char call_id[pj_strlen(&rdata->msg_info.cid->id) + 1];
135 char nonce[64] = "", response[256] = "";
136 struct ast_sockaddr local, remote;
137
138 struct ast_security_event_chal_resp_failed chal_resp_failed = {
141 .common.service = "PJSIP",
142 .common.account_id = get_account_id(endpoint),
143 .common.local_addr = {
144 .addr = &local,
145 .transport = transport,
146 },
147 .common.remote_addr = {
148 .addr = &remote,
149 .transport = transport,
150 },
151 .common.session_id = call_id,
152
153 .challenge = nonce,
154 .response = response,
155 .expected_response = "",
156 };
157
158 if (auth && !pj_strcmp2(&auth->scheme, "Digest")) {
159 ast_copy_pj_str(nonce, &auth->credential.digest.nonce, sizeof(nonce));
160 ast_copy_pj_str(response, &auth->credential.digest.response, sizeof(response));
161 }
162
163 security_event_populate(rdata, call_id, sizeof(call_id), &local, &remote);
164
165 ast_security_event_report(AST_SEC_EVT(&chal_resp_failed));
166}
#define AST_SECURITY_EVENT_CHAL_RESP_FAILED_VERSION
Event descriptor version.
@ AST_SECURITY_EVENT_CHAL_RESP_FAILED
An attempt at challenge/response authentication failed.
An attempt at challenge/response auth failed.
const char * response
Response received.
struct ast_security_event_common common
Common security event descriptor elements.

References ast_copy_pj_str(), AST_SEC_EVT, AST_SECURITY_EVENT_CHAL_RESP_FAILED, AST_SECURITY_EVENT_CHAL_RESP_FAILED_VERSION, ast_security_event_report(), ast_security_event_chal_resp_failed::common, ast_security_event_common::event_type, get_account_id(), NULL, ast_security_event_chal_resp_failed::response, security_event_get_transport(), and security_event_populate().

Referenced by authenticate().

◆ ast_sip_report_auth_success()

void ast_sip_report_auth_success ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata 
)

Send a security event notification for when authentication succeeds.

Parameters
endpointPointer to the endpoint in use
rdataReceived message

Definition at line 168 of file res/res_pjsip/security_events.c.

169{
170 pjsip_authorization_hdr *auth = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_AUTHORIZATION, NULL);
171 enum ast_transport transport = security_event_get_transport(rdata);
172 char call_id[pj_strlen(&rdata->msg_info.cid->id) + 1];
173 struct ast_sockaddr local, remote;
174
175 struct ast_security_event_successful_auth successful_auth = {
178 .common.service = "PJSIP",
179 .common.account_id = get_account_id(endpoint),
180 .common.local_addr = {
181 .addr = &local,
182 .transport = transport,
183 },
184 .common.remote_addr = {
185 .addr = &remote,
186 .transport = transport,
187 },
188 .common.session_id = call_id,
189 .using_password = auth ? 1 : 0,
190 };
191
192 security_event_populate(rdata, call_id, sizeof(call_id), &local, &remote);
193
194 ast_security_event_report(AST_SEC_EVT(&successful_auth));
195}
@ AST_SECURITY_EVENT_SUCCESSFUL_AUTH
FYI FWIW, Successful authentication has occurred.
#define AST_SECURITY_EVENT_SUCCESSFUL_AUTH_VERSION
Event descriptor version.
struct ast_security_event_common common
Common security event descriptor elements.

References AST_SEC_EVT, ast_security_event_report(), AST_SECURITY_EVENT_SUCCESSFUL_AUTH, AST_SECURITY_EVENT_SUCCESSFUL_AUTH_VERSION, ast_security_event_successful_auth::common, ast_security_event_common::event_type, get_account_id(), NULL, security_event_get_transport(), and security_event_populate().

Referenced by authenticate().

◆ ast_sip_report_failed_acl()

void ast_sip_report_failed_acl ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata,
const char *  name 
)

Send a security event notification for when an ACL check fails.

Parameters
endpointPointer to the endpoint in use
rdataReceived message
nameName of the ACL

Definition at line 102 of file res/res_pjsip/security_events.c.

103{
104 enum ast_transport transport = security_event_get_transport(rdata);
105 char call_id[pj_strlen(&rdata->msg_info.cid->id) + 1];
106 struct ast_sockaddr local, remote;
107
108 struct ast_security_event_failed_acl failed_acl_event = {
111 .common.service = "PJSIP",
112 .common.account_id = get_account_id(endpoint),
113 .common.local_addr = {
114 .addr = &local,
115 .transport = transport,
116 },
117 .common.remote_addr = {
118 .addr = &remote,
119 .transport = transport,
120 },
121 .common.session_id = call_id,
122 .acl_name = name,
123 };
124
125 security_event_populate(rdata, call_id, sizeof(call_id), &local, &remote);
126
127 ast_security_event_report(AST_SEC_EVT(&failed_acl_event));
128}
#define AST_SECURITY_EVENT_FAILED_ACL_VERSION
Event descriptor version.
@ AST_SECURITY_EVENT_FAILED_ACL
Failed ACL.
Checking against an IP access control list failed.
struct ast_security_event_common common
Common security event descriptor elements.

References AST_SEC_EVT, AST_SECURITY_EVENT_FAILED_ACL, AST_SECURITY_EVENT_FAILED_ACL_VERSION, ast_security_event_report(), ast_security_event_failed_acl::common, ast_security_event_common::event_type, get_account_id(), name, security_event_get_transport(), and security_event_populate().

Referenced by apply_endpoint_acl(), apply_endpoint_contact_acl(), register_aor_core(), and registrar_on_rx_request().

◆ ast_sip_report_invalid_endpoint()

void ast_sip_report_invalid_endpoint ( const char *  name,
pjsip_rx_data *  rdata 
)

Send a security event notification for when an invalid endpoint is requested.

Parameters
nameName of the endpoint requested
rdataReceived message

Definition at line 75 of file res/res_pjsip/security_events.c.

76{
77 enum ast_transport transport = security_event_get_transport(rdata);
78 char call_id[pj_strlen(&rdata->msg_info.cid->id) + 1];
79 struct ast_sockaddr local, remote;
80
81 struct ast_security_event_inval_acct_id inval_acct_id = {
84 .common.service = "PJSIP",
85 .common.account_id = name,
86 .common.local_addr = {
87 .addr = &local,
88 .transport = transport,
89 },
90 .common.remote_addr = {
91 .addr = &remote,
92 .transport = transport,
93 },
94 .common.session_id = call_id,
95 };
96
97 security_event_populate(rdata, call_id, sizeof(call_id), &local, &remote);
98
100}
#define AST_SECURITY_EVENT_INVAL_ACCT_ID_VERSION
Event descriptor version.
@ AST_SECURITY_EVENT_INVAL_ACCT_ID
Invalid Account ID.
Invalid account ID specified (invalid username, for example)
struct ast_security_event_common common
Common security event descriptor elements.

References AST_SEC_EVT, AST_SECURITY_EVENT_INVAL_ACCT_ID, AST_SECURITY_EVENT_INVAL_ACCT_ID_VERSION, ast_security_event_report(), ast_security_event_inval_acct_id::common, ast_security_event_common::event_type, name, security_event_get_transport(), and security_event_populate().

Referenced by check_endpoint(), and endpoint_lookup().

◆ ast_sip_report_mem_limit()

void ast_sip_report_mem_limit ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata 
)

Send a security event notification for when a memory limit is hit.

Parameters
endpointPointer to the endpoint in use
rdataReceived message

Definition at line 259 of file res/res_pjsip/security_events.c.

260{
261 enum ast_transport transport = security_event_get_transport(rdata);
262 char call_id[pj_strlen(&rdata->msg_info.cid->id) + 1];
263 struct ast_sockaddr local, remote;
264
265 struct ast_security_event_mem_limit mem_limit_event = {
267 .common.version = AST_SECURITY_EVENT_MEM_LIMIT_VERSION,
268 .common.service = "PJSIP",
269 .common.account_id = get_account_id(endpoint),
270 .common.local_addr = {
271 .addr = &local,
272 .transport = transport,
273 },
274 .common.remote_addr = {
275 .addr = &remote,
276 .transport = transport,
277 },
278 .common.session_id = call_id
279 };
280
281 security_event_populate(rdata, call_id, sizeof(call_id), &local, &remote);
282
283 ast_security_event_report(AST_SEC_EVT(&mem_limit_event));
284}
#define AST_SECURITY_EVENT_MEM_LIMIT_VERSION
Event descriptor version.
@ AST_SECURITY_EVENT_MEM_LIMIT
Memory limit reached.
Request denied because of a memory limit.
struct ast_security_event_common common
Common security event descriptor elements.

References AST_SEC_EVT, AST_SECURITY_EVENT_MEM_LIMIT, AST_SECURITY_EVENT_MEM_LIMIT_VERSION, ast_security_event_report(), ast_security_event_mem_limit::common, ast_security_event_common::event_type, get_account_id(), security_event_get_transport(), and security_event_populate().

◆ ast_sip_report_req_no_support()

void ast_sip_report_req_no_support ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata,
const char *  req_type 
)

Send a security event notification for when a request is not supported.

Parameters
endpointPointer to the endpoint in use
rdataReceived message
req_typethe type of request

Definition at line 230 of file res/res_pjsip/security_events.c.

232{
233 enum ast_transport transport = security_event_get_transport(rdata);
234 char call_id[pj_strlen(&rdata->msg_info.cid->id) + 1];
235 struct ast_sockaddr local, remote;
236
237 struct ast_security_event_req_no_support req_no_support_event = {
240 .common.service = "PJSIP",
241 .common.account_id = get_account_id(endpoint),
242 .common.local_addr = {
243 .addr = &local,
244 .transport = transport,
245 },
246 .common.remote_addr = {
247 .addr = &remote,
248 .transport = transport,
249 },
250 .common.session_id = call_id,
251 .request_type = req_type
252 };
253
254 security_event_populate(rdata, call_id, sizeof(call_id), &local, &remote);
255
256 ast_security_event_report(AST_SEC_EVT(&req_no_support_event));
257}
#define AST_SECURITY_EVENT_REQ_NO_SUPPORT_VERSION
Event descriptor version.
@ AST_SECURITY_EVENT_REQ_NO_SUPPORT
A request was made that we understand, but do not support.
Request denied because we don't support it.
struct ast_security_event_common common
Common security event descriptor elements.

References AST_SEC_EVT, ast_security_event_report(), AST_SECURITY_EVENT_REQ_NO_SUPPORT, AST_SECURITY_EVENT_REQ_NO_SUPPORT_VERSION, ast_security_event_req_no_support::common, ast_security_event_common::event_type, get_account_id(), security_event_get_transport(), and security_event_populate().

Referenced by find_registrar_aor(), and registrar_on_rx_request().

◆ ast_sip_requires_authentication()

int ast_sip_requires_authentication ( struct ast_sip_endpoint endpoint,
pjsip_rx_data *  rdata 
)

Determine if an incoming request requires authentication.

This calls into the registered authenticator's requires_authentication callback in order to determine if the request requires authentication.

If there is no registered authenticator, then authentication will be assumed not to be required.

Parameters
endpointThe endpoint from which the request originates
rdataThe incoming SIP request
Return values
non-zeroThe request requires authentication
0The request does not require authentication

Definition at line 163 of file res_pjsip.c.

164{
166 && !pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_options_method)) {
167 ast_debug(3, "Skipping OPTIONS authentication due to endpoint configuration\n");
168 return 0;
169 }
170
172 ast_log(LOG_WARNING, "No SIP authenticator registered. Assuming authentication is not required\n");
173 return 0;
174 }
175
176 return registered_authenticator->requires_authentication(endpoint, rdata);
177}

References ast_sip_endpoint::allow_unauthenticated_options, ast_debug, ast_log, LOG_WARNING, registered_authenticator, and ast_sip_authenticator::requires_authentication.

Referenced by authenticate().

◆ ast_sip_retrieve_auths()

int ast_sip_retrieve_auths ( const struct ast_sip_auth_vector auths,
struct ast_sip_auth **  out 
)

Retrieve relevant SIP auth structures from sorcery.

Parameters
authsVector of sorcery IDs of auth credentials to retrieve
[out]outThe retrieved auths are stored here

Definition at line 2527 of file pjsip_configuration.c.

2528{
2529 int i;
2530
2531 for (i = 0; i < AST_VECTOR_SIZE(auths); ++i) {
2532 /* Using AST_VECTOR_GET is safe since the vector is immutable */
2533 const char *name = AST_VECTOR_GET(auths, i);
2535 if (!out[i]) {
2536 ast_log(LOG_NOTICE, "Couldn't find auth '%s'. Cannot authenticate\n", name);
2537 return -1;
2538 }
2539 }
2540
2541 return 0;
2542}
#define LOG_NOTICE
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.

References ast_log, ast_sip_get_sorcery(), ast_sorcery_retrieve_by_id(), AST_VECTOR_GET, AST_VECTOR_SIZE, LOG_NOTICE, name, out, and SIP_SORCERY_AUTH_TYPE.

Referenced by digest_check_auth(), and set_outbound_initial_authentication_credentials().

◆ ast_sip_retrieve_auths_vector()

int ast_sip_retrieve_auths_vector ( const struct ast_sip_auth_vector auth_ids,
struct ast_sip_auth_objects_vector auth_objects 
)

Retrieve relevant SIP auth structures from sorcery as a vector.

Parameters
auth_idsVector of sorcery IDs of auth credentials to retrieve
[out]auth_objectsA pointer ast_sip_auth_objects_vector to hold the objects
Return values
0Success
-1Number of auth objects found is less than the number of names supplied.
Warning
The number of auth objects retrieved may be less than the number of auth ids supplied if auth objects couldn't be found for some of them.
Note
Since the ref count on all auth objects returned has been bumped, you must call ast_sip_cleanup_auth_objects_vector() to decrement the ref count on all of the auth objects in the vector, then call AST_VECTOR_FREE() on the vector itself.

Definition at line 2552 of file pjsip_configuration.c.

2554{
2555 int i;
2556
2557 for (i = 0; i < AST_VECTOR_SIZE(auth_ids); ++i) {
2558 /* Using AST_VECTOR_GET is safe since the vector is immutable */
2559 const char *name = AST_VECTOR_GET(auth_ids, i);
2561 if (!auth_object) {
2562 ast_log(LOG_WARNING, "Auth object '%s' could not be found\n", name);
2563 } else {
2564 AST_VECTOR_APPEND(auth_objects, auth_object);
2565 }
2566 }
2567
2568 return AST_VECTOR_SIZE(auth_objects) == AST_VECTOR_SIZE(auth_ids) ? 0 : -1;
2569}

References ast_log, ast_sip_get_sorcery(), ast_sorcery_retrieve_by_id(), AST_VECTOR_APPEND, AST_VECTOR_GET, AST_VECTOR_SIZE, LOG_WARNING, name, and SIP_SORCERY_AUTH_TYPE.

Referenced by digest_create_request_with_auth().

◆ ast_sip_rewrite_uri_to_local()

int ast_sip_rewrite_uri_to_local ( pjsip_sip_uri *  uri,
pjsip_tx_data *  tdata 
)

Replace domain and port of SIP URI to point to (external) signaling address of this Asterisk instance.

Parameters
uri
tdata
Return values
0success
-1failure
Note
Uses domain and port in Contact header if it exists, otherwise the local URI of the dialog is used if the message is sent within the context of a dialog. Further, NAT settings are considered - i.e. if the target is not in the localnet, the external_signaling_address and port are used.

Definition at line 605 of file res_pjsip.c.

605 {
606 RAII_VAR(struct ast_sip_transport *, transport, NULL, ao2_cleanup);
607 RAII_VAR(struct ast_sip_transport_state *, transport_state, NULL, ao2_cleanup);
608 struct ast_sip_request_transport_details details = { 0, };
609 pjsip_sip_uri *tmp_uri;
610 pjsip_dialog *dlg;
611 struct ast_sockaddr addr = { { 0, } };
612
613 if ((tmp_uri = ast_sip_get_contact_sip_uri(tdata))) {
614 pj_strdup(tdata->pool, &uri->host, &tmp_uri->host);
615 uri->port = tmp_uri->port;
616 } else if ((dlg = pjsip_tdata_get_dlg(tdata))
617 && (tmp_uri = pjsip_uri_get_uri(dlg->local.info->uri))
618 && (PJSIP_URI_SCHEME_IS_SIP(tmp_uri) || PJSIP_URI_SCHEME_IS_SIPS(tmp_uri))) {
619 pj_strdup(tdata->pool, &uri->host, &tmp_uri->host);
620 uri->port = tmp_uri->port;
621 }
622
623 if (ast_sip_set_request_transport_details(&details, tdata, 1)
624 || !(transport_state = ast_sip_find_transport_state_in_use(&details))
625 || !(transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_state->id))) {
626 return 0;
627 }
628
629 if (transport_state->localnet) {
630 ast_sockaddr_parse(&addr, tdata->tp_info.dst_name, PARSE_PORT_FORBID);
631 ast_sockaddr_set_port(&addr, tdata->tp_info.dst_port);
632 if (ast_sip_transport_is_local(transport_state, &addr)) {
633 return 0;
634 }
635 }
636
637 if (!ast_sockaddr_isnull(&transport_state->external_signaling_address)) {
638 pj_strdup2(tdata->pool, &uri->host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address));
639 }
640
641 if (transport->external_signaling_port) {
642 uri->port = transport->external_signaling_port;
643 }
644
645 return 0;
646}
static char * ast_sockaddr_stringify_host(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brack...
Definition netsock2.h:327
static int ast_sockaddr_isnull(const struct ast_sockaddr *addr)
Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized,...
Definition netsock2.h:127
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
Definition netsock2.h:532
struct ast_sip_transport_state * ast_sip_find_transport_state_in_use(struct ast_sip_request_transport_details *details)
Returns the transport state currently in use based on request transport details.
Definition res_pjsip.c:595
int ast_sip_set_request_transport_details(struct ast_sip_request_transport_details *details, pjsip_tx_data *tdata, int use_ipv6)
Sets request transport details based on tdata.
Definition res_pjsip.c:648
pjsip_sip_uri * ast_sip_get_contact_sip_uri(pjsip_tx_data *tdata)
Return the SIP URI of the Contact header.
Definition res_pjsip.c:564
#define ast_sip_transport_is_local(transport_state, addr)
Definition res_pjsip.h:213

References ao2_cleanup, ast_sip_find_transport_state_in_use(), ast_sip_get_contact_sip_uri(), ast_sip_get_sorcery(), ast_sip_set_request_transport_details(), ast_sip_transport_is_local, ast_sockaddr_isnull(), ast_sockaddr_parse(), ast_sockaddr_set_port, ast_sockaddr_stringify_host(), ast_sorcery_retrieve_by_id(), NULL, PARSE_PORT_FORBID, RAII_VAR, and ast_sip_transport_state::transport.

Referenced by refer_on_tx_request().

◆ ast_sip_security_mechanism_vector_init()

int ast_sip_security_mechanism_vector_init ( struct ast_sip_security_mechanism_vector security_mechanism,
const char *  value 
)

Initialize security mechanism vector from string of security mechanisms.

Parameters
security_mechanismPointer to vector of security mechanisms to initialize.
valueString of security mechanisms as defined in RFC 3329.
Return values
0Success
non-zeroFailure

Definition at line 360 of file security_agreements.c.

361{
362 char *val = value ? ast_strdupa(value) : NULL;
363 struct ast_sip_security_mechanism *mech;
364 char *mechanism;
365
367 if (AST_VECTOR_INIT(security_mechanisms, 1)) {
368 return -1;
369 }
370
371 if (!val) {
372 return 0;
373 }
374
375 while ((mechanism = ast_strsep(&val, ',', AST_STRSEP_ALL))) {
376 if (!ast_sip_str_to_security_mechanism(&mech, mechanism)) {
377 AST_VECTOR_APPEND(security_mechanisms, mech);
378 }
379 }
380
381 return 0;
382}
void ast_sip_security_mechanisms_vector_destroy(struct ast_sip_security_mechanism_vector *security_mechanisms)
Free contents of a security mechanism vector.

References ast_sip_security_mechanisms_vector_destroy(), ast_sip_str_to_security_mechanism(), ast_strdupa, ast_strsep(), AST_STRSEP_ALL, AST_VECTOR_APPEND, AST_VECTOR_INIT, NULL, and value.

Referenced by security_mechanism_handler(), and security_mechanisms_handler().

◆ ast_sip_security_mechanisms_to_str()

int ast_sip_security_mechanisms_to_str ( const struct ast_sip_security_mechanism_vector security_mechanisms,
int  add_qvalue,
char **  buf 
)

Writes the security mechanisms of an endpoint into a buffer as a string and returns the buffer.

Note
The buffer must be freed by the caller.
Parameters
endpointPointer to endpoint.
add_qvalueIf non-zero, the q-value is printed as well
bufThe buffer to write the string into
Return values
0Success
non-zeroFailure

Definition at line 162 of file security_agreements.c.

163{
164 size_t vec_size;
165 struct ast_sip_security_mechanism *mech;
166 char *tmp_buf;
168 size_t i;
169 int rc = 0;
170
171 if (str == NULL) {
172 return ENOMEM;
173 }
174
175 if (!security_mechanisms) {
176 return -1;
177 }
178
179 vec_size = AST_VECTOR_SIZE(security_mechanisms);
180 if (vec_size == 0) {
181 return -1;
182 }
183
184 for (i = 0; i < vec_size; ++i) {
185 mech = AST_VECTOR_GET(security_mechanisms, i);
186 rc = security_mechanism_to_str(mech, add_qvalue, &tmp_buf);
187 if (rc) {
188 return rc;
189 }
190 rc = ast_str_append(&str, 0, "%s, ", tmp_buf);
191 ast_free(tmp_buf);
192 if (rc <= 0) {
193 return ENOMEM;
194 }
195 }
196
197 /* ast_str_truncate removes the trailing ", " on the last mechanism */
199
200 return 0;
201}
char * ast_str_truncate(struct ast_str *buf, ssize_t len)
Truncates the enclosed string to the given length.
Definition strings.h:786

References ast_free, ast_str_append(), ast_str_create, ast_str_truncate(), ast_strdup, AST_VECTOR_GET, AST_VECTOR_SIZE, buf, MAX_OBJECT_FIELD, NULL, RAII_VAR, security_mechanism_to_str(), and str.

Referenced by security_mechanism_to_str(), and security_mechanism_to_str().

◆ ast_sip_security_mechanisms_vector_copy()

void ast_sip_security_mechanisms_vector_copy ( struct ast_sip_security_mechanism_vector dst,
const struct ast_sip_security_mechanism_vector src 
)

Duplicate a security mechanism.

Parameters
dstSecurity mechanism to duplicate to.
srcSecurity mechanism to duplicate.

Definition at line 81 of file security_agreements.c.

83{
84 struct ast_sip_security_mechanism *mech;
85 int i;
86
88 for (i = 0; i < AST_VECTOR_SIZE(src); i++) {
89 mech = AST_VECTOR_GET(src, i);
91 }
92};
static struct ast_sip_security_mechanism * security_mechanisms_copy(const struct ast_sip_security_mechanism *src)

References ast_sip_security_mechanisms_vector_destroy(), AST_VECTOR_APPEND, AST_VECTOR_GET, AST_VECTOR_SIZE, and security_mechanisms_copy().

Referenced by sip_contact_status_copy(), and sip_outbound_registration_perform().

◆ ast_sip_security_mechanisms_vector_destroy()

void ast_sip_security_mechanisms_vector_destroy ( struct ast_sip_security_mechanism_vector security_mechanisms)

Free contents of a security mechanism vector.

Parameters
security_mechanismsVector whose contents are to be freed

Definition at line 94 of file security_agreements.c.

95{
96 if (!security_mechanisms) {
97 return;
98 }
99
100 AST_VECTOR_RESET(security_mechanisms, security_mechanism_destroy);
101 AST_VECTOR_FREE(security_mechanisms);
102}
static void security_mechanism_destroy(struct ast_sip_security_mechanism *mech)
#define AST_VECTOR_RESET(vec, cleanup)
Reset vector.
Definition vector.h:636

References AST_VECTOR_FREE, AST_VECTOR_RESET, and security_mechanism_destroy().

Referenced by ast_sip_security_mechanism_vector_init(), ast_sip_security_mechanisms_vector_copy(), endpoint_destructor(), handle_client_state_destruction(), sip_contact_status_dtor(), sip_outbound_registration_destroy(), and sip_outbound_registration_perform().

◆ ast_sip_send_out_of_dialog_request()

int ast_sip_send_out_of_dialog_request ( pjsip_tx_data *  tdata,
struct ast_sip_endpoint endpoint,
int  timeout,
void *  token,
void(*)(void *token, pjsip_event *e)  callback 
)

General purpose method for sending an Out-Of-Dialog SIP request.

This is a companion function for ast_sip_create_request. The request created there can be passed to this function, though any request may be passed in.

This will automatically set up handling outbound authentication challenges if they arrive.

Parameters
tdataThe request to send
endpointOptional. If specified, the out-of-dialog request is sent to the endpoint.
timeoutIf non-zero, after the timeout the transaction will be terminated and the callback will be called with the PJSIP_EVENT_TIMER type.
tokenData to be passed to the callback upon receipt of out-of-dialog response.
callbackCallback to be called upon receipt of out-of-dialog response.
Return values
0Success
-1Failure (out-of-dialog callback will not be called.)
Note
Timeout processing: There are 2 timers associated with this request, PJSIP timer_b which is set globally in the "system" section of pjsip.conf, and the timeout specified on this call. The timer that expires first (before normal completion) will cause the callback to be run with e->body.tsx_state.type = PJSIP_EVENT_TIMER. The timer that expires second is simply ignored and the callback is not run again.

Definition at line 1938 of file res_pjsip.c.

1941{
1942 struct ast_sip_supplement *supplement;
1943 struct send_request_data *req_data;
1944 struct ast_sip_contact *contact;
1945
1946 req_data = send_request_data_alloc(endpoint, token, callback);
1947 if (!req_data) {
1948 pjsip_tx_data_dec_ref(tdata);
1949 return -1;
1950 }
1951
1952 if (endpoint) {
1954 }
1955
1956 contact = ast_sip_mod_data_get(tdata->mod_data, supplement_module.id, MOD_DATA_CONTACT);
1957
1959 AST_LIST_TRAVERSE(&supplements, supplement, next) {
1960 if (supplement->outgoing_request
1961 && does_method_match(&tdata->msg->line.req.method.name, supplement->method)) {
1962 supplement->outgoing_request(endpoint, contact, tdata);
1963 }
1964 }
1966
1967 ast_sip_mod_data_set(tdata->pool, tdata->mod_data, supplement_module.id, MOD_DATA_CONTACT, NULL);
1968 ao2_cleanup(contact);
1969
1970 if (endpt_send_request(endpoint, tdata, timeout, req_data, send_request_cb)
1971 != PJ_SUCCESS) {
1972 ao2_cleanup(req_data);
1973 return -1;
1974 }
1975
1976 return 0;
1977}
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
static struct send_request_data * send_request_data_alloc(struct ast_sip_endpoint *endpoint, void *token, void(*callback)(void *token, pjsip_event *e))
Definition res_pjsip.c:1534
static void send_request_cb(void *token, pjsip_event *e)
Definition res_pjsip.c:1882
static pj_status_t endpt_send_request(struct ast_sip_endpoint *endpoint, pjsip_tx_data *tdata, pj_int32_t timeout, void *token, pjsip_endpt_send_callback cb)
Definition res_pjsip.c:1696
static pj_bool_t does_method_match(const pj_str_t *message_method, const char *supplement_method)
Definition res_pjsip.c:1499
#define ast_sip_mod_data_get(mod_data, id, key)
Using the dictionary stored in mod_data array at a given id, retrieve the value associated with the g...
Definition res_pjsip.h:3067
Structure to hold information about an outbound request.
Definition res_pjsip.c:1516

References ao2_cleanup, AST_LIST_TRAVERSE, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK, ast_sip_message_apply_transport(), ast_sip_mod_data_get, ast_sip_mod_data_set, callback(), does_method_match(), ast_sip_contact::endpoint, endpt_send_request(), ast_sip_supplement::method, MOD_DATA_CONTACT, NULL, ast_sip_supplement::outgoing_request, send_request_cb(), send_request_data_alloc(), supplement_module, and ast_sip_endpoint::transport.

Referenced by ast_sip_send_request(), and sip_options_qualify_contact().

◆ ast_sip_send_request()

int ast_sip_send_request ( pjsip_tx_data *  tdata,
struct pjsip_dialog *  dlg,
struct ast_sip_endpoint endpoint,
void *  token,
void(*)(void *token, pjsip_event *e)  callback 
)

General purpose method for sending a SIP request.

This is a companion function for ast_sip_create_request. The request created there can be passed to this function, though any request may be passed in.

This will automatically set up handling outbound authentication challenges if they arrive.

Parameters
tdataThe request to send
dlgOptional. The dialog in which the request is sent. Otherwise it is out-of-dialog.
endpointOptional. If specified, the out-of-dialog request is sent to the endpoint.
tokenData to be passed to the callback upon receipt of out-of-dialog response.
callbackCallback to be called upon receipt of out-of-dialog response.
Return values
0Success
-1Failure (out-of-dialog callback will not be called.)

Definition at line 1979 of file res_pjsip.c.

1982{
1983 ast_assert(tdata->msg->type == PJSIP_REQUEST_MSG);
1984
1985 if (dlg) {
1986 return send_in_dialog_request(tdata, dlg);
1987 } else {
1988 return ast_sip_send_out_of_dialog_request(tdata, endpoint, -1, token, callback);
1989 }
1990}
static int send_in_dialog_request(pjsip_tx_data *tdata, struct pjsip_dialog *dlg)
Definition res_pjsip.c:1490
int ast_sip_send_out_of_dialog_request(pjsip_tx_data *tdata, struct ast_sip_endpoint *endpoint, int timeout, void *token, void(*callback)(void *token, pjsip_event *e))
General purpose method for sending an Out-Of-Dialog SIP request.
Definition res_pjsip.c:1938

References ast_assert, ast_sip_send_out_of_dialog_request(), callback(), ast_sip_contact::endpoint, and send_in_dialog_request().

Referenced by msg_send(), notify_channel(), notify_contact(), notify_uri(), refer_client_on_evsub_state(), send_unsolicited_mwi_notify_to_contact(), and sendtext().

◆ ast_sip_send_response()

int ast_sip_send_response ( pjsip_response_addr *  res_addr,
pjsip_tx_data *  tdata,
struct ast_sip_endpoint sip_endpoint 
)

Send a response to an out of dialog request.

Use this function sparingly, since this does not create a transaction within PJSIP. This means that if the request is retransmitted, it is your responsibility to detect this and not process the same request twice, and to send the same response for each retransmission.

Parameters
res_addrThe response address for this response
tdataThe response to send
sip_endpointThe ast_sip_endpoint associated with this response
Return values
0Success
-1Failure

Definition at line 2396 of file res_pjsip.c.

2397{
2398 pj_status_t status;
2399
2400 supplement_outgoing_response(tdata, sip_endpoint);
2401 status = pjsip_endpt_send_response(ast_sip_get_pjsip_endpoint(), res_addr, tdata, NULL, NULL);
2402 if (status != PJ_SUCCESS) {
2403 pjsip_tx_data_dec_ref(tdata);
2404 }
2405
2406 return status == PJ_SUCCESS ? 0 : -1;
2407}
static void supplement_outgoing_response(pjsip_tx_data *tdata, struct ast_sip_endpoint *sip_endpoint)
Definition res_pjsip.c:2374

References ast_sip_get_pjsip_endpoint(), NULL, status, and supplement_outgoing_response().

◆ ast_sip_send_stateful_response()

int ast_sip_send_stateful_response ( pjsip_rx_data *  rdata,
pjsip_tx_data *  tdata,
struct ast_sip_endpoint sip_endpoint 
)

Send a stateful response to an out of dialog request.

This creates a transaction within PJSIP, meaning that if the request that we are responding to is retransmitted, we will not attempt to re-handle the request.

Parameters
rdataThe request that is being responded to
tdataThe response to send
sip_endpointThe ast_sip_endpoint associated with this response
Since
13.4.0
Return values
0Success
-1Failure

Definition at line 2424 of file res_pjsip.c.

2425{
2426 pjsip_transaction *tsx;
2427 pj_grp_lock_t *tsx_glock;
2428 pj_pool_t *pool;
2429
2430 /* Create and initialize global lock pool */
2431 pool = pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(), "stateful response", PJSIP_POOL_TSX_LEN, PJSIP_POOL_TSX_INC);
2432 if (!pool){
2433 /* ast_sip_create_response bumps the refcount of the contact and adds it to the tdata.
2434 * We'll leak that reference if we don't get rid of it here.
2435 */
2437 return -1;
2438 }
2439 /* Create with handler so that we can release the pool once the glock derefs out */
2440 if(pj_grp_lock_create_w_handler(pool, NULL, pool, &pool_destroy_callback, &tsx_glock) != PJ_SUCCESS) {
2442 pool_destroy_callback((void *) pool);
2443 return -1;
2444 }
2445 /* We need an additional reference as the qualify thread may destroy this out
2446 * from under us. Add it now before it gets added to the tsx. */
2447 pj_grp_lock_add_ref(tsx_glock);
2448
2449 if (pjsip_tsx_create_uas2(NULL, rdata, tsx_glock, &tsx) != PJ_SUCCESS) {
2451 pj_grp_lock_dec_ref(tsx_glock);
2452 return -1;
2453 }
2454
2455 pjsip_tsx_recv_msg(tsx, rdata);
2456 supplement_outgoing_response(tdata, sip_endpoint);
2457
2458 if (pjsip_tsx_send_msg(tsx, tdata) != PJ_SUCCESS) {
2459 pj_grp_lock_dec_ref(tsx_glock);
2460 pjsip_tx_data_dec_ref(tdata);
2461 return -1;
2462 }
2463
2464 pj_grp_lock_dec_ref(tsx_glock);
2465 return 0;
2466}
static void clean_contact_from_tdata(pjsip_tx_data *tdata)
Definition res_pjsip.c:2415
static void pool_destroy_callback(void *arg)
Definition res_pjsip.c:2409

References ast_sip_get_pjsip_endpoint(), clean_contact_from_tdata(), NULL, pool_destroy_callback(), and supplement_outgoing_response().

Referenced by register_aor(), send_options_response(), and send_response().

◆ ast_sip_service_route_vector_alloc()

struct ast_sip_service_route_vector * ast_sip_service_route_vector_alloc ( void  )

Allocate a vector of service routes.

Since
17.0.0
Return values
non-NULLsuccess
NULLfailure

Definition at line 352 of file config_transport.c.

353{
354 struct ast_sip_service_route_vector *service_routes;
355
356 service_routes = ast_calloc(1, sizeof(*service_routes));
357 if (!service_routes) {
358 return NULL;
359 }
360
361 AST_VECTOR_INIT(service_routes, 0);
362
363 return service_routes;
364}

References ast_calloc, AST_VECTOR_INIT, and NULL.

Referenced by save_response_fields_to_transport().

◆ ast_sip_service_route_vector_destroy()

void ast_sip_service_route_vector_destroy ( struct ast_sip_service_route_vector service_routes)

Destroy a vector of service routes.

Since
17.0.0
Parameters
service_routesA vector of service routes

Definition at line 366 of file config_transport.c.

367{
368 if (!service_routes) {
369 return;
370 }
371
372 AST_VECTOR_CALLBACK_VOID(service_routes, ast_free);
373 ast_free(service_routes);
374}
#define AST_VECTOR_CALLBACK_VOID(vec, callback,...)
Execute a callback on every element in a vector disregarding callback return.
Definition vector.h:873

References ast_free, and AST_VECTOR_CALLBACK_VOID.

Referenced by ast_sip_transport_state_set_service_routes(), and save_response_fields_to_transport().

◆ ast_sip_set_id_connected_line()

int ast_sip_set_id_connected_line ( struct pjsip_rx_data *  rdata,
struct ast_party_id id 
)

Set the ID for a connected line update.

Return values
-1on failure, 0 on success

Definition at line 2822 of file res_pjsip.c.

2823{
2824 return !set_id_from_pai(rdata, id) || !set_id_from_rpid(rdata, id) ? 0 : -1;
2825}
static int set_id_from_pai(pjsip_rx_data *rdata, struct ast_party_id *id)
Definition res_pjsip.c:2710
static int set_id_from_rpid(pjsip_rx_data *rdata, struct ast_party_id *id)
Definition res_pjsip.c:2751

References set_id_from_pai(), and set_id_from_rpid().

Referenced by update_incoming_connected_line().

◆ ast_sip_set_id_from_invite()

int ast_sip_set_id_from_invite ( struct pjsip_rx_data *  rdata,
struct ast_party_id id,
struct ast_party_id default_id,
int  trust_inbound 
)

Set the ID from an INVITE.

Parameters
rdata
idID structure to fill
default_idDefault ID structure with data to use (for non-trusted endpoints)
trust_inboundWhether or not the endpoint is trusted (controls whether PAI or RPID can be used)
Return values
-1on failure, 0 on success

Definition at line 2827 of file res_pjsip.c.

2828{
2829 if (trust_inbound && (!set_id_from_pai(rdata, id) || !set_id_from_rpid(rdata, id))) {
2830 /* Trusted: Check PAI and RPID */
2831 ast_free(id->tag);
2832 id->tag = ast_strdup(default_id->tag);
2833 return 0;
2834 }
2835 /* Not trusted: check the endpoint config or use From. */
2836 ast_party_id_copy(id, default_id);
2837 if (!default_id->number.valid) {
2838 set_id_from_from(rdata, id);
2839 }
2840 return 0;
2841}
void ast_party_id_copy(struct ast_party_id *dest, const struct ast_party_id *src)
Copy the source party id information to the destination party id.
Definition channel.c:1733
static int set_id_from_from(struct pjsip_rx_data *rdata, struct ast_party_id *id)
Definition res_pjsip.c:2803
struct ast_party_number number
Subscriber phone number.
Definition channel.h:344
unsigned char valid
TRUE if the number information is valid/present.
Definition channel.h:299

References ast_free, ast_party_id_copy(), ast_strdup, id, ast_party_id::number, set_id_from_from(), set_id_from_pai(), set_id_from_rpid(), ast_party_id::tag, and ast_party_number::valid.

Referenced by caller_id_incoming_request(), and fetch_callerid_num().

◆ ast_sip_set_outbound_proxy()

int ast_sip_set_outbound_proxy ( pjsip_tx_data *  tdata,
const char *  proxy 
)

Set the outbound proxy for an outbound SIP message.

Parameters
tdataThe message to set the outbound proxy on
proxySIP uri of the proxy
Return values
0Success
-1Failure

Definition at line 1992 of file res_pjsip.c.

1993{
1994 pjsip_route_hdr *route;
1995 static const pj_str_t ROUTE_HNAME = { "Route", 5 };
1996 pj_str_t tmp;
1997
1998 pj_strdup2_with_null(tdata->pool, &tmp, proxy);
1999 if (!(route = pjsip_parse_hdr(tdata->pool, &ROUTE_HNAME, tmp.ptr, tmp.slen, NULL))) {
2000 return -1;
2001 }
2002
2003 pj_list_insert_nodes_before(&tdata->msg->hdr, (pjsip_hdr*)route);
2004
2005 return 0;
2006}

References NULL.

Referenced by create_out_of_dialog_request(), path_outgoing_request(), and sip_options_qualify_contact().

◆ ast_sip_set_request_transport_details()

int ast_sip_set_request_transport_details ( struct ast_sip_request_transport_details details,
pjsip_tx_data *  tdata,
int  use_ipv6 
)

Sets request transport details based on tdata.

Parameters
detailspre-allocated request transport details to set
tdata
use_ipv6if non-zero, ipv6 transports will be considered
Return values
0success
-1failure

Definition at line 648 of file res_pjsip.c.

649 {
650 pjsip_sip_uri *uri;
651 pjsip_via_hdr *via;
652 long transport_type;
653
654 if (!details || !tdata) {
655 return -1;
656 }
657
658 /* If IPv6 should be considered, un-set Bit 7 to make TCP6 equal to TCP and TLS6 equal to TLS */
659 transport_type = use_ipv6 ? tdata->tp_info.transport->key.type & ~(PJSIP_TRANSPORT_IPV6)
660 : tdata->tp_info.transport->key.type;
661
662 if (tdata->tp_sel.type == PJSIP_TPSELECTOR_TRANSPORT) {
663 details->transport = tdata->tp_sel.u.transport;
664 } else if (tdata->tp_sel.type == PJSIP_TPSELECTOR_LISTENER) {
665 details->factory = tdata->tp_sel.u.listener;
666 } else if (transport_type == PJSIP_TRANSPORT_UDP || transport_type == PJSIP_TRANSPORT_UDP6) {
667 /* Connectionless uses the same transport for all requests */
668 details->type = AST_TRANSPORT_UDP;
669 details->transport = tdata->tp_info.transport;
670 } else {
671 if (transport_type == PJSIP_TRANSPORT_TCP) {
672 details->type = AST_TRANSPORT_TCP;
673 } else if (transport_type == PJSIP_TRANSPORT_TLS) {
674 details->type = AST_TRANSPORT_TLS;
675 } else {
676 /* Unknown transport type, we can't map. */
677 return -1;
678 }
679
680 if ((uri = ast_sip_get_contact_sip_uri(tdata))) {
681 details->local_address = uri->host;
682 details->local_port = uri->port;
683 } else if ((tdata->msg->type == PJSIP_REQUEST_MSG) &&
684 (via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL))) {
685 details->local_address = via->sent_by.host;
686 details->local_port = via->sent_by.port;
687 } else {
688 return -1;
689 }
690
691 if (!details->local_port) {
692 details->local_port = (details->type == AST_TRANSPORT_TLS) ? 5061 : 5060;
693 }
694 }
695 return 0;
696}
@ AST_TRANSPORT_UDP
Definition netsock2.h:60
@ AST_TRANSPORT_TLS
Definition netsock2.h:62
@ AST_TRANSPORT_TCP
Definition netsock2.h:61

References ast_sip_get_contact_sip_uri(), AST_TRANSPORT_TCP, AST_TRANSPORT_TLS, AST_TRANSPORT_UDP, ast_sip_request_transport_details::factory, ast_sip_request_transport_details::local_address, ast_sip_request_transport_details::local_port, NULL, ast_sip_request_transport_details::transport, and ast_sip_request_transport_details::type.

Referenced by ast_sip_rewrite_uri_to_local(), and process_nat().

◆ ast_sip_set_security_negotiation()

int ast_sip_set_security_negotiation ( enum ast_sip_security_negotiation security_negotiation,
const char *  val 
)

Set the security negotiation based on a given string.

Parameters
security_negotiationSecurity negotiation enum to set.
valString that represents a security_negotiation value.
Return values
0Success
non-zeroFailure

Definition at line 288 of file pjsip_configuration.c.

288 {
289 if (!strcasecmp("no", val)) {
290 *security_negotiation = AST_SIP_SECURITY_NEG_NONE;
291 } else if (!strcasecmp("mediasec", val)) {
292 *security_negotiation = AST_SIP_SECURITY_NEG_MEDIASEC;
293 } else {
294 return -1;
295 }
296 return 0;
297}

References AST_SIP_SECURITY_NEG_MEDIASEC, AST_SIP_SECURITY_NEG_NONE, and ast_sip_endpoint::security_negotiation.

Referenced by security_negotiation_handler(), and security_negotiation_handler().

◆ ast_sip_set_tpselector_from_ep_or_uri()

int ast_sip_set_tpselector_from_ep_or_uri ( const struct ast_sip_endpoint endpoint,
pjsip_sip_uri *  sip_uri,
pjsip_tpselector *  selector 
)

Sets pjsip_tpselector from an endpoint or uri.

Since
13.15.0
Parameters
endpointIf endpoint->transport is set, it's used
sip_uriIf sip_uri contains a x-ast-txp parameter, it's used
selectorThe selector to be populated
Return values
0success
-1failure

Definition at line 911 of file res_pjsip.c.

913{
914 char transport_name[128];
915
916 if (ast_sip_get_transport_name(endpoint, sip_uri, transport_name, sizeof(transport_name))) {
917 return 0;
918 }
919
920 return ast_sip_set_tpselector_from_transport_name(transport_name, selector);
921}
int ast_sip_get_transport_name(const struct ast_sip_endpoint *endpoint, pjsip_sip_uri *sip_uri, char *buf, size_t buf_len)
Get the transport name from an endpoint or request uri.
Definition res_pjsip.c:698
int ast_sip_set_tpselector_from_transport_name(const char *transport_name, pjsip_tpselector *selector)
Sets pjsip_tpselector from ast_sip_transport.
Definition res_pjsip.c:893

References ast_sip_get_transport_name(), and ast_sip_set_tpselector_from_transport_name().

Referenced by ast_sip_dlg_set_transport(), create_dialog_uas(), and create_out_of_dialog_request().

◆ ast_sip_set_tpselector_from_transport()

int ast_sip_set_tpselector_from_transport ( const struct ast_sip_transport transport,
pjsip_tpselector *  selector 
)

Sets pjsip_tpselector from ast_sip_transport.

Since
13.8.0
Parameters
transportThe transport to be used
selectorThe selector to be populated
Return values
0success
-1failure
Note
The transport selector must be unreffed using ast_sip_tpselector_unref

Definition at line 843 of file res_pjsip.c.

844{
845 int res = 0;
846 struct ast_sip_transport_state *transport_state;
847
849 if (!transport_state) {
850 ast_log(LOG_ERROR, "Unable to retrieve PJSIP transport state for '%s'\n",
852 return -1;
853 }
854
855 /* Only flows maintain dynamic state which needs protection */
856 if (transport_state->flow) {
857 ao2_lock(transport_state);
858 }
859
860 if (transport_state->transport) {
861 selector->type = PJSIP_TPSELECTOR_TRANSPORT;
862 selector->u.transport = transport_state->transport;
863 pjsip_transport_add_ref(selector->u.transport);
864 } else if (transport_state->factory) {
865 selector->type = PJSIP_TPSELECTOR_LISTENER;
866 selector->u.listener = transport_state->factory;
867 } else if (transport->type == AST_TRANSPORT_WS || transport->type == AST_TRANSPORT_WSS) {
868 /* The WebSocket transport has no factory as it can not create outgoing connections, so
869 * even if an endpoint is locked to a WebSocket transport we let the PJSIP logic
870 * find the existing connection if available and use it.
871 */
872 } else if (transport->flow) {
873 /* This is a child of another transport, so we need to establish a new connection */
874#ifdef HAVE_PJSIP_TRANSPORT_DISABLE_CONNECTION_REUSE
875 selector->disable_connection_reuse = PJ_TRUE;
876#else
877 ast_log(LOG_WARNING, "Connection reuse could not be disabled on transport '%s' as support is not available\n",
879#endif
880 } else {
881 res = -1;
882 }
883
884 if (transport_state->flow) {
885 ao2_unlock(transport_state);
886 }
887
888 ao2_ref(transport_state, -1);
889
890 return res;
891}
@ AST_TRANSPORT_WSS
Definition netsock2.h:64
@ AST_TRANSPORT_WS
Definition netsock2.h:63

References ao2_lock, ao2_ref, ao2_unlock, ast_log, ast_sip_get_transport_state(), ast_sorcery_object_get_id(), AST_TRANSPORT_WS, AST_TRANSPORT_WSS, ast_sip_transport_state::factory, ast_sip_transport_state::flow, LOG_ERROR, LOG_WARNING, and ast_sip_transport_state::transport.

Referenced by ast_sip_set_tpselector_from_transport_name().

◆ ast_sip_set_tpselector_from_transport_name()

int ast_sip_set_tpselector_from_transport_name ( const char *  transport_name,
pjsip_tpselector *  selector 
)

Sets pjsip_tpselector from ast_sip_transport.

Since
13.8.0
Parameters
transport_nameThe name of the transport to be used
selectorThe selector to be populated
Return values
0success
-1failure
Note
The transport selector must be unreffed using ast_sip_tpselector_unref

Definition at line 893 of file res_pjsip.c.

894{
895 RAII_VAR(struct ast_sip_transport *, transport, NULL, ao2_cleanup);
896
897 if (ast_strlen_zero(transport_name)) {
898 return 0;
899 }
900
901 transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_name);
902 if (!transport) {
903 ast_log(LOG_ERROR, "Unable to retrieve PJSIP transport '%s'\n",
904 transport_name);
905 return -1;
906 }
907
908 return ast_sip_set_tpselector_from_transport(transport, selector);
909}
int ast_sip_set_tpselector_from_transport(const struct ast_sip_transport *transport, pjsip_tpselector *selector)
Sets pjsip_tpselector from ast_sip_transport.
Definition res_pjsip.c:843

References ao2_cleanup, ast_log, ast_sip_get_sorcery(), ast_sip_set_tpselector_from_transport(), ast_sorcery_retrieve_by_id(), ast_strlen_zero(), LOG_ERROR, NULL, RAII_VAR, and ast_sip_transport_state::transport.

Referenced by ast_sip_set_tpselector_from_ep_or_uri(), registration_client_send(), set_transport(), and sip_outbound_registration_regc_alloc().

◆ ast_sip_sorcery_object_to_ami()

int ast_sip_sorcery_object_to_ami ( const void *  obj,
struct ast_str **  buf 
)

Converts a sorcery object to a string of object properties.

Parameters
objthe sorcery object to convert
bufthe string buffer to write the object data
Return values
0Success, non-zero on failure

Definition at line 1751 of file pjsip_configuration.c.

1752{
1755 struct ast_variable *i;
1756
1757 if (!objset) {
1758 return -1;
1759 }
1760
1762
1763 for (i = objset; i; i = i->next) {
1764 RAII_VAR(char *, camel, ast_to_camel_case(i->name), ast_free);
1765 ast_str_append(buf, 0, "%s: %s\r\n", camel, i->value);
1766 }
1767
1768 return 0;
1769}
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition extconf.c:1260
static void sip_sorcery_object_ami_set_type_name(const void *obj, struct ast_str **buf)
@ AST_HANDLER_ONLY_STRING
Use string handler only.
Definition sorcery.h:137
struct ast_variable * ast_sorcery_objectset_create2(const struct ast_sorcery *sorcery, const void *object, enum ast_sorcery_field_handler_flags flags)
Create an object set (KVP list) for an object.
Definition sorcery.c:1575
#define ast_to_camel_case(s)
Attempts to convert the given string to camel case using an underscore as the specified delimiter.
Definition strings.h:546
struct ast_variable * next

References ast_free, AST_HANDLER_ONLY_STRING, ast_sip_get_sorcery(), ast_sorcery_objectset_create2(), ast_str_append(), ast_to_camel_case, ast_variables_destroy(), buf, ast_variable::name, ast_variable::next, RAII_VAR, sip_sorcery_object_ami_set_type_name(), and ast_variable::value.

Referenced by ami_outbound_registration_task(), ami_registrations_aor(), format_ami_resource_lists(), sip_auth_to_ami(), sip_contact_to_ami(), sip_endpoint_to_ami(), sip_identify_to_ami(), and sip_transport_to_ami().

◆ ast_sip_str2rc()

int ast_sip_str2rc ( const char *  name)

Convert name to SIP response code.

Parameters
nameSIP response code name matching one of the enum names defined in "enum pjsip_status_code" defined in sip_msg.h. May be specified with or without the PJSIP_SC_ prefix.
Return values
SIPresponse code
-1if matching code not found

Definition at line 3714 of file res_pjsip.c.

3715{
3716 int i;
3717
3718 if (ast_strlen_zero(name)) {
3719 return -1;
3720 }
3721
3722 for (i = 0; i < ARRAY_LEN(rc_map); i++) {
3723 if (strcasecmp(rc_map[i].short_name, name) == 0 ||
3724 strcasecmp(rc_map[i].long_name, name) == 0) {
3725 return rc_map[i].code;
3726 }
3727 }
3728
3729 return -1;
3730}
static const struct response_code_map rc_map[]
Definition res_pjsip.c:3634

References ARRAY_LEN, ast_strlen_zero(), response_code_map::code, response_code_map::long_name, name, rc_map, and response_code_map::short_name.

Referenced by response_code_validator().

◆ ast_sip_str_to_dtmf()

int ast_sip_str_to_dtmf ( const char *  dtmf_mode)

Convert the DTMF mode name into an enum.

Since
13.18.0
Parameters
dtmf_modedtmf mode as a string
Return values
>=0 The enum value
-1Failure

Definition at line 2533 of file res_pjsip.c.

2534{
2535 int result = -1;
2536
2537 if (!strcasecmp(dtmf_mode, "info")) {
2539 } else if (!strcasecmp(dtmf_mode, "rfc4733")) {
2541 } else if (!strcasecmp(dtmf_mode, "inband")) {
2543 } else if (!strcasecmp(dtmf_mode, "none")) {
2545 } else if (!strcasecmp(dtmf_mode, "auto")) {
2547 } else if (!strcasecmp(dtmf_mode, "auto_info")) {
2549 }
2550
2551 return result;
2552}
static PGresult * result
Definition cel_pgsql.c:84

References AST_SIP_DTMF_AUTO, AST_SIP_DTMF_AUTO_INFO, AST_SIP_DTMF_INBAND, AST_SIP_DTMF_INFO, AST_SIP_DTMF_NONE, AST_SIP_DTMF_RFC_4733, and result.

Referenced by dtmf_handler(), and pjsip_acf_dtmf_mode_write().

◆ ast_sip_str_to_security_mechanism()

int ast_sip_str_to_security_mechanism ( struct ast_sip_security_mechanism **  security_mechanism,
const char *  value 
)

Allocate a security mechanism from a string.

Parameters
security_mechanismPointer-pointer to the security mechanism to allocate.
valueThe security mechanism string as defined in RFC 3329 (section 2.2) in the form <mechanism_name>;q=<q_value>;<mechanism_parameters>
Return values
0Success
non-zeroFailure

Definition at line 242 of file security_agreements.c.

242 {
243 struct ast_sip_security_mechanism *mech;
244 char *param;
245 char *tmp;
246 char *mechanism = ast_strdupa(value);
247 int err = 0;
248 int type = -1;
249
251 if (!mech) {
252 err = ENOMEM;
253 goto out;
254 }
255
256 tmp = ast_strsep(&mechanism, ';', AST_STRSEP_ALL);
258 if (type == -1) {
259 err = EINVAL;
260 goto out;
261 }
262
263 mech->type = type;
264 while ((param = ast_strsep(&mechanism, ';', AST_STRSEP_ALL))) {
265 if (!param) {
266 err = EINVAL;
267 goto out;
268 }
269 if (!strncmp(param, "q=", 2)) {
270 mech->qvalue = parse_qvalue(&param[2]);
271 if (mech->qvalue < 0.0) {
272 err = EINVAL;
273 goto out;
274 }
275 continue;
276 }
277 param = ast_strdup(param);
279 }
280
281 *security_mechanism = mech;
282
283out:
284 if (err && (mech != NULL)) {
286 }
287 return err;
288}
static struct ast_sip_security_mechanism * security_mechanisms_alloc(size_t n_params)
static int str_to_security_mechanism_type(const char *security_mechanism)
static float parse_qvalue(const char *q_value)

References ast_strdup, ast_strdupa, ast_strsep(), AST_STRSEP_ALL, AST_VECTOR_APPEND, ast_sip_security_mechanism::mechanism_parameters, NULL, out, parse_qvalue(), ast_sip_security_mechanism::qvalue, security_mechanism_destroy(), security_mechanisms_alloc(), str_to_security_mechanism_type(), type, ast_sip_security_mechanism::type, and value.

Referenced by ast_sip_header_to_security_mechanism(), ast_sip_security_mechanism_vector_init(), and rfc3329_incoming_response().

◆ ast_sip_threadpool()

struct ast_threadpool * ast_sip_threadpool ( void  )

Retrieve the SIP threadpool object.

Definition at line 3462 of file res_pjsip.c.

3463{
3464 return sip_threadpool;
3465}
static struct ast_threadpool * sip_threadpool
Definition res_pjsip.c:76

References sip_threadpool.

Referenced by load_module().

◆ ast_sip_threadpool_queue_size()

long ast_sip_threadpool_queue_size ( void  )

Return the size of the SIP threadpool's task queue.

Since
13.7.0

Definition at line 3457 of file res_pjsip.c.

3458{
3460}
long ast_threadpool_queue_size(struct ast_threadpool *pool)
Return the size of the threadpool's task queue.

References ast_threadpool_queue_size(), and sip_threadpool.

◆ ast_sip_tpselector_unref()

void ast_sip_tpselector_unref ( pjsip_tpselector *  selector)

Unreference a pjsip_tpselector.

Since
17.0.0
Parameters
selectorThe selector to be unreffed

Definition at line 923 of file res_pjsip.c.

924{
925 if (selector->type == PJSIP_TPSELECTOR_TRANSPORT && selector->u.transport) {
926 pjsip_transport_dec_ref(selector->u.transport);
927 }
928}

Referenced by ast_sip_create_dialog_uac(), ast_sip_dlg_set_transport(), create_dialog_uas(), create_out_of_dialog_request(), registration_client_send(), set_transport(), and sip_outbound_registration_regc_alloc().

◆ ast_sip_transport_monitor_register()

enum ast_transport_monitor_reg ast_sip_transport_monitor_register ( pjsip_transport *  transport,
ast_transport_monitor_shutdown_cb  cb,
void *  ao2_data 
)

Register a reliable transport shutdown monitor callback.

Deprecated:
Replaced with ast_sip_transport_monitor_register_key().
Since
13.20.0
Parameters
transportTransport to monitor for shutdown.
cbWho to call when transport is shutdown.
ao2_dataData to pass with the callback.
Note
The data object passed will have its reference count automatically incremented by this call and automatically decremented after the callback runs or when the callback is unregistered.

There is no checking for duplicate registrations.

Returns
enum ast_transport_monitor_reg

Definition at line 478 of file pjsip_transport_events.c.

480{
483
484 return ast_sip_transport_monitor_register_replace_key(key, cb, ao2_data, NULL);
485}
enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace_key(const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *ao2_data, ast_transport_monitor_data_matcher matches)
Register a reliable transport shutdown monitor callback replacing any duplicate.
#define AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(_transport, _dest)
Fill a buffer with a pjsip transport's remote ip address and port.
Definition res_pjsip.h:91
#define IP6ADDR_COLON_PORT_BUFLEN
Definition res_pjsip.h:83

References AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR, ast_sip_transport_monitor_register_replace_key(), callback_data::cb, IP6ADDR_COLON_PORT_BUFLEN, and NULL.

◆ ast_sip_transport_monitor_register_key()

enum ast_transport_monitor_reg ast_sip_transport_monitor_register_key ( const char *  transport_key,
ast_transport_monitor_shutdown_cb  cb,
void *  ao2_data 
)

Register a reliable transport shutdown monitor callback.

Parameters
transport_keyKey for the transport to monitor for shutdown. Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
cbWho to call when transport is shutdown.
ao2_dataData to pass with the callback.
Note
The data object passed will have its reference count automatically incremented by this call and automatically decremented after the callback runs or when the callback is unregistered.

There is no checking for duplicate registrations.

Returns
enum ast_transport_monitor_reg

Definition at line 487 of file pjsip_transport_events.c.

489{
490 return ast_sip_transport_monitor_register_replace_key(transport_key, cb, ao2_data, NULL);
491}

References ast_sip_transport_monitor_register_replace_key(), callback_data::cb, and NULL.

Referenced by subscription_persistence_update().

◆ ast_sip_transport_monitor_register_replace()

enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace ( pjsip_transport *  transport,
ast_transport_monitor_shutdown_cb  cb,
void *  ao2_data,
ast_transport_monitor_data_matcher  matches 
)

Register a reliable transport shutdown monitor callback replacing any duplicate.

Deprecated:
Replaced with ast_sip_transport_monitor_register_replace_key().
Since
13.26.0
16.3.0
Parameters
transportTransport to monitor for shutdown.
cbWho to call when transport is shutdown.
ao2_dataData to pass with the callback.
matchesMatcher function that returns true if data matches a previously registered data object
Note
The data object passed will have its reference count automatically incremented by this call and automatically decremented after the callback runs or when the callback is unregistered.

This function checks for duplicates, and overwrites/replaces the old monitor with the given one.

Returns
enum ast_transport_monitor_reg

Definition at line 493 of file pjsip_transport_events.c.

495{
497
499 return ast_sip_transport_monitor_register_replace_key(key, cb, ao2_data, NULL);
500}

References AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR, ast_sip_transport_monitor_register_replace_key(), callback_data::cb, IP6ADDR_COLON_PORT_BUFLEN, and NULL.

Referenced by register_aor_core().

◆ ast_sip_transport_monitor_register_replace_key()

enum ast_transport_monitor_reg ast_sip_transport_monitor_register_replace_key ( const char *  transport_key,
ast_transport_monitor_shutdown_cb  cb,
void *  ao2_data,
ast_transport_monitor_data_matcher  matches 
)

Register a reliable transport shutdown monitor callback replacing any duplicate.

Parameters
transport_keyKey for the transport to monitor for shutdown. Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
cbWho to call when transport is shutdown.
ao2_dataData to pass with the callback.
matchesMatcher function that returns true if data matches a previously registered data object
Note
The data object passed will have its reference count automatically incremented by this call and automatically decremented after the callback runs or when the callback is unregistered.

This function checks for duplicates, and overwrites/replaces the old monitor with the given one.

Returns
enum ast_transport_monitor_reg

Definition at line 502 of file pjsip_transport_events.c.

504{
505 struct ao2_container *transports;
506 struct transport_monitor *monitored;
508
509 ast_assert(transport_key != NULL && cb != NULL);
510
511 transports = ao2_global_obj_ref(active_transports);
512 if (!transports) {
513 return res;
514 }
515
516 ao2_lock(transports);
517 monitored = ao2_find(transports, transport_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
518 if (monitored) {
519 struct transport_monitor_notifier new_monitor;
520 struct callback_data cb_data = {
521 .cb = cb,
522 .data = ao2_data,
523 .matches = matches ?: ptr_matcher,
524 };
525
526 transport_monitor_unregister_cb(monitored, &cb_data, 0);
527
528 /* Add new monitor to vector */
529 new_monitor.cb = cb;
530 new_monitor.data = ao2_bump(ao2_data);
531 if (AST_VECTOR_APPEND(&monitored->monitors, new_monitor)) {
532 ao2_cleanup(ao2_data);
534 ast_debug(3, "Transport %s(%s) RefCnt: %ld : Monitor registration failed %p(%p)\n",
535 monitored->key, monitored->transport_obj_name,
536 pj_atomic_get(monitored->transport->ref_cnt), cb, ao2_data);
537 } else {
539 ast_debug(3, "Transport %s(%s,%s) RefCnt: %ld : Registered monitor %p(%p)\n",
540 monitored->key, monitored->transport_obj_name,
541 monitored->transport->type_name,
542 pj_atomic_get(monitored->transport->ref_cnt), cb, ao2_data);
543 }
544
545 ao2_ref(monitored, -1);
546 }
547 ao2_unlock(transports);
548 ao2_ref(transports, -1);
549 return res;
550}
@ OBJ_NOLOCK
Assume that the ao2_container is already locked.
Definition astobj2.h:1063
static int ptr_matcher(void *a, void *b)
static int transport_monitor_unregister_cb(void *obj, void *arg, int flags)
ast_transport_monitor_data_matcher matches
ast_transport_monitor_shutdown_cb cb
Structure for transport to be monitored.
pjsip_transport * transport
The underlying PJSIP transport.
struct transport_monitor::@494 monitors
char key[IP6ADDR_COLON_PORT_BUFLEN]
Key <ipaddr>:<port>

References ao2_bump, ao2_cleanup, ao2_find, ao2_global_obj_ref, ao2_lock, ao2_ref, ao2_unlock, ast_assert, ast_debug, AST_TRANSPORT_MONITOR_REG_FAILED, AST_TRANSPORT_MONITOR_REG_NOT_FOUND, AST_TRANSPORT_MONITOR_REG_SUCCESS, AST_VECTOR_APPEND, transport_monitor_notifier::cb, callback_data::cb, transport_monitor_notifier::data, transport_monitor::key, callback_data::matches, transport_monitor::monitors, NULL, OBJ_NOLOCK, OBJ_SEARCH_KEY, ptr_matcher(), transport_monitor::transport, transport_monitor_unregister_cb(), and transport_monitor::transport_obj_name.

Referenced by ast_sip_transport_monitor_register(), ast_sip_transport_monitor_register_key(), ast_sip_transport_monitor_register_replace(), and registration_transport_monitor_setup().

◆ ast_sip_transport_monitor_unregister()

void ast_sip_transport_monitor_unregister ( pjsip_transport *  transport,
ast_transport_monitor_shutdown_cb  cb,
void *  data,
ast_transport_monitor_data_matcher  matches 
)

Unregister a reliable transport shutdown monitor.

Deprecated:
Replaced with ast_sip_transport_monitor_unregister_key().
Since
13.20.0
Parameters
transportTransport to monitor for shutdown.
cbThe callback that was used for the original register.
dataData to pass to the matcher. May be NULL and does NOT need to be an ao2 object. If NULL, all monitors with the provided callback are unregistered.
matchesMatcher function that returns true if data matches the previously registered data object. If NULL, a simple pointer comparison is done.
Note
The data object passed into the original register will have its reference count automatically decremented.

Definition at line 441 of file pjsip_transport_events.c.

443{
446 ast_sip_transport_monitor_unregister_key(key, cb, data, matches);
447}
void ast_sip_transport_monitor_unregister_key(const char *transport_key, ast_transport_monitor_shutdown_cb cb, void *data, ast_transport_monitor_data_matcher matches)
Unregister a reliable transport shutdown monitor.

References AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR, ast_sip_transport_monitor_unregister_key(), callback_data::cb, callback_data::data, IP6ADDR_COLON_PORT_BUFLEN, and callback_data::matches.

Referenced by registrar_contact_delete().

◆ ast_sip_transport_monitor_unregister_all()

void ast_sip_transport_monitor_unregister_all ( ast_transport_monitor_shutdown_cb  cb,
void *  data,
ast_transport_monitor_data_matcher  matches 
)

Unregister a transport shutdown monitor from all reliable transports.

Since
13.20.0
Parameters
cbThe callback that was used for the original register.
dataData to pass to the matcher. May be NULL and does NOT need to be an ao2 object. If NULL, all monitors with the provided callback are unregistered.
matchesMatcher function that returns true if ao2_data matches the previously registered data object. If NULL, a simple pointer comparison is done.
Note
The data object passed into the original register will have its reference count automatically decremented.

Definition at line 421 of file pjsip_transport_events.c.

423{
424 struct ao2_container *transports;
425 struct callback_data cb_data = {
426 .cb = cb,
427 .data = data,
428 .matches = matches ?: ptr_matcher,
429 };
430
431 ast_assert(cb != NULL);
432
433 transports = ao2_global_obj_ref(active_transports);
434 if (!transports) {
435 return;
436 }
438 ao2_ref(transports, -1);
439}

References ao2_callback, ao2_global_obj_ref, ao2_ref, ast_assert, callback_data::cb, callback_data::data, callback_data::matches, NULL, OBJ_MULTIPLE, OBJ_NODATA, ptr_matcher(), and transport_monitor_unregister_cb().

Referenced by registrar_contact_delete(), unload_module(), unload_module(), and unload_module().

◆ ast_sip_transport_monitor_unregister_key()

void ast_sip_transport_monitor_unregister_key ( const char *  transport_key,
ast_transport_monitor_shutdown_cb  cb,
void *  data,
ast_transport_monitor_data_matcher  matches 
)

Unregister a reliable transport shutdown monitor.

Parameters
transport_keyKey for the transport to monitor for shutdown. Create the key with AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR.
cbThe callback that was used for the original register.
dataData to pass to the matcher. May be NULL and does NOT need to be an ao2 object. If NULL, all monitors with the provided callback are unregistered.
matchesMatcher function that returns true if data matches the previously registered data object. If NULL, a simple pointer comparison is done.
Note
The data object passed into the original register will have its reference count automatically decremented.

Definition at line 449 of file pjsip_transport_events.c.

451{
452 struct ao2_container *transports;
453 struct transport_monitor *monitored;
454
455 ast_assert(transport_key != NULL && cb != NULL);
456
457 transports = ao2_global_obj_ref(active_transports);
458 if (!transports) {
459 return;
460 }
461
462 ao2_lock(transports);
463 monitored = ao2_find(transports, transport_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
464 if (monitored) {
465 struct callback_data cb_data = {
466 .cb = cb,
467 .data = data,
468 .matches = matches ?: ptr_matcher,
469 };
470
471 transport_monitor_unregister_cb(monitored, &cb_data, 0);
472 ao2_ref(monitored, -1);
473 }
474 ao2_unlock(transports);
475 ao2_ref(transports, -1);
476}

References ao2_find, ao2_global_obj_ref, ao2_lock, ao2_ref, ao2_unlock, ast_assert, callback_data::cb, callback_data::data, callback_data::matches, NULL, OBJ_NOLOCK, OBJ_SEARCH_KEY, ptr_matcher(), and transport_monitor_unregister_cb().

Referenced by ast_sip_transport_monitor_unregister(), handle_registration_response(), and subscription_persistence_remove().

◆ ast_sip_transport_state_register()

void ast_sip_transport_state_register ( struct ast_sip_tpmgr_state_callback element)

Register a transport state notification callback element.

Since
13.18.0
Parameters
elementWhat we are registering.

Definition at line 559 of file pjsip_transport_events.c.

560{
561 struct ast_sip_tpmgr_state_callback *tpmgr_notifier;
562
564 AST_LIST_TRAVERSE(&transport_state_list, tpmgr_notifier, node) {
565 if (element == tpmgr_notifier) {
566 /* Already registered. */
568 return;
569 }
570 }
573}
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
static struct @493 transport_state_list

References AST_LIST_INSERT_HEAD, AST_LIST_TRAVERSE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and transport_state_list.

Referenced by ast_sip_initialize_transport_management().

◆ ast_sip_transport_state_set_preferred_identity()

int ast_sip_transport_state_set_preferred_identity ( const char *  transport_name,
const char *  identity 
)

Sets the P-Preferred-Identity on a child transport.

Since
17.0.0
Parameters
transport_nameThe name of the transport to be set on
identityThe P-Preferred-Identity to use on requests on this transport
Return values
0success
-1failure

Definition at line 242 of file config_transport.c.

243{
244 struct ast_sip_transport_state *transport_state;
245
246 if (ast_strlen_zero(transport_name)) {
247 return 0;
248 }
249
250 transport_state = ast_sip_get_transport_state(transport_name);
251 if (!transport_state) {
252 return -1;
253 }
254
255 if (!transport_state->flow) {
256 ao2_ref(transport_state, -1);
257 return 0;
258 }
259
260 ao2_lock(transport_state);
261 ast_free(transport_state->preferred_identity);
262 transport_state->preferred_identity = ast_strdup(identity);
263 ao2_unlock(transport_state);
264
265 ao2_ref(transport_state, -1);
266
267 return 0;
268}

References ao2_lock, ao2_ref, ao2_unlock, ast_free, ast_sip_get_transport_state(), ast_strdup, ast_strlen_zero(), ast_sip_transport_state::flow, and ast_sip_transport_state::preferred_identity.

Referenced by save_response_fields_to_transport().

◆ ast_sip_transport_state_set_service_routes()

int ast_sip_transport_state_set_service_routes ( const char *  transport_name,
struct ast_sip_service_route_vector service_routes 
)

Sets the service routes on a child transport.

Since
17.0.0
Parameters
transport_nameThe name of the transport to be set on
service_routesA vector of service routes
Return values
0success
-1failure
Note
This assumes ownership of the service routes in both success and failure scenarios

Definition at line 270 of file config_transport.c.

271{
272 struct ast_sip_transport_state *transport_state;
273
274 if (ast_strlen_zero(transport_name)) {
276 return 0;
277 }
278
279 transport_state = ast_sip_get_transport_state(transport_name);
280 if (!transport_state) {
282 return -1;
283 }
284
285 if (!transport_state->flow) {
286 ao2_ref(transport_state, -1);
288 return 0;
289 }
290
291 ao2_lock(transport_state);
293 transport_state->service_routes = service_routes;
294 ao2_unlock(transport_state);
295
296 ao2_ref(transport_state, -1);
297
298 return 0;
299}
void ast_sip_service_route_vector_destroy(struct ast_sip_service_route_vector *service_routes)
Destroy a vector of service routes.

References ao2_lock, ao2_ref, ao2_unlock, ast_sip_get_transport_state(), ast_sip_service_route_vector_destroy(), ast_strlen_zero(), ast_sip_transport_state::flow, and ast_sip_transport_state::service_routes.

Referenced by save_response_fields_to_transport().

◆ ast_sip_transport_state_set_transport()

int ast_sip_transport_state_set_transport ( const char *  transport_name,
pjsip_transport *  transport 
)

Sets the PJSIP transport on a child transport.

Since
17.0.0
Parameters
transport_nameThe name of the transport to be updated
transportThe PJSIP transport
Return values
0success
-1failure

Definition at line 206 of file config_transport.c.

207{
208 struct ast_sip_transport_state *transport_state;
209
210 /* To make it easier on callers we allow an empty transport name */
211 if (ast_strlen_zero(transport_name)) {
212 return 0;
213 }
214
215 transport_state = ast_sip_get_transport_state(transport_name);
216 if (!transport_state) {
217 return -1;
218 }
219
220 if (!transport_state->flow) {
221 ao2_ref(transport_state, -1);
222 return 0;
223 }
224
225 ao2_lock(transport_state);
226 if (transport_state->transport != transport) {
227 if (transport_state->transport) {
228 pjsip_transport_dec_ref(transport_state->transport);
229 }
230 transport_state->transport = transport;
231 if (transport_state->transport) {
232 pjsip_transport_add_ref(transport_state->transport);
233 }
234 }
235 ao2_unlock(transport_state);
236
237 ao2_ref(transport_state, -1);
238
239 return 0;
240}

References ao2_lock, ao2_ref, ao2_unlock, ast_sip_get_transport_state(), ast_strlen_zero(), ast_sip_transport_state::flow, and ast_sip_transport_state::transport.

Referenced by save_response_fields_to_transport().

◆ ast_sip_transport_state_unregister()

void ast_sip_transport_state_unregister ( struct ast_sip_tpmgr_state_callback element)

Unregister a transport state notification callback element.

Since
13.18.0
Parameters
elementWhat we are unregistering.

Definition at line 552 of file pjsip_transport_events.c.

553{
557}
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.

References AST_LIST_REMOVE, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and transport_state_list.

Referenced by ast_sip_destroy_transport_management().

◆ ast_sip_unregister_authenticator()

void ast_sip_unregister_authenticator ( struct ast_sip_authenticator auth)

Unregister a SIP authenticator.

When there is no authenticator registered, requests cannot be challenged or authenticated.

Parameters
authThe authenticator to unregister

Definition at line 152 of file res_pjsip.c.

153{
154 if (registered_authenticator != auth) {
155 ast_log(LOG_WARNING, "Trying to unregister authenticator %p but authenticator %p registered\n",
157 return;
158 }
160 ast_debug(1, "Unregistered SIP authenticator %p\n", auth);
161}

References ast_debug, ast_log, LOG_WARNING, NULL, and registered_authenticator.

Referenced by unload_module().

◆ ast_sip_unregister_endpoint_formatter()

void ast_sip_unregister_endpoint_formatter ( struct ast_sip_endpoint_formatter obj)

◆ ast_sip_unregister_endpoint_identifier()

void ast_sip_unregister_endpoint_identifier ( struct ast_sip_endpoint_identifier identifier)

Unregister a SIP endpoint identifier.

This stops an endpoint identifier from being used.

Parameters
identifierThe SIP endoint identifier to unregister

Definition at line 315 of file res_pjsip.c.

316{
317 struct endpoint_identifier_list *iter;
320 if (iter->identifier == identifier) {
322 ast_free(iter);
323 ast_debug(1, "Unregistered endpoint identifier %p\n", identifier);
324 break;
325 }
326 }
328}

References ast_debug, ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, endpoint_identifier_list::identifier, endpoint_identifier_list::list, lock, and SCOPED_LOCK.

Referenced by unload_module(), unload_module(), unload_module(), and unload_module().

◆ ast_sip_unregister_outbound_authenticator()

void ast_sip_unregister_outbound_authenticator ( struct ast_sip_outbound_authenticator auth)

Unregister an outbound SIP authenticator.

When there is no outbound authenticator registered, authentication challenges will be handled as any other final response would be.

Parameters
authThe authenticator to unregister

Definition at line 203 of file res_pjsip.c.

204{
206 ast_log(LOG_WARNING, "Trying to unregister outbound authenticator %p but outbound authenticator %p registered\n",
208 return;
209 }
211 ast_debug(1, "Unregistered SIP outbound authenticator %p\n", auth);
212}

References ast_debug, ast_log, LOG_WARNING, NULL, and registered_outbound_authenticator.

Referenced by unload_module().

◆ ast_sip_unregister_service()

void ast_sip_unregister_service ( pjsip_module *  module)

This is the opposite of ast_sip_register_service(). Unregistering a service means that PJSIP will no longer call into the module any more. This will likely occur when an Asterisk module is unloaded.

Parameters
moduleThe PJSIP module to unregister

Definition at line 133 of file res_pjsip.c.

134{
136}
static int unregister_service(void *data)
Definition res_pjsip.c:122

References ast_sip_push_task_wait_servant(), NULL, and unregister_service().

Referenced by ast_res_pjsip_cleanup_message_filter(), ast_sip_destroy_distributor(), ast_sip_destroy_global_headers(), ast_sip_destroy_transport_management(), load_module(), load_module(), load_module(), load_module(), load_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), unload_module(), and unload_pjsip().

◆ ast_sip_unregister_supplement()

void ast_sip_unregister_supplement ( struct ast_sip_supplement supplement)

Unregister a an supplement to SIP out of dialog processing.

Parameters
supplementThe supplement to unregister

Definition at line 1476 of file res_pjsip.c.

1477{
1478 struct ast_sip_supplement *iter;
1480
1482 if (supplement == iter) {
1484 break;
1485 }
1486 }
1488}

References AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, lock, ast_sip_supplement::next, and SCOPED_LOCK.

Referenced by ast_res_pjsip_cleanup_message_filter(), unload_module(), and unload_module().

◆ ast_sip_update_from()

int ast_sip_update_from ( pjsip_tx_data *  tdata,
char *  from 
)

Overwrite fields in the outbound 'From' header.

The outbound 'From' header is created/added in ast_sip_create_request with default data. If available that data may be info specified in the 'from_user' and 'from_domain' options found on the endpoint. That information will be overwritten with data in the given 'from' parameter.

Parameters
tdatathe outbound message data structure
frominfo to copy into the header. Can be either a SIP URI, or in the format user[@domain]
Return values
0success, -1: failure

Definition at line 3383 of file res_pjsip.c.

3384{
3385 pjsip_name_addr *name_addr;
3386 pjsip_sip_uri *uri;
3387 pjsip_name_addr *parsed_name_addr;
3388 pjsip_from_hdr *from_hdr;
3389
3390 if (ast_strlen_zero(from)) {
3391 return 0;
3392 }
3393
3394 from_hdr = PJSIP_MSG_FROM_HDR(tdata->msg);
3395 if (!from_hdr) {
3396 return -1;
3397 }
3398 name_addr = (pjsip_name_addr *) from_hdr->uri;
3399 uri = pjsip_uri_get_uri(name_addr);
3400
3401 parsed_name_addr = (pjsip_name_addr *) pjsip_parse_uri(tdata->pool, from,
3402 strlen(from), PJSIP_PARSE_URI_AS_NAMEADDR);
3403 if (parsed_name_addr) {
3404 pjsip_sip_uri *parsed_uri;
3405
3406 if (!PJSIP_URI_SCHEME_IS_SIP(parsed_name_addr->uri)
3407 && !PJSIP_URI_SCHEME_IS_SIPS(parsed_name_addr->uri)) {
3408 ast_log(LOG_WARNING, "From address '%s' is not a valid SIP/SIPS URI\n", from);
3409 return -1;
3410 }
3411
3412 parsed_uri = pjsip_uri_get_uri(parsed_name_addr->uri);
3413
3414 if (pj_strlen(&parsed_name_addr->display)) {
3415 pj_strdup(tdata->pool, &name_addr->display, &parsed_name_addr->display);
3416 }
3417
3418 /* Unlike the To header, we only want to replace the user, host and port */
3419 pj_strdup(tdata->pool, &uri->user, &parsed_uri->user);
3420 pj_strdup(tdata->pool, &uri->host, &parsed_uri->host);
3421 uri->port = parsed_uri->port;
3422
3423 return 0;
3424 } else {
3425 /* assume it is 'user[@domain]' format */
3426 char *domain = strchr(from, '@');
3427
3428 if (domain) {
3429 pj_str_t pj_from;
3430
3431 pj_strset3(&pj_from, from, domain);
3432 pj_strdup(tdata->pool, &uri->user, &pj_from);
3433
3434 pj_strdup2(tdata->pool, &uri->host, domain + 1);
3435 } else {
3436 pj_strdup2(tdata->pool, &uri->user, from);
3437 }
3438
3439 return 0;
3440 }
3441
3442 return -1;
3443}

References ast_log, ast_strlen_zero(), and LOG_WARNING.

Referenced by msg_send(), and refer_send().

◆ ast_sip_update_to_uri()

int ast_sip_update_to_uri ( pjsip_tx_data *  tdata,
const char *  to 
)

Replace the To URI in the tdata with the supplied one.

Parameters
tdatathe outbound message data structure
toURI to replace the To URI with. Must be a valid SIP URI.
Return values
0success, -1: failure

Definition at line 3323 of file res_pjsip.c.

3324{
3325 pjsip_name_addr *parsed_name_addr;
3326 pjsip_sip_uri *sip_uri;
3327 pjsip_name_addr *tdata_name_addr;
3328 pjsip_sip_uri *tdata_sip_uri;
3329 pjsip_to_hdr *to_hdr;
3330 char *buf = NULL;
3331#define DEBUG_BUF_SIZE 256
3332
3333 parsed_name_addr = (pjsip_name_addr *) pjsip_parse_uri(tdata->pool, (char*)to, strlen(to),
3334 PJSIP_PARSE_URI_AS_NAMEADDR);
3335
3336 if (!parsed_name_addr || (!PJSIP_URI_SCHEME_IS_SIP(parsed_name_addr->uri)
3337 && !PJSIP_URI_SCHEME_IS_SIPS(parsed_name_addr->uri))) {
3338 ast_log(LOG_WARNING, "To address '%s' is not a valid SIP/SIPS URI\n", to);
3339 return -1;
3340 }
3341
3342 sip_uri = pjsip_uri_get_uri(parsed_name_addr->uri);
3343 if (DEBUG_ATLEAST(3)) {
3345 pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, sip_uri, buf, DEBUG_BUF_SIZE);
3346 ast_debug(3, "Parsed To: %.*s %s\n", (int)parsed_name_addr->display.slen,
3347 parsed_name_addr->display.ptr, buf);
3348 }
3349
3350 to_hdr = PJSIP_MSG_TO_HDR(tdata->msg);
3351 tdata_name_addr = to_hdr ? (pjsip_name_addr *) to_hdr->uri : NULL;
3352 if (!tdata_name_addr || (!PJSIP_URI_SCHEME_IS_SIP(tdata_name_addr->uri)
3353 && !PJSIP_URI_SCHEME_IS_SIPS(tdata_name_addr->uri))) {
3354 /* Highly unlikely but we have to check */
3355 ast_log(LOG_WARNING, "tdata To address '%s' is not a valid SIP/SIPS URI\n", to);
3356 return -1;
3357 }
3358
3359 tdata_sip_uri = pjsip_uri_get_uri(tdata_name_addr->uri);
3360 if (DEBUG_ATLEAST(3)) {
3361 buf[0] = '\0';
3362 pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, tdata_sip_uri, buf, DEBUG_BUF_SIZE);
3363 ast_debug(3, "Original tdata To: %.*s %s\n", (int)tdata_name_addr->display.slen,
3364 tdata_name_addr->display.ptr, buf);
3365 }
3366
3367 /* Replace the uri */
3368 pjsip_sip_uri_assign(tdata->pool, tdata_sip_uri, sip_uri);
3369 /* The display name isn't part of the URI so we need to replace it separately */
3370 pj_strdup(tdata->pool, &tdata_name_addr->display, &parsed_name_addr->display);
3371
3372 if (DEBUG_ATLEAST(3)) {
3373 buf[0] = '\0';
3374 pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, tdata_sip_uri, buf, 256);
3375 ast_debug(3, "New tdata To: %.*s %s\n", (int)tdata_name_addr->display.slen,
3376 tdata_name_addr->display.ptr, buf);
3377 }
3378
3379 return 0;
3380#undef DEBUG_BUF_SIZE
3381}
#define DEBUG_ATLEAST(level)
#define DEBUG_BUF_SIZE

References ast_alloca, ast_debug, ast_log, buf, DEBUG_ATLEAST, DEBUG_BUF_SIZE, LOG_WARNING, and NULL.

Referenced by msg_send(), and refer_send().

Variable Documentation

◆ AST_PJ_STR_EMPTY

const pj_str_t AST_PJ_STR_EMPTY = { "", 0 }
static

Definition at line 112 of file res_pjsip.h.

112{ "", 0 };

Referenced by ast_sip_pjsip_uri_get_hostname(), and ast_sip_pjsip_uri_get_username().

◆ pjsip_media_type_application_cpim_xpidf_xml

pjsip_media_type pjsip_media_type_application_cpim_xpidf_xml
extern

Definition at line 3913 of file res_pjsip.c.

Referenced by load_module().

◆ pjsip_media_type_application_json

pjsip_media_type pjsip_media_type_application_json
extern

Common media types used throughout res_pjsip and pjproject

Definition at line 3909 of file res_pjsip.c.

Referenced by load_module().

◆ pjsip_media_type_application_media_control_xml

pjsip_media_type pjsip_media_type_application_media_control_xml
extern

Definition at line 3910 of file res_pjsip.c.

Referenced by load_module(), and video_info_incoming_request().

◆ pjsip_media_type_application_pidf_xml

pjsip_media_type pjsip_media_type_application_pidf_xml
extern

Definition at line 3911 of file res_pjsip.c.

Referenced by add_eprofile_to_tdata(), find_pidf(), and load_module().

◆ pjsip_media_type_application_rlmi_xml

pjsip_media_type pjsip_media_type_application_rlmi_xml
extern

Definition at line 3914 of file res_pjsip.c.

Referenced by load_module().

◆ pjsip_media_type_application_sdp

pjsip_media_type pjsip_media_type_application_sdp
extern

Definition at line 3916 of file res_pjsip.c.

Referenced by filter_on_tx_message(), load_module(), and session_outgoing_nat_hook().

◆ pjsip_media_type_application_simple_message_summary

pjsip_media_type pjsip_media_type_application_simple_message_summary
extern

Definition at line 3915 of file res_pjsip.c.

Referenced by load_module().

◆ pjsip_media_type_application_xpidf_xml

pjsip_media_type pjsip_media_type_application_xpidf_xml
extern

Definition at line 3912 of file res_pjsip.c.

Referenced by load_module().

◆ pjsip_media_type_multipart_alternative

pjsip_media_type pjsip_media_type_multipart_alternative
extern

Definition at line 3917 of file res_pjsip.c.

Referenced by check_content_disposition(), and load_module().

◆ pjsip_media_type_multipart_mixed

pjsip_media_type pjsip_media_type_multipart_mixed
extern

◆ pjsip_media_type_multipart_related

pjsip_media_type pjsip_media_type_multipart_related
extern

Definition at line 3919 of file res_pjsip.c.

Referenced by load_module().

◆ pjsip_media_type_text_plain

pjsip_media_type pjsip_media_type_text_plain
extern

Definition at line 3920 of file res_pjsip.c.

Referenced by load_module().