|
@@ -322,6 +322,20 @@ int pv_get_t_var_rpl(struct sip_msg *msg, pv_param_t *param,
|
|
|
return pv_get_spec_value(&_pv_trpl.msg, pv, res);
|
|
|
}
|
|
|
|
|
|
+int pv_get_t_var_branch(struct sip_msg *msg, pv_param_t *param,
|
|
|
+ pv_value_t *res)
|
|
|
+{
|
|
|
+ pv_spec_t *pv=NULL;
|
|
|
+
|
|
|
+ if(pv_t_update_rpl(msg))
|
|
|
+ return pv_get_null(msg, param, res);
|
|
|
+
|
|
|
+ pv = (pv_spec_t*)param->pvn.u.dname;
|
|
|
+ if(pv==NULL || pv_alter_context(pv))
|
|
|
+ return pv_get_null(msg, param, res);
|
|
|
+
|
|
|
+ return pv_get_spec_value(&_pv_trpl.msg, pv, res);
|
|
|
+}
|
|
|
|
|
|
int pv_get_t_var_inv(struct sip_msg *msg, pv_param_t *param,
|
|
|
pv_value_t *res)
|
|
@@ -616,6 +630,11 @@ int pv_parse_t_name(pv_spec_p sp, str *in)
|
|
|
|
|
|
switch(in->len)
|
|
|
{
|
|
|
+ case 5:
|
|
|
+ if(strncmp(in->s, "flags", 5) == 0)
|
|
|
+ sp->pvp.pvn.u.isname.name.n = 5;
|
|
|
+ else goto error;
|
|
|
+ break;
|
|
|
case 8:
|
|
|
if(strncmp(in->s, "id_label", 8)==0)
|
|
|
sp->pvp.pvn.u.isname.name.n = 0;
|
|
@@ -644,7 +663,7 @@ int pv_parse_t_name(pv_spec_p sp, str *in)
|
|
|
return 0;
|
|
|
|
|
|
error:
|
|
|
- LM_ERR("unknown PV time name %.*s\n", in->len, in->s);
|
|
|
+ LM_ERR("unknown PV name %.*s\n", in->len, in->s);
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
@@ -687,3 +706,40 @@ int pv_get_t(struct sip_msg *msg, pv_param_t *param,
|
|
|
return pv_get_uintval(msg, param, res, t->label);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+int pv_get_t_branch(struct sip_msg *msg, pv_param_t *param,
|
|
|
+ pv_value_t *res)
|
|
|
+{
|
|
|
+ tm_cell_t *t;
|
|
|
+ int branch;
|
|
|
+
|
|
|
+ if ((msg == NULL) || (param == NULL)) return -1;
|
|
|
+
|
|
|
+ t = _tmx_tmb.t_gett();
|
|
|
+ if ((t == NULL) || (t == T_UNDEFINED)) {
|
|
|
+ /* no T */
|
|
|
+ return pv_get_null(msg, param, res);
|
|
|
+ }
|
|
|
+
|
|
|
+ switch(param->pvn.u.isname.name.n) {
|
|
|
+ case 5:
|
|
|
+ switch (get_route_type()) {
|
|
|
+ case FAILURE_ROUTE:
|
|
|
+ case BRANCH_FAILURE_ROUTE:
|
|
|
+ /* use the reason of the winning reply */
|
|
|
+ if ((branch=_tmx_tmb.t_get_picked_branch()) < 0) {
|
|
|
+ LM_CRIT("no picked branch (%d) for a final response"
|
|
|
+ " in MODE_ONFAILURE\n", branch);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ res->ri = t->uac[branch].branch_flags;
|
|
|
+ res->flags = PV_VAL_INT;
|
|
|
+ LM_INFO("branch flags is [%u]\n", res->ri);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ LM_ERR("unsupported route_type %d\n", get_route_type());
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|