Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.