/** * writes the next_domain avp using the rule list of failure_tree * * @param frr_head the head of the failure route rule list * @param host last tried host * @param reply_code the last reply code * @param flags flags for the failure route rule * @param dstavp the name of the AVP where to store the next domain * * @return 0 on success, -1 on failure */ static int set_next_domain_on_rule(struct failure_route_rule *frr_head, const str *host, const str *reply_code, const flag_t flags, const gparam_t *dstavp) { struct failure_route_rule * rr; int_str avp_val; assert(frr_head != NULL); LM_DBG("searching for matching routing rules"); for (rr = frr_head; rr != NULL; rr = rr->next) { /* LM_DBG("rr.flags=%d rr.mask=%d flags=%d\n", rr->flags, rr->mask, flags); LM_DBG("rr.host.len=%d host.len=%d\n", rr->host.len, host->len); LM_DBG("rr.host.s='%.*s' host.s='%.*s'\n", rr->host.len, rr->host.s, host->len, host->s); LM_DBG("rr.reply_code.len=%d reply_code.len=%d\n", rr->reply_code.len, reply_code->len); LM_DBG("rr.reply_code.s='%.*s' reply_code.s='%.*s'\n", rr->reply_code.len, rr->reply_code.s, reply_code->len, reply_code->s); */ if (((rr->mask & flags) == rr->flags) && ((rr->host.len == 0) || (str_strcmp(host, &rr->host)==0)) && (reply_code_matcher(&(rr->reply_code), reply_code)==0)) { avp_val.n = rr->next_domain; if (add_avp(dstavp->v.pve->spec->pvp.pvn.u.isname.type, dstavp->v.pve->spec->pvp.pvn.u.isname.name, avp_val)<0) { LM_ERR("set AVP failed\n"); return -1; } LM_INFO("next_domain is %d\n", rr->next_domain); return 0; } } LM_INFO("no matching rule for (flags=%d, host='%.*s', reply_code='%.*s') found\n", flags, host->len, host->s, reply_code->len, reply_code->s); return -1; }
/** * writes the next_domain avp using the rule list of route_tree * * @param failure_tree the current failure routing tree node * @param host last tried host * @param reply_code the last reply code * @param flags flags for the failure route rule * @param dstavp the name of the AVP where to store the next domain * * @return 0 on success, -1 on failure */ static int set_next_domain_on_rule(const struct failure_route_tree_item *failure_tree, const str *host, const str *reply_code, const flag_t flags, const struct multiparam_t *dstavp) { struct failure_route_rule * rr; int_str avp_val; assert(failure_tree != NULL); LM_DBG("searching for matching routing rules"); for (rr = failure_tree->rule_list; rr != NULL; rr = rr->next) { /* LM_DBG("rr.flags=%d rr.mask=%d flags=%d\n", rr->flags, rr->mask, flags); LM_DBG("rr.host.len=%d host.len=%d\n", rr->host.len, host->len); LM_DBG("rr.host.s='%.*s' host.s='%.*s'\n", rr->host.len, rr->host.s, host->len, host->s); LM_DBG("rr.reply_code.len=%d reply_code.len=%d\n", rr->reply_code.len, reply_code->len); LM_DBG("rr.reply_code.s='%.*s' reply_code.s='%.*s'\n", rr->reply_code.len, rr->reply_code.s, reply_code->len, reply_code->s); */ if (((rr->mask & flags) == rr->flags) && ((rr->host.len == 0) || (str_strcmp(host, &rr->host)==0)) && (reply_code_matcher(&(rr->reply_code), reply_code)==0)) { avp_val.n = rr->next_domain; if (add_avp(dstavp->u.a.flags, dstavp->u.a.name, avp_val)<0) { LM_ERR("set AVP failed\n"); return -1; } LM_INFO("next_domain is %d.\n", rr->next_domain); return 0; } } return -1; }