1%{ 2#include <netlink-local.h> 3#include <netlink-tc.h> 4#include <netlink/netlink.h> 5#include <netlink/utils.h> 6#include <netlink/route/pktloc.h> 7%} 8 9%locations 10%error-verbose 11%define api.pure 12%name-prefix "pktloc_" 13 14%parse-param {void *scanner} 15%lex-param {void *scanner} 16 17%union { 18 struct rtnl_pktloc *l; 19 uint32_t i; 20 char *s; 21} 22 23%{ 24extern int pktloc_lex(YYSTYPE *, YYLTYPE *, void *); 25extern void rtnl_pktloc_add(struct rtnl_pktloc *); 26 27static void yyerror(YYLTYPE *locp, void *scanner, const char *msg) 28{ 29 /* FIXME */ 30} 31%} 32 33%token <i> ERROR NUMBER LAYER 34%token <s> NAME 35 36%type <i> mask layer 37%type <l> location 38 39%destructor { free($$); } NAME 40 41%start input 42 43%% 44 45input: 46 def 47 { } 48 ; 49 50def: 51 /* empty */ 52 { } 53 | location def 54 { } 55 ; 56 57location: 58 NAME NAME layer NUMBER mask 59 { 60 struct rtnl_pktloc *loc; 61 62 if (!(loc = calloc(1, sizeof(*loc)))) { 63 /* FIXME */ 64 } 65 66 if (!strcasecmp($2, "u8")) 67 loc->align = TCF_EM_ALIGN_U8; 68 else if (!strcasecmp($2, "h8")) { 69 loc->align = TCF_EM_ALIGN_U8; 70 loc->flags = TCF_EM_CMP_TRANS; 71 } else if (!strcasecmp($2, "u16")) 72 loc->align = TCF_EM_ALIGN_U16; 73 else if (!strcasecmp($2, "h16")) { 74 loc->align = TCF_EM_ALIGN_U16; 75 loc->flags = TCF_EM_CMP_TRANS; 76 } else if (!strcasecmp($2, "u32")) 77 loc->align = TCF_EM_ALIGN_U32; 78 else if (!strcasecmp($2, "h32")) { 79 loc->align = TCF_EM_ALIGN_U32; 80 loc->flags = TCF_EM_CMP_TRANS; 81 } 82 83 free($2); 84 85 loc->name = $1; 86 loc->layer = $3; 87 loc->offset = $4; 88 loc->mask = $5; 89 90 rtnl_pktloc_add(loc); 91 92 $$ = loc; 93 } 94 ; 95 96layer: 97 /* empty */ 98 { $$ = TCF_LAYER_NETWORK; } 99 | LAYER '+' 100 { $$ = $1; } 101 ; 102 103mask: 104 /* empty */ 105 { $$ = 0; } 106 | NUMBER 107 { $$ = $1; } 108 ; 109