#!/bin/bash
# 실습 #11 ③ — tc tbf 로 대역폭 제한 (Token Bucket Filter) + iperf3 검증
# 「100Mbps 회선」을 인공적으로 만들어 응용 SLA 검증.
set -e

echo "=== 0) 도구 설치 ==="
sudo apt install -y iproute2 iperf3 >/dev/null

# ────────────────────────────────────────────────────────────────
# 대상 인터페이스 — 환경 변수 또는 기본 추정
# ────────────────────────────────────────────────────────────────
IFACE="${IFACE:-$(ip -o -4 route show default | awk '{print $5; exit}')}"
echo "IFACE=$IFACE"

if [ -z "$IFACE" ]; then
    echo "→ 인터페이스 자동 탐지 실패. IFACE=eth0 bash $0 처럼 지정."
    exit 1
fi

# ────────────────────────────────────────────────────────────────
# 자동 원복 trap
# ────────────────────────────────────────────────────────────────
cleanup() {
    echo
    echo "▶ 원복: sudo tc qdisc del dev $IFACE root"
    sudo tc qdisc del dev "$IFACE" root 2>/dev/null || true
}
trap cleanup EXIT INT TERM

# ────────────────────────────────────────────────────────────────
# 1) tbf 100mbit 제한
#    burst 32kbit  : 버스트 허용 (적으면 짧은 피크 못 봄)
#    latency 400ms : 큐가 최대 견디는 지연
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [1] tbf rate 100mbit burst 32kbit latency 400ms"
sudo tc qdisc add dev "$IFACE" root tbf rate 100mbit burst 32kbit latency 400ms
tc -s qdisc show dev "$IFACE"

if [ -n "${SERVER_IP:-}" ]; then
    echo "▶ iperf3 10초 (목표 ≈ 100 Mbps)"
    iperf3 -c "$SERVER_IP" -t 10 || true
else
    echo "  (SERVER_IP 미설정 — iperf3 측정 스킵)"
fi

# ────────────────────────────────────────────────────────────────
# 2) tbf 1gbit 으로 변경
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [2] tbf rate 1gbit burst 256kbit latency 200ms"
sudo tc qdisc change dev "$IFACE" root tbf rate 1gbit burst 256kbit latency 200ms

if [ -n "${SERVER_IP:-}" ]; then
    iperf3 -c "$SERVER_IP" -t 10 || true
fi

# ────────────────────────────────────────────────────────────────
# 3) tbf 10mbit (저속 회선 시뮬)
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [3] tbf rate 10mbit  (저속 회선)"
sudo tc qdisc change dev "$IFACE" root tbf rate 10mbit burst 16kbit latency 200ms

if [ -n "${SERVER_IP:-}" ]; then
    iperf3 -c "$SERVER_IP" -t 10 || true
fi

# ────────────────────────────────────────────────────────────────
# 4) qdisc 통계 보기
# ────────────────────────────────────────────────────────────────
echo
echo "▶ [4] tc -s qdisc show dev $IFACE"
tc -s qdisc show dev "$IFACE"

# ────────────────────────────────────────────────────────────────
# 옵션 설명
# ────────────────────────────────────────────────────────────────
cat <<'TIP'

  ▶ tbf 파라미터 의미
    rate     - 목표 평균 처리량
    burst    - 토큰 버퍼 크기 (한 번에 보낼 수 있는 최대 byte)
               너무 작으면 짧은 피크 못 보냄, 너무 크면 평균 약속 못 지킴
    latency  - 큐가 견디는 최대 지연 (이상이면 drop)
    peakrate - 순간 최대 (선택)
    mtu      - 최대 패킷 크기 (선택, 기본 인터페이스 MTU)

  ▶ netem 과 조합 — 지연 + 대역폭 제한 같이
    sudo tc qdisc add dev IFACE root handle 1: tbf rate 100mbit burst 32kbit latency 400ms
    sudo tc qdisc add dev IFACE parent 1:1 handle 10: netem delay 25ms 5ms

  ▶ 대안: HTB (Hierarchical Token Bucket) — 클래스별 분배
    sudo tc qdisc add dev IFACE root handle 1: htb default 12
    sudo tc class add dev IFACE parent 1: classid 1:1 htb rate 100mbit
    sudo tc class add dev IFACE parent 1:1 classid 1:11 htb rate 30mbit ceil 100mbit
    sudo tc class add dev IFACE parent 1:1 classid 1:12 htb rate 70mbit ceil 100mbit

TIP
