1 %{
2 #include <netlink-private/netlink.h>
3 #include <netlink-private/tc.h>
4 #include <netlink/netlink.h>
5 #include <netlink/utils.h>
6 #include <netlink/route/pktloc.h>
7 %}
8
9 %locations
10 %error-verbose
11 %define api.pure
12 %name-prefix "pktloc_"
13
14 %parse-param {void *scanner}
15 %lex-param {void *scanner}
16 %expect 1
17
18 %union {
19 struct rtnl_pktloc *l;
20 uint32_t i;
21 char *s;
22 }
23
24 %{
25 extern int pktloc_lex(YYSTYPE *, YYLTYPE *, void *);
26
yyerror(YYLTYPE * locp,void * scanner,const char * msg)27 static void yyerror(YYLTYPE *locp, void *scanner, const char *msg)
28 {
29 NL_DBG(1, "Error while parsing packet location file: %s\n", msg);
30 }
31 %}
32
33 %token <i> ERROR NUMBER LAYER ALIGN
34 %token <s> NAME
35
36 %type <i> mask layer align shift
37 %type <l> location
38
39 %destructor { free($$); } NAME
40
41 %start input
42
43 %%
44
45 input:
46 /* empty */
47 | location input
48 ;
49
50 location:
51 NAME align layer NUMBER mask shift
52 {
53 struct rtnl_pktloc *loc;
54
55 if (!(loc = rtnl_pktloc_alloc())) {
56 NL_DBG(1, "Allocating a packet location "
57 "object failed.\n");
58 YYABORT;
59 }
60
61 loc->name = $1;
62 loc->align = $2;
63 loc->layer = $3;
64 loc->offset = $4;
65 loc->mask = $5;
66 loc->shift = $6;
67
68 if (rtnl_pktloc_add(loc) < 0) {
69 NL_DBG(1, "Duplicate packet location entry "
70 "\"%s\"\n", $1);
71 }
72
73 $$ = loc;
74 }
75 ;
76
77 align:
78 ALIGN
79 { $$ = $1; }
80 | NUMBER
81 { $$ = $1; }
82 ;
83
84 layer:
85 /* empty */
86 { $$ = TCF_LAYER_NETWORK; }
87 | LAYER '+'
88 { $$ = $1; }
89 ;
90
91 mask:
92 /* empty */
93 { $$ = 0; }
94 | NUMBER
95 { $$ = $1; }
96 ;
97
98 shift:
99 /* empty */
100 { $$ = 0; }
101 | NUMBER
102 { $$ = $1; }
103 ;
104