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