# Semana 3: capa de enlace. CRC y detección de errores, acceso múltiple, ARP, switches,
# spanning tree y VLANs. Se usa dentro del contenedor del curso.
#
#   make             compila crc, aloha y arp_probe en build/
#   make test        compila, corre las pruebas (test_*.py) y destruye las topologías
#   make lan         levanta topo/lan.clab.yml (pasos 1 a 3 del laboratorio)
#   make campus      levanta topo/campus.clab.yml (paso 4)
#   make loop        levanta topo/loop.clab.yml (demostración de spanning tree)
#   make check       comprueba campus ya configurada, con las VLANs del paso 4
#   make check-reto  comprueba el reto (lab/reto_*.sh ya aplicados sobre campus)
#   make destroy     destruye las topologías y sus redes de Docker
#   make clean       lo anterior, y borra lo generado

CC = gcc
CFLAGS = -Wall -Wextra -std=c17 -O2
TOPOS = lan campus loop

# Las pruebas no dejan __pycache__ en la carpeta.
export PYTHONDONTWRITEBYTECODE = 1

BINS = build/crc build/aloha build/arp_probe

.PHONY: all test lan campus loop check check-reto destroy clean

all: $(BINS)

build/crc: crc.c
	@mkdir -p build
	$(CC) $(CFLAGS) -o $@ $<

build/aloha: aloha.c
	@mkdir -p build
	$(CC) $(CFLAGS) -o $@ $< -lm

# Enlace estático: el binario corre en los nodos, que no tienen las bibliotecas del
# contenedor del curso. Se compila en la misma arquitectura en la que corren los nodos.
build/arp_probe: arp_probe.c
	@mkdir -p build
	$(CC) $(CFLAGS) -static -o $@ $<

test: all
	@python3 -m unittest discover -p 'test_*.py' -v; rc=$$?; $(MAKE) -s destroy; exit $$rc

lan campus loop: all
	containerlab deploy -t topo/$@.clab.yml --reconfigure

check:
	python3 check_lab.py

check-reto:
	python3 check_lab.py --reto

destroy:
	@for t in $(TOPOS); do \
	  containerlab destroy -t topo/$$t.clab.yml --cleanup >/dev/null 2>&1 || true; \
	  docker network rm redes-w03-$$t >/dev/null 2>&1 || true; \
	done

clean: destroy
	rm -rf build __pycache__ topo/clab-*
