13 #if defined(HAVE_STRNLEN) && defined(__GNUC__) && !defined(_GNU_SOURCE)
22 #ifdef HAVE_ARPA_INET_H
23 #include <arpa/inet.h>
25 #ifdef HAVE_WS2TCPIP_H
34 # define fprintf(fd, ...) LWIP_PLATFORM_DIAG((__VA_ARGS__))
40 # define DEBUG DEBUG_PRINT
42 #include "net/ip/uip-debug.h"
54 return PACKAGE_STRING;
74 "EMRG",
"ALRT",
"CRIT",
"ERR ",
"WARN",
"NOTE",
"INFO",
"DEBG",
"????",
"CIPH"
84 tmp = localtime(&now);
85 lensofar = strftime(s, len,
"%b %d %H:%M:%S", tmp);
86 if (len > lensofar + 4) {
87 lensofar += snprintf(&s[lensofar], len-lensofar,
".%03u",
98 return snprintf(s, len,
"%u.%03u",
121 while(*s++ &&
n < maxlen)
129 unsigned char *result,
size_t buflen,
int encode_always ) {
130 const uint8_t hex[] =
"0123456789ABCDEF";
132 assert(data || len == 0);
139 if (!encode_always && isprint(*data)) {
140 if (cnt+1 < buflen) {
147 if (cnt+4 < buflen) {
150 *result++ = hex[(*data & 0xf0) >> 4];
151 *result++ = hex[*data & 0x0f];
165 #define min(a,b) ((a) < (b) ? (a) : (b))
174 #if defined( HAVE_ARPA_INET_H ) || defined( HAVE_WS2TCPIP_H )
175 const void *addrptr = NULL;
177 unsigned char *p = buf;
184 switch (addr->
addr.
sa.sa_family) {
186 if (len < INET_ADDRSTRLEN + 1)
188 addrptr = &addr->
addr.
sin.sin_addr;
189 port = ntohs(addr->
addr.
sin.sin_port);
190 need_buf = INET_ADDRSTRLEN;
198 addrptr = &addr->
addr.
sin6.sin6_addr;
199 port = ntohs(addr->
addr.
sin6.sin6_port);
205 memcpy(buf,
"(unknown address type)",
min(22+1, len));
211 if (inet_ntop(addr->
addr.
sa.sa_family, addrptr, (
char *)p,
212 min(len, need_buf)) == 0) {
213 perror(
"coap_print_addr");
218 p += strlen((
char *)p);
220 if (addr->
addr.
sa.sa_family == AF_INET6) {
221 if (p + 1 < buf + len) {
228 snprintf((
char *)p, buf + len - p,
":%d", port);
230 return strlen((
char *)buf);
233 unsigned char *p = buf;
235 # if NETSTACK_CONF_WITH_IPV6
236 const uint8_t hex[] =
"0123456789ABCDEF";
246 for (i=0; i < 16; i += 2) {
250 *p++ = hex[(addr->
addr.u8[i] & 0xf0) >> 4];
251 *p++ = hex[(addr->
addr.u8[i] & 0x0f)];
252 *p++ = hex[(addr->
addr.u8[i+1] & 0xf0) >> 4];
253 *p++ = hex[(addr->
addr.u8[i+1] & 0x0f)];
257 # warning "IPv4 network addresses will not be included in debug output"
264 if (buf + len - p < 6) {
271 snprintf((
char *)p, buf + len - p,
":%d", uip_htons(addr->port));
277 return strlen((
char *)p);
280 # warning "inet_ntop() not available, network addresses will not be included in debug output"
288 # define fprintf(fd, ...) { (void)fd; PRINTF(__VA_ARGS__); }
292 # define vfprintf(fd, ...) { (void)fd; vprintf(__VA_ARGS__); }
294 # define vfprintf(fd, ...) { (void)fd; PRINTF(__VA_ARGS__); }
301 static const char *types[] = {
"CON",
"NON",
"ACK",
"RST",
"???" };
303 return types[
min(t,
sizeof(types)/
sizeof(
char *) - 1)];
309 static const char *methods[] = {
"0.00",
"GET",
"POST",
"PUT",
"DELETE",
310 "FETCH",
"PATCH",
"iPATCH" };
311 static const char *signals[] = {
"7.00",
"CSM",
"Ping",
"Pong",
"Release",
315 if (c <
sizeof(methods)/
sizeof(
const char *)) {
317 }
else if (c >= 224 && c - 224 < (
int)(
sizeof(signals)/
sizeof(
const char *))) {
318 return signals[c-224];
320 snprintf(buf,
sizeof(buf),
"%u.%02u", (c >> 5) & 0x7, c & 0x1f);
328 struct option_desc_t {
333 static struct option_desc_t options[] = {
357 static struct option_desc_t options_csm[] = {
362 static struct option_desc_t options_pingpong[] = {
366 static struct option_desc_t options_release[] = {
371 static struct option_desc_t options_abort[] = {
379 for (i = 0; i <
sizeof(options_csm)/
sizeof(
struct option_desc_t); i++) {
380 if (option_type == options_csm[i].type) {
381 return options_csm[i].name;
385 for (i = 0; i <
sizeof(options_pingpong)/
sizeof(
struct option_desc_t); i++) {
386 if (option_type == options_pingpong[i].type) {
387 return options_pingpong[i].name;
391 for (i = 0; i <
sizeof(options_release)/
sizeof(
struct option_desc_t); i++) {
392 if (option_type == options_release[i].type) {
393 return options_release[i].name;
397 for (i = 0; i <
sizeof(options_abort)/
sizeof(
struct option_desc_t); i++) {
398 if (option_type == options_abort[i].type) {
399 return options_abort[i].name;
404 for (i = 0; i <
sizeof(options)/
sizeof(
struct option_desc_t); i++) {
405 if (option_type == options[i].type) {
406 return options[i].name;
411 snprintf(buf,
sizeof(buf),
"%u", option_type);
417 unsigned char *result,
unsigned int buflen) {
423 static struct desc_t formats[] = {
450 { 75,
"application/dcaf+cbor" }
456 for (i = 0; i <
sizeof(formats)/
sizeof(
struct desc_t); i++) {
457 if (format_type == formats[i].type) {
458 return snprintf((
char *)result, buflen,
"%s", formats[i].name);
463 return snprintf((
char *)result, buflen,
"%d", format_type);
473 return !(content_format == -1 ||
480 #define COAP_DO_SHOW_OUTPUT_LINE \
482 if (use_fprintf_for_show_pdu) { \
483 fprintf(COAP_DEBUG_FD, "%s", outbuf); \
486 coap_log(level, "%s", outbuf); \
502 #if COAP_DEBUG_BUF_SIZE < 5
503 #error "COAP_DEBUG_BUF_SIZE must be at least 5, should be >= 32 to be useful"
508 #if COAP_CONSTRAINED_STACK
509 static coap_mutex_t static_show_pdu_mutex = COAP_MUTEX_INITIALIZER;
519 int encode = 0, have_options = 0, i;
522 int content_format = -1;
526 const uint8_t* opt_val;
527 size_t outbuflen = 0;
533 #if COAP_CONSTRAINED_STACK
534 coap_mutex_lock(&static_show_pdu_mutex);
537 snprintf(outbuf,
sizeof(outbuf),
"v:%d t:%s c:%s i:%04x {",
542 outbuflen = strlen(outbuf);
543 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
544 "%02x", pdu->
token[i]);
546 outbuflen = strlen(outbuf);
547 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
"}");
552 outbuflen = strlen(outbuf);
553 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
" [");
559 outbuflen = strlen(outbuf);
560 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
",");
565 buf_len = snprintf((
char *)buf,
sizeof(buf),
"%u",
579 buf,
sizeof(buf), 0);
582 buf_len = snprintf((
char *)buf,
sizeof(buf),
"%u",
591 buf_len = snprintf((
char *)buf,
sizeof(buf),
"%u",
598 }
else switch (opt_iter.
number) {
611 buf_len = snprintf((
char *)buf,
sizeof(buf),
"%u/%c/%u",
625 buf_len = snprintf((
char *)buf,
sizeof(buf),
"%u",
634 snprintf((
char *)buf,
sizeof(buf),
"0x");
635 for (i = 0; (uint32_t)i < opt_len; i++) {
636 buf_len = strlen((
char *)buf);
637 snprintf((
char *)&buf[buf_len],
sizeof(buf)-buf_len,
640 buf_len = strlen((
char *)buf);
658 buf,
sizeof(buf), encode);
661 outbuflen = strlen(outbuf);
662 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
667 outbuflen = strlen(outbuf);
668 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
" ]");
672 outbuflen = strlen(outbuf);
673 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
" :: ");
675 if (
is_binary(content_format) || !isprint(data[0])) {
676 size_t keep_data_len = data_len;
677 const uint8_t *keep_data = data;
679 outbuflen = strlen(outbuf);
680 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
681 "binary data length %zu\n", data_len);
687 snprintf(outbuf,
sizeof(outbuf),
"<<");
689 outbuflen = strlen(outbuf);
690 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
693 outbuflen = strlen(outbuf);
694 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
">>");
695 data_len = keep_data_len;
697 outbuflen = strlen(outbuf);
698 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
"\n");
705 snprintf(outbuf,
sizeof(outbuf),
"<<");
707 outbuflen = strlen(outbuf);
708 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
709 "%c ", isprint (*data) ? *data :
'.');
712 outbuflen = strlen(outbuf);
713 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
">>");
716 outbuflen = strlen(outbuf);
717 max_length =
sizeof(outbuf)-outbuflen;
718 if (max_length > 1) {
719 outbuf[outbuflen++] =
'\'';
720 outbuf[outbuflen] =
'\000';
723 if (max_length > 1) {
725 (
unsigned char*)&outbuf[outbuflen],
729 if (outbuflen <
sizeof(outbuf)-4-1) {
730 outbuf[outbuflen++] =
'\'';
731 outbuf[outbuflen] =
'\000';
736 outbuflen = strlen(outbuf);
737 if (outbuflen ==
sizeof(outbuf)-1) outbuflen--;
738 snprintf(&outbuf[outbuflen],
sizeof(outbuf)-outbuflen,
"\n");
741 #if COAP_CONSTRAINED_STACK
742 coap_mutex_unlock(&static_show_pdu_mutex);
761 switch (tls_version->
type) {
763 snprintf(buffer, bufsize,
"TLS Library: None");
766 snprintf(buffer, bufsize,
"TLS Library: TinyDTLS - runtime %lu.%lu.%lu, "
767 "libcoap built for %lu.%lu.%lu",
768 (
unsigned long)(tls_version->
version >> 16),
769 (
unsigned long)((tls_version->
version >> 8) & 0xff),
770 (
unsigned long)(tls_version->
version & 0xff),
776 switch (tls_version->
version &0xf) {
778 strcpy(beta,
"-dev");
784 strcpy(beta,
"-beta");
785 beta[5] = (tls_version->
version &0xf) +
'0';
789 sub[0] = ((tls_version->
version >> 4) & 0xff) ?
790 ((tls_version->
version >> 4) & 0xff) +
'a' -1 :
'\000';
794 strcpy(b_beta,
"-dev");
800 strcpy(b_beta,
"-beta");
806 ((tls_version->
built_version >> 4) & 0xff) +
'a' -1 :
'\000';
808 snprintf(buffer, bufsize,
"TLS Library: OpenSSL - runtime "
809 "%lu.%lu.%lu%s%s, libcoap built for %lu.%lu.%lu%s%s",
810 (
unsigned long)(tls_version->
version >> 28),
811 (
unsigned long)((tls_version->
version >> 20) & 0xff),
812 (
unsigned long)((tls_version->
version >> 12) & 0xff), sub, beta,
819 snprintf(buffer, bufsize,
"TLS Library: GnuTLS - runtime %lu.%lu.%lu, "
820 "libcoap built for %lu.%lu.%lu",
821 (
unsigned long)(tls_version->
version >> 16),
822 (
unsigned long)((tls_version->
version >> 8) & 0xff),
823 (
unsigned long)(tls_version->
version & 0xff),
829 snprintf(buffer, bufsize,
"TLS Library: Mbed TLS - runtime %lu.%lu.%lu, "
830 "libcoap built for %lu.%lu.%lu",
831 (
unsigned long)(tls_version->
version >> 24),
832 (
unsigned long)((tls_version->
version >> 16) & 0xff),
833 (
unsigned long)((tls_version->
version >> 8) & 0xff),
839 snprintf(buffer, bufsize,
"Library type %d unknown", tls_version->
type);
849 switch (tls_version->
type) {
851 snprintf(buffer, bufsize,
"(No DTLS or TLS support)");
854 snprintf(buffer, bufsize,
855 "(DTLS and no TLS support; PSK and RPK support)");
858 snprintf(buffer, bufsize,
859 "(DTLS and TLS support; PSK, PKI, PKCS11 and no RPK support)");
862 if (tls_version->
version >= 0x030606)
863 snprintf(buffer, bufsize,
864 "(DTLS and TLS support; PSK, PKI, PKCS11 and RPK support)");
866 snprintf(buffer, bufsize,
867 "(DTLS and TLS support; PSK, PKI, PKCS11 and no RPK support)");
870 snprintf(buffer, bufsize,
871 "(DTLS and no TLS support; PSK, PKI and no RPK support)");
893 #if COAP_CONSTRAINED_STACK
894 static coap_mutex_t static_log_mutex = COAP_MUTEX_INITIALIZER;
900 va_start(ap, format);
901 #if COAP_CONSTRAINED_STACK
902 coap_mutex_lock(&static_log_mutex);
905 vsnprintf( message,
sizeof(message), format, ap);
908 #if COAP_CONSTRAINED_STACK
909 coap_mutex_unlock(&static_log_mutex);
923 fprintf(log_fd,
"%.*s ", (
int)len, timebuf);
926 fprintf(log_fd,
"%s ",
loglevels[level]);
928 va_start(ap, format);
929 vfprintf(log_fd, format, ap);
944 const char *p = loss_level;
946 int n = (int)strtol(p, &end, 10), i = 0;
947 if (end == p ||
n < 0)
961 n = (int)strtol(p, &end, 10);
962 if (end == p ||
n <= 0)
971 n = (int)strtol(p, &end, 10);
972 if (end == p ||
n <= 0)
static int packet_loss_level
static struct packet_num_interval packet_loss_intervals[10]
static int send_packet_count
int coap_debug_set_packet_loss(const char *loss_level)
Set the packet loss level for testing.
static coap_log_handler_t log_handler
COAP_STATIC_INLINE int is_binary(int content_format)
Returns 1 if the given content_format is either unknown or known to carry binary data.
#define COAP_DO_SHOW_OUTPUT_LINE
static size_t print_readable(const uint8_t *data, size_t len, unsigned char *result, size_t buflen, int encode_always)
static size_t strnlen(const char *s, size_t maxlen)
A length-safe strlen() fake.
static const char * loglevels[]
COAP_STATIC_INLINE size_t print_timestamp(char *s, size_t len, coap_tick_t t)
static const char * msg_type_string(uint16_t t)
Returns a textual description of the message type t.
static const char * msg_option_string(uint8_t code, uint16_t option_type)
Returns a textual description of the option name.
static int use_fprintf_for_show_pdu
static const char * msg_code_string(uint16_t c)
Returns a textual description of the method or response code.
static int num_packet_loss_intervals
int coap_debug_send_packet(void)
Check to see whether a packet should be sent or not.
static unsigned int print_content_format(unsigned int format_type, unsigned char *result, unsigned int buflen)
Pulls together all the internal only header files.
#define COAP_OPT_BLOCK_SZX(opt)
Returns the value of the SZX-field of a Block option opt.
#define COAP_OPT_BLOCK_MORE(opt)
Returns the value of the More-bit of a Block option opt.
unsigned int coap_opt_block_num(const coap_opt_t *block_opt)
Returns the value of field num in the given block option block_opt.
void coap_ticks(coap_tick_t *t)
Sets t to the internal time with COAP_TICKS_PER_SECOND resolution.
uint64_t coap_tick_t
This data type represents internal timer ticks with COAP_TICKS_PER_SECOND resolution.
coap_time_t coap_ticks_to_rt(coap_tick_t t)
Helper function that converts coap ticks to wallclock time.
uint64_t coap_ticks_to_rt_us(coap_tick_t t)
Helper function that converts coap ticks to POSIX wallclock time in us.
int coap_prng(void *buf, size_t len)
Fills buf with len random bytes using the default pseudo random number generator.
coap_tls_version_t * coap_get_tls_library_version(void)
Determine the type and version of the underlying (D)TLS library.
@ COAP_TLS_LIBRARY_GNUTLS
Using GnuTLS library.
@ COAP_TLS_LIBRARY_TINYDTLS
Using TinyDTLS library.
@ COAP_TLS_LIBRARY_NOTLS
No DTLS library.
@ COAP_TLS_LIBRARY_OPENSSL
Using OpenSSL library.
@ COAP_TLS_LIBRARY_MBEDTLS
Using Mbed TLS library.
unsigned int coap_decode_var_bytes(const uint8_t *buf, size_t len)
Decodes multiple-length byte sequences.
void coap_set_log_handler(coap_log_handler_t handler)
Add a custom log callback handler.
const char * coap_package_name(void)
Get the library package name.
coap_log_t coap_get_log_level(void)
Get the current logging level.
char * coap_string_tls_version(char *buffer, size_t bufsize)
Build a string containing the current (D)TLS library linked with and built for version.
void coap_show_pdu(coap_log_t level, const coap_pdu_t *pdu)
Display the contents of the specified pdu.
#define COAP_ERR_FD
Used for output for LOG_CRIT to LOG_EMERG.
coap_log_t
Pre-defined log levels akin to what is used in syslog with LOG_CIPHERS added.
void coap_set_log_level(coap_log_t level)
Sets the log level to the specified value.
void coap_log_impl(coap_log_t level, const char *format,...)
Writes the given text to COAP_ERR_FD (for level <= LOG_CRIT) or COAP_DEBUG_FD (for level >= LOG_ERR).
size_t coap_print_addr(const coap_address_t *addr, unsigned char *buf, size_t len)
Print the address into the defined buffer.
#define COAP_DEBUG_FD
Used for output for LOG_DEBUG to LOG_ERR.
void coap_show_tls_version(coap_log_t level)
Display the current (D)TLS library linked with and built for version.
void coap_set_show_pdu_output(int use_fprintf)
Defines the output mode for the coap_show_pdu() function.
const char * coap_package_version(void)
Get the library package version.
char * coap_string_tls_support(char *buffer, size_t bufsize)
Build a string containing the current (D)TLS library support.
void(* coap_log_handler_t)(coap_log_t level, const char *message)
Logging callback handler definition.
#define coap_log(level,...)
Logging function.
@ COAP_LOG_CIPHERS
CipherInfo.
coap_opt_t * coap_option_next(coap_opt_iterator_t *oi)
Updates the iterator oi to point to the next option.
uint32_t coap_opt_length(const coap_opt_t *opt)
Returns the length of the given option.
#define COAP_OPT_ALL
Pre-defined filter that includes all options.
const uint8_t * coap_opt_value(const coap_opt_t *opt)
Returns a pointer to the value of the given option.
coap_opt_iterator_t * coap_option_iterator_init(const coap_pdu_t *pdu, coap_opt_iterator_t *oi, const coap_opt_filter_t *filter)
Initializes the given option iterator oi to point to the beginning of the pdu's option list.
#define COAP_DEBUG_BUF_SIZE
#define COAP_DEFAULT_VERSION
#define COAP_OPTION_HOP_LIMIT
#define COAP_OPTION_NORESPONSE
#define COAP_OPTION_URI_HOST
#define COAP_OPTION_IF_MATCH
#define COAP_MEDIATYPE_APPLICATION_COSE_MAC
#define COAP_MEDIATYPE_APPLICATION_SENSML_EXI
#define COAP_MEDIATYPE_APPLICATION_CWT
#define COAP_OPTION_BLOCK2
#define COAP_MEDIATYPE_APPLICATION_COSE_ENCRYPT
#define COAP_MEDIATYPE_APPLICATION_RDF_XML
#define COAP_OPTION_CONTENT_FORMAT
#define COAP_SIGNALING_OPTION_ALTERNATIVE_ADDRESS
#define COAP_OPTION_SIZE2
#define COAP_MEDIATYPE_APPLICATION_SENSML_XML
#define COAP_MEDIATYPE_APPLICATION_COSE_SIGN
#define COAP_OPTION_BLOCK1
#define COAP_OPTION_PROXY_SCHEME
#define COAP_MEDIATYPE_APPLICATION_COSE_KEY_SET
#define COAP_MEDIATYPE_APPLICATION_SENML_CBOR
#define COAP_OPTION_URI_QUERY
#define COAP_MEDIATYPE_APPLICATION_COSE_KEY
#define COAP_MEDIATYPE_APPLICATION_COSE_SIGN1
#define COAP_OPTION_IF_NONE_MATCH
#define COAP_MEDIATYPE_APPLICATION_OCTET_STREAM
#define COAP_OPTION_LOCATION_PATH
#define COAP_OPTION_URI_PATH
#define COAP_MEDIATYPE_APPLICATION_SENML_EXI
#define COAP_MEDIATYPE_APPLICATION_CBOR
#define COAP_OPTION_SIZE1
#define COAP_MEDIATYPE_APPLICATION_COSE_ENCRYPT0
#define COAP_SIGNALING_OPTION_BLOCK_WISE_TRANSFER
#define COAP_MEDIATYPE_TEXT_PLAIN
#define COAP_MEDIATYPE_APPLICATION_JSON
#define COAP_OPTION_LOCATION_QUERY
#define COAP_MEDIATYPE_APPLICATION_COSE_MAC0
#define COAP_MEDIATYPE_APPLICATION_SENML_JSON
#define COAP_MEDIATYPE_APPLICATION_EXI
#define COAP_SIGNALING_OPTION_CUSTODY
int coap_get_data(const coap_pdu_t *pdu, size_t *len, const uint8_t **data)
Retrieves the length and data pointer of specified PDU.
#define COAP_OPTION_URI_PORT
#define COAP_MEDIATYPE_APPLICATION_SENML_XML
#define COAP_OPTION_ACCEPT
#define COAP_MEDIATYPE_APPLICATION_DOTS_CBOR
#define COAP_OPTION_MAXAGE
#define COAP_MEDIATYPE_APPLICATION_SENSML_JSON
#define COAP_OPTION_PROXY_URI
#define COAP_OPTION_OBSERVE
#define COAP_SIGNALING_OPTION_HOLD_OFF
#define COAP_MEDIATYPE_APPLICATION_LINK_FORMAT
#define COAP_SIGNALING_OPTION_BAD_CSM_OPTION
#define COAP_SIGNALING_OPTION_MAX_MESSAGE_SIZE
#define COAP_MEDIATYPE_APPLICATION_XML
#define COAP_MEDIATYPE_APPLICATION_SENSML_CBOR
@ COAP_SIGNALING_CODE_ABORT
@ COAP_SIGNALING_CODE_CSM
@ COAP_SIGNALING_CODE_PING
@ COAP_SIGNALING_CODE_PONG
@ COAP_SIGNALING_CODE_RELEASE
#define COAP_STATIC_INLINE
uint8_t coap_opt_t
Use byte-oriented access methods here because sliding a complex struct coap_opt_t over the data buffe...
multi-purpose address abstraction
union coap_address_t::@0 addr
Iterator to run through PDU options.
coap_option_num_t number
decoded option number
structure for CoAP PDUs token, if any, follows the fixed size header, then options until payload mark...
uint8_t * token
first byte of token, if any, or options
coap_pdu_code_t code
request method (value 1–31) or response code (value 64-255)
uint8_t token_length
length of Token
coap_mid_t mid
message id, if any, in regular host byte order
coap_pdu_type_t type
message type
The structure used for returning the underlying (D)TLS library information.
uint64_t built_version
(D)TLS Built against Library Version
coap_tls_library_t type
Library type.
uint64_t version
(D)TLS runtime Library Version