bpf_exp.l 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. * BPF asm code lexer
  3. *
  4. * This program is free software; you can distribute it and/or modify
  5. * it under the terms of the GNU General Public License as published
  6. * by the Free Software Foundation; either version 2 of the License,
  7. * or (at your option) any later version.
  8. *
  9. * Syntax kept close to:
  10. *
  11. * Steven McCanne and Van Jacobson. 1993. The BSD packet filter: a new
  12. * architecture for user-level packet capture. In Proceedings of the
  13. * USENIX Winter 1993 Conference Proceedings on USENIX Winter 1993
  14. * Conference Proceedings (USENIX'93). USENIX Association, Berkeley,
  15. * CA, USA, 2-2.
  16. *
  17. * Copyright 2013 Daniel Borkmann <borkmann@redhat.com>
  18. * Licensed under the GNU General Public License, version 2.0 (GPLv2)
  19. */
  20. %{
  21. #include <stdio.h>
  22. #include <stdint.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <linux/filter.h>
  26. #include "bpf_exp.yacc.h"
  27. extern void yyerror(const char *str);
  28. %}
  29. %option align
  30. %option ecs
  31. %option nounput
  32. %option noreject
  33. %option noinput
  34. %option noyywrap
  35. %option 8bit
  36. %option caseless
  37. %option yylineno
  38. %%
  39. "ldb" { return OP_LDB; }
  40. "ldh" { return OP_LDH; }
  41. "ld" { return OP_LD; }
  42. "ldi" { return OP_LDI; }
  43. "ldx" { return OP_LDX; }
  44. "ldxi" { return OP_LDXI; }
  45. "ldxb" { return OP_LDXB; }
  46. "st" { return OP_ST; }
  47. "stx" { return OP_STX; }
  48. "jmp" { return OP_JMP; }
  49. "ja" { return OP_JMP; }
  50. "jeq" { return OP_JEQ; }
  51. "jneq" { return OP_JNEQ; }
  52. "jne" { return OP_JNEQ; }
  53. "jlt" { return OP_JLT; }
  54. "jle" { return OP_JLE; }
  55. "jgt" { return OP_JGT; }
  56. "jge" { return OP_JGE; }
  57. "jset" { return OP_JSET; }
  58. "add" { return OP_ADD; }
  59. "sub" { return OP_SUB; }
  60. "mul" { return OP_MUL; }
  61. "div" { return OP_DIV; }
  62. "mod" { return OP_MOD; }
  63. "neg" { return OP_NEG; }
  64. "and" { return OP_AND; }
  65. "xor" { return OP_XOR; }
  66. "or" { return OP_OR; }
  67. "lsh" { return OP_LSH; }
  68. "rsh" { return OP_RSH; }
  69. "ret" { return OP_RET; }
  70. "tax" { return OP_TAX; }
  71. "txa" { return OP_TXA; }
  72. "#"?("len") { return K_PKT_LEN; }
  73. "#"?("proto") {
  74. yylval.number = SKF_AD_PROTOCOL;
  75. return extension;
  76. }
  77. "#"?("type") {
  78. yylval.number = SKF_AD_PKTTYPE;
  79. return extension;
  80. }
  81. "#"?("poff") {
  82. yylval.number = SKF_AD_PAY_OFFSET;
  83. return extension;
  84. }
  85. "#"?("ifidx") {
  86. yylval.number = SKF_AD_IFINDEX;
  87. return extension;
  88. }
  89. "#"?("nla") {
  90. yylval.number = SKF_AD_NLATTR;
  91. return extension;
  92. }
  93. "#"?("nlan") {
  94. yylval.number = SKF_AD_NLATTR_NEST;
  95. return extension;
  96. }
  97. "#"?("mark") {
  98. yylval.number = SKF_AD_MARK;
  99. return extension;
  100. }
  101. "#"?("queue") {
  102. yylval.number = SKF_AD_QUEUE;
  103. return extension;
  104. }
  105. "#"?("hatype") {
  106. yylval.number = SKF_AD_HATYPE;
  107. return extension;
  108. }
  109. "#"?("rxhash") {
  110. yylval.number = SKF_AD_RXHASH;
  111. return extension;
  112. }
  113. "#"?("cpu") {
  114. yylval.number = SKF_AD_CPU;
  115. return extension;
  116. }
  117. "#"?("vlan_tci") {
  118. yylval.number = SKF_AD_VLAN_TAG;
  119. return extension;
  120. }
  121. "#"?("vlan_pr") {
  122. yylval.number = SKF_AD_VLAN_TAG_PRESENT;
  123. return extension;
  124. }
  125. "#"?("vlan_avail") {
  126. yylval.number = SKF_AD_VLAN_TAG_PRESENT;
  127. return extension;
  128. }
  129. "#"?("vlan_tpid") {
  130. yylval.number = SKF_AD_VLAN_TPID;
  131. return extension;
  132. }
  133. "#"?("rand") {
  134. yylval.number = SKF_AD_RANDOM;
  135. return extension;
  136. }
  137. ":" { return ':'; }
  138. "," { return ','; }
  139. "#" { return '#'; }
  140. "%" { return '%'; }
  141. "[" { return '['; }
  142. "]" { return ']'; }
  143. "(" { return '('; }
  144. ")" { return ')'; }
  145. "x" { return 'x'; }
  146. "a" { return 'a'; }
  147. "+" { return '+'; }
  148. "M" { return 'M'; }
  149. "*" { return '*'; }
  150. "&" { return '&'; }
  151. ([0][x][a-fA-F0-9]+) {
  152. yylval.number = strtoul(yytext, NULL, 16);
  153. return number;
  154. }
  155. ([0][b][0-1]+) {
  156. yylval.number = strtol(yytext + 2, NULL, 2);
  157. return number;
  158. }
  159. (([0])|([-+]?[1-9][0-9]*)) {
  160. yylval.number = strtol(yytext, NULL, 10);
  161. return number;
  162. }
  163. ([0][0-7]+) {
  164. yylval.number = strtol(yytext + 1, NULL, 8);
  165. return number;
  166. }
  167. [a-zA-Z_][a-zA-Z0-9_]+ {
  168. yylval.label = strdup(yytext);
  169. return label;
  170. }
  171. "/*"([^\*]|\*[^/])*"*/" { /* NOP */ }
  172. ";"[^\n]* { /* NOP */ }
  173. ^#.* { /* NOP */ }
  174. [ \t]+ { /* NOP */ }
  175. [ \n]+ { /* NOP */ }
  176. . {
  177. printf("unknown character \'%s\'", yytext);
  178. yyerror("lex unknown character");
  179. }
  180. %%