#!/bin/bash

set -e

FQCODEL_OPTS="fq_codel limit 10240 flows 1024 quantum 1514 target 2ms interval 100ms memory_limit 32Mb ecn drop_batch 64"
FQ_OPTS="fq limit 4096 flow_limit 1024 quantum 1514 initial_quantum 30280 buckets 1024 pacing refill_delay 20ms low_rate_threshold 800Kbit timer_slack 10us ce_threshold 4ms horizon 10s horizon_drop"

if [[ "$1" != "fq" && "$1" != "fq_codel" ]]; then
    echo "Usage: $0 [fq | fq_codel]"
    exit 1
fi

echo "Applying $1 qdisc..."

if [[ "$1" == "fq" ]]; then
    QDISC_OPTS=$FQ_OPTS
else
    QDISC_OPTS=$FQCODEL_OPTS
fi

for IFACE in $(ls /sys/class/net); do
    if ip link show "$IFACE" | grep -q "state UP"; then
        echo "Setting qdisc on $IFACE..."
        tc qdisc replace dev "$IFACE" root $QDISC_OPTS || echo "Gagal set qdisc di $IFACE"
    fi
done

for IFACE in $(ls /sys/class/net); do
    if ip link show "$IFACE" | grep -q "state UP"; then
        tc qdisc show dev "$IFACE"
    fi
done
