33 #define INTERFACE_PROCESSING_INTERVAL GNUNET_TIME_relative_multiply ( \ 34 GNUNET_TIME_UNIT_MINUTES, 2) 139 while (NULL != (cur = is->
net_head))
167 const struct sockaddr *addr,
168 const struct sockaddr *broadcast_addr,
169 const struct sockaddr *
netmask,
178 (void) broadcast_addr;
181 if (addr->sa_family == AF_INET)
183 const struct sockaddr_in *a4 = (
const struct sockaddr_in *) addr;
185 if ((a4->sin_addr.s_addr & htonl (0xff000000)) == htonl (0x7f000000))
189 if (addr->sa_family == AF_INET6)
191 const struct sockaddr_in6 *a6 = (
const struct sockaddr_in6 *) addr;
192 if (IN6_IS_ADDR_LOOPBACK (&a6->sin6_addr))
196 if (addr->sa_family == AF_INET)
198 const struct sockaddr_in *addr4 = (
const struct sockaddr_in *) addr;
199 const struct sockaddr_in *netmask4 = (
const struct sockaddr_in *) netmask;
200 struct sockaddr_in *tmp;
201 struct sockaddr_in network4;
205 tmp = (
struct sockaddr_in *) &net[1];
206 net->network = (
struct sockaddr *) &tmp[0];
207 net->netmask = (
struct sockaddr *) &tmp[1];
208 net->length = addrlen;
213 network4.sin_family = AF_INET;
214 #if HAVE_SOCKADDR_IN_SIN_LEN 215 network4.sin_len =
sizeof(network4);
217 network4.sin_addr.s_addr = (addr4->sin_addr.s_addr
218 & netmask4->sin_addr.s_addr);
222 sizeof(
struct sockaddr_in));
225 sizeof(
struct sockaddr_in));
228 if (addr->sa_family == AF_INET6)
230 const struct sockaddr_in6 *addr6 = (
const struct sockaddr_in6 *) addr;
231 const struct sockaddr_in6 *netmask6 = (
const struct sockaddr_in6 *) netmask;
232 struct sockaddr_in6 *tmp;
233 struct sockaddr_in6 network6;
237 tmp = (
struct sockaddr_in6 *) &net[1];
238 net->network = (
struct sockaddr *) &tmp[0];
239 net->netmask = (
struct sockaddr *) &tmp[1];
240 net->length = addrlen;
242 memset (&network6, 0,
sizeof(network6));
243 network6.sin6_family = AF_INET6;
244 #if HAVE_SOCKADDR_IN_SIN_LEN 245 network6.sin6_len =
sizeof(network6);
248 uint32_t *addr_elem = (uint32_t *) &addr6->sin6_addr;
249 uint32_t *mask_elem = (uint32_t *) &netmask6->sin6_addr;
250 uint32_t *net_elem = (uint32_t *) &network6.sin6_addr;
251 for (c = 0; c < 4; c++)
252 net_elem[c] = addr_elem[c] & mask_elem[c];
256 sizeof(
struct sockaddr_in6));
259 sizeof(
struct sockaddr_in6));
270 "Adding network `%s', netmask `%s'\n",
315 const struct sockaddr *addr,
321 switch (addr->sa_family)
329 const struct sockaddr_in *a4 = (
const struct sockaddr_in *) addr;
331 if ((a4->sin_addr.s_addr & htonl (0xff000000)) == htonl (0x7f000000))
338 const struct sockaddr_in6 *a6 = (
const struct sockaddr_in6 *) addr;
340 if (IN6_IS_ADDR_LOOPBACK (&a6->sin6_addr))
353 if (addrlen != cur->
length)
358 if (addr->sa_family == AF_INET)
360 const struct sockaddr_in *a4 = (
const struct sockaddr_in *) addr;
361 const struct sockaddr_in *net4 = (
const struct 363 const struct sockaddr_in *mask4 = (
const struct 366 if (((a4->sin_addr.s_addr & mask4->sin_addr.s_addr)) ==
367 net4->sin_addr.s_addr)
370 if (addr->sa_family == AF_INET6)
372 const struct sockaddr_in6 *a6 = (
const struct sockaddr_in6 *) addr;
373 const struct sockaddr_in6 *net6 = (
const struct 375 const struct sockaddr_in6 *mask6 = (
const struct 380 uint32_t *addr_elem = (uint32_t *) &a6->sin6_addr;
381 uint32_t *mask_elem = (uint32_t *) &mask6->sin6_addr;
382 uint32_t *net_elem = (uint32_t *) &net6->sin6_addr;
383 for (c = 0; c < 4; c++)
384 if ((addr_elem[c] & mask_elem[c]) != net_elem[c])
398 "`%s' is in network `%s'\n",
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
Handle to 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 ...
We keep a list of our local networks so we can answer LAN vs.
const char * GNUNET_NT_to_string(enum GNUNET_NetworkType net)
Convert a enum GNUNET_NetworkType to a string.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static void delete_networks(struct GNUNET_NT_InterfaceScanner *is)
Delete all entries from the current network list.
struct sockaddr * network
Network address.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
static struct GNUNET_NT_InterfaceScanner * is
Network scanner to determine network types.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_OS_network_interfaces_list(GNUNET_OS_NetworkInterfaceProcessor proc, void *proc_cls)
Enumerate all network interfaces.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
struct NT_Network * prev
Kept in a DLL.
GNUNET_NetworkType
Types of networks (with separate quotas) we support.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct NT_Network * net_head
Head of LAN networks list.
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.
struct NT_Network * net_tail
Tail of LAN networks list.
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.
socklen_t length
How long are network and netmask?
#define INTERFACE_PROCESSING_INTERVAL
How frequently do we scan the interfaces for changes to the addresses?
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)...
struct NT_Network * next
Kept in a DLL.
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.
struct sockaddr * netmask
Netmask to determine what is in the LAN.
Entry in list of pending tasks.
struct GNUNET_SCHEDULER_Task * interface_task
Task for periodically refreshing our LAN network list.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
#define GNUNET_log_from(kind, comp,...)
#define GNUNET_malloc(size)
Wrapper around malloc.
static void get_addresses(void *cls)
Periodically get list of network addresses from our interfaces.
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.