pkt_status_code pkt_decode(const char *data, const size_t len, pkt_t *pkt) { if(len<HEADER_BYTES) { return E_NOHEADER; } //Prise des 32 premier bits de header int *header_bytes = malloc(HEADER_BYTES*sizeof(char)); memcpy((void *)header_bytes, (void *) data, HEADER_BYTES); //prise de type int type = *header_bytes >> ((HEADER_BYTES*8)-TYPE_BITS); if(type!=PTYPE_DATA && type!= PTYPE_ACK && type!=PTYPE_NACK) { //return E_TYPE; } //prise de Window int wi1= *header_bytes << TYPE_BITS; int window = wi1 >> ((HEADER_BYTES*8)-WINDOW_BITS); if(window<0 || window>31) { return E_WINDOW; } //prise de seqnum int seq1 = *header_bytes << (WINDOW_BITS+TYPE_BITS); int seqnum = seq1 >> ((HEADER_BYTES*8)-SEQNUM_BITS); if(seqnum<0 || seqnum>255) { return E_SEQNUM; } //prise de length int length1 = *header_bytes << (WINDOW_BITS+TYPE_BITS+SEQNUM_BITS); int length = length1 >> ((HEADER_BYTES*8)-LENGTH_BITS); if(length!=(int)len-8 || length>512) { return E_LENGTH; } //Prise du CRC int crc =0; memcpy((void *)&crc,(void *)&data[len-CRC_BYTES],CRC_BYTES); //Calcul et comparaison nouveau CRC int new_crc = (int) crc32(0, (const void*)data, len-CRC_BYTES); if(new_crc != crc) { return E_CRC; } //création du paquet const char * payload = substring(data, HEADER_BYTES,len-CRC_BYTES); pkt_status_code erreur = PKT_OK; erreur = pkt_set_type(pkt, (const ptypes_t) type); erreur = pkt_set_window(pkt, (const uint8_t) window); erreur = pkt_set_seqnum(pkt, (const uint8_t) seqnum); erreur = pkt_set_length(pkt, (const uint16_t) length); erreur = pkt_set_crc(pkt, (const uint32_t) crc); erreur = pkt_set_payload(pkt, payload, (const uint16_t) len); //Si au moins une fonction pkt_set_*** renvoie une erreur, la fonction pkt_decode renverra le dernier message d'erreur obtenu. //return erreur; return erreur; }
static char *test_pkt_set_type() { packet p = pkt_create(REFERENCE, 1, 2, 3, 4); pkt_set_type(&p, ERROR); mu_assert("FAIL: test_pkt_set_type [1]", pkt_get_type(p) == ERROR); return NULL; }