@ -92,8 +92,12 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
# include "asterisk/astosp.h"
# endif
# ifndef DEFAULT_USERAGENT
# define DEFAULT_USERAGENT "Asterisk PBX" /*!< Default Useragent: header unless re-defined in sip.conf */
# ifndef FALSE
# define FALSE 0
# endif
# ifndef TRUE
# define TRUE 1
# endif
# define VIDEO_CODEC_MASK 0x1fc0000 /*!< Video codecs from H.261 thru AST_FORMAT_MAX_VIDEO */
@ -111,19 +115,21 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/* guard limit must be larger than guard secs */
/* guard min must be < 1000, and should be >= 250 */
# define EXPIRY_GUARD_SECS 15 /*!< How long before expiry do we reregister */
# define EXPIRY_GUARD_LIMIT 30 / *!< Below here, we use EXPIRY_GUARD_PCT instead of
EXPIRY_GUARD_SECS */
# define EXPIRY_GUARD_MIN 500 / *!< This is the minimum guard time applied. If
GUARD_PCT turns out to be lower than this , it
will use this time instead .
This is in milliseconds . */
# define EXPIRY_GUARD_PCT 0.20 / *!< Percentage of expires timeout to use when
below EXPIRY_GUARD_LIMIT */
# define EXPIRY_GUARD_SECS 15 /*!< How long before expiry do we reregister */
# define EXPIRY_GUARD_LIMIT 30 / *!< Below here, we use EXPIRY_GUARD_PCT instead of
EXPIRY_GUARD_SECS */
# define EXPIRY_GUARD_MIN 500 / *!< This is the minimum guard time applied. If
GUARD_PCT turns out to be lower than this , it
will use this time instead .
This is in milliseconds . */
# define EXPIRY_GUARD_PCT 0.20 / *!< Percentage of expires timeout to use when
below EXPIRY_GUARD_LIMIT */
# define DEFAULT_EXPIRY 900 /*!< Expire slowly */
static int min_expiry = DEFAULT_MIN_EXPIRY ; /*!< Minimum accepted registration time */
static int max_expiry = DEFAULT_MAX_EXPIRY ; /*!< Maximum accepted registration time */
static int default_expiry = DEFAULT_DEFAULT_EXPIRY ;
static int expiry = DEFAULT_EXPIRY ;
# ifndef MAX
# define MAX(a,b) ((a) > (b) ? (a) : (b))
@ -133,14 +139,17 @@ static int default_expiry = DEFAULT_DEFAULT_EXPIRY;
# define DEFAULT_MAXMS 2000 /*!< Must be faster than 2 seconds by default */
# define DEFAULT_FREQ_OK 60 * 1000 /*!< How often to check for the host to be up */
# define DEFAULT_FREQ_NOTOK 10 * 1000 /*!< How often to check, if the host is down... */
# define DEFAULT_MAXMS 2000 /*!< Qualification: Must be faster than 2 seconds by default */
# define DEFAULT_FREQ_OK 60 * 1000 /*!< Qualification: How often to check for the host to be up */
# define DEFAULT_FREQ_NOTOK 10 * 1000 /*!< Qualification: How often to check, if the host is down... */
# define DEFAULT_RETRANS 1000 /*!< How frequently to retransmit Default: 2 * 500 ms in RFC 3261 */
# define MAX_RETRANS 6 /*!< Try only 6 times for retransmissions, a total of 7 transmissions */
# define MAX_AUTHTRIES 3 /*!< Try authentication three times, then fail */
# define SIP_MAX_HEADERS 64 /*!< Max amount of SIP headers to read */
# define SIP_MAX_LINES 64 /*!< Max amount of lines in SIP attachment (like SDP) */
static const char desc [ ] = " Session Initiation Protocol (SIP) " ;
static const char channeltype [ ] = " SIP " ;
@ -326,76 +335,90 @@ static const struct cfsip_options {
/*! \brief SIP Extensions we support */
# define SUPPORTED_EXTENSIONS "replaces"
# define DEFAULT_SIP_PORT 5060 /*!< From RFC 3261 (former 2543) */
# define SIP_MAX_PACKET 4096 /*!< Also from RFC 3261 (2543), should sub headers tho */
static char default_useragent [ AST_MAX_EXTENSION ] = DEFAULT_USERAGENT ;
/* Default values, set and reset in reload_config before reading configuration */
/* These are default values in the source. There are other recommended values in the
sip . conf . sample for new installations . These may differ to keep backwards compatibility ,
yet encouraging new behaviour on new installations
*/
# define DEFAULT_SIP_PORT 5060 /*!< From RFC 3261 (former 2543) */
# define DEFAULT_CONTEXT "default"
# define DEFAULT_MUSICCLASS "default"
# define DEFAULT_VMEXTEN "asterisk"
# define DEFAULT_CALLERID "asterisk"
# define DEFAULT_NOTIFYMIME "application / simple-message-summary"
# define DEFAULT_MWITIME 10
# define DEFAULT_ALLOWGUEST TRUE
# define DEFAULT_VIDEOSUPPORT FALSE
# define DEFAULT_SRVLOOKUP FALSE /*!< Recommended setting is ON */
# define DEFAULT_COMPACTHEADERS FALSE
# define DEFAULT_TOS FALSE
# define DEFAULT_ALLOW_EXT_DOM TRUE
# define DEFAULT_REALM "asterisk"
# define DEFAULT_NOTIFYRINGING TRUE
# define DEFAULT_PEDANTIC FALSE
# define DEFAULT_AUTOCREATEPEER FALSE
# define DEFAULT_QUALIFY FALSE
# ifndef DEFAULT_USERAGENT
# define DEFAULT_USERAGENT "Asterisk PBX" /*!< Default Useragent: header unless re-defined in sip.conf */
# endif
# define DEFAULT_CONTEXT "default"
/* Default setttings are used as a channel setting and as a default when
configuring devices */
static char default_context [ AST_MAX_CONTEXT ] ;
static char default_subscribecontext [ AST_MAX_CONTEXT ] ;
# define DEFAULT_VMEXTEN "asterisk"
static char global_vmexten [ AST_MAX_EXTENSION ] ;
static char default_language [ MAX_LANGUAGE ] ;
# define DEFAULT_CALLERID "asterisk"
static char default_callerid [ AST_MAX_EXTENSION ] ;
static char default_fromdomain [ AST_MAX_EXTENSION ] ;
# define DEFAULT_NOTIFYMIME "application / simple-message-summary"
static char default_notifymime [ AST_MAX_EXTENSION ] ;
static int global_notifyringing ; /*!< Send notifications on ringing */
static int default_qualify ; /*!< Default Qualify= setting */
static char default_vmexten [ AST_MAX_EXTENSION ] ;
static char default_musicclass [ MAX_MUSICCLASS ] ; /*!< Global music on hold class */
/* Global settings only apply to the channel */
static int global_notifyringing ; /*!< Send notifications on ringing */
static int srvlookup ; /*!< SRV Lookup on or off. Default is off, RFC behavior is on */
static int pedanticsipchecking ; /*!< Extra checking ? Default off */
static int autocreatepeer ; /*!< Auto creation of peers at registration? Default off. */
static int relaxdtmf ; /*!< Relax DTMF */
static int global_rtptimeout ; /*!< Time out call if no RTP */
static int global_rtpholdtimeout ;
static int global_rtpkeepalive ; /*!< Send RTP keepalives */
static int global_reg_timeout ;
static int global_regattempts_max ; /*!< Registration attempts before giving up */
static int global_allowguest = 1 ; /*!< allow unauthenticated users/peers to connect? */
# define DEFAULT_MWITIME 10
static int global_allowguest ; /*!< allow unauthenticated users/peers to connect? */
static int global_mwitime ; /*!< Time between MWI checks for peers */
static int global_tos ; /*!< IP Type of service */
static int global_videosupport ; /*!< Videosupport on or off */
static int compactheaders ; /*!< send compact sip headers */
static int recordhistory ; /*!< Record SIP history. Off by default */
static int dumphistory ; /*!< Dump history to verbose before destroying SIP dialog */
static char global_realm [ MAXHOSTNAMELEN ] ; /*!< Default realm */
static char regcontext [ AST_MAX_CONTEXT ] ; /*!< Context for auto-extensions */
static char global_useragent [ AST_MAX_EXTENSION ] ; /*!< Useragent for the SIP channel */
static int allow_external_domains ; /*!< Accept calls to external SIP domains? */
static int tos = 0 ;
static int videosupport = 0 ;
static int compactheaders = 0 ; /*!< send compact sip headers */
/*! \brief Codecs that we support by default: */
static int global_capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263 ;
static int noncodeccapability = AST_RTP_DTMF ;
/* Object counters */
static int suserobjs = 0 ;
static int ruserobjs = 0 ;
static int speerobjs = 0 ;
static int rpeerobjs = 0 ;
static int apeerobjs = 0 ;
static int regobjs = 0 ;
static int suserobjs = 0 ; /*!< Static users */
static int ruserobjs = 0 ; /*!< Realtime users */
static int speerobjs = 0 ; /*!< Statis peers */
static int rpeerobjs = 0 ; /*!< Realtime peers */
static int apeerobjs = 0 ; /*!< Autocreated peer objects */
static int regobjs = 0 ; /*!< Registry objects */
static struct ast_flags global_flags = { 0 } ; /*!< global SIP_ flags */
static struct ast_flags global_flags_page2 = { 0 } ; /*!< more global SIP_ flags */
static int usecnt = 0 ;
AST_MUTEX_DEFINE_STATIC ( usecnt_lock ) ;
AST_MUTEX_DEFINE_STATIC ( rand_lock ) ;
AST_MUTEX_DEFINE_STATIC ( rand_lock ) ; /*!< Lock for thread-safe random generator */
/*! \brief Protect the SIP dialog list (of sip_pvt's) */
AST_MUTEX_DEFINE_STATIC ( iflock ) ;
@ -412,32 +435,16 @@ static pthread_t monitor_thread = AST_PTHREADT_NULL;
static int restart_monitor ( void ) ;
/*! \brief Codecs that we support by default: */
static int global_capability = AST_FORMAT_ULAW | AST_FORMAT_ALAW | AST_FORMAT_GSM | AST_FORMAT_H263 ;
static int noncodeccapability = AST_RTP_DTMF ;
static struct in_addr __ourip ;
static struct sockaddr_in outboundproxyip ;
static int ourport ;
static struct sockaddr_in debugaddr ;
static int recordhistory ; /*!< Record SIP history. Off by default */
static int dumphistory ; /*!< Dump history to verbose before destroying SIP dialog */
static char global_musicclass [ MAX_MUSICCLASS ] ; /*!< Global music on hold class */
# define DEFAULT_REALM "asterisk"
static char global_realm [ MAXHOSTNAMELEN ] ; /*!< Default realm */
static char regcontext [ AST_MAX_CONTEXT ] ; /*!< Context for auto-extensions */
# define DEFAULT_EXPIRY 900 /*!< Expire slowly */
static int expiry = DEFAULT_EXPIRY ;
static struct sched_context * sched ;
static struct io_context * io ;
# define SIP_MAX_HEADERS 64 /*!< Max amount of SIP headers to read */
# define SIP_MAX_LINES 64 /*!< Max amount of lines in SIP attachment (like SDP) */
# define DEC_CALL_LIMIT 0
# define INC_CALL_LIMIT 1
@ -493,7 +500,6 @@ struct domain {
static AST_LIST_HEAD_STATIC ( domain_list , domain ) ; /*!< The SIP domain list */
int allow_external_domains ; /*!< Accept calls to external SIP domains? */
/*! \brief sip_history: Structure for saving transactions within a SIP dialog */
struct sip_history {
@ -3129,10 +3135,10 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
if ( sip_methods [ intended_method ] . need_rtp ) {
p - > rtp = ast_rtp_new_with_bindaddr ( sched , io , 1 , 0 , bindaddr . sin_addr ) ;
if ( videosupport)
if ( global_ videosupport)
p - > vrtp = ast_rtp_new_with_bindaddr ( sched , io , 1 , 0 , bindaddr . sin_addr ) ;
if ( ! p - > rtp | | ( videosupport & & ! p - > vrtp ) ) {
ast_log ( LOG_WARNING , " Unable to create RTP audio %s session: %s \n " , videosupport ? " and video " : " " , strerror ( errno ) ) ;
if ( ! p - > rtp | | ( global_ videosupport & & ! p - > vrtp ) ) {
ast_log ( LOG_WARNING , " Unable to create RTP audio %s session: %s \n " , global_ videosupport ? " and video " : " " , strerror ( errno ) ) ;
ast_mutex_destroy ( & p - > lock ) ;
if ( p - > chanvars ) {
ast_variables_destroy ( p - > chanvars ) ;
@ -3141,9 +3147,9 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
free ( p ) ;
return NULL ;
}
ast_rtp_settos ( p - > rtp , tos) ;
ast_rtp_settos ( p - > rtp , global_ tos) ;
if ( p - > vrtp )
ast_rtp_settos ( p - > vrtp , tos) ;
ast_rtp_settos ( p - > vrtp , global_ tos) ;
p - > rtptimeout = global_rtptimeout ;
p - > rtpholdtimeout = global_rtpholdtimeout ;
p - > rtpkeepalive = global_rtpkeepalive ;
@ -3168,7 +3174,7 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
ast_string_field_set ( p , callid , callid ) ;
ast_copy_flags ( p , & global_flags , SIP_FLAGS_TO_COPY ) ;
/* Assign default music on hold class */
ast_string_field_set ( p , musicclass , global _musicclass) ;
ast_string_field_set ( p , musicclass , default _musicclass) ;
p - > capability = global_capability ;
if ( ( ast_test_flag ( p , SIP_DTMF ) = = SIP_DTMF_RFC2833 ) | | ( ast_test_flag ( p , SIP_DTMF ) = = SIP_DTMF_AUTO ) )
p - > noncodeccapability | = AST_RTP_DTMF ;
@ -4071,7 +4077,7 @@ static int respprep(struct sip_request *resp, struct sip_pvt *p, char *msg, stru
add_header ( resp , " To " , ot ) ;
copy_header ( resp , req , " Call-ID " ) ;
copy_header ( resp , req , " CSeq " ) ;
add_header ( resp , " User-Agent " , default _useragent) ;
add_header ( resp , " User-Agent " , global _useragent) ;
add_header ( resp , " Allow " , ALLOWED_METHODS ) ;
if ( msg [ 0 ] = = ' 2 ' & & ( p - > method = = SIP_SUBSCRIBE | | p - > method = = SIP_REGISTER ) ) {
/* For registration responses, we also need expiry and
@ -4187,7 +4193,7 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, in
copy_header ( req , orig , " Call-ID " ) ;
add_header ( req , " CSeq " , tmp ) ;
add_header ( req , " User-Agent " , default _useragent) ;
add_header ( req , " User-Agent " , global _useragent) ;
add_header ( req , " Max-Forwards " , DEFAULT_MAX_FORWARDS ) ;
if ( ! ast_strlen_zero ( p - > rpid ) )
@ -4506,7 +4512,7 @@ static int add_sdp(struct sip_request *resp, struct sip_pvt *p)
}
/* Now send any other common codecs, and non-codec formats: */
for ( x = 1 ; x < = ( ( videosupport & & p - > vrtp ) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO ) ; x < < = 1 ) {
for ( x = 1 ; x < = ( ( global_ videosupport & & p - > vrtp ) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO ) ; x < < = 1 ) {
if ( ! ( capability & x ) )
continue ;
@ -4916,7 +4922,7 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
add_header ( req , " Contact " , p - > our_contact ) ;
add_header ( req , " Call-ID " , p - > callid ) ;
add_header ( req , " CSeq " , tmp ) ;
add_header ( req , " User-Agent " , default _useragent) ;
add_header ( req , " User-Agent " , global _useragent) ;
add_header ( req , " Max-Forwards " , DEFAULT_MAX_FORWARDS ) ;
if ( ! ast_strlen_zero ( p - > rpid ) )
add_header ( req , " Remote-Party-ID " , p - > rpid ) ;
@ -5205,7 +5211,7 @@ static int transmit_notify_with_mwi(struct sip_pvt *p, int newmsgs, int oldmsgs,
add_header ( & req , " Content-Type " , default_notifymime ) ;
ast_build_string ( & t , & maxbytes , " Messages-Waiting: %s \r \n " , newmsgs ? " yes " : " no " ) ;
ast_build_string ( & t , & maxbytes , " Message-Account: sip:%s@%s \r \n " , ! ast_strlen_zero ( vmexten ) ? vmexten : global _vmexten, ast_strlen_zero ( p - > fromdomain ) ? ast_inet_ntoa ( iabuf , sizeof ( iabuf ) , p - > ourip ) : p - > fromdomain ) ;
ast_build_string ( & t , & maxbytes , " Message-Account: sip:%s@%s \r \n " , ! ast_strlen_zero ( vmexten ) ? vmexten : default _vmexten, ast_strlen_zero ( p - > fromdomain ) ? ast_inet_ntoa ( iabuf , sizeof ( iabuf ) , p - > ourip ) : p - > fromdomain ) ;
ast_build_string ( & t , & maxbytes , " Voice-Message: %d/%d (0/0) \r \n " , newmsgs , oldmsgs ) ;
if ( t > tmp + sizeof ( tmp ) )
@ -5511,7 +5517,7 @@ static int transmit_register(struct sip_registry *r, int sipmethod, char *auth,
add_header ( & req , " To " , to ) ;
add_header ( & req , " Call-ID " , p - > callid ) ;
add_header ( & req , " CSeq " , tmp ) ;
add_header ( & req , " User-Agent " , default _useragent) ;
add_header ( & req , " User-Agent " , global _useragent) ;
add_header ( & req , " Max-Forwards " , DEFAULT_MAX_FORWARDS ) ;
@ -8247,7 +8253,7 @@ static int sip_show_settings(int fd, int argc, char *argv[])
ast_cli ( fd , " ---------------- \n " ) ;
ast_cli ( fd , " SIP Port: %d \n " , ntohs ( bindaddr . sin_port ) ) ;
ast_cli ( fd , " Bindaddress: %s \n " , ast_inet_ntoa ( tmp , sizeof ( tmp ) , bindaddr . sin_addr ) ) ;
ast_cli ( fd , " Videosupport: %s \n " , videosupport ? " Yes " : " No " ) ;
ast_cli ( fd , " Videosupport: %s \n " , global_ videosupport ? " Yes " : " No " ) ;
ast_cli ( fd , " AutoCreatePeer: %s \n " , autocreatepeer ? " Yes " : " No " ) ;
ast_cli ( fd , " Allow unknown access: %s \n " , global_allowguest ? " Yes " : " No " ) ;
ast_cli ( fd , " Promsic. redir: %s \n " , ast_test_flag ( & global_flags , SIP_PROMISCREDIR ) ? " Yes " : " No " ) ;
@ -8256,14 +8262,14 @@ static int sip_show_settings(int fd, int argc, char *argv[])
ast_cli ( fd , " URI user is phone no: %s \n " , ast_test_flag ( & global_flags , SIP_USEREQPHONE ) ? " Yes " : " No " ) ;
ast_cli ( fd , " Our auth realm %s \n " , global_realm ) ;
ast_cli ( fd , " Realm. auth: %s \n " , authl ? " Yes " : " No " ) ;
ast_cli ( fd , " User Agent: %s \n " , default _useragent) ;
ast_cli ( fd , " User Agent: %s \n " , global _useragent) ;
ast_cli ( fd , " MWI checking interval: %d secs \n " , global_mwitime ) ;
ast_cli ( fd , " Reg. context: %s \n " , ast_strlen_zero ( regcontext ) ? " (not set) " : regcontext ) ;
ast_cli ( fd , " Caller ID: %s \n " , default_callerid ) ;
ast_cli ( fd , " From: Domain: %s \n " , default_fromdomain ) ;
ast_cli ( fd , " Record SIP history: %s \n " , recordhistory ? " On " : " Off " ) ;
ast_cli ( fd , " Call Events: %s \n " , callevents ? " On " : " Off " ) ;
ast_cli ( fd , " IP ToS: 0x%x \n " , tos) ;
ast_cli ( fd , " IP ToS: 0x%x \n " , global_ tos) ;
# ifdef OSP_SUPPORT
ast_cli ( fd , " OSP Support: Yes \n " ) ;
# else
@ -8301,8 +8307,8 @@ static int sip_show_settings(int fd, int argc, char *argv[])
ast_cli ( fd , " Use ClientCode: %s \n " , ast_test_flag ( & global_flags , SIP_USECLIENTCODE ) ? " Yes " : " No " ) ;
ast_cli ( fd , " Progress inband: %s \n " , ( ast_test_flag ( & global_flags , SIP_PROG_INBAND ) = = SIP_PROG_INBAND_NEVER ) ? " Never " : ( ast_test_flag ( & global_flags , SIP_PROG_INBAND ) = = SIP_PROG_INBAND_NO ) ? " No " : " Yes " ) ;
ast_cli ( fd , " Language: %s \n " , ast_strlen_zero ( default_language ) ? " (Defaults to English) " : default_language ) ;
ast_cli ( fd , " Musicclass: %s \n " , global _musicclass) ;
ast_cli ( fd , " Voice Mail Extension: %s \n " , global _vmexten) ;
ast_cli ( fd , " Musicclass: %s \n " , default _musicclass) ;
ast_cli ( fd , " Voice Mail Extension: %s \n " , default _vmexten) ;
if ( realtimepeers | | realtimeusers ) {
@ -11945,7 +11951,7 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v, int
/* set default context */
strcpy ( user - > context , default_context ) ;
strcpy ( user - > language , default_language ) ;
strcpy ( user - > musicclass , global _musicclass) ;
strcpy ( user - > musicclass , default _musicclass) ;
for ( ; v ; v = v - > next ) {
if ( handle_common_options ( & userflags , & mask , v ) )
continue ;
@ -12027,7 +12033,7 @@ static struct sip_peer *temp_peer(const char *name)
strcpy ( peer - > context , default_context ) ;
strcpy ( peer - > subscribecontext , default_subscribecontext ) ;
strcpy ( peer - > language , default_language ) ;
strcpy ( peer - > musicclass , global _musicclass) ;
strcpy ( peer - > musicclass , default _musicclass) ;
peer - > addr . sin_port = htons ( DEFAULT_SIP_PORT ) ;
peer - > addr . sin_family = AF_INET ;
peer - > capability = global_capability ;
@ -12097,9 +12103,9 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, int
}
strcpy ( peer - > context , default_context ) ;
strcpy ( peer - > subscribecontext , default_subscribecontext ) ;
strcpy ( peer - > vmexten , global _vmexten) ;
strcpy ( peer - > vmexten , default _vmexten) ;
strcpy ( peer - > language , default_language ) ;
strcpy ( peer - > musicclass , global _musicclass) ;
strcpy ( peer - > musicclass , default _musicclass) ;
ast_copy_flags ( peer , & global_flags , SIP_USEREQPHONE ) ;
peer - > secret [ 0 ] = ' \0 ' ;
peer - > md5secret [ 0 ] = ' \0 ' ;
@ -12331,58 +12337,66 @@ static int reload_config(void)
return - 1 ;
}
/* Clear all flags before setting default values */
ast_clear_flag ( & global_flags , AST_FLAGS_ALL ) ;
/* Reset IP addresses */
memset ( & bindaddr , 0 , sizeof ( bindaddr ) ) ;
memset ( & localaddr , 0 , sizeof ( localaddr ) ) ;
memset ( & externip , 0 , sizeof ( externip ) ) ;
memset ( & prefs , 0 , sizeof ( prefs ) ) ;
ast_clear_flag ( & global_flags_page2 , SIP_PAGE2_DEBUG_CONFIG ) ;
/* Initialize some reasonable defaults at SIP reload */
ast_copy_string ( default_context , DEFAULT_CONTEXT , sizeof ( default_context ) ) ;
default_subscribecontext [ 0 ] = ' \0 ' ;
default_language [ 0 ] = ' \0 ' ;
default_fromdomain [ 0 ] = ' \0 ' ;
default_qualify = 0 ;
allow_external_domains = 1 ; /* Allow external invites */
externhost [ 0 ] = ' \0 ' ;
externexpire = 0 ;
outboundproxyip . sin_port = htons ( DEFAULT_SIP_PORT ) ;
outboundproxyip . sin_family = AF_INET ; /* Type of address: IPv4 */
ourport = DEFAULT_SIP_PORT ;
srvlookup = DEFAULT_SRVLOOKUP ;
global_tos = DEFAULT_TOS ;
externhost [ 0 ] = ' \0 ' ; /* External host name (for behind NAT DynDNS support) */
externexpire = 0 ; /* Expiration for DNS re-issuing */
externrefresh = 10 ;
ast_copy_string ( default_useragent , DEFAULT_USERAGENT , sizeof ( default_useragent ) ) ;
memset ( & outboundproxyip , 0 , sizeof ( outboundproxyip ) ) ;
/* Reset channel settings to default before re-configuring */
allow_external_domains = DEFAULT_ALLOW_EXT_DOM ; /* Allow external invites */
regcontext [ 0 ] = ' \0 ' ;
expiry = DEFAULT_EXPIRY ;
global_notifyringing = DEFAULT_NOTIFYRINGING ;
ast_copy_string ( global_useragent , DEFAULT_USERAGENT , sizeof ( global_useragent ) ) ;
ast_copy_string ( default_notifymime , DEFAULT_NOTIFYMIME , sizeof ( default_notifymime ) ) ;
global_notifyringing = 1 ;
ast_copy_string ( global_realm , DEFAULT_REALM , sizeof ( global_realm ) ) ;
ast_copy_string ( global_musicclass , " default " , sizeof ( global_musicclass ) ) ;
ast_copy_string ( default_callerid , DEFAULT_CALLERID , sizeof ( default_callerid ) ) ;
memset ( & outboundproxyip , 0 , sizeof ( outboundproxyip ) ) ;
outboundproxyip . sin_port = htons ( DEFAULT_SIP_PORT ) ;
outboundproxyip . sin_family = AF_INET ; /* Type of address: IPv4 */
videosupport = 0 ;
compactheaders = 0 ;
dumphistory = 0 ;
recordhistory = 0 ;
relaxdtmf = 0 ;
callevents = 0 ;
ourport = DEFAULT_SIP_PORT ;
global_videosupport = DEFAULT_VIDEOSUPPORT ;
compactheaders = DEFAULT_COMPACTHEADERS ;
global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT ;
global_regattempts_max = 0 ;
pedanticsipchecking = DEFAULT_PEDANTIC ;
global_mwitime = DEFAULT_MWITIME ;
autocreatepeer = DEFAULT_AUTOCREATEPEER ;
global_allowguest = DEFAULT_ALLOWGUEST ;
global_rtptimeout = 0 ;
global_rtpholdtimeout = 0 ;
global_rtpkeepalive = 0 ;
pedanticsipchecking = 0 ;
global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT ;
global_regattempts_max = 0 ;
ast_clear_flag ( & global_flags , AST_FLAGS_ALL ) ;
ast_set_flag ( & global_flags , SIP_DTMF_RFC2833 ) ;
ast_set_flag ( & global_flags , SIP_NAT_RFC3581 ) ;
ast_set_flag ( & global_flags , SIP_CAN_REINVITE ) ;
ast_set_flag ( & global_flags_page2 , SIP_PAGE2_RTUPDATE ) ;
global_mwitime = DEFAULT_MWITIME ;
strcpy ( global_vmexten , DEFAULT_VMEXTEN ) ;
srvlookup = 0 ;
autocreatepeer = 0 ;
regcontext [ 0 ] = ' \0 ' ;
tos = 0 ;
expiry = DEFAULT_EXPIRY ;
global_allowguest = 1 ;
/* Initialize some reasonable defaults at SIP reload (used both for channel and as default for peers and users */
ast_copy_string ( default_context , DEFAULT_CONTEXT , sizeof ( default_context ) ) ;
default_subscribecontext [ 0 ] = ' \0 ' ;
default_language [ 0 ] = ' \0 ' ;
default_fromdomain [ 0 ] = ' \0 ' ;
default_qualify = DEFAULT_QUALIFY ;
ast_copy_string ( default_musicclass , DEFAULT_MUSICCLASS , sizeof ( default_musicclass ) ) ;
ast_copy_string ( default_vmexten , DEFAULT_VMEXTEN , sizeof ( default_vmexten ) ) ;
ast_set_flag ( & global_flags , SIP_DTMF_RFC2833 ) ; /*!< Default DTMF setting: RFC2833 */
ast_set_flag ( & global_flags , SIP_NAT_RFC3581 ) ; /*!< NAT support if requested by device with rport */
ast_set_flag ( & global_flags , SIP_CAN_REINVITE ) ; /*!< Allow re-invites */
/* Debugging settings, always default to off */
dumphistory = FALSE ;
recordhistory = FALSE ;
ast_clear_flag ( & global_flags_page2 , SIP_PAGE2_DEBUG_CONFIG ) ;
/* Misc settings for the channel */
relaxdtmf = 0 ;
callevents = 0 ;
/* Read the [general] config section of sip.conf (or from realtime config) */
for ( v = ast_variable_browse ( cfg , " general " ) ; v ; v = v - > next ) {
@ -12395,9 +12409,8 @@ static int reload_config(void)
} else if ( ! strcasecmp ( v - > name , " realm " ) ) {
ast_copy_string ( global_realm , v - > value , sizeof ( global_realm ) ) ;
} else if ( ! strcasecmp ( v - > name , " useragent " ) ) {
ast_copy_string ( default_useragent , v - > value , sizeof ( default_useragent ) ) ;
ast_log ( LOG_DEBUG , " Setting User Agent Name to %s \n " ,
default_useragent ) ;
ast_copy_string ( global_useragent , v - > value , sizeof ( global_useragent ) ) ;
ast_log ( LOG_DEBUG , " Setting SIP channel User-Agent Name to %s \n " , global_useragent ) ;
} else if ( ! strcasecmp ( v - > name , " rtcachefriends " ) ) {
ast_set2_flag ( ( & global_flags_page2 ) , ast_true ( v - > value ) , SIP_PAGE2_RTCACHEFRIENDS ) ;
} else if ( ! strcasecmp ( v - > name , " rtupdate " ) ) {
@ -12421,7 +12434,7 @@ static int reload_config(void)
global_mwitime = DEFAULT_MWITIME ;
}
} else if ( ! strcasecmp ( v - > name , " vmexten " ) ) {
ast_copy_string ( global _vmexten, v - > value , sizeof ( global _vmexten) ) ;
ast_copy_string ( default _vmexten, v - > value , sizeof ( default _vmexten) ) ;
} else if ( ! strcasecmp ( v - > name , " rtptimeout " ) ) {
if ( ( sscanf ( v - > value , " %d " , & global_rtptimeout ) ! = 1 ) | | ( global_rtptimeout < 0 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid RTP hold time at line %d. Using default. \n " , v - > value , v - > lineno ) ;
@ -12438,7 +12451,7 @@ static int reload_config(void)
global_rtpkeepalive = 0 ;
}
} else if ( ! strcasecmp ( v - > name , " videosupport " ) ) {
videosupport = ast_true ( v - > value ) ;
global_ videosupport = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " compactheaders " ) ) {
compactheaders = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifymimetype " ) ) {
@ -12446,7 +12459,7 @@ static int reload_config(void)
} else if ( ! strcasecmp ( v - > name , " notifyringing " ) ) {
global_notifyringing = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " musicclass " ) | | ! strcasecmp ( v - > name , " musiconhold " ) ) {
ast_copy_string ( global _musicclass, v - > value , sizeof ( global _musicclass) ) ;
ast_copy_string ( default _musicclass, v - > value , sizeof ( default _musicclass) ) ;
} else if ( ! strcasecmp ( v - > name , " language " ) ) {
ast_copy_string ( default_language , v - > value , sizeof ( default_language ) ) ;
} else if ( ! strcasecmp ( v - > name , " regcontext " ) ) {
@ -12552,7 +12565,7 @@ static int reload_config(void)
} else if ( ! strcasecmp ( v - > name , " register " ) ) {
sip_register ( v - > value , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " tos " ) ) {
if ( ast_str2tos ( v - > value , & tos) )
if ( ast_str2tos ( v - > value , & global_ tos) )
ast_log ( LOG_WARNING , " Invalid tos value at line %d, should be 'lowdelay', 'throughput', 'reliability', 'mincost', or 'none' \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " bindport " ) ) {
if ( sscanf ( v - > value , " %d " , & ourport ) = = 1 ) {
@ -12660,10 +12673,10 @@ static int reload_config(void)
if ( option_verbose > 1 ) {
ast_verbose ( VERBOSE_PREFIX_2 " SIP Listening on %s:%d \n " ,
ast_inet_ntoa ( iabuf , sizeof ( iabuf ) , bindaddr . sin_addr ) , ntohs ( bindaddr . sin_port ) ) ;
ast_verbose ( VERBOSE_PREFIX_2 " Using TOS bits %d \n " , tos) ;
ast_verbose ( VERBOSE_PREFIX_2 " Using TOS bits %d \n " , global_ tos) ;
}
if ( setsockopt ( sipsock , IPPROTO_IP , IP_TOS , & tos, sizeof ( tos) ) )
ast_log ( LOG_WARNING , " Unable to set TOS to %d \n " , tos) ;
if ( setsockopt ( sipsock , IPPROTO_IP , IP_TOS , & global_ tos, sizeof ( global_ tos) ) )
ast_log ( LOG_WARNING , " Unable to set TOS to %d \n " , global_ tos) ;
}
}
}