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