route_struct.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. /*!
  39. * \file
  40. * \brief SIP-router core ::
  41. * \ingroup core
  42. * Module: \ref core
  43. */
  44. #include "route_struct.h"
  45. #include <stdio.h>
  46. #include <stdlib.h>
  47. #include <string.h>
  48. #include <stdarg.h>
  49. #include "dprint.h"
  50. #include "ip_addr.h"
  51. #include "mem/mem.h"
  52. #include "usr_avp.h"
  53. #include "ut.h" /* ZSW() */
  54. /** joins to cfg file positions into a new one. */
  55. void cfg_pos_join(struct cfg_pos* res,
  56. struct cfg_pos* pos1, struct cfg_pos* pos2)
  57. {
  58. struct cfg_pos ret;
  59. ret=*pos1;
  60. if ((ret.s_line == 0) || (ret.s_line > pos2->s_line)){
  61. ret.s_line=pos2->s_line;
  62. ret.s_col=pos2->s_col;
  63. }else if ((ret.s_line == pos2->s_line) && (ret.s_col > pos2->s_col)){
  64. ret.s_col=pos2->s_col;
  65. }
  66. if ((ret.e_line == 0) || (ret.e_line < pos2->e_line)){
  67. ret.e_line=pos2->e_line;
  68. ret.e_col=pos2->e_col;
  69. }else if ((ret.e_line == pos2->e_line) && (ret.e_col < pos2->e_col)){
  70. ret.e_col=pos2->e_col;
  71. }
  72. *res=ret;
  73. }
  74. struct expr* mk_exp(int op, struct expr* left, struct expr* right)
  75. {
  76. struct expr * e;
  77. e=(struct expr*)pkg_malloc(sizeof (struct expr));
  78. if (e==0) goto error;
  79. e->type=EXP_T;
  80. e->op=op;
  81. e->l.expr=left;
  82. e->r.expr=right;
  83. return e;
  84. error:
  85. LM_CRIT("memory allocation failure\n");
  86. return 0;
  87. }
  88. struct expr* mk_elem(int op, expr_l_type ltype, void* lparam,
  89. expr_r_type rtype, void* rparam)
  90. {
  91. struct expr * e;
  92. e=(struct expr*)pkg_malloc(sizeof (struct expr));
  93. if (e==0) goto error;
  94. e->type=ELEM_T;
  95. e->op=op;
  96. e->l_type=ltype;
  97. e->l.param=lparam;
  98. e->r_type = rtype;
  99. e->r.param=rparam;
  100. return e;
  101. error:
  102. LM_CRIT("memory allocation failure\n");
  103. return 0;
  104. }
  105. /** create an action structure (parser use).
  106. * @param type - type of the action
  107. * @param count - count of couples {param_type,val}
  108. * @param ... - count {param_type, val} pairs, where param_type is
  109. * action_param_type.
  110. * @return new action structure on success (pkg_malloc'ed) or 0 on error.
  111. */
  112. struct action* mk_action(enum action_type type, int count, ...)
  113. {
  114. va_list args;
  115. int i;
  116. struct action* a;
  117. a = (struct action*)pkg_malloc(sizeof(struct action));
  118. if (a==0) goto error;
  119. memset(a, 0, sizeof(struct action));
  120. a->type=type;
  121. a->count = (count > MAX_ACTIONS)?MAX_ACTIONS:count;
  122. va_start(args, count);
  123. for (i=0; i<a->count; i++) {
  124. a->val[i].type = va_arg(args, int);
  125. a->val[i].u.data = va_arg(args, void *);
  126. 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);
  127. }
  128. va_end(args);
  129. a->next=0;
  130. return a;
  131. error:
  132. LM_CRIT("memory allocation failure\n");
  133. return 0;
  134. }
  135. struct action* append_action(struct action* a, struct action* b)
  136. {
  137. struct action *t;
  138. if (b==0) return a;
  139. if (a==0) return b;
  140. for(t=a; t->next; t=t->next);
  141. t->next=b;
  142. return a;
  143. }
  144. void print_expr(struct expr* exp)
  145. {
  146. if (exp==0){
  147. LM_CRIT("null expression!\n");
  148. return;
  149. }
  150. if (exp->type==ELEM_T){
  151. switch(exp->l_type){
  152. case METHOD_O:
  153. DBG("method");
  154. break;
  155. case URI_O:
  156. DBG("uri");
  157. break;
  158. case FROM_URI_O:
  159. DBG("from_uri");
  160. break;
  161. case TO_URI_O:
  162. DBG("to_uri");
  163. break;
  164. case SRCIP_O:
  165. DBG("srcip");
  166. break;
  167. case SRCPORT_O:
  168. DBG("srcport");
  169. break;
  170. case DSTIP_O:
  171. DBG("dstip");
  172. break;
  173. case DSTPORT_O:
  174. DBG("dstport");
  175. break;
  176. case PROTO_O:
  177. DBG("proto");
  178. break;
  179. case AF_O:
  180. DBG("af");
  181. break;
  182. case MSGLEN_O:
  183. DBG("msglen");
  184. break;
  185. case ACTION_O:
  186. break;
  187. case NUMBER_O:
  188. break;
  189. case AVP_O:
  190. DBG("avp");
  191. break;
  192. case SNDIP_O:
  193. DBG("sndip");
  194. break;
  195. case SNDPORT_O:
  196. DBG("sndport");
  197. break;
  198. case TOIP_O:
  199. DBG("toip");
  200. break;
  201. case TOPORT_O:
  202. DBG("toport");
  203. break;
  204. case SNDPROTO_O:
  205. DBG("sndproto");
  206. break;
  207. case SNDAF_O:
  208. DBG("sndaf");
  209. break;
  210. case RETCODE_O:
  211. DBG("retcode");
  212. break;
  213. case SELECT_O:
  214. DBG("select");
  215. break;
  216. case RVEXP_O:
  217. DBG("rval");
  218. break;
  219. default:
  220. DBG("UNKNOWN");
  221. }
  222. switch(exp->op){
  223. case EQUAL_OP:
  224. DBG("==");
  225. break;
  226. case MATCH_OP:
  227. DBG("=~");
  228. break;
  229. case NO_OP:
  230. break;
  231. case GT_OP:
  232. DBG(">");
  233. break;
  234. case GTE_OP:
  235. DBG(">=");
  236. break;
  237. case LT_OP:
  238. DBG("<");
  239. break;
  240. case LTE_OP:
  241. DBG("<=");
  242. break;
  243. case DIFF_OP:
  244. DBG("!=");
  245. break;
  246. default:
  247. DBG("<UNKNOWN>");
  248. }
  249. switch(exp->r_type){
  250. case NOSUBTYPE:
  251. DBG("N/A");
  252. break;
  253. case STRING_ST:
  254. DBG("\"%s\"", ZSW((char*)exp->r.param));
  255. break;
  256. case NET_ST:
  257. print_net((struct net*)exp->r.param);
  258. break;
  259. case IP_ST:
  260. print_ip("", (struct ip_addr*)exp->r.param, "");
  261. break;
  262. case ACTIONS_ST:
  263. print_actions((struct action*)exp->r.param);
  264. break;
  265. case NUMBER_ST:
  266. DBG("%ld",exp->r.numval);
  267. break;
  268. case MYSELF_ST:
  269. DBG("_myself_");
  270. break;
  271. case AVP_ST:
  272. DBG("attr");
  273. break;
  274. case SELECT_ST:
  275. DBG("select");
  276. break;
  277. default:
  278. DBG("type<%d>", exp->r_type);
  279. }
  280. }else if (exp->type==EXP_T){
  281. switch(exp->op){
  282. case LOGAND_OP:
  283. DBG("AND( ");
  284. print_expr(exp->l.expr);
  285. DBG(", ");
  286. print_expr(exp->r.expr);
  287. DBG(" )");
  288. break;
  289. case LOGOR_OP:
  290. DBG("OR( ");
  291. print_expr(exp->l.expr);
  292. DBG(", ");
  293. print_expr(exp->r.expr);
  294. DBG(" )");
  295. break;
  296. case NOT_OP:
  297. DBG("NOT( ");
  298. print_expr(exp->l.expr);
  299. DBG(" )");
  300. break;
  301. default:
  302. DBG("UNKNOWN_EXP ");
  303. }
  304. }else{
  305. DBG("ERROR:print_expr: unknown type\n");
  306. }
  307. }
  308. void print_action(struct action* t)
  309. {
  310. switch(t->type){
  311. case FORWARD_T:
  312. DBG("forward(");
  313. break;
  314. case FORWARD_TCP_T:
  315. DBG("forward_tcp(");
  316. break;
  317. case FORWARD_UDP_T:
  318. DBG("forward_udp(");
  319. break;
  320. case DROP_T:
  321. DBG("drop(");
  322. break;
  323. case LOG_T:
  324. DBG("log(");
  325. break;
  326. case ERROR_T:
  327. DBG("error(");
  328. break;
  329. case ROUTE_T:
  330. DBG("route(");
  331. break;
  332. case EXEC_T:
  333. DBG("exec(");
  334. break;
  335. case REVERT_URI_T:
  336. DBG("revert_uri(");
  337. break;
  338. case STRIP_T:
  339. DBG("strip(");
  340. break;
  341. case APPEND_BRANCH_T:
  342. DBG("append_branch(");
  343. break;
  344. case PREFIX_T:
  345. DBG("prefix(");
  346. break;
  347. case LEN_GT_T:
  348. DBG("len_gt(");
  349. break;
  350. case SETFLAG_T:
  351. DBG("setflag(");
  352. break;
  353. case RESETFLAG_T:
  354. DBG("resetflag(");
  355. break;
  356. case ISFLAGSET_T:
  357. DBG("isflagset(");
  358. break;
  359. case AVPFLAG_OPER_T:
  360. DBG("avpflagoper(");
  361. break;
  362. case SET_HOST_T:
  363. DBG("sethost(");
  364. break;
  365. case SET_HOSTPORT_T:
  366. DBG("sethostport(");
  367. break;
  368. case SET_HOSTPORTTRANS_T:
  369. DBG("sethostporttrans(");
  370. break;
  371. case SET_USER_T:
  372. DBG("setuser(");
  373. break;
  374. case SET_USERPASS_T:
  375. DBG("setuserpass(");
  376. break;
  377. case SET_PORT_T:
  378. DBG("setport(");
  379. break;
  380. case SET_URI_T:
  381. DBG("seturi(");
  382. break;
  383. case IF_T:
  384. DBG("if (");
  385. break;
  386. case MODULE0_T:
  387. case MODULE1_T:
  388. case MODULE2_T:
  389. case MODULE3_T:
  390. case MODULE4_T:
  391. case MODULE5_T:
  392. case MODULE6_T:
  393. case MODULEX_T:
  394. case MODULE1_RVE_T:
  395. case MODULE2_RVE_T:
  396. case MODULE3_RVE_T:
  397. case MODULE4_RVE_T:
  398. case MODULE5_RVE_T:
  399. case MODULE6_RVE_T:
  400. case MODULEX_RVE_T:
  401. DBG(" external_module_call(");
  402. break;
  403. case FORCE_RPORT_T:
  404. DBG("force_rport(");
  405. break;
  406. case SET_ADV_ADDR_T:
  407. DBG("set_advertised_address(");
  408. break;
  409. case SET_ADV_PORT_T:
  410. DBG("set_advertised_port(");
  411. break;
  412. case FORCE_TCP_ALIAS_T:
  413. DBG("force_tcp_alias(");
  414. break;
  415. case LOAD_AVP_T:
  416. DBG("load_avp(");
  417. break;
  418. case AVP_TO_URI_T:
  419. DBG("avp_to_attr");
  420. break;
  421. case FORCE_SEND_SOCKET_T:
  422. DBG("force_send_socket");
  423. break;
  424. case ASSIGN_T
  425. : DBG("assign(");
  426. break;
  427. case ADD_T:
  428. DBG("assign_add(");
  429. break;
  430. default:
  431. DBG("UNKNOWN(");
  432. }
  433. switch(t->val[0].type){
  434. case STRING_ST:
  435. DBG("\"%s\"", ZSW(t->val[0].u.string));
  436. break;
  437. case NUMBER_ST:
  438. DBG("%lu",t->val[0].u.number);
  439. break;
  440. case IP_ST:
  441. print_ip("", (struct ip_addr*)t->val[0].u.data, "");
  442. break;
  443. case EXPR_ST:
  444. print_expr((struct expr*)t->val[0].u.data);
  445. break;
  446. case ACTIONS_ST:
  447. print_actions((struct action*)t->val[0].u.data);
  448. break;
  449. case MODEXP_ST:
  450. DBG("f_ptr<%p>",t->val[0].u.data);
  451. break;
  452. case SOCKID_ST:
  453. DBG("%d:%s:%d",
  454. ((struct socket_id*)t->val[0].u.data)->proto,
  455. ZSW(((struct socket_id*)t->val[0].u.data)->addr_lst->name),
  456. ((struct socket_id*)t->val[0].u.data)->port
  457. );
  458. break;
  459. case AVP_ST:
  460. 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));
  461. break;
  462. case SELECT_ST:
  463. DBG("select");
  464. break;
  465. default:
  466. DBG("type<%d>", t->val[0].type);
  467. }
  468. if (t->type==IF_T) DBG(") {");
  469. switch(t->val[1].type){
  470. case NOSUBTYPE:
  471. break;
  472. case STRING_ST:
  473. DBG(", \"%s\"", ZSW(t->val[1].u.string));
  474. break;
  475. case NUMBER_ST:
  476. DBG(", %lu",t->val[1].u.number);
  477. break;
  478. case EXPR_ST:
  479. print_expr((struct expr*)t->val[1].u.data);
  480. break;
  481. case ACTION_ST:
  482. case ACTIONS_ST:
  483. print_actions((struct action*)t->val[1].u.data);
  484. break;
  485. case SOCKID_ST:
  486. DBG("%d:%s:%d",
  487. ((struct socket_id*)t->val[0].u.data)->proto,
  488. ZSW(((struct socket_id*)t->val[0].u.data)->addr_lst->name),
  489. ((struct socket_id*)t->val[0].u.data)->port
  490. );
  491. break;
  492. case AVP_ST:
  493. 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));
  494. break;
  495. case SELECT_ST:
  496. DBG("select");
  497. break;
  498. default:
  499. DBG(", type<%d>", t->val[1].type);
  500. }
  501. if (t->type==IF_T) DBG("} else {");
  502. switch(t->val[2].type){
  503. case NOSUBTYPE:
  504. break;
  505. case STRING_ST:
  506. DBG(", \"%s\"", ZSW(t->val[2].u.string));
  507. break;
  508. case NUMBER_ST:
  509. DBG(", %lu",t->val[2].u.number);
  510. break;
  511. case EXPR_ST:
  512. print_expr((struct expr*)t->val[2].u.data);
  513. break;
  514. case ACTIONS_ST:
  515. print_actions((struct action*)t->val[2].u.data);
  516. break;
  517. case SOCKID_ST:
  518. DBG("%d:%s:%d",
  519. ((struct socket_id*)t->val[0].u.data)->proto,
  520. ZSW(((struct socket_id*)t->val[0].u.data)->addr_lst->name),
  521. ((struct socket_id*)t->val[0].u.data)->port
  522. );
  523. break;
  524. default:
  525. DBG(", type<%d>", t->val[2].type);
  526. }
  527. if (t->type==IF_T) DBG("}; ");
  528. else DBG("); ");
  529. }
  530. void print_actions(struct action* a)
  531. {
  532. while(a) {
  533. print_action(a);
  534. a = a->next;
  535. }
  536. }
  537. /**
  538. * get the pointer to action structure from parameter
  539. */
  540. struct action *get_action_from_param(void **param, int param_no)
  541. {
  542. struct action *ac, ac2;
  543. action_u_t *au, au2;
  544. /* param points to au->u.string, get pointer to au */
  545. au = (void*) ((char *)param - ((char *)&au2.u.string-(char *)&au2));
  546. au = au - 1 - param_no;
  547. ac = (void*) ((char *)au - ((char *)&ac2.val-(char *)&ac2));
  548. return ac;
  549. }