Version 0.5.0 of tinydtls

Dependents:   tinydtls_test_cellular tinydtls_test_ethernet tiny-dtls

Committer:
ashleymills
Date:
Wed Feb 12 09:30:16 2014 +0000
Revision:
1:598a56fe116e
Parent:
0:ff9ebe0cf0e9
Explicitly removed something instead of relying on MACRO to disable it. Mbed can't use it.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:ff9ebe0cf0e9 1 /* debug.c -- debug utilities
ashleymills 0:ff9ebe0cf0e9 2 *
ashleymills 0:ff9ebe0cf0e9 3 * Copyright (C) 2011--2012 Olaf Bergmann <bergmann@tzi.org>
ashleymills 0:ff9ebe0cf0e9 4 *
ashleymills 0:ff9ebe0cf0e9 5 * Permission is hereby granted, free of charge, to any person
ashleymills 0:ff9ebe0cf0e9 6 * obtaining a copy of this software and associated documentation
ashleymills 0:ff9ebe0cf0e9 7 * files (the "Software"), to deal in the Software without
ashleymills 0:ff9ebe0cf0e9 8 * restriction, including without limitation the rights to use, copy,
ashleymills 0:ff9ebe0cf0e9 9 * modify, merge, publish, distribute, sublicense, and/or sell copies
ashleymills 0:ff9ebe0cf0e9 10 * of the Software, and to permit persons to whom the Software is
ashleymills 0:ff9ebe0cf0e9 11 * furnished to do so, subject to the following conditions:
ashleymills 0:ff9ebe0cf0e9 12 *
ashleymills 0:ff9ebe0cf0e9 13 * The above copyright notice and this permission notice shall be
ashleymills 0:ff9ebe0cf0e9 14 * included in all copies or substantial portions of the Software.
ashleymills 0:ff9ebe0cf0e9 15 *
ashleymills 0:ff9ebe0cf0e9 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
ashleymills 0:ff9ebe0cf0e9 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
ashleymills 0:ff9ebe0cf0e9 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ashleymills 0:ff9ebe0cf0e9 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
ashleymills 0:ff9ebe0cf0e9 20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ashleymills 0:ff9ebe0cf0e9 21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
ashleymills 0:ff9ebe0cf0e9 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
ashleymills 0:ff9ebe0cf0e9 23 * SOFTWARE.
ashleymills 0:ff9ebe0cf0e9 24 */
ashleymills 0:ff9ebe0cf0e9 25
ashleymills 0:ff9ebe0cf0e9 26 #include "config.h"
ashleymills 0:ff9ebe0cf0e9 27
ashleymills 0:ff9ebe0cf0e9 28 #if defined(HAVE_ASSERT_H) && !defined(assert)
ashleymills 0:ff9ebe0cf0e9 29 #include <assert.h>
ashleymills 0:ff9ebe0cf0e9 30 #endif
ashleymills 0:ff9ebe0cf0e9 31
ashleymills 0:ff9ebe0cf0e9 32 #include <stdarg.h>
ashleymills 0:ff9ebe0cf0e9 33 #include <string.h>
ashleymills 0:ff9ebe0cf0e9 34 #include <stdio.h>
ashleymills 0:ff9ebe0cf0e9 35
ashleymills 0:ff9ebe0cf0e9 36 #ifdef HAVE_ARPA_INET_H
ashleymills 0:ff9ebe0cf0e9 37 #include <arpa/inet.h>
ashleymills 0:ff9ebe0cf0e9 38 #endif
ashleymills 0:ff9ebe0cf0e9 39
ashleymills 0:ff9ebe0cf0e9 40 #ifdef HAVE_TIME_H
ashleymills 0:ff9ebe0cf0e9 41 #include <time.h>
ashleymills 0:ff9ebe0cf0e9 42 #endif
ashleymills 0:ff9ebe0cf0e9 43
ashleymills 0:ff9ebe0cf0e9 44 #include "global.h"
ashleymills 0:ff9ebe0cf0e9 45 #include "debug.h"
ashleymills 0:ff9ebe0cf0e9 46
ashleymills 0:ff9ebe0cf0e9 47 #ifdef WITH_CONTIKI
ashleymills 0:ff9ebe0cf0e9 48 # ifndef DEBUG
ashleymills 0:ff9ebe0cf0e9 49 # define DEBUG DEBUG_PRINT
ashleymills 0:ff9ebe0cf0e9 50 # endif /* DEBUG */
ashleymills 0:ff9ebe0cf0e9 51 #include "net/uip-debug.h"
ashleymills 0:ff9ebe0cf0e9 52 #else
ashleymills 0:ff9ebe0cf0e9 53 #define PRINTF(...)
ashleymills 0:ff9ebe0cf0e9 54 #endif
ashleymills 0:ff9ebe0cf0e9 55
ashleymills 0:ff9ebe0cf0e9 56 static int maxlog = LOG_WARN; /* default maximum log level */
ashleymills 0:ff9ebe0cf0e9 57
ashleymills 0:ff9ebe0cf0e9 58 log_t
ashleymills 0:ff9ebe0cf0e9 59 dtls_get_log_level() {
ashleymills 0:ff9ebe0cf0e9 60 return maxlog;
ashleymills 0:ff9ebe0cf0e9 61 }
ashleymills 0:ff9ebe0cf0e9 62
ashleymills 0:ff9ebe0cf0e9 63 void
ashleymills 0:ff9ebe0cf0e9 64 dtls_set_log_level(log_t level) {
ashleymills 0:ff9ebe0cf0e9 65 maxlog = level;
ashleymills 0:ff9ebe0cf0e9 66 }
ashleymills 0:ff9ebe0cf0e9 67
ashleymills 0:ff9ebe0cf0e9 68 /* this array has the same order as the type log_t */
ashleymills 0:ff9ebe0cf0e9 69 static char *loglevels[] = {
ashleymills 0:ff9ebe0cf0e9 70 "EMRG", "ALRT", "CRIT", "WARN", "NOTE", "INFO", "DEBG"
ashleymills 0:ff9ebe0cf0e9 71 };
ashleymills 0:ff9ebe0cf0e9 72
ashleymills 0:ff9ebe0cf0e9 73 #ifdef HAVE_TIME_H
ashleymills 0:ff9ebe0cf0e9 74
ashleymills 0:ff9ebe0cf0e9 75 static inline size_t
ashleymills 0:ff9ebe0cf0e9 76 print_timestamp(char *s, size_t len, time_t t) {
ashleymills 0:ff9ebe0cf0e9 77 /*
ashleymills 0:ff9ebe0cf0e9 78 struct tm *tmp;
ashleymills 0:ff9ebe0cf0e9 79 tmp = localtime(&t);
ashleymills 0:ff9ebe0cf0e9 80 return strftime(s, len, "%b %d %H:%M:%S", tmp);
ashleymills 0:ff9ebe0cf0e9 81 */
ashleymills 0:ff9ebe0cf0e9 82 return 0;
ashleymills 0:ff9ebe0cf0e9 83 }
ashleymills 0:ff9ebe0cf0e9 84
ashleymills 0:ff9ebe0cf0e9 85 #else /* alternative implementation: just print the timestamp */
ashleymills 0:ff9ebe0cf0e9 86
ashleymills 0:ff9ebe0cf0e9 87 static inline size_t
ashleymills 0:ff9ebe0cf0e9 88 print_timestamp(char *s, size_t len, clock_time_t t) {
ashleymills 0:ff9ebe0cf0e9 89 #ifdef HAVE_SNPRINTF
ashleymills 0:ff9ebe0cf0e9 90 return snprintf(s, len, "%u.%03u",
ashleymills 0:ff9ebe0cf0e9 91 (unsigned int)(t / CLOCK_SECOND),
ashleymills 0:ff9ebe0cf0e9 92 (unsigned int)(t % CLOCK_SECOND));
ashleymills 0:ff9ebe0cf0e9 93 #else /* HAVE_SNPRINTF */
ashleymills 0:ff9ebe0cf0e9 94 /* @todo do manual conversion of timestamp */
ashleymills 0:ff9ebe0cf0e9 95 return 0;
ashleymills 0:ff9ebe0cf0e9 96 #endif /* HAVE_SNPRINTF */
ashleymills 0:ff9ebe0cf0e9 97 }
ashleymills 0:ff9ebe0cf0e9 98
ashleymills 0:ff9ebe0cf0e9 99 #endif /* HAVE_TIME_H */
ashleymills 0:ff9ebe0cf0e9 100
ashleymills 0:ff9ebe0cf0e9 101 #ifndef HAVE_STRNLEN
ashleymills 0:ff9ebe0cf0e9 102 /**
ashleymills 0:ff9ebe0cf0e9 103 * A length-safe strlen() fake.
ashleymills 0:ff9ebe0cf0e9 104 *
ashleymills 0:ff9ebe0cf0e9 105 * @param s The string to count characters != 0.
ashleymills 0:ff9ebe0cf0e9 106 * @param maxlen The maximum length of @p s.
ashleymills 0:ff9ebe0cf0e9 107 *
ashleymills 0:ff9ebe0cf0e9 108 * @return The length of @p s.
ashleymills 0:ff9ebe0cf0e9 109 */
ashleymills 0:ff9ebe0cf0e9 110 static inline size_t
ashleymills 0:ff9ebe0cf0e9 111 strnlen(const char *s, size_t maxlen) {
ashleymills 0:ff9ebe0cf0e9 112 size_t n = 0;
ashleymills 0:ff9ebe0cf0e9 113 while(*s++ && n < maxlen)
ashleymills 0:ff9ebe0cf0e9 114 ++n;
ashleymills 0:ff9ebe0cf0e9 115 return n;
ashleymills 0:ff9ebe0cf0e9 116 }
ashleymills 0:ff9ebe0cf0e9 117 #endif /* HAVE_STRNLEN */
ashleymills 0:ff9ebe0cf0e9 118
ashleymills 0:ff9ebe0cf0e9 119 #ifndef min
ashleymills 0:ff9ebe0cf0e9 120 #define min(a,b) ((a) < (b) ? (a) : (b))
ashleymills 0:ff9ebe0cf0e9 121 #endif
ashleymills 0:ff9ebe0cf0e9 122
ashleymills 0:ff9ebe0cf0e9 123 size_t
ashleymills 0:ff9ebe0cf0e9 124 dsrv_print_addr(const session_t *addr, unsigned char *buf, size_t len) {
ashleymills 0:ff9ebe0cf0e9 125 snprintf(buf,len,"%s:%d",inet_ntoa(addr->addr.sin.sin_addr),ntohs(addr->addr.sin.sin_port));
ashleymills 0:ff9ebe0cf0e9 126 }
ashleymills 0:ff9ebe0cf0e9 127
ashleymills 0:ff9ebe0cf0e9 128 static size_t
ashleymills 0:ff9ebe0cf0e9 129 dsrv_print_addr_unused(const session_t *addr, char *buf, size_t len) {
ashleymills 0:ff9ebe0cf0e9 130 #ifdef HAVE_ARPA_INET_H
ashleymills 0:ff9ebe0cf0e9 131 const void *addrptr = NULL;
ashleymills 0:ff9ebe0cf0e9 132 in_port_t port;
ashleymills 0:ff9ebe0cf0e9 133 char *p = buf;
ashleymills 0:ff9ebe0cf0e9 134
ashleymills 0:ff9ebe0cf0e9 135 switch (addr->addr.sa.sa_family) {
ashleymills 0:ff9ebe0cf0e9 136 case AF_INET:
ashleymills 0:ff9ebe0cf0e9 137 if (len < INET_ADDRSTRLEN)
ashleymills 0:ff9ebe0cf0e9 138 return 0;
ashleymills 0:ff9ebe0cf0e9 139
ashleymills 0:ff9ebe0cf0e9 140 addrptr = &addr->addr.sin.sin_addr;
ashleymills 0:ff9ebe0cf0e9 141 port = ntohs(addr->addr.sin.sin_port);
ashleymills 0:ff9ebe0cf0e9 142 break;
ashleymills 0:ff9ebe0cf0e9 143 case AF_INET6:
ashleymills 0:ff9ebe0cf0e9 144 if (len < INET6_ADDRSTRLEN + 2)
ashleymills 0:ff9ebe0cf0e9 145 return 0;
ashleymills 0:ff9ebe0cf0e9 146
ashleymills 0:ff9ebe0cf0e9 147 *p++ = '[';
ashleymills 0:ff9ebe0cf0e9 148
ashleymills 0:ff9ebe0cf0e9 149 addrptr = &addr->addr.sin6.sin6_addr;
ashleymills 0:ff9ebe0cf0e9 150 port = ntohs(addr->addr.sin6.sin6_port);
ashleymills 0:ff9ebe0cf0e9 151
ashleymills 0:ff9ebe0cf0e9 152 break;
ashleymills 0:ff9ebe0cf0e9 153 default:
ashleymills 0:ff9ebe0cf0e9 154 memcpy(buf, "(unknown address type)", min(22, len));
ashleymills 0:ff9ebe0cf0e9 155 return min(22, len);
ashleymills 0:ff9ebe0cf0e9 156 }
ashleymills 0:ff9ebe0cf0e9 157
ashleymills 0:ff9ebe0cf0e9 158 if (inet_ntop(addr->addr.sa.sa_family, addrptr, p, len) == 0) {
ashleymills 0:ff9ebe0cf0e9 159 perror("dsrv_print_addr");
ashleymills 0:ff9ebe0cf0e9 160 return 0;
ashleymills 0:ff9ebe0cf0e9 161 }
ashleymills 0:ff9ebe0cf0e9 162
ashleymills 0:ff9ebe0cf0e9 163 p += strnlen(p, len);
ashleymills 0:ff9ebe0cf0e9 164
ashleymills 0:ff9ebe0cf0e9 165 if (addr->addr.sa.sa_family == AF_INET6) {
ashleymills 0:ff9ebe0cf0e9 166 if (p < buf + len) {
ashleymills 0:ff9ebe0cf0e9 167 *p++ = ']';
ashleymills 0:ff9ebe0cf0e9 168 } else
ashleymills 0:ff9ebe0cf0e9 169 return 0;
ashleymills 0:ff9ebe0cf0e9 170 }
ashleymills 0:ff9ebe0cf0e9 171
ashleymills 0:ff9ebe0cf0e9 172 p += snprintf(p, buf + len - p + 1, ":%d", port);
ashleymills 0:ff9ebe0cf0e9 173
ashleymills 0:ff9ebe0cf0e9 174 return p - buf;
ashleymills 0:ff9ebe0cf0e9 175 #else /* HAVE_ARPA_INET_H */
ashleymills 0:ff9ebe0cf0e9 176 # if WITH_CONTIKI
ashleymills 0:ff9ebe0cf0e9 177 char *p = buf;
ashleymills 0:ff9ebe0cf0e9 178 uint8_t i;
ashleymills 0:ff9ebe0cf0e9 179 # if WITH_UIP6
ashleymills 0:ff9ebe0cf0e9 180 const char hex[] = "0123456789ABCDEF";
ashleymills 0:ff9ebe0cf0e9 181
ashleymills 0:ff9ebe0cf0e9 182 if (len < 41)
ashleymills 0:ff9ebe0cf0e9 183 return 0;
ashleymills 0:ff9ebe0cf0e9 184
ashleymills 0:ff9ebe0cf0e9 185 *p++ = '[';
ashleymills 0:ff9ebe0cf0e9 186
ashleymills 0:ff9ebe0cf0e9 187 for (i=0; i < 8; i += 4) {
ashleymills 0:ff9ebe0cf0e9 188 *p++ = hex[(addr->addr.u16[i] & 0xf000) >> 24];
ashleymills 0:ff9ebe0cf0e9 189 *p++ = hex[(addr->addr.u16[i] & 0x0f00) >> 16];
ashleymills 0:ff9ebe0cf0e9 190 *p++ = hex[(addr->addr.u16[i] & 0x00f0) >> 8];
ashleymills 0:ff9ebe0cf0e9 191 *p++ = hex[(addr->addr.u16[i] & 0x000f)];
ashleymills 0:ff9ebe0cf0e9 192 *p++ = ':';
ashleymills 0:ff9ebe0cf0e9 193 }
ashleymills 0:ff9ebe0cf0e9 194 *(p-1) = ']';
ashleymills 0:ff9ebe0cf0e9 195 # else /* WITH_UIP6 */
ashleymills 0:ff9ebe0cf0e9 196 # warning "IPv4 network addresses will not be included in debug output"
ashleymills 0:ff9ebe0cf0e9 197
ashleymills 0:ff9ebe0cf0e9 198 if (len < 21)
ashleymills 0:ff9ebe0cf0e9 199 return 0;
ashleymills 0:ff9ebe0cf0e9 200 # endif /* WITH_UIP6 */
ashleymills 0:ff9ebe0cf0e9 201 if (buf + len - p < 6)
ashleymills 0:ff9ebe0cf0e9 202 return 0;
ashleymills 0:ff9ebe0cf0e9 203
ashleymills 0:ff9ebe0cf0e9 204 #ifdef HAVE_SNPRINTF
ashleymills 0:ff9ebe0cf0e9 205 p += snprintf(p, buf + len - p + 1, ":%d", uip_htons(addr->port));
ashleymills 0:ff9ebe0cf0e9 206 #else /* HAVE_SNPRINTF */
ashleymills 0:ff9ebe0cf0e9 207 /* @todo manual conversion of port number */
ashleymills 0:ff9ebe0cf0e9 208 #endif /* HAVE_SNPRINTF */
ashleymills 0:ff9ebe0cf0e9 209
ashleymills 0:ff9ebe0cf0e9 210 return p - buf;
ashleymills 0:ff9ebe0cf0e9 211 # else /* WITH_CONTIKI */
ashleymills 0:ff9ebe0cf0e9 212 /* TODO: output addresses manually */
ashleymills 0:ff9ebe0cf0e9 213 # warning "inet_ntop() not available, network addresses will not be included in debug output"
ashleymills 0:ff9ebe0cf0e9 214 # endif /* WITH_CONTIKI */
ashleymills 0:ff9ebe0cf0e9 215 return 0;
ashleymills 0:ff9ebe0cf0e9 216 #endif
ashleymills 0:ff9ebe0cf0e9 217 }
ashleymills 0:ff9ebe0cf0e9 218
ashleymills 0:ff9ebe0cf0e9 219 #ifndef WITH_CONTIKI
ashleymills 0:ff9ebe0cf0e9 220 void
ashleymills 0:ff9ebe0cf0e9 221 dsrv_log(log_t level, char *format, ...) {
ashleymills 0:ff9ebe0cf0e9 222 static char timebuf[32];
ashleymills 0:ff9ebe0cf0e9 223 va_list ap;
ashleymills 0:ff9ebe0cf0e9 224 FILE *log_fd;
ashleymills 0:ff9ebe0cf0e9 225
ashleymills 0:ff9ebe0cf0e9 226 if (maxlog < level)
ashleymills 0:ff9ebe0cf0e9 227 return;
ashleymills 0:ff9ebe0cf0e9 228
ashleymills 0:ff9ebe0cf0e9 229 log_fd = level <= LOG_CRIT ? stderr : stdout;
ashleymills 0:ff9ebe0cf0e9 230
ashleymills 0:ff9ebe0cf0e9 231 if (print_timestamp(timebuf,sizeof(timebuf), time(NULL)))
ashleymills 0:ff9ebe0cf0e9 232 fprintf(log_fd, "%s ", timebuf);
ashleymills 0:ff9ebe0cf0e9 233
ashleymills 0:ff9ebe0cf0e9 234 if (level >= 0 && level <= LOG_DEBUG)
ashleymills 0:ff9ebe0cf0e9 235 fprintf(log_fd, "%s ", loglevels[level]);
ashleymills 0:ff9ebe0cf0e9 236
ashleymills 0:ff9ebe0cf0e9 237 va_start(ap, format);
ashleymills 0:ff9ebe0cf0e9 238 vfprintf(log_fd, format, ap);
ashleymills 0:ff9ebe0cf0e9 239 va_end(ap);
ashleymills 0:ff9ebe0cf0e9 240 fflush(log_fd);
ashleymills 0:ff9ebe0cf0e9 241 }
ashleymills 0:ff9ebe0cf0e9 242 #else /* WITH_CONTIKI */
ashleymills 0:ff9ebe0cf0e9 243 void
ashleymills 0:ff9ebe0cf0e9 244 dsrv_log(log_t level, char *format, ...) {
ashleymills 0:ff9ebe0cf0e9 245 static char timebuf[32];
ashleymills 0:ff9ebe0cf0e9 246 va_list ap;
ashleymills 0:ff9ebe0cf0e9 247
ashleymills 0:ff9ebe0cf0e9 248 if (maxlog < level)
ashleymills 0:ff9ebe0cf0e9 249 return;
ashleymills 0:ff9ebe0cf0e9 250 /*
ashleymills 0:ff9ebe0cf0e9 251 if (print_timestamp(timebuf,sizeof(timebuf), clock_time()))
ashleymills 0:ff9ebe0cf0e9 252 PRINTF("%s ", timebuf);
ashleymills 0:ff9ebe0cf0e9 253 */
ashleymills 0:ff9ebe0cf0e9 254
ashleymills 0:ff9ebe0cf0e9 255 if (level >= 0 && level <= LOG_DEBUG)
ashleymills 0:ff9ebe0cf0e9 256 PRINTF("%s ", loglevels[level]);
ashleymills 0:ff9ebe0cf0e9 257
ashleymills 0:ff9ebe0cf0e9 258 va_start(ap, format);
ashleymills 0:ff9ebe0cf0e9 259 #ifdef HAVE_VPRINTF
ashleymills 0:ff9ebe0cf0e9 260 vprintf(format, ap);
ashleymills 0:ff9ebe0cf0e9 261 #else
ashleymills 0:ff9ebe0cf0e9 262 PRINTF(format, ap);
ashleymills 0:ff9ebe0cf0e9 263 #endif
ashleymills 0:ff9ebe0cf0e9 264 va_end(ap);
ashleymills 0:ff9ebe0cf0e9 265 }
ashleymills 0:ff9ebe0cf0e9 266 #endif /* WITH_CONTIKI */
ashleymills 0:ff9ebe0cf0e9 267
ashleymills 0:ff9ebe0cf0e9 268 #ifndef NDEBUG
ashleymills 0:ff9ebe0cf0e9 269 /** dumps packets in usual hexdump format */
ashleymills 0:ff9ebe0cf0e9 270 void hexdump(const unsigned char *packet, int length) {
ashleymills 0:ff9ebe0cf0e9 271 int n = 0;
ashleymills 0:ff9ebe0cf0e9 272
ashleymills 0:ff9ebe0cf0e9 273 while (length--) {
ashleymills 0:ff9ebe0cf0e9 274 if (n % 16 == 0)
ashleymills 0:ff9ebe0cf0e9 275 printf("%08X ",n);
ashleymills 0:ff9ebe0cf0e9 276
ashleymills 0:ff9ebe0cf0e9 277 printf("%02X ", *packet++);
ashleymills 0:ff9ebe0cf0e9 278
ashleymills 0:ff9ebe0cf0e9 279 n++;
ashleymills 0:ff9ebe0cf0e9 280 if (n % 8 == 0) {
ashleymills 0:ff9ebe0cf0e9 281 if (n % 16 == 0)
ashleymills 0:ff9ebe0cf0e9 282 printf("\r\n");
ashleymills 0:ff9ebe0cf0e9 283 else
ashleymills 0:ff9ebe0cf0e9 284 printf(" ");
ashleymills 0:ff9ebe0cf0e9 285 }
ashleymills 0:ff9ebe0cf0e9 286 }
ashleymills 0:ff9ebe0cf0e9 287 }
ashleymills 0:ff9ebe0cf0e9 288
ashleymills 0:ff9ebe0cf0e9 289 /** dump as narrow string of hex digits */
ashleymills 0:ff9ebe0cf0e9 290 void dump(unsigned char *buf, size_t len) {
ashleymills 0:ff9ebe0cf0e9 291 while (len--)
ashleymills 0:ff9ebe0cf0e9 292 printf("%02x", *buf++);
ashleymills 0:ff9ebe0cf0e9 293 }
ashleymills 0:ff9ebe0cf0e9 294
ashleymills 0:ff9ebe0cf0e9 295 void dtls_dsrv_log_addr(log_t level, const char *name, const session_t *addr)
ashleymills 0:ff9ebe0cf0e9 296 {
ashleymills 0:ff9ebe0cf0e9 297 char addrbuf[73];
ashleymills 0:ff9ebe0cf0e9 298 int len;
ashleymills 0:ff9ebe0cf0e9 299
ashleymills 0:ff9ebe0cf0e9 300 len = dsrv_print_addr(addr, addrbuf, sizeof(addrbuf));
ashleymills 0:ff9ebe0cf0e9 301 if (!len)
ashleymills 0:ff9ebe0cf0e9 302 return;
ashleymills 0:ff9ebe0cf0e9 303 printf("%s: %s\r\n", name, addrbuf);
ashleymills 0:ff9ebe0cf0e9 304 }
ashleymills 0:ff9ebe0cf0e9 305
ashleymills 0:ff9ebe0cf0e9 306 #ifndef WITH_CONTIKI
ashleymills 0:ff9ebe0cf0e9 307 void
ashleymills 0:ff9ebe0cf0e9 308 dtls_dsrv_hexdump_log(log_t level, const char *name, const unsigned char *buf, size_t length, int extend) {
ashleymills 0:ff9ebe0cf0e9 309 static char timebuf[32];
ashleymills 0:ff9ebe0cf0e9 310 FILE *log_fd;
ashleymills 0:ff9ebe0cf0e9 311 int n = 0;
ashleymills 0:ff9ebe0cf0e9 312
ashleymills 0:ff9ebe0cf0e9 313 if (maxlog < level)
ashleymills 0:ff9ebe0cf0e9 314 return;
ashleymills 0:ff9ebe0cf0e9 315
ashleymills 0:ff9ebe0cf0e9 316 log_fd = level <= LOG_CRIT ? stderr : stdout;
ashleymills 0:ff9ebe0cf0e9 317 /*
ashleymills 0:ff9ebe0cf0e9 318 if (print_timestamp(timebuf, sizeof(timebuf), time(NULL)))
ashleymills 0:ff9ebe0cf0e9 319 fprintf(log_fd, "%s ", timebuf);
ashleymills 0:ff9ebe0cf0e9 320 */
ashleymills 0:ff9ebe0cf0e9 321
ashleymills 0:ff9ebe0cf0e9 322 if (level >= 0 && level <= LOG_DEBUG)
ashleymills 0:ff9ebe0cf0e9 323 fprintf(log_fd, "%s ", loglevels[level]);
ashleymills 0:ff9ebe0cf0e9 324
ashleymills 0:ff9ebe0cf0e9 325 if (extend) {
ashleymills 0:ff9ebe0cf0e9 326 fprintf(log_fd, "%s: (%zu bytes):\r\n", name, length);
ashleymills 0:ff9ebe0cf0e9 327
ashleymills 0:ff9ebe0cf0e9 328 while (length--) {
ashleymills 0:ff9ebe0cf0e9 329 if (n % 16 == 0)
ashleymills 0:ff9ebe0cf0e9 330 fprintf(log_fd, "%08X ", n);
ashleymills 0:ff9ebe0cf0e9 331
ashleymills 0:ff9ebe0cf0e9 332 fprintf(log_fd, "%02X ", *buf++);
ashleymills 0:ff9ebe0cf0e9 333
ashleymills 0:ff9ebe0cf0e9 334 n++;
ashleymills 0:ff9ebe0cf0e9 335 if (n % 8 == 0) {
ashleymills 0:ff9ebe0cf0e9 336 if (n % 16 == 0)
ashleymills 0:ff9ebe0cf0e9 337 fprintf(log_fd, "\r\n");
ashleymills 0:ff9ebe0cf0e9 338 else
ashleymills 0:ff9ebe0cf0e9 339 fprintf(log_fd, " ");
ashleymills 0:ff9ebe0cf0e9 340 }
ashleymills 0:ff9ebe0cf0e9 341 }
ashleymills 0:ff9ebe0cf0e9 342 } else {
ashleymills 0:ff9ebe0cf0e9 343 fprintf(log_fd, "%s: (%zu bytes): ", name, length);
ashleymills 0:ff9ebe0cf0e9 344 while (length--)
ashleymills 0:ff9ebe0cf0e9 345 fprintf(log_fd, "%02X", *buf++);
ashleymills 0:ff9ebe0cf0e9 346 }
ashleymills 0:ff9ebe0cf0e9 347 fprintf(log_fd, "\r\n");
ashleymills 0:ff9ebe0cf0e9 348
ashleymills 0:ff9ebe0cf0e9 349 fflush(log_fd);
ashleymills 0:ff9ebe0cf0e9 350 }
ashleymills 0:ff9ebe0cf0e9 351 #else /* WITH_CONTIKI */
ashleymills 0:ff9ebe0cf0e9 352 void
ashleymills 0:ff9ebe0cf0e9 353 dtls_dsrv_hexdump_log(log_t level, const char *name, const unsigned char *buf, size_t length, int extend) {
ashleymills 0:ff9ebe0cf0e9 354 static char timebuf[32];
ashleymills 0:ff9ebe0cf0e9 355 int n = 0;
ashleymills 0:ff9ebe0cf0e9 356
ashleymills 0:ff9ebe0cf0e9 357 if (maxlog < level)
ashleymills 0:ff9ebe0cf0e9 358 return;
ashleymills 0:ff9ebe0cf0e9 359 /*
ashleymills 0:ff9ebe0cf0e9 360 if (print_timestamp(timebuf,sizeof(timebuf), clock_time()))
ashleymills 0:ff9ebe0cf0e9 361 PRINTF("%s ", timebuf);
ashleymills 0:ff9ebe0cf0e9 362 */
ashleymills 0:ff9ebe0cf0e9 363 if (level >= 0 && level <= LOG_DEBUG)
ashleymills 0:ff9ebe0cf0e9 364 PRINTF("%s ", loglevels[level]);
ashleymills 0:ff9ebe0cf0e9 365
ashleymills 0:ff9ebe0cf0e9 366 if (extend) {
ashleymills 0:ff9ebe0cf0e9 367 PRINTF("%s: (%zu bytes):\r\n", name, length);
ashleymills 0:ff9ebe0cf0e9 368
ashleymills 0:ff9ebe0cf0e9 369 while (length--) {
ashleymills 0:ff9ebe0cf0e9 370 if (n % 16 == 0)
ashleymills 0:ff9ebe0cf0e9 371 PRINTF("%08X ", n);
ashleymills 0:ff9ebe0cf0e9 372
ashleymills 0:ff9ebe0cf0e9 373 PRINTF("%02X ", *buf++);
ashleymills 0:ff9ebe0cf0e9 374
ashleymills 0:ff9ebe0cf0e9 375 n++;
ashleymills 0:ff9ebe0cf0e9 376 if (n % 8 == 0) {
ashleymills 0:ff9ebe0cf0e9 377 if (n % 16 == 0)
ashleymills 0:ff9ebe0cf0e9 378 PRINTF("\r\n");
ashleymills 0:ff9ebe0cf0e9 379 else
ashleymills 0:ff9ebe0cf0e9 380 PRINTF(" ");
ashleymills 0:ff9ebe0cf0e9 381 }
ashleymills 0:ff9ebe0cf0e9 382 }
ashleymills 0:ff9ebe0cf0e9 383 } else {
ashleymills 0:ff9ebe0cf0e9 384 PRINTF("%s: (%zu bytes): ", name, length);
ashleymills 0:ff9ebe0cf0e9 385 while (length--)
ashleymills 0:ff9ebe0cf0e9 386 PRINTF("%02X", *buf++);
ashleymills 0:ff9ebe0cf0e9 387 }
ashleymills 0:ff9ebe0cf0e9 388 PRINTF("\r\n");
ashleymills 0:ff9ebe0cf0e9 389 }
ashleymills 0:ff9ebe0cf0e9 390 #endif /* WITH_CONTIKI */
ashleymills 0:ff9ebe0cf0e9 391
ashleymills 0:ff9ebe0cf0e9 392 #endif /* NDEBUG */