Process LQ_TC messages. Made link quality features configurable. Set
[olsrd.git] / src / cfgparser / oparse.y
1 %{
2
3 /*
4  * OLSR ad-hoc routing table management protocol config parser
5  * Copyright (C) 2004 Andreas T√łnnesen (andreto@olsr.org)
6  *
7  * This file is part of the olsr.org OLSR daemon.
8  *
9  * olsr.org is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * olsr.org is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with olsr.org; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  * 
23  * 
24  * $Id: oparse.y,v 1.14 2004/11/07 20:09:12 tlopatic Exp $
25  *
26  */
27
28
29 #include <stddef.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <netinet/in.h>
35 #include <arpa/inet.h>
36 #include <string.h>
37
38 #include "olsrd_conf.h"
39
40 #define PARSER_DEBUG 0
41
42 #define YYSTYPE struct conf_token *
43
44 void yyerror(char *);
45 int yylex(void);
46
47
48
49
50
51 %}
52
53 %token TOK_OPEN
54 %token TOK_CLOSE
55 %token TOK_SEMI
56
57 %token TOK_STRING
58 %token TOK_INTEGER
59 %token TOK_FLOAT
60 %token TOK_BOOLEAN
61
62 %token TOK_IP6TYPE
63
64 %token TOK_DEBUGLEVEL
65 %token TOK_IPVERSION
66 %token TOK_HNA4
67 %token TOK_HNA6
68 %token TOK_PLUGIN
69 %token TOK_INTERFACE
70 %token TOK_NOINT
71 %token TOK_TOS
72 %token TOK_WILLINGNESS
73 %token TOK_IPCCON
74 %token TOK_USEHYST
75 %token TOK_HYSTSCALE
76 %token TOK_HYSTUPPER
77 %token TOK_HYSTLOWER
78 %token TOK_POLLRATE
79 %token TOK_TCREDUNDANCY
80 %token TOK_MPRCOVERAGE
81 %token TOK_LQ_LEVEL
82 %token TOK_PLNAME
83 %token TOK_PLPARAM
84
85 %token TOK_IP4BROADCAST
86 %token TOK_IP6ADDRTYPE
87 %token TOK_IP6MULTISITE
88 %token TOK_IP6MULTIGLOBAL
89 %token TOK_HELLOINT
90 %token TOK_HELLOVAL
91 %token TOK_TCINT
92 %token TOK_TCVAL
93 %token TOK_MIDINT
94 %token TOK_MIDVAL
95 %token TOK_HNAINT
96 %token TOK_HNAVAL
97
98 %token TOK_IP4_ADDR
99 %token TOK_IP6_ADDR
100
101 %token TOK_COMMENT
102
103 %%
104
105 conf:
106           | conf block
107           | conf stmt
108 ;
109
110 stmt:       idebug
111           | iipversion
112           | bnoint
113           | atos
114           | awillingness
115           | bipccon
116           | busehyst
117           | fhystscale
118           | fhystupper
119           | fhystlower
120           | fpollrate
121           | atcredundancy
122           | amprcoverage
123           | alq_level
124           | vcomment
125 ;
126
127 block:      TOK_HNA4 hna4body
128           | TOK_HNA6 hna6body
129           | ifblock ifbody
130           | plblock plbody
131 ;
132
133 hna4body:       TOK_OPEN hna4stmts TOK_CLOSE
134 ;
135
136 hna4stmts: | hna4stmts hna4stmt
137 ;
138
139 hna4stmt:  vcomment
140          | ihna4entry
141 ;
142
143 hna6body:       TOK_OPEN hna6stmts TOK_CLOSE
144 ;
145
146 hna6stmts: | hna6stmts hna6stmt
147 ;
148
149 hna6stmt:  vcomment
150          | ihna6entry
151 ;
152
153 ifbody:     TOK_OPEN ifstmts TOK_CLOSE
154 ;
155
156 ifstmts:   | ifstmts ifstmt
157 ;
158
159 ifstmt:      vcomment
160              | isetip4br
161              | isetip6addrt
162              | isetip6mults
163              | isetip6multg
164              | isethelloint
165              | isethelloval
166              | isettcint
167              | isettcval
168              | isetmidint
169              | isetmidval
170              | isethnaint
171              | isethnaval
172 ;
173
174 plbody:     TOK_OPEN plstmts TOK_CLOSE
175 ;
176
177 plstmts:   | plstmts plstmt
178 ;
179
180 plstmt:     plparam
181           | vcomment
182 ;
183
184
185
186 isetip4br: TOK_IP4BROADCAST TOK_IP4_ADDR
187 {
188   struct in_addr in;
189
190   if(PARSER_DEBUG) printf("\tIPv4 broadcast: %s\n", $2->string);
191
192   if(inet_aton($2->string, &in) == 0)
193     {
194       fprintf(stderr, "Failed converting IP address %s\n", $1->string);
195       exit(EXIT_FAILURE);
196     }
197
198   cnf->interfaces->cnf->ipv4_broadcast.v4 = in.s_addr;
199
200   free($2->string);
201   free($2);
202 }
203 ;
204
205 isetip6addrt: TOK_IP6ADDRTYPE TOK_IP6TYPE
206 {
207   if($2->boolean)
208     cnf->interfaces->cnf->ipv6_addrtype = IPV6_ADDR_SITELOCAL;
209   else
210     cnf->interfaces->cnf->ipv6_addrtype = 0;
211
212   free($2);
213 }
214 ;
215
216 isetip6mults: TOK_IP6MULTISITE TOK_IP6_ADDR
217 {
218   struct in6_addr in6;
219
220   if(PARSER_DEBUG) printf("\tIPv6 site-local multicast: %s\n", $2->string);
221
222   if(inet_pton(AF_INET6, $2->string, &in6) < 0)
223     {
224       fprintf(stderr, "Failed converting IP address %s\n", $2->string);
225       exit(EXIT_FAILURE);
226     }
227   memcpy(&cnf->interfaces->cnf->ipv6_multi_site.v6, &in6, sizeof(struct in6_addr));
228
229
230   free($2->string);
231   free($2);
232 }
233 ;
234
235
236 isetip6multg: TOK_IP6MULTIGLOBAL TOK_IP6_ADDR
237 {
238   struct in6_addr in6;
239
240   if(PARSER_DEBUG) printf("\tIPv6 global multicast: %s\n", $2->string);
241
242   if(inet_pton(AF_INET6, $2->string, &in6) < 0)
243     {
244       fprintf(stderr, "Failed converting IP address %s\n", $2->string);
245       exit(EXIT_FAILURE);
246     }
247   memcpy(&cnf->interfaces->cnf->ipv6_multi_glbl.v6, &in6, sizeof(struct in6_addr));
248
249
250   free($2->string);
251   free($2);
252 }
253 ;
254 isethelloint: TOK_HELLOINT TOK_FLOAT
255 {
256     if(PARSER_DEBUG) printf("\tHELLO interval: %0.2f\n", $2->floating);
257     cnf->interfaces->cnf->hello_params.emission_interval = $2->floating;
258     free($2);
259 }
260 ;
261 isethelloval: TOK_HELLOVAL TOK_FLOAT
262 {
263     if(PARSER_DEBUG) printf("\tHELLO validity: %0.2f\n", $2->floating);
264     cnf->interfaces->cnf->hello_params.validity_time = $2->floating;
265     free($2);
266 }
267 ;
268 isettcint: TOK_TCINT TOK_FLOAT
269 {
270     if(PARSER_DEBUG) printf("\tTC interval: %0.2f\n", $2->floating);
271     cnf->interfaces->cnf->tc_params.emission_interval = $2->floating;
272     free($2);
273 }
274 ;
275 isettcval: TOK_TCVAL TOK_FLOAT
276 {
277     if(PARSER_DEBUG) printf("\tTC validity: %0.2f\n", $2->floating);
278     cnf->interfaces->cnf->tc_params.validity_time = $2->floating;
279     free($2);
280 }
281 ;
282 isetmidint: TOK_MIDINT TOK_FLOAT
283 {
284     if(PARSER_DEBUG) printf("\tMID interval: %0.2f\n", $2->floating);
285     cnf->interfaces->cnf->mid_params.emission_interval = $2->floating;
286     free($2);
287 }
288 ;
289 isetmidval: TOK_MIDVAL TOK_FLOAT
290 {
291     if(PARSER_DEBUG) printf("\tMID validity: %0.2f\n", $2->floating);
292     cnf->interfaces->cnf->mid_params.validity_time = $2->floating;
293     free($2);
294 }
295 ;
296 isethnaint: TOK_HNAINT TOK_FLOAT
297 {
298     if(PARSER_DEBUG) printf("\tHNA interval: %0.2f\n", $2->floating);
299     cnf->interfaces->cnf->hna_params.emission_interval = $2->floating;
300     free($2);
301 }
302 ;
303 isethnaval: TOK_HNAVAL TOK_FLOAT
304 {
305     if(PARSER_DEBUG) printf("\tHNA validity: %0.2f\n", $2->floating);
306     cnf->interfaces->cnf->hna_params.validity_time = $2->floating;
307     free($2);
308 }
309 ;
310
311
312 idebug:       TOK_DEBUGLEVEL TOK_INTEGER
313 {
314
315   cnf->debug_level = $2->integer;
316   if(PARSER_DEBUG) printf("Debug level: %d\n", cnf->debug_level);
317
318   free($2);
319 }
320 ;
321
322
323 iipversion:    TOK_IPVERSION TOK_INTEGER
324 {
325   if($2->integer == 4)
326     cnf->ip_version = AF_INET;
327   else if($2->integer == 6)
328     cnf->ip_version = AF_INET6;
329   else
330     {
331       fprintf(stderr, "IPversion must be 4 or 6!\n");
332       YYABORT;
333     }
334
335   if(PARSER_DEBUG) printf("IpVersion: %d\n", $2->integer);
336   free($2);
337 }
338 ;
339
340
341 ihna4entry:     TOK_IP4_ADDR TOK_IP4_ADDR
342 {
343   struct hna4_entry *h = malloc(sizeof(struct hna4_entry));
344   struct in_addr in;
345
346   if(PARSER_DEBUG) printf("HNA IPv4 entry: %s/%s\n", $1->string, $2->string);
347
348   if(h == NULL)
349     {
350       fprintf(stderr, "Out of memory(HNA4)\n");
351       YYABORT;
352     }
353
354   if(inet_aton($1->string, &in) == 0)
355     {
356       fprintf(stderr, "Failed converting IP address %s\n", $1->string);
357       exit(EXIT_FAILURE);
358     }
359   h->net.v4 = in.s_addr;
360   if(inet_aton($2->string, &in) == 0)
361     {
362       fprintf(stderr, "Failed converting IP address %s\n", $1->string);
363       exit(EXIT_FAILURE);
364     }
365   h->netmask.v4 = in.s_addr;
366   /* Queue */
367   h->next = cnf->hna4_entries;
368   cnf->hna4_entries = h;
369
370   free($1->string);
371   free($1);
372   free($2->string);
373   free($2);
374
375 }
376
377 ihna6entry:     TOK_IP6_ADDR TOK_INTEGER
378 {
379   struct hna6_entry *h = malloc(sizeof(struct hna6_entry));
380   struct in6_addr in6;
381
382   if(PARSER_DEBUG) printf("HNA IPv6 entry: %s/%d\n", $1->string, $2->integer);
383
384   if(h == NULL)
385     {
386       fprintf(stderr, "Out of memory(HNA6)\n");
387       YYABORT;
388     }
389
390   if(inet_pton(AF_INET6, $1->string, &in6) < 0)
391     {
392       fprintf(stderr, "Failed converting IP address %s\n", $1->string);
393       exit(EXIT_FAILURE);
394     }
395   memcpy(&h->net, &in6, sizeof(struct in6_addr));
396
397   if(($2->integer < 0) || ($2->integer > 128))
398     {
399       fprintf(stderr, "Illegal IPv6 prefix length %d\n", $2->integer);
400       exit(EXIT_FAILURE);
401     }
402
403   h->prefix_len = $2->integer;
404   /* Queue */
405   h->next = cnf->hna6_entries;
406   cnf->hna6_entries = h;
407
408   free($1->string);
409   free($1);
410   free($2);
411
412 }
413
414 ifblock: TOK_INTERFACE TOK_STRING
415 {
416   struct olsr_if *in = malloc(sizeof(struct olsr_if));
417   
418   if(in == NULL)
419     {
420       fprintf(stderr, "Out of memory(ADD IF)\n");
421       YYABORT;
422     }
423
424   in->cnf = get_default_if_config();
425
426   if(in->cnf == NULL)
427     {
428       fprintf(stderr, "Out of memory(ADD IFRULE)\n");
429       YYABORT;
430     }
431
432   in->name = $2->string;
433
434   /* Queue */
435   in->next = cnf->interfaces;
436   cnf->interfaces = in;
437
438   free($2);
439 }
440
441 bnoint: TOK_NOINT TOK_BOOLEAN
442 {
443   if(PARSER_DEBUG) printf("Noint set to %d\n", $2->boolean);
444
445   cnf->allow_no_interfaces = $2->boolean;
446
447   free($2);
448 }
449 ;
450
451 atos: TOK_TOS TOK_INTEGER
452 {
453   if(PARSER_DEBUG) printf("TOS: %d\n", $2->integer);
454   cnf->tos = $2->integer;
455
456   free($2);
457
458 }
459 ;
460
461 awillingness: TOK_WILLINGNESS TOK_INTEGER
462 {
463   cnf->willingness_auto = OLSR_FALSE;
464
465   if(PARSER_DEBUG) printf("Willingness: %d\n", $2->integer);
466   cnf->willingness = $2->integer;
467
468   free($2);
469
470 }
471 ;
472
473 bipccon: TOK_IPCCON TOK_BOOLEAN
474 {
475   cnf->open_ipc = $2->boolean;
476
477   if(cnf->open_ipc)
478     {
479       if(PARSER_DEBUG) printf("IPC allowed\n");
480     }
481   else
482     {
483       if(PARSER_DEBUG) printf("IPC blocked\n");
484     }
485   free($2);
486
487 }
488 ;
489
490
491 busehyst: TOK_USEHYST TOK_BOOLEAN
492 {
493   cnf->use_hysteresis = $2->boolean;
494   if(cnf->use_hysteresis)
495     {
496       if(PARSER_DEBUG) printf("Hysteresis enabled\n");
497     }
498   else
499     {
500       if(PARSER_DEBUG) printf("Hysteresis disabled\n");
501     }
502   free($2);
503
504 }
505 ;
506
507
508 fhystscale: TOK_HYSTSCALE TOK_FLOAT
509 {
510   cnf->hysteresis_param.scaling = $2->floating;
511   if(PARSER_DEBUG) printf("Hysteresis Scaling: %0.2f\n", $2->floating);
512   free($2);
513 }
514 ;
515
516
517 fhystupper: TOK_HYSTUPPER TOK_FLOAT
518 {
519   cnf->hysteresis_param.thr_high = $2->floating;
520   if(PARSER_DEBUG) printf("Hysteresis UpperThr: %0.2f\n", $2->floating);
521   free($2);
522 }
523 ;
524
525
526 fhystlower: TOK_HYSTLOWER TOK_FLOAT
527 {
528   cnf->hysteresis_param.thr_low = $2->floating;
529   if(PARSER_DEBUG) printf("Hysteresis LowerThr: %0.2f\n", $2->floating);
530   free($2);
531 }
532 ;
533
534 fpollrate: TOK_POLLRATE TOK_FLOAT
535 {
536   if(PARSER_DEBUG) printf("Pollrate %0.2f\n", $2->floating);
537   cnf->pollrate = $2->floating;
538
539   free($2);
540 }
541 ;
542
543
544 atcredundancy: TOK_TCREDUNDANCY TOK_INTEGER
545 {
546   if(PARSER_DEBUG) printf("TC redundancy %d\n", $2->integer);
547   cnf->tc_redundancy = $2->integer;
548
549   free($2);
550
551 }
552 ;
553
554 amprcoverage: TOK_MPRCOVERAGE TOK_INTEGER
555 {
556   if(PARSER_DEBUG) printf("MPR coverage %d\n", $2->integer);
557   cnf->mpr_coverage = $2->integer;
558
559   free($2);
560 }
561 ;
562
563 alq_level: TOK_LQ_LEVEL TOK_INTEGER
564 {
565   if(PARSER_DEBUG) printf("Link quality level %d\n", $2->integer);
566   cnf->lq_level = $2->integer;
567
568   free($2);
569 }
570 ;
571
572 plblock: TOK_PLUGIN TOK_STRING
573 {
574   struct plugin_entry *pe = malloc(sizeof(struct plugin_entry));
575   
576   if(pe == NULL)
577     {
578       fprintf(stderr, "Out of memory(ADD PL)\n");
579       YYABORT;
580     }
581
582   pe->name = $2->string;
583
584   pe->params = NULL;
585   
586   if(PARSER_DEBUG) printf("Plugin: %s\n", $2->string);
587
588   /* Queue */
589   pe->next = cnf->plugins;
590   cnf->plugins = pe;
591
592   free($2);
593 }
594 ;
595
596 plparam: TOK_PLPARAM TOK_STRING TOK_STRING
597 {
598   struct plugin_param *pp = malloc(sizeof(struct plugin_param));
599   
600   if(pp == NULL)
601     {
602       fprintf(stderr, "Out of memory(ADD PP)\n");
603       YYABORT;
604     }
605   
606   if(PARSER_DEBUG) printf("Plugin param key:\"%s\" val: \"%s\"\n", $2->string, $3->string);
607   
608   pp->key = $2->string;
609   pp->value = $3->string;
610
611   /* Queue */
612   pp->next = cnf->plugins->params;
613   cnf->plugins->params = pp;
614
615   free($2);
616   free($3);
617 }
618 ;
619
620 vcomment:       TOK_COMMENT
621 {
622     //if(PARSER_DEBUG) printf("Comment\n");
623 }
624 ;
625
626
627
628 %%
629
630 void yyerror (char *string)
631 {
632   fprintf(stderr, "Config line %d: %s\n", current_line, string);
633 }