示例#1
0
static inline void delete_state(store_t *const store,
    fcs_pseudo_dfs_lru_cache_t *const cache, fcs_cache_key_t *const key)
{
    fcs_pdfs_cache_insert(cache, &(key->s));
    int rc_int;
    JHSD(rc_int, *store, &(key->s), sizeof(key->s));
}
示例#2
0
void network_manager_unclaim_invs(struct network_manager* nm, struct network_peer* peer, struct inv const* invs, size_t num_invs)
{
    int rc;
    int stopped = 0;

    for(size_t i = 0; i < num_invs; i++) {
        JHSD(rc, nm->claimed_invs, (uint8_t*)(&invs[i]), sizeof(struct inv));
        if(rc == 0 && stopped == 0) {
            network_peer_disconnect(peer, "bad unclaim");
            stopped = 1;
        }
    }
}
示例#3
0
static int start_peer(struct network_manager* nm)
{
    // Randomly pick an address to connect to
    struct network_address address;
    int have_address = 0;

    for(int i = 0; i < 50; i++) {
        if(database_get_random_peer_address(chaind_database(nm->chaind), &address) <= 0) {
            // Error, or no address to select
            break;
        }

        // Apply default port if sin_port == 0
        if(address.sin_port == 0) address.sin_port = htons(NETWORK_DEFAULT_PORT);

        if(network_manager_get_peer_by_address(nm, &address) == NULL) {
            have_address = 1;
            break;
        }
    }

    if(!have_address) return -1;

    struct network_peer* peer = network_peer_create(nm);
    struct network_peer** ppeer = NULL;

    Word_t peer_id = nm->next_peer_id;
    JLI(ppeer, nm->peer_list, peer_id);
    *ppeer = peer;
    nm->next_peer_id += 1;

    Word_t* pindex;
    JHSI(pindex, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address));
    *pindex = peer_id;

    int res = network_peer_connect(peer, &address, blockchain_link_height(chaind_best_blockchain_link(nm->chaind)));

    if(res != 0) {
        int rc;
        JLD(rc, nm->peer_list, peer_id);
        JHSD(rc, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address));
        network_peer_destroy(peer);
        return res;
    }

    nm->num_peers += 1;
    return 0;
}
示例#4
0
static void stop_peer(struct network_manager* nm, struct network_peer* peer)
{
    struct network_address address;
    network_peer_address(peer, &address);

    Word_t* pindex;
    JHSG(pindex, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address));
    assert(pindex != NULL);

    Word_t peer_id = *pindex;
    struct network_peer** ppeer;
    JLG(ppeer, nm->peer_list, peer_id);
    assert(ppeer != NULL);
    assert(*ppeer == peer);

    // Remove from lists
    int rc;
    JLD(rc, nm->peer_list, peer_id);
    JHSD(rc, nm->peer_by_address, (uint8_t*)&address, sizeof(struct network_address));
    
    // Done with you!
    network_peer_destroy(peer);
    nm->num_peers -= 1;
}
示例#5
0
static void remove_from_wanted_invs(struct network_manager* nm, struct inv const* invs, size_t num_invs)
{
    Word_t swap_index;
    struct inv** pinv1;
    struct inv** pinv2;
    struct inv* inv2;
    int rc;
    Word_t* pindex1;
    Word_t* pindex2;

    for(size_t i = 0; i < num_invs; i++) {
        struct inv const* inv = &invs[i];

        JHSG(pindex1, nm->wanted_invs_by_inv, (uint8_t*)inv, sizeof(struct inv));
        assert(pindex1 != NULL);

        Word_t* tail = NULL;
        Word_t* head = NULL;
        void** list = NULL;

        switch(inv->type) {
        case INV_TYPE_BLOCK:
            head = &nm->head_block_inv_id;
            tail = &nm->tail_block_inv_id;
            list = &nm->block_inv_list;
            break;
        case INV_TYPE_TX:
            head = &nm->head_tx_inv_id;
            tail = &nm->tail_tx_inv_id;
            list = &nm->tx_inv_list;
            break;
        case INV_TYPE_ERROR:
            assert(0);
            break;
        }

        assert(*head > *tail);

        swap_index = *head - 1;
        if(*pindex1 == *tail) {
            JLG(pinv1, *list, *pindex1);
            assert(memcmp(*pinv1, inv, sizeof(struct inv)) == 0);

            free(*pinv1);
            JLD(rc, *list, *pindex1);

            (*tail) += 1;
        } else if(*pindex1 < swap_index) {
            JLG(pinv1, *list, *pindex1);
            assert(pinv1 != NULL);

            JLG(pinv2, *list, swap_index);
            assert(pinv2 != NULL);

            assert(memcmp(*pinv1, inv, sizeof(struct inv)) == 0);
            assert(memcmp(*pinv1, *pinv2, sizeof(struct inv)) != 0);

            // JLD will kill the pinv2 pointer, so save the inv
            inv2 = *pinv2;
            free(*pinv1);
            JLD(rc, *list, swap_index);

            // JLD can reorder the array..
            JLI(pinv1, *list, *pindex1);
            *pinv1 = inv2;

            // Remove from wanted array
            JHSG(pindex2, nm->wanted_invs_by_inv, (uint8_t*)inv2, sizeof(struct inv));
            *pindex2 = *pindex1;
            (*head) -= 1;
        } else {
            assert(*pindex1 == swap_index);

            JLG(pinv2, *list, swap_index);
            assert(memcmp(*pinv2, inv, sizeof(struct inv)) == 0);

            free(*pinv2);
            JLD(rc, *list, swap_index);

            (*head) -= 1;
        }

        JHSD(rc, nm->wanted_invs_by_inv, (uint8_t*)inv, sizeof(struct inv));
    }
}