Home | History | Annotate | Download | only in route
      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 %{
     24 extern int pktloc_lex(YYSTYPE *, YYLTYPE *, void *);
     25 extern void rtnl_pktloc_add(struct rtnl_pktloc *);
     26 
     27 static 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 
     45 input:
     46 	def
     47 		{ }
     48 	;
     49 
     50 def:
     51 	/* empty */
     52 		{ }
     53 	| location def
     54 		{ }
     55 	;
     56 
     57 location:
     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 
     96 layer:
     97 	/* empty */
     98 		{ $$ = TCF_LAYER_NETWORK; }
     99 	| LAYER '+'
    100 		{ $$ = $1; }
    101 	;
    102 
    103 mask:
    104 	/* empty */
    105 		{ $$ = 0; }
    106 	| NUMBER
    107 		{ $$ = $1; }
    108 	;
    109