Exemple #1
0
static void
_peer_shutdown (CcnetPeer *peer)
{
    peer->in_shutdown = 1;

    if (peer->net_state == PEER_CONNECTED) {
        peer->last_down = time(NULL);
        ccnet_packet_io_free (peer->io);
        peer->io = NULL;
        g_object_set (peer, "can-connect", 0, NULL);
    }
    peer->is_ready = 0;
    g_free (peer->dns_addr);
    peer->dns_addr = NULL;
    peer->dns_done = 0;

    /* clear session key when peer down  */
    peer->encrypt_channel = 0;
    g_free (peer->session_key);
    peer->session_key = NULL;

    ccnet_debug ("Shutdown all processors for peer %s\n", peer->name);
    shutdown_processors (peer);
    remove_write_callbacks (peer);

    ccnet_peer_set_net_state (peer, PEER_DOWN);

    g_signal_emit (peer, signals[DOWN_SIG], 0);

    peer->in_shutdown = 0;
}
Exemple #2
0
static void
myHandshakeDoneCB (CcnetHandshake *handshake,
                   CcnetPacketIO  *io,
                   int             is_connected,
                   const char     *peer_id,
                   void           *vmanager)
{
    CcnetConnManager *manager = vmanager;
    CcnetPeerManager *peerMgr = manager->session->peer_mgr;
    CcnetPeer *peer;

    if (!is_connected) {
        if (ccnet_packet_io_is_incoming (io)) {
            ccnet_warning ("[conn] incoming handshake fails.\n");
            ccnet_packet_io_free (io);
            return;
        }

        /* temporally use peer, so don't need to increase the reference */
        peer = handshake->peer;
        if (peer->num_fails == 0) {
            /* print error for the first time */
            ccnet_message ("[Conn] peer %s(%.10s) connection fails\n", 
                         peer->name, peer->id);
        } else {
            ccnet_debug ("[Conn] peer %s(%.10s) connection fails\n", 
                         peer->name, peer->id);
        }
        if (peer->net_state == PEER_CONNECTED) {
            ccnet_debug ("[Conn] But Peer %s(%.10s) is already connected me.\n",
                         peer->name, peer->id);
        } else if (peer->net_state == PEER_DOWN){
            ccnet_peer_shutdown(peer);
        }

        ccnet_packet_io_free (io);

        peer->num_fails++;
        peer->in_connection = 0;
        return;
    }

    if (!ccnet_packet_io_is_incoming (io)) {
        peer = handshake->peer;
        peer->in_connection = 0;
        
        if (peer->to_resolve) {
            if (!peer_id_valid(peer_id)) {
                /* TODO: Remove the peer */
                ccnet_warning ("[Conn] Resolving: Received invalid peer id\n");
                return;
            }
            ccnet_debug ("[Conn] Resolving: Peer %.8s is resolved\n", peer_id);
            memcpy (peer->id, peer_id, 40);
            peer->id[40] = '\0';
            on_resolve_peer_connected (peer, io);
            return;
        }
        /* ref for using the peer below */
        g_object_ref (peer);
    } else {
        /* incoming */
        if (peer_id == NULL) {
            ccnet_warning ("Unknown peer (no-id) connecting\n");
            ccnet_packet_io_free (io);
            return;
        }
        peer = ccnet_peer_manager_get_peer (peerMgr, peer_id);
        if (!peer) {
            ccnet_message ("Unknown peer %s connecting\n", peer_id);
            peer = ccnet_peer_new (peer_id);
            ccnet_peer_manager_add_peer (peerMgr, peer);
            set_peer_address_from_socket(peer, io);
            peer->last_up = time(NULL);
            on_unauthed_peer_connected (peer, io);
            g_object_unref (peer);
            return;
        }
        set_peer_address_from_socket(peer, io);
        peer->last_up = time(NULL);
    }
    /* hold a reference on the peer */

    if (peer->net_state == PEER_CONNECTED) {
        ccnet_message ("[Conn] Peer %s (%.10s) is already connected. "
                       "Discarding this handshake.\n", 
                       peer->name, peer->id);
        ccnet_packet_io_free (io);
        g_object_unref (peer);
        return;
    }

    ccnet_message ("[Conn] Peer %s (%.10s) connected\n",
                   peer->name, peer->id);
    peer->num_fails = 0;
    on_peer_connected (peer, io);
    g_object_unref (peer);
}