xref: /aosp_15_r20/external/libnl/lib/route/pktloc_syntax.y (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
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