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