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