1
1
//! Peer registry
2
2
use crate :: network_group:: Group ;
3
3
use crate :: peer_store:: PeerStore ;
4
+ use crate :: Flags ;
4
5
use crate :: {
5
6
errors:: { Error , PeerError } ,
6
7
extract_peer_id, Peer , PeerId , SessionType ,
@@ -24,7 +25,7 @@ pub struct PeerRegistry {
24
25
// Only whitelist peers or allow all peers.
25
26
whitelist_only : bool ,
26
27
whitelist_peers : HashSet < PeerId > ,
27
- feeler_peers : HashSet < PeerId > ,
28
+ feeler_peers : HashMap < PeerId , Flags > ,
28
29
}
29
30
30
31
/// Global network connection status
@@ -63,7 +64,7 @@ impl PeerRegistry {
63
64
PeerRegistry {
64
65
peers : HashMap :: with_capacity_and_hasher ( 20 , Default :: default ( ) ) ,
65
66
whitelist_peers : whitelist_peers. iter ( ) . filter_map ( extract_peer_id) . collect ( ) ,
66
- feeler_peers : HashSet :: default ( ) ,
67
+ feeler_peers : HashMap :: default ( ) ,
67
68
max_inbound,
68
69
max_outbound,
69
70
whitelist_only,
@@ -191,10 +192,26 @@ impl PeerRegistry {
191
192
/// Add feeler dail task
192
193
pub fn add_feeler ( & mut self , addr : & Multiaddr ) {
193
194
if let Some ( peer_id) = extract_peer_id ( addr) {
194
- self . feeler_peers . insert ( peer_id) ;
195
+ self . feeler_peers . insert ( peer_id, Flags :: COMPATIBILITY ) ;
195
196
}
196
197
}
197
198
199
+ /// Identify change feeler flags
200
+ pub fn change_feeler_flags ( & mut self , addr : & Multiaddr , flags : Flags ) -> bool {
201
+ if let Some ( peer_id) = extract_peer_id ( addr) {
202
+ if let Some ( i) = self . feeler_peers . get_mut ( & peer_id) {
203
+ * i = flags;
204
+ return true ;
205
+ }
206
+ }
207
+ false
208
+ }
209
+
210
+ /// Get feeler session flags
211
+ pub fn feeler_flags ( & self , addr : & Multiaddr ) -> Option < Flags > {
212
+ extract_peer_id ( addr) . and_then ( |peer_id| self . feeler_peers . get ( & peer_id) . cloned ( ) )
213
+ }
214
+
198
215
/// Remove feeler dail task on session disconnects or fails
199
216
pub fn remove_feeler ( & mut self , addr : & Multiaddr ) {
200
217
if let Some ( peer_id) = extract_peer_id ( addr) {
@@ -205,7 +222,7 @@ impl PeerRegistry {
205
222
/// Whether this session is feeler session
206
223
pub fn is_feeler ( & self , addr : & Multiaddr ) -> bool {
207
224
extract_peer_id ( addr)
208
- . map ( |peer_id| self . feeler_peers . contains ( & peer_id) )
225
+ . map ( |peer_id| self . feeler_peers . contains_key ( & peer_id) )
209
226
. unwrap_or_default ( )
210
227
}
211
228
0 commit comments