+
+
+/**
+ * Closure for 'find_advertisable_hello'.
+ */
+struct FindAdvHelloContext {
+
+ /**
+ * Peer we want to advertise to.
+ */
+ struct Peer *peer;
+
+ /**
+ * Where to store the result (peer selected for advertising).
+ */
+ struct Peer *result;
+
+ /**
+ * Maximum HELLO size we can use right now.
+ */
+ size_t max_size;
+
+ struct GNUNET_TIME_Relative next_adv;
+};
+
+
+/**
+ * Find a peer that would be reasonable for advertising.
+ *
+ * @param cls closure
+ * @param pid identity of a peer
+ * @param value 'struct Peer*' for the peer we are considering
+ * @return GNUNET_YES (continue iteration)
+ */
+static int
+find_advertisable_hello (void *cls,
+ const GNUNET_HashCode *pid,
+ void *value)
+{
+ struct FindAdvHelloContext *fah = cls;
+ struct Peer *pos = value;
+ struct GNUNET_TIME_Relative rst_time;
+ size_t hs;
+
+ if (pos == fah->peer)
+ return GNUNET_YES;
+ if (pos->hello == NULL)
+ return GNUNET_YES;
+ rst_time = GNUNET_TIME_absolute_get_remaining (pos->filter_expiration);
+ if (0 == rst_time.rel_value)
+ {
+ /* time to discard... */
+ GNUNET_CONTAINER_bloomfilter_free (pos->filter);
+ setup_filter (pos);
+ }
+ fah->next_adv = GNUNET_TIME_relative_min (rst_time,
+ fah->next_adv);
+ hs = GNUNET_HELLO_size (pos->hello);
+ if (hs > fah->max_size)
+ return GNUNET_YES;
+ if (GNUNET_NO ==
+ GNUNET_CONTAINER_bloomfilter_test (pos->filter,
+ &fah->peer->pid.hashPubKey))
+ fah->result = pos;
+ return GNUNET_YES;
+}
+
+