7 * Copyright (C) 2001-2003 FhG Fokus
9 * This file is part of ser, a free SIP server.
11 * ser is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version
16 * For a license to use the ser software under conditions
17 * other than those described here, or to purchase support for this
18 * software, please contact iptel.org by e-mail at the following addresses:
21 * ser is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 * 2003-01-28 scratchpad removed, src_port introduced (jiri)
33 * 2003-02-28 scratchpad compatibility abandoned (jiri)
34 * 2003-03-10 updated to the new module exports format (andrei)
35 * 2003-03-19 replaced all mallocs/frees w/ pkg_malloc/pkg_free (andrei)
36 * 2003-04-01 added dst_port, proto, af; renamed comp_port to comp_no,
37 * inlined all the comp_* functions (andrei)
38 * 2003-04-05 s/reply_route/failure_route, onreply_route introduced (jiri)
39 * 2003-05-23 comp_ip fixed, now it will resolve its operand and compare
40 * the ip with all the addresses (andrei)
41 * 2003-10-10 added more operators support to comp_* (<,>,<=,>=,!=) (andrei)
42 * 2004-10-19 added from_uri & to_uri (andrei)
43 * 2005-12-12 added retcode support (anrei)
44 * 2005-12-19 select framework (mma)
45 * 2006-01-30 removed rec. protection from eval_expr (andrei)
46 * 2006-02-06 added named route tables (andrei)
47 * 2008-04-14 (expr1 != expr2) is evaluated true if at least one of
48 * the expressions does not exist (Miklos)
49 * 2008-04-23 errors are treated as false during expression evaluation
50 * unless the operator is DIFF_OP (Miklos)
51 * 2008-12-03 fixups for rvalues in assignments (andrei)
52 * 2009-05-04 switched IF_T to rval_expr (andrei)
58 * \brief SIP-router core ::
64 #include <sys/types.h>
68 #include <sys/socket.h>
69 #include <netinet/in.h>
70 #include <arpa/inet.h>
80 #include "sr_module.h"
83 #include "socket_info.h"
84 #include "parser/parse_uri.h"
85 #include "parser/parse_from.h"
86 #include "parser/parse_to.h"
95 #define RT_HASH_SIZE 8 /* route names hash */
97 /* main routing script table */
98 struct route_list main_rt;
99 struct route_list onreply_rt;
100 struct route_list failure_rt;
101 struct route_list branch_rt;
102 struct route_list onsend_rt;
103 struct route_list event_rt;
105 int route_type = REQUEST_ROUTE;
107 /** script optimization level, useful for debugging.
108 * 0 - no optimization
109 * 1 - optimize rval expressions
110 * 2 - optimize expr elems
114 inline static void destroy_rlist(struct route_list* rt)
116 struct str_hash_entry* e;
117 struct str_hash_entry* tmp;
124 if (rt->names.table){
125 clist_foreach_safe(rt->names.table, e, tmp, next){
128 pkg_free(rt->names.table);
136 void destroy_routes()
138 destroy_rlist(&main_rt);
139 destroy_rlist(&onreply_rt);
140 destroy_rlist(&failure_rt);
141 destroy_rlist(&branch_rt);
142 destroy_rlist(&event_rt);
147 /* adds route name -> i mapping
148 * WARNING: it doesn't check for pre-existing routes
149 * return -1 on error, route index on success
151 static int route_add(struct route_list* rt, char* name, int i)
153 struct str_hash_entry* e;
155 e=pkg_malloc(sizeof(struct str_hash_entry));
157 LOG(L_CRIT, "ERROR: route_add: out of memory\n");
161 e->key.len=strlen(name);
164 str_hash_add(&rt->names, e);
172 /* returns -1 on error, 0 on success */
173 inline static int init_rlist(char* r_name, struct route_list* rt,
174 int n_entries, int hash_size)
176 rt->rlist=pkg_malloc(sizeof(struct action*)*n_entries);
178 LOG(L_CRIT, "ERROR: failed to allocate \"%s\" route tables: "
179 "out of memory\n", r_name);
182 memset(rt->rlist, 0 , sizeof(struct action*)*n_entries);
183 rt->idx=1; /* idx=0 == default == reserved */
184 rt->entries=n_entries;
185 if (str_hash_alloc(&rt->names, hash_size)<0){
186 LOG(L_CRIT, "ERROR: \"%s\" route table: failed to alloc hash\n",
190 str_hash_init(&rt->names);
191 route_add(rt, "0", 0); /* default route */
200 /* init route tables */
203 if (init_rlist("main", &main_rt, RT_NO, RT_HASH_SIZE)<0)
205 if (init_rlist("on_reply", &onreply_rt, ONREPLY_RT_NO, RT_HASH_SIZE)<0)
207 if (init_rlist("failure", &failure_rt, FAILURE_RT_NO, RT_HASH_SIZE)<0)
209 if (init_rlist("branch", &branch_rt, BRANCH_RT_NO, RT_HASH_SIZE)<0)
211 if (init_rlist("on_send", &onsend_rt, ONSEND_RT_NO, RT_HASH_SIZE)<0)
213 if (init_rlist("event", &event_rt, EVENT_RT_NO, RT_HASH_SIZE)<0)
223 static inline int route_new_list(struct route_list* rt)
229 if (rt->idx >= rt->entries){
230 tmp=pkg_realloc(rt->rlist, 2*rt->entries*sizeof(struct action*));
232 LOG(L_CRIT, "ERROR: route_new_list: out of memory\n");
235 /* init the newly allocated memory chunk */
236 memset(&tmp[rt->entries], 0, rt->entries*sizeof(struct action*));
240 if (rt->idx<rt->entries){
252 * if the "name" route already exists, return its index, else
253 * create a new empty route
254 * return route index in rt->rlist or -1 on error
256 int route_get(struct route_list* rt, char* name)
259 struct str_hash_entry* e;
263 /* check if exists an non empty*/
264 e=str_hash_get(&rt->names, name, len);
268 i=route_new_list(rt);
269 if (i==-1) goto error;
270 if (route_add(rt, name, i)<0){
282 * if the "name" route already exists, return its index, else
284 * return route index in rt->rlist or -1 on error
286 int route_lookup(struct route_list* rt, char* name)
289 struct str_hash_entry* e;
292 /* check if exists an non empty*/
293 e=str_hash_get(&rt->names, name, len);
303 int fix_actions(struct action* a); /*fwd declaration*/
306 /** optimize the left side of a struct expr.
307 * @return 1 if optimized, 0 if not and -1 on error
309 static int exp_optimize_left(struct expr* exp)
311 struct rval_expr* rve;
313 int old_ltype, old_rtype, old_op;
317 if (exp->type!=ELEM_T)
319 old_ltype=exp->l_type;
320 old_rtype=exp->r_type;
322 if (exp->l_type==RVEXP_O){
324 /* rve should be previously fixed/optimized */
325 /* optimize exp (rval(val)) -> exp(val) */
326 if (rve->op==RVE_RVAL_OP){
327 rval=&rve->left.rval;
331 exp->l_type=NUMBER_O;
333 exp->r_type=NUMBER_ST;
334 exp->r.numval=rval->v.l;
341 /* string evaluated in expression context - not
346 /* replace the current expr. */
347 *exp=*(rval->v.bexpr);
355 exp->l_type=ACTION_O;
357 exp->r_type=ACTION_ST;
358 exp->r.param=rval->v.action;
365 exp->l.select=pkg_malloc(sizeof(*exp->l.select));
367 exp->l_type=SELECT_O;
368 *exp->l.select=rval->v.sel;
376 exp->l.attr=pkg_malloc(sizeof(*exp->l.attr));
379 *exp->l.attr=rval->v.avps;
387 exp->l.param=pkg_malloc(sizeof(pv_spec_t));
390 *((pv_spec_t*)exp->l.param)=rval->v.pvs;
403 DBG("left EXP optimized: op%d(_O%d_, ST%d) => op%d(_O%d_, ST%d)\n",
404 old_op, old_ltype, old_rtype, exp->op, exp->l_type, exp->r_type);
410 /** optimize the left side of a struct expr.
411 * @return 1 if optimized, 0 if not and -1 on error
413 static int exp_optimize_right(struct expr* exp)
415 struct rval_expr* rve;
417 int old_ltype, old_rtype, old_op;
421 if ((exp->type!=ELEM_T) ||(exp->op==NO_OP))
423 old_ltype=exp->l_type;
424 old_rtype=exp->r_type;
426 if (exp->r_type==RVE_ST){
428 /* rve should be previously fixed/optimized */
429 /* optimize exp (rval(val)) -> exp(val) */
430 if (rve->op==RVE_RVAL_OP){
431 rval=&rve->left.rval;
434 exp->r_type=NUMBER_ST;
435 exp->r.numval=rval->v.l;
441 exp->r.str.s=pkg_malloc(rval->v.s.len+1);
443 exp->r.str.len=rval->v.s.len;
444 memcpy(exp->r.str.s, rval->v.s.s, rval->v.s.len);
445 exp->r.str.s[exp->r.str.len]=0;
446 exp->r_type=STRING_ST;
454 /* cannot be optimized further, is an exp_elem
455 which is not constant */
458 /* cannot be optimized further, is not constant and
459 eval_elem() does not support ACTION_ST for op!=NO_OP*/
462 exp->r.select=pkg_malloc(sizeof(*exp->l.select));
464 exp->r_type=SELECT_ST;
465 *exp->r.select=rval->v.sel;
473 exp->r.attr=pkg_malloc(sizeof(*exp->l.attr));
476 *exp->r.attr=rval->v.avps;
484 exp->r.param=pkg_malloc(sizeof(pv_spec_t));
487 *((pv_spec_t*)exp->r.param)=rval->v.pvs;
501 DBG("right EXP optimized: op%d(O%d, _ST%d_) => op%d(O%d, _ST%d_)\n",
502 old_op, old_ltype, old_rtype, exp->op, exp->l_type, exp->r_type);
508 /* traverses an expr tree and compiles the REs where necessary)
509 * returns: 0 for ok, <0 if errors */
510 int fix_expr(struct expr* exp)
518 LOG(L_CRIT, "BUG: fix_expr: null pointer\n");
521 if (exp->type==EXP_T){
525 if ((ret=fix_expr(exp->l.expr))!=0)
527 ret=fix_expr(exp->r.expr);
530 ret=fix_expr(exp->l.expr);
533 LOG(L_CRIT, "BUG: fix_expr: unknown op %d\n",
536 }else if (exp->type==ELEM_T){
537 /* first calculate lengths of strings (only right side, since
538 left side can never be a string) */
539 if (exp->r_type==STRING_ST) {
540 if (exp->r.string) len = strlen(exp->r.string);
542 exp->r.str.s = exp->r.string;
543 exp->r.str.len = len;
545 /* then fix & optimize rve/rvals (they might be optimized
546 to non-rvals, e.g. string, avp a.s.o and needs to be done
547 before MATCH_OP and other fixups) */
548 if (exp->l_type==RVEXP_O){
549 if ((ret=fix_rval_expr(&exp->l.param))<0){
550 ERR("Unable to fix left rval expression\n");
554 exp_optimize_left(exp);
556 if (exp->r_type==RVE_ST){
557 if ((ret=fix_rval_expr(&exp->r.param))<0){
558 ERR("Unable to fix right rval expression\n");
562 exp_optimize_right(exp);
566 if (exp->op==MATCH_OP){
567 /* right side either has to be string, in which case
568 * we turn it into regular expression, or it is regular
569 * expression already. In that case we do nothing
571 if (exp->r_type==STRING_ST){
572 re=(regex_t*)pkg_malloc(sizeof(regex_t));
574 LOG(L_CRIT, "ERROR: fix_expr: memory allocation"
578 if (regcomp(re, (char*) exp->r.param,
579 REG_EXTENDED|REG_NOSUB|REG_ICASE) ){
580 LOG(L_CRIT, "ERROR: fix_expr : bad re \"%s\"\n",
581 (char*) exp->r.param);
585 /* replace the string with the re */
586 pkg_free(exp->r.param);
589 }else if (exp->r_type!=RE_ST && exp->r_type != AVP_ST
590 && exp->r_type != SELECT_ST && exp->r_type!= RVE_ST
591 && exp->r_type != PVAR_ST){
592 LOG(L_CRIT, "BUG: fix_expr : invalid type for match\n");
596 if (exp->l_type==ACTION_O){
597 ret=fix_actions((struct action*)exp->r.param);
599 LOG(L_CRIT, "ERROR: fix_expr : fix_actions error\n");
603 if (exp->l_type==SELECT_O) {
604 if ((ret=resolve_select(exp->l.select)) < 0) {
605 BUG("Unable to resolve select\n");
606 print_select(exp->l.select);
610 if ((exp->r_type==SELECT_O)||(exp->r_type==SELECT_ST)) {
611 if ((ret=resolve_select(exp->r.select)) < 0) {
612 BUG("Unable to resolve select\n");
613 print_select(exp->l.select);
617 /* PVAR don't need fixing */
625 /* adds the proxies in the proxy list & resolves the hostnames */
626 /* returns 0 if ok, <0 on error */
627 int fix_actions(struct action* a)
635 union cmd_export_u* cmd;
639 struct socket_info* si;
641 struct rval_expr* rve;
642 struct rval_expr* err_rve;
643 enum rval_type rve_type, err_type, expected_type;
648 char buf[30]; /* tmp buffer needed for module param fixups */
651 LOG(L_CRIT,"BUG: fix_actions: null pointer\n");
654 for(t=a; t!=0; t=t->next){
663 switch(t->val[0].type){
665 tmp=strdup(ip_addr2a(
666 (struct ip_addr*)t->val[0].u.data));
668 LOG(L_CRIT, "ERROR: fix_actions:"
669 "memory allocation failure\n");
673 t->val[0].type=STRING_ST;
674 t->val[0].u.string=tmp;
677 s.s = t->val[0].u.string;
679 p=add_proxy(&s, t->val[1].u.number, 0); /* FIXME proto*/
680 if (p==0) { ret =E_BAD_ADDRESS; goto error; }
682 t->val[0].type=PROXY_ST;
687 LOG(L_CRIT, "BUG: fix_actions: invalid type"
688 "%d (should be string or number)\n",
695 if (t->val[0].type!=RVE_ST){
696 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
697 "%d for if (should be rval expr)\n",
701 }else if( (t->val[1].type!=ACTIONS_ST) &&
702 (t->val[1].type!=NOSUBTYPE) ){
703 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
704 "%d for if() {...} (should be action)\n",
708 }else if( (t->val[2].type!=ACTIONS_ST) &&
709 (t->val[2].type!=NOSUBTYPE) ){
710 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
711 "%d for if() {} else{...}(should be action)\n",
716 rve=(struct rval_expr*)t->val[0].u.data;
719 if (!rve_check_type(&rve_type, rve, &err_rve,
720 &err_type, &expected_type)){
722 LOG(L_ERR, "fix_actions: invalid expression "
723 "(%d,%d): subexpression (%d,%d) has type"
724 " %s, but %s is expected\n",
725 rve->fpos.s_line, rve->fpos.s_col,
726 err_rve->fpos.s_line, err_rve->fpos.s_col,
727 rval_type_name(err_type),
728 rval_type_name(expected_type) );
730 LOG(L_ERR, "fix_actions: invalid expression "
731 "(%d,%d): type mismatch?",
732 rve->fpos.s_line, rve->fpos.s_col);
736 /* it's not an error anymore to have non-int in an if,
737 only a script warning (to allow backward compat. stuff
739 if (rve_type!=RV_INT && rve_type!=RV_NONE){
740 LOG(L_ERR, "fix_actions: invalid expression (%d,%d):"
741 " bad type, integer expected\n",
742 rve->fpos.s_line, rve->fpos.s_col);
746 if ((ret=fix_rval_expr(&t->val[0].u.data))<0)
749 if ( (t->val[1].type==ACTIONS_ST)&&(t->val[1].u.data) ){
750 if ((ret=fix_actions((struct action*)t->val[1].u.data))<0)
753 if ( (t->val[2].type==ACTIONS_ST)&&(t->val[2].u.data) ){
754 if ((ret=fix_actions((struct action*)t->val[2].u.data))
760 if (t->val[0].type!=RVE_ST){
761 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
762 "%d for switch() (should be expr)\n",
766 }else if (t->val[1].type!=CASE_ST){
767 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
768 "%d for switch(...){...}(should be case)\n",
773 if (t->val[0].u.data){
774 if ((ret=fix_rval_expr(&t->val[0].u.data))<0)
777 LOG(L_CRIT, "BUG: fix_actions: null switch()"
782 if ((ret=fix_switch(t))<0)
786 if (t->val[0].type!=RVE_ST){
787 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
788 "%d for while() (should be expr)\n",
792 }else if (t->val[1].type!=ACTIONS_ST){
793 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
794 "%d for while(...){...}(should be action)\n",
799 rve=(struct rval_expr*)t->val[0].u.data;
802 if (!rve_check_type(&rve_type, rve, &err_rve,
803 &err_type, &expected_type)){
805 LOG(L_ERR, "fix_actions: invalid expression "
806 "(%d,%d): subexpression (%d,%d) has type"
807 " %s, but %s is expected\n",
808 rve->fpos.s_line, rve->fpos.s_col,
809 err_rve->fpos.s_line, err_rve->fpos.s_col,
810 rval_type_name(err_type),
811 rval_type_name(expected_type) );
813 LOG(L_ERR, "fix_actions: invalid expression "
814 "(%d,%d): type mismatch?",
815 rve->fpos.s_line, rve->fpos.s_col);
819 if (rve_type!=RV_INT && rve_type!=RV_NONE){
820 LOG(L_ERR, "fix_actions: invalid expression (%d,%d):"
821 " bad type, integer expected\n",
822 rve->fpos.s_line, rve->fpos.s_col);
826 if ((ret=fix_rval_expr(&t->val[0].u.data))<0)
829 LOG(L_CRIT, "BUG: fix_actions: null while()"
834 if ( t->val[1].u.data &&
835 ((ret= fix_actions((struct action*)t->val[1].u.data))<0)){
840 /* only RVEs need fixing for drop/return/break */
841 if (t->val[0].type!=RVE_ST)
843 rve=(struct rval_expr*)t->val[0].u.data;
846 if (!rve_check_type(&rve_type, rve, &err_rve,
847 &err_type, &expected_type)){
849 LOG(L_ERR, "fix_actions: invalid expression "
850 "(%d,%d): subexpression (%d,%d) has type"
851 " %s, but %s is expected\n",
852 rve->fpos.s_line, rve->fpos.s_col,
853 err_rve->fpos.s_line, err_rve->fpos.s_col,
854 rval_type_name(err_type),
855 rval_type_name(expected_type) );
857 LOG(L_ERR, "fix_actions: invalid expression "
858 "(%d,%d): type mismatch?",
859 rve->fpos.s_line, rve->fpos.s_col);
863 if (rve_type!=RV_INT && rve_type!=RV_NONE){
864 LOG(L_ERR, "fix_actions: invalid expression (%d,%d):"
865 " bad type, integer expected\n",
866 rve->fpos.s_line, rve->fpos.s_col);
870 if ((ret=fix_rval_expr(&t->val[0].u.data))<0)
873 LOG(L_CRIT, "BUG: fix_actions: null drop/return"
881 if (t->val[0].type !=LVAL_ST) {
882 LOG(L_CRIT, "BUG: fix_actions: Invalid left side of"
887 if (t->val[1].type !=RVE_ST) {
888 LOG(L_CRIT, "BUG: fix_actions: Invalid right side of"
889 " assignment (%d)\n", t->val[1].type);
893 lval=t->val[0].u.data;
894 if (lval->type==LV_AVP){
895 if (lval->lv.avps.type & AVP_CLASS_DOMAIN) {
896 LOG(L_ERR, "ERROR: You cannot change domain"
897 " attributes from the script, they are"
901 } else if (lval->lv.avps.type & AVP_CLASS_GLOBAL) {
902 LOG(L_ERR, "ERROR: You cannot change global"
903 " attributes from the script, they are"
909 if ((ret=fix_rval_expr(&t->val[1].u.data))<0)
921 cmd = t->val[0].u.data;
923 if (cmd && cmd->c.fixup) {
924 DBG("fixing %s()\n", cmd->c.name);
925 if (t->val[1].u.number==0) {
926 ret = cmd->c.fixup(0, 0);
930 /* type cast NUMBER to STRING, old modules may expect
931 * all STRING params during fixup */
932 for (i=0; i<t->val[1].u.number; i++) {
933 /* obsoleted by the new RVE changes ? */
934 if (t->val[i+2].type == NUMBER_ST) {
935 snprintf(buf, sizeof(buf)-1, "%ld",
936 t->val[i+2].u.number);
937 /* fixup currently requires string pkg_malloced*/
938 t->val[i+2].u.string = pkg_malloc(strlen(buf)+1);
939 if (!t->val[i+2].u.string) {
940 LOG(L_CRIT, "ERROR: cannot translate NUMBER"
945 strcpy(t->val[i+2].u.string, buf);
946 t->val[i+2].type = STRING_ST;
947 }else if (t->val[i+2].type != STRING_ST) {
948 BUG("unsupported function parameter type %d\n",
952 for (i=0; i < t->val[1].u.number; i++) {
953 tmp_p = t->val[i+2].u.data;
954 ret = cmd->c.fixup(&t->val[i+2].u.data, i+1);
955 if (t->val[i+2].u.data != tmp_p)
956 t->val[i+2].type = MODFIXUP_ST;
960 } else if (cmd) { /* no fixup => RVE supported => optimize */
961 for (i=0; i < t->val[1].u.number; i++) {
962 if (t->val[i+2].type == RVE_ST) {
963 rve = t->val[i+2].u.data;
964 if (rve_is_constant(rve)) {
965 /* if expression is constant => evaluate it
966 as string and replace it with the corresp.
968 rv = rval_expr_eval(0, 0, rve);
970 rval_get_str( 0, 0, &s, rv, 0) < 0 ) {
971 ERR("failed to fix constant rve");
972 if (rv) rval_destroy(rv);
978 t->val[i+2].type = STRING_ST;/*asciiz string*/
979 t->val[i+2].u.string = s.s;
980 /* len is not used for now */
981 t->val[i+2].u.str.len = s.len;
983 /* expression is not constant => fixup &
986 if ((ret=fix_rval_expr(&t->val[i+2].u.data))
988 ERR("rve fixup failed\n");
995 if (rve_param_no) { /* we have to fix the type */
998 t->type = MODULE1_RVE_T;
1001 t->type = MODULE2_RVE_T;
1004 t->type = MODULE3_RVE_T;
1007 t->type = MODULE4_RVE_T;
1010 t->type = MODULE5_RVE_T;
1013 t->type = MODULE6_RVE_T;
1016 t->type = MODULEX_RVE_T;
1019 BUG("unsupported module function type %d\n",
1024 } /* if rve_param_no */
1027 case FORCE_SEND_SOCKET_T:
1028 if (t->val[0].type!=SOCKID_ST){
1029 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
1030 "%d for force_send_socket\n",
1036 ((struct socket_id*)t->val[0].u.data)->addr_lst->name
1039 LOG(L_ERR, "ERROR: fix_actions: force_send_socket:"
1040 " could not resolve %s\n",
1041 ((struct socket_id*)t->val[0].u.data)->addr_lst->name);
1042 ret = E_BAD_ADDRESS;
1045 hostent2ip_addr(&ip, he, 0);
1046 si=find_si(&ip, ((struct socket_id*)t->val[0].u.data)->port,
1047 ((struct socket_id*)t->val[0].u.data)->proto);
1049 LOG(L_ERR, "ERROR: fix_actions: bad force_send_socket"
1050 " argument: %s:%d (ser doesn't listen on it)\n",
1051 ((struct socket_id*)t->val[0].u.data)->addr_lst->name,
1052 ((struct socket_id*)t->val[0].u.data)->port);
1053 ret = E_BAD_ADDRESS;
1056 t->val[0].u.data=si;
1057 t->val[0].type=SOCKETINFO_ST;
1059 case UDP_MTU_TRY_PROTO_T:
1060 if (t->val[0].type!=NUMBER_ST){
1061 LOG(L_CRIT, "BUG: fix_actions: invalid subtype"
1062 "%d for udp_mtu_try_proto\n",
1067 switch(t->val[0].u.number){
1069 t->val[0].u.number=0;
1072 t->val[0].u.number=FL_MTU_TCP_FB;
1075 t->val[0].u.number=FL_MTU_TLS_FB;
1078 t->val[0].u.number=FL_MTU_SCTP_FB;
1081 LOG(L_CRIT, "BUG: fix actions: invalid argument for"
1082 " udp_mtu_try_proto (%d)\n",
1083 (unsigned int)t->val[0].u.number);
1086 case APPEND_BRANCH_T:
1087 if (t->val[0].type!=STRING_ST){
1088 BUG("invalid subtype%d for append_branch_t\n",
1093 s.s=t->val[0].u.string;
1094 s.len=(s.s)?strlen(s.s):0;
1096 t->val[0].type=STR_ST;
1099 /* no fixup required for the rest */
1106 LM_ERR("fixing failed (code=%d) at cfg:%s:%d\n", ret,
1107 (t->cfile)?t->cfile:"", t->cline);
1112 /* Compare parameters as ordinary numbers
1114 * Left and right operands can be either numbers or
1115 * attributes. If either of the attributes if of string type then the length of
1116 * its value will be used.
1118 inline static int comp_num(int op, long left, int rtype, union exp_op* r,
1119 struct sip_msg* msg, struct run_act_ctx* h)
1126 if (unlikely(op==NO_OP)) return !(!left);
1129 avp = search_avp_by_index(r->attr->type, r->attr->name,
1130 &val, r->attr->index);
1131 if (avp && !(avp->flags & AVP_VAL_STR)) right = val.n;
1132 else return (op == DIFF_OP);
1138 if (unlikely(rval_expr_eval_int(h, msg, &right, r->param)<0))
1139 return (op == DIFF_OP); /* not found/invalid */
1142 memset(&pval, 0, sizeof(pv_value_t));
1143 if (unlikely(pv_get_spec_value(msg, r->param, &pval)!=0)){
1144 return (op == DIFF_OP); /* error, not found => false */
1146 if (likely(pval.flags & (PV_TYPE_INT|PV_VAL_INT))){
1148 pv_value_destroy(&pval);
1150 pv_value_destroy(&pval);
1151 return (op == DIFF_OP); /* not found or invalid type */
1155 LOG(L_CRIT, "BUG: comp_num: Invalid right operand (%d)\n", rtype);
1160 case EQUAL_OP: return (long)left == (long)right;
1161 case DIFF_OP: return (long)left != (long)right;
1162 case GT_OP: return (long)left > (long)right;
1163 case LT_OP: return (long)left < (long)right;
1164 case GTE_OP: return (long)left >= (long)right;
1165 case LTE_OP: return (long)left <= (long)right;
1167 LOG(L_CRIT, "BUG: comp_num: unknown operator: %d\n", op);
1174 * Compare given string "left" with right side of expression
1176 inline static int comp_str(int op, str* left, int rtype,
1177 union exp_op* r, struct sip_msg* msg,
1178 struct run_act_ctx* h)
1189 struct rval_cache rv_cache;
1193 right=0; /* warning fix */
1196 if (unlikely(op==NO_OP)) return (left->s!=0);
1199 avp = search_avp_by_index(r->attr->type, r->attr->name,
1200 &val, r->attr->index);
1201 if (likely(avp && (avp->flags & AVP_VAL_STR))) right = &val.s;
1202 else return (op == DIFF_OP);
1205 ret = run_select(&v, r->select, msg);
1206 if (unlikely(ret != 0))
1207 return (op == DIFF_OP); /* Not found or error */
1211 rval_cache_init(&rv_cache);
1212 rv=rval_expr_eval(h, msg, r->param);
1213 if (unlikely (rv==0))
1214 return (op==DIFF_OP); /* not found or error*/
1215 if (unlikely(rval_get_tmp_str(h, msg, &v, rv, 0, &rv_cache)<0)){
1221 memset(&pval, 0, sizeof(pv_value_t));
1222 if (unlikely(pv_get_spec_value(msg, r->param, &pval)!=0)){
1223 return (op == DIFF_OP); /* error, not found => false */
1226 if (likely(pval.flags & PV_VAL_STR)){
1229 pv_value_destroy(&pval);
1230 return (op == DIFF_OP); /* not found or invalid type */
1234 if (unlikely(op != MATCH_OP)){
1235 LOG(L_CRIT, "BUG: comp_str: Bad operator %d,"
1236 " ~= expected\n", op);
1244 /* "123" > 100 is not allowed by cfg.y rules
1245 * but can happen as @select or $avp evaluation
1247 * the right operator MUST be number to do the conversion
1249 if (str2int(left,&l) < 0)
1251 return comp_num(op, l, rtype, r, msg, h);
1253 LOG(L_CRIT, "BUG: comp_str: Bad type %d, "
1254 "string or RE expected\n", rtype);
1261 if (left->len != right->len) return 0;
1262 ret=(strncasecmp(left->s, right->s, left->len)==0);
1265 if (left->len != right->len) return 1;
1266 ret = (strncasecmp(left->s, right->s, left->len)!=0);
1269 /* this is really ugly -- we put a temporary zero-terminating
1270 * character in the original string; that's because regexps
1271 * take 0-terminated strings and our messages are not
1272 * zero-terminated; it should not hurt as long as this function
1273 * is applied to content of pkg mem, which is always the case
1274 * with calls from route{}; the same goes for fline in
1277 * also, the received function should always give us an extra
1278 * character, into which we can put the 0-terminator now;
1279 * an alternative would be allocating a new piece of memory,
1280 * which might be too slow
1283 * janakj: AVPs are zero terminated too so this is not problem
1286 backup=left->s[left->len];
1287 left->s[left->len]='\0';
1293 /* we need to compile the RE on the fly */
1294 re=(regex_t*)pkg_malloc(sizeof(regex_t));
1296 LOG(L_CRIT, "ERROR: comp_strstr: memory allocation"
1298 left->s[left->len] = backup;
1301 if (regcomp(re, right->s,
1302 REG_EXTENDED|REG_NOSUB|REG_ICASE)) {
1304 left->s[left->len] = backup;
1307 ret=(regexec(re, left->s, 0, 0, 0)==0);
1312 ret=(regexec(r->re, left->s, 0, 0, 0)==0);
1316 LOG(L_CRIT, "BUG: comp_str: Bad operator type %d, "
1317 "for ~= \n", rtype);
1320 left->s[left->len] = backup;
1323 LOG(L_CRIT, "BUG: comp_str: unknown op %d\n", op);
1327 rval_cache_clean(&rv_cache);
1331 pv_value_destroy(&pval);
1336 rval_cache_clean(&rv_cache);
1340 pv_value_destroy(&pval);
1341 return (op == DIFF_OP) ? 1 : -1;
1345 /* eval_elem helping function, returns str op param */
1346 inline static int comp_string(int op, char* left, int rtype, union exp_op* r,
1347 struct sip_msg* msg, struct run_act_ctx* h)
1353 return comp_str(op, &s, rtype, r, msg, h);
1357 inline static int comp_avp(int op, avp_spec_t* spec, int rtype,
1358 union exp_op* r, struct sip_msg* msg,
1359 struct run_act_ctx* h)
1363 union exp_op num_val;
1367 if (spec->type & AVP_INDEX_ALL) {
1368 avp = search_first_avp(spec->type & ~AVP_INDEX_ALL, spec->name,
1372 avp = search_avp_by_index(spec->type, spec->name, &val, spec->index);
1373 if (!avp) return (op == DIFF_OP);
1376 if (avp->flags & AVP_VAL_STR) {
1377 return val.s.len!=0;
1382 if (avp->flags & AVP_VAL_STR) {
1383 return comp_str(op, &val.s, rtype, r, msg, h);
1390 return comp_num(op, val.n, rtype, r, msg, h);
1394 tmp.len=strlen(r->string);
1395 if (str2int(&tmp, &uval)<0){
1396 LOG(L_WARN, "WARNING: comp_avp: cannot convert"
1397 " string value to int (%s)\n",
1401 num_val.numval=uval;
1402 return comp_num(op, val.n, NUMBER_ST, &num_val, msg, h);
1404 if (str2int(&r->str, &uval)<0){
1405 LOG(L_WARN, "WARNING: comp_avp: cannot convert str value"
1406 " to int (%.*s)\n", r->str.len, ZSW(r->str.s));
1409 num_val.numval=uval;
1410 return comp_num(op, val.n, NUMBER_ST, &num_val, msg, h);
1412 LOG(L_CRIT, "BUG: comp_avp: invalid type for numeric avp "
1413 "comparison (%d)\n", rtype);
1418 return (op == DIFF_OP) ? 1 : -1;
1422 * Left side of expression was select
1424 inline static int comp_select(int op, select_t* sel, int rtype,
1425 union exp_op* r, struct sip_msg* msg,
1426 struct run_act_ctx* h)
1432 ret = run_select(&val, sel, msg);
1433 if (ret != 0) return (op == DIFF_OP);
1435 if (op==NO_OP) return (val.len>0);
1436 if (unlikely(val.len==0)) {
1437 /* make sure the string pointer uses accessible memory range
1438 * the comp_str function might dereference it
1442 return comp_str(op, &val, rtype, r, msg, h);
1446 inline static int comp_rve(int op, struct rval_expr* rve, int rtype,
1447 union exp_op* r, struct sip_msg* msg,
1448 struct run_act_ctx* h)
1453 struct rval_cache c1;
1455 rval_cache_init(&c1);
1456 if (unlikely(rval_expr_eval_rvint(h, msg, &rv, &i, rve, &c1)<0)){
1457 ERR("failure evaluating expression: bad type\n");
1463 rv1=rval_convert(h, msg, RV_STR, rv, &c1);
1464 i=comp_str(op, &rv1->v.s, rtype, r, msg, h);
1467 rval_cache_clean(&c1);
1470 /* expr evaluated to int */
1472 rval_cache_clean(&c1);
1474 return !(!i); /* transform it into { 0, 1 } */
1475 return comp_num(op, i, rtype, r, msg, h);
1480 inline static int comp_pvar(int op, pv_spec_t* pvs, int rtype,
1481 union exp_op* r, struct sip_msg* msg,
1482 struct run_act_ctx* h)
1488 memset(&pval, 0, sizeof(pv_value_t));
1489 if (unlikely(pv_get_spec_value(msg, r->param, &pval)!=0)){
1490 return 0; /* error, not found => false */
1492 if (likely(pval.flags & PV_TYPE_INT)){
1496 ret=comp_num(op, pval.ri, rtype, r, msg, h);
1497 }else if ((pval.flags==PV_VAL_NONE) ||
1498 (pval.flags & (PV_VAL_NULL|PV_VAL_EMPTY))){
1502 ret=comp_num(op, 0, rtype, r, msg, h);
1506 ret=comp_num(op, ret, rtype, r, msg, h);
1508 pv_value_destroy(&pval);
1514 /* check_self wrapper -- it checks also for the op */
1515 inline static int check_self_op(int op, str* s, unsigned short p)
1519 ret=check_self(s, p, 0);
1525 ret=(ret > 0) ? 0 : 1;
1528 LOG(L_CRIT, "BUG: check_self_op: invalid operator %d\n", op);
1535 /* eval_elem helping function, returns an op param */
1536 inline static int comp_ip(int op, struct ip_addr* ip, int rtype,
1537 union exp_op* r, struct sip_msg* msg,
1538 struct run_act_ctx *ctx )
1550 ret=(matchnet(ip, r->net)==1);
1553 ret=(matchnet(ip, r->net)!=1);
1567 /* 1: compare with ip2str*/
1568 ret=comp_string(op, ip_addr2a(ip), rtype, r, msg, ctx);
1569 if (likely(ret==1)) break;
1570 /* 2: resolve (name) & compare w/ all the ips */
1571 if (rtype==STRING_ST){
1572 he=resolvehost(r->str.s);
1574 DBG("comp_ip: could not resolve %s\n",
1576 }else if (he->h_addrtype==ip->af){
1577 for(h=he->h_addr_list;(ret!=1)&& (*h); h++){
1578 ret=(memcmp(ip->u.addr, *h, ip->len)==0);
1583 /* 3: (slow) rev dns the address
1584 * and compare with all the aliases
1585 * !!??!! review: remove this? */
1586 if (unlikely((received_dns & DO_REV_DNS) &&
1587 ((he=rev_resolvehost(ip))!=0) )){
1588 /* compare with primary host name */
1589 ret=comp_string(op, he->h_name, rtype, r, msg, ctx);
1590 /* compare with all the aliases */
1591 for(h=he->h_aliases; (ret!=1) && (*h); h++){
1592 ret=comp_string(op, *h, rtype, r, msg, ctx);
1599 ret=(comp_ip(EQUAL_OP, ip, rtype, r, msg, ctx) > 0) ?0:1;
1605 case MYSELF_ST: /* check if it's one of our addresses*/
1606 tmp.s=ip_addr2a(ip);
1607 tmp.len=strlen(tmp.s);
1608 ret=check_self_op(op, &tmp, 0);
1611 LOG(L_CRIT, "BUG: comp_ip: invalid type for "
1612 " src_ip or dst_ip (%d)\n", rtype);
1617 LOG(L_CRIT, "BUG: comp_ip: invalid operator %d\n", op);
1623 /* returns: 0/1 (false/true) or -1 on error */
1624 inline static int eval_elem(struct run_act_ctx* h, struct expr* e,
1625 struct sip_msg* msg)
1629 struct onsend_info* snd_inf;
1633 if (e->type!=ELEM_T){
1634 LOG(L_CRIT," BUG: eval_elem: invalid type\n");
1639 ret=comp_str(e->op, &msg->first_line.u.request.method,
1640 e->r_type, &e->r, msg, h);
1643 if(msg->new_uri.s) {
1644 if (e->r_type==MYSELF_ST){
1645 if (parse_sip_msg_uri(msg)<0) ret=-1;
1646 else ret=check_self_op(e->op, &msg->parsed_uri.host,
1647 msg->parsed_uri.port_no?
1648 msg->parsed_uri.port_no:SIP_PORT);
1650 ret=comp_str(e->op, &msg->new_uri,
1651 e->r_type, &e->r, msg, h);
1654 if (e->r_type==MYSELF_ST){
1655 if (parse_sip_msg_uri(msg)<0) ret=-1;
1656 else ret=check_self_op(e->op, &msg->parsed_uri.host,
1657 msg->parsed_uri.port_no?
1658 msg->parsed_uri.port_no:SIP_PORT);
1660 ret=comp_str(e->op, &msg->first_line.u.request.uri,
1661 e->r_type, &e->r, msg, h);
1667 if (parse_from_header(msg)!=0){
1668 LOG(L_ERR, "ERROR: eval_elem: bad or missing"
1672 if (e->r_type==MYSELF_ST){
1673 if (parse_uri(get_from(msg)->uri.s, get_from(msg)->uri.len,
1675 LOG(L_ERR, "ERROR: eval_elem: bad uri in From:\n");
1678 ret=check_self_op(e->op, &uri.host,
1679 uri.port_no?uri.port_no:SIP_PORT);
1681 ret=comp_str(e->op, &get_from(msg)->uri,
1682 e->r_type, &e->r, msg, h);
1687 if ((msg->to==0) && ((parse_headers(msg, HDR_TO_F, 0)==-1) ||
1689 LOG(L_ERR, "ERROR: eval_elem: bad or missing"
1693 /* to content is parsed automatically */
1694 if (e->r_type==MYSELF_ST){
1695 if (parse_uri(get_to(msg)->uri.s, get_to(msg)->uri.len,
1697 LOG(L_ERR, "ERROR: eval_elem: bad uri in To:\n");
1700 ret=check_self_op(e->op, &uri.host,
1701 uri.port_no?uri.port_no:SIP_PORT);
1703 ret=comp_str(e->op, &get_to(msg)->uri,
1704 e->r_type, &e->r, msg, h);
1709 ret=comp_ip(e->op, &msg->rcv.src_ip, e->r_type, &e->r, msg, h);
1713 ret=comp_ip(e->op, &msg->rcv.dst_ip, e->r_type, &e->r, msg, h);
1717 snd_inf=get_onsend_info();
1718 if (likely(snd_inf && snd_inf->send_sock)){
1719 ret=comp_ip(e->op, &snd_inf->send_sock->address,
1720 e->r_type, &e->r, msg, h);
1722 BUG("eval_elem: snd_ip unknown (not in a onsend_route?)\n");
1727 snd_inf=get_onsend_info();
1728 if (likely(snd_inf && snd_inf->to)){
1729 su2ip_addr(&ip, snd_inf->to);
1730 ret=comp_ip(e->op, &ip, e->r_type, &e->r, msg, h);
1732 BUG("eval_elem: to_ip unknown (not in a onsend_route?)\n");
1737 ret=!(!e->r.numval); /* !! to transform it in {0,1} */
1741 ret=run_actions(h, (struct action*)e->r.param, msg);
1747 ret=comp_num(e->op, (int)msg->rcv.src_port, e->r_type, &e->r, msg, h);
1751 ret=comp_num(e->op, (int)msg->rcv.dst_port, e->r_type, &e->r, msg, h);
1755 snd_inf=get_onsend_info();
1756 if (likely(snd_inf && snd_inf->send_sock)){
1757 ret=comp_num(e->op, (int)snd_inf->send_sock->port_no,
1758 e->r_type, &e->r, msg, h);
1760 BUG("eval_elem: snd_port unknown (not in a onsend_route?)\n");
1765 snd_inf=get_onsend_info();
1766 if (likely(snd_inf && snd_inf->to)){
1767 ret=comp_num(e->op, (int)su_getport(snd_inf->to),
1768 e->r_type, &e->r, msg, h);
1770 BUG("eval_elem: to_port unknown (not in a onsend_route?)\n");
1775 ret=comp_num(e->op, msg->rcv.proto, e->r_type, &e->r, msg, h);
1779 snd_inf=get_onsend_info();
1780 if (likely(snd_inf && snd_inf->send_sock)){
1781 ret=comp_num(e->op, snd_inf->send_sock->proto,
1782 e->r_type, &e->r, msg, h);
1784 BUG("eval_elem: snd_proto unknown (not in a onsend_route?)\n");
1789 ret=comp_num(e->op, (int)msg->rcv.src_ip.af, e->r_type, &e->r, msg, h);
1793 snd_inf=get_onsend_info();
1794 if (likely(snd_inf && snd_inf->send_sock)){
1795 ret=comp_num(e->op, snd_inf->send_sock->address.af,
1796 e->r_type, &e->r, msg, h);
1798 BUG("eval_elem: snd_af unknown (not in a onsend_route?)\n");
1803 if ((snd_inf=get_onsend_info())!=0){
1804 ret=comp_num(e->op, (int)snd_inf->len, e->r_type, &e->r, msg, h);
1806 ret=comp_num(e->op, (int)msg->len, e->r_type, &e->r, msg, h);
1811 ret=comp_num(e->op, h->last_retcode, e->r_type, &e->r, msg, h);
1815 ret = comp_avp(e->op, e->l.attr, e->r_type, &e->r, msg, h);
1819 ret = comp_select(e->op, e->l.select, e->r_type, &e->r, msg, h);
1823 ret = comp_rve(e->op, e->l.param, e->r_type, &e->r, msg, h);
1827 ret=comp_pvar(e->op, e->l.param, e->r_type, &e->r, msg, h);
1831 LOG(L_CRIT, "BUG: eval_elem: invalid operand %d\n",
1837 return (e->op == DIFF_OP) ? 1 : -1;
1842 /* ret= 1/0 (true/false) , -1 on error (evaluates as false)*/
1843 int eval_expr(struct run_act_ctx* h, struct expr* e, struct sip_msg* msg)
1847 if (e->type==ELEM_T){
1848 ret=eval_elem(h, e, msg);
1849 }else if (e->type==EXP_T){
1852 ret=eval_expr(h, e->l.expr, msg);
1853 /* if error or false stop evaluating the rest */
1854 if (ret <= 0) break;
1855 ret=eval_expr(h, e->r.expr, msg); /*ret1 is 1*/
1858 ret=eval_expr(h, e->l.expr, msg);
1859 /* if true stop evaluating the rest */
1861 ret=eval_expr(h, e->r.expr, msg); /* ret1 is 0 */
1864 ret=eval_expr(h, e->l.expr, msg);
1865 ret=(ret > 0) ? 0 : 1;
1868 LOG(L_CRIT, "BUG: eval_expr: unknown op %d\n", e->op);
1872 LOG(L_CRIT, "BUG: eval_expr: unknown type %d\n", e->type);
1879 /* adds an action list to head; a must be null terminated (last a->next=0))*/
1880 void push(struct action* a, struct action** head)
1887 for (t=*head; t->next;t=t->next);
1894 int add_actions(struct action* a, struct action** head)
1898 LOG(L_DBG, "add_actions: fixing actions...\n");
1899 if ((ret=fix_actions(a))!=0) goto error;
1909 static int fix_rl(struct route_list* rt)
1914 for(i=0;i<rt->idx; i++){
1916 if ((ret=fix_actions(rt->rlist[i]))!=0){
1926 /* fixes all action tables */
1927 /* returns 0 if ok , <0 on error */
1932 if ((ret=fix_rl(&main_rt))!=0)
1934 if ((ret=fix_rl(&onreply_rt))!=0)
1936 if ((ret=fix_rl(&failure_rt))!=0)
1938 if ((ret=fix_rl(&branch_rt))!=0)
1940 if ((ret=fix_rl(&onsend_rt))!=0)
1942 if ((ret=fix_rl(&event_rt))!=0)
1950 static void print_rl(struct route_list* rt, char* name)
1954 for(j=0; j<rt->entries; j++){
1955 if (rt->rlist[j]==0){
1956 if ((j==0) && (rt==&main_rt))
1957 DBG("WARNING: the main routing table is empty\n");
1960 DBG("%s routing table %d:\n", name, j);
1961 print_actions(rt->rlist[j]);
1967 /* debug function, prints routing tables */
1970 print_rl(&main_rt, "");
1971 print_rl(&onreply_rt, "onreply");
1972 print_rl(&failure_rt, "failure");
1973 print_rl(&branch_rt, "branch");
1974 print_rl(&onsend_rt, "onsend");
1975 print_rl(&event_rt, "event");