selectStrategy static method
Selects the appropriate traversal strategy based on the local NAT behavior
Implementation
static TraversalStrategy selectStrategy(NatBehavior localBehavior) {
// If mapping behavior is unknown, use relayed as a safe fallback
if (localBehavior.mappingBehavior == NatMappingBehavior.unknown) {
return TraversalStrategy.relayed;
}
// If filtering behavior is unknown, use relayed as a safe fallback
if (localBehavior.filteringBehavior == NatFilteringBehavior.unknown) {
return TraversalStrategy.relayed;
}
// For endpoint-independent mapping and filtering, direct connection may work
if (localBehavior.mappingBehavior == NatMappingBehavior.endpointIndependent &&
localBehavior.filteringBehavior == NatFilteringBehavior.endpointIndependent) {
return TraversalStrategy.direct;
}
// For endpoint-independent mapping but stricter filtering, UDP hole punching is likely to work
if (localBehavior.mappingBehavior == NatMappingBehavior.endpointIndependent) {
return TraversalStrategy.udpHolePunching;
}
// For address-dependent mapping, UDP hole punching might work but is less reliable
if (localBehavior.mappingBehavior == NatMappingBehavior.addressDependent) {
return TraversalStrategy.udpHolePunching;
}
// For address-and-port-dependent mapping (symmetric NAT), TCP hole punching might be needed
if (localBehavior.mappingBehavior == NatMappingBehavior.addressAndPortDependent) {
return TraversalStrategy.tcpHolePunching;
}
// Default to relayed as a fallback
return TraversalStrategy.relayed;
}