mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +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:
@@ -53,3 +53,13 @@ struct queued_message *next_broadcast_message(struct broadcast_state *bstate, u6
|
|||||||
{
|
{
|
||||||
return uintmap_after(&bstate->broadcasts, &last_index);
|
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);
|
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 */
|
#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 short_channel_id scid;
|
||||||
struct chan *chan;
|
struct chan *chan;
|
||||||
const u8 *update;
|
const u8 *update;
|
||||||
|
struct routing_state *rstate = peer->daemon->rstate;
|
||||||
|
|
||||||
if (!fromwire_gossip_get_update(msg, &scid)) {
|
if (!fromwire_gossip_get_update(msg, &scid)) {
|
||||||
status_trace("peer %s sent bad gossip_get_update %s",
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
chan = get_channel(peer->daemon->rstate, &scid);
|
chan = get_channel(rstate, &scid);
|
||||||
if (!chan) {
|
if (!chan) {
|
||||||
status_unusual("peer %s scid %s: unknown channel",
|
status_unusual("peer %s scid %s: unknown channel",
|
||||||
type_to_string(trc, struct pubkey, &peer->id),
|
type_to_string(trc, struct pubkey, &peer->id),
|
||||||
@@ -752,9 +753,13 @@ static void handle_get_update(struct peer *peer, const u8 *msg)
|
|||||||
} else {
|
} else {
|
||||||
/* We want update that comes from our end. */
|
/* We want update that comes from our end. */
|
||||||
if (pubkey_eq(&chan->nodes[0]->id, &peer->daemon->id))
|
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))
|
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 {
|
else {
|
||||||
status_unusual("peer %s scid %s: not our channel?",
|
status_unusual("peer %s scid %s: not our channel?",
|
||||||
type_to_string(trc, struct pubkey,
|
type_to_string(trc, struct pubkey,
|
||||||
@@ -1132,7 +1137,7 @@ static void append_half_channel(struct gossip_getchannels_entry **entries,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Don't mention non-public inactive channels. */
|
/* Don't mention non-public inactive channels. */
|
||||||
if (!c->active && !c->channel_update)
|
if (!c->active && !c->channel_update_msgidx)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
n = tal_count(*entries);
|
n = tal_count(*entries);
|
||||||
@@ -1144,9 +1149,9 @@ static void append_half_channel(struct gossip_getchannels_entry **entries,
|
|||||||
e->satoshis = chan->satoshis;
|
e->satoshis = chan->satoshis;
|
||||||
e->active = c->active;
|
e->active = c->active;
|
||||||
e->flags = c->flags;
|
e->flags = c->flags;
|
||||||
e->public = (c->channel_update != NULL);
|
e->public = (c->channel_update_msgidx != 0);
|
||||||
e->short_channel_id = chan->scid;
|
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) {
|
if (e->last_update_timestamp >= 0) {
|
||||||
e->base_fee_msat = c->base_fee;
|
e->base_fee_msat = c->base_fee;
|
||||||
e->fee_per_millionth = c->proportional_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;
|
u64 htlc_minimum_msat;
|
||||||
u16 flags, cltv_expiry_delta;
|
u16 flags, cltv_expiry_delta;
|
||||||
u8 *update, *msg, *err;
|
u8 *update, *msg, *err;
|
||||||
|
const u8 *old_update;
|
||||||
|
|
||||||
/* Parse old update */
|
/* Parse old update */
|
||||||
|
old_update = get_broadcast(rstate->broadcasts,
|
||||||
|
hc->channel_update_msgidx);
|
||||||
|
|
||||||
if (!fromwire_channel_update(
|
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,
|
&flags, &cltv_expiry_delta, &htlc_minimum_msat, &fee_base_msat,
|
||||||
&fee_proportional_millionths)) {
|
&fee_proportional_millionths)) {
|
||||||
status_failed(
|
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++) {
|
for (size_t i = 0; i < tal_count(n->chans); i++) {
|
||||||
struct half_chan *hc = half_chan_from(n, 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
|
/* Connection is not public yet, so don't even
|
||||||
* try to re-announce it */
|
* try to re-announce it */
|
||||||
continue;
|
continue;
|
||||||
@@ -1869,6 +1878,7 @@ static struct io_plan *handle_disable_channel(struct io_conn *conn,
|
|||||||
secp256k1_ecdsa_signature sig;
|
secp256k1_ecdsa_signature sig;
|
||||||
u64 htlc_minimum_msat;
|
u64 htlc_minimum_msat;
|
||||||
u8 *err;
|
u8 *err;
|
||||||
|
const u8 *old_update;
|
||||||
|
|
||||||
if (!fromwire_gossip_disable_channel(msg, &scid, &direction, &active) ) {
|
if (!fromwire_gossip_disable_channel(msg, &scid, &direction, &active) ) {
|
||||||
status_unusual("Unable to parse %s",
|
status_unusual("Unable to parse %s",
|
||||||
@@ -1891,7 +1901,7 @@ static struct io_plan *handle_disable_channel(struct io_conn *conn,
|
|||||||
|
|
||||||
hc->active = active;
|
hc->active = active;
|
||||||
|
|
||||||
if (!hc->channel_update) {
|
if (!hc->channel_update_msgidx) {
|
||||||
status_trace(
|
status_trace(
|
||||||
"Channel %s/%d doesn't have a channel_update yet, can't "
|
"Channel %s/%d doesn't have a channel_update yet, can't "
|
||||||
"disable",
|
"disable",
|
||||||
@@ -1900,8 +1910,11 @@ static struct io_plan *handle_disable_channel(struct io_conn *conn,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
old_update = get_broadcast(daemon->rstate->broadcasts,
|
||||||
|
hc->channel_update_msgidx);
|
||||||
|
|
||||||
if (!fromwire_channel_update(
|
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,
|
&flags, &cltv_expiry_delta, &htlc_minimum_msat, &fee_base_msat,
|
||||||
&fee_proportional_millionths)) {
|
&fee_proportional_millionths)) {
|
||||||
status_failed(
|
status_failed(
|
||||||
|
|||||||
@@ -144,8 +144,7 @@ static struct node *new_node(struct routing_state *rstate,
|
|||||||
n->id = *id;
|
n->id = *id;
|
||||||
n->chans = tal_arr(n, struct chan *, 0);
|
n->chans = tal_arr(n, struct chan *, 0);
|
||||||
n->alias = NULL;
|
n->alias = NULL;
|
||||||
n->node_announcement = NULL;
|
n->node_announce_msgidx = 0;
|
||||||
n->announcement_idx = 0;
|
|
||||||
n->last_timestamp = -1;
|
n->last_timestamp = -1;
|
||||||
n->addresses = tal_arr(n, struct wireaddr, 0);
|
n->addresses = tal_arr(n, struct wireaddr, 0);
|
||||||
node_map_add(rstate->nodes, n);
|
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];
|
struct half_chan *c = &chan->half[idx];
|
||||||
|
|
||||||
c->channel_update = NULL;
|
|
||||||
c->channel_update_msgidx = 0;
|
c->channel_update_msgidx = 0;
|
||||||
c->unroutable_until = 0;
|
c->unroutable_until = 0;
|
||||||
c->active = false;
|
c->active = false;
|
||||||
@@ -223,7 +221,6 @@ struct chan *new_chan(struct routing_state *rstate,
|
|||||||
chan->nodes[n1idx] = n1;
|
chan->nodes[n1idx] = n1;
|
||||||
chan->nodes[!n1idx] = n2;
|
chan->nodes[!n1idx] = n2;
|
||||||
chan->txout_script = NULL;
|
chan->txout_script = NULL;
|
||||||
chan->channel_announcement = NULL;
|
|
||||||
chan->channel_announce_msgidx = 0;
|
chan->channel_announce_msgidx = 0;
|
||||||
chan->public = false;
|
chan->public = false;
|
||||||
chan->satoshis = 0;
|
chan->satoshis = 0;
|
||||||
@@ -808,13 +805,9 @@ bool handle_pending_cannouncement(struct routing_state *rstate,
|
|||||||
chan->public = true;
|
chan->public = true;
|
||||||
chan->satoshis = satoshis;
|
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,
|
if (replace_broadcast(chan, rstate->broadcasts,
|
||||||
&chan->channel_announce_msgidx,
|
&chan->channel_announce_msgidx,
|
||||||
pending->announce))
|
take(pending->announce)))
|
||||||
status_failed(STATUS_FAIL_INTERNAL_ERROR,
|
status_failed(STATUS_FAIL_INTERNAL_ERROR,
|
||||||
"Announcement %s was replaced?",
|
"Announcement %s was replaced?",
|
||||||
tal_hex(trc, pending->announce));
|
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,
|
replace_broadcast(chan, rstate->broadcasts,
|
||||||
&chan->half[direction].channel_update_msgidx,
|
&chan->half[direction].channel_update_msgidx,
|
||||||
serialized);
|
take(serialized));
|
||||||
|
|
||||||
tal_free(c->channel_update);
|
|
||||||
c->channel_update = tal_steal(chan, serialized);
|
|
||||||
tal_free(tmpctx);
|
tal_free(tmpctx);
|
||||||
return NULL;
|
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);
|
node->alias = tal_dup_arr(node, u8, alias, 32, 0);
|
||||||
|
|
||||||
replace_broadcast(node, rstate->broadcasts,
|
replace_broadcast(node, rstate->broadcasts,
|
||||||
&node->announcement_idx,
|
&node->node_announce_msgidx,
|
||||||
serialized);
|
take(serialized));
|
||||||
tal_free(node->node_announcement);
|
|
||||||
node->node_announcement = tal_steal(node, serialized);
|
|
||||||
tal_free(tmpctx);
|
tal_free(tmpctx);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ struct half_chan {
|
|||||||
* things indicated direction wrt the `channel_id` */
|
* things indicated direction wrt the `channel_id` */
|
||||||
u16 flags;
|
u16 flags;
|
||||||
|
|
||||||
/* Cached `channel_update` we might forward to new peers*/
|
/* Cached `channel_update` we might forward to new peers (or 0) */
|
||||||
u8 *channel_update;
|
|
||||||
u64 channel_update_msgidx;
|
u64 channel_update_msgidx;
|
||||||
|
|
||||||
/* If greater than current time, this connection should not
|
/* If greater than current time, this connection should not
|
||||||
@@ -54,9 +53,7 @@ struct chan {
|
|||||||
/* node[0].id < node[1].id */
|
/* node[0].id < node[1].id */
|
||||||
struct node *nodes[2];
|
struct node *nodes[2];
|
||||||
|
|
||||||
/* Cached `channel_announcement` we might forward to new peers*/
|
/* Cached `channel_announcement` we might forward to new peers (or 0) */
|
||||||
const u8 *channel_announcement;
|
|
||||||
|
|
||||||
u64 channel_announce_msgidx;
|
u64 channel_announce_msgidx;
|
||||||
|
|
||||||
/* Is this a public channel, or was it only added locally? */
|
/* 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 */
|
/* Color to be used when displaying the name */
|
||||||
u8 rgb_color[3];
|
u8 rgb_color[3];
|
||||||
|
|
||||||
/* Cached `node_announcement` we might forward to new peers. */
|
/* Cached `node_announcement` we might forward to new peers (or 0). */
|
||||||
u8 *node_announcement;
|
u64 node_announce_msgidx;
|
||||||
|
|
||||||
/* What index does the announcement broadcast have? */
|
|
||||||
u64 announcement_idx;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const secp256k1_pubkey *node_map_keyof_node(const struct node *n);
|
const secp256k1_pubkey *node_map_keyof_node(const struct node *n);
|
||||||
|
|||||||
Reference in New Issue
Block a user