rgb-cln/daemon/routingrpc.c

170 lines
4.7 KiB
C

#include "jsonrpc.h"
#include "lightningd.h"
#include "log.h"
#include "routing.h"
static void json_add_route(struct command *cmd,
const char *buffer, const jsmntok_t *params)
{
jsmntok_t *srctok, *dsttok, *basetok, *vartok, *delaytok, *minblockstok;
struct pubkey src, dst;
u32 base, var, delay, minblocks;
if (!json_get_params(buffer, params,
"src", &srctok,
"dst", &dsttok,
"base", &basetok,
"var", &vartok,
"delay", &delaytok,
"minblocks", &minblockstok,
NULL)) {
command_fail(cmd, "Need src, dst, base, var, delay & minblocks");
return;
}
if (!pubkey_from_hexstr(buffer + srctok->start,
srctok->end - srctok->start, &src)) {
command_fail(cmd, "src %.*s not valid",
srctok->end - srctok->start,
buffer + srctok->start);
return;
}
if (!pubkey_from_hexstr(buffer + dsttok->start,
dsttok->end - dsttok->start, &dst)) {
command_fail(cmd, "dst %.*s not valid",
dsttok->end - dsttok->start,
buffer + dsttok->start);
return;
}
if (!json_tok_number(buffer, basetok, &base)
|| !json_tok_number(buffer, vartok, &var)
|| !json_tok_number(buffer, delaytok, &delay)
|| !json_tok_number(buffer, minblockstok, &minblocks)) {
command_fail(cmd,
"base, var, delay and minblocks must be numbers");
return;
}
add_connection(cmd->dstate->rstate, &src, &dst, base, var, delay, minblocks);
command_success(cmd, null_response(cmd));
}
static const struct json_command dev_add_route_command = {
"dev-add-route",
json_add_route,
"Add route from {src} to {dst}, {base} rate in msatoshi, {var} rate in msatoshi, {delay} blocks delay and {minblocks} minimum timeout",
"Returns an empty result on success"
};
AUTODATA(json_command, &dev_add_route_command);
static void json_getchannels(struct command *cmd,
const char *buffer, const jsmntok_t *params)
{
struct json_result *response = new_json_result(cmd);
struct node_map_iter it;
struct node *n;
struct node_map *nodes = cmd->dstate->rstate->nodes;
struct node_connection *c;
int num_conn, i;
json_object_start(response, NULL);
json_array_start(response, "channels");
for (n = node_map_first(nodes, &it); n; n = node_map_next(nodes, &it)) {
num_conn = tal_count(n->out);
for (i = 0; i < num_conn; i++){
c = n->out[i];
json_object_start(response, NULL);
json_add_pubkey(response, "from", &n->id);
json_add_pubkey(response, "to", &c->dst->id);
json_add_num(response, "base_fee", c->base_fee);
json_add_num(response, "proportional_fee", c->proportional_fee);
json_add_num(response, "expiry", c->delay);
json_add_bool(response, "active", c->active);
json_object_end(response);
}
}
json_array_end(response);
json_object_end(response);
command_success(cmd, response);
}
static const struct json_command getchannels_command = {
"getchannels",
json_getchannels,
"List all known channels.",
"Returns a 'channels' array with all known channels including their fees."
};
AUTODATA(json_command, &getchannels_command);
static void json_routefail(struct command *cmd,
const char *buffer, const jsmntok_t *params)
{
jsmntok_t *enabletok;
bool enable;
if (!json_get_params(buffer, params,
"enable", &enabletok,
NULL)) {
command_fail(cmd, "Need enable");
return;
}
if (!json_tok_bool(buffer, enabletok, &enable)) {
command_fail(cmd, "enable must be true or false");
return;
}
log_debug(cmd->dstate->base_log, "dev-routefail: routefail %s",
enable ? "enabled" : "disabled");
cmd->dstate->dev_never_routefail = !enable;
command_success(cmd, null_response(cmd));
}
static const struct json_command dev_routefail_command = {
"dev-routefail",
json_routefail,
"FAIL htlcs that we can't route if {enable}",
"Returns an empty result on success"
};
AUTODATA(json_command, &dev_routefail_command);
static void json_getnodes(struct command *cmd,
const char *buffer, const jsmntok_t *params)
{
struct json_result *response = new_json_result(cmd);
struct node *n;
struct node_map_iter i;
n = node_map_first(cmd->dstate->rstate->nodes, &i);
json_object_start(response, NULL);
json_array_start(response, "nodes");
while (n != NULL) {
json_object_start(response, NULL);
json_add_pubkey(response, "nodeid", &n->id);
json_add_num(response, "port", n->port);
if (!n->port)
json_add_null(response, "hostname");
else
json_add_string(response, "hostname", n->hostname);
json_object_end(response);
n = node_map_next(cmd->dstate->rstate->nodes, &i);
}
json_array_end(response);
json_object_end(response);
command_success(cmd, response);
}
static const struct json_command getnodes_command = {
"getnodes",
json_getnodes,
"List all known nodes in the network.",
"Returns a 'nodes' array"
};
AUTODATA(json_command, &getnodes_command);