Home | History | Annotate | Download | only in route
      1 %{
      2 #include <netlink-private/netlink.h>
      3 #include <netlink-private/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 %expect 1
     17 
     18 %union {
     19 	struct rtnl_pktloc *l;
     20 	uint32_t i;
     21 	char *s;
     22 }
     23 
     24 %{
     25 extern int pktloc_lex(YYSTYPE *, YYLTYPE *, void *);
     26 
     27 static void yyerror(YYLTYPE *locp, void *scanner, const char *msg)
     28 {
     29 	NL_DBG(1, "Error while parsing packet location file: %s\n", msg);
     30 }
     31 %}
     32 
     33 %token <i> ERROR NUMBER LAYER ALIGN
     34 %token <s> NAME
     35 
     36 %type <i> mask layer align shift
     37 %type <l> location
     38 
     39 %destructor { free($$); } NAME
     40 
     41 %start input
     42 
     43 %%
     44 
     45 input:
     46 	/* empty */
     47 	| location input
     48 	;
     49 
     50 location:
     51 	NAME align layer NUMBER mask shift
     52 		{
     53 			struct rtnl_pktloc *loc;
     54 
     55 			if (!(loc = rtnl_pktloc_alloc())) {
     56 				NL_DBG(1, "Allocating a packet location "
     57 					  "object failed.\n");
     58 				YYABORT;
     59 			}
     60 
     61 			loc->name = $1;
     62 			loc->align = $2;
     63 			loc->layer = $3;
     64 			loc->offset = $4;
     65 			loc->mask = $5;
     66 			loc->shift = $6;
     67 
     68 			if (rtnl_pktloc_add(loc) < 0) {
     69 				NL_DBG(1, "Duplicate packet location entry "
     70 					  "\"%s\"\n", $1);
     71 			}
     72 
     73 			$$ = loc;
     74 		}
     75 	;
     76 
     77 align:
     78 	ALIGN
     79 		{ $$ = $1; }
     80 	| NUMBER
     81 		{ $$ = $1; }
     82 	;
     83 
     84 layer:
     85 	/* empty */
     86 		{ $$ = TCF_LAYER_NETWORK; }
     87 	| LAYER '+'
     88 		{ $$ = $1; }
     89 	;
     90 
     91 mask:
     92 	/* empty */
     93 		{ $$ = 0; }
     94 	| NUMBER
     95 		{ $$ = $1; }
     96 	;
     97 
     98 shift:
     99 	/* empty */
    100 		{ $$ = 0; }
    101 	| NUMBER
    102 		{ $$ = $1; }
    103 	;
    104