浏览代码

- Suppor for branch_route sections in the configuration file.

Jan Janak 20 年之前
父节点
当前提交
7662b2e7cf
共有 7 个文件被更改,包括 39 次插入4 次删除
  1. 2 0
      cfg.lex
  2. 15 0
      cfg.y
  3. 1 0
      config.h
  4. 1 1
      lump_struct.h
  5. 18 3
      route.c
  6. 1 0
      route.h
  7. 1 0
      sr_module.h

+ 2 - 0
cfg.lex

@@ -113,6 +113,7 @@ ERROR	error
 ROUTE	route
 ROUTE_FAILURE failure_route
 ROUTE_ONREPLY onreply_route
+ROUTE_BRANCH branch_route
 EXEC	exec
 FORCE_RPORT		"force_rport"|"add_rport"
 FORCE_TCP_ALIAS		"force_tcp_alias"|"add_tcp_alias"
@@ -312,6 +313,7 @@ EAT_ABLE	[\ \t\b\r]
 								return ROUTE_ONREPLY; }
 <INITIAL>{ROUTE_FAILURE}	{ count(); yylval.strval=yytext;
 								return ROUTE_FAILURE; }
+<INITIAL>{ROUTE_BRANCH} { count(); yylval.strval=yytext; return ROUTE_BRANCH; }
 <INITIAL>{EXEC}	{ count(); yylval.strval=yytext; return EXEC; }
 <INITIAL>{SET_HOST}	{ count(); yylval.strval=yytext; return SET_HOST; }
 <INITIAL>{SET_HOSTPORT}	{ count(); yylval.strval=yytext; return SET_HOSTPORT; }

+ 15 - 0
cfg.y

@@ -149,6 +149,7 @@ static struct socket_id* mk_listen_id(char*, int, int);
 %token ROUTE
 %token ROUTE_FAILURE
 %token ROUTE_ONREPLY
+%token ROUTE_BRANCH
 %token EXEC
 %token SET_HOST
 %token SET_HOSTPORT
@@ -335,6 +336,7 @@ statement:	assign_stm
 		| {rt=REQUEST_ROUTE;} route_stm 
 		| {rt=FAILURE_ROUTE;} failure_route_stm
 		| {rt=ONREPLY_ROUTE;} onreply_route_stm
+		| {rt=BRANCH_ROUTE;} branch_route_stm
 
 		| CR	/* null statement*/
 	;
@@ -870,6 +872,19 @@ onreply_route_stm: ROUTE LBRACE actions RBRACE {
 										}
 		| ROUTE_ONREPLY error { yyerror("invalid onreply_route statement"); }
 	;
+branch_route_stm: ROUTE_BRANCH LBRACE actions RBRACE {
+										push($3, &branch_rlist[DEFAULT_RT]);
+											  }
+				| ROUTE_BRANCH LBRACK NUMBER RBRACK LBRACE actions RBRACE {
+										if (($3<BRANCH_RT_NO)&&($3>=1)){
+											push($6, &branch_rlist[$3]);
+										} else {
+											yyerror("invalid branch routing"
+												"table number");
+											YYABORT; }
+										}
+		| ROUTE_BRANCH error { yyerror("invalid branch_route statement"); }
+	;
 /*
 rules:	rules rule { push($2, &$1); $$=$1; }
 	| rule {$$=$1; }

+ 1 - 0
config.h

@@ -60,6 +60,7 @@
 #define RT_NO 20 /* routing tables number */
 #define FAILURE_RT_NO RT_NO /* on_failure routing tables number */
 #define ONREPLY_RT_NO RT_NO /* on_reply routing tables number */
+#define BRANCH_RT_NO RT_NO /* branch_route routing tables number */
 #define DEFAULT_RT 0 /* default routing table */
 
 #define MAX_REC_LEV 100 /* maximum number of recursive calls */

+ 1 - 1
lump_struct.h

@@ -75,7 +75,7 @@ enum lump_conditions {	COND_FALSE,         /* always false */
 						   proto = protocol (tcp, udp, tls)
 						*/
 
-enum lump_flag { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2 };
+enum lump_flag { LUMPFLAG_NONE=0, LUMPFLAG_DUPED=1, LUMPFLAG_SHMEM=2, LUMPFLAG_BRANCH=4 };
 
 
 struct lump{

+ 18 - 3
route.c

@@ -73,7 +73,7 @@ struct action* rlist[RT_NO];
 /* reply routing table */
 struct action* onreply_rlist[ONREPLY_RT_NO];
 struct action* failure_rlist[FAILURE_RT_NO];
-
+struct action* branch_rlist[BRANCH_RT_NO];
 
 static int fix_actions(struct action* a); /*fwd declaration*/
 
@@ -742,6 +742,13 @@ int fix_rls()
 			}
 		}
 	}
+	for(i=0;i<BRANCH_RT_NO;i++){
+		if(branch_rlist[i]){
+			if ((ret=fix_actions(branch_rlist[i]))!=0){
+				return ret;
+			}
+		}
+	}
 	return 0;
 }
 
@@ -783,6 +790,14 @@ void print_rl()
 		}
 		DBG("\n");
 	}
+	for(j=0; j<BRANCH_RT_NO; j++){
+		if (branch_rlist[j]==0){
+			continue;
+		}
+		DBG("branch routing table %d:\n",j);
+		for (t=branch_rlist[j],i=0; t; i++, t=t->next){
+			print_action(t);
+		}
+		DBG("\n");
+	}
 }
-
-

+ 1 - 0
route.h

@@ -46,6 +46,7 @@ extern struct action* rlist[RT_NO];
 /* main reply route table */
 extern struct action* onreply_rlist[RT_NO];
 extern struct action* failure_rlist[RT_NO];
+extern struct action* branch_rlist[RT_NO];
 
 
 void push(struct action* a, struct action** head);

+ 1 - 0
sr_module.h

@@ -69,6 +69,7 @@ typedef int (*param_func_t)( modparam_t type, void* val);
 #define REQUEST_ROUTE 1  /* Function can be used in request route blocks */
 #define FAILURE_ROUTE 2  /* Function can be used in reply route blocks */
 #define ONREPLY_ROUTE 4  /* Function can be used in on_reply */
+#define BRANCH_ROUTE  8  /* Function can be used in branch_route blocks */
 
 /* Macros - used as rank in child_init function */
 #define PROC_MAIN      0  /* Main ser process */