[sr-dev] [tracker] Task opened: dialplan: allow match/subst rules with variables (Attachment added)

Victor Seva linuxmaniac at torreviejawireless.org
Sat May 17 11:34:50 CEST 2014


On 05/17/2014 11:14 AM, Juha Heinanen wrote:
> Victor Seva writes:
> 
>>> is there any performance penalty compared to current version when pvs
>>> are not used?
>>
>> Calling to the new core function pv_check_format(str *) in the load
>> process in order to detect if the match/subst rule has pv vars.
> 
> performance penalty during load of rules from dialplan table is fine as
> long as there is no penalty to dp_translate() call.

You can see that if the flag is not matched nothing changes there.

>  #define DP_MAX_ATTRS_LEN	128
>  static char dp_attrs_buf[DP_MAX_ATTRS_LEN+1];
>  int translate(struct sip_msg *msg, str input, str *output, dpl_id_p idp,
>  		str *attrs)
>  {
>  	dpl_node_p rulep;
> +	dpl_pv_node_p rule_pv;
>  	dpl_index_p indexp;
> +	pcre *match_comp = NULL;
>  	int user_len, rez;
>  	char b;
>  
> @@ -339,7 +486,27 @@ search_rule:
>  
>  			case DP_REGEX_OP:
>  				LM_DBG("regex operator testing\n");
> -				rez = pcre_exec(rulep->match_comp, NULL, input.s, input.len,
> +				if(rulep->pv_flags&DP_PV_MATCH) {
> +					if(!msg) {
> +						LM_ERR("Cannot translate using a regex match with pv "
> +							"without message\n");
> +						continue;
> +					}
> +					rule_pv = get_pv_rule(rulep, idp->dp_id, user_len);
> +					if(rule_pv) {
> +						if(build_pv_comp(msg, rule_pv)<0){
> +							LM_ERR("error rule regex comp. Skip this\n");
> +							continue;
> +						}
> +						match_comp = rule_pv->match_comp;
> +					}
> +					else {
> +						LM_ERR("pv rule not found.Skip this\n");
> +						continue;
> +					}
> +				}
> +				else match_comp = rulep->match_comp;
> +				rez = pcre_exec(match_comp, NULL, input.s, input.len,
>  						0, 0, NULL, 0);
>  				break;
>  
> @@ -382,8 +549,9 @@ search_rule:
>  	return -1;
>  
>  repl:
> -	LM_DBG("found a matching rule %p: pr %i, match_exp %.*s\n",
> -			rulep, rulep->pr, rulep->match_exp.len, rulep->match_exp.s);
> +	LM_DBG("found a matching rule %p: pr %i, match_exp %.*s pv_flags:%d\n",
> +			rulep, rulep->pr, rulep->match_exp.len, rulep->match_exp.s,
> +			rulep->pv_flags);
>  
>  	if(attrs) {
>  		attrs->len = 0;
> @@ -405,7 +573,10 @@ repl:
>  		}
>  	}
>  
> -	if(rule_translate(msg, input, rulep, output)!=0){
> +	if(!(rulep->pv_flags&DP_PV_MASK))
> +		rule_pv = NULL;
> +
> +	if(rule_translate(msg, input, rulep, rule_pv, output)!=0){
>  		LM_ERR("could not build the output\n");
>  		return -1;
>  	}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 880 bytes
Desc: OpenPGP digital signature
URL: <http://lists.sip-router.org/pipermail/sr-dev/attachments/20140517/2cd30be5/attachment.pgp>


More information about the sr-dev mailing list