Funções Core

De opensipsbrasil - wiki
Revisão de 16h55min de 19 de outubro de 2013 por Mike (discussão | contribs)
Ir para navegação Ir para pesquisar

Esta sessão lista as funções exportadas pelo core do OpenSIPS para utilização no script (para ser utilizado no opensips.cfg)


add_local_rport()

Adiciona o parametro 'rport' no cabeçalho VIA gerado pelo servidor (confira a RFC3581 para entender o significado disso). Esta função afeta apenas a requisição atualmente processada.

Exemplo de uso:


   add_local_rport()

append_branch()

Similar ao t_fork_to, esta função extende o destino definindo uma nova entrada, a diferença é que a URI atual é pega como uma nova entrada

Sem um parametro a função copia a URI atual em uma nova branch, desta forma deixando a branch principal (a URI) para manipulação futura.

Se for definido um parametro a função copia a URI na nova branch, assim a URI atual não é manipulada.

Veja que não é possivel adicionar uma nova branch em um bloco "on_failure_route" se uma resposta 6XX foi recebida previamente ( isso iria contra a RFC 3261 )

Exemplo de uso:

    # if someone calls B, the call should be forwarded to C too.
    #
    if (method=="INVITE" && uri=~"sip:B@xx.xxx.xx ")
    {
        # copy the current branch (branches[0]) into
        # a new branch (branches[1])
        append_branch();
        # all URI manipulation functions work on branches[0]
        # thus, URI manipulation does not touch the 
        # appended branch (branches[1])
        seturi("sip:C@domain");
        
        # now: branch 0 = C@domain
        #      branch 1 = B@xx.xx.xx.xx
        
        # and if you need a third destination ...
        
        # copy the current branch (branches[0]) into
        # a new branch (branches[2])
        append_branch();
        
        # all URI manipulation functions work on branches[0]
        # thus, URI manipulation does not touch the 
        # appended branch (branches[1-2])
        seturi("sip:D@domain");
        
        # now: branch 0 = D@domain
        #      branch 1 = B@xx.xx.xx.xx
        #      branch 2 = C@domain
        
        t_relay();
        exit;
    };

    # You could also use append_branch("sip:C@domain") which adds a branch with the new URI:
    
    
    if(method=="INVITE" && uri=~"sip:B@xx.xxx.xx ") {
        # append a new branch with the second destination
        append_branch("sip:user@domain");
        # now: branch 0 = B@xx.xx.xx.xx
        # now: branch 1 = C@domain

        t_relay();
        exit;
}

cache_store( storage_id, attribute_name, attribute_name [,timeout])

Esta função define em um memory-cache-like-storage (armazenamento em memória) um novo valor para um atributo, tanto o nome do atributo quanto o valor deve conter pseudo-variaveis, se o atributo não existe ainda no memcache ele será inserido com os valores informados, se ele está presente o seu valor será substituido pelo valor informado, a função opcionalmente pode receber parametros , um valor de timeout (ou lifetime) para o atributo, após o tempo definido ser excedido o atributo é removido da memória.

A função retorna true se o novo atributo foi inserido com sucesso.


cache_store("local","my_attr","$avp(i:55)",1200);

OU

modparam("cachedb_redis","cachedb_url","redis:cluster1://192.168.2.134:6379/")
...
cache_store("redis:cluster1","passwd_$tu","$var(x)");

Exemplos mais complexos podem ser encontrados em [[1]].


cache_remove( storage_id, attribute_name)

Esta função remove um atributo de um memory-cache-like-storage (armazenamento em memória), o atributo poder conter uma pseudo-variavel. A função retorna false apenas se o storage_id for inválido.

cache_remove("local","my_attr");

OU

modparam("cachedb_redis","cachedb_url","redis:cluster1://192.168.2.134:6379/")
...
cache_remove("redis:cluster1","my_attr");

Exemplos mais complexos podem ser encontrados em [[2]].


cache_fetch( storage_id, attribute_name, result_pvar)

Esta função traz de um memory-cache-like-storage (armazenamento em memória) o valor de um atributo, o nome do atributo pode conter uma pseudo-variavel, o resultado (se algum) será armazenado na pseudo-variavel especificada por result_pvar .

A função retorna true se o atributo for encontrado e seu valor retornado.

cache_fetch("local","my_attr", $avp(i:11) );

OU

