Exerciții
În laboratorul de astăzi vom implementa procesul de forwarding al unui router. Topologia este una simplă, avem 4 dispozitive (hosts) conectate la un router
Scheletul laboratorului se regăsește la adresa de aici. Funcționalitatea disponibilă este descrisă în README.md
Vom folosi comanda ping pentru a verifica conectivitatea între hosts. Pentru
depanare vom folosi Wireshark.
Pe router va fi rulat manual programul rezultat în urma rulării comenzii make. În cadrul laboratorului vom lucra în fișierul router.c.
Topologia de astazi este formata dintr-un router si 4 hosts direct conectati la acesta.
h0 <------>(r-0)|--------|(r-1) <---------> h1
| |
| Router |
| |
h3 <------>(r-3)|--------|(r-2) <---------> h2
r-1, r-2, r-3, r-4 interfaces
1. Vom deschide o instanță
de Wireshark pe router. Din oricare dintre hoști, trimiteți un ping către un
alt host. Din Wireshark studiați pachetul primit. Ce protocoale sunt utilizate
și care este relația dintre ele?
Este util de știut faptul că
Wireshark poate ascultă în același timp pe mai multe interfețe (avem 4 pe
router).
Hostii au următoarele adrese alocate:
Host IPv4 MAC
host0 192.168.0.2 de:ad:be:ef:00:00
host1 192.168.1.2 de:ad:be:ef:00:01
host2 192.168.2.2 de:ad:be:ef:00:02
host3 192.168.3.2 de:ad:be:ef:00:03
2. Implementați procesul de forward pentru IPv4. Tabela de rutare este
reprezentată printr-un array și poate fi accesată la un index prin
variabila rtable[i]. rtable_size este dimensiunea tabelei. Nu trebuie
implementată parsarea fișierului rtable.txt. Structura de date
utilizate pentru o intrare din tabelă este route_table_entry din
lib.h.
2.1. Verificați integritatea header-ului IP folosind câmpul de checksum din header. Dacă acesta nu este bun, vom da drop la pachet.
2.2. Folosind algoritmul de LPM, determinați următorul hop și interfața pe care va trebui să trimitem pachetul.
Continutul tabelei de rutare este in network order. In cazul unei comparatii, vom trece valorile in host order (e.g.
ntohl(mas1) > ntohl(mask2)).
2.3. Pentru fiecare pachet vom decrementa TTL-ul; dacă TTL-ul este pozitiv, recalculați checksum-ul. De ce decrementam TTL-ul?
2.4. Actualizați header-ul Ethernet al pachetului. În funcție de adresa IP a
destinației, vom căuta în tabela MAC adresa MAC a următorului hop. Tabela
este statică și putem interacționa cu ea folosind funcțiile din lib.h.
Pentru a putea trimite pachetul IP mai departe, trebuie să completăm adresa MAC a hostului următor. În mode normal, tabela MAC este populată folosind protocolul ARP, în cadrul acestui laborator vom considera o tabelă statică deja populată folosind ARP.
Note
Puteți folosi inet_pton pentru a parsa adresele IPv4. Pentru a parsa MAC-ul în binar
puteți folosi funcția hwaddr_aton pusă la dispoziție în lib.h.
Funcția int get_interface_mac(int interface, uint8_t *mac) întoarce adresa MAC
a interfeței router-ului.