diff --git a/src/about.md b/src/about.md index a7a78c3375184a8955addde149ea33f9f0840e48..a0fe7566c128ae772250ee34cfbca3dc00fc210c 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 bc814d6b6c566449ea42deaa04af244baefa676d..15a64a35acb6a75a1a408503fb5f2b6c66971929 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 4c8f61dc1bc02470296a5f2267f729f27b0ae4c0..3f8dd9031b1325b8f67b863273423bc15a09d273 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 055d58e1853862c063e6ecf1935d94d39418f16c..476d9df1ca0473f3e9f9f7f05369ec1f01ab8151 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 299c3b39c5e1c2336e20d10e9922f0bafc08ce66..dff7599f4bf047d4832b83538d24164a7e3abbec 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 aeb233bfeae48058e328c5d348d956f1401ad4ff..59796f00b690fadc667c6719dc322d4dcb93253a 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 c54ecd82bedbe35731779ddddafb262518857912..b48406cac3bab6d32e0ab44b2c6075facc9aecf1 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