From 0498695f1f6bf595ba1149557bd8fd45c2ff83fc Mon Sep 17 00:00:00 2001
From: Rusty Russell <rusty@rustcorp.com.au>
Date: Wed, 31 Jan 2024 14:58:33 +1030
Subject: [PATCH] gossipd: have seeker quert interfaces take an id, not a
 struct peer.

Again, we don't necessarily have a peer pointer.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
---
 gossipd/gossipd.c                   |  4 +--
 gossipd/seeker.c                    | 47 ++++++++++++++++-------------
 gossipd/seeker.h                    | 15 ++++-----
 gossipd/test/run-next_block_range.c |  3 ++
 4 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c
index b702c9358..28694f20e 100644
--- a/gossipd/gossipd.c
+++ b/gossipd/gossipd.c
@@ -239,7 +239,7 @@ static u8 *handle_channel_update_msg(struct peer *peer, const u8 *msg)
 
 	/* If it's an unknown channel, ask someone about it */
 	if (unknown_scid.u64 != 0)
-		query_unknown_channel(peer->daemon, peer, &unknown_scid);
+		query_unknown_channel(peer->daemon, &peer->id, unknown_scid);
 
 	return NULL;
 }
@@ -252,7 +252,7 @@ static u8 *handle_node_announce(struct peer *peer, const u8 *msg)
 	err = handle_node_announcement(peer->daemon->rstate, msg, &peer->id,
 				       &was_unknown);
 	if (was_unknown)
-		query_unknown_node(peer->daemon->seeker, peer);
+		query_unknown_node(peer->daemon, &peer->id, NULL);
 	return err;
 }
 
diff --git a/gossipd/seeker.c b/gossipd/seeker.c
index a6bb23feb..6f86caae3 100644
--- a/gossipd/seeker.c
+++ b/gossipd/seeker.c
@@ -626,6 +626,18 @@ static void check_timestamps(struct seeker *seeker,
 	*stale |= query_flag;
 }
 
+static bool add_unknown_scid(struct seeker *seeker,
+			     struct short_channel_id scid,
+			     struct peer *peer)
+{
+	/* Check we're not already getting this one. */
+	if (!uintmap_add(&seeker->unknown_scids, scid.u64, true))
+		return false;
+
+	set_preferred_peer(seeker, peer);
+	return true;
+}
+
 static void process_scid_probe(struct peer *peer,
 			       u32 first_blocknum, u32 number_of_blocks,
 			       const struct range_query_reply *replies)
@@ -647,7 +659,8 @@ static void process_scid_probe(struct peer *peer,
 			continue;
 		}
 
-		new_unknown_scids |= add_unknown_scid(seeker, &replies[i].scid,
+		new_unknown_scids |= add_unknown_scid(seeker,
+						      replies[i].scid,
 						      peer);
 	}
 
@@ -932,34 +945,26 @@ bool remove_unknown_scid(struct seeker *seeker,
 	return uintmap_del(&seeker->unknown_scids, scid->u64);
 }
 
-bool add_unknown_scid(struct seeker *seeker,
-		      const struct short_channel_id *scid,
-		      struct peer *peer)
-{
-	/* Check we're not already getting this one. */
-	if (!uintmap_add(&seeker->unknown_scids, scid->u64, true))
-		return false;
-
-	set_preferred_peer(seeker, peer);
-	return true;
-}
-
 /* This peer told us about an update to an unknown channel.  Ask it for a
  * channel_announcement. */
 void query_unknown_channel(struct daemon *daemon,
-			   struct peer *peer,
-			   const struct short_channel_id *id)
+			   const struct node_id *source_peer,
+			   struct short_channel_id unknown_scid)
 {
-	/* Too many, or duplicate? */
-	if (!add_unknown_scid(daemon->seeker, id, peer))
-		return;
+	add_unknown_scid(daemon->seeker,
+			 unknown_scid,
+			 source_peer ? find_peer(daemon, source_peer) : NULL);
 }
 
 /* This peer told us about an unknown node.  Start probing it. */
-void query_unknown_node(struct seeker *seeker, struct peer *peer)
+void query_unknown_node(struct daemon *daemon,
+			const struct node_id *source_peer,
+			const struct node_id *unknown_node)
 {
-	seeker->unknown_nodes = true;
-	set_preferred_peer(seeker, peer);
+	daemon->seeker->unknown_nodes = true;
+	if (source_peer)
+		set_preferred_peer(daemon->seeker,
+				   find_peer(daemon, source_peer));
 }
 
 /* Peer has died, NULL out any pointers we have */
diff --git a/gossipd/seeker.h b/gossipd/seeker.h
index 2edd26623..90afde805 100644
--- a/gossipd/seeker.h
+++ b/gossipd/seeker.h
@@ -3,25 +3,26 @@
 #include "config.h"
 
 struct daemon;
-struct peer;
+struct node_id;
 struct short_channel_id;
 
 struct seeker *new_seeker(struct daemon *daemon);
 
+/* source_peer can be NULL! */
 void query_unknown_channel(struct daemon *daemon,
-			   struct peer *peer,
-			   const struct short_channel_id *id);
+			   const struct node_id *source_peer,
+			   const struct short_channel_id unknown_scid);
 
-void query_unknown_node(struct seeker *seeker, struct peer *peer);
+/* source_peer can be NULL! */
+void query_unknown_node(struct daemon *daemon,
+			const struct node_id *source_peer,
+			const struct node_id *unknown_node);
 
 void seeker_setup_peer_gossip(struct seeker *seeker, struct peer *peer);
 
 bool remove_unknown_scid(struct seeker *seeker,
 			 const struct short_channel_id *scid,
 			 bool found);
-bool add_unknown_scid(struct seeker *seeker,
-		      const struct short_channel_id *scid,
-		      struct peer *peer);
 
 void seeker_peer_gone(struct seeker *seeker,
 		      const struct peer *peer);
diff --git a/gossipd/test/run-next_block_range.c b/gossipd/test/run-next_block_range.c
index 62b8db773..3599c3949 100644
--- a/gossipd/test/run-next_block_range.c
+++ b/gossipd/test/run-next_block_range.c
@@ -26,6 +26,9 @@ bool blinding_next_pubkey(const struct pubkey *pk UNNEEDED,
 			  const struct sha256 *h UNNEEDED,
 			  struct pubkey *next UNNEEDED)
 { fprintf(stderr, "blinding_next_pubkey called!\n"); abort(); }
+/* Generated stub for find_peer */
+struct peer *find_peer(struct daemon *daemon UNNEEDED, const struct node_id *id UNNEEDED)
+{ fprintf(stderr, "find_peer called!\n"); abort(); }
 /* Generated stub for first_random_peer */
 struct peer *first_random_peer(struct daemon *daemon UNNEEDED,
 			       struct peer_node_id_map_iter *it UNNEEDED)