Skip to content

Commit 183ca77

Browse files
committed
channeld: provide alt-addr to peer upon channel establish
1 parent 8cd3547 commit 183ca77

File tree

16 files changed

+121
-1
lines changed

16 files changed

+121
-1
lines changed

channeld/channeld.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,17 @@ static void handle_peer_splice_locked(struct peer *peer, const u8 *msg)
539539
check_mutual_splice_locked(peer);
540540
}
541541

542+
static void send_peer_my_alt_addr(struct peer *peer)
543+
{
544+
/* Send my alt addr to peer db */
545+
u8 *peer_msg = towire_peer_alt_addr(peer, peer->my_alt_addr);
546+
peer_write(peer->pps, take(peer_msg));
547+
548+
/* We need the addrs in my own db too for later whitelist confirmation */
549+
u8 *msg = towire_channeld_my_alt_addr(tmpctx, peer->my_alt_addr);
550+
wire_sync_write(MASTER_FD, take(msg));
551+
}
552+
542553
static void handle_peer_channel_ready(struct peer *peer, const u8 *msg)
543554
{
544555
struct channel_id chanid;
@@ -4164,6 +4175,9 @@ static void peer_in(struct peer *peer, const u8 *msg)
41644175

41654176
check_tx_abort(peer, msg);
41664177

4178+
if (peer->my_alt_addr)
4179+
send_peer_my_alt_addr(peer);
4180+
41674181
/* If we're in STFU mode and aren't waiting for a STFU mode
41684182
* specific message, the only valid message was tx_abort */
41694183
if (is_stfu_active(peer) && !peer->stfu_wait_single_msg) {
@@ -4296,6 +4310,7 @@ static void peer_in(struct peer *peer, const u8 *msg)
42964310
case WIRE_ONION_MESSAGE:
42974311
case WIRE_PEER_STORAGE:
42984312
case WIRE_YOUR_PEER_STORAGE:
4313+
case WIRE_PEER_ALT_ADDR:
42994314
abort();
43004315
}
43014316

@@ -5666,6 +5681,18 @@ static void handle_dev_quiesce(struct peer *peer, const u8 *msg)
56665681
maybe_send_stfu(peer);
56675682
}
56685683

5684+
static void handle_channeld_peer_alt_addr(struct peer *peer, const u8 *msg)
5685+
{
5686+
u8 *my_alt_addr;
5687+
5688+
if (!fromwire_channeld_peer_alt_addr(peer, msg, &my_alt_addr))
5689+
master_badmsg(WIRE_CHANNELD_PEER_ALT_ADDR, msg);
5690+
5691+
u8 *peer_msg = towire_peer_alt_addr(peer, my_alt_addr);
5692+
peer_write(peer->pps, take(peer_msg));
5693+
tal_free(my_alt_addr);
5694+
}
5695+
56695696
static void req_in(struct peer *peer, const u8 *msg)
56705697
{
56715698
enum channeld_wire t = fromwire_peektype(msg);
@@ -5705,6 +5732,9 @@ static void req_in(struct peer *peer, const u8 *msg)
57055732
case WIRE_CHANNELD_SEND_ERROR:
57065733
handle_send_error(peer, msg);
57075734
return;
5735+
case WIRE_CHANNELD_PEER_ALT_ADDR:
5736+
handle_channeld_peer_alt_addr(peer, msg);
5737+
return;
57085738
case WIRE_CHANNELD_SPLICE_INIT:
57095739
handle_splice_init(peer, msg);
57105740
return;
@@ -5768,6 +5798,7 @@ static void req_in(struct peer *peer, const u8 *msg)
57685798
case WIRE_CHANNELD_SPLICE_STATE_ERROR:
57695799
case WIRE_CHANNELD_LOCAL_ANCHOR_INFO:
57705800
case WIRE_CHANNELD_REESTABLISHED:
5801+
case WIRE_CHANNELD_MY_ALT_ADDR:
57715802
break;
57725803
}
57735804
master_badmsg(-1, msg);

channeld/channeld_wire.csv

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,13 @@ msgdata,channeld_upgraded,new_type,channel_type,
350350
# Tell peer about our latest and greatest blockheight.
351351
msgtype,channeld_blockheight,1012
352352
msgdata,channeld_blockheight,blockheight,u32,
353+
354+
# master -> channeld: send peer our alternative addresses
355+
msgtype,channeld_peer_alt_addr,1035
356+
msgdata,channeld_peer_alt_addr,alt_addr_len,u16,
357+
msgdata,channeld_peer_alt_addr,alt_addr,u8,alt_addr_len,
358+
359+
# channeld -> master: send our alternative addresses to our db
360+
msgtype,channeld_my_alt_addr,1037
361+
msgdata,channeld_my_alt_addr,alt_addr_len,u16,
362+
msgdata,channeld_my_alt_addr,alt_addr,u8,alt_addr_len,

common/gossmap.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,7 @@ const void *gossmap_stream_next(const tal_t *ctx,
16191619
case WIRE_REPLY_CHANNEL_RANGE:
16201620
case WIRE_GOSSIP_TIMESTAMP_FILTER:
16211621
case WIRE_ONION_MESSAGE:
1622+
case WIRE_PEER_ALT_ADDR:
16221623
break;
16231624
}
16241625
}

