Tizen 2.1 base
[platform/upstream/libnl2.git] / lib / route / pktloc_syntax.y
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 %{
24 extern int pktloc_lex(YYSTYPE *, YYLTYPE *, void *);
25 extern void rtnl_pktloc_add(struct rtnl_pktloc *);
26
27 static 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
45 input:
46         def
47                 { }
48         ;
49
50 def:
51         /* empty */
52                 { }
53         | location def
54                 { }
55         ;
56
57 location:
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
96 layer:
97         /* empty */
98                 { $$ = TCF_LAYER_NETWORK; }
99         | LAYER '+' 
100                 { $$ = $1; }
101         ;
102
103 mask:
104         /* empty */
105                 { $$ = 0; }
106         | NUMBER
107                 { $$ = $1; }
108         ;