![]() |
Home page |
Mailing list |
Docs
Asterisk developer's documentation :: Codename Pineapple
sip3_config.c File Reference
Olle E. Johansson <oej@edvina.net> (all the chan_sip3 changes)
Definition in file sip3_config.c.
#include "asterisk.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
#include <netdb.h>
#include <signal.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <regex.h>
#include "asterisk/channel.h"
#include "asterisk/cli.h"
#include "asterisk/config.h"
#include "asterisk/logger.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/options.h"
#include "asterisk/lock.h"
#include "asterisk/acl.h"
#include "asterisk/callerid.h"
#include "asterisk/musiconhold.h"
#include "asterisk/manager.h"
#include "asterisk/dsp.h"
#include "asterisk/rtp.h"
#include "asterisk/srv.h"
#include "asterisk/causes.h"
#include "asterisk/utils.h"
#include "asterisk/file.h"
#include "asterisk/astobj.h"
#include "asterisk/dnsmgr.h"
#include "asterisk/linkedlists.h"
#include "asterisk/stringfields.h"
#include "asterisk/monitor.h"
#include "asterisk/localtime.h"
#include "asterisk/compiler.h"
#include "asterisk/version.h"
#include "sip3.h"
#include "sip3funcs.h"
Include dependency graph for sip3_config.c:

