#!/usr/bin/env bash

TARGET="${1:-nodeseek.com}"
TMP="/tmp/ping_test_$$"

cleanup() {
    rm -f "$TMP"
}
trap cleanup EXIT

get_avg_ms() {
    # 兼容 iputils: "rtt min/avg/max/mdev = ..."
    # 兼容 busybox: "round-trip min/avg/max = ..."
    awk -F'= ' '/rtt min\/avg\/max|round-trip min\/avg\/max/ {
        split($2, a, "/");
        gsub(/ ms/, "", a[2]);
        print a[2];
        exit;
    }' "$TMP"
}

ping_ok() {
    local size="$1"
    ping -c 3 -W 2 -s "$size" "$TARGET" > "$TMP" 2>&1
}

ping_df_ok() {
    local size="$1"
    ping -c 1 -W 2 -M do -s "$size" "$TARGET" >/dev/null 2>&1
}

echo "测试目标: $TARGET"
echo

echo "== 大小包连通测试 =="
for size in 32 64 128 256 512 1000 1200 1300 1400 1472; do
    printf "%-8s" "${size}B"

    if ping_ok "$size"; then
        avg="$(get_avg_ms || true)"
        echo "OK    avg=${avg:-未知}ms"
    else
        echo "FAIL"
    fi
done

echo
echo "== DF 不分片 MTU 测试 =="

# 检查本机 ping 是否支持 -M do。很多精简系统/BusyBox 不支持，不支持时不要输出假 MTU。
if ping -c 1 -W 1 -M do -s 0 127.0.0.1 >/dev/null 2>&1; then
    low=0
    high=1472
    best=0

    while [ "$low" -le "$high" ]; do
        mid=$(( (low + high) / 2 ))

        if ping_df_ok "$mid"; then
            best="$mid"
            low=$((mid + 1))
        else
            high=$((mid - 1))
        fi
    done

    mtu=$((best + 28))
    echo "最大 ICMP payload: ${best} bytes"
    echo "估算路径 MTU: ${mtu} bytes"
else
    echo "跳过：当前系统的 ping 不支持或不允许 -M do，不输出假 MTU。"
    echo "提示：Debian/Ubuntu 可安装 iputils-ping 后重试：apt install -y iputils-ping"
fi

echo
echo "== 路由追踪 =="
if command -v tracepath >/dev/null 2>&1; then
    tracepath "$TARGET"
elif command -v traceroute >/dev/null 2>&1; then
    traceroute "$TARGET"
else
    echo "未安装 tracepath/traceroute"
fi
