diff options
Diffstat (limited to 'src/transport/gnunet-communicator-udp.c')
-rw-r--r-- | src/transport/gnunet-communicator-udp.c | 1104 |
1 files changed, 434 insertions, 670 deletions
diff --git a/src/transport/gnunet-communicator-udp.c b/src/transport/gnunet-communicator-udp.c index 1db5bba6b..9420b9b5c 100644 --- a/src/transport/gnunet-communicator-udp.c +++ b/src/transport/gnunet-communicator-udp.c | |||
@@ -66,7 +66,8 @@ | |||
66 | /** | 66 | /** |
67 | * How often do we scan for changes to our network interfaces? | 67 | * How often do we scan for changes to our network interfaces? |
68 | */ | 68 | */ |
69 | #define INTERFACE_SCAN_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5) | 69 | #define INTERFACE_SCAN_FREQUENCY \ |
70 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5) | ||
70 | 71 | ||
71 | /** | 72 | /** |
72 | * How long do we believe our addresses to remain up (before | 73 | * How long do we believe our addresses to remain up (before |
@@ -77,17 +78,17 @@ | |||
77 | /** | 78 | /** |
78 | * AES key size. | 79 | * AES key size. |
79 | */ | 80 | */ |
80 | #define AES_KEY_SIZE (256/8) | 81 | #define AES_KEY_SIZE (256 / 8) |
81 | 82 | ||
82 | /** | 83 | /** |
83 | * AES (GCM) IV size. | 84 | * AES (GCM) IV size. |
84 | */ | 85 | */ |
85 | #define AES_IV_SIZE (96/8) | 86 | #define AES_IV_SIZE (96 / 8) |
86 | 87 | ||
87 | /** | 88 | /** |
88 | * Size of the GCM tag. | 89 | * Size of the GCM tag. |
89 | */ | 90 | */ |
90 | #define GCM_TAG_SIZE (128/8) | 91 | #define GCM_TAG_SIZE (128 / 8) |
91 | 92 | ||
92 | /** | 93 | /** |
93 | * If we fall below this number of available KCNs, | 94 | * If we fall below this number of available KCNs, |
@@ -202,7 +203,6 @@ struct InitialKX | |||
202 | * key derived from the handshake with sequence number zero. | 203 | * key derived from the handshake with sequence number zero. |
203 | */ | 204 | */ |
204 | char gcm_tag[GCM_TAG_SIZE]; | 205 | char gcm_tag[GCM_TAG_SIZE]; |
205 | |||
206 | }; | 206 | }; |
207 | 207 | ||
208 | 208 | ||
@@ -256,7 +256,6 @@ struct UDPAck | |||
256 | * CMAC of the base key being acknowledged. | 256 | * CMAC of the base key being acknowledged. |
257 | */ | 257 | */ |
258 | struct GNUNET_HashCode cmac; | 258 | struct GNUNET_HashCode cmac; |
259 | |||
260 | }; | 259 | }; |
261 | 260 | ||
262 | 261 | ||
@@ -306,7 +305,6 @@ struct UDPBroadcast | |||
306 | * #GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST | 305 | * #GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST |
307 | */ | 306 | */ |
308 | struct GNUNET_CRYPTO_EddsaSignature sender_sig; | 307 | struct GNUNET_CRYPTO_EddsaSignature sender_sig; |
309 | |||
310 | }; | 308 | }; |
311 | 309 | ||
312 | 310 | ||
@@ -334,7 +332,6 @@ struct UDPBox | |||
334 | * `struct UdpHandshakeSignature`. | 332 | * `struct UdpHandshakeSignature`. |
335 | */ | 333 | */ |
336 | char gcm_tag[GCM_TAG_SIZE]; | 334 | char gcm_tag[GCM_TAG_SIZE]; |
337 | |||
338 | }; | 335 | }; |
339 | 336 | ||
340 | 337 | ||
@@ -512,7 +509,6 @@ struct SenderAddress | |||
512 | * Which network type does this queue use? | 509 | * Which network type does this queue use? |
513 | */ | 510 | */ |
514 | enum GNUNET_NetworkType nt; | 511 | enum GNUNET_NetworkType nt; |
515 | |||
516 | }; | 512 | }; |
517 | 513 | ||
518 | 514 | ||
@@ -594,7 +590,6 @@ struct ReceiverAddress | |||
594 | * Which network type does this queue use? | 590 | * Which network type does this queue use? |
595 | */ | 591 | */ |
596 | enum GNUNET_NetworkType nt; | 592 | enum GNUNET_NetworkType nt; |
597 | |||
598 | }; | 593 | }; |
599 | 594 | ||
600 | 595 | ||
@@ -769,21 +764,16 @@ bi_destroy (struct BroadcastInterface *bi) | |||
769 | if (AF_INET6 == bi->sa->sa_family) | 764 | if (AF_INET6 == bi->sa->sa_family) |
770 | { | 765 | { |
771 | /* Leave the multicast group */ | 766 | /* Leave the multicast group */ |
772 | if (GNUNET_OK != | 767 | if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock, |
773 | GNUNET_NETWORK_socket_setsockopt | 768 | IPPROTO_IPV6, |
774 | (udp_sock, | 769 | IPV6_LEAVE_GROUP, |
775 | IPPROTO_IPV6, | 770 | &bi->mcreq, |
776 | IPV6_LEAVE_GROUP, | 771 | sizeof (bi->mcreq))) |
777 | &bi->mcreq, | ||
778 | sizeof (bi->mcreq))) | ||
779 | { | 772 | { |
780 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | 773 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt"); |
781 | "setsockopt"); | ||
782 | } | 774 | } |
783 | } | 775 | } |
784 | GNUNET_CONTAINER_DLL_remove (bi_head, | 776 | GNUNET_CONTAINER_DLL_remove (bi_head, bi_tail, bi); |
785 | bi_tail, | ||
786 | bi); | ||
787 | GNUNET_SCHEDULER_cancel (bi->broadcast_task); | 777 | GNUNET_SCHEDULER_cancel (bi->broadcast_task); |
788 | GNUNET_free (bi->sa); | 778 | GNUNET_free (bi->sa); |
789 | GNUNET_free_non_null (bi->ba); | 779 | GNUNET_free_non_null (bi->ba); |
@@ -802,8 +792,8 @@ receiver_destroy (struct ReceiverAddress *receiver) | |||
802 | struct GNUNET_MQ_Handle *mq; | 792 | struct GNUNET_MQ_Handle *mq; |
803 | 793 | ||
804 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 794 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
805 | "Disconnecting receiver for peer `%s'\n", | 795 | "Disconnecting receiver for peer `%s'\n", |
806 | GNUNET_i2s (&receiver->target)); | 796 | GNUNET_i2s (&receiver->target)); |
807 | if (NULL != (mq = receiver->mq)) | 797 | if (NULL != (mq = receiver->mq)) |
808 | { | 798 | { |
809 | receiver->mq = NULL; | 799 | receiver->mq = NULL; |
@@ -816,14 +806,13 @@ receiver_destroy (struct ReceiverAddress *receiver) | |||
816 | } | 806 | } |
817 | GNUNET_assert (GNUNET_YES == | 807 | GNUNET_assert (GNUNET_YES == |
818 | GNUNET_CONTAINER_multipeermap_remove (receivers, | 808 | GNUNET_CONTAINER_multipeermap_remove (receivers, |
819 | &receiver->target, | 809 | &receiver->target, |
820 | receiver)); | 810 | receiver)); |
821 | GNUNET_assert (receiver == | 811 | GNUNET_assert (receiver == GNUNET_CONTAINER_heap_remove_node (receiver->hn)); |
822 | GNUNET_CONTAINER_heap_remove_node (receiver->hn)); | ||
823 | GNUNET_STATISTICS_set (stats, | 812 | GNUNET_STATISTICS_set (stats, |
824 | "# receivers active", | 813 | "# receivers active", |
825 | GNUNET_CONTAINER_multipeermap_size (receivers), | 814 | GNUNET_CONTAINER_multipeermap_size (receivers), |
826 | GNUNET_NO); | 815 | GNUNET_NO); |
827 | GNUNET_free (receiver->address); | 816 | GNUNET_free (receiver->address); |
828 | GNUNET_free (receiver->foreign_addr); | 817 | GNUNET_free (receiver->foreign_addr); |
829 | GNUNET_free (receiver); | 818 | GNUNET_free (receiver); |
@@ -841,13 +830,10 @@ kce_destroy (struct KeyCacheEntry *kce) | |||
841 | struct SharedSecret *ss = kce->ss; | 830 | struct SharedSecret *ss = kce->ss; |
842 | 831 | ||
843 | ss->active_kce_count--; | 832 | ss->active_kce_count--; |
844 | GNUNET_CONTAINER_DLL_remove (ss->kce_head, | 833 | GNUNET_CONTAINER_DLL_remove (ss->kce_head, ss->kce_tail, kce); |
845 | ss->kce_tail, | 834 | GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multishortmap_remove (key_cache, |
846 | kce); | 835 | &kce->kid, |
847 | GNUNET_assert (GNUNET_YES == | 836 | kce)); |
848 | GNUNET_CONTAINER_multishortmap_remove (key_cache, | ||
849 | &kce->kid, | ||
850 | kce)); | ||
851 | GNUNET_free (kce); | 837 | GNUNET_free (kce); |
852 | } | 838 | } |
853 | 839 | ||
@@ -861,22 +847,23 @@ kce_destroy (struct KeyCacheEntry *kce) | |||
861 | */ | 847 | */ |
862 | static void | 848 | static void |
863 | get_kid (const struct GNUNET_HashCode *msec, | 849 | get_kid (const struct GNUNET_HashCode *msec, |
864 | uint32_t serial, | 850 | uint32_t serial, |
865 | struct GNUNET_ShortHashCode *kid) | 851 | struct GNUNET_ShortHashCode *kid) |
866 | { | 852 | { |
867 | uint32_t sid = htonl (serial); | 853 | uint32_t sid = htonl (serial); |
868 | 854 | ||
869 | GNUNET_CRYPTO_hkdf (kid, | 855 | GNUNET_CRYPTO_hkdf (kid, |
870 | sizeof (*kid), | 856 | sizeof (*kid), |
871 | GCRY_MD_SHA512, | 857 | GCRY_MD_SHA512, |
872 | GCRY_MD_SHA256, | 858 | GCRY_MD_SHA256, |
873 | &sid, | 859 | &sid, |
874 | sizeof (sid), | 860 | sizeof (sid), |
875 | msec, | 861 | msec, |
876 | sizeof (*msec), | 862 | sizeof (*msec), |
877 | "UDP-KID", | 863 | "UDP-KID", |
878 | strlen ("UDP-KID"), | 864 | strlen ("UDP-KID"), |
879 | NULL, 0); | 865 | NULL, |
866 | 0); | ||
880 | } | 867 | } |
881 | 868 | ||
882 | 869 | ||
@@ -887,8 +874,7 @@ get_kid (const struct GNUNET_HashCode *msec, | |||
887 | * @param seq sequence number for the key cache entry | 874 | * @param seq sequence number for the key cache entry |
888 | */ | 875 | */ |
889 | static void | 876 | static void |
890 | kce_generate (struct SharedSecret *ss, | 877 | kce_generate (struct SharedSecret *ss, uint32_t seq) |
891 | uint32_t seq) | ||
892 | { | 878 | { |
893 | struct KeyCacheEntry *kce; | 879 | struct KeyCacheEntry *kce; |
894 | 880 | ||
@@ -896,21 +882,18 @@ kce_generate (struct SharedSecret *ss, | |||
896 | kce = GNUNET_new (struct KeyCacheEntry); | 882 | kce = GNUNET_new (struct KeyCacheEntry); |
897 | kce->ss = ss; | 883 | kce->ss = ss; |
898 | kce->sequence_number = seq; | 884 | kce->sequence_number = seq; |
899 | get_kid (&ss->master, | 885 | get_kid (&ss->master, seq, &kce->kid); |
900 | seq, | 886 | GNUNET_CONTAINER_DLL_insert (ss->kce_head, ss->kce_tail, kce); |
901 | &kce->kid); | ||
902 | GNUNET_CONTAINER_DLL_insert (ss->kce_head, | ||
903 | ss->kce_tail, | ||
904 | kce); | ||
905 | ss->active_kce_count++; | 887 | ss->active_kce_count++; |
906 | (void) GNUNET_CONTAINER_multishortmap_put (key_cache, | 888 | (void) GNUNET_CONTAINER_multishortmap_put ( |
907 | &kce->kid, | 889 | key_cache, |
908 | kce, | 890 | &kce->kid, |
909 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); | 891 | kce, |
892 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); | ||
910 | GNUNET_STATISTICS_set (stats, | 893 | GNUNET_STATISTICS_set (stats, |
911 | "# KIDs active", | 894 | "# KIDs active", |
912 | GNUNET_CONTAINER_multishortmap_size (key_cache), | 895 | GNUNET_CONTAINER_multishortmap_size (key_cache), |
913 | GNUNET_NO); | 896 | GNUNET_NO); |
914 | } | 897 | } |
915 | 898 | ||
916 | 899 | ||
@@ -928,30 +911,22 @@ secret_destroy (struct SharedSecret *ss) | |||
928 | 911 | ||
929 | if (NULL != (sender = ss->sender)) | 912 | if (NULL != (sender = ss->sender)) |
930 | { | 913 | { |
931 | GNUNET_CONTAINER_DLL_remove (sender->ss_head, | 914 | GNUNET_CONTAINER_DLL_remove (sender->ss_head, sender->ss_tail, ss); |
932 | sender->ss_tail, | ||
933 | ss); | ||
934 | sender->num_secrets--; | 915 | sender->num_secrets--; |
935 | } | 916 | } |
936 | if (NULL != (receiver = ss->receiver)) | 917 | if (NULL != (receiver = ss->receiver)) |
937 | { | 918 | { |
938 | GNUNET_CONTAINER_DLL_remove (receiver->ss_head, | 919 | GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss); |
939 | receiver->ss_tail, | ||
940 | ss); | ||
941 | receiver->num_secrets--; | 920 | receiver->num_secrets--; |
942 | receiver->acks_available | 921 | receiver->acks_available -= (ss->sequence_allowed - ss->sequence_used); |
943 | -= (ss->sequence_allowed - ss->sequence_used); | ||
944 | } | 922 | } |
945 | while (NULL != (kce = ss->kce_head)) | 923 | while (NULL != (kce = ss->kce_head)) |
946 | kce_destroy (kce); | 924 | kce_destroy (kce); |
947 | GNUNET_STATISTICS_update (stats, | 925 | GNUNET_STATISTICS_update (stats, "# Secrets active", -1, GNUNET_NO); |
948 | "# Secrets active", | ||
949 | -1, | ||
950 | GNUNET_NO); | ||
951 | GNUNET_STATISTICS_set (stats, | 926 | GNUNET_STATISTICS_set (stats, |
952 | "# KIDs active", | 927 | "# KIDs active", |
953 | GNUNET_CONTAINER_multishortmap_size (key_cache), | 928 | GNUNET_CONTAINER_multishortmap_size (key_cache), |
954 | GNUNET_NO); | 929 | GNUNET_NO); |
955 | GNUNET_free (ss); | 930 | GNUNET_free (ss); |
956 | } | 931 | } |
957 | 932 | ||
@@ -965,12 +940,10 @@ secret_destroy (struct SharedSecret *ss) | |||
965 | static void | 940 | static void |
966 | sender_destroy (struct SenderAddress *sender) | 941 | sender_destroy (struct SenderAddress *sender) |
967 | { | 942 | { |
968 | GNUNET_assert (GNUNET_YES == | 943 | GNUNET_assert ( |
969 | GNUNET_CONTAINER_multipeermap_remove (senders, | 944 | GNUNET_YES == |
970 | &sender->target, | 945 | GNUNET_CONTAINER_multipeermap_remove (senders, &sender->target, sender)); |
971 | sender)); | 946 | GNUNET_assert (sender == GNUNET_CONTAINER_heap_remove_node (sender->hn)); |
972 | GNUNET_assert (sender == | ||
973 | GNUNET_CONTAINER_heap_remove_node (sender->hn)); | ||
974 | GNUNET_STATISTICS_set (stats, | 947 | GNUNET_STATISTICS_set (stats, |
975 | "# senders active", | 948 | "# senders active", |
976 | GNUNET_CONTAINER_multipeermap_size (senders), | 949 | GNUNET_CONTAINER_multipeermap_size (senders), |
@@ -990,9 +963,9 @@ sender_destroy (struct SenderAddress *sender) | |||
990 | */ | 963 | */ |
991 | static void | 964 | static void |
992 | get_iv_key (const struct GNUNET_HashCode *msec, | 965 | get_iv_key (const struct GNUNET_HashCode *msec, |
993 | uint32_t serial, | 966 | uint32_t serial, |
994 | char key[AES_KEY_SIZE], | 967 | char key[AES_KEY_SIZE], |
995 | char iv[AES_IV_SIZE]) | 968 | char iv[AES_IV_SIZE]) |
996 | { | 969 | { |
997 | uint32_t sid = htonl (serial); | 970 | uint32_t sid = htonl (serial); |
998 | char res[AES_KEY_SIZE + AES_IV_SIZE]; | 971 | char res[AES_KEY_SIZE + AES_IV_SIZE]; |
@@ -1007,13 +980,10 @@ get_iv_key (const struct GNUNET_HashCode *msec, | |||
1007 | sizeof (*msec), | 980 | sizeof (*msec), |
1008 | "UDP-IV-KEY", | 981 | "UDP-IV-KEY", |
1009 | strlen ("UDP-IV-KEY"), | 982 | strlen ("UDP-IV-KEY"), |
1010 | NULL, 0); | 983 | NULL, |
1011 | memcpy (key, | 984 | 0); |
1012 | res, | 985 | memcpy (key, res, AES_KEY_SIZE); |
1013 | AES_KEY_SIZE); | 986 | memcpy (iv, &res[AES_KEY_SIZE], AES_IV_SIZE); |
1014 | memcpy (iv, | ||
1015 | &res[AES_KEY_SIZE], | ||
1016 | AES_IV_SIZE); | ||
1017 | } | 987 | } |
1018 | 988 | ||
1019 | 989 | ||
@@ -1025,10 +995,9 @@ get_iv_key (const struct GNUNET_HashCode *msec, | |||
1025 | static void | 995 | static void |
1026 | reschedule_sender_timeout (struct SenderAddress *sender) | 996 | reschedule_sender_timeout (struct SenderAddress *sender) |
1027 | { | 997 | { |
1028 | sender->timeout | 998 | sender->timeout = |
1029 | = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); | 999 | GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); |
1030 | GNUNET_CONTAINER_heap_update_cost (sender->hn, | 1000 | GNUNET_CONTAINER_heap_update_cost (sender->hn, sender->timeout.abs_value_us); |
1031 | sender->timeout.abs_value_us); | ||
1032 | } | 1001 | } |
1033 | 1002 | ||
1034 | 1003 | ||
@@ -1040,10 +1009,10 @@ reschedule_sender_timeout (struct SenderAddress *sender) | |||
1040 | static void | 1009 | static void |
1041 | reschedule_receiver_timeout (struct ReceiverAddress *receiver) | 1010 | reschedule_receiver_timeout (struct ReceiverAddress *receiver) |
1042 | { | 1011 | { |
1043 | receiver->timeout | 1012 | receiver->timeout = |
1044 | = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); | 1013 | GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); |
1045 | GNUNET_CONTAINER_heap_update_cost (receiver->hn, | 1014 | GNUNET_CONTAINER_heap_update_cost (receiver->hn, |
1046 | receiver->timeout.abs_value_us); | 1015 | receiver->timeout.abs_value_us); |
1047 | } | 1016 | } |
1048 | 1017 | ||
1049 | 1018 | ||
@@ -1079,12 +1048,9 @@ check_timeouts (void *cls) | |||
1079 | break; | 1048 | break; |
1080 | sender_destroy (sender); | 1049 | sender_destroy (sender); |
1081 | } | 1050 | } |
1082 | delay = GNUNET_TIME_relative_min (rt, | 1051 | delay = GNUNET_TIME_relative_min (rt, st); |
1083 | st); | ||
1084 | if (delay.rel_value_us < GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us) | 1052 | if (delay.rel_value_us < GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us) |
1085 | timeout_task = GNUNET_SCHEDULER_add_delayed (delay, | 1053 | timeout_task = GNUNET_SCHEDULER_add_delayed (delay, &check_timeouts, NULL); |
1086 | &check_timeouts, | ||
1087 | NULL); | ||
1088 | } | 1054 | } |
1089 | 1055 | ||
1090 | 1056 | ||
@@ -1106,7 +1072,8 @@ calculate_cmac (struct SharedSecret *ss) | |||
1106 | sizeof (ss->master), | 1072 | sizeof (ss->master), |
1107 | "UDP-CMAC", | 1073 | "UDP-CMAC", |
1108 | strlen ("UDP-CMAC"), | 1074 | strlen ("UDP-CMAC"), |
1109 | NULL, 0); | 1075 | NULL, |
1076 | 0); | ||
1110 | } | 1077 | } |
1111 | 1078 | ||
1112 | 1079 | ||
@@ -1128,15 +1095,17 @@ pass_plaintext_to_core (struct SenderAddress *sender, | |||
1128 | while (ntohs (hdr->size) < plaintext_len) | 1095 | while (ntohs (hdr->size) < plaintext_len) |
1129 | { | 1096 | { |
1130 | GNUNET_STATISTICS_update (stats, | 1097 | GNUNET_STATISTICS_update (stats, |
1131 | "# bytes given to core", | 1098 | "# bytes given to core", |
1132 | ntohs (hdr->size), | 1099 | ntohs (hdr->size), |
1133 | GNUNET_NO); | 1100 | GNUNET_NO); |
1134 | (void) GNUNET_TRANSPORT_communicator_receive (ch, | 1101 | (void) |
1135 | &sender->target, | 1102 | GNUNET_TRANSPORT_communicator_receive (ch, |
1136 | hdr, | 1103 | &sender->target, |
1137 | ADDRESS_VALIDITY_PERIOD, | 1104 | hdr, |
1138 | NULL /* no flow control possible */, | 1105 | ADDRESS_VALIDITY_PERIOD, |
1139 | NULL); | 1106 | NULL /* no flow control possible */ |
1107 | , | ||
1108 | NULL); | ||
1140 | /* move on to next message, if any */ | 1109 | /* move on to next message, if any */ |
1141 | plaintext_len -= ntohs (hdr->size); | 1110 | plaintext_len -= ntohs (hdr->size); |
1142 | if (plaintext_len < sizeof (*hdr)) | 1111 | if (plaintext_len < sizeof (*hdr)) |
@@ -1170,16 +1139,9 @@ setup_cipher (const struct GNUNET_HashCode *msec, | |||
1170 | GCRY_CIPHER_AES256 /* low level: go for speed */, | 1139 | GCRY_CIPHER_AES256 /* low level: go for speed */, |
1171 | GCRY_CIPHER_MODE_GCM, | 1140 | GCRY_CIPHER_MODE_GCM, |
1172 | 0 /* flags */); | 1141 | 0 /* flags */); |
1173 | get_iv_key (msec, | 1142 | get_iv_key (msec, serial, key, iv); |
1174 | serial, | 1143 | gcry_cipher_setkey (*cipher, key, sizeof (key)); |
1175 | key, | 1144 | gcry_cipher_setiv (*cipher, iv, sizeof (iv)); |
1176 | iv); | ||
1177 | gcry_cipher_setkey (*cipher, | ||
1178 | key, | ||
1179 | sizeof (key)); | ||
1180 | gcry_cipher_setiv (*cipher, | ||
1181 | iv, | ||
1182 | sizeof (iv)); | ||
1183 | } | 1145 | } |
1184 | 1146 | ||
1185 | 1147 | ||
@@ -1205,19 +1167,11 @@ try_decrypt (const struct SharedSecret *ss, | |||
1205 | { | 1167 | { |
1206 | gcry_cipher_hd_t cipher; | 1168 | gcry_cipher_hd_t cipher; |
1207 | 1169 | ||
1208 | setup_cipher (&ss->master, | 1170 | setup_cipher (&ss->master, serial, &cipher); |
1209 | serial, | 1171 | GNUNET_assert ( |
1210 | &cipher); | 1172 | 0 == |
1211 | GNUNET_assert (0 == | 1173 | gcry_cipher_decrypt (cipher, out_buf, in_buf_size, in_buf, in_buf_size)); |
1212 | gcry_cipher_decrypt (cipher, | 1174 | if (0 != gcry_cipher_checktag (cipher, tag, GCM_TAG_SIZE)) |
1213 | out_buf, | ||
1214 | in_buf_size, | ||
1215 | in_buf, | ||
1216 | in_buf_size)); | ||
1217 | if (0 != | ||
1218 | gcry_cipher_checktag (cipher, | ||
1219 | tag, | ||
1220 | GCM_TAG_SIZE)) | ||
1221 | { | 1175 | { |
1222 | gcry_cipher_close (cipher); | 1176 | gcry_cipher_close (cipher); |
1223 | GNUNET_STATISTICS_update (stats, | 1177 | GNUNET_STATISTICS_update (stats, |
@@ -1243,9 +1197,7 @@ setup_shared_secret_dec (const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral) | |||
1243 | struct SharedSecret *ss; | 1197 | struct SharedSecret *ss; |
1244 | 1198 | ||
1245 | ss = GNUNET_new (struct SharedSecret); | 1199 | ss = GNUNET_new (struct SharedSecret); |
1246 | GNUNET_CRYPTO_eddsa_ecdh (my_private_key, | 1200 | GNUNET_CRYPTO_eddsa_ecdh (my_private_key, ephemeral, &ss->master); |
1247 | ephemeral, | ||
1248 | &ss->master); | ||
1249 | return ss; | 1201 | return ss; |
1250 | } | 1202 | } |
1251 | 1203 | ||
@@ -1259,7 +1211,7 @@ setup_shared_secret_dec (const struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral) | |||
1259 | */ | 1211 | */ |
1260 | static struct SharedSecret * | 1212 | static struct SharedSecret * |
1261 | setup_shared_secret_enc (const struct GNUNET_CRYPTO_EcdhePrivateKey *ephemeral, | 1213 | setup_shared_secret_enc (const struct GNUNET_CRYPTO_EcdhePrivateKey *ephemeral, |
1262 | struct ReceiverAddress *receiver) | 1214 | struct ReceiverAddress *receiver) |
1263 | { | 1215 | { |
1264 | struct SharedSecret *ss; | 1216 | struct SharedSecret *ss; |
1265 | 1217 | ||
@@ -1269,14 +1221,9 @@ setup_shared_secret_enc (const struct GNUNET_CRYPTO_EcdhePrivateKey *ephemeral, | |||
1269 | &ss->master); | 1221 | &ss->master); |
1270 | calculate_cmac (ss); | 1222 | calculate_cmac (ss); |
1271 | ss->receiver = receiver; | 1223 | ss->receiver = receiver; |
1272 | GNUNET_CONTAINER_DLL_insert (receiver->ss_head, | 1224 | GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss); |
1273 | receiver->ss_tail, | ||
1274 | ss); | ||
1275 | receiver->num_secrets++; | 1225 | receiver->num_secrets++; |
1276 | GNUNET_STATISTICS_update (stats, | 1226 | GNUNET_STATISTICS_update (stats, "# Secrets active", 1, GNUNET_NO); |
1277 | "# Secrets active", | ||
1278 | 1, | ||
1279 | GNUNET_NO); | ||
1280 | return ss; | 1227 | return ss; |
1281 | } | 1228 | } |
1282 | 1229 | ||
@@ -1303,21 +1250,15 @@ setup_receiver_mq (struct ReceiverAddress *receiver); | |||
1303 | * @return #GNUNET_YES to continue to iterate | 1250 | * @return #GNUNET_YES to continue to iterate |
1304 | */ | 1251 | */ |
1305 | static int | 1252 | static int |
1306 | handle_ack (void *cls, | 1253 | handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value) |
1307 | const struct GNUNET_PeerIdentity *pid, | ||
1308 | void *value) | ||
1309 | { | 1254 | { |
1310 | const struct UDPAck *ack = cls; | 1255 | const struct UDPAck *ack = cls; |
1311 | struct ReceiverAddress *receiver = value; | 1256 | struct ReceiverAddress *receiver = value; |
1312 | 1257 | ||
1313 | (void) pid; | 1258 | (void) pid; |
1314 | for (struct SharedSecret *ss = receiver->ss_head; | 1259 | for (struct SharedSecret *ss = receiver->ss_head; NULL != ss; ss = ss->next) |
1315 | NULL != ss; | ||
1316 | ss = ss->next) | ||
1317 | { | 1260 | { |
1318 | if (0 == memcmp (&ack->cmac, | 1261 | if (0 == memcmp (&ack->cmac, &ss->cmac, sizeof (struct GNUNET_HashCode))) |
1319 | &ss->cmac, | ||
1320 | sizeof (struct GNUNET_HashCode))) | ||
1321 | { | 1262 | { |
1322 | uint32_t allowed; | 1263 | uint32_t allowed; |
1323 | 1264 | ||
@@ -1326,20 +1267,15 @@ handle_ack (void *cls, | |||
1326 | if (allowed > ss->sequence_allowed) | 1267 | if (allowed > ss->sequence_allowed) |
1327 | { | 1268 | { |
1328 | receiver->acks_available += (allowed - ss->sequence_allowed); | 1269 | receiver->acks_available += (allowed - ss->sequence_allowed); |
1329 | if ((allowed - ss->sequence_allowed) | 1270 | if ((allowed - ss->sequence_allowed) == receiver->acks_available) |
1330 | == receiver->acks_available) | ||
1331 | { | 1271 | { |
1332 | /* we just incremented from zero => MTU change! */ | 1272 | /* we just incremented from zero => MTU change! */ |
1333 | setup_receiver_mq (receiver); | 1273 | setup_receiver_mq (receiver); |
1334 | } | 1274 | } |
1335 | ss->sequence_allowed = allowed; | 1275 | ss->sequence_allowed = allowed; |
1336 | /* move ss to head to avoid discarding it anytime soon! */ | 1276 | /* move ss to head to avoid discarding it anytime soon! */ |
1337 | GNUNET_CONTAINER_DLL_remove (receiver->ss_head, | 1277 | GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss); |
1338 | receiver->ss_tail, | 1278 | GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss); |
1339 | ss); | ||
1340 | GNUNET_CONTAINER_DLL_insert (receiver->ss_head, | ||
1341 | receiver->ss_tail, | ||
1342 | ss); | ||
1343 | } | 1279 | } |
1344 | return GNUNET_NO; | 1280 | return GNUNET_NO; |
1345 | } | 1281 | } |
@@ -1361,10 +1297,9 @@ try_handle_plaintext (struct SenderAddress *sender, | |||
1361 | const void *buf, | 1297 | const void *buf, |
1362 | size_t buf_size) | 1298 | size_t buf_size) |
1363 | { | 1299 | { |
1364 | const struct GNUNET_MessageHeader *hdr | 1300 | const struct GNUNET_MessageHeader *hdr = |
1365 | = (const struct GNUNET_MessageHeader *) buf; | 1301 | (const struct GNUNET_MessageHeader *) buf; |
1366 | const struct UDPAck *ack | 1302 | const struct UDPAck *ack = (const struct UDPAck *) buf; |
1367 | = (const struct UDPAck *) buf; | ||
1368 | uint16_t type; | 1303 | uint16_t type; |
1369 | 1304 | ||
1370 | if (sizeof (*hdr) > buf_size) | 1305 | if (sizeof (*hdr) > buf_size) |
@@ -1383,17 +1318,13 @@ try_handle_plaintext (struct SenderAddress *sender, | |||
1383 | /* There could be more messages after the ACK, handle those as well */ | 1318 | /* There could be more messages after the ACK, handle those as well */ |
1384 | buf += ntohs (hdr->size); | 1319 | buf += ntohs (hdr->size); |
1385 | buf_size -= ntohs (hdr->size); | 1320 | buf_size -= ntohs (hdr->size); |
1386 | pass_plaintext_to_core (sender, | 1321 | pass_plaintext_to_core (sender, buf, buf_size); |
1387 | buf, | ||
1388 | buf_size); | ||
1389 | break; | 1322 | break; |
1390 | case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_PAD: | 1323 | case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_PAD: |
1391 | /* skip padding */ | 1324 | /* skip padding */ |
1392 | break; | 1325 | break; |
1393 | default: | 1326 | default: |
1394 | pass_plaintext_to_core (sender, | 1327 | pass_plaintext_to_core (sender, buf, buf_size); |
1395 | buf, | ||
1396 | buf_size); | ||
1397 | } | 1328 | } |
1398 | } | 1329 | } |
1399 | 1330 | ||
@@ -1411,16 +1342,16 @@ consider_ss_ack (struct SharedSecret *ss) | |||
1411 | { | 1342 | { |
1412 | GNUNET_assert (NULL != ss->sender); | 1343 | GNUNET_assert (NULL != ss->sender); |
1413 | /* drop ancient KeyCacheEntries */ | 1344 | /* drop ancient KeyCacheEntries */ |
1414 | while ( (NULL != ss->kce_head) && | 1345 | while ((NULL != ss->kce_head) && |
1415 | (MAX_SQN_DELTA < ss->kce_head->sequence_number - ss->kce_tail->sequence_number) ) | 1346 | (MAX_SQN_DELTA < |
1347 | ss->kce_head->sequence_number - ss->kce_tail->sequence_number)) | ||
1416 | kce_destroy (ss->kce_tail); | 1348 | kce_destroy (ss->kce_tail); |
1417 | if (ss->active_kce_count < KCN_THRESHOLD) | 1349 | if (ss->active_kce_count < KCN_THRESHOLD) |
1418 | { | 1350 | { |
1419 | struct UDPAck ack; | 1351 | struct UDPAck ack; |
1420 | 1352 | ||
1421 | while (ss->active_kce_count < KCN_TARGET) | 1353 | while (ss->active_kce_count < KCN_TARGET) |
1422 | kce_generate (ss, | 1354 | kce_generate (ss, ++ss->sequence_allowed); |
1423 | ++ss->sequence_allowed); | ||
1424 | ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK); | 1355 | ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK); |
1425 | ack.header.size = htons (sizeof (ack)); | 1356 | ack.header.size = htons (sizeof (ack)); |
1426 | ack.sequence_max = htonl (ss->sequence_allowed); | 1357 | ack.sequence_max = htonl (ss->sequence_allowed); |
@@ -1449,18 +1380,17 @@ decrypt_box (const struct UDPBox *box, | |||
1449 | char out_buf[box_len - sizeof (*box)]; | 1380 | char out_buf[box_len - sizeof (*box)]; |
1450 | 1381 | ||
1451 | GNUNET_assert (NULL != ss->sender); | 1382 | GNUNET_assert (NULL != ss->sender); |
1452 | if (GNUNET_OK != | 1383 | if (GNUNET_OK != try_decrypt (ss, |
1453 | try_decrypt (ss, | 1384 | box->gcm_tag, |
1454 | box->gcm_tag, | 1385 | kce->sequence_number, |
1455 | kce->sequence_number, | 1386 | (const char *) &box[1], |
1456 | (const char *) &box[1], | 1387 | sizeof (out_buf), |
1457 | sizeof (out_buf), | 1388 | out_buf)) |
1458 | out_buf)) | ||
1459 | { | 1389 | { |
1460 | GNUNET_STATISTICS_update (stats, | 1390 | GNUNET_STATISTICS_update (stats, |
1461 | "# Decryption failures with valid KCE", | 1391 | "# Decryption failures with valid KCE", |
1462 | 1, | 1392 | 1, |
1463 | GNUNET_NO); | 1393 | GNUNET_NO); |
1464 | kce_destroy (kce); | 1394 | kce_destroy (kce); |
1465 | return; | 1395 | return; |
1466 | } | 1396 | } |
@@ -1469,9 +1399,7 @@ decrypt_box (const struct UDPBox *box, | |||
1469 | "# bytes decrypted with BOX", | 1399 | "# bytes decrypted with BOX", |
1470 | sizeof (out_buf), | 1400 | sizeof (out_buf), |
1471 | GNUNET_NO); | 1401 | GNUNET_NO); |
1472 | try_handle_plaintext (ss->sender, | 1402 | try_handle_plaintext (ss->sender, out_buf, sizeof (out_buf)); |
1473 | out_buf, | ||
1474 | sizeof (out_buf)); | ||
1475 | consider_ss_ack (ss); | 1403 | consider_ss_ack (ss); |
1476 | } | 1404 | } |
1477 | 1405 | ||
@@ -1514,10 +1442,8 @@ find_sender_by_address (void *cls, | |||
1514 | struct SearchContext *sc = cls; | 1442 | struct SearchContext *sc = cls; |
1515 | struct SenderAddress *sender = value; | 1443 | struct SenderAddress *sender = value; |
1516 | 1444 | ||
1517 | if ( (sender->address_len == sc->address_len) && | 1445 | if ((sender->address_len == sc->address_len) && |
1518 | (0 == memcmp (sender->address, | 1446 | (0 == memcmp (sender->address, sc->address, sender->address_len))) |
1519 | sc->address, | ||
1520 | sender->address_len)) ) | ||
1521 | { | 1447 | { |
1522 | sc->sender = sender; | 1448 | sc->sender = sender; |
1523 | return GNUNET_NO; /* stop iterating! */ | 1449 | return GNUNET_NO; /* stop iterating! */ |
@@ -1543,11 +1469,9 @@ setup_sender (const struct GNUNET_PeerIdentity *target, | |||
1543 | socklen_t address_len) | 1469 | socklen_t address_len) |
1544 | { | 1470 | { |
1545 | struct SenderAddress *sender; | 1471 | struct SenderAddress *sender; |
1546 | struct SearchContext sc = { | 1472 | struct SearchContext sc = {.address = address, |
1547 | .address = address, | 1473 | .address_len = address_len, |
1548 | .address_len = address_len, | 1474 | .sender = NULL}; |
1549 | .sender = NULL | ||
1550 | }; | ||
1551 | 1475 | ||
1552 | GNUNET_CONTAINER_multipeermap_get_multiple (senders, | 1476 | GNUNET_CONTAINER_multipeermap_get_multiple (senders, |
1553 | target, | 1477 | target, |
@@ -1560,28 +1484,25 @@ setup_sender (const struct GNUNET_PeerIdentity *target, | |||
1560 | } | 1484 | } |
1561 | sender = GNUNET_new (struct SenderAddress); | 1485 | sender = GNUNET_new (struct SenderAddress); |
1562 | sender->target = *target; | 1486 | sender->target = *target; |
1563 | sender->address = GNUNET_memdup (address, | 1487 | sender->address = GNUNET_memdup (address, address_len); |
1564 | address_len); | ||
1565 | sender->address_len = address_len; | 1488 | sender->address_len = address_len; |
1566 | (void) GNUNET_CONTAINER_multipeermap_put (senders, | 1489 | (void) GNUNET_CONTAINER_multipeermap_put ( |
1567 | &sender->target, | 1490 | senders, |
1568 | sender, | 1491 | &sender->target, |
1569 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); | 1492 | sender, |
1493 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); | ||
1570 | GNUNET_STATISTICS_set (stats, | 1494 | GNUNET_STATISTICS_set (stats, |
1571 | "# senders active", | 1495 | "# senders active", |
1572 | GNUNET_CONTAINER_multipeermap_size (receivers), | 1496 | GNUNET_CONTAINER_multipeermap_size (receivers), |
1573 | GNUNET_NO); | 1497 | GNUNET_NO); |
1574 | sender->timeout | 1498 | sender->timeout = |
1575 | = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); | 1499 | GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); |
1576 | sender->hn = GNUNET_CONTAINER_heap_insert (senders_heap, | 1500 | sender->hn = GNUNET_CONTAINER_heap_insert (senders_heap, |
1577 | sender, | 1501 | sender, |
1578 | sender->timeout.abs_value_us); | 1502 | sender->timeout.abs_value_us); |
1579 | sender->nt = GNUNET_NT_scanner_get_type (is, | 1503 | sender->nt = GNUNET_NT_scanner_get_type (is, address, address_len); |
1580 | address, | ||
1581 | address_len); | ||
1582 | if (NULL == timeout_task) | 1504 | if (NULL == timeout_task) |
1583 | timeout_task = GNUNET_SCHEDULER_add_now (&check_timeouts, | 1505 | timeout_task = GNUNET_SCHEDULER_add_now (&check_timeouts, NULL); |
1584 | NULL); | ||
1585 | return sender; | 1506 | return sender; |
1586 | } | 1507 | } |
1587 | 1508 | ||
@@ -1632,15 +1553,13 @@ sockaddr_to_udpaddr_string (const struct sockaddr *address, | |||
1632 | GNUNET_asprintf (&ret, | 1553 | GNUNET_asprintf (&ret, |
1633 | "%s-%s", | 1554 | "%s-%s", |
1634 | COMMUNICATOR_ADDRESS_PREFIX, | 1555 | COMMUNICATOR_ADDRESS_PREFIX, |
1635 | GNUNET_a2s (address, | 1556 | GNUNET_a2s (address, address_len)); |
1636 | address_len)); | ||
1637 | break; | 1557 | break; |
1638 | case AF_INET6: | 1558 | case AF_INET6: |
1639 | GNUNET_asprintf (&ret, | 1559 | GNUNET_asprintf (&ret, |
1640 | "%s-%s", | 1560 | "%s-%s", |
1641 | COMMUNICATOR_ADDRESS_PREFIX, | 1561 | COMMUNICATOR_ADDRESS_PREFIX, |
1642 | GNUNET_a2s (address, | 1562 | GNUNET_a2s (address, address_len)); |
1643 | address_len)); | ||
1644 | break; | 1563 | break; |
1645 | default: | 1564 | default: |
1646 | GNUNET_assert (0); | 1565 | GNUNET_assert (0); |
@@ -1663,11 +1582,10 @@ sock_read (void *cls) | |||
1663 | ssize_t rcvd; | 1582 | ssize_t rcvd; |
1664 | 1583 | ||
1665 | (void) cls; | 1584 | (void) cls; |
1666 | read_task | 1585 | read_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
1667 | = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, | 1586 | udp_sock, |
1668 | udp_sock, | 1587 | &sock_read, |
1669 | &sock_read, | 1588 | NULL); |
1670 | NULL); | ||
1671 | rcvd = GNUNET_NETWORK_socket_recvfrom (udp_sock, | 1589 | rcvd = GNUNET_NETWORK_socket_recvfrom (udp_sock, |
1672 | buf, | 1590 | buf, |
1673 | sizeof (buf), | 1591 | sizeof (buf), |
@@ -1675,8 +1593,7 @@ sock_read (void *cls) | |||
1675 | &salen); | 1593 | &salen); |
1676 | if (-1 == rcvd) | 1594 | if (-1 == rcvd) |
1677 | { | 1595 | { |
1678 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, | 1596 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "recv"); |
1679 | "recv"); | ||
1680 | return; | 1597 | return; |
1681 | } | 1598 | } |
1682 | 1599 | ||
@@ -1687,13 +1604,10 @@ sock_read (void *cls) | |||
1687 | struct KeyCacheEntry *kce; | 1604 | struct KeyCacheEntry *kce; |
1688 | 1605 | ||
1689 | box = (const struct UDPBox *) buf; | 1606 | box = (const struct UDPBox *) buf; |
1690 | kce = GNUNET_CONTAINER_multishortmap_get (key_cache, | 1607 | kce = GNUNET_CONTAINER_multishortmap_get (key_cache, &box->kid); |
1691 | &box->kid); | ||
1692 | if (NULL != kce) | 1608 | if (NULL != kce) |
1693 | { | 1609 | { |
1694 | decrypt_box (box, | 1610 | decrypt_box (box, (size_t) rcvd, kce); |
1695 | (size_t) rcvd, | ||
1696 | kce); | ||
1697 | return; | 1611 | return; |
1698 | } | 1612 | } |
1699 | } | 1613 | } |
@@ -1708,9 +1622,7 @@ sock_read (void *cls) | |||
1708 | uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST); | 1622 | uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST); |
1709 | uhs.purpose.size = htonl (sizeof (uhs)); | 1623 | uhs.purpose.size = htonl (sizeof (uhs)); |
1710 | uhs.sender = ub->sender; | 1624 | uhs.sender = ub->sender; |
1711 | GNUNET_CRYPTO_hash (&sa, | 1625 | GNUNET_CRYPTO_hash (&sa, salen, &uhs.h_address); |
1712 | salen, | ||
1713 | &uhs.h_address); | ||
1714 | if (GNUNET_OK == | 1626 | if (GNUNET_OK == |
1715 | GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST, | 1627 | GNUNET_CRYPTO_eddsa_verify (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST, |
1716 | &uhs.purpose, | 1628 | &uhs.purpose, |
@@ -1721,18 +1633,15 @@ sock_read (void *cls) | |||
1721 | struct GNUNET_TIME_Absolute expiration; | 1633 | struct GNUNET_TIME_Absolute expiration; |
1722 | enum GNUNET_NetworkType nt; | 1634 | enum GNUNET_NetworkType nt; |
1723 | 1635 | ||
1724 | addr_s = sockaddr_to_udpaddr_string ((const struct sockaddr *) &sa, | 1636 | addr_s = |
1725 | salen); | 1637 | sockaddr_to_udpaddr_string ((const struct sockaddr *) &sa, salen); |
1726 | GNUNET_STATISTICS_update (stats, | 1638 | GNUNET_STATISTICS_update (stats, "# broadcasts received", 1, GNUNET_NO); |
1727 | "# broadcasts received", | 1639 | /* expire at the broadcast frequency, as then we'll get the next one |
1728 | 1, | 1640 | * anyway */ |
1729 | GNUNET_NO); | ||
1730 | /* expire at the broadcast frequency, as then we'll get the next one anyway */ | ||
1731 | expiration = GNUNET_TIME_relative_to_absolute (BROADCAST_FREQUENCY); | 1641 | expiration = GNUNET_TIME_relative_to_absolute (BROADCAST_FREQUENCY); |
1732 | /* use our own mechanism to determine network type */ | 1642 | /* use our own mechanism to determine network type */ |
1733 | nt = GNUNET_NT_scanner_get_type (is, | 1643 | nt = |
1734 | (const struct sockaddr *) &sa, | 1644 | GNUNET_NT_scanner_get_type (is, (const struct sockaddr *) &sa, salen); |
1735 | salen); | ||
1736 | GNUNET_TRANSPORT_application_validate (ah, | 1645 | GNUNET_TRANSPORT_application_validate (ah, |
1737 | &ub->sender, | 1646 | &ub->sender, |
1738 | expiration, | 1647 | expiration, |
@@ -1749,9 +1658,9 @@ sock_read (void *cls) | |||
1749 | if (rcvd < sizeof (struct UDPConfirmation) + sizeof (struct InitialKX)) | 1658 | if (rcvd < sizeof (struct UDPConfirmation) + sizeof (struct InitialKX)) |
1750 | { | 1659 | { |
1751 | GNUNET_STATISTICS_update (stats, | 1660 | GNUNET_STATISTICS_update (stats, |
1752 | "# messages dropped (no kid, too small for KX)", | 1661 | "# messages dropped (no kid, too small for KX)", |
1753 | 1, | 1662 | 1, |
1754 | GNUNET_NO); | 1663 | GNUNET_NO); |
1755 | return; | 1664 | return; |
1756 | } | 1665 | } |
1757 | 1666 | ||
@@ -1764,54 +1673,43 @@ sock_read (void *cls) | |||
1764 | 1673 | ||
1765 | kx = (const struct InitialKX *) buf; | 1674 | kx = (const struct InitialKX *) buf; |
1766 | ss = setup_shared_secret_dec (&kx->ephemeral); | 1675 | ss = setup_shared_secret_dec (&kx->ephemeral); |
1767 | if (GNUNET_OK != | 1676 | if (GNUNET_OK != try_decrypt (ss, |
1768 | try_decrypt (ss, | 1677 | kx->gcm_tag, |
1769 | kx->gcm_tag, | 1678 | 0, |
1770 | 0, | 1679 | &buf[sizeof (*kx)], |
1771 | &buf[sizeof (*kx)], | 1680 | sizeof (pbuf), |
1772 | sizeof (pbuf), | 1681 | pbuf)) |
1773 | pbuf)) | ||
1774 | { | 1682 | { |
1775 | GNUNET_free (ss); | 1683 | GNUNET_free (ss); |
1776 | GNUNET_STATISTICS_update (stats, | 1684 | GNUNET_STATISTICS_update ( |
1777 | "# messages dropped (no kid, AEAD decryption failed)", | 1685 | stats, |
1778 | 1, | 1686 | "# messages dropped (no kid, AEAD decryption failed)", |
1779 | GNUNET_NO); | 1687 | 1, |
1688 | GNUNET_NO); | ||
1780 | return; | 1689 | return; |
1781 | } | 1690 | } |
1782 | uc = (const struct UDPConfirmation *) pbuf; | 1691 | uc = (const struct UDPConfirmation *) pbuf; |
1783 | if (GNUNET_OK != | 1692 | if (GNUNET_OK != verify_confirmation (&kx->ephemeral, uc)) |
1784 | verify_confirmation (&kx->ephemeral, | ||
1785 | uc)) | ||
1786 | { | 1693 | { |
1787 | GNUNET_break_op (0); | 1694 | GNUNET_break_op (0); |
1788 | GNUNET_free (ss); | 1695 | GNUNET_free (ss); |
1789 | GNUNET_STATISTICS_update (stats, | 1696 | GNUNET_STATISTICS_update (stats, |
1790 | "# messages dropped (sender signature invalid)", | 1697 | "# messages dropped (sender signature invalid)", |
1791 | 1, | 1698 | 1, |
1792 | GNUNET_NO); | 1699 | GNUNET_NO); |
1793 | return; | 1700 | return; |
1794 | } | 1701 | } |
1795 | calculate_cmac (ss); | 1702 | calculate_cmac (ss); |
1796 | sender = setup_sender (&uc->sender, | 1703 | sender = setup_sender (&uc->sender, (const struct sockaddr *) &sa, salen); |
1797 | (const struct sockaddr *) &sa, | ||
1798 | salen); | ||
1799 | ss->sender = sender; | 1704 | ss->sender = sender; |
1800 | GNUNET_CONTAINER_DLL_insert (sender->ss_head, | 1705 | GNUNET_CONTAINER_DLL_insert (sender->ss_head, sender->ss_tail, ss); |
1801 | sender->ss_tail, | ||
1802 | ss); | ||
1803 | sender->num_secrets++; | 1706 | sender->num_secrets++; |
1804 | GNUNET_STATISTICS_update (stats, | 1707 | GNUNET_STATISTICS_update (stats, "# Secrets active", 1, GNUNET_NO); |
1805 | "# Secrets active", | ||
1806 | 1, | ||
1807 | GNUNET_NO); | ||
1808 | GNUNET_STATISTICS_update (stats, | 1708 | GNUNET_STATISTICS_update (stats, |
1809 | "# messages decrypted without BOX", | 1709 | "# messages decrypted without BOX", |
1810 | 1, | 1710 | 1, |
1811 | GNUNET_NO); | 1711 | GNUNET_NO); |
1812 | try_handle_plaintext (sender, | 1712 | try_handle_plaintext (sender, &uc[1], sizeof (pbuf) - sizeof (*uc)); |
1813 | &uc[1], | ||
1814 | sizeof (pbuf) - sizeof (*uc)); | ||
1815 | consider_ss_ack (ss); | 1713 | consider_ss_ack (ss); |
1816 | if (sender->num_secrets > MAX_SECRETS) | 1714 | if (sender->num_secrets > MAX_SECRETS) |
1817 | secret_destroy (sender->ss_tail); | 1715 | secret_destroy (sender->ss_tail); |
@@ -1827,8 +1725,7 @@ sock_read (void *cls) | |||
1827 | * @return converted bindto specification | 1725 | * @return converted bindto specification |
1828 | */ | 1726 | */ |
1829 | static struct sockaddr * | 1727 | static struct sockaddr * |
1830 | udp_address_to_sockaddr (const char *bindto, | 1728 | udp_address_to_sockaddr (const char *bindto, socklen_t *sock_len) |
1831 | socklen_t *sock_len) | ||
1832 | { | 1729 | { |
1833 | struct sockaddr *in; | 1730 | struct sockaddr *in; |
1834 | unsigned int port; | 1731 | unsigned int port; |
@@ -1836,10 +1733,7 @@ udp_address_to_sockaddr (const char *bindto, | |||
1836 | char *colon; | 1733 | char *colon; |
1837 | char *cp; | 1734 | char *cp; |
1838 | 1735 | ||
1839 | if (1 == SSCANF (bindto, | 1736 | if (1 == SSCANF (bindto, "%u%1s", &port, dummy)) |
1840 | "%u%1s", | ||
1841 | &port, | ||
1842 | dummy)) | ||
1843 | { | 1737 | { |
1844 | /* interpreting value as just a PORT number */ | 1738 | /* interpreting value as just a PORT number */ |
1845 | if (port > UINT16_MAX) | 1739 | if (port > UINT16_MAX) |
@@ -1849,12 +1743,11 @@ udp_address_to_sockaddr (const char *bindto, | |||
1849 | bindto); | 1743 | bindto); |
1850 | return NULL; | 1744 | return NULL; |
1851 | } | 1745 | } |
1852 | if ( (GNUNET_NO == | 1746 | if ((GNUNET_NO == GNUNET_NETWORK_test_pf (PF_INET6)) || |
1853 | GNUNET_NETWORK_test_pf (PF_INET6)) || | 1747 | (GNUNET_YES == |
1854 | (GNUNET_YES == | 1748 | GNUNET_CONFIGURATION_get_value_yesno (cfg, |
1855 | GNUNET_CONFIGURATION_get_value_yesno (cfg, | 1749 | COMMUNICATOR_CONFIG_SECTION, |
1856 | COMMUNICATOR_CONFIG_SECTION, | 1750 | "DISABLE_V6"))) |
1857 | "DISABLE_V6")) ) | ||
1858 | { | 1751 | { |
1859 | struct sockaddr_in *i4; | 1752 | struct sockaddr_in *i4; |
1860 | 1753 | ||
@@ -1883,26 +1776,24 @@ udp_address_to_sockaddr (const char *bindto, | |||
1883 | /* interpet value after colon as port */ | 1776 | /* interpet value after colon as port */ |
1884 | *colon = '\0'; | 1777 | *colon = '\0'; |
1885 | colon++; | 1778 | colon++; |
1886 | if (1 == SSCANF (colon, | 1779 | if (1 == SSCANF (colon, "%u%1s", &port, dummy)) |
1887 | "%u%1s", | ||
1888 | &port, | ||
1889 | dummy)) | ||
1890 | { | 1780 | { |
1891 | /* interpreting value as just a PORT number */ | 1781 | /* interpreting value as just a PORT number */ |
1892 | if (port > UINT16_MAX) | 1782 | if (port > UINT16_MAX) |
1893 | { | 1783 | { |
1894 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 1784 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
1895 | "BINDTO specification `%s' invalid: value too large for port\n", | 1785 | "BINDTO specification `%s' invalid: value too large for port\n", |
1896 | bindto); | 1786 | bindto); |
1897 | GNUNET_free (cp); | 1787 | GNUNET_free (cp); |
1898 | return NULL; | 1788 | return NULL; |
1899 | } | 1789 | } |
1900 | } | 1790 | } |
1901 | else | 1791 | else |
1902 | { | 1792 | { |
1903 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 1793 | GNUNET_log ( |
1904 | "BINDTO specification `%s' invalid: last ':' not followed by number\n", | 1794 | GNUNET_ERROR_TYPE_ERROR, |
1905 | bindto); | 1795 | "BINDTO specification `%s' invalid: last ':' not followed by number\n", |
1796 | bindto); | ||
1906 | GNUNET_free (cp); | 1797 | GNUNET_free (cp); |
1907 | return NULL; | 1798 | return NULL; |
1908 | } | 1799 | } |
@@ -1916,13 +1807,10 @@ udp_address_to_sockaddr (const char *bindto, | |||
1916 | /* try IPv4 */ | 1807 | /* try IPv4 */ |
1917 | struct sockaddr_in v4; | 1808 | struct sockaddr_in v4; |
1918 | 1809 | ||
1919 | if (1 == inet_pton (AF_INET, | 1810 | if (1 == inet_pton (AF_INET, cp, &v4)) |
1920 | cp, | ||
1921 | &v4)) | ||
1922 | { | 1811 | { |
1923 | v4.sin_port = htons ((uint16_t) port); | 1812 | v4.sin_port = htons ((uint16_t) port); |
1924 | in = GNUNET_memdup (&v4, | 1813 | in = GNUNET_memdup (&v4, sizeof (v4)); |
1925 | sizeof (v4)); | ||
1926 | *sock_len = sizeof (v4); | 1814 | *sock_len = sizeof (v4); |
1927 | GNUNET_free (cp); | 1815 | GNUNET_free (cp); |
1928 | return in; | 1816 | return in; |
@@ -1934,19 +1822,15 @@ udp_address_to_sockaddr (const char *bindto, | |||
1934 | const char *start; | 1822 | const char *start; |
1935 | 1823 | ||
1936 | start = cp; | 1824 | start = cp; |
1937 | if ( ('[' == *cp) && | 1825 | if (('[' == *cp) && (']' == cp[strlen (cp) - 1])) |
1938 | (']' == cp[strlen (cp)-1]) ) | ||
1939 | { | 1826 | { |
1940 | start++; /* skip over '[' */ | 1827 | start++; /* skip over '[' */ |
1941 | cp[strlen (cp) -1] = '\0'; /* eat ']' */ | 1828 | cp[strlen (cp) - 1] = '\0'; /* eat ']' */ |
1942 | } | 1829 | } |
1943 | if (1 == inet_pton (AF_INET6, | 1830 | if (1 == inet_pton (AF_INET6, start, &v6)) |
1944 | start, | ||
1945 | &v6)) | ||
1946 | { | 1831 | { |
1947 | v6.sin6_port = htons ((uint16_t) port); | 1832 | v6.sin6_port = htons ((uint16_t) port); |
1948 | in = GNUNET_memdup (&v6, | 1833 | in = GNUNET_memdup (&v6, sizeof (v6)); |
1949 | sizeof (v6)); | ||
1950 | *sock_len = sizeof (v6); | 1834 | *sock_len = sizeof (v6); |
1951 | GNUNET_free (cp); | 1835 | GNUNET_free (cp); |
1952 | return in; | 1836 | return in; |
@@ -1966,32 +1850,22 @@ udp_address_to_sockaddr (const char *bindto, | |||
1966 | * @param pad_size number of bytes of padding to append | 1850 | * @param pad_size number of bytes of padding to append |
1967 | */ | 1851 | */ |
1968 | static void | 1852 | static void |
1969 | do_pad (gcry_cipher_hd_t out_cipher, | 1853 | do_pad (gcry_cipher_hd_t out_cipher, char *dgram, size_t pad_size) |
1970 | char *dgram, | ||
1971 | size_t pad_size) | ||
1972 | { | 1854 | { |
1973 | char pad[pad_size]; | 1855 | char pad[pad_size]; |
1974 | 1856 | ||
1975 | GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, | 1857 | GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK, pad, sizeof (pad)); |
1976 | pad, | ||
1977 | sizeof (pad)); | ||
1978 | if (sizeof (pad) > sizeof (struct GNUNET_MessageHeader)) | 1858 | if (sizeof (pad) > sizeof (struct GNUNET_MessageHeader)) |
1979 | { | 1859 | { |
1980 | struct GNUNET_MessageHeader hdr = { | 1860 | struct GNUNET_MessageHeader hdr = |
1981 | .size = htons (sizeof (pad)), | 1861 | {.size = htons (sizeof (pad)), |
1982 | .type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_PAD) | 1862 | .type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_PAD)}; |
1983 | }; | 1863 | |
1984 | 1864 | memcpy (pad, &hdr, sizeof (hdr)); | |
1985 | memcpy (pad, | 1865 | } |
1986 | &hdr, | 1866 | GNUNET_assert ( |
1987 | sizeof (hdr)); | 1867 | 0 == |
1988 | } | 1868 | gcry_cipher_encrypt (out_cipher, dgram, sizeof (pad), pad, sizeof (pad))); |
1989 | GNUNET_assert (0 == | ||
1990 | gcry_cipher_encrypt (out_cipher, | ||
1991 | dgram, | ||
1992 | sizeof (pad), | ||
1993 | pad, | ||
1994 | sizeof (pad))); | ||
1995 | } | 1869 | } |
1996 | 1870 | ||
1997 | 1871 | ||
@@ -2027,83 +1901,61 @@ mq_send (struct GNUNET_MQ_Handle *mq, | |||
2027 | struct UDPConfirmation uc; | 1901 | struct UDPConfirmation uc; |
2028 | struct InitialKX kx; | 1902 | struct InitialKX kx; |
2029 | struct GNUNET_CRYPTO_EcdhePrivateKey epriv; | 1903 | struct GNUNET_CRYPTO_EcdhePrivateKey epriv; |
2030 | char dgram[receiver->mtu + | 1904 | char dgram[receiver->mtu + sizeof (uc) + sizeof (kx)]; |
2031 | sizeof (uc) + | ||
2032 | sizeof (kx)]; | ||
2033 | size_t dpos; | 1905 | size_t dpos; |
2034 | gcry_cipher_hd_t out_cipher; | 1906 | gcry_cipher_hd_t out_cipher; |
2035 | struct SharedSecret *ss; | 1907 | struct SharedSecret *ss; |
2036 | 1908 | ||
2037 | /* setup key material */ | 1909 | /* setup key material */ |
2038 | GNUNET_assert (GNUNET_OK == | 1910 | GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_ecdhe_key_create2 (&epriv)); |
2039 | GNUNET_CRYPTO_ecdhe_key_create2 (&epriv)); | 1911 | |
2040 | 1912 | ss = setup_shared_secret_enc (&epriv, receiver); | |
2041 | ss = setup_shared_secret_enc (&epriv, | 1913 | setup_cipher (&ss->master, 0, &out_cipher); |
2042 | receiver); | ||
2043 | setup_cipher (&ss->master, | ||
2044 | 0, | ||
2045 | &out_cipher); | ||
2046 | /* compute 'uc' */ | 1914 | /* compute 'uc' */ |
2047 | uc.sender = my_identity; | 1915 | uc.sender = my_identity; |
2048 | uc.monotonic_time = GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get_monotonic (cfg)); | 1916 | uc.monotonic_time = |
1917 | GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get_monotonic (cfg)); | ||
2049 | uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE); | 1918 | uhs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE); |
2050 | uhs.purpose.size = htonl (sizeof (uhs)); | 1919 | uhs.purpose.size = htonl (sizeof (uhs)); |
2051 | uhs.sender = my_identity; | 1920 | uhs.sender = my_identity; |
2052 | uhs.receiver = receiver->target; | 1921 | uhs.receiver = receiver->target; |
2053 | GNUNET_CRYPTO_ecdhe_key_get_public (&epriv, | 1922 | GNUNET_CRYPTO_ecdhe_key_get_public (&epriv, &uhs.ephemeral); |
2054 | &uhs.ephemeral); | ||
2055 | uhs.monotonic_time = uc.monotonic_time; | 1923 | uhs.monotonic_time = uc.monotonic_time; |
2056 | GNUNET_assert (GNUNET_OK == | 1924 | GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_eddsa_sign (my_private_key, |
2057 | GNUNET_CRYPTO_eddsa_sign (my_private_key, | 1925 | &uhs.purpose, |
2058 | &uhs.purpose, | 1926 | &uc.sender_sig)); |
2059 | &uc.sender_sig)); | ||
2060 | /* Leave space for kx */ | 1927 | /* Leave space for kx */ |
2061 | dpos = sizeof (struct GNUNET_CRYPTO_EcdhePublicKey); | 1928 | dpos = sizeof (struct GNUNET_CRYPTO_EcdhePublicKey); |
2062 | /* Append encrypted uc to dgram */ | 1929 | /* Append encrypted uc to dgram */ |
2063 | GNUNET_assert (0 == | 1930 | GNUNET_assert (0 == gcry_cipher_encrypt (out_cipher, |
2064 | gcry_cipher_encrypt (out_cipher, | 1931 | &dgram[dpos], |
2065 | &dgram[dpos], | 1932 | sizeof (uc), |
2066 | sizeof (uc), | 1933 | &uc, |
2067 | &uc, | 1934 | sizeof (uc))); |
2068 | sizeof (uc))); | ||
2069 | dpos += sizeof (uc); | 1935 | dpos += sizeof (uc); |
2070 | /* Append encrypted payload to dgram */ | 1936 | /* Append encrypted payload to dgram */ |
2071 | GNUNET_assert (0 == | 1937 | GNUNET_assert ( |
2072 | gcry_cipher_encrypt (out_cipher, | 1938 | 0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize)); |
2073 | &dgram[dpos], | ||
2074 | msize, | ||
2075 | msg, | ||
2076 | msize)); | ||
2077 | dpos += msize; | 1939 | dpos += msize; |
2078 | do_pad (out_cipher, | 1940 | do_pad (out_cipher, &dgram[dpos], sizeof (dgram) - dpos); |
2079 | &dgram[dpos], | ||
2080 | sizeof (dgram) - dpos); | ||
2081 | /* Datagram starts with kx */ | 1941 | /* Datagram starts with kx */ |
2082 | kx.ephemeral = uhs.ephemeral; | 1942 | kx.ephemeral = uhs.ephemeral; |
2083 | GNUNET_assert (0 == | 1943 | GNUNET_assert ( |
2084 | gcry_cipher_gettag (out_cipher, | 1944 | 0 == gcry_cipher_gettag (out_cipher, kx.gcm_tag, sizeof (kx.gcm_tag))); |
2085 | kx.gcm_tag, | ||
2086 | sizeof (kx.gcm_tag))); | ||
2087 | gcry_cipher_close (out_cipher); | 1945 | gcry_cipher_close (out_cipher); |
2088 | memcpy (dgram, | 1946 | memcpy (dgram, &kx, sizeof (kx)); |
2089 | &kx, | 1947 | if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock, |
2090 | sizeof (kx)); | 1948 | dgram, |
2091 | if (-1 == | 1949 | sizeof (dgram), |
2092 | GNUNET_NETWORK_socket_sendto (udp_sock, | 1950 | receiver->address, |
2093 | dgram, | 1951 | receiver->address_len)) |
2094 | sizeof (dgram), | 1952 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send"); |
2095 | receiver->address, | ||
2096 | receiver->address_len)) | ||
2097 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | ||
2098 | "send"); | ||
2099 | GNUNET_MQ_impl_send_continue (mq); | 1953 | GNUNET_MQ_impl_send_continue (mq); |
2100 | return; | 1954 | return; |
2101 | } /* End of KX encryption method */ | 1955 | } /* End of KX encryption method */ |
2102 | 1956 | ||
2103 | /* begin "BOX" encryption method, scan for ACKs from tail! */ | 1957 | /* begin "BOX" encryption method, scan for ACKs from tail! */ |
2104 | for (struct SharedSecret *ss = receiver->ss_tail; | 1958 | for (struct SharedSecret *ss = receiver->ss_tail; NULL != ss; ss = ss->prev) |
2105 | NULL != ss; | ||
2106 | ss = ss->prev) | ||
2107 | { | 1959 | { |
2108 | if (ss->sequence_used < ss->sequence_allowed) | 1960 | if (ss->sequence_used < ss->sequence_allowed) |
2109 | { | 1961 | { |
@@ -2114,37 +1966,24 @@ mq_send (struct GNUNET_MQ_Handle *mq, | |||
2114 | 1966 | ||
2115 | box = (struct UDPBox *) dgram; | 1967 | box = (struct UDPBox *) dgram; |
2116 | ss->sequence_used++; | 1968 | ss->sequence_used++; |
2117 | get_kid (&ss->master, | 1969 | get_kid (&ss->master, ss->sequence_used, &box->kid); |
2118 | ss->sequence_used, | 1970 | setup_cipher (&ss->master, ss->sequence_used, &out_cipher); |
2119 | &box->kid); | ||
2120 | setup_cipher (&ss->master, | ||
2121 | ss->sequence_used, | ||
2122 | &out_cipher); | ||
2123 | /* Append encrypted payload to dgram */ | 1971 | /* Append encrypted payload to dgram */ |
2124 | dpos = sizeof (struct UDPBox); | 1972 | dpos = sizeof (struct UDPBox); |
2125 | GNUNET_assert (0 == | 1973 | GNUNET_assert ( |
2126 | gcry_cipher_encrypt (out_cipher, | 1974 | 0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize)); |
2127 | &dgram[dpos], | ||
2128 | msize, | ||
2129 | msg, | ||
2130 | msize)); | ||
2131 | dpos += msize; | 1975 | dpos += msize; |
2132 | do_pad (out_cipher, | 1976 | do_pad (out_cipher, &dgram[dpos], sizeof (dgram) - dpos); |
2133 | &dgram[dpos], | 1977 | GNUNET_assert (0 == gcry_cipher_gettag (out_cipher, |
2134 | sizeof (dgram) - dpos); | 1978 | box->gcm_tag, |
2135 | GNUNET_assert (0 == | 1979 | sizeof (box->gcm_tag))); |
2136 | gcry_cipher_gettag (out_cipher, | ||
2137 | box->gcm_tag, | ||
2138 | sizeof (box->gcm_tag))); | ||
2139 | gcry_cipher_close (out_cipher); | 1980 | gcry_cipher_close (out_cipher); |
2140 | if (-1 == | 1981 | if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock, |
2141 | GNUNET_NETWORK_socket_sendto (udp_sock, | 1982 | dgram, |
2142 | dgram, | 1983 | sizeof (dgram), |
2143 | sizeof (dgram), | 1984 | receiver->address, |
2144 | receiver->address, | 1985 | receiver->address_len)) |
2145 | receiver->address_len)) | 1986 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send"); |
2146 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | ||
2147 | "send"); | ||
2148 | GNUNET_MQ_impl_send_continue (mq); | 1987 | GNUNET_MQ_impl_send_continue (mq); |
2149 | receiver->acks_available--; | 1988 | receiver->acks_available--; |
2150 | if (0 == receiver->acks_available) | 1989 | if (0 == receiver->acks_available) |
@@ -2168,8 +2007,7 @@ mq_send (struct GNUNET_MQ_Handle *mq, | |||
2168 | * @param impl_state our `struct ReceiverAddress` | 2007 | * @param impl_state our `struct ReceiverAddress` |
2169 | */ | 2008 | */ |
2170 | static void | 2009 | static void |
2171 | mq_destroy (struct GNUNET_MQ_Handle *mq, | 2010 | mq_destroy (struct GNUNET_MQ_Handle *mq, void *impl_state) |
2172 | void *impl_state) | ||
2173 | { | 2011 | { |
2174 | struct ReceiverAddress *receiver = impl_state; | 2012 | struct ReceiverAddress *receiver = impl_state; |
2175 | 2013 | ||
@@ -2188,8 +2026,7 @@ mq_destroy (struct GNUNET_MQ_Handle *mq, | |||
2188 | * @param impl_state our `struct RecvierAddress` | 2026 | * @param impl_state our `struct RecvierAddress` |
2189 | */ | 2027 | */ |
2190 | static void | 2028 | static void |
2191 | mq_cancel (struct GNUNET_MQ_Handle *mq, | 2029 | mq_cancel (struct GNUNET_MQ_Handle *mq, void *impl_state) |
2192 | void *impl_state) | ||
2193 | { | 2030 | { |
2194 | /* Cancellation is impossible with UDP; bail */ | 2031 | /* Cancellation is impossible with UDP; bail */ |
2195 | GNUNET_assert (0); | 2032 | GNUNET_assert (0); |
@@ -2206,8 +2043,7 @@ mq_cancel (struct GNUNET_MQ_Handle *mq, | |||
2206 | * @param error error code | 2043 | * @param error error code |
2207 | */ | 2044 | */ |
2208 | static void | 2045 | static void |
2209 | mq_error (void *cls, | 2046 | mq_error (void *cls, enum GNUNET_MQ_Error error) |
2210 | enum GNUNET_MQ_Error error) | ||
2211 | { | 2047 | { |
2212 | struct ReceiverAddress *receiver = cls; | 2048 | struct ReceiverAddress *receiver = cls; |
2213 | 2049 | ||
@@ -2240,16 +2076,14 @@ setup_receiver_mq (struct ReceiverAddress *receiver) | |||
2240 | switch (receiver->address->sa_family) | 2076 | switch (receiver->address->sa_family) |
2241 | { | 2077 | { |
2242 | case AF_INET: | 2078 | case AF_INET: |
2243 | base_mtu | 2079 | base_mtu = 1480 /* Ethernet MTU, 1500 - Ethernet header - VLAN tag */ |
2244 | = 1480 /* Ethernet MTU, 1500 - Ethernet header - VLAN tag */ | 2080 | - sizeof (struct GNUNET_TUN_IPv4Header) /* 20 */ |
2245 | - sizeof (struct GNUNET_TUN_IPv4Header) /* 20 */ | 2081 | - sizeof (struct GNUNET_TUN_UdpHeader) /* 8 */; |
2246 | - sizeof (struct GNUNET_TUN_UdpHeader) /* 8 */; | ||
2247 | break; | 2082 | break; |
2248 | case AF_INET6: | 2083 | case AF_INET6: |
2249 | base_mtu | 2084 | base_mtu = 1280 /* Minimum MTU required by IPv6 */ |
2250 | = 1280 /* Minimum MTU required by IPv6 */ | 2085 | - sizeof (struct GNUNET_TUN_IPv6Header) /* 40 */ |
2251 | - sizeof (struct GNUNET_TUN_IPv6Header) /* 40 */ | 2086 | - sizeof (struct GNUNET_TUN_UdpHeader) /* 8 */; |
2252 | - sizeof (struct GNUNET_TUN_UdpHeader) /* 8 */; | ||
2253 | break; | 2087 | break; |
2254 | default: | 2088 | default: |
2255 | GNUNET_assert (0); | 2089 | GNUNET_assert (0); |
@@ -2258,35 +2092,31 @@ setup_receiver_mq (struct ReceiverAddress *receiver) | |||
2258 | if (0 == receiver->acks_available) | 2092 | if (0 == receiver->acks_available) |
2259 | { | 2093 | { |
2260 | /* MTU based on full KX messages */ | 2094 | /* MTU based on full KX messages */ |
2261 | receiver->mtu | 2095 | receiver->mtu = base_mtu - sizeof (struct InitialKX) /* 48 */ |
2262 | = base_mtu | 2096 | - sizeof (struct UDPConfirmation); /* 104 */ |
2263 | - sizeof (struct InitialKX) /* 48 */ | ||
2264 | - sizeof (struct UDPConfirmation); /* 104 */ | ||
2265 | } | 2097 | } |
2266 | else | 2098 | else |
2267 | { | 2099 | { |
2268 | /* MTU based on BOXed messages */ | 2100 | /* MTU based on BOXed messages */ |
2269 | receiver->mtu | 2101 | receiver->mtu = base_mtu - sizeof (struct UDPBox); |
2270 | = base_mtu - sizeof (struct UDPBox); | ||
2271 | } | 2102 | } |
2272 | /* => Effective MTU for CORE will range from 1080 (IPv6 + KX) to | 2103 | /* => Effective MTU for CORE will range from 1080 (IPv6 + KX) to |
2273 | 1404 (IPv4 + Box) bytes, depending on circumstances... */ | 2104 | 1404 (IPv4 + Box) bytes, depending on circumstances... */ |
2274 | receiver->mq | 2105 | receiver->mq = GNUNET_MQ_queue_for_callbacks (&mq_send, |
2275 | = GNUNET_MQ_queue_for_callbacks (&mq_send, | 2106 | &mq_destroy, |
2276 | &mq_destroy, | 2107 | &mq_cancel, |
2277 | &mq_cancel, | 2108 | receiver, |
2278 | receiver, | 2109 | NULL, |
2279 | NULL, | 2110 | &mq_error, |
2280 | &mq_error, | 2111 | receiver); |
2281 | receiver); | 2112 | receiver->qh = |
2282 | receiver->qh | 2113 | GNUNET_TRANSPORT_communicator_mq_add (ch, |
2283 | = GNUNET_TRANSPORT_communicator_mq_add (ch, | 2114 | &receiver->target, |
2284 | &receiver->target, | 2115 | receiver->foreign_addr, |
2285 | receiver->foreign_addr, | 2116 | receiver->mtu, |
2286 | receiver->mtu, | 2117 | receiver->nt, |
2287 | receiver->nt, | 2118 | GNUNET_TRANSPORT_CS_OUTBOUND, |
2288 | GNUNET_TRANSPORT_CS_OUTBOUND, | 2119 | receiver->mq); |
2289 | receiver->mq); | ||
2290 | } | 2120 | } |
2291 | 2121 | ||
2292 | 2122 | ||
@@ -2307,19 +2137,17 @@ receiver_setup (const struct GNUNET_PeerIdentity *target, | |||
2307 | struct ReceiverAddress *receiver; | 2137 | struct ReceiverAddress *receiver; |
2308 | 2138 | ||
2309 | receiver = GNUNET_new (struct ReceiverAddress); | 2139 | receiver = GNUNET_new (struct ReceiverAddress); |
2310 | receiver->address = GNUNET_memdup (address, | 2140 | receiver->address = GNUNET_memdup (address, address_len); |
2311 | address_len); | ||
2312 | receiver->address_len = address_len; | 2141 | receiver->address_len = address_len; |
2313 | receiver->target = *target; | 2142 | receiver->target = *target; |
2314 | receiver->nt = GNUNET_NT_scanner_get_type (is, | 2143 | receiver->nt = GNUNET_NT_scanner_get_type (is, address, address_len); |
2315 | address, | 2144 | (void) GNUNET_CONTAINER_multipeermap_put ( |
2316 | address_len); | 2145 | receivers, |
2317 | (void) GNUNET_CONTAINER_multipeermap_put (receivers, | 2146 | &receiver->target, |
2318 | &receiver->target, | 2147 | receiver, |
2319 | receiver, | 2148 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); |
2320 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); | 2149 | receiver->timeout = |
2321 | receiver->timeout | 2150 | GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); |
2322 | = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); | ||
2323 | receiver->hn = GNUNET_CONTAINER_heap_insert (receivers_heap, | 2151 | receiver->hn = GNUNET_CONTAINER_heap_insert (receivers_heap, |
2324 | receiver, | 2152 | receiver, |
2325 | receiver->timeout.abs_value_us); | 2153 | receiver->timeout.abs_value_us); |
@@ -2327,13 +2155,12 @@ receiver_setup (const struct GNUNET_PeerIdentity *target, | |||
2327 | "# receivers active", | 2155 | "# receivers active", |
2328 | GNUNET_CONTAINER_multipeermap_size (receivers), | 2156 | GNUNET_CONTAINER_multipeermap_size (receivers), |
2329 | GNUNET_NO); | 2157 | GNUNET_NO); |
2330 | receiver->foreign_addr = sockaddr_to_udpaddr_string (receiver->address, | 2158 | receiver->foreign_addr = |
2331 | receiver->address_len); | 2159 | sockaddr_to_udpaddr_string (receiver->address, receiver->address_len); |
2332 | setup_receiver_mq (receiver); | 2160 | setup_receiver_mq (receiver); |
2333 | 2161 | ||
2334 | if (NULL == timeout_task) | 2162 | if (NULL == timeout_task) |
2335 | timeout_task = GNUNET_SCHEDULER_add_now (&check_timeouts, | 2163 | timeout_task = GNUNET_SCHEDULER_add_now (&check_timeouts, NULL); |
2336 | NULL); | ||
2337 | return receiver; | 2164 | return receiver; |
2338 | } | 2165 | } |
2339 | 2166 | ||
@@ -2353,12 +2180,11 @@ receiver_setup (const struct GNUNET_PeerIdentity *target, | |||
2353 | * @param peer identity of the other peer | 2180 | * @param peer identity of the other peer |
2354 | * @param address where to send the message, human-readable | 2181 | * @param address where to send the message, human-readable |
2355 | * communicator-specific format, 0-terminated, UTF-8 | 2182 | * communicator-specific format, 0-terminated, UTF-8 |
2356 | * @return #GNUNET_OK on success, #GNUNET_SYSERR if the provided address is invalid | 2183 | * @return #GNUNET_OK on success, #GNUNET_SYSERR if the provided address is |
2184 | * invalid | ||
2357 | */ | 2185 | */ |
2358 | static int | 2186 | static int |
2359 | mq_init (void *cls, | 2187 | mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char *address) |
2360 | const struct GNUNET_PeerIdentity *peer, | ||
2361 | const char *address) | ||
2362 | { | 2188 | { |
2363 | struct ReceiverAddress *receiver; | 2189 | struct ReceiverAddress *receiver; |
2364 | const char *path; | 2190 | const char *path; |
@@ -2373,11 +2199,8 @@ mq_init (void *cls, | |||
2373 | return GNUNET_SYSERR; | 2199 | return GNUNET_SYSERR; |
2374 | } | 2200 | } |
2375 | path = &address[strlen (COMMUNICATOR_ADDRESS_PREFIX "-")]; | 2201 | path = &address[strlen (COMMUNICATOR_ADDRESS_PREFIX "-")]; |
2376 | in = udp_address_to_sockaddr (path, | 2202 | in = udp_address_to_sockaddr (path, &in_len); |
2377 | &in_len); | 2203 | receiver = receiver_setup (peer, in, in_len); |
2378 | receiver = receiver_setup (peer, | ||
2379 | in, | ||
2380 | in_len); | ||
2381 | (void) receiver; | 2204 | (void) receiver; |
2382 | return GNUNET_OK; | 2205 | return GNUNET_OK; |
2383 | } | 2206 | } |
@@ -2437,8 +2260,8 @@ do_shutdown (void *cls) | |||
2437 | { | 2260 | { |
2438 | if (NULL != nat) | 2261 | if (NULL != nat) |
2439 | { | 2262 | { |
2440 | GNUNET_NAT_unregister (nat); | 2263 | GNUNET_NAT_unregister (nat); |
2441 | nat = NULL; | 2264 | nat = NULL; |
2442 | } | 2265 | } |
2443 | while (NULL != bi_head) | 2266 | while (NULL != bi_head) |
2444 | bi_destroy (bi_head); | 2267 | bi_destroy (bi_head); |
@@ -2454,17 +2277,14 @@ do_shutdown (void *cls) | |||
2454 | } | 2277 | } |
2455 | if (NULL != udp_sock) | 2278 | if (NULL != udp_sock) |
2456 | { | 2279 | { |
2457 | GNUNET_break (GNUNET_OK == | 2280 | GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (udp_sock)); |
2458 | GNUNET_NETWORK_socket_close (udp_sock)); | ||
2459 | udp_sock = NULL; | 2281 | udp_sock = NULL; |
2460 | } | 2282 | } |
2461 | GNUNET_CONTAINER_multipeermap_iterate (receivers, | 2283 | GNUNET_CONTAINER_multipeermap_iterate (receivers, |
2462 | &get_receiver_delete_it, | 2284 | &get_receiver_delete_it, |
2463 | NULL); | 2285 | NULL); |
2464 | GNUNET_CONTAINER_multipeermap_destroy (receivers); | 2286 | GNUNET_CONTAINER_multipeermap_destroy (receivers); |
2465 | GNUNET_CONTAINER_multipeermap_iterate (senders, | 2287 | GNUNET_CONTAINER_multipeermap_iterate (senders, &get_sender_delete_it, NULL); |
2466 | &get_sender_delete_it, | ||
2467 | NULL); | ||
2468 | GNUNET_CONTAINER_multipeermap_destroy (senders); | 2288 | GNUNET_CONTAINER_multipeermap_destroy (senders); |
2469 | GNUNET_CONTAINER_multishortmap_destroy (key_cache); | 2289 | GNUNET_CONTAINER_multishortmap_destroy (key_cache); |
2470 | GNUNET_CONTAINER_heap_destroy (senders_heap); | 2290 | GNUNET_CONTAINER_heap_destroy (senders_heap); |
@@ -2481,8 +2301,7 @@ do_shutdown (void *cls) | |||
2481 | } | 2301 | } |
2482 | if (NULL != stats) | 2302 | if (NULL != stats) |
2483 | { | 2303 | { |
2484 | GNUNET_STATISTICS_destroy (stats, | 2304 | GNUNET_STATISTICS_destroy (stats, GNUNET_NO); |
2485 | GNUNET_NO); | ||
2486 | stats = NULL; | 2305 | stats = NULL; |
2487 | } | 2306 | } |
2488 | if (NULL != my_private_key) | 2307 | if (NULL != my_private_key) |
@@ -2515,8 +2334,8 @@ enc_notify_cb (void *cls, | |||
2515 | const struct UDPAck *ack; | 2334 | const struct UDPAck *ack; |
2516 | 2335 | ||
2517 | (void) cls; | 2336 | (void) cls; |
2518 | if ( (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK) || | 2337 | if ((ntohs (msg->type) != GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK) || |
2519 | (ntohs (msg->size) != sizeof (struct UDPAck)) ) | 2338 | (ntohs (msg->size) != sizeof (struct UDPAck))) |
2520 | { | 2339 | { |
2521 | GNUNET_break_op (0); | 2340 | GNUNET_break_op (0); |
2522 | return; | 2341 | return; |
@@ -2560,15 +2379,13 @@ nat_address_cb (void *cls, | |||
2560 | GNUNET_asprintf (&my_addr, | 2379 | GNUNET_asprintf (&my_addr, |
2561 | "%s-%s", | 2380 | "%s-%s", |
2562 | COMMUNICATOR_ADDRESS_PREFIX, | 2381 | COMMUNICATOR_ADDRESS_PREFIX, |
2563 | GNUNET_a2s (addr, | 2382 | GNUNET_a2s (addr, addrlen)); |
2564 | addrlen)); | 2383 | nt = GNUNET_NT_scanner_get_type (is, addr, addrlen); |
2565 | nt = GNUNET_NT_scanner_get_type (is, | 2384 | ai = |
2566 | addr, | 2385 | GNUNET_TRANSPORT_communicator_address_add (ch, |
2567 | addrlen); | 2386 | my_addr, |
2568 | ai = GNUNET_TRANSPORT_communicator_address_add (ch, | 2387 | nt, |
2569 | my_addr, | 2388 | GNUNET_TIME_UNIT_FOREVER_REL); |
2570 | nt, | ||
2571 | GNUNET_TIME_UNIT_FOREVER_REL); | ||
2572 | GNUNET_free (my_addr); | 2389 | GNUNET_free (my_addr); |
2573 | *app_ctx = ai; | 2390 | *app_ctx = ai; |
2574 | } | 2391 | } |
@@ -2593,67 +2410,57 @@ ifc_broadcast (void *cls) | |||
2593 | struct GNUNET_TIME_Relative delay; | 2410 | struct GNUNET_TIME_Relative delay; |
2594 | 2411 | ||
2595 | delay = BROADCAST_FREQUENCY; | 2412 | delay = BROADCAST_FREQUENCY; |
2596 | delay.rel_value_us = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, | 2413 | delay.rel_value_us = |
2597 | delay.rel_value_us); | 2414 | GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, delay.rel_value_us); |
2598 | bi->broadcast_task | 2415 | bi->broadcast_task = |
2599 | = GNUNET_SCHEDULER_add_delayed (INTERFACE_SCAN_FREQUENCY, | 2416 | GNUNET_SCHEDULER_add_delayed (INTERFACE_SCAN_FREQUENCY, &ifc_broadcast, bi); |
2600 | &ifc_broadcast, | 2417 | |
2601 | bi); | 2418 | switch (bi->sa->sa_family) |
2602 | 2419 | { | |
2603 | switch (bi->sa->sa_family) { | 2420 | case AF_INET: { |
2604 | case AF_INET: | 2421 | static int yes = 1; |
2605 | { | 2422 | static int no = 0; |
2606 | static int yes = 1; | 2423 | ssize_t sent; |
2607 | static int no = 0; | 2424 | |
2608 | ssize_t sent; | 2425 | if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock, |
2609 | 2426 | SOL_SOCKET, | |
2610 | if (GNUNET_OK != | 2427 | SO_BROADCAST, |
2611 | GNUNET_NETWORK_socket_setsockopt (udp_sock, | 2428 | &yes, |
2612 | SOL_SOCKET, | 2429 | sizeof (int))) |
2613 | SO_BROADCAST, | 2430 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt"); |
2614 | &yes, | 2431 | sent = GNUNET_NETWORK_socket_sendto (udp_sock, |
2615 | sizeof (int))) | 2432 | &bi->bcm, |
2616 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | 2433 | sizeof (bi->bcm), |
2617 | "setsockopt"); | 2434 | bi->ba, |
2618 | sent = GNUNET_NETWORK_socket_sendto (udp_sock, | 2435 | bi->salen); |
2619 | &bi->bcm, | 2436 | if (-1 == sent) |
2620 | sizeof (bi->bcm), | 2437 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto"); |
2621 | bi->ba, | 2438 | if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock, |
2622 | bi->salen); | 2439 | SOL_SOCKET, |
2623 | if (-1 == sent) | 2440 | SO_BROADCAST, |
2624 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | 2441 | &no, |
2625 | "sendto"); | 2442 | sizeof (int))) |
2626 | if (GNUNET_OK != | 2443 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt"); |
2627 | GNUNET_NETWORK_socket_setsockopt (udp_sock, | 2444 | break; |
2628 | SOL_SOCKET, | 2445 | } |
2629 | SO_BROADCAST, | 2446 | case AF_INET6: { |
2630 | &no, | 2447 | ssize_t sent; |
2631 | sizeof (int))) | 2448 | struct sockaddr_in6 dst; |
2632 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | 2449 | |
2633 | "setsockopt"); | 2450 | dst.sin6_family = AF_INET6; |
2634 | break; | 2451 | dst.sin6_port = htons (my_port); |
2635 | } | 2452 | dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr; |
2636 | case AF_INET6: | 2453 | dst.sin6_scope_id = ((struct sockaddr_in6 *) bi->ba)->sin6_scope_id; |
2637 | { | 2454 | |
2638 | ssize_t sent; | 2455 | sent = GNUNET_NETWORK_socket_sendto (udp_sock, |
2639 | struct sockaddr_in6 dst; | 2456 | &bi->bcm, |
2640 | 2457 | sizeof (bi->bcm), | |
2641 | dst.sin6_family = AF_INET6; | 2458 | (const struct sockaddr *) &dst, |
2642 | dst.sin6_port = htons (my_port); | 2459 | sizeof (dst)); |
2643 | dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr; | 2460 | if (-1 == sent) |
2644 | dst.sin6_scope_id = ((struct sockaddr_in6*) bi->ba)->sin6_scope_id; | 2461 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto"); |
2645 | 2462 | break; | |
2646 | sent = GNUNET_NETWORK_socket_sendto (udp_sock, | 2463 | } |
2647 | &bi->bcm, | ||
2648 | sizeof (bi->bcm), | ||
2649 | (const struct sockaddr *) | ||
2650 | &dst, | ||
2651 | sizeof (dst)); | ||
2652 | if (-1 == sent) | ||
2653 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | ||
2654 | "sendto"); | ||
2655 | break; | ||
2656 | } | ||
2657 | default: | 2464 | default: |
2658 | GNUNET_break (0); | 2465 | GNUNET_break (0); |
2659 | break; | 2466 | break; |
@@ -2669,7 +2476,8 @@ ifc_broadcast (void *cls) | |||
2669 | * @param name name of the interface (can be NULL for unknown) | 2476 | * @param name name of the interface (can be NULL for unknown) |
2670 | * @param isDefault is this presumably the default interface | 2477 | * @param isDefault is this presumably the default interface |
2671 | * @param addr address of this interface (can be NULL for unknown or unassigned) | 2478 | * @param addr address of this interface (can be NULL for unknown or unassigned) |
2672 | * @param broadcast_addr the broadcast address (can be NULL for unknown or unassigned) | 2479 | * @param broadcast_addr the broadcast address (can be NULL for unknown or |
2480 | * unassigned) | ||
2673 | * @param netmask the network mask (can be NULL for unknown or unassigned) | 2481 | * @param netmask the network mask (can be NULL for unknown or unassigned) |
2674 | * @param addrlen length of the address | 2482 | * @param addrlen length of the address |
2675 | * @return #GNUNET_OK to continue iteration, #GNUNET_SYSERR to abort | 2483 | * @return #GNUNET_OK to continue iteration, #GNUNET_SYSERR to abort |
@@ -2680,7 +2488,8 @@ iface_proc (void *cls, | |||
2680 | int isDefault, | 2488 | int isDefault, |
2681 | const struct sockaddr *addr, | 2489 | const struct sockaddr *addr, |
2682 | const struct sockaddr *broadcast_addr, | 2490 | const struct sockaddr *broadcast_addr, |
2683 | const struct sockaddr *netmask, socklen_t addrlen) | 2491 | const struct sockaddr *netmask, |
2492 | socklen_t addrlen) | ||
2684 | { | 2493 | { |
2685 | struct BroadcastInterface *bi; | 2494 | struct BroadcastInterface *bi; |
2686 | enum GNUNET_NetworkType network; | 2495 | enum GNUNET_NetworkType network; |
@@ -2688,9 +2497,7 @@ iface_proc (void *cls, | |||
2688 | 2497 | ||
2689 | (void) cls; | 2498 | (void) cls; |
2690 | (void) netmask; | 2499 | (void) netmask; |
2691 | network = GNUNET_NT_scanner_get_type (is, | 2500 | network = GNUNET_NT_scanner_get_type (is, addr, addrlen); |
2692 | addr, | ||
2693 | addrlen); | ||
2694 | if (GNUNET_NT_LOOPBACK == network) | 2501 | if (GNUNET_NT_LOOPBACK == network) |
2695 | { | 2502 | { |
2696 | /* Broadcasting on loopback does not make sense */ | 2503 | /* Broadcasting on loopback does not make sense */ |
@@ -2700,58 +2507,42 @@ iface_proc (void *cls, | |||
2700 | return GNUNET_YES; /* need to know our address! */ | 2507 | return GNUNET_YES; /* need to know our address! */ |
2701 | for (bi = bi_head; NULL != bi; bi = bi->next) | 2508 | for (bi = bi_head; NULL != bi; bi = bi->next) |
2702 | { | 2509 | { |
2703 | if ( (bi->salen == addrlen) && | 2510 | if ((bi->salen == addrlen) && (0 == memcmp (addr, bi->sa, addrlen))) |
2704 | (0 == memcmp (addr, | ||
2705 | bi->sa, | ||
2706 | addrlen)) ) | ||
2707 | { | 2511 | { |
2708 | bi->found = GNUNET_YES; | 2512 | bi->found = GNUNET_YES; |
2709 | return GNUNET_OK; | 2513 | return GNUNET_OK; |
2710 | } | 2514 | } |
2711 | } | 2515 | } |
2712 | 2516 | ||
2713 | if ( (AF_INET6 == addr->sa_family) && | 2517 | if ((AF_INET6 == addr->sa_family) && (NULL == broadcast_addr)) |
2714 | (NULL == broadcast_addr) ) | ||
2715 | return GNUNET_OK; /* broadcast_addr is required for IPv6! */ | 2518 | return GNUNET_OK; /* broadcast_addr is required for IPv6! */ |
2716 | if ( (AF_INET6 == addr->sa_family) && | 2519 | if ((AF_INET6 == addr->sa_family) && (GNUNET_YES != have_v6_socket)) |
2717 | (GNUNET_YES != have_v6_socket) ) | ||
2718 | return GNUNET_OK; /* not using IPv6 */ | 2520 | return GNUNET_OK; /* not using IPv6 */ |
2719 | 2521 | ||
2720 | bi = GNUNET_new (struct BroadcastInterface); | 2522 | bi = GNUNET_new (struct BroadcastInterface); |
2721 | bi->sa = GNUNET_memdup (addr, | 2523 | bi->sa = GNUNET_memdup (addr, addrlen); |
2722 | addrlen); | ||
2723 | if (NULL != broadcast_addr) | 2524 | if (NULL != broadcast_addr) |
2724 | bi->ba = GNUNET_memdup (broadcast_addr, | 2525 | bi->ba = GNUNET_memdup (broadcast_addr, addrlen); |
2725 | addrlen); | ||
2726 | bi->salen = addrlen; | 2526 | bi->salen = addrlen; |
2727 | bi->found = GNUNET_YES; | 2527 | bi->found = GNUNET_YES; |
2728 | bi->bcm.sender = my_identity; | 2528 | bi->bcm.sender = my_identity; |
2729 | ubs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST); | 2529 | ubs.purpose.purpose = htonl (GNUNET_SIGNATURE_COMMUNICATOR_UDP_BROADCAST); |
2730 | ubs.purpose.size = htonl (sizeof (ubs)); | 2530 | ubs.purpose.size = htonl (sizeof (ubs)); |
2731 | ubs.sender = my_identity; | 2531 | ubs.sender = my_identity; |
2732 | GNUNET_CRYPTO_hash (addr, | 2532 | GNUNET_CRYPTO_hash (addr, addrlen, &ubs.h_address); |
2733 | addrlen, | 2533 | GNUNET_assert (GNUNET_OK == GNUNET_CRYPTO_eddsa_sign (my_private_key, |
2734 | &ubs.h_address); | 2534 | &ubs.purpose, |
2735 | GNUNET_assert (GNUNET_OK == | 2535 | &bi->bcm.sender_sig)); |
2736 | GNUNET_CRYPTO_eddsa_sign (my_private_key, | 2536 | bi->broadcast_task = GNUNET_SCHEDULER_add_now (&ifc_broadcast, bi); |
2737 | &ubs.purpose, | 2537 | GNUNET_CONTAINER_DLL_insert (bi_head, bi_tail, bi); |
2738 | &bi->bcm.sender_sig)); | 2538 | if ((AF_INET6 == addr->sa_family) && (NULL != broadcast_addr)) |
2739 | bi->broadcast_task = GNUNET_SCHEDULER_add_now (&ifc_broadcast, | ||
2740 | bi); | ||
2741 | GNUNET_CONTAINER_DLL_insert (bi_head, | ||
2742 | bi_tail, | ||
2743 | bi); | ||
2744 | if ( (AF_INET6 == addr->sa_family) && | ||
2745 | (NULL != broadcast_addr) ) | ||
2746 | { | 2539 | { |
2747 | /* Create IPv6 multicast request */ | 2540 | /* Create IPv6 multicast request */ |
2748 | const struct sockaddr_in6 *s6 | 2541 | const struct sockaddr_in6 *s6 = |
2749 | = (const struct sockaddr_in6 *) broadcast_addr; | 2542 | (const struct sockaddr_in6 *) broadcast_addr; |
2750 | 2543 | ||
2751 | GNUNET_assert (1 == | 2544 | GNUNET_assert ( |
2752 | inet_pton (AF_INET6, | 2545 | 1 == inet_pton (AF_INET6, "FF05::13B", &bi->mcreq.ipv6mr_multiaddr)); |
2753 | "FF05::13B", | ||
2754 | &bi->mcreq.ipv6mr_multiaddr)); | ||
2755 | 2546 | ||
2756 | /* http://tools.ietf.org/html/rfc2553#section-5.2: | 2547 | /* http://tools.ietf.org/html/rfc2553#section-5.2: |
2757 | * | 2548 | * |
@@ -2767,16 +2558,13 @@ iface_proc (void *cls, | |||
2767 | bi->mcreq.ipv6mr_interface = s6->sin6_scope_id; | 2558 | bi->mcreq.ipv6mr_interface = s6->sin6_scope_id; |
2768 | 2559 | ||
2769 | /* Join the multicast group */ | 2560 | /* Join the multicast group */ |
2770 | if (GNUNET_OK != | 2561 | if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock, |
2771 | GNUNET_NETWORK_socket_setsockopt | 2562 | IPPROTO_IPV6, |
2772 | (udp_sock, | 2563 | IPV6_JOIN_GROUP, |
2773 | IPPROTO_IPV6, | 2564 | &bi->mcreq, |
2774 | IPV6_JOIN_GROUP, | 2565 | sizeof (bi->mcreq))) |
2775 | &bi->mcreq, | ||
2776 | sizeof (bi->mcreq))) | ||
2777 | { | 2566 | { |
2778 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, | 2567 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt"); |
2779 | "setsockopt"); | ||
2780 | } | 2568 | } |
2781 | } | 2569 | } |
2782 | return GNUNET_OK; | 2570 | return GNUNET_OK; |
@@ -2794,24 +2582,18 @@ do_broadcast (void *cls) | |||
2794 | struct BroadcastInterface *bin; | 2582 | struct BroadcastInterface *bin; |
2795 | 2583 | ||
2796 | (void) cls; | 2584 | (void) cls; |
2797 | for (struct BroadcastInterface *bi = bi_head; | 2585 | for (struct BroadcastInterface *bi = bi_head; NULL != bi; bi = bi->next) |
2798 | NULL != bi; | ||
2799 | bi = bi->next) | ||
2800 | bi->found = GNUNET_NO; | 2586 | bi->found = GNUNET_NO; |
2801 | GNUNET_OS_network_interfaces_list (&iface_proc, | 2587 | GNUNET_OS_network_interfaces_list (&iface_proc, NULL); |
2802 | NULL); | 2588 | for (struct BroadcastInterface *bi = bi_head; NULL != bi; bi = bin) |
2803 | for (struct BroadcastInterface *bi = bi_head; | ||
2804 | NULL != bi; | ||
2805 | bi = bin) | ||
2806 | { | 2589 | { |
2807 | bin = bi->next; | 2590 | bin = bi->next; |
2808 | if (GNUNET_NO == bi->found) | 2591 | if (GNUNET_NO == bi->found) |
2809 | bi_destroy (bi); | 2592 | bi_destroy (bi); |
2810 | } | 2593 | } |
2811 | broadcast_task | 2594 | broadcast_task = GNUNET_SCHEDULER_add_delayed (INTERFACE_SCAN_FREQUENCY, |
2812 | = GNUNET_SCHEDULER_add_delayed (INTERFACE_SCAN_FREQUENCY, | 2595 | &do_broadcast, |
2813 | &do_broadcast, | 2596 | NULL); |
2814 | NULL); | ||
2815 | } | 2597 | } |
2816 | 2598 | ||
2817 | 2599 | ||
@@ -2842,44 +2624,36 @@ run (void *cls, | |||
2842 | COMMUNICATOR_CONFIG_SECTION, | 2624 | COMMUNICATOR_CONFIG_SECTION, |
2843 | "BINDTO", | 2625 | "BINDTO", |
2844 | &bindto)) | 2626 | &bindto)) |
2845 | { | 2627 | { |
2846 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, | 2628 | GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, |
2847 | COMMUNICATOR_CONFIG_SECTION, | 2629 | COMMUNICATOR_CONFIG_SECTION, |
2848 | "BINDTO"); | 2630 | "BINDTO"); |
2849 | return; | 2631 | return; |
2850 | } | 2632 | } |
2851 | 2633 | ||
2852 | in = udp_address_to_sockaddr (bindto, | 2634 | in = udp_address_to_sockaddr (bindto, &in_len); |
2853 | &in_len); | ||
2854 | if (NULL == in) | 2635 | if (NULL == in) |
2855 | { | 2636 | { |
2856 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 2637 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
2857 | "Failed to setup UDP socket address with path `%s'\n", | 2638 | "Failed to setup UDP socket address with path `%s'\n", |
2858 | bindto); | 2639 | bindto); |
2859 | GNUNET_free (bindto); | 2640 | GNUNET_free (bindto); |
2860 | return; | 2641 | return; |
2861 | } | 2642 | } |
2862 | udp_sock = GNUNET_NETWORK_socket_create (in->sa_family, | 2643 | udp_sock = |
2863 | SOCK_DGRAM, | 2644 | GNUNET_NETWORK_socket_create (in->sa_family, SOCK_DGRAM, IPPROTO_UDP); |
2864 | IPPROTO_UDP); | ||
2865 | if (NULL == udp_sock) | 2645 | if (NULL == udp_sock) |
2866 | { | 2646 | { |
2867 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, | 2647 | GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); |
2868 | "socket"); | ||
2869 | GNUNET_free (in); | 2648 | GNUNET_free (in); |
2870 | GNUNET_free (bindto); | 2649 | GNUNET_free (bindto); |
2871 | return; | 2650 | return; |
2872 | } | 2651 | } |
2873 | if (AF_INET6 == in->sa_family) | 2652 | if (AF_INET6 == in->sa_family) |
2874 | have_v6_socket = GNUNET_YES; | 2653 | have_v6_socket = GNUNET_YES; |
2875 | if (GNUNET_OK != | 2654 | if (GNUNET_OK != GNUNET_NETWORK_socket_bind (udp_sock, in, in_len)) |
2876 | GNUNET_NETWORK_socket_bind (udp_sock, | ||
2877 | in, | ||
2878 | in_len)) | ||
2879 | { | 2655 | { |
2880 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, | 2656 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "bind", bindto); |
2881 | "bind", | ||
2882 | bindto); | ||
2883 | GNUNET_NETWORK_socket_close (udp_sock); | 2657 | GNUNET_NETWORK_socket_close (udp_sock); |
2884 | udp_sock = NULL; | 2658 | udp_sock = NULL; |
2885 | GNUNET_free (in); | 2659 | GNUNET_free (in); |
@@ -2893,9 +2667,7 @@ run (void *cls, | |||
2893 | (struct sockaddr *) &in_sto, | 2667 | (struct sockaddr *) &in_sto, |
2894 | &sto_len)) | 2668 | &sto_len)) |
2895 | { | 2669 | { |
2896 | memcpy (&in_sto, | 2670 | memcpy (&in_sto, in, in_len); |
2897 | in, | ||
2898 | in_len); | ||
2899 | sto_len = in_len; | 2671 | sto_len = in_len; |
2900 | } | 2672 | } |
2901 | GNUNET_free (in); | 2673 | GNUNET_free (in); |
@@ -2904,8 +2676,7 @@ run (void *cls, | |||
2904 | in_len = sto_len; | 2676 | in_len = sto_len; |
2905 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 2677 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
2906 | "Bound to `%s'\n", | 2678 | "Bound to `%s'\n", |
2907 | GNUNET_a2s ((const struct sockaddr *) &in_sto, | 2679 | GNUNET_a2s ((const struct sockaddr *) &in_sto, sto_len)); |
2908 | sto_len)); | ||
2909 | switch (in->sa_family) | 2680 | switch (in->sa_family) |
2910 | { | 2681 | { |
2911 | case AF_INET: | 2682 | case AF_INET: |
@@ -2918,29 +2689,26 @@ run (void *cls, | |||
2918 | GNUNET_break (0); | 2689 | GNUNET_break (0); |
2919 | my_port = 0; | 2690 | my_port = 0; |
2920 | } | 2691 | } |
2921 | stats = GNUNET_STATISTICS_create ("C-UDP", | 2692 | stats = GNUNET_STATISTICS_create ("C-UDP", cfg); |
2922 | cfg); | 2693 | senders = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES); |
2923 | senders = GNUNET_CONTAINER_multipeermap_create (32, | 2694 | receivers = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES); |
2924 | GNUNET_YES); | ||
2925 | receivers = GNUNET_CONTAINER_multipeermap_create (32, | ||
2926 | GNUNET_YES); | ||
2927 | senders_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); | 2695 | senders_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); |
2928 | receivers_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); | 2696 | receivers_heap = |
2929 | key_cache = GNUNET_CONTAINER_multishortmap_create (1024, | 2697 | GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); |
2930 | GNUNET_YES); | 2698 | key_cache = GNUNET_CONTAINER_multishortmap_create (1024, GNUNET_YES); |
2931 | GNUNET_SCHEDULER_add_shutdown (&do_shutdown, | 2699 | GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); |
2932 | NULL); | ||
2933 | is = GNUNET_NT_scanner_init (); | 2700 | is = GNUNET_NT_scanner_init (); |
2934 | my_private_key = GNUNET_CRYPTO_eddsa_key_create_from_configuration (cfg); | 2701 | my_private_key = GNUNET_CRYPTO_eddsa_key_create_from_configuration (cfg); |
2935 | if (NULL == my_private_key) | 2702 | if (NULL == my_private_key) |
2936 | { | 2703 | { |
2937 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 2704 | GNUNET_log ( |
2938 | _("Transport service is lacking key configuration settings. Exiting.\n")); | 2705 | GNUNET_ERROR_TYPE_ERROR, |
2706 | _ ( | ||
2707 | "Transport service is lacking key configuration settings. Exiting.\n")); | ||
2939 | GNUNET_SCHEDULER_shutdown (); | 2708 | GNUNET_SCHEDULER_shutdown (); |
2940 | return; | 2709 | return; |
2941 | } | 2710 | } |
2942 | GNUNET_CRYPTO_eddsa_key_get_public (my_private_key, | 2711 | GNUNET_CRYPTO_eddsa_key_get_public (my_private_key, &my_identity.public_key); |
2943 | &my_identity.public_key); | ||
2944 | /* start reading */ | 2712 | /* start reading */ |
2945 | read_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, | 2713 | read_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, |
2946 | udp_sock, | 2714 | udp_sock, |
@@ -2973,8 +2741,7 @@ run (void *cls, | |||
2973 | COMMUNICATOR_CONFIG_SECTION, | 2741 | COMMUNICATOR_CONFIG_SECTION, |
2974 | "DISABLE_BROADCAST")) | 2742 | "DISABLE_BROADCAST")) |
2975 | { | 2743 | { |
2976 | broadcast_task = GNUNET_SCHEDULER_add_now (&do_broadcast, | 2744 | broadcast_task = GNUNET_SCHEDULER_add_now (&do_broadcast, NULL); |
2977 | NULL); | ||
2978 | } | 2745 | } |
2979 | nat = GNUNET_NAT_register (cfg, | 2746 | nat = GNUNET_NAT_register (cfg, |
2980 | COMMUNICATOR_CONFIG_SECTION, | 2747 | COMMUNICATOR_CONFIG_SECTION, |
@@ -2996,28 +2763,25 @@ run (void *cls, | |||
2996 | * @return 0 ok, 1 on error | 2763 | * @return 0 ok, 1 on error |
2997 | */ | 2764 | */ |
2998 | int | 2765 | int |
2999 | main (int argc, | 2766 | main (int argc, char *const *argv) |
3000 | char *const *argv) | ||
3001 | { | 2767 | { |
3002 | static const struct GNUNET_GETOPT_CommandLineOption options[] = { | 2768 | static const struct GNUNET_GETOPT_CommandLineOption options[] = { |
3003 | GNUNET_GETOPT_OPTION_END | 2769 | GNUNET_GETOPT_OPTION_END}; |
3004 | }; | ||
3005 | int ret; | 2770 | int ret; |
3006 | 2771 | ||
3007 | if (GNUNET_OK != | 2772 | if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) |
3008 | GNUNET_STRINGS_get_utf8_args (argc, argv, | ||
3009 | &argc, &argv)) | ||
3010 | return 2; | 2773 | return 2; |
3011 | 2774 | ||
3012 | ret = | 2775 | ret = (GNUNET_OK == GNUNET_PROGRAM_run (argc, |
3013 | (GNUNET_OK == | 2776 | argv, |
3014 | GNUNET_PROGRAM_run (argc, argv, | 2777 | "gnunet-communicator-udp", |
3015 | "gnunet-communicator-udp", | 2778 | _ ("GNUnet UDP communicator"), |
3016 | _("GNUnet UDP communicator"), | 2779 | options, |
3017 | options, | 2780 | &run, |
3018 | &run, | 2781 | NULL)) |
3019 | NULL)) ? 0 : 1; | 2782 | ? 0 |
3020 | GNUNET_free ((void*) argv); | 2783 | : 1; |
2784 | GNUNET_free ((void *) argv); | ||
3021 | return ret; | 2785 | return ret; |
3022 | } | 2786 | } |
3023 | 2787 | ||