modparam("cachedb_redis","cachedb_url","redis:cluster1://192.168.2.134:6379/")
...
cache_fetch("redis:cluster1","my_attr",$avp(i:11));


Exemplos mais complexos podem ser encontrados em [[3]].

cache_counter_fetch( storage_id, counter_attribute_name, result_avp)

Esta função pega de um memory-cache-like-storage (armazenamento em memória) o valor de um contador, o atributo pode contar pseudo-variaveis. O resultado (se algum) será armazenado na pseudo-variavel especificado por result_pvar.

A função retorna true se o atributo foi encontrado e o valor retornado.

cache_counter_fetch("local","my_counter", $avp(counter_val) );

OU

modparam("cachedb_redis","cachedb_url","redis:cluster1://192.168.2.134:6379/")
...
cache_fetch("redis:cluster1","my_counter",$avp(redis_counter_val));


cache_add( storage_id, attribute_name,increment_value,expire)

Esta função incrementa um atributo em um memory-cache-like-storage (armazenamento em memória) que suporte esta opração ,o atributo pode conter uma pseudo-variavel, se o atributo não existe ele será criado com o valor do incremento, se o valor de expire for maior que 0 a chave irá expirar no tempo especificado (em segundos)

A função retorna false se o incremento falhar


modparam("cachedb_redis","cachedb_url","redis:cluster1://192.168.2.134:6379/")
...
cache_add("redis:cluster1",5);


Exemplos mais complexos podem ser encontrados em [[4]].

!!!!cache_sub( storage_id, attribute_name,increment_value,expire)

Esta função decrementa um atributo em um memory-cache-like-storage (armazenamento em memória) que suporte esta operação, o atributo pode conter uma pseudo variavel, se o valor de expire for maior que 0 a chave irá expirar no tempo especificado (em segundos)


A função retorna false se o decremento falhar

modparam("cachedb_redis","cachedb_url","redis:cluster1://192.168.2.134:6379/")
...
cache_sub("redis:cluster1",5);

Exemplos mais complexos podem ser encontrados em [[5]].

cache_raw_query( storage_id, raw_query,result_avp)

Esta função executa a query ( dependendo da linguagem do back-end informado ) e retorna o resultado (se algum) na AVP informada, a result_avp pode nao existir se não houver resultados.

A função retorna false se a query falhar


...
cache_raw_query("mongodb","{ \"op\" : \"count\",\"query\": { \"username\" : $rU} }","$avp(mongo_count_result)");
...


Exemplos mais complexos podem ser encontrados em [[6]].

break()

Apartir da versão 0.10.0-dev3 a função 'break' não pode mais ser utilizada para parar a execução de uma rota, o único lugar que a mesma pode ser utilizada é para finalizar um bloco 'case' em um statement 'switch', para a função de parar o roteamento deve ser utilizado 'return' invés de 'break'

as funções 'return' e 'break' tem agora um significado similar a linguagem c ou shell


construct_uri(proto,user,domain,port,extra,result_avp)

Esta função constrói um uri sip valida baseada nos argumentos recebidos, o resultado (se algum) será armazenado na result_avp informada, pode ser utilizado argumento como texto puro assim como $var(nome) ou $avp(nome), se você quiser omitir parte da sip uri basta utilizar o parametro respectivo em branco.

Exemplo de uso:

construct_uri("$var(proto)", "vlad", "$var(domain)", "", "$var(params)",$avp(s:newuri));
xlog("Constructed URI is <$avp(s:newuri)> \n");


drop()

Para a execução de um script e altera a ação implícita feita na sequência.

Se a função é chamada em uma 'branch_route' então esta perna é descartada (ação implicita em um 'branch_route' é encaminhar a requisição)

Se a função é chamada em um 'onreply_route' então qualquer reply será descartado ( a ação implicita em uma 'onreply_route' é enviar o reply de acordo com o cabeçalho via)

Exemplo de uso:

   onreply_route {
       if(status=="183") {
           drop();
       }
   }

exit()

Para a execução do script, tem o mesmo propósito de return(0), esta função não afeta a ação implicita após a execução do script


 route {
   if (route(2)) {
     xlog("L_NOTICE","method $rm is INVITE\n");
   } else {
     xlog("L_NOTICE","method is $rm\n");
   };
 }
 route[2] {
   if (is_method("INVITE")) {
     return(1);
   } else if (is_method("REGISTER")) {
     return(-1);
   } else if (is_method("MESSAGE")) {
     sl_send_reply("403","IM not allowed");
     exit;
   };
 }

