|
@@ -44,45 +44,37 @@
|
|
|
|
|
|
static struct hdr_field* act_contact;
|
|
|
|
|
|
-/*! \brief
|
|
|
- * Return an expire value in the range [ default_expires - range%, default_expires + range% ]
|
|
|
+/* \brief
|
|
|
+ * Return randomized expires between expires-range% and expires.
|
|
|
+ * RFC allows only value less or equal to the one provided by UAC.
|
|
|
*/
|
|
|
-static inline int get_expire_val(void)
|
|
|
+static inline int randomize_expires( int expires, int range )
|
|
|
{
|
|
|
- int expires = cfg_get(registrar, registrar_cfg, default_expires);
|
|
|
- int range = cfg_get(registrar, registrar_cfg, default_expires_range);
|
|
|
- /* if no range is given just return default_expires */
|
|
|
- if(range == 0) return expires;
|
|
|
- /* select a random value in the range */
|
|
|
- return expires - (float)range/100 * expires + (float)(rand()%100)/100 * 2 * (float)range/100 * expires;
|
|
|
+ /* if no range is given just return expires */
|
|
|
+ if(range == 0) return expires;
|
|
|
+
|
|
|
+ int range_min = expires - (float)range/100 * expires;
|
|
|
+
|
|
|
+ return range_min + (float)(rand()%100)/100 * ( expires - range_min );
|
|
|
}
|
|
|
|
|
|
|
|
|
/*! \brief
|
|
|
* Return value of Expires header field
|
|
|
- * if the HF exists converted to absolute
|
|
|
- * time, if the HF doesn't exist, returns
|
|
|
- * default value;
|
|
|
+ * if the HF exists, if the HF doesn't exist,
|
|
|
+ * returns -1;
|
|
|
*/
|
|
|
static inline int get_expires_hf(struct sip_msg* _m)
|
|
|
{
|
|
|
exp_body_t* p;
|
|
|
- int range;
|
|
|
+
|
|
|
if (_m->expires) {
|
|
|
p = (exp_body_t*)_m->expires->parsed;
|
|
|
if (p->valid) {
|
|
|
- if (p->val != 0) {
|
|
|
- range = cfg_get(registrar, registrar_cfg, default_expires_range);
|
|
|
- if(likely(range==0))
|
|
|
- return p->val + act_time;
|
|
|
- return p->val + act_time - (float)range/100 * p->val
|
|
|
- + ((float)(rand()%100)/100) * ((float)range/100 * p->val);
|
|
|
- } else return 0;
|
|
|
- } else {
|
|
|
- return act_time + get_expire_val();
|
|
|
+ return p->val;
|
|
|
}
|
|
|
- } else
|
|
|
- return act_time + get_expire_val();
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -159,7 +151,7 @@ int check_contacts(struct sip_msg* _m, int* _s)
|
|
|
if (((contact_body_t*)_m->contact->parsed)->star == 1) {
|
|
|
/* The first Contact HF is star */
|
|
|
/* Expires must be zero */
|
|
|
- if (get_expires_hf(_m) > 0) {
|
|
|
+ if (get_expires_hf(_m) != 0) {
|
|
|
rerrno = R_STAR_EXP;
|
|
|
return 1;
|
|
|
}
|
|
@@ -252,22 +244,39 @@ contact_t* get_next_contact(contact_t* _c)
|
|
|
*/
|
|
|
void calc_contact_expires(struct sip_msg* _m, param_t* _ep, int* _e)
|
|
|
{
|
|
|
+ int range = 0;
|
|
|
if (!_ep || !_ep->body.len) {
|
|
|
- *_e = get_expires_hf(_m);
|
|
|
+ *_e = get_expires_hf(_m);
|
|
|
+
|
|
|
+ if ( *_e < 0 ) {
|
|
|
+ *_e = cfg_get(registrar, registrar_cfg, default_expires);
|
|
|
+ range = cfg_get(registrar, registrar_cfg, default_expires_range);
|
|
|
+ } else {
|
|
|
+ range = cfg_get(registrar, registrar_cfg, expires_range);
|
|
|
+ }
|
|
|
} else {
|
|
|
if (str2int(&_ep->body, (unsigned int*)_e) < 0) {
|
|
|
- *_e = get_expire_val();
|
|
|
+ *_e = cfg_get(registrar, registrar_cfg, default_expires);
|
|
|
+ range = cfg_get(registrar, registrar_cfg, default_expires_range);
|
|
|
+ } else {
|
|
|
+ range = cfg_get(registrar, registrar_cfg, expires_range);
|
|
|
}
|
|
|
- /* Convert to absolute value */
|
|
|
- if (*_e != 0) *_e += act_time;
|
|
|
}
|
|
|
|
|
|
- if ((*_e != 0) && ((*_e - act_time) < cfg_get(registrar, registrar_cfg, min_expires))) {
|
|
|
- *_e = cfg_get(registrar, registrar_cfg, min_expires) + act_time;
|
|
|
- }
|
|
|
+ if ( *_e != 0 )
|
|
|
+ {
|
|
|
+ *_e = randomize_expires( *_e, range );
|
|
|
+
|
|
|
+ if (*_e < cfg_get(registrar, registrar_cfg, min_expires)) {
|
|
|
+ *_e = cfg_get(registrar, registrar_cfg, min_expires);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cfg_get(registrar, registrar_cfg, max_expires) && (*_e > cfg_get(registrar, registrar_cfg, max_expires))) {
|
|
|
+ *_e = cfg_get(registrar, registrar_cfg, max_expires);
|
|
|
+ }
|
|
|
|
|
|
- if ((*_e != 0) && cfg_get(registrar, registrar_cfg, max_expires) && ((*_e - act_time) > cfg_get(registrar, registrar_cfg, max_expires))) {
|
|
|
- *_e = cfg_get(registrar, registrar_cfg, max_expires) + act_time;
|
|
|
+ /* Convert to absolute value */
|
|
|
+ *_e += act_time;
|
|
|
}
|
|
|
}
|
|
|
|