lightningd: set "direction" correctly for connect which is already connected.

This means remembering the connection direction.  We also use the address to try
to reconnect, which we shouldn't bother with if they connect to us.

For peers from the database, we currently always save the addr: we shouldn't really
do this if they connected to us, since it's not useful for reconnecting (we don't
show the addr in JSON reply to listpeers unless we're connected, so it's only an
internal issue).  This is left for future work.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2021-03-25 14:43:12 +10:30
parent b0d6996ed6
commit 006300ab96
9 changed files with 136 additions and 117 deletions

View File

@@ -87,7 +87,8 @@ static void peer_update_features(struct peer *peer,
struct peer *new_peer(struct lightningd *ld, u64 dbid,
const struct node_id *id,
const struct wireaddr_internal *addr)
const struct wireaddr_internal *addr,
bool connected_incoming)
{
/* We are owned by our channels, and freed manually by destroy_channel */
struct peer *peer = tal(NULL, struct peer);
@@ -97,6 +98,7 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid,
peer->id = *id;
peer->uncommitted_channel = NULL;
peer->addr = *addr;
peer->connected_incoming = connected_incoming;
peer->their_features = NULL;
list_head_init(&peer->channels);
peer->direction = node_id_idx(&peer->ld->id, &peer->id);
@@ -1062,6 +1064,7 @@ static void peer_connected_hook_final(struct peer_connected_hook_payload *payloa
case DUALOPEND_AWAITING_LOCKIN:
assert(!channel->owner);
channel->peer->addr = addr;
channel->peer->connected_incoming = payload->incoming;
peer_restart_dualopend(peer, payload->pps, channel, NULL);
return;
case CHANNELD_AWAITING_LOCKIN:
@@ -1069,12 +1072,14 @@ static void peer_connected_hook_final(struct peer_connected_hook_payload *payloa
case CHANNELD_SHUTTING_DOWN:
assert(!channel->owner);
channel->peer->addr = addr;
channel->peer->connected_incoming = payload->incoming;
peer_start_channeld(channel, payload->pps, NULL, true);
return;
case CLOSINGD_SIGEXCHANGE:
assert(!channel->owner);
channel->peer->addr = addr;
channel->peer->connected_incoming = payload->incoming;
peer_start_closingd(channel, payload->pps, true, NULL);
return;
}
@@ -1097,6 +1102,7 @@ send_error:
assert(channel->state == DUALOPEND_OPEN_INIT
|| channel->state == DUALOPEND_AWAITING_LOCKIN);
channel->peer->addr = addr;
channel->peer->connected_incoming = payload->incoming;
peer_restart_dualopend(peer, payload->pps, channel, error);
} else
peer_start_dualopend(peer, payload->pps, error);
@@ -1183,7 +1189,8 @@ void peer_connected(struct lightningd *ld, const u8 *msg,
* subdaemon. Otherwise, we'll hand to openingd to wait there. */
peer = peer_by_id(ld, &id);
if (!peer)
peer = new_peer(ld, 0, &id, &hook_payload->addr);
peer = new_peer(ld, 0, &id, &hook_payload->addr,
hook_payload->incoming);
tal_steal(peer, hook_payload);
hook_payload->peer = peer;
@@ -1748,11 +1755,16 @@ static void activate_peer(struct peer *peer, u32 delay)
"Will attempt reconnect "
"in %u seconds",
delay));
delay_then_reconnect(channel, delay, &peer->addr);
delay_then_reconnect(channel, delay,
peer->connected_incoming
? NULL
: &peer->addr);
} else {
msg = towire_connectd_connect_to_peer(NULL,
&peer->id, 0,
&peer->addr);
&peer->id, 0,
peer->connected_incoming
? NULL
: &peer->addr);
subd_send_msg(ld->connectd, take(msg));
channel_set_billboard(channel, false,
"Attempting to reconnect");