From: Francis Dupont Date: Fri, 24 Nov 2017 08:32:35 +0000 (+0100) Subject: [5374] Updated flex/bison X-Git-Tag: trac5458a_base~14^2~29 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=114607aefa384b53b4dfd6ebfd549435c77b174b;p=thirdparty%2Fkea.git [5374] Updated flex/bison --- diff --git a/src/lib/eval/lexer.ll b/src/lib/eval/lexer.ll index b7447ea2bc..d990b013eb 100644 --- a/src/lib/eval/lexer.ll +++ b/src/lib/eval/lexer.ll @@ -204,6 +204,7 @@ addr6 [0-9a-fA-F]*\:[0-9a-fA-F]*\:[0-9a-fA-F:.]* "not" return isc::eval::EvalParser::make_NOT(loc); "and" return isc::eval::EvalParser::make_AND(loc); "or" return isc::eval::EvalParser::make_OR(loc); +"member" return isc::eval::EvalParser::make_MEMBER(loc); "." return isc::eval::EvalParser::make_DOT(loc); "(" return isc::eval::EvalParser::make_LPAREN(loc); ")" return isc::eval::EvalParser::make_RPAREN(loc); diff --git a/src/lib/eval/parser.yy b/src/lib/eval/parser.yy index 96f8c52668..a201d5aaad 100644 --- a/src/lib/eval/parser.yy +++ b/src/lib/eval/parser.yy @@ -47,6 +47,7 @@ using namespace isc::eval; OPTION "option" RELAY4 "relay4" RELAY6 "relay6" + MEMBER "member" PEERADDR "peeraddr" LINKADDR "linkaddr" LBRACKET "[" @@ -212,6 +213,21 @@ bool_expr : "(" bool_expr ")" TokenPtr exist(new TokenVendor(ctx.getUniverse(), $3, TokenOption::EXISTS, $8)); ctx.expression.push_back(exist); } + | MEMBER "(" STRING ")" + { + // Expression member('foo') + // + // This token will check if the packet is a member of + // the specified client class. + // To avoid loops at evaluation only already known and + // built-in classes are allowed. + std::string cc = $3; + if (!ctx.isClientClassKnown(cc)) { + error(@3, "Unknown client class '" + cc + "'"); + } + TokenPtr member(new TokenMember(cc)); + ctx.expression.push_back(member) + } ; string_expr : STRING