144 lines
		
	
	
	
		
			3.2 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
	
		
			3.2 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | /* | ||
|  |  * BPF asm code lexer | ||
|  |  * | ||
|  |  * This program is free software; you can distribute it and/or modify | ||
|  |  * it under the terms of the GNU General Public License as published | ||
|  |  * by the Free Software Foundation; either version 2 of the License, | ||
|  |  * or (at your option) any later version. | ||
|  |  * | ||
|  |  * Syntax kept close to: | ||
|  |  * | ||
|  |  * Steven McCanne and Van Jacobson. 1993. The BSD packet filter: a new | ||
|  |  * architecture for user-level packet capture. In Proceedings of the | ||
|  |  * USENIX Winter 1993 Conference Proceedings on USENIX Winter 1993 | ||
|  |  * Conference Proceedings (USENIX'93). USENIX Association, Berkeley, | ||
|  |  * CA, USA, 2-2. | ||
|  |  * | ||
|  |  * Copyright 2013 Daniel Borkmann <borkmann@redhat.com> | ||
|  |  * Licensed under the GNU General Public License, version 2.0 (GPLv2) | ||
|  |  */ | ||
|  | 
 | ||
|  | %{ | ||
|  | 
 | ||
|  | #include <stdio.h> | ||
|  | #include <stdint.h> | ||
|  | #include <stdlib.h> | ||
|  | 
 | ||
|  | #include "bpf_exp.yacc.h" | ||
|  | 
 | ||
|  | extern void yyerror(const char *str); | ||
|  | 
 | ||
|  | %} | ||
|  | 
 | ||
|  | %option align | ||
|  | %option ecs | ||
|  | 
 | ||
|  | %option nounput | ||
|  | %option noreject | ||
|  | %option noinput | ||
|  | %option noyywrap | ||
|  | 
 | ||
|  | %option 8bit | ||
|  | %option caseless | ||
|  | %option yylineno | ||
|  | 
 | ||
|  | %% | ||
|  | 
 | ||
|  | "ldb"		{ return OP_LDB; } | ||
|  | "ldh"		{ return OP_LDH; } | ||
|  | "ld"		{ return OP_LD; } | ||
|  | "ldi"		{ return OP_LDI; } | ||
|  | "ldx"		{ return OP_LDX; } | ||
|  | "ldxi"		{ return OP_LDXI; } | ||
|  | "ldxb"		{ return OP_LDXB; } | ||
|  | "st"		{ return OP_ST; } | ||
|  | "stx"		{ return OP_STX; } | ||
|  | "jmp"		{ return OP_JMP; } | ||
|  | "ja"		{ return OP_JMP; } | ||
|  | "jeq"		{ return OP_JEQ; } | ||
|  | "jneq"		{ return OP_JNEQ; } | ||
|  | "jne"		{ return OP_JNEQ; } | ||
|  | "jlt"		{ return OP_JLT; } | ||
|  | "jle"		{ return OP_JLE; } | ||
|  | "jgt"		{ return OP_JGT; } | ||
|  | "jge"		{ return OP_JGE; } | ||
|  | "jset"		{ return OP_JSET; } | ||
|  | "add"		{ return OP_ADD; } | ||
|  | "sub"		{ return OP_SUB; } | ||
|  | "mul"		{ return OP_MUL; } | ||
|  | "div"		{ return OP_DIV; } | ||
|  | "mod"		{ return OP_MOD; } | ||
|  | "neg"		{ return OP_NEG; } | ||
|  | "and"		{ return OP_AND; } | ||
|  | "xor"		{ return OP_XOR; } | ||
|  | "or"		{ return OP_OR; } | ||
|  | "lsh"		{ return OP_LSH; } | ||
|  | "rsh"		{ return OP_RSH; } | ||
|  | "ret"		{ return OP_RET; } | ||
|  | "tax"		{ return OP_TAX; } | ||
|  | "txa"		{ return OP_TXA; } | ||
|  | 
 | ||
|  | "#"?("len")	{ return K_PKT_LEN; } | ||
|  | "#"?("proto")	{ return K_PROTO; } | ||
|  | "#"?("type")	{ return K_TYPE; } | ||
|  | "#"?("poff")	{ return K_POFF; } | ||
|  | "#"?("ifidx")	{ return K_IFIDX; } | ||
|  | "#"?("nla")	{ return K_NLATTR; } | ||
|  | "#"?("nlan")	{ return K_NLATTR_NEST; } | ||
|  | "#"?("mark")	{ return K_MARK; } | ||
|  | "#"?("queue")	{ return K_QUEUE; } | ||
|  | "#"?("hatype")	{ return K_HATYPE; } | ||
|  | "#"?("rxhash")	{ return K_RXHASH; } | ||
|  | "#"?("cpu")	{ return K_CPU; } | ||
|  | "#"?("vlan_tci") { return K_VLANT; } | ||
|  | "#"?("vlan_pr")	{ return K_VLANP; } | ||
|  | 
 | ||
|  | ":"		{ return ':'; } | ||
|  | ","		{ return ','; } | ||
|  | "#"		{ return '#'; } | ||
|  | "%"		{ return '%'; } | ||
|  | "["		{ return '['; } | ||
|  | "]"		{ return ']'; } | ||
|  | "("		{ return '('; } | ||
|  | ")"		{ return ')'; } | ||
|  | "x"		{ return 'x'; } | ||
|  | "a"		{ return 'a'; } | ||
|  | "+"		{ return '+'; } | ||
|  | "M"		{ return 'M'; } | ||
|  | "*"		{ return '*'; } | ||
|  | "&"		{ return '&'; } | ||
|  | 
 | ||
|  | ([0][x][a-fA-F0-9]+) { | ||
|  | 			yylval.number = strtoul(yytext, NULL, 16); | ||
|  | 			return number; | ||
|  | 		} | ||
|  | ([0][b][0-1]+)	{ | ||
|  | 			yylval.number = strtol(yytext + 2, NULL, 2); | ||
|  | 			return number; | ||
|  | 		} | ||
|  | (([0])|([-+]?[1-9][0-9]*)) { | ||
|  | 			yylval.number = strtol(yytext, NULL, 10); | ||
|  | 			return number; | ||
|  | 		} | ||
|  | ([0][0-9]+)	{ | ||
|  | 			yylval.number = strtol(yytext + 1, NULL, 8); | ||
|  | 			return number; | ||
|  | 		} | ||
|  | [a-zA-Z_][a-zA-Z0-9_]+ { | ||
|  | 			yylval.label = strdup(yytext); | ||
|  | 			return label; | ||
|  | 		} | ||
|  | 
 | ||
|  | "/*"([^\*]|\*[^/])*"*/"		{ /* NOP */ } | ||
|  | ";"[^\n]*			{ /* NOP */ } | ||
|  | ^#.*				{ /* NOP */ } | ||
|  | [ \t]+				{ /* NOP */ } | ||
|  | [ \n]+				{ /* NOP */ } | ||
|  | 
 | ||
|  | .		{ | ||
|  | 			printf("unknown character \'%s\'", yytext); | ||
|  | 			yyerror("lex unknown character"); | ||
|  | 		} | ||
|  | 
 | ||
|  | %% |