swarm/: include ListenerId in SwarmEvents (#2123)

Co-authored-by: Max Inden <mail@max-inden.de>
This commit is contained in:
Elena Frank
2021-07-08 11:41:33 +02:00
committed by GitHub
parent c1ef4bffd2
commit a414afd83c
14 changed files with 117 additions and 48 deletions

View File

@ -156,8 +156,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
swarm.behaviour_mut().floodsub.publish(floodsub_topic.clone(), line.as_bytes()); swarm.behaviour_mut().floodsub.publish(floodsub_topic.clone(), line.as_bytes());
} }
event = swarm.select_next_some() => { event = swarm.select_next_some() => {
if let SwarmEvent::NewListenAddr(addr) = event { if let SwarmEvent::NewListenAddr { address, .. } = event {
println!("Listening on {:?}", addr); println!("Listening on {:?}", address);
} }
} }
} }

View File

@ -160,8 +160,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
loop { loop {
match swarm.poll_next_unpin(cx) { match swarm.poll_next_unpin(cx) {
Poll::Ready(Some(event)) => { Poll::Ready(Some(event)) => {
if let SwarmEvent::NewListenAddr(addr) = event { if let SwarmEvent::NewListenAddr { address, .. } = event {
println!("Listening on {:?}", addr); println!("Listening on {:?}", address);
} }
} }
Poll::Ready(None) => return Poll::Ready(Ok(())), Poll::Ready(None) => return Poll::Ready(Ok(())),

View File

@ -175,8 +175,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
loop { loop {
match swarm.poll_next_unpin(cx) { match swarm.poll_next_unpin(cx) {
Poll::Ready(Some(event)) => { Poll::Ready(Some(event)) => {
if let SwarmEvent::NewListenAddr(addr) = event { if let SwarmEvent::NewListenAddr { address, .. } = event {
println!("Listening on {:?}", addr); println!("Listening on {:?}", address);
} }
} }
Poll::Ready(None) => return Poll::Ready(Ok(())), Poll::Ready(None) => return Poll::Ready(Ok(())),

View File

@ -162,8 +162,8 @@ async fn main() -> Result<(), Box<dyn Error>> {
id, id,
peer_id peer_id
), ),
SwarmEvent::NewListenAddr(addr) => { SwarmEvent::NewListenAddr { address, .. } => {
println!("Listening on {:?}", addr); println!("Listening on {:?}", address);
} }
_ => {} _ => {}
}, },

View File

@ -287,8 +287,8 @@ fn main() -> Result<(), Box<dyn Error>> {
loop { loop {
match swarm.poll_next_unpin(cx) { match swarm.poll_next_unpin(cx) {
Poll::Ready(Some(event)) => { Poll::Ready(Some(event)) => {
if let SwarmEvent::NewListenAddr(addr) = event { if let SwarmEvent::NewListenAddr { address, .. } = event {
println!("Listening on {:?}", addr); println!("Listening on {:?}", address);
} }
} }
Poll::Ready(None) => return Poll::Ready(Ok(())), Poll::Ready(None) => return Poll::Ready(Ok(())),

View File

@ -79,7 +79,7 @@ fn main() -> Result<(), Box<dyn Error>> {
block_on(future::poll_fn(move |cx| loop { block_on(future::poll_fn(move |cx| loop {
match swarm.poll_next_unpin(cx) { match swarm.poll_next_unpin(cx) {
Poll::Ready(Some(event)) => match event { Poll::Ready(Some(event)) => match event {
SwarmEvent::NewListenAddr(addr) => println!("Listening on {:?}", addr), SwarmEvent::NewListenAddr{ address, .. } => println!("Listening on {:?}", address),
SwarmEvent::Behaviour(event) => println!("{:?}", event), SwarmEvent::Behaviour(event) => println!("{:?}", event),
_ => {} _ => {}
}, },

View File

@ -498,7 +498,7 @@ mod tests {
let swarm1_fut = swarm1.select_next_some(); let swarm1_fut = swarm1.select_next_some();
pin_mut!(swarm1_fut); pin_mut!(swarm1_fut);
match swarm1_fut.await { match swarm1_fut.await {
SwarmEvent::NewListenAddr(addr) => return addr, SwarmEvent::NewListenAddr { address, .. } => return address,
_ => {} _ => {}
} }
} }
@ -577,7 +577,7 @@ mod tests {
let swarm1_fut = swarm1.select_next_some(); let swarm1_fut = swarm1.select_next_some();
pin_mut!(swarm1_fut); pin_mut!(swarm1_fut);
match swarm1_fut.await { match swarm1_fut.await {
SwarmEvent::NewListenAddr(addr) => return addr, SwarmEvent::NewListenAddr { address, .. } => return address,
_ => {} _ => {}
} }
} }

View File

@ -64,7 +64,7 @@ fn ping_pong() {
let peer1 = async move { let peer1 = async move {
loop { loop {
match swarm1.select_next_some().await { match swarm1.select_next_some().await {
SwarmEvent::NewListenAddr(listener) => tx.send(listener).await.unwrap(), SwarmEvent::NewListenAddr { address, .. } => tx.send(address).await.unwrap(),
SwarmEvent::Behaviour(PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) }) => { SwarmEvent::Behaviour(PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) }) => {
count1 -= 1; count1 -= 1;
if count1 == 0 { if count1 == 0 {
@ -137,7 +137,7 @@ fn max_failures() {
loop { loop {
match swarm1.select_next_some().await { match swarm1.select_next_some().await {
SwarmEvent::NewListenAddr(listener) => tx.send(listener).await.unwrap(), SwarmEvent::NewListenAddr { address, .. } => tx.send(address).await.unwrap(),
SwarmEvent::Behaviour(PingEvent { SwarmEvent::Behaviour(PingEvent {
result: Ok(PingSuccess::Ping { .. }), .. result: Ok(PingSuccess::Ping { .. }), ..
}) => { }) => {

View File

@ -140,8 +140,8 @@ fn main() -> Result<(), Box<dyn Error>> {
loop { loop {
match swarm.poll_next_unpin(cx) { match swarm.poll_next_unpin(cx) {
Poll::Ready(Some(event)) => match event { Poll::Ready(Some(event)) => match event {
SwarmEvent::NewListenAddr(addr) => { SwarmEvent::NewListenAddr { address, .. } => {
print_listener_peer(&addr, &opt.mode, local_peer_id) print_listener_peer(&address, &opt.mode, local_peer_id)
} }
_ => println!("{:?}", event), _ => println!("{:?}", event),
}, },

View File

@ -73,7 +73,9 @@ fn src_connect_to_dst_listening_via_relay() {
relay_swarm.listen_on(relay_addr.clone()).unwrap(); relay_swarm.listen_on(relay_addr.clone()).unwrap();
spawn_swarm_on_pool(&pool, relay_swarm); spawn_swarm_on_pool(&pool, relay_swarm);
dst_swarm.listen_on(dst_listen_addr_via_relay.clone()).unwrap(); let dst_listener = dst_swarm
.listen_on(dst_listen_addr_via_relay.clone())
.unwrap();
pool.run_until(async { pool.run_until(async {
// Destination Node dialing Relay. // Destination Node dialing Relay.
@ -93,7 +95,13 @@ fn src_connect_to_dst_listening_via_relay() {
// Destination Node reporting listen address via relay. // Destination Node reporting listen address via relay.
loop { loop {
match dst_swarm.select_next_some().await { match dst_swarm.select_next_some().await {
SwarmEvent::NewListenAddr(addr) if addr == dst_listen_addr_via_relay => break, SwarmEvent::NewListenAddr {
address,
listener_id,
} if listener_id == dst_listener => {
assert_eq!(address, dst_listen_addr_via_relay);
break;
}
SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {} SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {}
SwarmEvent::Behaviour(CombinedEvent::Kad(KademliaEvent::RoutingUpdated { SwarmEvent::Behaviour(CombinedEvent::Kad(KademliaEvent::RoutingUpdated {
.. ..
@ -282,14 +290,20 @@ fn src_connect_to_dst_via_established_connection_to_relay() {
relay_swarm.listen_on(relay_addr.clone()).unwrap(); relay_swarm.listen_on(relay_addr.clone()).unwrap();
spawn_swarm_on_pool(&pool, relay_swarm); spawn_swarm_on_pool(&pool, relay_swarm);
dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap(); let dst_listener = dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap();
// Wait for destination to listen via relay. // Wait for destination to listen via relay.
pool.run_until(async { pool.run_until(async {
loop { loop {
match dst_swarm.select_next_some().await { match dst_swarm.select_next_some().await {
SwarmEvent::Dialing(_) => {} SwarmEvent::Dialing(_) => {}
SwarmEvent::ConnectionEstablished { .. } => {} SwarmEvent::ConnectionEstablished { .. } => {}
SwarmEvent::NewListenAddr(addr) if addr == dst_addr_via_relay => break, SwarmEvent::NewListenAddr {
address,
listener_id,
} if listener_id == dst_listener => {
assert_eq!(address, dst_addr_via_relay);
break;
}
e => panic!("{:?}", e), e => panic!("{:?}", e),
} }
} }
@ -531,7 +545,7 @@ fn firewalled_src_discover_firewalled_dst_via_kad_and_connect_to_dst_via_routabl
spawn_swarm_on_pool(&pool, relay_swarm); spawn_swarm_on_pool(&pool, relay_swarm);
// Destination Node listen via Relay. // Destination Node listen via Relay.
dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap(); let dst_listener = dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap();
pool.run_until(async { pool.run_until(async {
// Destination Node dialing Relay. // Destination Node dialing Relay.
@ -556,7 +570,13 @@ fn firewalled_src_discover_firewalled_dst_via_kad_and_connect_to_dst_via_routabl
// Destination Node reporting listen address via relay. // Destination Node reporting listen address via relay.
loop { loop {
match dst_swarm.select_next_some().await { match dst_swarm.select_next_some().await {
SwarmEvent::NewListenAddr(addr) if addr == dst_addr_via_relay => break, SwarmEvent::NewListenAddr {
address,
listener_id,
} if listener_id == dst_listener => {
assert_eq!(address, dst_addr_via_relay);
break;
}
SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {} SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {}
SwarmEvent::Behaviour(CombinedEvent::Kad(KademliaEvent::RoutingUpdated { SwarmEvent::Behaviour(CombinedEvent::Kad(KademliaEvent::RoutingUpdated {
.. ..
@ -715,14 +735,20 @@ fn inactive_connection_timeout() {
relay_swarm.listen_on(relay_addr.clone()).unwrap(); relay_swarm.listen_on(relay_addr.clone()).unwrap();
spawn_swarm_on_pool(&pool, relay_swarm); spawn_swarm_on_pool(&pool, relay_swarm);
dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap(); let new_listener = dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap();
// Wait for destination to listen via relay. // Wait for destination to listen via relay.
pool.run_until(async { pool.run_until(async {
loop { loop {
match dst_swarm.select_next_some().await { match dst_swarm.select_next_some().await {
SwarmEvent::Dialing(_) => {} SwarmEvent::Dialing(_) => {}
SwarmEvent::ConnectionEstablished { .. } => {} SwarmEvent::ConnectionEstablished { .. } => {}
SwarmEvent::NewListenAddr(addr) if addr == dst_addr_via_relay => break, SwarmEvent::NewListenAddr {
address,
listener_id,
} if listener_id == new_listener => {
assert_eq!(address, dst_addr_via_relay);
break;
}
e => panic!("{:?}", e), e => panic!("{:?}", e),
} }
} }
@ -789,14 +815,20 @@ fn concurrent_connection_same_relay_same_dst() {
relay_swarm.listen_on(relay_addr.clone()).unwrap(); relay_swarm.listen_on(relay_addr.clone()).unwrap();
spawn_swarm_on_pool(&pool, relay_swarm); spawn_swarm_on_pool(&pool, relay_swarm);
dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap(); let dst_listener = dst_swarm.listen_on(dst_addr_via_relay.clone()).unwrap();
// Wait for destination to listen via relay. // Wait for destination to listen via relay.
pool.run_until(async { pool.run_until(async {
loop { loop {
match dst_swarm.select_next_some().await { match dst_swarm.select_next_some().await {
SwarmEvent::Dialing(_) => {} SwarmEvent::Dialing(_) => {}
SwarmEvent::ConnectionEstablished { .. } => {} SwarmEvent::ConnectionEstablished { .. } => {}
SwarmEvent::NewListenAddr(addr) if addr == dst_addr_via_relay => break, SwarmEvent::NewListenAddr {
address,
listener_id,
} if listener_id == dst_listener => {
assert_eq!(address, dst_addr_via_relay);
break;
}
e => panic!("{:?}", e), e => panic!("{:?}", e),
} }
} }
@ -904,10 +936,10 @@ fn yield_incoming_connection_through_correct_listener() {
relay_3_swarm.listen_on(relay_3_addr.clone()).unwrap(); relay_3_swarm.listen_on(relay_3_addr.clone()).unwrap();
spawn_swarm_on_pool(&pool, relay_3_swarm); spawn_swarm_on_pool(&pool, relay_3_swarm);
dst_swarm.listen_on(relay_1_addr_incl_circuit.clone()).unwrap(); let dst_listener_via_relay_1 = dst_swarm.listen_on(relay_1_addr_incl_circuit.clone()).unwrap();
dst_swarm.listen_on(relay_2_addr_incl_circuit.clone()).unwrap(); let dst_listener_via_relay_2 = dst_swarm.listen_on(relay_2_addr_incl_circuit.clone()).unwrap();
// Listen on own address in order for relay 3 to be able to connect to destination node. // Listen on own address in order for relay 3 to be able to connect to destination node.
dst_swarm.listen_on(dst_addr.clone()).unwrap(); let dst_listener = dst_swarm.listen_on(dst_addr.clone()).unwrap();
// Wait for destination node to establish connections to relay 1 and 2. // Wait for destination node to establish connections to relay 1 and 2.
pool.run_until(async { pool.run_until(async {
@ -924,10 +956,18 @@ fn yield_incoming_connection_through_correct_listener() {
break; break;
} }
} }
SwarmEvent::NewListenAddr(addr) SwarmEvent::NewListenAddr {
if addr == relay_1_addr_incl_circuit address,
|| addr == relay_2_addr_incl_circuit listener_id,
|| addr == dst_addr => {} } if listener_id == dst_listener_via_relay_2 => assert_eq!(address, relay_2_addr_incl_circuit),
SwarmEvent::NewListenAddr {
address,
listener_id,
} if listener_id == dst_listener_via_relay_1 => assert_eq!(address, relay_1_addr_incl_circuit),
SwarmEvent::NewListenAddr {
address,
listener_id,
} if listener_id == dst_listener => assert_eq!(address, dst_addr),
SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {} SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {}
e => panic!("{:?}", e), e => panic!("{:?}", e),
} }
@ -966,10 +1006,10 @@ fn yield_incoming_connection_through_correct_listener() {
unreachable!(); unreachable!();
} }
} }
SwarmEvent::NewListenAddr(addr) SwarmEvent::NewListenAddr { address, .. }
if addr == relay_1_addr_incl_circuit if address == relay_1_addr_incl_circuit
|| addr == relay_2_addr_incl_circuit || address == relay_2_addr_incl_circuit
|| addr == dst_addr => {} || address == dst_addr => {}
SwarmEvent::Behaviour(CombinedEvent::Ping(PingEvent { SwarmEvent::Behaviour(CombinedEvent::Ping(PingEvent {
peer, peer,
result: Ok(_), result: Ok(_),
@ -1044,7 +1084,7 @@ fn yield_incoming_connection_through_correct_listener() {
pool.run_until(async { pool.run_until(async {
loop { loop {
match dst_swarm.select_next_some().await { match dst_swarm.select_next_some().await {
SwarmEvent::NewListenAddr(addr) if addr == Protocol::P2pCircuit.into() => break, SwarmEvent::NewListenAddr { address, .. } if address == Protocol::P2pCircuit.into() => break,
SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {} SwarmEvent::Behaviour(CombinedEvent::Ping(_)) => {}
SwarmEvent::Behaviour(CombinedEvent::Kad(KademliaEvent::RoutingUpdated { SwarmEvent::Behaviour(CombinedEvent::Kad(KademliaEvent::RoutingUpdated {
.. ..

View File

@ -98,7 +98,7 @@ fn ping_protocol() {
let peer1 = async move { let peer1 = async move {
loop { loop {
match swarm1.select_next_some().await { match swarm1.select_next_some().await {
SwarmEvent::NewListenAddr(addr) => tx.send(addr).await.unwrap(), SwarmEvent::NewListenAddr { address, .. }=> tx.send(address).await.unwrap(),
SwarmEvent::Behaviour(RequestResponseEvent::Message { SwarmEvent::Behaviour(RequestResponseEvent::Message {
peer, peer,
message: RequestResponseMessage::Request { request, channel, .. } message: RequestResponseMessage::Request { request, channel, .. }
@ -312,7 +312,7 @@ fn ping_protocol_throttled() {
let peer1 = async move { let peer1 = async move {
for i in 1 .. { for i in 1 .. {
match swarm1.select_next_some().await { match swarm1.select_next_some().await {
SwarmEvent::NewListenAddr(addr) => tx.send(addr).await.unwrap(), SwarmEvent::NewListenAddr { address, .. } => tx.send(address).await.unwrap(),
SwarmEvent::Behaviour(throttled::Event::Event(RequestResponseEvent::Message { SwarmEvent::Behaviour(throttled::Event::Event(RequestResponseEvent::Message {
peer, peer,
message: RequestResponseMessage::Request { request, channel, .. }, message: RequestResponseMessage::Request { request, channel, .. },

View File

@ -298,8 +298,8 @@
//! block_on(future::poll_fn(move |cx| loop { //! block_on(future::poll_fn(move |cx| loop {
//! match swarm.poll_next_unpin(cx) { //! match swarm.poll_next_unpin(cx) {
//! Poll::Ready(Some(event)) => { //! Poll::Ready(Some(event)) => {
//! if let SwarmEvent::NewListenAddr(addr) = event { //! if let SwarmEvent::NewListenAddr { address, .. }= event {
//! println!("Listening on {:?}", addr); //! println!("Listening on {:?}", address);
//! } //! }
//! }, //! },
//! Poll::Ready(None) => return Poll::Ready(()), //! Poll::Ready(None) => return Poll::Ready(()),

View File

@ -19,8 +19,13 @@
`NetworkBehaviourAction::CloseConnection` to close connections to a specific `NetworkBehaviourAction::CloseConnection` to close connections to a specific
peer via an `ExpandedSwarm` or `NetworkBehaviour`. See [PR 2110] for details. peer via an `ExpandedSwarm` or `NetworkBehaviour`. See [PR 2110] for details.
- Expose the `ListenerId` in `SwarmEvent`s that are associated with a listener.
See [PR 2123] for details.
[PR 2100]: https://github.com/libp2p/rust-libp2p/pull/2100 [PR 2100]: https://github.com/libp2p/rust-libp2p/pull/2100
[PR 2110]: https://github.com/libp2p/rust-libp2p/pull/2110/ [PR 2110]: https://github.com/libp2p/rust-libp2p/pull/2110/
[PR 2123]: https://github.com/libp2p/rust-libp2p/pull/2123
# 0.29.0 [2021-04-13] # 0.29.0 [2021-04-13]

View File

@ -229,11 +229,23 @@ pub enum SwarmEvent<TBvEv, THandleErr> {
error: PendingConnectionError<io::Error>, error: PendingConnectionError<io::Error>,
}, },
/// One of our listeners has reported a new local listening address. /// One of our listeners has reported a new local listening address.
NewListenAddr(Multiaddr), NewListenAddr{
/// The listener that is listening on the new address.
listener_id: ListenerId,
/// The new address that is being listened on.
address: Multiaddr
},
/// One of our listeners has reported the expiration of a listening address. /// One of our listeners has reported the expiration of a listening address.
ExpiredListenAddr(Multiaddr), ExpiredListenAddr{
/// The listener that is no longer listening on the address.
listener_id: ListenerId,
/// The expired address.
address: Multiaddr
},
/// One of the listeners gracefully closed. /// One of the listeners gracefully closed.
ListenerClosed { ListenerClosed {
/// The listener that closed.
listener_id: ListenerId,
/// The addresses that the listener was listening on. These addresses are now considered /// The addresses that the listener was listening on. These addresses are now considered
/// expired, similar to if a [`ExpiredListenAddr`](SwarmEvent::ExpiredListenAddr) event /// expired, similar to if a [`ExpiredListenAddr`](SwarmEvent::ExpiredListenAddr) event
/// has been generated for each of them. /// has been generated for each of them.
@ -244,6 +256,8 @@ pub enum SwarmEvent<TBvEv, THandleErr> {
}, },
/// One of the listeners reported a non-fatal error. /// One of the listeners reported a non-fatal error.
ListenerError { ListenerError {
/// The listener that errored.
listener_id: ListenerId,
/// The listener error. /// The listener error.
error: io::Error, error: io::Error,
}, },
@ -328,8 +342,10 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
} }
/// Starts listening on the given address. /// Starts listening on the given address.
///
/// Returns an error if the address is not supported. /// Returns an error if the address is not supported.
///
/// Listeners report their new listening addresses as [`SwarmEvent::NewListenAddr`].
/// Depending on the underlying transport, one listener may have multiple listening addresses.
pub fn listen_on(&mut self, addr: Multiaddr) -> Result<ListenerId, TransportError<io::Error>> { pub fn listen_on(&mut self, addr: Multiaddr) -> Result<ListenerId, TransportError<io::Error>> {
let id = self.network.listen_on(addr)?; let id = self.network.listen_on(addr)?;
self.behaviour.inject_new_listener(id); self.behaviour.inject_new_listener(id);
@ -588,13 +604,19 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
this.listened_addrs.push(listen_addr.clone()) this.listened_addrs.push(listen_addr.clone())
} }
this.behaviour.inject_new_listen_addr(listener_id, &listen_addr); this.behaviour.inject_new_listen_addr(listener_id, &listen_addr);
return Poll::Ready(SwarmEvent::NewListenAddr(listen_addr)); return Poll::Ready(SwarmEvent::NewListenAddr {
listener_id,
address: listen_addr
});
} }
Poll::Ready(NetworkEvent::ExpiredListenerAddress { listener_id, listen_addr }) => { Poll::Ready(NetworkEvent::ExpiredListenerAddress { listener_id, listen_addr }) => {
log::debug!("Listener {:?}; Expired address {:?}.", listener_id, listen_addr); log::debug!("Listener {:?}; Expired address {:?}.", listener_id, listen_addr);
this.listened_addrs.retain(|a| a != &listen_addr); this.listened_addrs.retain(|a| a != &listen_addr);
this.behaviour.inject_expired_listen_addr(listener_id, &listen_addr); this.behaviour.inject_expired_listen_addr(listener_id, &listen_addr);
return Poll::Ready(SwarmEvent::ExpiredListenAddr(listen_addr)); return Poll::Ready(SwarmEvent::ExpiredListenAddr{
listener_id,
address: listen_addr
});
} }
Poll::Ready(NetworkEvent::ListenerClosed { listener_id, addresses, reason }) => { Poll::Ready(NetworkEvent::ListenerClosed { listener_id, addresses, reason }) => {
log::debug!("Listener {:?}; Closed by {:?}.", listener_id, reason); log::debug!("Listener {:?}; Closed by {:?}.", listener_id, reason);
@ -606,6 +628,7 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
Err(err) => Err(err), Err(err) => Err(err),
}); });
return Poll::Ready(SwarmEvent::ListenerClosed { return Poll::Ready(SwarmEvent::ListenerClosed {
listener_id,
addresses, addresses,
reason, reason,
}); });
@ -613,6 +636,7 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
Poll::Ready(NetworkEvent::ListenerError { listener_id, error }) => { Poll::Ready(NetworkEvent::ListenerError { listener_id, error }) => {
this.behaviour.inject_listener_error(listener_id, &error); this.behaviour.inject_listener_error(listener_id, &error);
return Poll::Ready(SwarmEvent::ListenerError { return Poll::Ready(SwarmEvent::ListenerError {
listener_id,
error, error,
}); });
}, },