mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 09:54:16 +01:00
gossipd: send updated node_annoucement remote_addr
This is the cheapest algo I came up with that simply checks that the same `remote_addr` has been report by two different peers. Can be improved in many ways: - Check by connecting to a radonm peers in the network - Check for more than two confirmations or a certain fraction - ... Changelog-Added: Send updated node_annoucement when two peers report the same remote_addr.
This commit is contained in:
parent
28b4e57974
commit
67fdc6f8ad
@ -1,6 +1,7 @@
|
|||||||
/* Routines to make our own gossip messages. Not as in "we're the gossip
|
/* Routines to make our own gossip messages. Not as in "we're the gossip
|
||||||
* generation, man!" */
|
* generation, man!" */
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include <ccan/asort/asort.h>
|
||||||
#include <ccan/cast/cast.h>
|
#include <ccan/cast/cast.h>
|
||||||
#include <ccan/mem/mem.h>
|
#include <ccan/mem/mem.h>
|
||||||
#include <common/daemon_conn.h>
|
#include <common/daemon_conn.h>
|
||||||
@ -19,6 +20,15 @@
|
|||||||
#include <hsmd/hsmd_wiregen.h>
|
#include <hsmd/hsmd_wiregen.h>
|
||||||
#include <wire/wire_sync.h>
|
#include <wire/wire_sync.h>
|
||||||
|
|
||||||
|
static bool wireaddr_arr_contains(const struct wireaddr *was,
|
||||||
|
const struct wireaddr *wa)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < tal_count(was); i++)
|
||||||
|
if (wireaddr_eq(&was[i], wa))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a node_announcement with the given signature. It may be NULL in the
|
/* Create a node_announcement with the given signature. It may be NULL in the
|
||||||
* case we need to create a provisional announcement for the HSM to sign.
|
* case we need to create a provisional announcement for the HSM to sign.
|
||||||
* This is called twice: once with the dummy signature to get it signed and a
|
* This is called twice: once with the dummy signature to get it signed and a
|
||||||
@ -30,16 +40,39 @@ static u8 *create_node_announcement(const tal_t *ctx, struct daemon *daemon,
|
|||||||
u32 timestamp,
|
u32 timestamp,
|
||||||
const struct lease_rates *rates)
|
const struct lease_rates *rates)
|
||||||
{
|
{
|
||||||
|
struct wireaddr *was;
|
||||||
u8 *addresses = tal_arr(tmpctx, u8, 0);
|
u8 *addresses = tal_arr(tmpctx, u8, 0);
|
||||||
u8 *announcement;
|
u8 *announcement;
|
||||||
struct tlv_node_ann_tlvs *na_tlv;
|
struct tlv_node_ann_tlvs *na_tlv;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
/* add all announceable addresses */
|
||||||
|
was = tal_arr(tmpctx, struct wireaddr, 0);
|
||||||
|
for (i = 0; i < tal_count(daemon->announceable); i++)
|
||||||
|
tal_arr_expand(&was, daemon->announceable[i]);
|
||||||
|
|
||||||
|
/* add reported `remote_addr` v4 and v6 of our self */
|
||||||
|
if (daemon->remote_addr_v4 != NULL &&
|
||||||
|
!wireaddr_arr_contains(was, daemon->remote_addr_v4))
|
||||||
|
tal_arr_expand(&was, *daemon->remote_addr_v4);
|
||||||
|
if (daemon->remote_addr_v6 != NULL &&
|
||||||
|
!wireaddr_arr_contains(was, daemon->remote_addr_v6))
|
||||||
|
tal_arr_expand(&was, *daemon->remote_addr_v6);
|
||||||
|
|
||||||
|
/* Sort by address type again, as we added dynamic remote_addr v4/v6. */
|
||||||
|
/* BOLT #7:
|
||||||
|
*
|
||||||
|
* The origin node:
|
||||||
|
*...
|
||||||
|
* - MUST place address descriptors in ascending order.
|
||||||
|
*/
|
||||||
|
asort(was, tal_count(was), wireaddr_cmp_type, NULL);
|
||||||
|
|
||||||
if (!sig)
|
if (!sig)
|
||||||
sig = talz(tmpctx, secp256k1_ecdsa_signature);
|
sig = talz(tmpctx, secp256k1_ecdsa_signature);
|
||||||
|
|
||||||
for (i = 0; i < tal_count(daemon->announceable); i++)
|
for (i = 0; i < tal_count(was); i++)
|
||||||
towire_wireaddr(&addresses, &daemon->announceable[i]);
|
towire_wireaddr(&addresses, &was[i]);
|
||||||
|
|
||||||
na_tlv = tlv_node_ann_tlvs_new(tmpctx);
|
na_tlv = tlv_node_ann_tlvs_new(tmpctx);
|
||||||
na_tlv->option_will_fund = cast_const(struct lease_rates *, rates);
|
na_tlv->option_will_fund = cast_const(struct lease_rates *, rates);
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <common/timeout.h>
|
#include <common/timeout.h>
|
||||||
#include <common/type_to_string.h>
|
#include <common/type_to_string.h>
|
||||||
#include <common/wire_error.h>
|
#include <common/wire_error.h>
|
||||||
|
#include <common/wireaddr.h>
|
||||||
#include <connectd/connectd_gossipd_wiregen.h>
|
#include <connectd/connectd_gossipd_wiregen.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <gossipd/gossip_generation.h>
|
#include <gossipd/gossip_generation.h>
|
||||||
@ -341,6 +342,53 @@ static void handle_local_private_channel(struct daemon *daemon, const u8 *msg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* lightningd tells us it has dicovered and verified new `remote_addr`.
|
||||||
|
* We can use this to update our node announcement. */
|
||||||
|
static void handle_remote_addr(struct daemon *daemon, const u8 *msg)
|
||||||
|
{
|
||||||
|
struct wireaddr remote_addr;
|
||||||
|
|
||||||
|
if (!fromwire_gossipd_remote_addr(msg, &remote_addr))
|
||||||
|
master_badmsg(WIRE_GOSSIPD_REMOTE_ADDR, msg);
|
||||||
|
|
||||||
|
/* current best guess is that we use DEFAULT_PORT on public internet */
|
||||||
|
remote_addr.port = DEFAULT_PORT;
|
||||||
|
|
||||||
|
switch (remote_addr.type) {
|
||||||
|
case ADDR_TYPE_IPV4:
|
||||||
|
if (daemon->remote_addr_v4 != NULL &&
|
||||||
|
wireaddr_eq_without_port(daemon->remote_addr_v4,
|
||||||
|
&remote_addr))
|
||||||
|
break;
|
||||||
|
tal_free(daemon->remote_addr_v4);
|
||||||
|
daemon->remote_addr_v4 = tal_dup(daemon, struct wireaddr,
|
||||||
|
&remote_addr);
|
||||||
|
goto update_node_annoucement;
|
||||||
|
case ADDR_TYPE_IPV6:
|
||||||
|
if (daemon->remote_addr_v6 != NULL &&
|
||||||
|
wireaddr_eq_without_port(daemon->remote_addr_v6,
|
||||||
|
&remote_addr))
|
||||||
|
break;
|
||||||
|
tal_free(daemon->remote_addr_v6);
|
||||||
|
daemon->remote_addr_v6 = tal_dup(daemon, struct wireaddr,
|
||||||
|
&remote_addr);
|
||||||
|
goto update_node_annoucement;
|
||||||
|
|
||||||
|
/* ignore all other cases */
|
||||||
|
case ADDR_TYPE_TOR_V2_REMOVED:
|
||||||
|
case ADDR_TYPE_TOR_V3:
|
||||||
|
case ADDR_TYPE_DNS:
|
||||||
|
case ADDR_TYPE_WEBSOCKET:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
update_node_annoucement:
|
||||||
|
status_debug("Update our node_announcement for discovered address: %s",
|
||||||
|
fmt_wireaddr(tmpctx, &remote_addr));
|
||||||
|
maybe_send_own_node_announce(daemon, false);
|
||||||
|
}
|
||||||
|
|
||||||
/*~ This is where connectd tells us about a new peer we might want to
|
/*~ This is where connectd tells us about a new peer we might want to
|
||||||
* gossip with. */
|
* gossip with. */
|
||||||
static void connectd_new_peer(struct daemon *daemon, const u8 *msg)
|
static void connectd_new_peer(struct daemon *daemon, const u8 *msg)
|
||||||
@ -993,6 +1041,10 @@ static struct io_plan *recv_req(struct io_conn *conn,
|
|||||||
case WIRE_GOSSIPD_LOCAL_PRIVATE_CHANNEL:
|
case WIRE_GOSSIPD_LOCAL_PRIVATE_CHANNEL:
|
||||||
handle_local_private_channel(daemon, msg);
|
handle_local_private_channel(daemon, msg);
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
case WIRE_GOSSIPD_REMOTE_ADDR:
|
||||||
|
handle_remote_addr(daemon, msg);
|
||||||
|
goto done;
|
||||||
#if DEVELOPER
|
#if DEVELOPER
|
||||||
case WIRE_GOSSIPD_DEV_SET_MAX_SCIDS_ENCODE_SIZE:
|
case WIRE_GOSSIPD_DEV_SET_MAX_SCIDS_ENCODE_SIZE:
|
||||||
dev_set_max_scids_encode_size(daemon, msg);
|
dev_set_max_scids_encode_size(daemon, msg);
|
||||||
@ -1062,6 +1114,8 @@ int main(int argc, char *argv[])
|
|||||||
daemon->node_announce_regen_timer = NULL;
|
daemon->node_announce_regen_timer = NULL;
|
||||||
daemon->current_blockheight = 0; /* i.e. unknown */
|
daemon->current_blockheight = 0; /* i.e. unknown */
|
||||||
daemon->rates = NULL;
|
daemon->rates = NULL;
|
||||||
|
daemon->remote_addr_v4 = NULL;
|
||||||
|
daemon->remote_addr_v6 = NULL;
|
||||||
list_head_init(&daemon->deferred_updates);
|
list_head_init(&daemon->deferred_updates);
|
||||||
|
|
||||||
/* Tell the ecdh() function how to talk to hsmd */
|
/* Tell the ecdh() function how to talk to hsmd */
|
||||||
|
@ -47,6 +47,10 @@ struct daemon {
|
|||||||
/* What addresses we can actually announce. */
|
/* What addresses we can actually announce. */
|
||||||
struct wireaddr *announceable;
|
struct wireaddr *announceable;
|
||||||
|
|
||||||
|
/* verified remote_addr as reported by recent peers */
|
||||||
|
struct wireaddr *remote_addr_v4;
|
||||||
|
struct wireaddr *remote_addr_v6;
|
||||||
|
|
||||||
/* Timer until we can send an updated node_announcement */
|
/* Timer until we can send an updated node_announcement */
|
||||||
struct oneshot *node_announce_timer;
|
struct oneshot *node_announce_timer;
|
||||||
|
|
||||||
|
@ -125,3 +125,7 @@ msgdata,gossipd_local_private_channel,features,u8,len
|
|||||||
# Tell gossipd we used the channel update (in case it was deferred)
|
# Tell gossipd we used the channel update (in case it was deferred)
|
||||||
msgtype,gossipd_used_local_channel_update,3052
|
msgtype,gossipd_used_local_channel_update,3052
|
||||||
msgdata,gossipd_used_local_channel_update,scid,short_channel_id,
|
msgdata,gossipd_used_local_channel_update,scid,short_channel_id,
|
||||||
|
|
||||||
|
# Tell gossipd we have discovered a new remote_addr
|
||||||
|
msgtype,gossipd_remote_addr,3009
|
||||||
|
msgdata,gossipd_remote_addr,remote_addr,wireaddr,
|
||||||
|
|
@ -9,6 +9,7 @@ GOSSIPD_TEST_PROGRAMS := $(GOSSIPD_TEST_OBJS:.o=)
|
|||||||
GOSSIPD_TEST_COMMON_OBJS := \
|
GOSSIPD_TEST_COMMON_OBJS := \
|
||||||
common/amount.o \
|
common/amount.o \
|
||||||
common/autodata.o \
|
common/autodata.o \
|
||||||
|
common/base32.o \
|
||||||
common/coin_mvt.o \
|
common/coin_mvt.o \
|
||||||
common/bigsize.o \
|
common/bigsize.o \
|
||||||
common/blindedpath.o \
|
common/blindedpath.o \
|
||||||
@ -25,6 +26,7 @@ GOSSIPD_TEST_COMMON_OBJS := \
|
|||||||
common/sphinx.o \
|
common/sphinx.o \
|
||||||
common/type_to_string.o \
|
common/type_to_string.o \
|
||||||
common/utils.o \
|
common/utils.o \
|
||||||
|
common/wireaddr.o \
|
||||||
gossipd/gossip_store_wiregen.o \
|
gossipd/gossip_store_wiregen.o \
|
||||||
wire/peer$(EXP)_wiregen.o \
|
wire/peer$(EXP)_wiregen.o \
|
||||||
wire/onion$(EXP)_wiregen.o \
|
wire/onion$(EXP)_wiregen.o \
|
||||||
|
@ -62,15 +62,6 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED,
|
|||||||
/* Generated stub for ecdh */
|
/* Generated stub for ecdh */
|
||||||
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
||||||
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
||||||
/* Generated stub for fmt_wireaddr_without_port */
|
|
||||||
char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); }
|
|
||||||
/* Generated stub for fromwire_wireaddr */
|
|
||||||
bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for fromwire_wireaddr_array */
|
|
||||||
struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); }
|
|
||||||
/* Generated stub for gossip_store_add */
|
/* Generated stub for gossip_store_add */
|
||||||
u64 gossip_store_add(struct gossip_store *gs UNNEEDED, const u8 *gossip_msg UNNEEDED,
|
u64 gossip_store_add(struct gossip_store *gs UNNEEDED, const u8 *gossip_msg UNNEEDED,
|
||||||
u32 timestamp UNNEEDED, bool push UNNEEDED, const u8 *addendum UNNEEDED)
|
u32 timestamp UNNEEDED, bool push UNNEEDED, const u8 *addendum UNNEEDED)
|
||||||
@ -157,9 +148,6 @@ void status_fmt(enum log_level level UNNEEDED,
|
|||||||
const char *fmt UNNEEDED, ...)
|
const char *fmt UNNEEDED, ...)
|
||||||
|
|
||||||
{ fprintf(stderr, "status_fmt called!\n"); abort(); }
|
{ fprintf(stderr, "status_fmt called!\n"); abort(); }
|
||||||
/* Generated stub for towire_wireaddr */
|
|
||||||
void towire_wireaddr(u8 **pptr UNNEEDED, const struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "towire_wireaddr called!\n"); abort(); }
|
|
||||||
/* AUTOGENERATED MOCKS END */
|
/* AUTOGENERATED MOCKS END */
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
@ -33,9 +33,6 @@ void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
|||||||
/* Generated stub for find_peer */
|
/* Generated stub for find_peer */
|
||||||
struct peer *find_peer(struct daemon *daemon UNNEEDED, const struct node_id *id UNNEEDED)
|
struct peer *find_peer(struct daemon *daemon UNNEEDED, const struct node_id *id UNNEEDED)
|
||||||
{ fprintf(stderr, "find_peer called!\n"); abort(); }
|
{ fprintf(stderr, "find_peer called!\n"); abort(); }
|
||||||
/* Generated stub for fmt_wireaddr_without_port */
|
|
||||||
char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); }
|
|
||||||
/* Generated stub for force_node_announce_rexmit */
|
/* Generated stub for force_node_announce_rexmit */
|
||||||
void force_node_announce_rexmit(struct routing_state *rstate UNNEEDED, struct node *node UNNEEDED)
|
void force_node_announce_rexmit(struct routing_state *rstate UNNEEDED, struct node *node UNNEEDED)
|
||||||
{ fprintf(stderr, "force_node_announce_rexmit called!\n"); abort(); }
|
{ fprintf(stderr, "force_node_announce_rexmit called!\n"); abort(); }
|
||||||
@ -51,9 +48,6 @@ bool fromwire_hsmd_cupdate_sig_reply(const tal_t *ctx UNNEEDED, const void *p UN
|
|||||||
/* Generated stub for fromwire_hsmd_node_announcement_sig_reply */
|
/* Generated stub for fromwire_hsmd_node_announcement_sig_reply */
|
||||||
bool fromwire_hsmd_node_announcement_sig_reply(const void *p UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED)
|
bool fromwire_hsmd_node_announcement_sig_reply(const void *p UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_hsmd_node_announcement_sig_reply called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_hsmd_node_announcement_sig_reply called!\n"); abort(); }
|
||||||
/* Generated stub for fromwire_wireaddr */
|
|
||||||
bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for get_node */
|
/* Generated stub for get_node */
|
||||||
struct node *get_node(struct routing_state *rstate UNNEEDED,
|
struct node *get_node(struct routing_state *rstate UNNEEDED,
|
||||||
const struct node_id *id UNNEEDED)
|
const struct node_id *id UNNEEDED)
|
||||||
@ -121,9 +115,6 @@ u8 *towire_hsmd_cupdate_sig_req(const tal_t *ctx UNNEEDED, const u8 *cu UNNEEDED
|
|||||||
/* Generated stub for towire_hsmd_node_announcement_sig_req */
|
/* Generated stub for towire_hsmd_node_announcement_sig_req */
|
||||||
u8 *towire_hsmd_node_announcement_sig_req(const tal_t *ctx UNNEEDED, const u8 *announcement UNNEEDED)
|
u8 *towire_hsmd_node_announcement_sig_req(const tal_t *ctx UNNEEDED, const u8 *announcement UNNEEDED)
|
||||||
{ fprintf(stderr, "towire_hsmd_node_announcement_sig_req called!\n"); abort(); }
|
{ fprintf(stderr, "towire_hsmd_node_announcement_sig_req called!\n"); abort(); }
|
||||||
/* Generated stub for towire_wireaddr */
|
|
||||||
void towire_wireaddr(u8 **pptr UNNEEDED, const struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "towire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for wire_sync_read */
|
/* Generated stub for wire_sync_read */
|
||||||
u8 *wire_sync_read(const tal_t *ctx UNNEEDED, int fd UNNEEDED)
|
u8 *wire_sync_read(const tal_t *ctx UNNEEDED, int fd UNNEEDED)
|
||||||
{ fprintf(stderr, "wire_sync_read called!\n"); abort(); }
|
{ fprintf(stderr, "wire_sync_read called!\n"); abort(); }
|
||||||
|
@ -51,9 +51,6 @@ void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
|||||||
/* Generated stub for find_peer */
|
/* Generated stub for find_peer */
|
||||||
struct peer *find_peer(struct daemon *daemon UNNEEDED, const struct node_id *id UNNEEDED)
|
struct peer *find_peer(struct daemon *daemon UNNEEDED, const struct node_id *id UNNEEDED)
|
||||||
{ fprintf(stderr, "find_peer called!\n"); abort(); }
|
{ fprintf(stderr, "find_peer called!\n"); abort(); }
|
||||||
/* Generated stub for fmt_wireaddr_without_port */
|
|
||||||
char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); }
|
|
||||||
/* Generated stub for force_node_announce_rexmit */
|
/* Generated stub for force_node_announce_rexmit */
|
||||||
void force_node_announce_rexmit(struct routing_state *rstate UNNEEDED, struct node *node UNNEEDED)
|
void force_node_announce_rexmit(struct routing_state *rstate UNNEEDED, struct node *node UNNEEDED)
|
||||||
{ fprintf(stderr, "force_node_announce_rexmit called!\n"); abort(); }
|
{ fprintf(stderr, "force_node_announce_rexmit called!\n"); abort(); }
|
||||||
@ -72,9 +69,6 @@ bool fromwire_hsmd_cupdate_sig_reply(const tal_t *ctx UNNEEDED, const void *p UN
|
|||||||
/* Generated stub for fromwire_hsmd_node_announcement_sig_reply */
|
/* Generated stub for fromwire_hsmd_node_announcement_sig_reply */
|
||||||
bool fromwire_hsmd_node_announcement_sig_reply(const void *p UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED)
|
bool fromwire_hsmd_node_announcement_sig_reply(const void *p UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_hsmd_node_announcement_sig_reply called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_hsmd_node_announcement_sig_reply called!\n"); abort(); }
|
||||||
/* Generated stub for fromwire_wireaddr */
|
|
||||||
bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for get_node */
|
/* Generated stub for get_node */
|
||||||
struct node *get_node(struct routing_state *rstate UNNEEDED,
|
struct node *get_node(struct routing_state *rstate UNNEEDED,
|
||||||
const struct node_id *id UNNEEDED)
|
const struct node_id *id UNNEEDED)
|
||||||
@ -159,9 +153,6 @@ u8 *towire_warningfmt(const tal_t *ctx UNNEEDED,
|
|||||||
const struct channel_id *channel UNNEEDED,
|
const struct channel_id *channel UNNEEDED,
|
||||||
const char *fmt UNNEEDED, ...)
|
const char *fmt UNNEEDED, ...)
|
||||||
{ fprintf(stderr, "towire_warningfmt called!\n"); abort(); }
|
{ fprintf(stderr, "towire_warningfmt called!\n"); abort(); }
|
||||||
/* Generated stub for towire_wireaddr */
|
|
||||||
void towire_wireaddr(u8 **pptr UNNEEDED, const struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "towire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for wire_sync_read */
|
/* Generated stub for wire_sync_read */
|
||||||
u8 *wire_sync_read(const tal_t *ctx UNNEEDED, int fd UNNEEDED)
|
u8 *wire_sync_read(const tal_t *ctx UNNEEDED, int fd UNNEEDED)
|
||||||
{ fprintf(stderr, "wire_sync_read called!\n"); abort(); }
|
{ fprintf(stderr, "wire_sync_read called!\n"); abort(); }
|
||||||
|
@ -50,15 +50,9 @@ struct short_channel_id *decode_short_ids(const tal_t *ctx UNNEEDED, const u8 *e
|
|||||||
/* Generated stub for ecdh */
|
/* Generated stub for ecdh */
|
||||||
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
||||||
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
||||||
/* Generated stub for fmt_wireaddr_without_port */
|
|
||||||
char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); }
|
|
||||||
/* Generated stub for fromwire_gossipd_dev_set_max_scids_encode_size */
|
/* Generated stub for fromwire_gossipd_dev_set_max_scids_encode_size */
|
||||||
bool fromwire_gossipd_dev_set_max_scids_encode_size(const void *p UNNEEDED, u32 *max UNNEEDED)
|
bool fromwire_gossipd_dev_set_max_scids_encode_size(const void *p UNNEEDED, u32 *max UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_gossipd_dev_set_max_scids_encode_size called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_gossipd_dev_set_max_scids_encode_size called!\n"); abort(); }
|
||||||
/* Generated stub for fromwire_wireaddr */
|
|
||||||
bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for get_cupdate_parts */
|
/* Generated stub for get_cupdate_parts */
|
||||||
void get_cupdate_parts(const u8 *channel_update UNNEEDED,
|
void get_cupdate_parts(const u8 *channel_update UNNEEDED,
|
||||||
const u8 *parts[2] UNNEEDED,
|
const u8 *parts[2] UNNEEDED,
|
||||||
@ -110,9 +104,6 @@ u8 *towire_warningfmt(const tal_t *ctx UNNEEDED,
|
|||||||
const struct channel_id *channel UNNEEDED,
|
const struct channel_id *channel UNNEEDED,
|
||||||
const char *fmt UNNEEDED, ...)
|
const char *fmt UNNEEDED, ...)
|
||||||
{ fprintf(stderr, "towire_warningfmt called!\n"); abort(); }
|
{ fprintf(stderr, "towire_warningfmt called!\n"); abort(); }
|
||||||
/* Generated stub for towire_wireaddr */
|
|
||||||
void towire_wireaddr(u8 **pptr UNNEEDED, const struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "towire_wireaddr called!\n"); abort(); }
|
|
||||||
/* AUTOGENERATED MOCKS END */
|
/* AUTOGENERATED MOCKS END */
|
||||||
|
|
||||||
void status_fmt(enum log_level level UNNEEDED,
|
void status_fmt(enum log_level level UNNEEDED,
|
||||||
|
@ -29,12 +29,6 @@ bool blinding_next_pubkey(const struct pubkey *pk UNNEEDED,
|
|||||||
/* Generated stub for ecdh */
|
/* Generated stub for ecdh */
|
||||||
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
||||||
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
||||||
/* Generated stub for fmt_wireaddr_without_port */
|
|
||||||
char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); }
|
|
||||||
/* Generated stub for fromwire_wireaddr */
|
|
||||||
bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for json_add_member */
|
/* Generated stub for json_add_member */
|
||||||
void json_add_member(struct json_stream *js UNNEEDED,
|
void json_add_member(struct json_stream *js UNNEEDED,
|
||||||
const char *fieldname UNNEEDED,
|
const char *fieldname UNNEEDED,
|
||||||
@ -96,9 +90,6 @@ void status_fmt(enum log_level level UNNEEDED,
|
|||||||
const char *fmt UNNEEDED, ...)
|
const char *fmt UNNEEDED, ...)
|
||||||
|
|
||||||
{ fprintf(stderr, "status_fmt called!\n"); abort(); }
|
{ fprintf(stderr, "status_fmt called!\n"); abort(); }
|
||||||
/* Generated stub for towire_wireaddr */
|
|
||||||
void towire_wireaddr(u8 **pptr UNNEEDED, const struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "towire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for would_ratelimit_cupdate */
|
/* Generated stub for would_ratelimit_cupdate */
|
||||||
bool would_ratelimit_cupdate(struct routing_state *rstate UNNEEDED,
|
bool would_ratelimit_cupdate(struct routing_state *rstate UNNEEDED,
|
||||||
const struct half_chan *hc UNNEEDED,
|
const struct half_chan *hc UNNEEDED,
|
||||||
|
@ -33,15 +33,6 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED,
|
|||||||
/* Generated stub for ecdh */
|
/* Generated stub for ecdh */
|
||||||
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
void ecdh(const struct pubkey *point UNNEEDED, struct secret *ss UNNEEDED)
|
||||||
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
{ fprintf(stderr, "ecdh called!\n"); abort(); }
|
||||||
/* Generated stub for fmt_wireaddr_without_port */
|
|
||||||
char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); }
|
|
||||||
/* Generated stub for fromwire_wireaddr */
|
|
||||||
bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); }
|
|
||||||
/* Generated stub for fromwire_wireaddr_array */
|
|
||||||
struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED)
|
|
||||||
{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); }
|
|
||||||
/* Generated stub for gossip_store_add */
|
/* Generated stub for gossip_store_add */
|
||||||
u64 gossip_store_add(struct gossip_store *gs UNNEEDED, const u8 *gossip_msg UNNEEDED,
|
u64 gossip_store_add(struct gossip_store *gs UNNEEDED, const u8 *gossip_msg UNNEEDED,
|
||||||
u32 timestamp UNNEEDED, bool push UNNEEDED, const u8 *addendum UNNEEDED)
|
u32 timestamp UNNEEDED, bool push UNNEEDED, const u8 *addendum UNNEEDED)
|
||||||
@ -127,9 +118,6 @@ u8 *towire_warningfmt(const tal_t *ctx UNNEEDED,
|
|||||||
const struct channel_id *channel UNNEEDED,
|
const struct channel_id *channel UNNEEDED,
|
||||||
const char *fmt UNNEEDED, ...)
|
const char *fmt UNNEEDED, ...)
|
||||||
{ fprintf(stderr, "towire_warningfmt called!\n"); abort(); }
|
{ fprintf(stderr, "towire_warningfmt called!\n"); abort(); }
|
||||||
/* Generated stub for towire_wireaddr */
|
|
||||||
void towire_wireaddr(u8 **pptr UNNEEDED, const struct wireaddr *addr UNNEEDED)
|
|
||||||
{ fprintf(stderr, "towire_wireaddr called!\n"); abort(); }
|
|
||||||
/* AUTOGENERATED MOCKS END */
|
/* AUTOGENERATED MOCKS END */
|
||||||
|
|
||||||
/* NOOP stub for gossip_store_new */
|
/* NOOP stub for gossip_store_new */
|
||||||
|
@ -176,6 +176,7 @@ static unsigned gossip_msg(struct subd *gossip, const u8 *msg, const int *fds)
|
|||||||
case WIRE_GOSSIPD_ADDGOSSIP_REPLY:
|
case WIRE_GOSSIPD_ADDGOSSIP_REPLY:
|
||||||
case WIRE_GOSSIPD_NEW_BLOCKHEIGHT_REPLY:
|
case WIRE_GOSSIPD_NEW_BLOCKHEIGHT_REPLY:
|
||||||
case WIRE_GOSSIPD_GET_ADDRS_REPLY:
|
case WIRE_GOSSIPD_GET_ADDRS_REPLY:
|
||||||
|
case WIRE_GOSSIPD_REMOTE_ADDR:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WIRE_GOSSIPD_GET_TXOUT:
|
case WIRE_GOSSIPD_GET_TXOUT:
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <connectd/connectd_wiregen.h>
|
#include <connectd/connectd_wiregen.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <gossipd/gossipd_wiregen.h>
|
||||||
#include <hsmd/hsmd_wiregen.h>
|
#include <hsmd/hsmd_wiregen.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <lightningd/bitcoind.h>
|
#include <lightningd/bitcoind.h>
|
||||||
@ -1128,6 +1129,11 @@ static void update_remote_addr(struct lightningd *ld,
|
|||||||
*ld->remote_addr_v4 = *remote_addr;
|
*ld->remote_addr_v4 = *remote_addr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* tell gossip we have a valid update */
|
||||||
|
if (wireaddr_eq_without_port(ld->remote_addr_v4, remote_addr))
|
||||||
|
subd_send_msg(ld->gossip, towire_gossipd_remote_addr(
|
||||||
|
tmpctx,
|
||||||
|
ld->remote_addr_v4));
|
||||||
/* store latest values */
|
/* store latest values */
|
||||||
*ld->remote_addr_v4 = *remote_addr;
|
*ld->remote_addr_v4 = *remote_addr;
|
||||||
ld->remote_addr_v4_peer = peer_id;
|
ld->remote_addr_v4_peer = peer_id;
|
||||||
@ -1143,6 +1149,10 @@ static void update_remote_addr(struct lightningd *ld,
|
|||||||
*ld->remote_addr_v6 = *remote_addr;
|
*ld->remote_addr_v6 = *remote_addr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (wireaddr_eq_without_port(ld->remote_addr_v6, remote_addr))
|
||||||
|
subd_send_msg(ld->gossip, towire_gossipd_remote_addr(
|
||||||
|
tmpctx,
|
||||||
|
ld->remote_addr_v6));
|
||||||
*ld->remote_addr_v6 = *remote_addr;
|
*ld->remote_addr_v6 = *remote_addr;
|
||||||
ld->remote_addr_v6_peer = peer_id;
|
ld->remote_addr_v6_peer = peer_id;
|
||||||
break;
|
break;
|
||||||
|
@ -645,6 +645,9 @@ u8 *towire_errorfmt(const tal_t *ctx UNNEEDED,
|
|||||||
const struct channel_id *channel UNNEEDED,
|
const struct channel_id *channel UNNEEDED,
|
||||||
const char *fmt UNNEEDED, ...)
|
const char *fmt UNNEEDED, ...)
|
||||||
{ fprintf(stderr, "towire_errorfmt called!\n"); abort(); }
|
{ fprintf(stderr, "towire_errorfmt called!\n"); abort(); }
|
||||||
|
/* Generated stub for towire_gossipd_remote_addr */
|
||||||
|
u8 *towire_gossipd_remote_addr(const tal_t *ctx UNNEEDED, const struct wireaddr *remote_addr UNNEEDED)
|
||||||
|
{ fprintf(stderr, "towire_gossipd_remote_addr called!\n"); abort(); }
|
||||||
/* Generated stub for towire_hsmd_sign_bolt12 */
|
/* Generated stub for towire_hsmd_sign_bolt12 */
|
||||||
u8 *towire_hsmd_sign_bolt12(const tal_t *ctx UNNEEDED, const wirestring *messagename UNNEEDED, const wirestring *fieldname UNNEEDED, const struct sha256 *merkleroot UNNEEDED, const u8 *publictweak UNNEEDED)
|
u8 *towire_hsmd_sign_bolt12(const tal_t *ctx UNNEEDED, const wirestring *messagename UNNEEDED, const wirestring *fieldname UNNEEDED, const struct sha256 *merkleroot UNNEEDED, const u8 *publictweak UNNEEDED)
|
||||||
{ fprintf(stderr, "towire_hsmd_sign_bolt12 called!\n"); abort(); }
|
{ fprintf(stderr, "towire_hsmd_sign_bolt12 called!\n"); abort(); }
|
||||||
|
@ -749,6 +749,9 @@ u8 *towire_final_incorrect_cltv_expiry(const tal_t *ctx UNNEEDED, u32 cltv_expir
|
|||||||
/* Generated stub for towire_final_incorrect_htlc_amount */
|
/* Generated stub for towire_final_incorrect_htlc_amount */
|
||||||
u8 *towire_final_incorrect_htlc_amount(const tal_t *ctx UNNEEDED, struct amount_msat incoming_htlc_amt UNNEEDED)
|
u8 *towire_final_incorrect_htlc_amount(const tal_t *ctx UNNEEDED, struct amount_msat incoming_htlc_amt UNNEEDED)
|
||||||
{ fprintf(stderr, "towire_final_incorrect_htlc_amount called!\n"); abort(); }
|
{ fprintf(stderr, "towire_final_incorrect_htlc_amount called!\n"); abort(); }
|
||||||
|
/* Generated stub for towire_gossipd_remote_addr */
|
||||||
|
u8 *towire_gossipd_remote_addr(const tal_t *ctx UNNEEDED, const struct wireaddr *remote_addr UNNEEDED)
|
||||||
|
{ fprintf(stderr, "towire_gossipd_remote_addr called!\n"); abort(); }
|
||||||
/* Generated stub for towire_hsmd_get_output_scriptpubkey */
|
/* Generated stub for towire_hsmd_get_output_scriptpubkey */
|
||||||
u8 *towire_hsmd_get_output_scriptpubkey(const tal_t *ctx UNNEEDED, u64 channel_id UNNEEDED, const struct node_id *peer_id UNNEEDED, const struct pubkey *commitment_point UNNEEDED)
|
u8 *towire_hsmd_get_output_scriptpubkey(const tal_t *ctx UNNEEDED, u64 channel_id UNNEEDED, const struct node_id *peer_id UNNEEDED, const struct pubkey *commitment_point UNNEEDED)
|
||||||
{ fprintf(stderr, "towire_hsmd_get_output_scriptpubkey called!\n"); abort(); }
|
{ fprintf(stderr, "towire_hsmd_get_output_scriptpubkey called!\n"); abort(); }
|
||||||
|
Loading…
Reference in New Issue
Block a user