force_rport()

A função force_rport() adiciona o parametro rport no primeiro cabeçalho Via, assim o OpenSIPS irá adicionar a porta para o cebaçalho mais alto da mensagem SIP mesmo se o cliente não indicar suporte a isso, desta forma as mensagens subsequentes para retornarem o valor correto de porta em uma transação posterior

O parametro rport é definido pela RFC 3581


Exemplo de uso

   force_rport();

force_send_socket([proto:]address[:port])

Esta função força o OpenSIPS para enviar a mensagem apartir do socket especificado ( _DEVE_ ser um dos endereços (sockets) que o OpenSIPS está executando (escutando)) , se o protocolo não corresponder (ex: mensagem udp forçando para tcp) o socket mais proximo para o protocolo especificado será utilizado.


Exemplo de uso:

   force_send_socket(10.10.10.10:5060);


force_tcp_alias()

force_tcp_alias(port)      

Esta função adiciona uma porta alias para a conexão atual (se tcp), esta função é útil se você quer enviar todo o seu trafego pela port_alias através da mesma conexão que a requisição foi recebida [ isso pode ajudar com firewall ou nat traversal ].

Se nenhum parametro for adicionado para a porta então a porta onde a mensagem foi recebida será adicionada como alias. Quando a conexão for fechada todas as portas em alias serão removidas (ex: conexão idle por muito tempo)

forward(destination)

Forward the SIP request to the given destination in stateless mode. This has the format of [proto:]host[:port]. Host can be an IP or hostname; supported protocols are UDP, TCP and TLS. (For TLS, you need to compile the TLS support into core). If proto or port are not specified, NAPTR and SRV lookups will be used to determine them (if possible).

If destination parameter is missing, the forward will be done based on RURI.

Example of usage:

   forward("10.0.0.10:5060");
   #or
   forward();

!!!!get_timestamp(sec_avp,usec_avp)

Returns the current timestamp, seconds and microseconds of the current second, from a single system call.

Example of usage:

    get_timestamp($avp(sec),$avp(usec));


!!!!isdsturiset()

Test if the dst_uri field (next hop address) is set.

Example of usage:

   if(isdsturiset()) {
       log("dst_uri is set\n");
   };

!!!!isflagset(int)

Test if a flag is set for current processed message (if the flag value is 1). The value of the parameter can be in range of 0..31.

For more see Flags Documentation.

Example of usage:

   if(isflagset(3)) {
       log("flag 3 is set\n");
   };

!!!!isbflagset([branch_idx,] flag_idx)

Test if a flag is set for a specific branch (if the flag value is 1). The value of the "flag_idx" parameter can be in range of 0..31. "branch_idx" identify the branch for which the flags are tested - it must be a positiv number. Branch index 0 refers to the RURI branch. If this parameter is missing, 0 branch index is used as default.

For more about script flags, see Flags Documentation.

Example of usage:

   if(isbflagset(1,3)) {
       log("flag 3 is set in branch 1\n");
   };

!!!!issflagset(flag_idx)

Test if a script flag is set (if the flag value is 1). The value of the "flag_idx" parameter can be in range of 0..31.

For more about script flags, see Flags Documentation.

Example of usage:

   if(issflagset(2)) {
       log("script flag 2 is set\n");
   };

!!!!log([level,] string)

Write text message to standard error terminal or syslog. You can specify the log level as first parameter.

Example of usage:

   log("just some text message\n");


!!!!next_branches()

Adds to the request a new destination set that includes all highest priority class contacts ('q' value based) from the serialized branches (see serialize_branches()). If called from a route block, it rewrites the request uri with first contact and adds the remaining contacts as parallel branches. If called from failure route block, adds all contacts as parallel branches. All used contacts are removes the serialized branches.

Returns true if at least one contact was added for the request's destination set - returns 1 if other branches are still pending and return 2 if no other branches are left for future processing - shortly, if 2: this is the last branch, if 1: other will follow. False is return is nothing was done (no more serialized branches).

Example of usage:

   next_branches();


!!!!prefix(string)

Add the string parameter in front of username in R-URI.

Example of usage:

   prefix("00");

!!!!pv_printf(pv, string)

