This shows you the differences between two versions of the page.
pc:laboratoare:03 [2022/03/15 14:47] dorinel.filip [Sume de control] |
pc:laboratoare:03 [2022/03/23 18:33] (current) vlad_andrei.badoiu [Exerciții] |
||
---|---|---|---|
Line 27: | Line 27: | ||
* beginning at location "addr". | * beginning at location "addr". | ||
*/ | */ | ||
- | register long sum = 0; | + | uint32_t sum = 0; |
+ | /* | ||
+ | Move through the buffer two bytes at the time, | ||
+ | cast the bytes to a number and add them to the sum | ||
+ | */ | ||
while( count > 1 ) { | while( count > 1 ) { | ||
/* This is the inner loop */ | /* This is the inner loop */ | ||
- | sum += * (unsigned short *) addr++; | + | sum += * (uint16_t *) addr; |
+ | addr += 2; | ||
count -= 2; | count -= 2; | ||
} | } | ||
Line 37: | Line 41: | ||
/* Add left-over byte, if any */ | /* Add left-over byte, if any */ | ||
if( count > 0 ) | if( count > 0 ) | ||
- | sum += * (unsigned char *) addr; | + | sum += * (uint8_t *) addr; |
/* Fold 32-bit sum to 16 bits */ | /* Fold 32-bit sum to 16 bits */ | ||
Line 65: | Line 69: | ||
</code> | </code> | ||
* Intercalăm biții de paritate cu cei originali: p1, p2, d1, p3, d2, d3, d4 | * Intercalăm biții de paritate cu cei originali: p1, p2, d1, p3, d2, d3, d4 | ||
- | <note warning> | ||
- | d1 ar trebui sa fie mereu cel mai semnificativ bit (MSB) | ||
- | |||
- | </note> | ||
Pentru a corecta o eroare în biții transmiși, trebuie sa calculam sindromul(z), astfel: | Pentru a corecta o eroare în biții transmiși, trebuie sa calculam sindromul(z), astfel: | ||
* Pornim de la un sir de 7 biți: r1, r2, r3, r4, r5, r6, r7 | * Pornim de la un sir de 7 biți: r1, r2, r3, r4, r5, r6, r7 | ||
Line 87: | Line 87: | ||
Pentru laboratorul acesta veți folosi scheletul oferit la adresa: [[https://gitlab.cs.pub.ro/protocoale-de-comunicatie/pcom-laboratoare-public/-/tree/master/lab3|lab3]] | Pentru laboratorul acesta veți folosi scheletul oferit la adresa: [[https://gitlab.cs.pub.ro/protocoale-de-comunicatie/pcom-laboratoare-public/-/tree/master/lab3|lab3]] | ||
- | 1(5p). In funcția inet_csum din schelet, implementați algoritmul Internet Checksum, asa cum este descris aici [[https://datatracker.ietf.org/doc/html/rfc1071#section-4|Computing the Internet Checksum]]. Verificați ca au fost transmise corect pachetele. **In scriptul ''run_experiment.sh'' avem campurile CORRUPTION care manipuleaza rata de corupere a pachetelor.** | + | 1(5p). In funcția inet_csum din schelet, implementați algoritmul Internet Checksum, asa cum a fost descris in laborator. Verificați ca au fost transmise corect pachetele. **In scriptul ''run_experiment.sh'' avem campurile CORRUPTION care manipuleaza rata de corupere a pachetelor.** |
2(3p). In funcția hamming_4to7 din schelet, implementați codarea Hamming, cum a fost descrisa in laborator. Ca input veti primi un byte ce are ultimii 4 biti setati la nibbleul ce trebuie codat, restul bitilor vor fi 0. La output veti returna un byte cu utlimii 7 biti setati la valoare codata a inputului. | 2(3p). In funcția hamming_4to7 din schelet, implementați codarea Hamming, cum a fost descrisa in laborator. Ca input veti primi un byte ce are ultimii 4 biti setati la nibbleul ce trebuie codat, restul bitilor vor fi 0. La output veti returna un byte cu utlimii 7 biti setati la valoare codata a inputului. | ||
Line 95: | Line 95: | ||
</note> | </note> | ||
- | 3(2p). In funcția hamming_7to4 din schelet (in ''common.h''), implementati decodarea Hamming, cum a fost descrisa în laborator Inputul și outputul vor fi interschimbate fata de cele de la exercițiul 1. Deocamdată nu este necesara calcularea sindromului sau corectarea erorilor. | + | 3(2p). In funcția hamming_7to4 din schelet (in ''send.c''), implementati decodarea Hamming, cum a fost descrisa în laborator Inputul și outputul vor fi interschimbate fata de cele de la exercițiul 1. Deocamdată nu este necesara calcularea sindromului sau corectarea erorilor. |
- | 4(1p). In funcția hamming_7to4 din schelet (in ''common.h''), implementați corectarea erorilor folosind sindromul. Adaugați erori la poziții aleatoare în pachete. Tratând atât cazul în care are loc o eroare pe octet, cat și mai multe. Observați daca checksum-ul încă este corect. | + | 4(1p). In funcția hamming_7to4 din schelet (in ''recv.c''), implementați corectarea erorilor folosind sindromul. Adaugați erori la poziții aleatoare în pachete. Tratând atât cazul în care are loc o eroare pe octet, cat și mai multe. Observați daca checksum-ul încă este corect. |
<note warning> | <note warning> | ||
Pentru a depana problemele va recomandam crash course-ul de [[https://ocw.cs.pub.ro/courses/programare/tutoriale/debugging|Debugging]]. | Pentru a depana problemele va recomandam crash course-ul de [[https://ocw.cs.pub.ro/courses/programare/tutoriale/debugging|Debugging]]. | ||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | O posibila solutie a laboratorului se gaseste [[https://ocw.cs.pub.ro/courses/_media/pc/laboratoare/lab3_sol.zip|aici]] | ||
</note> | </note> |