Asterisk - The Open Source Telephony Project GIT-master-97770a9
Data Structures | Macros | Functions | Variables
pjsip_configuration.c File Reference
#include "asterisk.h"
#include <pjsip.h>
#include <pjsip_ua.h>
#include "asterisk/res_geolocation.h"
#include "asterisk/res_pjsip.h"
#include "include/res_pjsip_private.h"
#include "asterisk/res_pjsip_cli.h"
#include "asterisk/acl.h"
#include "asterisk/manager.h"
#include "asterisk/astobj2.h"
#include "asterisk/utils.h"
#include "asterisk/sorcery.h"
#include "asterisk/callerid.h"
#include "asterisk/test.h"
#include "asterisk/statsd.h"
#include "asterisk/pbx.h"
#include "asterisk/stream.h"
#include "asterisk/stasis.h"
#include "asterisk/security_events.h"
#include "asterisk/res_stir_shaken.h"
Include dependency graph for pjsip_configuration.c:

Go to the source code of this file.

Data Structures

struct  sip_persistent_endpoint
 Persistent endpoint information. More...
 

Macros

#define AMI_DEFAULT_STR_SIZE   512
 
#define AMI_SHOW_ENDPOINT   "PJSIPShowEndpoint"
 
#define AMI_SHOW_ENDPOINTS   "PJSIPShowEndpoints"
 
#define PERSISTENT_BUCKETS   53
 Number of buckets for persistent endpoint information. More...
 

Functions

static void acl_change_stasis_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static int acl_to_str (const void *obj, const intptr_t *args, char **buf)
 
static void active_channels_to_str (const struct ast_sip_endpoint *endpoint, struct ast_str **str)
 
static int active_channels_to_str_cb (void *object, void *arg, int flags)
 
static int add_to_regcontext (void *obj, void *arg, int flags)
 
static int ami_show_endpoint (struct mansession *s, const struct message *m)
 
static int ami_show_endpoints (struct mansession *s, const struct message *m)
 
void ast_res_pjsip_destroy_configuration (void)
 
int ast_res_pjsip_initialize_configuration (void)
 
int ast_res_pjsip_reload_configuration (void)
 
void ast_sip_auth_vector_destroy (struct ast_sip_auth_vector *auths)
 Free contents of an auth vector. More...
 
int ast_sip_auth_vector_init (struct ast_sip_auth_vector *auths, const char *value)
 Initialize an auth vector with the configured values. More...
 
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. More...
 
void ast_sip_cleanup_auths (struct ast_sip_auth *auths[], size_t num_auths)
 Clean up retrieved auth structures from memory. More...
 
struct ast_strast_sip_create_ami_event (const char *event, struct ast_sip_ami *ami)
 Creates a string to store AMI event data in. More...
 
struct ast_sip_endpointast_sip_default_outbound_endpoint (void)
 Retrieve the default outbound endpoint. More...
 
void * ast_sip_endpoint_alloc (const char *name)
 Allocate a new SIP endpoint. More...
 
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. More...
 
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. More...
 
const char * ast_sip_get_device_state (const struct ast_sip_endpoint *endpoint)
 Retrieve the device state for an endpoint. More...
 
struct ast_endpoint_snapshotast_sip_get_endpoint_snapshot (const struct ast_sip_endpoint *endpoint)
 Retrieve the endpoint snapshot for an endpoint. More...
 
struct ao2_containerast_sip_get_endpoints (void)
 Retrieve any endpoints available to sorcery. More...
 
struct ast_sorceryast_sip_get_sorcery (void)
 Get a pointer to the SIP sorcery structure. More...
 
int ast_sip_persistent_endpoint_add_to_regcontext (const char *regcontext)
 
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. More...
 
int ast_sip_persistent_endpoint_update_state (const char *endpoint_name, enum ast_endpoint_state state)
 Change state of a persistent endpoint. More...
 
int ast_sip_retrieve_auths (const struct ast_sip_auth_vector *auths, struct ast_sip_auth **out)
 Retrieve relevant SIP auth structures from sorcery. More...
 
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. More...
 
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. More...
 
int ast_sip_sorcery_object_to_ami (const void *obj, struct ast_str **buf)
 Converts a sorcery object to a string of object properties. More...
 
static int call_offer_pref_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_privacy_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_privacy_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int caller_id_tag_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int caller_id_tag_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int caller_id_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int callgroup_to_str (const void *obj, const intptr_t *args, char **buf)
 
static struct ao2_containercli_endpoint_get_container (const char *regex)
 
static int cli_endpoint_iterate (void *obj, ao2_callback_fn callback, void *args)
 
static int cli_endpoint_print_body (void *obj, void *arg, int flags)
 
static void cli_endpoint_print_child_body (char *type, const void *obj, struct ast_sip_cli_context *context)
 
static void cli_endpoint_print_child_header (char *type, struct ast_sip_cli_context *context)
 
static int cli_endpoint_print_header (void *obj, void *arg, int flags)
 
static void * cli_endpoint_retrieve_by_id (const char *id)
 
static int codec_prefs_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int codec_prefs_to_str (const struct ast_stream_codec_negotiation_prefs *prefs, const void *obj, const intptr_t *args, char **buf)
 
static int connected_line_method_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int connected_line_method_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int contact_acl_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int contact_user_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int contact_user_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int direct_media_glare_mitigation_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int direct_media_glare_mitigation_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int direct_media_method_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int direct_media_method_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtls_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int dtlsautogeneratecert_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscafile_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscapath_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscertfile_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlscipher_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsfingerprint_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsprivatekey_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsrekey_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlssetup_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtlsverify_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int dtmf_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int dtmf_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int endpoint_acl_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static void endpoint_deleted_observer (const void *object)
 
static void endpoint_destructor (void *obj)
 
static int format_ami_endpoint (const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
 
static int format_ami_endpoints (void *obj, void *arg, int flags)
 
static int format_str_append_auth (const struct ast_sip_auth_vector *auths, struct ast_str **buf)
 
static int from_user_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int from_user_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int group_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int ident_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int ident_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int inbound_auth_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int inbound_auths_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int incoming_answer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int incoming_call_offer_pref_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int incoming_offer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static void info_configuration_destroy (struct ast_sip_endpoint_info_configuration *info)
 
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 load_all_endpoints (void)
 
static int media_address_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int media_address_to_str (const void *obj, const intptr_t *args, char **buf)
 
static void media_configuration_destroy (struct ast_sip_endpoint_media_configuration *media)
 
static int media_encryption_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int media_encryption_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int named_callgroups_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int named_groups_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int named_pickupgroups_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outbound_auth_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int outbound_auths_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outgoing_answer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outgoing_call_offer_pref_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int outgoing_offer_codec_prefs_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int persistent_endpoint_cmp (void *obj, void *arg, int flags)
 Comparison function for persistent endpoint information. More...
 
static void persistent_endpoint_destroy (void *obj)
 Destructor function for persistent endpoint information. More...
 
static struct ast_endpointpersistent_endpoint_find_or_create (const struct ast_sip_endpoint *endpoint)
 Internal function which finds (or creates) persistent endpoint information. More...
 
static int persistent_endpoint_hash (const void *obj, const int flags)
 Hashing function for persistent endpoint information. More...
 
static int pickupgroup_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int prack_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int prack_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int redirect_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int security_mechanism_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int security_mechanism_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int security_negotiation_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int security_negotiation_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int set_var_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int set_var_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int set_var_to_vl (const void *obj, struct ast_variable **fields)
 
static int sip_endpoint_apply_handler (const struct ast_sorcery *sorcery, void *obj)
 Callback function for when an object is finalized. More...
 
static int sip_endpoint_identifier_str2type (const char *str)
 
static const char * sip_endpoint_identifier_type2str (enum ast_sip_endpoint_identifier_type method)
 
static int sip_endpoint_to_ami (const struct ast_sip_endpoint *endpoint, struct ast_str **buf)
 
static int sip_endpoints_aors_ami (void *obj, void *arg, int flags)
 
static void * sip_nat_hook_alloc (const char *name)
 
static void sip_sorcery_object_ami_set_type_name (const void *obj, struct ast_str **buf)
 
static int stir_shaken_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int stir_shaken_to_str (const void *obj, const intptr_t *args, char **buf)
 
static void subscription_configuration_destroy (struct ast_sip_endpoint_subscription_configuration *subscription)
 
static int t38udptl_ec_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int t38udptl_ec_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int timers_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int timers_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int tos_audio_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int tos_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int tos_video_to_str (const void *obj, const intptr_t *args, char **buf)
 
static int voicemail_extension_handler (const struct aco_option *opt, struct ast_variable *var, void *obj)
 
static int voicemail_extension_to_str (const void *obj, const intptr_t *args, char **buf)
 

Variables

static struct stasis_subscriptionacl_change_sub
 
static const char * ast_rtp_dtls_fingerprint_map []
 
static const char * ast_rtp_dtls_setup_map []
 
static const char * ast_t38_ec_modes_map []
 
struct ast_sip_cli_formatter_entrychannel_formatter
 
static struct ast_cli_entry cli_commands []
 
static const char * direct_media_glare_mitigation_map []
 
struct ast_sip_cli_formatter_entryendpoint_formatter
 
static const struct ast_sorcery_observer endpoint_observers
 
static const char * id_configuration_refresh_methods []
 
static const char * media_encryption_map []
 
static struct ao2_containerpersistent_endpoints
 Container for persistent endpoint information. More...
 
static const char * security_negotiation_map []
 
static struct ast_sorcerysip_sorcery
 

Macro Definition Documentation

◆ AMI_DEFAULT_STR_SIZE

#define AMI_DEFAULT_STR_SIZE   512

Definition at line 1722 of file pjsip_configuration.c.

◆ AMI_SHOW_ENDPOINT

#define AMI_SHOW_ENDPOINT   "PJSIPShowEndpoint"

Definition at line 1814 of file pjsip_configuration.c.

◆ AMI_SHOW_ENDPOINTS

#define AMI_SHOW_ENDPOINTS   "PJSIPShowEndpoints"

Definition at line 1813 of file pjsip_configuration.c.

◆ PERSISTENT_BUCKETS

#define PERSISTENT_BUCKETS   53

Number of buckets for persistent endpoint information.

Definition at line 43 of file pjsip_configuration.c.

Function Documentation

◆ acl_change_stasis_cb()

static void acl_change_stasis_cb ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Definition at line 2103 of file pjsip_configuration.c.

2105{
2107 return;
2108 }
2109
2111}
struct stasis_message_type * ast_named_acl_change_type(void)
a stasis_message_type for changes against a named ACL or the set of all named ACLs
static struct ast_sorcery * sip_sorcery
void ast_sorcery_force_reload_object(const struct ast_sorcery *sorcery, const char *type)
Inform any wizards of a specific object type to reload persistent objects even if no changes determin...
Definition: sorcery.c:1457
struct stasis_message_type * stasis_message_type(const struct stasis_message *msg)
Get the message type for a stasis_message.

References ast_named_acl_change_type(), ast_sorcery_force_reload_object(), sip_sorcery, and stasis_message_type().

Referenced by ast_res_pjsip_initialize_configuration().

◆ acl_to_str()

static int acl_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 106 of file pjsip_configuration.c.

107{
108 const struct ast_sip_endpoint *endpoint = obj;
109 struct ast_acl_list *acl_list;
110 struct ast_acl *first_acl;
111
112 if (endpoint && !ast_acl_list_is_empty(acl_list=endpoint->acl)) {
113 AST_LIST_LOCK(acl_list);
114 first_acl = AST_LIST_FIRST(acl_list);
115 if (ast_strlen_zero(first_acl->name)) {
116 *buf = "deny/permit";
117 } else {
118 *buf = first_acl->name;
119 }
120 AST_LIST_UNLOCK(acl_list);
121 }
122
123 *buf = ast_strdup(*buf);
124 return 0;
125}
int ast_acl_list_is_empty(struct ast_acl_list *acl_list)
Determines if an ACL is empty or if it contains entries.
Definition: acl.c:540
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:40
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:140
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
Definition: linkedlists.h:421
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Wrapper for an ast_acl linked list.
Definition: acl.h:76
an ast_acl is a linked list node of ast_ha structs which may have names.
Definition: acl.h:67
char name[ACL_NAME_LENGTH]
Definition: acl.h:71
An entity with which Asterisk communicates.
Definition: res_pjsip.h:961
struct ast_acl_list * acl
Definition: res_pjsip.h:1036

References ast_sip_endpoint::acl, ast_acl_list_is_empty(), AST_LIST_FIRST, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_strdup, ast_strlen_zero(), buf, and ast_acl::name.

Referenced by ast_res_pjsip_initialize_configuration().

◆ active_channels_to_str()

static void active_channels_to_str ( const struct ast_sip_endpoint endpoint,
struct ast_str **  str 
)
static

Definition at line 1706 of file pjsip_configuration.c.

1708{
1709
1710 RAII_VAR(struct ast_endpoint_snapshot *, endpoint_snapshot,
1712
1713 if (endpoint_snapshot) {
1714 return;
1715 }
1716
1717 ast_sip_for_each_channel_snapshot(endpoint_snapshot,
1719 ast_str_truncate(*str, -1);
1720}
const char * str
Definition: app_jack.c:147
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
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.
static int active_channels_to_str_cb(void *object, void *arg, int flags)
char * ast_str_truncate(struct ast_str *buf, ssize_t len)
Truncates the enclosed string to the given length.
Definition: strings.h:786
A snapshot of an endpoint's state.
#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:941

References active_channels_to_str_cb(), ao2_cleanup, ast_sip_for_each_channel_snapshot(), ast_sip_get_endpoint_snapshot(), ast_str_truncate(), RAII_VAR, and str.

Referenced by format_ami_endpoints(), and sip_endpoint_to_ami().

◆ active_channels_to_str_cb()

static int active_channels_to_str_cb ( void *  object,
void *  arg,
int  flags 
)
static

Definition at line 1698 of file pjsip_configuration.c.

1699{
1700 const struct ast_channel_snapshot *snapshot = object;
1701 struct ast_str **buf = arg;
1702 ast_str_append(buf, 0, "%s,", snapshot->base->name);
1703 return 0;
1704}
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
const ast_string_field name
Structure representing a snapshot of channel state.
struct ast_channel_snapshot_base * base
Support for dynamic strings.
Definition: strings.h:623

References ast_str_append(), ast_channel_snapshot::base, buf, and ast_channel_snapshot_base::name.

Referenced by active_channels_to_str().

◆ add_to_regcontext()

static int add_to_regcontext ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1399 of file pjsip_configuration.c.

1400{
1401 struct sip_persistent_endpoint *persistent = obj;
1402 const char *regcontext = arg;
1403
1406 persistent->endpoint), 1, NULL)) {
1408 "Noop", ast_strdup(ast_endpoint_get_resource(persistent->endpoint)), ast_free_ptr, "PJSIP");
1409 }
1410 }
1411
1412 return 0;
1413}
void ast_free_ptr(void *ptr)
free() wrapper
Definition: astmm.c:1739
static char regcontext[AST_MAX_CONTEXT]
Definition: chan_iax2.c:325
@ AST_ENDPOINT_ONLINE
Definition: endpoints.h:57
enum ast_endpoint_state ast_endpoint_get_state(const struct ast_endpoint *endpoint)
Gets the state of the given endpoint.
const char * ast_endpoint_get_resource(const struct ast_endpoint *endpoint)
Gets the resource name of the given endpoint.
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:6928
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:4175
#define NULL
Definition: resample.c:96
Persistent endpoint information.
struct ast_endpoint * endpoint
Asterisk endpoint itself.

References ast_add_extension(), ast_endpoint_get_resource(), ast_endpoint_get_state(), AST_ENDPOINT_ONLINE, ast_exists_extension(), ast_free_ptr(), ast_strdup, sip_persistent_endpoint::endpoint, NULL, and regcontext.

Referenced by ast_sip_persistent_endpoint_add_to_regcontext().

◆ ami_show_endpoint()

static int ami_show_endpoint ( struct mansession s,
const struct message m 
)
static

Definition at line 1816 of file pjsip_configuration.c.

