@@ -429,22 +429,34 @@ function connectivity_test_logic_double_nat() {
429429 nat3=$nat3_mapping -$nat3_filter
430430 nat4=$nat4_mapping -$nat4_filter
431431
432+ # TS_PASS_RELAY if peer 1 is behind at least one Port Restricted Cone/Symmetric NAT, and peer 2 is behind at least one Symmetric NAT
433+ if [[ -n $nat4 && \
434+ ( ( $nat1_filter -eq 2 || $nat2_filter -eq 2 ) && " $nat3 $nat4 " =~ 2-2 || \
435+ ( $nat3_filter -eq 2 || $nat4_filter -eq 2 ) && " $nat1 $nat2 " =~ 2-2 )]]; then
436+ test_target=" TS_PASS_RELAY"
432437 # TS_PASS only if one peer is behind at least one Restricted Cone NAT, and the other peer is behind at least one Symmetric NAT
433- # Since we skip symmetrical cases (see below), we can assume the Symmetric NAT is on peer 2's side
434- if [[ -n $nat4 && ( $nat1_filter -eq 1 || $nat2_filter -eq 1 ) && " $nat3 $nat4 " =~ 2-2 ]]; then
438+ elif [[ -n $nat4 && \
439+ ( ( $nat1_filter -eq 1 || $nat2_filter -eq 1 ) && " $nat3 $nat4 " =~ 2-2 || \
440+ ( $nat3_filter -eq 1 || $nat4_filter -eq 1 ) && " $nat1 $nat2 " =~ 2-2 )]]; then
435441 test_target=" TS_PASS"
436- # TS_PASS_RELAY only if peer 1 is behind at least one Port Restricted Cone/Symmetric NAT, and peer 2 is behind at least one Symmetric NAT
437- elif [[ -n $nat4 && ( $nat1_filter -eq 2 || $nat2_filter -eq 2 ) && " $nat3 $nat4 " =~ 2-2 ]]; then
438- test_target=" TS_PASS_RELAY"
439442 else
440443 test_target=" TS_PASS_DIRECT"
441444 fi
442445
443- # Skip symmetrical cases
444- if [[ $nat3_mapping -gt $nat1_mapping || $nat3_mapping -eq $nat1_mapping && $nat3_filter -ge $nat1_filter ]]; then
445- if [[ $nat4_mapping -gt $nat2_mapping || $nat4_mapping -eq $nat2_mapping && $nat4_filter -ge $nat2_filter ]]; then
446- filter_nat_combinations $test_target $ns_config $nat1 :$nat2 /$nat3 :$nat4 $wg_config $nat1 $nat2 $nat3 $nat4
447- fi
446+ # Assign a score to each NAT, such that the RFC 3489 NAT types ordered by score are as follows:
447+ # # 1. Full Cone = 0 + 0 = 0
448+ # # 2. Restricted Cone = 0 + 1 = 1
449+ # # 3. Port Restricted Cone = 0 + 2 = 2
450+ # # 4. Symmetric = 2 + 2 = 4
451+ nat1_score=$( echo " $nat1_mapping +$nat1_filter " | bc)
452+ nat2_score=$( echo " $nat2_mapping +$nat2_filter " | bc)
453+ nat3_score=$( echo " $nat3_mapping +$nat3_filter " | bc)
454+ nat4_score=$( echo " $nat4_mapping +$nat4_filter " | bc)
455+
456+
457+ # Use score to skip symmetrical cases
458+ if [[ $nat3_score -gt $nat1_score || $nat3_score -eq $nat1_score && $nat4_score -ge $nat2_score ]]; then
459+ filter_nat_combinations $test_target $ns_config $nat1 :$nat2 /$nat3 :$nat4 $wg_config $nat1 $nat2 $nat3 $nat4
448460 fi
449461}
450462
0 commit comments