From 56f877b63370614db6d7c085c404849d9eccb867 Mon Sep 17 00:00:00 2001 From: Matthias Kovatsch Date: Wed, 19 Jun 2013 14:45:20 +0200 Subject: [PATCH] Fixed option header bug for large deltas. --- apps/er-coap-13/er-coap-13.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/apps/er-coap-13/er-coap-13.c b/apps/er-coap-13/er-coap-13.c index 5a9d99498..8f474730a 100644 --- a/apps/er-coap-13/er-coap-13.c +++ b/apps/er-coap-13/er-coap-13.c @@ -90,7 +90,7 @@ coap_parse_int_option(uint8_t *bytes, size_t length) while (i268) { - 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)<buffer[0] |= COAP_HEADER_TOKEN_LEN_MASK & (coap_pkt->token_len)<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);