37{
38 switch (net)
39 {
41 return "UNSPECIFIED";
42
44 return "LOOPBACK";
45
47 return "LAN";
48
50 return "WAN";
51
53 return "WLAN";
54
56 return "BLUETOOTH";
57
58 default:
59 return NULL;
60 }
61}
62
63
71{
76
81
86
91
96};
97
98
103{
108
113
118};
119
120
126static void
128{
130
131 while (NULL != (cur =
is->net_head))
132 {
135 cur);
137 }
138}
139
140
155static int
158 int isDefault,
159 const struct sockaddr *addr,
160 const struct sockaddr *broadcast_addr,
161 const struct sockaddr *
netmask,
162 socklen_t addrlen)
163{
165
167
169 (void) isDefault;
170 (void) broadcast_addr;
171
172
173 if (addr->sa_family == AF_INET)
174 {
175 const struct sockaddr_in *a4 = (const struct sockaddr_in *) addr;
176
177 if ((a4->sin_addr.s_addr & htonl (0xff000000)) == htonl (0x7f000000))
179 }
180
181 if (addr->sa_family == AF_INET6)
182 {
183 const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *) addr;
184 if (IN6_IS_ADDR_LOOPBACK (&a6->sin6_addr))
186 }
187
188 if (addr->sa_family == AF_INET)
189 {
190 const struct sockaddr_in *addr4 = (const struct sockaddr_in *) addr;
191 const struct sockaddr_in *netmask4 = (const struct sockaddr_in *) netmask;
192 struct sockaddr_in *tmp;
193 struct sockaddr_in network4;
194
196 sockaddr_in));
197 tmp = (struct sockaddr_in *) &net[1];
198 net->network = (struct sockaddr *) &tmp[0];
199 net->netmask = (struct sockaddr *) &tmp[1];
200 net->length = addrlen;
201
202 memset (&network4,
203 0,
204 sizeof(network4));
205 network4.sin_family = AF_INET;
206#if HAVE_SOCKADDR_IN_SIN_LEN
207 network4.sin_len = sizeof(network4);
208#endif
209 network4.sin_addr.s_addr = (addr4->sin_addr.s_addr
210 & netmask4->sin_addr.s_addr);
211
213 netmask4,
214 sizeof(struct sockaddr_in));
216 &network4,
217 sizeof(struct sockaddr_in));
218 }
219
220 if (addr->sa_family == AF_INET6)
221 {
222 const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *) addr;
223 const struct sockaddr_in6 *netmask6 = (const struct sockaddr_in6 *) netmask;
224 struct sockaddr_in6 *tmp;
225 struct sockaddr_in6 network6;
226
228 sockaddr_in6));
229 tmp = (struct sockaddr_in6 *) &net[1];
230 net->network = (struct sockaddr *) &tmp[0];
231 net->netmask = (struct sockaddr *) &tmp[1];
232 net->length = addrlen;
233
234 memset (&network6, 0, sizeof(network6));
235 network6.sin6_family = AF_INET6;
236#if HAVE_SOCKADDR_IN_SIN_LEN
237 network6.sin6_len = sizeof(network6);
238#endif
239 {
240 unsigned int c;
241 uint32_t *addr_elem = (uint32_t *) &addr6->sin6_addr;
242 uint32_t *mask_elem = (uint32_t *) &netmask6->sin6_addr;
243 uint32_t *net_elem = (uint32_t *) &network6.sin6_addr;
244 for (c = 0; c < 4; c++)
245 net_elem[c] = addr_elem[c] & mask_elem[c];
246
248 netmask6,
249 sizeof(struct sockaddr_in6));
251 &network6,
252 sizeof(struct sockaddr_in6));
253 }
254 }
255 if (NULL == net)
257
258
259#if VERBOSE_NT
261 addrlen));
263 "nt",
264 "Adding network `%s', netmask `%s'\n",
266 addrlen),
267 netmask);
269#endif
272 net);
273
275}
276
277
283static void
285{
287
288 is->interface_task = NULL;
296}
297
298
309 const struct sockaddr *addr,
310 socklen_t addrlen)
311{
314
315 switch (addr->sa_family)
316 {
317 case AF_UNIX:
319 break;
320
321 case AF_INET:
322 {
323 const struct sockaddr_in *a4 = (const struct sockaddr_in *) addr;
324
325 if ((a4->sin_addr.s_addr & htonl (0xff000000)) == htonl (0x7f000000))
327 break;
328 }
329
330 case AF_INET6:
331 {
332 const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *) addr;
333
334 if (IN6_IS_ADDR_LOOPBACK (&a6->sin6_addr))
336 break;
337 }
338
339 default:
341 break;
342 }
343
344
346 {
347 if (addrlen != cur->
length)
348 {
350 continue;
351 }
352 if (addr->sa_family == AF_INET)
353 {
354 const struct sockaddr_in *a4 = (const struct sockaddr_in *) addr;
355 const struct sockaddr_in *net4 = (const struct
357 const struct sockaddr_in *mask4 = (const struct
359
360 if (((a4->sin_addr.s_addr & mask4->sin_addr.s_addr)) ==
361 net4->sin_addr.s_addr)
363 }
364 if (addr->sa_family == AF_INET6)
365 {
366 const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *) addr;
367 const struct sockaddr_in6 *net6 = (const struct
369 const struct sockaddr_in6 *mask6 = (const struct
371
373 int c = 0;
374 uint32_t *addr_elem = (uint32_t *) &a6->sin6_addr;
375 uint32_t *mask_elem = (uint32_t *) &mask6->sin6_addr;
376 uint32_t *net_elem = (uint32_t *) &net6->sin6_addr;
377 for (c = 0; c < 4; c++)
378 if ((addr_elem[c] & mask_elem[c]) != net_elem[c])
380
383 }
385 }
386
387
391 "nt-scanner-api",
392 "`%s' is in network `%s'\n",
394 addrlen),
397}
398
399
407{
409
418}
419
420
426void
428{
429 if (NULL !=
is->interface_task)
430 {
432 is->interface_task = NULL;
433 }
436}
437
438
439
static struct GNUNET_TESTING_Interpreter * is
static char * name
Name (label) of the records to list.
static char * res
Currently read line or NULL on EOF.
static uint32_t type
Type string converted to DNS type value.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define GNUNET_log_from(kind, comp,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
const char * GNUNET_a2s(const struct sockaddr *addr, socklen_t addrlen)
Convert a "struct sockaddr*" (IPv4 or IPv6 address) to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_NetworkType
Types of networks (with separate quotas) we support.
void GNUNET_NT_scanner_done(struct GNUNET_NT_InterfaceScanner *is)
Client is done with the interface scanner, release resources.
struct GNUNET_NT_InterfaceScanner * GNUNET_NT_scanner_init()
Initialize the interface scanner.
enum GNUNET_NetworkType GNUNET_NT_scanner_get_type(struct GNUNET_NT_InterfaceScanner *is, const struct sockaddr *addr, socklen_t addrlen)
Returns where the address is located: LAN or WAN or ...
const char * GNUNET_NT_to_string(enum GNUNET_NetworkType net)
Convert a enum GNUNET_NetworkType to a string.
@ GNUNET_NT_WLAN
Wireless LAN (i.e.
@ GNUNET_NT_WAN
Wide area network (i.e.
@ GNUNET_NT_UNSPECIFIED
Category of last resort.
@ GNUNET_NT_LAN
Local area network.
@ GNUNET_NT_LOOPBACK
Loopback (same host).
@ GNUNET_NT_BT
Bluetooth LAN.
void GNUNET_OS_network_interfaces_list(GNUNET_OS_NetworkInterfaceProcessor proc, void *proc_cls)
Enumerate all network interfaces.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
static int interface_proc(void *cls, const char *name, int isDefault, const struct sockaddr *addr, const struct sockaddr *broadcast_addr, const struct sockaddr *netmask, socklen_t addrlen)
Function invoked for each interface found.
static void delete_networks(struct GNUNET_NT_InterfaceScanner *is)
Delete all entries from the current network list.
#define INTERFACE_PROCESSING_INTERVAL
How frequently do we scan the interfaces for changes to the addresses?
static void get_addresses(void *cls)
Periodically get list of network addresses from our interfaces.
Handle to the interface scanner.
struct NT_Network * net_head
Head of LAN networks list.
struct NT_Network * net_tail
Tail of LAN networks list.
struct GNUNET_SCHEDULER_Task * interface_task
Task for periodically refreshing our LAN network list.
Entry in list of pending tasks.
We keep a list of our local networks so we can answer LAN vs.
struct NT_Network * next
Kept in a DLL.
socklen_t length
How long are network and netmask?
struct sockaddr * network
Network address.
struct NT_Network * prev
Kept in a DLL.
struct sockaddr * netmask
Netmask to determine what is in the LAN.