c-ipfs/routing/k_routing.c

104 lines
3.5 KiB
C

#include "ipfs/routing/routing.h"
#include "libp2p/routing/kademlia.h"
/**
* Routing using Kademlia and DHT
*
* The go version has "supernode" which is similar to this:
*/
/**
* Put a value in the datastore
* @param routing the struct that contains connection information
* @param key the key
* @param key_size the size of the key
* @param value the value
* @param value_size the size of the value
* @returns 0 on success, otherwise -1
*/
int ipfs_routing_kademlia_put_value(struct s_ipfs_routing* routing, char* key, size_t key_size, void* value, size_t value_size) {
return 0;
}
/**
* Get a value from the datastore
* @param 1 the struct that contains the connection information
* @param 2 the key to look for
* @param 3 the size of the key
* @param 4 a place to store the value
* @param 5 the size of the value
*/
int ipfs_routing_kademlia_get_value(struct s_ipfs_routing* routing, char* key, size_t key_size, void** value, size_t* value_size) {
return 0;
}
/**
* Find a provider
* @param routing the context
* @param key the key to what we're looking for
* @param key_size the size of the key
* @param results the results
* @param results_size the size of the results buffer
* @returns true(1) on success, otherwise false(0)
*/
int ipfs_routing_kademlia_find_providers(struct s_ipfs_routing* routing, char* key, size_t key_size, void* results, size_t* results_size) {
// see if I can provide it
// add my multiaddress if I can
// get a list of providers that are closer
return 0;
}
/**
* Find a peer
*/
int ipfs_routing_kademlia_find_peer(struct s_ipfs_routing* routing, char* param1, size_t param2, void* param3, size_t* param4) {
return 0;
}
int ipfs_routing_kademlia_provide(struct s_ipfs_routing* routing, char* param1, size_t param2) {
return 0;
}
// declared here so as to have the code in 1 place
int ipfs_routing_online_ping(struct s_ipfs_routing*, struct Libp2pMessage*);
/**
* Ping this instance
*/
int ipfs_routing_kademlia_ping(struct s_ipfs_routing* routing, struct Libp2pMessage* message) {
return ipfs_routing_online_ping(routing, message);
}
int ipfs_routing_kademlia_bootstrap(struct s_ipfs_routing* routing) {
return 0;
}
struct s_ipfs_routing* ipfs_routing_new_kademlia(struct IpfsNode* local_node, struct RsaPrivateKey* private_key, struct Stream* stream) {
char* kademlia_id = NULL;
// generate kademlia compatible id by getting last 20 chars of peer id
if (local_node->identity->peer_id == NULL || strlen(local_node->identity->peer_id) < 20) {
return NULL;
}
kademlia_id = &local_node->identity->peer_id[strlen(local_node->identity->peer_id)-20];
struct s_ipfs_routing* routing = (struct s_ipfs_routing*)malloc(sizeof(struct s_ipfs_routing));
if (routing != NULL) {
routing->local_node = local_node;
routing->sk = private_key;
routing->stream = stream;
routing->PutValue = ipfs_routing_kademlia_put_value;
routing->GetValue = ipfs_routing_kademlia_get_value;
routing->FindProviders = ipfs_routing_kademlia_find_providers;
routing->FindPeer = ipfs_routing_kademlia_find_peer;
routing->Provide = ipfs_routing_kademlia_provide;
routing->Ping = ipfs_routing_kademlia_ping;
routing->Bootstrap = ipfs_routing_kademlia_bootstrap;
}
// connect to nodes and listen for connections
struct MultiAddress* address = multiaddress_new_from_string(local_node->repo->config->addresses->api);
if (multiaddress_is_ip(address)) {
int port = multiaddress_get_ip_port(address);
int family = multiaddress_get_ip_family(address);
start_kademlia(port, family, kademlia_id, 10);
}
local_node->routing = routing;
return routing;
}