mirror of
https://github.com/aljazceru/lightning.git
synced 2026-01-09 09:04:25 +01:00
gossipd: command to disconnect from a gossiping peer
lightning-cli disconnect <peer id>
This commit is contained in:
committed by
Christian Decker
parent
d8e764efa0
commit
0a1351fd51
@@ -1011,6 +1011,31 @@ static struct io_plan *hand_back_peer(struct io_conn *conn,
|
||||
read_returning_gossipfd, rpeer);
|
||||
}
|
||||
|
||||
static struct io_plan *disconnect_peer(struct io_conn *conn, struct daemon *daemon,
|
||||
const u8 *msg)
|
||||
{
|
||||
struct pubkey id;
|
||||
struct peer *peer;
|
||||
|
||||
if (!fromwire_gossipctl_peer_disconnect(msg, &id))
|
||||
master_badmsg(WIRE_GOSSIPCTL_PEER_DISCONNECT, msg);
|
||||
|
||||
peer = find_peer(daemon, &id);
|
||||
if (peer && peer->local) {
|
||||
/* This peer is local to this (gossipd) dameon */
|
||||
io_close(peer->local->conn);
|
||||
msg = towire_gossipctl_peer_disconnect_reply(msg);
|
||||
daemon_conn_send(&daemon->master, take(msg));
|
||||
} else {
|
||||
status_trace("disconnect_peer: peer %s %s",
|
||||
type_to_string(trc, struct pubkey, &id),
|
||||
!peer ? "not found" : "not local to this daemon");
|
||||
msg = towire_gossipctl_peer_disconnect_replyfail(msg);
|
||||
daemon_conn_send(&daemon->master, take(msg));
|
||||
}
|
||||
return daemon_conn_read_next(conn, &daemon->master);
|
||||
}
|
||||
|
||||
static struct io_plan *release_peer(struct io_conn *conn, struct daemon *daemon,
|
||||
const u8 *msg)
|
||||
{
|
||||
@@ -1976,6 +2001,9 @@ static struct io_plan *recv_req(struct io_conn *conn, struct daemon_conn *master
|
||||
case WIRE_GOSSIP_MARK_CHANNEL_UNROUTABLE:
|
||||
return handle_mark_channel_unroutable(conn, daemon, master->msg_in);
|
||||
|
||||
case WIRE_GOSSIPCTL_PEER_DISCONNECT:
|
||||
return disconnect_peer(conn, daemon, master->msg_in);
|
||||
|
||||
/* We send these, we don't receive them */
|
||||
case WIRE_GOSSIPCTL_RELEASE_PEER_REPLY:
|
||||
case WIRE_GOSSIPCTL_RELEASE_PEER_REPLYFAIL:
|
||||
@@ -1994,6 +2022,8 @@ static struct io_plan *recv_req(struct io_conn *conn, struct daemon_conn *master
|
||||
case WIRE_GOSSIP_SEND_GOSSIP:
|
||||
case WIRE_GOSSIP_LOCAL_ADD_CHANNEL:
|
||||
case WIRE_GOSSIP_GET_TXOUT:
|
||||
case WIRE_GOSSIPCTL_PEER_DISCONNECT_REPLY:
|
||||
case WIRE_GOSSIPCTL_PEER_DISCONNECT_REPLYFAIL:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -212,3 +212,13 @@ gossip_routing_failure,,channel_update,len*u8
|
||||
# (used in case of unparseable onion reply)
|
||||
gossip_mark_channel_unroutable,3022
|
||||
gossip_mark_channel_unroutable,,channel,struct short_channel_id
|
||||
|
||||
# master->gossipd: Request to disconnect from a peer.
|
||||
gossipctl_peer_disconnect,3023
|
||||
gossipctl_peer_disconnect,,id,struct pubkey
|
||||
|
||||
# Gossipd -> master: reply to gossip_peer_disconnect with peer id.
|
||||
gossipctl_peer_disconnect_reply,3123
|
||||
|
||||
# Gossipd -> master: reply to gossip_peer_disconnect if we couldn't find the peer.
|
||||
gossipctl_peer_disconnect_replyfail,3223
|
||||
|
||||
|
@@ -118,6 +118,7 @@ static unsigned gossip_msg(struct subd *gossip, const u8 *msg, const int *fds)
|
||||
case WIRE_GOSSIP_DISABLE_CHANNEL:
|
||||
case WIRE_GOSSIP_ROUTING_FAILURE:
|
||||
case WIRE_GOSSIP_MARK_CHANNEL_UNROUTABLE:
|
||||
case WIRE_GOSSIPCTL_PEER_DISCONNECT:
|
||||
/* This is a reply, so never gets through to here. */
|
||||
case WIRE_GOSSIP_GET_UPDATE_REPLY:
|
||||
case WIRE_GOSSIP_GETNODES_REPLY:
|
||||
@@ -128,6 +129,8 @@ static unsigned gossip_msg(struct subd *gossip, const u8 *msg, const int *fds)
|
||||
case WIRE_GOSSIP_RESOLVE_CHANNEL_REPLY:
|
||||
case WIRE_GOSSIPCTL_RELEASE_PEER_REPLY:
|
||||
case WIRE_GOSSIPCTL_RELEASE_PEER_REPLYFAIL:
|
||||
case WIRE_GOSSIPCTL_PEER_DISCONNECT_REPLY:
|
||||
case WIRE_GOSSIPCTL_PEER_DISCONNECT_REPLYFAIL:
|
||||
break;
|
||||
/* These are inter-daemon messages, not received by us */
|
||||
case WIRE_GOSSIP_LOCAL_ADD_CHANNEL:
|
||||
|
||||
@@ -875,6 +875,55 @@ void activate_peers(struct lightningd *ld)
|
||||
activate_peer(p);
|
||||
}
|
||||
|
||||
/* Peer has been released from gossip. */
|
||||
static void gossip_peer_disconnected (struct subd *gossip,
|
||||
const u8 *resp,
|
||||
const int *fds,
|
||||
struct command *cmd) {
|
||||
if (!fromwire_gossipctl_peer_disconnect_reply(resp)) {
|
||||
if (!fromwire_gossipctl_peer_disconnect_replyfail(resp))
|
||||
fatal("Gossip daemon gave invalid reply %s",
|
||||
tal_hex(gossip, resp));
|
||||
command_fail(cmd, "Peer not connected");
|
||||
} else {
|
||||
/* Successfully disconnected */
|
||||
command_success(cmd, null_response(cmd));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static void json_disconnect(struct command *cmd,
|
||||
const char *buffer, const jsmntok_t *params)
|
||||
{
|
||||
jsmntok_t *idtok;
|
||||
struct pubkey id;
|
||||
u8 *msg;
|
||||
|
||||
if (!json_get_params(cmd, buffer, params,
|
||||
"id", &idtok,
|
||||
NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!json_tok_pubkey(buffer, idtok, &id)) {
|
||||
command_fail(cmd, "id %.*s not valid",
|
||||
idtok->end - idtok->start,
|
||||
buffer + idtok->start);
|
||||
return;
|
||||
}
|
||||
|
||||
msg = towire_gossipctl_peer_disconnect(cmd, &id);
|
||||
subd_req(cmd, cmd->ld->gossip, msg, -1, 0, gossip_peer_disconnected, cmd);
|
||||
command_still_pending(cmd);
|
||||
}
|
||||
|
||||
static const struct json_command disconnect_command = {
|
||||
"disconnect",
|
||||
json_disconnect,
|
||||
"Disconnect from {id} that has previously been connected to using connect"
|
||||
};
|
||||
AUTODATA(json_command, &disconnect_command);
|
||||
|
||||
#if DEVELOPER
|
||||
static void json_sign_last_tx(struct command *cmd,
|
||||
const char *buffer, const jsmntok_t *params)
|
||||
|
||||
@@ -376,6 +376,15 @@ struct txowatch *watch_txo(const tal_t *ctx UNNEEDED,
|
||||
/* Generated stub for json_add_string_escape */
|
||||
void json_add_string_escape(struct json_result *result UNNEEDED, const char *fieldname UNNEEDED, const char *value UNNEEDED)
|
||||
{ fprintf(stderr, "json_add_string_escape called!\n"); abort(); }
|
||||
/* Generated stub for towire_gossipctl_peer_disconnect */
|
||||
u8 *towire_gossipctl_peer_disconnect(const tal_t *ctx UNNEEDED, const struct pubkey *id UNNEEDED)
|
||||
{ fprintf(stderr, "towire_gossipctl_peer_disconnect called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_gossipctl_peer_disconnect_reply */
|
||||
bool fromwire_gossipctl_peer_disconnect_reply(const void *p UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_gossipctl_peer_disconnect_reply called!\n"); abort(); }
|
||||
/* Generated stub for fromwire_gossipctl_peer_disconnect_replyfail*/
|
||||
bool fromwire_gossipctl_peer_disconnect_replyfail(const void *p UNNEEDED)
|
||||
{ fprintf(stderr, "fromwire_gossipctl_peer_disconnect_replyfail called!\n"); abort(); }
|
||||
/* AUTOGENERATED MOCKS END */
|
||||
|
||||
#if DEVELOPER
|
||||
|
||||
Reference in New Issue
Block a user