Skip to content

Commit a6e2fa1

Browse files
committed
WIP, the saving of 'our_alt_addr' to our own db is not working.
This is just for showing the process before mid-term evaluation. Signed-off-by: Max Rantil <[email protected]>
1 parent b9721c3 commit a6e2fa1

File tree

10 files changed

+251
-113
lines changed

10 files changed

+251
-113
lines changed

channeld/channeld.c

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -544,12 +544,21 @@ static void handle_peer_splice_locked(struct peer *peer, const u8 *msg)
544544

545545
static void send_peer_our_alt_addr(struct peer *peer)
546546
{
547-
struct pubkey node_id;
547+
struct pubkey p_pk;
548548

549-
if (pubkey_from_node_id(&node_id, &peer->id)) {
550-
u8 *msg = towire_peer_alt_addr(peer, &node_id, peer->our_alt_addr);
551-
peer_write(peer->pps, take(msg));
549+
if (pubkey_from_node_id(&p_pk, &peer->id)) {
550+
/* Send our alt addr to peer db - because who doesn't love secret addresses? */
551+
u8 *peer_msg = towire_peer_alt_addr(peer, &p_pk,
552+
peer->our_alt_addr); /* FIXME(maxrantil): Make addr(s)! */
553+
peer_write(peer->pps, take(peer_msg));
554+
555+
/* We need the addrs in our own db too for later whitelist confirmation */
556+
u8 *msg = towire_channeld_our_alt_addrs(tmpctx, &p_pk,
557+
peer->our_alt_addr);
558+
wire_sync_write(MASTER_FD, take(msg));
552559
}
560+
561+
/* FIXME(maxrantil): Do we only free in the fromwire_() or here too?? test */
553562
}
554563

555564
static void handle_peer_channel_ready(struct peer *peer, const u8 *msg)
@@ -5703,28 +5712,33 @@ static void handle_dev_quiesce(struct peer *peer, const u8 *msg)
57035712
maybe_send_stfu(peer);
57045713
}
57055714

