[Xorp-hackers] [PATCH 14/15] xorp: Add new operators

igorm at etf.rs igorm at etf.rs
Fri Aug 31 04:34:00 PDT 2012


From: Igor Maravic <igorm at etf.rs>

Add operators *, /, <<, >>, &, |, ^, *=, /=, <<=, >>=, &=, |= and ^=.

Operators *=, /=, <<=, >>=, &=, |= and ^= are added to policy metric semantics.

Signed-off-by: Igor Maravic <igorm at etf.rs>
---
 xorp/etc/templates/bgp.tp                 |    4 +-
 xorp/etc/templates/ospfv2.tp              |    2 +-
 xorp/etc/templates/ospfv3.tp              |    2 +-
 xorp/etc/templates/policy.tp              |    2 +-
 xorp/etc/templates/rip.tp                 |    2 +-
 xorp/etc/templates/ripng.tp               |    2 +-
 xorp/policy/backend/backend.ll            |    6 +++
 xorp/policy/backend/backend.yy            |    8 ++++
 xorp/policy/common/operator.cc            |    6 +++
 xorp/policy/common/operator.hh            |    7 +++
 xorp/policy/common/operator_base.hh       |    6 +++
 xorp/policy/common/register_operations.cc |   12 +++++
 xorp/policy/policy.ll                     |   20 ++++++++
 xorp/policy/policy.yy                     |   18 +++++++-
 xorp/rtrmgr/boot.ll                       |    4 +-
 xorp/rtrmgr/config_operators.cc           |   72 ++++++++++++++++++++++++++---
 xorp/rtrmgr/config_operators.hh           |   50 +++++++++++++-------
 17 files changed, 190 insertions(+), 33 deletions(-)

diff --git a/xorp/etc/templates/bgp.tp b/xorp/etc/templates/bgp.tp
index 094fa73..6e1ce8a 100644
--- a/xorp/etc/templates/bgp.tp
+++ b/xorp/etc/templates/bgp.tp
@@ -834,7 +834,7 @@ policy {
 		}
 		med {
 		    %help: short "Set the BGP MED attribute";
-		    %allow-operator: ":" "=" "sub" "add";
+		    %allow-operator: ":" "=" "sub" "add" "mul" "div" "lshift" "rshift" "bit_and" "bit_or" "bit_xor" "+=" "-=" "*=" "/=" "<<=" ">>=" "&=" "|=" "^=";
 		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=med $(<>) $(@);";
 		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=";
 		}
@@ -845,7 +845,7 @@ policy {
 		}
 		localpref {
 		    %help: short "Set the local preference";
-		    %allow-operator: ":" "=" "sub" "add";
+		    %allow-operator: ":" "=" "sub" "add" "mul" "div" "lshift" "rshift" "bit_and" "bit_or" "bit_xor" "+=" "-=" "*=" "/=" "<<=" ">>=" "&=" "|=" "^=";
 		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=localpref $(<>) $(@);";
 		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=";
 		}
