[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