Module: sip-router Branch: master Commit: 72996942662b944b74e6632e1670c989402bf8af URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=72996942...
Author: Vitaliy Aleksandrov vitalik.voip@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Wed Sep 4 09:56:28 2013 +0200
usrloc: detect lost tcp connnections on timer and set associated contact as expired
- new module parameter to control this feature: handle_lost_tcp - at this moment it is not implemented for db only mode
---
modules/usrloc/ucontact.c | 1 + modules/usrloc/ul_mod.c | 6 ++++++ modules/usrloc/ul_mod.h | 1 + modules/usrloc/urecord.c | 32 +++++++++++++++++++++++++++++++- modules/usrloc/usrloc.h | 2 ++ 5 files changed, 41 insertions(+), 1 deletions(-)
diff --git a/modules/usrloc/ucontact.c b/modules/usrloc/ucontact.c index d1ae1f3..e7f8938 100644 --- a/modules/usrloc/ucontact.c +++ b/modules/usrloc/ucontact.c @@ -135,6 +135,7 @@ ucontact_t* new_ucontact(str* _dom, str* _aor, str* _contact, ucontact_info_t* _ c->reg_id = _ci->reg_id; c->last_modified = _ci->last_modified; c->last_keepalive = _ci->last_modified; + c->tcpconn_id = _ci->tcpconn_id; #ifdef WITH_XAVP ucontact_xavp_store(c); #endif diff --git a/modules/usrloc/ul_mod.c b/modules/usrloc/ul_mod.c index 08126fd..7d88f67 100644 --- a/modules/usrloc/ul_mod.c +++ b/modules/usrloc/ul_mod.c @@ -161,6 +161,7 @@ int timer_interval = 60; /*!< Timer interval in seconds */ int db_mode = 0; /*!< Database sync scheme: 0-no db, 1-write through, 2-write back, 3-only db */ int use_domain = 0; /*!< Whether usrloc should use domain part of aor */ int desc_time_order = 0; /*!< By default do not enable timestamp ordering */ +int handle_lost_tcp = 0;
int ul_fetch_rows = 2000; /*!< number of rows to fetch from result */ int ul_hash_size = 9; @@ -214,6 +215,7 @@ static param_export_t params[] = { {"fetch_rows", INT_PARAM, &ul_fetch_rows }, {"hash_size", INT_PARAM, &ul_hash_size }, {"nat_bflag", INT_PARAM, &nat_bflag }, + {"handle_lost_tcp", INT_PARAM, &handle_lost_tcp }, {"preload", STR_PARAM|USE_FUNC_PARAM, (void*)ul_preload_param}, {"db_update_as_insert", INT_PARAM, &ul_db_update_as_insert}, {"timer_procs", INT_PARAM, &ul_timer_procs}, @@ -387,6 +389,10 @@ static int mod_init(void) return -1; } } + + if (handle_lost_tcp && db_mode == DB_ONLY) + LM_WARN("handle_lost_tcp option makes nothing in DB_ONLY mode\n"); + init_flag = 1;
return 0; diff --git a/modules/usrloc/ul_mod.h b/modules/usrloc/ul_mod.h index 2435b5e..0e61924 100644 --- a/modules/usrloc/ul_mod.h +++ b/modules/usrloc/ul_mod.h @@ -84,6 +84,7 @@ extern int ul_hash_size; extern int ul_db_update_as_insert; extern int ul_db_check_update; extern int ul_keepalive_timeout; +extern int handle_lost_tcp;
/*! nat branch flag */ extern unsigned int nat_bflag; diff --git a/modules/usrloc/urecord.c b/modules/usrloc/urecord.c index 93c8446..6423dd6 100644 --- a/modules/usrloc/urecord.c +++ b/modules/usrloc/urecord.c @@ -40,6 +40,7 @@ #include "../../dprint.h" #include "../../ut.h" #include "../../hashes.h" +#include "../../tcp_conn.h" #include "ul_mod.h" #include "usrloc.h" #include "utime.h" @@ -221,6 +222,26 @@ void mem_delete_ucontact(urecord_t* _r, ucontact_t* _c) free_ucontact(_c); }
+static inline int is_valid_tcpconn(ucontact_t *c) +{ + if (c->tcpconn_id == -1) + return 0; /* tcpconn_id is not present */ + else + return 1; /* valid tcpconn_id */ +} + +static inline int is_tcp_alive(ucontact_t *c) +{ + struct tcp_connection *con = NULL; + int rc = 0; + + if ((con = tcpconn_get(c->tcpconn_id, 0, 0, 0, 0))) { + tcpconn_put(con); /* refcnt-- */ + rc = 1; + } + + return rc; +}
/*! * \brief Expires timer for NO_DB db_mode @@ -236,6 +257,11 @@ static inline void nodb_timer(urecord_t* _r) ptr = _r->contacts;
while(ptr) { + if (handle_lost_tcp && is_valid_tcpconn(ptr) && !is_tcp_alive(ptr)) { + LM_DBG("tcp connection has been lost, expiring contact %.*s\n", ptr->c.len, ptr->c.s); + ptr->expires = UL_EXPIRED_TIME; + } + if (!VALID_CONTACT(ptr, act_time)) { /* run callbacks for EXPIRE event */ if (exists_ulcb_type(UL_CONTACT_EXPIRE)) @@ -296,7 +322,6 @@ static inline void wt_timer(urecord_t* _r) } }
- /*! * \brief Write-back timer, used for WRITE_BACK db_mode * @@ -316,6 +341,11 @@ static inline void wb_timer(urecord_t* _r) ptr = _r->contacts;
while(ptr) { + if (handle_lost_tcp && is_valid_tcpconn(ptr) && !is_tcp_alive(ptr)) { + LM_DBG("tcp connection has been lost, expiring contact %.*s\n", ptr->c.len, ptr->c.s); + ptr->expires = UL_EXPIRED_TIME; + } + if (!VALID_CONTACT(ptr, act_time)) { /* run callbacks for EXPIRE event */ if (exists_ulcb_type(UL_CONTACT_EXPIRE)) { diff --git a/modules/usrloc/usrloc.h b/modules/usrloc/usrloc.h index 1cf70bb..30cf354 100644 --- a/modules/usrloc/usrloc.h +++ b/modules/usrloc/usrloc.h @@ -91,6 +91,7 @@ typedef struct ucontact { unsigned int methods; /*!< Supported methods */ str instance; /*!< SIP instance value - gruu */ unsigned int reg_id; /*!< reg-id parameters */ + int tcpconn_id; /* unique tcp connection id */ #ifdef WITH_XAVP sr_xavp_t * xavp; /*!< per contact xavps */ #endif @@ -116,6 +117,7 @@ typedef struct ucontact_info { unsigned int methods; /*!< supported methods */ str instance; /*!< SIP instance value - gruu */ unsigned int reg_id; /*!< reg-id parameters */ + int tcpconn_id; #ifdef WITH_XAVP sr_xavp_t * xavp; /*!< per contact xavps */ #endif