5706-
static void handle_channeld_alt_addr(struct peer *peer, const u8 *msg)
5715+
static void handle_channeld_peer_alt_addrs(struct peer *peer, const u8 *msg)
57075716
{
5708-
struct pubkey peer_pk;
5717+
struct pubkey p_pk;
57095718
u8 *our_alt_addr;
57105719

5711-
if (!fromwire_channeld_alt_addr(peer, msg, &peer_pk, &our_alt_addr)) {
5712-
master_badmsg(WIRE_CHANNELD_ALT_ADDR, msg);
5713-
}
5720+
if (!fromwire_channeld_peer_alt_addrs(peer, msg, &p_pk, &our_alt_addr))
5721+
master_badmsg(WIRE_CHANNELD_PEER_ALT_ADDRS, msg);
57145722

5715-
if (pubkey_from_node_id(&peer_pk, &peer->id)) {
5716-
u8 *peer_msg = towire_peer_alt_addr(peer, &peer_pk, our_alt_addr);
5723+
if (pubkey_from_node_id(&p_pk, &peer->id)) {
5724+
u8 *peer_msg = towire_peer_alt_addr(peer,
5725+
&p_pk,
5726+
our_alt_addr);
57175727
peer_write(peer->pps, take(peer_msg));
57185728
}
5729+
5730+
/* FIXME(maxrantil): free p_pk & our_alt_addr */
57195731
}
57205732

5733+
#include <stdio.h>
57215734
static void req_in(struct peer *peer, const u8 *msg)
57225735
{
57235736
enum channeld_wire t = fromwire_peektype(msg);
57245737

57255738
switch (t) {
5726-
case WIRE_CHANNELD_ALT_ADDR:
5727-
handle_channeld_alt_addr(peer, msg);
5739+
case WIRE_CHANNELD_PEER_ALT_ADDRS:
5740+
fprintf(stderr, "WIRE_CHANNELD_PEER_ALT_ADDRS message recieved\n");
5741+
handle_channeld_peer_alt_addrs(peer, msg);
57285742
return;
57295743
case WIRE_CHANNELD_FUNDING_DEPTH:
57305744
handle_funding_depth(peer, msg);
@@ -5823,6 +5837,7 @@ static void req_in(struct peer *peer, const u8 *msg)
58235837
case WIRE_CHANNELD_SPLICE_STATE_ERROR:
58245838
case WIRE_CHANNELD_LOCAL_ANCHOR_INFO:
58255839
case WIRE_CHANNELD_REESTABLISHED:
5840+
case WIRE_CHANNELD_OUR_ALT_ADDRS:
58265841
break;
58275842
}
58285843
master_badmsg(-1, msg);

channeld/channeld_wire.csv

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,14 @@ msgdata,channeld_upgraded,new_type,channel_type,
353353
msgtype,channeld_blockheight,1012
354354
msgdata,channeld_blockheight,blockheight,u32,
355355

356-
# master -> channeld Send peer alternative addresses
357-
msgtype,channeld_alt_addr,1014
358-
msgdata,channeld_alt_addr,node_id,point,
359-
msgdata,channeld_alt_addr,alt_addr_len,u16,
360-
msgdata,channeld_alt_addr,alt_addr,u8,alt_addr_len,
356+
# master -> channeld: send peer our alternative addresses
357+
msgtype,channeld_peer_alt_addrs,1035
358+
msgdata,channeld_peer_alt_addrs,node_id,point,
359+
msgdata,channeld_peer_alt_addrs,alt_addr_len,u16,
360+
msgdata,channeld_peer_alt_addrs,alt_addr,u8,alt_addr_len,
361+
362+
# channeld -> master: send our alternative addresses to our db
363+
msgtype,channeld_our_alt_addrs,1037
364+
msgdata,channeld_our_alt_addrs,node_id,point,
365+
msgdata,channeld_our_alt_addrs,alt_addr_len,u16,
366+
msgdata,channeld_our_alt_addrs,alt_addr,u8,alt_addr_len,

connectd/connectd.c

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -318,19 +318,44 @@ static struct io_plan *handshake_in_success(struct io_conn *conn,
318318
node_id_from_pubkey(&id, id_key);
319319
status_peer_debug(&id, "Connect IN");
320320

321+
// Retrieve and print local addresses and ports
322+
struct sockaddr_in local_addr;
323+
socklen_t addr_len = sizeof(struct sockaddr_in);
324+
325+
// Get local address and port
326+
if (getsockname(io_conn_fd(conn), (struct sockaddr *)&local_addr, &addr_len) == -1) {
327+
perror("getsockname failed");
328+
} else {
329+
fprintf(stderr, "--> Listening on %s:%d\n",
330+
inet_ntoa(local_addr.sin_addr),
331+
ntohs(local_addr.sin_port));
332+
}
333+
321334
/* Confirm that peer connects to the alt-bind-addr you sent */
322335
if (daemon->alt_bind_addr) {
323-
char *incoming_addr = fmt_wireaddr_internal(tmpctx, addr);
324-
fprintf(stderr, "--> incoming connection addr: '%s'\n", incoming_addr);
325-
326-
char *bind_addrs = tal_strdup(NULL, (char *)daemon->alt_bind_addr);
336+
char listening_addr[INET_ADDRSTRLEN];
337+
inet_ntop(AF_INET, &(local_addr.sin_addr), listening_addr, INET_ADDRSTRLEN);
338+
int listening_port = ntohs(local_addr.sin_port);
339+
340+
// Create a string with the full address including port
341+
char full_listening_addr[INET_ADDRSTRLEN + 6]; // Extra space for ':port'
342+
snprintf(full_listening_addr,
343+
sizeof(full_listening_addr),
344+
"%s:%d",
345+
listening_addr,
346+
listening_port);
347+
348+
char *bind_addrs = tal_strdup(tmpctx, (char *)daemon->alt_bind_addr);
327349
char *token = strtok(bind_addrs, ",");
328350

329351
while (token != NULL) {
330-
fprintf(stderr, "--> comparing '%s' with token '%s'\n", incoming_addr, token);
331-
if (strcmp(incoming_addr, token) == 0) {
352+
fprintf(stderr, "--> comparing '%s' with token '%s'\n", full_listening_addr, token);
353+
if (strcmp(full_listening_addr, token) == 0) {
354+
char *whitelist_addr = tal_strdup(tmpctx, full_listening_addr);
332355
fprintf(stderr, "--> INSIDE\n");
333-
towire_connectd_alt_addr_whitelist(tmpctx, id_key, (u8 *)incoming_addr);
356+
u8 *msg = towire_connectd_alt_addr_whitelist(NULL, id_key, (u8 *)whitelist_addr);
357+
daemon_conn_send(daemon->master, take(msg));
358+
tal_free(whitelist_addr);
334359
break;
335360
}
336361
token = strtok(NULL, ",");
@@ -533,18 +558,18 @@ static struct io_plan *connection_in(struct io_conn *conn,
533558

534559
void handle_peer_alt_addr(struct peer *peer, const u8 *msg)
535560
{
536-
u8 *peer_alt_addr;
561+
u8 *peer_alt_addrs;
537562
struct pubkey peer_id;
538563
/* FIXME(maxrantil): u32 *timestamp = NULL; */
539564

540-
if (!fromwire_peer_alt_addr(peer, msg, &peer_id, &peer_alt_addr/* FIXME(maxrantil): , timestamp */)) {
565+
if (!fromwire_peer_alt_addr(peer, msg, &peer_id, &peer_alt_addrs/* FIXME(maxrantil): , timestamp */)) {
541566
master_badmsg(WIRE_PEER_ALT_ADDR, msg);
542567
}
543568

544-
u8 *fwd_msg = towire_connectd_alt_addr(NULL, &peer_id, peer_alt_addr);
569+
u8 *fwd_msg = towire_connectd_peer_alt_addr(tmpctx, &peer_id, peer_alt_addrs);
545570
daemon_conn_send(peer->daemon->master, take(fwd_msg));
546571

547-
tal_free(peer_alt_addr); /* FIXME(maxrantil): Investigare further on freeing like this */
572+
tal_free(peer_alt_addrs); /* FIXME(maxrantil): Investigare further on freeing like this */
548573
}
549574

550575
/*~ <hello>I speak web socket</hello>.
@@ -2135,14 +2160,17 @@ static void handle_alt_addr_whitelist_reply(struct daemon *daemon, const u8 *msg
21352160
u8 *incoming_addr;
21362161
bool is_whitelisted;
21372162

2138-
fprintf(stderr, "INSIDE WHITELIST\n");
2139-
21402163
if (!fromwire_connectd_alt_addr_whitelist_reply(tmpctx,
2141-
msg, &p_pk, &incoming_addr, &is_whitelisted)) {
2164+
msg,
2165+
&p_pk,
2166+
&incoming_addr,
2167+
&is_whitelisted)) {
21422168
master_badmsg(WIRE_CONNECTD_ALT_ADDR_WHITELIST_REPLY, msg);
21432169
return;
21442170
}
21452171

2172+
fprintf(stderr, "INSIDE handle_alt_addr_whitelist_reply\n");
2173+
21462174
struct node_id id;
21472175
node_id_from_pubkey(&id, &p_pk);
21482176
peer = peer_htable_get(daemon->peers, &id);
@@ -2155,12 +2183,14 @@ static void handle_alt_addr_whitelist_reply(struct daemon *daemon, const u8 *msg
21552183

21562184
if (is_whitelisted) {
21572185
status_peer_unusual(&peer->id,
2158-
"Peer's address %s is in the whitelist. Accepting connection.",
2159-
incoming_addr);
2186+
"Peer's address %s is in the whitelist. Accepting connection.",
2187+
incoming_addr);
2188+
fprintf(stderr, "END GOAL! YES\n");
21602189
} else {
21612190
status_peer_unusual(&peer->id,
2162-
"Connection attempt from address %s which is not in the whitelist. The peer has not received an alternative address from me. Closing connection.",
2163-
incoming_addr);
2191+
"Connection attempt from address %s which is not in the whitelist. The peer has not received an alternative address from me. Closing connection.",
2192+
incoming_addr);
2193+
fprintf(stderr, "END GOAL! NO\n");
21642194
io_close(peer->to_peer);
21652195
}
21662196
}
@@ -2267,7 +2297,7 @@ static struct io_plan *recv_req(struct io_conn *conn,
22672297
case WIRE_CONNECTD_CUSTOMMSG_IN:
22682298
case WIRE_CONNECTD_PEER_DISCONNECT_DONE:
22692299
case WIRE_CONNECTD_START_SHUTDOWN_REPLY:
2270-
case WIRE_CONNECTD_ALT_ADDR:
2300+
case WIRE_CONNECTD_PEER_ALT_ADDR:
22712301
case WIRE_CONNECTD_ALT_ADDR_WHITELIST:
22722302
break;
22732303
}

connectd/connectd_wire.csv

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ msgtype,connectd_dev_suppress_gossip,2032
173173
msgtype,connectd_dev_exhaust_fds,2036
174174

175175
# connectd -> master: alternative connection address
176-
msgtype,connectd_alt_addr,2037
177-
msgdata,connectd_alt_addr,node_id,point,
178-
msgdata,connectd_alt_addr,addr_len,u8,
179-
msgdata,connectd_alt_addr,addr,byte,addr_len,
176+
msgtype,connectd_peer_alt_addr,2037
177+
msgdata,connectd_peer_alt_addr,node_id,point,
178+
msgdata,connectd_peer_alt_addr,addr_len,u8,
179+
msgdata,connectd_peer_alt_addr,addr,byte,addr_len,
180180

181181
# connectd -> master: alternative connection whitelist
182182
msgtype,connectd_alt_addr_whitelist,2038

contrib/startup_regtest.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,15 @@ start_nodes() {
177177

178178
for i in $(seq "$node_count"); do
179179
socket=$(( 7070 + i * 101))
180+
alt_port=$(( 7070 + i * 102))
180181
mkdir -p "$LIGHTNING_DIR/l$i"
181182
# Node config
182183
cat <<- EOF > "$LIGHTNING_DIR/l$i/config"
183184
network=$network
184185
log-level=debug
185186
log-file=$LIGHTNING_DIR/l$i/log
186187
addr=localhost:$socket
187-
alt-addr=127.0.0.21:$socket
188+
alt-addr=127.0.0.21:$alt_port
188189
allow-deprecated-apis=false
189190
developer
190191
dev-fast-gossip

lightningd/channel_control.c

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,27 @@ static void handle_local_anchors(struct channel *channel, const u8 *msg)
13861386
}
13871387
}
13881388

1389+
#include <stdio.h>
1390+
static void handle_our_alt_addrs(struct lightningd *ld, struct channel *channel, const u8 *msg)
1391+
{
1392+
struct pubkey p_pk;
1393+
struct node_id p_id;
1394+
u8 *our_alt_addr;
1395+
1396+
if (!fromwire_channeld_our_alt_addrs(tmpctx, msg, &p_pk, &our_alt_addr)) {
1397+
channel_internal_error(channel,
1398+
"bad channeld_our_alt_addrs %s",
1399+
tal_hex(channel, msg));
1400+
return;
1401+
}
1402+
1403+
// fprintf(stderr, "\n!!!YEEESSS!!! NEXT!\n");
1404+
node_id_from_pubkey(&p_id, &p_pk);
1405+
wallet_add_alt_addr(ld->wallet->db, &p_id, (char *)our_alt_addr, true);
1406+
1407+
/* FIXME(maxrantil): free peer_pk & our_alt_addr & all things needed */
1408+
}
1409+
13891410
static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
13901411
{
13911412
enum channeld_wire t = fromwire_peektype(msg);
@@ -1466,9 +1487,12 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
14661487
case WIRE_CHANNELD_UPGRADED:
14671488
handle_channel_upgrade(sd->channel, msg);
14681489
break;
1490+
case WIRE_CHANNELD_OUR_ALT_ADDRS:
1491+
handle_our_alt_addrs(sd->ld, sd->channel, msg);
1492+
break;
1493+
14691494
/* And we never get these from channeld. */
14701495
case WIRE_CHANNELD_INIT:
1471-
case WIRE_CHANNELD_ALT_ADDR:
14721496
case WIRE_CHANNELD_FUNDING_DEPTH:
14731497
case WIRE_CHANNELD_OFFER_HTLC:
14741498
case WIRE_CHANNELD_FULFILL_HTLC:
@@ -1483,6 +1507,7 @@ static unsigned channel_msg(struct subd *sd, const u8 *msg, const int *fds)
14831507
case WIRE_CHANNELD_DEV_MEMLEAK:
14841508
case WIRE_CHANNELD_DEV_QUIESCE:
14851509
case WIRE_CHANNELD_GOT_INFLIGHT:
1510+
case WIRE_CHANNELD_PEER_ALT_ADDRS:
14861511
/* Replies go to requests. */
14871512
case WIRE_CHANNELD_OFFER_HTLC_REPLY:
14881513
case WIRE_CHANNELD_DEV_REENABLE_COMMIT_REPLY:
@@ -2348,24 +2373,24 @@ static struct command_result *json_alt_addr(struct command *cmd,
23482373
const jsmntok_t *obj UNNEEDED,
23492374
const jsmntok_t *params)
23502375
{
2351-
struct node_id *peer_node_id;
2376+
struct node_id *p_id;
23522377
struct pubkey p_pk; /* FIXME(maxrantil): maybe take this away again (send node_id struct instead) to clean it up? */
23532378
struct peer *peer;
23542379
struct channel *channel;
23552380
const char *our_alt_addr;
23562381
bool more_than_one;
23572382

23582383
if (!param_check(cmd, buffer, params,
2359-
p_req("node_id", param_node_id, &peer_node_id),
2384+
p_req("node_id", param_node_id, &p_id),
23602385
p_req("alt_addr", param_string, &our_alt_addr),
23612386
NULL))
23622387
return command_param_failed();
23632388

2364-
peer = peer_by_id(cmd->ld, peer_node_id);
2389+
peer = peer_by_id(cmd->ld, p_id);
23652390
if (!peer) {
23662391
return command_fail(cmd, JSONRPC2_INVALID_REQUEST,
23672392
"No such peer: %s",
2368-
fmt_node_id(cmd, peer_node_id));
2393+
fmt_node_id(cmd, p_id));
23692394
}
23702395

23712396
channel = peer_any_channel(peer, channel_state_can_add_htlc, &more_than_one);
@@ -2378,13 +2403,15 @@ static struct command_result *json_alt_addr(struct command *cmd,
23782403
if (command_check_only(cmd))
23792404
return command_check_done(cmd);
23802405

2381-
if (pubkey_from_node_id(&p_pk, peer_node_id)) {
2406+
if (pubkey_from_node_id(&p_pk, p_id)) {
23822407
/* FIXME(maxrantil): make 'our_alt_addr into a double pointer, array of arrays, for sending many. */
2383-
u8 *msg = towire_channeld_alt_addr(peer, &p_pk, (u8 *)our_alt_addr);
2408+
u8 *msg = towire_channeld_peer_alt_addrs(peer,
2409+
&p_pk,
2410+
(u8 *)our_alt_addr);
23842411
subd_send_msg(channel->owner, take(msg));
23852412
}
23862413

2387-
wallet_add_alt_addr(cmd->ld->wallet->db, peer_node_id, our_alt_addr, true);
2414+
wallet_add_alt_addr(cmd->ld->wallet->db, p_id, our_alt_addr, true);
23882415

23892416
/* FIXME(maxrantil), We need to add this to 'listnodes' command too! */
23902417

0 commit comments

Comments
 (0)