1817{
1818 struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"),
1819 .count = 0, };
1820 RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
1821 const char *endpoint_name = astman_get_header(m, "Endpoint");
1822 int count = 0;
1823
1824 if (ast_strlen_zero(endpoint_name)) {
1825 astman_send_error_va(s, m, "%s requires an endpoint name\n",
1827 return 0;
1828 }
1829
1830 if (!strncasecmp(endpoint_name, "pjsip/", 6)) {
1831 endpoint_name += 6;
1832 }
1833
1834 if (!(endpoint = ast_sorcery_retrieve_by_id(
1835 ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
1836 astman_send_error_va(s, m, "Unable to retrieve endpoint %s\n",
1837 endpoint_name);
1838 return 0;
1839 }
1840
1841 astman_send_listack(s, m, "Following are Events for each object associated with the Endpoint",
1842 "start");
1843
1844 /* the endpoint detail needs to always come first so apply as such */
1845 if (format_ami_endpoint(endpoint, &ami) ||
1846 ast_sip_format_endpoint_ami(endpoint, &ami, &count)) {
1847 astman_send_error_va(s, m, "Unable to format endpoint %s\n",
1848 endpoint_name);
1849 }
1850
1851 astman_send_list_complete_start(s, m, "EndpointDetailComplete", ami.count + 1);
1853
1854 return 0;
1855}
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
Definition: manager.c:2011
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:1974
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
Definition: manager.c:2047
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
Definition: manager.c:1630
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
Definition: manager.c:2055
static int format_ami_endpoint(const struct ast_sip_endpoint *endpoint, struct ast_sip_ami *ami)
#define AMI_SHOW_ENDPOINT
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
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
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:1853
AMI variable container.
Definition: res_pjsip.h:3047
struct mansession * s
Definition: res_pjsip.h:3049
const struct message * m
Definition: res_pjsip.h:3051

References AMI_SHOW_ENDPOINT, ao2_cleanup, ast_sip_format_endpoint_ami(), ast_sip_get_sorcery(), ast_sorcery_retrieve_by_id(), ast_strlen_zero(), astman_get_header(), astman_send_error_va(), astman_send_list_complete_end(), astman_send_list_complete_start(), astman_send_listack(), ast_sip_ami::count, format_ami_endpoint(), ast_sip_ami::m, NULL, RAII_VAR, and ast_sip_ami::s.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ami_show_endpoints()

static int ami_show_endpoints ( struct mansession s,
const struct message m 
)
static

Definition at line 1909 of file pjsip_configuration.c.

1910{
1911 struct ast_sip_ami ami = { .s = s, .m = m, .action_id = astman_get_header(m, "ActionID"), };
1913 int num;
1914
1916 if (!endpoints) {
1917 astman_send_error(s, m, "Could not get endpoints\n");
1918 return 0;
1919 }
1920
1921 if (!(num = ao2_container_count(endpoints))) {
1922 astman_send_error(s, m, "No endpoints found\n");
1923 return 0;
1924 }
1925
1926 astman_send_listack(s, m, "A listing of Endpoints follows, presented as EndpointList events",
1927 "start");
1928
1930
1931 astman_send_list_complete_start(s, m, "EndpointListComplete", num);
1933 return 0;
1934}
#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
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
@ OBJ_NODATA
Definition: astobj2.h:1044
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
Definition: manager.c:1969
static struct ao2_container * endpoints
struct ao2_container * ast_sip_get_endpoints(void)
Retrieve any endpoints available to sorcery.
static int format_ami_endpoints(void *obj, void *arg, int flags)
Generic container type.

References ao2_callback, ao2_cleanup, ao2_container_count(), ast_sip_get_endpoints(), astman_get_header(), astman_send_error(), astman_send_list_complete_end(), astman_send_list_complete_start(), astman_send_listack(), endpoints, format_ami_endpoints(), ast_sip_ami::m, NULL, OBJ_NODATA, RAII_VAR, and ast_sip_ami::s.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ast_res_pjsip_destroy_configuration()

void ast_res_pjsip_destroy_configuration ( void  )

Definition at line 2367 of file pjsip_configuration.c.

2368{
2369 if (!sip_sorcery) {
2370 return;
2371 }
2372
2379 sip_sorcery = NULL;
2387}
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
int ast_sip_destroy_sorcery_auth(void)
Definition: config_auth.c:426
int ast_sip_destroy_sorcery_global(void)
int ast_sip_destroy_sorcery_transport(void)
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition: manager.c:7606
static struct ast_cli_entry cli_commands[]
struct ast_sip_cli_formatter_entry * endpoint_formatter
static struct stasis_subscription * acl_change_sub
#define AMI_SHOW_ENDPOINTS
static struct ao2_container * persistent_endpoints
Container for persistent endpoint information.
int ast_sip_unregister_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Unregisters a CLI formatter.
Definition: pjsip_cli.c:326
void ast_sip_destroy_cli(void)
Definition: pjsip_cli.c:375
int ast_sip_destroy_sorcery_location(void)
Definition: location.c:1471
#define ast_sorcery_unref(sorcery)
Decrease the reference count of a sorcery structure.
Definition: sorcery.h:1500
struct stasis_subscription * stasis_unsubscribe_and_join(struct stasis_subscription *subscription)
Cancel a subscription, blocking until the last message is processed.
Definition: stasis.c:1135
#define ARRAY_LEN(a)
Definition: utils.h:666

References acl_change_sub, AMI_SHOW_ENDPOINT, AMI_SHOW_ENDPOINTS, ao2_cleanup, ARRAY_LEN, ast_cli_unregister_multiple(), ast_manager_unregister(), ast_sip_destroy_cli(), ast_sip_destroy_sorcery_auth(), ast_sip_destroy_sorcery_global(), ast_sip_destroy_sorcery_location(), ast_sip_destroy_sorcery_transport(), ast_sip_unregister_cli_formatter(), ast_sorcery_unref, cli_commands, endpoint_formatter, NULL, persistent_endpoints, sip_sorcery, and stasis_unsubscribe_and_join().

Referenced by unload_pjsip().

◆ ast_res_pjsip_initialize_configuration()

int ast_res_pjsip_initialize_configuration ( void  )

Definition at line 2113 of file pjsip_configuration.c.

2114{
2117 return -1;
2118 }
2119
2122 if (!persistent_endpoints) {
2123 return -1;
2124 }
2125
2126 if (!(sip_sorcery = ast_sorcery_open())) {
2127 ast_log(LOG_ERROR, "Failed to open SIP sorcery failed to open\n");
2128 return -1;
2129 }
2130
2132
2134 ast_log(LOG_ERROR, "Failed to register SIP authentication support\n");
2136 sip_sorcery = NULL;
2137 return -1;
2138 }
2139
2140 ast_sorcery_apply_default(sip_sorcery, "endpoint", "config", "pjsip.conf,criteria=type=endpoint");
2141 ast_sorcery_apply_default(sip_sorcery, "nat_hook", "memory", NULL);
2142
2144 ast_log(LOG_ERROR, "Failed to register SIP endpoint object with sorcery\n");
2146 sip_sorcery = NULL;
2147 return -1;
2148 }
2149
2151 ast_log(LOG_ERROR, "Failed to register nat_hook\n");
2152 }
2153
2154 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "type", "", OPT_NOOP_T, 0, 0);
2156 ast_sorcery_object_field_register_alias(sip_sorcery, "endpoint", "disallow", "", OPT_CODEC_T, 0, FLDSET(struct ast_sip_endpoint, media.codecs));
2157 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow", "", OPT_CODEC_T, 1, FLDSET(struct ast_sip_endpoint, media.codecs));
2158 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtmf_mode", "rfc4733", dtmf_handler, dtmf_to_str, NULL, 0, 0);
2159 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.ipv6));
2160 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_symmetric", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.symmetric));
2161 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "ice_support", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.ice_support));
2162 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "use_ptime", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.use_ptime));
2163 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "force_rport", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, nat.force_rport));
2164 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rewrite_contact", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, nat.rewrite_contact));
2165 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "transport", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, transport));
2166 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "outbound_proxy", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, outbound_proxy));
2167 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "moh_suggest", "default", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, mohsuggest));
2170 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_min_se", "90", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, extensions.timer.min_se));
2171 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_sess_expires", "1800", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, extensions.timer.sess_expires));
2176 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "bind_rtp_to_media_address", "no", OPT_BOOL_T, 1, STRFLDSET(struct ast_sip_endpoint, media.bind_rtp_to_media_address));
2177 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "identify_by", "username,ip", ident_handler, ident_to_str, NULL, 0, 0);
2178 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "direct_media", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.direct_media.enabled));
2180 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "trust_connected_line", "yes", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, id.trust_connected_line));
2181 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_connected_line", "yes", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, id.send_connected_line));
2184 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "disable_direct_media_on_nat", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.direct_media.disable_on_nat));
2186 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "callerid_privacy", "allowed_not_screened", caller_id_privacy_handler, caller_id_privacy_to_str, NULL, 0, 0);
2188 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "trust_id_inbound", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.trust_inbound));
2189 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "trust_id_outbound", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.trust_outbound));
2190 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_pai", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_pai));
2191 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_rpid", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_rpid));
2192 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rpid_immediate", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.rpid_immediate));
2193 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_diversion", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_diversion));
2194 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_history_info", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_history_info));
2195 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "mailboxes", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, subscription.mwi.mailboxes));
2197 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "aggregate_mwi", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, subscription.mwi.aggregate));
2198 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "mwi_subscribe_replaces_unsolicited", "no", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, subscription.mwi.subscribe_replaces_unsolicited));
2200 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "use_avpf", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.use_avpf));
2201 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "force_avp", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.force_avp));
2202 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "media_use_received_transport", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.use_received_transport));
2203 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_keepalive", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.rtp.keepalive));
2204 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_timeout", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.rtp.timeout));
2205 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_timeout_hold", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.rtp.timeout_hold));
2206 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "one_touch_recording", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, info.recording.enabled));
2207 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "inband_progress", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, inband_progress));
2212 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "device_state_busy_at", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, devicestate_busy_at));
2213 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.enabled));
2215 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_maxdatagram", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.t38.maxdatagram));
2216 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "fax_detect", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, faxdetect));
2217 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "fax_detect_timeout", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, faxdetect_timeout));
2218 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_nat", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.nat));
2219 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_udptl_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.ipv6));
2220 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "t38_bind_udptl_to_media_address", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.t38.bind_udptl_to_media_address));
2221 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "tone_zone", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, zone));
2223 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "record_on_feature", "automixmon", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, info.recording.onfeature));
2224 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "record_off_feature", "automixmon", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, info.recording.offfeature));
2225 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_transfer", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allowtransfer));
2226 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "user_eq_phone", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, usereqphone));
2227 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "moh_passthrough", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, moh_passthrough));
2228 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sdp_owner", "-", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.sdpowner));
2229 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sdp_session", "Asterisk", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.sdpsession));
2232 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "cos_audio", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.cos_audio));
2233 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "cos_video", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.cos_video));
2234 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_subscribe", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, subscription.allow));
2235 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sub_min_expiry", "0", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, subscription.minexpiry));
2237 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "from_domain", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, fromdomain));
2238 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "mwi_from_user", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, subscription.mwi.fromuser));
2239 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_engine", "asterisk", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.rtp.engine));
2242 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_auto_generate_cert", "no", dtls_handler, dtlsautogeneratecert_to_str, NULL, 0, 0);
2250 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "srtp_tag_32", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.srtp_tag_32));
2251 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "media_encryption_optimistic", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.encryption_optimistic));
2252 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "g726_non_standard", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.g726_non_standard));
2253 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "redirect_method", "user", redirect_handler, NULL, NULL, 0, 0);
2255 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "message_context", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, message_context));
2260 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_deny", "", endpoint_acl_handler, NULL, NULL, 0, 0);
2261 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_permit", "", endpoint_acl_handler, NULL, NULL, 0, 0);
2263 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "subscribe_context", "", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct ast_sip_endpoint, subscription.context));
2265 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "preferred_codec_only", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, preferred_codec_only));
2266 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "asymmetric_rtp_codec", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, asymmetric_rtp_codec));
2267 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtcp_mux", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtcp_mux));
2268 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_overlap", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allow_overlap));
2269 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "overlap_context", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, overlap_context));
2270 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "refer_blind_progress", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, refer_blind_progress));
2271 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "notify_early_inuse_ringing", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, notify_early_inuse_ringing));
2272 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "max_audio_streams", "1", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.max_audio_streams));
2273 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "max_video_streams", "1", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, media.max_video_streams));
2274 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "bundle", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.bundle));
2275 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "webrtc", "no", OPT_YESNO_T, 1, FLDSET(struct ast_sip_endpoint, media.webrtc));
2276 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "incoming_mwi_mailbox", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, incoming_mwi_mailbox));
2277 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "follow_early_media_fork", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.follow_early_media_fork));
2278 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "accept_multiple_sdp_answers", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.accept_multiple_sdp_answers));
2279 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "suppress_q850_reason_headers", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, suppress_q850_reason_headers));
2280 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "ignore_183_without_sdp", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, ignore_183_without_sdp));
2281 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "incoming_call_offer_pref", "local",
2283 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "outgoing_call_offer_pref", "remote_merge",
2285 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_incoming_offer",
2286 "prefer: pending, operation: intersect, keep: all, transcode: allow",
2288 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_outgoing_offer",
2289 "prefer: pending, operation: union, keep: all, transcode: allow",
2291 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_incoming_answer",
2292 "prefer: pending, operation: intersect, keep: all",
2294 ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "codec_prefs_outgoing_answer",
2295 "prefer: pending, operation: intersect, keep: all",
2298 "stir_shaken", 0, stir_shaken_handler, stir_shaken_to_str, NULL, 0, 0);
2299 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "stir_shaken_profile", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, stir_shaken_profile));
2300 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_unauthenticated_options", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allow_unauthenticated_options));
2301 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "geoloc_incoming_call_profile", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, geoloc_incoming_call_profile));
2302 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "geoloc_outgoing_call_profile", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, geoloc_outgoing_call_profile));
2305 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_aoc", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, send_aoc));
2306 ast_sorcery_object_field_register(sip_sorcery, "endpoint", "tenantid", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, tenantid));
2307
2309 ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
2311 sip_sorcery = NULL;
2312 return -1;
2313 }
2314
2316 ast_log(LOG_ERROR, "Failed to register SIP location support with sorcery\n");
2318 sip_sorcery = NULL;
2319 return -1;
2320 }
2321
2323
2325 ast_log(LOG_ERROR, "Failed to register SIP domain aliases support with sorcery\n");
2327 sip_sorcery = NULL;
2328 return -1;
2329 }
2330
2332 ast_log(LOG_ERROR, "Failed to register SIP Global support\n");
2334 sip_sorcery = NULL;
2335 return -1;
2336 }
2337
2339 if (!endpoint_formatter) {
2340 ast_log(LOG_ERROR, "Unable to allocate memory for endpoint_formatter\n");
2342 sip_sorcery = NULL;
2343 return -1;
2344 }
2345 endpoint_formatter->name = "endpoint";
2352
2355
2357
2359
2363
2364 return 0;
2365}
#define ast_log
Definition: astobj2.c:42
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
#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 char language[MAX_LANGUAGE]
Definition: chan_iax2.c:324
static char accountcode[AST_MAX_ACCOUNT_CODE]
Definition: chan_iax2.c:473
static char mohsuggest[MAX_MUSICCLASS]
Definition: chan_iax2.c:475
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
int ast_sip_initialize_sorcery_auth(void)
Initialize sorcery with auth support.
Definition: config_auth.c:370
int ast_sip_initialize_sorcery_domain_alias(void)
Initialize sorcery with domain alias support.
int ast_sip_initialize_sorcery_global(void)
#define STRFLDSET(type,...)
Convert a struct and a list of stringfield fields to an argument list of field offsets.
#define FLDSET(type,...)
Convert a struct and list of fields to an argument list of field offsets.
#define CHARFLDSET(type, field)
A helper macro to pass the appropriate arguments to aco_option_register for OPT_CHAR_ARRAY_T.
@ OPT_UINT_T
Type for default option handler for unsigned integers.
@ OPT_NOOP_T
Type for a default handler that should do nothing.
@ OPT_CODEC_T
Type for default option handler for format capabilities.
@ OPT_BOOL_T
Type for default option handler for bools (ast_true/ast_false)
@ OPT_CHAR_ARRAY_T
Type for default option handler for character array strings.
@ OPT_YESNO_T
Type for default option handler for bools (ast_true/ast_false)
@ OPT_STRINGFIELD_T
Type for default option handler for stringfields.
int ast_sip_initialize_sorcery_transport(void)
Initialize sorcery with transport support.
#define LOG_ERROR
#define EVENT_FLAG_SYSTEM
Definition: manager.h:75
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
Definition: manager.h:191
def info(msg)
static int tos_video_to_str(const void *obj, const intptr_t *args, char **buf)
static int t38udptl_ec_to_str(const void *obj, const intptr_t *args, char **buf)
static int connected_line_method_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int outgoing_answer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int codec_prefs_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static void load_all_endpoints(void)
static int from_user_to_str(const void *obj, const intptr_t *args, char **buf)
static void * sip_nat_hook_alloc(const char *name)
static int prack_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int set_var_to_vl(const void *obj, struct ast_variable **fields)
static int redirect_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int media_address_to_str(const void *obj, const intptr_t *args, char **buf)
static int stir_shaken_to_str(const void *obj, const intptr_t *args, char **buf)
#define PERSISTENT_BUCKETS
Number of buckets for persistent endpoint information.
static int stir_shaken_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int incoming_offer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_privacy_to_str(const void *obj, const intptr_t *args, char **buf)
static int pickupgroup_to_str(const void *obj, const intptr_t *args, char **buf)
static int cli_endpoint_print_body(void *obj, void *arg, int flags)
void * ast_sip_endpoint_alloc(const char *name)
Allocate a new SIP endpoint.
static int contact_user_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int ident_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int tos_audio_to_str(const void *obj, const intptr_t *args, char **buf)
static int direct_media_method_to_str(const void *obj, const intptr_t *args, char **buf)
static int call_offer_pref_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int dtlsverify_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtls_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int media_encryption_to_str(const void *obj, const intptr_t *args, char **buf)
static int ami_show_endpoints(struct mansession *s, const struct message *m)
static int dtmf_to_str(const void *obj, const intptr_t *args, char **buf)
static int outbound_auth_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static const struct ast_sorcery_observer endpoint_observers
static int group_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int ami_show_endpoint(struct mansession *s, const struct message *m)
static int outgoing_offer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int contact_user_to_str(const void *obj, const intptr_t *args, char **buf)
static int voicemail_extension_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlscapath_to_str(const void *obj, const intptr_t *args, char **buf)
static int contact_acl_to_str(const void *obj, const intptr_t *args, char **buf)
static int set_var_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int named_callgroups_to_str(const void *obj, const intptr_t *args, char **buf)
static int security_negotiation_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int dtlscipher_to_str(const void *obj, const intptr_t *args, char **buf)
static int t38udptl_ec_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int named_pickupgroups_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_tag_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_to_str(const void *obj, const intptr_t *args, char **buf)
static int incoming_answer_codec_prefs_to_str(const void *obj, const intptr_t *args, char **buf)
static int cli_endpoint_iterate(void *obj, ao2_callback_fn callback, void *args)
static int security_mechanism_to_str(const void *obj, const intptr_t *args, char **buf)
static int prack_to_str(const void *obj, const intptr_t *args, char **buf)
static int caller_id_tag_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int cli_endpoint_print_header(void *obj, void *arg, int flags)
static int dtlsfingerprint_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlsautogeneratecert_to_str(const void *obj, const intptr_t *args, char **buf)
static int voicemail_extension_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int callgroup_to_str(const void *obj, const intptr_t *args, char **buf)
static int outbound_auths_to_str(const void *obj, const intptr_t *args, char **buf)
static int sip_endpoint_apply_handler(const struct ast_sorcery *sorcery, void *obj)
Callback function for when an object is finalized.
static int connected_line_method_to_str(const void *obj, const intptr_t *args, char **buf)
static int media_encryption_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int persistent_endpoint_cmp(void *obj, void *arg, int flags)
Comparison function for persistent endpoint information.
static void * cli_endpoint_retrieve_by_id(const char *id)
static int inbound_auth_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int incoming_call_offer_pref_to_str(const void *obj, const intptr_t *args, char **buf)
static int inbound_auths_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlsrekey_to_str(const void *obj, const intptr_t *args, char **buf)
static int outgoing_call_offer_pref_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtmf_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int endpoint_acl_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int from_user_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int set_var_to_str(const void *obj, const intptr_t *args, char **buf)
static int security_negotiation_to_str(const void *obj, const intptr_t *args, char **buf)
static int direct_media_glare_mitigation_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlssetup_to_str(const void *obj, const intptr_t *args, char **buf)
static int tos_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int caller_id_privacy_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int acl_to_str(const void *obj, const intptr_t *args, char **buf)
static int security_mechanism_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int media_address_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int direct_media_glare_mitigation_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int ident_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlscafile_to_str(const void *obj, const intptr_t *args, char **buf)
static int dtlscertfile_to_str(const void *obj, const intptr_t *args, char **buf)
static int timers_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int direct_media_method_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static struct ao2_container * cli_endpoint_get_container(const char *regex)
static void acl_change_stasis_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
static int dtlsprivatekey_to_str(const void *obj, const intptr_t *args, char **buf)
static int persistent_endpoint_hash(const void *obj, const int flags)
Hashing function for persistent endpoint information.
static int named_groups_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int caller_id_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int timers_to_str(const void *obj, const intptr_t *args, char **buf)
int ast_sip_register_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Registers a CLI formatter.
Definition: pjsip_cli.c:310
int ast_sip_initialize_sorcery_location(void)
Initialize sorcery with location support.
Definition: location.c:1369
int ast_sip_initialize_cli(void)
Definition: pjsip_cli.c:360
struct stasis_topic * ast_security_topic(void)
A stasis_topic which publishes messages for security related issues.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition: sorcery.c:2317
void ast_sorcery_load(const struct ast_sorcery *sorcery)
Inform any wizards to load persistent objects.
Definition: sorcery.c:1377
#define ast_sorcery_object_field_register_alias(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object as an alias.
Definition: sorcery.h:971
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
Definition: sorcery.h:837
int ast_sorcery_observer_add(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
Add an observer to a specific object type.
Definition: sorcery.c:2391
#define ast_sorcery_internal_object_register(sorcery, type, alloc, transform, apply)
Register an internal, hidden object type.
Definition: sorcery.h:867
#define ast_sorcery_object_field_register_custom(sorcery, type, name, default_val, config_handler, sorcery_handler, multiple_handler, flags,...)
Register a field within an object with custom handlers.
Definition: sorcery.h:1005
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
Definition: sorcery.h:955
#define ast_sorcery_apply_default(sorcery, type, name, data)
Definition: sorcery.h:476
#define ast_sorcery_open()
Open a new sorcery structure.
Definition: sorcery.h:406
@ STASIS_SUBSCRIPTION_FILTER_SELECTIVE
Definition: stasis.h:297
int stasis_subscription_accept_message_type(struct stasis_subscription *subscription, const struct stasis_message_type *type)
Indicate to a subscription that we are interested in a message type.
Definition: stasis.c:1024
int stasis_subscription_set_filter(struct stasis_subscription *subscription, enum stasis_subscription_message_filter filter)
Set the message type filtering level on a subscription.
Definition: stasis.c:1078
#define stasis_subscribe(topic, callback, data)
Definition: stasis.h:649
CLI Formatter Registry Entry.
Definition: res_pjsip_cli.h:52
int(* iterate)(void *container, ao2_callback_fn callback, void *args)
Definition: res_pjsip_cli.h:66
ao2_callback_fn * print_header
Definition: res_pjsip_cli.h:60
void *(* retrieve_by_id)(const char *id)
Definition: res_pjsip_cli.h:68
const char *(* get_id)(const void *obj)
Definition: res_pjsip_cli.h:70
const char * name
Definition: res_pjsip_cli.h:58
ao2_callback_fn * print_body
Definition: res_pjsip_cli.h:62
struct ao2_container *(* get_container)(const char *regex)
Definition: res_pjsip_cli.h:64
const ast_string_field context
Definition: res_pjsip.h:992
const ast_string_field fromuser
Definition: res_pjsip.h:992
struct ast_sip_endpoint_nat_configuration nat
Definition: res_pjsip.h:1000

References accountcode, acl_change_stasis_cb(), acl_change_sub, acl_to_str(), AMI_SHOW_ENDPOINT, ami_show_endpoint(), AMI_SHOW_ENDPOINTS, ami_show_endpoints(), ao2_alloc, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ARRAY_LEN, ast_cli_register_multiple, ast_log, ast_manager_register_xml, ast_named_acl_change_type(), ast_security_topic(), ast_sip_endpoint_alloc(), ast_sip_initialize_cli(), 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_register_cli_formatter(), ast_sorcery_apply_default, ast_sorcery_internal_object_register, ast_sorcery_load(), ast_sorcery_object_field_register, ast_sorcery_object_field_register_alias, ast_sorcery_object_field_register_custom, ast_sorcery_object_get_id(), ast_sorcery_object_register, ast_sorcery_observer_add(), ast_sorcery_open, ast_sorcery_unref, call_offer_pref_handler(), caller_id_handler(), caller_id_privacy_handler(), caller_id_privacy_to_str(), caller_id_tag_handler(), caller_id_tag_to_str(), caller_id_to_str(), callgroup_to_str(), CHARFLDSET, cli_commands, cli_endpoint_get_container(), cli_endpoint_iterate(), cli_endpoint_print_body(), cli_endpoint_print_header(), cli_endpoint_retrieve_by_id(), codec_prefs_handler(), connected_line_method_handler(), connected_line_method_to_str(), contact_acl_to_str(), contact_user_handler(), contact_user_to_str(), voicemailpwcheck::context, ast_sip_endpoint::context, direct_media_glare_mitigation_handler(), direct_media_glare_mitigation_to_str(), direct_media_method_handler(), direct_media_method_to_str(), dtls_handler(), dtlsautogeneratecert_to_str(), dtlscafile_to_str(), dtlscapath_to_str(), dtlscertfile_to_str(), dtlscipher_to_str(), dtlsfingerprint_to_str(), dtlsprivatekey_to_str(), dtlsrekey_to_str(), dtlssetup_to_str(), dtlsverify_to_str(), dtmf_handler(), dtmf_to_str(), endpoint_acl_handler(), endpoint_formatter, endpoint_observers, EVENT_FLAG_SYSTEM, FLDSET, from_user_handler(), from_user_to_str(), ast_sip_endpoint::fromuser, ast_sip_cli_formatter_entry::get_container, ast_sip_cli_formatter_entry::get_id, group_handler(), ident_handler(), ident_to_str(), inbound_auth_handler(), inbound_auths_to_str(), incoming_answer_codec_prefs_to_str(), incoming_call_offer_pref_to_str(), incoming_offer_codec_prefs_to_str(), sip_to_pjsip::info(), ast_sip_cli_formatter_entry::iterate, language, load_all_endpoints(), LOG_ERROR, media_address_handler(), media_address_to_str(), media_encryption_handler(), media_encryption_to_str(), mohsuggest, ast_sip_cli_formatter_entry::name, named_callgroups_to_str(), named_groups_handler(), named_pickupgroups_to_str(), ast_sip_endpoint::nat, NULL, OPT_BOOL_T, OPT_CHAR_ARRAY_T, OPT_CODEC_T, OPT_NOOP_T, OPT_STRINGFIELD_T, OPT_UINT_T, OPT_YESNO_T, outbound_auth_handler(), outbound_auths_to_str(), outgoing_answer_codec_prefs_to_str(), outgoing_call_offer_pref_to_str(), outgoing_offer_codec_prefs_to_str(), PERSISTENT_BUCKETS, persistent_endpoint_cmp(), persistent_endpoint_hash(), persistent_endpoints, pickupgroup_to_str(), prack_handler(), prack_to_str(), ast_sip_cli_formatter_entry::print_body, ast_sip_cli_formatter_entry::print_header, redirect_handler(), ast_sip_cli_formatter_entry::retrieve_by_id, security_mechanism_handler(), security_mechanism_to_str(), security_negotiation_handler(), security_negotiation_to_str(), set_var_handler(), set_var_to_str(), set_var_to_vl(), sip_endpoint_apply_handler(), sip_nat_hook_alloc(), sip_sorcery, stasis_subscribe, stasis_subscription_accept_message_type(), STASIS_SUBSCRIPTION_FILTER_SELECTIVE, stasis_subscription_set_filter(), stir_shaken_handler(), stir_shaken_to_str(), STRFLDSET, t38udptl_ec_handler(), t38udptl_ec_to_str(), timers_handler(), timers_to_str(), tos_audio_to_str(), tos_handler(), tos_video_to_str(), voicemail_extension_handler(), and voicemail_extension_to_str().

Referenced by load_module().

◆ ast_res_pjsip_reload_configuration()

int ast_res_pjsip_reload_configuration ( void  )

Definition at line 2389 of file pjsip_configuration.c.

2390{
2391 if (sip_sorcery) {
2393 }
2394 return 0;
2395}
void ast_sorcery_reload(const struct ast_sorcery *sorcery)
Inform any wizards to reload persistent objects.
Definition: sorcery.c:1408

References ast_sorcery_reload(), and sip_sorcery.

Referenced by reload_configuration_task().

◆ 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_free(a)
Definition: astmm.h:180
static const char name[]
Definition: format_mp3.c:68
#define AST_VECTOR_SIZE(vec)
Get the number of elements in a vector.
Definition: vector.h:609
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition: vector.h:174
#define AST_VECTOR_REMOVE_UNORDERED(vec, idx)
Remove an element from an unordered vector by index.
Definition: vector.h:438

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}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
char * strsep(char **str, const char *delims)
void ast_sip_auth_vector_destroy(struct ast_sip_auth_vector *auths)
Free contents of an auth vector.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223
Definition: ast_expr2.c:325
int value
Definition: syslog.c:37
#define ast_assert(a)
Definition: utils.h:739
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition: vector.h:113
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
Definition: vector.h:256

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(), 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:2378
const char ** elems
Definition: res_pjsip.h:604

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(), and outbound_auths_to_str().