Prints the formatted 'string' in the AVP 'pv'. The 'string' parameter can include any pseudo-variable defined in OpenSIPS. The 'pv' can be any writable pseudo-variable -- e.g.,: AVPs, VARs, $ru, $rU, $rd, $du, $br, $fs.

It was extended from the avp_printf(...) function exported in previous versions by the avpops module. Starting with 1.3.0, avp_printf(...) is just an alias to pv_printf(...).

Example of usage:

   pv_printf("$var(x)", "r-uri: $ru");
   pv_printf("$avp(i:3)", "from uri: $fu");

#raise_event !!!!raise_event(string[, avp[, avp]])

Raises from script an event through OpenSIPS Event Interface. The first parameter is a string that indicates the event which should be raised. The next two parameters should be AVPs and they are optional. If only one is present, it should contain the values attached to the event. If both of them are specified, the first one should contain the names of the attributes, and the last one the values attached to the event.

This function triggers an event for all subscribers for that event, regardless the transport module used.

Example of usage (raises an event with no attributes):

[@ raise_event("E_NO_PARAM"); @]

Example of usage (raises an event with two attributes):

[@ $avp(attr-name) = "param1"; $avp(attr-name) = "param2"; $avp(attr-val) = 1; $avp(attr-val) = "2" raise_event("E_TWO_PARAMS", $avp(attr-name), $avp(attr-val)); @]

!!!!remove_branch(pv|int)

Removes a given branch. The branch to be removed can be given via an integer or a pseudovariable. Once a branch is remove, all the subsequent branches are shifted (i.e. if branch n is removed, then the old n+1 branch becomes the new n branch, the old n+2 branch becomes n+1 and so on).

Example of usage (remove all branches with URI hostname "127.0.0.1"):

[@ $var(i) = 0; while ($(branch(uri)[$var(i)]) != null) {

  xlog("L_INFO","$$(branch(uri)[$var(i)])=[$(branch(uri)[$var(i)])]\n");
  if ($(branch(uri)[$var(i)]{uri.host}) == "127.0.0.1") {
      xlog("L_INFO","removing branch $var(i) with URI=[$(branch(uri)[$var(i)])]\n");
      remove_branch($var(i));
  } else {
      $var(i) = $var(i) + 1;
  }

} @]

!!!!return(int)

The return() function allows you to return any integer value from a called route() block. You can test the value returned by a route using "$retcode" variable.

return(0) is same as "exit()";

In bool expressions:

 * Negative and ZERO is FALSE
 * Positive is TRUE

Example usage:

[@ route {

 if (route(2)) {
   xlog("L_NOTICE","method $rm is INVITE\n");
 } else {
   xlog("L_NOTICE","method $rm is REGISTER\n");
 };

} @] [@ route[2] {

 if (is_method("INVITE")) {
   return(1);
 } else if (is_method("REGISTER")) {
   return(-1);
 } else {
   return(0);
 };

} @]

!!!!resetdsturi()

Set the value of dst_uri filed to NULL. dst_uri field is usually set after loose_route() or lookup("location") if the contact address is behind a NAT.

Example of usage:

   resetdsturi();

!!!!resetflag(int)

Reset a flag for current processed message (set the value to 0). The value of the parameter can be in range of 0..31.

For more see Flags Documentation.

Example of usage:

   resetflag(3);

!!!!resetbflag([branch_idx,] flag_idx)

Reset a flag for a specific branch (set flag to value 0). The value of the "flag_idx" parameter can be in range of 0..31. "branch_idx" identify the branch for which the flag is reset - it must be a positiv number. Branch index 0 refers to the RURI branch. If this parameter is missing, 0 branch index is used as default.

For more about script flags, see Flags Documentation.

Example of usage: [@

   resetbflag(1,3);
   # or
   resetbflag(3); # same with resetbflag(0,3)

@]


!!!!resetsflag(flag_idx)

Reset a script flag (set flag to value 0). The value of the "flag_idx" parameter can be in range of 0..31.

For more about script flags, see Flags Documentation.

Example of usage:

   resetsflag(2);

!!!!revert_uri()

Set the R-URI to the value of the R-URI as it was when the request was received by server (undo all changes of R-URI).

Example of usage:

   revert_uri();

!!!!rewritehost() / sethost()

