35 .name = {
"Request Distributor", 19},
36 .priority = PJSIP_MOD_PRIORITY_TSX_LAYER - 6,
45 #define MAX_REALM_LENGTH 40 47 #define DEFAULT_SUSPECTS_BUCKETS 53 63 #define DISTRIBUTOR_POOL_SIZE 31 92 tdata_name = pj_pool_alloc(tdata->pool, strlen(name) + 1);
93 strcpy(tdata_name, name);
116 pjsip_transaction *tsx;
118 pjsip_tsx_create_key(rdata->tp_info.pool, &tsx_key, PJSIP_ROLE_UAC,
119 &rdata->msg_info.cseq->method, rdata);
121 tsx = pjsip_tsx_layer_find_tsx(&tsx_key, PJ_TRUE);
123 ast_debug(1,
"Could not find transaction for %s.\n",
124 pjsip_rx_data_get_info(rdata));
127 ast_debug(3,
"Found transaction %s for %s.\n",
128 tsx->obj_name, pjsip_rx_data_get_info(rdata));
131 const char *serializer_name;
137 ast_debug(3,
"Found serializer %s on transaction %s\n",
138 serializer_name, tsx->obj_name);
143 #ifdef HAVE_PJ_TRANSACTION_GRP_LOCK 144 pj_grp_lock_release(tsx->grp_lock);
146 pj_mutex_unlock(tsx->mutex);
162 #define DIALOG_ASSOCIATIONS_BUCKETS 251 187 hash = hash * 33 ^ *pos++;
219 const pjsip_dialog *dlg;
220 const char buf[
sizeof(pjsip_dialog *)];
229 key.dlg =
object->dlg;
243 const pjsip_dialog *right_key = arg;
248 right_key = object_right->
dlg;
251 if (object_left->
dlg == right_key) {
342 pjsip_transaction *tsx;
345 pj_str_t *remote_tag;
347 if (!rdata->msg_info.msg) {
351 if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) {
352 local_tag = &rdata->msg_info.to->tag;
353 remote_tag = &rdata->msg_info.from->tag;
355 local_tag = &rdata->msg_info.from->tag;
356 remote_tag = &rdata->msg_info.to->tag;
364 if (rdata->msg_info.msg->type == PJSIP_RESPONSE_MSG ||
365 pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_cancel_method) ||
366 rdata->msg_info.to->tag.slen != 0) {
367 dlg = pjsip_ua_find_dialog(&rdata->msg_info.cid->id, local_tag,
368 remote_tag, PJ_FALSE);
379 if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) {
384 pjsip_tsx_create_key(rdata->tp_info.pool, &tsx_key, PJSIP_ROLE_UAS,
385 pjsip_get_invite_method(), rdata);
387 pjsip_tsx_create_key(rdata->tp_info.pool, &tsx_key, PJSIP_ROLE_UAC,
388 &rdata->msg_info.cseq->method, rdata);
391 tsx = pjsip_tsx_layer_find_tsx(&tsx_key, PJ_TRUE);
393 ast_debug(3,
"Could not find matching transaction for %s\n",
394 pjsip_rx_data_get_info(rdata));
398 dlg = pjsip_tsx_get_dlg(tsx);
400 #ifdef HAVE_PJ_TRANSACTION_GRP_LOCK 401 pj_grp_lock_release(tsx->grp_lock);
403 pj_mutex_unlock(tsx->mutex);
428 return buf_hash_add(pj_strbuf(str), pj_strlen(str), hash);
451 pj_str_t *remote_tag;
454 if (!rdata->msg_info.msg) {
458 if (rdata->msg_info.msg->type == PJSIP_REQUEST_MSG) {
459 remote_tag = &rdata->msg_info.from->tag;
461 remote_tag = &rdata->msg_info.to->tag;
471 ast_debug(3,
"Calculated serializer %s to use for %s\n",
480 .name = {
"Endpoint Identifier", 19},
481 .priority = PJSIP_MOD_PRIORITY_TSX_LAYER - 3,
490 pjsip_rx_data *clone;
502 ast_debug(3,
"Searching for serializer associated with dialog %s for %s\n",
503 dlg->obj_name, pjsip_rx_data_get_info(rdata));
510 ast_debug(3,
"Found serializer %s associated with dialog %s\n",
518 }
else if (rdata->msg_info.msg->type == PJSIP_RESPONSE_MSG) {
519 ast_debug(3,
"No dialog serializer for %s. Using request transaction as basis.\n",
520 pjsip_rx_data_get_info(rdata));
530 }
else if (!pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_cancel_method)
531 || !pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_bye_method)) {
550 switch (rdata->tp_info.transport->key.type) {
551 case PJSIP_TRANSPORT_UDP6:
552 case PJSIP_TRANSPORT_UDP:
553 ast_debug(3,
"Taskprocessor overload alert: Ignoring '%s'.\n",
554 pjsip_rx_data_get_info(rdata));
557 ast_debug(3,
"Taskprocessor overload on non-udp transport. Received:'%s'. " 558 "Responding with a 503.\n", pjsip_rx_data_get_info(rdata));
571 if (pjsip_rx_data_clone(rdata, 0, &clone) != PJ_SUCCESS) {
586 pjsip_rx_data_free_cloned(clone);
641 if (!artificial_endpoint) {
656 ao2_ref(artificial_endpoint, +1);
662 char from_buf[PJSIP_MAX_URL_SIZE];
663 char callid_buf[PJSIP_MAX_URL_SIZE];
664 char method_buf[PJSIP_MAX_URL_SIZE];
666 pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, rdata->msg_info.from->uri, from_buf, PJSIP_MAX_URL_SIZE);
667 ast_copy_pj_str(callid_buf, &rdata->msg_info.cid->id, PJSIP_MAX_URL_SIZE);
668 ast_copy_pj_str(method_buf, &rdata->msg_info.msg->line.req.method.name, PJSIP_MAX_URL_SIZE);
671 " after %u tries in %.3f ms\n",
672 method_buf, from_buf,
673 pj_sockaddr_print(&rdata->pkt_info.src_addr, src_addr_buf,
sizeof(src_addr_buf), 3),
674 callid_buf, msg, count, period / 1000.0);
676 ast_log(
LOG_NOTICE,
"Request '%s' from '%s' failed for '%s' (callid: %s) - %s\n",
677 method_buf, from_buf,
678 pj_sockaddr_print(&rdata->pkt_info.src_addr, src_addr_buf,
sizeof(src_addr_buf), 3),
707 if (endpoint != artificial_endpoint
710 ast_debug(1,
"Endpoint '%s' not allowed by ACL\n",
722 int is_ack = rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD;
762 if (endpoint == artificial_endpoint && !is_ack) {
764 pjsip_uri *from = rdata->msg_info.from->uri;
766 if (PJSIP_URI_SCHEME_IS_SIP(from) || PJSIP_URI_SCHEME_IS_SIPS(from)) {
767 pjsip_sip_uri *sip_from = pjsip_uri_get_uri(from);
778 unid =
ao2_find(unidentified_requests, rdata->pkt_info.src_name,
790 strcpy(unid->
src_name, rdata->pkt_info.src_name);
815 memset(&addr, 0,
sizeof(addr));
829 pjsip_sip_uri *sip_uri;
832 if (!contact || contact->star) {
836 if (!PJSIP_URI_SCHEME_IS_SIP(contact->uri) && !PJSIP_URI_SCHEME_IS_SIPS(contact->uri)) {
840 sip_uri = pjsip_uri_get_uri(contact->uri);
847 int num_contact_addrs;
851 pjsip_contact_hdr *
contact = (pjsip_contact_hdr *)&rdata->msg_info.msg->hdr;
857 while ((contact = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, contact->next))) {
859 if (num_contact_addrs <= 0) {
862 for (i = 0; i < num_contact_addrs; ++i) {
883 int is_ack = rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD;
892 pjsip_tx_data *tdata;
901 pjsip_tx_data_dec_ref(tdata);
917 pjsip_tx_data_dec_ref(tdata);
923 pjsip_tx_data_dec_ref(tdata);
927 pjsip_tx_data_dec_ref(tdata);
928 }
else if (endpoint == artificial_endpoint) {
938 .name = {
"Request Authenticator", 21},
939 .priority = PJSIP_MOD_PRIORITY_APPLICATION - 2,
945 static pjsip_process_rdata_param param = {
947 .idx_after_start = 1,
949 pj_bool_t handled = PJ_FALSE;
950 pjsip_rx_data *rdata = data;
951 int is_request = rdata->msg_info.msg->type == PJSIP_REQUEST_MSG;
952 int is_ack = is_request ? rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD : 0;
956 if (!handled && is_request && !is_ack) {
965 pjsip_rx_data_free_cloned(rdata);
982 const char *right_key = arg;
990 cmp = strcmp(object_left->
src_name, right_key);
993 cmp = strncmp(object_left->
src_name, right_key, strlen(right_key));
1006 const char *right_key = arg;
1011 right_key = object_right->
src_name;
1014 if (strcmp(object_left->
src_name, right_key) == 0) {
1019 if (strncmp(object_left->
src_name, right_key, strlen(right_key)) == 0) {
1041 key =
object->src_name;
1099 "%*s: <IP Address%*.*s> <Count> <Age(sec)>\n",
1121 flexwidth, flexwidth,
1129 .
command =
"pjsip show unidentified_requests",
1130 .
usage =
"Usage: pjsip show unidentified_requests\n" 1131 " Show the PJSIP Unidentified Requests\n"),
1142 if (ms > (*maxage) * 2 * 1000) {
1151 unsigned int maxage;
1169 char *identifier_order;
1173 if (identifier_order) {
1174 char *identify_method;
1180 if (!strcmp(identify_method,
"auth_username")) {
1191 if (!fake_auth || strcmp(fake_auth->
realm, default_realm)) {
1229 for (idx = 0; idx <
ARRAY_LEN(distributor_pool); ++idx) {
1231 distributor_pool[idx] =
NULL;
1248 for (idx = 0; idx <
ARRAY_LEN(distributor_pool); ++idx) {
1253 if (!distributor_pool[idx]) {
1264 if (!unidentified_requests) {
1271 if (!dialog_associations) {
1282 if (!prune_context) {
1315 if (!unid_formatter) {
1320 unid_formatter->
name =
"unidentified_request";
1348 if (prune_context) {
int ast_sched_start_thread(struct ast_sched_context *con)
Start a thread for processing scheduler entries.
static const char * cli_unid_get_id(const void *obj)
struct ast_str * output_buffer
struct ao2_container *(* get_container)(const char *regex)
#define AST_SOCKADDR_BUFLEN
int ast_sip_initialize_distributor(void)
void ast_sched_clean_by_callback(struct ast_sched_context *con, ast_sched_cb match, ast_sched_cb cleanup_cb)
Clean all scheduled events with matching callback.
#define AST_CLI_DEFINE(fn, txt,...)
static int apply_endpoint_contact_acl(pjsip_rx_data *rdata, struct ast_sip_endpoint *endpoint)
void ast_taskprocessor_build_name(char *buf, unsigned int size, const char *format,...)
Build a taskprocessor name with a sequence number on the end.
static int expire_requests(void *object, void *arg, int flags)
Asterisk main include file. File version handling, generic pbx functions.
struct ast_sip_cli_formatter_entry * unid_formatter
void ast_sip_report_auth_failed_challenge_response(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Send a security event notification for when a challenge response has failed.
int ast_sip_requires_authentication(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Determine if an incoming request requires authentication.
static unsigned int unidentified_prune_interval
static char default_realm[MAX_REALM_LENGTH+1]
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
static int buf_hash_add(const char *pos, size_t len, int hash)
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
struct ast_sip_endpoint * ast_sip_get_artificial_endpoint(void)
Retrieves a reference to the artificial endpoint.
The arg parameter is a search key, but is not an object.
#define ast_test_flag(p, flag)
static int create_artificial_endpoint(void)
void ast_sip_dialog_set_serializer(pjsip_dialog *dlg, struct ast_taskprocessor *serializer)
Set a serializer on a SIP dialog so requests and responses are automatically serialized.
static void check_endpoint(pjsip_rx_data *rdata, struct unidentified_request *unid, const char *name)
static struct ast_taskprocessor * find_request_serializer(pjsip_rx_data *rdata)
static int create_artificial_auth(void)
static struct ao2_container * unidentified_requests
descriptor for a cli entry.
static int dialog_associations_hash(const void *obj, int flags)
#define ao2_callback(c, flags, cb_fn, arg)
struct ast_taskprocessor * ast_taskprocessor_get(const char *name, enum ast_tps_options create)
Get a reference to a taskprocessor with the specified name and create the taskprocessor if necessary...
enum ast_sip_taskprocessor_overload_trigger ast_sip_get_taskprocessor_overload_trigger(void)
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
static struct ao2_container * cli_unid_get_container(const char *regex)
#define AST_VECTOR_APPEND(vec, elem)
Append an element to a vector, growing the vector if needed.
void ast_sip_dialog_set_endpoint(pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint)
Set an endpoint on a SIP dialog so in-dialog requests do not undergo endpoint lookup.
static int using_auth_username
Assume that the ao2_container is already locked.
int ast_sched_add_variable(struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data, int variable) attribute_warn_unused_result
Adds a scheduled event with rescheduling support.
int(* iterate)(void *container, ao2_callback_fn callback, void *args)
static struct ast_cli_entry cli_commands[]
static int extract_contact_addr(pjsip_contact_hdr *contact, struct ast_sockaddr **addrs)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
static void * cli_unid_retrieve_by_id(const char *id)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
#define ao2_global_obj_ref(holder)
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
const char * ast_taskprocessor_name(struct ast_taskprocessor *tps)
Return the name of the taskprocessor singleton.
static int distribute(void *data)
#define ao2_alloc_options(data_size, destructor_fn, options)
#define ao2_link_flags(container, obj, flags)
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
void ast_sip_get_default_realm(char *realm, size_t size)
Retrieve the global default realm.
#define ast_strdup(str)
A wrapper for strdup()
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
static void log_failed_request(pjsip_rx_data *rdata, char *msg, unsigned int count, unsigned int period)
static AO2_GLOBAL_OBJ_STATIC(artificial_auth)
static pjsip_module endpoint_mod
#define AST_TASKPROCESSOR_MAX_NAME
Suggested maximum taskprocessor name length (less null terminator).
static int dialog_associations_cmp(void *obj, void *arg, int flags)
Socket address structure.
struct ast_taskprocessor * ast_threadpool_serializer_get_current(void)
Get the threadpool serializer currently associated with this thread.
char * ast_sip_cli_traverse_objects(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static pj_bool_t endpoint_lookup(pjsip_rx_data *rdata)
static pjsip_module auth_mod
static int suspects_hash(const void *obj, int flags)
static unsigned int unidentified_period
static int clean_task(const void *data)
#define ast_strlen_zero(foo)
static struct ao2_container * dialog_associations
int ast_sip_register_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Registers a CLI formatter.
struct ast_acl_list * acl
static int suspects_sort(const void *obj, const void *arg, int flags)
static pj_bool_t authenticate(pjsip_rx_data *rdata)
void ast_sip_destroy_distributor(void)
static void distributor_pool_shutdown(void)
#define ast_debug(level,...)
Log a DEBUG message.
int() ao2_callback_fn(void *obj, void *arg, int flags)
Type of a generic callback function.
void ast_sip_report_failed_acl(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, const char *name)
Send a security event notification for when an ACL check fails.
The arg parameter is a partial search key similar to OBJ_SEARCH_KEY.
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
struct ast_acl_list * contact_acl
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
#define CLI_INDENT_TO_SPACES(x)
static struct ast_sip_endpoint * artificial_endpoint
Access Control of various sorts.
struct ast_sip_endpoint * ast_sip_dialog_get_endpoint(pjsip_dialog *dlg)
Get the endpoint associated with this dialog.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
#define ao2_ref(o, delta)
struct ast_sip_endpoint * ast_sip_identify_endpoint(pjsip_rx_data *rdata)
Determine the endpoint that has sent a SIP message.
#define ast_strdupa(s)
duplicate a string in memory from the stack
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
void *(* retrieve_by_id)(const char *id)
static int apply_endpoint_acl(pjsip_rx_data *rdata, struct ast_sip_endpoint *endpoint)
static void global_loaded(const char *object_type)
struct ao2_container * container
struct ast_sip_endpoint * endpoint
int ast_sip_unregister_cli_formatter(struct ast_sip_cli_formatter_entry *formatter)
Unregisters a CLI formatter.
An entity with which Asterisk communicates.
int ast_sip_register_service(pjsip_module *module)
Register a SIP service in Asterisk.
enum ast_acl_sense ast_apply_acl(struct ast_acl_list *acl_list, const struct ast_sockaddr *addr, const char *purpose)
Apply a set of rules to a given IP address.
int ast_acl_list_is_empty(struct ast_acl_list *acl_list)
Determines if an ACL is empty or if it contains entries.
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.
struct ast_sched_context * ast_sched_context_create(void)
Create a scheduler context.
static int cli_unid_print_header(void *obj, void *arg, int flags)
#define CLI_HEADER_FILLER
static int cli_unid_iterate(void *container, ao2_callback_fn callback, void *args)
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
struct ast_sip_auth_vector inbound_auths
#define ao2_unlink(container, obj)
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.
static pjsip_module distributor_mod
const ast_string_field realm
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
int ast_sip_push_task(struct ast_taskprocessor *serializer, int(*sip_task)(void *), void *task_data)
Pushes a task to SIP servants.
static pj_status_t record_serializer(pjsip_tx_data *tdata)
Interface for a sorcery object type observer.
#define ao2_global_obj_release(holder)
void ast_sip_report_invalid_endpoint(const char *name, pjsip_rx_data *rdata)
Send a security event notification for when an invalid endpoint is requested.
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
static int suspects_compare(void *obj, void *arg, int flags)
unsigned int ast_taskprocessor_get_subsystem_alert(const char *subsystem)
Get the current taskprocessor high water alert count by sybsystem.
struct ast_sched_context * prune_context
struct ast_taskprocessor * ast_sip_create_serializer(const char *name)
Create a new serializer for SIP tasks.
char * ast_sip_get_endpoint_identifier_order(void)
Retrieve the global endpoint_identifier_order setting.
static int buf_hash(const char *pos, size_t len)
static int prune_task(const void *data)
#define ao2_alloc(data_size, destructor_fn)
struct ast_taskprocessor * ast_sip_get_distributor_serializer(pjsip_rx_data *rdata)
Determine the distributor serializer for the SIP message.
void * ast_sorcery_alloc(const struct ast_sorcery *sorcery, const char *type, const char *id)
Allocate an object.
void ast_sip_get_unidentified_request_thresholds(unsigned int *count, unsigned int *period, unsigned int *prune_interval)
Retrieve the unidentified request security event thresholds.
static int regex(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
const ast_string_field auth_pass
struct ast_taskprocessor * serializer
enum ast_sip_auth_type type
#define ao2_find(container, arg, flags)
An API for managing task processing threads that can be shared across modules.
const char *(* get_id)(const void *obj)
static pj_bool_t distributor(pjsip_rx_data *rdata)
void(* loaded)(const char *object_type)
Callback for when an object type is loaded/reloaded.
static unsigned int unidentified_count
static int pjstr_hash_add(pj_str_t *str, int hash)
static struct ast_taskprocessor * distributor_pool[DISTRIBUTOR_POOL_SIZE]
pjsip_endpoint * ast_sip_get_pjsip_endpoint(void)
Get a pointer to the PJSIP endpoint.
return a reference to a taskprocessor ONLY if it already exists
struct ast_sip_endpoint * ast_pjsip_rdata_get_endpoint(pjsip_rx_data *rdata)
Get the looked-up endpoint on an out-of dialog request or response.
#define ao2_global_obj_replace_unref(holder, obj)
static int distributor_pool_setup(void)
#define DEFAULT_SUSPECTS_BUCKETS
static int pjstr_hash(pj_str_t *str)
The arg parameter is an object of the same type.
void ast_sorcery_observer_remove(const struct ast_sorcery *sorcery, const char *type, const struct ast_sorcery_observer *callbacks)
Remove an observer from a specific object type.
struct ast_flags ast_options
char * strsep(char **str, const char *delims)
A ast_taskprocessor structure is a singleton by name.
#define ao2_replace(dst, src)
#define DISTRIBUTOR_POOL_SIZE
static force_inline int attribute_pure ast_str_hash_restrict(unsigned int hash)
Restrict hash value range.
static void apply_acls(pjsip_rx_data *rdata)
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
void ast_sip_report_auth_challenge_sent(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata)
Send a security event notification for when an authentication challenge is sent.
struct timeval first_seen
static int cli_unid_print_body(void *obj, void *arg, int flags)
void * ast_taskprocessor_unreference(struct ast_taskprocessor *tps)
Unreference the specified taskprocessor and its reference count will decrement.
void ast_sip_unregister_service(pjsip_module *module)
unsigned int ast_taskprocessor_alert_get(void)
Get the current taskprocessor high water alert count.
void ast_sip_report_auth_success(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata)
Send a security event notification for when authentication succeeds.
#define ao2_unlink_flags(container, obj, flags)
#define DIALOG_ASSOCIATIONS_BUCKETS
enum ast_sip_check_auth_result ast_sip_check_authentication(struct ast_sip_endpoint *endpoint, pjsip_rx_data *rdata, pjsip_tx_data *tdata)
Method to determine authentication status of an incoming request.
static struct ast_sorcery_observer global_observer
Observer which is used to update our interval and default_realm when the global setting changes...
ao2_callback_fn * print_header
static enum ast_sip_taskprocessor_overload_trigger overload_trigger
Search option field mask.
static char context[AST_MAX_CONTEXT]
static struct ast_sip_auth * alloc_artificial_auth(char *default_realm)
ao2_callback_fn * print_body
static pjsip_dialog * find_dialog(pjsip_rx_data *rdata)
ast_sip_taskprocessor_overload_trigger
const ast_string_field auth_user
void ast_sched_context_destroy(struct ast_sched_context *c)
destroys a schedule context
struct ast_sip_auth * ast_sip_get_artificial_auth(void)
Retrieves a reference to the artificial auth.
void ast_sorcery_reload_object(const struct ast_sorcery *sorcery, const char *type)
Inform any wizards of a specific object type to reload persistent objects.
int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str, int flags, int family)
Parses a string with an IPv4 or IPv6 address and place results into an array.
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.