◆ 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 2536 of file pjsip_configuration.c.

2537{
2538 int i;
2539 for (i = 0; i < num_auths; ++i) {
2540 ao2_cleanup(auths[i]);
2541 }
2542}

References ao2_cleanup.

Referenced by digest_check_auth(), and set_outbound_initial_authentication_credentials().

◆ 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 1724 of file pjsip_configuration.c.

1725{
1727
1728 if (!(buf)) {
1729 astman_send_error_va(ami->s, ami->m, "Unable create event "
1730 "for %s\n", event);
1731 return NULL;
1732 }
1733
1734 ast_str_set(&buf, 0, "Event: %s\r\n", event);
1735 if (!ast_strlen_zero(ami->action_id)) {
1736 ast_str_append(&buf, 0, "ActionID: %s\r\n", ami->action_id);
1737 }
1738 return buf;
1739}
#define AMI_DEFAULT_STR_SIZE
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
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
const char * action_id
Definition: res_pjsip.h:3053
Definition: astman.c:222

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_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 2512 of file pjsip_configuration.c.

2513{
2516 sip_sorcery, "endpoint", name);
2517}
char * ast_sip_global_default_outbound_endpoint(void)

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_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 2455 of file pjsip_configuration.c.

2456{
2457 struct ast_sip_endpoint *endpoint = ast_sorcery_generic_alloc(sizeof(*endpoint), endpoint_destructor);
2458 if (!endpoint) {
2459 return NULL;
2460 }
2461 if (ast_string_field_init(endpoint, 64)) {
2462 ao2_cleanup(endpoint);
2463 return NULL;
2464 }
2465
2466 if (ast_string_field_init_extended(endpoint, geoloc_incoming_call_profile) ||
2467 ast_string_field_init_extended(endpoint, geoloc_outgoing_call_profile)) {
2468 ao2_cleanup(endpoint);
2469 return NULL;
2470 }
2471 if (ast_string_field_init_extended(endpoint, overlap_context)) {
2472 ao2_cleanup(endpoint);
2473 return NULL;
2474 }
2475
2477 ao2_cleanup(endpoint);
2478 return NULL;
2479 }
2481 ao2_cleanup(endpoint);
2482 return NULL;
2483 }
2484 if (init_info_configuration(&endpoint->info)) {
2485 ao2_cleanup(endpoint);
2486 return NULL;
2487 }
2488 if (init_media_configuration(&endpoint->media)) {
2489 ao2_cleanup(endpoint);
2490 return NULL;
2491 }
2492
2493 ast_party_id_init(&endpoint->id.self);
2494 endpoint->id.self.tag = ast_strdup("");
2495
2496 if (AST_VECTOR_INIT(&endpoint->ident_method_order, 1)) {
2497 return NULL;
2498 }
2499
2500 return endpoint;
2501}
void ast_party_id_init(struct ast_party_id *init)
Initialize the given party id structure.
Definition: channel.c:1776
@ 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:1728
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
#define ast_string_field_init_extended(x, field)
Initialize an extended string field.
Definition: stringfields.h:401
char * tag
User-set "tag".
Definition: channel.h:356
struct ast_party_id self
Definition: res_pjsip.h:770
struct ast_format_cap * codecs
Definition: res_pjsip.h:919
struct ast_sip_endpoint_id_configuration id
Definition: res_pjsip.h:1002
struct ast_sip_identify_by_vector ident_method_order
Definition: res_pjsip.h:1016
struct ast_sip_endpoint_media_configuration media
Definition: res_pjsip.h:996
struct ast_sip_endpoint_subscription_configuration subscription
Definition: res_pjsip.h:998
struct ast_sip_endpoint_info_configuration info
Definition: res_pjsip.h:1004

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_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 1690 of file pjsip_configuration.c.

1693{
1694 RAII_VAR(struct ast_endpoint_snapshot *, endpoint_snapshot, ast_sip_get_endpoint_snapshot(endpoint), ao2_cleanup);
1695 return ast_sip_for_each_channel_snapshot(endpoint_snapshot, on_channel_snapshot, arg);
1696}

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 1663 of file pjsip_configuration.c.

1666{
1667 int num, num_channels = endpoint_snapshot->num_channels;
1668
1669 if (!on_channel_snapshot || !num_channels) {
1670 return 0;
1671 }
1672
1673 for (num = 0; num < num_channels; ++num) {
1674 RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
1675 int res;
1676
1677 snapshot = ast_channel_snapshot_get_latest(endpoint_snapshot->channel_ids[num]);
1678 if (!snapshot) {
1679 continue;
1680 }
1681
1682 res = on_channel_snapshot(snapshot, arg, 0);
1683 if (res) {
1684 return -1;
1685 }
1686 }
1687 return 0;
1688}
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,...

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

Referenced by active_channels_to_str(), and ast_sip_for_each_channel().

◆ 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 1647 of file pjsip_configuration.c.

1648{
1649 char device[MAX_OBJECT_FIELD];
1650
1651 snprintf(device, MAX_OBJECT_FIELD, "PJSIP/%s", ast_sorcery_object_get_id(endpoint));
1652 return ast_devstate2str(ast_device_state(device));
1653}
const char * ast_devstate2str(enum ast_device_state devstate) attribute_pure
Convert device state to text string for output.
Definition: devicestate.c:237
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_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 1655 of file pjsip_configuration.c.

1657{
1661}
const char * ast_endpoint_get_tech(const struct ast_endpoint *endpoint)
Gets the technology 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.
struct ast_endpoint * persistent
Definition: res_pjsip.h:1020

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 2503 of file pjsip_configuration.c.

2504{
2505 struct ao2_container *endpoints;
2506
2508
2509 return endpoints;
2510}
@ 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:1897

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_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 2563 of file pjsip_configuration.c.

2564{
2565 return sip_sorcery;
2566}

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_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_iterate(), cli_iterator(), cli_qualify(), cli_reload_qualify_aor(), cli_reload_qualify_endpoint(), 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(), handle_atsign(), handle_export_primitives(), handle_registration_response(), handle_single_token(), handle_slash(), line_identify(), 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(), 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(), and unload_module().

◆ ast_sip_persistent_endpoint_add_to_regcontext()

int ast_sip_persistent_endpoint_add_to_regcontext ( const char *  regcontext)

Definition at line 1415 of file pjsip_configuration.c.

1416{
1418 return 0;
1419 }
1420
1421 /* Make sure the regcontext exists */
1423 ast_log(LOG_ERROR, "Failed to create regcontext '%s'\n", regcontext);
1424 return -1;
1425 }
1426
1427 /* Add any online endpoints */
1429 return 0;
1430}
struct ast_context * ast_context_find_or_create(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)
Register a new context or find an existing one.
Definition: pbx.c:6149
static int add_to_regcontext(void *obj, void *arg, int flags)

References add_to_regcontext(), ao2_callback, ast_context_find_or_create(), ast_log, ast_strlen_zero(), LOG_ERROR, NULL, OBJ_NODATA, persistent_endpoints, and regcontext.

Referenced by check_regcontext().

◆ 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 1489 of file pjsip_configuration.c.

1490{
1491 struct sip_persistent_endpoint *persistent;
1492 struct ast_json *blob;
1493 char rtt[32];
1494
1495 persistent = ao2_find(persistent_endpoints, endpoint_name, OBJ_SEARCH_KEY);
1496 if (!persistent) {
1497 return;
1498 }
1499
1500 snprintf(rtt, sizeof(rtt), "%" PRId64, contact_status->rtt);
1501 blob = ast_json_pack("{s: s, s: s, s: s, s: s, s: s}",
1502 "contact_status", ast_sip_get_contact_status_label(contact_status->status),
1503 "aor", contact_status->aor,
1504 "uri", contact_status->uri,
1505 "roundtrip_usec", rtt,
1506 "endpoint_name", ast_endpoint_get_resource(persistent->endpoint));
1507 if (blob) {
1509 ast_json_unref(blob);
1510 }
1511
1512 ao2_ref(persistent, -1);
1513}
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
@ OBJ_SEARCH_KEY
The arg parameter is a search key, but is not an object.
Definition: astobj2.h:1101
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
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.
Abstract JSON element (object, array, string, int, ...).
const ast_string_field uri
Definition: res_pjsip.h:457
enum ast_sip_contact_status_type status
Definition: res_pjsip.h:468
const ast_string_field aor
Definition: res_pjsip.h:457

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 1432 of file pjsip_configuration.c.

1433{
1434 struct sip_persistent_endpoint *persistent;
1435 struct ast_json *blob;
1436 char *regcontext;
1437
1438 persistent = ao2_find(persistent_endpoints, endpoint_name, OBJ_SEARCH_KEY);
1439 if (!persistent) {
1440 return -1;
1441 }
1442
1443 /* If there was no state change, don't publish anything. */
1444 if (ast_endpoint_get_state(persistent->endpoint) == state) {
1445 ao2_ref(persistent, -1);
1446 return 0;
1447 }
1448
1450
1451 if (state == AST_ENDPOINT_ONLINE) {
1453 blob = ast_json_pack("{s: s}", "peer_status", "Reachable");
1454
1458 "Noop", ast_strdup(ast_endpoint_get_resource(persistent->endpoint)), ast_free_ptr, "PJSIP");
1459 }
1460 }
1461
1462 ast_verb(2, "Endpoint %s is now Reachable\n", ast_endpoint_get_resource(persistent->endpoint));
1463 } else {
1465 blob = ast_json_pack("{s: s}", "peer_status", "Unreachable");
1466
1468 struct pbx_find_info q = { .stacklen = 0 };
1469
1472 }
1473 }
1474
1475 ast_verb(2, "Endpoint %s is now Unreachable\n", ast_endpoint_get_resource(persistent->endpoint));
1476 }
1477
1479
1481 ast_json_unref(blob);
1483
1484 ao2_ref(persistent, -1);
1485
1486 return 0;
1487}
@ 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.
Definition: devicestate.c:510
@ AST_DEVICE_UNKNOWN
Definition: devicestate.h:53
@ AST_ENDPOINT_OFFLINE
Definition: endpoints.h:55
void ast_endpoint_set_state(struct ast_endpoint *endpoint, enum ast_endpoint_state state)
Updates 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_context_remove_extension(const char *context, const char *extension, int priority, const char *registrar)
Simply remove extension from context.
Definition: pbx.c:4948
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
char * ast_sip_get_regcontext(void)
Retrieve the global regcontext setting.
int stacklen
Definition: extconf.h:237

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_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 2519 of file pjsip_configuration.c.

2520{
2521 int i;
2522
2523 for (i = 0; i < AST_VECTOR_SIZE(auths); ++i) {
2524 /* Using AST_VECTOR_GET is safe since the vector is immutable */
2525 const char *name = AST_VECTOR_GET(auths, i);
2527 if (!out[i]) {
2528 ast_log(LOG_NOTICE, "Couldn't find auth '%s'. Cannot authenticate\n", name);
2529 return -1;
2530 }
2531 }
2532
2533 return 0;
2534}
#define LOG_NOTICE
#define SIP_SORCERY_AUTH_TYPE
Definition: res_pjsip.h:577
FILE * out
Definition: utils/frame.c:33
#define AST_VECTOR_GET(vec, idx)
Get an element from a vector.
Definition: vector.h:680

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 2544 of file pjsip_configuration.c.

2546{
2547 int i;
2548
2549 for (i = 0; i < AST_VECTOR_SIZE(auth_ids); ++i) {
2550 /* Using AST_VECTOR_GET is safe since the vector is immutable */
2551 const char *name = AST_VECTOR_GET(auth_ids, i);
2553 if (!auth_object) {
2554 ast_log(LOG_WARNING, "Auth object '%s' could not be found\n", name);
2555 } else {
2556 AST_VECTOR_APPEND(auth_objects, auth_object);
2557 }
2558 }
2559
2560 return AST_VECTOR_SIZE(auth_objects) == AST_VECTOR_SIZE(auth_ids) ? 0 : -1;
2561}
#define LOG_WARNING

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_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}
@ AST_SIP_SECURITY_NEG_MEDIASEC
Definition: res_pjsip.h:357
@ AST_SIP_SECURITY_NEG_NONE
Definition: res_pjsip.h:355