Rewrite the domain part of the R-URI with the value of function's parameter. Other parts of the R-URI like username, port and URI parameters remain unchanged.

Example of usage:

   rewritehost("1.2.3.4");

!!!!rewritehostport() / sethostport()

Rewrite the domain part and port of the R-URI with the value of function's parameter. Other parts of the R-URI like username and URI parameters remain unchanged.

Example of usage:

   rewritehostport("1.2.3.4:5080");

!!!!rewriteuser(string) / setuser(string)

Rewrite the user part of the R-URI with the value of function's parameter.

Example of usage:

   rewriteuser("newuser");

!!!!rewriteuserpass() / setuserpass()

Rewrite the password part of the R-URI with the value of function's parameter.

Example of usage:

   rewriteuserpass("my_secret_passwd");

!!!!rewriteport() / setport()

Rewrites/sets the port part of the R-URI with the value of function's parameter.

Example of usage:

   rewriteport("5070");

!!!!rewriteuri(str) / seturi(str)

Rewrite the request URI.

Example of usage:

   rewriteuri("sip:test@opensips.org");

!!!! route(name [, param1 [, param2 [, ...] ] ] )

This function is used to run the code from the 'name' route, declared in the script. Optionally, it can receive several parameters (up to 7), that can be later retrieved using the '$param(idx)' pseudo-variable.

The name of the route is an identifier format, whereas the parameters can be either int, string, or a pseudo-variable.

Example of usage:

  route(HANDLE_SEQUENTIALS);
  route(HANDLE_SEQUENTIALS, 1, "param", $var(param));


!!!! script_trace( log_level, pv_format_string[, info_string])

This function start the script tracing - this helps to better understand the flow of execution in the OpenSIPS script, like what function is executed, what line it is, etc. Moreover, you can also trace the values of pseudo-variables, as script execution progresses.

The blocks of the script where script tracing is enabled will print a line for each individual action that is done (e.g. assignments, conditional tests, module functions, core functions, etc.). Multiple pseudo-variables can be monitored by specifying a pv_format_string (e.g. "$ru---$avp(var1)").

The logs produced by multiple/different traced regions of your script can be differentiated (tagged) by specifying an additional plain string - info_string - as the 3rd parameter.

To disable script tracing, just do script_trace(). Otherwise, the tracing will automatically stop at the end the end of the top route.

Example of usage:

   script_trace( 1, "$rm from $si, ruri=$ru", "me");

will produce: [@

   [line 578][me][module consume_credentials] -> (INVITE from 127.0.0.1 , ruri=sip:111111@opensips.org)
   [line 581][me][core setsflag] -> (INVITE from 127.0.0.1 , ruri=sip:111111@opensips.org)
   [line 583][me][assign equal] -> (INVITE from 127.0.0.1 , ruri=sip:111111@opensips.org)
   [line 592][me][core if] -> (INVITE from 127.0.0.1 , ruri=sip:tester@opensips.org)
   [line 585][me][module is_avp_set] -> (INVITE from 127.0.0.1 , ruri=sip:tester@opensips.org)
   [line 589][me][core if] -> (INVITE from 127.0.0.1 , ruri=sip:tester@opensips.org)
   [line 586][me][module is_method] -> (INVITE from 127.0.0.1 , ruri=sip:tester@opensips.org)
   [line 587][me][module trace_dialog] -> (INVITE 127.0.0.1 , ruri=sip:tester@opensips.org)
   [line 590][me][core setflag] -> (INVITE from 127.0.0.1 , ruri=sip:tester@opensips.org) 

@]


!!!!send(destination [, headers])

Send the original SIP message to a specific destination in stateless mode. This is definied as [proto:]host[:port]. No changes are applied to received message, no Via header is added, unless headers parameter is specified. Host can be an IP or hostname; supported protocols are UDP, TCP and TLS. (For TLS, you need to compile the TLS support into core). If proto or port are not specified, NAPTR and SRV lookups will be used to determine them (if possible). The headers parameter should end in '\r\n' and can accept both plain text and pseudo variables.

Parameter is mandatory and has string format.

Example of usage:

  send("udp:10.10.10.10:5070");
  send("udp:10.10.10.10:5070", "Server: opensips\r\n");


!!!!serialize_branches(clear)

