Event for user's NAT Device Type: Tell user if the node is behind an Easy or Hard NAT (#173)
* event for NAT device type Co-authored-by: Marten Seemann <martenseemann@gmail.com>
This commit is contained in:
parent
2af4134128
commit
dbc9b9d08b
|
@ -0,0 +1,18 @@
|
||||||
|
package event
|
||||||
|
|
||||||
|
import "github.com/libp2p/go-libp2p-core/network"
|
||||||
|
|
||||||
|
// EvtNATDeviceTypeChanged is an event struct to be emitted when the type of the NAT device changes for a Transport Protocol.
|
||||||
|
//
|
||||||
|
// Note: This event is meaningful ONLY if the AutoNAT Reachability is Private.
|
||||||
|
// Consumers of this event should ALSO consume the `EvtLocalReachabilityChanged` event and interpret
|
||||||
|
// this event ONLY if the Reachability on the `EvtLocalReachabilityChanged` is Private.
|
||||||
|
type EvtNATDeviceTypeChanged struct {
|
||||||
|
// TransportProtocol is the Transport Protocol for which the NAT Device Type has been determined.
|
||||||
|
TransportProtocol network.NATTransportProtocol
|
||||||
|
// NatDeviceType indicates the type of the NAT Device for the Transport Protocol.
|
||||||
|
// Currently, it can be either a `Cone NAT` or a `Symmetric NAT`. Please see the detailed documentation
|
||||||
|
// on `network.NATDeviceType` enumerations for a better understanding of what these types mean and
|
||||||
|
// how they impact Connectivity and Hole Punching.
|
||||||
|
NatDeviceType network.NATDeviceType
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package network
|
||||||
|
|
||||||
|
// NATDeviceType indicates the type of the NAT device.
|
||||||
|
type NATDeviceType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// NATDeviceTypeUnknown indicates that the type of the NAT device is unknown.
|
||||||
|
NATDeviceTypeUnknown NATDeviceType = iota
|
||||||
|
|
||||||
|
// NATDeviceTypeCone indicates that the NAT device is a Cone NAT.
|
||||||
|
// A Cone NAT is a NAT where all outgoing connections from the same source IP address and port are mapped by the NAT device
|
||||||
|
// to the same IP address and port irrespective of the destination address.
|
||||||
|
// With regards to RFC 3489, this could be either a Full Cone NAT, a Restricted Cone NAT or a
|
||||||
|
// Port Restricted Cone NAT. However, we do NOT differentiate between them here and simply classify all such NATs as a Cone NAT.
|
||||||
|
// NAT traversal with hole punching is possible with a Cone NAT ONLY if the remote peer is ALSO behind a Cone NAT.
|
||||||
|
// If the remote peer is behind a Symmetric NAT, hole punching will fail.
|
||||||
|
NATDeviceTypeCone
|
||||||
|
|
||||||
|
// NATDeviceTypeSymmetric indicates that the NAT device is a Symmetric NAT.
|
||||||
|
// A Symmetric NAT maps outgoing connections with different destination addresses to different IP addresses and ports,
|
||||||
|
// even if they originate from the same source IP address and port.
|
||||||
|
// NAT traversal with hole-punching is currently NOT possible in libp2p with Symmetric NATs irrespective of the remote peer's NAT type.
|
||||||
|
NATDeviceTypeSymmetric
|
||||||
|
)
|
||||||
|
|
||||||
|
func (r NATDeviceType) String() string {
|
||||||
|
switch r {
|
||||||
|
case 0:
|
||||||
|
return "Unknown"
|
||||||
|
case 1:
|
||||||
|
return "Cone"
|
||||||
|
case 2:
|
||||||
|
return "Symmetric"
|
||||||
|
default:
|
||||||
|
return "unrecognized"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NATTransportProtocol is the transport protocol for which the NAT Device Type has been determined.
|
||||||
|
type NATTransportProtocol int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// NATTransportUDP means that the NAT Device Type has been determined for the UDP Protocol.
|
||||||
|
NATTransportUDP NATTransportProtocol = iota
|
||||||
|
// NATTransportTCP means that the NAT Device Type has been determined for the TCP Protocol.
|
||||||
|
NATTransportTCP
|
||||||
|
)
|
||||||
|
|
||||||
|
func (n NATTransportProtocol) String() string {
|
||||||
|
switch n {
|
||||||
|
case 0:
|
||||||
|
return "UDP"
|
||||||
|
case 1:
|
||||||
|
return "TCP"
|
||||||
|
default:
|
||||||
|
return "unrecognized"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue