You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
1.5 KiB
104 lines
1.5 KiB
%{
|
|
#include <netlink-private/netlink.h>
|
|
#include <netlink-private/tc.h>
|
|
#include <netlink/netlink.h>
|
|
#include <netlink/utils.h>
|
|
#include <netlink/route/pktloc.h>
|
|
%}
|
|
|
|
%locations
|
|
%error-verbose
|
|
%define api.pure
|
|
%name-prefix "pktloc_"
|
|
|
|
%parse-param {void *scanner}
|
|
%lex-param {void *scanner}
|
|
%expect 1
|
|
|
|
%union {
|
|
struct rtnl_pktloc *l;
|
|
uint32_t i;
|
|
char *s;
|
|
}
|
|
|
|
%{
|
|
extern int pktloc_lex(YYSTYPE *, YYLTYPE *, void *);
|
|
|
|
static void yyerror(YYLTYPE *locp, void *scanner, const char *msg)
|
|
{
|
|
NL_DBG(1, "Error while parsing packet location file: %s\n", msg);
|
|
}
|
|
%}
|
|
|
|
%token <i> ERROR NUMBER LAYER ALIGN
|
|
%token <s> NAME
|
|
|
|
%type <i> mask layer align shift
|
|
%type <l> location
|
|
|
|
%destructor { free($$); } NAME
|
|
|
|
%start input
|
|
|
|
%%
|
|
|
|
input:
|
|
/* empty */
|
|
| location input
|
|
;
|
|
|
|
location:
|
|
NAME align layer NUMBER mask shift
|
|
{
|
|
struct rtnl_pktloc *loc;
|
|
|
|
if (!(loc = rtnl_pktloc_alloc())) {
|
|
NL_DBG(1, "Allocating a packet location "
|
|
"object failed.\n");
|
|
YYABORT;
|
|
}
|
|
|
|
loc->name = $1;
|
|
loc->align = $2;
|
|
loc->layer = $3;
|
|
loc->offset = $4;
|
|
loc->mask = $5;
|
|
loc->shift = $6;
|
|
|
|
if (rtnl_pktloc_add(loc) < 0) {
|
|
NL_DBG(1, "Duplicate packet location entry "
|
|
"\"%s\"\n", $1);
|
|
}
|
|
|
|
$$ = loc;
|
|
}
|
|
;
|
|
|
|
align:
|
|
ALIGN
|
|
{ $$ = $1; }
|
|
| NUMBER
|
|
{ $$ = $1; }
|
|
;
|
|
|
|
layer:
|
|
/* empty */
|
|
{ $$ = TCF_LAYER_NETWORK; }
|
|
| LAYER '+'
|
|
{ $$ = $1; }
|
|
;
|
|
|
|
mask:
|
|
/* empty */
|
|
{ $$ = 0; }
|
|
| NUMBER
|
|
{ $$ = $1; }
|
|
;
|
|
|
|
shift:
|
|
/* empty */
|
|
{ $$ = 0; }
|
|
| NUMBER
|
|
{ $$ = $1; }
|
|
;
|