ematch_grammar.l 4.1 KB

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