aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-communicator-udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-communicator-udp.c')
-rw-r--r--src/transport/gnunet-communicator-udp.c275
1 files changed, 209 insertions, 66 deletions
diff --git a/src/transport/gnunet-communicator-udp.c b/src/transport/gnunet-communicator-udp.c
index 849adf4ab..4a91a70a5 100644
--- a/src/transport/gnunet-communicator-udp.c
+++ b/src/transport/gnunet-communicator-udp.c
@@ -137,10 +137,10 @@
137#define MAX_SECRETS 128000 137#define MAX_SECRETS 128000
138 138
139/** 139/**
140 * How often do we rekey based on number of bytes transmitted? 140 * Default value for how often we do rekey based on number of bytes transmitted?
141 * (additionally randomized). 141 * (additionally randomized).
142 */ 142 */
143#define REKEY_MAX_BYTES (1024LLU * 1024 * 1024 * 4LLU) 143#define DEFAULT_REKEY_MAX_BYTES (1024LLU * 1024 * 1024 * 4LLU)
144 144
145/** 145/**
146 * Address prefix used by the communicator. 146 * Address prefix used by the communicator.
@@ -510,6 +510,11 @@ struct SharedSecret
510struct SenderAddress 510struct SenderAddress
511{ 511{
512 /** 512 /**
513 * Shared secret we use with @e target for rekeying.
514 */
515 struct SharedSecret *ss_rekey;
516
517 /**
513 * Flag indicating sender is initiated rekeying for this receiver. 518 * Flag indicating sender is initiated rekeying for this receiver.
514 */ 519 */
515 int rekeying; 520 int rekeying;
@@ -760,6 +765,10 @@ struct BroadcastInterface
760static struct GNUNET_TIME_Relative rekey_interval; 765static struct GNUNET_TIME_Relative rekey_interval;
761 766
762/** 767/**
768 * How often we do rekey based on number of bytes transmitted
769 */
770static unsigned long long rekey_max_bytes;
771/**
763 * Shared secret we finished the last kce working queue for. 772 * Shared secret we finished the last kce working queue for.
764 */ 773 */
765struct SharedSecret *ss_finished; 774struct SharedSecret *ss_finished;
@@ -1056,14 +1065,14 @@ secret_destroy (struct SharedSecret *ss, int withoutKce)
1056 struct ReceiverAddress *receiver; 1065 struct ReceiverAddress *receiver;
1057 struct KeyCacheEntry *kce; 1066 struct KeyCacheEntry *kce;
1058 1067
1059 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1060 "secret destroy %u %u\n",
1061 withoutKce,
1062 ss->sequence_allowed);
1063
1064 if (withoutKce && (ss->sequence_allowed > 0)) 1068 if (withoutKce && (ss->sequence_allowed > 0))
1065 return GNUNET_NO; 1069 return GNUNET_NO;
1066 1070
1071 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1072 "secret %s destroy %u %u\n",
1073 GNUNET_h2s (&ss->master),
1074 withoutKce,
1075 ss->sequence_allowed);
1067 if (NULL != (sender = ss->sender)) 1076 if (NULL != (sender = ss->sender))
1068 { 1077 {
1069 GNUNET_CONTAINER_DLL_remove (sender->ss_head, sender->ss_tail, ss); 1078 GNUNET_CONTAINER_DLL_remove (sender->ss_head, sender->ss_tail, ss);
@@ -1075,6 +1084,9 @@ secret_destroy (struct SharedSecret *ss, int withoutKce)
1075 receiver->num_secrets--; 1084 receiver->num_secrets--;
1076 // Uncomment this for alternativ 1 of backchannel functionality 1085 // Uncomment this for alternativ 1 of backchannel functionality
1077 receiver->acks_available -= (ss->sequence_allowed - ss->sequence_used); 1086 receiver->acks_available -= (ss->sequence_allowed - ss->sequence_used);
1087 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1088 "%u receiver->acks_available 3\n",
1089 receiver->acks_available);
1078 // Until here for alternativ 1 1090 // Until here for alternativ 1
1079 } 1091 }
1080 while (NULL != (kce = ss->kce_head)) 1092 while (NULL != (kce = ss->kce_head))
@@ -1194,15 +1206,15 @@ check_timeouts (void *cls)
1194 rt = GNUNET_TIME_UNIT_FOREVER_REL; 1206 rt = GNUNET_TIME_UNIT_FOREVER_REL;
1195 while (NULL != (receiver = GNUNET_CONTAINER_heap_peek (receivers_heap))) 1207 while (NULL != (receiver = GNUNET_CONTAINER_heap_peek (receivers_heap)))
1196 { 1208 {
1197 if (GNUNET_YES != receiver->receiver_destroy_called) 1209 /* if (GNUNET_YES != receiver->receiver_destroy_called) */
1198 { 1210 /* { */
1199 rt = GNUNET_TIME_absolute_get_remaining (receiver->timeout); 1211 rt = GNUNET_TIME_absolute_get_remaining (receiver->timeout);
1200 if (0 != rt.rel_value_us) 1212 if (0 != rt.rel_value_us)
1201 break; 1213 break;
1202 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1214 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1203 "Receiver timed out\n"); 1215 "Receiver timed out\n");
1204 receiver_destroy (receiver); 1216 receiver_destroy (receiver);
1205 } 1217 // }
1206 } 1218 }
1207 st = GNUNET_TIME_UNIT_FOREVER_REL; 1219 st = GNUNET_TIME_UNIT_FOREVER_REL;
1208 while (NULL != (sender = GNUNET_CONTAINER_heap_peek (senders_heap))) 1220 while (NULL != (sender = GNUNET_CONTAINER_heap_peek (senders_heap)))
@@ -1433,7 +1445,8 @@ destroy_all_secrets (struct SharedSecret *ss, int withoutKce)
1433 int at_least_one_destroyed = GNUNET_NO; 1445 int at_least_one_destroyed = GNUNET_NO;
1434 1446
1435 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1447 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1436 "Starting destroy all.\n"); 1448 "Starting destroy all withoutKce: %u.\n",
1449 withoutKce);
1437 1450
1438 if (NULL != (sender = ss->sender)) 1451 if (NULL != (sender = ss->sender))
1439 { 1452 {
@@ -1462,6 +1475,8 @@ destroy_all_secrets (struct SharedSecret *ss, int withoutKce)
1462 1475
1463 if ((ss != ss_start) && ! at_least_one_destroyed) 1476 if ((ss != ss_start) && ! at_least_one_destroyed)
1464 { 1477 {
1478 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1479 "Really destroying all.\n");
1465 destroy_all_secrets (ss_start, GNUNET_NO); 1480 destroy_all_secrets (ss_start, GNUNET_NO);
1466 } 1481 }
1467 1482
@@ -1470,7 +1485,7 @@ destroy_all_secrets (struct SharedSecret *ss, int withoutKce)
1470} 1485}
1471 1486
1472static void 1487static void
1473add_acks (struct SharedSecret *ss, int acks_to_add, int remove_from_receiver) 1488add_acks (struct SharedSecret *ss, int acks_to_add)
1474{ 1489{
1475 1490
1476 struct ReceiverAddress *receiver = ss->receiver; 1491 struct ReceiverAddress *receiver = ss->receiver;
@@ -1489,6 +1504,9 @@ add_acks (struct SharedSecret *ss, int acks_to_add, int remove_from_receiver)
1489 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1504 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1490 "Tell transport we have %u more acks!\n", 1505 "Tell transport we have %u more acks!\n",
1491 acks_to_add); 1506 acks_to_add);
1507 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1508 "%u kce for rekeying.\n",
1509 receiver->number_rekeying_kce);
1492 GNUNET_TRANSPORT_communicator_mq_update (ch, 1510 GNUNET_TRANSPORT_communicator_mq_update (ch,
1493 receiver->d_qh, 1511 receiver->d_qh,
1494 acks_to_add, 1512 acks_to_add,
@@ -1496,33 +1514,65 @@ add_acks (struct SharedSecret *ss, int acks_to_add, int remove_from_receiver)
1496 // Until here for alternativ 1 1514 // Until here for alternativ 1
1497 1515
1498 /* move ss to head to avoid discarding it anytime soon! */ 1516 /* move ss to head to avoid discarding it anytime soon! */
1499 if (remove_from_receiver) 1517
1500 GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss); 1518 GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
1501 GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss); 1519 GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss);
1502 destroy_all_secrets (ss, GNUNET_YES); 1520 destroy_all_secrets (ss, GNUNET_YES);
1521}
1503 1522
1523static uint32_t
1524reset_rekey_kces (struct ReceiverAddress *receiver,
1525 uint32_t acks_to_add)
1526{
1527 int needed_for_rekeying;
1504 1528
1505 // Uncomment this for alternativ 2 of backchannel functionality 1529 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1506 /*if (receiver->acks_available != ack->acks_available) 1530 "%u kce for rekeying and %u acks_to_add\n",
1531 receiver->number_rekeying_kce,
1532 acks_to_add);
1533
1534 needed_for_rekeying = (3 - receiver->number_rekeying_kce);
1535 if (acks_to_add <= needed_for_rekeying)
1507 { 1536 {
1508 receiver->acks_available = ack->acks_available; 1537 receiver->number_rekeying_kce += acks_to_add;
1509 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1538 acks_to_add = 0;
1510 "Tell transport we have different number of acks!\n"); 1539 }
1511 GNUNET_TRANSPORT_communicator_mq_update (ch, 1540 else
1512 receiver->d_qh, 1541 {
1513 receiver->acks_available, 1542 acks_to_add -= (3 - receiver->number_rekeying_kce);
1514 1); 1543 receiver->number_rekeying_kce = 3;
1515 }*/ 1544 }
1516 // Until here for alternativ 2 1545
1546 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1547 "%u kce for rekeying and %u acks_to_add\n",
1548 receiver->number_rekeying_kce,
1549 acks_to_add);
1550 return acks_to_add;
1517} 1551}
1518 1552
1519static void 1553static void
1520add_acks_rekey (struct ReceiverAddress *receiver) 1554add_acks_rekey (struct ReceiverAddress *receiver)
1521{ 1555{
1522 add_acks (receiver->ss_rekey, receiver->ss_rekey->sequence_allowed - 3, 1556 uint32_t acks_to_add = receiver->ss_rekey->sequence_allowed;
1523 GNUNET_NO); 1557
1558 if (receiver->number_rekeying_kce < 3)
1559 acks_to_add = reset_rekey_kces (receiver, acks_to_add);
1524 receiver->acks_available = receiver->ss_rekey->sequence_allowed; 1560 receiver->acks_available = receiver->ss_rekey->sequence_allowed;
1561 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1562 "%u receiver->acks_available 4\n",
1563 receiver->acks_available);
1564 /* add_acks (receiver->ss_rekey, acks_to_add - 3); */
1565 if (0 != acks_to_add)
1566 {
1567 add_acks (receiver->ss_rekey, acks_to_add);
1568 }
1525 receiver->ss_rekey = NULL; 1569 receiver->ss_rekey = NULL;
1570 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1571 "# rekeying successful\n");
1572 GNUNET_STATISTICS_update (stats,
1573 "# rekeying successful",
1574 1,
1575 GNUNET_NO);
1526} 1576}
1527 1577
1528/** 1578/**
@@ -1540,15 +1590,17 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
1540{ 1590{
1541 const struct UDPAck *ack = cls; 1591 const struct UDPAck *ack = cls;
1542 struct ReceiverAddress *receiver = value; 1592 struct ReceiverAddress *receiver = value;
1543 int acks_to_add; 1593 uint32_t acks_to_add;
1544 uint32_t allowed; 1594 uint32_t allowed;
1595 // int needed_for_rekeying;
1545 1596
1546 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1597 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1547 "in handle ack\n"); 1598 "in handle ack with cmac %s\n",
1599 GNUNET_h2s (&ack->cmac));
1548 1600
1549 if (NULL != receiver->ss_rekey) 1601 if (NULL != receiver->ss_rekey)
1550 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1602 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1551 "Received secret with cmac %s \n", 1603 "We have rekey secret with cmac %s \n",
1552 GNUNET_h2s (&receiver->ss_rekey->cmac)); 1604 GNUNET_h2s (&receiver->ss_rekey->cmac));
1553 1605
1554 if ((NULL != receiver->ss_rekey) && (0 == memcmp (&ack->cmac, 1606 if ((NULL != receiver->ss_rekey) && (0 == memcmp (&ack->cmac,
@@ -1598,16 +1650,37 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
1598 // Uncomment this for alternativ 1 of backchannel functionality 1650 // Uncomment this for alternativ 1 of backchannel functionality
1599 acks_to_add = (allowed - ss->sequence_allowed); 1651 acks_to_add = (allowed - ss->sequence_allowed);
1600 if ((GNUNET_NO == receiver->rekeying) && 1652 if ((GNUNET_NO == receiver->rekeying) &&
1601 (receiver->number_rekeying_kce < 1653 (receiver->number_rekeying_kce < 3) )
1602 3) ) 1654 acks_to_add = reset_rekey_kces (receiver, acks_to_add);
1655 /* if ((GNUNET_NO == receiver->rekeying) && */
1656 /* (receiver->number_rekeying_kce < */
1657 /* 3) ) */
1658 /* { */
1659 /* needed_for_rekeying = (3 - receiver->number_rekeying_kce); */
1660 /* if (acks_to_add <= needed_for_rekeying) */
1661 /* { */
1662 /* receiver->number_rekeying_kce += acks_to_add; */
1663 /* acks_to_add = 0; */
1664 /* } */
1665 /* else */
1666 /* { */
1667 /* acks_to_add -= (3 - receiver->number_rekeying_kce); */
1668 /* receiver->number_rekeying_kce = 3; */
1669 /* } */
1670 /* } */
1671 /* GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, */
1672 /* "%u kce for rekeying\n", */
1673 /* receiver->number_rekeying_kce); */
1674
1675 if ((0 != acks_to_add) && (GNUNET_NO == receiver->rekeying))
1603 { 1676 {
1604 acks_to_add -= (3 - receiver->number_rekeying_kce); 1677 receiver->acks_available += (allowed - ss->sequence_allowed);
1605 receiver->number_rekeying_kce = 3; 1678 ss->sequence_allowed = allowed;
1679 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1680 "%u receiver->acks_available 5\n",
1681 receiver->acks_available);
1682 add_acks (ss, acks_to_add);
1606 } 1683 }
1607 receiver->acks_available += (allowed - ss->sequence_allowed);
1608 ss->sequence_allowed = allowed;
1609
1610 add_acks (ss, acks_to_add, GNUNET_YES);
1611 } 1684 }
1612 return GNUNET_NO; 1685 return GNUNET_NO;
1613 } 1686 }
@@ -1671,11 +1744,15 @@ kce_generate_cb (void *cls)
1671 1744
1672 1745
1673 1746
1674 if (ss->sender->acks_available < KCN_TARGET) 1747 if (((GNUNET_NO == ss->sender->rekeying) && (ss->sender->acks_available <
1748 KCN_TARGET) ) ||
1749 ((ss->sender->ss_rekey == ss) && (GNUNET_YES == ss->sender->rekeying) &&
1750 (ss->sender->acks_available < 128)))
1675 { 1751 {
1676 1752
1677 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1753 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1678 "Precomputing keys\n"); 1754 "Precomputing keys for master %s\n",
1755 GNUNET_h2s (&(ss->master)));
1679 1756
1680 for (int i = 0; i < GENERATE_AT_ONCE; i++) 1757 for (int i = 0; i < GENERATE_AT_ONCE; i++)
1681 kce_generate (ss, ++ss->sequence_allowed); 1758 kce_generate (ss, ++ss->sequence_allowed);
@@ -1702,6 +1779,11 @@ kce_generate_rekey_cb (void *cls)
1702 1779
1703 if (NULL == kce_task) 1780 if (NULL == kce_task)
1704 { 1781 {
1782
1783 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1784 "Precomputing keys for rekey master %s\n",
1785 GNUNET_h2s (&(ss->master)));
1786
1705 for (int i = 0; i < GENERATE_AT_ONCE; i++) 1787 for (int i = 0; i < GENERATE_AT_ONCE; i++)
1706 kce_generate (ss, ++ss->sequence_allowed); 1788 kce_generate (ss, ++ss->sequence_allowed);
1707 1789
@@ -1760,23 +1842,33 @@ consider_ss_ack (struct SharedSecret *ss, int initial)
1760 if (((NULL != kce_task) && kce_task_finished) || (GNUNET_NO == initial)) 1842 if (((NULL != kce_task) && kce_task_finished) || (GNUNET_NO == initial))
1761 { 1843 {
1762 struct UDPAck ack; 1844 struct UDPAck ack;
1845 struct SharedSecret *ss_tell;
1846
1847 if (GNUNET_NO != initial)
1848 ss_tell = ss_finished;
1849 else
1850 ss_tell = ss;
1763 1851
1764 ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK); 1852 ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
1765 ack.header.size = htons (sizeof(ack)); 1853 ack.header.size = htons (sizeof(ack));
1766 ack.sequence_max = htonl (ss_finished->sequence_allowed); 1854 ack.sequence_max = htonl (ss_tell->sequence_allowed);
1767 ack.acks_available = ss->sender->acks_available; 1855 ack.acks_available = ss->sender->acks_available;
1768 ack.cmac = ss_finished->cmac; 1856 ack.cmac = ss_tell->cmac;
1769 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1857 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1770 "Notifying transport of UDPAck %s with intial %u\n", 1858 "Notifying transport of UDPAck %s with intial %u and master %s\n",
1771 GNUNET_i2s_full (&ss_finished->sender->target), 1859 GNUNET_i2s_full (&ss_tell->sender->target),
1772 initial); 1860 initial,
1861 GNUNET_h2s (&(ss_tell->master)));
1773 GNUNET_TRANSPORT_communicator_notify (ch, 1862 GNUNET_TRANSPORT_communicator_notify (ch,
1774 &ss_finished->sender->target, 1863 &ss_tell->sender->target,
1775 COMMUNICATOR_ADDRESS_PREFIX, 1864 COMMUNICATOR_ADDRESS_PREFIX,
1776 &ack.header); 1865 &ack.header);
1777 destroy_all_secrets (ss, GNUNET_YES); 1866 if (GNUNET_NO != initial)
1778 kce_task = NULL; 1867 {
1779 kce_task_finished = GNUNET_NO; 1868 destroy_all_secrets (ss, GNUNET_YES);
1869 kce_task = NULL;
1870 kce_task_finished = GNUNET_NO;
1871 }
1780 } 1872 }
1781 else if ((NULL == kce_task) && ((KCN_THRESHOLD > ss->sender->acks_available)|| 1873 else if ((NULL == kce_task) && ((KCN_THRESHOLD > ss->sender->acks_available)||
1782 (GNUNET_YES == ss->sender->rekeying) || 1874 (GNUNET_YES == ss->sender->rekeying) ||
@@ -1835,6 +1927,10 @@ decrypt_box (const struct UDPBox *box,
1835 "# bytes decrypted with BOX", 1927 "# bytes decrypted with BOX",
1836 sizeof(out_buf), 1928 sizeof(out_buf),
1837 GNUNET_NO); 1929 GNUNET_NO);
1930 GNUNET_STATISTICS_update (stats,
1931 "# messages decrypted with BOX",
1932 1,
1933 GNUNET_NO);
1838 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1934 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1839 "decrypted UDPBox with kid %s\n", 1935 "decrypted UDPBox with kid %s\n",
1840 GNUNET_sh2s (&box->kid)); 1936 GNUNET_sh2s (&box->kid));
@@ -1842,16 +1938,17 @@ decrypt_box (const struct UDPBox *box,
1842 if ((GNUNET_NO == box->rekeying) && (GNUNET_YES == ss->sender->rekeying)) 1938 if ((GNUNET_NO == box->rekeying) && (GNUNET_YES == ss->sender->rekeying))
1843 { 1939 {
1844 ss->sender->rekeying = GNUNET_NO; 1940 ss->sender->rekeying = GNUNET_NO;
1941 ss->sender->ss_rekey = NULL;
1845 // destroy_all_secrets (ss, GNUNET_NO); 1942 // destroy_all_secrets (ss, GNUNET_NO);
1846 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1943 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1847 "Receiver stopped rekeying.\n"); 1944 "Receiver stopped rekeying.\n");
1848 } 1945 }
1849 else if (GNUNET_NO == box->rekeying) 1946 else if (GNUNET_NO == box->rekeying)
1850 consider_ss_ack (ss, GNUNET_YES); 1947 consider_ss_ack (ss, GNUNET_NO);
1851 else{ 1948 else{
1852 ss->sender->rekeying = GNUNET_YES; 1949 ss->sender->rekeying = GNUNET_YES;
1853 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1950 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1854 "Receiver started rekeying.\n"); 1951 "Got Box: Receiver doing rekeying.\n");
1855 } 1952 }
1856} 1953}
1857 1954
@@ -1921,6 +2018,7 @@ decrypt_rekey (const struct UDPRekey *rekey,
1921 /* GNUNET_assert (ss_rekey->prev == NULL && sender->ss_head != ss_rekey); */ 2018 /* GNUNET_assert (ss_rekey->prev == NULL && sender->ss_head != ss_rekey); */
1922 /* GNUNET_assert (ss_rekey->next == NULL && sender->ss_tail != ss_rekey); */ 2019 /* GNUNET_assert (ss_rekey->next == NULL && sender->ss_tail != ss_rekey); */
1923 GNUNET_CONTAINER_DLL_insert (sender->ss_head, sender->ss_tail, ss_rekey); 2020 GNUNET_CONTAINER_DLL_insert (sender->ss_head, sender->ss_tail, ss_rekey);
2021 sender->ss_rekey = ss_rekey;
1924 sender->num_secrets++; 2022 sender->num_secrets++;
1925 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2023 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1926 "Received secret with cmac %s\n", 2024 "Received secret with cmac %s\n",
@@ -2157,6 +2255,7 @@ sock_read (void *cls)
2157 box->rekeying); 2255 box->rekeying);
2158 else 2256 else
2159 do_decrypt = GNUNET_YES; 2257 do_decrypt = GNUNET_YES;
2258
2160 if ((GNUNET_YES == do_decrypt)&& (NULL != kce) && (GNUNET_YES == 2259 if ((GNUNET_YES == do_decrypt)&& (NULL != kce) && (GNUNET_YES ==
2161 kce->ss->sender->rekeying)) 2260 kce->ss->sender->rekeying))
2162 { 2261 {
@@ -2165,6 +2264,10 @@ sock_read (void *cls)
2165 GNUNET_sh2s (&rekey->kid)); 2264 GNUNET_sh2s (&rekey->kid));
2166 sender = setup_sender (&rekey->sender, (const struct sockaddr *) &sa, 2265 sender = setup_sender (&rekey->sender, (const struct sockaddr *) &sa,
2167 salen); 2266 salen);
2267
2268 if (NULL != sender->ss_rekey)
2269 return;
2270
2168 decrypt_rekey (rekey, (size_t) rcvd, kce, sender); 2271 decrypt_rekey (rekey, (size_t) rcvd, kce, sender);
2169 return; 2272 return;
2170 } 2273 }
@@ -2290,6 +2393,7 @@ sock_read (void *cls)
2290 if ((GNUNET_NO == kx->rekeying) && (GNUNET_YES == ss->sender->rekeying)) 2393 if ((GNUNET_NO == kx->rekeying) && (GNUNET_YES == ss->sender->rekeying))
2291 { 2394 {
2292 ss->sender->rekeying = GNUNET_NO; 2395 ss->sender->rekeying = GNUNET_NO;
2396 sender->ss_rekey = NULL;
2293 // destroy_all_secrets (ss, GNUNET_NO); 2397 // destroy_all_secrets (ss, GNUNET_NO);
2294 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2398 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2295 "Receiver stopped rekeying.\n"); 2399 "Receiver stopped rekeying.\n");
@@ -2299,7 +2403,7 @@ sock_read (void *cls)
2299 else{ 2403 else{
2300 ss->sender->rekeying = GNUNET_YES; 2404 ss->sender->rekeying = GNUNET_YES;
2301 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2405 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2302 "Receiver started rekeying.\n"); 2406 "Got KX: Receiver doing rekeying.\n");
2303 } 2407 }
2304 /*if (sender->num_secrets > MAX_SECRETS) 2408 /*if (sender->num_secrets > MAX_SECRETS)
2305 secret_destroy (sender->ss_tail);*/ 2409 secret_destroy (sender->ss_tail);*/
@@ -2584,12 +2688,12 @@ check_for_rekeying (struct ReceiverAddress *receiver, struct UDPBox *box)
2584 receiver->rekey_timeout.abs_value_us); 2688 receiver->rekey_timeout.abs_value_us);
2585 2689
2586 if ((0 == rt.rel_value_us)||(receiver->rekey_send_bytes > 2690 if ((0 == rt.rel_value_us)||(receiver->rekey_send_bytes >
2587 REKEY_MAX_BYTES) ) 2691 rekey_max_bytes) )
2588 { 2692 {
2589 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2693 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2590 "Bytes send %lu greater than %llu max bytes\n.", 2694 "Bytes send %lu greater than %llu max bytes\n.",
2591 receiver->rekey_send_bytes, 2695 receiver->rekey_send_bytes,
2592 REKEY_MAX_BYTES); 2696 rekey_max_bytes);
2593 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2697 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2594 "Relative time is %lu and timeout is %lu\n.", 2698 "Relative time is %lu and timeout is %lu\n.",
2595 rt.rel_value_us, 2699 rt.rel_value_us,
@@ -2631,9 +2735,14 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
2631 - (receiver->rekey_acks_available % 3)) / 3; 2735 - (receiver->rekey_acks_available % 3)) / 3;
2632 is_ss_rekey_sequence_allowed_zero = (0 == 2736 is_ss_rekey_sequence_allowed_zero = (0 ==
2633 receiver->ss_rekey->sequence_allowed); 2737 receiver->ss_rekey->sequence_allowed);
2634 is_acks_available_below = (receiver->acks_available > not_below); 2738 is_acks_available_below = (receiver->acks_available >= not_below);
2635 send_rekey = (0 == (receiver->acks_available - not_below) % not_below) && 2739 send_rekey = (0 == (receiver->acks_available - not_below) % not_below) &&
2636 is_acks_available_below && is_ss_rekey_sequence_allowed_zero; 2740 is_acks_available_below && is_ss_rekey_sequence_allowed_zero;
2741 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2742 "send_rekey: %u, %u, %u\n",
2743 send_rekey,
2744 receiver->rekey_acks_available,
2745 receiver->acks_available);
2637 } 2746 }
2638 else if (NULL == receiver->ss_rekey) 2747 else if (NULL == receiver->ss_rekey)
2639 { 2748 {
@@ -2641,6 +2750,7 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
2641 GNUNET_CRYPTO_ecdhe_key_create (&epriv); 2750 GNUNET_CRYPTO_ecdhe_key_create (&epriv);
2642 receiver->ss_rekey = setup_shared_secret_enc (&epriv, receiver, 2751 receiver->ss_rekey = setup_shared_secret_enc (&epriv, receiver,
2643 GNUNET_NO); 2752 GNUNET_NO);
2753 receiver->ss_rekey->sequence_allowed = 0;
2644 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2754 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2645 "Setup secret with cmac %s\n", 2755 "Setup secret with cmac %s\n",
2646 GNUNET_h2s (&(receiver->ss_rekey->cmac))); 2756 GNUNET_h2s (&(receiver->ss_rekey->cmac)));
@@ -2700,6 +2810,9 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
2700 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2810 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2701 "Sending rekey with cmac %s\n", 2811 "Sending rekey with cmac %s\n",
2702 GNUNET_h2s (&(receiver->ss_rekey->cmac))); 2812 GNUNET_h2s (&(receiver->ss_rekey->cmac)));
2813 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2814 "%u rekey kces left.\n",
2815 receiver->number_rekeying_kce);
2703 2816
2704 if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock, 2817 if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
2705 rekey_dgram, 2818 rekey_dgram,
@@ -2708,6 +2821,10 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
2708 receiver->address_len)) 2821 receiver->address_len))
2709 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send"); 2822 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
2710 2823
2824 receiver->acks_available--;
2825 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2826 "%u receiver->acks_available 1\n",
2827 receiver->acks_available);
2711 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2828 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2712 "Sending UDPRekey to %s\n", GNUNET_a2s (receiver->address, 2829 "Sending UDPRekey to %s\n", GNUNET_a2s (receiver->address,
2713 receiver-> 2830 receiver->
@@ -2737,6 +2854,12 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
2737 if ((msize > receiver->d_mtu) || 2854 if ((msize > receiver->d_mtu) ||
2738 (0 == receiver->acks_available)) 2855 (0 == receiver->acks_available))
2739 { 2856 {
2857 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2858 "msize: %u, mtu: %lu, acks: %u\n",
2859 msize,
2860 receiver->d_mtu,
2861 receiver->acks_available);
2862
2740 GNUNET_break (0); 2863 GNUNET_break (0);
2741 if (GNUNET_YES != receiver->receiver_destroy_called) 2864 if (GNUNET_YES != receiver->receiver_destroy_called)
2742 receiver_destroy (receiver); 2865 receiver_destroy (receiver);
@@ -2789,8 +2912,6 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
2789 else 2912 else
2790 box->rekeying = GNUNET_YES; 2913 box->rekeying = GNUNET_YES;
2791 2914
2792 check_for_rekeying (receiver, box);
2793
2794 if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock, 2915 if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
2795 dgram, 2916 dgram,
2796 sizeof(dgram), 2917 sizeof(dgram),
@@ -2798,11 +2919,15 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
2798 receiver->address_len)) 2919 receiver->address_len))
2799 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send"); 2920 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
2800 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2921 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2801 "Sending UDPBox to %s\n", GNUNET_a2s (receiver->address, 2922 "Sending UDPBox %u acks left\n",
2802 receiver->address_len)); 2923 receiver->acks_available);
2803 GNUNET_MQ_impl_send_continue (mq); 2924 GNUNET_MQ_impl_send_continue (mq);
2804 receiver->acks_available--; 2925 receiver->acks_available--;
2805 if (0 == receiver->acks_available) 2926 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2927 "%u receiver->acks_available 2\n",
2928 receiver->acks_available);
2929 check_for_rekeying (receiver, box);
2930 if (0 == receiver->acks_available - receiver->number_rekeying_kce)
2806 { 2931 {
2807 /* We have no more ACKs */ 2932 /* We have no more ACKs */
2808 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2933 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -2810,6 +2935,8 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
2810 if (GNUNET_YES == receiver->rekeying) 2935 if (GNUNET_YES == receiver->rekeying)
2811 { 2936 {
2812 receiver->rekeying = GNUNET_NO; 2937 receiver->rekeying = GNUNET_NO;
2938 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2939 "Sender stopped rekeying\n");
2813 2940
2814 if ((NULL != receiver->ss_rekey) && (0 < 2941 if ((NULL != receiver->ss_rekey) && (0 <
2815 receiver->ss_rekey-> 2942 receiver->ss_rekey->
@@ -3120,6 +3247,8 @@ get_sender_delete_it (void *cls,
3120static void 3247static void
3121do_shutdown (void *cls) 3248do_shutdown (void *cls)
3122{ 3249{
3250 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3251 "do_shutdown\n");
3123 if (NULL != nat) 3252 if (NULL != nat)
3124 { 3253 {
3125 GNUNET_NAT_unregister (nat); 3254 GNUNET_NAT_unregister (nat);
@@ -3151,6 +3280,11 @@ do_shutdown (void *cls)
3151 GNUNET_CONTAINER_multishortmap_destroy (key_cache); 3280 GNUNET_CONTAINER_multishortmap_destroy (key_cache);
3152 GNUNET_CONTAINER_heap_destroy (senders_heap); 3281 GNUNET_CONTAINER_heap_destroy (senders_heap);
3153 GNUNET_CONTAINER_heap_destroy (receivers_heap); 3282 GNUNET_CONTAINER_heap_destroy (receivers_heap);
3283 if (NULL != timeout_task)
3284 {
3285 GNUNET_SCHEDULER_cancel (timeout_task);
3286 timeout_task = NULL;
3287 }
3154 if (NULL != ch) 3288 if (NULL != ch)
3155 { 3289 {
3156 GNUNET_TRANSPORT_communicator_disconnect (ch); 3290 GNUNET_TRANSPORT_communicator_disconnect (ch);
@@ -3176,6 +3310,8 @@ do_shutdown (void *cls)
3176 GNUNET_NT_scanner_done (is); 3310 GNUNET_NT_scanner_done (is);
3177 is = NULL; 3311 is = NULL;
3178 } 3312 }
3313 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
3314 "do_shutdown finished\n");
3179} 3315}
3180 3316
3181 3317
@@ -3507,6 +3643,13 @@ run (void *cls,
3507 &rekey_interval)) 3643 &rekey_interval))
3508 rekey_interval = DEFAULT_REKEY_TIME_INTERVAL; 3644 rekey_interval = DEFAULT_REKEY_TIME_INTERVAL;
3509 3645
3646 if (GNUNET_OK !=
3647 GNUNET_CONFIGURATION_get_value_size (cfg,
3648 COMMUNICATOR_CONFIG_SECTION,
3649 "REKEY_MAX_BYTES",
3650 &rekey_max_bytes))
3651 rekey_max_bytes = DEFAULT_REKEY_MAX_BYTES;
3652
3510 in = udp_address_to_sockaddr (bindto, &in_len); 3653 in = udp_address_to_sockaddr (bindto, &in_len);
3511 if (NULL == in) 3654 if (NULL == in)
3512 { 3655 {