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