diff --git a/debian/control b/debian/control index 79071f8ef..c8c416930 100644 --- a/debian/control +++ b/debian/control @@ -31,7 +31,7 @@ Build-Depends: bison, libssl-dev, libxml2-dev, libxmlrpc-c3-dev, - ngcp-libswrate-dev (>= 1.0.8+0~1354556403.svn11955.90), + ngcp-libswrate-dev (>= 1.1.2+0~1364315461.svn13284.127), python, python-dev, unixodbc-dev, diff --git a/modules/lcr_rate/lcr_rate_mod.c b/modules/lcr_rate/lcr_rate_mod.c index 893ae38ca..b1520b2b8 100644 --- a/modules/lcr_rate/lcr_rate_mod.c +++ b/modules/lcr_rate/lcr_rate_mod.c @@ -115,7 +115,7 @@ static int check_swrate_init() { return 0; } -struct peer *load_peers(int *num, str *user, str *domain) { +struct peer *load_peers(int *num, char *src_user, char *src_domain, char *dst_user, char *dst_domain) { struct usr_avp *avp; int_str val; struct peer *ret, *j; @@ -125,8 +125,8 @@ struct peer *load_peers(int *num, str *user, str *domain) { swr_rate_t rate; time_t now; - LM_DBG("loading peers for user <%.*s>@<%.*s> from avp\n", - user->len, user->s, domain->len, domain->s); + LM_DBG("loading peers for user <%s>@<%s> -> <%s>@<%s> from avp\n", + src_user, src_domain, dst_user, dst_domain); len = 4; ret = pkg_malloc(len * sizeof(*ret)); @@ -182,10 +182,11 @@ struct peer *load_peers(int *num, str *user, str *domain) { LM_DBG("finding rate for peer %u\n", j->id); j->weight = i; - if (swrate_get_peer_rate(&rate, &swrate_handle, j->id, user->s, domain->s, now)) { + if (swrate_get_peer_ab_rate(&rate, &swrate_handle, j->id, src_user, + src_domain, dst_user, dst_domain, now)) { pkg_free(ret); - LM_ERR("failed to get rate for call, peer id %u, user <%.*s>@<%.*s>\n", - j->id, user->len, user->s, domain->len, domain->s); + LM_ERR("failed to get rate for call, peer id %u, user <%s>@<%s> -> <%s>@<%s>\n", + j->id, src_user, src_domain, dst_user, dst_domain); return NULL; } j->cost = rate.init_rate; @@ -227,24 +228,49 @@ static int save_peers(struct peer *peers, int num) { return 0; } +static void extract_ud(str *s, char **user, char **at, char **domain) { + *user = *at = *domain = NULL; + if (!s || !s->s || !*s->s) + return; + *user = s->s; + *at = strchr(*user, '@'); + if (!*at) + return; + **at = '\0'; + *domain = *at + 1; + if (!**domain) + *domain = NULL; +} + static int lcr_rate(sip_msg_t *msg, char *su, char *sq) { struct peer *peers; int num_peers; - str user, domain; + str src, dst; + char *src_user, *src_at, *src_domain; + char *dst_user, *dst_at, *dst_domain; if (check_swrate_init()) return -1; - if (fixup_get_svalue(msg, (gparam_t *) su, &user)) { + if (fixup_get_svalue(msg, (gparam_t *) su, &src)) { LM_ERR("failed to get user parameter\n"); return -1; } - if (fixup_get_svalue(msg, (gparam_t *) sq, &domain)) { + if (fixup_get_svalue(msg, (gparam_t *) sq, &dst)) { LM_ERR("failed to get domain parameter\n"); return -1; } - peers = load_peers(&num_peers, &user, &domain); + extract_ud(&src, &src_user, &src_at, &src_domain); + extract_ud(&dst, &dst_user, &dst_at, &dst_domain); + + peers = load_peers(&num_peers, src_user, src_domain, dst_user, dst_domain); + + if (*src_at) + *src_at = '@'; + if (*dst_at) + *dst_at = '@'; + if (!peers) return -1; qsort(peers, num_peers, sizeof(*peers), peers_cmp);