From 2746afd0a4dae2cd8e1b2197d25083f63563ea2a Mon Sep 17 00:00:00 2001
From: Vlad Badoiu <vlad_andrei.badoiu@upb.ro>
Date: Sun, 23 Mar 2025 22:40:41 +0200
Subject: [PATCH] Update the lab text

---
 src/about.md    | 15 ++++++++++-----
 src/api.md      |  6 +++---
 src/arp.md      | 26 +++++++++++++-------------
 src/ethernet.md | 12 ++++++------
 src/faq.md      | 25 +++++++++++++++++++++++++
 src/icmp.md     | 23 +++++++++++------------
 src/ip.md       | 30 ++++++++++++++----------------
 7 files changed, 82 insertions(+), 55 deletions(-)

diff --git a/src/about.md b/src/about.md
index a7a78c3..a0fe756 100644
--- a/src/about.md
+++ b/src/about.md
@@ -22,14 +22,17 @@ Routerul nostru va funcționa cu o tabelă de rutare statică, primită într-un
 fișier de intrare, și care nu se va schimba pe parcursul rulării.
 
 Un router are mai multe interfețe și poate recepționa pachete pe oricare dintre
-acestea. Routerul trebuie să transmită pachetul mai departe, către un calculator
-sau către alt router direct conectat, în funcție de regulile din tabela de
-rutare.
+acestea. Routerul trebuie să transmită pachetul mai departe, către un
+calculator sau către alt router direct conectat, în funcție de regulile din
+tabela de rutare.
 
-**Tema poate fi implementată În C sau C++**.
+**Tema poate fi implementată În C sau C++.**.
 
 ## Lectură tema
 