References AST_SIP_SECURITY_NEG_MEDIASEC, AST_SIP_SECURITY_NEG_NONE, and ast_sip_endpoint::security_negotiation.

Referenced by security_negotiation_handler().

◆ 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 1749 of file pjsip_configuration.c.

1750{
1753 struct ast_variable *i;
1754
1755 if (!objset) {
1756 return -1;
1757 }
1758
1760
1761 for (i = objset; i; i = i->next) {
1762 RAII_VAR(char *, camel, ast_to_camel_case(i->name), ast_free);
1763 ast_str_append(buf, 0, "%s: %s\r\n", camel, i->value);
1764 }
1765
1766 return 0;
1767}
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: extconf.c:1262
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:1511
#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
Structure for variables, used for configurations and for channel variables.
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().

◆ call_offer_pref_handler()

static int call_offer_pref_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1227 of file pjsip_configuration.c.

1229{
1230 struct ast_sip_endpoint *endpoint = obj;
1231 struct ast_flags pref = { 0, };
1232 int outgoing = strcmp(var->name, "outgoing_call_offer_pref") == 0;
1233
1234 int res = ast_sip_call_codec_str_to_pref(&pref, var->value, outgoing);
1235 if (res != 0) {
1236 return -1;
1237 }
1238
1239 if (outgoing) {
1240 endpoint->media.outgoing_call_offer_pref = pref;
1241 } else {
1242 endpoint->media.incoming_call_offer_pref = pref;
1243 }
1244
1245 return 0;
1246}
#define var
Definition: ast_expr2f.c:605
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
Structure used to handle boolean flags.
Definition: utils.h:199
struct ast_flags incoming_call_offer_pref
Definition: res_pjsip.h:945
struct ast_flags outgoing_call_offer_pref
Definition: res_pjsip.h:947

References ast_sip_call_codec_str_to_pref(), ast_sip_endpoint_media_configuration::incoming_call_offer_pref, ast_sip_endpoint::media, ast_sip_endpoint_media_configuration::outgoing_call_offer_pref, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_handler()

static int caller_id_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 677 of file pjsip_configuration.c.

678{
679 struct ast_sip_endpoint *endpoint = obj;
680 char cid_name[80] = { '\0' };
681 char cid_num[80] = { '\0' };
682
683 ast_free(endpoint->id.self.name.str);
684 endpoint->id.self.name.str = NULL;
685 endpoint->id.self.name.valid = 0;
686 ast_free(endpoint->id.self.number.str);
687 endpoint->id.self.number.str = NULL;
688 endpoint->id.self.number.valid = 0;
689
690 ast_callerid_split(var->value, cid_name, sizeof(cid_name), cid_num, sizeof(cid_num));
691 if (!ast_strlen_zero(cid_name)) {
692 endpoint->id.self.name.str = ast_strdup(cid_name);
693 if (!endpoint->id.self.name.str) {
694 return -1;
695 }
696 endpoint->id.self.name.valid = 1;
697 }
698 if (!ast_strlen_zero(cid_num)) {
699 endpoint->id.self.number.str = ast_strdup(cid_num);
700 if (!endpoint->id.self.number.str) {
701 return -1;
702 }
703 endpoint->id.self.number.valid = 1;
704 }
705 return 0;
706}
int ast_callerid_split(const char *src, char *name, int namelen, char *num, int numlen)
Definition: callerid.c:1292
struct ast_party_name name
Subscriber name.
Definition: channel.h:342
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:344
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:281
char * str
Subscriber name (Malloced)
Definition: channel.h:266
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:299
char * str
Subscriber phone number (Malloced)
Definition: channel.h:293

References ast_callerid_split(), ast_free, ast_strdup, ast_strlen_zero(), ast_sip_endpoint::id, ast_party_id::name, NULL, ast_party_id::number, ast_sip_endpoint_id_configuration::self, ast_party_name::str, ast_party_number::str, ast_party_name::valid, ast_party_number::valid, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_privacy_handler()

static int caller_id_privacy_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 731 of file pjsip_configuration.c.

732{
733 struct ast_sip_endpoint *endpoint = obj;
734 int callingpres = ast_parse_caller_presentation(var->value);
735 if (callingpres == -1 && sscanf(var->value, "%d", &callingpres) != 1) {
736 return -1;
737 }
738 endpoint->id.self.number.presentation = callingpres;
739 endpoint->id.self.name.presentation = callingpres;
740 return 0;
741}
int ast_parse_caller_presentation(const char *data)
Convert caller ID text code to value (used in config file parsing)
Definition: callerid.c:1343
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:279
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:297

References ast_parse_caller_presentation(), ast_sip_endpoint::id, ast_party_id::name, ast_party_id::number, ast_party_name::presentation, ast_party_number::presentation, ast_sip_endpoint_id_configuration::self, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_privacy_to_str()

static int caller_id_privacy_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 743 of file pjsip_configuration.c.

744{
745 const struct ast_sip_endpoint *endpoint = obj;
746 const char *presentation = ast_named_caller_presentation(
747 endpoint->id.self.name.presentation);
748
749 *buf = ast_strdup(presentation);
750 return 0;
751}
const char * ast_named_caller_presentation(int data)
Convert caller ID pres value to text code.
Definition: callerid.c:1382

References ast_named_caller_presentation(), ast_strdup, buf, ast_sip_endpoint::id, ast_party_id::name, ast_party_name::presentation, and ast_sip_endpoint_id_configuration::self.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_tag_handler()

static int caller_id_tag_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 753 of file pjsip_configuration.c.

754{
755 struct ast_sip_endpoint *endpoint = obj;
756
757 ast_free(endpoint->id.self.tag);
758 endpoint->id.self.tag = ast_strdup(var->value);
759
760 return endpoint->id.self.tag ? 0 : -1;
761}

References ast_free, ast_strdup, ast_sip_endpoint::id, ast_sip_endpoint_id_configuration::self, ast_party_id::tag, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_tag_to_str()

static int caller_id_tag_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 763 of file pjsip_configuration.c.

764{
765 const struct ast_sip_endpoint *endpoint = obj;
766 *buf = ast_strdup(endpoint->id.self.tag);
767 return 0;
768}

References ast_strdup, buf, ast_sip_endpoint::id, ast_sip_endpoint_id_configuration::self, and ast_party_id::tag.

Referenced by ast_res_pjsip_initialize_configuration().

◆ caller_id_to_str()

static int caller_id_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 708 of file pjsip_configuration.c.

709{
710 const struct ast_sip_endpoint *endpoint = obj;
711 const char *name = S_COR(endpoint->id.self.name.valid,
712 endpoint->id.self.name.str, NULL);
713 const char *number = S_COR(endpoint->id.self.number.valid,
714 endpoint->id.self.number.str, NULL);
715
716 /* make sure size is at least 10 - that should cover the "<unknown>"
717 case as well as any additional formatting characters added in
718 the name and/or number case. */
719 int size = 10;
720 size += name ? strlen(name) : 0;
721 size += number ? strlen(number) : 0;
722
723 if (!(*buf = ast_calloc(size + 1, sizeof(char)))) {
724 return -1;
725 }
726
727 ast_callerid_merge(*buf, size + 1, name, number, NULL);
728 return 0;
729}
char * ast_callerid_merge(char *buf, int bufsiz, const char *name, const char *num, const char *unknown)
Definition: callerid.c:1273
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87
Number structure.
Definition: app_followme.c:154

References ast_callerid_merge(), ast_calloc, buf, ast_sip_endpoint::id, name, ast_party_id::name, NULL, ast_party_id::number, S_COR, ast_sip_endpoint_id_configuration::self, ast_party_name::str, ast_party_number::str, ast_party_name::valid, and ast_party_number::valid.

Referenced by ast_res_pjsip_initialize_configuration().

◆ callgroup_to_str()

static int callgroup_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 839 of file pjsip_configuration.c.

840{
841 const struct ast_sip_endpoint *endpoint = obj;
842
843 if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
844 return -1;
845 }
846
848 return 0;
849}
char * ast_print_group(char *buf, int buflen, ast_group_t group)
Print call and pickup groups into buffer.
Definition: channel.c:8053
struct ast_sip_endpoint_pickup_configuration pickup
Definition: res_pjsip.h:1006

References ast_calloc, ast_print_group(), buf, ast_sip_endpoint_pickup_configuration::callgroup, MAX_OBJECT_FIELD, and ast_sip_endpoint::pickup.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_get_container()

static struct ao2_container * cli_endpoint_get_container ( const char *  regex)
static

Definition at line 1936 of file pjsip_configuration.c.

1937{
1939 struct ao2_container *s_container;
1940
1942 if (!container) {
1943 return NULL;
1944 }
1945
1948 if (!s_container) {
1949 return NULL;
1950 }
1951
1952 if (ao2_container_dup(s_container, container, 0)) {
1953 ao2_ref(s_container, -1);
1954 return NULL;
1955 }
1956
1957 return s_container;
1958}
int ao2_container_dup(struct ao2_container *dest, struct ao2_container *src, enum search_flags flags)
Copy all object references in the src container into the dest container.
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition: astobj2.h:1327
static int regex(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
struct ao2_container * container
Definition: res_fax.c:501
struct ao2_container * ast_sorcery_retrieve_by_regex(const struct ast_sorcery *sorcery, const char *type, const char *regex)
Retrieve multiple objects using a regular expression on their id.
Definition: sorcery.c:1954
int ast_sorcery_object_id_compare(void *obj, void *arg, int flags)
ao2 object comparator based on sorcery id.
Definition: sorcery.c:2464
int ast_sorcery_object_id_sort(const void *obj, const void *arg, int flags)
ao2 object sorter based on sorcery id.
Definition: sorcery.c:2440

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_cleanup, ao2_container_alloc_list, ao2_container_dup(), ao2_ref, ast_sorcery_object_id_compare(), ast_sorcery_object_id_sort(), ast_sorcery_retrieve_by_regex(), container, NULL, RAII_VAR, regex(), and sip_sorcery.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_iterate()

static int cli_endpoint_iterate ( void *  obj,
ao2_callback_fn  callback,
void *  args 
)
static

Definition at line 1960 of file pjsip_configuration.c.

1961{
1962 ao2_callback(obj, OBJ_NODATA, callback, args);
1963
1964 return 0;
1965}
const char * args

References ao2_callback, args, and OBJ_NODATA.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_print_body()

static int cli_endpoint_print_body ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 2014 of file pjsip_configuration.c.

2015{
2016 struct ast_sip_endpoint *endpoint = obj;
2017 RAII_VAR(struct ast_endpoint_snapshot *, endpoint_snapshot, ast_sip_get_endpoint_snapshot(endpoint), ao2_cleanup);
2018 struct ast_sip_cli_context *context = arg;
2019 const char *id = ast_sorcery_object_get_id(endpoint);
2020 char *print_name = NULL;
2021 int print_name_len;
2022 char *number = S_COR(endpoint->id.self.number.valid,
2023 endpoint->id.self.number.str, NULL);
2024 int indent;
2025 int flexwidth;
2026
2027 ast_assert(context->output_buffer != NULL);
2028
2029 if (number) {
2030 print_name_len = strlen(id) + strlen(number) + 2;
2031 print_name = ast_alloca(print_name_len);
2032 snprintf(print_name, print_name_len, "%s/%s", id, number);
2033 }
2034
2035 indent = CLI_INDENT_TO_SPACES(context->indent_level);
2036 flexwidth = CLI_LAST_TABSTOP - indent - 2;
2037
2038 ast_str_append(&context->output_buffer, 0, "%*s: %-*.*s %-12.12s %d of %.0f\n",
2039 indent, "Endpoint",
2040 flexwidth, flexwidth, print_name ? print_name : id,
2041 ast_sip_get_device_state(endpoint),
2042 endpoint_snapshot->num_channels,
2043 (double) endpoint->devicestate_busy_at ? endpoint->devicestate_busy_at :
2044 INFINITY
2045 );
2046
2047 if (context->recurse) {
2048 context->indent_level++;
2049
2050 context->auth_direction = "Out";
2052 context->auth_direction = "In";
2054
2055 cli_endpoint_print_child_body("aor", endpoint->aors, context);
2056 cli_endpoint_print_child_body("transport", endpoint, context);
2057 cli_endpoint_print_child_body("identify", endpoint, context);
2058 cli_endpoint_print_child_body("channel", endpoint, context);
2059
2060 context->indent_level--;
2061
2062 if (context->indent_level == 0) {
2063 ast_str_append(&context->output_buffer, 0, "\n");
2064 }
2065 }
2066
2067 if (context->show_details || (context->show_details_only_level_0 && context->indent_level == 0)) {
2068 ast_str_append(&context->output_buffer, 0, "\n");
2070 }
2071
2072 return 0;
2073}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
#define INFINITY
static void cli_endpoint_print_child_body(char *type, const void *obj, struct ast_sip_cli_context *context)
const char * ast_sip_get_device_state(const struct ast_sip_endpoint *endpoint)
Retrieve the device state for an endpoint.
int ast_sip_cli_print_sorcery_objectset(void *obj, void *arg, int flags)
Prints a sorcery object's ast_variable list.
Definition: pjsip_cli.c:36
#define CLI_LAST_TABSTOP
Definition: res_pjsip_cli.h:27
#define CLI_INDENT_TO_SPACES(x)
Definition: res_pjsip_cli.h:29
CLI Formatter Context passed to all formatters.
Definition: res_pjsip_cli.h:34
struct ast_sip_auth_vector outbound_auths
Definition: res_pjsip.h:1010
const ast_string_field aors
Definition: res_pjsip.h:992
struct ast_sip_auth_vector inbound_auths
Definition: res_pjsip.h:1008
unsigned int devicestate_busy_at
Definition: res_pjsip.h:1022

References ao2_cleanup, ast_sip_endpoint::aors, ast_alloca, ast_assert, ast_sip_cli_print_sorcery_objectset(), ast_sip_get_device_state(), ast_sip_get_endpoint_snapshot(), ast_sorcery_object_get_id(), ast_str_append(), cli_endpoint_print_child_body(), CLI_INDENT_TO_SPACES, CLI_LAST_TABSTOP, voicemailpwcheck::context, ast_sip_endpoint::devicestate_busy_at, ast_sip_endpoint::id, ast_sip_endpoint::inbound_auths, INFINITY, NULL, ast_party_id::number, ast_sip_endpoint::outbound_auths, RAII_VAR, S_COR, ast_sip_endpoint_id_configuration::self, ast_party_number::str, and ast_party_number::valid.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_print_child_body()

static void cli_endpoint_print_child_body ( char *  type,
const void *  obj,
struct ast_sip_cli_context context 
)
static

Definition at line 2004 of file pjsip_configuration.c.

2005{
2006 RAII_VAR(struct ast_sip_cli_formatter_entry *, formatter_entry, NULL, ao2_cleanup);
2007
2008 formatter_entry = ast_sip_lookup_cli_formatter(type);
2009 if (formatter_entry) {
2010 formatter_entry->iterate((void *)obj, formatter_entry->print_body, context);
2011 }
2012}
static const char type[]
Definition: chan_ooh323.c:109
struct ast_sip_cli_formatter_entry * ast_sip_lookup_cli_formatter(const char *name)
Looks up a CLI formatter by type.
Definition: pjsip_cli.c:305

References ao2_cleanup, ast_sip_lookup_cli_formatter(), voicemailpwcheck::context, NULL, RAII_VAR, and type.

Referenced by cli_endpoint_print_body().

◆ cli_endpoint_print_child_header()

static void cli_endpoint_print_child_header ( char *  type,
struct ast_sip_cli_context context 
)
static

Definition at line 1972 of file pjsip_configuration.c.

1973{
1974 RAII_VAR(struct ast_sip_cli_formatter_entry *, formatter_entry, NULL, ao2_cleanup);
1975
1976 formatter_entry = ast_sip_lookup_cli_formatter(type);
1977 if (formatter_entry) {
1978 formatter_entry->print_header(NULL, context, 0);
1979 }
1980}

References ao2_cleanup, ast_sip_lookup_cli_formatter(), voicemailpwcheck::context, NULL, RAII_VAR, and type.

Referenced by cli_endpoint_print_header().

◆ cli_endpoint_print_header()

static int cli_endpoint_print_header ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1982 of file pjsip_configuration.c.

1983{
1984 struct ast_sip_cli_context *context = arg;
1985
1986 ast_assert(context->output_buffer != NULL);
1987
1988 ast_str_append(&context->output_buffer, 0,
1989 " Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.>\n");
1990
1991 if (context->recurse) {
1992 context->indent_level++;
1998 context->indent_level--;
1999 }
2000
2001 return 0;
2002}
static void cli_endpoint_print_child_header(char *type, struct ast_sip_cli_context *context)

References ast_assert, ast_str_append(), cli_endpoint_print_child_header(), voicemailpwcheck::context, and NULL.

Referenced by ast_res_pjsip_initialize_configuration().

◆ cli_endpoint_retrieve_by_id()

static void * cli_endpoint_retrieve_by_id ( const char *  id)
static

Definition at line 1967 of file pjsip_configuration.c.

1968{
1969 return ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id);
1970}

References ast_sip_get_sorcery(), and ast_sorcery_retrieve_by_id().

Referenced by ast_res_pjsip_initialize_configuration().

◆ codec_prefs_handler()

static int codec_prefs_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1272 of file pjsip_configuration.c.

