Skip to content

Commit a19fbb1

Browse files
committed
Take IP pooling into account in Double NAT test result logic
1 parent 044266d commit a19fbb1

1 file changed

Lines changed: 22 additions & 10 deletions

File tree

test_suite/system_tests.sh

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)