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