diff --git a/CHANGES b/CHANGES index 1c1fa07b7b29aea191f45498f144fcea22036ec3..253f0200e9cbada8281c8725ed7ef9b127194dce 100644 --- a/CHANGES +++ b/CHANGES @@ -63,6 +63,8 @@ SIP Changes and restore this performance improvement. Astobj2 refcounting is now used for users, peers, and dialogs. Users are encouraged to assist in regression testing and problem reporting! + * Added ability to specify registration expiry time on a per registration basis in + the register line. IAX Changes ----------- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c9275b804e6c02918387aef4fda0b8e1762a6446..68fb035b9df75163e12eecf18472be4523d97c0d 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -6294,7 +6294,7 @@ static int sip_register(const char *value, int lineno) enum sip_transport transport = SIP_TRANSPORT_UDP; char buf[256] = ""; char *username = NULL; - char *hostname=NULL, *secret=NULL, *authuser=NULL; + char *hostname=NULL, *secret=NULL, *authuser=NULL, *expiry=NULL; char *porta=NULL; char *callback=NULL; char *trans=NULL; @@ -6330,7 +6330,7 @@ static int sip_register(const char *value, int lineno) if (hostname) *hostname++ = '\0'; if (ast_strlen_zero(username) || ast_strlen_zero(hostname)) { - ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact] at line %d\n", lineno); + ast_log(LOG_WARNING, "Format for registration is user[:secret[:authuser]]@host[:port][/contact][~expiry] at line %d\n", lineno); return -1; } /* split user[:secret[:authuser]] */ @@ -6342,6 +6342,9 @@ static int sip_register(const char *value, int lineno) *authuser++ = '\0'; } /* split host[:port][/contact] */ + expiry = strchr(hostname, '~'); + if (expiry) + *expiry++ = '\0'; callback = strchr(hostname, '/'); if (callback) *callback++ = '\0'; @@ -6380,9 +6383,9 @@ static int sip_register(const char *value, int lineno) ast_string_field_set(reg, secret, secret); reg->transport = transport; reg->expire = -1; - reg->expiry = default_expiry; + reg->expiry = (expiry ? atoi(expiry) : default_expiry); reg->timeout = -1; - reg->refresh = default_expiry; + reg->refresh = reg->expiry; reg->portno = portnum; reg->callid_valid = FALSE; reg->ocseq = INITIAL_CSEQ; diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index 7a3d114605c2ccea13233b9709751c3ddb9986ab..1b2a1c8a544b23748aa0f799225417731776e910 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -390,7 +390,7 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ;----------------------------------------- OUTBOUND SIP REGISTRATIONS ------------------------ ; Asterisk can register as a SIP user agent to a SIP proxy (provider) ; Format for the register statement is: -; register => [transport://]user[:secret[:authuser]]@host[:port][/extension] +; register => [transport://]user[:secret[:authuser]]@host[:port][/extension][~expiry] ; ; ;