Browse Source

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>
ppa-0.6.1
Rusty Russell 7 years ago
parent
commit
1f443df428
  1. 10
      gossipd/broadcast.c
  2. 1
      gossipd/broadcast.h
  3. 33
      gossipd/gossip.c
  4. 21
      gossipd/routing.c
  5. 14
      gossipd/routing.h

10
gossipd/broadcast.c

@ -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;
}

1
gossipd/broadcast.h

@ -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 */

33
gossipd/gossip.c

@ -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, &timestamp, old_update, &sig, &chain_hash, &scid, &timestamp,
&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, &timestamp, old_update, &sig, &chain_hash, &scid, &timestamp,
&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(

21
gossipd/routing.c

@ -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;
} }

14
gossipd/routing.h

@ -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);

Loading…
Cancel
Save