Browse Source
Now we hand peers off to the gossip daemon, to do the INIT handshake and re-transmit/receive gossip. They may stay there forever if neither we nor them wants to open a channel. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>ppa-0.6.1
Rusty Russell
8 years ago
6 changed files with 149 additions and 5 deletions
@ -0,0 +1,118 @@ |
|||||
|
#include "gossip_control.h" |
||||
|
#include "lightningd.h" |
||||
|
#include "peer_control.h" |
||||
|
#include "subdaemon.h" |
||||
|
#include <ccan/err/err.h> |
||||
|
#include <ccan/take/take.h> |
||||
|
#include <daemon/log.h> |
||||
|
#include <inttypes.h> |
||||
|
#include <lightningd/gossip/gen_gossip_control_wire.h> |
||||
|
#include <lightningd/gossip/gen_gossip_status_wire.h> |
||||
|
|
||||
|
static void gossip_finished(struct subdaemon *gossip, int status) |
||||
|
{ |
||||
|
if (WIFEXITED(status)) |
||||
|
errx(1, "Gossip failed (exit status %i), exiting.", |
||||
|
WEXITSTATUS(status)); |
||||
|
errx(1, "Gossip failed (signal %u), exiting.", WTERMSIG(status)); |
||||
|
} |
||||
|
|
||||
|
static void peer_bad_message(struct subdaemon *gossip, const u8 *msg) |
||||
|
{ |
||||
|
u64 unique_id; |
||||
|
struct peer *peer; |
||||
|
u8 *err; |
||||
|
|
||||
|
if (!fromwire_gossipstatus_peer_bad_msg(msg, msg, NULL, |
||||
|
&unique_id, &err)) |
||||
|
fatal("Gossip gave bad PEER_BAD message %s", tal_hex(msg, msg)); |
||||
|
|
||||
|
peer = peer_by_unique_id(gossip->ld, unique_id); |
||||
|
if (!peer) |
||||
|
fatal("Gossip gave bad peerid %"PRIu64, unique_id); |
||||
|
|
||||
|
log_info(gossip->log, "Peer %s gave bad msg %s", |
||||
|
type_to_string(msg, struct pubkey, peer->id), |
||||
|
tal_hex(msg, msg)); |
||||
|
tal_free(peer); |
||||
|
} |
||||
|
|
||||
|
static void peer_nongossip(struct subdaemon *gossip, const u8 *msg, int fd) |
||||
|
{ |
||||
|
u64 unique_id; |
||||
|
struct peer *peer; |
||||
|
u8 *inner; |
||||
|
struct crypto_state *cs; |
||||
|
|
||||
|
if (!fromwire_gossipstatus_peer_nongossip(msg, msg, NULL, |
||||
|
&unique_id, &cs, &inner)) |
||||
|
fatal("Gossip gave bad PEER_NONGOSSIP message %s", |
||||
|
tal_hex(msg, msg)); |
||||
|
|
||||
|
peer = peer_by_unique_id(gossip->ld, unique_id); |
||||
|
if (!peer) |
||||
|
fatal("Gossip gave bad peerid %"PRIu64, unique_id); |
||||
|
|
||||
|
log_info(gossip->log, "Peer %s said %s", |
||||
|
type_to_string(msg, struct pubkey, peer->id), |
||||
|
gossip_status_wire_type_name(fromwire_peektype(inner))); |
||||
|
|
||||
|
/* FIXME: create new daemon to handle peer. */ |
||||
|
} |
||||
|
|
||||
|
static void peer_ready(struct subdaemon *gossip, const u8 *msg) |
||||
|
{ |
||||
|
u64 unique_id; |
||||
|
struct peer *peer; |
||||
|
|
||||
|
if (!fromwire_gossipstatus_peer_ready(msg, NULL, &unique_id)) |
||||
|
fatal("Gossip gave bad PEER_READY message %s", |
||||
|
tal_hex(msg, msg)); |
||||
|
|
||||
|
peer = peer_by_unique_id(gossip->ld, unique_id); |
||||
|
if (!peer) |
||||
|
fatal("Gossip gave bad peerid %"PRIu64, unique_id); |
||||
|
|
||||
|
log_info_struct(gossip->log, "Peer %s ready for channel open", |
||||
|
struct pubkey, peer->id); |
||||
|
|
||||
|
/* FIXME: finish json connect cmd if any. */ |
||||
|
} |
||||
|
|
||||
|
static enum subdaemon_status gossip_status(struct subdaemon *gossip, |
||||
|
const u8 *msg, int fd) |
||||
|
{ |
||||
|
enum gossip_status_wire_type t = fromwire_peektype(msg); |
||||
|
|
||||
|
switch (t) { |
||||
|
/* We don't get told about fatal errors. */ |
||||
|
case WIRE_GOSSIPSTATUS_INIT_FAILED: |
||||
|
case WIRE_GOSSIPSTATUS_BAD_NEW_PEER_REQUEST: |
||||
|
case WIRE_GOSSIPSTATUS_BAD_REQUEST: |
||||
|
case WIRE_GOSSIPSTATUS_FDPASS_FAILED: |
||||
|
case WIRE_GOSSIPSTATUS_BAD_RELEASE_REQUEST: |
||||
|
break; |
||||
|
case WIRE_GOSSIPSTATUS_PEER_BAD_MSG: |
||||
|
peer_bad_message(gossip, msg); |
||||
|
break; |
||||
|
case WIRE_GOSSIPSTATUS_PEER_NONGOSSIP: |
||||
|
if (fd == -1) |
||||
|
return STATUS_NEED_FD; |
||||
|
peer_nongossip(gossip, msg, fd); |
||||
|
break; |
||||
|
case WIRE_GOSSIPSTATUS_PEER_READY: |
||||
|
peer_ready(gossip, msg); |
||||
|
break; |
||||
|
} |
||||
|
return STATUS_COMPLETE; |
||||
|
} |
||||
|
|
||||
|
void gossip_init(struct lightningd *ld) |
||||
|
{ |
||||
|
ld->gossip = new_subdaemon(ld, ld, "lightningd_gossip", |
||||
|
gossip_status_wire_type_name, |
||||
|
gossip_control_wire_type_name, |
||||
|
gossip_status, gossip_finished, -1); |
||||
|
if (!ld->gossip) |
||||
|
err(1, "Could not subdaemon gossip"); |
||||
|
} |
@ -0,0 +1,9 @@ |
|||||
|
#ifndef LIGHTNING_LIGHTNINGD_GOSSIP_CONTROL_H |
||||
|
#define LIGHTNING_LIGHTNINGD_GOSSIP_CONTROL_H |
||||
|
#include "config.h" |
||||
|
#include <stdbool.h> |
||||
|
|
||||
|
struct lightningd; |
||||
|
|
||||
|
void gossip_init(struct lightningd *ld); |
||||
|
#endif /* LIGHTNING_LIGHTNINGD_HSM_CONTROL_H */ |
Loading…
Reference in new issue