Lines Matching defs:pdu

42 coap_pdu_clear(coap_pdu_t *pdu, size_t size) {
43 assert(pdu);
44 assert(pdu->token);
45 assert(pdu->max_hdr_size >= COAP_PDU_MAX_UDP_HEADER_SIZE);
46 if (pdu->alloc_size > size)
47 pdu->alloc_size = size;
48 pdu->type = 0;
49 pdu->code = 0;
50 pdu->hdr_size = 0;
51 pdu->actual_token.length = 0;
52 pdu->e_token_length = 0;
53 pdu->crit_opt = 0;
54 pdu->mid = 0;
55 pdu->max_opt = 0;
56 pdu->max_size = size;
57 pdu->used_size = 0;
58 pdu->data = NULL;
59 pdu->body_data = NULL;
60 pdu->body_length = 0;
61 pdu->body_offset = 0;
62 pdu->body_total = 0;
63 pdu->lg_xmit = NULL;
64 pdu->session = NULL;
70 coap_pdu_t *pdu;
80 pdu = coap_malloc_type(COAP_PDU, sizeof(coap_pdu_t));
81 if (!pdu) {
86 pdu->max_hdr_size = COAP_PDU_MAX_UDP_HEADER_SIZE;
87 pdu->pbuf = pbuf;
88 pdu->token = (uint8_t *)pbuf->payload + pdu->max_hdr_size;
89 pdu->alloc_size = pbuf->tot_len - pdu->max_hdr_size;
90 coap_pdu_clear(pdu, pdu->alloc_size);
92 return pdu;
99 coap_pdu_t *pdu;
115 pdu = coap_malloc_type(COAP_PDU, sizeof(coap_pdu_t));
116 if (!pdu)
123 pdu->max_hdr_size = COAP_PDU_MAX_UDP_HEADER_SIZE;
125 pdu->max_hdr_size = COAP_PDU_MAX_TCP_HEADER_SIZE;
129 pdu->pbuf = pbuf_alloc(PBUF_TRANSPORT, size + pdu->max_hdr_size, PBUF_RAM);
130 if (pdu->pbuf == NULL) {
131 coap_free_type(COAP_PDU, pdu);
134 pdu->token = (uint8_t *)pdu->pbuf->payload + pdu->max_hdr_size;
137 pdu->alloc_size = min(size, 256);
138 buf = coap_malloc_type(COAP_PDU_BUF, pdu->alloc_size + pdu->max_hdr_size);
140 coap_free_type(COAP_PDU, pdu);
143 pdu->token = buf + pdu->max_hdr_size;
145 coap_pdu_clear(pdu, size);
146 pdu->mid = mid;
147 pdu->type = type;
148 pdu->code = code;
149 return pdu;
155 coap_pdu_t *pdu = coap_pdu_init(type, code, coap_new_message_id(session),
157 if (!pdu)
159 return pdu;
163 coap_delete_pdu(coap_pdu_t *pdu) {
164 if (pdu != NULL) {
166 pbuf_free(pdu->pbuf);
168 if (pdu->token != NULL)
169 coap_free_type(COAP_PDU_BUF, pdu->token - pdu->max_hdr_size);
171 coap_free_type(COAP_PDU, pdu);
185 coap_pdu_t *pdu;
194 pdu = coap_pdu_init(old_pdu->type, old_pdu->code,
200 if (pdu == NULL)
203 coap_add_token(pdu, token_length, token);
204 pdu->lg_xmit = old_pdu->lg_xmit;
211 if (!coap_pdu_resize(pdu, length + pdu->e_token_length))
214 memcpy(pdu->token + pdu->e_token_length,
216 pdu->used_size += length;
217 pdu->max_opt = old_pdu->max_opt;
227 if (!coap_add_option_internal(pdu, opt_iter.number,
233 return pdu;
236 coap_delete_pdu(pdu);
245 coap_pdu_resize(coap_pdu_t *pdu, size_t new_size) {
246 if (new_size > pdu->alloc_size) {
251 if (pdu->max_size && new_size > pdu->max_size) {
252 coap_log_warn("coap_pdu_resize: pdu too big\n");
256 if (pdu->data != NULL) {
257 assert(pdu->data > pdu->token);
258 offset = pdu->data - pdu->token;
263 pdu->token - pdu->max_hdr_size,
264 new_size + pdu->max_hdr_size);
269 pdu->token = new_hdr + pdu->max_hdr_size;
271 pdu->data = pdu->token + offset;
273 pdu->data = NULL;
274 if (pdu->actual_token.length < COAP_TOKEN_EXT_1B_BIAS)
275 pdu->actual_token.s = &pdu->token[0];
276 else if (pdu->actual_token.length < COAP_TOKEN_EXT_2B_BIAS)
277 pdu->actual_token.s = &pdu->token[1];
279 pdu->actual_token.s = &pdu->token[2];
282 pdu->alloc_size = new_size;
287 coap_pdu_check_resize(coap_pdu_t *pdu, size_t size) {
288 if (size > pdu->alloc_size) {
289 size_t new_size = max(256, pdu->alloc_size * 2);
292 if (pdu->max_size && new_size > pdu->max_size) {
293 new_size = pdu->max_size;
297 if (!coap_pdu_resize(pdu, new_size))
304 coap_add_token(coap_pdu_t *pdu, size_t len, const uint8_t *data) {
307 /* must allow for pdu == NULL as callers may rely on this */
308 if (!pdu)
311 if (pdu->used_size) {
315 pdu->actual_token.length = len;
326 if (!coap_pdu_check_resize(pdu, len + bias)) {
331 pdu->actual_token.length = len;
332 pdu->actual_token.s = &pdu->token[bias];
333 pdu->e_token_length = (uint32_t)(len + bias);
337 memcpy(pdu->token, data, len);
340 pdu->token[0] = (uint8_t)(len - COAP_TOKEN_EXT_1B_BIAS);
341 memcpy(&pdu->token[1], data, len);
344 pdu->token[0] = (uint8_t)((len - COAP_TOKEN_EXT_2B_BIAS) >> 8);
345 pdu->token[1] = (uint8_t)((len - COAP_TOKEN_EXT_2B_BIAS) & 0xff);
346 memcpy(&pdu->token[2], data, len);
352 pdu->max_opt = 0;
353 pdu->used_size = len + bias;
354 pdu->data = NULL;
361 coap_update_token(coap_pdu_t *pdu, size_t len, const uint8_t *data) {
364 /* must allow for pdu == NULL as callers may rely on this */
365 if (!pdu)
368 if (pdu->used_size == 0) {
369 return coap_add_token(pdu, len, data);
381 if ((len + bias) == pdu->e_token_length) {
383 } else if ((len + bias) > pdu->e_token_length) {
384 if (!coap_pdu_check_resize(pdu,
385 pdu->used_size + (len + bias) - pdu->e_token_length)) {
389 memmove(&pdu->token[(len + bias) - pdu->e_token_length],
390 pdu->token, pdu->used_size);
391 pdu->used_size += len + bias - pdu->e_token_length;
392 if (pdu->data) {
393 pdu->data += (len + bias) - pdu->e_token_length;
396 pdu->used_size -= pdu->e_token_length - (len + bias);
397 memmove(pdu->token, &pdu->token[pdu->e_token_length - (len + bias)], pdu->used_size);
398 if (pdu->data) {
399 pdu->data -= pdu->e_token_length - (len + bias);
403 pdu->actual_token.length = len;
404 pdu->actual_token.s = &pdu->token[bias];
405 pdu->e_token_length = (uint8_t)(len + bias);
409 if (memcmp(pdu->token, data, len) != 0)
410 memcpy(pdu->token, data, len);
413 pdu->token[0] = (uint8_t)(len - COAP_TOKEN_EXT_1B_BIAS);
414 memcpy(&pdu->token[1], data, len);
417 pdu->token[0] = (uint8_t)((len - COAP_TOKEN_EXT_2B_BIAS) >> 8);
418 pdu->token[1] = (uint8_t)((len - COAP_TOKEN_EXT_2B_BIAS) & 0xff);
419 memcpy(&pdu->token[2], data, len);
429 coap_remove_option(coap_pdu_t *pdu, coap_option_num_t number) {
438 coap_option_iterator_init(pdu, &opt_iter, COAP_OPT_ALL);
448 if (!coap_opt_parse(option, pdu->used_size - (option - pdu->token),
455 pdu->used_size - (next_option - pdu->token),
474 if (!coap_pdu_check_resize(pdu, pdu->used_size + 1))
478 coap_option_iterator_init(pdu, &opt_iter, COAP_OPT_ALL);
489 pdu->used_size - (next_option - pdu->token));
490 pdu->used_size++;
491 if (pdu->data)
492 pdu->data++;
512 pdu->max_opt -= decode_this.delta;
514 if (pdu->used_size - (next_option - pdu->token))
515 memmove(option, next_option, pdu->used_size - (next_option - pdu->token));
516 pdu->used_size -= next_option - option;
517 if (pdu->data)
518 pdu->data -= next_option - option;
566 coap_insert_option(coap_pdu_t *pdu, coap_option_num_t number, size_t len,
576 if (number >= pdu->max_opt)
577 return coap_add_option_internal(pdu, number, len, data);
580 coap_option_iterator_init(pdu, &opt_iter, COAP_OPT_ALL);
593 if (!coap_opt_parse(option, pdu->used_size - (option - pdu->token), &decode))
601 if (!coap_pdu_check_resize(pdu,
602 pdu->used_size + shift - shrink))
607 coap_option_iterator_init(pdu, &opt_iter, COAP_OPT_ALL);
642 pdu->used_size - (option - pdu->token) - shrink);
643 if (!coap_opt_encode(option, pdu->alloc_size - pdu->used_size,
648 pdu->used_size += shift - shrink;
649 if (pdu->data)
650 pdu->data += shift - shrink;
652 pdu->used_size -= shrink - shift;
653 if (pdu->data)
654 pdu->data -= shrink - shift;
660 coap_update_option(coap_pdu_t *pdu, coap_option_num_t number, size_t len,
668 option = coap_check_option(pdu, number, &opt_iter);
670 return coap_insert_option(pdu, number, len, data);
678 if (!coap_pdu_check_resize(pdu,
679 pdu->used_size + new_length - old_length))
682 option = coap_check_option(pdu, number, &opt_iter);
687 pdu->used_size - (option - pdu->token) - old_length);
694 pdu->used_size += new_length - old_length;
695 if (pdu->data)
696 pdu->data += new_length - old_length;
698 pdu->used_size -= old_length - new_length;
699 if (pdu->data)
700 pdu->data -= old_length - new_length;
706 coap_add_option(coap_pdu_t *pdu, coap_option_num_t number, size_t len,
708 if (pdu->data) {
712 return coap_add_option_internal(pdu, number, len, data);
716 coap_add_option_internal(coap_pdu_t *pdu, coap_option_num_t number, size_t len,
721 assert(pdu);
723 if (number == pdu->max_opt) {
728 if (COAP_PDU_IS_REQUEST(pdu) &&
737 if (coap_check_option(pdu, COAP_OPTION_HOP_LIMIT, &opt_iter) == NULL) {
740 coap_insert_option(pdu, COAP_OPTION_HOP_LIMIT, 1, (uint8_t *)&hop_limit);
744 if (number < pdu->max_opt) {
746 return coap_insert_option(pdu, number, len, data);
749 optsize = coap_opt_encode_size(number - pdu->max_opt, len);
750 if (!coap_pdu_check_resize(pdu,
751 pdu->used_size + optsize))
754 if (pdu->data) {
756 memmove(&pdu->data[optsize-1], &pdu->data[-1],
757 pdu->used_size - (pdu->data - pdu->token) + 1);
758 opt = pdu->data -1;
759 pdu->data += optsize;
761 opt = pdu->token + pdu->used_size;
765 optsize = coap_opt_encode(opt, pdu->alloc_size - pdu->used_size,
766 number - pdu->max_opt, data, len);
773 pdu->max_opt = number;
774 pdu->used_size += optsize;
781 coap_add_data(coap_pdu_t *pdu, size_t len, const uint8_t *data) {
785 uint8_t *payload = coap_add_data_after(pdu, len);
793 coap_add_data_after(coap_pdu_t *pdu, size_t len) {
794 assert(pdu);
795 if (pdu->data) {
803 if (!coap_pdu_resize(pdu, pdu->used_size + len + 1))
805 pdu->token[pdu->used_size++] = COAP_PAYLOAD_START;
806 pdu->data = pdu->token + pdu->used_size;
807 pdu->used_size += len;
808 return pdu->data;
812 coap_get_data(const coap_pdu_t *pdu, size_t *len, const uint8_t **data) {
816 return coap_get_data_large(pdu, len, data, &offset, &total);
820 coap_get_data_large(const coap_pdu_t *pdu, size_t *len, const uint8_t **data,
822 assert(pdu);
826 *offset = pdu->body_offset;
827 *total = pdu->body_total;
828 if (pdu->body_data) {
829 *data = pdu->body_data;
830 *len = pdu->body_length;
833 *data = pdu->data;
834 if (pdu->data == NULL) {
840 *len = pdu->used_size - (pdu->data - pdu->token);
1011 coap_pdu_parse_header(coap_pdu_t *pdu, coap_proto_t proto) {
1012 uint8_t *hdr = pdu->token - pdu->hdr_size;
1016 assert(pdu->hdr_size == 4);
1021 pdu->type = (hdr[0] >> 4) & 0x03;
1022 pdu->code = hdr[1];
1023 pdu->mid = (uint16_t)hdr[2] << 8 | hdr[3];
1025 assert(pdu->hdr_size >= 2 && pdu->hdr_size <= 6);
1026 pdu->type = COAP_MESSAGE_CON;
1027 pdu->code = hdr[pdu->hdr_size-1];
1028 pdu->mid = 0;
1030 assert(pdu->hdr_size == 2);
1031 pdu->type = COAP_MESSAGE_CON;
1032 pdu->code = hdr[pdu->hdr_size-1];
1033 pdu->mid = 0;
1041 pdu->e_token_length = e_token_length;
1042 pdu->actual_token.length = pdu->e_token_length;
1043 pdu->actual_token.s = &pdu->token[0];
1045 pdu->e_token_length = pdu->token[0] + COAP_TOKEN_EXT_1B_BIAS + 1;
1046 pdu->actual_token.length = pdu->e_token_length - 1;
1047 pdu->actual_token.s = &pdu->token[1];
1049 pdu->e_token_length = ((uint16_t)pdu->token[0] << 8) + pdu->token[1] +
1051 pdu->actual_token.length = pdu->e_token_length - 2;
1052 pdu->actual_token.s = &pdu->token[2];
1054 if (pdu->e_token_length > pdu->alloc_size || e_token_length == 15) {
1057 pdu->e_token_length = 0;
1058 pdu->actual_token.length = 0;
1065 coap_pdu_parse_opt_csm(coap_pdu_t *pdu, uint16_t len) {
1066 switch ((coap_pdu_signaling_proto_t)pdu->code) {
1068 switch (pdu->max_opt) {
1082 if (pdu->max_opt & 0x01)
1088 switch (pdu->max_opt) {
1094 if (pdu->max_opt & 0x01)
1099 switch (pdu->max_opt) {
1109 if (pdu->max_opt & 0x01)
1114 switch (pdu->max_opt) {
1120 if (pdu->max_opt & 0x01)
1133 coap_pdu_parse_opt_base(coap_pdu_t *pdu, uint16_t len) {
1136 switch (pdu->max_opt) {
1273 coap_pdu_parse_opt(coap_pdu_t *pdu) {
1277 if (pdu->code == 0) {
1278 if (pdu->used_size != 0 || pdu->e_token_length) {
1284 if (pdu->e_token_length > pdu->used_size) {
1289 pdu->max_opt = 0;
1290 if (pdu->code == 0) {
1292 pdu->used_size = 0;
1293 pdu->data = NULL;
1296 coap_opt_t *opt = pdu->token + pdu->e_token_length;
1297 size_t length = pdu->used_size - pdu->e_token_length;
1303 size_t optsize = next_option_safe(&opt, &length, &pdu->max_opt);
1308 pdu->code >> 5, pdu->code & 0x1F,
1309 (int)(opt_last - pdu->token - pdu->e_token_length));
1313 if (COAP_PDU_IS_SIGNALING(pdu) ?
1314 !coap_pdu_parse_opt_csm(pdu, len) :
1315 !coap_pdu_parse_opt_base(pdu, len)) {
1317 pdu->code >> 5, pdu->code & 0x1F,
1318 (int)(opt_last - pdu->token - pdu->e_token_length), pdu->max_opt,
1338 opt = pdu->token + pdu->e_token_length;
1339 length = pdu->used_size - pdu->e_token_length;
1340 pdu->max_opt = 0;
1347 size_t optsize = next_option_safe(&opt, &length, &pdu->max_opt);
1350 if (!optsize || (COAP_PDU_IS_SIGNALING(pdu) ?
1351 !coap_pdu_parse_opt_csm(pdu, len) :
1352 !coap_pdu_parse_opt_base(pdu, len))) {
1356 opt = pdu->token + pdu->used_size;
1388 pdu->data = (uint8_t *)opt;
1390 pdu->data = NULL;
1400 coap_pdu_t *pdu) {
1408 if (hdr_size > pdu->max_hdr_size)
1410 if (!coap_pdu_resize(pdu, length - hdr_size))
1412 if (pdu->token - hdr_size != data)
1413 memcpy(pdu->token - hdr_size, data, length);
1414 pdu->hdr_size = (uint8_t)hdr_size;
1415 pdu->used_size = length - hdr_size;
1416 return coap_pdu_parse_header(pdu, proto) && coap_pdu_parse_opt(pdu);
1420 coap_pdu_encode_header(coap_pdu_t *pdu, coap_proto_t proto) {
1421 if (pdu == NULL || pdu->token == NULL)
1426 if (pdu->actual_token.length < COAP_TOKEN_EXT_1B_BIAS) {
1427 e_token_length = (uint8_t)pdu->actual_token.length;
1428 } else if (pdu->actual_token.length < COAP_TOKEN_EXT_2B_BIAS) {
1430 } else if (pdu->actual_token.length <= COAP_TOKEN_EXT_MAX) {
1437 assert(pdu->max_hdr_size >= 4);
1438 if (pdu->max_hdr_size < 4) {
1442 pdu->token[-4] = COAP_DEFAULT_VERSION << 6
1443 | pdu->type << 4
1445 pdu->token[-3] = pdu->code;
1446 pdu->token[-2] = (uint8_t)(pdu->mid >> 8);
1447 pdu->token[-1] = (uint8_t)(pdu->mid);
1448 pdu->hdr_size = 4;
1451 assert(pdu->used_size >= pdu->e_token_length);
1452 if (pdu->used_size < pdu->e_token_length) {
1459 len = pdu->used_size - pdu->e_token_length;
1461 assert(pdu->max_hdr_size >= 2);
1462 if (pdu->max_hdr_size < 2) {
1466 pdu->token[-2] = (uint8_t)len << 4
1468 pdu->token[-1] = pdu->code;
1469 pdu->hdr_size = 2;
1471 assert(pdu->max_hdr_size >= 3);
1472 if (pdu->max_hdr_size < 3) {
1476 pdu->token[-3] = 13 << 4 | e_token_length;
1477 pdu->token[-2] = (uint8_t)(len - COAP_MESSAGE_SIZE_OFFSET_TCP8);
1478 pdu->token[-1] = pdu->code;
1479 pdu->hdr_size = 3;
1481 assert(pdu->max_hdr_size >= 4);
1482 if (pdu->max_hdr_size < 4) {
1486 pdu->token[-4] = 14 << 4 | e_token_length;
1487 pdu->token[-3] = (uint8_t)((len - COAP_MESSAGE_SIZE_OFFSET_TCP16) >> 8);
1488 pdu->token[-2] = (uint8_t)(len - COAP_MESSAGE_SIZE_OFFSET_TCP16);
1489 pdu->token[-1] = pdu->code;
1490 pdu->hdr_size = 4;
1492 assert(pdu->max_hdr_size >= 6);
1493 if (pdu->max_hdr_size < 6) {
1497 pdu->token[-6] = 15 << 4 | e_token_length;
1498 pdu->token[-5] = (uint8_t)((len - COAP_MESSAGE_SIZE_OFFSET_TCP32) >> 24);
1499 pdu->token[-4] = (uint8_t)((len - COAP_MESSAGE_SIZE_OFFSET_TCP32) >> 16);
1500 pdu->token[-3] = (uint8_t)((len - COAP_MESSAGE_SIZE_OFFSET_TCP32) >> 8);
1501 pdu->token[-2] = (uint8_t)(len - COAP_MESSAGE_SIZE_OFFSET_TCP32);
1502 pdu->token[-1] = pdu->code;
1503 pdu->hdr_size = 6;
1508 return pdu->hdr_size;
1512 coap_pdu_get_code(const coap_pdu_t *pdu) {
1513 return pdu->code;
1517 coap_pdu_set_code(coap_pdu_t *pdu, coap_pdu_code_t code) {
1519 pdu->code = code;
1523 coap_pdu_get_type(const coap_pdu_t *pdu) {
1524 return pdu->type;
1528 coap_pdu_set_type(coap_pdu_t *pdu, coap_pdu_type_t type) {
1530 pdu->type = type;
1534 coap_pdu_get_token(const coap_pdu_t *pdu) {
1535 return pdu->actual_token;
1539 coap_pdu_get_mid(const coap_pdu_t *pdu) {
1540 return pdu->mid;
1544 coap_pdu_set_mid(coap_pdu_t *pdu, coap_mid_t mid) {
1546 pdu->mid = mid;