Module: sip-router Branch: pd/websocket Commit: 8c6f700b4213552789fa97c4edf0ff4bb4b61f90 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=8c6f700b...
Author: Peter Dunkley peter.dunkley@crocodile-rcs.com Committer: Peter Dunkley peter.dunkley@crocodile-rcs.com Date: Thu Jun 28 17:57:44 2012 +0100
core: added support for WS keyword for use in conditionals with proto and snd_proto
---
cfg.lex | 2 ++ cfg.y | 9 +++++++-- ip_addr.h | 2 +- route.c | 9 +++++++++ route_struct.h | 3 ++- 5 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/cfg.lex b/cfg.lex index a626c8c..b1a0f29 100644 --- a/cfg.lex +++ b/cfg.lex @@ -525,6 +525,7 @@ UDP "udp"|"UDP" TCP "tcp"|"TCP" TLS "tls"|"TLS" SCTP "sctp"|"SCTP" +WS "ws"|"WS" INET "inet"|"INET" INET6 "inet6"|"INET6" SSLv23 "sslv23"|"SSLv23"|"SSLV23" @@ -1163,6 +1164,7 @@ IMPORTFILE "import_file" <INITIAL>{UDP} { count(); return UDP; } <INITIAL>{TLS} { count(); return TLS; } <INITIAL>{SCTP} { count(); return SCTP; } +<INITIAL>{WS} { count(); return WS; } <INITIAL>{INET} { count(); yylval.intval=AF_INET; yy_number_str=yytext; return NUMBER; } <INITIAL>{INET6} { count(); diff --git a/cfg.y b/cfg.y index cdd03fc..8fdccdc 100644 --- a/cfg.y +++ b/cfg.y @@ -391,6 +391,7 @@ extern char *finame; %token TCP %token TLS %token SCTP +%token WS
/* config vars. */ %token DEBUG_V @@ -2203,16 +2204,20 @@ exp_elem: | eint_op error { $$=0; yyerror("==, !=, <,>, >= or <= expected"); } | PROTO equalop proto %prec EQUAL_T { $$=mk_elem($2, PROTO_O, 0, NUMBER_ST, (void*)$3 ); } + | PROTO equalop WS %prec EQUAL_T + { $$=mk_elem($2, PROTO_O, 0, WEBSOCKET_ST, (void *)PROTO_WS ); } | PROTO equalop rval_expr %prec EQUAL_T { $$=mk_elem($2, PROTO_O, 0, RVE_ST, $3 ); } | PROTO equalop error - { $$=0; yyerror("protocol expected (udp, tcp, tls or sctp)"); } + { $$=0; yyerror("protocol expected (udp, tcp, tls, sctp, or ws)"); } | SNDPROTO equalop proto %prec EQUAL_T { $$=mk_elem($2, SNDPROTO_O, 0, NUMBER_ST, (void*)$3 ); } + | SNDPROTO equalop WS %prec EQUAL_T + { $$=mk_elem($2, SNDPROTO_O, 0, WEBSOCKET_ST, (void *)PROTO_WS ); } | SNDPROTO equalop rval_expr %prec EQUAL_T { $$=mk_elem($2, SNDPROTO_O, 0, RVE_ST, $3 ); } | SNDPROTO equalop error - { $$=0; yyerror("protocol expected (udp, tcp, tls or sctp)"); } + { $$=0; yyerror("protocol expected (udp, tcp, tls, sctp, ws)"); } | eip_op strop ipnet %prec EQUAL_T { $$=mk_elem($2, $1, 0, NET_ST, $3); } | eip_op strop rval_expr %prec EQUAL_T { s_tmp.s=0; diff --git a/ip_addr.h b/ip_addr.h index dbf6e85..3e23633 100644 --- a/ip_addr.h +++ b/ip_addr.h @@ -52,7 +52,7 @@
#include "dprint.h"
-enum sip_protos { PROTO_NONE, PROTO_UDP, PROTO_TCP, PROTO_TLS, PROTO_SCTP, PROTO_OTHER }; +enum sip_protos { PROTO_NONE, PROTO_UDP, PROTO_TCP, PROTO_TLS, PROTO_SCTP, PROTO_OTHER, PROTO_WS /* Deliberately after PROTO_(OTHER|LAST) */ }; #define PROTO_LAST PROTO_OTHER
#ifdef USE_COMP diff --git a/route.c b/route.c index 7990cfd..ca357d3 100644 --- a/route.c +++ b/route.c @@ -1231,6 +1231,7 @@ inline static int comp_num(int op, long left, int rtype, union exp_op* r, pv_value_t pval; avp_t* avp; int right; + struct tcp_connection *con;
if (unlikely(op==NO_OP)) return !(!left); switch(rtype){ @@ -1260,6 +1261,14 @@ inline static int comp_num(int op, long left, int rtype, union exp_op* r, return (op == DIFF_OP); /* not found or invalid type */ } break; + case WEBSOCKET_ST: + if ((con = tcpconn_get(msg->rcv.proto_reserved1, 0, 0, 0, 0)) != NULL) { + if (con->flags & F_CONN_WS) + left = PROTO_WS; + } + right = r->numval; + break; + default: LOG(L_CRIT, "BUG: comp_num: Invalid right operand (%d)\n", rtype); return E_BUG; diff --git a/route_struct.h b/route_struct.h index b176b9c..9e9b5cb 100644 --- a/route_struct.h +++ b/route_struct.h @@ -136,7 +136,8 @@ enum _operand_subtype{ STRING_RVE_ST /* RVE converted to a string (fparam hack) */, RVE_FREE_FIXUP_ST /* (str)RVE fixed up by a reversable fixup */, FPARAM_DYN_ST /* temporary only (fparam hack) */, - CFG_GROUP_ST + CFG_GROUP_ST, + WEBSOCKET_ST };
typedef enum _expr_l_type expr_l_type;