aboutsummaryrefslogtreecommitdiff
path: root/brandt.c
diff options
context:
space:
mode:
authorMarkus Teich <markus.teich@stusta.mhn.de>2016-08-12 14:38:10 +0200
committerMarkus Teich <markus.teich@stusta.mhn.de>2016-08-12 15:22:57 +0200
commit6483328c4805b92390032ac45f55c50be7b6f103 (patch)
tree2a9fb3d125a0f850046973af0c061e5f3a7e2acb /brandt.c
parent155d0a2370721f1ba50759c25daa27b37c2234c7 (diff)
fill descr struct on new()
Diffstat (limited to 'brandt.c')
-rw-r--r--brandt.c123
1 files changed, 74 insertions, 49 deletions
diff --git a/brandt.c b/brandt.c
index d71e7c9..dda81ac 100644
--- a/brandt.c
+++ b/brandt.c
@@ -59,44 +59,62 @@ start_auction (void *arg)
struct BRANDT_Auction *
-BRANDT_new (BRANDT_CbBroadcast broadcast,
- BRANDT_CbResult result,
- void *auction_closure,
- void **auction_data,
- size_t *auction_data_len,
+BRANDT_new (BRANDT_CbBroadcast broadcast,
+ BRANDT_CbResult result,
+ void *auction_closure,
+ void **auction_data,
+ size_t *auction_data_len,
struct GNUNET_TIME_Absolute time_start,
struct GNUNET_TIME_Relative time_round,
- uint16_t num_prices,
- uint16_t m,
- int outcome_public)
+ void *description,
+ uint32_t description_len,
+ uint16_t num_prices,
+ uint16_t m,
+ int outcome_public)
{
- struct BRANDT_Auction *ret;
-
- ret = GNUNET_new (struct BRANDT_Auction);
+ struct BRANDT_Auction *ret = GNUNET_new (struct BRANDT_Auction);
+ struct BRANDT_DescrP *desc = GNUNET_new (struct BRANDT_DescrP);
+ struct GNUNET_TIME_Relative until_start;
+ struct GNUNET_HashContext *hc = GNUNET_CRYPTO_hash_context_start ();
+
+ desc->time_start = GNUNET_TIME_absolute_hton (time_start);
+ desc->time_round = GNUNET_TIME_relative_hton (time_round);
+ desc->description_len = htonl (description_len);
+ desc->k = htons (num_prices);
+ desc->m = htons (m);
+ desc->outcome_public = htons (outcome_public);
+ GNUNET_CRYPTO_hash_context_read (hc,
+ &desc->time_start,
+ sizeof (*desc) - sizeof (desc->hash));
+ GNUNET_CRYPTO_hash_context_read (hc,
+ description,
+ description_len);
+ GNUNET_CRYPTO_hash_context_finish (hc, &desc->hash);
ret->time_start = time_start;
ret->time_round = time_round;
-
ret->k = num_prices;
ret->m = m;
ret->outcome_public = outcome_public;
+ ret->cur_round = msg_join;
+ ret->round_progress = gcry_mpi_new (256);
/* we are the seller */
ret->seller_mode = 1;
- /* interface with application */
+ /* callback interface with application */
ret->closure = auction_closure;
ret->bcast = broadcast;
ret->result = result;
- ret->cur_round = msg_join;
- ret->round_progress = gcry_mpi_new (256);
-
+ until_start = GNUNET_TIME_absolute_get_remaining (time_start);
/* \todo: store returned task somewhere to cancel it on shutdown */
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining (time_start),
- &start_auction,
- ret);
+ ret->task = GNUNET_SCHEDULER_add_delayed (until_start,
+ &start_auction,
+ ret);
+ *auction_data_len = sizeof (struct BRANDT_DescrP);
+ *auction_data = desc;
return ret;
}
@@ -109,53 +127,59 @@ BRANDT_join (BRANDT_CbBroadcast broadcast,
const void *auction_data,
size_t auction_data_len)
{
- struct BRANDT_Auction *ret;
- struct BRANDT_DescrP *desc = (struct BRANDT_DescrP *)auction_data;
-
- ret = GNUNET_new (struct BRANDT_Auction);
-
- ret->time_start = GNUNET_TIME_absolute_ntoh(desc->time_start);
- ret->time_round = GNUNET_TIME_relative_ntoh(desc->time_round);
-
- ret->k = ntohs(desc->k);
- ret->m = ntohs(desc->m);
- ret->outcome_public = ntohs(desc->outcome_public);
+ struct BRANDT_Auction *ret = GNUNET_new (struct BRANDT_Auction);
+ struct BRANDT_DescrP *desc = (struct BRANDT_DescrP *)auction_data;
+
+ ret->time_start = GNUNET_TIME_absolute_ntoh (desc->time_start);
+ ret->time_round = GNUNET_TIME_relative_ntoh (desc->time_round);
+ ret->k = ntohs (desc->k);
+ ret->m = ntohs (desc->m);
+ ret->outcome_public = ntohs (desc->outcome_public);
+ ret->cur_round = msg_join;
+ ret->round_progress = gcry_mpi_new (256);
/* we are the seller */
ret->seller_mode = 0;
- /* interface with application */
+ /* callback interface with application */
ret->closure = auction_closure;
ret->bcast = broadcast;
ret->ucast = unicast;
ret->result = result;
- ret->cur_round = msg_join;
- ret->round_progress = gcry_mpi_new (256);
-
return ret;
}
+void
+BRANDT_destroy (struct BRANDT_Auction *auction)
+{
+ GNUNET_SCHEDULER_cancel (auction->task);
+}
+
+
static void
-advance_round (struct BRANDT_Auction *auction, enum auction_type atype, enum outcome_type outcome)
+advance_round (struct BRANDT_Auction *ad,
+ enum auction_type atype,
+ enum outcome_type outcome)
{
unsigned char *buf;
- size_t buflen;
+ size_t buflen;
/* if we got the current round message from all participants, advance to
* next round */
- for (uint16_t i = 0; i < auction->n; i++)
- if (!gcry_mpi_test_bit (auction->round_progress, i))
+ for (uint16_t i = 0; i < ad->n; i++)
+ if (!gcry_mpi_test_bit (ad->round_progress, i))
return;
- gcry_mpi_clear_highbit (auction->round_progress, 0);
- if (msg_last == ++(auction->cur_round))
+ gcry_mpi_clear_highbit (ad->round_progress, 0);
+ if (msg_last == ++(ad->cur_round))
{
+ /** \todo: finish */
}
- if (!handler_out[atype][outcome][auction->cur_round] ||
- !(buf = handler_out[atype][outcome][auction->cur_round](auction, &buflen)))
+ if (!handler_out[atype][outcome][ad->cur_round] ||
+ !(buf = handler_out[atype][outcome][ad->cur_round](ad, &buflen)))
{
/** \todo */
weprintf ("wow fail out");
@@ -165,10 +189,10 @@ advance_round (struct BRANDT_Auction *auction, enum auction_type atype, enum out
/** \todo: add msgtype header in the handler_out functions */
/* last message only sent to seller, others are broadcasted */
- if (msg_decrypt == auction->cur_round)
- auction->ucast (auction->closure, buf, buflen);
+ if (msg_decrypt == ad->cur_round)
+ ad->ucast (ad->closure, buf, buflen);
else
- auction->bcast (auction->closure, buf, buflen);
+ ad->bcast (ad->closure, buf, buflen);
}
@@ -178,10 +202,10 @@ BRANDT_got_message (struct BRANDT_Auction *auction,
const unsigned char *msg,
size_t msg_len)
{
- uint16_t mtype = *(uint16_t *)msg;
- enum auction_type atype;
- enum outcome_type outcome;
- enum rounds round = auction->cur_round;
+ uint16_t mtype = *(uint16_t *)msg;
+ enum auction_type atype;
+ enum outcome_type outcome;
+ enum rounds round = auction->cur_round;
atype = auction->m > 0 ? auction_mPlusFirstPrice : auction_firstPrice;
outcome = auction->outcome_public ? outcome_public : outcome_private;
@@ -207,5 +231,6 @@ BRANDT_got_message (struct BRANDT_Auction *auction,
}
gcry_mpi_set_bit (auction->round_progress, sender);
+ /** \todo: seller_mode and new task for round timing */
advance_round (auction, atype, outcome);
}