common/interactivetx.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ static u8 *read_next_msg(const tal_t *ctx,
186186
case WIRE_SPLICE:
187187
case WIRE_SPLICE_ACK:
188188
case WIRE_SPLICE_LOCKED:
189+
case WIRE_PEER_ALT_ADDR:
189190
*error = tal_fmt(ctx,
190191
"Received invalid message from peer: %d", t);
191192
return NULL;
@@ -736,6 +737,7 @@ char *process_interactivetx_updates(const tal_t *ctx,
736737
case WIRE_SPLICE_ACK:
737738
case WIRE_STFU:
738739
case WIRE_SPLICE_LOCKED:
740+
case WIRE_PEER_ALT_ADDR:
739741
return tal_fmt(ctx, "Unexpected wire message %s",
740742
tal_hex(ctx, msg));
741743
}

connectd/connectd.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
#include <sys/types.h>
5151
#include <sys/wait.h>
5252
#include <unistd.h>
53+
#include <wire/peer_wiregen.h>
5354
#include <wire/wire_io.h>
5455
#include <wire/wire_sync.h>
5556

@@ -518,6 +519,18 @@ static struct io_plan *connection_in(struct io_conn *conn,
518519
return conn_in(conn, &conn_in_arg);
519520
}
520521

522+
void handle_peer_alt_addr_in(struct peer *peer, const u8 *msg)
523+
{
524+
u8 *p_alt_addr;
525+
526+
if (!fromwire_peer_alt_addr(peer, msg, &p_alt_addr))
527+
master_badmsg(WIRE_PEER_ALT_ADDR, msg);
528+
529+
u8 *fwd_msg = towire_connectd_peer_alt_addr(tmpctx, &peer->id, p_alt_addr);
530+
daemon_conn_send(peer->daemon->master, take(fwd_msg));
531+
tal_free(p_alt_addr);
532+
}
533+
521534
/*~ <hello>I speak web socket</hello>.
522535
*
523536
* Actually that's dumb, websocket (aka rfc6455) looks nothing like that. */
@@ -2249,6 +2262,7 @@ static struct io_plan *recv_req(struct io_conn *conn,
22492262
case WIRE_CONNECTD_PEER_DISCONNECT_DONE:
22502263
case WIRE_CONNECTD_START_SHUTDOWN_REPLY:
22512264
case WIRE_CONNECTD_INJECT_ONIONMSG_REPLY:
2265+
case WIRE_CONNECTD_PEER_ALT_ADDR:
22522266
break;
22532267
}
22542268

connectd/connectd.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ void update_recent_timestamp(struct daemon *daemon, struct gossmap *gossmap);
336336
/* add erros to error list */
337337
void add_errors_to_error_list(struct connecting *connect, const char *error);
338338

339+
/* Handles alternative address message from peer. */
340+
void handle_peer_alt_addr_in(struct peer *peer, const u8 *msg);
341+
339342
/* Called by peer_exchange_initmsg if successful. */
340343
struct io_plan *peer_connected(struct io_conn *conn,
341344
struct daemon *daemon,

connectd/connectd_wire.csv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,9 @@ msgtype,connectd_dev_exhaust_fds,2036
187187
# master -> connect: set artificial maximum reply_channel_range size.
188188
msgtype,connectd_dev_set_max_scids_encode_size,2035
189189
msgdata,connectd_dev_set_max_scids_encode_size,max,u32,
190+
191+
# connectd -> master: incoming alternative connection address from peer
192+
msgtype,connectd_peer_alt_addr,2037
193+
msgdata,connectd_peer_alt_addr,id,node_id,
194+
msgdata,connectd_peer_alt_addr,addr_len,u8,
195+
msgdata,connectd_peer_alt_addr,addr,byte,addr_len,

connectd/gossip_rcvd_filter.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ static bool is_msg_gossip_broadcast(const u8 *cursor)
9595
case WIRE_SPLICE:
9696
case WIRE_SPLICE_ACK:
9797
case WIRE_SPLICE_LOCKED:
98+
case WIRE_PEER_ALT_ADDR:
9899
break;
99100
}
100101
return false;

connectd/gossip_store.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ static bool public_msg_type(enum peer_wire type)
9898
case WIRE_SPLICE:
9999
case WIRE_SPLICE_ACK:
100100
case WIRE_SPLICE_LOCKED:
101+
case WIRE_PEER_ALT_ADDR:
101102
return false;
102103
case WIRE_CHANNEL_ANNOUNCEMENT:
103104
case WIRE_NODE_ANNOUNCEMENT:

connectd/multiplex.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ static bool is_urgent(enum peer_wire type)
326326
case WIRE_SPLICE:
327327
case WIRE_SPLICE_ACK:
328328
case WIRE_SPLICE_LOCKED:
329+
case WIRE_PEER_ALT_ADDR:
329330
return false;
330331

331332
/* These are time-sensitive, and so send without delay. */
@@ -754,6 +755,9 @@ static bool handle_message_locally(struct peer *peer, const u8 *msg)
754755
} else if (type == WIRE_QUERY_SHORT_CHANNEL_IDS) {
755756
handle_query_short_channel_ids(peer, msg);
756757
return true;
758+
} else if (type == WIRE_PEER_ALT_ADDR) {
759+
handle_peer_alt_addr_in(peer, msg);
760+
return true;
757761
} else if (handle_custommsg(peer->daemon, peer, msg)) {
758762
return true;
759763
}

0 commit comments

Comments
 (0)