From: Igor Maravic <[email protected]>

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

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

Signed-off-by: Igor Maravic <[email protected]>
---
 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

_______________________________________________
Xorp-hackers mailing list
[email protected]
http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers

Reply via email to