/** * Method called whenever a peer connects. * * @param cls closure * @param peer peer identity this notification is about * @param mq message queue for communicating with @a peer * @return our `struct Peer` for @a peer */ static void * connect_notify (void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq) { struct Peer *pos; uint64_t flags; const void *extra; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Core told us that we are connecting to `%s'\n", GNUNET_i2s (peer)); if (0 == memcmp (&my_identity, peer, sizeof (struct GNUNET_PeerIdentity))) return NULL; extra = GNUNET_CORE_get_mq_options (GNUNET_YES, GNUNET_CORE_PRIO_BEST_EFFORT, &flags); GNUNET_MQ_set_options (mq, flags, extra); connection_count++; GNUNET_STATISTICS_set (stats, gettext_noop ("# peers connected"), connection_count, GNUNET_NO); pos = GNUNET_CONTAINER_multipeermap_get (peers, peer); if (NULL == pos) { pos = make_peer (peer, NULL, GNUNET_NO); } else { GNUNET_assert (NULL == pos->mq); } pos->mq = mq; if (pos->is_friend) { friend_count++; if ( (friend_count == minimum_friend_count) && (GNUNET_YES != friends_only) ) whitelist_peers (); GNUNET_STATISTICS_set (stats, gettext_noop ("# friends connected"), friend_count, GNUNET_NO); } reschedule_hellos (NULL, peer, pos); return pos; }
/** * Method called whenever a peer connects. Sets up the PeerEntry and * schedules the initial size info transmission to this peer. * * @param cls closure * @param peer peer identity this notification is about */ static void * handle_core_connect (void *cls, const struct GNUNET_PeerIdentity *peer, struct GNUNET_MQ_Handle *mq) { struct NSEPeerEntry *peer_entry; uint64_t flags; const void *extra; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer `%s' connected to us\n", GNUNET_i2s (peer)); /* set our default transmission options */ extra = GNUNET_CORE_get_mq_options (GNUNET_NO, NSE_PRIORITY, &flags); GNUNET_MQ_set_options (mq, flags, extra); /* create our peer entry for this peer */ peer_entry = GNUNET_new (struct NSEPeerEntry); peer_entry->id = peer; peer_entry->mq = mq; GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multipeermap_put (peers, peer_entry->id, peer_entry, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); peer_entry->transmit_task = GNUNET_SCHEDULER_add_delayed (get_transmit_delay (-1), &transmit_task_cb, peer_entry); GNUNET_STATISTICS_update (stats, "# peers connected", 1, GNUNET_NO); return peer_entry; }