Asterisk - The Open Source Telephony Project GIT-master-754dea3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
config_global.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 2013, Digium, Inc.
5 *
6 * Mark Michelson <mmichelson@digium.com>
7 *
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
13 *
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
17 */
18
19#include "asterisk.h"
20
21#include <pjsip.h>
22#include <pjlib.h>
23
24#include "asterisk/res_pjsip.h"
26#include "asterisk/pbx.h"
27#include "asterisk/sorcery.h"
31
32#define DEFAULT_MAX_FORWARDS 70
33#define DEFAULT_KEEPALIVE_INTERVAL 90
34#define DEFAULT_USERAGENT_PREFIX "Asterisk PBX"
35#define DEFAULT_OUTBOUND_ENDPOINT "default_outbound_endpoint"
36#define DEFAULT_DEBUG "no"
37#define DEFAULT_ENDPOINT_IDENTIFIER_ORDER "ip,username,anonymous"
38#define DEFAULT_MAX_INITIAL_QUALIFY_TIME 0
39#define DEFAULT_FROM_USER "asterisk"
40#define DEFAULT_REALM "asterisk"
41#define DEFAULT_REGCONTEXT ""
42#define DEFAULT_CONTACT_EXPIRATION_CHECK_INTERVAL 30
43#define DEFAULT_DISABLE_MULTI_DOMAIN 0
44#define DEFAULT_VOICEMAIL_EXTENSION ""
45#define DEFAULT_UNIDENTIFIED_REQUEST_COUNT 5
46#define DEFAULT_UNIDENTIFIED_REQUEST_PERIOD 5
47#define DEFAULT_UNIDENTIFIED_REQUEST_PRUNE_INTERVAL 30
48#define DEFAULT_MWI_TPS_QUEUE_HIGH AST_TASKPROCESSOR_HIGH_WATER_LEVEL
49#define DEFAULT_MWI_TPS_QUEUE_LOW -1
50#define DEFAULT_MWI_DISABLE_INITIAL_UNSOLICITED 0
51#define DEFAULT_ALLOW_SENDING_180_AFTER_183 0
52#define DEFAULT_IGNORE_URI_USER_OPTIONS 0
53#define DEFAULT_USE_CALLERID_CONTACT 0
54#define DEFAULT_SEND_CONTACT_STATUS_ON_UPDATE_REGISTRATION 0
55#define DEFAULT_TASKPROCESSOR_OVERLOAD_TRIGGER TASKPROCESSOR_OVERLOAD_TRIGGER_GLOBAL
56#define DEFAULT_NOREFERSUB 1
57#define DEFAULT_ALL_CODECS_ON_EMPTY_REINVITE 0
58#define DEFAULT_AUTH_ALGORITHMS_UAS "MD5"
59#define DEFAULT_AUTH_ALGORITHMS_UAC "MD5"
60
61/*!
62 * \brief Cached global config object
63 *
64 * \details
65 * Cached so we don't have to keep asking sorcery for the config.
66 * We could ask for it hundreds of times a second if not more.
67 */
68static AO2_GLOBAL_OBJ_STATIC(global_cfg);
69
70static char default_useragent[256];
71
78 /*! Debug logging yes|no|host */
80 /*! Order by which endpoint identifiers are checked (comma separated list) */
82 /*! User name to place in From header if there is no better option */
84 /*! Default voicemail extension */
86 /*! Realm to use in challenges before an endpoint is identified */
88 /*! Default authentication algorithms for UAS */
90 /*! Default authentication algorithms for UAC */
92 );
93 /*! Value to put in Max-Forwards header */
94 unsigned int max_forwards;
95 /*! The interval at which to send keep alive messages to active connection-oriented transports */
96 unsigned int keep_alive_interval;
97 /*! The maximum time for all contacts to be qualified at startup */
99 /*! The interval at which to check for expired contacts */
101 /*! Nonzero to disable multi domain support */
103 /*! Nonzero to disable changing 180/SDP to 183/SDP */
105 /*! The maximum number of unidentified requests per source IP address before a security event is logged */
107 /*! The period during which unidentified requests are accumulated */
109 /*! Interval at which expired unidentified requests will be pruned */
111 struct {
112 /*! Taskprocessor high water alert trigger level */
113 unsigned int tps_queue_high;
114 /*! Taskprocessor low water clear alert level. */
116 /*! Nonzero to disable sending unsolicited mwi to all endpoints on startup */
119 /*! Nonzero if URI user field options are ignored. */
121 /*! Nonzero if CALLERID(num) is to be used as the default contact username instead of default_from_user */
123 /*! Nonzero if need to send AMI ContactStatus event when a contact is updated */
125 /*! Trigger the distributor should use to pause accepting new dialogs */
127 /*! Nonzero if norefersub is to be sent in Supported header */
128 unsigned int norefersub;
129 /*! Nonzero if we should return all codecs on empty re-INVITE */
131};
132
133static void global_destructor(void *obj)
134{
135 struct global_config *cfg = obj;
136
138}
139
140static void *global_alloc(const char *name)
141{
142 struct global_config *cfg;
143
144 cfg = ast_sorcery_generic_alloc(sizeof(*cfg), global_destructor);
145 if (!cfg || ast_string_field_init(cfg, 100)) {
146 ao2_cleanup(cfg);
147 return NULL;
148 }
149
150 return cfg;
151}
152
153/*
154 * There is ever only one global section, so we can use a single global
155 * value here to track the regcontext through reloads.
156 */
158
159static int check_regcontext(const struct global_config *cfg)
160{
161 char *current = NULL;
162
163 if (previous_regcontext && !strcmp(previous_regcontext, cfg->regcontext)) {
164 /* Nothing changed so nothing to do */
165 return 0;
166 }
167
168 if (!ast_strlen_zero(cfg->regcontext)) {
170 if (!current) {
171 return -1;
172 }
173
176 return -1;
177 }
178 }
179
184 }
185
186 if (current) {
188 }
189
190 return 0;
191}
192
193static int global_apply(const struct ast_sorcery *sorcery, void *obj)
194{
195 struct global_config *cfg = obj;
196 char max_forwards[10];
197 struct pjsip_auth_algorithm_type_vector algorithms;
198 int res = 0;
199
200 if (ast_strlen_zero(cfg->debug)) {
202 "Global option 'debug' can't be empty. Set it to a valid value or remove the entry to accept 'no' as the default\n");
203 return -1;
204 }
205
208 "Global option 'default_from_user' can't be empty. Set it to a valid value or remove the entry to accept 'asterisk' as the default\n");
209 return -1;
210 }
211
212 snprintf(max_forwards, sizeof(max_forwards), "%u", cfg->max_forwards);
213
215 ast_sip_add_global_request_header("User-Agent", cfg->useragent, 1);
217
218 if (check_regcontext(cfg)) {
219 return -1;
220 }
221
222 AST_VECTOR_INIT(&algorithms, 0);
224 &algorithms, "UAS", cfg->default_auth_algorithms_uas);
225 AST_VECTOR_FREE(&algorithms);
226 if (res) {
227 ast_log(LOG_WARNING, "global: Invalid values in default_auth_algorithms_uas. "
228 "Defaulting to %s\n", DEFAULT_AUTH_ALGORITHMS_UAS);
229 ast_string_field_set(cfg, default_auth_algorithms_uas, DEFAULT_AUTH_ALGORITHMS_UAS);
230 }
231 AST_VECTOR_INIT(&algorithms, 0);
233 &algorithms, "UAC", cfg->default_auth_algorithms_uac);
234 AST_VECTOR_FREE(&algorithms);
235 if (res) {
236 ast_log(LOG_WARNING, "global: Invalid values in default_auth_algorithms_uac. "
237 "Defaulting to %s\n", DEFAULT_AUTH_ALGORITHMS_UAC);
238 ast_string_field_set(cfg, default_auth_algorithms_uac, DEFAULT_AUTH_ALGORITHMS_UAC);
239 }
240
241 ao2_t_global_obj_replace_unref(global_cfg, cfg, "Applying global settings");
242 return 0;
243}
244
245static struct global_config *get_global_cfg(void)
246{
247 return ao2_global_obj_ref(global_cfg);
248}
249
251{
252 char *str;
253 struct global_config *cfg;
254
255 cfg = get_global_cfg();
256 if (!cfg) {
258 }
259
261 ao2_ref(cfg, -1);
262 return str;
263}
264
266{
267 char *res;
268 struct global_config *cfg;
269
270 cfg = get_global_cfg();
271 if (!cfg) {
273 }
274
275 res = ast_strdup(cfg->debug);
276 ao2_ref(cfg, -1);
277 return res;
278}
279
281{
282 char *res;
283 struct global_config *cfg;
284
285 cfg = get_global_cfg();
286 if (!cfg) {
288 }
289
290 res = ast_strdup(cfg->regcontext);
291 ao2_ref(cfg, -1);
292
293 return res;
294}
295
297{
298 char *res;
299 struct global_config *cfg;
300
301 cfg = get_global_cfg();
302 if (!cfg) {
304 }
305
307 ao2_ref(cfg, -1);
308
309 return res;
310}
311
313{
314 char *res;
315 struct global_config *cfg;
316
317 cfg = get_global_cfg();
318 if (!cfg) {
320 }
321
323 ao2_ref(cfg, -1);
324 return res;
325}
326
328{
329 unsigned int interval;
330 struct global_config *cfg;
331
332 cfg = get_global_cfg();
333 if (!cfg) {
335 }
336
337 interval = cfg->keep_alive_interval;
338 ao2_ref(cfg, -1);
339 return interval;
340}
341
343{
344 unsigned int interval;
345 struct global_config *cfg;
346
347 cfg = get_global_cfg();
348 if (!cfg) {
350 }
351
352 interval = cfg->contact_expiration_check_interval;
353 ao2_ref(cfg, -1);
354 return interval;
355}
356
358{
359 unsigned int disable_multi_domain;
360 struct global_config *cfg;
361
362 cfg = get_global_cfg();
363 if (!cfg) {
365 }
366
368 ao2_ref(cfg, -1);
370}
371
373{
374 unsigned int time;
375 struct global_config *cfg;
376
377 cfg = get_global_cfg();
378 if (!cfg) {
380 }
381
382 time = cfg->max_initial_qualify_time;
383 ao2_ref(cfg, -1);
384 return time;
385}
386
387void ast_sip_get_unidentified_request_thresholds(unsigned int *count, unsigned int *period,
388 unsigned int *prune_interval)
389{
390 struct global_config *cfg;
391
392 cfg = get_global_cfg();
393 if (!cfg) {
397 return;
398 }
399
400 *count = cfg->unidentified_request_count;
401 *period = cfg->unidentified_request_period;
402 *prune_interval = cfg->unidentified_request_prune_interval;
403
404 ao2_ref(cfg, -1);
405 return;
406}
407
408void ast_sip_get_default_realm(char *realm, size_t size)
409{
410 struct global_config *cfg;
411
412 cfg = get_global_cfg();
413 if (!cfg) {
414 ast_copy_string(realm, DEFAULT_REALM, size);
415 } else {
416 ast_copy_string(realm, cfg->default_realm, size);
417 ao2_ref(cfg, -1);
418 }
419}
420
422{
423 struct global_config *cfg;
424
425 cfg = get_global_cfg();
426 if (!cfg) {
428 } else {
430 ao2_ref(cfg, -1);
431 }
432}
433
435{
436 struct global_config *cfg;
437
438 cfg = get_global_cfg();
439 if (!cfg) {
441 } else {
443 ao2_ref(cfg, -1);
444 }
445}
446
447void ast_sip_get_default_from_user(char *from_user, size_t size)
448{
449 struct global_config *cfg;
450
451 cfg = get_global_cfg();
452 if (!cfg) {
453 ast_copy_string(from_user, DEFAULT_FROM_USER, size);
454 } else {
455 ast_copy_string(from_user, cfg->default_from_user, size);
456 ao2_ref(cfg, -1);
457 }
458}
459
460
462{
463 unsigned int tps_queue_high;
464 struct global_config *cfg;
465
466 cfg = get_global_cfg();
467 if (!cfg) {
469 }
470
472 ao2_ref(cfg, -1);
473 return tps_queue_high;
474}
475
477{
478 int tps_queue_low;
479 struct global_config *cfg;
480
481 cfg = get_global_cfg();
482 if (!cfg) {
484 }
485
487 ao2_ref(cfg, -1);
488 return tps_queue_low;
489}
490
492{
493 unsigned int disable_initial_unsolicited;
494 struct global_config *cfg;
495
496 cfg = get_global_cfg();
497 if (!cfg) {
499 }
500
502 ao2_ref(cfg, -1);
504}
505
507{
508 unsigned int allow_sending_180_after_183;
509 struct global_config *cfg;
510
511 cfg = get_global_cfg();
512 if (!cfg) {
514 }
515
517 ao2_ref(cfg, -1);
519}
520
522{
523 unsigned int ignore_uri_user_options;
524 struct global_config *cfg;
525
526 cfg = get_global_cfg();
527 if (!cfg) {
529 }
530
532 ao2_ref(cfg, -1);
534}
535
537{
538 unsigned int use_callerid_contact;
539 struct global_config *cfg;
540
541 cfg = get_global_cfg();
542 if (!cfg) {
544 }
545
547 ao2_ref(cfg, -1);
549}
550
552{
554 struct global_config *cfg;
555
556 cfg = get_global_cfg();
557 if (!cfg) {
559 }
560
562 ao2_ref(cfg, -1);
564}
565
567{
569 struct global_config *cfg;
570
571 cfg = get_global_cfg();
572 if (!cfg) {
574 }
575
576 trigger = cfg->overload_trigger;
577 ao2_ref(cfg, -1);
578 return trigger;
579}
580
581unsigned int ast_sip_get_norefersub(void)
582{
583 unsigned int norefersub;
584 struct global_config *cfg;
585
586 cfg = get_global_cfg();
587 if (!cfg) {
588 return DEFAULT_NOREFERSUB;
589 }
590
591 norefersub = cfg->norefersub;
592 ao2_ref(cfg, -1);
593 return norefersub;
594}
595
597{
598 unsigned int all_codecs_on_empty_reinvite;
599 struct global_config *cfg;
600
601 cfg = get_global_cfg();
602 if (!cfg) {
604 }
605
607 ao2_ref(cfg, -1);
609}
610
611static int overload_trigger_handler(const struct aco_option *opt,
612 struct ast_variable *var, void *obj)
613{
614 struct global_config *cfg = obj;
615 if (!strcasecmp(var->value, "none")) {
617 } else if (!strcasecmp(var->value, "global")) {
619 } else if (!strcasecmp(var->value, "pjsip_only")) {
621 } else {
622 ast_log(LOG_WARNING, "Unknown overload trigger '%s' specified for %s\n",
623 var->value, var->name);
624 return -1;
625 }
626 return 0;
627}
628
629static const char *overload_trigger_map[] = {
633};
634
636{
637 return ARRAY_IN_BOUNDS(trigger, overload_trigger_map) ?
638 overload_trigger_map[trigger] : "";
639}
640
641static int overload_trigger_to_str(const void *obj, const intptr_t *args, char **buf)
642{
643 const struct global_config *cfg = obj;
645 return 0;
646}
647
648/*!
649 * \internal
650 * \brief Observer to set default global object if none exist.
651 *
652 * \param name Module name owning the sorcery instance.
653 * \param sorcery Instance being observed.
654 * \param object_type Name of object being observed.
655 * \param reloaded Non-zero if the object is being reloaded.
656 */
657static void global_loaded_observer(const char *name, const struct ast_sorcery *sorcery, const char *object_type, int reloaded)
658{
659 struct ao2_container *globals;
660 struct global_config *cfg;
661
662 if (strcmp(object_type, "global")) {
663 /* Not interested */
664 return;
665 }
666
669 if (globals) {
670 int count;
671
673 ao2_ref(globals, -1);
674
675 if (1 < count) {
677 "At most one pjsip.conf type=global object can be defined. You have %d defined.\n",
678 count);
679 return;
680 }
681 if (count) {
682 return;
683 }
684 }
685
686 ast_debug(1, "No pjsip.conf type=global object exists so applying defaults.\n");
687 cfg = ast_sorcery_alloc(sorcery, "global", NULL);
688 if (!cfg) {
689 return;
690 }
691 global_apply(sorcery, cfg);
692 ao2_ref(cfg, -1);
693}
694
697};
698
700{
701 struct global_config *cfg = get_global_cfg();
702
703 if (!cfg) {
704 cfg = ast_sorcery_alloc(ast_sip_get_sorcery(), "global", NULL);
705 if (!cfg) {
706 return -1;
707 }
708 }
709
710 ast_str_append(&context->output_buffer, 0, "\nGlobal Settings:\n\n");
712
713 ao2_ref(cfg, -1);
714 return 0;
715}
716
718{
720
722
726 }
727
728 ao2_t_global_obj_release(global_cfg, "Module is unloading");
729
730 return 0;
731}
732
733
735{
737
738 snprintf(default_useragent, sizeof(default_useragent), "%s %s",
740
741 ast_sorcery_apply_default(sorcery, "global", "config", "pjsip.conf,criteria=type=global,single_object=yes,explicit_name=global");
742
744 return -1;
745 }
746
747 ast_sorcery_object_field_register(sorcery, "global", "type", "", OPT_NOOP_T, 0, 0);
748 ast_sorcery_object_field_register(sorcery, "global", "max_forwards",
752 OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, useragent));
753 ast_sorcery_object_field_register(sorcery, "global", "default_outbound_endpoint",
755 OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, default_outbound_endpoint));
758 ast_sorcery_object_field_register(sorcery, "global", "endpoint_identifier_order",
760 OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, endpoint_identifier_order));
761 ast_sorcery_object_field_register(sorcery, "global", "keep_alive_interval",
763 OPT_UINT_T, 0, FLDSET(struct global_config, keep_alive_interval));
764 ast_sorcery_object_field_register(sorcery, "global", "max_initial_qualify_time",
766 OPT_UINT_T, 0, FLDSET(struct global_config, max_initial_qualify_time));
767 ast_sorcery_object_field_register(sorcery, "global", "default_from_user", DEFAULT_FROM_USER,
768 OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, default_from_user));
769 ast_sorcery_object_field_register(sorcery, "global", "default_voicemail_extension",
774 ast_sorcery_object_field_register(sorcery, "global", "contact_expiration_check_interval",
776 OPT_UINT_T, 0, FLDSET(struct global_config, contact_expiration_check_interval));
777 ast_sorcery_object_field_register(sorcery, "global", "disable_multi_domain",
778 DEFAULT_DISABLE_MULTI_DOMAIN ? "yes" : "no",
779 OPT_BOOL_T, 1, FLDSET(struct global_config, disable_multi_domain));
780 ast_sorcery_object_field_register(sorcery, "global", "unidentified_request_count",
782 OPT_UINT_T, 0, FLDSET(struct global_config, unidentified_request_count));
783 ast_sorcery_object_field_register(sorcery, "global", "unidentified_request_period",
785 OPT_UINT_T, 0, FLDSET(struct global_config, unidentified_request_period));
786 ast_sorcery_object_field_register(sorcery, "global", "unidentified_request_prune_interval",
788 OPT_UINT_T, 0, FLDSET(struct global_config, unidentified_request_prune_interval));
789 ast_sorcery_object_field_register(sorcery, "global", "default_realm", DEFAULT_REALM,
791 ast_sorcery_object_field_register(sorcery, "global", "mwi_tps_queue_high",
794 ast_sorcery_object_field_register(sorcery, "global", "mwi_tps_queue_low",
797 ast_sorcery_object_field_register(sorcery, "global", "mwi_disable_initial_unsolicited",
800 ast_sorcery_object_field_register(sorcery, "global", "allow_sending_180_after_183",
802 OPT_BOOL_T, 1, FLDSET(struct global_config, allow_sending_180_after_183));
803 ast_sorcery_object_field_register(sorcery, "global", "ignore_uri_user_options",
804 DEFAULT_IGNORE_URI_USER_OPTIONS ? "yes" : "no",
805 OPT_BOOL_T, 1, FLDSET(struct global_config, ignore_uri_user_options));
806 ast_sorcery_object_field_register(sorcery, "global", "use_callerid_contact",
807 DEFAULT_USE_CALLERID_CONTACT ? "yes" : "no",
808 OPT_YESNO_T, 1, FLDSET(struct global_config, use_callerid_contact));
809 ast_sorcery_object_field_register(sorcery, "global", "send_contact_status_on_update_registration",
811 OPT_YESNO_T, 1, FLDSET(struct global_config, send_contact_status_on_update_registration));
812 ast_sorcery_object_field_register_custom(sorcery, "global", "taskprocessor_overload_trigger",
815 ast_sorcery_object_field_register(sorcery, "global", "norefersub",
816 DEFAULT_NOREFERSUB ? "yes" : "no",
817 OPT_YESNO_T, 1, FLDSET(struct global_config, norefersub));
818 ast_sorcery_object_field_register(sorcery, "global", "all_codecs_on_empty_reinvite",
820 OPT_BOOL_T, 1, FLDSET(struct global_config, all_codecs_on_empty_reinvite));
821 ast_sorcery_object_field_register(sorcery, "global", "default_auth_algorithms_uas",
823 STRFLDSET(struct global_config, default_auth_algorithms_uas));
824 ast_sorcery_object_field_register(sorcery, "global", "default_auth_algorithms_uac",
826 STRFLDSET(struct global_config, default_auth_algorithms_uac));
827
829 return -1;
830 }
832
833 return 0;
834}
const char * str
Definition: app_jack.c:150
#define var
Definition: ast_expr2f.c:605
Asterisk version information.
const char * ast_get_version(void)
Retrieve the Asterisk version string.
Asterisk main include file. File version handling, generic pbx functions.
#define __stringify(x)
Definition: asterisk.h:216
#define ast_free(a)
Definition: astmm.h:180
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ast_log
Definition: astobj2.c:42
#define ao2_t_global_obj_replace_unref(holder, obj, tag)
Definition: astobj2.h:904
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_global_obj_ref(holder)
Get a reference to the object stored in the global holder.
Definition: astobj2.h:918
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
#define ao2_t_global_obj_release(holder, tag)
Definition: astobj2.h:861
static struct console_pvt globals
static char regcontext[AST_MAX_CONTEXT]
Definition: chan_iax2.c:349
unsigned int ast_sip_get_norefersub(void)
Retrieve the global setting 'norefersub'.
unsigned int ast_sip_get_max_initial_qualify_time(void)
Retrieve the system max initial qualify time.
unsigned int ast_sip_get_keep_alive_interval(void)
Retrieve the system keep alive interval setting.
#define DEFAULT_FROM_USER
Definition: config_global.c:39
static void global_loaded_observer(const char *name, const struct ast_sorcery *sorcery, const char *object_type, int reloaded)
unsigned int ast_sip_get_allow_sending_180_after_183(void)
Retrieve the global setting 'allow_sending_180_after_183'.
static void global_destructor(void *obj)
char * ast_sip_get_endpoint_identifier_order(void)
Retrieve the global endpoint_identifier_order setting.
static int overload_trigger_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
#define DEFAULT_NOREFERSUB
Definition: config_global.c:56
static void * global_alloc(const char *name)
static AO2_GLOBAL_OBJ_STATIC(global_cfg)
Cached global config object.
static char default_useragent[256]
Definition: config_global.c:70
int ast_sip_destroy_sorcery_global(void)
#define DEFAULT_UNIDENTIFIED_REQUEST_COUNT
Definition: config_global.c:45
#define DEFAULT_USERAGENT_PREFIX
Definition: config_global.c:34
#define DEFAULT_CONTACT_EXPIRATION_CHECK_INTERVAL
Definition: config_global.c:42
static const char * overload_trigger_map[]
static int check_regcontext(const struct global_config *cfg)
int ast_sip_initialize_sorcery_global(void)
char * ast_sip_global_default_outbound_endpoint(void)
enum ast_sip_taskprocessor_overload_trigger ast_sip_get_taskprocessor_overload_trigger(void)
#define DEFAULT_SEND_CONTACT_STATUS_ON_UPDATE_REGISTRATION
Definition: config_global.c:54
#define DEFAULT_MAX_FORWARDS
Definition: config_global.c:32
#define DEFAULT_MAX_INITIAL_QUALIFY_TIME
Definition: config_global.c:38
#define DEFAULT_VOICEMAIL_EXTENSION
Definition: config_global.c:44
#define DEFAULT_DEBUG
Definition: config_global.c:36
static const struct ast_sorcery_instance_observer observer_callbacks_global
unsigned int ast_sip_get_send_contact_status_on_update_registration(void)
Retrieve the global setting 'send_contact_status_on_update_registration'.
static struct global_config * get_global_cfg(void)
static char * previous_regcontext
#define DEFAULT_DISABLE_MULTI_DOMAIN
Definition: config_global.c:43
unsigned int ast_sip_get_use_callerid_contact(void)
Retrieve the global setting 'use_callerid_contact'.
char * ast_sip_get_default_voicemail_extension(void)
Retrieve the default voicemail extension.
unsigned int ast_sip_get_contact_expiration_check_interval(void)
Retrieve the system contact expiration check interval setting.
#define DEFAULT_MWI_DISABLE_INITIAL_UNSOLICITED
Definition: config_global.c:50
#define DEFAULT_UNIDENTIFIED_REQUEST_PRUNE_INTERVAL
Definition: config_global.c:47
#define DEFAULT_REALM
Definition: config_global.c:40
void ast_sip_get_default_realm(char *realm, size_t size)
Retrieve the global default realm.
unsigned int ast_sip_get_disable_multi_domain(void)
Retrieve the system setting 'disable multi domain'.
static int overload_trigger_to_str(const void *obj, const intptr_t *args, char **buf)
unsigned int ast_sip_get_ignore_uri_user_options(void)
Retrieve the global setting 'ignore_uri_user_options'.
#define DEFAULT_ALL_CODECS_ON_EMPTY_REINVITE
Definition: config_global.c:57
const char * ast_sip_overload_trigger_to_str(enum ast_sip_taskprocessor_overload_trigger trigger)
#define DEFAULT_ALLOW_SENDING_180_AFTER_183
Definition: config_global.c:51
#define DEFAULT_TASKPROCESSOR_OVERLOAD_TRIGGER
Definition: config_global.c:55
#define DEFAULT_ENDPOINT_IDENTIFIER_ORDER
Definition: config_global.c:37
#define DEFAULT_REGCONTEXT
Definition: config_global.c:41
unsigned int ast_sip_get_mwi_disable_initial_unsolicited(void)
Retrieve the global setting 'disable sending unsolicited mwi on startup'.
int ast_sip_get_mwi_tps_queue_low(void)
Retrieve the global MWI taskprocessor low water clear alert level.
#define DEFAULT_USE_CALLERID_CONTACT
Definition: config_global.c:53
#define DEFAULT_OUTBOUND_ENDPOINT
Definition: config_global.c:35
#define DEFAULT_IGNORE_URI_USER_OPTIONS
Definition: config_global.c:52
char * ast_sip_get_regcontext(void)
Retrieve the global regcontext setting.
#define DEFAULT_MWI_TPS_QUEUE_HIGH
Definition: config_global.c:48
void ast_sip_get_default_auth_algorithms_uac(char *default_auth_algorithms_uac, size_t size)
Retrieve the global auth algorithms for UAC.
#define DEFAULT_UNIDENTIFIED_REQUEST_PERIOD
Definition: config_global.c:46
void ast_sip_get_default_from_user(char *from_user, size_t size)
Retrieve the global default from user.
unsigned int ast_sip_get_mwi_tps_queue_high(void)
Retrieve the global MWI taskprocessor high water alert trigger level.
#define DEFAULT_AUTH_ALGORITHMS_UAC
Definition: config_global.c:59
unsigned int ast_sip_get_all_codecs_on_empty_reinvite(void)
Retrieve the system setting 'all_codecs_on_empty_reinvite'.
#define DEFAULT_KEEPALIVE_INTERVAL
Definition: config_global.c:33
static int global_apply(const struct ast_sorcery *sorcery, void *obj)
#define DEFAULT_AUTH_ALGORITHMS_UAS
Definition: config_global.c:58
void ast_sip_get_default_auth_algorithms_uas(char *default_auth_algorithms_uas, size_t size)
Retrieve the global auth algorithms for UAS.
int sip_cli_print_global(struct ast_sip_cli_context *context)
void ast_sip_get_unidentified_request_thresholds(unsigned int *count, unsigned int *period, unsigned int *prune_interval)
Retrieve the unidentified request security event thresholds.
char * ast_sip_get_debug(void)
Retrieve the system debug setting (yes|no|host).
#define DEFAULT_MWI_TPS_QUEUE_LOW
Definition: config_global.c:49
#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.
@ OPT_UINT_T
Type for default option handler for unsigned integers.
@ OPT_NOOP_T
Type for a default handler that should do nothing.
@ OPT_BOOL_T
Type for default option handler for bools (ast_true/ast_false)
@ OPT_YESNO_T
Type for default option handler for bools (ast_true/ast_false)
@ OPT_INT_T
Type for default option handler for signed integers.
@ OPT_STRINGFIELD_T
Type for default option handler for stringfields.
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static const char name[]
Definition: format_mp3.c:68
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_ERROR
#define LOG_WARNING
size_t current
Definition: main/cli.c:113
Core PBX routines and definitions.
int ast_context_destroy_by_name(const char *context, const char *registrar)
Destroy a context by name.
Definition: pbx.c:8220
int ast_sip_auth_digest_algorithms_vector_init(const char *id, struct pjsip_auth_algorithm_type_vector *algorithms, const char *agent_type, const char *value)
Populate a vector of algorithm types from a string.
Definition: config_auth.c:192
int ast_sip_add_global_request_header(const char *name, const char *value, int replace)
int ast_sip_add_global_response_header(const char *name, const char *value, int replace)
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
static char default_realm[AST_SIP_AUTH_MAX_REALM_LENGTH+1]
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
static char * default_voicemail_extension
Definition: res_pjsip_mwi.c:49
static struct ast_sorcery * sorcery
ast_sip_taskprocessor_overload_trigger
@ TASKPROCESSOR_OVERLOAD_TRIGGER_GLOBAL
@ TASKPROCESSOR_OVERLOAD_TRIGGER_PJSIP_ONLY
@ TASKPROCESSOR_OVERLOAD_TRIGGER_NONE
int ast_sip_persistent_endpoint_add_to_regcontext(const char *regcontext)
static int debug
Global debug status.
Definition: res_xmpp.c:570
#define NULL
Definition: resample.c:96
Sorcery Data Access Layer API.
void ast_sorcery_instance_observer_remove(struct ast_sorcery *sorcery, const struct ast_sorcery_instance_observer *callbacks)
Remove an observer from a sorcery instance.
Definition: sorcery.c:537
@ 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
#define ast_sorcery_object_register(sorcery, type, alloc, transform, apply)
Register an object type.
Definition: sorcery.h:837
void ast_sorcery_load_object(const struct ast_sorcery *sorcery, const char *type)
Inform any wizards of a specific object type to load persistent objects.
Definition: sorcery.c:1393
#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
void * ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
Allocate a generic sorcery capable object.
Definition: sorcery.c:1728
#define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags,...)
Register a field within an object.
Definition: sorcery.h:955
void * ast_sorcery_alloc(const struct ast_sorcery *sorcery, const char *type, const char *id)
Allocate an object.
Definition: sorcery.c:1744
#define ast_sorcery_apply_default(sorcery, type, name, data)
Definition: sorcery.h:476
int ast_sorcery_instance_observer_add(struct ast_sorcery *sorcery, const struct ast_sorcery_instance_observer *callbacks)
Add an observer to a sorcery instance.
Definition: sorcery.c:520
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
#define AST_DECLARE_STRING_FIELDS(field_list)
Declare the fields needed in a structure.
Definition: stringfields.h:341
#define AST_STRING_FIELD(name)
Declare a string field.
Definition: stringfields.h:303
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374
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
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
Generic container type.
CLI Formatter Context passed to all formatters.
Definition: res_pjsip_cli.h:34
Interface for the sorcery instance observer.
Definition: sorcery.h:237
void(* object_type_loaded)(const char *name, const struct ast_sorcery *sorcery, const char *object_type, int reloaded)
Callback after any object_type is loaded/reloaded.
Definition: sorcery.h:260
Full structure for sorcery.
Definition: sorcery.c:230
Structure for variables, used for configurations and for channel variables.
const ast_string_field default_outbound_endpoint
Definition: config_global.c:92
unsigned int tps_queue_high
unsigned int send_contact_status_on_update_registration
unsigned int max_initial_qualify_time
Definition: config_global.c:98
SORCERY_OBJECT(details)
unsigned int keep_alive_interval
Definition: config_global.c:96
const ast_string_field default_auth_algorithms_uas
Definition: config_global.c:92
enum ast_sip_taskprocessor_overload_trigger overload_trigger
const ast_string_field regcontext
Definition: config_global.c:92
unsigned int unidentified_request_prune_interval
const ast_string_field useragent
Definition: config_global.c:92
const ast_string_field default_from_user
Definition: config_global.c:92
unsigned int use_callerid_contact
unsigned int max_forwards
Definition: config_global.c:94
unsigned int norefersub
unsigned int disable_multi_domain
unsigned int disable_initial_unsolicited
const ast_string_field default_voicemail_extension
Definition: config_global.c:92
unsigned int ignore_uri_user_options
const ast_string_field default_auth_algorithms_uac
Definition: config_global.c:92
unsigned int all_codecs_on_empty_reinvite
unsigned int contact_expiration_check_interval
unsigned int allow_sending_180_after_183
unsigned int unidentified_request_count
const ast_string_field endpoint_identifier_order
Definition: config_global.c:92
const ast_string_field default_realm
Definition: config_global.c:92
const ast_string_field debug
Definition: config_global.c:92
struct global_config::@454 mwi
unsigned int unidentified_request_period
Channel datastore data for max forwards.
Definition: max_forwards.c:29
An API for managing task processing threads that can be shared across modules.
const char * args
#define ARRAY_IN_BOUNDS(v, a)
Checks to see if value is within the bounds of the given array.
Definition: utils.h:687
#define AST_VECTOR_FREE(vec)
Deallocates this vector.
Definition: vector.h:174
#define AST_VECTOR_INIT(vec, size)
Initialize a vector.
Definition: vector.h:113