+Tema presupune cunoștințele dobândite la curs. Vă recomandăm parcurgerea
+următoarei bibliografii Înainte de a vă apuca de temă.
+
 - [The Internet Protocol (9 min)](https://www.youtube.com/watch?v=rPoalUa4m8E&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=8)
 - [ARP: Mapping between IP and Ethernet (10 min)](https://www.youtube.com/watch?v=aamG4-tH_m8&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=9)
 - [Looking at ARP and ping packets (8 min)](https://www.youtube.com/watch?v=xNbdeyEI-nE&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=12)
@@ -50,7 +53,7 @@ Edition)](https://eclass.teicrete.gr/modules/document/file.php/TP326/%CE%98%CE%B
 Deadline-ul temei este specificat pe moodle.
 
 Vă reamintim părțile relevante din [regulamentul cursului de
-PCom](https://curs.upb.ro/2023/pluginfile.php/270568/mod_resource/content/1/Regulament_PC_2023_2024.pdf):
+PCom](https://curs.upb.ro/2024/pluginfile.php/294288/mod_resource/content/3/Regulament_PC_2024_2025.pdf):
 
 -   După expirarea acestui termen limită se mai pot trimite teme un
     interval de maxim 3 zile, cu următoarele depunctări: 10p În prima
@@ -83,6 +86,8 @@ sudo apt install mininet openvswitch-testcontroller tshark python3-click python3
 sudo pip3 install mininet
 ```
 
+> Verificați să aveți instalat `tshark`. 
+
 După ce am instalat Mininet, vom folosi următoarea comandă pentru a crește
 dimensiunea fontului ĂŽn terminalele pe care le vom deschide.
 
diff --git a/src/api.md b/src/api.md
index bc814d6..15a64a3 100644
--- a/src/api.md
+++ b/src/api.md
@@ -18,12 +18,12 @@ precum și unele funcții ajutătoare a căror utilizare este opțională. În
 
        Returnează interfața pe care cadrul a fost primit. Funcția este blocantă.
      */
-    int recv_from_any_link(char *frame_data, size_t *length);
+    size_t recv_from_any_link(char *frame_data, size_t *length);
 
     /* Trimite frame_data ca payload al unui cadru Ethernet L2.
        Link-ul pe care îl va trimite este identificat de interfață.
      */
-    int send_to_link(int interface, char *frame_data, int length);
+    int send_to_link(size_t length, char *frame_data, size_t interface);
     ```
 
     > Pentru a primi punctajul pe temă, trebuie să folosiți acest API de send/recv
@@ -84,7 +84,7 @@ precum și unele funcții ajutătoare a căror utilizare este opțională. În
 -   **Determinarea MAC interfață proprie:** pentru a determina adresa
     MAC a unei interfețe a routerului, folosiți funcția:
     ```c
-    void get_interface_mac(int interface, uint8_t *mac);
+    void get_interface_mac(size_t interface, uint8_t *mac);
     ```
 
     Argumentul `mac` trebuie să indice către o zonă de memorie cu cel puțin șase
diff --git a/src/arp.md b/src/arp.md
index 4c8f61d..3f8dd90 100644
--- a/src/arp.md
+++ b/src/arp.md
@@ -3,8 +3,7 @@
 După ce un router a determinat următorul hop pentru un pachet folosind LPM,
 trebuie să-l trimită mai departe, Încapsulându-l Într-un cadru cu adresa MAC
 destinație setată ca cea a următorului hop. Cum știe routerul această adresă?
-
-ta opțiune este ca această să fie reținută static, într-un tabel.
+O opțiune ar fi ca această să fie reținută static, într-un tabel.
 
 În realitate, însă, din mai multe motive (e.g. flexibilitate), routerul
 *nu știe* aceste adrese, ci trebuie să le determine folosind protocolul
@@ -40,20 +39,21 @@ Antetul protocolului ARP este următorul:
 +--------+--------+--------+--------+
 ```
 
-Următoarea structura poate fi folosită pentru a reprezenta acest header În C:
+Vom folosi urmatoarea structura pentru a reprezenta acest header ĂŽn C:
 
 ```C
+// include/protocols.h
 /* Ethernet ARP packet from RFC 826 */
-struct arp_header {
-    uint16_t htype;   /* Format of hardware address. */
-    uint16_t ptype;   /* Format of protocol address. */
-    uint8_t hlen;    /* Dimensiunea adrese hardware 6 bytes pentru MAC */
-    uint8_t plen;    /* Dimensiunea adresei protocolului (IPV4). 4 bytes petnru IP */
-    uint16_t op;    /* ARP opcode */
-    uint8_t sha[6];  /* Adresa hardware (MAC) sender */
-    uint32_t spa;   /* Adresa IP sender */
-    uint8_t tha[6];  /* Adresa hardware target */
-    uint32_t tpa;   /* Adresa IP target */
+struct arp_hdr {
+	uint16_t hw_type;   /* Format of hardware address */
+	uint16_t proto_type;   /* Format of protocol address */
+	uint8_t hw_len;    /* Length of hardware address */
+	uint8_t proto_len;    /* Length of protocol address */
+	uint16_t opcode;    /* ARP opcode (command) */
+	uint8_t shwa[6];  /* Sender hardware address */
+	uint32_t sprotoa;   /* Sender IP address */
+	uint8_t thwa[6];  /* Target hardware address */
+	uint32_t tprotoa;   /* Target IP address */
 } __attribute__((packed));
 ```
 
diff --git a/src/ethernet.md b/src/ethernet.md
index 055d58e..476d9df 100644
--- a/src/ethernet.md
+++ b/src/ethernet.md
@@ -17,15 +17,15 @@ Ethernet L2 Frame Header
 Adresa MAC Destinație reprezintă identificatorul dispozitivului de nivel 2 către
 care a fost trimis acest cadru.
 
-În cadrul laboratorului puteți folosi următoarea structura pentru un
+În cadrul temei vom folosi următoarea structura pentru un
 cadru Ethernet.
 
 ```C
-struct  ether_header {
-    uint8_t  ether_dhost[6];    // MAC destinație
-    uint8_t  ether_shost[6];    // MAC sursă
-    uint16_t ether_type;        // folosit pentru a specifica protocolul de nivel
-                                // superior care este encapsulat ĂŽn Ethernet
+// include/protocols.h
+struct  ether_hdr {
+    uint8_t  ethr_dhost[6]; //adresa mac destinatie
+    uint8_t  ethr_shost[6]; //adresa mac sursa
+    uint16_t ethr_type;     // identificator protocol encapsulat
 };
 ```
 
diff --git a/src/faq.md b/src/faq.md
index 299c3b3..dff7599 100644
--- a/src/faq.md
+++ b/src/faq.md
@@ -1,5 +1,9 @@
 # FAQ & probleme
 
+-   **Q:** Pachetele sunt aruncate de host-ul destinatie.
+
+    **A:** Trebuie sa verificati cu Wireshark trei lucruri: MAC Destinatie, IP Destinatie si checksums.
+
 -   **Q:** Pe local am mai multe puncte decât pe checkerul online
 
     **A:**
@@ -12,6 +16,18 @@
     * Aveți undefined behaviour care este vizibil doar pe checker. În acest caz ar trebui să folosiți valgrind și address sanitization pentru a îl detecta
     * Ați uitat să includeți tabela ARP statică în arhivă în cazul în care o folosiți
 
+-  **Q:** Primesc eroare `No such file or directory: 'hosts_output/router_arp_reply/router0.pcap'`
+
+    **A:** Nu aveti instalat `tshark`.
+
+-  **Q:** Nu ruleaza checker-ul pe moodle.
+
+   **A:** Arhiva trebuie sa aiba formatul .zip, iar in root-ul arhivei sa fie solutia temei.
+
+-  **Q:** Unele teste au la host uri PASS când mă uit în Output dar îmi dă failed când rulez checkerul.Iar la alte teste 3 hosturi au PASS și unul are FAILED.
+
+   **A:** Fișierele *-host-err din folderele de test arată ce a funcționat greșit la un test. Spre exemplu, pentru forward20 (care testează trimiterea unor pachete de la host2 la host0), host1 și host3 nu ar trebui să primească nimic. Dacă nu primesc nimic, atunci este PASS din partea lor. În schimb, dacă host1 primește pachetele trimise de host2 în locul lui host0, o să ai PASS pentru host3 (nu trebuia să primească nimic, nu a primit nimic), PASS pentru host2 (trebuia să trimită și a trimis), FAIL pentru host0 (trebuia să primească dar nu a primit) și FAIL pentru host1 (nu trebuia să primească nimic dar a primit).
+
 -   **Q:** Cum pornesc mai mult de un terminal?
 
     **A:** rulați în background.
@@ -154,6 +170,10 @@
     o interfață și-i întoarce adresa MAC. Interfața pe care a venit
     pachetul trebuie extrasă din structura `msg`.
 
+-   **Q:** Ce nume trebuie sa aiba arhiva?
+    
+    **A:** La prima tema numele arhivei nu conteaza.
+
 -   **Q:** La testul "timeout is unreachable" primesc următoarea eroare:
 
         File "./checker.py", line 38, ĂŽn passive
@@ -180,3 +200,8 @@
 
         raise Exception( 'Could not find a default OpenFlow controller' )
 
+-   **Q:** Pe moodle vad eroarea urmatoare: Error setting resource limits. Mininet's performance may be affected.
+
+    **A:** Este ok, nu este o eroare, mai mult un warning de la faptul ca checker-ul ruleaza intr-un container.
+    
+
diff --git a/src/icmp.md b/src/icmp.md
index aeb233b..59796f0 100644
--- a/src/icmp.md
+++ b/src/icmp.md
@@ -69,29 +69,28 @@ header-ul IP al pachetului aruncat și 64 de biți din datele cărate de IP,
 > Pentru a înțelege mai bine funcționalitatea, vă recomandăm să urmăriți cu Wireshark răspunsurile routerului din casă.
 De exemplu, daca rulăm `ping -c 1  -t 1 8.8.8.8` de pe calculatorul nostru, vom putea observa raspunsul de tip `Time Exceeded Message` trimis de către router.
 
-Putem folosi următoarea structura pentru a reprezenta header-ul ICMP:
+**Vom folosi următoarea structura pentru a reprezenta header-ul ICMP**:
 
-```c
-
-struct icmphdr
+```C
+struct icmp_hdr
 {
-  uint8_t type;                /* message type */
-  uint8_t code;                /* type sub-code */
-  uint16_t checksum;           /* checksum header */
+  uint8_t mtype;                /* message type */
+  uint8_t mcode;                /* type sub-code */
+  uint16_t check;               /* checksum */
   union
   {
     struct
     {
       uint16_t        id;
-      uint16_t        sequence;     
-    } echo;                        /* echo datagram. Vom folosi doar acest câmp din union */
-    uint32_t        gateway;        /* Nu este relevant pentru tema */
+      uint16_t        seq;
+    } echo_t;                        /* echo datagram.  Vom folosi doar acest câmp din union*/
+    uint32_t        gateway_addr;        /* Gateway address. Nu este relevant pentru tema */
     struct
     {
       uint16_t        __unused;
       uint16_t        mtu;
-    } frag;                        /* Nu este relevant pentru tema */
-  } un;
+    } frag_t;                        /* Nu este relevant pentru tema */
+  } un_t;
 };
 ```
 
diff --git a/src/ip.md b/src/ip.md
index c54ecd8..b48406c 100644
--- a/src/ip.md
+++ b/src/ip.md
@@ -28,34 +28,32 @@ Header-ul unui pachet (packet) IP este următorul:
 Următoarea strucură poate fi folosită pentru a reprezenta un pachet IPV4.
 
 ```C
-struct iphdr {
-    // version este pe 4 biți, ihl este pe 4 biți
-    uint8_t    version:4,
-               ihl:4;     // Nu vom implementa protocolul IP cu opțiuni,
-                          // așa că 5 × 32 bits = 160 bits = 20 bytes
-                          // (internet header length)
+// include/protocols.h
+struct ip_hdr {
+    // this means that version uses 4 bits, and ihl 4 bits
+    uint8_t    ihl:4, ver:4;   // we use version = 4
     uint8_t    tos;         // Nu este relevant pentru temă (set pe 0)
-    uint16_t   tot_len;     // dimensiunea totală a header + date
-    uint16_t   id;          // Nu este relevant pentru temă, (set pe 1)
-    uint16_t   frag_off;    // Nu este relevant pentru temă, (set pe 0)
-    uint8_t    ttl;         // Time to live
-    uint8_t    protocol;    // Identificator al protocolului encapsulat (e.g. ICMP)
-    uint16_t   check;       // checksum of the iphdr, we checksum = 0 when computing
-    uint32_t   saddr;       // Adresa IP sursă
-    uint32_t   daddr;       // Adresa IP destinație
+    uint16_t   tot_len;     // total length = ipheader + data
+    uint16_t   id;          // Nu este relevant pentru temă, (set pe 4)
+    uint16_t   frag;        // Nu este relevant pentru temă, (set pe 0)
+    uint8_t    ttl;         // Time to Live -> to avoid loops, we will decrement
+    uint8_t    proto;       // Identificator al protocolului encapsulat (e.g. ICMP)
+    uint16_t   checksum;    // checksum     -> Since we modify TTL,
+    uint32_t   source_addr; // Adresa IP sursă  
+    uint32_t   dest_addr;   // Adresa IP destinație
 };
 ```
 
 **Nu suntem interesați de anumite funcționalități din IP precum fragmentarea**.
 Astfel, în cazul în care construiți un pachet IP de la 0,
-vom seta următoarele:
+vom seta **obligatoriu** următoarele:
 
 ```
 tos = 0
 frag_off = 0
 version = 4
 ihl = 5
-id = 1
+id = 4
 ```
 
 În [RFC 990 pagina 24](https://www.rfc-editor.org/rfc/rfc990) gășiți o listă de identificatori pentru diversele
-- 
GitLab