... | ... |
@@ -113,6 +113,7 @@ ERROR error |
113 | 113 |
ROUTE route |
114 | 114 |
ROUTE_FAILURE failure_route |
115 | 115 |
ROUTE_ONREPLY onreply_route |
116 |
+ROUTE_BRANCH branch_route |
|
116 | 117 |
EXEC exec |
117 | 118 |
FORCE_RPORT "force_rport"|"add_rport" |
118 | 119 |
FORCE_TCP_ALIAS "force_tcp_alias"|"add_tcp_alias" |
... | ... |
@@ -312,6 +313,7 @@ EAT_ABLE [\ \t\b\r] |
312 | 313 |
return ROUTE_ONREPLY; } |
313 | 314 |
<INITIAL>{ROUTE_FAILURE} { count(); yylval.strval=yytext; |
314 | 315 |
return ROUTE_FAILURE; } |
316 |
+<INITIAL>{ROUTE_BRANCH} { count(); yylval.strval=yytext; return ROUTE_BRANCH; } |
|
315 | 317 |
<INITIAL>{EXEC} { count(); yylval.strval=yytext; return EXEC; } |
316 | 318 |
<INITIAL>{SET_HOST} { count(); yylval.strval=yytext; return SET_HOST; } |
317 | 319 |
<INITIAL>{SET_HOSTPORT} { count(); yylval.strval=yytext; return SET_HOSTPORT; } |
... | ... |
@@ -149,6 +149,7 @@ static struct socket_id* mk_listen_id(char*, int, int); |
149 | 149 |
%token ROUTE |
150 | 150 |
%token ROUTE_FAILURE |
151 | 151 |
%token ROUTE_ONREPLY |
152 |
+%token ROUTE_BRANCH |
|
152 | 153 |
%token EXEC |
153 | 154 |
%token SET_HOST |
154 | 155 |
%token SET_HOSTPORT |
... | ... |
@@ -335,6 +336,7 @@ statement: assign_stm |
335 | 336 |
| {rt=REQUEST_ROUTE;} route_stm |
336 | 337 |
| {rt=FAILURE_ROUTE;} failure_route_stm |
337 | 338 |
| {rt=ONREPLY_ROUTE;} onreply_route_stm |
339 |
+ | {rt=BRANCH_ROUTE;} branch_route_stm |
|
338 | 340 |
|
339 | 341 |
| CR /* null statement*/ |
340 | 342 |
; |
... | ... |
@@ -870,6 +872,19 @@ onreply_route_stm: ROUTE LBRACE actions RBRACE { |
870 | 872 |
} |
871 | 873 |
| ROUTE_ONREPLY error { yyerror("invalid onreply_route statement"); } |
872 | 874 |
; |
875 |
+branch_route_stm: ROUTE_BRANCH LBRACE actions RBRACE { |
|
876 |
+ push($3, &branch_rlist[DEFAULT_RT]); |
|
877 |
+ } |
|
878 |
+ | ROUTE_BRANCH LBRACK NUMBER RBRACK LBRACE actions RBRACE { |
|
879 |
+ if (($3<BRANCH_RT_NO)&&($3>=1)){ |
|
880 |
+ push($6, &branch_rlist[$3]); |
|
881 |
+ } else { |
|
882 |
+ yyerror("invalid branch routing" |
|
883 |
+ "table number"); |
|
884 |
+ YYABORT; } |
|
885 |
+ } |
|
886 |
+ | ROUTE_BRANCH error { yyerror("invalid branch_route statement"); } |
|
887 |
+ ; |
|
873 | 888 |
/* |
874 | 889 |
rules: rules rule { push($2, &$1); $$=$1; } |
875 | 890 |
| rule {$$=$1; } |
... | ... |
@@ -60,6 +60,7 @@ |
60 | 60 |
#define RT_NO 20 /* routing tables number */ |
61 | 61 |
#define FAILURE_RT_NO RT_NO /* on_failure routing tables number */ |
62 | 62 |
#define ONREPLY_RT_NO RT_NO /* on_reply routing tables number */ |
63 |
+#define BRANCH_RT_NO RT_NO /* branch_route routing tables number */ |
|
63 | 64 |
#define DEFAULT_RT 0 /* default routing table */ |
64 | 65 |
|
65 | 66 |
#define MAX_REC_LEV 100 /* maximum number of recursive calls */ |
... | ... |
@@ -75,7 +75,7 @@ enum lump_conditions { COND_FALSE, /* always false */ |
75 | 75 |
proto = protocol (tcp, udp, tls) |
76 | 76 |
*/ |
77 | 77 |
|
78 |
-enum lump_flag { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2 }; |
|
78 |
+enum lump_flag { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2, LUMPFLAG_BRANCH=4 }; |
|
79 | 79 |
|
80 | 80 |
|
81 | 81 |
struct lump{ |
... | ... |
@@ -73,7 +73,7 @@ struct action* rlist[RT_NO]; |
73 | 73 |
/* reply routing table */ |
74 | 74 |
struct action* onreply_rlist[ONREPLY_RT_NO]; |
75 | 75 |
struct action* failure_rlist[FAILURE_RT_NO]; |
76 |
- |
|
76 |
+struct action* branch_rlist[BRANCH_RT_NO]; |
|
77 | 77 |
|
78 | 78 |
static int fix_actions(struct action* a); /*fwd declaration*/ |
79 | 79 |
|
... | ... |
@@ -742,6 +742,13 @@ int fix_rls() |
742 | 742 |
} |
743 | 743 |
} |
744 | 744 |
} |
745 |
+ for(i=0;i<BRANCH_RT_NO;i++){ |
|
746 |
+ if(branch_rlist[i]){ |
|
747 |
+ if ((ret=fix_actions(branch_rlist[i]))!=0){ |
|
748 |
+ return ret; |
|
749 |
+ } |
|
750 |
+ } |
|
751 |
+ } |
|
745 | 752 |
return 0; |
746 | 753 |
} |
747 | 754 |
|
... | ... |
@@ -783,6 +790,14 @@ void print_rl() |
783 | 790 |
} |
784 | 791 |
DBG("\n"); |
785 | 792 |
} |
793 |
+ for(j=0; j<BRANCH_RT_NO; j++){ |
|
794 |
+ if (branch_rlist[j]==0){ |
|
795 |
+ continue; |
|
796 |
+ } |
|
797 |
+ DBG("branch routing table %d:\n",j); |
|
798 |
+ for (t=branch_rlist[j],i=0; t; i++, t=t->next){ |
|
799 |
+ print_action(t); |
|
800 |
+ } |
|
801 |
+ DBG("\n"); |
|
802 |
+ } |
|
786 | 803 |
} |
787 |
- |
|
788 |
- |
... | ... |
@@ -46,6 +46,7 @@ extern struct action* rlist[RT_NO]; |
46 | 46 |
/* main reply route table */ |
47 | 47 |
extern struct action* onreply_rlist[RT_NO]; |
48 | 48 |
extern struct action* failure_rlist[RT_NO]; |
49 |
+extern struct action* branch_rlist[RT_NO]; |
|
49 | 50 |
|
50 | 51 |
|
51 | 52 |
void push(struct action* a, struct action** head); |
... | ... |
@@ -69,6 +69,7 @@ typedef int (*param_func_t)( modparam_t type, void* val); |
69 | 69 |
#define REQUEST_ROUTE 1 /* Function can be used in request route blocks */ |
70 | 70 |
#define FAILURE_ROUTE 2 /* Function can be used in reply route blocks */ |
71 | 71 |
#define ONREPLY_ROUTE 4 /* Function can be used in on_reply */ |
72 |
+#define BRANCH_ROUTE 8 /* Function can be used in branch_route blocks */ |
|
72 | 73 |
|
73 | 74 |
/* Macros - used as rank in child_init function */ |
74 | 75 |
#define PROC_MAIN 0 /* Main ser process */ |