1/*
2 * lib/route/cls/ematch_grammar.l	ematch expression grammar
3 *
4 *	This library is free software; you can redistribute it and/or
5 *	modify it under the terms of the GNU Lesser General Public
6 *	License as published by the Free Software Foundation version 2.1
7 *	of the License.
8 *
9 * Copyright (c) 2010-2013 Thomas Graf <tgraf@suug.ch>
10 */
11
12%{
13 #include <netlink-private/netlink.h>
14 #include <netlink-private/tc.h>
15 #include <netlink/netlink.h>
16 #include <netlink/route/cls/ematch.h>
17 #include <netlink/route/cls/ematch/cmp.h>
18 #include "ematch_syntax.h"
19%}
20
21%option 8bit
22%option reentrant
23%option warn
24%option noyywrap
25%option noinput
26%option nounput
27%option bison-bridge
28%option prefix="ematch_"
29
30%x QUOTE
31
32%%
33
34[ \t\r\n]+
35
36\"			{
37				NL_DBG(4, "Beginning of quote\n");
38				yylval->q.len = 32;
39				if (!(yylval->q.data = calloc(1, yylval->q.len)))
40					return ERROR;
41
42				yylval->q.index = 0;
43				BEGIN(QUOTE);
44			}
45
46<QUOTE>[^\\\n\"]+	{
47				memcpy(yylval->q.data + yylval->q.index, yytext,
48				       strlen(yytext));
49				yylval->q.index += strlen(yytext);
50			}
51
52<QUOTE>\"		{
53				BEGIN(0);
54				return QUOTED;
55			}
56
57
58[[:digit:]]+		|
590[xX][[:xdigit:]]+	{
60				yylval->i = strtoul(yytext, NULL, 0);
61				return NUMBER;
62			}
63
64eq			|
65"="			return KW_EQ;
66gt			|
67">"			return KW_GT;
68lt			|
69"<"			return KW_LT;
70
71[aA][nN][dD]		|
72"&&"			{ yylval->i = TCF_EM_REL_AND; return LOGIC; }
73[oO][rR]		|
74"||"			{ yylval->i = TCF_EM_REL_OR; return LOGIC; }
75[nN][oO][tT]		|
76"!"			return NOT;
77
78[cC][mM][pP]		{ yylval->i = TCF_EM_CMP; return EMATCH_CMP; }
79[pP][aA][tT][tT][eE][rR][nN] { yylval->i = TCF_EM_NBYTE; return EMATCH_NBYTE; }
80[tT][eE][xX][tT]	{ yylval->i = TCF_EM_TEXT; return EMATCH_TEXT; }
81[mM][eE][tT][aA]	{ yylval->i = TCF_EM_META; return EMATCH_META; }
82
83"("			return KW_OPEN;
84")"			return KW_CLOSE;
85[mM][aA][sS][kK]	|
86"&"			return KW_MASK;
87[sS][hH][iI][fF][tT]	|
88">>"			return KW_SHIFT;
89[aA][tT]		return KW_AT;
90"+"			return KW_PLUS;
91[fF][rR][oO][mM]	return KW_FROM;
92[tT][oO]		return KW_TO;
93
94[uU]8			{ yylval->i = TCF_EM_ALIGN_U8; return ALIGN; }
95[uU]16			{ yylval->i = TCF_EM_ALIGN_U16; return ALIGN; }
96[uU]32			{ yylval->i = TCF_EM_ALIGN_U32; return ALIGN; }
97
98[lL][iI][nN][kK]	|
99[eE][tT][hH]		{ yylval->i = TCF_LAYER_LINK; return LAYER; }
100[nN][eE][tT]		|
101[iI][pP]6		|
102[iI][pP]		{ yylval->i = TCF_LAYER_NETWORK; return LAYER; }
103[tT][rR][aA][nN][sS][pP][oO][rR][tT] |
104[tT][cC][pP]		{ yylval->i = TCF_LAYER_TRANSPORT; return LAYER; }
105
106random			return META_RANDOM;
107loadavg_0		return META_LOADAVG_0;
108loadavg_1		return META_LOADAVG_1;
109loadavg_2		return META_LOADAVG_2;
110dev			return META_DEV;
111prio			return META_PRIO;
112proto			return META_PROTO;
113pkttype			return META_PKTTYPE;
114pktlen			return META_PKTLEN;
115datalen			return META_DATALEN;
116maclen			return META_MACLEN;
117mark			return META_MARK;
118tcindex			return META_TCINDEX;
119rtclassid		return META_RTCLASSID;
120rtiif			return META_RTIIF;
121sk_family		return META_SK_FAMILY;
122sk_state		return META_SK_STATE;
123sk_reuse		return META_SK_REUSE;
124sk_refcnt		return META_SK_REFCNT;
125sk_rcvbuf		return META_SK_RCVBUF;
126sk_sndbuf		return META_SK_SNDBUF;
127sk_shutdown		return META_SK_SHUTDOWN;
128sk_proto		return META_SK_PROTO;
129sk_type			return META_SK_TYPE;
130sk_rmem_alloc		return META_SK_RMEM_ALLOC;
131sk_wmem_alloc		return META_SK_WMEM_ALLOC;
132sk_wmem_queued		return META_SK_WMEM_QUEUED;
133sk_rcv_qlen		return META_SK_RCV_QLEN;
134sk_snd_qlen		return META_SK_SND_QLEN;
135sk_err_qlen		return META_SK_ERR_QLEN;
136sk_forward_allocs	return META_SK_FORWARD_ALLOCS;
137sk_allocs		return META_SK_ALLOCS;
138sk_route_caps		return META_SK_ROUTE_CAPS;
139sk_hash			return META_SK_HASH;
140sk_lingertime		return META_SK_LINGERTIME;
141sk_ack_backlog		return META_SK_ACK_BACKLOG;
142sk_max_ack_backlog	return META_SK_MAX_ACK_BACKLOG;
143sk_prio			return META_SK_PRIO;
144sk_rcvlowat		return META_SK_RCVLOWAT;
145sk_rcvtimeo		return META_SK_RCVTIMEO;
146sk_sndtimeo		return META_SK_SNDTIMEO;
147sk_sendmsg_off		return META_SK_SENDMSG_OFF;
148sk_write_pending	return META_SK_WRITE_PENDING;
149vlan			return META_VLAN;
150rxhash			return META_RXHASH;
151
152devname			return META_DEVNAME;
153sk_bound_if		return META_SK_BOUND_IF;
154
155
156[^ \t\r\n+()=<>&|\"]+	{
157				yylval->s = strdup(yytext);
158				if (yylval->s == NULL)
159					return ERROR;
160				NL_DBG(4, "lex STR=%s\n", yylval->s);
161				return STR;
162			}
163