Updated configfile format. Interface options are now set in the Interface section
[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.10 2004/11/01 20:13:27 kattemat Exp $
23  *
24  */
25
26 #include "defs.h"
27 #include "interfaces.h"
28 #include "ifnet.h"
29 #include "scheduler.h"
30 #include "main.h"
31
32 /**
33  *Do initialization of various data needed for
34  *network interface management.
35  *This function also tries to set up the given interfaces.
36  *
37  *@return the number of interfaces configured
38  */
39 int
40 ifinit()
41 {
42   struct olsr_if *tmp_if;
43
44
45   /* Initial values */
46   ifnet = NULL;
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 = olsr_cnf->interfaces; 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 (ifnet == NULL) ? 0 : 1;
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  *Create a new interf_name struct using a given
150  *name and insert it into the interface list.
151  *
152  *@param name the name of the interface.
153  *
154  *@return nada
155  */
156 void
157 queue_if(char *name)
158 {
159
160   struct olsr_if *interf_n = olsr_cnf->interfaces;
161
162   //printf("Adding interface %s\n", name);
163
164   /* check if the inerfaces already exists */
165   while(interf_n != NULL)
166     {
167       if(memcmp(interf_n->name, name, strlen(name)) == 0)
168         {
169           fprintf(stderr, "Duplicate interfaces defined... not adding %s\n", name);
170           return;
171         }
172       interf_n = interf_n->next;
173     }
174
175   interf_n = olsr_malloc(sizeof(struct olsr_if), "queue interface");
176
177   /* strlen () does not return length including terminating /0 */
178   interf_n->name = olsr_malloc(strlen(name) + 1, "queue interface name");
179   interf_n->cnf = NULL;
180   interf_n->interf = NULL;
181   interf_n->configured = 0;
182   interf_n->index = olsr_cnf->ifcnt++;
183
184   strcpy(interf_n->name, name);
185   interf_n->next = olsr_cnf->interfaces;
186   olsr_cnf->interfaces = interf_n;
187
188 }
189
190
191
192 /**
193  *Add an ifchange function. These functions are called on all (non-initial)
194  *changes in the interface set.
195  *
196  *@param
197  *
198  *@return
199  */
200 int
201 add_ifchgf(int (*f)(struct interface *, int))
202 {
203
204   struct ifchgf *new_ifchgf;
205
206   new_ifchgf = olsr_malloc(sizeof(struct ifchgf), "Add ifchgfunction");
207
208   new_ifchgf->next = ifchgf_list;
209   new_ifchgf->function = f;
210
211   ifchgf_list = new_ifchgf;
212
213   return 1;
214 }
215
216
217
218 /*
219  * Remove an ifchange function
220  */
221 int
222 del_ifchgf(int (*f)(struct interface *, int))
223 {
224   struct ifchgf *tmp_ifchgf, *prev;
225
226   tmp_ifchgf = ifchgf_list;
227   prev = NULL;
228
229   while(tmp_ifchgf)
230     {
231       if(tmp_ifchgf->function == f)
232         {
233           /* Remove entry */
234           if(prev == NULL)
235             {
236               ifchgf_list = tmp_ifchgf->next;
237               free(tmp_ifchgf);
238             }
239           else
240             {
241               prev->next = tmp_ifchgf->next;
242               free(tmp_ifchgf);
243             }
244           return 1;
245         }
246       prev = tmp_ifchgf;
247       tmp_ifchgf = tmp_ifchgf->next;
248     }
249
250   return 0;
251 }