1274{
1275 struct ast_sip_endpoint *endpoint = obj;
1276 struct ast_stream_codec_negotiation_prefs *option_prefs;
1278 struct ast_str *error_message = ast_str_create(128);
1281 int res = 0;
1282
1283 res = ast_stream_codec_prefs_parse(var->value, &prefs, &error_message);
1284 if (res < 0) {
1285 ast_log(LOG_ERROR, "Endpoint '%s': %s for option '%s'\n",
1286 ast_sorcery_object_get_id(endpoint), ast_str_buffer(error_message), var->name);
1287 ast_free(error_message);
1288 return -1;
1289 }
1290 ast_free(error_message);
1291
1292 if (strcmp(var->name, "codec_prefs_incoming_offer") == 0) {
1293 if (prefs.operation == CODEC_NEGOTIATION_OPERATION_UNION) {
1294 ast_log(LOG_ERROR, "Endpoint '%s': Codec preference '%s' has invalid value '%s' for option: '%s'",
1295 ast_sorcery_object_get_id(endpoint),
1298 var->name);
1299 return -1;
1300 }
1301 option_prefs = &endpoint->media.codec_prefs_incoming_offer;
1302 default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1303 default_operation = CODEC_NEGOTIATION_OPERATION_INTERSECT;
1304 } else if (strcmp(var->name, "codec_prefs_outgoing_offer") == 0) {
1305 option_prefs = &endpoint->media.codec_prefs_outgoing_offer;
1306 default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1307 default_operation = CODEC_NEGOTIATION_OPERATION_UNION;
1308 } else if (strcmp(var->name, "codec_prefs_incoming_answer") == 0) {
1309 option_prefs = &endpoint->media.codec_prefs_incoming_answer;
1310 default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1311 default_operation = CODEC_NEGOTIATION_OPERATION_INTERSECT;
1312 } else if (strcmp(var->name, "codec_prefs_outgoing_answer") == 0) {
1313 option_prefs = &endpoint->media.codec_prefs_outgoing_answer;
1314 default_prefer = CODEC_NEGOTIATION_PREFER_PENDING;
1315 default_operation = CODEC_NEGOTIATION_OPERATION_INTERSECT;
1316 } else {
1317 ast_log(LOG_ERROR, "Endpoint '%s': Unsupported option '%s'\n",
1318 ast_sorcery_object_get_id(endpoint),
1319 var->name);
1320 return -1;
1321 }
1322
1323 if (prefs.prefer == CODEC_NEGOTIATION_PREFER_UNSPECIFIED) {
1324 prefs.prefer = default_prefer;
1325 }
1326
1327 if (prefs.operation == CODEC_NEGOTIATION_OPERATION_UNSPECIFIED) {
1328 prefs.operation = default_operation;
1329 }
1330
1331 if (prefs.keep == CODEC_NEGOTIATION_KEEP_UNSPECIFIED) {
1332 prefs.keep = CODEC_NEGOTIATION_KEEP_ALL;
1333 }
1334
1335 if (prefs.transcode == CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED) {
1336 prefs.transcode = CODEC_NEGOTIATION_TRANSCODE_ALLOW;
1337 }
1338
1339 /* Now that defaults have been applied as needed we apply the full codec
1340 * preference configuration to the option.
1341 */
1342 *option_prefs = prefs;
1343
1344 return 0;
1345}
ast_stream_codec_negotiation_prefs_operation_values
The "operation" values.
Definition: stream.h:159
@ CODEC_NEGOTIATION_OPERATION_UNSPECIFIED
Definition: stream.h:160
@ CODEC_NEGOTIATION_OPERATION_UNION
Definition: stream.h:164
@ CODEC_NEGOTIATION_OPERATION_INTERSECT
Definition: stream.h:162
@ CODEC_NEGOTIATION_KEEP_UNSPECIFIED
Definition: stream.h:178
@ CODEC_NEGOTIATION_KEEP_ALL
Definition: stream.h:180
int ast_stream_codec_prefs_parse(const char *pref_string, struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **error_message)
Parses a string representing the codec prefs into a ast_stream_codec_negotiation_pref structure.
Definition: stream.c:181
#define ast_stream_codec_operation_to_str(value)
Safely get the name of an "operation" parameter value.
Definition: stream.h:264
@ CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED
Definition: stream.h:192
@ CODEC_NEGOTIATION_TRANSCODE_ALLOW
Definition: stream.h:194
@ CODEC_NEGOTIATION_PARAM_OPERATION
Definition: stream.h:132
ast_stream_codec_negotiation_prefs_prefer_values
The "prefer" values.
Definition: stream.h:145
@ CODEC_NEGOTIATION_PREFER_UNSPECIFIED
Definition: stream.h:146
@ CODEC_NEGOTIATION_PREFER_PENDING
Definition: stream.h:148
#define ast_stream_codec_param_to_str(value)
Safely get the name of a preference parameter.
Definition: stream.h:244
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
struct ast_stream_codec_negotiation_prefs codec_prefs_incoming_offer
Definition: res_pjsip.h:949
struct ast_stream_codec_negotiation_prefs codec_prefs_incoming_answer
Definition: res_pjsip.h:953
struct ast_stream_codec_negotiation_prefs codec_prefs_outgoing_offer
Definition: res_pjsip.h:951
struct ast_stream_codec_negotiation_prefs codec_prefs_outgoing_answer
Definition: res_pjsip.h:955

References ast_free, ast_log, ast_sorcery_object_get_id(), ast_str_buffer(), ast_str_create, ast_stream_codec_operation_to_str, ast_stream_codec_param_to_str, ast_stream_codec_prefs_parse(), CODEC_NEGOTIATION_KEEP_ALL, CODEC_NEGOTIATION_KEEP_UNSPECIFIED, CODEC_NEGOTIATION_OPERATION_INTERSECT, CODEC_NEGOTIATION_OPERATION_UNION, CODEC_NEGOTIATION_OPERATION_UNSPECIFIED, CODEC_NEGOTIATION_PARAM_OPERATION, CODEC_NEGOTIATION_PREFER_PENDING, CODEC_NEGOTIATION_PREFER_UNSPECIFIED, CODEC_NEGOTIATION_TRANSCODE_ALLOW, CODEC_NEGOTIATION_TRANSCODE_UNSPECIFIED, ast_sip_endpoint_media_configuration::codec_prefs_incoming_answer, ast_sip_endpoint_media_configuration::codec_prefs_incoming_offer, ast_sip_endpoint_media_configuration::codec_prefs_outgoing_answer, ast_sip_endpoint_media_configuration::codec_prefs_outgoing_offer, ast_stream_codec_negotiation_prefs::keep, LOG_ERROR, ast_sip_endpoint::media, ast_stream_codec_negotiation_prefs::operation, ast_stream_codec_negotiation_prefs::prefer, ast_stream_codec_negotiation_prefs::transcode, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ codec_prefs_to_str()

static int codec_prefs_to_str ( const struct ast_stream_codec_negotiation_prefs prefs,
const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1347 of file pjsip_configuration.c.

1349{
1351
1352 if (!codecs) {
1353 return -1;
1354 }
1355
1358
1359 return 0;
1360}
static struct ao2_container * codecs
Registered codecs.
Definition: codec.c:48
#define AST_STREAM_MAX_CODEC_PREFS_LENGTH
Define for allocating buffer space for to_str() functions.
Definition: stream.h:307
const char * ast_stream_codec_prefs_to_str(const struct ast_stream_codec_negotiation_prefs *prefs, struct ast_str **buf)
Return a string representing the codec preferences.
Definition: stream.c:132

References ast_free, ast_str_create, ast_strdup, ast_stream_codec_prefs_to_str(), AST_STREAM_MAX_CODEC_PREFS_LENGTH, buf, and codecs.

Referenced by incoming_answer_codec_prefs_to_str(), incoming_offer_codec_prefs_to_str(), outgoing_answer_codec_prefs_to_str(), and outgoing_offer_codec_prefs_to_str().

◆ connected_line_method_handler()

static int connected_line_method_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 619 of file pjsip_configuration.c.

620{
621 struct ast_sip_endpoint *endpoint = obj;
622
623 if (!strcasecmp(var->value, "invite") || !strcasecmp(var->value, "reinvite")) {
625 } else if (!strcasecmp(var->value, "update")) {
627 } else {
628 ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n",
629 var->value, var->name, ast_sorcery_object_get_id(endpoint));
630 return -1;
631 }
632 return 0;
633}
@ AST_SIP_SESSION_REFRESH_METHOD_UPDATE
Definition: res_pjsip.h:627
@ AST_SIP_SESSION_REFRESH_METHOD_INVITE
Definition: res_pjsip.h:625
enum ast_sip_session_refresh_method refresh_method
Definition: res_pjsip.h:788

References ast_log, AST_SIP_SESSION_REFRESH_METHOD_INVITE, AST_SIP_SESSION_REFRESH_METHOD_UPDATE, ast_sorcery_object_get_id(), ast_sip_endpoint::id, LOG_NOTICE, ast_sip_endpoint_id_configuration::refresh_method, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ connected_line_method_to_str()

static int connected_line_method_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 635 of file pjsip_configuration.c.

636{
637 const struct ast_sip_endpoint *endpoint = obj;
639 return 0;
640}
static const char * id_configuration_refresh_methods[]

References ast_strdup, buf, ast_sip_endpoint::id, id_configuration_refresh_methods, and ast_sip_endpoint_id_configuration::refresh_method.

Referenced by ast_res_pjsip_initialize_configuration().

◆ contact_acl_to_str()

static int contact_acl_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 127 of file pjsip_configuration.c.

128{
129 const struct ast_sip_endpoint *endpoint = obj;
130 struct ast_acl_list *acl_list;
131 struct ast_acl *first_acl;
132
133 if (endpoint && !ast_acl_list_is_empty(acl_list=endpoint->contact_acl)) {
134 AST_LIST_LOCK(acl_list);
135 first_acl = AST_LIST_FIRST(acl_list);
136 if (ast_strlen_zero(first_acl->name)) {
137 *buf = "deny/permit";
138 } else {
139 *buf = first_acl->name;
140 }
141 AST_LIST_UNLOCK(acl_list);
142 }
143
144 *buf = ast_strdup(*buf);
145 return 0;
146}
struct ast_acl_list * contact_acl
Definition: res_pjsip.h:1038

References ast_acl_list_is_empty(), AST_LIST_FIRST, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_strdup, ast_strlen_zero(), buf, ast_sip_endpoint::contact_acl, and ast_acl::name.

Referenced by ast_res_pjsip_initialize_configuration().

◆ contact_user_handler()

static int contact_user_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1204 of file pjsip_configuration.c.

1206{
1207 struct ast_sip_endpoint *endpoint = obj;
1208
1209 ast_free(endpoint->contact_user);
1210 endpoint->contact_user = ast_strdup(var->value);
1211
1212 return endpoint->contact_user ? 0 : -1;
1213}
char * contact_user
Definition: res_pjsip.h:1042

References ast_free, ast_strdup, ast_sip_endpoint::contact_user, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ contact_user_to_str()

static int contact_user_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1215 of file pjsip_configuration.c.

1216{
1217 const struct ast_sip_endpoint *endpoint = obj;
1218
1219 *buf = ast_strdup(endpoint->contact_user);
1220 if (!(*buf)) {
1221 return -1;
1222 }
1223
1224 return 0;
1225}

References ast_strdup, buf, and ast_sip_endpoint::contact_user.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_glare_mitigation_handler()

static int direct_media_glare_mitigation_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 642 of file pjsip_configuration.c.

643{
644 struct ast_sip_endpoint *endpoint = obj;
645
646 if (!strcasecmp(var->value, "none")) {
648 } else if (!strcasecmp(var->value, "outgoing")) {
650 } else if (!strcasecmp(var->value, "incoming")) {
652 } else {
653 ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n",
654 var->value, var->name, ast_sorcery_object_get_id(endpoint));
655 return -1;
656 }
657
658 return 0;
659}
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE
Definition: res_pjsip.h:632
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING
Definition: res_pjsip.h:640
@ AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING
Definition: res_pjsip.h:636
enum ast_sip_direct_media_glare_mitigation glare_mitigation
Definition: res_pjsip.h:880
struct ast_sip_direct_media_configuration direct_media
Definition: res_pjsip.h:915

References ast_log, AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_INCOMING, AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE, AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_OUTGOING, ast_sorcery_object_get_id(), ast_sip_endpoint_media_configuration::direct_media, ast_sip_direct_media_configuration::glare_mitigation, LOG_NOTICE, ast_sip_endpoint::media, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_glare_mitigation_to_str()

static int direct_media_glare_mitigation_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 667 of file pjsip_configuration.c.

668{
669 const struct ast_sip_endpoint *endpoint = obj;
672 }
673
674 return 0;
675}
static const char * direct_media_glare_mitigation_map[]
#define ARRAY_IN_BOUNDS(v, a)
Checks to see if value is within the bounds of the given array.
Definition: utils.h:687

References ARRAY_IN_BOUNDS, ast_strdup, buf, ast_sip_endpoint_media_configuration::direct_media, direct_media_glare_mitigation_map, ast_sip_direct_media_configuration::glare_mitigation, and ast_sip_endpoint::media.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_method_handler()

static int direct_media_method_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 589 of file pjsip_configuration.c.

590{
591 struct ast_sip_endpoint *endpoint = obj;
592
593 if (!strcasecmp(var->value, "invite") || !strcasecmp(var->value, "reinvite")) {
595 } else if (!strcasecmp(var->value, "update")) {
597 } else {
598 ast_log(LOG_NOTICE, "Unrecognized option value %s for %s on endpoint %s\n",
599 var->value, var->name, ast_sorcery_object_get_id(endpoint));
600 return -1;
601 }
602 return 0;
603}
enum ast_sip_session_refresh_method method
Definition: res_pjsip.h:878

References ast_log, AST_SIP_SESSION_REFRESH_METHOD_INVITE, AST_SIP_SESSION_REFRESH_METHOD_UPDATE, ast_sorcery_object_get_id(), ast_sip_endpoint_media_configuration::direct_media, LOG_NOTICE, ast_sip_endpoint::media, ast_sip_direct_media_configuration::method, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ direct_media_method_to_str()

static int direct_media_method_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtls_handler()

static int dtls_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 911 of file pjsip_configuration.c.

913{
914 struct ast_sip_endpoint *endpoint = obj;
915 char *name = ast_strdupa(var->name);
916 char *front = NULL;
917 char *back = NULL;
918 char *buf = name;
919
920 /* strip out underscores in the name */
921 front = strtok_r(buf, "_", &back);
922 while (front) {
923 int size = strlen(front);
924 ast_copy_string(buf, front, size + 1);
925 buf += size;
926 front = strtok_r(NULL, "_", &back);
927 }
928
929 return ast_rtp_dtls_cfg_parse(&endpoint->media.rtp.dtls_cfg, name, var->value);
930}
int ast_rtp_dtls_cfg_parse(struct ast_rtp_dtls_cfg *dtls_cfg, const char *name, const char *value)
Parse DTLS related configuration options.
Definition: rtp_engine.c:3220
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
struct ast_sip_media_rtp_configuration rtp
Definition: res_pjsip.h:913
struct ast_rtp_dtls_cfg dtls_cfg
DTLS-SRTP configuration information.
Definition: res_pjsip.h:852

References ast_copy_string(), ast_rtp_dtls_cfg_parse(), ast_strdupa, buf, ast_sip_media_rtp_configuration::dtls_cfg, ast_sip_endpoint::media, name, NULL, ast_sip_endpoint_media_configuration::rtp, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtlsautogeneratecert_to_str()

static int dtlsautogeneratecert_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 947 of file pjsip_configuration.c.

948{
949 const struct ast_sip_endpoint *endpoint = obj;
951 return 0;
952}
#define AST_YESNO(x)
return Yes or No depending on the argument.
Definition: strings.h:143
unsigned int ephemeral_cert
Definition: rtp_engine.h:617

References ast_strdup, AST_YESNO, buf, ast_sip_media_rtp_configuration::dtls_cfg, ast_rtp_dtls_cfg::ephemeral_cert, ast_sip_endpoint::media, and ast_sip_endpoint_media_configuration::rtp.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtlscafile_to_str()

static int dtlscafile_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlscapath_to_str()

static int dtlscapath_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlscertfile_to_str()

static int dtlscertfile_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlscipher_to_str()

static int dtlscipher_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsfingerprint_to_str()

static int dtlsfingerprint_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsprivatekey_to_str()

static int dtlsprivatekey_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsrekey_to_str()

static int dtlsrekey_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 939 of file pjsip_configuration.c.

940{
941 const struct ast_sip_endpoint *endpoint = obj;
942
943 return ast_asprintf(
944 buf, "%u", endpoint->media.rtp.dtls_cfg.rekey) >=0 ? 0 : -1;
945}
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
unsigned int rekey
Definition: rtp_engine.h:607

References ast_asprintf, buf, ast_sip_media_rtp_configuration::dtls_cfg, ast_sip_endpoint::media, ast_rtp_dtls_cfg::rekey, and ast_sip_endpoint_media_configuration::rtp.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtlssetup_to_str()

static int dtlssetup_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtlsverify_to_str()

static int dtlsverify_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ dtmf_handler()

static int dtmf_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 148 of file pjsip_configuration.c.

149{
150 struct ast_sip_endpoint *endpoint = obj;
151 int dtmf = ast_sip_str_to_dtmf(var->value);
152
153 if (dtmf == -1) {
154 return -1;
155 }
156
157 endpoint->dtmf = dtmf;
158 return 0;
159}
int ast_sip_str_to_dtmf(const char *dtmf_mode)
Convert the DTMF mode name into an enum.
Definition: res_pjsip.c:2533
enum ast_sip_dtmf_mode dtmf
Definition: res_pjsip.h:1012

References ast_sip_str_to_dtmf(), ast_sip_endpoint::dtmf, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ dtmf_to_str()

static int dtmf_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 161 of file pjsip_configuration.c.

162{
163 const struct ast_sip_endpoint *endpoint = obj;
164 char dtmf_str[20];
165 int result = -1;
166
167 result = ast_sip_dtmf_to_str(endpoint->dtmf, dtmf_str, sizeof(dtmf_str));
168
169 if (result == 0) {
170 *buf = ast_strdup(dtmf_str);
171 } else {
172 *buf = ast_strdup("none");
173 }
174 return 0;
175}
static PGresult * result
Definition: cel_pgsql.c:84
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

References ast_sip_dtmf_to_str(), ast_strdup, buf, ast_sip_endpoint::dtmf, and result.

Referenced by ast_res_pjsip_initialize_configuration().

◆ endpoint_acl_handler()

static int endpoint_acl_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 89 of file pjsip_configuration.c.

90{
91 struct ast_sip_endpoint *endpoint = obj;
92 int error = 0;
93 int ignore;
94
95 if (ast_strlen_zero(var->value)) return 0;
96
97 if (!strncmp(var->name, "contact_", 8)) {
98 ast_append_acl(var->name + 8, var->value, &endpoint->contact_acl, &error, &ignore);
99 } else {
100 ast_append_acl(var->name, var->value, &endpoint->acl, &error, &ignore);
101 }
102
103 return error;
104}
void ast_append_acl(const char *sense, const char *stuff, struct ast_acl_list **path, int *error, int *named_acl_flag)
Add a rule to an ACL struct.
Definition: acl.c:429
def ignore(key=None, val=None, section=None, pjsip=None, nmapped=None, type='endpoint')
Definition: sip_to_pjsip.py:48
int error(const char *format,...)
Definition: utils/frame.c:999

References ast_sip_endpoint::acl, ast_append_acl(), ast_strlen_zero(), ast_sip_endpoint::contact_acl, error(), sip_to_pjsip::ignore(), and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ endpoint_deleted_observer()

static void endpoint_deleted_observer ( const void *  object)
static

◆ endpoint_destructor()

static void endpoint_destructor ( void *  obj)
static

Definition at line 2415 of file pjsip_configuration.c.

2416{
2417 struct ast_sip_endpoint *endpoint = obj;
2418
2420
2421 ao2_cleanup(endpoint->media.codecs);
2424 info_configuration_destroy(&endpoint->info);
2428 ast_party_id_free(&endpoint->id.self);
2431 ao2_cleanup(endpoint->persistent);
2434 ast_free(endpoint->contact_user);
2435 ast_free_acl_list(endpoint->contact_acl);
2436 ast_free_acl_list(endpoint->acl);
2438}
struct ast_acl_list * ast_free_acl_list(struct ast_acl_list *acl)
Free a list of ACLs.
Definition: acl.c:233
void ast_party_id_free(struct ast_party_id *doomed)
Destroy the party id contents.
Definition: channel.c:1830
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
Definition: channel.c:7754
static void media_configuration_destroy(struct ast_sip_endpoint_media_configuration *media)
static void info_configuration_destroy(struct ast_sip_endpoint_info_configuration *info)
static void subscription_configuration_destroy(struct ast_sip_endpoint_subscription_configuration *subscription)
void ast_sip_security_mechanisms_vector_destroy(struct ast_sip_security_mechanism_vector *security_mechanisms)
Free contents of a security mechanism vector.
void ast_stream_topology_free(struct ast_stream_topology *topology)
Unreference and destroy a stream topology.
Definition: stream.c:743
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374
struct ast_stream_topology * topology
Definition: res_pjsip.h:921
struct ast_namedgroups * named_pickupgroups
Definition: res_pjsip.h:804
struct ast_namedgroups * named_callgroups
Definition: res_pjsip.h:802
struct ast_sip_security_mechanism_vector security_mechanisms
Definition: res_pjsip.h:1060
struct ast_variable * channel_vars
Definition: res_pjsip.h:1030

