1db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%{
2db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf#include <netlink-local.h>
3db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf#include <netlink-tc.h>
4db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf#include <netlink/netlink.h>
5db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf#include <netlink/utils.h>
6db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf#include <netlink/route/pktloc.h>
7db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%}
8db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
9db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%locations
10db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%error-verbose
11db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%define api.pure
12db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%name-prefix "pktloc_"
13db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
14db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%parse-param {void *scanner}
15db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%lex-param {void *scanner}
16db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
17db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%union {
18db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	struct rtnl_pktloc *l;
19db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	uint32_t i;
20db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	char *s;
21db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf}
22db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
23db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%{
24db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Grafextern int pktloc_lex(YYSTYPE *, YYLTYPE *, void *);
25db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Grafextern void rtnl_pktloc_add(struct rtnl_pktloc *);
26db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
27db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Grafstatic void yyerror(YYLTYPE *locp, void *scanner, const char *msg)
28db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf{
29db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	/* FIXME */
30db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf}
31db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%}
32db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
33db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%token <i> ERROR NUMBER LAYER
34db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%token <s> NAME
35db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
36db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%type <i> mask layer
37db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%type <l> location
38db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
39db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%destructor { free($$); } NAME
40db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
41db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%start input
42db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
43db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf%%
44db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
45db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Grafinput:
46db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	def
47db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{ }
48db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	;
49db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
50db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Grafdef:
51db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	/* empty */
52db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{ }
53db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	| location def
54db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{ }
55db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	;
56db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
57db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graflocation:
58db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	NAME NAME layer NUMBER mask
59db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{
60db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			struct rtnl_pktloc *loc;
61db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
62db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			if (!(loc = calloc(1, sizeof(*loc)))) {
63db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				/* FIXME */
64db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			}
65db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
66db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			if (!strcasecmp($2, "u8"))
67db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->align = TCF_EM_ALIGN_U8;
68db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			else if (!strcasecmp($2, "h8")) {
69db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->align = TCF_EM_ALIGN_U8;
70db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->flags = TCF_EM_CMP_TRANS;
71db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			} else if (!strcasecmp($2, "u16"))
72db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->align = TCF_EM_ALIGN_U16;
73db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			else if (!strcasecmp($2, "h16")) {
74db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->align = TCF_EM_ALIGN_U16;
75db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->flags = TCF_EM_CMP_TRANS;
76db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			} else if (!strcasecmp($2, "u32"))
77db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->align = TCF_EM_ALIGN_U32;
78db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			else if (!strcasecmp($2, "h32")) {
79db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->align = TCF_EM_ALIGN_U32;
80db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf				loc->flags = TCF_EM_CMP_TRANS;
81db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			}
82db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
83db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			free($2);
84db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
85db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			loc->name = $1;
86db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			loc->layer = $3;
87db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			loc->offset = $4;
88db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			loc->mask = $5;
89db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
90db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			rtnl_pktloc_add(loc);
91db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
92db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf			$$ = loc;
93db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		}
94db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	;
95db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
96db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graflayer:
97db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	/* empty */
98db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{ $$ = TCF_LAYER_NETWORK; }
99db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	| LAYER '+'
100db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{ $$ = $1; }
101db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	;
102db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf
103db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Grafmask:
104db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	/* empty */
105db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{ $$ = 0; }
106db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	| NUMBER
107db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf		{ $$ = $1; }
108db5bd57899affbcaf42ac0b93c5c7be8f51ca390Thomas Graf	;
109