diff options
author | Gabor X Toth <*@tg-x.net> | 2014-05-22 23:05:27 +0000 |
---|---|---|
committer | Gabor X Toth <*@tg-x.net> | 2014-05-22 23:05:27 +0000 |
commit | a7100389deab562e67d22ff68961b68a62341aec (patch) | |
tree | dbafc72c162df8627e639bd5e5190d8dc321d63d /src/multicast/gnunet-service-multicast.c | |
parent | c3bc1d8ef6e78e543d0077a57b04ae480f1d7caf (diff) | |
download | gnunet-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.c | 126 |
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 | |||
425 | handle_member_join (void *cls, struct GNUNET_SERVER_Client *client, | 427 | handle_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 | */ | ||
548 | static void | ||
549 | handle_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 | */ |
544 | static void | 627 | static 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 | ||