References ast_sip_endpoint::acl, ao2_cleanup, ast_free, ast_free_acl_list(), ast_party_id_free(), ast_sip_auth_vector_destroy(), ast_sip_security_mechanisms_vector_destroy(), ast_stream_topology_free(), ast_string_field_free_memory, ast_unref_namedgroups(), ast_variables_destroy(), AST_VECTOR_FREE, ast_sip_endpoint::channel_vars, ast_sip_endpoint_media_configuration::codecs, ast_sip_endpoint::contact_acl, ast_sip_endpoint::contact_user, ast_sip_endpoint::id, ast_sip_endpoint::ident_method_order, ast_sip_endpoint::inbound_auths, ast_sip_endpoint::info, info_configuration_destroy(), ast_sip_endpoint::media, media_configuration_destroy(), ast_sip_endpoint_pickup_configuration::named_callgroups, ast_sip_endpoint_pickup_configuration::named_pickupgroups, ast_sip_endpoint::outbound_auths, ast_sip_endpoint::persistent, ast_sip_endpoint::pickup, ast_sip_endpoint::security_mechanisms, ast_sip_endpoint_id_configuration::self, ast_sip_endpoint::subscription, subscription_configuration_destroy(), and ast_sip_endpoint_media_configuration::topology.

Referenced by ast_sip_endpoint_alloc().

◆ format_ami_endpoint()

static int format_ami_endpoint ( const struct ast_sip_endpoint endpoint,
struct ast_sip_ami ami 
)
static

Definition at line 1798 of file pjsip_configuration.c.

1800{
1801 RAII_VAR(struct ast_str *, buf,
1802 ast_sip_create_ami_event("EndpointDetail", ami), ast_free);
1803
1804 if (!buf) {
1805 return -1;
1806 }
1807
1808 sip_endpoint_to_ami(endpoint, &buf);
1809 astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
1810 return 0;
1811}
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:1890
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.
static int sip_endpoint_to_ami(const struct ast_sip_endpoint *endpoint, struct ast_str **buf)

References ast_free, ast_sip_create_ami_event(), ast_str_buffer(), astman_append(), buf, RAII_VAR, ast_sip_ami::s, and sip_endpoint_to_ami().

Referenced by ami_show_endpoint().

◆ format_ami_endpoints()

static int format_ami_endpoints ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1869 of file pjsip_configuration.c.

