diff options
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.c | 84 | ||||
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.h | 9 |
2 files changed, 93 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 | ||
76 | struct 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 | |||
87 | struct ATS_Network * net_head; | ||
88 | |||
89 | struct ATS_Network * net_tail; | ||
76 | 90 | ||
77 | static struct GNUNET_CONTAINER_MultiHashMap *addresses; | 91 | static struct GNUNET_CONTAINER_MultiHashMap *addresses; |
78 | 92 | ||
@@ -82,6 +96,8 @@ static unsigned long long wan_quota_out; | |||
82 | 96 | ||
83 | static unsigned int active_addr_count; | 97 | static unsigned int active_addr_count; |
84 | 98 | ||
99 | static 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 | |||
484 | struct GNUNET_ATS_Information | ||
485 | GAS_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 | |||
494 | static int | ||
495 | interface_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 | |||
516 | static void | ||
517 | delete_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 | |||
528 | static void | ||
529 | get_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 () | |||
512 | void | 590 | void |
513 | GAS_addresses_done () | 591 | GAS_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; |
diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 75c220017..cbe98453e 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h | |||
@@ -45,6 +45,15 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg); | |||
45 | void | 45 | void |
46 | GAS_addresses_done (void); | 46 | GAS_addresses_done (void); |
47 | 47 | ||
48 | /** | ||
49 | * Returns where the address is located: LAN or WAN or ... | ||
50 | * @param addr address | ||
51 | * @param addrlen address length | ||
52 | * @return location as GNUNET_ATS_Information | ||
53 | */ | ||
54 | |||
55 | struct GNUNET_ATS_Information | ||
56 | GAS_addresses_type (struct sockaddr * addr, socklen_t addrlen); | ||
48 | 57 | ||
49 | /** | 58 | /** |
50 | * This address is now used or not used anymore | 59 | * This address is now used or not used anymore |