@@ -414,8 +414,18 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
414414 /// [`NetworkBehaviourAction::ReportObservedAddr`] or explicitly
415415 /// through this method.
416416 pub fn add_external_address ( & mut self , a : Multiaddr , s : AddressScore ) -> AddAddressResult {
417- self . behaviour . inject_new_external_addr ( & a) ;
418- self . external_addrs . add ( a, s)
417+ let result = self . external_addrs . add ( a. clone ( ) , s) ;
418+ let expired = match & result {
419+ AddAddressResult :: Inserted { expired } => {
420+ self . behaviour . inject_new_external_addr ( & a) ;
421+ expired
422+ }
423+ AddAddressResult :: Updated { expired } => expired,
424+ } ;
425+ for a in expired {
426+ self . behaviour . inject_expired_external_addr ( & a. addr ) ;
427+ }
428+ result
419429 }
420430
421431 /// Removes an external address of the local node, regardless of
@@ -425,8 +435,12 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
425435 /// Returns `true` if the address existed and was removed, `false`
426436 /// otherwise.
427437 pub fn remove_external_address ( & mut self , addr : & Multiaddr ) -> bool {
428- self . behaviour . inject_expired_external_addr ( addr) ;
429- self . external_addrs . remove ( addr)
438+ if self . external_addrs . remove ( addr) {
439+ self . behaviour . inject_expired_external_addr ( addr) ;
440+ true
441+ } else {
442+ false
443+ }
430444 }
431445
432446 /// Bans a peer by its peer ID.
@@ -736,10 +750,7 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
736750 } ,
737751 Poll :: Ready ( NetworkBehaviourAction :: ReportObservedAddr { address, score } ) => {
738752 for addr in this. network . address_translation ( & address) {
739- if this. external_addrs . iter ( ) . all ( |a| a. addr != addr) {
740- this. behaviour . inject_new_external_addr ( & addr) ;
741- }
742- this. external_addrs . add ( addr, score) ;
753+ this. add_external_address ( addr, score) ;
743754 }
744755 } ,
745756 }
0 commit comments