mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 07:04:22 +01:00
subdaemons: remove gossipd fd from per-peer daemons.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -45,9 +45,9 @@
|
|||||||
#include <wire/peer_wire.h>
|
#include <wire/peer_wire.h>
|
||||||
#include <wire/wire_sync.h>
|
#include <wire/wire_sync.h>
|
||||||
|
|
||||||
/* stdin == requests, 3 == peer, 4 = gossip, 5 = HSM */
|
/* stdin == requests, 3 == peer, 4 = HSM */
|
||||||
#define MASTER_FD STDIN_FILENO
|
#define MASTER_FD STDIN_FILENO
|
||||||
#define HSM_FD 5
|
#define HSM_FD 4
|
||||||
|
|
||||||
struct peer {
|
struct peer {
|
||||||
struct per_peer_state *pps;
|
struct per_peer_state *pps;
|
||||||
@@ -2132,13 +2132,12 @@ static void peer_in(struct peer *peer, const u8 *msg)
|
|||||||
{
|
{
|
||||||
enum peer_wire type = fromwire_peektype(msg);
|
enum peer_wire type = fromwire_peektype(msg);
|
||||||
|
|
||||||
if (handle_peer_gossip_or_error(peer->pps, &peer->channel_id, msg))
|
if (handle_peer_error(peer->pps, &peer->channel_id, msg))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Must get funding_locked before almost anything. */
|
/* Must get funding_locked before almost anything. */
|
||||||
if (!peer->funding_locked[REMOTE]) {
|
if (!peer->funding_locked[REMOTE]) {
|
||||||
if (type != WIRE_FUNDING_LOCKED
|
if (type != WIRE_FUNDING_LOCKED
|
||||||
&& type != WIRE_PONG
|
|
||||||
&& type != WIRE_SHUTDOWN
|
&& type != WIRE_SHUTDOWN
|
||||||
/* We expect these for v2 !! */
|
/* We expect these for v2 !! */
|
||||||
&& type != WIRE_TX_SIGNATURES
|
&& type != WIRE_TX_SIGNATURES
|
||||||
@@ -2215,7 +2214,7 @@ static void peer_in(struct peer *peer, const u8 *msg)
|
|||||||
handle_unexpected_reestablish(peer, msg);
|
handle_unexpected_reestablish(peer, msg);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* These are all swallowed by handle_peer_gossip_or_error */
|
/* These are all swallowed by connectd */
|
||||||
case WIRE_CHANNEL_ANNOUNCEMENT:
|
case WIRE_CHANNEL_ANNOUNCEMENT:
|
||||||
case WIRE_CHANNEL_UPDATE:
|
case WIRE_CHANNEL_UPDATE:
|
||||||
case WIRE_NODE_ANNOUNCEMENT:
|
case WIRE_NODE_ANNOUNCEMENT:
|
||||||
@@ -2798,7 +2797,7 @@ skip_tlvs:
|
|||||||
do {
|
do {
|
||||||
clean_tmpctx();
|
clean_tmpctx();
|
||||||
msg = peer_read(tmpctx, peer->pps);
|
msg = peer_read(tmpctx, peer->pps);
|
||||||
} while (handle_peer_gossip_or_error(peer->pps, &peer->channel_id, msg) ||
|
} while (handle_peer_error(peer->pps, &peer->channel_id, msg) ||
|
||||||
capture_premature_msg(&premature_msgs, msg));
|
capture_premature_msg(&premature_msgs, msg));
|
||||||
|
|
||||||
got_reestablish:
|
got_reestablish:
|
||||||
@@ -3752,9 +3751,9 @@ static void init_channel(struct peer *peer)
|
|||||||
tal_dup(peer, struct penalty_base, &pbases[i]));
|
tal_dup(peer, struct penalty_base, &pbases[i]));
|
||||||
tal_free(pbases);
|
tal_free(pbases);
|
||||||
|
|
||||||
/* stdin == requests, 3 == peer, 4 = gossip */
|
/* stdin == requests, 3 == peer */
|
||||||
peer->pps = new_per_peer_state(peer);
|
peer->pps = new_per_peer_state(peer);
|
||||||
per_peer_state_set_fds(peer->pps, 3, 4);
|
per_peer_state_set_fd(peer->pps, 3);
|
||||||
|
|
||||||
status_debug("init %s: remote_per_commit = %s, old_remote_per_commit = %s"
|
status_debug("init %s: remote_per_commit = %s, old_remote_per_commit = %s"
|
||||||
" next_idx_local = %"PRIu64
|
" next_idx_local = %"PRIu64
|
||||||
@@ -3895,11 +3894,10 @@ int main(int argc, char *argv[])
|
|||||||
FD_ZERO(&fds_in);
|
FD_ZERO(&fds_in);
|
||||||
FD_SET(MASTER_FD, &fds_in);
|
FD_SET(MASTER_FD, &fds_in);
|
||||||
FD_SET(peer->pps->peer_fd, &fds_in);
|
FD_SET(peer->pps->peer_fd, &fds_in);
|
||||||
FD_SET(peer->pps->gossip_fd, &fds_in);
|
|
||||||
|
|
||||||
FD_ZERO(&fds_out);
|
FD_ZERO(&fds_out);
|
||||||
FD_SET(peer->pps->peer_fd, &fds_out);
|
FD_SET(peer->pps->peer_fd, &fds_out);
|
||||||
nfds = peer->pps->gossip_fd+1;
|
nfds = peer->pps->peer_fd+1;
|
||||||
|
|
||||||
while (!shutdown_complete(peer)) {
|
while (!shutdown_complete(peer)) {
|
||||||
struct timemono first;
|
struct timemono first;
|
||||||
@@ -3958,13 +3956,6 @@ int main(int argc, char *argv[])
|
|||||||
/* This could take forever, but who cares? */
|
/* This could take forever, but who cares? */
|
||||||
msg = peer_read(tmpctx, peer->pps);
|
msg = peer_read(tmpctx, peer->pps);
|
||||||
peer_in(peer, msg);
|
peer_in(peer, msg);
|
||||||
} else if (FD_ISSET(peer->pps->gossip_fd, &rfds)) {
|
|
||||||
msg = wire_sync_read(tmpctx, peer->pps->gossip_fd);
|
|
||||||
/* Gossipd hangs up on us to kill us when a new
|
|
||||||
* connection comes in. */
|
|
||||||
if (!msg)
|
|
||||||
peer_failed_connection_lost();
|
|
||||||
handle_gossip_msg(peer->pps, take(msg));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,9 +29,9 @@
|
|||||||
#include <wire/peer_wire.h>
|
#include <wire/peer_wire.h>
|
||||||
#include <wire/wire_sync.h>
|
#include <wire/wire_sync.h>
|
||||||
|
|
||||||
/* stdin == requests, 3 == peer, 4 = gossip, 5 = hsmd */
|
/* stdin == requests, 3 == peer, 4 = hsmd */
|
||||||
#define REQ_FD STDIN_FILENO
|
#define REQ_FD STDIN_FILENO
|
||||||
#define HSM_FD 5
|
#define HSM_FD 4
|
||||||
|
|
||||||
static void notify(enum log_level level, const char *fmt, ...)
|
static void notify(enum log_level level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
@@ -117,15 +117,10 @@ static u8 *closing_read_peer_msg(const tal_t *ctx,
|
|||||||
{
|
{
|
||||||
for (;;) {
|
for (;;) {
|
||||||
u8 *msg;
|
u8 *msg;
|
||||||
bool from_gossipd;
|
|
||||||
|
|
||||||
clean_tmpctx();
|
clean_tmpctx();
|
||||||
msg = peer_or_gossip_sync_read(ctx, pps, &from_gossipd);
|
msg = peer_read(ctx, pps);
|
||||||
if (from_gossipd) {
|
if (!handle_peer_error(pps, channel_id, msg))
|
||||||
handle_gossip_msg(pps, take(msg));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!handle_peer_gossip_or_error(pps, channel_id, msg))
|
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -892,9 +887,9 @@ int main(int argc, char *argv[])
|
|||||||
&wrong_funding))
|
&wrong_funding))
|
||||||
master_badmsg(WIRE_CLOSINGD_INIT, msg);
|
master_badmsg(WIRE_CLOSINGD_INIT, msg);
|
||||||
|
|
||||||
/* stdin == requests, 3 == peer, 4 = gossip, 5 = hsmd */
|
/* stdin == requests, 3 == peer, 4 = hsmd */
|
||||||
pps = notleak(new_per_peer_state(ctx));
|
pps = notleak(new_per_peer_state(ctx));
|
||||||
per_peer_state_set_fds(pps, 3, 4);
|
per_peer_state_set_fd(pps, 3);
|
||||||
|
|
||||||
funding_wscript = bitcoin_redeem_2of2(ctx,
|
funding_wscript = bitcoin_redeem_2of2(ctx,
|
||||||
&funding_pubkey[LOCAL],
|
&funding_pubkey[LOCAL],
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ peer_fatal_continue(const u8 *msg TAKES, const struct per_peer_state *pps)
|
|||||||
status_send(msg);
|
status_send(msg);
|
||||||
|
|
||||||
status_send_fd(pps->peer_fd);
|
status_send_fd(pps->peer_fd);
|
||||||
status_send_fd(pps->gossip_fd);
|
|
||||||
exit(0x80 | (reason & 0xFF));
|
exit(0x80 | (reason & 0xFF));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,39 +12,25 @@ static void destroy_per_peer_state(struct per_peer_state *pps)
|
|||||||
{
|
{
|
||||||
if (pps->peer_fd != -1)
|
if (pps->peer_fd != -1)
|
||||||
close(pps->peer_fd);
|
close(pps->peer_fd);
|
||||||
if (pps->gossip_fd != -1)
|
|
||||||
close(pps->gossip_fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct per_peer_state *new_per_peer_state(const tal_t *ctx)
|
struct per_peer_state *new_per_peer_state(const tal_t *ctx)
|
||||||
{
|
{
|
||||||
struct per_peer_state *pps = tal(ctx, struct per_peer_state);
|
struct per_peer_state *pps = tal(ctx, struct per_peer_state);
|
||||||
|
|
||||||
pps->peer_fd = pps->gossip_fd = -1;
|
pps->peer_fd = -1;
|
||||||
tal_add_destructor(pps, destroy_per_peer_state);
|
tal_add_destructor(pps, destroy_per_peer_state);
|
||||||
return pps;
|
return pps;
|
||||||
}
|
}
|
||||||
|
|
||||||
void per_peer_state_set_fds(struct per_peer_state *pps,
|
void per_peer_state_set_fd(struct per_peer_state *pps, int peer_fd)
|
||||||
int peer_fd, int gossip_fd)
|
|
||||||
{
|
{
|
||||||
assert(pps->peer_fd == -1);
|
assert(pps->peer_fd == -1);
|
||||||
assert(pps->gossip_fd == -1);
|
|
||||||
pps->peer_fd = peer_fd;
|
pps->peer_fd = peer_fd;
|
||||||
pps->gossip_fd = gossip_fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void per_peer_state_set_fds_arr(struct per_peer_state *pps, const int *fds)
|
|
||||||
{
|
|
||||||
/* We expect 2 fds. */
|
|
||||||
assert(tal_count(fds) == 2);
|
|
||||||
per_peer_state_set_fds(pps, fds[0], fds[1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void per_peer_state_fdpass_send(int fd, const struct per_peer_state *pps)
|
void per_peer_state_fdpass_send(int fd, const struct per_peer_state *pps)
|
||||||
{
|
{
|
||||||
assert(pps->peer_fd != -1);
|
assert(pps->peer_fd != -1);
|
||||||
assert(pps->gossip_fd != -1);
|
|
||||||
fdpass_send(fd, pps->peer_fd);
|
fdpass_send(fd, pps->peer_fd);
|
||||||
fdpass_send(fd, pps->gossip_fd);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,19 +9,15 @@
|
|||||||
/* Things we hand between daemons to talk to peers. */
|
/* Things we hand between daemons to talk to peers. */
|
||||||
struct per_peer_state {
|
struct per_peer_state {
|
||||||
/* If not -1, closed on freeing */
|
/* If not -1, closed on freeing */
|
||||||
int peer_fd, gossip_fd;
|
int peer_fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Allocate a new per-peer state and add destructor to close fds if set;
|
/* Allocate a new per-peer state and add destructor to close fds if set;
|
||||||
* sets fds to -1. */
|
* sets peer_fd to -1. */
|
||||||
struct per_peer_state *new_per_peer_state(const tal_t *ctx);
|
struct per_peer_state *new_per_peer_state(const tal_t *ctx);
|
||||||
|
|
||||||
/* Initialize the fds (must be -1 previous) */
|
/* Initialize the fds (must be -1 previous) */
|
||||||
void per_peer_state_set_fds(struct per_peer_state *pps,
|
void per_peer_state_set_fd(struct per_peer_state *pps, int peer_fd);
|
||||||
int peer_fd, int gossip_fd);
|
|
||||||
|
|
||||||
/* Array version of above: tal_count(fds) must be 2 */
|
|
||||||
void per_peer_state_set_fds_arr(struct per_peer_state *pps, const int *fds);
|
|
||||||
|
|
||||||
void per_peer_state_fdpass_send(int fd, const struct per_peer_state *pps);
|
void per_peer_state_fdpass_send(int fd, const struct per_peer_state *pps);
|
||||||
|
|
||||||
|
|||||||
@@ -12,39 +12,6 @@
|
|||||||
#include <wire/peer_wire.h>
|
#include <wire/peer_wire.h>
|
||||||
#include <wire/wire_sync.h>
|
#include <wire/wire_sync.h>
|
||||||
|
|
||||||
u8 *peer_or_gossip_sync_read(const tal_t *ctx,
|
|
||||||
struct per_peer_state *pps,
|
|
||||||
bool *from_gossipd)
|
|
||||||
{
|
|
||||||
fd_set readfds;
|
|
||||||
u8 *msg;
|
|
||||||
|
|
||||||
FD_ZERO(&readfds);
|
|
||||||
FD_SET(pps->peer_fd, &readfds);
|
|
||||||
FD_SET(pps->gossip_fd, &readfds);
|
|
||||||
|
|
||||||
if (select(pps->peer_fd > pps->gossip_fd
|
|
||||||
? pps->peer_fd + 1 : pps->gossip_fd + 1,
|
|
||||||
&readfds, NULL, NULL, NULL) <= 0) {
|
|
||||||
status_failed(STATUS_FAIL_GOSSIP_IO,
|
|
||||||
"select failed?: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FD_ISSET(pps->peer_fd, &readfds)) {
|
|
||||||
msg = peer_read(ctx, pps);
|
|
||||||
*from_gossipd = false;
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
msg = wire_sync_read(ctx, pps->gossip_fd);
|
|
||||||
if (!msg)
|
|
||||||
status_failed(STATUS_FAIL_GOSSIP_IO,
|
|
||||||
"Error reading gossip msg: %s",
|
|
||||||
strerror(errno));
|
|
||||||
*from_gossipd = true;
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_peer_error(const tal_t *ctx, const u8 *msg,
|
bool is_peer_error(const tal_t *ctx, const u8 *msg,
|
||||||
const struct channel_id *channel_id,
|
const struct channel_id *channel_id,
|
||||||
char **desc, bool *warning)
|
char **desc, bool *warning)
|
||||||
@@ -94,70 +61,23 @@ bool is_wrong_channel(const u8 *msg, const struct channel_id *expected,
|
|||||||
return !channel_id_eq(expected, actual);
|
return !channel_id_eq(expected, actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_gossip_msg(struct per_peer_state *pps, const u8 *msg TAKES)
|
bool handle_peer_error(struct per_peer_state *pps,
|
||||||
{
|
|
||||||
u8 *gossip;
|
|
||||||
|
|
||||||
/* It's a raw gossip msg: this copies or takes() */
|
|
||||||
gossip = tal_dup_talarr(tmpctx, u8, msg);
|
|
||||||
|
|
||||||
/* Gossipd can send us gossip messages, OR warnings */
|
|
||||||
if (fromwire_peektype(gossip) == WIRE_WARNING) {
|
|
||||||
peer_write(pps, gossip);
|
|
||||||
peer_failed_connection_lost();
|
|
||||||
} else {
|
|
||||||
peer_write(pps, gossip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool handle_peer_gossip_or_error(struct per_peer_state *pps,
|
|
||||||
const struct channel_id *channel_id,
|
const struct channel_id *channel_id,
|
||||||
const u8 *msg TAKES)
|
const u8 *msg TAKES)
|
||||||
{
|
{
|
||||||
char *err;
|
char *err;
|
||||||
bool warning;
|
bool warning;
|
||||||
u8 *pong;
|
|
||||||
|
|
||||||
#if DEVELOPER
|
|
||||||
/* Any odd-typed unknown message is handled by the caller, so if we
|
|
||||||
* find one here it's an error. */
|
|
||||||
assert(!is_unknown_msg_discardable(msg));
|
|
||||||
#else
|
|
||||||
/* BOLT #1:
|
|
||||||
*
|
|
||||||
* A receiving node:
|
|
||||||
* - upon receiving a message of _odd_, unknown type:
|
|
||||||
* - MUST ignore the received message.
|
|
||||||
*/
|
|
||||||
if (is_unknown_msg_discardable(msg))
|
|
||||||
goto handled;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (check_ping_make_pong(NULL, msg, &pong)) {
|
|
||||||
if (pong)
|
|
||||||
peer_write(pps, take(pong));
|
|
||||||
return true;
|
|
||||||
} else if (is_msg_for_gossipd(msg)) {
|
|
||||||
wire_sync_write(pps->gossip_fd, msg);
|
|
||||||
/* wire_sync_write takes, so don't take again. */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_peer_error(tmpctx, msg, channel_id, &err, &warning)) {
|
if (is_peer_error(tmpctx, msg, channel_id, &err, &warning)) {
|
||||||
/* Ignore unknown channel errors. */
|
/* Ignore unknown channel errors. */
|
||||||
if (!err)
|
if (!err) {
|
||||||
goto handled;
|
|
||||||
|
|
||||||
/* We hang up when a warning is received. */
|
|
||||||
peer_failed_received_errmsg(pps, err, channel_id, warning);
|
|
||||||
|
|
||||||
goto handled;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
handled:
|
|
||||||
if (taken(msg))
|
if (taken(msg))
|
||||||
tal_free(msg);
|
tal_free(msg);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We hang up when a warning is received. */
|
||||||
|
peer_failed_received_errmsg(pps, err, channel_id, warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,25 +8,6 @@ struct crypto_state;
|
|||||||
struct channel_id;
|
struct channel_id;
|
||||||
struct per_peer_state;
|
struct per_peer_state;
|
||||||
|
|
||||||
/**
|
|
||||||
* peer_or_gossip_sync_read - read a peer message, or maybe a gossip msg.
|
|
||||||
* @ctx: context to allocate return packet from.
|
|
||||||
* @pps: the per-peer peer state and fds
|
|
||||||
* @from_gossipd: true if the msg was from gossipd, otherwise false.
|
|
||||||
*
|
|
||||||
* Will call peer_failed_connection_lost() or
|
|
||||||
* status_failed(STATUS_FAIL_GOSSIP_IO) or return a message.
|
|
||||||
*
|
|
||||||
* Usually, you should call handle_gossip_msg if *@from_gossipd is
|
|
||||||
* true, otherwise if is_peer_error() handle the error, otherwise if
|
|
||||||
* is_msg_for_gossipd() then send to gossipd, otherwise if is
|
|
||||||
* is_wrong_channel() send that as a reply. Otherwise it should be
|
|
||||||
* a valid message.
|
|
||||||
*/
|
|
||||||
u8 *peer_or_gossip_sync_read(const tal_t *ctx,
|
|
||||||
struct per_peer_state *pps,
|
|
||||||
bool *from_gossipd);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* is_peer_error - if it's an error, describe if it applies to this channel.
|
* is_peer_error - if it's an error, describe if it applies to this channel.
|
||||||
* @ctx: context to allocate return from.
|
* @ctx: context to allocate return from.
|
||||||
@@ -55,26 +36,15 @@ bool is_wrong_channel(const u8 *msg, const struct channel_id *expected,
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* handle_peer_gossip_or_error - simple handler for all the above cases.
|
* handle_peer_error - simple handler for errors
|
||||||
* @pps: per-peer state.
|
* @pps: per-peer state.
|
||||||
* @channel_id: the channel id of the current channel.
|
* @channel_id: the channel id of the current channel.
|
||||||
* @msg: the peer message (only taken if returns true).
|
* @msg: the peer message (only taken if returns true).
|
||||||
*
|
*
|
||||||
* This returns true if it handled the packet: a gossip packet (forwarded
|
* This returns true if it handled the packet.
|
||||||
* to gossipd), or an error packet (causes peer_failed_received_errmsg or
|
|
||||||
* ignored), or a ping (may reply with pong).
|
|
||||||
*/
|
*/
|
||||||
bool handle_peer_gossip_or_error(struct per_peer_state *pps,
|
bool handle_peer_error(struct per_peer_state *pps,
|
||||||
const struct channel_id *channel_id,
|
const struct channel_id *channel_id,
|
||||||
const u8 *msg TAKES);
|
const u8 *msg TAKES);
|
||||||
|
|
||||||
/**
|
|
||||||
* handle_timestamp_filter - deal with timestamp filter requests.
|
|
||||||
* @pps: per-peer state.
|
|
||||||
* @msg: the peer message (only taken if returns true).
|
|
||||||
*/
|
|
||||||
bool handle_timestamp_filter(struct per_peer_state *pps, const u8 *msg TAKES);
|
|
||||||
|
|
||||||
/* We got this message from gossipd: forward/quit as it asks. */
|
|
||||||
void handle_gossip_msg(struct per_peer_state *pps, const u8 *msg TAKES);
|
|
||||||
#endif /* LIGHTNING_COMMON_READ_PEER_MSG_H */
|
#endif /* LIGHTNING_COMMON_READ_PEER_MSG_H */
|
||||||
|
|||||||
@@ -336,6 +336,8 @@ static struct io_plan *peer_reconnected(struct io_conn *conn,
|
|||||||
/*~ When we free a peer, we remove it from the daemon's hashtable */
|
/*~ When we free a peer, we remove it from the daemon's hashtable */
|
||||||
static void destroy_peer(struct peer *peer, struct daemon *daemon)
|
static void destroy_peer(struct peer *peer, struct daemon *daemon)
|
||||||
{
|
{
|
||||||
|
if (peer->gossip_fd >= 0)
|
||||||
|
close(peer->gossip_fd);
|
||||||
peer_htable_del(&daemon->peers, peer);
|
peer_htable_del(&daemon->peers, peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,7 +397,7 @@ struct io_plan *peer_connected(struct io_conn *conn,
|
|||||||
struct peer *peer;
|
struct peer *peer;
|
||||||
int unsup;
|
int unsup;
|
||||||
size_t depender, missing;
|
size_t depender, missing;
|
||||||
int subd_fd, gossip_fd;
|
int subd_fd;
|
||||||
|
|
||||||
peer = peer_htable_get(&daemon->peers, id);
|
peer = peer_htable_get(&daemon->peers, id);
|
||||||
if (peer)
|
if (peer)
|
||||||
@@ -454,8 +456,8 @@ struct io_plan *peer_connected(struct io_conn *conn,
|
|||||||
return io_close(conn);
|
return io_close(conn);
|
||||||
|
|
||||||
/* If gossipd can't give us a file descriptor, we give up connecting. */
|
/* If gossipd can't give us a file descriptor, we give up connecting. */
|
||||||
gossip_fd = get_gossipfd(daemon, id, their_features);
|
peer->gossip_fd = get_gossipfd(daemon, id, their_features);
|
||||||
if (gossip_fd < 0) {
|
if (peer->gossip_fd < 0) {
|
||||||
close(subd_fd);
|
close(subd_fd);
|
||||||
return tal_free(peer);
|
return tal_free(peer);
|
||||||
}
|
}
|
||||||
@@ -469,10 +471,9 @@ struct io_plan *peer_connected(struct io_conn *conn,
|
|||||||
|
|
||||||
/*~ daemon_conn is a message queue for inter-daemon communication: we
|
/*~ daemon_conn is a message queue for inter-daemon communication: we
|
||||||
* queue up the `connect_peer_connected` message to tell lightningd
|
* queue up the `connect_peer_connected` message to tell lightningd
|
||||||
* we have connected, and give the peer and gossip fds. */
|
* we have connected, and give the peer fd. */
|
||||||
daemon_conn_send(daemon->master, take(msg));
|
daemon_conn_send(daemon->master, take(msg));
|
||||||
daemon_conn_send_fd(daemon->master, subd_fd);
|
daemon_conn_send_fd(daemon->master, subd_fd);
|
||||||
daemon_conn_send_fd(daemon->master, gossip_fd);
|
|
||||||
|
|
||||||
/*~ Now we set up this connection to read/write from subd */
|
/*~ Now we set up this connection to read/write from subd */
|
||||||
return multiplex_peer_setup(conn, peer);
|
return multiplex_peer_setup(conn, peer);
|
||||||
@@ -1894,20 +1895,19 @@ static void peer_final_msg(struct io_conn *conn,
|
|||||||
struct peer *peer;
|
struct peer *peer;
|
||||||
struct node_id id;
|
struct node_id id;
|
||||||
u8 *finalmsg;
|
u8 *finalmsg;
|
||||||
|
int peer_fd;
|
||||||
|
|
||||||
if (!fromwire_connectd_peer_final_msg(tmpctx, msg, &id, &finalmsg))
|
if (!fromwire_connectd_peer_final_msg(tmpctx, msg, &id, &finalmsg))
|
||||||
master_badmsg(WIRE_CONNECTD_PEER_FINAL_MSG, msg);
|
master_badmsg(WIRE_CONNECTD_PEER_FINAL_MSG, msg);
|
||||||
|
|
||||||
/* Get the peer_fd and gossip_fd for this peer: we don't need them. */
|
/* Get the peer_fd for this peer: we don't need it though! */
|
||||||
io_fd_block(io_conn_fd(conn), true);
|
io_fd_block(io_conn_fd(conn), true);
|
||||||
for (size_t i = 0; i < 2; i++) {
|
peer_fd = fdpass_recv(io_conn_fd(conn));
|
||||||
int fd = fdpass_recv(io_conn_fd(conn));
|
if (peer_fd == -1)
|
||||||
if (fd == -1)
|
|
||||||
status_failed(STATUS_FAIL_MASTER_IO,
|
status_failed(STATUS_FAIL_MASTER_IO,
|
||||||
"Getting fd %zu after peer_final_msg: %s",
|
"Getting peer fd after peer_final_msg: %s",
|
||||||
i, strerror(errno));
|
strerror(errno));
|
||||||
close(fd);
|
close(peer_fd);
|
||||||
}
|
|
||||||
io_fd_block(io_conn_fd(conn), false);
|
io_fd_block(io_conn_fd(conn), false);
|
||||||
|
|
||||||
/* This can happen if peer hung up on us. */
|
/* This can happen if peer hung up on us. */
|
||||||
|
|||||||
@@ -81,6 +81,9 @@ struct peer {
|
|||||||
/* Random ping timer, to detect dead connections. */
|
/* Random ping timer, to detect dead connections. */
|
||||||
struct oneshot *ping_timer;
|
struct oneshot *ping_timer;
|
||||||
|
|
||||||
|
/* FIXME: remove! */
|
||||||
|
int gossip_fd;
|
||||||
|
|
||||||
#if DEVELOPER
|
#if DEVELOPER
|
||||||
bool dev_read_enabled;
|
bool dev_read_enabled;
|
||||||
/* If non-NULL, this counts down; 0 means disable */
|
/* If non-NULL, this counts down; 0 means disable */
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ msgdata,connectd_connect_failed,failreason,wirestring,
|
|||||||
msgdata,connectd_connect_failed,seconds_to_delay,u32,
|
msgdata,connectd_connect_failed,seconds_to_delay,u32,
|
||||||
msgdata,connectd_connect_failed,addrhint,?wireaddr_internal,
|
msgdata,connectd_connect_failed,addrhint,?wireaddr_internal,
|
||||||
|
|
||||||
# Connectd -> master: we got a peer. Three fds: peer, gossip and gossip_store
|
# Connectd -> master: we got a peer. Plus fd for peer daemon
|
||||||
msgtype,connectd_peer_connected,2002
|
msgtype,connectd_peer_connected,2002
|
||||||
msgdata,connectd_peer_connected,id,node_id,
|
msgdata,connectd_peer_connected,id,node_id,
|
||||||
msgdata,connectd_peer_connected,addr,wireaddr_internal,
|
msgdata,connectd_peer_connected,addr,wireaddr_internal,
|
||||||
@@ -72,7 +72,7 @@ msgdata,connectd_peer_connected,features,u8,flen
|
|||||||
msgtype,connectd_peer_disconnected,2015
|
msgtype,connectd_peer_disconnected,2015
|
||||||
msgdata,connectd_peer_disconnected,id,node_id,
|
msgdata,connectd_peer_disconnected,id,node_id,
|
||||||
|
|
||||||
# master -> connectd: give message to peer and disconnect. Three fds: peer, gossip and gossip_store
|
# master -> connectd: give message to peer and disconnect. Plus fd for peer
|
||||||
msgtype,connectd_peer_final_msg,2003
|
msgtype,connectd_peer_final_msg,2003
|
||||||
msgdata,connectd_peer_final_msg,id,node_id,
|
msgdata,connectd_peer_final_msg,id,node_id,
|
||||||
msgdata,connectd_peer_final_msg,len,u16,
|
msgdata,connectd_peer_final_msg,len,u16,
|
||||||
|
|||||||
|
@@ -506,9 +506,9 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
|
|||||||
peer_got_shutdown(sd->channel, msg);
|
peer_got_shutdown(sd->channel, msg);
|
||||||
break;
|
break;
|
||||||
case WIRE_CHANNELD_SHUTDOWN_COMPLETE:
|
case WIRE_CHANNELD_SHUTDOWN_COMPLETE:
|
||||||
/* We expect 2 fds. */
|
/* We expect 1 fd. */
|
||||||
if (!fds)
|
if (!fds)
|
||||||
return 2;
|
return 1;
|
||||||
peer_start_closingd_after_shutdown(sd->channel, msg, fds);
|
peer_start_closingd_after_shutdown(sd->channel, msg, fds);
|
||||||
break;
|
break;
|
||||||
case WIRE_CHANNELD_FAIL_FALLEN_BEHIND:
|
case WIRE_CHANNELD_FAIL_FALLEN_BEHIND:
|
||||||
@@ -603,7 +603,6 @@ void peer_start_channeld(struct channel *channel,
|
|||||||
channel_errmsg,
|
channel_errmsg,
|
||||||
channel_set_billboard,
|
channel_set_billboard,
|
||||||
take(&peer_fd->fd),
|
take(&peer_fd->fd),
|
||||||
take(&peer_fd->gossip_fd),
|
|
||||||
take(&hsmfd), NULL));
|
take(&hsmfd), NULL));
|
||||||
|
|
||||||
if (!channel->owner) {
|
if (!channel->owner) {
|
||||||
|
|||||||
@@ -341,8 +341,7 @@ static unsigned closing_msg(struct subd *sd, const u8 *msg, const int *fds UNUSE
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void peer_start_closingd(struct channel *channel,
|
void peer_start_closingd(struct channel *channel, struct peer_fd *peer_fd)
|
||||||
struct peer_fd *peer_fd)
|
|
||||||
{
|
{
|
||||||
u8 *initmsg;
|
u8 *initmsg;
|
||||||
u32 min_feerate, feerate, *max_feerate;
|
u32 min_feerate, feerate, *max_feerate;
|
||||||
@@ -372,7 +371,6 @@ void peer_start_closingd(struct channel *channel,
|
|||||||
channel_errmsg,
|
channel_errmsg,
|
||||||
channel_set_billboard,
|
channel_set_billboard,
|
||||||
take(&peer_fd->fd),
|
take(&peer_fd->fd),
|
||||||
take(&peer_fd->gossip_fd),
|
|
||||||
take(&hsmfd),
|
take(&hsmfd),
|
||||||
NULL));
|
NULL));
|
||||||
|
|
||||||
|
|||||||
@@ -438,9 +438,9 @@ static unsigned connectd_msg(struct subd *connectd, const u8 *msg, const int *fd
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WIRE_CONNECTD_PEER_CONNECTED:
|
case WIRE_CONNECTD_PEER_CONNECTED:
|
||||||
if (tal_count(fds) != 2)
|
if (tal_count(fds) != 1)
|
||||||
return 2;
|
return 1;
|
||||||
peer_connected(connectd->ld, msg, fds[0], fds[1]);
|
peer_connected(connectd->ld, msg, fds[0]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WIRE_CONNECTD_CONNECT_FAILED:
|
case WIRE_CONNECTD_CONNECT_FAILED:
|
||||||
|
|||||||
@@ -2994,16 +2994,16 @@ static unsigned int dual_opend_msg(struct subd *dualopend,
|
|||||||
handle_dry_run_finished(dualopend, msg);
|
handle_dry_run_finished(dualopend, msg);
|
||||||
return 0;
|
return 0;
|
||||||
case WIRE_DUALOPEND_CHANNEL_LOCKED:
|
case WIRE_DUALOPEND_CHANNEL_LOCKED:
|
||||||
if (tal_count(fds) != 2)
|
if (tal_count(fds) != 1)
|
||||||
return 2;
|
return 1;
|
||||||
handle_channel_locked(dualopend, fds, msg);
|
handle_channel_locked(dualopend, fds, msg);
|
||||||
return 0;
|
return 0;
|
||||||
case WIRE_DUALOPEND_GOT_SHUTDOWN:
|
case WIRE_DUALOPEND_GOT_SHUTDOWN:
|
||||||
handle_peer_wants_to_close(dualopend, msg);
|
handle_peer_wants_to_close(dualopend, msg);
|
||||||
return 0;
|
return 0;
|
||||||
case WIRE_DUALOPEND_SHUTDOWN_COMPLETE:
|
case WIRE_DUALOPEND_SHUTDOWN_COMPLETE:
|
||||||
if (tal_count(fds) != 2)
|
if (tal_count(fds) != 1)
|
||||||
return 2;
|
return 1;
|
||||||
handle_channel_closed(dualopend, fds, msg);
|
handle_channel_closed(dualopend, fds, msg);
|
||||||
return 0;
|
return 0;
|
||||||
case WIRE_DUALOPEND_FAIL_FALLEN_BEHIND:
|
case WIRE_DUALOPEND_FAIL_FALLEN_BEHIND:
|
||||||
@@ -3230,7 +3230,6 @@ static void start_fresh_dualopend(struct peer *peer,
|
|||||||
channel_errmsg,
|
channel_errmsg,
|
||||||
channel_set_billboard,
|
channel_set_billboard,
|
||||||
take(&peer_fd->fd),
|
take(&peer_fd->fd),
|
||||||
take(&peer_fd->gossip_fd),
|
|
||||||
take(&hsmfd), NULL);
|
take(&hsmfd), NULL);
|
||||||
|
|
||||||
if (!channel->owner) {
|
if (!channel->owner) {
|
||||||
@@ -3297,7 +3296,6 @@ void peer_restart_dualopend(struct peer *peer,
|
|||||||
channel_errmsg,
|
channel_errmsg,
|
||||||
channel_set_billboard,
|
channel_set_billboard,
|
||||||
take(&peer_fd->fd),
|
take(&peer_fd->fd),
|
||||||
take(&peer_fd->gossip_fd),
|
|
||||||
take(&hsmfd), NULL));
|
take(&hsmfd), NULL));
|
||||||
if (!channel->owner) {
|
if (!channel->owner) {
|
||||||
log_broken(channel->log, "Could not subdaemon channel: %s",
|
log_broken(channel->log, "Could not subdaemon channel: %s",
|
||||||
|
|||||||
@@ -195,9 +195,8 @@ void handle_reestablish(struct lightningd *ld,
|
|||||||
take(towire_connectd_peer_final_msg(NULL, peer_id,
|
take(towire_connectd_peer_final_msg(NULL, peer_id,
|
||||||
err)));
|
err)));
|
||||||
subd_send_fd(ld->connectd, peer_fd->fd);
|
subd_send_fd(ld->connectd, peer_fd->fd);
|
||||||
subd_send_fd(ld->connectd, peer_fd->gossip_fd);
|
/* Don't close this fd! */
|
||||||
/* Don't close those fds! */
|
peer_fd->fd = -1;
|
||||||
peer_fd->fd = peer_fd->gossip_fd = -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -838,8 +838,8 @@ static unsigned int openingd_msg(struct subd *openingd,
|
|||||||
tal_free(openingd);
|
tal_free(openingd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (tal_count(fds) != 2)
|
if (tal_count(fds) != 1)
|
||||||
return 2;
|
return 1;
|
||||||
opening_funder_finished(openingd, msg, fds, uc->fc);
|
opening_funder_finished(openingd, msg, fds, uc->fc);
|
||||||
return 0;
|
return 0;
|
||||||
case WIRE_OPENINGD_FUNDER_START_REPLY:
|
case WIRE_OPENINGD_FUNDER_START_REPLY:
|
||||||
@@ -862,8 +862,8 @@ static unsigned int openingd_msg(struct subd *openingd,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WIRE_OPENINGD_FUNDEE:
|
case WIRE_OPENINGD_FUNDEE:
|
||||||
if (tal_count(fds) != 2)
|
if (tal_count(fds) != 1)
|
||||||
return 2;
|
return 1;
|
||||||
opening_fundee_finished(openingd, msg, fds, uc);
|
opening_fundee_finished(openingd, msg, fds, uc);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -872,8 +872,8 @@ static unsigned int openingd_msg(struct subd *openingd,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case WIRE_OPENINGD_GOT_REESTABLISH:
|
case WIRE_OPENINGD_GOT_REESTABLISH:
|
||||||
if (tal_count(fds) != 2)
|
if (tal_count(fds) != 1)
|
||||||
return 2;
|
return 1;
|
||||||
opening_got_reestablish(openingd, msg, fds, uc);
|
opening_got_reestablish(openingd, msg, fds, uc);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -919,7 +919,6 @@ void peer_start_openingd(struct peer *peer, struct peer_fd *peer_fd)
|
|||||||
opend_channel_errmsg,
|
opend_channel_errmsg,
|
||||||
opend_channel_set_billboard,
|
opend_channel_set_billboard,
|
||||||
take(&peer_fd->fd),
|
take(&peer_fd->fd),
|
||||||
take(&peer_fd->gossip_fd),
|
|
||||||
take(&hsmfd), NULL);
|
take(&hsmfd), NULL);
|
||||||
if (!uc->open_daemon) {
|
if (!uc->open_daemon) {
|
||||||
uncommitted_channel_disconnect(uc, LOG_BROKEN,
|
uncommitted_channel_disconnect(uc, LOG_BROKEN,
|
||||||
|
|||||||
@@ -1054,9 +1054,8 @@ send_error:
|
|||||||
take(towire_connectd_peer_final_msg(NULL, &peer->id,
|
take(towire_connectd_peer_final_msg(NULL, &peer->id,
|
||||||
error)));
|
error)));
|
||||||
subd_send_fd(ld->connectd, payload->peer_fd->fd);
|
subd_send_fd(ld->connectd, payload->peer_fd->fd);
|
||||||
subd_send_fd(ld->connectd, payload->peer_fd->gossip_fd);
|
/* Don't close the fd! */
|
||||||
/* Don't close those fds! */
|
payload->peer_fd->fd = -1;
|
||||||
payload->peer_fd->fd = payload->peer_fd->gossip_fd = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@@ -1112,8 +1111,7 @@ REGISTER_PLUGIN_HOOK(peer_connected,
|
|||||||
|
|
||||||
/* Connectd tells us a peer has connected: it never hands us duplicates, since
|
/* Connectd tells us a peer has connected: it never hands us duplicates, since
|
||||||
* it holds them until we say peer_died. */
|
* it holds them until we say peer_died. */
|
||||||
void peer_connected(struct lightningd *ld, const u8 *msg,
|
void peer_connected(struct lightningd *ld, const u8 *msg, int peer_fd)
|
||||||
int peer_fd, int gossip_fd)
|
|
||||||
{
|
{
|
||||||
struct node_id id;
|
struct node_id id;
|
||||||
u8 *their_features;
|
u8 *their_features;
|
||||||
@@ -1130,7 +1128,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg,
|
|||||||
fatal("Connectd gave bad CONNECT_PEER_CONNECTED message %s",
|
fatal("Connectd gave bad CONNECT_PEER_CONNECTED message %s",
|
||||||
tal_hex(msg, msg));
|
tal_hex(msg, msg));
|
||||||
|
|
||||||
hook_payload->peer_fd = new_peer_fd(hook_payload, peer_fd, gossip_fd);
|
hook_payload->peer_fd = new_peer_fd(hook_payload, peer_fd);
|
||||||
|
|
||||||
/* If we're already dealing with this peer, hand off to correct
|
/* If we're already dealing with this peer, hand off to correct
|
||||||
* subdaemon. Otherwise, we'll hand to openingd to wait there. */
|
* subdaemon. Otherwise, we'll hand to openingd to wait there. */
|
||||||
|
|||||||
@@ -64,8 +64,7 @@ struct peer *peer_from_json(struct lightningd *ld,
|
|||||||
const char *buffer,
|
const char *buffer,
|
||||||
const jsmntok_t *peeridtok);
|
const jsmntok_t *peeridtok);
|
||||||
|
|
||||||
void peer_connected(struct lightningd *ld, const u8 *msg,
|
void peer_connected(struct lightningd *ld, const u8 *msg, int peer_fd);
|
||||||
int peer_fd, int gossip_fd);
|
|
||||||
|
|
||||||
/* Could be configurable. */
|
/* Could be configurable. */
|
||||||
#define OUR_CHANNEL_FLAGS CHANNEL_FLAGS_ANNOUNCE_CHANNEL
|
#define OUR_CHANNEL_FLAGS CHANNEL_FLAGS_ANNOUNCE_CHANNEL
|
||||||
|
|||||||
@@ -7,23 +7,20 @@ static void destroy_peer_fd(struct peer_fd *peer_fd)
|
|||||||
{
|
{
|
||||||
if (peer_fd->fd != -1)
|
if (peer_fd->fd != -1)
|
||||||
close(peer_fd->fd);
|
close(peer_fd->fd);
|
||||||
if (peer_fd->gossip_fd != -1)
|
|
||||||
close(peer_fd->gossip_fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct peer_fd *new_peer_fd(const tal_t *ctx, int peer_fdnum, int gossip_fd)
|
struct peer_fd *new_peer_fd(const tal_t *ctx, int peer_fdnum)
|
||||||
{
|
{
|
||||||
struct peer_fd *peer_fd = tal(ctx, struct peer_fd);
|
struct peer_fd *peer_fd = tal(ctx, struct peer_fd);
|
||||||
|
|
||||||
peer_fd->fd = peer_fdnum;
|
peer_fd->fd = peer_fdnum;
|
||||||
peer_fd->gossip_fd = gossip_fd;
|
|
||||||
tal_add_destructor(peer_fd, destroy_peer_fd);
|
tal_add_destructor(peer_fd, destroy_peer_fd);
|
||||||
return peer_fd;
|
return peer_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct peer_fd *new_peer_fd_arr(const tal_t *ctx, const int *fds)
|
struct peer_fd *new_peer_fd_arr(const tal_t *ctx, const int *fd)
|
||||||
{
|
{
|
||||||
/* We expect 2 fds. */
|
/* We expect 1 fd. */
|
||||||
assert(tal_count(fds) == 2);
|
assert(tal_count(fd) == 1);
|
||||||
return new_peer_fd(ctx, fds[0], fds[1]);
|
return new_peer_fd(ctx, fd[0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,19 +3,16 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <ccan/tal/tal.h>
|
#include <ccan/tal/tal.h>
|
||||||
|
|
||||||
/* This name is a little preemptive: it still contains the gossip_fd
|
/* Tal wrapper for fd connecting subd to connectd */
|
||||||
* for now! */
|
|
||||||
struct peer_fd {
|
struct peer_fd {
|
||||||
/* If not -1, closed on freeing */
|
/* If not -1, closed on freeing */
|
||||||
int fd;
|
int fd;
|
||||||
int gossip_fd;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Allocate a new per-peer state and add destructor to close fds if set;
|
/* Allocate a new per-peer state and add destructor to close fd if set. */
|
||||||
* sets fds to -1. */
|
struct peer_fd *new_peer_fd(const tal_t *ctx, int peer_fd);
|
||||||
struct peer_fd *new_peer_fd(const tal_t *ctx, int peer_fd, int gossip_fd);
|
|
||||||
|
|
||||||
/* Array version of above: tal_count(fds) must be 2 */
|
/* Array version of above: tal_count(fds) must be 1 */
|
||||||
struct peer_fd *new_peer_fd_arr(const tal_t *ctx, const int *fds);
|
struct peer_fd *new_peer_fd_arr(const tal_t *ctx, const int *fd);
|
||||||
|
|
||||||
#endif /* LIGHTNING_LIGHTNINGD_PEER_FD_H */
|
#endif /* LIGHTNING_LIGHTNINGD_PEER_FD_H */
|
||||||
|
|||||||
@@ -414,7 +414,7 @@ static bool log_status_fail(struct subd *sd, const u8 *msg)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool handle_peer_error(struct subd *sd, const u8 *msg, int fds[2])
|
static bool handle_peer_error(struct subd *sd, const u8 *msg, int fds[1])
|
||||||
{
|
{
|
||||||
void *channel = sd->channel;
|
void *channel = sd->channel;
|
||||||
struct channel_id channel_id;
|
struct channel_id channel_id;
|
||||||
@@ -533,11 +533,11 @@ static struct io_plan *sd_msg_read(struct io_conn *conn, struct subd *sd)
|
|||||||
if (sd->channel) {
|
if (sd->channel) {
|
||||||
switch ((enum peer_status_wire)type) {
|
switch ((enum peer_status_wire)type) {
|
||||||
case WIRE_STATUS_PEER_ERROR:
|
case WIRE_STATUS_PEER_ERROR:
|
||||||
/* We expect 2 fds after this */
|
/* We expect 1 fd after this */
|
||||||
if (!sd->fds_in) {
|
if (!sd->fds_in) {
|
||||||
/* Don't free msg_in: we go around again. */
|
/* Don't free msg_in: we go around again. */
|
||||||
tal_steal(sd, sd->msg_in);
|
tal_steal(sd, sd->msg_in);
|
||||||
plan = sd_collect_fds(conn, sd, 2);
|
plan = sd_collect_fds(conn, sd, 1);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (!handle_peer_error(sd, sd->msg_in, sd->fds_in))
|
if (!handle_peer_error(sd, sd->msg_in, sd->fds_in))
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED,
|
|||||||
struct log_book *new_log_book(struct lightningd *ld UNNEEDED, size_t max_mem UNNEEDED)
|
struct log_book *new_log_book(struct lightningd *ld UNNEEDED, size_t max_mem UNNEEDED)
|
||||||
{ fprintf(stderr, "new_log_book called!\n"); abort(); }
|
{ fprintf(stderr, "new_log_book called!\n"); abort(); }
|
||||||
/* Generated stub for new_peer_fd_arr */
|
/* Generated stub for new_peer_fd_arr */
|
||||||
struct peer_fd *new_peer_fd_arr(const tal_t *ctx UNNEEDED, const int *fds UNNEEDED)
|
struct peer_fd *new_peer_fd_arr(const tal_t *ctx UNNEEDED, const int *fd UNNEEDED)
|
||||||
{ fprintf(stderr, "new_peer_fd_arr called!\n"); abort(); }
|
{ fprintf(stderr, "new_peer_fd_arr called!\n"); abort(); }
|
||||||
/* Generated stub for new_topology */
|
/* Generated stub for new_topology */
|
||||||
struct chain_topology *new_topology(struct lightningd *ld UNNEEDED, struct log *log UNNEEDED)
|
struct chain_topology *new_topology(struct lightningd *ld UNNEEDED, struct log *log UNNEEDED)
|
||||||
|
|||||||
@@ -437,7 +437,7 @@ struct height_states *new_height_states(const tal_t *ctx UNNEEDED,
|
|||||||
const u32 *blockheight UNNEEDED)
|
const u32 *blockheight UNNEEDED)
|
||||||
{ fprintf(stderr, "new_height_states called!\n"); abort(); }
|
{ fprintf(stderr, "new_height_states called!\n"); abort(); }
|
||||||
/* Generated stub for new_peer_fd */
|
/* Generated stub for new_peer_fd */
|
||||||
struct peer_fd *new_peer_fd(const tal_t *ctx UNNEEDED, int peer_fd UNNEEDED, int gossip_fd UNNEEDED)
|
struct peer_fd *new_peer_fd(const tal_t *ctx UNNEEDED, int peer_fd UNNEEDED)
|
||||||
{ fprintf(stderr, "new_peer_fd called!\n"); abort(); }
|
{ fprintf(stderr, "new_peer_fd called!\n"); abort(); }
|
||||||
/* Generated stub for new_reltimer_ */
|
/* Generated stub for new_reltimer_ */
|
||||||
struct oneshot *new_reltimer_(struct timers *timers UNNEEDED,
|
struct oneshot *new_reltimer_(struct timers *timers UNNEEDED,
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED,
|
|||||||
const char *fmt UNNEEDED, ...)
|
const char *fmt UNNEEDED, ...)
|
||||||
{ fprintf(stderr, "new_log called!\n"); abort(); }
|
{ fprintf(stderr, "new_log called!\n"); abort(); }
|
||||||
/* Generated stub for new_peer_fd_arr */
|
/* Generated stub for new_peer_fd_arr */
|
||||||
struct peer_fd *new_peer_fd_arr(const tal_t *ctx UNNEEDED, const int *fds UNNEEDED)
|
struct peer_fd *new_peer_fd_arr(const tal_t *ctx UNNEEDED, const int *fd UNNEEDED)
|
||||||
{ fprintf(stderr, "new_peer_fd_arr called!\n"); abort(); }
|
{ fprintf(stderr, "new_peer_fd_arr called!\n"); abort(); }
|
||||||
/* Generated stub for subdaemon_path */
|
/* Generated stub for subdaemon_path */
|
||||||
const char *subdaemon_path(const tal_t *ctx UNNEEDED, const struct lightningd *ld UNNEEDED, const char *name UNNEEDED)
|
const char *subdaemon_path(const tal_t *ctx UNNEEDED, const struct lightningd *ld UNNEEDED, const char *name UNNEEDED)
|
||||||
|
|||||||
@@ -44,9 +44,9 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wire/wire_sync.h>
|
#include <wire/wire_sync.h>
|
||||||
|
|
||||||
/* stdin == lightningd, 3 == peer, 4 == gossipd, 5 = hsmd */
|
/* stdin == lightningd, 3 == peer, 4 = hsmd */
|
||||||
#define REQ_FD STDIN_FILENO
|
#define REQ_FD STDIN_FILENO
|
||||||
#define HSM_FD 5
|
#define HSM_FD 4
|
||||||
|
|
||||||
/* tx_add_input, tx_add_output, tx_rm_input, tx_rm_output */
|
/* tx_add_input, tx_add_output, tx_rm_input, tx_rm_output */
|
||||||
#define NUM_TX_MSGS (TX_RM_OUTPUT + 1)
|
#define NUM_TX_MSGS (TX_RM_OUTPUT + 1)
|
||||||
@@ -1164,7 +1164,6 @@ static u8 *opening_negotiate_msg(const tal_t *ctx, struct state *state)
|
|||||||
* form, but we use it in a very limited way. */
|
* form, but we use it in a very limited way. */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
u8 *msg;
|
u8 *msg;
|
||||||
bool from_gossipd;
|
|
||||||
char *err;
|
char *err;
|
||||||
bool warning;
|
bool warning;
|
||||||
struct channel_id actual;
|
struct channel_id actual;
|
||||||
@@ -1175,20 +1174,7 @@ static u8 *opening_negotiate_msg(const tal_t *ctx, struct state *state)
|
|||||||
clean_tmpctx();
|
clean_tmpctx();
|
||||||
|
|
||||||
/* This helper routine polls both the peer and gossipd. */
|
/* This helper routine polls both the peer and gossipd. */
|
||||||
msg = peer_or_gossip_sync_read(ctx, state->pps, &from_gossipd);
|
msg = peer_read(ctx, state->pps);
|
||||||
|
|
||||||
/* Use standard helper for gossip msgs (forwards, if it's an
|
|
||||||
* error, exits). */
|
|
||||||
if (from_gossipd) {
|
|
||||||
handle_gossip_msg(state->pps, take(msg));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Some messages go straight to gossipd. */
|
|
||||||
if (is_msg_for_gossipd(msg)) {
|
|
||||||
wire_sync_write(state->pps->gossip_fd, take(msg));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* BOLT #1:
|
/* BOLT #1:
|
||||||
*
|
*
|
||||||
@@ -3440,19 +3426,6 @@ static u8 *handle_funding_depth(struct state *state, u8 *msg)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*~ If we see the gossip_fd readable, we read a whole message. Sure, we might
|
|
||||||
* block, but we trust gossipd. */
|
|
||||||
static void handle_gossip_in(struct state *state)
|
|
||||||
{
|
|
||||||
u8 *msg = wire_sync_read(NULL, state->pps->gossip_fd);
|
|
||||||
|
|
||||||
if (!msg)
|
|
||||||
status_failed(STATUS_FAIL_GOSSIP_IO,
|
|
||||||
"Reading gossip: %s", strerror(errno));
|
|
||||||
|
|
||||||
handle_gossip_msg(state->pps, take(msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* BOLT #2:
|
/* BOLT #2:
|
||||||
*
|
*
|
||||||
* A receiving node:
|
* A receiving node:
|
||||||
@@ -3553,7 +3526,7 @@ static void do_reconnect_dance(struct state *state)
|
|||||||
do {
|
do {
|
||||||
clean_tmpctx();
|
clean_tmpctx();
|
||||||
msg = peer_read(tmpctx, state->pps);
|
msg = peer_read(tmpctx, state->pps);
|
||||||
} while (handle_peer_gossip_or_error(state->pps,
|
} while (handle_peer_error(state->pps,
|
||||||
&state->channel_id,
|
&state->channel_id,
|
||||||
msg));
|
msg));
|
||||||
|
|
||||||
@@ -3750,9 +3723,8 @@ static u8 *handle_peer_in(struct state *state)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handles standard cases, and legal unknown ones. */
|
/* Handles errors. */
|
||||||
if (handle_peer_gossip_or_error(state->pps,
|
if (handle_peer_error(state->pps, &state->channel_id, msg))
|
||||||
&state->channel_id, msg))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
peer_write(state->pps,
|
peer_write(state->pps,
|
||||||
@@ -3775,7 +3747,7 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
common_setup(argv[0]);
|
common_setup(argv[0]);
|
||||||
|
|
||||||
struct pollfd pollfd[3];
|
struct pollfd pollfd[2];
|
||||||
struct state *state = tal(NULL, struct state);
|
struct state *state = tal(NULL, struct state);
|
||||||
struct secret *none;
|
struct secret *none;
|
||||||
struct fee_states *fee_states;
|
struct fee_states *fee_states;
|
||||||
@@ -3901,9 +3873,9 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* 3 == peer, 4 == gossipd, 5 = hsmd */
|
/* 3 == peer, 4 = hsmd */
|
||||||
state->pps = new_per_peer_state(state);
|
state->pps = new_per_peer_state(state);
|
||||||
per_peer_state_set_fds(state->pps, 3, 4);
|
per_peer_state_set_fd(state->pps, 3);
|
||||||
|
|
||||||
/*~ We need an initial per-commitment point whether we're funding or
|
/*~ We need an initial per-commitment point whether we're funding or
|
||||||
* they are, and lightningd has reserved a unique dbid for us already,
|
* they are, and lightningd has reserved a unique dbid for us already,
|
||||||
@@ -3927,10 +3899,8 @@ int main(int argc, char *argv[])
|
|||||||
/*~ We manually run a little poll() loop here. With only three fds */
|
/*~ We manually run a little poll() loop here. With only three fds */
|
||||||
pollfd[0].fd = REQ_FD;
|
pollfd[0].fd = REQ_FD;
|
||||||
pollfd[0].events = POLLIN;
|
pollfd[0].events = POLLIN;
|
||||||
pollfd[1].fd = state->pps->gossip_fd;
|
pollfd[1].fd = state->pps->peer_fd;
|
||||||
pollfd[1].events = POLLIN;
|
pollfd[1].events = POLLIN;
|
||||||
pollfd[2].fd = state->pps->peer_fd;
|
|
||||||
pollfd[2].events = POLLIN;
|
|
||||||
|
|
||||||
/* Do reconnect, if need be */
|
/* Do reconnect, if need be */
|
||||||
if (state->channel) {
|
if (state->channel) {
|
||||||
@@ -3946,7 +3916,7 @@ int main(int argc, char *argv[])
|
|||||||
/*~ If we get a signal which aborts the poll() call, valgrind
|
/*~ If we get a signal which aborts the poll() call, valgrind
|
||||||
* complains about revents being uninitialized. I'm not sure
|
* complains about revents being uninitialized. I'm not sure
|
||||||
* that's correct, but it's easy to be sure. */
|
* that's correct, but it's easy to be sure. */
|
||||||
pollfd[0].revents = pollfd[1].revents = pollfd[2].revents = 0;
|
pollfd[0].revents = pollfd[1].revents = 0;
|
||||||
|
|
||||||
poll(pollfd, ARRAY_SIZE(pollfd), -1);
|
poll(pollfd, ARRAY_SIZE(pollfd), -1);
|
||||||
/* Subtle: handle_master_in can do its own poll loop, so
|
/* Subtle: handle_master_in can do its own poll loop, so
|
||||||
@@ -3955,11 +3925,8 @@ int main(int argc, char *argv[])
|
|||||||
if (pollfd[0].revents & POLLIN)
|
if (pollfd[0].revents & POLLIN)
|
||||||
msg = handle_master_in(state);
|
msg = handle_master_in(state);
|
||||||
/* Second priority: messages from peer. */
|
/* Second priority: messages from peer. */
|
||||||
else if (pollfd[2].revents & POLLIN)
|
|
||||||
msg = handle_peer_in(state);
|
|
||||||
/* Last priority: chit-chat from gossipd. */
|
|
||||||
else if (pollfd[1].revents & POLLIN)
|
else if (pollfd[1].revents & POLLIN)
|
||||||
handle_gossip_in(state);
|
msg = handle_peer_in(state);
|
||||||
|
|
||||||
/* If we've shutdown, we're done */
|
/* If we've shutdown, we're done */
|
||||||
if (shutdown_complete(state))
|
if (shutdown_complete(state))
|
||||||
|
|||||||
@@ -35,9 +35,9 @@
|
|||||||
#include <wire/peer_wire.h>
|
#include <wire/peer_wire.h>
|
||||||
#include <wire/wire_sync.h>
|
#include <wire/wire_sync.h>
|
||||||
|
|
||||||
/* stdin == lightningd, 3 == peer, 4 == gossipd, 5 = hsmd */
|
/* stdin == lightningd, 3 == peer, 4 = hsmd */
|
||||||
#define REQ_FD STDIN_FILENO
|
#define REQ_FD STDIN_FILENO
|
||||||
#define HSM_FD 5
|
#define HSM_FD 4
|
||||||
|
|
||||||
#if DEVELOPER
|
#if DEVELOPER
|
||||||
/* If --dev-force-tmp-channel-id is set, it ends up here */
|
/* If --dev-force-tmp-channel-id is set, it ends up here */
|
||||||
@@ -184,7 +184,6 @@ static u8 *opening_negotiate_msg(const tal_t *ctx, struct state *state,
|
|||||||
* form, but we use it in a very limited way. */
|
* form, but we use it in a very limited way. */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
u8 *msg;
|
u8 *msg;
|
||||||
bool from_gossipd;
|
|
||||||
char *err;
|
char *err;
|
||||||
bool warning;
|
bool warning;
|
||||||
struct channel_id actual;
|
struct channel_id actual;
|
||||||
@@ -194,20 +193,7 @@ static u8 *opening_negotiate_msg(const tal_t *ctx, struct state *state,
|
|||||||
clean_tmpctx();
|
clean_tmpctx();
|
||||||
|
|
||||||
/* This helper routine polls both the peer and gossipd. */
|
/* This helper routine polls both the peer and gossipd. */
|
||||||
msg = peer_or_gossip_sync_read(ctx, state->pps, &from_gossipd);
|
msg = peer_read(ctx, state->pps);
|
||||||
|
|
||||||
/* Use standard helper for gossip msgs (forwards, if it's an
|
|
||||||
* error, exits). */
|
|
||||||
if (from_gossipd) {
|
|
||||||
handle_gossip_msg(state->pps, take(msg));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Some messages go straight to gossipd. */
|
|
||||||
if (is_msg_for_gossipd(msg)) {
|
|
||||||
wire_sync_write(state->pps->gossip_fd, take(msg));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* BOLT #1:
|
/* BOLT #1:
|
||||||
*
|
*
|
||||||
@@ -1259,9 +1245,8 @@ static u8 *handle_peer_in(struct state *state)
|
|||||||
if (t == WIRE_OPEN_CHANNEL)
|
if (t == WIRE_OPEN_CHANNEL)
|
||||||
return fundee_channel(state, msg);
|
return fundee_channel(state, msg);
|
||||||
|
|
||||||
/* Handles standard cases, and legal unknown ones. */
|
/* Handles error cases. */
|
||||||
if (handle_peer_gossip_or_error(state->pps,
|
if (handle_peer_error(state->pps, &state->channel_id, msg))
|
||||||
&state->channel_id, msg))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
extracted = extract_channel_id(msg, &channel_id);
|
extracted = extract_channel_id(msg, &channel_id);
|
||||||
@@ -1285,19 +1270,6 @@ static u8 *handle_peer_in(struct state *state)
|
|||||||
peer_failed_connection_lost();
|
peer_failed_connection_lost();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*~ If we see the gossip_fd readable, we read a whole message. Sure, we might
|
|
||||||
* block, but we trust gossipd. */
|
|
||||||
static void handle_gossip_in(struct state *state)
|
|
||||||
{
|
|
||||||
u8 *msg = wire_sync_read(NULL, state->pps->gossip_fd);
|
|
||||||
|
|
||||||
if (!msg)
|
|
||||||
status_failed(STATUS_FAIL_GOSSIP_IO,
|
|
||||||
"Reading gossip: %s", strerror(errno));
|
|
||||||
|
|
||||||
handle_gossip_msg(state->pps, take(msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Memory leak detection is DEVELOPER-only because we go to great lengths to
|
/* Memory leak detection is DEVELOPER-only because we go to great lengths to
|
||||||
* record the backtrace when allocations occur: without that, the leak
|
* record the backtrace when allocations occur: without that, the leak
|
||||||
* detection tends to be useless for diagnosing where the leak came from, but
|
* detection tends to be useless for diagnosing where the leak came from, but
|
||||||
@@ -1393,7 +1365,7 @@ int main(int argc, char *argv[])
|
|||||||
setup_locale();
|
setup_locale();
|
||||||
|
|
||||||
u8 *msg;
|
u8 *msg;
|
||||||
struct pollfd pollfd[3];
|
struct pollfd pollfd[2];
|
||||||
struct state *state = tal(NULL, struct state);
|
struct state *state = tal(NULL, struct state);
|
||||||
struct secret *none;
|
struct secret *none;
|
||||||
struct channel_id *force_tmp_channel_id;
|
struct channel_id *force_tmp_channel_id;
|
||||||
@@ -1424,9 +1396,9 @@ int main(int argc, char *argv[])
|
|||||||
dev_force_tmp_channel_id = force_tmp_channel_id;
|
dev_force_tmp_channel_id = force_tmp_channel_id;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* 3 == peer, 4 == gossipd, 5 = hsmd */
|
/* 3 == peer, 4 = hsmd */
|
||||||
state->pps = new_per_peer_state(state);
|
state->pps = new_per_peer_state(state);
|
||||||
per_peer_state_set_fds(state->pps, 3, 4);
|
per_peer_state_set_fd(state->pps, 3);
|
||||||
|
|
||||||
/*~ Initially we're not associated with a channel, but
|
/*~ Initially we're not associated with a channel, but
|
||||||
* handle_peer_gossip_or_error compares this. */
|
* handle_peer_gossip_or_error compares this. */
|
||||||
@@ -1463,10 +1435,8 @@ int main(int argc, char *argv[])
|
|||||||
/*~ We manually run a little poll() loop here. With only three fds */
|
/*~ We manually run a little poll() loop here. With only three fds */
|
||||||
pollfd[0].fd = REQ_FD;
|
pollfd[0].fd = REQ_FD;
|
||||||
pollfd[0].events = POLLIN;
|
pollfd[0].events = POLLIN;
|
||||||
pollfd[1].fd = state->pps->gossip_fd;
|
pollfd[1].fd = state->pps->peer_fd;
|
||||||
pollfd[1].events = POLLIN;
|
pollfd[1].events = POLLIN;
|
||||||
pollfd[2].fd = state->pps->peer_fd;
|
|
||||||
pollfd[2].events = POLLIN;
|
|
||||||
|
|
||||||
/* We exit when we get a conclusion to write to lightningd: either
|
/* We exit when we get a conclusion to write to lightningd: either
|
||||||
* opening_funder_reply or opening_fundee. */
|
* opening_funder_reply or opening_fundee. */
|
||||||
@@ -1475,7 +1445,7 @@ int main(int argc, char *argv[])
|
|||||||
/*~ If we get a signal which aborts the poll() call, valgrind
|
/*~ If we get a signal which aborts the poll() call, valgrind
|
||||||
* complains about revents being uninitialized. I'm not sure
|
* complains about revents being uninitialized. I'm not sure
|
||||||
* that's correct, but it's easy to be sure. */
|
* that's correct, but it's easy to be sure. */
|
||||||
pollfd[0].revents = pollfd[1].revents = pollfd[2].revents = 0;
|
pollfd[0].revents = pollfd[1].revents = 0;
|
||||||
|
|
||||||
poll(pollfd, ARRAY_SIZE(pollfd), -1);
|
poll(pollfd, ARRAY_SIZE(pollfd), -1);
|
||||||
/* Subtle: handle_master_in can do its own poll loop, so
|
/* Subtle: handle_master_in can do its own poll loop, so
|
||||||
@@ -1484,22 +1454,19 @@ int main(int argc, char *argv[])
|
|||||||
if (pollfd[0].revents & POLLIN)
|
if (pollfd[0].revents & POLLIN)
|
||||||
msg = handle_master_in(state);
|
msg = handle_master_in(state);
|
||||||
/* Second priority: messages from peer. */
|
/* Second priority: messages from peer. */
|
||||||
else if (pollfd[2].revents & POLLIN)
|
|
||||||
msg = handle_peer_in(state);
|
|
||||||
/* Last priority: chit-chat from gossipd. */
|
|
||||||
else if (pollfd[1].revents & POLLIN)
|
else if (pollfd[1].revents & POLLIN)
|
||||||
handle_gossip_in(state);
|
msg = handle_peer_in(state);
|
||||||
|
|
||||||
/* Since we're the top-level event loop, we clean up */
|
/* Since we're the top-level event loop, we clean up */
|
||||||
clean_tmpctx();
|
clean_tmpctx();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*~ Write message and hand back the peer fd and gossipd fd. This also
|
/*~ Write message and hand back the peer fd. This also means that if
|
||||||
* means that if the peer or gossipd wrote us any messages we didn't
|
* the peer wrote us any messages we didn't read yet, it will simply
|
||||||
* read yet, it will simply be read by the next daemon. */
|
* be read by the next daemon. */
|
||||||
wire_sync_write(REQ_FD, msg);
|
wire_sync_write(REQ_FD, msg);
|
||||||
per_peer_state_fdpass_send(REQ_FD, state->pps);
|
per_peer_state_fdpass_send(REQ_FD, state->pps);
|
||||||
status_debug("Sent %s with fds",
|
status_debug("Sent %s with fd",
|
||||||
openingd_wire_name(fromwire_peektype(msg)));
|
openingd_wire_name(fromwire_peektype(msg)));
|
||||||
|
|
||||||
/* This frees the entire tal tree. */
|
/* This frees the entire tal tree. */
|
||||||
|
|||||||
@@ -442,7 +442,7 @@ struct chain_coin_mvt *new_coin_wallet_deposit(const tal_t *ctx UNNEEDED,
|
|||||||
|
|
||||||
{ fprintf(stderr, "new_coin_wallet_deposit called!\n"); abort(); }
|
{ fprintf(stderr, "new_coin_wallet_deposit called!\n"); abort(); }
|
||||||
/* Generated stub for new_peer_fd */
|
/* Generated stub for new_peer_fd */
|
||||||
struct peer_fd *new_peer_fd(const tal_t *ctx UNNEEDED, int peer_fd UNNEEDED, int gossip_fd UNNEEDED)
|
struct peer_fd *new_peer_fd(const tal_t *ctx UNNEEDED, int peer_fd UNNEEDED)
|
||||||
{ fprintf(stderr, "new_peer_fd called!\n"); abort(); }
|
{ fprintf(stderr, "new_peer_fd called!\n"); abort(); }
|
||||||
/* Generated stub for notify_chain_mvt */
|
/* Generated stub for notify_chain_mvt */
|
||||||
void notify_chain_mvt(struct lightningd *ld UNNEEDED, const struct chain_coin_mvt *mvt UNNEEDED)
|
void notify_chain_mvt(struct lightningd *ld UNNEEDED, const struct chain_coin_mvt *mvt UNNEEDED)
|
||||||
|
|||||||
Reference in New Issue
Block a user