c-libp2p/include/libp2p/routing/dht_protocol.h

77 lines
2.5 KiB
C

#pragma once
#include "libp2p/conn/session.h"
#include "libp2p/net/protocol.h"
#include "libp2p/peer/peerstore.h"
#include "libp2p/peer/providerstore.h"
#include "libp2p/record/message.h"
/***
* This is where kademlia and dht talk to the outside world
*/
struct DhtContext {
struct Peerstore* peer_store;
struct ProviderStore* provider_store;
struct Datastore* datastore;
struct Filestore* filestore;
};
struct Libp2pProtocolHandler* libp2p_routing_dht_build_protocol_handler(struct Peerstore* peer_store, struct ProviderStore* provider_store,
struct Datastore* datastore, struct Filestore* filestore);
/**
* Take existing stream and upgrade to the Kademlia / DHT protocol/codec
* @param context the context
* @returns true(1) on success, otherwise false(0)
*/
int libp2p_routing_dht_upgrade_stream(struct SessionContext* context);
/**
* Handle a client requesting an upgrade to the DHT protocol
* @param stream the stream
* @returns true(1) on success, otherwise false(0)
*/
int libp2p_routing_dht_handshake(struct Stream* stream);
/***
* Handle the incoming message. Handshake should have already
* been done. We should expect that the next read contains
* a protobuf'd kademlia message.
* @param stream the incoming stream
* @param protocol_context the protocol context
* @returns true(1) on success, otherwise false(0)
*/
int libp2p_routing_dht_handle_message(struct Stream* stream, struct DhtContext* protocol_context);
/***
* Send a kademlia message
* NOTE: this call upgrades the stream to /ipfs/kad/1.0.0
* @param context the context
* @param message the message
* @returns true(1) on success, false(0) otherwise
*/
int libp2p_routing_dht_send_message(struct SessionContext* sessionContext, struct KademliaMessage* message);
/**
* Attempt to receive a kademlia message
* NOTE: This call assumes that a send_message was sent
* @param sessionContext the context
* @param result where to put the results
* @returns true(1) on success, false(0) otherwise
*/
int libp2p_routing_dht_receive_message(struct SessionContext* sessionContext, struct KademliaMessage** result);
/**
* Used to send a message to the nearest x peers
*
* @param private_key the private key of the local peer
* @param peerstore the collection of peers
* @param datastore a connection to the datastore
* @param msg the message to send
* @returns true(1) if we sent to at least 1, false(0) otherwise
*/
int libp2p_routing_dht_send_message_nearest_x(const struct Dialer* dialer, struct Peerstore* peerstore,
struct Datastore* datastore, struct KademliaMessage* msg, int numToSend);