brintos

brintos / linux-shallow public Read only

0
0
Text · 4.0 KiB · 4da8d05 Raw
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