Przeglądaj źródła

registrar: allow randomization of expire value coming from UA

- new parameter expire_range
- requested in FS#249
Daniel-Constantin Mierla 11 lat temu
rodzic
commit
806e967e2e

+ 3 - 0
modules/registrar/config.c

@@ -34,6 +34,7 @@ struct cfg_group_registrar	default_registrar_cfg = {
 		STR_NULL,	/* realm_pref */
 		3600, 	/* default_expires */
 		0,	/* default_expires_range */
+		0,	/* expires_range */
 		60,	/* min_expires */
 		0,	/* max_expires */
 		0,	/* max_contacts */
@@ -52,6 +53,8 @@ cfg_def_t	registrar_cfg_def[] = {
 		"Contains number of second to expire if no expire hf or contact expire present" },
 	{"default_expires_range",	CFG_VAR_INT | CFG_CB_ONLY_ONCE,	0, 100, 0, default_expires_range_update,
 		"Percent from default_expires that will be used in generating the range for the expire interval"},
+	{"expires_range",	CFG_VAR_INT | CFG_CB_ONLY_ONCE,	0, 100, 0, expires_range_update,
+		"Percent from incoming expires that will be used in generating the range for the expire interval"},
 	{"min_expires",		CFG_VAR_INT | CFG_CB_ONLY_ONCE,	0, 0, 0, 0,
 		"The minimum expires value of a Contact. Value 0 disables the checking. "},
 	{"max_expires",		CFG_VAR_INT | CFG_CB_ONLY_ONCE,	0, 0, 0, max_expires_stats_update,

+ 2 - 0
modules/registrar/config.h

@@ -30,6 +30,7 @@ struct cfg_group_registrar {
 	str 		realm_pref;
 	unsigned int	default_expires;
 	unsigned int	default_expires_range;
+	unsigned int	expires_range;
 	unsigned int	min_expires;
 	unsigned int	max_expires;
 	unsigned int	max_contacts;
@@ -45,6 +46,7 @@ extern cfg_def_t	registrar_cfg_def[];
 
 extern void default_expires_stats_update(str*, str*);
 extern void default_expires_range_update(str*, str*);
+extern void expires_range_update(str*, str*);
 extern void max_expires_stats_update(str*, str*);
 
 #endif

+ 7 - 0
modules/registrar/reg_mod.c

@@ -153,6 +153,7 @@ stat_var *max_expires_stat;
 stat_var *max_contacts_stat;
 stat_var *default_expire_stat;
 stat_var *default_expire_range_stat;
+stat_var *expire_range_stat;
 /** SL API structure */
 sl_api_t slb;
 
@@ -210,6 +211,7 @@ static cmd_export_t cmds[] = {
 static param_export_t params[] = {
 	{"default_expires",    INT_PARAM, &default_registrar_cfg.default_expires     		},
 	{"default_expires_range", INT_PARAM, &default_registrar_cfg.default_expires_range	},
+	{"expires_range",      INT_PARAM, &default_registrar_cfg.expires_range	},
 	{"default_q",          INT_PARAM, &default_registrar_cfg.default_q			},
 	{"append_branches",    INT_PARAM, &default_registrar_cfg.append_branches		},
 	{"case_sensitive",     INT_PARAM, &default_registrar_cfg.case_sensitive			},
@@ -244,6 +246,7 @@ stat_export_t mod_stats[] = {
 	{"max_contacts",      STAT_NO_RESET, &max_contacts_stat       },
 	{"default_expire",    STAT_NO_RESET, &default_expire_stat     },
 	{"default_expires_range", STAT_NO_RESET, &default_expire_range_stat },
+	{"expires_range",     STAT_NO_RESET, &expire_range_stat },
 	{"accepted_regs",                 0, &accepted_registrations  },
 	{"rejected_regs",                 0, &rejected_registrations  },
 	{0, 0, 0}
@@ -709,3 +712,7 @@ void max_expires_stats_update(str* gname, str* name){
 void default_expires_range_update(str* gname, str* name){
 	update_stat(default_expire_range_stat, cfg_get(registrar, registrar_cfg, default_expires_range));
 }
+
+void expires_range_update(str* gname, str* name){
+	update_stat(expire_range_stat, cfg_get(registrar, registrar_cfg, expires_range));
+}

+ 6 - 1
modules/registrar/sip_msg.c

@@ -67,11 +67,16 @@ static inline int get_expire_val(void)
 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) {
-				return p->val + act_time;
+				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();