@@ -8,6 +8,7 @@ use std::net::SocketAddr;
8
8
use toxcore:: time:: * ;
9
9
use toxcore:: dht:: kbucket:: * ;
10
10
use toxcore:: crypto_core:: * ;
11
+ use toxcore:: dht:: packed_node:: * ;
11
12
use toxcore:: dht:: server:: hole_punching:: * ;
12
13
13
14
/// Number of bootstrap nodes each friend has.
@@ -79,6 +80,16 @@ impl DhtFriend {
79
80
80
81
addrs
81
82
}
83
+
84
+ /// Try to add a node to the friend's close nodes list.
85
+ pub fn try_add_to_close ( & mut self , node : & PackedNode ) -> bool {
86
+ self . close_nodes . try_add ( & self . pk , node, /* evict */ true )
87
+ }
88
+
89
+ /// Check if a node can be added to the friend's close nodes list.
90
+ pub fn can_add_to_close ( & self , node : & PackedNode ) -> bool {
91
+ self . close_nodes . can_add ( & self . pk , node, /* evict */ true )
92
+ }
82
93
}
83
94
84
95
#[ cfg( test) ]
@@ -91,16 +102,15 @@ mod tests {
91
102
use tokio_timer:: clock:: * ;
92
103
93
104
use toxcore:: dht:: dht_node:: * ;
94
- use toxcore:: dht:: packed_node:: * ;
95
105
use toxcore:: time:: ConstNow ;
96
106
97
107
#[ test]
98
108
fn addr_is_unknown ( ) {
99
109
let pk = gen_keypair ( ) . 0 ;
100
110
let mut friend = DhtFriend :: new ( pk) ;
101
111
102
- assert ! ( friend. close_nodes . try_add ( & pk , & PackedNode :: new( "192.168.1.1:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
103
- assert ! ( friend. close_nodes . try_add ( & pk , & PackedNode :: new( "192.168.1.2:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
112
+ assert ! ( friend. try_add_to_close ( & PackedNode :: new( "192.168.1.1:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
113
+ assert ! ( friend. try_add_to_close ( & PackedNode :: new( "192.168.1.2:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
104
114
105
115
assert ! ( !friend. is_addr_known( ) )
106
116
}
@@ -110,10 +120,10 @@ mod tests {
110
120
let pk = gen_keypair ( ) . 0 ;
111
121
let mut friend = DhtFriend :: new ( pk) ;
112
122
113
- assert ! ( friend. close_nodes . try_add ( & pk , & PackedNode :: new( "192.168.1.1:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
114
- assert ! ( friend. close_nodes . try_add ( & pk , & PackedNode :: new( "192.168.1.2:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
123
+ assert ! ( friend. try_add_to_close ( & PackedNode :: new( "192.168.1.1:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
124
+ assert ! ( friend. try_add_to_close ( & PackedNode :: new( "192.168.1.2:12345" . parse( ) . unwrap( ) , & gen_keypair( ) . 0 ) ) ) ;
115
125
116
- assert ! ( friend. close_nodes . try_add ( & pk , & PackedNode :: new( "192.168.1.3:12345" . parse( ) . unwrap( ) , & pk) ) ) ;
126
+ assert ! ( friend. try_add_to_close ( & PackedNode :: new( "192.168.1.3:12345" . parse( ) . unwrap( ) , & pk) ) ) ;
117
127
118
128
assert ! ( friend. is_addr_known( ) )
119
129
}
@@ -135,7 +145,7 @@ mod tests {
135
145
] ;
136
146
137
147
for ( & node, & addr) in nodes. iter ( ) . zip ( addrs. iter ( ) ) {
138
- friend. close_nodes . try_add ( & pk , & node) ;
148
+ friend. try_add_to_close ( & node) ;
139
149
let dht_node = friend. close_nodes . get_node_mut ( & pk, & node. pk ) . unwrap ( ) ;
140
150
dht_node. update_returned_addr ( addr) ;
141
151
}
@@ -167,7 +177,7 @@ mod tests {
167
177
] ;
168
178
169
179
for ( & node, & addr) in nodes. iter ( ) . zip ( addrs. iter ( ) ) {
170
- friend. close_nodes . try_add ( & pk , & node) ;
180
+ friend. try_add_to_close ( & node) ;
171
181
let dht_node = friend. close_nodes . get_node_mut ( & pk, & node. pk ) . unwrap ( ) ;
172
182
dht_node. update_returned_addr ( addr) ;
173
183
}
@@ -181,4 +191,25 @@ mod tests {
181
191
assert ! ( friend. get_returned_addrs( ) . is_empty( ) ) ;
182
192
} ) ;
183
193
}
194
+
195
+ #[ test]
196
+ fn can_and_try_add_to_close ( ) {
197
+ let pk = PublicKey ( [ 0 ; PUBLICKEYBYTES ] ) ;
198
+ let mut friend = DhtFriend :: new ( pk) ;
199
+
200
+ for i in 0 .. 8 {
201
+ let addr = SocketAddr :: new ( "1.2.3.4" . parse ( ) . unwrap ( ) , 12345 + i as u16 ) ;
202
+ let node = PackedNode :: new ( addr, & PublicKey ( [ i + 2 ; PUBLICKEYBYTES ] ) ) ;
203
+ assert ! ( friend. try_add_to_close( & node) ) ;
204
+ }
205
+
206
+ let closer_node = PackedNode :: new (
207
+ "1.2.3.5:12345" . parse ( ) . unwrap ( ) ,
208
+ & PublicKey ( [ 1 ; PUBLICKEYBYTES ] )
209
+ ) ;
210
+
211
+ // should add a new closer node with eviction
212
+ assert ! ( friend. can_add_to_close( & closer_node) ) ;
213
+ assert ! ( friend. try_add_to_close( & closer_node) ) ;
214
+ }
184
215
}
0 commit comments