aboutsummaryrefslogtreecommitdiff
path: root/src/multicast/gnunet-service-multicast.c
diff options
context:
space:
mode:
authorGabor X Toth <*@tg-x.net>2014-05-22 23:05:27 +0000
committerGabor X Toth <*@tg-x.net>2014-05-22 23:05:27 +0000
commita7100389deab562e67d22ff68961b68a62341aec (patch)
treedbafc72c162df8627e639bd5e5190d8dc321d63d /src/multicast/gnunet-service-multicast.c
parentc3bc1d8ef6e78e543d0077a57b04ae480f1d7caf (diff)
downloadgnunet-a7100389deab562e67d22ff68961b68a62341aec.tar.gz
gnunet-a7100389deab562e67d22ff68961b68a62341aec.zip
psyc, multicast: join decision
Diffstat (limited to 'src/multicast/gnunet-service-multicast.c')
-rw-r--r--src/multicast/gnunet-service-multicast.c126
1 files changed, 106 insertions, 20 deletions
diff --git a/src/multicast/gnunet-service-multicast.c b/src/multicast/gnunet-service-multicast.c
index 0394ee19e..bd6616589 100644
--- a/src/multicast/gnunet-service-multicast.c
+++ b/src/multicast/gnunet-service-multicast.c
@@ -147,7 +147,7 @@ struct Member
147 /** 147 /**
148 * Join request sent to the origin / members. 148 * Join request sent to the origin / members.
149 */ 149 */
150 struct GNUNET_MULTICAST_JoinRequest *join_request; 150 struct MulticastJoinRequestMessage *join_request;
151 151
152 /** 152 /**
153 * Join decision sent in reply to our request. 153 * Join decision sent in reply to our request.
@@ -206,6 +206,8 @@ cleanup_member (struct Member *mem)
206 grp_mem); 206 grp_mem);
207 GNUNET_CONTAINER_multihashmap_destroy (grp_mem); 207 GNUNET_CONTAINER_multihashmap_destroy (grp_mem);
208 } 208 }
209 if (NULL != mem->join_decision)
210 GNUNET_free (mem->join_decision);
209 GNUNET_CONTAINER_multihashmap_remove (members, &grp->pub_key_hash, mem); 211 GNUNET_CONTAINER_multihashmap_remove (members, &grp->pub_key_hash, mem);
210} 212}
211 213
@@ -425,8 +427,8 @@ static void
425handle_member_join (void *cls, struct GNUNET_SERVER_Client *client, 427handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
426 const struct GNUNET_MessageHeader *m) 428 const struct GNUNET_MessageHeader *m)
427{ 429{
428 struct MulticastMemberJoinMessage * 430 const struct MulticastMemberJoinMessage *
429 msg = (struct MulticastMemberJoinMessage *) m; 431 msg = (const struct MulticastMemberJoinMessage *) m;
430 432
431 struct GNUNET_CRYPTO_EddsaPublicKey mem_pub_key; 433 struct GNUNET_CRYPTO_EddsaPublicKey mem_pub_key;
432 struct GNUNET_HashCode pub_key_hash, mem_pub_key_hash; 434 struct GNUNET_HashCode pub_key_hash, mem_pub_key_hash;
@@ -440,17 +442,10 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
440 struct Member *mem = NULL; 442 struct Member *mem = NULL;
441 struct Group *grp; 443 struct Group *grp;
442 444
443 if (NULL == grp_mem) 445 if (NULL != grp_mem)
444 {
445 grp_mem = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_YES);
446 GNUNET_CONTAINER_multihashmap_put (group_members, &pub_key_hash, grp_mem,
447 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
448 }
449 else
450 { 446 {
451 mem = GNUNET_CONTAINER_multihashmap_get (grp_mem, &mem_pub_key_hash); 447 mem = GNUNET_CONTAINER_multihashmap_get (grp_mem, &mem_pub_key_hash);
452 } 448 }
453
454 if (NULL == mem) 449 if (NULL == mem)
455 { 450 {
456 mem = GNUNET_new (struct Member); 451 mem = GNUNET_new (struct Member);
@@ -463,7 +458,13 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
463 grp->pub_key = msg->group_key; 458 grp->pub_key = msg->group_key;
464 grp->pub_key_hash = pub_key_hash; 459 grp->pub_key_hash = pub_key_hash;
465 460
466 GNUNET_CONTAINER_multihashmap_put (grp_mem, &mem_pub_key_hash, mem, 461 if (NULL == grp_mem)
462 {
463 grp_mem = GNUNET_CONTAINER_multihashmap_create (1, GNUNET_YES);
464 GNUNET_CONTAINER_multihashmap_put (group_members, &grp->pub_key_hash, grp_mem,
465 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
466 }
467 GNUNET_CONTAINER_multihashmap_put (grp_mem, &mem->pub_key_hash, mem,
467 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); 468 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
468 GNUNET_CONTAINER_multihashmap_put (members, &grp->pub_key_hash, mem, 469 GNUNET_CONTAINER_multihashmap_put (members, &grp->pub_key_hash, mem,
469 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 470 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
@@ -478,8 +479,11 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
478 GNUNET_CONTAINER_DLL_insert (grp->clients_head, grp->clients_tail, cl); 479 GNUNET_CONTAINER_DLL_insert (grp->clients_head, grp->clients_tail, cl);
479 480
480 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 481 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
481 "%p Client connected as member to group %s.\n", 482 "%p Client connected to group %s..\n",
482 mem, GNUNET_h2s (&grp->pub_key_hash)); 483 mem, GNUNET_h2s (&grp->pub_key_hash));
484 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
485 "%p ..as member %s.\n",
486 mem, GNUNET_h2s (&mem_pub_key_hash));
483 487
484 GNUNET_SERVER_client_set_user_context (client, grp); 488 GNUNET_SERVER_client_set_user_context (client, grp);
485 489
@@ -496,19 +500,19 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
496 struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) &msg[1]; 500 struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) &msg[1];
497 uint32_t relay_count = ntohs (msg->relay_count); 501 uint32_t relay_count = ntohs (msg->relay_count);
498 struct GNUNET_MessageHeader * 502 struct GNUNET_MessageHeader *
499 join_req = ((struct GNUNET_MessageHeader *) 503 join_msg = ((struct GNUNET_MessageHeader *)
500 ((char *) &msg[1]) + relay_count * sizeof (*relays)); 504 ((char *) &msg[1]) + relay_count * sizeof (*relays));
501 uint16_t join_req_size = ntohs (join_req->size); 505 uint16_t join_msg_size = ntohs (join_msg->size);
502 506
503 struct MulticastJoinRequestMessage * 507 struct MulticastJoinRequestMessage *
504 req = GNUNET_malloc (sizeof (*req) + join_req_size); 508 req = GNUNET_malloc (sizeof (*req) + join_msg_size);
505 req->header.size = htons (sizeof (*req) + join_req_size); 509 req->header.size = htons (sizeof (*req) + join_msg_size);
506 req->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST); 510 req->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_REQUEST);
507 req->group_key = grp->pub_key; 511 req->group_key = grp->pub_key;
508 GNUNET_CRYPTO_eddsa_key_get_public (&mem->priv_key, &req->member_key); 512 GNUNET_CRYPTO_eddsa_key_get_public (&mem->priv_key, &req->member_key);
509 memcpy (&req[1], join_req, join_req_size); 513 memcpy (&req[1], join_msg, join_msg_size);
510 514
511 req->purpose.size = htonl (sizeof (*req) + join_req_size 515 req->purpose.size = htonl (sizeof (*req) + join_msg_size
512 - sizeof (req->header) 516 - sizeof (req->header)
513 - sizeof (req->signature)); 517 - sizeof (req->signature));
514 req->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_MULTICAST_REQUEST); 518 req->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_MULTICAST_REQUEST);
@@ -531,7 +535,7 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
531 } 535 }
532 else 536 else
533 { 537 {
534 /* FIXME: send join request to remote origin / members */ 538 /* FIXME: send join request to remote peers */
535 } 539 }
536 } 540 }
537 GNUNET_SERVER_receive_done (client, GNUNET_OK); 541 GNUNET_SERVER_receive_done (client, GNUNET_OK);
@@ -539,6 +543,85 @@ handle_member_join (void *cls, struct GNUNET_SERVER_Client *client,
539 543
540 544
541/** 545/**
546 * Join decision from client.
547 */
548static void
549handle_join_decision (void *cls, struct GNUNET_SERVER_Client *client,
550 const struct GNUNET_MessageHeader *m)
551{
552 struct Group *
553 grp = GNUNET_SERVER_client_get_user_context (client, struct Group);
554 const struct MulticastClientJoinDecisionMessage *
555 cl_dcsn = (const struct MulticastClientJoinDecisionMessage *) m;
556
557 struct GNUNET_PeerIdentity *relays = (struct GNUNET_PeerIdentity *) &cl_dcsn[1];
558 uint32_t relay_count = ntohs (cl_dcsn->relay_count);
559
560 struct GNUNET_MessageHeader *join_msg = NULL;
561 uint16_t join_msg_size = 0;
562 if (sizeof (*cl_dcsn) + relay_count * sizeof (*relays) + sizeof (*m)
563 <= ntohs (m->size))
564 {
565 join_msg = ((struct GNUNET_MessageHeader *)
566 ((char *) &cl_dcsn[1]) + relay_count * sizeof (*relays));
567 join_msg_size = ntohs (join_msg->size);
568 }
569
570 struct MulticastJoinDecisionMessage *
571 dcsn = GNUNET_malloc (sizeof (*dcsn) + join_msg_size);
572 dcsn->header.size = htons (sizeof (*dcsn) + join_msg_size);
573 dcsn->header.type = htons (GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION);
574 dcsn->is_admitted = cl_dcsn->is_admitted;
575 memcpy (&dcsn[1], join_msg, join_msg_size);
576
577 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
578 "%p Got join decision from client for group %s..\n",
579 grp, GNUNET_h2s (&grp->pub_key_hash));
580
581 if (GNUNET_YES
582 == GNUNET_CONTAINER_multihashmap_contains (origins, &grp->pub_key_hash))
583 { /* Local origin */
584 struct GNUNET_CONTAINER_MultiHashMap *
585 grp_mem = GNUNET_CONTAINER_multihashmap_get (group_members,
586 &grp->pub_key_hash);
587 if (NULL != grp_mem)
588 {
589 struct GNUNET_HashCode member_key_hash;
590 GNUNET_CRYPTO_hash (&cl_dcsn->member_key, sizeof (cl_dcsn->member_key),
591 &member_key_hash);
592 struct Member *
593 mem = GNUNET_CONTAINER_multihashmap_get (grp_mem, &member_key_hash);
594 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
595 "%p ..and member %s: %p\n",
596 grp, GNUNET_h2s (&member_key_hash), mem);
597 if (NULL != mem)
598 {
599 message_to_clients (grp, (struct GNUNET_MessageHeader *) dcsn);
600 if (GNUNET_YES == dcsn->is_admitted)
601 { /* Member admitted, store join_decision. */
602 mem->join_decision = dcsn;
603 }
604 else
605 { /* Refused entry, disconnect clients. */
606 GNUNET_free (dcsn);
607 struct ClientList *cl = mem->grp.clients_head;
608 while (NULL != cl)
609 {
610 GNUNET_SERVER_client_disconnect (cl->client);
611 cl = cl->next;
612 }
613 }
614 }
615 }
616 }
617 else
618 {
619 /* FIXME: send join decision to remote peers */
620 }
621 GNUNET_SERVER_receive_done (client, GNUNET_OK);
622}
623
624/**
542 * Incoming message from a client. 625 * Incoming message from a client.
543 */ 626 */
544static void 627static void
@@ -633,6 +716,9 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
633 { &handle_member_join, NULL, 716 { &handle_member_join, NULL,
634 GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN, 0 }, 717 GNUNET_MESSAGE_TYPE_MULTICAST_MEMBER_JOIN, 0 },
635 718
719 { &handle_join_decision, NULL,
720 GNUNET_MESSAGE_TYPE_MULTICAST_JOIN_DECISION, 0 },
721
636 { &handle_multicast_message, NULL, 722 { &handle_multicast_message, NULL,
637 GNUNET_MESSAGE_TYPE_MULTICAST_MESSAGE, 0 }, 723 GNUNET_MESSAGE_TYPE_MULTICAST_MESSAGE, 0 },
638 724