Go to the source code of this file.
Functions | |
| static struct ast_variable * | add_var (const char *buf, struct ast_variable *list) |
| * implement the servar config line | |
| static struct sip_device * | build_device (const char *name, struct ast_variable *v, struct ast_variable *alt, int realtime) |
| Build peer from configuration (file or realtime static/dynamic). | |
| static void | cleanup_stale_contexts (char *new, char *old) |
| Destroy disused contexts between reloads Only used in reload_config so the code for regcontext doesn't get ugly. | |
| sip_device * | device_ref (struct sip_device *device) |
| Add reference for device. | |
| void | device_unref (struct sip_device *device) |
| Remove reference for device. When we reach 0, device is removed from memory. | |
| static int | handle_common_options (enum sip_config_options option, struct ast_flags *flags, struct ast_flags *mask, struct ast_variable *v) |
| Handle flag-type options common to configuration of devices - users and peers. | |
| sip_device * | realtime_peer (const char *newpeername, struct sockaddr_in *sin) |
| realtime_peer: Get peer from realtime storage Checks the "sippeers" realtime family from extconfig.conf | |
| int | reload_config (enum channelreloadreason reason) |
| Re-read SIP.conf config file. | |
| static void | reset_global_settings (struct sip_globals *global) |
| Reset settings of global settings structure Codecs that we support by default:. | |
| static int | set_device_acl (struct sip_device *device, struct ast_variable *v) |
| Add ACL entry (permit/deny) to device. | |
| static void | set_device_cid (struct sip_device *device, enum sip_config_options option, struct ast_variable *v) |
| Set Caller ID for phone or service. | |
| void | set_device_defaults (struct sip_device *device) |
| Set peer defaults before configuring specific configurations. | |
| static void | set_device_host (struct sip_device *device, struct ast_variable *v, int found, enum sip_config_objects object) |
| Configure Host= setting for device. | |
| static enum sip_config_options | sip_config_parse (char *label, enum sip_config_objects object) |
| Parse configuration file label, check if it's valid in this object context and return label. | |
| static void | sip_listconfighelper (int fd, enum sip_config_objects object) |
| List configuration options for specific object. | |
| int | sip_listconfigs (int fd) |
| List all configuration options in sip.conf. | |
Variables | |
| static const char | config [] = "sip3.conf" |
| static struct ast_jb_conf | default_jbconf |
| Global jitterbuffer configuration - by default, jb is disabled. | |
| const char | notify_config [] = "sip3_notify.conf" |
| static struct sip_config_struct | sip_config [] |
| The configuration matrix. | |
|
||||||||||||
|
* implement the servar config line
Definition at line 467 of file sip3_config.c. References ast_strdupa, ast_variable_new(), and ast_variable::next. 00468 { 00469 struct ast_variable *tmpvar = NULL; 00470 char *varname = ast_strdupa(buf), *varval = NULL; 00471 00472 if ((varval = strchr(varname,'='))) { 00473 *varval++ = '\0'; 00474 if ((tmpvar = ast_variable_new(varname, varval))) { 00475 tmpvar->next = list; 00476 list = tmpvar; 00477 } 00478 } 00479 return list; 00480 }
|
|
||||||||||||||||||||
|
Build peer from configuration (file or realtime static/dynamic).
Definition at line 763 of file sip3_config.c. References sip_device_extra::accountcode, add_realm_authentication(), add_var(), sip_device::addr, sip_globals::allowsubscribe, sip_device::allowtransfer, sip_device_extra::amaflags, ast_calloc, ast_cdr_amaflags2int(), ast_copy_flags, ast_false(), ast_free_ha(), ast_get_group(), ast_get_ip(), ast_get_time_t(), ast_log(), ast_parse_allow_disallow(), ast_parse_caller_presentation(), ast_set2_flag, ast_set_flag, ast_string_field_init, ast_string_field_set, ast_strlen_zero(), ast_test_flag, ast_true(), ast_variables_destroy(), ASTOBJ_CONTAINER_FIND_UNLINK_FULL, ASTOBJ_FLAG_MARKED, ASTOBJ_INIT, ASTOBJ_UNMARK, ASTOBJ_UNREF, sip_device::auth, sip_device::autoframing, sip_device::call_limit, sip_device::callgroup, sip_device::callingpres, sip_device::capability, sip_device::chanvars, context, sip_device::defaddr, sip_globals::default_maxcallbitrate, DEFAULT_QUALIFY_MAXMS, destroy_association(), devicelist, sip_device::domain, error(), sip_device::extra, FALSE, sip_globals::flags, ast_flags::flags, sip_device::flags, format, free, global, sip_device::ha, handle_common_options(), sip_device::language, sip_mwi_mailbox::lastmsgssent, ast_variable::lineno, LOG_DEBUG, LOG_ERROR, LOG_WARNING, mailbox, sip_device::mailbox, sip_device::maxcallbitrate, sip_device::maxms, sip_device_extra::mohinterpret, sip_device_extra::mohsuggest, ast_variable::name, ast_variable::next, option_debug, channel_counters::peers_with_mwi, sip_device::pickupgroup, sip_device::prefs, channel_counters::realtime_peers, reg_source_db(), rtptimers::rtpholdtimeout, rtptimers::rtpkeepalive, rtptimers::rtptimeout, sip_globals::rtptimer, sip_device::rtptimer, secret, set_device_acl(), set_device_cid(), set_device_defaults(), set_device_host(), SIP_CONF_ALLOW, SIP_CONF_ALLOWOVERLAP, SIP_CONF_ALLOWSUBSCRIBE, SIP_CONF_ALLOWTRANSFER, SIP_CONF_AUTH, SIP_CONF_AUTHUSER, SIP_CONF_AUTOFRAMING, SIP_CONF_CALL_LIMIT, SIP_CONF_CALLERID, SIP_CONF_CALLERPRES, SIP_CONF_CALLGROUP, SIP_CONF_CANREINVITE, SIP_CONF_CDR_ACCOUNTCODE, SIP_CONF_CDR_AMAFLAGS, SIP_CONF_CHANVAR, SIP_CONF_CID_NAME, SIP_CONF_CID_NUMBER, SIP_CONF_COMPACTHEADERS, SIP_CONF_DEFAULTIP, SIP_CONF_DEFAULTPORT, SIP_CONF_DEFAULTUSER, SIP_CONF_DEFCONTEXT, SIP_CONF_DENY, SIP_CONF_DISALLOW, SIP_CONF_DOMAIN, SIP_CONF_DTMFMODE, SIP_CONF_EXPIRYMAX, SIP_CONF_G726NONSTANDARD, SIP_CONF_GROUPDESC, SIP_CONF_GROUPVAR, SIP_CONF_HOST, SIP_CONF_IGNOREREGEXPIRE, SIP_CONF_INSECURE, SIP_CONF_LANGUAGE, SIP_CONF_LOCALNET, SIP_CONF_MAXCALLBITRATE, SIP_CONF_MD5SECRET, SIP_CONF_MOHINTERPRET, SIP_CONF_MOHSUGGEST, SIP_CONF_MWISUBSCRIBE, SIP_CONF_NAT, SIP_CONF_NONE, SIP_CONF_NOT_FOUND, SIP_CONF_NOT_VALID_FOR_OBJECT, SIP_CONF_OBPROXYPORT, SIP_CONF_OUTBOUNDPROXY, SIP_CONF_PERMIT, SIP_CONF_PICKUPGROUP, SIP_CONF_PORT, SIP_CONF_PROGRESSINBAND, SIP_CONF_PROMISCREDIR, SIP_CONF_PROXY, SIP_CONF_PROXYPORT, SIP_CONF_QUALIFY, SIP_CONF_REGEXTEN, SIP_CONF_REGISTER, SIP_CONF_REGISTERTIMEOUT, SIP_CONF_RFC2833COMPENSATE, SIP_CONF_RTAUTOCLEAR, SIP_CONF_RTFULLCONTACT, SIP_CONF_RTIPADDR, SIP_CONF_RTNAME, SIP_CONF_RTPHOLDTIMEOUT, SIP_CONF_RTPKEEPALIVE, SIP_CONF_RTPTIMEOUT, SIP_CONF_RTREGSECONDS, SIP_CONF_SECRET, SIP_CONF_SENDRPID, SIP_CONF_SETVAR, SIP_CONF_SUBSCRIBECONTEXT, SIP_CONF_T1DEFAULT, SIP_CONF_T1MIN, SIP_CONF_T38PT_UDPTL, SIP_CONF_TRUSTRPID, SIP_CONF_TYPE, SIP_CONF_USECLIENTCODE, SIP_CONF_USEREQPHONE, SIP_CONF_VIDEOSUPPORT, SIP_CONF_VMAILBOX, SIP_CONF_VMEXTEN, sip_config_parse(), SIP_CONFOBJ_PHONE, SIP_PAGE2_ALLOWSUBSCRIBE, SIP_PAGE2_DYNAMIC, SIP_PAGE2_IGNOREREGEXPIRE, SIP_PAGE2_RT_FROMCONTACT, SIP_PAGE2_SERVICE, SIP_PAGE2_SUBSCRIBEMWIONLY, SIP_PEER, SIP_REALTIME, sip_register(), sip_registry_destroy(), SIP_USEREQPHONE, sipcounters, channel_counters::static_peers, TRANSFER_CLOSED, TRANSFER_OPENFORALL, TRUE, sip_device::type, and ast_variable::value. 00764 { 00765 struct sip_device *device = NULL; 00766 struct ast_ha *oldha = NULL; 00767 int found = 0; 00768 int firstpass = 1; 00769 int format = 0; /* Ama flags */ 00770 time_t regseconds = 0; 00771 struct ast_flags peerflags[2] = {{(0)}}; 00772 struct ast_flags mask[2] = {{(0)}}; 00773 int register_lineno = 0; 00774 int error = 0; 00775 00776 if (!realtime) 00777 /* Note we do NOT use find_peer here, to avoid realtime recursion */ 00778 /* We also use a case-sensitive comparison (unlike find_peer) so 00779 that case changes made to the peer name will be properly handled 00780 during reload 00781 */ 00782 device = ASTOBJ_CONTAINER_FIND_UNLINK_FULL(&devicelist, name, name, 0, 0, strcmp); 00783 00784 if (device) { 00785 /* Already in the list, remove it and it will be added back (or FREE'd) */ 00786 found++; 00787 if (!(device->objflags & ASTOBJ_FLAG_MARKED)) 00788 firstpass = 0; 00789 } else { 00790 if (!(device = ast_calloc(1, sizeof(*device)))) 00791 return NULL; 00792 00793 if (ast_string_field_init(device, 512)) { /* Initialize string field buffer */ 00794 free(device); 00795 return NULL; 00796 } 00797 if (ast_string_field_init(&device->mailbox, 512)) { /* Initialize string field buffer */ 00798 free(device); 00799 return NULL; 00800 } 00801 if (ast_string_field_init(&device->extra, 512)) { /* Initialize string field buffer */ 00802 free(device); 00803 return NULL; 00804 } 00805 00806 if (realtime) 00807 sipcounters.realtime_peers++; 00808 else 00809 sipcounters.static_peers++; 00810 ASTOBJ_INIT(device); 00811 } 00812 device->type &= SIP_PEER; 00813 00814 /* Note that our peer HAS had its reference count incrased */ 00815 00816 if (firstpass) { 00817 device->mailbox.lastmsgssent = -1; 00818 oldha = device->ha; 00819 device->ha = NULL; 00820 set_device_defaults(device); /* Set peer defaults */ 00821 } 00822 if (!found && name) 00823 ast_copy_string(device->name, name, sizeof(device->name)); 00824 00825 /* If we have channel variables, remove them (reload) */ 00826 if (device->chanvars) { 00827 ast_variables_destroy(device->chanvars); 00828 device->chanvars = NULL; 00829 /* XXX should unregister ? */ 00830 } 00831 for (; v || ((v = alt) && !(alt=NULL)); v = v->next) { 00832 enum sip_config_options option = sip_config_parse(v->name, SIP_CONFOBJ_PHONE); 00833 switch (option) { 00834 case SIP_CONF_TYPE: 00835 /* Ignore this, it's already parsed */ 00836 break; 00837 case SIP_CONF_TRUSTRPID: 00838 case SIP_CONF_SENDRPID: 00839 case SIP_CONF_G726NONSTANDARD: 00840 case SIP_CONF_USECLIENTCODE: 00841 case SIP_CONF_DTMFMODE: 00842 case SIP_CONF_NAT: 00843 case SIP_CONF_CANREINVITE: 00844 case SIP_CONF_INSECURE: 00845 case SIP_CONF_PROGRESSINBAND: 00846 case SIP_CONF_PROMISCREDIR: 00847 case SIP_CONF_VIDEOSUPPORT: 00848 case SIP_CONF_ALLOWOVERLAP: 00849 case SIP_CONF_ALLOWSUBSCRIBE: 00850 case SIP_CONF_T38PT_UDPTL: 00851 case SIP_CONF_RFC2833COMPENSATE: 00852 case SIP_CONF_COMPACTHEADERS: 00853 error += handle_common_options(option, &peerflags[0], &mask[0], v); 00854 break; 00855 case SIP_CONF_ALLOW: 00856 error += ast_parse_allow_disallow(&device->prefs, &device->capability, v->value, 1); 00857 break; 00858 case SIP_CONF_ALLOWTRANSFER: 00859 device->allowtransfer = ast_true(v->value) ? TRANSFER_OPENFORALL : TRANSFER_CLOSED; 00860 break; 00861 case SIP_CONF_AUTH: 00862 device->auth = add_realm_authentication(device->auth, v->value, v->lineno); 00863 break; 00864 case SIP_CONF_AUTHUSER: 00865 ast_string_field_set(device, authuser, v->value); 00866 break; 00867 case SIP_CONF_AUTOFRAMING: 00868 device->autoframing = ast_true(v->value); 00869 break; 00870 case SIP_CONF_CALLERID: 00871 case SIP_CONF_CID_NAME: 00872 case SIP_CONF_CID_NUMBER: 00873 set_device_cid(device, option, v); 00874 break; 00875 case SIP_CONF_CALLERPRES: 00876 device->callingpres = ast_parse_caller_presentation(v->value); 00877 if (device->callingpres == -1) 00878 device->callingpres = atoi(v->value); 00879 break; 00880 case SIP_CONF_CALLGROUP: 00881 device->callgroup = ast_get_group(v->value); 00882 break; 00883 case SIP_CONF_CALL_LIMIT: 00884 device->call_limit = atoi(v->value); 00885 if (device->call_limit < 0) 00886 device->call_limit = 0; 00887 break; 00888 case SIP_CONF_CDR_ACCOUNTCODE: 00889 ast_copy_string(device->extra.accountcode, v->value, sizeof(device->extra.accountcode)); 00890 break; 00891 case SIP_CONF_CDR_AMAFLAGS: 00892 format = ast_cdr_amaflags2int(v->value); 00893 if (format < 0) { 00894 ast_log(LOG_WARNING, "Invalid AMA Flags for peer: %s at line %d\n", v->value, v->lineno); 00895 error++; 00896 } else 00897 device->extra.amaflags = format; 00898 break; 00899 case SIP_CONF_CHANVAR: 00900 break; 00901 case SIP_CONF_DEFAULTIP: 00902 if (ast_get_ip(&device->defaddr, v->value)) { 00903 ast_log(LOG_WARNING, "Default IP ignored, bad/unparseable value: %s\n", v->value); 00904 error++; 00905 } 00906 break; 00907 case SIP_CONF_DEFAULTUSER: 00908 ast_string_field_set(device, defaultuser, v->value); 00909 break; 00910 case SIP_CONF_DEFAULTPORT: 00911 device->defaddr.sin_port = htons(atoi(v->value)); 00912 break; 00913 case SIP_CONF_DEFCONTEXT: 00914 ast_string_field_set(&device->extra, context, v->value); 00915 break; 00916 case SIP_CONF_DENY: 00917 if(set_device_acl(device, v) != 0) { 00918 ast_log(LOG_WARNING, "Bad DENY setting in sip.conf line %d : %s\n", v->lineno, v->value); 00919 error++; 00920 } 00921 break; 00922 case SIP_CONF_DISALLOW: 00923 error += ast_parse_allow_disallow(&device->prefs, &device->capability, v->value, FALSE); 00924 break; 00925 case SIP_CONF_DOMAIN: 00926 ast_copy_string(device->domain, v->value, sizeof(device->domain)); 00927 break; 00928 case SIP_CONF_GROUPDESC: 00929 break; 00930 case SIP_CONF_GROUPVAR: 00931 break; 00932 case SIP_CONF_HOST: 00933 set_device_host(device, v, found, SIP_CONFOBJ_PHONE); 00934 break; 00935 case SIP_CONF_LANGUAGE: 00936 ast_copy_string(device->language, v->value, sizeof(device->language)); 00937 break; 00938 case SIP_CONF_LOCALNET: 00939 break; 00940 case SIP_CONF_MAXCALLBITRATE: 00941 device->maxcallbitrate = atoi(v->value); 00942 if (device->maxcallbitrate < 0) { 00943 device->maxcallbitrate = global.default_maxcallbitrate; 00944 ast_log(LOG_WARNING, "Max call bitrate setting of device '%s' out of bonds (line %d)\n", device->name, v->lineno); 00945 error++; 00946 } 00947 break; 00948 case SIP_CONF_EXPIRYMAX: 00949 break; 00950 case SIP_CONF_MD5SECRET: 00951 ast_string_field_set(device, md5secret, v->value); 00952 break; 00953 case SIP_CONF_MOHINTERPRET: 00954 ast_copy_string(device->extra.mohinterpret, v->value, sizeof(device->extra.mohinterpret)); 00955 break; 00956 case SIP_CONF_MOHSUGGEST: 00957 ast_copy_string(device->extra.mohsuggest, v->value, sizeof(device->extra.mohsuggest)); 00958 break; 00959 case SIP_CONF_OUTBOUNDPROXY: 00960 break; 00961 case SIP_CONF_OBPROXYPORT: 00962 break; 00963 case SIP_CONF_PERMIT: 00964 if(set_device_acl(device, v) != 0) { 00965 ast_log(LOG_WARNING, "Bad PERMIT setting in sip.conf line %d : %s\n", v->lineno, v->value); 00966 error++; 00967 } 00968 break; 00969 case SIP_CONF_PICKUPGROUP: 00970 device->pickupgroup = ast_get_group(v->value); 00971 break; 00972 case SIP_CONF_PORT: 00973 device->addr.sin_port = htons(atoi(v->value)); 00974 break; 00975 case SIP_CONF_PROXY: 00976 break; 00977 case SIP_CONF_PROXYPORT: 00978 break; 00979 case SIP_CONF_QUALIFY: 00980 if (!strcasecmp(v->value, "no")) { 00981 device->maxms = 0; 00982 } else if (!strcasecmp(v->value, "yes")) { 00983 device->maxms = DEFAULT_QUALIFY_MAXMS; 00984 } else if (sscanf(v->value, "%d", &device->maxms) != 1) { 00985 ast_log(LOG_WARNING, "Qualification of device '%s' should be 'yes', 'no', or a number of milliseconds at line %d of sip.conf\n", device->name, v->lineno); 00986 error++; 00987 device->maxms = 0; 00988 } 00989 break; 00990 case SIP_CONF_REGEXTEN: 00991 ast_string_field_set(device, extra.regexten, v->value); 00992 break; 00993 case SIP_CONF_REGISTER: 00994 if (ast_true(v->value)) { 00995 if (realtime) { 00996 ast_log(LOG_ERROR, "register=yes is not supported for realtime.\n"); 00997 } else { 00998 ast_set_flag(&device->flags[1], SIP_PAGE2_SERVICE); 00999 register_lineno = v->lineno; 01000 } 01001 } else if (!ast_false(v->value)) { 01002 ast_log(LOG_ERROR, "Bad value for register= in line %d, device %s\n", v->lineno, device->name); 01003 error++; 01004 } 01005 break; 01006 case SIP_CONF_REGISTERTIMEOUT: 01007 break; 01008 case SIP_CONF_RTAUTOCLEAR: 01009 break; 01010 case SIP_CONF_IGNOREREGEXPIRE: 01011 break; 01012 case SIP_CONF_RTIPADDR: /* Realtime only */ 01013 if(realtime && !ast_strlen_zero(v->value)) 01014 inet_aton(v->value, &(device->addr.sin_addr)); 01015 break; 01016 case SIP_CONF_RTNAME: /* Realtime only */ 01017 if(realtime && !ast_strlen_zero(v->value)) 01018 ast_copy_string(device->name, v->value, sizeof(device->name)); 01019 break; 01020 case SIP_CONF_RTREGSECONDS: /* REALTIME */ 01021 ast_get_time_t(v->value, ®seconds, 0, NULL); 01022 break; 01023 case SIP_CONF_RTPHOLDTIMEOUT: 01024 if ((sscanf(v->value, "%d", &device->rtptimer.rtpholdtimeout) != 1) || (device->rtptimer.rtpholdtimeout < 0)) { 01025 ast_log(LOG_WARNING, "'%s' is not a valid RTP hold time at line %d. Using default.\n", v->value, v->lineno); 01026 device->rtptimer.rtpholdtimeout = global.rtptimer.rtpholdtimeout; 01027 error++; 01028 } 01029 break; 01030 case SIP_CONF_RTPKEEPALIVE: 01031 if ((sscanf(v->value, "%d", &device->rtptimer.rtpkeepalive) != 1) || (device->rtptimer.rtpkeepalive < 0)) { 01032 ast_log(LOG_WARNING, "'%s' is not a valid RTP keepalive time at line %d. Using default.\n", v->value, v->lineno); 01033 device->rtptimer.rtpkeepalive = global.rtptimer.rtpkeepalive; 01034 error++; 01035 } 01036 break; 01037 case SIP_CONF_RTFULLCONTACT: /* Realtime only */ 01038 if (realtime) { 01039 ast_string_field_set(device, fullcontact, v->value); 01040 ast_set_flag(&device->flags[1], SIP_PAGE2_RT_FROMCONTACT); 01041 } else { 01042 ast_log(LOG_WARNING, "'%s' is not a valid configuration option (line %d, device %s).\n", v->value, v->lineno, device->name); 01043 error++; 01044 } 01045 break; 01046 case SIP_CONF_RTPTIMEOUT: 01047 if ((sscanf(v->value, "%d", &device->rtptimer.rtptimeout) != 1) || (device->rtptimer.rtptimeout < 0)) { 01048 ast_log(LOG_WARNING, "'%s' is not a valid RTP hold time at line %d. Using default.\n", v->value, v->lineno); 01049 error++; 01050 device->rtptimer.rtptimeout = global.rtptimer.rtptimeout; 01051 } 01052 break; 01053 case SIP_CONF_SECRET: 01054 ast_string_field_set(device, secret, v->value); 01055 break; 01056 case SIP_CONF_SETVAR: 01057 device->chanvars = add_var(v->value, device->chanvars); 01058 break; 01059 case SIP_CONF_SUBSCRIBECONTEXT: 01060 ast_string_field_set(&device->extra, subscribecontext, v->value); 01061 break; 01062 case SIP_CONF_MWISUBSCRIBE: 01063 ast_set2_flag(&device->flags[1], ast_true(v->value), SIP_PAGE2_SUBSCRIBEMWIONLY); 01064 break; 01065 case SIP_CONF_T1MIN: 01066 break; 01067 case SIP_CONF_T1DEFAULT: 01068 break; 01069 case SIP_CONF_USEREQPHONE: 01070 ast_set2_flag(&device->flags[0], ast_true(v->value), SIP_USEREQPHONE); 01071 break; 01072 case SIP_CONF_VMAILBOX: 01073 ast_string_field_set(device, mailbox.mailbox, v->value); 01074 sipcounters.peers_with_mwi++; 01075 break; 01076 case SIP_CONF_VMEXTEN: 01077 ast_string_field_set(device, mailbox.vmexten, v->value); 01078 break; 01079 case SIP_CONF_NONE: 01080 case SIP_CONF_NOT_VALID_FOR_OBJECT: 01081 case SIP_CONF_NOT_FOUND: 01082 ast_log(LOG_ERROR, "Bad configuration entry in line %d: %s = %s\n", v->lineno, v->name, v->value); 01083 error++; 01084 break; 01085 default: 01086 ast_log(LOG_ERROR, "This error message should not happen. Bad config error: %d\n", option); 01087 break; 01088 } 01089 01090 /*--------------------- 01091 SERVICE CONFIGS 01092 } else if (!strcasecmp(v->name, "fromdomain")) { 01093 ast_string_field_set(device, extra.fromdomain, v->value); 01094 //ast_copy_string(device->fromdomain, v->value, sizeof(device->fromdomain)); 01095 } else if (!strcasecmp(v->name, "fromuser")) { 01096 ast_string_field_set(device, extra.fromuser, v->value); 01097 //ast_copy_string(device->fromuser, v->value, sizeof(device->fromuser)); 01098 ----------*/ 01099 } 01100 if (error) 01101 ast_log(LOG_WARNING, "Errors found in phone config: %s = %d\n", device->name, error); 01102 01103 /* Set flags from handle_common_options */ 01104 ast_copy_flags(&device->flags[0], &peerflags[0], mask[0].flags); 01105 ast_copy_flags(&device->flags[1], &peerflags[1], mask[1].flags); 01106 01107 /* If not realtime and dynamic - check if we have a current registration */ 01108 if (!found && ast_test_flag(&device->flags[1], SIP_PAGE2_DYNAMIC) && !ast_test_flag(&device->flags[0], SIP_REALTIME)) 01109 reg_source_db(device); 01110 01111 01112 /* If dynamic and realtime, check registration expiry - it might have 01113 expired already */ 01114 if (!ast_test_flag(&global.flags[1], SIP_PAGE2_IGNOREREGEXPIRE) && ast_test_flag(&device->flags[1], SIP_PAGE2_DYNAMIC) && realtime) { 01115 time_t nowtime = time(NULL); 01116 01117 if ((nowtime - regseconds) > 0) { 01118 destroy_association(device); 01119 memset(&device->addr, 0, sizeof(device->addr)); 01120 if (option_debug) 01121 ast_log(LOG_DEBUG, "Bah, we're expired (%d/%d/%d)!\n", (int)(nowtime - regseconds), (int)regseconds, (int)nowtime); 01122 } 01123 } 01124 01125 /* If we have an allowsubscribe, enable it */ 01126 if (ast_test_flag(&device->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE)) 01127 global.allowsubscribe = TRUE; /* No global ban any more */ 01128 01129 ASTOBJ_UNMARK(device); 01130 /* Delete the old ACL list */ 01131 ast_free_ha(oldha); 01132 01133 /* Start registration if needed */ 01134 if (ast_test_flag(&device->flags[1], SIP_PAGE2_SERVICE)) { 01135 sip_register(NULL, register_lineno, device); /* XXX How do we handle this at reload?? */ 01136 } else if (device->registry) { 01137 /* We have a registry entry for a peer that no longer wished to be registered */ 01138 ASTOBJ_UNREF(device->registry,sip_registry_destroy); 01139 device->registry = NULL; 01140 } 01141 return device; 01142 }
|
|
||||||||||||
|
Destroy disused contexts between reloads Only used in reload_config so the code for regcontext doesn't get ugly.
Definition at line 484 of file sip3_config.c. References ast_context_destroy(), ast_context_find(), AST_MAX_CONTEXT, and strsep(). 00485 { 00486 char *oldcontext, *newcontext, *stalecontext, *stringp, newlist[AST_MAX_CONTEXT]; 00487 00488 while ((oldcontext = strsep(&old, "&"))) { 00489 stalecontext = '\0'; 00490 ast_copy_string(newlist, new, sizeof(newlist)); 00491 stringp = newlist; 00492 while ((newcontext = strsep(&stringp, "&"))) { 00493 if (strcmp(newcontext, oldcontext) == 0) { 00494 /* This is not the context you're looking for */ 00495 stalecontext = '\0'; 00496 break; 00497 } else if (strcmp(newcontext, oldcontext)) { 00498 stalecontext = oldcontext; 00499 } 00500 00501 } 00502 if (stalecontext) 00503 ast_context_destroy(ast_context_find(stalecontext), "SIP"); 00504 } 00505 }
|
|
|
Add reference for device.
Definition at line 436 of file sip3_config.c. References ast_log(), ASTOBJ_REF, LOG_DEBUG, option_debug, and sipdebug. 00437 { 00438 ASTOBJ_REF(device); 00439 if (option_debug > 3 && sipdebug) 00440 ast_log(LOG_DEBUG, "/// Adding reference to device %s - refcount now %d\n", device->name, device->refcount); 00441 return device; 00442 }
|
|
|
Remove reference for device. When we reach 0, device is removed from memory.
Definition at line 425 of file sip3_config.c. References ast_log(), ASTOBJ_UNREF, LOG_DEBUG, option_debug, sip_destroy_device(), and sipdebug. Referenced by __sip_autodestruct(), _sip_show_device(), check_user_full(), create_addr(), expire_register(), function_sippeer(), handle_request_subscribe(), register_verify(), sip_devicestate(), sip_do_debug_device(), and update_call_counter(). 00426 { 00427 if (!device) 00428 return; 00429 00430 if (option_debug > 3 && sipdebug) 00431 ast_log(LOG_DEBUG, "/// Removing reference from device %s - refcount now %d\n", device->name, device->refcount - 1); 00432 ASTOBJ_UNREF(device, sip_destroy_device); 00433 }
|
|
||||||||||||||||||||
|
||||||||||||
|
realtime_peer: Get peer from realtime storage Checks the "sippeers" realtime family from extconfig.conf
Definition at line 1149 of file sip3_config.c. References ast_inet_ntoa(), ast_load_realtime(), ast_variables_destroy(), ipaddr, ast_variable::name, ast_variable::next, ast_variable::value, and var. 01150 { 01151 struct sip_device *peer; 01152 struct ast_variable *var = NULL; 01153 struct ast_variable *tmp; 01154 char ipaddr[INET_ADDRSTRLEN]; 01155 01156 /* First check on peer name */ 01157 if (newpeername) 01158 var = ast_load_realtime("sippeers", "name", newpeername, NULL); 01159 else if (sin) { /* Then check on IP address for dynamic peers */ 01160 ast_copy_string(ipaddr, ast_inet_ntoa(sin->sin_addr), sizeof(ipaddr)); 01161 var = ast_load_realtime("sippeers", "host", ipaddr, NULL); /* First check for fixed IP hosts */ 01162 if (!var) 01163 var = ast_load_realtime("sippeers", "ipaddr", ipaddr, NULL); /* Then check for registred hosts */ 01164 } 01165 01166 if (!var) 01167 return NULL; 01168 01169 for (tmp = var; tmp; tmp = tmp->next) { 01170 /* If this is type=user, then skip this object. */ 01171 if (!strcasecmp(tmp->name, "type") && 01172 !strcasecmp(tmp->value, "user")) { 01173 ast_variables_destroy(var); 01174 return NULL; 01175 } else if (!newpeername && !strcasecmp(tmp->name, "name")) { 01176 newpeername = tmp->value; 01177 } 01178 } 01179 01180 if (!newpeername) { /* Did not find peer in realtime */ 01181 ast_log(LOG_WARNING, "Cannot Determine peer name ip=%s\n", ipaddr); 01182 ast_variables_destroy(var); 01183 return NULL; 01184 } 01185 01186 /* Peer found in realtime, now build it in memory */ 01187 peer = build_device(newpeername, var, NULL, !ast_test_flag(&global.flags[1], SIP_PAGE2_RTCACHEFRIENDS)); 01188 if (!peer) { 01189 ast_variables_destroy(var); 01190 return NULL; 01191 } 01192 01193 if (ast_test_flag(&global.flags[1], SIP_PAGE2_RTCACHEFRIENDS)) { 01194 /* Cache peer */ 01195 ast_copy_flags(&peer->flags[1],&global.flags[1], SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS); 01196 if (ast_test_flag(&global.flags[1], SIP_PAGE2_RTAUTOCLEAR)) { 01197 if (peer->expire > -1) { 01198 ast_sched_del(sched, peer->expire); 01199 } 01200 peer->expire = ast_sched_add(sched, (global.rtautoclear) * 1000, expire_register, (void *)peer); 01201 } 01202 ASTOBJ_CONTAINER_LINK(&devicelist,peer); 01203 } else { 01204 ast_set_flag(&peer->flags[0], SIP_REALTIME); 01205 } 01206 ast_variables_destroy(var); 01207 01208 return peer; 01209 }
|
|
|
Re-read SIP.conf config file.
< Maximum accepted registration time Definition at line 1294 of file sip3_config.c. References add_sip_domain(), ahp, sip_globals::allow_external_domains, sip_globals::allowguest, sip_globals::allowtransfer, sip_globals::alwaysauthreject, ast_append_ha(), ast_clear_flag, ast_config_load(), ast_context_create(), ast_context_find(), ast_copy_flags, ast_false(), ast_get_ip_or_srv(), ast_gethostbyname(), ast_jb_read_conf(), ast_log(), AST_MAX_CONTEXT, ast_parse_allow_disallow(), ast_set2_flag, ast_set_flag, ast_str2tos(), ast_strdupa, ast_strlen_zero(), ast_true(), ast_variable_browse(), sip_globals::autocreatepeer, sip_globals::autoframing, sip_network::bindaddr, sip_globals::callevents, sip_globals::capability, cleanup_stale_contexts(), config, context, sip_globals::debuglevel, sip_globals::default_callerid, sip_globals::default_context, DEFAULT_DEFAULT_EXPIRY, DEFAULT_EXPIRY, DEFAULT_EXTERNREFRESH, sip_globals::default_fromdomain, default_jbconf, sip_globals::default_language, DEFAULT_MAX_CALL_BITRATE, DEFAULT_MAX_EXPIRY, DEFAULT_MAX_FORWARDS, sip_globals::default_maxcallbitrate, DEFAULT_MIN_EXPIRY, sip_globals::default_mohinterpret, sip_globals::default_mohsuggest, DEFAULT_MWITIME, sip_globals::default_notifymime, sip_globals::default_prefs, sip_globals::default_qualify, DEFAULT_QUALIFY_MAXMS, sip_globals::default_qualifycheck_notok, sip_globals::default_qualifycheck_ok, DEFAULT_REGISTRATION_TIMEOUT, sip_globals::default_vmexten, sip_globals::dumphistory, error(), expiry, sip_network::externexpire, sip_network::externhost, sip_network::externip, sip_network::externrefresh, FALSE, sip_globals::flags, global, handle_common_options(), hp, sip_globals::jbconf, ast_variable::lineno, sip_network::localaddr, LOG_DEBUG, LOG_ERROR, LOG_NOTICE, LOG_WARNING, sip_globals::maxforwards, sip_globals::mwitime, ast_variable::name, ast_variable::next, sip_globals::notifyringing, option_debug, sip_network::outboundproxy, sip_network::outboundproxyip, sip_globals::realm, sip_globals::recordhistory, sip_globals::reg_timeout, sip_globals::regattempts_max, sip_globals::regcontext, sip_globals::relaxdtmf, reset_global_settings(), reset_ip_interface(), sip_globals::rtautoclear, rtptimers::rtpholdtimeout, rtptimers::rtpkeepalive, rtptimers::rtptimeout, sip_globals::rtptimer, SIP_CONF_ALLOW, SIP_CONF_ALLOWEXTERNALDOMAINS, SIP_CONF_ALLOWGUEST, SIP_CONF_ALLOWOVERLAP, SIP_CONF_ALLOWSUBSCRIBE, SIP_CONF_ALLOWTRANSFER, SIP_CONF_ALWAYSAUTHREJECT, SIP_CONF_AUTOCREATEPEER, SIP_CONF_AUTODOMAIN, SIP_CONF_AUTOFRAMING, SIP_CONF_BINDADDR, SIP_CONF_BINDPORT, SIP_CONF_CALLERID, SIP_CONF_CALLEVENTS, SIP_CONF_CANREINVITE, SIP_CONF_COMPACTHEADERS, SIP_CONF_DEFCONTEXT, SIP_CONF_DISALLOW, SIP_CONF_DOMAIN, SIP_CONF_DTMFMODE, SIP_CONF_EXPIRYDEFAULT, SIP_CONF_EXPIRYMAX, SIP_CONF_EXPIRYMIN, SIP_CONF_EXTERNHOST, SIP_CONF_EXTERNIP, SIP_CONF_EXTERNREFRESH, SIP_CONF_FROMDOMAIN, SIP_CONF_G726NONSTANDARD, SIP_CONF_HISTORYDUMP, SIP_CONF_HISTORYRECORD, SIP_CONF_IGNOREREGEXPIRE, SIP_CONF_INSECURE, SIP_CONF_JBENABLE, SIP_CONF_JBFORCE, SIP_CONF_JBIMPL, SIP_CONF_JBLOG, SIP_CONF_JBMAXSIZE, SIP_CONF_JBRESYNC, SIP_CONF_LANGUAGE, SIP_CONF_LOCALNET, SIP_CONF_MAXCALLBITRATE, SIP_CONF_MAXFORWARDS, SIP_CONF_MOHINTERPRET, SIP_CONF_MOHSUGGEST, SIP_CONF_MWICHECK, SIP_CONF_NAT, SIP_CONF_NONE, SIP_CONF_NOT_FOUND, SIP_CONF_NOT_VALID_FOR_OBJECT, SIP_CONF_NOTIFYMIME, SIP_CONF_NOTIFYRINGING, SIP_CONF_OBPROXYPORT, SIP_CONF_OUTBOUNDPROXY, SIP_CONF_PROGRESSINBAND, SIP_CONF_PROMISCREDIR, SIP_CONF_QUALIFY, SIP_CONF_QUALIFY_TIMER_NOT_OK, SIP_CONF_QUALIFY_TIMER_OK, SIP_CONF_REALM, SIP_CONF_REGCONTEXT, SIP_CONF_REGISTER, SIP_CONF_REGISTERATTEMPTS, SIP_CONF_REGISTERTIMEOUT, SIP_CONF_RELAXDTMF, SIP_CONF_RFC2833COMPENSATE, SIP_CONF_RT_CACHEFRIENDS, SIP_CONF_RTAUTOCLEAR, SIP_CONF_RTPHOLDTIMEOUT, SIP_CONF_RTPKEEPALIVE, SIP_CONF_RTPTIMEOUT, SIP_CONF_RTSAVESYSTEMNAME, SIP_CONF_RTUPDATE, SIP_CONF_SENDRPID, SIP_CONF_SIPDEBUG, SIP_CONF_SIPDEBUGLEVEL, SIP_CONF_SRVLOOKUP, SIP_CONF_T1DEFAULT, SIP_CONF_T1MIN, SIP_CONF_T2DEFAULT, SIP_CONF_T38PT_UDPTL, SIP_CONF_T4DEFAULT, SIP_CONF_TIMER_B, SIP_CONF_TIMER_F, SIP_CONF_TOS_AUDIO, SIP_CONF_TOS_PRESENSE, SIP_CONF_TOS_SIP, SIP_CONF_TOS_VIDEO, SIP_CONF_TRUSTRPID, SIP_CONF_USECLIENTCODE, SIP_CONF_USERAGENT, SIP_CONF_USEREQPHONE, SIP_CONF_VIDEOSUPPORT, SIP_CONF_VMEXTEN, sip_config_parse(), SIP_CONFOBJ_GENERAL, SIP_DOMAIN_CONFIG, SIP_PAGE2_DEBUG_CONFIG, SIP_PAGE2_DEBUG_CONSOLE, SIP_PAGE2_IGNOREREGEXPIRE, SIP_PAGE2_RTAUTOCLEAR, SIP_PAGE2_RTCACHEFRIENDS, SIP_PAGE2_RTSAVE_SYSNAME, SIP_PAGE2_RTUPDATE, SIP_PAGE2_VIDEOSUPPORT, sip_register(), SIP_USEREQPHONE, SIPDEBUG_ALL, SIPDEBUG_CALLS, SIPDEBUG_NOPOKE, sipnet, sipnet_ourport(), sipnet_ourport_set(), sip_globals::siptimer_b, sip_globals::siptimer_f, sip_globals::srvlookup, strsep(), sip_globals::t1default, sip_globals::t1min, sip_globals::t2default, sip_globals::t4default, sip_globals::tos_audio, sip_globals::tos_presense, sip_globals::tos_sip, sip_globals::tos_video, TRANSFER_CLOSED, TRANSFER_OPENFORALL, TRUE, sip_globals::useragent, and ast_variable::value. 01295 { 01296 struct ast_config *cfg; 01297 struct ast_variable *v; 01298 struct sip_device *device = (struct sip_device *) NULL; 01299 struct ast_hostent ahp; 01300 char *cat, *stringp, *context, *oldregcontext; 01301 char newcontexts[AST_MAX_CONTEXT], oldcontexts[AST_MAX_CONTEXT]; 01302 struct hostent *hp; 01303 int format; 01304 struct ast_flags dummy[2]; 01305 int auto_sip_domains = FALSE; 01306 struct sockaddr_in old_bindaddr = sipnet.bindaddr; 01307 int registry_count = 0, peer_count = 0, user_count = 0; 01308 struct ast_flags debugflag = {0}; 01309 int error = 0; 01310 01311 cfg = ast_config_load(config); 01312 01313 /* We *must* have a config file otherwise stop immediately */ 01314 if (!cfg) { 01315 ast_log(LOG_NOTICE, "Unable to load config %s\n", config); 01316 return -1; 01317 } 01318 01319 /* Initialize copy of current global.regcontext for later use in removing stale contexts */ 01320 ast_copy_string(oldcontexts, global.regcontext, sizeof(oldcontexts)); 01321 oldregcontext = oldcontexts; 01322 01323 /* Clear all flags before setting default values */ 01324 /* Preserve debugging settings for console */ 01325 ast_copy_flags(&debugflag, &global.flags[1], SIP_PAGE2_DEBUG_CONSOLE); 01326 ast_copy_flags(&global.flags[1], &debugflag, SIP_PAGE2_DEBUG_CONSOLE); 01327 01328 /* Reset channel settings to default before re-configuring */ 01329 reset_ip_interface(&sipnet); /* Clear IP interfaces */ 01330 reset_global_settings(&global); /* Reset global global settings */ 01331 01332 expiry.min_expiry = DEFAULT_MIN_EXPIRY; /*!< Minimum accepted registration time */ 01333 expiry.max_expiry = DEFAULT_MAX_EXPIRY; /*!< Maximum accepted registration time */ 01334 expiry.default_expiry = DEFAULT_DEFAULT_EXPIRY; 01335 expiry.expiry = DEFAULT_EXPIRY; /* Used anywhere??? */ 01336 01337 01338 /* Copy the default jb config over global.jbconf */ 01339 memcpy(&global.jbconf, &default_jbconf, sizeof(struct ast_jb_conf)); 01340 01341 ast_clear_flag(&global.flags[1], SIP_PAGE2_VIDEOSUPPORT); 01342 01343 /* Read the [general] config section of sip.conf (or from realtime config) */ 01344 for (v = ast_variable_browse(cfg, "general"); v; v = v->next) { 01345 int i = 0; 01346 enum sip_config_options option = sip_config_parse(v->name, SIP_CONFOBJ_GENERAL); 01347 switch(option) { 01348 case SIP_CONF_TRUSTRPID: 01349 case SIP_CONF_SENDRPID: 01350 case SIP_CONF_G726NONSTANDARD: 01351 case SIP_CONF_USECLIENTCODE: 01352 case SIP_CONF_DTMFMODE: 01353 case SIP_CONF_NAT: 01354 case SIP_CONF_CANREINVITE: 01355 case SIP_CONF_INSECURE: 01356 case SIP_CONF_PROGRESSINBAND: 01357 case SIP_CONF_PROMISCREDIR: 01358 case SIP_CONF_VIDEOSUPPORT: 01359 case SIP_CONF_ALLOWOVERLAP: 01360 case SIP_CONF_ALLOWSUBSCRIBE: 01361 case SIP_CONF_T38PT_UDPTL: 01362 case SIP_CONF_RFC2833COMPENSATE: 01363 case SIP_CONF_COMPACTHEADERS: 01364 error += handle_common_options(option, &global.flags[0], &dummy[0], v); 01365 break; 01366 case SIP_CONF_JBENABLE: 01367 case SIP_CONF_JBFORCE: 01368 case SIP_CONF_JBIMPL: 01369 case SIP_CONF_JBLOG: 01370 case SIP_CONF_JBMAXSIZE: 01371 case SIP_CONF_JBRESYNC: 01372 /* handle jb conf */ 01373 ast_jb_read_conf(&global.jbconf, v->name, v->value); 01374 break; 01375 01376 case SIP_CONF_DEFCONTEXT: 01377 ast_copy_string(global.default_context, v->value, sizeof(global.default_context)); 01378 case SIP_CONF_ALLOWGUEST: 01379 global.allowguest = ast_true(v->value) ? 1 : 0; 01380 break; 01381 case SIP_CONF_REALM: 01382 ast_copy_string(global.realm, v->value, sizeof(global.realm)); 01383 break; 01384 case SIP_CONF_USERAGENT: 01385 ast_copy_string(global.useragent, v->value, sizeof(global.useragent)); 01386 break; 01387 case SIP_CONF_ALLOWTRANSFER: 01388 global.allowtransfer = ast_true(v->value) ? TRANSFER_OPENFORALL : TRANSFER_CLOSED; 01389 break; 01390 case SIP_CONF_RT_CACHEFRIENDS: 01391 ast_set2_flag(&global.flags[1], ast_true(v->value), SIP_PAGE2_RTCACHEFRIENDS); 01392 break; 01393 case SIP_CONF_RTSAVESYSTEMNAME: 01394 ast_set2_flag(&global.flags[1], ast_true(v->value), SIP_PAGE2_RTSAVE_SYSNAME); 01395 break; 01396 case SIP_CONF_RTUPDATE: 01397 ast_set2_flag(&global.flags[1], ast_true(v->value), SIP_PAGE2_RTUPDATE); 01398 break; 01399 case SIP_CONF_RTAUTOCLEAR: 01400 i = atoi(v->value); 01401 if (i > 0) 01402 global.rtautoclear = i; 01403 else { 01404 i = 0; 01405 error++; 01406 } 01407 ast_set2_flag(&global.flags[1], i || ast_true(v->value), SIP_PAGE2_RTAUTOCLEAR); 01408 break; 01409 case SIP_CONF_MAXFORWARDS: 01410 global.maxforwards = atoi(v->value); 01411 if (global.maxforwards < 1) { 01412 ast_log(LOG_WARNING, "Bad setting for maxforwards (%d), resetting to default %d\n", global.maxforwards, DEFAULT_MAX_FORWARDS); 01413 global.maxforwards = DEFAULT_MAX_FORWARDS; 01414 error++; 01415 } 01416 break; 01417 case SIP_CONF_IGNOREREGEXPIRE: 01418 ast_set2_flag(&global.flags[1], ast_true(v->value), SIP_PAGE2_IGNOREREGEXPIRE); 01419 break; 01420 case SIP_CONF_T1MIN: 01421 global.t1min = atoi(v->value); 01422 break; 01423 case SIP_CONF_T1DEFAULT: 01424 global.t1default = atoi(v->value); 01425 break; 01426 case SIP_CONF_T2DEFAULT: 01427 global.t2default = atoi(v->value); 01428 break; 01429 case SIP_CONF_T4DEFAULT: 01430 global.t4default = atoi(v->value); 01431 break; 01432 case SIP_CONF_TIMER_B: 01433 global.siptimer_b = atoi(v->value); 01434 break; 01435 case SIP_CONF_TIMER_F: 01436 global.siptimer_f = atoi(v->value); 01437 break; 01438 case SIP_CONF_USEREQPHONE: 01439 ast_set2_flag(&global.flags[0], ast_true(v->value), SIP_USEREQPHONE); 01440 break; 01441 case SIP_CONF_RELAXDTMF: 01442 global.relaxdtmf = ast_true(v->value); 01443 break; 01444 case SIP_CONF_MWICHECK: 01445 if ((sscanf(v->value, "%d", &global.mwitime) != 1) || (global.mwitime < 0)) { 01446 ast_log(LOG_WARNING, "'%s' is not a valid MWI time setting at line %d. Using default (10).\n", v->value, v->lineno); 01447 global.mwitime = DEFAULT_MWITIME; 01448 error++; 01449 }; 01450 break; 01451 case SIP_CONF_VMEXTEN: 01452 ast_copy_string(global.default_vmexten, v->value, sizeof(global.default_vmexten)); 01453 break; 01454 case SIP_CONF_RTPTIMEOUT: 01455 if ((sscanf(v->value, "%d", &global.rtptimer.rtptimeout) != 1) || (global.rtptimer.rtptimeout < 0)) { 01456 ast_log(LOG_WARNING, "'%s' is not a valid RTP time at line %d. Disabling RTP timeout.\n", v->value, v->lineno); 01457 global.rtptimer.rtptimeout = 0; 01458 error++; 01459 } 01460 break; 01461 case SIP_CONF_RTPHOLDTIMEOUT: 01462 if ((sscanf(v->value, "%d", &global.rtptimer.rtpholdtimeout) != 1) || (global.rtptimer.rtpholdtimeout < 0)) { 01463 ast_log(LOG_WARNING, "'%s' is not a valid RTP hold time at line %d. Using default.\n", v->value, v->lineno); 01464 global.rtptimer.rtpholdtimeout = 0; 01465 error++; 01466 } 01467 break; 01468 case SIP_CONF_RTPKEEPALIVE: 01469 if ((sscanf(v->value, "%d", &global.rtptimer.rtpkeepalive) != 1) || (global.rtptimer.rtpkeepalive < 0)) { 01470 ast_log(LOG_WARNING, "'%s' is not a valid RTP keepalive time at line %d. Using default.\n", v->value, v->lineno); 01471 global.rtptimer.rtpkeepalive = 0; 01472 error++; 01473 } 01474 break; 01475 case SIP_CONF_NOTIFYMIME: 01476 ast_copy_string(global.default_notifymime, v->value, sizeof(global.default_notifymime)); 01477 break; 01478 case SIP_CONF_NOTIFYRINGING: 01479 global.notifyringing = ast_true(v->value); 01480 break; 01481 case SIP_CONF_ALWAYSAUTHREJECT: 01482 global.alwaysauthreject = ast_true(v->value); 01483 break; 01484 case SIP_CONF_MOHINTERPRET: 01485 ast_copy_string(global.default_mohinterpret, v->value, sizeof(global.default_mohinterpret)); 01486 break; 01487 case SIP_CONF_MOHSUGGEST: 01488 ast_copy_string(global.default_mohsuggest, v->value, sizeof(global.default_mohsuggest)); 01489 break; 01490 case SIP_CONF_LANGUAGE: 01491 ast_copy_string(global.default_language, v->value, sizeof(global.default_language)); 01492 break; 01493 case SIP_CONF_REGCONTEXT: 01494 ast_copy_string(newcontexts, v->value, sizeof(newcontexts)); 01495 stringp = newcontexts; 01496 /* Let's remove any contexts that are no longer defined in regcontext */ 01497 cleanup_stale_contexts(stringp, oldregcontext); 01498 /* Create contexts if they don't exist already */ 01499 while ((context = strsep(&stringp, "&"))) { 01500 if (!ast_context_find(context)) 01501 ast_context_create(NULL, context, "SIP"); 01502 } 01503 ast_copy_string(global.regcontext, v->value, sizeof(global.regcontext)); 01504 break; 01505 case SIP_CONF_CALLERID: 01506 ast_copy_string(global.default_callerid, v->value, sizeof(global.default_callerid)); 01507 break; 01508 case SIP_CONF_FROMDOMAIN: 01509 ast_copy_string(global.default_fromdomain, v->value, sizeof(global.default_fromdomain)); 01510 break; 01511 case SIP_CONF_OUTBOUNDPROXY: 01512 /* Save name for re-resolution */ 01513 ast_copy_string(sipnet.outboundproxy, v->value, sizeof(sipnet.outboundproxy)); 01514 /* Try to resolve name now */ 01515 if (ast_get_ip_or_srv(&sipnet.outboundproxyip, v->value, global.srvlookup ? "_sip._udp" : NULL) < 0) { 01516 ast_log(LOG_WARNING, "Unable to locate host '%s'\n", v->value); 01517 error++; 01518 }; 01519 break; 01520 case SIP_CONF_OBPROXYPORT: 01521 /* Port needs to be after IP */ 01522 sscanf(v->value, "%d", &format); 01523 sipnet.outboundproxyip.sin_port = htons(format); 01524 break; 01525 case SIP_CONF_AUTOCREATEPEER: 01526 global.autocreatepeer = ast_true(v->value); 01527 break; 01528 case SIP_CONF_SRVLOOKUP: 01529 global.srvlookup = ast_true(v->value); 01530 break; 01531 case SIP_CONF_EXPIRYMAX: 01532 expiry.max_expiry = atoi(v->value); 01533 if (expiry.max_expiry < 1) { 01534 ast_log(LOG_WARNING, "Bad setting for maxexpiry (%d). Resetting to default %d.\n", expiry.max_expiry, DEFAULT_MAX_EXPIRY); 01535 expiry.max_expiry = DEFAULT_MAX_EXPIRY; 01536 error++; 01537 } 01538 break; 01539 case SIP_CONF_EXPIRYMIN: 01540 expiry.min_expiry = atoi(v->value); 01541 if (expiry.min_expiry < 1) { 01542 ast_log(LOG_WARNING, "Bad setting for minexpiry (%d). Resetting to default %d.\n", expiry.min_expiry, DEFAULT_MAX_EXPIRY); 01543 expiry.min_expiry = DEFAULT_MIN_EXPIRY; 01544 error++; 01545 } 01546 break; 01547 case SIP_CONF_EXPIRYDEFAULT: 01548 expiry.default_expiry = atoi(v->value); 01549 if (expiry.default_expiry < 1) { 01550 ast_log(LOG_WARNING, "Bad setting for defaultexpiry (%d). Resetting to default %d.\n", expiry.default_expiry, DEFAULT_DEFAULT_EXPIRY); 01551 expiry.default_expiry = DEFAULT_DEFAULT_EXPIRY; 01552 error++; 01553 } 01554 break; 01555 case SIP_CONF_SIPDEBUG: 01556 if (ast_true(v->value)) 01557 ast_set_flag(&global.flags[1], SIP_PAGE2_DEBUG_CONFIG); 01558 break; 01559 case SIP_CONF_SIPDEBUGLEVEL: 01560 if (!strcasecmp(v->value, "ALL")) { 01561 global.debuglevel = SIPDEBUG_ALL; 01562 } else if (!strcasecmp(v->value, "CALLS")) { 01563 global.debuglevel = SIPDEBUG_CALLS; 01564 } else if (!strcasecmp(v->value, "NO-OPTIONS")) { 01565 global.debuglevel = SIPDEBUG_NOPOKE; 01566 } else { 01567 error++; 01568 ast_log(LOG_WARNING, "Bad setting for sipdebuglevel (%s). Resetting to default.\n", v->value); 01569 global.debuglevel = SIPDEBUG_ALL; 01570 } 01571 break; 01572 case SIP_CONF_HISTORYDUMP: 01573 global.dumphistory = ast_true(v->value); 01574 break; 01575 case SIP_CONF_HISTORYRECORD: 01576 global.recordhistory = ast_true(v->value); 01577 break; 01578 case SIP_CONF_REGISTERTIMEOUT: 01579 global.reg_timeout = atoi(v->value); 01580 if (global.reg_timeout < 1) { 01581 ast_log(LOG_WARNING, "Bad setting for registertimeout (%d). Resetting to default %d.\n", global.reg_timeout, DEFAULT_REGISTRATION_TIMEOUT); 01582 global.reg_timeout = DEFAULT_REGISTRATION_TIMEOUT; 01583 error++; 01584 }; 01585 break; 01586 case SIP_CONF_REGISTERATTEMPTS: 01587 global.regattempts_max = atoi(v->value); 01588 if (global.regattempts_max < 1) { 01589 ast_log(LOG_WARNING, "Bad setting for registerattempts (%d). Resetting to default %d.\n", global.regattempts_max, 0); 01590 global.regattempts_max = 0; 01591 error++; 01592 }; 01593 break; 01594 case SIP_CONF_BINDADDR: 01595 if (!(hp = ast_gethostbyname(v->value, &ahp))) { 01596 ast_log(LOG_WARNING, "Invalid bind address: %s\n", v->value); 01597 error++; 01598 } else 01599 memcpy(&sipnet.bindaddr.sin_addr, hp->h_addr, sizeof(sipnet.bindaddr.sin_addr)); 01600 break; 01601 case SIP_CONF_BINDPORT: 01602 { 01603 int port; 01604 if (sscanf(v->value, "%d", &port) == 1) { 01605 sipnet_ourport_set(&sipnet, port); 01606 sipnet.bindaddr.sin_port = htons(sipnet_ourport(&sipnet)); 01607 } else { 01608 ast_log(LOG_WARNING, "Invalid port number '%s' at line %d of %s\n", v->value, v->lineno, config); 01609 error++; 01610 } 01611 } 01612 break; 01613 case SIP_CONF_LOCALNET: 01614 { 01615 struct ast_ha *na; 01616 int ha_error = 0; 01617 01618 na = ast_append_ha("d", v->value, sipnet.localaddr, &ha_error); 01619 if (ha_error) { 01620 ast_log(LOG_WARNING, "Invalid localnet value: %s\n", v->value); 01621 error++; 01622 } else 01623 sipnet.localaddr = na; 01624 } 01625 break; 01626 case SIP_CONF_EXTERNIP: 01627 if (!(hp = ast_gethostbyname(v->value, &ahp))) { 01628 ast_log(LOG_WARNING, "Invalid address for externip keyword: %s\n", v->value); 01629 error++; 01630 } else 01631 memcpy(&sipnet.externip.sin_addr, hp->h_addr, sizeof(sipnet.externip.sin_addr)); 01632 sipnet.externexpire = 0; 01633 break; 01634 case SIP_CONF_EXTERNHOST: 01635 ast_copy_string(sipnet.externhost, v->value, sizeof(sipnet.externhost)); 01636 if (!(hp = ast_gethostbyname(sipnet.externhost, &ahp))) { 01637 ast_log(LOG_WARNING, "Invalid address for externhost keyword: %s\n", sipnet.externhost); 01638 error++; 01639 } else 01640 memcpy(&sipnet.externip.sin_addr, hp->h_addr, sizeof(sipnet.externip.sin_addr)); 01641 sipnet.externexpire = time(NULL); 01642 break; 01643 case SIP_CONF_EXTERNREFRESH: 01644 if (sscanf(v->value, "%d", &sipnet.externrefresh) != 1) { 01645 ast_log(LOG_WARNING, "Invalid externrefresh value '%s', must be an integer > 0 at line %d. Resetting to default %d\n", v->value, v->lineno, DEFAULT_EXTERNREFRESH); 01646 sipnet.externrefresh = DEFAULT_EXTERNREFRESH; 01647 error++; 01648 } 01649 break; 01650 case SIP_CONF_ALLOW: 01651 error += ast_parse_allow_disallow(&global.default_prefs, &global.capability, v->value, TRUE); 01652 break; 01653 case SIP_CONF_DISALLOW: 01654 error += ast_parse_allow_disallow(&global.default_prefs, &global.capability, v->value, FALSE); 01655 break; 01656 case SIP_CONF_AUTOFRAMING: 01657 global.autoframing = ast_true(v->value); 01658 break; 01659 case SIP_CONF_ALLOWEXTERNALDOMAINS: 01660 global.allow_external_domains = ast_true(v->value); 01661 break; 01662 case SIP_CONF_AUTODOMAIN: 01663 auto_sip_domains = ast_true(v->value); 01664 break; 01665 case SIP_CONF_DOMAIN: 01666 { 01667 char *domain = ast_strdupa(v->value); 01668 char *context = strchr(domain, ','); 01669 01670 if (context) 01671 *context++ = '\0'; 01672 01673 if (option_debug && ast_strlen_zero(context)) 01674 ast_log(LOG_DEBUG, "No context specified at line %d for domain '%s'\n", v->lineno, domain); 01675 if (ast_strlen_zero(domain)) { 01676 ast_log(LOG_WARNING, "Empty domain specified at line %d\n", v->lineno); 01677 error++; 01678 } else 01679 add_sip_domain(ast_strip(domain), SIP_DOMAIN_CONFIG, context ? ast_strip(context) : ""); 01680 } 01681 break; 01682 case SIP_CONF_REGISTER: 01683 if (sip_register(v->value, v->lineno, NULL) == 0) 01684 registry_count++; 01685 else { 01686 error++; 01687 } 01688 break; 01689 case SIP_CONF_TOS_SIP: 01690 if (ast_str2tos(v->value, &global.tos_sip)) { 01691 ast_log(LOG_WARNING, "Invalid tos_sip value %s at line %d, recommended value is 'cs3'. See doc/ip-tos.txt.\n", v->value, v->lineno); 01692 error++; 01693 } 01694 break; 01695 case SIP_CONF_TOS_AUDIO: 01696 if (ast_str2tos(v->value, &global.tos_audio)) { 01697 ast_log(LOG_WARNING, "Invalid tos_audio value at line %d, recommended value is 'ef'. See doc/ip-tos.txt.\n", v->lineno); 01698 error++; 01699 } 01700 break; 01701 case SIP_CONF_TOS_VIDEO: 01702 if (ast_str2tos(v->value, &global.tos_video)) { 01703 ast_log(LOG_WARNING, "Invalid tos_video value at line %d, recommended value is 'af41'. See doc/ip-tos.txt.\n", v->lineno); 01704 error++; 01705 } 01706 break; 01707 case SIP_CONF_TOS_PRESENSE: 01708 if (ast_str2tos(v->value, &global.tos_presense)) { 01709 ast_log(LOG_WARNING, "Invalid tos_presence value at line %d, recommended value is 'cs3'. See doc/ip-tos.txt.\n", v->lineno); 01710 error++; 01711 } 01712 break; 01713 case SIP_CONF_QUALIFY: 01714 if (ast_false(v->value)) 01715 global.default_qualify = 0; 01716 else if (ast_true(v->value)) { 01717 global.default_qualify = DEFAULT_QUALIFY_MAXMS; 01718 } else if (sscanf(v->value, "%d", &global.default_qualify) != 1 ||global.default_qualify < 10) { 01719 ast_log(LOG_WARNING, "Qualification default should be 'yes', 'no', or a number of milliseconds > 10 at line %d of sip.conf\n", v->lineno); 01720 error++; 01721 global.default_qualify = 0; 01722 } 01723 break; 01724 case SIP_CONF_QUALIFY_TIMER_OK: 01725 { 01726 int freq; 01727 if(sscanf(v->value, "%d", &freq) != 1) { 01728 if (freq) 01729 global.default_qualifycheck_ok = freq; 01730 else { 01731 error++; 01732 ast_log(LOG_WARNING, "Bad value for qualify ok timer: %s. Using default value\n", v->value); 01733 } 01734 } 01735 } 01736 break; 01737 case SIP_CONF_QUALIFY_TIMER_NOT_OK: 01738 { 01739 int freq; 01740 if(sscanf(v->value, "%d", &freq) != 1) { 01741 if (freq) 01742 global.default_qualifycheck_notok = freq; 01743 else { 01744 error++; 01745 ast_log(LOG_WARNING, "Bad value for qualify not ok timer: %s. Using default value\n", v->value); 01746 } 01747 } 01748 } 01749 break; 01750 case SIP_CONF_CALLEVENTS: 01751 global.callevents = ast_true(v->value); 01752 break; 01753 case SIP_CONF_MAXCALLBITRATE: 01754 global.default_maxcallbitrate = atoi(v->value); 01755 if (global.default_maxcallbitrate < 0) { 01756 global.default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE; 01757 error++; 01758 ast_log(LOG_WARNING, "Bad value for max call bitrate: %s, resetting to default %d\n", v->value, DEFAULT_MAX_CALL_BITRATE); 01759 } 01760 break; 01761 case SIP_CONF_NONE: 01762 case SIP_CONF_NOT_VALID_FOR_OBJECT: 01763 case SIP_CONF_NOT_FOUND: 01764 ast_log(LOG_ERROR, "This configuration option is not valid here: %s (line %d)\n", v->name, v->lineno); 01765 break; 01766 default: 01767 ast_log(LOG_ERROR, "This error message should not happen. Bad config error: %d\n", option); 01768 break; 01769 } 01770 } 01771 if (error) 01772 ast_log(LOG_WARNING, "--- Number of errors found in general config: %d\n", error); 01773 01774 if (!global.allow_external_domains && domains_configured()) { 01775 ast_log(LOG_WARNING, "To disallow external domains, you need to configure local SIP domains.\n"); 01776 global.allow_external_domains = 1; 01777 } 01778 01779 /* Build list of authentication to various SIP realms, i.e. service providers */ 01780 for (v = ast_variable_browse(cfg, "authentication"); v ; v = v->next) { 01781 /* Format for authentication is auth = username:password@realm */ 01782 if (!strcasecmp(v->name, "auth")) 01783 authl = add_realm_authentication(authl, v->value, v->lineno); 01784 } 01785 01786 /* Load peers, users and friends */ 01787 cat = NULL; 01788 while ( (cat = ast_category_browse(cfg, cat)) ) { 01789 const char *utype; 01790 01791 /* Skip general section, as well as authentication section */ 01792 if (!strcasecmp(cat, "general") || !strcasecmp(cat, "authentication")) 01793 continue; 01794 utype = ast_variable_retrieve(cfg, cat, "type"); 01795 if (!utype) { 01796 ast_log(LOG_WARNING, "Section '%s' lacks type\n", cat); 01797 continue; 01798 } else { 01799 enum objecttype type; 01800 01801 if (!strcasecmp(utype, "phone") || !strcasecmp(utype, "peer") ) /* Keep "peer" for a short while */ 01802 type = SIP_PEER; 01803 else { 01804 ast_log(LOG_WARNING, "Unknown type '%s' for '%s' in %s\n", utype, cat, "sip.conf"); 01805 continue; 01806 } 01807 if (type & SIP_PEER) { 01808 device = build_device(cat, ast_variable_browse(cfg, cat), NULL, 0); 01809 if (device) { 01810 ASTOBJ_CONTAINER_LINK(&devicelist,device); 01811 device_unref(device); 01812 peer_count++; 01813 } 01814 } 01815 } 01816 } 01817 01818 /* Add default domains - host name, IP address and IP:port */ 01819 /* Only do this if user added any sip domain with "localdomains" */ 01820 /* In order to *not* break backwards compatibility */ 01821 /* Some phones address us at IP only, some with additional port number */ 01822 if (auto_sip_domains) { 01823 char temp[MAXHOSTNAMELEN]; 01824 01825 /* First our default IP address */ 01826 if (sipnet.bindaddr.sin_addr.s_addr) 01827 add_sip_domain(ast_inet_ntoa(sipnet.bindaddr.sin_addr), SIP_DOMAIN_AUTO, NULL); 01828 else 01829 ast_log(LOG_NOTICE, "Can't add wildcard IP address to domain list, please add IP address to domain manually.\n"); 01830 01831 /* Our extern IP address, if configured */ 01832 if (sipnet.externip.sin_addr.s_addr) 01833 add_sip_domain(ast_inet_ntoa(sipnet.externip.sin_addr), SIP_DOMAIN_AUTO, NULL); 01834 01835 /* Extern host name (NAT traversal support) */ 01836 if (!ast_strlen_zero(sipnet.externhost)) 01837 add_sip_domain(sipnet.externhost, SIP_DOMAIN_AUTO, NULL); 01838 01839 /* Our host name */ 01840 if (!gethostname(temp, sizeof(temp))) 01841 add_sip_domain(temp, SIP_DOMAIN_AUTO, NULL); 01842 } 01843 01844 /* Release configuration from memory */ 01845 ast_config_destroy(cfg); 01846 01847 /* Load the list of manual NOTIFY types to support */ 01848 if (notify_types) 01849 ast_config_destroy(notify_types); 01850 notify_types = ast_config_load(notify_config); 01851 01852 /* Done, tell the manager */ 01853 manager_event(EVENT_FLAG_SYSTEM, "ChannelReload", "Channel: SIP\r\nReloadReason: %s\r\nRegistry_Count: %d\r\nPeer_Count: %d\r\nUser_Count: %d\r\n\r\n", channelreloadreason2txt(reason), registry_count, peer_count, user_count); 01854 if (sipsock_init(&sipnet, &old_bindaddr) == -1) 01855 ast_log(LOG_WARNING, "Unable to get own IP address, SIP disabled\n"); 01856 01857 return 0; 01858 }
|
|
|
Reset settings of global settings structure Codecs that we support by default:. < This is default: NO MMR and JBIG trancoding, NO fill bit removal, transferredTCF TCF, UDP FEC, Version 0 and 9600 max fax rate < Default qualify time when status is ok < Default qualify time when statusis not ok < Default DTMF setting: RFC2833 < NAT support if requested by device with rport < Allow re-invites Definition at line 1212 of file sip3_config.c. References sip_globals::allow_external_domains, sip_globals::allowguest, sip_globals::allowsubscribe, sip_globals::allowtransfer, sip_globals::alwaysauthreject, ast_clear_flag, ast_config_AST_SYSTEM_NAME, AST_FLAGS_ALL, AST_FORMAT_ALAW, AST_FORMAT_GSM, AST_FORMAT_H263, AST_FORMAT_ULAW, ast_set_flag, ast_strlen_zero(), sip_globals::autocreatepeer, sip_globals::autoframing, sip_globals::callevents, sip_globals::capability, sip_globals::compactheaders, DEFAULT_ALLOW_EXT_DOM, DEFAULT_ALLOWGUEST, DEFAULT_AUTOCREATEPEER, DEFAULT_CALLERID, sip_globals::default_callerid, DEFAULT_COMPACTHEADERS, DEFAULT_CONTEXT, sip_globals::default_context, sip_globals::default_fromdomain, sip_globals::default_language, DEFAULT_MAX_CALL_BITRATE, DEFAULT_MAX_FORWARDS, sip_globals::default_maxcallbitrate, DEFAULT_MOHINTERPRET, sip_globals::default_mohinterpret, DEFAULT_MOHSUGGEST, sip_globals::default_mohsuggest, DEFAULT_MWITIME, DEFAULT_NOTIFYMIME, sip_globals::default_notifymime, DEFAULT_NOTIFYRINGING, sip_globals::default_prefs, DEFAULT_QUALIFY, sip_globals::default_qualify, DEFAULT_QUALIFY_FREQ_NOTOK, DEFAULT_QUALIFY_FREQ_OK, sip_globals::default_qualifycheck_notok, sip_globals::default_qualifycheck_ok, DEFAULT_REALM, DEFAULT_REGISTRATION_TIMEOUT, sip_globals::default_subscribecontext, DEFAULT_T1MIN, DEFAULT_TOS_AUDIO, DEFAULT_TOS_SIP, DEFAULT_TOS_VIDEO, DEFAULT_USERAGENT, DEFAULT_VMEXTEN, sip_globals::default_vmexten, sip_globals::dumphistory, FALSE, sip_globals::flags, global, sip_globals::maxforwards, sip_globals::mwitime, sip_globals::notifyringing, channel_counters::peers_with_mwi, sip_globals::realm, sip_globals::recordhistory, sip_globals::reg_timeout, sip_globals::regattempts_max, sip_globals::regcontext, sip_globals::relaxdtmf, sip_globals::rtautoclear, rtptimers::rtpholdtimeout, rtptimers::rtpkeepalive, rtptimers::rtptimeout, sip_globals::rtptimer, SIP_CAN_REINVITE, SIP_DTMF_RFC2833, SIP_NAT_RFC3581, SIP_PAGE2_ALLOWOVERLAP, SIP_PAGE2_ALLOWSUBSCRIBE, SIP_PAGE2_DEBUG_CONFIG, SIP_PAGE2_RTUPDATE, SIP_TIMER_B_DEFAULT, SIP_TIMER_F_DEFAULT, SIP_TIMER_T1_DEFAULT, SIP_TIMER_T2_DEFAULT, SIP_TIMER_T4_DEFAULT, sipcounters, sip_globals::siptimer_b, sip_globals::siptimer_f, sip_globals::srvlookup, sip_globals::t1default, sip_globals::t1min, sip_globals::t2default, sip_globals::t38_capability, T38FAX_RATE_2400, T38FAX_RATE_4800, T38FAX_RATE_7200, T38FAX_RATE_9600, T38FAX_VERSION_0, sip_globals::t4default, sip_globals::tos_audio, sip_globals::tos_presense, sip_globals::tos_sip, sip_globals::tos_video, TRANSFER_OPENFORALL, TRUE, and sip_globals::useragent. Referenced by reload_config(). 01213 { 01214 ast_clear_flag(&global->flags[0], AST_FLAGS_ALL); 01215 ast_clear_flag(&global->flags[1], AST_FLAGS_ALL); 01216 memset(&global->default_prefs, 0 , sizeof(global->default_prefs)); 01217 global->srvlookup = TRUE; 01218 /*! \brief Codecs that we support by default: */ 01219 global->capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263; 01220 //global->dtmf_capability = AST_RTP_DTMF; 01221 /*!< This is default: NO MMR and JBIG trancoding, NO fill bit removal, transferredTCF TCF, UDP FEC, Version 0 and 9600 max fax rate */ 01222 global->t38_capability = T38FAX_VERSION_0 | T38FAX_RATE_2400 | T38FAX_RATE_4800 | T38FAX_RATE_7200 | T38FAX_RATE_9600; 01223 01224 global->maxforwards = DEFAULT_MAX_FORWARDS; 01225 global->tos_sip = DEFAULT_TOS_SIP; 01226 global->tos_audio = DEFAULT_TOS_AUDIO; 01227 global->tos_video = DEFAULT_TOS_VIDEO; 01228 global->tos_presense = DEFAULT_TOS_SIP; /* Initialize to SIP type of service */ 01229 global->allow_external_domains = DEFAULT_ALLOW_EXT_DOM; /* Allow external invites */ 01230 global->regcontext[0] = '\0'; 01231 global->notifyringing = DEFAULT_NOTIFYRINGING; 01232 global->alwaysauthreject = 0; 01233 global->allowsubscribe = FALSE; 01234 snprintf(global->useragent, sizeof(global->useragent), "%s %s", DEFAULT_USERAGENT, ASTERISK_VERSION); 01235 ast_copy_string(global->default_notifymime, DEFAULT_NOTIFYMIME, sizeof(global->default_notifymime)); 01236 if (ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) 01237 ast_copy_string(global->realm, DEFAULT_REALM, sizeof(global->realm)); 01238 else 01239 ast_copy_string(global->realm, ast_config_AST_SYSTEM_NAME, sizeof(global->realm)); 01240 ast_copy_string(global->default_callerid, DEFAULT_CALLERID, sizeof(global->default_callerid)); 01241 global->compactheaders = DEFAULT_COMPACTHEADERS; 01242 global->reg_timeout = DEFAULT_REGISTRATION_TIMEOUT; 01243 global->regattempts_max = 0; 01244 global->mwitime = DEFAULT_MWITIME; 01245 global->autocreatepeer = DEFAULT_AUTOCREATEPEER; 01246 global->allowguest = DEFAULT_ALLOWGUEST; 01247 global->rtptimer.rtptimeout = 0; 01248 global->rtptimer.rtpholdtimeout = 0; 01249 global->rtptimer.rtpkeepalive = 0; 01250 global->autoframing = 0; 01251 global->default_subscribecontext[0] = '\0'; 01252 global->default_language[0] = '\0'; 01253 global->default_fromdomain[0] = '\0'; 01254 global->default_qualify = DEFAULT_QUALIFY; 01255 global->default_qualifycheck_ok = DEFAULT_QUALIFY_FREQ_OK; /*!< Default qualify time when status is ok */ 01256 global->default_qualifycheck_notok = DEFAULT_QUALIFY_FREQ_NOTOK; /*!< Default qualify time when statusis not ok */ 01257 global->default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE; 01258 ast_copy_string(global->default_mohinterpret, DEFAULT_MOHINTERPRET, sizeof(global->default_mohinterpret)); 01259 ast_copy_string(global->default_mohsuggest, DEFAULT_MOHSUGGEST, sizeof(global->default_mohsuggest)); 01260 ast_copy_string(global->default_vmexten, DEFAULT_VMEXTEN, sizeof(global->default_vmexten)); 01261 ast_set_flag(&global->flags[0], SIP_DTMF_RFC2833); /*!< Default DTMF setting: RFC2833 */ 01262 ast_set_flag(&global->flags[0], SIP_NAT_RFC3581); /*!< NAT support if requested by device with rport */ 01263 ast_set_flag(&global->flags[0], SIP_CAN_REINVITE); /*!< Allow re-invites */ 01264 01265 /* Debugging settings, always default to off */ 01266 global->dumphistory = FALSE; 01267 global->recordhistory = FALSE; 01268 ast_clear_flag(&global->flags[1], SIP_PAGE2_DEBUG_CONFIG); 01269 01270 01271 global->allowtransfer = TRANSFER_OPENFORALL; /* Merrily accept all transfers by default */ 01272 global->rtautoclear = 120; 01273 ast_set_flag(&global->flags[1], SIP_PAGE2_ALLOWSUBSCRIBE); /* Default for peers, users: TRUE */ 01274 ast_set_flag(&global->flags[1], SIP_PAGE2_ALLOWOVERLAP); /* Default for peers, users: TRUE */ 01275 ast_set_flag(&global->flags[1], SIP_PAGE2_RTUPDATE); 01276 01277 ast_copy_string(global->default_context, DEFAULT_CONTEXT, sizeof(global->default_context)); 01278 global->relaxdtmf = FALSE; 01279 global->callevents = FALSE; 01280 global->t1min = DEFAULT_T1MIN; 01281 global->t1default = SIP_TIMER_T1_DEFAULT; 01282 global->t2default = SIP_TIMER_T2_DEFAULT; 01283 global->t4default = SIP_TIMER_T4_DEFAULT; 01284 global->siptimer_b = SIP_TIMER_B_DEFAULT; 01285 global->siptimer_f = SIP_TIMER_F_DEFAULT; 01286 sipcounters.peers_with_mwi = 0; /* Reset counter for mwi peers */ 01287 }
|
|
||||||||||||
|
Add ACL entry (permit/deny) to device.
Definition at line 753 of file sip3_config.c. References ast_append_ha(), sip_device::ha, ast_variable::name, and ast_variable::value. Referenced by build_device(). 00754 { 00755 int ha_error = 0; 00756 00757 device->ha = ast_append_ha(v->name, v->value, device->ha, &ha_error); 00758 return ha_error; 00759 }
|
|
||||||||||||||||
|
Set Caller ID for phone or service.
Definition at line 705 of file sip3_config.c. References ast_callerid_split(), sip_device_extra::cid_name, sip_device_extra::cid_num, sip_device::extra, SIP_CONF_CID_NAME, SIP_CONF_CID_NUMBER, and ast_variable::value. Referenced by build_device(). 00706 { 00707 switch (option) { 00708 case SIP_CONF_CID_NAME: 00709 ast_copy_string(device->extra.cid_name, v->value, sizeof(device->extra.cid_name)); 00710 break; 00711 case SIP_CONF_CID_NUMBER: 00712 ast_copy_string(device->extra.cid_num, v->value, sizeof(device->extra.cid_num)); 00713 break; 00714 default: 00715 ast_callerid_split(v->value, device->extra.cid_name, sizeof(device->extra.cid_name), device->extra.cid_num, sizeof(device->extra.cid_num)); 00716 break; 00717 } 00718 }
|
|
|
Set peer defaults before configuring specific configurations.
Definition at line 663 of file sip3_config.c. References sip_device::addr, sip_device::allowtransfer, sip_globals::allowtransfer, ast_copy_flags, ast_string_field_set, sip_device::callgroup, sip_device::capability, sip_globals::capability, sip_device_extra::cid_name, sip_device_extra::cid_num, context, sip_device::defaddr, sip_globals::default_context, sip_globals::default_language, sip_globals::default_maxcallbitrate, sip_globals::default_mohinterpret, sip_globals::default_mohsuggest, sip_globals::default_prefs, sip_globals::default_qualify, sip_globals::default_subscribecontext, sip_globals::default_vmexten, sip_device::expire, sip_device::extra, sip_device::flags, sip_globals::flags, global, sip_device::language, mailbox, sip_device::maxcallbitrate, sip_device::maxms, sip_device_extra::mohinterpret, sip_device_extra::mohsuggest, sip_device::pickupgroup, sip_device::pokeexpire, sip_device::prefs, rtptimers::rtpholdtimeout, rtptimers::rtpkeepalive, rtptimers::rtptimeout, sip_device::rtptimer, sip_globals::rtptimer, secret, SIP_FLAGS_TO_COPY, SIP_PAGE2_FLAGS_TO_COPY, and STANDARD_SIP_PORT. Referenced by build_device(), and temp_device(). 00664 { 00665 if (device->expire == 0) { 00666 /* Don't reset expire or port time during reload 00667 if we have an active registration 00668 */ 00669 device->expire = -1; 00670 device->pokeexpire = -1; 00671 device->addr.sin_port = htons(STANDARD_SIP_PORT); 00672 } 00673 ast_copy_flags(&device->flags[0], &global.flags[0], SIP_FLAGS_TO_COPY); 00674 ast_copy_flags(&device->flags[1], &global.flags[1], SIP_PAGE2_FLAGS_TO_COPY); 00675 00676 ast_string_field_set(&device->extra, context, global.default_context); 00677 ast_string_field_set(&device->extra, subscribecontext, global.default_subscribecontext); 00678 strcpy(device->language, global.default_language); 00679 strcpy(device->extra.mohinterpret, global.default_mohinterpret); 00680 strcpy(device->extra.mohsuggest, global.default_mohsuggest); 00681 device->addr.sin_family = AF_INET; 00682 device->defaddr.sin_family = AF_INET; 00683 device->capability = global.capability; 00684 device->rtptimer.rtptimeout = global.rtptimer.rtptimeout; 00685 device->rtptimer.rtpholdtimeout = global.rtptimer.rtpholdtimeout; 00686 device->rtptimer.rtpkeepalive = global.rtptimer.rtpkeepalive; 00687 device->maxcallbitrate = global.default_maxcallbitrate; 00688 ast_string_field_set(device, secret, ""); 00689 ast_string_field_set(device, md5secret, ""); 00690 ast_string_field_set(device, extra.fromdomain, ""); 00691 ast_string_field_set(device, extra.fromuser, ""); 00692 ast_string_field_set(device, extra.regexten, ""); 00693 device->extra.cid_num[0] = '\0'; 00694 device->extra.cid_name[0] = '\0'; 00695 device->callgroup = 0; 00696 device->pickupgroup = 0; 00697 device->allowtransfer = global.allowtransfer; 00698 device->maxms = global.default_qualify; 00699 device->prefs = global.default_prefs; 00700 ast_string_field_set(device, mailbox.vmexten, global.default_vmexten); 00701 ast_string_field_set(device, mailbox.mailbox, ""); 00702 }
|
|
||||||||||||||||||||
|
Configure Host= setting for device.
Definition at line 721 of file sip3_config.c. References sip_device::addr, ast_clear_flag, ast_log(), ast_sched_del(), ast_set_flag, sip_device::defaddr, sip_device::expire, sip_device::extra, sip_device::flags, LOG_DEBUG, option_debug, SIP_CONFOBJ_PHONE, SIP_PAGE2_DYNAMIC, STANDARD_SIP_PORT, sip_device_extra::tohost, and ast_variable::value. Referenced by build_device(). 00722 { 00723 00724 if (option_debug > 4) 00725 ast_log(LOG_DEBUG, "--Configuring device %s - Host config value %s\n", device->name, v->value); 00726 if (object == SIP_CONFOBJ_PHONE && !strcasecmp(v->value, "dynamic")) { 00727 if (option_debug > 4) 00728 ast_log(LOG_DEBUG, "--Dynamic host enabled (sip device registering with us)\n"); 00729 /* They'll register with us */ 00730 ast_set_flag(&device->flags[1], SIP_PAGE2_DYNAMIC); 00731 if (!found) { 00732 /* Initialize stuff if we're not found, otherwise we keep going with what we had */ 00733 memset(&device->addr.sin_addr, 0, 4); 00734 if (device->addr.sin_port) { 00735 /* If we've already got a port, make it the default rather than absolute */ 00736 device->defaddr.sin_port = device->addr.sin_port; 00737 device->addr.sin_port = 0; 00738 } 00739 } 00740 } else { 00741 /* Non-dynamic. Make sure we become that way if we're not */ 00742 if (device->expire > -1) 00743 ast_sched_del(sched, device->expire); 00744 device->expire = -1; 00745 ast_clear_flag(&device->flags[1], SIP_PAGE2_DYNAMIC); 00746 ast_copy_string(device->extra.tohost, v->value, sizeof(device->extra.tohost)); 00747 if (!device->addr.sin_port) 00748 device->addr.sin_port = htons(STANDARD_SIP_PORT); 00749 } 00750 }
|
|
||||||||||||
|
Parse configuration file label, check if it's valid in this object context and return label.
Definition at line 446 of file sip3_config.c. References ast_log(), LOG_DEBUG, sip_config_struct::option, option_debug, SIP_CONF_NOT_VALID_FOR_OBJECT, and sip_config. Referenced by build_device(), and reload_config(). 00447 { 00448 int x; 00449 if (option_debug > 4) 00450 ast_log(LOG_DEBUG, "--Checking for configuration option: %s\n", label); 00451 00452 00453 for (x = 0; x < (sizeof(sip_config) / sizeof(struct sip_config_struct)); x++) { 00454 if (!strcasecmp(sip_config[x].label, label)) { 00455 if (sip_config[x].valid & object) { 00456 if (option_debug > 4) 00457 ast_log(LOG_DEBUG, "--Found valid configuration option: %s\n", label); 00458 return sip_config[x].option; 00459 } else 00460 return SIP_CONF_NOT_VALID_FOR_OBJECT; 00461 } 00462 }; 00463 return SIP_CONF_NOT_FOUND; 00464 }
|
|
||||||||||||
|
List configuration options for specific object.
Definition at line 1861 of file sip3_config.c. References ast_cli(), desc, and sip_config. Referenced by sip_listconfigs(). 01862 { 01863 int i; 01864 int max = sizeof(sip_config) / sizeof(struct sip_config_struct); 01865 int count = 0; 01866 01867 ast_cli(fd,"--------------------------------------------------------------------------------\n"); 01868 for (i=0; i < max; i++) { 01869 if (sip_config[i].valid & object) { 01870 ast_cli(fd, " %-18.18s %-80.80s\n", sip_config[i].label, sip_config[i].desc); 01871 count++; 01872 } 01873 } 01874 ast_cli(fd, " * %d configuration options\n", count); 01875 ast_cli(fd,"\n"); 01876 }
|
|
|
List all configuration options in sip.conf.
Definition at line 1879 of file sip3_config.c. References ast_cli(), RESULT_SUCCESS, SIP_CONFOBJ_GENERAL, SIP_CONFOBJ_PHONE, SIP_CONFOBJ_SERVICE, SIP_CONFOBJ_TRUNK, and sip_listconfighelper(). Referenced by cli_sip_listconfigs(). 01880 { 01881 ast_cli(fd, "\nSIP configuration options help page:\n"); 01882 ast_cli(fd,"\n"); 01883 ast_cli(fd,"Configuration options for the [general] section of sip.conf\n"); 01884 sip_listconfighelper(fd, SIP_CONFOBJ_GENERAL); 01885 ast_cli(fd,"Configuration options for type=phone\n"); 01886 sip_listconfighelper(fd, SIP_CONFOBJ_PHONE); 01887 ast_cli(fd,"Configuration options for type=trunk\n"); 01888 sip_listconfighelper(fd, SIP_CONFOBJ_TRUNK); 01889 ast_cli(fd,"Configuration options for type=service\n"); 01890 sip_listconfighelper(fd, SIP_CONFOBJ_SERVICE); 01891 ast_cli(fd, "\n---\n"); 01892 return RESULT_SUCCESS; 01893 01894 /* SIP_CONFOBJ_GENERAL General section 01895 SIP_CONFOBJ_PHONE Phone options 01896 SIP_CONFOBJ_SERVICE Service options 01897 SIP_CONFOBJ_TRUNK Trunk options 01898 SIP_CONFOBJ_DOMAIN Configurations valid for domains 01899 SIP_CONFOBJ_LINE Phone, service and trunk (macro) 01900 */ 01901 }
|
|
|
Definition at line 85 of file sip3_config.c. |
|
|
Global jitterbuffer configuration - by default, jb is disabled.
Definition at line 416 of file sip3_config.c. |
|
|
Configuration file for notifications Definition at line 86 of file sip3_config.c. |
|
|
The configuration matrix.
Definition at line 96 of file sip3_config.c. Referenced by sip_config_parse(), and sip_listconfighelper(). |