Updated UniK olsrd to olsr.org in licence headers
[olsrd.git] / src / main.c
1 /*
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2004 Andreas T√łnnesen (andreto@ifi.uio.no)
4  *
5  * This file is part of the olsr.org OLSR daemon.
6  *
7  * olsr.org is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * olsr.org is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsr.org; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22
23 /*
24  *This implementation was based on the INRIA OLSR implementation. 
25  *
26  *The INRIA code carries the following copyright:
27  *
28  * This Copyright notice is in French. An English summary is given
29  * but the referee text is the French one.
30  *
31  * Copyright (c) 2000, 2001 Adokoe.Plakoo@inria.fr, INRIA Rocquencourt,
32  *                          Anis.Laouiti@inria.fr, INRIA Rocquencourt.
33  */
34
35
36 #include "main.h"
37 #include "interfaces.h"
38 //#include "ifnet.h"
39 #include "configfile.h"
40 #include "mantissa.h"
41 #include "local_hna_set.h"
42 #include "olsr.h"
43 #include "scheduler.h"
44 #include "parser.h"
45 #include "generate_msg.h"
46 #include "plugin_loader.h"
47 #include "socket_parser.h"
48 #include "apm.h"
49 #include "link_layer.h"
50
51 #ifdef linux
52 #include "linux/tunnel.h"
53 #elif defined WIN32
54 #define close(x) closesocket(x)
55 #include "win32/tunnel.h"
56 int __stdcall SignalHandler(unsigned long signal);
57 void ListInterfaces(void);
58 #else
59 #       error "Unsupported system"
60 #endif
61
62 /*
63  * Begin: Local function prototypes
64  */
65
66 static void
67 print_usage();
68
69 static void
70 set_default_values();
71
72
73 /*
74  * End: Local function prototypes
75  */
76
77 /**
78  *The main funtion does a LOT of things. It should 
79  *probably be much shorter
80  *
81  *After things are set up and the scheduler thread
82  *is started, the main thread goes into a typical 
83  *select(2) loop listening
84  */
85
86 int
87 main(int argc, char *argv[])
88 {
89   //struct interface *ifp;
90   struct in_addr in;
91
92   /* The thread for the scheduler */
93   pthread_t thread;
94
95   struct stat statbuf;
96   char conf_file_name[FILENAME_MAX];
97   
98 #ifdef WIN32
99   WSADATA WsaData;
100   int len;
101 #endif
102
103   setbuf(stdout, NULL);
104   setbuf(stderr, NULL);
105
106   /* Initialize socket list */
107   olsr_socket_entries = NULL;
108
109 #ifndef WIN32
110   /* Check if user is root */
111   if(getuid() || getgid())
112     {
113       fprintf(stderr, "You must be root(uid = 0) to run olsrd!\nExiting\n\n");
114       exit(EXIT_FAILURE);
115     }
116 #else
117   if (WSAStartup(0x0202, &WsaData))
118     {
119       fprintf(stderr, "Could not initialize WinSock.\n");
120       olsr_exit(__func__, EXIT_FAILURE);
121     }
122 #endif
123
124   /* Open syslog */
125   olsr_openlog("olsrd");
126
127   /*
128    * Start syslog entry
129    */
130   olsr_syslog(OLSR_LOG_INFO, "%s started", SOFTWARE_VERSION);
131
132   /* Set default values */
133   set_default_values();
134
135   /* Initialize network functions */
136   init_net();
137
138   /* Initialize plugin loader */
139   olsr_init_plugin_loader();
140  
141   /* Get initial timestep */
142   nowtm = NULL;
143   while (nowtm == NULL)
144     {
145       nowtm = gmtime(&now.tv_sec);
146     }
147     
148   /* The port to use for OLSR traffic */
149   olsr_udp_port = htons(OLSRPORT);
150     
151   printf("\n *** %s ***\n Build date: %s\n http://www.olsr.org\n\n", 
152          SOFTWARE_VERSION, 
153          __DATE__);
154     
155   /* Using PID as random seed */
156   srandom(getpid());
157
158
159   /*
160    * Set configfile name and
161    * check if a configfile name was given as parameter
162    */
163 #ifdef WIN32
164   GetWindowsDirectory(conf_file_name, FILENAME_MAX - 11);
165   
166   len = strlen(conf_file_name);
167   
168   if (conf_file_name[len - 1] != '\\')
169     conf_file_name[len++] = '\\';
170   
171   strcpy(conf_file_name + len, "olsrd.conf");
172 #else
173   strncpy(conf_file_name, OLSRD_GLOBAL_CONF_FILE, FILENAME_MAX);
174 #endif
175
176   if ((argc > 1) && (strcmp(argv[1], "-f") == 0)) 
177     {
178       argv++, argc--;
179       if(argc == 1)
180         {
181           fprintf(stderr, "You must provide a filename when using the -f switch!\n");
182           olsr_exit(__func__, EXIT_FAILURE);
183         }
184
185       if (stat(argv[1], &statbuf) < 0)
186         {
187           fprintf(stderr, "Could not finc specified config file %s!\n%s\n\n", argv[1], strerror(errno));
188           olsr_exit(__func__, EXIT_FAILURE);
189         }
190                  
191       strncpy(conf_file_name, argv[1], FILENAME_MAX);
192       argv++, argc--;
193
194     }
195
196   /*
197    * Reading configfile options prior to processing commandline options
198    */
199
200   read_config_file(conf_file_name);
201   
202   /*
203    * Process olsrd options.
204    */
205   
206   argv++, argc--;
207   while (argc > 0 && **argv == '-')
208     {
209 #ifdef WIN32
210       /*
211        *Interface list
212        */
213       if (strcmp(*argv, "-int") == 0)
214         {
215           ListInterfaces();
216           exit(0);
217         }
218 #endif
219
220       /*
221        *Configfilename
222        */
223       if (strcmp(*argv, "-f") == 0) 
224         {
225           fprintf(stderr, "Configfilename must ALWAYS be first argument!\n\n");
226           olsr_exit(__func__, EXIT_FAILURE);
227         }
228
229       /*
230        *Use IP version 6
231        */
232       if (strcmp(*argv, "-ipv6") == 0) 
233         {
234           ipversion = AF_INET6;
235           argv++, argc--;
236           continue;
237         }
238
239
240       /*
241        *Broadcast address
242        */
243       if (strcmp(*argv, "-bcast") == 0) 
244         {
245           argv++, argc--;
246           if(argc == 0)
247             {
248               fprintf(stderr, "You must provide a broadcastaddr when using the -bcast switch!\n");
249               olsr_exit(__func__, EXIT_FAILURE);
250             }
251
252           if (inet_aton(*argv, &in) == 0)
253             {
254               printf("Invalid broadcast address! %s\nSkipping it!\n", *argv);
255               continue;
256             }
257
258           bcast_set = 1;
259                  
260           memcpy(&bcastaddr.sin_addr, &in.s_addr, sizeof(olsr_u32_t));
261
262
263           continue;
264         }
265
266
267       /*
268        * Enable additional debugging information to be logged.
269        */
270       if (strcmp(*argv, "-d") == 0) 
271         {
272           argv++, argc--;
273           sscanf(*argv,"%d", &debug_level);
274           argv++, argc--;
275           continue;
276         }
277
278
279
280                 
281       /*
282        * Interfaces to be used by olsrd.
283        */
284       if (strcmp(*argv, "-i") == 0) 
285         {
286           option_i = 1;
287           argv++, argc--;
288           queue_if(*argv);
289           argv++, argc--;
290
291           while((argc) && (**argv != '-'))
292             {
293               queue_if(*argv);
294               argv++; argc--;
295             }
296
297           continue;
298         }
299                 
300       /*
301        * Set the hello interval to be used by olsrd.
302        * 
303        */
304       if (strcmp(*argv, "-hint") == 0) 
305         {
306           argv++, argc--;
307           sscanf(*argv,"%f",&hello_int);
308           argv++, argc--;
309           continue;
310         }
311
312       /*
313        * Set the hello interval to be used by olsrd.
314        * on nonwireless interfaces
315        */
316       if (strcmp(*argv, "-hintn") == 0) 
317         {
318           argv++, argc--;
319           sscanf(*argv,"%f",&hello_int_nw);
320           argv++, argc--;
321           continue;
322         }
323
324       /*
325        * Set the HNA interval to be used by olsrd.
326        * 
327        */
328       if (strcmp(*argv, "-hnaint") == 0) 
329         {
330           argv++, argc--;
331           sscanf(*argv,"%f", &hna_int);
332           argv++, argc--;
333           continue;
334         }
335
336       /*
337        * Set the MID interval to be used by olsrd.
338        * 
339        */
340       if (strcmp(*argv, "-midint") == 0) 
341         {
342           argv++, argc--;
343           sscanf(*argv,"%f", &mid_int);
344           argv++, argc--;
345           continue;
346         }
347
348       /*
349        * Set the tc interval to be used by olsrd.
350        * 
351        */
352       if (strcmp(*argv, "-tcint") == 0) 
353         {
354           argv++, argc--;
355           sscanf(*argv,"%f",&tc_int);
356           argv++, argc--;
357           continue;
358         }
359
360       /*
361        * Set the tos bits to be used by olsrd.
362        * 
363        */
364       if (strcmp(*argv, "-tos") == 0) 
365         {
366           argv++, argc--;
367           sscanf(*argv,"%d",(int *)&tos);
368           argv++, argc--;
369           continue;
370         }
371
372
373       /*
374        * Set the polling interval to be used by olsrd.
375        */
376       if (strcmp(*argv, "-T") == 0) 
377         {
378           argv++, argc--;
379           sscanf(*argv,"%f",&polling_int);
380           argv++, argc--;
381           continue;
382         }
383
384       /*
385        * Set the vtime miltiplier
386        */
387       if (strcmp(*argv, "-hhold") == 0) 
388         {
389           argv++, argc--;
390           sscanf(*argv,"%d",&neighbor_timeout_mult);
391           argv++, argc--;
392           continue;
393         }
394
395       /*
396        * Set the vtime miltiplier for non-WLAN cards
397        */
398       if (strcmp(*argv, "-nhhold") == 0) 
399         {
400           argv++, argc--;
401           sscanf(*argv,"%d",&neighbor_timeout_mult_nw);
402           argv++, argc--;
403           continue;
404         }
405
406       /*
407        * Set the TC vtime multiplier
408        */
409       if (strcmp(*argv, "-thold") == 0) 
410         {
411           argv++, argc--;
412           sscanf(*argv,"%d",&topology_timeout_mult);
413           argv++, argc--;
414           continue;
415         }
416
417       /*
418        * Should we display the contents of packages beeing sent?
419        */
420       if (strcmp(*argv, "-dispin") == 0) 
421         {
422           argv++, argc--;
423           disp_pack_in = 1;
424           continue;
425         }
426
427       /*
428        * Should we display the contents of incoming packages?
429        */
430       if (strcmp(*argv, "-dispout") == 0) 
431         {
432           argv++, argc--;
433           disp_pack_out = 1;
434           continue;
435         }
436
437
438       /*
439        * Should we set up and send on a IPC socket for the front-end?
440        */
441       if (strcmp(*argv, "-ipc") == 0) 
442         {
443           argv++, argc--;
444           use_ipc = 1;
445           continue;
446         }
447
448
449       /*
450        * Display link-layer info(experimental)
451        */
452       if (strcmp(*argv, "-llinfo") == 0) 
453         {
454           argv++, argc--;
455           llinfo = 1;
456           continue;
457         }
458
459       /*
460        * Use Internet gateway tunneling?
461        */
462       if (strcmp(*argv, "-tnl") == 0) 
463         {
464           argv++, argc--;
465           use_tunnel = 1;
466
467           continue;
468         }
469
470
471       /*
472        * IPv6 multicast addr
473        */
474       if (strcmp(*argv, "-multi") == 0) 
475         {
476           argv++, argc--;
477           strncpy(ipv6_mult, *argv, 50);
478
479           argv++, argc--;
480
481           continue;
482         }
483
484
485       /*
486        * Should we display the contents of packages beeing sent?
487        */
488       if (strcmp(*argv, "-delgw") == 0) 
489         {
490           argv++, argc--;
491           del_gws = 1;
492           continue;
493         }
494
495
496       print_usage();
497       olsr_exit(__func__, EXIT_FAILURE);
498     }
499
500
501   /*
502    *Interfaces need to be specified
503    */
504   if(!option_i)
505     {
506       fprintf(stderr, "OLSRD: no interfaces specified!\nuse the -i switch to specify interface(s)\nor set interface(s) in the configuration file!\n");
507       print_usage();
508       olsr_exit(__func__, EXIT_FAILURE);
509     }
510
511   /*
512    *socket for icotl calls
513    */
514   if ((ioctl_s = socket(ipversion, SOCK_DGRAM, 0)) < 0) 
515     {
516       olsr_syslog(OLSR_LOG_ERR, "ioctl socket: %m");
517       close(ioctl_s);
518       olsr_exit(__func__, 0);
519     }
520
521
522   /* Type of service */
523   precedence = IPTOS_PREC(tos);
524   tos_bits = IPTOS_TOS(tos);
525
526
527   /*
528    *enable ip forwarding on host
529    */
530   enable_ip_forwarding(ipversion);
531
532
533
534
535   /* Initialize scheduler MUST HAPPEN BEFORE REGISTERING ANY FUNCTIONS! */
536   init_scheduler(polling_int);
537
538   /* Initialize parser */
539   olsr_init_parser();
540
541   /* Initialize message sequencnumber */
542   init_msg_seqno();
543
544   /* Initialize dynamic willingness calculation */
545   olsr_init_willingness();
546
547
548   /* Initialize values for emission data 
549    * This also initiates message generation
550    */
551   olsr_set_hello_interval(hello_int);
552   olsr_set_hello_nw_interval(hello_int_nw);
553   olsr_set_tc_interval(tc_int);
554   olsr_set_mid_interval(mid_int);
555   olsr_set_hna_interval(hna_int);
556
557   /* Print tables to stdout */
558   if(debug_level > 0)
559     olsr_register_scheduler_event(&generate_tabledisplay, hello_int, 0, NULL);
560
561
562   /* printout settings */
563   olsr_printf(1, "\n\
564 hello interval = %0.2f       hello int nonwireless = %0.2f \n\
565 tc interval = %0.2f          polling interval = %0.2f \n\
566 neighbor_hold_time = %0.2f   neighbor_hold_time_nw = %0.2f \n\
567 topology_hold_time = %0.2f  tos setting = %d \n\
568 hna_interval = %0.2f         mid_interval = %0.2f\n\
569 tc_redunadancy = %d          mpr coverage = %d\n", 
570               hello_int, hello_int_nw, \
571               tc_int, polling_int, \
572               neighbor_hold_time, neighbor_hold_time_nw, topology_hold_time, \
573               tos, hna_int, mid_int, \
574               tc_redundancy, mpr_coverage);
575       
576   if(use_hysteresis)
577     {
578       olsr_printf(1, "hysteresis scaling factor = %0.2f\nhysteresis threshold high = %0.2f\nhysteresis threshold low  = %0.2f\n\n",
579                   hyst_scaling,
580                   hyst_threshold_high,
581                   hyst_threshold_low);
582
583       if(hyst_threshold_high <= hyst_threshold_low)
584         {
585           printf("Hysteresis threshold high lower than threshold low!!\nEdit the configuration file to fix this!\n\n");
586           olsr_exit(__func__, EXIT_FAILURE);
587         }
588     }
589
590   if(ipversion == AF_INET)
591     {
592       if(bcast_set)
593         olsr_printf(2, "Using %s broadcast\n", olsr_ip_to_string((union olsr_ip_addr *) &bcastaddr.sin_addr));
594       else
595         olsr_printf(2, "Using broadcastaddresses fetched from interfaces\n");
596     }
597
598   /*
599    *Set up willingness/APM
600    */
601   if(!willingness_set)
602     {
603       if(apm_init() < 0)
604         {
605           olsr_printf(1, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT);
606
607           olsr_syslog(OLSR_LOG_ERR, "Could not read APM info - setting default willingness(%d)\n", WILL_DEFAULT);
608
609           willingness_set = 1;
610           my_willingness = WILL_DEFAULT;
611         }
612       else
613         {
614           my_willingness = olsr_calculate_willingness();
615
616           olsr_printf(1, "Willingness set to %d - next update in %.1f secs\n", my_willingness, will_int);
617         }
618     }
619
620   /**
621    *Set ipsize and minimum packetsize
622    */
623   if(ipversion == AF_INET6)
624     {
625       olsr_printf(1, "Using IP version 6\n");
626       ipsize = sizeof(struct in6_addr);
627
628       /* Set multicast address */
629       if(ipv6_addrtype == IPV6_ADDR_SITELOCAL)
630         {
631           /* Site local */
632           strncpy(ipv6_mult, ipv6_mult_site, 50);
633         }
634       else
635         {
636           /* Global */
637           strncpy(ipv6_mult, ipv6_mult_global, 50);
638         }
639
640       olsr_printf(1, "Using multicast address %s\n", ipv6_mult);
641
642       minsize = (int)sizeof(olsr_u8_t) * 7; /* Minimum packetsize IPv6 */
643     }
644   else
645     {
646       olsr_printf(1, "Using IP version 4\n");
647       ipsize = sizeof(olsr_u32_t);
648
649       minsize = (int)sizeof(olsr_u8_t) * 4; /* Minimum packetsize IPv4 */
650     }
651
652
653   /* Initializing networkinterfaces */
654
655   if(!ifinit())
656     {
657       if(allow_no_int)
658         {
659           fprintf(stderr, "No interfaces detected! This might be intentional, but it also might mean that your configuration is fubar.\nI will continue after 5 seconds...\n");
660           sleep(5);
661         }
662       else
663         {
664           fprintf(stderr, "No interfaces detected!\nBailing out!\n");
665           olsr_exit(__func__, EXIT_FAILURE);
666         }
667     }
668
669
670   gettimeofday(&now, NULL);
671
672
673   /* Initialize the IPC socket */
674
675   if(use_ipc)
676       ipc_init();
677
678 #ifndef WIN32
679   /* Initialize link-layer notifications */
680   if(llinfo)
681     init_link_layer_notification();
682 #endif
683
684   /* Initialisation of different tables to be used.*/
685   olsr_init_tables();
686
687   /* Load plugins */
688   olsr_load_plugins();
689
690   /* Set up recieving tunnel if Inet gw */
691   if(use_tunnel && inet_gw)
692     set_up_gw_tunnel(&main_addr);
693
694   olsr_printf(1, "Main address: %s\n\n", olsr_ip_to_string(&main_addr));
695
696   olsr_printf(1, "NEIGHBORS: l=linkstate, m=MPR, w=willingness\n\n");
697
698
699   /* daemon mode */
700 #ifndef WIN32
701   if (debug_level == 0)
702     {
703       printf("%s detattching from the current process...\n", SOFTWARE_VERSION);
704       if (fork() != 0)
705         {
706           exit(1);
707         }
708       setsid();
709     }
710 #endif
711   /* Starting scheduler */
712   start_scheduler(&thread);
713
714   /*
715    *signal-handlers
716    */
717
718   /* ctrl-C and friends */
719 #ifdef WIN32
720   SetConsoleCtrlHandler(SignalHandler, TRUE);
721 #else
722   signal(SIGINT, olsr_shutdown);  
723   signal(SIGTERM, olsr_shutdown);  
724 #endif
725
726   /* Go into listenloop */
727   listen_loop();
728
729   /* Like we're ever going to reach this ;-) */
730   return 1;
731
732 } /* main */
733
734
735
736
737
738
739 /**
740  *Function called at shutdown
741  *
742  */
743 #ifdef WIN32
744 int __stdcall
745 SignalHandler(unsigned long signal)
746 #else
747 void
748 olsr_shutdown(int signal)
749 #endif
750 {
751   struct interface *ifn;
752 #ifndef WIN32
753   if(main_thread != pthread_self())
754     {
755       pthread_exit(0);
756     }
757 #endif
758
759   olsr_printf(1, "Received signal %d - shutting down\n", signal);
760
761   olsr_delete_all_kernel_routes();
762
763   olsr_printf(1, "Closing sockets...\n");
764
765   /* front-end IPC socket */
766   if(use_ipc)
767     shutdown_ipc();
768
769   /* OLSR sockets */
770   for (ifn = ifnet; ifn; ifn = ifn->int_next) 
771     close(ifn->olsr_socket);
772
773   /* Closing plug-ins */
774   olsr_close_plugins();
775
776   /* Reset network settings */
777   restore_settings(ipversion);
778
779   /* ioctl socket */
780   close(ioctl_s);
781
782   olsr_syslog(OLSR_LOG_INFO, "%s stopped", SOFTWARE_VERSION);
783
784   olsr_printf(1, "\n <<<< %s - terminating >>>>\n           http://www.olsr.org\n", SOFTWARE_VERSION);
785
786   exit(exit_value);
787 }
788
789
790
791
792
793
794 /**
795  *Sets the default values of variables at startup
796  */
797 static void
798 set_default_values()
799 {
800   memset(&main_addr, 0, sizeof(union olsr_ip_addr));
801   memset(&null_addr6, 0, sizeof (union olsr_ip_addr));
802
803   allow_no_int = 1;
804
805   exit_value = EXIT_SUCCESS; 
806   /* If the application exits by signal it is concidered success,
807    * if not, exit_value is set by the function calling olsr_exit.
808    */
809
810   tos = 16;
811
812   if_names = NULL;
813
814   sending_tc = 0;
815
816   queued_ifs = 0;
817
818   mpr_coverage = MPR_COVERAGE;
819
820   maxmessagesize = MAXMESSAGESIZE;
821
822   ipv6_addrtype = IPV6_ADDR_SITELOCAL;
823
824   /* Default multicastaddresses */
825   strncpy(ipv6_mult_site, OLSR_IPV6_MCAST_SITE_LOCAL, strlen(OLSR_IPV6_MCAST_SITE_LOCAL));
826   strncpy(ipv6_mult_global, OLSR_IPV6_MCAST_GLOBAL, strlen(OLSR_IPV6_MCAST_GLOBAL));
827
828   /* EMISSION/HOLD INTERVALS */
829
830   hello_int = HELLO_INTERVAL;
831   hello_int_nw = HELLO_INTERVAL;
832   tc_int = TC_INTERVAL;
833   hna_int = 2 * TC_INTERVAL;
834   polling_int = 0.1;
835   mid_int = MID_INTERVAL;
836   will_int = 10 * HELLO_INTERVAL; /* Willingness update interval */
837
838   neighbor_timeout_mult = 3;
839   topology_timeout_mult = 3;
840   neighbor_timeout_mult_nw = 3;
841   mid_timeout_mult = 3;
842   hna_timeout_mult = 3;
843
844   topology_hold_time = TOP_HOLD_TIME;
845   neighbor_hold_time = NEIGHB_HOLD_TIME;
846   neighbor_hold_time_nw = NEIGHB_HOLD_TIME;
847   mid_hold_time = MID_HOLD_TIME;
848   hna_hold_time = 2 * (3 * TC_INTERVAL);
849   dup_hold_time = DUP_HOLD_TIME;
850
851   /* TC redundancy */
852   tc_redundancy = TC_REDUNDANCY;
853
854   /* Hysteresis */
855   use_hysteresis = 1;
856   hyst_scaling = HYST_SCALING;
857   hyst_threshold_low = HYST_THRESHOLD_LOW;
858   hyst_threshold_high = HYST_THRESHOLD_HIGH;
859
860   use_ipc = 0;
861   llinfo = 0;
862   bcast_set = 0;
863   del_gws = 0;
864   /* DEBUG ON BY DEFAULT */
865   debug_level = 1;
866
867 #ifndef WIN32
868   /* Get main thread ID */
869   main_thread = pthread_self();
870 #endif
871
872   /* local HNA set must be initialized before reading options */
873   olsr_init_local_hna_set();
874
875   /*
876    * set fixed willingness off by default
877    */
878   willingness_set = 0;
879
880   ipv6_mult[0] = 0;
881
882   /* Gateway tunneling */
883   use_tunnel = 0;
884   inet_tnl_added = 0;
885   gw_tunnel = 0;
886
887   /* Display packet content */
888   disp_pack_in = 0;
889   disp_pack_out = 0;
890
891   ipversion = AF_INET;
892 }
893
894
895
896
897 static void
898 print_usage()
899 {
900
901   fprintf(stderr, "An error occured somwhere between your keyboard and your chair!\n"); 
902   fprintf(stderr, "usage: olsrd [-f <configfile>] [ -i interface1 interface2 ... ]\n");
903   fprintf(stderr, "  [-d <debug_level>] [-ipv6] [-tnl] [-multi <IPv6 multicast address>]\n"); 
904   fprintf(stderr, "  [-bcast <broadcastaddr>] [-ipc] [-dispin] [-dispout] [-delgw]\n");
905   fprintf(stderr, "  [-midint <mid interval value (secs)>] [-hnaint <hna interval value (secs)>]\n");
906   fprintf(stderr, "  [-hint <hello interval value (secs)>] [-tcint <tc interval value (secs)>]\n");
907   fprintf(stderr, "  [-hhold <HELLO validity time as a multiplier of the HELLO interval>]\n");
908   fprintf(stderr, "  [-nhhold <HELLO validity time on non-wireless interfaces>]\n");
909   fprintf(stderr, "  [-thold <TC validity time as a multiplier of the TC interval>]\n");
910   fprintf(stderr, "  [-tos value (int)] [-nhint <hello interval value (secs) for non-WLAN>]\n");
911   fprintf(stderr, "  [-T <Polling Rate (secs)>]\n"); 
912
913 }