@@ -216,8 +216,38 @@ impl<R: MessageReceiver> Network<R> {
216
216
}
217
217
AnchorBehaviourEvent :: Upnp ( upnp_event) => {
218
218
match upnp_event {
219
- libp2p:: upnp:: Event :: NewExternalAddr ( _) => todo!( ) ,
220
- libp2p:: upnp:: Event :: ExpiredExternalAddr ( _) => todo!( ) ,
219
+ libp2p:: upnp:: Event :: NewExternalAddr ( addr) => {
220
+ info!( %addr, "UPnP route established" ) ;
221
+ let mut iter = addr. iter( ) ;
222
+ let is_ipv6 = {
223
+ let addr = iter. next( ) ;
224
+ matches!( addr, Some ( Protocol :: Ip6 ( _) ) )
225
+ } ;
226
+ match iter. next( ) {
227
+ Some ( Protocol :: Udp ( udp_port) ) => match iter. next( ) {
228
+ Some ( Protocol :: QuicV1 ) => {
229
+ if let Err ( e) =
230
+ self . discovery( ) . try_update_port( false , is_ipv6, udp_port)
231
+ {
232
+ warn!( error = e, "Failed to update ENR" ) ;
233
+ }
234
+ }
235
+ _ => {
236
+ trace!( %addr, "UPnP address mapped multiaddr from unknown transport" ) ;
237
+ }
238
+ } ,
239
+ Some ( Protocol :: Tcp ( tcp_port) ) => {
240
+ if let Err ( e) = self . discovery( ) . try_update_port( true , is_ipv6, tcp_port) {
241
+ warn!( error = e, "Failed to update ENR" ) ;
242
+ }
243
+ }
244
+ _ => {
245
+ trace!( %addr, "UPnP address mapped multiaddr from unknown transport" ) ;
246
+ }
247
+ }
248
+
249
+ } ,
250
+ libp2p:: upnp:: Event :: ExpiredExternalAddr ( _) => { } ,
221
251
libp2p:: upnp:: Event :: GatewayNotFound => info!( "UPnP not available." ) ,
222
252
libp2p:: upnp:: Event :: NonRoutableGateway => info!( "UPnP is available but gateway is not exposed to public network" ) ,
223
253
}
0 commit comments