Takes all the branches added for parallel forking (with append_branch() and including the current RURI) and prepare them for serial forking. The ordering is done in increasing "q" order. The serialized branches are internally stored in AVPs - you will be able to fetch and use via the "next_branches()" function.\\ NOTE that (according to RFC3261), the branches with the same "q" value will still be parallel forked during a certain step in the serial forking (it will result a combination of serial with parallel forking).\\ NOTE that this function is not changing RURI in the messages - it is just converting from parallel to serial branches (preparing branches).

If "clear" is set to non-zero, all previous results of another "serialize_branches" (serialized branches which were not yet used) will be deleted before setting the new serialized branches.

Example of usage:

  serialize_branches(1);


!!!!set_advertised_address(ip|string)

Same as 'advertised_address' but it affects only the current message. It has priority if 'advertised_address' is also set.

Example of usage:

   set_advertised_address("opensips.org");

!!!!set_advertised_port(int)

Same as 'advertised_port' but it affects only the current message. It has priority over 'advertised_port'.

Example of usage:

   set_advertised_port(5080);


!!!!setdebug([level])

Changes the debug level of the current process from script. If called without the parameter then the debug level of the current process will be reset to the global level. If the debug level of the current process is changed then changing the global debug level (using MI function) does not affect it, so be careful and make sure to reset the process debug level when you are done. This function is very helpful if you are tracing and debugging only a specific piece of code.

Example of usage:

   debug= -1 # errors only
   .....
   {
     ......
     setdebug(4); # set the debug level of the current process to DBG
     uac_replace_from(....);
     setdebug(); # reset the debug level of the current process to the global level
     .......
   }

!!!!setdsturi(string)

Explicitely set the dst_uri field to the value of the paramater. The parameter has to be a valid SIP URI.

Example of usage:

   setdsturi("sip:10.10.10.10:5090");

!!!!setflag(int)

Set a flag for current processed message. The value of the parameter can be in range of 0..31. The flags are used to mark the message for special processing (e.g., accounting) or to keep some state (e.g., message authenticated).

Example of usage:

   setflag(3);


!!!!setbflag([branch_idx,] flag_idx)

Set a flag for a specific branch (set flag to value 1). The value of the "flag_idx" parameter can be in range of 0..31. "branch_idx" identify the branch for which the flag is set - it must be a positiv number. Branch index 0 refers to the RURI branch. If this parameter is missing, 0 branch index is used as default.

For more about script flags, see Flags Documentation.

Example of usage:

   setbflag(1,3);
   # or
   setbflag(3); # same with setbflag(0,3)



!!!!setsflag(flag_idx)

Set a script flag (set flag to value 0). The value of the "flag_idx" parameter can be in range of 0..31.

For more about script flags, see Flags Documentation.

Example of usage:

   setsflag(2);

!!!!strip(int)

Strip the first N-th characters from username of R-URI (N is the value of the parameter).

Example of usage:

   strip(3);

!!!!strip_tail(int)

Strip the last N-th characters from username of R-URI (N is the value of the parameter).

Example of usage:

 strip_tail(3);

#subscribe_event !!!!subscribe_event(string, string [, int])

Subscribes an external application for a certain event for the OpenSIPS Event Interface. This is used for transport protocols that cannot subscribe by themselves (example event_rabbitmq). This function should be called only once in the startup_route if the subscription doesn't expire, or in a timer route if the subscription should be renewed once in a while.

The first parameter is a string represents the name of the event an external application should be notified for. The second parameter is a string that specifies the socket of the external application. Note that this socket should follow the syntax of an existing loaded Event Interface transport module (example: event_datagram, event_rabbitmq). The last parameter is optional and specifies the expire time of the subscription. If it is not present, then the subscription does not expire at all.

Example of usage (subscriber that never expires, notified by the RabbitMQ module):

[@ startup_route {

   subscribe_event("E_PIKE_BLOCKED", "rabbitmq:127.0.0.1/pike");

} @]

Example of usage (subscriber expires every 5 seconds, notified through UDP):

[@ timer_route[event_subscribe, 4] {

   subscribe_event("E_PIKE_BLOCKED", "udp:127.0.0.1:5051", 5);

} @]

!!!!use_blacklist(string)

Enables the DNS blacklist name received as parameter. Its primary purposes will be to prevent sending requests to critical IPs (like GWs) due DNS or to avoid sending to destinations that are known to be unavailable (temporary or permanent). [@

   use_blacklist("pstn-gws");

@]