f04bcca169663a71d8167fb07f65bca91422a363
[olsrd.git] / src / linux / ifnet.c
1
2 /*
3  * OLSR ad-hoc routing table management protocol
4  * Copyright (C) 2003 Andreas T√łnnesen (andreto@ifi.uio.no)
5  *
6  * This file is part of olsr.org.
7  *
8  * olsr.org is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * olsr.org is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with olsr.org; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  * 
22  * 
23  * $Id: ifnet.c,v 1.10 2004/09/26 10:47:27 kattemat Exp $
24  *
25  */
26
27
28 /*
29  *Wireless definitions for ioctl calls
30  *(from linux/wireless.h)
31  */
32 #define SIOCGIWNAME     0x8B01          /* get name == wireless protocol */
33 #define SIOCSIWNWID     0x8B02          /* set network id (the cell) */
34 #define SIOCGIWNWID     0x8B03          /* get network id */
35 #define SIOCSIWFREQ     0x8B04          /* set channel/frequency (Hz) */
36 #define SIOCGIWFREQ     0x8B05          /* get channel/frequency (Hz) */
37 #define SIOCSIWMODE     0x8B06          /* set operation mode */
38 #define SIOCGIWMODE     0x8B07          /* get operation mode */
39 #define SIOCSIWSENS     0x8B08          /* set sensitivity (dBm) */
40 #define SIOCGIWSENS     0x8B09          /* get sensitivity (dBm) */
41
42
43 #include "../interfaces.h"
44 #include "../ifnet.h"
45 #include "../defs.h"
46 #include "../net_os.h"
47 #include "../socket_parser.h"
48 #include "../parser.h"
49 #include <signal.h>
50 #include <net/if.h>
51 #include <net/if_arp.h>
52 #include <asm/types.h>
53 #include <arpa/inet.h>
54 #include <netdb.h>
55
56
57
58 int
59 set_flag(char *ifname, short flag)
60 {
61   struct ifreq ifr;
62
63   strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
64
65   /* Get flags */
66   if (ioctl(ioctl_s, SIOCGIFFLAGS, &ifr) < 0) 
67     {
68       fprintf(stderr,"ioctl (get interface flags)");
69       return -1;
70     }
71
72   strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
73   
74   //printf("Setting flags for if \"%s\"\n", ifr.ifr_name);
75
76   if(!(ifr.ifr_flags & (IFF_UP | IFF_RUNNING)))
77     {
78       /* Add UP */
79       ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
80       /* Set flags + UP */
81       if(ioctl(ioctl_s, SIOCSIFFLAGS, &ifr) < 0)
82         {
83           fprintf(stderr, "ERROR(%s): %s\n", ifr.ifr_name, strerror(errno));
84           return -1;
85         }
86     }
87   return 1;
88
89 }
90
91
92
93
94 void
95 check_interface_updates()
96 {
97   struct if_name *tmp_if;
98
99 #ifdef DEBUG
100   olsr_printf(3, "Checking for updates in the interface set\n");
101 #endif
102
103   for(tmp_if = if_names; tmp_if != NULL; tmp_if = tmp_if->next)
104     {
105
106       if(tmp_if->configured)
107         chk_if_changed(tmp_if);
108       else
109         chk_if_up(tmp_if, 1);
110     }
111
112   return;
113 }
114
115 /**
116  * Checks if an initialized interface is changed
117  * that is if it has been set down or the address
118  * has been changed.
119  *
120  *@param iface the if_name struct describing the interface
121  */
122 int
123 chk_if_changed(struct if_name *iface)
124 {
125   struct interface *ifp, *tmp_ifp;
126   struct ifreq ifr;
127   struct sockaddr_in6 tmp_saddr6;
128   int if_changes;
129   struct ifchgf *tmp_ifchgf_list;
130   if_changes = 0;
131
132 #ifdef DEBUG
133   olsr_printf(3, "Checking if %s is set down or changed\n", iface->name);
134 #endif
135
136   ifp = iface->interf;
137
138   if(ifp == NULL)
139     {
140       /* Should not happen */
141       iface->configured = 0;
142       return 0;
143     }
144
145   memset(&ifr, 0, sizeof(struct ifreq));
146   strncpy(ifr.ifr_name, iface->name, IFNAMSIZ);
147
148
149   /* Get flags (and check if interface exists) */
150   if (ioctl(ioctl_s, SIOCGIFFLAGS, &ifr) < 0) 
151     {
152       olsr_printf(1, "No such interface: %s\n", iface->name);
153       goto remove_interface;
154     }
155
156   ifp->int_flags = ifr.ifr_flags | IFF_INTERFACE;
157
158   /*
159    * First check if the interface is set DOWN
160    */
161
162   if ((ifp->int_flags & IFF_UP) == 0)
163     {
164       olsr_printf(1, "\tInterface %s not up - removing it...\n", iface->name);
165       goto remove_interface;
166     }
167
168   /*
169    * We do all the interface type checks over.
170    * This is because the interface might be a PCMCIA card. Therefore
171    * It might not be the same physical interface as we configured earlier.
172    */
173
174   /* Check broadcast */
175   if ((ipversion == AF_INET) && (!(ifp->int_flags & IFF_BROADCAST))) 
176     {
177       olsr_printf(1, "\tNo broadcast - removing\n");
178       goto remove_interface;
179     }
180
181   if (ifp->int_flags & IFF_LOOPBACK)
182     {
183       olsr_printf(1, "\tThis is a loopback interface - removing it...\n");
184       goto remove_interface;
185     }
186
187
188   /* trying to detect if interface is wireless. */
189   ifp->is_wireless = check_wireless_interface(&ifr);
190
191   /* Set interface metric */
192   ifp->int_metric = ifp->is_wireless;
193
194   /* Get MTU */
195   if (ioctl(ioctl_s, SIOCGIFMTU, &ifr) < 0)
196     ifp->int_mtu = 0;
197   else
198     {
199       if(ifp->int_mtu != ifr.ifr_mtu)
200         {
201           ifp->int_mtu = ifr.ifr_mtu;
202           /* Create new outputbuffer */
203           net_remove_buffer(ifp); /* Remove old */
204           net_add_buffer(ifp);
205         }
206     }
207
208
209   /* Get interface index */
210   ifp->if_index = if_nametoindex(ifr.ifr_name);
211
212   /*
213    * Now check if the IP has changed
214    */
215   
216   /* IP version 6 */
217   if(ipversion == AF_INET6)
218     {
219       /* Get interface address */
220       
221       if(get_ipv6_address(ifr.ifr_name, &tmp_saddr6, ipv6_addrtype) <= 0)
222         {
223           if(ipv6_addrtype == IPV6_ADDR_SITELOCAL)
224             olsr_printf(1, "\tCould not find site-local IPv6 address for %s\n", ifr.ifr_name);
225           else
226             olsr_printf(1, "\tCould not find global IPv6 address for %s\n", ifr.ifr_name);
227           
228           
229           goto remove_interface;
230         }
231       
232 #ifdef DEBUG
233       olsr_printf(3, "\tAddress: %s\n", ip6_to_string(&tmp_saddr6.sin6_addr));
234 #endif
235
236       if(memcmp(&tmp_saddr6.sin6_addr, &ifp->int6_addr.sin6_addr, ipsize) != 0)
237         {
238           olsr_printf(1, "New IP address for %s:\n", ifr.ifr_name);
239           olsr_printf(1, "\tOld: %s\n", ip6_to_string(&ifp->int6_addr.sin6_addr));
240           olsr_printf(1, "\tNew: %s\n", ip6_to_string(&tmp_saddr6.sin6_addr));
241
242           /* Check main addr */
243           if(memcmp(&main_addr, &tmp_saddr6.sin6_addr, ipsize) == 0)
244             {
245               /* Update main addr */
246               memcpy(&main_addr, &tmp_saddr6.sin6_addr, ipsize);
247             }
248
249           /* Update address */
250           memcpy(&ifp->int6_addr.sin6_addr, &tmp_saddr6.sin6_addr, ipsize);
251           memcpy(&ifp->ip_addr, &tmp_saddr6.sin6_addr, ipsize);
252
253           /*
254            *Call possible ifchange functions registered by plugins  
255            */
256           tmp_ifchgf_list = ifchgf_list;
257           while(tmp_ifchgf_list != NULL)
258             {
259               tmp_ifchgf_list->function(ifp, IFCHG_IF_UPDATE);
260               tmp_ifchgf_list = tmp_ifchgf_list->next;
261             }
262
263           return 1;               
264         }
265       return 0;
266
267     }
268   else
269   /* IP version 4 */
270     {
271       /* Check interface address (IPv4)*/
272       if(ioctl(ioctl_s, SIOCGIFADDR, &ifr) < 0) 
273         {
274           olsr_printf(1, "\tCould not get address of interface - removing it\n");
275           goto remove_interface;
276         }
277
278 #ifdef DEBUG
279       olsr_printf(3, "\tAddress:%s\n", sockaddr_to_string(&ifr.ifr_addr));
280 #endif
281
282       if(memcmp(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr,
283                 &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr, 
284                 ipsize) != 0)
285         {
286           /* New address */
287           olsr_printf(1, "IPv4 address changed for %s\n", ifr.ifr_name);
288           olsr_printf(1, "\tOld:%s\n", sockaddr_to_string(&ifp->int_addr));
289           olsr_printf(1, "\tNew:%s\n", sockaddr_to_string(&ifr.ifr_addr));
290           
291           if(memcmp(&main_addr, 
292                     &((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr, 
293                     ipsize) == 0)
294             {
295               olsr_printf(1, "New main address: %s\n", sockaddr_to_string(&ifr.ifr_addr));
296               olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", sockaddr_to_string(&ifr.ifr_addr));
297               memcpy(&main_addr, 
298                      &((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr, 
299                      ipsize);
300             }
301
302           ifp->int_addr = ifr.ifr_addr;
303           memcpy(&ifp->ip_addr, 
304                  &((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr, 
305                  ipsize);
306
307           if_changes = 1;
308         }
309
310       /* Check netmask */
311       if (ioctl(ioctl_s, SIOCGIFNETMASK, &ifr) < 0) 
312         {
313           olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
314           goto remove_interface;
315         }
316
317 #ifdef DEBUG
318       olsr_printf(3, "\tNetmask:%s\n", sockaddr_to_string(&ifr.ifr_netmask));
319 #endif
320
321       if(memcmp(&((struct sockaddr_in *)&ifp->int_netmask)->sin_addr.s_addr,
322                 &((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr.s_addr, 
323                 ipsize) != 0)
324         {
325           /* New address */
326           olsr_printf(1, "IPv4 netmask changed for %s\n", ifr.ifr_name);
327           olsr_printf(1, "\tOld:%s\n", sockaddr_to_string(&ifp->int_netmask));
328           olsr_printf(1, "\tNew:%s\n", sockaddr_to_string(&ifr.ifr_netmask));
329
330           ifp->int_netmask = ifr.ifr_netmask;
331
332           if_changes = 1;
333         }
334             
335       /* Check broadcast address */      
336       if (ioctl(ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) 
337         {
338           olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
339           goto remove_interface;
340         }
341
342 #ifdef DEBUG
343       olsr_printf(3, "\tBroadcast address:%s\n", sockaddr_to_string(&ifr.ifr_broadaddr));
344 #endif
345       
346       if(memcmp(&((struct sockaddr_in *)&ifp->int_broadaddr)->sin_addr.s_addr,
347                 &((struct sockaddr_in *)&ifr.ifr_broadaddr)->sin_addr.s_addr, 
348                 ipsize) != 0)
349         {
350
351           /* New address */
352           olsr_printf(1, "IPv4 broadcast changed for %s\n", ifr.ifr_name);
353           olsr_printf(1, "\tOld:%s\n", sockaddr_to_string(&ifp->int_broadaddr));
354           olsr_printf(1, "\tNew:%s\n", sockaddr_to_string(&ifr.ifr_broadaddr));
355
356           ifp->int_broadaddr = ifr.ifr_broadaddr;
357           if_changes = 1;
358         }            
359       
360     }
361
362   if(if_changes)
363     {
364       /*
365        *Call possible ifchange functions registered by plugins  
366        */
367       tmp_ifchgf_list = ifchgf_list;
368       while(tmp_ifchgf_list != NULL)
369         {
370           tmp_ifchgf_list->function(ifp, IFCHG_IF_UPDATE);
371           tmp_ifchgf_list = tmp_ifchgf_list->next;
372         }
373     }
374   return if_changes;
375
376
377  remove_interface:
378   olsr_printf(1, "Removing interface %s\n", iface->name);
379   olsr_syslog(OLSR_LOG_INFO, "Removing interface %s\n", iface->name);
380
381   /*
382    *Call possible ifchange functions registered by plugins  
383    */
384   tmp_ifchgf_list = ifchgf_list;
385   while(tmp_ifchgf_list != NULL)
386     {
387       tmp_ifchgf_list->function(ifp, IFCHG_IF_REMOVE);
388       tmp_ifchgf_list = tmp_ifchgf_list->next;
389     }
390   
391   /* Dequeue */
392   if(ifp == ifnet)
393     {
394       ifnet = ifp->int_next;
395     }
396   else
397     {
398       tmp_ifp = ifnet;
399       while(tmp_ifp->int_next != ifp)
400         {
401           tmp_ifp = tmp_ifp->int_next;
402         }
403       tmp_ifp->int_next = ifp->int_next;
404     }
405
406
407   /* Remove output buffer */
408   net_remove_buffer(ifp);
409
410   /* Check main addr */
411   if(COMP_IP(&main_addr, &ifp->ip_addr))
412     {
413       if(ifnet == NULL)
414         {
415           /* No more interfaces */
416           memset(&main_addr, 0, ipsize);
417           olsr_printf(1, "No more interfaces...\n");
418         }
419       else
420         {
421           COPY_IP(&main_addr, &ifnet->ip_addr);
422           olsr_printf(1, "New main address: %s\n", olsr_ip_to_string(&main_addr));
423           olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&main_addr));
424         }
425     }
426
427   nbinterf--;
428
429   iface->configured = 0;
430   iface->interf = NULL;
431   /* Close olsr socket */
432   close(ifp->olsr_socket);
433   remove_olsr_socket(ifp->olsr_socket, &olsr_input);
434   /* Free memory */
435   free(ifp->int_name);
436   free(ifp);
437
438   if((nbinterf == 0) && (!allow_no_int))
439     {
440       olsr_printf(1, "No more active interfaces - exiting.\n");
441       olsr_syslog(OLSR_LOG_INFO, "No more active interfaces - exiting.\n");
442       exit_value = EXIT_FAILURE;
443       kill(getpid(), SIGINT);
444     }
445
446   return 0;
447
448 }
449
450
451
452 /**
453  * Initializes a interface described by iface,
454  * if it is set up and is of the correct type.
455  *
456  *@param iface the if_name struct describing the interface
457  *@param so the socket to use for ioctls
458  *
459  */
460 int
461 chk_if_up(struct if_name *iface, int debuglvl)
462 {
463   struct interface ifs, *ifp;
464   struct ifreq ifr;
465   union olsr_ip_addr null_addr;
466   struct ifchgf *tmp_ifchgf_list;
467
468   memset(&ifr, 0, sizeof(struct ifreq));
469   strncpy(ifr.ifr_name, iface->name, IFNAMSIZ);
470
471   olsr_printf(debuglvl, "Checking %s:\n", ifr.ifr_name);
472
473   /* Get flags (and check if interface exists) */
474   if (ioctl(ioctl_s, SIOCGIFFLAGS, &ifr) < 0) 
475     {
476       olsr_printf(debuglvl, "\tNo such interface!\n");
477       return 0;
478     }
479
480   ifs.int_flags = ifr.ifr_flags | IFF_INTERFACE;      
481
482
483   if ((ifs.int_flags & IFF_UP) == 0)
484     {
485       olsr_printf(debuglvl, "\tInterface not up - skipping it...\n");
486       return 0;
487     }
488
489   /* Check broadcast */
490   if ((ipversion == AF_INET) && (!(ifs.int_flags & IFF_BROADCAST))) 
491     {
492       olsr_printf(debuglvl, "\tNo broadcast - skipping\n");
493       return 0;
494     }
495
496
497   if (ifs.int_flags & IFF_LOOPBACK)
498     {
499       olsr_printf(debuglvl, "\tThis is a loopback interface - skipping it...\n");
500       return 0;
501     }
502
503   /* trying to detect if interface is wireless. */
504   if(check_wireless_interface(&ifr))
505     {
506       olsr_printf(debuglvl, "\tWireless interface detected\n");
507       ifs.is_wireless = 1;
508     }
509   else
510     {
511       olsr_printf(debuglvl, "\tNot a wireless interface\n");
512       ifs.is_wireless = 0;
513     }
514
515   
516   /* IP version 6 */
517   if(ipversion == AF_INET6)
518     {
519       /* Get interface address */
520       
521       if(get_ipv6_address(ifr.ifr_name, &ifs.int6_addr, ipv6_addrtype) <= 0)
522         {
523           if(ipv6_addrtype == IPV6_ADDR_SITELOCAL)
524             olsr_printf(debuglvl, "\tCould not find site-local IPv6 address for %s\n", ifr.ifr_name);
525           else
526             olsr_printf(debuglvl, "\tCould not find global IPv6 address for %s\n", ifr.ifr_name);
527           
528           return 0;
529         }
530       
531       olsr_printf(debuglvl, "\tAddress: %s\n", ip6_to_string(&ifs.int6_addr.sin6_addr));
532       
533       
534       /* Set default multicast address */
535       if(inet_pton(AF_INET6, ipv6_mult, &ifs.int6_multaddr.sin6_addr) < 0)
536         {
537           perror("Convert multicastaddr");
538           return 0;
539         }
540           
541       /* Set address family */
542       ifs.int6_multaddr.sin6_family = AF_INET6;
543       /* Set port */
544       ifs.int6_multaddr.sin6_port = olsr_udp_port;
545       
546       olsr_printf(debuglvl, "\tMulticast: %s\n", ip6_to_string(&ifs.int6_multaddr.sin6_addr));
547       
548     }
549   /* IP version 4 */
550   else
551     {
552       /* Get interface address (IPv4)*/
553       if(ioctl(ioctl_s, SIOCGIFADDR, &ifr) < 0) 
554         {
555           olsr_printf(debuglvl, "\tCould not get address of interface - skipping it\n");
556           return 0;
557         }
558       
559       ifs.int_addr = ifr.ifr_addr;
560       
561       /* Find netmask */
562       
563       if (ioctl(ioctl_s, SIOCGIFNETMASK, &ifr) < 0) 
564         {
565           olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
566           return 0;
567         }
568       
569       ifs.int_netmask = ifr.ifr_netmask;
570       
571       /* Find broadcast address */
572       
573       if (ioctl(ioctl_s, SIOCGIFBRDADDR, &ifr) < 0) 
574         {
575           olsr_syslog(OLSR_LOG_ERR, "%s: ioctl (get broadaddr)", ifr.ifr_name);
576           return 0;
577         }
578       
579       ifs.int_broadaddr = ifr.ifr_broadaddr;
580       
581       
582       /* Deactivate IP spoof filter */
583       deactivate_spoof(ifr.ifr_name, nbinterf, ipversion);
584       
585       /* Disable ICMP redirects */
586       disable_redirects(ifr.ifr_name, nbinterf, ipversion);
587       
588     }
589   
590   
591   /* Get interface index */
592   
593   ifs.if_index = if_nametoindex(ifr.ifr_name);
594   
595   /* Set interface metric */
596   ifs.int_metric = ifs.is_wireless;
597   
598   /* setting the interfaces number*/
599   ifs.if_nr = iface->index;
600
601
602   /* Get MTU */
603   if (ioctl(ioctl_s, SIOCGIFMTU, &ifr) < 0)
604     ifs.int_mtu = OLSR_DEFAULT_MTU;
605   else
606     ifs.int_mtu = ifr.ifr_mtu;
607
608   /* Set up buffer */
609   net_add_buffer(&ifs);
610                
611   olsr_printf(1, "\tMTU: %d\n", ifs.int_mtu);
612
613   olsr_syslog(OLSR_LOG_INFO, "Adding interface %s\n", iface->name);
614   olsr_printf(1, "\tInterface %s set up for use with index %d\n", iface->name, ifs.if_nr);
615
616   if(ipversion == AF_INET)
617     {
618       olsr_printf(1, "\tAddress:%s\n", sockaddr_to_string(&ifs.int_addr));
619       olsr_printf(1, "\tNetmask:%s\n", sockaddr_to_string(&ifs.int_netmask));
620       olsr_printf(1, "\tBroadcast address:%s\n", sockaddr_to_string(&ifs.int_broadaddr));
621     }
622   else
623     {
624       olsr_printf(1, "\tAddress: %s\n", ip6_to_string(&ifs.int6_addr.sin6_addr));
625       olsr_printf(1, "\tMulticast: %s\n", ip6_to_string(&ifs.int6_multaddr.sin6_addr));
626     }
627
628   nbinterf++; 
629   
630   ifp = olsr_malloc(sizeof (struct interface), "Interface update 2");
631   
632   iface->configured = 1;
633   iface->interf = ifp;
634   
635   memcpy(ifp, &ifs, sizeof(struct interface));
636   
637   ifp->int_name = olsr_malloc(strlen(ifr.ifr_name) + 1, "Interface update 3");
638       
639   strcpy(ifp->int_name, ifr.ifr_name);
640   /* Segfaults if using strncpy(IFNAMSIZ) why oh why?? */
641   ifp->int_next = ifnet;
642   ifnet = ifp;
643
644   if(ipversion == AF_INET)
645     {
646       /* IP version 4 */
647       ifp->ip_addr.v4 = ((struct sockaddr_in *)&ifp->int_addr)->sin_addr.s_addr;
648       
649       /*
650        *We create one socket for each interface and bind
651        *the socket to it. This to ensure that we can control
652        *on what interface the message is transmitted
653        */
654       
655       ifp->olsr_socket = getsocket((struct sockaddr *)&addrsock, bufspace, ifp->int_name);
656       
657       if (ifp->olsr_socket < 0)
658         {
659           fprintf(stderr, "Could not initialize socket... exiting!\n\n");
660           olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
661           exit_value = EXIT_FAILURE;
662           kill(getpid(), SIGINT);
663         }
664     }
665   else
666     {
667       /* IP version 6 */
668       memcpy(&ifp->ip_addr, &ifp->int6_addr.sin6_addr, ipsize);
669
670       
671       /*
672        *We create one socket for each interface and bind
673        *the socket to it. This to ensure that we can control
674        *on what interface the message is transmitted
675        */
676       
677       ifp->olsr_socket = getsocket6(&addrsock6, bufspace, ifp->int_name);
678       
679       join_mcast(ifp, ifp->olsr_socket);
680       
681       if (ifp->olsr_socket < 0)
682         {
683           fprintf(stderr, "Could not initialize socket... exiting!\n\n");
684           olsr_syslog(OLSR_LOG_ERR, "Could not initialize socket... exiting!\n\n");
685           exit_value = EXIT_FAILURE;
686           kill(getpid(), SIGINT);
687         }
688       
689     }
690   
691   /* Register socket */
692   add_olsr_socket(ifp->olsr_socket, &olsr_input);
693   
694   
695   /* Set TOS */
696   
697   if (setsockopt(ifp->olsr_socket, SOL_SOCKET, SO_PRIORITY, (char*)&precedence, sizeof(precedence)) < 0)
698     {
699       perror("setsockopt(SO_PRIORITY)");
700       olsr_syslog(OLSR_LOG_ERR, "OLSRD: setsockopt(SO_PRIORITY) error %m");
701     }
702   if (setsockopt(ifp->olsr_socket, SOL_IP, IP_TOS, (char*)&tos_bits, sizeof(tos_bits)) < 0)    
703     {
704       perror("setsockopt(IP_TOS)");
705       olsr_syslog(OLSR_LOG_ERR, "setsockopt(IP_TOS) error %m");
706     }
707   
708   /*
709    *Initialize sequencenumber as a random 16bit value
710    */
711   ifp->olsr_seqnum = random() & 0xFFFF;
712
713   /*
714    * Set main address if this is the only interface
715    */
716   memset(&null_addr, 0, ipsize);
717   if(COMP_IP(&null_addr, &main_addr))
718     {
719       COPY_IP(&main_addr, &ifp->ip_addr);
720       olsr_printf(1, "New main address: %s\n", olsr_ip_to_string(&main_addr));
721       olsr_syslog(OLSR_LOG_INFO, "New main address: %s\n", olsr_ip_to_string(&main_addr));
722     }
723   
724   /*
725    *Call possible ifchange functions registered by plugins  
726    */
727   tmp_ifchgf_list = ifchgf_list;
728   while(tmp_ifchgf_list != NULL)
729     {
730       tmp_ifchgf_list->function(ifp, IFCHG_IF_ADD);
731       tmp_ifchgf_list = tmp_ifchgf_list->next;
732     }
733
734   return 1;
735 }
736
737
738
739
740 /**
741  *Check if a interface is wireless
742  *Returns 1 if no info can be gathered
743  *
744  *@param sock socket to use for kernel communication
745  *@param ifr a ifreq struct describing the interface
746  *
747  *@return 1 if interface is wireless(or no info was
748  *found) 0 if not.
749  */
750 int
751 check_wireless_interface(struct ifreq *ifr)
752 {
753   if(ioctl(ioctl_s, SIOCGIWNAME, ifr) >= 0)
754     {
755       return 1;
756     }
757   else
758     {
759       return 0;
760     }
761
762 }
763