Hello everybody,
the development version allows now ability to use pseudo-variables
directly in configuration file. In addition to old pseudo-variables you
know, a new type was introduced: script variables - the format is
$var(name) where name can be any string of digits and characters.
Basically this are variables that can have integer or string values and
they can be set directly in the configuration file via 'assign
operation. The big advantage is that they are directly referenced at
runtime, avoiding searching each access time. They are specific per
processes and survive over multiple sip message processing (be sure you
set the value before testing it -- e.g., $var(counter) = $var(counter) +
1 at the beginning of main route is a counter of messages processed).
The script variables are initialized at startup to '0'. You can shift
between value types: e.g., '$var(a)=1; $var(a)="openser";' is valid.
The switch statement can be used now with any valid pseudo-variable
('retcode' must be now replaced with '$retcode' to get old behavior).
switch($rU) will compare the r-uri username with 'case' values. The case
'values' can be string or integer.
switch($rU) {
case "101": xlog("dialed number is 101\n"); break;
case "102": xlog("dialed number is 102\n"); break;
default: xlog("dialed number is $rU\n");
}
Assignments of script variables, AVPs, R-URI parts (username, domain,
and URI) and dst URI can be done as well in script.
$avp(i:11) = 1; - sets the value of $avp(i:11) to integer '1'
$avp(i:11) = "1"; - sets the value of $avp(i:11) to string '1'
$ru = "sip:"+$var(user)+"@"+$fd; - sets the R-URI to string composed
from value of variable $var(user) and From URI domain
'+' can be used to concatenate strings or do arithmetic addition. Other
arithmetic operators:
- '-' - minus
- '/' - divide
- '*' - multiply
- '%' - modulo
- '|' - bitwise OR
- '&' - bitwise AND
- '^' - bitwise XOR
- '~' - bitwise NOT
To make sure that the priority of the operators is right, do use
parenthesis, it is the best to get expected result:
$var(a) = 2 + (7&(~4));
If you want to evaluate arithmetic operations and test the value in
conditions, use the test operator ' [ ... ] ' . This is required to
convert the result to internal convention for drop, true and false.
if ( [ $var(a)&4 ] ) {
xlog("bit 3 is set in var a");
}
Old '*' used to match any port or proto was changed to 'any' to avoid
the conflict with multiply operator. Some operations overlap with
several avpops functions. Until sure that all cases are covered in
script variant, both will go further, avpops version being scheduled for
deprecation.
It was a big lump of changes, help in testing and feedback is very much
appreciated.
Cheers,
Daniel