1870{
1871
1872 struct ast_sip_endpoint *endpoint = obj;
1873 struct ast_sip_ami *ami = arg;
1874 RAII_VAR(struct ast_str *, buf,
1875 ast_sip_create_ami_event("EndpointList", ami), ast_free);
1876
1877 if (!buf) {
1878 return CMP_STOP;
1879 }
1880
1882 ast_str_append(&buf, 0, "Transport: %s\r\n",
1883 endpoint->transport);
1884 ast_str_append(&buf, 0, "Aor: %s\r\n",
1885 endpoint->aors);
1886
1887 ast_str_append(&buf, 0, "Auths: ");
1889 ast_str_append(&buf, 0, "\r\n");
1890
1891 ast_str_append(&buf, 0, "OutboundAuths: ");
1893 ast_str_append(&buf, 0, "\r\n");
1894
1895 ast_sip_for_each_aor(endpoint->aors,
1897
1898 ast_str_append(&buf, 0, "DeviceState: %s\r\n",
1899 ast_sip_get_device_state(endpoint));
1900
1901 ast_str_append(&buf, 0, "ActiveChannels: ");
1902 active_channels_to_str(endpoint, &buf);
1903 ast_str_append(&buf, 0, "\r\n");
1904
1905 astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
1906 return 0;
1907}
@ CMP_STOP
Definition: astobj2.h:1028
static int format_str_append_auth(const struct ast_sip_auth_vector *auths, struct ast_str **buf)
static int sip_endpoints_aors_ami(void *obj, void *arg, int flags)
static void active_channels_to_str(const struct ast_sip_endpoint *endpoint, struct ast_str **str)
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:687
void * arg
Definition: res_pjsip.h:3055
const ast_string_field transport
Definition: res_pjsip.h:992

References active_channels_to_str(), ast_sip_endpoint::aors, ast_sip_ami::arg, ast_free, ast_sip_create_ami_event(), ast_sip_for_each_aor(), ast_sip_get_device_state(), ast_str_append(), ast_str_buffer(), astman_append(), buf, CMP_STOP, format_str_append_auth(), ast_sip_endpoint::inbound_auths, ast_sip_endpoint::outbound_auths, RAII_VAR, ast_sip_ami::s, sip_endpoints_aors_ami(), sip_sorcery_object_ami_set_type_name(), and ast_sip_endpoint::transport.

Referenced by ami_show_endpoints().

◆ format_str_append_auth()

static int format_str_append_auth ( const struct ast_sip_auth_vector auths,
struct ast_str **  buf 
)
static

Definition at line 1857 of file pjsip_configuration.c.

1859{
1860 char *str = NULL;
1861 if (ast_sip_auths_to_str(auths, &str)) {
1862 return -1;
1863 }
1864 ast_str_append(buf, 0, "%s", str ? str : "");
1865 ast_free(str);
1866 return 0;
1867}
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.

References ast_free, ast_sip_auths_to_str(), ast_str_append(), buf, NULL, and str.

Referenced by format_ami_endpoints().

◆ from_user_handler()

static int from_user_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1098 of file pjsip_configuration.c.

1100{
1101 struct ast_sip_endpoint *endpoint = obj;
1102 /* Valid non-alphanumeric characters for URI */
1103 char *valid_uri_marks = "-._~%!$&'()*+,;=:";
1104 const char *val;
1105
1106 for (val = var->value; *val; val++) {
1107 if (!isalpha(*val) && !isdigit(*val) && !strchr(valid_uri_marks, *val)) {
1108 ast_log(LOG_ERROR, "Error configuring endpoint '%s' - '%s' field "
1109 "contains invalid character '%c'\n",
1110 ast_sorcery_object_get_id(endpoint), var->name, *val);
1111 return -1;
1112 }
1113 }
1114
1115 ast_string_field_set(endpoint, fromuser, var->value);
1116
1117 return 0;
1118}
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521

References ast_log, ast_sorcery_object_get_id(), ast_string_field_set, ast_sip_endpoint::fromuser, LOG_ERROR, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ from_user_to_str()

static int from_user_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1120 of file pjsip_configuration.c.

1121{
1122 const struct ast_sip_endpoint *endpoint = obj;
1123
1124 *buf = ast_strdup(endpoint->fromuser);
1125
1126 return 0;
1127}

References ast_strdup, buf, and ast_sip_endpoint::fromuser.

Referenced by ast_res_pjsip_initialize_configuration().

◆ group_handler()

static int group_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 823 of file pjsip_configuration.c.

825{
826 struct ast_sip_endpoint *endpoint = obj;
827
828 if (!strncmp(var->name, "call_group", 10)) {
829 endpoint->pickup.callgroup = ast_get_group(var->value);
830 } else if (!strncmp(var->name, "pickup_group", 12)) {
831 endpoint->pickup.pickupgroup = ast_get_group(var->value);
832 } else {
833 return -1;
834 }
835
836 return 0;
837}
ast_group_t ast_get_group(const char *s)
Definition: channel.c:7640

References ast_get_group(), ast_sip_endpoint_pickup_configuration::callgroup, ast_sip_endpoint::pickup, ast_sip_endpoint_pickup_configuration::pickupgroup, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ident_handler()

static int ident_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 462 of file pjsip_configuration.c.

463{
464 struct ast_sip_endpoint *endpoint = obj;
465 char *idents = ast_strdupa(var->value);
466 char *val;
467 int method;
468
469 /*
470 * If there's already something in the vector when we get here,
471 * it's the default value so we need to clean it out.
472 */
473 if (AST_VECTOR_SIZE(&endpoint->ident_method_order)) {
475 endpoint->ident_method = 0;
476 }
477
478 while ((val = ast_strip(strsep(&idents, ",")))) {
479 if (ast_strlen_zero(val)) {
480 continue;
481 }
482
484 if (method == -1) {
485 ast_log(LOG_ERROR, "Unrecognized identification method %s specified for endpoint %s\n",
486 val, ast_sorcery_object_get_id(endpoint));
488 endpoint->ident_method = 0;
489 return -1;
490 }
491 if (endpoint->ident_method & method) {
492 /* We are already identifying by this method. No need to do it again. */
493 continue;
494 }
495
496 endpoint->ident_method |= method;
498 }
499
500 return 0;
501}
static int sip_endpoint_identifier_str2type(const char *str)
const char * method
Definition: res_pjsip.c:1279
enum ast_sip_endpoint_identifier_type ident_method
Definition: res_pjsip.h:1014
#define AST_VECTOR_RESET(vec, cleanup)
Reset vector.
Definition: vector.h:625
#define AST_VECTOR_ELEM_CLEANUP_NOOP(elem)
Vector element cleanup that does nothing.
Definition: vector.h:571

References ast_log, ast_sorcery_object_get_id(), ast_strdupa, ast_strip(), ast_strlen_zero(), AST_VECTOR_APPEND, AST_VECTOR_ELEM_CLEANUP_NOOP, AST_VECTOR_RESET, AST_VECTOR_SIZE, ast_sip_endpoint::ident_method, ast_sip_endpoint::ident_method_order, LOG_ERROR, method, sip_endpoint_identifier_str2type(), strsep(), and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ ident_to_str()

static int ident_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 503 of file pjsip_configuration.c.

504{
505 const struct ast_sip_endpoint *endpoint = obj;
506 int methods;
507 int idx;
508 int buf_used = 0;
509 int buf_size = MAX_OBJECT_FIELD;
510
512 if (!methods) {
513 return 0;
514 }
515
516 *buf = ast_malloc(buf_size);
517 if (!*buf) {
518 return -1;
519 }
520
521 for (idx = 0; idx < methods; ++idx) {
523 const char *method_str;
524
525 method = AST_VECTOR_GET(&endpoint->ident_method_order, idx);
527
528 /* Should never have an "<unknown>" method string */
529 ast_assert(strcmp(method_str, "<unknown>"));
530 if (!strcmp(method_str, "<unknown>")) {
531 continue;
532 }
533
534 buf_used += snprintf(*buf + buf_used, buf_size - buf_used, "%s%s",
535 method_str, idx < methods - 1 ? "," : "");
536 if (buf_size <= buf_used) {
537 /* Need more room than available, truncating. */
538 *(*buf + (buf_size - 1)) = '\0';
539 ast_log(LOG_WARNING, "Truncated identify_by string: %s\n", *buf);
540 break;
541 }
542 }
543
544 return 0;
545}
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
static const char * sip_endpoint_identifier_type2str(enum ast_sip_endpoint_identifier_type method)
static struct @450 methods[]
ast_sip_endpoint_identifier_type
Different methods by which incoming requests can be matched to endpoints.
Definition: res_pjsip.h:609

References ast_assert, ast_log, ast_malloc, AST_VECTOR_GET, AST_VECTOR_SIZE, buf, ast_sip_endpoint::ident_method_order, LOG_WARNING, MAX_OBJECT_FIELD, method, methods, and sip_endpoint_identifier_type2str().

Referenced by ast_res_pjsip_initialize_configuration().

◆ inbound_auth_handler()

static int inbound_auth_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 360 of file pjsip_configuration.c.

361{
362 struct ast_sip_endpoint *endpoint = obj;
363
364 return ast_sip_auth_vector_init(&endpoint->inbound_auths, var->value);
365}
int ast_sip_auth_vector_init(struct ast_sip_auth_vector *auths, const char *value)
Initialize an auth vector with the configured values.

References ast_sip_auth_vector_init(), ast_sip_endpoint::inbound_auths, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ inbound_auths_to_str()

static int inbound_auths_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 389 of file pjsip_configuration.c.

390{
391 const struct ast_sip_endpoint *endpoint = obj;
392 return ast_sip_auths_to_str(&endpoint->inbound_auths, buf);
393}

References ast_sip_auths_to_str(), buf, and ast_sip_endpoint::inbound_auths.

Referenced by ast_res_pjsip_initialize_configuration().

◆ incoming_answer_codec_prefs_to_str()

static int incoming_answer_codec_prefs_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1374 of file pjsip_configuration.c.

1375{
1376 const struct ast_sip_endpoint *endpoint = obj;
1378}
static int codec_prefs_to_str(const struct ast_stream_codec_negotiation_prefs *prefs, const void *obj, const intptr_t *args, char **buf)

References args, buf, ast_sip_endpoint_media_configuration::codec_prefs_incoming_answer, codec_prefs_to_str(), and ast_sip_endpoint::media.

Referenced by ast_res_pjsip_initialize_configuration().

◆ incoming_call_offer_pref_to_str()

static int incoming_call_offer_pref_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1248 of file pjsip_configuration.c.

1249{
1250 const struct ast_sip_endpoint *endpoint = obj;
1251
1253 if (!(*buf)) {
1254 return -1;
1255 }
1256
1257 return 0;
1258}
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

References ast_sip_call_codec_pref_to_str(), ast_strdup, buf, ast_sip_endpoint_media_configuration::incoming_call_offer_pref, and ast_sip_endpoint::media.

Referenced by ast_res_pjsip_initialize_configuration().

◆ incoming_offer_codec_prefs_to_str()

static int incoming_offer_codec_prefs_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ info_configuration_destroy()

static void info_configuration_destroy ( struct ast_sip_endpoint_info_configuration info)
static

Definition at line 2403 of file pjsip_configuration.c.

2404{
2406}

References ast_string_field_free_memory, and sip_to_pjsip::info().

Referenced by endpoint_destructor().

◆ init_info_configuration()

static int init_info_configuration ( struct ast_sip_endpoint_info_configuration info)
static

Definition at line 2445 of file pjsip_configuration.c.

2446{
2447 return ast_string_field_init(&info->recording, 32);
2448}

References ast_string_field_init, and sip_to_pjsip::info().

Referenced by ast_sip_endpoint_alloc().

◆ init_media_configuration()

static int init_media_configuration ( struct ast_sip_endpoint_media_configuration media)
static

Definition at line 2450 of file pjsip_configuration.c.

2451{
2452 return ast_string_field_init(media, 64) || ast_string_field_init(&media->rtp, 32);
2453}

References ast_string_field_init, ast_sip_endpoint::media, and ast_sip_endpoint_media_configuration::rtp.

Referenced by ast_sip_endpoint_alloc().

◆ init_subscription_configuration()

static int init_subscription_configuration ( struct ast_sip_endpoint_subscription_configuration subscription)
static

Definition at line 2440 of file pjsip_configuration.c.

2441{
2442 return ast_string_field_init(&subscription->mwi, 64);
2443}
struct ast_sip_mwi_configuration mwi
Definition: res_pjsip.h:749

References ast_string_field_init, ast_sip_endpoint_subscription_configuration::mwi, and ast_sip_endpoint::subscription.

Referenced by ast_sip_endpoint_alloc().

◆ load_all_endpoints()

static void load_all_endpoints ( void  )
static

◆ media_address_handler()

static int media_address_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 547 of file pjsip_configuration.c.

548{
549 struct ast_sip_endpoint *endpoint = obj;
550 struct ast_sockaddr addr;
551
552 if (ast_sockaddr_parse(&addr, var->value, 0)) {
553 /* If we're able to parse as an IP, ensure it's formatted correctly for later */
554 ast_string_field_set(endpoint, media.address, ast_sockaddr_stringify_addr_remote(&addr));
555 } else {
556 /* If we weren't able to parse it as an IP, just assume it's a hostname */
557 ast_string_field_set(endpoint, media.address, var->value);
558 }
559
560 return 0;
561}
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition: netsock2.c:230
static char * ast_sockaddr_stringify_addr_remote(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
Definition: netsock2.h:313
Socket address structure.
Definition: netsock2.h:97

References ast_sockaddr_parse(), ast_sockaddr_stringify_addr_remote(), ast_string_field_set, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ media_address_to_str()

static int media_address_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 563 of file pjsip_configuration.c.

564{
565 const struct ast_sip_endpoint *endpoint = obj;
566 *buf = ast_strdup(endpoint->media.address);
567 return 0;
568}
const ast_string_field address
Definition: res_pjsip.h:911

References ast_sip_endpoint_media_configuration::address, ast_strdup, buf, and ast_sip_endpoint::media.

Referenced by ast_res_pjsip_initialize_configuration().

◆ media_configuration_destroy()

static void media_configuration_destroy ( struct ast_sip_endpoint_media_configuration media)
static

Definition at line 2408 of file pjsip_configuration.c.

2409{
2413}
void ast_rtp_dtls_cfg_free(struct ast_rtp_dtls_cfg *dtls_cfg)
Free contents of a DTLS configuration structure.
Definition: rtp_engine.c:3331

References ast_rtp_dtls_cfg_free(), ast_string_field_free_memory, ast_sip_media_rtp_configuration::dtls_cfg, and ast_sip_endpoint_media_configuration::rtp.

Referenced by endpoint_destructor().

◆ media_encryption_handler()

static int media_encryption_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 770 of file pjsip_configuration.c.

771{
772 struct ast_sip_endpoint *endpoint = obj;
773
774 if (!strcasecmp("no", var->value)) {
776 } else if (!strcasecmp("sdes", var->value)) {
778 } else if (!strcasecmp("dtls", var->value)) {
780 return ast_rtp_dtls_cfg_parse(&endpoint->media.rtp.dtls_cfg, "dtlsenable", "yes");
781 } else {
782 return -1;
783 }
784
785 return 0;
786}
@ AST_SIP_MEDIA_ENCRYPT_SDES
Definition: res_pjsip.h:649
@ AST_SIP_MEDIA_ENCRYPT_NONE
Definition: res_pjsip.h:647
@ AST_SIP_MEDIA_ENCRYPT_DTLS
Definition: res_pjsip.h:651
enum ast_sip_session_media_encryption encryption
Definition: res_pjsip.h:856

References ast_rtp_dtls_cfg_parse(), AST_SIP_MEDIA_ENCRYPT_DTLS, AST_SIP_MEDIA_ENCRYPT_NONE, AST_SIP_MEDIA_ENCRYPT_SDES, ast_sip_media_rtp_configuration::dtls_cfg, ast_sip_media_rtp_configuration::encryption, ast_sip_endpoint::media, ast_sip_endpoint_media_configuration::rtp, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ media_encryption_to_str()

static int media_encryption_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ named_callgroups_to_str()

static int named_callgroups_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 891 of file pjsip_configuration.c.

892{
893 const struct ast_sip_endpoint *endpoint = obj;
895
898 return 0;
899}
char * ast_print_namedgroups(struct ast_str **buf, struct ast_namedgroups *groups)
Print named call groups and named pickup groups.
Definition: channel.c:8078

References ast_free, ast_print_namedgroups(), ast_str_buffer(), ast_str_create, ast_strdup, buf, MAX_OBJECT_FIELD, ast_sip_endpoint_pickup_configuration::named_callgroups, ast_sip_endpoint::pickup, RAII_VAR, and str.

Referenced by ast_res_pjsip_initialize_configuration().

◆ named_groups_handler()

static int named_groups_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 863 of file pjsip_configuration.c.

865{
866 struct ast_sip_endpoint *endpoint = obj;
867
868 if (!strncmp(var->name, "named_call_group", 16)) {
869 if (ast_strlen_zero(var->value)) {
870 endpoint->pickup.named_callgroups =
872 } else if (!(endpoint->pickup.named_callgroups =
873 ast_get_namedgroups(var->value))) {
874 return -1;
875 }
876 } else if (!strncmp(var->name, "named_pickup_group", 18)) {
877 if (ast_strlen_zero(var->value)) {
878 endpoint->pickup.named_pickupgroups =
880 } else if (!(endpoint->pickup.named_pickupgroups =
881 ast_get_namedgroups(var->value))) {
882 return -1;
883 }
884 } else {
885 return -1;
886 }
887
888 return 0;
889}
struct ast_namedgroups * ast_get_namedgroups(const char *s)
Create an ast_namedgroups set with group names from comma separated string.
Definition: channel.c:7697

References ast_get_namedgroups(), ast_strlen_zero(), ast_unref_namedgroups(), ast_sip_endpoint_pickup_configuration::named_callgroups, ast_sip_endpoint_pickup_configuration::named_pickupgroups, ast_sip_endpoint::pickup, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ named_pickupgroups_to_str()

static int named_pickupgroups_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ outbound_auth_handler()

static int outbound_auth_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 367 of file pjsip_configuration.c.

368{
369 struct ast_sip_endpoint *endpoint = obj;
370
371 return ast_sip_auth_vector_init(&endpoint->outbound_auths, var->value);
372}

References ast_sip_auth_vector_init(), ast_sip_endpoint::outbound_auths, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ outbound_auths_to_str()

static int outbound_auths_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 395 of file pjsip_configuration.c.

396{
397 const struct ast_sip_endpoint *endpoint = obj;
398 return ast_sip_auths_to_str(&endpoint->outbound_auths, buf);
399}

References ast_sip_auths_to_str(), buf, and ast_sip_endpoint::outbound_auths.

Referenced by ast_res_pjsip_initialize_configuration().

◆ outgoing_answer_codec_prefs_to_str()

static int outgoing_answer_codec_prefs_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ outgoing_call_offer_pref_to_str()

static int outgoing_call_offer_pref_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1260 of file pjsip_configuration.c.

1261{
1262 const struct ast_sip_endpoint *endpoint = obj;
1263
1265 if (!(*buf)) {
1266 return -1;
1267 }
1268
1269 return 0;
1270}

References ast_sip_call_codec_pref_to_str(), ast_strdup, buf, ast_sip_endpoint::media, and ast_sip_endpoint_media_configuration::outgoing_call_offer_pref.

Referenced by ast_res_pjsip_initialize_configuration().

◆ outgoing_offer_codec_prefs_to_str()

static int outgoing_offer_codec_prefs_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ persistent_endpoint_cmp()

static int persistent_endpoint_cmp ( void *  obj,
void *  arg,
int  flags 
)
static

Comparison function for persistent endpoint information.

Definition at line 68 of file pjsip_configuration.c.

69{
70 const struct sip_persistent_endpoint *persistent1 = obj;
71 const struct sip_persistent_endpoint *persistent2 = arg;
72 const char *id = (flags & OBJ_KEY ? arg : ast_endpoint_get_resource(persistent2->endpoint));
73
74 return !strcmp(ast_endpoint_get_resource(persistent1->endpoint), id) ? CMP_MATCH | CMP_STOP : 0;
75}
@ CMP_MATCH
Definition: astobj2.h:1027
#define OBJ_KEY
Definition: astobj2.h:1151

References ast_endpoint_get_resource(), CMP_MATCH, CMP_STOP, sip_persistent_endpoint::endpoint, and OBJ_KEY.

Referenced by ast_res_pjsip_initialize_configuration().

◆ persistent_endpoint_destroy()

static void persistent_endpoint_destroy ( void *  obj)
static

Destructor function for persistent endpoint information.

Definition at line 1392 of file pjsip_configuration.c.

1393{
1394 struct sip_persistent_endpoint *persistent = obj;
1395
1396 ast_endpoint_shutdown(persistent->endpoint);
1397}
void ast_endpoint_shutdown(struct ast_endpoint *endpoint)
Shutsdown an ast_endpoint.

References ast_endpoint_shutdown(), and sip_persistent_endpoint::endpoint.

Referenced by persistent_endpoint_find_or_create().

◆ persistent_endpoint_find_or_create()

static struct ast_endpoint * persistent_endpoint_find_or_create ( const struct ast_sip_endpoint endpoint)
static

Internal function which finds (or creates) persistent endpoint information.

Definition at line 1516 of file pjsip_configuration.c.

1517{
1518 RAII_VAR(struct sip_persistent_endpoint *, persistent, NULL, ao2_cleanup);
1520
1523 if (!persistent) {
1524 persistent = ao2_alloc_options(sizeof(*persistent), persistent_endpoint_destroy,
1526 if (!persistent) {
1527 return NULL;
1528 }
1529
1530 persistent->endpoint = ast_endpoint_create("PJSIP",
1531 ast_sorcery_object_get_id(endpoint));
1532 if (!persistent->endpoint) {
1533 return NULL;
1534 }
1535
1536 ast_endpoint_set_state(persistent->endpoint, AST_ENDPOINT_OFFLINE);
1537
1539 }
1540
1541 ao2_ref(persistent->endpoint, +1);
1542 return persistent->endpoint;
1543}
ast_mutex_t lock
Definition: app_sla.c:331
#define ao2_link_flags(container, obj, flags)
Add an object to a container.
Definition: astobj2.h:1554
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:404
@ OBJ_NOLOCK
Assume that the ao2_container is already locked.
Definition: astobj2.h:1063
struct ast_endpoint * ast_endpoint_create(const char *tech, const char *resource)
Create an endpoint struct.
#define SCOPED_AO2LOCK(varname, obj)
scoped lock specialization for ao2 mutexes.
Definition: lock.h:604
static void persistent_endpoint_destroy(void *obj)
Destructor function for persistent endpoint information.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_cleanup, ao2_find, ao2_link_flags, ao2_ref, ast_endpoint_create(), AST_ENDPOINT_OFFLINE, ast_endpoint_set_state(), ast_sorcery_object_get_id(), lock, NULL, OBJ_NOLOCK, OBJ_SEARCH_KEY, persistent_endpoint_destroy(), persistent_endpoints, RAII_VAR, and SCOPED_AO2LOCK.

Referenced by sip_endpoint_apply_handler().

◆ persistent_endpoint_hash()

static int persistent_endpoint_hash ( const void *  obj,
const int  flags 
)
static

Hashing function for persistent endpoint information.

Definition at line 59 of file pjsip_configuration.c.

60{
61 const struct sip_persistent_endpoint *persistent = obj;
62 const char *id = (flags & OBJ_KEY ? obj : ast_endpoint_get_resource(persistent->endpoint));
63
64 return ast_str_hash(id);
65}
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:1259

References ast_endpoint_get_resource(), ast_str_hash(), sip_persistent_endpoint::endpoint, and OBJ_KEY.

Referenced by ast_res_pjsip_initialize_configuration().

◆ pickupgroup_to_str()

static int pickupgroup_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 851 of file pjsip_configuration.c.

852{
853 const struct ast_sip_endpoint *endpoint = obj;
854
855 if (!(*buf = ast_calloc(MAX_OBJECT_FIELD, sizeof(char)))) {
856 return -1;
857 }
858
860 return 0;
861}

References ast_calloc, ast_print_group(), buf, MAX_OBJECT_FIELD, ast_sip_endpoint::pickup, and ast_sip_endpoint_pickup_configuration::pickupgroup.

Referenced by ast_res_pjsip_initialize_configuration().

◆ prack_handler()

static int prack_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 177 of file pjsip_configuration.c.

178{
179 struct ast_sip_endpoint *endpoint = obj;
180
181 /* clear all */
182 endpoint->extensions.flags &= ~(PJSIP_INV_SUPPORT_100REL | PJSIP_INV_REQUIRE_100REL);
183
184 if (ast_true(var->value)) {
185 endpoint->extensions.flags |= PJSIP_INV_SUPPORT_100REL;
187 } else if (!strcasecmp(var->value, "peer_supported")) {
188 endpoint->extensions.flags |= PJSIP_INV_SUPPORT_100REL;
190 } else if (!strcasecmp(var->value, "required")) {
191 endpoint->extensions.flags |= PJSIP_INV_REQUIRE_100REL;
193 } else if (ast_false(var->value)) {
195 } else {
196 return -1;
197 }
198
199 return 0;
200}
@ AST_SIP_100REL_PEER_SUPPORTED
Definition: res_pjsip.h:535
@ AST_SIP_100REL_UNSUPPORTED
Definition: res_pjsip.h:531
@ AST_SIP_100REL_SUPPORTED
Definition: res_pjsip.h:533
@ AST_SIP_100REL_REQUIRED
Definition: res_pjsip.h:537
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
Definition: utils.c:2199
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
Definition: utils.c:2216
struct ast_sip_endpoint_extensions extensions
Definition: res_pjsip.h:994
enum ast_sip_100rel_mode rel100
Definition: res_pjsip.h:1072

References ast_false(), AST_SIP_100REL_PEER_SUPPORTED, AST_SIP_100REL_REQUIRED, AST_SIP_100REL_SUPPORTED, AST_SIP_100REL_UNSUPPORTED, ast_true(), ast_sip_endpoint::extensions, ast_sip_endpoint_extensions::flags, ast_sip_endpoint::rel100, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ prack_to_str()

static int prack_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 202 of file pjsip_configuration.c.

203{
204 const struct ast_sip_endpoint *endpoint = obj;
205
206 if (endpoint->rel100 == AST_SIP_100REL_SUPPORTED) {
207 *buf = "yes";
208 } else if (endpoint->rel100 == AST_SIP_100REL_PEER_SUPPORTED) {
209 *buf = "peer_supported";
210 } else if (endpoint->rel100 == AST_SIP_100REL_REQUIRED) {
211 *buf = "required";
212 } else {
213 *buf = "no";
214 }
215
216 *buf = ast_strdup(*buf);
217 return 0;
218}

References AST_SIP_100REL_PEER_SUPPORTED, AST_SIP_100REL_REQUIRED, AST_SIP_100REL_SUPPORTED, ast_strdup, buf, and ast_sip_endpoint::rel100.

Referenced by ast_res_pjsip_initialize_configuration().

◆ redirect_handler()

static int redirect_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 570 of file pjsip_configuration.c.

571{
572 struct ast_sip_endpoint *endpoint = obj;
573
574 if (!strcasecmp(var->value, "user")) {
576 } else if (!strcasecmp(var->value, "uri_core")) {
578 } else if (!strcasecmp(var->value, "uri_pjsip")) {
580 } else {
581 ast_log(LOG_ERROR, "Unrecognized redirect method %s specified for endpoint %s\n",
582 var->value, ast_sorcery_object_get_id(endpoint));
583 return -1;
584 }
585
586 return 0;
587}
@ AST_SIP_REDIRECT_URI_CORE
Definition: res_pjsip.h:658
@ AST_SIP_REDIRECT_URI_PJSIP
Definition: res_pjsip.h:660
@ AST_SIP_REDIRECT_USER
Definition: res_pjsip.h:656
enum ast_sip_session_redirect redirect_method
Definition: res_pjsip.h:1028

References ast_log, AST_SIP_REDIRECT_URI_CORE, AST_SIP_REDIRECT_URI_PJSIP, AST_SIP_REDIRECT_USER, ast_sorcery_object_get_id(), LOG_ERROR, ast_sip_endpoint::redirect_method, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ security_mechanism_handler()

static int security_mechanism_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 267 of file pjsip_configuration.c.

268{
269 struct ast_sip_endpoint *endpoint = obj;
270
272}
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.

References ast_sip_security_mechanism_vector_init(), ast_sip_endpoint::security_mechanisms, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ security_mechanism_to_str()

static int security_mechanism_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 260 of file pjsip_configuration.c.

261{
262 const struct ast_sip_endpoint *endpoint = obj;
263
265}
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.

References ast_sip_security_mechanisms_to_str(), buf, and ast_sip_endpoint::security_mechanisms.

Referenced by ast_res_pjsip_initialize_configuration().

◆ security_negotiation_handler()

static int security_negotiation_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 299 of file pjsip_configuration.c.

300{
301 struct ast_sip_endpoint *endpoint = obj;
302
304}
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.
enum ast_sip_security_negotiation security_negotiation
Definition: res_pjsip.h:1058

References ast_sip_set_security_negotiation(), ast_sip_endpoint::security_negotiation, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ security_negotiation_to_str()

static int security_negotiation_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 279 of file pjsip_configuration.c.

280{
281 const struct ast_sip_endpoint *endpoint = obj;
284 }
285 return 0;
286}
static const char * security_negotiation_map[]

References ARRAY_IN_BOUNDS, ast_strdup, buf, ast_sip_endpoint::security_negotiation, and security_negotiation_map.

Referenced by ast_res_pjsip_initialize_configuration().

◆ set_var_handler()

static int set_var_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1129 of file pjsip_configuration.c.

1131{
1132 struct ast_sip_endpoint *endpoint = obj;
1133 struct ast_variable *new_var;
1134 char *name;
1135 char *val;
1136
1137 if (ast_strlen_zero(var->value)) {
1138 return 0;
1139 }
1140
1141 name = ast_strdupa(var->value);
1142 val = strchr(name, '=');
1143
1144 if (!val) {
1145 return -1;
1146 }
1147
1148 *val++ = '\0';
1149
1150 if (!(new_var = ast_variable_new(name, val, ""))) {
1151 return -1;
1152 }
1153
1154 if (ast_variable_list_replace(&endpoint->channel_vars, new_var)) {
1155 ast_variable_list_append(&endpoint->channel_vars, new_var);
1156 }
1157
1158 return 0;
1159}
#define ast_variable_new(name, value, filename)
#define ast_variable_list_append(head, new_var)
int ast_variable_list_replace(struct ast_variable **head, struct ast_variable *replacement)
Replace a variable in the given list with a new value.
Definition: main/config.c:668

References ast_strdupa, ast_strlen_zero(), ast_variable_list_append, ast_variable_list_replace(), ast_variable_new, ast_sip_endpoint::channel_vars, name, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ set_var_to_str()

static int set_var_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1161 of file pjsip_configuration.c.

1162{
1164 const struct ast_sip_endpoint *endpoint = obj;
1165 struct ast_variable *var;
1166
1167 for (var = endpoint->channel_vars; var; var = var->next) {
1168 ast_str_append(&str, 0, "%s=%s,", var->name, var->value);
1169 }
1170
1172 ast_free(str);
1173 return 0;
1174}

References ast_free, ast_str_append(), ast_str_create, ast_str_truncate(), ast_strdup, buf, ast_sip_endpoint::channel_vars, MAX_OBJECT_FIELD, str, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ set_var_to_vl()

static int set_var_to_vl ( const void *  obj,
struct ast_variable **  fields 
)
static

Definition at line 1176 of file pjsip_configuration.c.

1177{
1178 const struct ast_sip_endpoint *endpoint = obj;
1179 if (endpoint->channel_vars) {
1180 *fields = ast_variables_dup(endpoint->channel_vars);
1181 }
1182 return 0;
1183}
struct ast_variable * ast_variables_dup(struct ast_variable *var)
Duplicate variable list.
Definition: main/config.c:544

References ast_variables_dup(), and ast_sip_endpoint::channel_vars.

Referenced by ast_res_pjsip_initialize_configuration().

◆ sip_endpoint_apply_handler()

static int sip_endpoint_apply_handler ( const struct ast_sorcery sorcery,
void *  obj 
)
static

Callback function for when an object is finalized.

Definition at line 1546 of file pjsip_configuration.c.

1547{
1548 struct ast_sip_endpoint *endpoint = obj;
1549
1550 if (!(endpoint->persistent = persistent_endpoint_find_or_create(endpoint))) {
1551 return -1;
1552 }
1553
1554 if (endpoint->extensions.timer.min_se < 90) {
1555 ast_log(LOG_ERROR, "Session timer minimum expires time must be 90 or greater on endpoint '%s'\n",
1556 ast_sorcery_object_get_id(endpoint));
1557 return -1;
1558 } else if (endpoint->extensions.timer.sess_expires < endpoint->extensions.timer.min_se) {
1559 ast_log(LOG_ERROR, "Session timer expires must be greater than minimum session expires time on endpoint '%s'\n",
1560 ast_sorcery_object_get_id(endpoint));
1561 return -1;
1562 }
1563
1564 if (ast_rtp_dtls_cfg_validate(&endpoint->media.rtp.dtls_cfg)) {
1565 return -1;
1566 }
1567
1568 if (endpoint->preferred_codec_only) {
1570 ast_log(LOG_ERROR, "Setting both preferred_codec_only and incoming_call_offer_pref is not supported on endpoint '%s'\n",
1571 ast_sorcery_object_get_id(endpoint));
1572 return -1;
1573 }
1576 }
1577
1579 if (!endpoint->media.topology) {
1580 return -1;
1581 }
1582
1583 endpoint->media.rtcp_mux |= endpoint->media.bundle;
1584
1585 /*
1586 * If webrtc has been enabled then enable those attributes, and default
1587 * some, that are needed in order for webrtc to work.
1588 */
1589 endpoint->media.bundle |= endpoint->media.webrtc;
1590 endpoint->media.rtcp_mux |= endpoint->media.webrtc;
1591 endpoint->media.rtp.use_avpf |= endpoint->media.webrtc;
1592 endpoint->media.rtp.ice_support |= endpoint->media.webrtc;
1593 endpoint->media.rtp.use_received_transport |= endpoint->media.webrtc;
1594
1595 if (endpoint->media.webrtc) {
1597 endpoint->media.rtp.dtls_cfg.enabled = 1;
1600
1601 /* RFC8827 says: Implementations MUST NOT implement DTLS renegotiation
1602 * and MUST reject it with a "no_renegotiation" alert if offered. */
1603 if (endpoint->media.rtp.dtls_cfg.rekey) {
1604 ast_log(LOG_WARNING, "DTLS renegotiation is not supported with WebRTC. Disabling dtls_rekey.\n");
1605 endpoint->media.rtp.dtls_cfg.rekey = 0;
1606 }
1607
1608 if (ast_strlen_zero(endpoint->media.rtp.dtls_cfg.certfile)) {
1609 /* If no certificate has been specified, try to automatically create one */
1610 endpoint->media.rtp.dtls_cfg.ephemeral_cert = 1;
1611 }
1612 }
1613
1614 if (!ast_strlen_zero(endpoint->geoloc_incoming_call_profile) ||
1615 !ast_strlen_zero(endpoint->geoloc_outgoing_call_profile)) {
1616
1617 if (!ast_geoloc_is_loaded()) {
1618 ast_log(LOG_ERROR, "A geoloc incoming and/or outgoing call_profile was specified on endpoint '%s'"
1619 " but res_geolocation is not loaded.\n", ast_sorcery_object_get_id(endpoint));
1620 return -1;
1621 }
1622
1623 if (!ast_strlen_zero(endpoint->geoloc_incoming_call_profile)) {
1624 struct ast_geoloc_profile *profile = ast_geoloc_get_profile(endpoint->geoloc_incoming_call_profile);
1625 if (!profile) {
1626 ast_log(LOG_ERROR, "geoloc_incoming_call_profile '%s' on endpoint '%s' doesn't exist\n",
1627 endpoint->geoloc_incoming_call_profile, ast_sorcery_object_get_id(endpoint));
1628 return -1;
1629 }
1630 ao2_cleanup(profile);
1631 }
1632
1633 if (!ast_strlen_zero(endpoint->geoloc_outgoing_call_profile)) {
1634 struct ast_geoloc_profile *profile = ast_geoloc_get_profile(endpoint->geoloc_outgoing_call_profile);
1635 if (!profile) {
1636 ast_log(LOG_ERROR, "geoloc_outgoing_call_profile '%s' on endpoint '%s' doesn't exist\n",
1637 endpoint->geoloc_outgoing_call_profile, ast_sorcery_object_get_id(endpoint));
1638 return -1;
1639 }
1640 ao2_cleanup(profile);
1641 }
1642 }
1643
1644 return 0;
1645}
static struct ast_endpoint * persistent_endpoint_find_or_create(const struct ast_sip_endpoint *endpoint)
Internal function which finds (or creates) persistent endpoint information.
struct ast_geoloc_profile * ast_geoloc_get_profile(const char *id)
Retrieve a geolocation profile by id.
int ast_geoloc_is_loaded(void)
Check if res_geolocation is available.
@ AST_SIP_CALL_CODEC_PREF_ALL
Definition: res_pjsip.h:677
@ AST_SIP_CALL_CODEC_PREF_LOCAL
Definition: res_pjsip.h:683
@ AST_SIP_CALL_CODEC_PREF_FIRST
Definition: res_pjsip.h:679
@ AST_SIP_CALL_CODEC_PREF_INTERSECT
Definition: res_pjsip.h:671
@ AST_RTP_DTLS_SETUP_ACTPASS
Definition: rtp_engine.h:567
@ AST_RTP_DTLS_VERIFY_FINGERPRINT
Definition: rtp_engine.h:586
int ast_rtp_dtls_cfg_validate(struct ast_rtp_dtls_cfg *dtls_cfg)
Validates DTLS related configuration options.
Definition: rtp_engine.c:3294
struct ast_stream_topology * ast_stream_topology_create_from_format_cap(struct ast_format_cap *cap)
A helper function that, given a format capabilities structure, creates a topology and separates the m...
Definition: stream.c:848
unsigned int flags
Definition: utils.h:200
unsigned int enabled
Definition: rtp_engine.h:606
struct ast_sip_timer_options timer
Definition: res_pjsip.h:719
unsigned int preferred_codec_only
Definition: res_pjsip.h:1044
unsigned int use_received_transport
Definition: res_pjsip.h:850
unsigned int sess_expires
Definition: res_pjsip.h:706
unsigned int min_se
Definition: res_pjsip.h:704
#define ast_clear_flag(p, flag)
Definition: utils.h:77
#define ast_set_flag(p, flag)
Definition: utils.h:70

References ao2_cleanup, ast_clear_flag, ast_geoloc_get_profile(), ast_geoloc_is_loaded(), ast_log, ast_rtp_dtls_cfg_validate(), AST_RTP_DTLS_SETUP_ACTPASS, AST_RTP_DTLS_VERIFY_FINGERPRINT, 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_MEDIA_ENCRYPT_DTLS, ast_sorcery_object_get_id(), ast_stream_topology_create_from_format_cap(), ast_strlen_zero(), ast_sip_endpoint_media_configuration::bundle, ast_rtp_dtls_cfg::certfile, ast_sip_endpoint_media_configuration::codecs, ast_rtp_dtls_cfg::default_setup, ast_sip_media_rtp_configuration::dtls_cfg, ast_rtp_dtls_cfg::enabled, ast_sip_media_rtp_configuration::encryption, ast_rtp_dtls_cfg::ephemeral_cert, ast_sip_endpoint::extensions, ast_flags::flags, ast_sip_media_rtp_configuration::ice_support, ast_sip_endpoint_media_configuration::incoming_call_offer_pref, LOG_ERROR, LOG_WARNING, ast_sip_endpoint::media, ast_sip_timer_options::min_se, ast_sip_endpoint::persistent, persistent_endpoint_find_or_create(), ast_sip_endpoint::preferred_codec_only, ast_rtp_dtls_cfg::rekey, ast_sip_endpoint_media_configuration::rtcp_mux, ast_sip_endpoint_media_configuration::rtp, ast_sip_timer_options::sess_expires, ast_sip_endpoint_extensions::timer, ast_sip_endpoint_media_configuration::topology, ast_sip_media_rtp_configuration::use_avpf, ast_sip_media_rtp_configuration::use_received_transport, ast_rtp_dtls_cfg::verify, and ast_sip_endpoint_media_configuration::webrtc.

Referenced by ast_res_pjsip_initialize_configuration().

◆ sip_endpoint_identifier_str2type()

static int sip_endpoint_identifier_str2type ( const char *  str)
static

Definition at line 442 of file pjsip_configuration.c.

443{
444 int method;
445
446 if (!strcasecmp(str, "username")) {
448 } else if (!strcasecmp(str, "auth_username")) {
450 } else if (!strcasecmp(str, "ip")) {
452 } else if (!strcasecmp(str, "header")) {
454 } else if (!strcasecmp(str, "request_uri")) {
456 } else {
457 method = -1;
458 }
459 return method;
460}
@ AST_SIP_ENDPOINT_IDENTIFY_BY_HEADER
Definition: res_pjsip.h:617
@ AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME
Definition: res_pjsip.h:611
@ AST_SIP_ENDPOINT_IDENTIFY_BY_REQUEST_URI
Definition: res_pjsip.h:619
@ AST_SIP_ENDPOINT_IDENTIFY_BY_IP
Definition: res_pjsip.h:615
@ AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME
Definition: res_pjsip.h:613

References AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME, AST_SIP_ENDPOINT_IDENTIFY_BY_HEADER, AST_SIP_ENDPOINT_IDENTIFY_BY_IP, AST_SIP_ENDPOINT_IDENTIFY_BY_REQUEST_URI, AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME, method, and str.

Referenced by ident_handler().

◆ sip_endpoint_identifier_type2str()

static const char * sip_endpoint_identifier_type2str ( enum ast_sip_endpoint_identifier_type  method)
static

Definition at line 409 of file pjsip_configuration.c.

410{
411 const char *str = "<unknown>";
412
413 switch (method) {
415 str = "username";
416 break;
418 str = "auth_username";
419 break;
421 str = "ip";
422 break;
424 str = "header";
425 break;
427 str = "request_uri";
428 break;
429 }
430 return str;
431}

References AST_SIP_ENDPOINT_IDENTIFY_BY_AUTH_USERNAME, AST_SIP_ENDPOINT_IDENTIFY_BY_HEADER, AST_SIP_ENDPOINT_IDENTIFY_BY_IP, AST_SIP_ENDPOINT_IDENTIFY_BY_REQUEST_URI, AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME, method, and str.

Referenced by ident_to_str().

◆ sip_endpoint_to_ami()

static int sip_endpoint_to_ami ( const struct ast_sip_endpoint endpoint,
struct ast_str **  buf 
)
static

Definition at line 1781 of file pjsip_configuration.c.

1783{
1784 if (ast_sip_sorcery_object_to_ami(endpoint, buf)) {
1785 return -1;
1786 }
1787
1788 ast_str_append(buf, 0, "DeviceState: %s\r\n",
1789 ast_sip_get_device_state(endpoint));
1790
1791 ast_str_append(buf, 0, "ActiveChannels: ");
1792 active_channels_to_str(endpoint, buf);
1793 ast_str_append(buf, 0, "\r\n");
1794
1795 return 0;
1796}
int ast_sip_sorcery_object_to_ami(const void *obj, struct ast_str **buf)
Converts a sorcery object to a string of object properties.

References active_channels_to_str(), ast_sip_get_device_state(), ast_sip_sorcery_object_to_ami(), ast_str_append(), and buf.

Referenced by format_ami_endpoint().

◆ sip_endpoints_aors_ami()

static int sip_endpoints_aors_ami ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 1769 of file pjsip_configuration.c.

1770{
1771 struct ast_sip_aor *aor = obj;
1772 struct ast_str **buf = arg;
1773
1774 ast_str_append(buf, 0, "Contacts: ");
1776 ast_str_append(buf, 0, "\r\n");
1777
1778 return 0;
1779}
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:722
int ast_sip_contact_to_str(void *object, void *arg, int flags)
Handler used to convert a contact to a string.
Definition: location.c:770
A SIP address of record.
Definition: res_pjsip.h:478

References ast_sip_contact_to_str(), ast_sip_for_each_contact(), ast_str_append(), and buf.

Referenced by format_ami_endpoints().

◆ sip_nat_hook_alloc()

static void * sip_nat_hook_alloc ( const char *  name)
static

Definition at line 1386 of file pjsip_configuration.c.

1387{
1388 return ast_sorcery_generic_alloc(sizeof(struct ast_sip_nat_hook), NULL);
1389}
Structure for SIP nat hook information.
Definition: res_pjsip.h:329

References ast_sorcery_generic_alloc(), and NULL.

Referenced by ast_res_pjsip_initialize_configuration().

◆ sip_sorcery_object_ami_set_type_name()

static void sip_sorcery_object_ami_set_type_name ( const void *  obj,
struct ast_str **  buf 
)
static

Definition at line 1741 of file pjsip_configuration.c.

1742{
1743 ast_str_append(buf, 0, "ObjectType: %s\r\n",
1745 ast_str_append(buf, 0, "ObjectName: %s\r\n",
1747}
const char * ast_sorcery_object_get_type(const void *object)
Get the type of a sorcery object.
Definition: sorcery.c:2329

References ast_sorcery_object_get_id(), ast_sorcery_object_get_type(), ast_str_append(), and buf.

Referenced by ast_sip_sorcery_object_to_ami(), and format_ami_endpoints().

◆ stir_shaken_handler()

static int stir_shaken_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 805 of file pjsip_configuration.c.

806{
807 struct ast_sip_endpoint *endpoint = obj;
808
809 ast_log(LOG_WARNING, "Endpoint %s: Option 'stir_shaken' is no longer supported. Use 'stir_shaken_profile' instead.\n",
810 ast_sorcery_object_get_id(endpoint));
811 endpoint->stir_shaken = 0;
812
813 return 0;
814}
unsigned int stir_shaken
Definition: res_pjsip.h:1062

References ast_log, ast_sorcery_object_get_id(), LOG_WARNING, and ast_sip_endpoint::stir_shaken.

Referenced by ast_res_pjsip_initialize_configuration().

◆ stir_shaken_to_str()

static int stir_shaken_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 816 of file pjsip_configuration.c.

817{
818 *buf = ast_strdup("no");
819
820 return 0;
821}

References ast_strdup, and buf.

Referenced by ast_res_pjsip_initialize_configuration().

◆ subscription_configuration_destroy()

static void subscription_configuration_destroy ( struct ast_sip_endpoint_subscription_configuration subscription)
static

◆ t38udptl_ec_handler()

static int t38udptl_ec_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1019 of file pjsip_configuration.c.

1021{
1022 struct ast_sip_endpoint *endpoint = obj;
1023
1024 if (!strcmp(var->value, "none")) {
1026 } else if (!strcmp(var->value, "fec")) {
1028 } else if (!strcmp(var->value, "redundancy")) {
1030 } else {
1031 return -1;
1032 }
1033
1034 return 0;
1035}
struct ast_sip_t38_configuration t38
Definition: res_pjsip.h:917
enum ast_t38_ec_modes error_correction
Definition: res_pjsip.h:889
@ UDPTL_ERROR_CORRECTION_FEC
Definition: udptl.h:39
@ UDPTL_ERROR_CORRECTION_NONE
Definition: udptl.h:38
@ UDPTL_ERROR_CORRECTION_REDUNDANCY
Definition: udptl.h:40

References ast_sip_t38_configuration::error_correction, ast_sip_endpoint::media, ast_sip_endpoint_media_configuration::t38, UDPTL_ERROR_CORRECTION_FEC, UDPTL_ERROR_CORRECTION_NONE, UDPTL_ERROR_CORRECTION_REDUNDANCY, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ t38udptl_ec_to_str()

static int t38udptl_ec_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

◆ timers_handler()

static int timers_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 220 of file pjsip_configuration.c.

221{
222 struct ast_sip_endpoint *endpoint = obj;
223
224 /* clear all */
225 endpoint->extensions.flags &= ~(PJSIP_INV_SUPPORT_TIMER | PJSIP_INV_REQUIRE_TIMER
226 | PJSIP_INV_ALWAYS_USE_TIMER);
227
228 /* set only the specified flag and let pjsip normalize if needed */
229 if (ast_true(var->value)) {
230 endpoint->extensions.flags |= PJSIP_INV_SUPPORT_TIMER;
231 } else if (!strcasecmp(var->value, "required")) {
232 endpoint->extensions.flags |= PJSIP_INV_REQUIRE_TIMER;
233 } else if (!strcasecmp(var->value, "always") || !strcasecmp(var->value, "forced")) {
234 endpoint->extensions.flags |= (PJSIP_INV_SUPPORT_TIMER | PJSIP_INV_ALWAYS_USE_TIMER);
235 } else if (!ast_false(var->value)) {
236 return -1;
237 }
238
239 return 0;
240}

References ast_false(), ast_true(), ast_sip_endpoint::extensions, ast_sip_endpoint_extensions::flags, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ timers_to_str()

static int timers_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 242 of file pjsip_configuration.c.

243{
244 const struct ast_sip_endpoint *endpoint = obj;
245
246 if (endpoint->extensions.flags & PJSIP_INV_ALWAYS_USE_TIMER) {
247 *buf = "always";
248 } else if (endpoint->extensions.flags & PJSIP_INV_REQUIRE_TIMER) {
249 *buf = "required";
250 } else if (endpoint->extensions.flags & PJSIP_INV_SUPPORT_TIMER) {
251 *buf = "yes";
252 } else {
253 *buf = "no";
254 }
255
256 *buf = ast_strdup(*buf);
257 return 0;
258}

References ast_strdup, buf, ast_sip_endpoint::extensions, and ast_sip_endpoint_extensions::flags.

Referenced by ast_res_pjsip_initialize_configuration().

◆ tos_audio_to_str()

static int tos_audio_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1078 of file pjsip_configuration.c.

1079{
1080 const struct ast_sip_endpoint *endpoint = obj;
1081
1082 if (ast_asprintf(buf, "%u", endpoint->media.tos_audio) == -1) {
1083 return -1;
1084 }
1085 return 0;
1086}

References ast_asprintf, buf, ast_sip_endpoint::media, and ast_sip_endpoint_media_configuration::tos_audio.

Referenced by ast_res_pjsip_initialize_configuration().

◆ tos_handler()

static int tos_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Definition at line 1053 of file pjsip_configuration.c.

1055{
1056 struct ast_sip_endpoint *endpoint = obj;
1057 unsigned int value;
1058
1059 if (ast_str2tos(var->value, &value)) {
1060 ast_log(LOG_ERROR, "Error configuring endpoint '%s' - Could not "
1061 "interpret '%s' value '%s'\n",
1062 ast_sorcery_object_get_id(endpoint), var->name, var->value);
1063 return -1;
1064 }
1065
1066 if (!strcmp(var->name, "tos_audio")) {
1067 endpoint->media.tos_audio = value;
1068 } else if (!strcmp(var->name, "tos_video")) {
1069 endpoint->media.tos_video = value;
1070 } else {
1071 /* If we reach this point, someone called the tos_handler when they shouldn't have. */
1072 ast_assert(0);
1073 return -1;
1074 }
1075 return 0;
1076}
int ast_str2tos(const char *value, unsigned int *tos)
Convert a string to the appropriate TOS value.
Definition: acl.c:983

References ast_assert, ast_log, ast_sorcery_object_get_id(), ast_str2tos(), LOG_ERROR, ast_sip_endpoint::media, ast_sip_endpoint_media_configuration::tos_audio, ast_sip_endpoint_media_configuration::tos_video, value, and var.

Referenced by ast_res_pjsip_initialize_configuration().

◆ tos_video_to_str()

static int tos_video_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Definition at line 1088 of file pjsip_configuration.c.

1089{
1090 const struct ast_sip_endpoint *endpoint = obj;
1091
1092 if (ast_asprintf(buf, "%u", endpoint->media.tos_video) == -1) {
1093 return -1;
1094 }
1095 return 0;
1096}

References ast_asprintf, buf, ast_sip_endpoint::media, and ast_sip_endpoint_media_configuration::tos_video.

Referenced by ast_res_pjsip_initialize_configuration().

◆ voicemail_extension_handler()

static int voicemail_extension_handler ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

◆ voicemail_extension_to_str()

static int voicemail_extension_to_str ( const void *  obj,
const intptr_t *  args,
char **  buf 
)
static

Variable Documentation

◆ acl_change_sub

struct stasis_subscription* acl_change_sub
static

◆ ast_rtp_dtls_fingerprint_map

const char* ast_rtp_dtls_fingerprint_map[]
static
Initial value:
= {
[AST_RTP_DTLS_HASH_SHA256] = "SHA-256",
}
@ AST_RTP_DTLS_HASH_SHA1
Definition: rtp_engine.h:580
@ AST_RTP_DTLS_HASH_SHA256
Definition: rtp_engine.h:579

Definition at line 1005 of file pjsip_configuration.c.

Referenced by dtlsfingerprint_to_str().

◆ ast_rtp_dtls_setup_map

const char* ast_rtp_dtls_setup_map[]
static

Definition at line 989 of file pjsip_configuration.c.

Referenced by dtlssetup_to_str().

◆ ast_t38_ec_modes_map

const char* ast_t38_ec_modes_map[]
static
Initial value:

Definition at line 1037 of file pjsip_configuration.c.

Referenced by t38udptl_ec_to_str().

◆ channel_formatter

struct ast_sip_cli_formatter_entry* channel_formatter

Definition at line 2092 of file pjsip_configuration.c.

◆ cli_commands

struct ast_cli_entry cli_commands[]
static

◆ direct_media_glare_mitigation_map

const char* direct_media_glare_mitigation_map[]
static

◆ endpoint_formatter

struct ast_sip_cli_formatter_entry* endpoint_formatter

◆ endpoint_observers

const struct ast_sorcery_observer endpoint_observers
static
Initial value:
= {
}
static void endpoint_deleted_observer(const void *object)

Definition at line 85 of file pjsip_configuration.c.

Referenced by ast_res_pjsip_initialize_configuration().

◆ id_configuration_refresh_methods

const char* id_configuration_refresh_methods[]
static

◆ media_encryption_map

const char* media_encryption_map[]
static

Definition at line 788 of file pjsip_configuration.c.

Referenced by media_encryption_to_str().

◆ persistent_endpoints

struct ao2_container* persistent_endpoints
static

◆ security_negotiation_map

const char* security_negotiation_map[]
static
Initial value:

Definition at line 274 of file pjsip_configuration.c.

Referenced by security_negotiation_to_str().

◆ sip_sorcery

struct ast_sorcery* sip_sorcery
static