diff --git a/xorp/etc/templates/ospfv2.tp b/xorp/etc/templates/ospfv2.tp
index 4d22ec4..44dbbb9 100644
--- a/xorp/etc/templates/ospfv2.tp
+++ b/xorp/etc/templates/ospfv2.tp
@@ -555,7 +555,7 @@ policy {
 	    then {
 		metric {
 		    %help: short "Set the metric value";
-		    %allow-operator: ":" "=" "sub" "add";
+		    %allow-operator: ":" "=" "sub" "add" "mul" "div" "lshift" "rshift" "bit_and" "bit_or" "bit_xor" "+=" "-=" "*=" "/=" "<<=" ">>=" "&=" "|=" "^=";
 		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=metric $(<>) $(@);";
 		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=";
 		}
diff --git a/xorp/etc/templates/ospfv3.tp b/xorp/etc/templates/ospfv3.tp
index f6ffc13..fec27fb 100644
--- a/xorp/etc/templates/ospfv3.tp
+++ b/xorp/etc/templates/ospfv3.tp
@@ -430,7 +430,7 @@ policy {
 	    then {
 		metric {
 		    %help: short "Set the metric value";
-		    %allow-operator: ":" "=" "sub" "add";
+		    %allow-operator: ":" "=" "sub" "add" "mul" "div" "lshift" "rshift" "bit_and" "bit_or" "bit_xor" "+=" "-=" "*=" "/=" "<<=" ">>=" "&=" "|=" "^=";
 		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=metric $(<>) $(@);";
 		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=";
 		}
diff --git a/xorp/etc/templates/policy.tp b/xorp/etc/templates/policy.tp
index b48bcaa..3f1b6b8 100644
--- a/xorp/etc/templates/policy.tp
+++ b/xorp/etc/templates/policy.tp
@@ -276,7 +276,7 @@ policy {
 
 		tag {
 		    %help: short "Tag value";
-		    %allow-operator: ":" "=" "add" "sub";
+		    %allow-operator: ":" "=" "sub" "add" "mul" "div" "lshift" "rshift" "bit_and" "bit_or" "bit_xor" "+=" "-=" "*=" "/=" "<<=" ">>=" "&=" "|=" "^=";
 		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=tag $(<>) $(@);";
 		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=";
 		}
diff --git a/xorp/etc/templates/rip.tp b/xorp/etc/templates/rip.tp
index 03e5ff7..aff2763 100644
--- a/xorp/etc/templates/rip.tp
+++ b/xorp/etc/templates/rip.tp
@@ -339,7 +339,7 @@ policy {
 	    then {
 		metric {
 		    %help: short "Set the metric value";
-		    %allow-operator: ":" "=" "sub" "add";
+		    %allow-operator: ":" "=" "sub" "add" "mul" "div" "lshift" "rshift" "bit_and" "bit_or" "bit_xor" "+=" "-=" "*=" "/=" "<<=" ">>=" "&=" "|=" "^=";
 		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=metric $(<>) $(@);";
 		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=";
 		}
diff --git a/xorp/etc/templates/ripng.tp b/xorp/etc/templates/ripng.tp
index e130a70..a0b3d3c 100644
--- a/xorp/etc/templates/ripng.tp
+++ b/xorp/etc/templates/ripng.tp
@@ -287,7 +287,7 @@ policy {
 	    then {
 		metric {
 		    %help: short "Set the metric value";
-		    %allow-operator: ":" "=" "sub" "add";
+		    %allow-operator: ":" "=" "sub" "add" "mul" "div" "lshift" "rshift" "bit_and" "bit_or" "bit_xor" "+=" "-=" "*=" "/=" "<<=" ">>=" "&=" "|=" "^=";
 		    %set: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=metric $(<>) $(@);";
 		    %delete: xrl "$(policy.targetname)/policy/0.1/update_term_block?policy:txt=$(policy-statement.@)&term:txt=$(term.@)&block:u32=2&order:txt=$(#)&statement:txt=";
 		}
diff --git a/xorp/policy/backend/backend.ll b/xorp/policy/backend/backend.ll
index a874ec2..e369ff7 100644
--- a/xorp/policy/backend/backend.ll
+++ b/xorp/policy/backend/backend.ll
@@ -71,6 +71,8 @@ namespace {
 "SUBR_START"			{ return YY_SUBR_START; }
 "SUBR_END"			{ return YY_SUBR_END; }
 
+"<<"		{ return YY_LSHIFT; }
+">>"		{ return YY_RSHIFT; }
 "=="		{ return YY_EQ; }
 "!="		{ return YY_NE; }
 "<"		{ return YY_LT; }
@@ -80,6 +82,10 @@ namespace {
 "+"		{ return YY_ADD; }
 "\-"		{ return YY_SUB; }
 "*"		{ return YY_MUL; }
+"/"		{ return YY_DIV; }
+"&"		{ return YY_BITAND; }
+"|"		{ return YY_BITOR; }
+"^"		{ return YY_BITXOR; }
 
 "\n"		{ _parser_lineno++; return YY_NEWLINE; }
 
diff --git a/xorp/policy/backend/backend.yy b/xorp/policy/backend/backend.yy
index 844e81e..e18fb6b 100644
--- a/xorp/policy/backend/backend.yy
+++ b/xorp/policy/backend/backend.yy
@@ -35,6 +35,8 @@ static ElementFactory	_ef;
 %token YY_EQ YY_NE YY_LT YY_GT YY_LE YY_GE
 %token YY_NOT YY_AND YY_OR YY_XOR YY_HEAD YY_CTR YY_NE_INT
 %token YY_ADD YY_SUB YY_MUL
+%token YY_DIV YY_LSHIFT YY_RSHIFT
+%token YY_BITAND YY_BITOR YY_BITXOR
 %token YY_ONFALSE_EXIT
 %token YY_REGEX
 %token YY_LOAD YY_STORE
@@ -169,6 +171,12 @@ statement:
 	| YY_ADD	{ _yy_instructions->push_back(new NaryInstr(new OpAdd)); }
 	| YY_SUB	{ _yy_instructions->push_back(new NaryInstr(new OpSub)); }
 	| YY_MUL	{ _yy_instructions->push_back(new NaryInstr(new OpMul)); }
+	| YY_DIV	{ _yy_instructions->push_back(new NaryInstr(new OpDiv)); }
+	| YY_LSHIFT	{ _yy_instructions->push_back(new NaryInstr(new OpLShift)); }
+	| YY_RSHIFT	{ _yy_instructions->push_back(new NaryInstr(new OpRShift)); }
+	| YY_BITAND	{ _yy_instructions->push_back(new NaryInstr(new OpBitAnd)); }
+	| YY_BITOR	{ _yy_instructions->push_back(new NaryInstr(new OpBitOr)); }
+	| YY_BITXOR	{ _yy_instructions->push_back(new NaryInstr(new OpBitXor)); }
 	| YY_HEAD	{ _yy_instructions->push_back(new NaryInstr(new OpHead));}
 	| YY_CTR	{ _yy_instructions->push_back(new NaryInstr(new OpCtr));}
 	| YY_NE_INT	{ _yy_instructions->push_back(new NaryInstr(new OpNEInt));}
diff --git a/xorp/policy/common/operator.cc b/xorp/policy/common/operator.cc
index 43b76c4..452bc1c 100644
--- a/xorp/policy/common/operator.cc
+++ b/xorp/policy/common/operator.cc
@@ -40,6 +40,12 @@ Oper::Hash OpGe::_hash	    = HASH_OP_GE;
 Oper::Hash OpAdd::_hash	    = HASH_OP_ADD;
 Oper::Hash OpSub::_hash	    = HASH_OP_SUB;
 Oper::Hash OpMul::_hash	    = HASH_OP_MUL;
+Oper::Hash OpDiv::_hash	    = HASH_OP_DIV;
+Oper::Hash OpLShift::_hash  = HASH_OP_LSHIFT;
+Oper::Hash OpRShift::_hash  = HASH_OP_RSHIFT;
+Oper::Hash OpBitAnd::_hash  = HASH_OP_BITAND;
+Oper::Hash OpBitOr::_hash   = HASH_OP_BITOR;
+Oper::Hash OpBitXor::_hash   = HASH_OP_BITXOR;
 
 Oper::Hash OpRegex::_hash   = HASH_OP_REGEX;
 Oper::Hash OpCtr::_hash	    = HASH_OP_CTR;
diff --git a/xorp/policy/common/operator.hh b/xorp/policy/common/operator.hh
index c7008b7..5bdbea5 100644
--- a/xorp/policy/common/operator.hh
+++ b/xorp/policy/common/operator.hh
@@ -59,6 +59,13 @@ DEFINE_BINOPER(OpGe,>=)
 DEFINE_BINOPER(OpAdd,+)
 DEFINE_BINOPER(OpSub,-)
 DEFINE_BINOPER(OpMul,*)
+DEFINE_BINOPER(OpDiv,/)
+DEFINE_BINOPER(OpLShift,<<)
+DEFINE_BINOPER(OpRShift,>>)
+DEFINE_BINOPER(OpBitAnd,&)
+DEFINE_BINOPER(OpBitOr,|)
+DEFINE_BINOPER(OpBitXor,^)
+
 
 // Regular expression operator
 DEFINE_BINOPER(OpRegex,REGEX)
diff --git a/xorp/policy/common/operator_base.hh b/xorp/policy/common/operator_base.hh
index 86ba32c..63e02fb 100644
--- a/xorp/policy/common/operator_base.hh
+++ b/xorp/policy/common/operator_base.hh
@@ -42,6 +42,12 @@ enum {
     HASH_OP_ADD,
     HASH_OP_SUB,
     HASH_OP_MUL,
+    HASH_OP_DIV,
+    HASH_OP_LSHIFT,
+    HASH_OP_RSHIFT,
+    HASH_OP_BITAND,
+    HASH_OP_BITOR,
+    HASH_OP_BITXOR,
     HASH_OP_REGEX,
     HASH_OP_CTR,
     HASH_OP_NEINT,
diff --git a/xorp/policy/common/register_operations.cc b/xorp/policy/common/register_operations.cc
index 78e882d..effd12b 100644
--- a/xorp/policy/common/register_operations.cc
+++ b/xorp/policy/common/register_operations.cc
@@ -109,6 +109,12 @@ DEFINE_BINOP_BOOL(op_ge, >=)
 DEFINE_BINOP(op_add,+)
 DEFINE_BINOP(op_sub,-)
 DEFINE_BINOP(op_mul,*)
+DEFINE_BINOP(op_div,/)
+DEFINE_BINOP(op_lshift,<<)
+DEFINE_BINOP(op_rshift,>>)
+DEFINE_BINOP(op_bit_and,&);
+DEFINE_BINOP(op_bit_or,|);
+DEFINE_BINOP(op_bit_xor,^);
 
 // Operations for which .val() is not needed. [operation performed on element
 // itself].
@@ -457,6 +463,12 @@ do {									\
     ADD_BINOP(arg,arg,arg,op_add,Add);					\
     ADD_BINOP(arg,arg,arg,op_sub,Sub);					\
     ADD_BINOP(arg,arg,arg,op_mul,Mul);					\
+    ADD_BINOP(arg,arg,arg,op_div,Div);					\
+    ADD_BINOP(arg,arg,arg,op_lshift,LShift);				\
+    ADD_BINOP(arg,arg,arg,op_rshift,RShift);				\
+    ADD_BINOP(arg,arg,arg,op_bit_and,BitAnd);				\
+    ADD_BINOP(arg,arg,arg,op_bit_or,BitOr);				\
+    ADD_BINOP(arg,arg,arg,op_bit_xor,BitXor);					\
 } while (0)
 
     disp.add<ElemBool,&operations::op_not>(OpNot());
diff --git a/xorp/policy/policy.ll b/xorp/policy/policy.ll
index 3f29934..05e61f0 100644
--- a/xorp/policy/policy.ll
+++ b/xorp/policy/policy.ll
@@ -139,6 +139,8 @@ RE_IPV6NET      {RE_IPV6}\/{RE_IPV6_PREFIXLEN}
 		  	return YY_EQ;
 		}
 
+"<<"	return YY_LSHIFT;
+">>"	return YY_RSHIFT;
 "("		return YY_LPAR;
 ")"		return YY_RPAR;
 "=="		return YY_EQ; 
@@ -153,9 +155,20 @@ RE_IPV6NET      {RE_IPV6}\/{RE_IPV6_PREFIXLEN}
 "="		return YY_ASSIGN;
 "+="		return YY_PLUS_EQUALS;
 "-="		return YY_MINUS_EQUALS;
+"*="		return YY_MUL_EQUALS;
+"/="		return YY_DIV_EQUALS;
+"<<="		return YY_LSHIFT_EQUALS;
+">>="		return YY_RSHIFT_EQUALS;
+"&="		return YY_BITAND_EQUALS;
+"|="		return YY_BITOR_EQUALS;
+"^="		return YY_BITXOR_EQUALS;
 "||"		return YY_OR;
 "&&"		return YY_AND;
 "!"		return YY_NOT;
+"/"		return YY_DIV;
+"&"		return YY_BITAND;
+"|"		return YY_BITOR;
+"^"		return YY_BITXOR;
 
 "exact"		return YY_IPNET_EQ;
 "longer"	return YY_IPNET_LT;
@@ -168,6 +181,13 @@ RE_IPV6NET      {RE_IPV6}\/{RE_IPV6_PREFIXLEN}
 "not"		return YY_NOT;
 "add"		return YY_PLUS_EQUALS;
 "sub"		return YY_MINUS_EQUALS;
+"mul"		return YY_MUL_EQUALS;
+"div"		return YY_DIV_EQUALS;
+"lshift"	return YY_LSHIFT_EQUALS;
+"rshift"	return YY_RSHIFT_EQUALS;
+"bit_and"	return YY_BITAND_EQUALS;
+"bit_or"	return YY_BITOR_EQUALS;
+"bit_xor"	return YY_BITXOR_EQUALS;
 "head"		return YY_HEAD;
 "ctr"		return YY_CTR;
 "ne_int"	return YY_NE_INT;
diff --git a/xorp/policy/policy.yy b/xorp/policy/policy.yy
index 1d055e3..8c73246 100644
--- a/xorp/policy/policy.yy
+++ b/xorp/policy/policy.yy
@@ -36,12 +36,15 @@ static ElementFactory _ef;
 %token <c_str> YY_IPV4 YY_IPV4RANGE YY_IPV4NET YY_IPV6 YY_IPV6RANGE YY_IPV6NET
 %token YY_SEMICOLON YY_LPAR YY_RPAR YY_ASSIGN YY_SET YY_REGEX
 %token YY_ACCEPT YY_REJECT YY_PROTOCOL YY_NEXT YY_POLICY YY_PLUS_EQUALS
+%token YY_MUL_EQUALS YY_DIV_EQUALS YY_LSHIFT_EQUALS YY_RSHIFT_EQUALS
+%token YY_BITAND_EQUALS YY_BITOR_EQUALS YY_BITXOR_EQUALS
 %token YY_MINUS_EQUALS YY_TERM
 
 %left YY_NOT YY_AND YY_XOR YY_OR YY_HEAD YY_CTR YY_NE_INT
 %left YY_EQ YY_NE YY_LE YY_GT YY_LT YY_GE
 %left YY_IPNET_EQ YY_IPNET_LE YY_IPNET_GT YY_IPNET_LT YY_IPNET_GE
-%left YY_ADD YY_SUB
+%left YY_ADD YY_SUB YY_DIV YY_LSHIFT YY_RSHIFT
+%left YY_BITAND YY_BITOR YY_BITXOR
 %left YY_MUL
 
 %type <node> actionstatement action boolstatement boolexpr expr assignexpr
@@ -77,6 +80,13 @@ assignop:
 	  YY_ASSIGN		{ $$ = NULL; }
 	| YY_PLUS_EQUALS	{ $$ = new OpAdd; }
 	| YY_MINUS_EQUALS	{ $$ = new OpSub; }
+	| YY_MUL_EQUALS	{ $$ = new OpMul; }
+	| YY_DIV_EQUALS	{ $$ = new OpDiv; }
+	| YY_LSHIFT_EQUALS	{ $$ = new OpLShift; }
+	| YY_RSHIFT_EQUALS	{ $$ = new OpRShift; }
+	| YY_BITAND_EQUALS	{ $$ = new OpBitAnd; }
+	| YY_BITOR_EQUALS	{ $$ = new OpBitOr; }	
+	| YY_BITXOR_EQUALS	{ $$ = new OpBitXor; }
 	;
 
 boolstatement:
@@ -117,6 +127,12 @@ expr:
 	  expr YY_ADD expr { $$ = new NodeBin(new OpAdd,$1,$3,_parser_lineno); }
 	| expr YY_SUB expr { $$ = new NodeBin(new OpSub,$1,$3,_parser_lineno); }
 	| expr YY_MUL expr { $$ = new NodeBin(new OpMul,$1,$3,_parser_lineno); }
+	| expr YY_DIV expr { $$ = new NodeBin(new OpDiv,$1,$3,_parser_lineno); }
+	| expr YY_LSHIFT expr { $$ = new NodeBin(new OpLShift,$1,$3,_parser_lineno); }
+	| expr YY_RSHIFT expr { $$ = new NodeBin(new OpRShift,$1,$3,_parser_lineno); }
+	| expr YY_BITAND expr { $$ = new NodeBin(new OpBitAnd,$1,$3,_parser_lineno); }
+	| expr YY_BITOR expr { $$ = new NodeBin(new OpBitOr,$1,$3,_parser_lineno); }
+	| expr YY_BITXOR expr { $$ = new NodeBin(new OpBitXor,$1,$3,_parser_lineno); }
 
 	| YY_HEAD expr { $$ = new NodeUn(new OpHead, $2, _parser_lineno); }
 	| YY_CTR expr expr { $$ = new NodeBin(new OpCtr, $2, $3, _parser_lineno); }
diff --git a/xorp/rtrmgr/boot.ll b/xorp/rtrmgr/boot.ll
index 6e682ae..a9a3398 100644
--- a/xorp/rtrmgr/boot.ll
+++ b/xorp/rtrmgr/boot.ll
@@ -243,8 +243,8 @@ RE_URL_SUBDELIMS "!"|"$"|"&"|"'"|"("|")"|"*"|"+"|","|";"|"="
  */
 RE_COMPARATOR		"<"|">"|("<"+"=")|(">"+"=")|("="+"=")|("!"+"=")
 RE_IPNET_COMPARATOR	"exact"|"not"|"shorter"|"orshorter"|"longer"|"orlonger"
-RE_BIN_OPERATOR		"+"|"-"|"*"|"/"
-RE_MODIFIER		":"|"add"|"sub"|"set"|"del"|"="
+RE_BIN_OPERATOR		"+"|"-"|"*"|"/"|"<<"|">>"|"&"|"^"|"|"
+RE_MODIFIER		":"|"add"|"sub"|"mul"|"div"|"lshift"|"rshift"|"bit_and"|"bit_or"|"bit_xor"|"set"|"del"|"="|"+="|"-="|"*="|"/="|"<<="|">>="|"&="|"|="|"^="
 RE_INFIX_OPERATOR	{RE_COMPARATOR}|{RE_IPNET_COMPARATOR}|{RE_BIN_OPERATOR}|{RE_MODIFIER}
 RE_ARITH_OPERATOR	[" "]*({RE_BIN_OPERATOR})[" "]*
 
diff --git a/xorp/rtrmgr/config_operators.cc b/xorp/rtrmgr/config_operators.cc
index bd383d8..2df51bb 100644
--- a/xorp/rtrmgr/config_operators.cc
+++ b/xorp/rtrmgr/config_operators.cc
@@ -61,9 +61,41 @@ operator_to_str(ConfigOperator op)
     case OP_ASSIGN:
 	return string(":");
     case OP_ADD:
-	return string("add");
+	return string("+");
+    case OP_ADD_EQ:
+	return string("+=");
     case OP_SUB:
-	return string("sub");
+	return string("-");
+    case OP_SUB_EQ:
+	return string("-=");
+    case OP_MUL:
+	return string("*");
+    case OP_MUL_EQ:
+	return string("*=");
+    case OP_DIV:
+	return string("/");
+    case OP_DIV_EQ:
+	return string("/=");
+    case OP_LSHIFT:
+	return string("<<");
+    case OP_LSHIFT_EQ:
+	return string("<<=");
+    case OP_RSHIFT:
+	return string(">>");
+    case OP_RSHIFT_EQ:
+	return string(">>=");
+    case OP_BITAND:
+	return string("&");
+    case OP_BITAND_EQ:
+	return string("&=");
+    case OP_BITOR:
+	return string("|");
+    case OP_BITOR_EQ:
+	return string("|=");
+    case OP_BITXOR:
+	return string("^");
+    case OP_BITXOR_EQ:
+	return string("^=");
     case OP_DEL:
 	return string("del");
     }
@@ -103,12 +135,40 @@ lookup_operator(const string& s) throw (ParseError)
 	return OP_ASSIGN;
     } else if (s == "+") {
 	return OP_ADD;
-    } else if (s == "add") {
-	return OP_ADD;
+    } else if (s == "add" || s == "+=") {
+	return OP_ADD_EQ;
     } else if (s == "-") {
 	return OP_SUB;
-    } else if (s == "sub") {
-	return OP_SUB;
+    } else if (s == "sub" || s == "-=") {
+	return OP_SUB_EQ;
+    } else if (s == "*") {
+	return OP_MUL;
+    } else if (s == "mul" || s == "*=") {
+	return OP_MUL_EQ;
+    } else if (s == "/") {
+	return OP_DIV;
+    } else if (s == "div" || s == "/=") {
+	return OP_DIV_EQ;
+    } else if (s == "<<") {
+	return OP_LSHIFT;
+    } else if (s == "lshift" || s == "<<=") {
+	return OP_LSHIFT_EQ;
+    } else if (s == ">>") {
+	return OP_RSHIFT;
+    } else if (s == "rshift" || s == ">>=") {
+	return OP_RSHIFT_EQ;
+    } else if (s == "&") {
+	return OP_BITAND;
+    } else if (s == "bit_and" || s == "&=") {
+	return OP_BITAND_EQ;
+    } else if (s == "|") {
+	return OP_BITOR;
+    } else if (s == "bit_or" || s == "|=") {
+	return OP_BITOR_EQ;
+    } else if (s == "^") {
+	return OP_BITXOR;
+    } else if (s == "bit_xor" || s == "^=") {
+	return OP_BITXOR_EQ;
     } else if (s == "del") {
 	return OP_DEL;
     }
diff --git a/xorp/rtrmgr/config_operators.hh b/xorp/rtrmgr/config_operators.hh
index 72d8e70..9a9fdd8 100644
--- a/xorp/rtrmgr/config_operators.hh
+++ b/xorp/rtrmgr/config_operators.hh
@@ -31,24 +31,40 @@
 // XXX: Comparators must be less than modifiers.
 //
 enum ConfigOperator {
-    OP_NONE		= 0,
-    OP_EQ		= 1,
-    OP_NE		= 2,
-    OP_LT		= 3,
-    OP_LTE		= 4,
-    OP_GT		= 5,
-    OP_GTE		= 6,
-    OP_IPNET_EQ		= 7,
-    OP_IPNET_NE		= 8,
-    OP_IPNET_LT		= 9,
-    OP_IPNET_GT		= 10,
-    OP_IPNET_LE		= 11,
-    OP_IPNET_GE		= 12,
+    OP_NONE	= 0,
+    OP_EQ,
+    OP_NE,
+    OP_LT,
+    OP_LTE,
+    OP_GT,
+    OP_GTE,
+    OP_IPNET_EQ,
+    OP_IPNET_NE,
+    OP_IPNET_LT,
+    OP_IPNET_GT,
+    OP_IPNET_LE,
+    OP_IPNET_GE,
     MAX_COMPARATOR	= OP_IPNET_GE,
-    OP_ASSIGN		= 101,
-    OP_ADD		= 102,
-    OP_SUB		= 103,
-    OP_DEL		= 104,
+    OP_ASSIGN	= 101,
+    OP_ADD,
+    OP_ADD_EQ,
+    OP_SUB,
+    OP_SUB_EQ,
+    OP_MUL,
+    OP_MUL_EQ,
+    OP_DIV,
+    OP_DIV_EQ,
+    OP_LSHIFT,
+    OP_LSHIFT_EQ,
+    OP_RSHIFT,
+    OP_RSHIFT_EQ,
+    OP_BITAND,
+    OP_BITAND_EQ,
+    OP_BITOR,
+    OP_BITOR_EQ,
+    OP_BITXOR,
+    OP_BITXOR_EQ,
+    OP_DEL,
     MAX_MODIFIER	= OP_DEL
 };
 
-- 
1.7.9.5



More information about the Xorp-hackers mailing list