New configfile parser and configuration scheme integrated
[olsrd.git] / src / interfaces.c
1 /*
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2003 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  * $Id: interfaces.c,v 1.7 2004/10/18 13:13:36 kattemat Exp $
23  *
24  */
25
26 #include "defs.h"
27 #include "interfaces.h"
28 #include "ifnet.h"
29 #include "scheduler.h"
30
31 /**
32  *Do initialization of various data needed for
33  *network interface management.
34  *This function also tries to set up the given interfaces.
35  *
36  *@return the number of interfaces configured
37  */
38 int
39 ifinit()
40 {
41   struct if_name *tmp_if;
42
43
44   /* Initial values */
45   ifnet = NULL;
46   nbinterf = 0;
47
48   /*
49    *Initializing addrsock struct to be
50    *used on all the sockets
51    */
52   if(olsr_cnf->ip_version == AF_INET)
53     {
54       /* IP version 4 */
55       memset(&addrsock, 0, sizeof (addrsock));
56       addrsock.sin_family = AF_INET;
57       addrsock.sin_port = olsr_udp_port;
58       (addrsock.sin_addr).s_addr = INADDR_ANY;
59     }
60   else
61     {
62       /* IP version 6 */
63       memset(&addrsock6, 0, sizeof (addrsock6));
64       addrsock6.sin6_family = AF_INET6;
65       addrsock6.sin6_port = olsr_udp_port;
66       //(addrsock6.sin6_addr).s_addr = IN6ADDR_ANY_INIT;
67     }
68
69   olsr_printf(1, "\n ---- Interface configuration ---- \n\n");
70   /* Run trough all interfaces immedeatly */
71   for(tmp_if = if_names; tmp_if != NULL; tmp_if = tmp_if->next)
72     {
73       chk_if_up(tmp_if, 1);     
74     }
75   
76   /* register network interface update function with scheduler */
77   olsr_register_scheduler_event(&check_interface_updates, NULL, 5.0, 0, NULL);
78
79   return nbinterf;
80 }
81
82
83
84 /**
85  *Find the local interface with a given address.
86  *
87  *@param addr the address to check.
88  *
89  *@return the interface struct representing the interface
90  *that matched the address.
91  */
92
93 struct interface *
94 if_ifwithaddr(union olsr_ip_addr *addr)
95 {
96   struct interface *ifp;
97
98   for (ifp = ifnet; ifp; ifp = ifp->int_next)
99     {
100       if(olsr_cnf->ip_version == AF_INET)
101         {
102           /* IPv4 */
103           //printf("Checking: %s == ", inet_ntoa(((struct sockaddr_in *)&ifp->int_addr)->sin_addr));
104           //printf("%s\n", olsr_ip_to_string(addr));
105
106           if (COMP_IP(&((struct sockaddr_in *)&ifp->int_addr)->sin_addr, addr))
107               return ifp;
108         }
109       else
110         {
111           /* IPv6 */
112           //printf("Checking %s ", olsr_ip_to_string((union olsr_ip_addr *)&ifp->int6_addr.sin6_addr));
113           //printf("== %s\n", olsr_ip_to_string((union olsr_ip_addr *)&((struct sockaddr_in6 *)addr)->sin6_addr));
114           if (COMP_IP(&ifp->int6_addr.sin6_addr, addr))
115             return ifp;
116         }
117     }
118   return NULL;
119 }
120
121
122
123 /**
124  *Find the interface with a given number.
125  *
126  *@param nr the number of the interface to find.
127  *
128  *@return return the interface struct representing the interface
129  *that matched the number.
130  */
131 struct interface *
132 if_ifwithsock(int fd)
133 {
134   struct interface *ifp;
135   ifp = ifnet;
136
137   while (ifp) 
138     {
139       if (ifp->olsr_socket == fd)
140         return ifp;
141       ifp = ifp->int_next;
142     }
143   
144   return (ifp);
145 }
146
147
148
149
150 /**
151  *Create a new interf_name struct using a given
152  *name and insert it into the interface list.
153  *
154  *@param name the name of the interface.
155  *
156  *@return nada
157  */
158 void
159 queue_if(char *name, struct if_config_options *ico)
160 {
161
162   struct if_name *interf_n;
163
164   //printf("Adding interface %s\n", name);
165
166   /* check if the inerfaces already exists */
167   interf_n = if_names;
168   while(interf_n != NULL)
169     {
170       if(memcmp(interf_n->name, name, strlen(name)) == 0)
171         {
172           fprintf(stderr, "Duplicate interfaces defined... not adding %s\n", name);
173           return;
174         }
175       interf_n = interf_n->next;
176     }
177
178   interf_n = olsr_malloc(sizeof(struct if_name), "queue interface");
179
180   /* strlen () does not return length including terminating /0 */
181   interf_n->name = olsr_malloc(strlen(name) + 1, "queue interface name");
182   interf_n->cnf = ico;
183   interf_n->max_jitter = ico->hello_params.emission_interval / 4;
184   interf_n->configured = 0;
185   interf_n->interf = NULL;
186   interf_n->index = queued_ifs++;
187
188   strcpy(interf_n->name, name);
189   interf_n->next = if_names;
190   if_names = interf_n;
191
192 }
193
194
195
196
197 /**
198  *Add an ifchange function. These functions are called on all (non-initial)
199  *changes in the interface set.
200  *
201  *@param
202  *
203  *@return
204  */
205 int
206 add_ifchgf(int (*f)(struct interface *, int))
207 {
208
209   struct ifchgf *new_ifchgf;
210
211   new_ifchgf = olsr_malloc(sizeof(struct ifchgf), "Add ifchgfunction");
212
213   new_ifchgf->next = ifchgf_list;
214   new_ifchgf->function = f;
215
216   ifchgf_list = new_ifchgf;
217
218   return 1;
219 }
220
221
222
223 /*
224  * Remove an ifchange function
225  */
226 int
227 del_ifchgf(int (*f)(struct interface *, int))
228 {
229   struct ifchgf *tmp_ifchgf, *prev;
230
231   tmp_ifchgf = ifchgf_list;
232   prev = NULL;
233
234   while(tmp_ifchgf)
235     {
236       if(tmp_ifchgf->function == f)
237         {
238           /* Remove entry */
239           if(prev == NULL)
240             {
241               ifchgf_list = tmp_ifchgf->next;
242               free(tmp_ifchgf);
243             }
244           else
245             {
246               prev->next = tmp_ifchgf->next;
247               free(tmp_ifchgf);
248             }
249           return 1;
250         }
251       prev = tmp_ifchgf;
252       tmp_ifchgf = tmp_ifchgf->next;
253     }
254
255   return 0;
256 }