Skip to content

Commit 4b50fec

Browse files
feat(upnp): emit local listen address when a port is mapped
This PR aims to expose the local listen address for a corresponding successful port-map to the end user. It would be great to know which local adapter was successfully mapped, when the user has multiple local adapters that they're listening on. Note: #6127 and #6128 were part of the original PR. Pull-Request: #6121.
1 parent 6e18dd4 commit 4b50fec

File tree

6 files changed

+37
-13
lines changed

6 files changed

+37
-13
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ libp2p-swarm-test = { version = "0.6.0", path = "swarm-test" }
108108
libp2p-tcp = { version = "0.44.0", path = "transports/tcp" }
109109
libp2p-tls = { version = "0.6.2", path = "transports/tls" }
110110
libp2p-uds = { version = "0.43.0", path = "transports/uds" }
111-
libp2p-upnp = { version = "0.5.1", path = "protocols/upnp" }
111+
libp2p-upnp = { version = "0.6.0", path = "protocols/upnp" }
112112
libp2p-webrtc = { version = "0.9.0-alpha.2", path = "transports/webrtc" }
113113
libp2p-webrtc-utils = { version = "0.4.0", path = "misc/webrtc-utils" }
114114
libp2p-webrtc-websys = { version = "0.4.0", path = "transports/webrtc-websys" }

examples/upnp/src/main.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,11 @@ async fn main() -> Result<(), Box<dyn Error>> {
5757
loop {
5858
match swarm.select_next_some().await {
5959
SwarmEvent::NewListenAddr { address, .. } => println!("Listening on {address:?}"),
60-
SwarmEvent::Behaviour(upnp::Event::NewExternalAddr(addr)) => {
61-
println!("New external address: {addr}");
60+
SwarmEvent::Behaviour(upnp::Event::NewExternalAddr {
61+
external_addr,
62+
local_addr: _,
63+
}) => {
64+
println!("New external address: {external_addr}");
6265
}
6366
SwarmEvent::Behaviour(upnp::Event::GatewayNotFound) => {
6467
println!("Gateway does not support UPnP");

protocols/upnp/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## 0.6.0
2+
3+
- Change `Event::NewExternalAddr` and `Event::ExpiredExternalAddr` from tuple variants to struct variants
4+
that include both local and external addresses. This allows users to correlate which local listen
5+
address was mapped to which external address.
6+
- `Event::NewExternalAddr` now contains `local_addr` and `external_addr` fields
7+
- `Event::ExpiredExternalAddr` now contains `local_addr` and `external_addr` fields
8+
See [PR 6121](https://github.com/libp2p/rust-libp2p/pull/6121).
9+
110
## 0.5.1
211

312
- Skip port mapping when an active port mapping is present.

protocols/upnp/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "libp2p-upnp"
33
edition.workspace = true
44
rust-version.workspace = true
55
description = "UPnP support for libp2p transports"
6-
version = "0.5.1"
6+
version = "0.6.0"
77
license = "MIT"
88
repository = "https://github.com/libp2p/rust-libp2p"
99
keywords = ["peer-to-peer", "libp2p", "networking"]

protocols/upnp/src/behaviour.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,19 @@ enum GatewayState {
158158
#[derive(Debug)]
159159
pub enum Event {
160160
/// The multiaddress is reachable externally.
161-
NewExternalAddr(Multiaddr),
161+
NewExternalAddr {
162+
/// The local listen address that was mapped.
163+
local_addr: Multiaddr,
164+
/// The external address that is reachable.
165+
external_addr: Multiaddr,
166+
},
162167
/// The renewal of the multiaddress on the gateway failed.
163-
ExpiredExternalAddr(Multiaddr),
168+
ExpiredExternalAddr {
169+
/// The local listen address that failed to renew.
170+
local_addr: Multiaddr,
171+
/// The external address that is no longer reachable.
172+
external_addr: Multiaddr,
173+
},
164174
/// The IGD gateway was not found.
165175
GatewayNotFound,
166176
/// The Gateway is not exposed directly to the public network.
@@ -475,9 +485,10 @@ impl NetworkBehaviour for Behaviour {
475485
MappingState::Pending { .. } => {
476486
let external_multiaddr =
477487
mapping.external_addr(gateway.external_addr);
478-
self.pending_events.push_back(Event::NewExternalAddr(
479-
external_multiaddr.clone(),
480-
));
488+
self.pending_events.push_back(Event::NewExternalAddr {
489+
local_addr: mapping.multiaddr,
490+
external_addr: external_multiaddr.clone(),
491+
});
481492
tracing::debug!(
482493
address=%mapping.internal_addr,
483494
protocol=%mapping.protocol,
@@ -543,9 +554,10 @@ impl NetworkBehaviour for Behaviour {
543554
);
544555
let external_multiaddr =
545556
mapping.external_addr(gateway.external_addr);
546-
self.pending_events.push_back(Event::ExpiredExternalAddr(
547-
external_multiaddr.clone(),
548-
));
557+
self.pending_events.push_back(Event::ExpiredExternalAddr {
558+
local_addr: mapping.multiaddr,
559+
external_addr: external_multiaddr.clone(),
560+
});
549561
return Poll::Ready(ToSwarm::ExternalAddrExpired(
550562
external_multiaddr,
551563
));

0 commit comments

Comments
 (0)