Skip to content

Commit

Permalink
qrouting: Integrate with 3.1 codebase
Browse files Browse the repository at this point in the history
    * adapt to new MI API
    * adapt to new module interface
    * adapt to new timer interface
    * simplify dr callbacks and param passing
  • Loading branch information
liviuchircu committed Feb 5, 2020
1 parent 1a09d4c commit 562a2c7
Show file tree
Hide file tree
Showing 9 changed files with 431 additions and 355 deletions.
1 change: 1 addition & 0 deletions modules/drouting/prefix_tree.h
Expand Up @@ -28,6 +28,7 @@
#include "../../ip_addr.h"
#include "../../time_rec.h"
#include "../../map.h"
#include "../../mem/mem_funcs.h"

#define IS_DECIMAL_DIGIT(d) \
(((d)>='0') && ((d)<= '9'))
Expand Down
12 changes: 7 additions & 5 deletions modules/qrouting/qr_acc.c
Expand Up @@ -77,21 +77,23 @@ static void release_trans_prop(void *param) {
shm_free(to_free);
}

void qr_acc(int type, struct dr_cb_params * params) {
void qr_acc(void *param)
{
struct dr_cb_params *cbp = (struct dr_cb_params *)param;
qr_trans_prop_t *trans_prop;
qr_rule_t *rule;
int gw_id, cr_id;
struct sip_msg *msg = NULL;

msg = ((struct dr_acc_call_params*)(*params->param))->msg;
msg = ((struct dr_acc_call_params*)*cbp->param)->msg;

if(/*msg->first_line.type != SIP_REQUEST ||*/
msg->first_line.u.request.method_value == METHOD_INVITE) {
/*TODO: check if works only on invite (as it should) */

rule = ((struct dr_acc_call_params*)(*params->param))->rule;
gw_id = ((struct dr_acc_call_params*)(*params->param))->gw_id;
cr_id = ((struct dr_acc_call_params*)(*params->param))->cr_id;
rule = ((struct dr_acc_call_params*)*cbp->param)->rule;
gw_id = ((struct dr_acc_call_params*)*cbp->param)->gw_id;
cr_id = ((struct dr_acc_call_params*)*cbp->param)->cr_id;

trans_prop = (qr_trans_prop_t*)shm_malloc(sizeof(qr_trans_prop_t));
if(trans_prop == NULL) {
Expand Down
2 changes: 1 addition & 1 deletion modules/qrouting/qr_acc.h
Expand Up @@ -60,7 +60,7 @@ typedef struct qr_dialog_prop {

void update_gw_stats(qr_gw_t *);
void update_grp_stats(qr_grp_t );
void qr_acc(int type, struct dr_cb_params *);
void qr_acc(void *param);
inline void qr_add_200OK(qr_gw_t * gw);
inline void qr_add_4xx(qr_gw_t*);
void qr_check_reply_tmcb(struct cell*, int ,struct tmcb_params*);
Expand Down
81 changes: 9 additions & 72 deletions modules/qrouting/qr_sort.c
Expand Up @@ -68,71 +68,6 @@ void empty_qr_sorted_list(qr_sorted_list_t **sorted_list) {

}
}
/* compute answer seizure ratio for gw */
inline double asr(qr_gw_t *gw) {
double asr;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.ok == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
asr = (double)gw->history_stats.stats.as/gw->history_stats.n.ok;
lock_stop_read(gw->ref_lock);
return asr;
}

/* compute completed calls ratio for gw */
inline double ccr(qr_gw_t *gw) {
double ccr;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.ok == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
ccr = (double)gw->history_stats.stats.cc/gw->history_stats.n.ok;
lock_stop_read(gw->ref_lock);
return ccr;
}

/* compute post dial delay for gw */
inline double pdd(qr_gw_t *gw) {
double pdd;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.pdd == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
pdd = (double)gw->history_stats.stats.pdd/gw->history_stats.n.pdd;
lock_stop_read(gw->ref_lock);
return pdd;
}

/* compute average setup time for gw */
inline double ast(qr_gw_t *gw) {
double ast;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.setup == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
ast = (double)gw->history_stats.stats.st/gw->history_stats.n.setup;
lock_stop_read(gw->ref_lock);
return ast;
}

/* compute average call duration for gw */
inline double acd(qr_gw_t *gw) {
double acd;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.cd == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
acd = (double)gw->history_stats.stats.cd/gw->history_stats.n.cd;
lock_stop_read(gw->ref_lock);
return acd;
}

static inline void qr_mark_gw_dsbl(qr_gw_t *gw) {
lock_start_write(gw->ref_lock);
gw->state |= QR_STATUS_DSBL; /* mark the gateway as disabled */
Expand Down Expand Up @@ -277,7 +212,10 @@ int qr_insert_dst(qr_sorted_list_t **sorted, qr_rule_t *rule,
}


void qr_sort(int type, struct dr_cb_params *params) {
void qr_sort(void *param)
{
struct dr_cb_params *cbp = (struct dr_cb_params *)param;
struct dr_sort_params *srp = (struct dr_sort_params *)*cbp->param;
qr_rule_t *rule;
unsigned short dst_id;
int i,j,k;
Expand All @@ -287,15 +225,14 @@ void qr_sort(int type, struct dr_cb_params *params) {



rule = (qr_rule_t*)drb.get_qr_rule_handle(((struct dr_sort_params *)
*params->param)->dr_rule);
rule = (qr_rule_t*)drb.get_qr_rule_handle(srp->dr_rule);
if(rule == NULL) {
LM_ERR("No qr rule provided for sorting (qr_handle needed)\n");
goto error;
}
us_sorted_dst = ((struct dr_sort_params *)*params->param)->sorted_dst;

dst_id = ((struct dr_sort_params *)*params->param)->dst_id;
us_sorted_dst = srp->sorted_dst;
dst_id = srp->dst_id;


if(*n_sampled < *qr_n) { /* we don't have enough statistics to sort */
Expand Down Expand Up @@ -380,15 +317,15 @@ void qr_sort(int type, struct dr_cb_params *params) {
pkg_free(sorted_list);
sorted_list = NULL;

((struct dr_sort_params *)*params->param)->dst_id = 0;
srp->dst_id = 0;
return ;
error:
if(sorted_list != NULL) {
empty_qr_sorted_list(sorted_list);
pkg_free(sorted_list);
sorted_list = NULL;
}
((struct dr_sort_params *)*params->param)->dst_id = -1;
srp->dst_id = -1;
}


63 changes: 57 additions & 6 deletions modules/qrouting/qr_sort.h
Expand Up @@ -45,27 +45,78 @@ typedef struct qr_sorted_list {
int qr_add_dst_to_list(qr_sorted_list_t **sorted_list, int dst_id, int score);

/* compute answer seizure ratio for gw */
inline double asr(qr_gw_t *gw);
static inline double asr(qr_gw_t *gw) {
double asr;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.ok == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
asr = (double)gw->history_stats.stats.as/gw->history_stats.n.ok;
lock_stop_read(gw->ref_lock);
return asr;
}

/* compute completed calls ratio for gw */
inline double ccr(qr_gw_t *gw);
static inline double ccr(qr_gw_t *gw) {
double ccr;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.ok == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
ccr = (double)gw->history_stats.stats.cc/gw->history_stats.n.ok;
lock_stop_read(gw->ref_lock);
return ccr;
}

/* compute post dial delay for gw */
inline double pdd(qr_gw_t *gw);
static inline double pdd(qr_gw_t *gw) {
double pdd;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.pdd == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
pdd = (double)gw->history_stats.stats.pdd/gw->history_stats.n.pdd;
lock_stop_read(gw->ref_lock);
return pdd;
}

/* compute average setup time for gw */
inline double ast(qr_gw_t *gw);
static inline double ast(qr_gw_t *gw) {
double ast;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.setup == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
ast = (double)gw->history_stats.stats.st/gw->history_stats.n.setup;
lock_stop_read(gw->ref_lock);
return ast;
}

/* compute average call duration for gw */
inline double acd(qr_gw_t *gw);
static inline double acd(qr_gw_t *gw) {
double acd;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.cd == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
acd = (double)gw->history_stats.stats.cd/gw->history_stats.n.cd;
lock_stop_read(gw->ref_lock);
return acd;
}

/*
* computes the score of the gateway using the warning
* thresholds
*/
void qr_score(qr_gw_t *gw, qr_thresholds_t * thresholds);/*
* inserts destination in sorted list
*/
void qr_sort(int type, struct dr_cb_params *params);
void qr_sort(void *param);
int qr_insert_dst(qr_sorted_list_t **sorted, qr_rule_t *rule,
int cr_id, int gw_id);
#endif
Expand Down

0 comments on commit 562a2c7

Please sign in to comment.