#include #include #include #include #include #include #include #include #include #include /* Fatal error here, return peer control to lightningd */ static void NORETURN peer_fatal_continue(const u8 *msg TAKES, const struct per_peer_state *pps) { int reason = fromwire_peektype(msg); breakpoint(); status_send(msg); status_send_fd(pps->peer_fd); status_send_fd(pps->gossip_fd); status_send_fd(pps->gossip_store_fd); exit(0x80 | (reason & 0xFF)); } /* We only support one channel per peer anyway */ void peer_failed(struct per_peer_state *pps, const struct channel_id *channel_id, const char *fmt, ...) { va_list ap; const char *desc; u8 *msg, *err; va_start(ap, fmt); desc = tal_vfmt(NULL, fmt, ap); va_end(ap); /* Tell peer the error. */ err = towire_errorfmt(desc, channel_id, "%s", desc); sync_crypto_write(pps, err); /* Tell master the error so it can re-xmit. */ msg = towire_status_peer_error(NULL, channel_id, desc, false, pps, err); peer_billboard(true, desc); tal_free(desc); peer_fatal_continue(take(msg), pps); } /* We're failing because peer sent us an error message */ void peer_failed_received_errmsg(struct per_peer_state *pps, const char *desc, const struct channel_id *channel_id) { static const struct channel_id all_channels; u8 *msg; bool sync_error; /* <+roasbeef> rusty: sync error can just be a timing thing * <+roasbeef> andn doesn't always mean that we can't continue forwrd, * or y'all sent the wrong info */ /* So while LND is sitting in the corner eating paint, back off. */ sync_error = strstr(desc, "sync error"); if (sync_error) status_unusual("Peer said '%s' so we'll come back later", desc); if (!channel_id) channel_id = &all_channels; msg = towire_status_peer_error(NULL, channel_id, desc, sync_error, pps, NULL); peer_billboard(true, "Received error from peer: %s", desc); peer_fatal_continue(take(msg), pps); } void peer_failed_connection_lost(void) { status_send_fatal(take(towire_status_peer_connection_lost(NULL))); }