mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-22 14:42:40 +01:00
gossipd: use the broadcast structure to hold gossip messages.
We currently keep two copies; one in the broadcast structure to send in order, and one in the routing information. Since we already keep the broadcast index in the routing information, use that. Conveniently, a zero index is the same as the old NULL test. Rename struct node's announcement_idx to node_announce_msgidx to make it match the other users. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
b8285db263
commit
1f443df428
5 changed files with 43 additions and 36 deletions
|
@ -53,3 +53,13 @@ struct queued_message *next_broadcast_message(struct broadcast_state *bstate, u6
|
|||
{
|
||||
return uintmap_after(&bstate->broadcasts, &last_index);
|
||||
}
|
||||
|
||||
const u8 *get_broadcast(struct broadcast_state *bstate, u64 msgidx)
|
||||
{
|
||||
struct queued_message *m;
|
||||
|
||||
m = uintmap_get(&bstate->broadcasts, msgidx);
|
||||
if (m)
|
||||
return m->payload;
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -36,4 +36,5 @@ bool replace_broadcast(const tal_t *ctx,
|
|||
|
||||
struct queued_message *next_broadcast_message(struct broadcast_state *bstate, u64 last_index);
|
||||
|
||||
const u8 *get_broadcast(struct broadcast_state *bstate, u64 msgidx);
|
||||
#endif /* LIGHTNING_LIGHTNINGD_GOSSIP_BROADCAST_H */
|
||||
|
|
|
@ -734,6 +734,7 @@ static void handle_get_update(struct peer *peer, const u8 *msg)
|
|||
struct short_channel_id scid;
|
||||
struct chan *chan;
|
||||
const u8 *update;
|
||||
struct routing_state *rstate = peer->daemon->rstate;
|
||||
|
||||
if (!fromwire_gossip_get_update(msg, &scid)) {
|
||||
status_trace("peer %s sent bad gossip_get_update %s",
|
||||
|
@ -742,7 +743,7 @@ static void handle_get_update(struct peer *peer, const u8 *msg)
|
|||
return;
|
||||
}
|
||||
|
||||
chan = get_channel(peer->daemon->rstate, &scid);
|
||||
chan = get_channel(rstate, &scid);
|
||||
if (!chan) {
|
||||
status_unusual("peer %s scid %s: unknown channel",
|
||||
type_to_string(trc, struct pubkey, &peer->id),
|
||||
|
@ -752,9 +753,13 @@ static void handle_get_update(struct peer *peer, const u8 *msg)
|
|||
} else {
|
||||
/* We want update that comes from our end. */
|
||||
if (pubkey_eq(&chan->nodes[0]->id, &peer->daemon->id))
|
||||
update = chan->half[0].channel_update;
|
||||
update = get_broadcast(rstate->broadcasts,
|
||||
chan->half[0]
|
||||
.channel_update_msgidx);
|
||||
else if (pubkey_eq(&chan->nodes[1]->id, &peer->daemon->id))
|
||||
update = chan->half[1].channel_update;
|
||||
update = get_broadcast(rstate->broadcasts,
|
||||
chan->half[1]
|
||||
.channel_update_msgidx);
|
||||
else {
|
||||
status_unusual("peer %s scid %s: not our channel?",
|
||||
type_to_string(trc, struct pubkey,
|
||||
|
@ -1132,7 +1137,7 @@ static void append_half_channel(struct gossip_getchannels_entry **entries,
|
|||
return;
|
||||
|
||||
/* Don't mention non-public inactive channels. */
|
||||
if (!c->active && !c->channel_update)
|
||||
if (!c->active && !c->channel_update_msgidx)
|
||||
return;
|
||||
|
||||
n = tal_count(*entries);
|
||||
|
@ -1144,9 +1149,9 @@ static void append_half_channel(struct gossip_getchannels_entry **entries,
|
|||
e->satoshis = chan->satoshis;
|
||||
e->active = c->active;
|
||||
e->flags = c->flags;
|
||||
e->public = (c->channel_update != NULL);
|
||||
e->public = (c->channel_update_msgidx != 0);
|
||||
e->short_channel_id = chan->scid;
|
||||
e->last_update_timestamp = c->channel_update ? c->last_timestamp : -1;
|
||||
e->last_update_timestamp = c->channel_update_msgidx ? c->last_timestamp : -1;
|
||||
if (e->last_update_timestamp >= 0) {
|
||||
e->base_fee_msat = c->base_fee;
|
||||
e->fee_per_millionth = c->proportional_fee;
|
||||
|
@ -1335,10 +1340,14 @@ static void gossip_send_keepalive_update(struct routing_state *rstate,
|
|||
u64 htlc_minimum_msat;
|
||||
u16 flags, cltv_expiry_delta;
|
||||
u8 *update, *msg, *err;
|
||||
const u8 *old_update;
|
||||
|
||||
/* Parse old update */
|
||||
old_update = get_broadcast(rstate->broadcasts,
|
||||
hc->channel_update_msgidx);
|
||||
|
||||
if (!fromwire_channel_update(
|
||||
hc->channel_update, &sig, &chain_hash, &scid, ×tamp,
|
||||
old_update, &sig, &chain_hash, &scid, ×tamp,
|
||||
&flags, &cltv_expiry_delta, &htlc_minimum_msat, &fee_base_msat,
|
||||
&fee_proportional_millionths)) {
|
||||
status_failed(
|
||||
|
@ -1398,7 +1407,7 @@ static void gossip_refresh_network(struct daemon *daemon)
|
|||
for (size_t i = 0; i < tal_count(n->chans); i++) {
|
||||
struct half_chan *hc = half_chan_from(n, n->chans[i]);
|
||||
|
||||
if (!hc->channel_update) {
|
||||
if (!hc->channel_update_msgidx) {
|
||||
/* Connection is not public yet, so don't even
|
||||
* try to re-announce it */
|
||||
continue;
|
||||
|
@ -1869,6 +1878,7 @@ static struct io_plan *handle_disable_channel(struct io_conn *conn,
|
|||
secp256k1_ecdsa_signature sig;
|
||||
u64 htlc_minimum_msat;
|
||||
u8 *err;
|
||||
const u8 *old_update;
|
||||
|
||||
if (!fromwire_gossip_disable_channel(msg, &scid, &direction, &active) ) {
|
||||
status_unusual("Unable to parse %s",
|
||||
|
@ -1891,7 +1901,7 @@ static struct io_plan *handle_disable_channel(struct io_conn *conn,
|
|||
|
||||
hc->active = active;
|
||||
|
||||
if (!hc->channel_update) {
|
||||
if (!hc->channel_update_msgidx) {
|
||||
status_trace(
|
||||
"Channel %s/%d doesn't have a channel_update yet, can't "
|
||||
"disable",
|
||||
|
@ -1900,8 +1910,11 @@ static struct io_plan *handle_disable_channel(struct io_conn *conn,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
old_update = get_broadcast(daemon->rstate->broadcasts,
|
||||
hc->channel_update_msgidx);
|
||||
|
||||
if (!fromwire_channel_update(
|
||||
hc->channel_update, &sig, &chain_hash, &scid, ×tamp,
|
||||
old_update, &sig, &chain_hash, &scid, ×tamp,
|
||||
&flags, &cltv_expiry_delta, &htlc_minimum_msat, &fee_base_msat,
|
||||
&fee_proportional_millionths)) {
|
||||
status_failed(
|
||||
|
|
|
@ -144,8 +144,7 @@ static struct node *new_node(struct routing_state *rstate,
|
|||
n->id = *id;
|
||||
n->chans = tal_arr(n, struct chan *, 0);
|
||||
n->alias = NULL;
|
||||
n->node_announcement = NULL;
|
||||
n->announcement_idx = 0;
|
||||
n->node_announce_msgidx = 0;
|
||||
n->last_timestamp = -1;
|
||||
n->addresses = tal_arr(n, struct wireaddr, 0);
|
||||
node_map_add(rstate->nodes, n);
|
||||
|
@ -191,7 +190,6 @@ static void init_half_chan(struct routing_state *rstate,
|
|||
{
|
||||
struct half_chan *c = &chan->half[idx];
|
||||
|
||||
c->channel_update = NULL;
|
||||
c->channel_update_msgidx = 0;
|
||||
c->unroutable_until = 0;
|
||||
c->active = false;
|
||||
|
@ -223,7 +221,6 @@ struct chan *new_chan(struct routing_state *rstate,
|
|||
chan->nodes[n1idx] = n1;
|
||||
chan->nodes[!n1idx] = n2;
|
||||
chan->txout_script = NULL;
|
||||
chan->channel_announcement = NULL;
|
||||
chan->channel_announce_msgidx = 0;
|
||||
chan->public = false;
|
||||
chan->satoshis = 0;
|
||||
|
@ -808,13 +805,9 @@ bool handle_pending_cannouncement(struct routing_state *rstate,
|
|||
chan->public = true;
|
||||
chan->satoshis = satoshis;
|
||||
|
||||
/* Save channel_announcement. */
|
||||
tal_free(chan->channel_announcement);
|
||||
chan->channel_announcement = tal_steal(chan, pending->announce);
|
||||
|
||||
if (replace_broadcast(chan, rstate->broadcasts,
|
||||
&chan->channel_announce_msgidx,
|
||||
pending->announce))
|
||||
take(pending->announce)))
|
||||
status_failed(STATUS_FAIL_INTERNAL_ERROR,
|
||||
"Announcement %s was replaced?",
|
||||
tal_hex(trc, pending->announce));
|
||||
|
@ -997,10 +990,8 @@ u8 *handle_channel_update(struct routing_state *rstate, const u8 *update)
|
|||
|
||||
replace_broadcast(chan, rstate->broadcasts,
|
||||
&chan->half[direction].channel_update_msgidx,
|
||||
serialized);
|
||||
take(serialized));
|
||||
|
||||
tal_free(c->channel_update);
|
||||
c->channel_update = tal_steal(chan, serialized);
|
||||
tal_free(tmpctx);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1181,10 +1172,8 @@ u8 *handle_node_announcement(struct routing_state *rstate, const u8 *node_ann)
|
|||
node->alias = tal_dup_arr(node, u8, alias, 32, 0);
|
||||
|
||||
replace_broadcast(node, rstate->broadcasts,
|
||||
&node->announcement_idx,
|
||||
serialized);
|
||||
tal_free(node->node_announcement);
|
||||
node->node_announcement = tal_steal(node, serialized);
|
||||
&node->node_announce_msgidx,
|
||||
take(serialized));
|
||||
tal_free(tmpctx);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -33,8 +33,7 @@ struct half_chan {
|
|||
* things indicated direction wrt the `channel_id` */
|
||||
u16 flags;
|
||||
|
||||
/* Cached `channel_update` we might forward to new peers*/
|
||||
u8 *channel_update;
|
||||
/* Cached `channel_update` we might forward to new peers (or 0) */
|
||||
u64 channel_update_msgidx;
|
||||
|
||||
/* If greater than current time, this connection should not
|
||||
|
@ -54,9 +53,7 @@ struct chan {
|
|||
/* node[0].id < node[1].id */
|
||||
struct node *nodes[2];
|
||||
|
||||
/* Cached `channel_announcement` we might forward to new peers*/
|
||||
const u8 *channel_announcement;
|
||||
|
||||
/* Cached `channel_announcement` we might forward to new peers (or 0) */
|
||||
u64 channel_announce_msgidx;
|
||||
|
||||
/* Is this a public channel, or was it only added locally? */
|
||||
|
@ -93,11 +90,8 @@ struct node {
|
|||
/* Color to be used when displaying the name */
|
||||
u8 rgb_color[3];
|
||||
|
||||
/* Cached `node_announcement` we might forward to new peers. */
|
||||
u8 *node_announcement;
|
||||
|
||||
/* What index does the announcement broadcast have? */
|
||||
u64 announcement_idx;
|
||||
/* Cached `node_announcement` we might forward to new peers (or 0). */
|
||||
u64 node_announce_msgidx;
|
||||
};
|
||||
|
||||
const secp256k1_pubkey *node_map_keyof_node(const struct node *n);
|
||||
|
|
Loading…
Add table
Reference in a new issue