Fixed option header bug for large deltas.

This commit is contained in:
Matthias Kovatsch 2013-06-19 14:45:20 +02:00
parent af93e5fbd9
commit 56f877b633

View file

@ -90,7 +90,7 @@ coap_parse_int_option(uint8_t *bytes, size_t length)
while (i<length)
{
var <<= 8;
var |= 0xFF & bytes[i++];
var |= bytes[i++];
}
return var;
}
@ -117,7 +117,7 @@ static
size_t
coap_set_option_header(unsigned int delta, size_t length, uint8_t *buffer)
{
size_t written = 1;
size_t written = 0;
buffer[0] = coap_option_nibble(delta)<<4 | coap_option_nibble(length);
@ -127,19 +127,19 @@ coap_set_option_header(unsigned int delta, size_t length, uint8_t *buffer)
{
if (*x>268)
{
buffer[written++] = (*x-269)>>8;
buffer[written++] = (*x-269);
buffer[++written] = (*x-269)>>8;
buffer[++written] = (*x-269);
}
else if (delta>12)
else if (*x>12)
{
buffer[written++] = (*x-13);
buffer[++written] = (*x-13);
}
}
while (x!=&length && (x=&length));
PRINTF("WRITTEN %u B opt header\n", written);
return written;
return ++written;
}
/*-----------------------------------------------------------------------------------*/
static
@ -148,14 +148,19 @@ coap_serialize_int_option(unsigned int number, unsigned int current_number, uint
{
size_t i = 0;
if (0xFF000000 & value) buffer[++i] = (uint8_t) (0xFF & value>>24);
if (0xFFFF0000 & value) buffer[++i] = (uint8_t) (0xFF & value>>16);
if (0xFFFFFF00 & value) buffer[++i] = (uint8_t) (0xFF & value>>8);
if (0xFFFFFFFF & value) buffer[++i] = (uint8_t) (0xFF & value);
if (0xFF000000 & value) ++i;
if (0xFFFF0000 & value) ++i;
if (0xFFFFFF00 & value) ++i;
if (0xFFFFFFFF & value) ++i;
PRINTF("OPTION %u (delta %u, len %u)\n", number, number - current_number, i);
i += coap_set_option_header(number - current_number, i, buffer);
i = coap_set_option_header(number - current_number, i, buffer);
if (0xFF000000 & value) buffer[i++] = (uint8_t) (value>>24);
if (0xFFFF0000 & value) buffer[i++] = (uint8_t) (value>>16);
if (0xFFFFFF00 & value) buffer[i++] = (uint8_t) (value>>8);
if (0xFFFFFFFF & value) buffer[i++] = (uint8_t) (value);
return i;
}
@ -319,8 +324,8 @@ coap_serialize_message(void *packet, uint8_t *buffer)
coap_pkt->buffer[0] |= COAP_HEADER_TYPE_MASK & (coap_pkt->type)<<COAP_HEADER_TYPE_POSITION;
coap_pkt->buffer[0] |= COAP_HEADER_TOKEN_LEN_MASK & (coap_pkt->token_len)<<COAP_HEADER_TOKEN_LEN_POSITION;
coap_pkt->buffer[1] = coap_pkt->code;
coap_pkt->buffer[2] = 0xFF & (coap_pkt->mid)>>8;
coap_pkt->buffer[3] = 0xFF & coap_pkt->mid;
coap_pkt->buffer[2] = (uint8_t) ((coap_pkt->mid)>>8);
coap_pkt->buffer[3] = (uint8_t) (coap_pkt->mid);
/* set Token */
PRINTF("Token (len %u)", coap_pkt->token_len);