Esempio n. 1
0
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;
}
Esempio n. 2
0
static char *test_pkt_set_payload() {
  packet p = pkt_create(REFERENCE, 1, 2, 3, 4);
  pkt_set_payload(&p, 7);
  mu_assert("FAIL: test_pkt_set_payload [1]", pkt_get_payload(p) == 7);
  return NULL;
}