aboutsummaryrefslogtreecommitdiff
path: root/src/ats/gnunet-service-ats_addresses.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-12-12 12:52:42 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-12-12 12:52:42 +0000
commit0b4f4ec3c5044ee04bd4c0cb75ea68514e0bd66b (patch)
tree4fb6a3992d82f76722004faee35e2dceeb625ce7 /src/ats/gnunet-service-ats_addresses.c
parentbae4adf27097b3e09c2a32c572e556274699a9b1 (diff)
downloadgnunet-0b4f4ec3c5044ee04bd4c0cb75ea68514e0bd66b.tar.gz
gnunet-0b4f4ec3c5044ee04bd4c0cb75ea68514e0bd66b.zip
WAN/LAN detection
Diffstat (limited to 'src/ats/gnunet-service-ats_addresses.c')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index e9f7539be..fddcc2dd8 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -73,6 +73,20 @@ struct ATS_Address
73 73
74}; 74};
75 75
76struct ATS_Network
77{
78 struct ATS_Network * next;
79
80 struct ATS_Network * prev;
81
82 void *network;
83 socklen_t length;
84};
85
86
87struct ATS_Network * net_head;
88
89struct ATS_Network * net_tail;
76 90
77static struct GNUNET_CONTAINER_MultiHashMap *addresses; 91static struct GNUNET_CONTAINER_MultiHashMap *addresses;
78 92
@@ -82,6 +96,8 @@ static unsigned long long wan_quota_out;
82 96
83static unsigned int active_addr_count; 97static unsigned int active_addr_count;
84 98
99static GNUNET_SCHEDULER_TaskIdentifier interface_task;
100
85 101
86/** 102/**
87 * Update a bandwidth assignment for a peer. This trivial method currently 103 * Update a bandwidth assignment for a peer. This trivial method currently
@@ -458,6 +474,66 @@ GAS_addresses_change_preference (const struct GNUNET_PeerIdentity *peer,
458 // do nothing for now... 474 // do nothing for now...
459} 475}
460 476
477/**
478 * Returns where the address is located: LAN or WAN or ...
479 * @param addr address
480 * @param addrlen address length
481 * @return location as GNUNET_ATS_Information
482 */
483
484struct GNUNET_ATS_Information
485GAS_addresses_type (struct sockaddr * addr, socklen_t addrlen)
486{
487 struct GNUNET_ATS_Information ats;
488 /* FIXME */
489 ats.type = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
490 ats.value = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
491 return ats;
492}
493
494static int
495interface_proc (void *cls, const char *name,
496 int isDefault,
497 const struct sockaddr *
498 addr,
499 const struct sockaddr *
500 broadcast_addr,
501 const struct sockaddr *
502 netmask, socklen_t addrlen)
503{
504 // GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Address: %s\n", GNUNET_a2s(addr, addrlen));
505
506 struct ATS_Network *net = GNUNET_malloc(sizeof (struct ATS_Network) + addrlen);
507 /* Calculate network */
508 net->length = addrlen;
509
510 /* Store in list */
511 GNUNET_CONTAINER_DLL_insert(net_head, net_tail, net);
512
513 return GNUNET_OK;
514}
515
516static void
517delete_networks ()
518{
519 struct ATS_Network * cur = net_head;
520 while (cur != NULL)
521 {
522 GNUNET_CONTAINER_DLL_remove(net_head, net_tail, cur);
523 GNUNET_free (cur);
524 cur = net_head;
525 }
526}
527
528static void
529get_addresses (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
530{
531 interface_task = GNUNET_SCHEDULER_NO_TASK;
532 delete_networks ();
533 GNUNET_OS_network_interfaces_list(interface_proc, NULL);
534
535 interface_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, get_addresses, NULL);
536}
461 537
462/** 538/**
463 * Initialize address subsystem. 539 * Initialize address subsystem.
@@ -476,6 +552,8 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
476 "WAN_QUOTA_OUT", 552 "WAN_QUOTA_OUT",
477 &wan_quota_out)); 553 &wan_quota_out));
478 addresses = GNUNET_CONTAINER_multihashmap_create (128); 554 addresses = GNUNET_CONTAINER_multihashmap_create (128);
555
556 interface_task = GNUNET_SCHEDULER_add_now(get_addresses, NULL);
479} 557}
480 558
481 559
@@ -512,6 +590,12 @@ GAS_addresses_destroy_all ()
512void 590void
513GAS_addresses_done () 591GAS_addresses_done ()
514{ 592{
593 delete_networks ();
594 if (interface_task != GNUNET_SCHEDULER_NO_TASK)
595 {
596 GNUNET_SCHEDULER_cancel(interface_task);
597 interface_task = GNUNET_SCHEDULER_NO_TASK;
598 }
515 GAS_addresses_destroy_all (); 599 GAS_addresses_destroy_all ();
516 GNUNET_CONTAINER_multihashmap_destroy (addresses); 600 GNUNET_CONTAINER_multihashmap_destroy (addresses);
517 addresses = NULL; 601 addresses = NULL;