199 lines · plain
1/*2 * BPF asm code lexer3 *4 * This program is free software; you can distribute it and/or modify5 * it under the terms of the GNU General Public License as published6 * 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 new12 * architecture for user-level packet capture. In Proceedings of the13 * USENIX Winter 1993 Conference Proceedings on USENIX Winter 199314 * 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%{22 23#include <stdio.h>24#include <stdint.h>25#include <stdlib.h>26#include <string.h>27 28#include <linux/filter.h>29 30#include "bpf_exp.yacc.h"31 32extern void yyerror(const char *str);33 34%}35 36%option align37%option ecs38 39%option nounput40%option noreject41%option noinput42%option noyywrap43 44%option 8bit45%option caseless46%option yylineno47 48%%49 50"ldb" { return OP_LDB; }51"ldh" { return OP_LDH; }52"ld" { return OP_LD; }53"ldi" { return OP_LDI; }54"ldx" { return OP_LDX; }55"ldxi" { return OP_LDXI; }56"ldxb" { return OP_LDXB; }57"st" { return OP_ST; }58"stx" { return OP_STX; }59"jmp" { return OP_JMP; }60"ja" { return OP_JMP; }61"jeq" { return OP_JEQ; }62"jneq" { return OP_JNEQ; }63"jne" { return OP_JNEQ; }64"jlt" { return OP_JLT; }65"jle" { return OP_JLE; }66"jgt" { return OP_JGT; }67"jge" { return OP_JGE; }68"jset" { return OP_JSET; }69"add" { return OP_ADD; }70"sub" { return OP_SUB; }71"mul" { return OP_MUL; }72"div" { return OP_DIV; }73"mod" { return OP_MOD; }74"neg" { return OP_NEG; }75"and" { return OP_AND; }76"xor" { return OP_XOR; }77"or" { return OP_OR; }78"lsh" { return OP_LSH; }79"rsh" { return OP_RSH; }80"ret" { return OP_RET; }81"tax" { return OP_TAX; }82"txa" { return OP_TXA; }83 84"#"?("len") { return K_PKT_LEN; }85 86"#"?("proto") {87 yylval.number = SKF_AD_PROTOCOL;88 return extension;89 }90"#"?("type") {91 yylval.number = SKF_AD_PKTTYPE;92 return extension;93 }94"#"?("poff") {95 yylval.number = SKF_AD_PAY_OFFSET;96 return extension;97 }98"#"?("ifidx") {99 yylval.number = SKF_AD_IFINDEX;100 return extension;101 }102"#"?("nla") {103 yylval.number = SKF_AD_NLATTR;104 return extension;105 }106"#"?("nlan") {107 yylval.number = SKF_AD_NLATTR_NEST;108 return extension;109 }110"#"?("mark") {111 yylval.number = SKF_AD_MARK;112 return extension;113 }114"#"?("queue") {115 yylval.number = SKF_AD_QUEUE;116 return extension;117 }118"#"?("hatype") {119 yylval.number = SKF_AD_HATYPE;120 return extension;121 }122"#"?("rxhash") {123 yylval.number = SKF_AD_RXHASH;124 return extension;125 }126"#"?("cpu") {127 yylval.number = SKF_AD_CPU;128 return extension;129 }130"#"?("vlan_tci") {131 yylval.number = SKF_AD_VLAN_TAG;132 return extension;133 }134"#"?("vlan_pr") {135 yylval.number = SKF_AD_VLAN_TAG_PRESENT;136 return extension;137 }138"#"?("vlan_avail") {139 yylval.number = SKF_AD_VLAN_TAG_PRESENT;140 return extension;141 }142"#"?("vlan_tpid") {143 yylval.number = SKF_AD_VLAN_TPID;144 return extension;145 }146"#"?("rand") {147 yylval.number = SKF_AD_RANDOM;148 return extension;149 }150 151":" { return ':'; }152"," { return ','; }153"#" { return '#'; }154"%" { return '%'; }155"[" { return '['; }156"]" { return ']'; }157"(" { return '('; }158")" { return ')'; }159"x" { return 'x'; }160"a" { return 'a'; }161"+" { return '+'; }162"M" { return 'M'; }163"*" { return '*'; }164"&" { return '&'; }165 166([0][x][a-fA-F0-9]+) {167 yylval.number = strtoul(yytext, NULL, 16);168 return number;169 }170([0][b][0-1]+) {171 yylval.number = strtol(yytext + 2, NULL, 2);172 return number;173 }174(([0])|([-+]?[1-9][0-9]*)) {175 yylval.number = strtol(yytext, NULL, 10);176 return number;177 }178([0][0-7]+) {179 yylval.number = strtol(yytext + 1, NULL, 8);180 return number;181 }182[a-zA-Z_][a-zA-Z0-9_]+ {183 yylval.label = strdup(yytext);184 return label;185 }186 187"/*"([^\*]|\*[^/])*"*/" { /* NOP */ }188";"[^\n]* { /* NOP */ }189^#.* { /* NOP */ }190[ \t]+ { /* NOP */ }191[ \n]+ { /* NOP */ }192 193. {194 printf("unknown character \'%s\'", yytext);195 yyerror("lex unknown character");196 }197 198%%199