message.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2024-2025 Carl Seifert
3  * Copyright (C) 2024-2025 TU Dresden
4  *
5  * This file is subject to the terms and conditions of the GNU Lesser General
6  * Public License v2.1. See the file LICENSE in the top level directory for
7  * more details.
8  */
9 
10 #pragma once
11 
12 #include <stdint.h>
13 #include <stdbool.h>
14 #include <stddef.h>
15 #include <string.h>
16 
17 #include "iolist.h"
18 
19 #include "net/unicoap/constants.h"
20 #include "net/unicoap/options.h"
21 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 /* MARK: - CoAP message */
45 typedef enum {
50 
56 
75 typedef struct {
84 
88  union {
92  struct {
98  uint8_t* payload;
99 
106  size_t payload_size;
107  };
108 
118  };
119 
120  union {
131  uint8_t code;
132 
133  /* Note:
134  * Method, status, and signal are guaranteed to have the same size as uint8_t,
135  * see static_asserts in definitions.h
136  */
137 
145 
153 
161  };
162 
171 
181 static inline uint8_t* unicoap_message_payload_get(unicoap_message_t* message)
182 {
184  return message->payload;
185 }
186 
195 static inline void unicoap_message_payload_set(unicoap_message_t* message, uint8_t* payload,
196  size_t size)
197 {
199  message->payload = payload;
200  message->payload_size = size;
201 }
202 
213 {
215  return message->payload_chunks;
216 }
217 
225 static inline void unicoap_message_payload_set_chunks(unicoap_message_t* message, iolist_t* chunks)
226 {
228  message->payload_chunks = chunks;
229 }
230 
240 
251 static inline size_t unicoap_message_payload_get_size(const unicoap_message_t* message)
252 {
254  iolist_size(message->payload_chunks) :
255  message->payload_size;
256 }
257 
268 
281 ssize_t unicoap_message_payload_copy(const unicoap_message_t* message, uint8_t* buffer,
282  size_t capacity);
283 
295  size_t capacity);
296 
300 typedef struct {
302  uint8_t* token;
303 
306 
312  bool is_registration : 1;
313 
319  bool is_notification : 1;
320 
322  struct {
325 
327  uint16_t id;
328  } rfc7252;
329 
332 
346 
353 static inline uint8_t* unicoap_message_options_data(const unicoap_message_t* message)
354 {
355  return message->options ? message->options->entries->data : NULL;
356 }
357 
364 static inline size_t unicoap_message_options_size(const unicoap_message_t* message)
365 {
366  return message->options ? message->options->storage_size : 0;
367 }
370 /* MARK: - CoAP code */
393 static inline uint8_t unicoap_code_class(uint8_t code)
394 {
395  return code >> 5;
396 }
397 
416 static inline uint8_t unicoap_code_detail(uint8_t code)
417 {
418  return code & 0x1f;
419 }
420 
428 int unicoap_print_code(uint8_t code, char* string);
429 
438 const char* unicoap_string_from_code(uint8_t code);
439 
448 const char* unicoap_string_from_code_class(uint8_t code);
451 /* MARK: - Message initializers */
463 static inline void unicoap_message_init_empty(unicoap_message_t* message, uint8_t code)
464 {
465  message->code = code;
466  message->options = NULL;
467  message->payload = NULL;
468  message->payload_size = 0;
469 }
470 
477 {
478  return (unicoap_message_t){ .code = code };
479 }
480 
490 static inline void unicoap_message_init(unicoap_message_t* message, uint8_t code, uint8_t* payload,
491  size_t payload_size)
492 {
493  message->code = code;
494  message->options = NULL;
495  message->payload = payload;
496  message->payload_size = payload_size;
497 }
498 
506 static inline unicoap_message_t unicoap_message_alloc(uint8_t code, uint8_t* payload,
507  size_t payload_size)
508 {
509  return (unicoap_message_t){ .code = code, .payload = payload, .payload_size = payload_size };
510 }
511 
521 static inline void unicoap_message_init_string(unicoap_message_t* message, uint8_t code,
522  const char* payload)
523 {
524  message->code = code;
525  message->options = NULL;
526  message->payload = (uint8_t*)payload;
527  message->payload_size = payload ? strlen(payload) : 0;
528 }
529 
536 static inline unicoap_message_t unicoap_message_alloc_string(uint8_t code, const char* payload)
537 {
538  return (unicoap_message_t){ .code = code,
539  .payload = (uint8_t*)payload,
540  .payload_size = payload ? strlen(payload) : 0 };
541 }
542 
555 static inline void unicoap_message_init_with_options(unicoap_message_t* message, uint8_t code,
556  uint8_t* payload, size_t payload_size,
557  unicoap_options_t* options)
558 {
559  message->code = code;
560  message->options = options;
561  message->payload = payload;
562  message->payload_size = payload_size;
563 }
564 
574 static inline unicoap_message_t unicoap_message_alloc_with_options(uint8_t code, uint8_t* payload,
575  size_t payload_size,
576  unicoap_options_t* options)
577 {
578  return (unicoap_message_t){
579  .code = code, .options = options, .payload = payload, .payload_size = payload_size
580  };
581 }
582 
594 static inline
596  const char* payload,
597  unicoap_options_t* options)
598 {
599  unicoap_message_init_with_options(message, code, (uint8_t*)payload,
600  payload ? strlen(payload) : 0, options);
601 }
602 
611 static inline
613  const char* payload,
614  unicoap_options_t* options)
615 {
616  return (unicoap_message_t){ .code = code,
617  .options = options,
618  .payload = (uint8_t*)payload,
619  .payload_size = payload ? strlen(payload) : 0 };
620 }
623 /* MARK: - Signaling messages */
637 static inline bool unicoap_message_is_signal(uint8_t code)
638 {
640 }
641 
650 {
651  return message->signal;
652 }
653 
662 {
663  message->signal = signal;
664 }
665 
677 /* MARK: - Request messages */
690 static inline bool unicoap_message_is_request(uint8_t code)
691 {
693 }
694 
703 {
704  return request->method;
705 }
706 
716 {
717  request->method = method;
718 }
719 
729 
739 {
740  unicoap_message_init_empty(request, (uint8_t)method);
741 }
742 
749 {
750  return unicoap_message_alloc_empty((uint8_t)method);
751 }
752 
763 static inline void unicoap_request_init(unicoap_message_t* request, unicoap_method_t method,
764  uint8_t* payload, size_t payload_size)
765 {
766  unicoap_message_init(request, (uint8_t)method, payload, payload_size);
767 }
768 
776 static inline unicoap_message_t unicoap_request_alloc(unicoap_method_t method, uint8_t* payload,
777  size_t payload_size)
778 {
779  return unicoap_message_alloc((uint8_t)method, payload, payload_size);
780 }
781 
792  const char* payload)
793 {
794  unicoap_message_init_string(request, (uint8_t)method, payload);
795 }
796 
804  const char* payload)
805 {
806  return unicoap_message_alloc_string((uint8_t)method, payload);
807 }
808 
822  unicoap_method_t method,
823  uint8_t* payload, size_t payload_size,
824  unicoap_options_t* options)
825 {
826  unicoap_message_init_with_options(request, (uint8_t)method, payload, payload_size, options);
827 }
828 
839  uint8_t* payload,
840  size_t payload_size,
841  unicoap_options_t* options)
842 {
843  return unicoap_message_alloc_with_options((uint8_t)method, payload, payload_size, options);
844 }
845 
858  unicoap_method_t method,
859  const char* payload,
860  unicoap_options_t* options)
861 {
862  unicoap_message_init_string_with_options(request, (uint8_t)method, payload, options);
863 }
864 
873 static inline
875  const char* payload,
876  unicoap_options_t* options)
877 {
878  return unicoap_message_alloc_string_with_options((uint8_t)method, payload, options);
879 }
882 /* MARK: - Response messages */
896 bool unicoap_message_is_response(uint8_t code);
897 
906 {
907  return response->status;
908 }
909 
919 {
920  response->status = status;
921 }
922 
929 
939 {
940  unicoap_message_init_empty(response, (uint8_t)status);
941 }
942 
949 {
950  return unicoap_message_alloc_empty((uint8_t)status);
951 }
952 
963 static inline void unicoap_response_init(unicoap_message_t* response, unicoap_status_t status,
964  uint8_t* payload, size_t payload_size)
965 {
966  unicoap_message_init(response, (uint8_t)status, payload, payload_size);
967 }
968 
976 static inline unicoap_message_t unicoap_response_alloc(unicoap_status_t status, uint8_t* payload,
977  size_t payload_size)
978 {
979  return unicoap_message_alloc((uint8_t)status, payload, payload_size);
980 }
981 
991 static inline void unicoap_response_init_string(unicoap_message_t* response,
992  unicoap_status_t status, const char* payload)
993 {
994  unicoap_message_init_string(response, (uint8_t)status, payload);
995 }
996 
1004  const char* payload)
1005 {
1006  return unicoap_message_alloc_string((uint8_t)status, payload);
1007 }
1008 
1022  unicoap_status_t status,
1023  uint8_t* payload,
1024  size_t payload_size,
1025  unicoap_options_t* options)
1026 {
1027  unicoap_message_init_with_options(response, (uint8_t)status, payload, payload_size, options);
1028 }
1029 
1040  uint8_t* payload,
1041  size_t payload_size,
1042  unicoap_options_t* options)
1043 {
1044  return unicoap_message_alloc_with_options((uint8_t)status, payload, payload_size, options);
1045 }
1046 
1059  unicoap_status_t status,
1060  const char* payload,
1061  unicoap_options_t* options)
1062 {
1063  unicoap_message_init_string_with_options(response, (uint8_t)status, payload, options);
1064 }
1065 
1074 static inline
1076  const char* payload,
1077  unicoap_options_t* options)
1078 {
1079  return unicoap_message_alloc_string_with_options((uint8_t)status, payload, options);
1080 }
1084 /* MARK: - Parsing and Serialization ------------------------------------------------------- */
1089 /* MARK: - Parsing */
1109 typedef ssize_t (*unicoap_parser_t)(const uint8_t* pdu, size_t size, unicoap_message_t* message,
1110  unicoap_message_properties_t* properties);
1111 
1117 typedef struct {
1120 
1123 
1127 
1154 ssize_t unicoap_pdu_parse_options_and_payload(uint8_t* cursor, const uint8_t* end,
1155  unicoap_message_t* message);
1158 /* MARK: - Serializing */
1176 ssize_t unicoap_pdu_build_options_and_payload(uint8_t* cursor, size_t remaining_capacity,
1177  const unicoap_message_t* message);
1178 
1183 #define UNICOAP_PDU_IOLIST_COUNT (4)
1184 
1202 int unicoap_pdu_buildv_options_and_payload(uint8_t* header, size_t header_size,
1203  const unicoap_message_t* message,
1245 ssize_t unicoap_pdu_parse_rfc7252(uint8_t* pdu, size_t size, unicoap_message_t* message,
1246  unicoap_message_properties_t* properties);
1247 
1272 static inline ssize_t unicoap_pdu_parse_rfc7252_result(uint8_t* pdu, size_t size,
1273  unicoap_parser_result_t* parsed)
1274 {
1275  parsed->message.options = &parsed->options;
1276  return unicoap_pdu_parse_rfc7252(pdu, size, &parsed->message, &parsed->properties);
1277 }
1295 ssize_t unicoap_pdu_build_header_rfc7252(uint8_t* header, size_t capacity,
1296  const unicoap_message_t* message,
1297  const unicoap_message_properties_t* properties);
1298 
1311 static inline ssize_t unicoap_pdu_build_rfc7252(uint8_t* pdu, size_t capacity,
1312  const unicoap_message_t* message,
1313  const unicoap_message_properties_t* properties)
1314 {
1315  ssize_t res = 0;
1316 
1317  if ((res = unicoap_pdu_build_header_rfc7252(pdu, capacity, message, properties)) < 0) {
1318  return res;
1319  }
1320  return unicoap_pdu_build_options_and_payload(pdu + res, capacity - res, message) + res;
1321 }
1322 
1323 /* MARK: unicoap_driver_extension_point */
1324 
1341 static inline ssize_t unicoap_pdu_buildv_rfc7252(uint8_t* header, size_t header_capacity,
1342  const unicoap_message_t* message,
1343  const unicoap_message_properties_t* properties,
1345 {
1346  ssize_t res = 0;
1347 
1348  if ((res =
1349  unicoap_pdu_build_header_rfc7252(header, header_capacity, message, properties)) < 0) {
1350  return res;
1351  }
1352  return unicoap_pdu_buildv_options_and_payload(header, res, message, iolists);
1353 }
1354 
1357 /* MARK: unicoap_driver_extension_point */
1358 
1359 #ifdef __cplusplus
1360 }
1361 #endif
#define assert(cond)
abort the program if assertion is false
Definition: assert.h:135
Constants used in CoAP such as option numbers and message codes.
static bool unicoap_message_is_request(uint8_t code)
Determines if the the given message's code is a a request code.
Definition: message.h:690
const char * unicoap_string_from_rfc7252_type(unicoap_rfc7252_message_type_t type)
Returns a null-terminated label for the CoAP over UDP/DTLS message type.
const char * unicoap_string_from_code_class(uint8_t code)
Returns label for given CoAP message code class.
static void unicoap_request_set_method(unicoap_message_t *request, unicoap_method_t method)
Sets request method.
Definition: message.h:715
static void unicoap_message_payload_set(unicoap_message_t *message, uint8_t *payload, size_t size)
Assigns the given message a contiguous payload.
Definition: message.h:195
static unicoap_message_t unicoap_request_alloc_with_options(unicoap_method_t method, uint8_t *payload, size_t payload_size, unicoap_options_t *options)
Creates request with byte payload and options.
Definition: message.h:838
static iolist_t * unicoap_message_payload_get_chunks(unicoap_message_t *message)
Retrieves noncontiguous message payload, if available.
Definition: message.h:212
static unicoap_message_t unicoap_response_alloc(unicoap_status_t status, uint8_t *payload, size_t payload_size)
Creates response with no payload and no options.
Definition: message.h:976
static void unicoap_message_init_with_options(unicoap_message_t *message, uint8_t code, uint8_t *payload, size_t payload_size, unicoap_options_t *options)
Initializes message with byte payload and options.
Definition: message.h:555
static unicoap_message_t unicoap_request_alloc(unicoap_method_t method, uint8_t *payload, size_t payload_size)
Creates request with no payload and no options.
Definition: message.h:776
const char * unicoap_string_from_status(unicoap_status_t status)
Generates short descriptive label from CoAP status code.
static void unicoap_request_init_with_options(unicoap_message_t *request, unicoap_method_t method, uint8_t *payload, size_t payload_size, unicoap_options_t *options)
Initializes request with byte payload and options.
Definition: message.h:821
static unicoap_message_t unicoap_message_alloc_string_with_options(uint8_t code, const char *payload, unicoap_options_t *options)
Creates message with payload from null-terminated UTF-8 string and options.
Definition: message.h:612
static void unicoap_request_init_string(unicoap_message_t *request, unicoap_method_t method, const char *payload)
Initializes request with payload from null-terminated UTF-8 string but no options.
Definition: message.h:791
static uint8_t * unicoap_message_options_data(const unicoap_message_t *message)
Retrieves options storage buffer.
Definition: message.h:353
static unicoap_message_t unicoap_request_alloc_string_with_options(unicoap_method_t method, const char *payload, unicoap_options_t *options)
Creates request with payload from null-terminated UTF-8 string and options.
Definition: message.h:874
static uint8_t * unicoap_message_payload_get(unicoap_message_t *message)
Retrieves contiguous message payload, if available.
Definition: message.h:181
static unicoap_message_t unicoap_response_alloc_empty(unicoap_status_t status)
Creates response with no payload and no options.
Definition: message.h:948
static unicoap_message_t unicoap_message_alloc(uint8_t code, uint8_t *payload, size_t payload_size)
Creates message with no payload and no options.
Definition: message.h:506
static void unicoap_message_set_signal(unicoap_message_t *message, unicoap_signal_t signal)
Sets signal code of given signal message.
Definition: message.h:661
static unicoap_message_t unicoap_response_alloc_string_with_options(unicoap_status_t status, const char *payload, unicoap_options_t *options)
Creates response with payload from null-terminated UTF-8 string and options.
Definition: message.h:1075
static void unicoap_response_init_empty(unicoap_message_t *response, unicoap_status_t status)
Initializes response with no payload and no options.
Definition: message.h:938
static void unicoap_message_init_string_with_options(unicoap_message_t *message, uint8_t code, const char *payload, unicoap_options_t *options)
Initializes message with payload from null-terminated UTF-8 string and options.
Definition: message.h:595
ssize_t unicoap_message_payload_make_contiguous(unicoap_message_t *message, uint8_t *buffer, size_t capacity)
Copies noncontiguous payload into contiguous storage buffer.
static void unicoap_response_init_string(unicoap_message_t *response, unicoap_status_t status, const char *payload)
Initializes response with payload from null-terminated UTF-8 string but no options.
Definition: message.h:991
static unicoap_message_t unicoap_message_alloc_empty(uint8_t code)
Creates message with no payload and no options.
Definition: message.h:476
static uint8_t unicoap_code_detail(uint8_t code)
Reads the code detail number encoded in the given code.
Definition: message.h:416
#define UNICOAP_RFC7252_MESSAGE_TYPE_FIXED_WIDTH
Number of bits needed to represent unicoap_rfc7252_message_type_t.
Definition: constants.h:78
static unicoap_message_t unicoap_message_alloc_string(uint8_t code, const char *payload)
Creates message with payload from null-terminated but no options.
Definition: message.h:536
ssize_t unicoap_message_payload_copy(const unicoap_message_t *message, uint8_t *buffer, size_t capacity)
Copies payload into given buffer.
int unicoap_print_code(uint8_t code, char *string)
Prints a c.dd class-detail string into the given buffer.
static uint8_t unicoap_code_class(uint8_t code)
Reads the code class number encoded in the given code.
Definition: message.h:393
static void unicoap_request_init_string_with_options(unicoap_message_t *request, unicoap_method_t method, const char *payload, unicoap_options_t *options)
Initializes request with payload from null-terminated UTF-8 string and options.
Definition: message.h:857
static void unicoap_request_init(unicoap_message_t *request, unicoap_method_t method, uint8_t *payload, size_t payload_size)
Initializes request with payload but no options.
Definition: message.h:763
const char * unicoap_string_from_signal(unicoap_signal_t signal)
Returns label for given CoAP signal code.
static void unicoap_response_init_with_options(unicoap_message_t *response, unicoap_status_t status, uint8_t *payload, size_t payload_size, unicoap_options_t *options)
Initializes response with byte payload and options.
Definition: message.h:1021
const char * unicoap_string_from_method(unicoap_method_t method)
Obtains label for given request method.
static unicoap_status_t unicoap_response_get_status(const unicoap_message_t *response)
Obtains response status from the given message's code.
Definition: message.h:905
static size_t unicoap_message_payload_get_size(const unicoap_message_t *message)
Retrieves payload size, regardless of payload representation.
Definition: message.h:251
static void unicoap_response_init_string_with_options(unicoap_message_t *response, unicoap_status_t status, const char *payload, unicoap_options_t *options)
Initializes response with payload from null-terminated UTF-8 string and options.
Definition: message.h:1058
const char * unicoap_string_from_code(uint8_t code)
Returns label for given CoAP message code.
static unicoap_message_t unicoap_response_alloc_with_options(unicoap_status_t status, uint8_t *payload, size_t payload_size, unicoap_options_t *options)
Creates response with string byte and options.
Definition: message.h:1039
static void unicoap_response_init(unicoap_message_t *response, unicoap_status_t status, uint8_t *payload, size_t payload_size)
Initializes response with payload but no options.
Definition: message.h:963
static bool unicoap_message_is_signal(uint8_t code)
Determines if the given message's code is a a signaling code.
Definition: message.h:637
unicoap_payload_representation_t
A type indicating how a message's payload is represented.
Definition: message.h:45
static void unicoap_request_init_empty(unicoap_message_t *request, unicoap_method_t method)
Initializes request with no payload and no options.
Definition: message.h:738
bool unicoap_message_payload_is_empty(const unicoap_message_t *message)
Determines whether message has any payload.
static unicoap_message_t unicoap_message_alloc_with_options(uint8_t code, uint8_t *payload, size_t payload_size, unicoap_options_t *options)
Creates message with byte payload and options.
Definition: message.h:574
static unicoap_method_t unicoap_request_get_method(const unicoap_message_t *request)
Obtains request method from the given message's code.
Definition: message.h:702
unicoap_status_t
CoAP response status codes.
Definition: constants.h:215
static unicoap_message_t unicoap_request_alloc_empty(unicoap_method_t method)
Creates request with no payload and no options.
Definition: message.h:748
static void unicoap_message_init_empty(unicoap_message_t *message, uint8_t code)
Initializes message with no payload and no options.
Definition: message.h:463
static unicoap_message_t unicoap_response_alloc_string(unicoap_status_t status, const char *payload)
Creates response with payload from null-terminated UTF-8 string but no options.
Definition: message.h:1003
unicoap_signal_t
CoAP Signal Message Codes (7.xx range)
Definition: constants.h:177
static unicoap_message_t unicoap_request_alloc_string(unicoap_method_t method, const char *payload)
Creates request with payload from null-terminated UTF-8 string but no options.
Definition: message.h:803
static void unicoap_message_payload_set_chunks(unicoap_message_t *message, iolist_t *chunks)
Assigns the given message a noncontiguous payload.
Definition: message.h:225
unicoap_rfc7252_message_type_t
RFC 7252 message type.
Definition: constants.h:83
bool unicoap_message_is_response(uint8_t code)
Determines if the the given message's code is a a response code.
static void unicoap_response_set_status(unicoap_message_t *response, unicoap_status_t status)
Sets response status.
Definition: message.h:918
static unicoap_signal_t unicoap_message_get_signal(const unicoap_message_t *message)
Retrieves signal code from given signal message.
Definition: message.h:649
#define UNICOAP_TOKEN_LENGTH_FIXED_WIDTH
Numbers of bits needed to represent token length.
Definition: constants.h:67
static void unicoap_message_init_string(unicoap_message_t *message, uint8_t code, const char *payload)
Initializes message with payload from null-terminated UTF-8 string but no options.
Definition: message.h:521
unicoap_method_t
CoAP request method codes (0.xx range)
Definition: constants.h:141
static void unicoap_message_init(unicoap_message_t *message, uint8_t code, uint8_t *payload, size_t payload_size)
Initializes message with payload but no options.
Definition: message.h:490
static size_t unicoap_message_options_size(const unicoap_message_t *message)
Retrieves total size of options in buffer.
Definition: message.h:364
void unicoap_message_payload_append_chunk(unicoap_message_t *message, iolist_t *chunk)
Appends a payload chunk to a message.
@ UNICOAP_CODE_CLASS_SIGNAL
Signaling message.
Definition: constants.h:135
@ UNICOAP_CODE_CLASS_REQUEST
Message class for requests.
Definition: constants.h:123
@ UNICOAP_PAYLOAD_NONCONTIGUOUS
iolist_t payload vector
Definition: message.h:54
@ UNICOAP_PAYLOAD_CONTIGUOUS
Contiguous payload buffer.
Definition: message.h:49
ssize_t unicoap_pdu_build_options_and_payload(uint8_t *cursor, size_t remaining_capacity, const unicoap_message_t *message)
Populates the given buffer with options and payload.
ssize_t unicoap_pdu_parse_rfc7252(uint8_t *pdu, size_t size, unicoap_message_t *message, unicoap_message_properties_t *properties)
Parses RFC 7252 PDU.
ssize_t unicoap_pdu_parse_options_and_payload(uint8_t *cursor, const uint8_t *end, unicoap_message_t *message)
Parses PDU starting at options.
static ssize_t unicoap_pdu_build_rfc7252(uint8_t *pdu, size_t capacity, const unicoap_message_t *message, const unicoap_message_properties_t *properties)
Writes RFC 7252 PDU into buffer.
Definition: message.h:1311
static ssize_t unicoap_pdu_buildv_rfc7252(uint8_t *header, size_t header_capacity, const unicoap_message_t *message, const unicoap_message_properties_t *properties, iolist_t iolists[UNICOAP_PDU_IOLIST_COUNT])
Populates the given iolist with header according to RFC 7252, options, and payload.
Definition: message.h:1341
#define UNICOAP_PDU_IOLIST_COUNT
Number of iolists in the iolist buffer that must be passed to unicoap_pdu_buildv_options_and_payload.
Definition: message.h:1183
ssize_t unicoap_pdu_build_header_rfc7252(uint8_t *header, size_t capacity, const unicoap_message_t *message, const unicoap_message_properties_t *properties)
Writes RFC 7252 PDU header in the given buffer.
static ssize_t unicoap_pdu_parse_rfc7252_result(uint8_t *pdu, size_t size, unicoap_parser_result_t *parsed)
Helper method for manually parsing a PDU.
Definition: message.h:1272
ssize_t(* unicoap_parser_t)(const uint8_t *pdu, size_t size, unicoap_message_t *message, unicoap_message_properties_t *properties)
Common PDU parser.
Definition: message.h:1109
int unicoap_pdu_buildv_options_and_payload(uint8_t *header, size_t header_size, const unicoap_message_t *message, iolist_t iolists[UNICOAP_PDU_IOLIST_COUNT])
Populates the given iolist with header, options, payload separator and payload.
size_t iolist_size(const iolist_t *iolist)
Sum up number of bytes in iolist.
iolist scatter / gather IO
Options header.
iolist structure definition
Definition: iolist.h:38
Properties of a CoAP message.
Definition: message.h:300
bool is_registration
Determines if the corresponding message is considered an Observe registration.
Definition: message.h:312
uint16_t id
RFC 7252 message ID.
Definition: message.h:327
uint8_t * token
CoAP token used to correlate requests to responses.
Definition: message.h:302
uint8_t token_length
Length of unicoap_message_properties_t::token.
Definition: message.h:305
bool is_notification
Determines if the corresponding message is considered an Observe notification.
Definition: message.h:319
unicoap_rfc7252_message_type_t type
RFC 7252 message type.
Definition: message.h:324
Generic CoAP message.
Definition: message.h:75
unicoap_payload_representation_t payload_representation
A value indicating how the payload is represented.
Definition: message.h:169
unicoap_method_t method
CoAP request method.
Definition: message.h:144
size_t payload_size
Size of message payload.
Definition: message.h:106
unicoap_status_t status
CoAP response status.
Definition: message.h:152
uint8_t * payload
Message payload.
Definition: message.h:98
uint8_t code
CoAP message code.
Definition: message.h:131
unicoap_signal_t signal
CoAP signal.
Definition: message.h:160
unicoap_options_t * options
Message options.
Definition: message.h:83
iolist_t * payload_chunks
Noncontiguous payload.
Definition: message.h:117
uint8_t * data
Pointer into options storage where this option starts.
Definition: options.h:79
CoAP options container.
Definition: options.h:100
size_t storage_size
Current size of encoded options.
Definition: options.h:106
unicoap_option_entry_t entries[CONFIG_UNICOAP_OPTIONS_MAX]
Helper array used to encode and decode options into options storage.
Definition: options.h:121
Helper structure for parsing PDUs manually.
Definition: message.h:1117
unicoap_message_properties_t properties
Parsed message properties.
Definition: message.h:1125
unicoap_options_t options
Parsed options.
Definition: message.h:1122
unicoap_message_t message
Message.
Definition: message.h:1119