[sr-dev] git:master: usrloc(k): keep time of the last keepalive for natted UDP contacts

Klaus Darilion klaus.mailinglists at pernau.at
Mon Aug 20 09:42:51 CEST 2012


Why only UDP? Are TCP contacts removed when the TCP connections is closed?

IMO there should also be a mechanism to remove ALL expired unresponsive 
contacts.

regards
Klaus

On 19.08.2012 21:30, Daniel-Constantin Mierla wrote:
> Module: sip-router
> Branch: master
> Commit: 36845cc575f36a62d88b0e10826c04d63edbd536
> URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=36845cc575f36a62d88b0e10826c04d63edbd536
>
> Author: Daniel-Constantin Mierla <miconda at gmail.com>
> Committer: Daniel-Constantin Mierla <miconda at gmail.com>
> Date:   Sun Aug 19 13:01:36 2012 +0200
>
> usrloc(k): keep time of the last keepalive for natted UDP contacts
>
> - new field in the contact structure to keep the timestamp when that
>    conctact was refreshed by keepalive or registration update
> - it is taken in cosideration to remove contacts that don't reply to nat
>    ping requests, so it works only together with nathelper module
> - when an UDP contact is not resposive for an interval of time, the
>    contact is set to expire is 10 seconds. This process takes place in
>    the function that fetches the list of contacts for nat pinging
> - last_modified and last_keepalive are exported to mi and rpc list
>    commands
>
> ---
>
>   modules_k/usrloc/dlist.c    |   71 +++++++++++++++++++++++++++++++++++++++++++
>   modules_k/usrloc/ucontact.c |    2 +
>   modules_k/usrloc/ul_mi.c    |   15 +++++++++
>   modules_k/usrloc/ul_mod.c   |    1 +
>   modules_k/usrloc/ul_mod.h   |    7 ++++
>   modules_k/usrloc/ul_rpc.c   |   16 ++++++++++
>   modules_k/usrloc/usrloc.c   |   20 +++++++++---
>   modules_k/usrloc/usrloc.h   |   10 ++++++
>   8 files changed, 137 insertions(+), 5 deletions(-)
>
> diff --git a/modules_k/usrloc/dlist.c b/modules_k/usrloc/dlist.c
> index 2f55ce7..3cc520d 100644
> --- a/modules_k/usrloc/dlist.c
> +++ b/modules_k/usrloc/dlist.c
> @@ -307,6 +307,12 @@ static inline int get_all_mem_ucontacts(void *buf, int len, unsigned int flags,
>   	int i = 0;
>   	cp = buf;
>   	shortage = 0;
> +	time_t tnow = 0;
> +
> +
> +	if(ul_keepalive_timeout>0)
> +		tnow = time(NULL);
> +
>   	/* Reserve space for terminating 0000 */
>   	len -= sizeof(c->c.len);
>
> @@ -333,6 +339,22 @@ static inline int get_all_mem_ucontacts(void *buf, int len, unsigned int flags,
>   					 */
>   					if ((c->cflags & flags) != flags)
>   						continue;
> +
> +					if(ul_keepalive_timeout>0 && c->last_keepalive>0)
> +					{
> +						if((c->cflags & nat_bflag) != 0 && c->sock!=NULL
> +								&& c->sock->proto==PROTO_UDP)
> +						{
> +							if(c->last_keepalive+ul_keepalive_timeout < tnow)
> +							{
> +								/* set contact as expired in 10s */
> +								if(c->expires > tnow + 10)
> +									c->expires = tnow + 10;
> +								continue;
> +							}
> +						}
> +					}
> +
>   					if (c->received.s) {
>   						needed = (int)(sizeof(c->received.len)
>   								+ c->received.len
> @@ -457,6 +479,55 @@ int get_all_ucontacts(void *buf, int len, unsigned int flags,
>
>
>
> +/**
> + *
> + */
> +int ul_refresh_keepalive(unsigned int _aorhash, str *_ruid)
> +{
> +	dlist_t *p;
> +	urecord_t *r;
> +	ucontact_t *c;
> +	int i;
> +
> +	/* todo: get location domain via param */
> +
> +	for (p = root; p != NULL; p = p->next)
> +	{
> +		i = _aorhash&(p->d->size-1);
> +		lock_ulslot(p->d, i);
> +		if(p->d->table[i].n<=0)
> +		{
> +			unlock_ulslot(p->d, i);
> +			continue;
> +		}
> +		for (r = p->d->table[i].first; r != NULL; r = r->next)
> +		{
> +			if(r->aorhash==_aorhash)
> +			{
> +				for (c = r->contacts; c != NULL; c = c->next)
> +				{
> +					if (c->c.len <= 0 || c->ruid.len<=0)
> +						continue;
> +					if(c->ruid.len==_ruid->len
> +							&& !memcmp(c->ruid.s, _ruid->s, _ruid->len))
> +					{
> +						/* found */
> +						c->last_keepalive = time(NULL);
> +						LM_DBG("updated keepalive for [%.*s:%u] to %u\n",
> +								_ruid->len, _ruid->s, _aorhash,
> +								(unsigned int)c->last_keepalive);
> +						unlock_ulslot(p->d, i);
> +						return 0;
> +					}
> +				}
> +			}
> +		}
> +		unlock_ulslot(p->d, i);
> +	}
> +
> +	return 0;
> +}
> +
>   /*!
>    * \brief Create a new domain structure
>    * \return 0 if everything went OK, otherwise value < 0 is returned
> diff --git a/modules_k/usrloc/ucontact.c b/modules_k/usrloc/ucontact.c
> index ac76e9b..dba66be 100644
> --- a/modules_k/usrloc/ucontact.c
> +++ b/modules_k/usrloc/ucontact.c
> @@ -96,6 +96,7 @@ ucontact_t* new_ucontact(str* _dom, str* _aor, str* _contact, ucontact_info_t* _
>   	c->methods = _ci->methods;
>   	c->reg_id = _ci->reg_id;
>   	c->last_modified = _ci->last_modified;
> +	c->last_keepalive = _ci->last_modified;
>
>   	return c;
>   error:
> @@ -250,6 +251,7 @@ int mem_update_ucontact(ucontact_t* _c, ucontact_info_t* _ci)
>   	_c->cseq = _ci->cseq;
>   	_c->methods = _ci->methods;
>   	_c->last_modified = _ci->last_modified;
> +	_c->last_keepalive = _ci->last_modified;
>   	_c->flags = _ci->flags;
>   	_c->cflags = _ci->cflags;
>
> diff --git a/modules_k/usrloc/ul_mi.c b/modules_k/usrloc/ul_mi.c
> index ca7c71a..66c85ca 100644
> --- a/modules_k/usrloc/ul_mi.c
> +++ b/modules_k/usrloc/ul_mi.c
> @@ -259,6 +259,21 @@ static inline int mi_add_aor_node(struct mi_node *parent, urecord_t* r, time_t t
>   		node = add_mi_node_child( cnode, MI_DUP_VALUE, "Reg-Id", 6, p, len);
>   		if (node==0)
>   			return -1;
> +
> +		/* last keepalive */
> +		p = int2str((unsigned long)c->last_keepalive, &len);
> +		node = add_mi_node_child( cnode, MI_DUP_VALUE, "Last-Keepalive",
> +					14, p, len);
> +		if (node==0)
> +			return -1;
> +
> +		/* last modified */
> +		p = int2str((unsigned long)c->last_modified, &len);
> +		node = add_mi_node_child( cnode, MI_DUP_VALUE, "Last-Modified",
> +					13, p, len);
> +		if (node==0)
> +			return -1;
> +
>   	} /* for */
>
>   	return 0;
> diff --git a/modules_k/usrloc/ul_mod.c b/modules_k/usrloc/ul_mod.c
> index a6e7ebd..7b6af79 100644
> --- a/modules_k/usrloc/ul_mod.c
> +++ b/modules_k/usrloc/ul_mod.c
> @@ -108,6 +108,7 @@ extern int ul_locks_no;
>   int ul_db_update_as_insert = 0;
>   int ul_timer_procs = 0;
>   int ul_db_check_update = 0;
> +int ul_keepalive_timeout = 0;
>
>   /* sruid to get internal uid for mi/rpc commands */
>   sruid_t _ul_sruid;
> diff --git a/modules_k/usrloc/ul_mod.h b/modules_k/usrloc/ul_mod.h
> index 30b8885..e10b2c8 100644
> --- a/modules_k/usrloc/ul_mod.h
> +++ b/modules_k/usrloc/ul_mod.h
> @@ -74,6 +74,13 @@ extern int ul_fetch_rows;
>   extern int ul_hash_size;
>   extern int ul_db_update_as_insert;
>   extern int ul_db_check_update;
> +extern int ul_keepalive_timeout;
> +
> +/*! nat branch flag */
> +extern unsigned int nat_bflag;
> +/*! flag to protect against wrong initialization */
> +extern unsigned int init_flag;
> +
>
>   extern db1_con_t* ul_dbh;   /* Database connection handle */
>   extern db_func_t ul_dbf;
> diff --git a/modules_k/usrloc/ul_rpc.c b/modules_k/usrloc/ul_rpc.c
> index 49cae17..38c1a61 100644
> --- a/modules_k/usrloc/ul_rpc.c
> +++ b/modules_k/usrloc/ul_rpc.c
> @@ -287,6 +287,22 @@ static void ul_rpc_dump(rpc_t* rpc, void* ctx)
>   									"Internal error adding reg_id");
>   							return;
>   						}
> +						if(rpc->struct_add(vh, "d",
> +									"Last-Keepalive", (int)c->last_keepalive)<0)
> +						{
> +							unlock_ulslot( dom, i);
> +							rpc->fault(ctx, 500,
> +									"Internal error adding reg_id");
> +							return;
> +						}
> +						if(rpc->struct_add(vh, "d",
> +									"Last-Modified", (int)c->last_modified)<0)
> +						{
> +							unlock_ulslot( dom, i);
> +							rpc->fault(ctx, 500,
> +									"Internal error adding reg_id");
> +							return;
> +						}
>
>   					}
>   				}
> diff --git a/modules_k/usrloc/usrloc.c b/modules_k/usrloc/usrloc.c
> index 8c3408f..ba0ec1a 100644
> --- a/modules_k/usrloc/usrloc.c
> +++ b/modules_k/usrloc/usrloc.c
> @@ -41,11 +41,6 @@
>   #include "../../sr_module.h"
>   #include "ul_mod.h"
>
> -/*! nat branch flag */
> -extern unsigned int nat_bflag;
> -/*! flag to protect against wrong initialization */
> -extern unsigned int init_flag;
> -
>
>   /*!
>    * \brief usrloc module API export bind function
> @@ -83,9 +78,24 @@ int bind_usrloc(usrloc_api_t* api)
>   	api->get_urecord_by_ruid      = get_urecord_by_ruid;
>   	api->get_ucontact_by_instance = get_ucontact_by_instance;
>
> +	api->set_keepalive_timeout    = ul_set_keepalive_timeout;
> +	api->refresh_keepalive        = ul_refresh_keepalive;
> +
>   	api->use_domain = use_domain;
>   	api->db_mode    = db_mode;
>   	api->nat_flag   = nat_bflag;
>
>   	return 0;
>   }
> +
> +/**
> + *
> + */
> +int ul_set_keepalive_timeout(int _to)
> +{
> +	int oto;
> +
> +	oto = ul_keepalive_timeout;
> +	ul_keepalive_timeout = _to;
> +	return oto;
> +}
> diff --git a/modules_k/usrloc/usrloc.h b/modules_k/usrloc/usrloc.h
> index bfd225a..214ac92 100644
> --- a/modules_k/usrloc/usrloc.h
> +++ b/modules_k/usrloc/usrloc.h
> @@ -83,6 +83,7 @@ typedef struct ucontact {
>   	str user_agent;         /*!< User-Agent header field */
>   	struct socket_info *sock; /*!< received socket */
>   	time_t last_modified;   /*!< When the record was last modified */
> +	time_t last_keepalive;  /*!< last keepalive timestamp */
>   	unsigned int methods;   /*!< Supported methods */
>   	str instance;           /*!< SIP instance value - gruu */
>   	unsigned int reg_id;    /*!< reg-id parameters */
> @@ -170,6 +171,12 @@ typedef int (*get_udomain_t)(const char* _n, udomain_t** _d);
>   typedef unsigned int (*ul_get_aorhash_t)(str *_aor);
>   unsigned int ul_get_aorhash(str *_aor);
>
> +typedef int (*ul_set_keepalive_timeout_t)(int _to);
> +int ul_set_keepalive_timeout(int _to);
> +
> +typedef int (*ul_refresh_keepalive_t)(unsigned int _aorhash, str *_ruid);
> +int ul_refresh_keepalive(unsigned int _aorhash, str *_ruid);
> +
>   /*! usrloc API export structure */
>   typedef struct usrloc_api {
>   	int           use_domain; /*! use_domain module parameter */
> @@ -198,6 +205,9 @@ typedef struct usrloc_api {
>
>   	register_ulcb_t      register_ulcb;
>   	ul_get_aorhash_t     get_aorhash;
> +
> +	ul_set_keepalive_timeout_t set_keepalive_timeout;
> +	ul_refresh_keepalive_t     refresh_keepalive;
>   } usrloc_api_t;
>
>
>
>
> _______________________________________________
> sr-dev mailing list
> sr-dev at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
>



More information about the sr-dev mailing list