diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-02-05 15:27:35 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-02-05 15:27:35 +0000 |
commit | d979a66964e220529d962bc9f0e7db067aacc8db (patch) | |
tree | 2377c42a3a3fdf32f4275914cd5ee95794c75a8b /src/ats/gnunet-service-ats_addresses.c | |
parent | c55971f17dc99f9833af48e078c8f681be771cb7 (diff) | |
download | gnunet-d979a66964e220529d962bc9f0e7db067aacc8db.tar.gz gnunet-d979a66964e220529d962bc9f0e7db067aacc8db.zip |
-cleaning up gnunet-service-ats_addresses.c
Diffstat (limited to 'src/ats/gnunet-service-ats_addresses.c')
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.c | 261 |
1 files changed, 51 insertions, 210 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 9ef6a3838..d0028f9b0 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c | |||
@@ -212,12 +212,9 @@ | |||
212 | * The bandwidth assigned to a peer can be influenced by setting a preference | 212 | * The bandwidth assigned to a peer can be influenced by setting a preference |
213 | * for a peer. The prefernce will be given to to the solver with s_pref which | 213 | * for a peer. The prefernce will be given to to the solver with s_pref which |
214 | * has to take care of the preference value | 214 | * has to take care of the preference value |
215 | |||
216 | */ | 215 | */ |
217 | 216 | ||
218 | 217 | ||
219 | |||
220 | |||
221 | /** | 218 | /** |
222 | * A multihashmap to store all addresses | 219 | * A multihashmap to store all addresses |
223 | */ | 220 | */ |
@@ -225,9 +222,16 @@ struct GNUNET_CONTAINER_MultiPeerMap *GSA_addresses; | |||
225 | 222 | ||
226 | 223 | ||
227 | /** | 224 | /** |
228 | * Value we pass for zero bandwidth. | 225 | * Update statistic on number of addresses. |
229 | */ | 226 | */ |
230 | static const struct GNUNET_BANDWIDTH_Value32NBO zero_bw; | 227 | static void |
228 | update_addresses_stat () | ||
229 | { | ||
230 | GNUNET_STATISTICS_set (GSA_stats, | ||
231 | "# addresses", | ||
232 | GNUNET_CONTAINER_multipeermap_size (GSA_addresses), | ||
233 | GNUNET_NO); | ||
234 | } | ||
231 | 235 | ||
232 | 236 | ||
233 | /** | 237 | /** |
@@ -273,9 +277,10 @@ disassemble_ats_information (struct ATS_Address *dest, | |||
273 | dest->atsi = | 277 | dest->atsi = |
274 | GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information)); | 278 | GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information)); |
275 | dest->atsi_count = update_count; | 279 | dest->atsi_count = update_count; |
276 | memcpy (dest->atsi, update, | 280 | memcpy (dest->atsi, |
277 | update_count * sizeof(struct GNUNET_ATS_Information)); | 281 | update, |
278 | (*delta_dest) = | 282 | update_count * sizeof(struct GNUNET_ATS_Information)); |
283 | *delta_dest = | ||
279 | GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information)); | 284 | GNUNET_malloc (update_count * sizeof (struct GNUNET_ATS_Information)); |
280 | for (c1 = 0; c1 < update_count; c1++) | 285 | for (c1 = 0; c1 < update_count; c1++) |
281 | { | 286 | { |
@@ -327,7 +332,7 @@ disassemble_ats_information (struct ATS_Address *dest, | |||
327 | dest->atsi_count * sizeof(struct GNUNET_ATS_Information)); | 332 | dest->atsi_count * sizeof(struct GNUNET_ATS_Information)); |
328 | memcpy (&tmp_atsi[dest->atsi_count], add_atsi, | 333 | memcpy (&tmp_atsi[dest->atsi_count], add_atsi, |
329 | add_atsi_count * sizeof(struct GNUNET_ATS_Information)); | 334 | add_atsi_count * sizeof(struct GNUNET_ATS_Information)); |
330 | GNUNET_free(dest->atsi); | 335 | GNUNET_free (dest->atsi); |
331 | dest->atsi = tmp_atsi; | 336 | dest->atsi = tmp_atsi; |
332 | dest->atsi_count = dest->atsi_count + add_atsi_count; | 337 | dest->atsi_count = dest->atsi_count + add_atsi_count; |
333 | change = GNUNET_YES; | 338 | change = GNUNET_YES; |
@@ -355,6 +360,19 @@ disassemble_ats_information (struct ATS_Address *dest, | |||
355 | static void | 360 | static void |
356 | free_address (struct ATS_Address *addr) | 361 | free_address (struct ATS_Address *addr) |
357 | { | 362 | { |
363 | GNUNET_CONTAINER_multipeermap_remove (GSA_addresses, | ||
364 | &addr->peer, | ||
365 | addr); | ||
366 | update_addresses_stat (); | ||
367 | GAS_plugin_delete_address (addr); | ||
368 | GAS_performance_notify_all_clients (&addr->peer, | ||
369 | addr->plugin, | ||
370 | addr->addr, | ||
371 | addr->addr_len, | ||
372 | GNUNET_NO, | ||
373 | NULL, 0, | ||
374 | GNUNET_BANDWIDTH_ZERO, | ||
375 | GNUNET_BANDWIDTH_ZERO); | ||
358 | GNUNET_free (addr->plugin); | 376 | GNUNET_free (addr->plugin); |
359 | GNUNET_free_non_null (addr->atsi); | 377 | GNUNET_free_non_null (addr->atsi); |
360 | GNUNET_free (addr); | 378 | GNUNET_free (addr); |
@@ -388,7 +406,9 @@ create_address (const struct GNUNET_PeerIdentity *peer, | |||
388 | aa->peer = *peer; | 406 | aa->peer = *peer; |
389 | aa->addr_len = plugin_addr_len; | 407 | aa->addr_len = plugin_addr_len; |
390 | aa->addr = &aa[1]; | 408 | aa->addr = &aa[1]; |
391 | memcpy (&aa[1], plugin_addr, plugin_addr_len); | 409 | memcpy (&aa[1], |
410 | plugin_addr, | ||
411 | plugin_addr_len); | ||
392 | aa->plugin = GNUNET_strdup (plugin_name); | 412 | aa->plugin = GNUNET_strdup (plugin_name); |
393 | aa->session_id = session_id; | 413 | aa->session_id = session_id; |
394 | aa->local_address_info = local_address_info; | 414 | aa->local_address_info = local_address_info; |
@@ -404,129 +424,6 @@ create_address (const struct GNUNET_PeerIdentity *peer, | |||
404 | 424 | ||
405 | 425 | ||
406 | /** | 426 | /** |
407 | * Closure for #compare_address_it() | ||
408 | */ | ||
409 | struct CompareAddressContext | ||
410 | { | ||
411 | const struct ATS_Address *search; | ||
412 | |||
413 | /* exact_address != NULL if address and session is equal */ | ||
414 | struct ATS_Address *exact_address; | ||
415 | /* exact_address != NULL if address and session is 0 */ | ||
416 | struct ATS_Address *base_address; | ||
417 | }; | ||
418 | |||
419 | |||
420 | /** | ||
421 | * Comapre addresses. | ||
422 | * | ||
423 | * @param cls a CompareAddressContext containin the source address | ||
424 | * @param key peer id | ||
425 | * @param value the address to compare with | ||
426 | * @return #GNUNET_YES to continue, #GNUNET_NO if address is founce | ||
427 | */ | ||
428 | static int | ||
429 | compare_address_it (void *cls, | ||
430 | const struct GNUNET_PeerIdentity *key, | ||
431 | void *value) | ||
432 | { | ||
433 | struct CompareAddressContext *cac = cls; | ||
434 | struct ATS_Address *aa = value; | ||
435 | |||
436 | /* Find an matching exact address: | ||
437 | * | ||
438 | * Compare by: | ||
439 | * aa->addr_len == cac->search->addr_len | ||
440 | * aa->plugin == cac->search->plugin | ||
441 | * aa->addr == cac->search->addr | ||
442 | * aa->session == cac->search->session | ||
443 | * | ||
444 | * return as exact address | ||
445 | */ | ||
446 | if ((aa->addr_len == cac->search->addr_len) | ||
447 | && (0 == strcmp (aa->plugin, cac->search->plugin))) | ||
448 | { | ||
449 | if ((0 == memcmp (aa->addr, cac->search->addr, aa->addr_len)) | ||
450 | && (aa->session_id == cac->search->session_id)) | ||
451 | cac->exact_address = aa; | ||
452 | } | ||
453 | |||
454 | /* Find an matching base address: | ||
455 | * | ||
456 | * Properties: | ||
457 | * | ||
458 | * aa->session_id == 0 | ||
459 | * | ||
460 | * Compare by: | ||
461 | * aa->addr_len == cac->search->addr_len | ||
462 | * aa->plugin == cac->search->plugin | ||
463 | * aa->addr == cac->search->addr | ||
464 | * | ||
465 | * return as base address | ||
466 | */ | ||
467 | if ((aa->addr_len == cac->search->addr_len) | ||
468 | && (0 == strcmp (aa->plugin, cac->search->plugin))) | ||
469 | { | ||
470 | if ((0 == memcmp (aa->addr, cac->search->addr, aa->addr_len)) | ||
471 | && (aa->session_id == 0)) | ||
472 | cac->base_address = aa; | ||
473 | } | ||
474 | |||
475 | /* Find an matching exact address based on session: | ||
476 | * | ||
477 | * Properties: | ||
478 | * | ||
479 | * cac->search->addr_len == 0 | ||
480 | * | ||
481 | * Compare by: | ||
482 | * aa->plugin == cac->search->plugin | ||
483 | * aa->session_id == cac->search->session_id | ||
484 | * | ||
485 | * return as exact address | ||
486 | */ | ||
487 | if (0 == cac->search->addr_len) | ||
488 | { | ||
489 | if ((0 == strcmp (aa->plugin, cac->search->plugin)) | ||
490 | && (aa->session_id == cac->search->session_id)) | ||
491 | cac->exact_address = aa; | ||
492 | } | ||
493 | |||
494 | if (cac->exact_address == NULL ) | ||
495 | return GNUNET_YES; /* Continue iteration to find exact address */ | ||
496 | else | ||
497 | return GNUNET_NO; /* Stop iteration since we have an exact address */ | ||
498 | } | ||
499 | |||
500 | |||
501 | /** | ||
502 | * Find an existing equivalent address record. | ||
503 | * Compares by peer identity and network address OR by session ID | ||
504 | * (one of the two must match). | ||
505 | * | ||
506 | * @param peer peer to lookup addresses for | ||
507 | * @param addr existing address record | ||
508 | * @return existing address record, NULL for none | ||
509 | */ | ||
510 | struct ATS_Address * | ||
511 | find_equivalent_address (const struct GNUNET_PeerIdentity *peer, | ||
512 | const struct ATS_Address *addr) | ||
513 | { | ||
514 | struct CompareAddressContext cac; | ||
515 | |||
516 | cac.exact_address = NULL; | ||
517 | cac.base_address = NULL; | ||
518 | cac.search = addr; | ||
519 | GNUNET_CONTAINER_multipeermap_get_multiple (GSA_addresses, | ||
520 | peer, | ||
521 | &compare_address_it, &cac); | ||
522 | |||
523 | if (NULL == cac.exact_address) | ||
524 | return cac.base_address; | ||
525 | return cac.exact_address; | ||
526 | } | ||
527 | |||
528 | |||
529 | /** | ||
530 | * Closure for #find_address_cb() | 427 | * Closure for #find_address_cb() |
531 | */ | 428 | */ |
532 | struct FindAddressContext | 429 | struct FindAddressContext |
@@ -639,11 +536,16 @@ GAS_addresses_add (const struct GNUNET_PeerIdentity *peer, | |||
639 | uint32_t atsi_count) | 536 | uint32_t atsi_count) |
640 | { | 537 | { |
641 | struct ATS_Address *new_address; | 538 | struct ATS_Address *new_address; |
642 | struct ATS_Address *existing_address; | ||
643 | struct GNUNET_ATS_Information *atsi_delta; | 539 | struct GNUNET_ATS_Information *atsi_delta; |
644 | uint32_t atsi_delta_count; | 540 | uint32_t atsi_delta_count; |
645 | uint32_t addr_net; | 541 | uint32_t addr_net; |
646 | 542 | ||
543 | if (NULL != find_exact_address (peer, session_id)) | ||
544 | { | ||
545 | GNUNET_break (0); | ||
546 | return; | ||
547 | } | ||
548 | |||
647 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 549 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
648 | "Received `%s' for peer `%s'\n", | 550 | "Received `%s' for peer `%s'\n", |
649 | "ADDRESS ADD", | 551 | "ADDRESS ADD", |
@@ -664,16 +566,6 @@ GAS_addresses_add (const struct GNUNET_PeerIdentity *peer, | |||
664 | if (GNUNET_ATS_VALUE_UNDEFINED == addr_net) | 566 | if (GNUNET_ATS_VALUE_UNDEFINED == addr_net) |
665 | addr_net = GNUNET_ATS_NET_UNSPECIFIED; | 567 | addr_net = GNUNET_ATS_NET_UNSPECIFIED; |
666 | 568 | ||
667 | /* Get existing address or address with session == 0 */ | ||
668 | existing_address = find_equivalent_address (peer, new_address); | ||
669 | if (NULL != existing_address) | ||
670 | { | ||
671 | GNUNET_break (0); | ||
672 | GNUNET_free(new_address->plugin); | ||
673 | GNUNET_free_non_null(new_address->atsi); | ||
674 | GNUNET_free(new_address); | ||
675 | return; | ||
676 | } | ||
677 | /* Add a new address */ | 569 | /* Add a new address */ |
678 | new_address->t_added = GNUNET_TIME_absolute_get(); | 570 | new_address->t_added = GNUNET_TIME_absolute_get(); |
679 | new_address->t_last_activity = GNUNET_TIME_absolute_get(); | 571 | new_address->t_last_activity = GNUNET_TIME_absolute_get(); |
@@ -682,12 +574,7 @@ GAS_addresses_add (const struct GNUNET_PeerIdentity *peer, | |||
682 | peer, | 574 | peer, |
683 | new_address, | 575 | new_address, |
684 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); | 576 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); |
685 | 577 | update_addresses_stat (); | |
686 | GNUNET_STATISTICS_set (GSA_stats, | ||
687 | "# addresses", | ||
688 | GNUNET_CONTAINER_multipeermap_size (GSA_addresses), | ||
689 | GNUNET_NO); | ||
690 | |||
691 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 578 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
692 | "Adding new address %p for peer `%s', length %u, session id %u, %s\n", | 579 | "Adding new address %p for peer `%s', length %u, session id %u, %s\n", |
693 | new_address, | 580 | new_address, |
@@ -695,19 +582,19 @@ GAS_addresses_add (const struct GNUNET_PeerIdentity *peer, | |||
695 | plugin_addr_len, | 582 | plugin_addr_len, |
696 | session_id, | 583 | session_id, |
697 | GNUNET_ATS_print_network_type (addr_net)); | 584 | GNUNET_ATS_print_network_type (addr_net)); |
698 | 585 | ||
699 | /* Tell solver about new address */ | 586 | /* Tell solver about new address */ |
700 | GAS_plugin_new_address (new_address, | 587 | GAS_plugin_new_address (new_address, |
701 | addr_net, | 588 | addr_net, |
702 | atsi, | 589 | atsi, |
703 | atsi_count); | 590 | atsi_count); |
704 | /* Notify performance clients about new address */ | 591 | /* Notify performance clients about new address */ |
705 | GAS_performance_notify_all_clients (&new_address->peer, | 592 | GAS_performance_notify_all_clients (&new_address->peer, |
706 | new_address->plugin, | 593 | new_address->plugin, |
707 | new_address->addr, | 594 | new_address->addr, |
708 | new_address->addr_len, | 595 | new_address->addr_len, |
709 | new_address->active, | 596 | new_address->active, |
710 | new_address->atsi, | 597 | new_address->atsi, |
711 | new_address->atsi_count, | 598 | new_address->atsi_count, |
712 | GNUNET_BANDWIDTH_value_init (new_address->assigned_bw_out), | 599 | GNUNET_BANDWIDTH_value_init (new_address->assigned_bw_out), |
713 | GNUNET_BANDWIDTH_value_init (new_address->assigned_bw_in)); | 600 | GNUNET_BANDWIDTH_value_init (new_address->assigned_bw_in)); |
@@ -762,11 +649,11 @@ GAS_addresses_update (const struct GNUNET_PeerIdentity *peer, | |||
762 | &atsi_delta_count)) | 649 | &atsi_delta_count)) |
763 | { | 650 | { |
764 | /* Notify performance clients about updated address */ | 651 | /* Notify performance clients about updated address */ |
765 | GAS_performance_notify_all_clients (&aa->peer, | 652 | GAS_performance_notify_all_clients (&aa->peer, |
766 | aa->plugin, | 653 | aa->plugin, |
767 | aa->addr, | 654 | aa->addr, |
768 | aa->addr_len, | 655 | aa->addr_len, |
769 | aa->active, | 656 | aa->active, |
770 | aa->atsi, | 657 | aa->atsi, |
771 | aa->atsi_count, | 658 | aa->atsi_count, |
772 | GNUNET_BANDWIDTH_value_init (aa->assigned_bw_out), | 659 | GNUNET_BANDWIDTH_value_init (aa->assigned_bw_out), |
@@ -798,42 +685,17 @@ GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer, | |||
798 | if (NULL == ea) | 685 | if (NULL == ea) |
799 | { | 686 | { |
800 | GNUNET_break (0); | 687 | GNUNET_break (0); |
801 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
802 | "Tried to destroy unknown address for peer `%s' session id %u\n", | ||
803 | GNUNET_i2s (peer), | ||
804 | session_id); | ||
805 | return; | 688 | return; |
806 | } | 689 | } |
807 | |||
808 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 690 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
809 | "Received `%s' for peer `%s' address %p session %u\n", | 691 | "Received ADDRESS_DESTROYED for peer `%s' address %p session %u\n", |
810 | "ADDRESS DESTROYED", | ||
811 | GNUNET_i2s (peer), | 692 | GNUNET_i2s (peer), |
812 | ea, | 693 | ea, |
813 | session_id); | 694 | session_id); |
814 | GNUNET_CONTAINER_multipeermap_remove (GSA_addresses, | ||
815 | peer, | ||
816 | ea); | ||
817 | GAS_plugin_delete_address (ea); | ||
818 | GAS_performance_notify_all_clients (peer, | ||
819 | ea->plugin, | ||
820 | ea->addr, | ||
821 | ea->addr_len, | ||
822 | GNUNET_SYSERR, | ||
823 | NULL, 0, | ||
824 | zero_bw, | ||
825 | zero_bw); | ||
826 | free_address (ea); | 695 | free_address (ea); |
827 | GNUNET_STATISTICS_set (GSA_stats, | ||
828 | "# addresses", | ||
829 | GNUNET_CONTAINER_multipeermap_size (GSA_addresses), | ||
830 | GNUNET_NO); | ||
831 | } | 696 | } |
832 | 697 | ||
833 | 698 | ||
834 | |||
835 | |||
836 | |||
837 | /** | 699 | /** |
838 | * Initialize address subsystem. The addresses subsystem manages the addresses | 700 | * Initialize address subsystem. The addresses subsystem manages the addresses |
839 | * known and current performance information. It has a solver component | 701 | * known and current performance information. It has a solver component |
@@ -843,12 +705,8 @@ GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer, | |||
843 | void | 705 | void |
844 | GAS_addresses_init () | 706 | GAS_addresses_init () |
845 | { | 707 | { |
846 | /* Initialize the addresses database */ | ||
847 | GSA_addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO); | 708 | GSA_addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO); |
848 | GNUNET_STATISTICS_set (GSA_stats, | 709 | update_addresses_stat (); |
849 | "# addresses", | ||
850 | GNUNET_CONTAINER_multipeermap_size (GSA_addresses), | ||
851 | GNUNET_NO); | ||
852 | } | 710 | } |
853 | 711 | ||
854 | 712 | ||
@@ -867,22 +725,6 @@ destroy_all_address_it (void *cls, | |||
867 | { | 725 | { |
868 | struct ATS_Address *aa = value; | 726 | struct ATS_Address *aa = value; |
869 | 727 | ||
870 | /* Remove */ | ||
871 | GNUNET_assert (GNUNET_YES == | ||
872 | GNUNET_CONTAINER_multipeermap_remove (GSA_addresses, | ||
873 | key, | ||
874 | value)); | ||
875 | /* Notify */ | ||
876 | GAS_plugin_delete_address (aa); | ||
877 | /* Destroy */ | ||
878 | GAS_performance_notify_all_clients (&aa->peer, | ||
879 | aa->plugin, | ||
880 | aa->addr, | ||
881 | aa->addr_len, | ||
882 | GNUNET_NO, | ||
883 | NULL, 0, | ||
884 | zero_bw, | ||
885 | zero_bw); | ||
886 | free_address (aa); | 728 | free_address (aa); |
887 | return GNUNET_OK; | 729 | return GNUNET_OK; |
888 | } | 730 | } |
@@ -897,10 +739,9 @@ GAS_addresses_destroy_all () | |||
897 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 739 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
898 | "Destroying all addresses\n"); | 740 | "Destroying all addresses\n"); |
899 | GAS_plugin_solver_lock (); | 741 | GAS_plugin_solver_lock (); |
900 | if (NULL != GSA_addresses) | 742 | GNUNET_CONTAINER_multipeermap_iterate (GSA_addresses, |
901 | GNUNET_CONTAINER_multipeermap_iterate (GSA_addresses, | 743 | &destroy_all_address_it, |
902 | &destroy_all_address_it, | 744 | NULL); |
903 | NULL); | ||
904 | GAS_plugin_solver_unlock (); | 745 | GAS_plugin_solver_unlock (); |
905 | } | 746 | } |
906 | 747 | ||
@@ -1005,8 +846,8 @@ GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer, | |||
1005 | NULL, NULL, NULL, 0, | 846 | NULL, NULL, NULL, 0, |
1006 | GNUNET_NO, | 847 | GNUNET_NO, |
1007 | NULL, 0, | 848 | NULL, 0, |
1008 | zero_bw, | 849 | GNUNET_BANDWIDTH_ZERO, |
1009 | zero_bw); | 850 | GNUNET_BANDWIDTH_ZERO); |
1010 | } | 851 | } |
1011 | 852 | ||
1012 | /* end of gnunet-service-ats_addresses.c */ | 853 | /* end of gnunet-service-ats_addresses.c */ |