• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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