diff --git a/gossipd/gossip.c b/gossipd/gossip.c index 8cdb509c6..8802dc804 100644 --- a/gossipd/gossip.c +++ b/gossipd/gossip.c @@ -244,6 +244,8 @@ struct peer { /* Feature bitmaps. */ u8 *gfeatures, *lfeatures; + bool gossip_queries_feature, initial_routing_sync_feature; + /* High water mark for the staggered broadcast */ u64 broadcast_index; @@ -624,14 +626,9 @@ static struct io_plan *retry_peer_connected(struct io_conn *conn, static void setup_gossip_range(struct peer *peer) { - bool gossip_queries; u8 *msg; - gossip_queries = feature_offered(peer->lfeatures, LOCAL_GOSSIP_QUERIES) - && feature_offered(peer->daemon->localfeatures, - LOCAL_GOSSIP_QUERIES); - - if (!gossip_queries) + if (!peer->gossip_queries_feature) return; /* Tell it to start gossip! (And give us everything!) */ @@ -674,8 +671,7 @@ static struct io_plan *peer_connected(struct io_conn *conn, struct peer *peer) * - if the `gossip_queries` feature is negotiated: * - MUST NOT relay any gossip messages unless explicitly requested. */ - if (feature_offered(peer->lfeatures, LOCAL_GOSSIP_QUERIES) - && feature_offered(peer->daemon->localfeatures, LOCAL_GOSSIP_QUERIES)) { + if (peer->gossip_queries_feature) { peer->broadcast_index = UINT64_MAX; /* Nothing in this range */ peer->gossip_timestamp_min = UINT32_MAX; @@ -692,7 +688,7 @@ static struct io_plan *peer_connected(struct io_conn *conn, struct peer *peer) * - SHOULD resume normal operation, as specified in the * following [Rebroadcasting](#rebroadcasting) section. */ - if (feature_offered(peer->lfeatures, LOCAL_INITIAL_ROUTING_SYNC)) + if (peer->initial_routing_sync_feature) peer->broadcast_index = 0; else peer->broadcast_index @@ -728,6 +724,13 @@ static struct io_plan *peer_init_received(struct io_conn *conn, return io_close(conn); } + peer->gossip_queries_feature + = feature_offered(peer->lfeatures, LOCAL_GOSSIP_QUERIES) + && feature_offered(peer->daemon->localfeatures, + LOCAL_GOSSIP_QUERIES); + peer->initial_routing_sync_feature + = feature_offered(peer->lfeatures, LOCAL_INITIAL_ROUTING_SYNC); + return peer_connected(conn, peer); } @@ -2370,7 +2373,7 @@ static struct io_plan *query_scids_req(struct io_conn *conn, goto fail; } - if (!feature_offered(peer->lfeatures, LOCAL_GOSSIP_QUERIES)) { + if (!peer->gossip_queries_feature) { status_broken("query_scids: no gossip_query support in peer %s", type_to_string(tmpctx, struct pubkey, &id)); goto fail; @@ -2419,7 +2422,7 @@ static struct io_plan *send_timestamp_filter(struct io_conn *conn, goto out; } - if (!feature_offered(peer->lfeatures, LOCAL_GOSSIP_QUERIES)) { + if (!peer->gossip_queries_feature) { status_broken("send_timestamp_filter: no gossip_query support in peer %s", type_to_string(tmpctx, struct pubkey, &id)); goto out; @@ -2451,7 +2454,7 @@ static struct io_plan *query_channel_range(struct io_conn *conn, goto fail; } - if (!feature_offered(peer->lfeatures, LOCAL_GOSSIP_QUERIES)) { + if (!peer->gossip_queries_feature) { status_broken("query_channel_range: no gossip_query support in peer %s", type_to_string(tmpctx, struct pubkey, &id)); goto fail;