route_struct.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. /*
  2. * $Id$
  3. *
  4. * route structures helping functions
  5. *
  6. * Copyright (C) 2001-2003 FhG Fokus
  7. *
  8. * This file is part of ser, a free SIP server.
  9. *
  10. * ser is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version
  14. *
  15. * For a license to use the ser software under conditions
  16. * other than those described here, or to purchase support for this
  17. * software, please contact iptel.org by e-mail at the following addresses:
  18. * [email protected]
  19. *
  20. * ser is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU General Public License
  26. * along with this program; if not, write to the Free Software
  27. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  28. */
  29. /* History:
  30. * --------
  31. * 2003-01-29 src_port introduced (jiri)
  32. * 2003-03-19 replaced all mallocs/frees w/ pkg_malloc/pkg_free (andrei)
  33. * 2003-04-12 FORCE_RPORT_T added (andrei)
  34. * 2003-10-02 added SET_ADV_ADDRESS & SET_ADV_PORT (andrei)
  35. * 2004-02-24 added LOAD_AVP_T and AVP_TO_URI_T (bogdan)
  36. * 2005-12-19 select framework added SELECT_O and SELECT_ST (mma)
  37. */
  38. #include "route_struct.h"
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <stdarg.h>
  43. #include "dprint.h"
  44. #include "ip_addr.h"
  45. #include "mem/mem.h"
  46. #include "usr_avp.h"
  47. #include "ut.h" /* ZSW() */
  48. /** joins to cfg file positions into a new one. */
  49. void cfg_pos_join(struct cfg_pos* res,
  50. struct cfg_pos* pos1, struct cfg_pos* pos2)
  51. {
  52. struct cfg_pos ret;
  53. ret=*pos1;
  54. if ((ret.s_line == 0) || (ret.s_line > pos2->s_line)){
  55. ret.s_line=pos2->s_line;
  56. ret.s_col=pos2->s_col;
  57. }else if ((ret.s_line == pos2->s_line) && (ret.s_col > pos2->s_col)){
  58. ret.s_col=pos2->s_col;
  59. }
  60. if ((ret.e_line == 0) || (ret.e_line < pos2->e_line)){
  61. ret.e_line=pos2->e_line;
  62. ret.e_col=pos2->e_col;
  63. }else if ((ret.e_line == pos2->e_line) && (ret.e_col < pos2->e_col)){
  64. ret.e_col=pos2->e_col;
  65. }
  66. *res=ret;
  67. }
  68. struct expr* mk_exp(int op, struct expr* left, struct expr* right)
  69. {
  70. struct expr * e;
  71. e=(struct expr*)pkg_malloc(sizeof (struct expr));
  72. if (e==0) goto error;
  73. e->type=EXP_T;
  74. e->op=op;
  75. e->l.expr=left;
  76. e->r.expr=right;
  77. return e;
  78. error:
  79. LOG(L_CRIT, "ERROR: mk_exp: memory allocation failure\n");
  80. return 0;
  81. }
  82. struct expr* mk_exp_rve(int op, void* left, void* right)
  83. {
  84. struct expr * e;
  85. e=(struct expr*)pkg_malloc(sizeof (struct expr));
  86. if (e==0) goto error;
  87. e->type=EXP_T;
  88. e->op=op;
  89. e->l.param=mk_elem(RVEXP_O, RVE_ST, left, 0, 0);
  90. e->r.param=mk_elem(RVEXP_O, RVE_ST, right, 0, 0);
  91. if (e->l.param==0 || e->r.param==0){
  92. if (e->l.param) pkg_free(e->l.param);
  93. if (e->r.param) pkg_free(e->r.param);
  94. pkg_free(e);
  95. goto error;
  96. }
  97. return e;
  98. error:
  99. LOG(L_CRIT, "ERROR: mk_exp_rve: memory allocation failure\n");
  100. return 0;
  101. }
  102. struct expr* mk_elem(int op, expr_l_type ltype, void* lparam,
  103. expr_r_type rtype, void* rparam)
  104. {
  105. struct expr * e;
  106. e=(struct expr*)pkg_malloc(sizeof (struct expr));
  107. if (e==0) goto error;
  108. e->type=ELEM_T;
  109. e->op=op;
  110. e->l_type=ltype;
  111. e->l.param=lparam;
  112. e->r_type = rtype;
  113. e->r.param=rparam;
  114. return e;
  115. error:
  116. LOG(L_CRIT, "ERROR: mk_elem: memory allocation failure\n");
  117. return 0;
  118. }
  119. /** create an action structure (parser use).
  120. * @param type - type of the action
  121. * @param count - count of couples {param_type,val}
  122. * @param ... - count {param_type, val} pairs, where param_type is
  123. * action_param_type.
  124. * @return new action structure on success (pkg_malloc'ed) or 0 on error.
  125. */
  126. struct action* mk_action(enum action_type type, int count, ...)
  127. {
  128. va_list args;
  129. int i;
  130. struct action* a;
  131. a = (struct action*)pkg_malloc(sizeof(struct action));
  132. if (a==0) goto error;
  133. memset(a, 0, sizeof(struct action));
  134. a->type=type;
  135. a->count = (count > MAX_ACTIONS)?MAX_ACTIONS:count;
  136. va_start(args, count);
  137. for (i=0; i<a->count; i++) {
  138. a->val[i].type = va_arg(args, int);
  139. a->val[i].u.data = va_arg(args, void *);
  140. DBG("ACTION_#%d #%d/%d: %d(%x)/ %p\n", a->type, i, a->count, a->val[i].type, a->val[i].type, a->val[i].u.data);
  141. }
  142. va_end(args);
  143. a->next=0;
  144. return a;
  145. error:
  146. LOG(L_CRIT, "ERROR: mk_action: memory allocation failure\n");
  147. return 0;
  148. }
  149. struct action* append_action(struct action* a, struct action* b)
  150. {
  151. struct action *t;
  152. if (b==0) return a;
  153. if (a==0) return b;
  154. for(t=a; t->next; t=t->next);
  155. t->next=b;
  156. return a;
  157. }
  158. void print_expr(struct expr* exp)
  159. {
  160. if (exp==0){
  161. LOG(L_CRIT, "ERROR: print_expr: null expression!\n");
  162. return;
  163. }
  164. if (exp->type==ELEM_T){
  165. switch(exp->l_type){
  166. case METHOD_O:
  167. DBG("method");
  168. break;
  169. case URI_O:
  170. DBG("uri");
  171. break;
  172. case FROM_URI_O:
  173. DBG("from_uri");
  174. break;
  175. case TO_URI_O:
  176. DBG("to_uri");
  177. break;
  178. case SRCIP_O:
  179. DBG("srcip");
  180. break;
  181. case SRCPORT_O:
  182. DBG("srcport");
  183. break;
  184. case DSTIP_O:
  185. DBG("dstip");
  186. break;
  187. case DSTPORT_O:
  188. DBG("dstport");
  189. break;
  190. case PROTO_O:
  191. DBG("proto");
  192. break;
  193. case AF_O:
  194. DBG("af");
  195. break;
  196. case MSGLEN_O:
  197. DBG("msglen");
  198. break;
  199. case ACTION_O:
  200. break;
  201. case NUMBER_O:
  202. break;
  203. case AVP_O:
  204. DBG("avp");
  205. break;
  206. case SNDIP_O:
  207. DBG("sndip");
  208. break;
  209. case SNDPORT_O:
  210. DBG("sndport");
  211. break;
  212. case TOIP_O:
  213. DBG("toip");
  214. break;
  215. case TOPORT_O:
  216. DBG("toport");
  217. break;
  218. case SNDPROTO_O:
  219. DBG("sndproto");
  220. break;
  221. case SNDAF_O:
  222. DBG("sndaf");
  223. break;
  224. case RETCODE_O:
  225. DBG("retcode");
  226. break;
  227. case SELECT_O:
  228. DBG("select");
  229. break;
  230. case RVEXP_O:
  231. DBG("rval");
  232. break;
  233. default:
  234. DBG("UNKNOWN");
  235. }
  236. switch(exp->op){
  237. case EQUAL_OP:
  238. DBG("==");
  239. break;
  240. case MATCH_OP:
  241. DBG("=~");
  242. break;
  243. case NO_OP:
  244. break;
  245. case GT_OP:
  246. DBG(">");
  247. break;
  248. case GTE_OP:
  249. DBG(">=");
  250. break;
  251. case LT_OP:
  252. DBG("<");
  253. break;
  254. case LTE_OP:
  255. DBG("<=");
  256. break;
  257. case DIFF_OP:
  258. DBG("!=");
  259. break;
  260. default:
  261. DBG("<UNKNOWN>");
  262. }
  263. switch(exp->r_type){
  264. case NOSUBTYPE:
  265. DBG("N/A");
  266. break;
  267. case STRING_ST:
  268. DBG("\"%s\"", ZSW((char*)exp->r.param));
  269. break;
  270. case NET_ST:
  271. print_net((struct net*)exp->r.param);
  272. break;
  273. case IP_ST:
  274. print_ip("", (struct ip_addr*)exp->r.param, "");
  275. break;
  276. case ACTIONS_ST:
  277. print_actions((struct action*)exp->r.param);
  278. break;
  279. case NUMBER_ST:
  280. DBG("%ld",exp->r.numval);
  281. break;
  282. case MYSELF_ST:
  283. DBG("_myself_");
  284. break;
  285. case AVP_ST:
  286. DBG("attr");
  287. break;
  288. case SELECT_ST:
  289. DBG("select");
  290. break;
  291. default:
  292. DBG("type<%d>", exp->r_type);
  293. }
  294. }else if (exp->type==EXP_T){
  295. switch(exp->op){
  296. case LOGAND_OP:
  297. DBG("AND( ");
  298. print_expr(exp->l.expr);
  299. DBG(", ");
  300. print_expr(exp->r.expr);
  301. DBG(" )");
  302. break;
  303. case LOGOR_OP:
  304. DBG("OR( ");
  305. print_expr(exp->l.expr);
  306. DBG(", ");
  307. print_expr(exp->r.expr);
  308. DBG(" )");
  309. break;
  310. case NOT_OP:
  311. DBG("NOT( ");
  312. print_expr(exp->l.expr);
  313. DBG(" )");
  314. break;
  315. default:
  316. DBG("UNKNOWN_EXP ");
  317. }
  318. }else{
  319. DBG("ERROR:print_expr: unknown type\n");
  320. }
  321. }
  322. void print_action(struct action* t)
  323. {
  324. switch(t->type){
  325. case FORWARD_T:
  326. DBG("forward(");
  327. break;
  328. case FORWARD_TCP_T:
  329. DBG("forward_tcp(");
  330. break;
  331. case FORWARD_UDP_T:
  332. DBG("forward_udp(");
  333. break;
  334. case SEND_T:
  335. DBG("send(");
  336. break;
  337. case SEND_TCP_T:
  338. DBG("send_tcp(");
  339. break;
  340. case DROP_T:
  341. DBG("drop(");
  342. break;
  343. case LOG_T:
  344. DBG("log(");
  345. break;
  346. case ERROR_T:
  347. DBG("error(");
  348. break;
  349. case ROUTE_T:
  350. DBG("route(");
  351. break;
  352. case EXEC_T:
  353. DBG("exec(");
  354. break;
  355. case REVERT_URI_T:
  356. DBG("revert_uri(");
  357. break;
  358. case STRIP_T:
  359. DBG("strip(");
  360. break;
  361. case APPEND_BRANCH_T:
  362. DBG("append_branch(");
  363. break;
  364. case PREFIX_T:
  365. DBG("prefix(");
  366. break;
  367. case LEN_GT_T:
  368. DBG("len_gt(");
  369. break;
  370. case SETFLAG_T:
  371. DBG("setflag(");
  372. break;
  373. case RESETFLAG_T:
  374. DBG("resetflag(");
  375. break;
  376. case ISFLAGSET_T:
  377. DBG("isflagset(");
  378. break;
  379. case AVPFLAG_OPER_T:
  380. DBG("avpflagoper(");
  381. break;
  382. case SET_HOST_T:
  383. DBG("sethost(");
  384. break;
  385. case SET_HOSTPORT_T:
  386. DBG("sethostport(");
  387. break;
  388. case SET_HOSTPORTTRANS_T:
  389. DBG("sethostporttrans(");
  390. break;
  391. case SET_USER_T:
  392. DBG("setuser(");
  393. break;
  394. case SET_USERPASS_T:
  395. DBG("setuserpass(");
  396. break;
  397. case SET_PORT_T:
  398. DBG("setport(");
  399. break;
  400. case SET_URI_T:
  401. DBG("seturi(");
  402. break;
  403. case IF_T:
  404. DBG("if (");
  405. break;
  406. case MODULE_T:
  407. case MODULE3_T:
  408. case MODULE4_T:
  409. case MODULE5_T:
  410. case MODULE6_T:
  411. case MODULEX_T:
  412. DBG(" external_module_call(");
  413. break;
  414. case FORCE_RPORT_T:
  415. DBG("force_rport(");
  416. break;
  417. case SET_ADV_ADDR_T:
  418. DBG("set_advertised_address(");
  419. break;
  420. case SET_ADV_PORT_T:
  421. DBG("set_advertised_port(");
  422. break;
  423. case FORCE_TCP_ALIAS_T:
  424. DBG("force_tcp_alias(");
  425. break;
  426. case LOAD_AVP_T:
  427. DBG("load_avp(");
  428. break;
  429. case AVP_TO_URI_T:
  430. DBG("avp_to_attr");
  431. break;
  432. case FORCE_SEND_SOCKET_T:
  433. DBG("force_send_socket");
  434. break;
  435. case ASSIGN_T
  436. : DBG("assign(");
  437. break;
  438. case ADD_T:
  439. DBG("assign_add(");
  440. break;
  441. default:
  442. DBG("UNKNOWN(");
  443. }
  444. switch(t->val[0].type){
  445. case STRING_ST:
  446. DBG("\"%s\"", ZSW(t->val[0].u.string));
  447. break;
  448. case NUMBER_ST:
  449. DBG("%lu",t->val[0].u.number);
  450. break;
  451. case IP_ST:
  452. print_ip("", (struct ip_addr*)t->val[0].u.data, "");
  453. break;
  454. case EXPR_ST:
  455. print_expr((struct expr*)t->val[0].u.data);
  456. break;
  457. case ACTIONS_ST:
  458. print_actions((struct action*)t->val[0].u.data);
  459. break;
  460. case MODEXP_ST:
  461. DBG("f_ptr<%p>",t->val[0].u.data);
  462. break;
  463. case SOCKID_ST:
  464. DBG("%d:%s:%d",
  465. ((struct socket_id*)t->val[0].u.data)->proto,
  466. ZSW(((struct socket_id*)t->val[0].u.data)->addr_lst->name),
  467. ((struct socket_id*)t->val[0].u.data)->port
  468. );
  469. break;
  470. case AVP_ST:
  471. DBG("avp(%u,%.*s)", t->val[0].u.attr->type, t->val[0].u.attr->name.s.len, ZSW(t->val[0].u.attr->name.s.s));
  472. break;
  473. case SELECT_ST:
  474. DBG("select");
  475. break;
  476. default:
  477. DBG("type<%d>", t->val[0].type);
  478. }
  479. if (t->type==IF_T) DBG(") {");
  480. switch(t->val[1].type){
  481. case NOSUBTYPE:
  482. break;
  483. case STRING_ST:
  484. DBG(", \"%s\"", ZSW(t->val[1].u.string));
  485. break;
  486. case NUMBER_ST:
  487. DBG(", %lu",t->val[1].u.number);
  488. break;
  489. case EXPR_ST:
  490. print_expr((struct expr*)t->val[1].u.data);
  491. break;
  492. case ACTION_ST:
  493. case ACTIONS_ST:
  494. print_actions((struct action*)t->val[1].u.data);
  495. break;
  496. case SOCKID_ST:
  497. DBG("%d:%s:%d",
  498. ((struct socket_id*)t->val[0].u.data)->proto,
  499. ZSW(((struct socket_id*)t->val[0].u.data)->addr_lst->name),
  500. ((struct socket_id*)t->val[0].u.data)->port
  501. );
  502. break;
  503. case AVP_ST:
  504. DBG(", avp(%u,%.*s)", t->val[1].u.attr->type, t->val[1].u.attr->name.s.len, ZSW(t->val[1].u.attr->name.s.s));
  505. break;
  506. case SELECT_ST:
  507. DBG("select");
  508. break;
  509. default:
  510. DBG(", type<%d>", t->val[1].type);
  511. }
  512. if (t->type==IF_T) DBG("} else {");
  513. switch(t->val[2].type){
  514. case NOSUBTYPE:
  515. break;
  516. case STRING_ST:
  517. DBG(", \"%s\"", ZSW(t->val[2].u.string));
  518. break;
  519. case NUMBER_ST:
  520. DBG(", %lu",t->val[2].u.number);
  521. break;
  522. case EXPR_ST:
  523. print_expr((struct expr*)t->val[2].u.data);
  524. break;
  525. case ACTIONS_ST:
  526. print_actions((struct action*)t->val[2].u.data);
  527. break;
  528. case SOCKID_ST:
  529. DBG("%d:%s:%d",
  530. ((struct socket_id*)t->val[0].u.data)->proto,
  531. ZSW(((struct socket_id*)t->val[0].u.data)->addr_lst->name),
  532. ((struct socket_id*)t->val[0].u.data)->port
  533. );
  534. break;
  535. default:
  536. DBG(", type<%d>", t->val[2].type);
  537. }
  538. if (t->type==IF_T) DBG("}; ");
  539. else DBG("); ");
  540. }
  541. void print_actions(struct action* a)
  542. {
  543. while(a) {
  544. print_action(a);
  545. a = a->next;
  546. }
  547. }