Ashley Mills / Mbed 2 deprecated tinydtls_test_ethernet

Dependencies:   EthernetInterface mbed-rtos mbed tinydtls

Fork of tinydtls_test_ethernet by Ashley Mills

Committer:
ashleymills
Date:
Wed Oct 09 14:48:52 2013 +0000
Revision:
0:6ae42a2aff75
Test program for mbed port of tinydtls

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:6ae42a2aff75 1 /* debug.c -- debug utilities
ashleymills 0:6ae42a2aff75 2 *
ashleymills 0:6ae42a2aff75 3 * Copyright (C) 2011--2012 Olaf Bergmann <bergmann@tzi.org>
ashleymills 0:6ae42a2aff75 4 *
ashleymills 0:6ae42a2aff75 5 * Permission is hereby granted, free of charge, to any person
ashleymills 0:6ae42a2aff75 6 * obtaining a copy of this software and associated documentation
ashleymills 0:6ae42a2aff75 7 * files (the "Software"), to deal in the Software without
ashleymills 0:6ae42a2aff75 8 * restriction, including without limitation the rights to use, copy,
ashleymills 0:6ae42a2aff75 9 * modify, merge, publish, distribute, sublicense, and/or sell copies
ashleymills 0:6ae42a2aff75 10 * of the Software, and to permit persons to whom the Software is
ashleymills 0:6ae42a2aff75 11 * furnished to do so, subject to the following conditions:
ashleymills 0:6ae42a2aff75 12 *
ashleymills 0:6ae42a2aff75 13 * The above copyright notice and this permission notice shall be
ashleymills 0:6ae42a2aff75 14 * included in all copies or substantial portions of the Software.
ashleymills 0:6ae42a2aff75 15 *
ashleymills 0:6ae42a2aff75 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
ashleymills 0:6ae42a2aff75 17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
ashleymills 0:6ae42a2aff75 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ashleymills 0:6ae42a2aff75 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
ashleymills 0:6ae42a2aff75 20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ashleymills 0:6ae42a2aff75 21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
ashleymills 0:6ae42a2aff75 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
ashleymills 0:6ae42a2aff75 23 * SOFTWARE.
ashleymills 0:6ae42a2aff75 24 */
ashleymills 0:6ae42a2aff75 25
ashleymills 0:6ae42a2aff75 26 #include "config.h"
ashleymills 0:6ae42a2aff75 27
ashleymills 0:6ae42a2aff75 28 #if defined(HAVE_ASSERT_H) && !defined(assert)
ashleymills 0:6ae42a2aff75 29 #include <assert.h>
ashleymills 0:6ae42a2aff75 30 #endif
ashleymills 0:6ae42a2aff75 31
ashleymills 0:6ae42a2aff75 32 #include <stdarg.h>
ashleymills 0:6ae42a2aff75 33 #include <string.h>
ashleymills 0:6ae42a2aff75 34 #include <stdio.h>
ashleymills 0:6ae42a2aff75 35
ashleymills 0:6ae42a2aff75 36 #ifdef HAVE_ARPA_INET_H
ashleymills 0:6ae42a2aff75 37 #include <arpa/inet.h>
ashleymills 0:6ae42a2aff75 38 #endif
ashleymills 0:6ae42a2aff75 39
ashleymills 0:6ae42a2aff75 40 #ifdef HAVE_TIME_H
ashleymills 0:6ae42a2aff75 41 #include <time.h>
ashleymills 0:6ae42a2aff75 42 #endif
ashleymills 0:6ae42a2aff75 43
ashleymills 0:6ae42a2aff75 44 #include "global.h"
ashleymills 0:6ae42a2aff75 45 #include "debug.h"
ashleymills 0:6ae42a2aff75 46
ashleymills 0:6ae42a2aff75 47 #ifdef WITH_CONTIKI
ashleymills 0:6ae42a2aff75 48 # ifndef DEBUG
ashleymills 0:6ae42a2aff75 49 # define DEBUG DEBUG_PRINT
ashleymills 0:6ae42a2aff75 50 # endif /* DEBUG */
ashleymills 0:6ae42a2aff75 51 #include "net/uip-debug.h"
ashleymills 0:6ae42a2aff75 52 #else
ashleymills 0:6ae42a2aff75 53 #define PRINTF(...)
ashleymills 0:6ae42a2aff75 54 #endif
ashleymills 0:6ae42a2aff75 55
ashleymills 0:6ae42a2aff75 56 static int maxlog = LOG_WARN; /* default maximum log level */
ashleymills 0:6ae42a2aff75 57
ashleymills 0:6ae42a2aff75 58 log_t
ashleymills 0:6ae42a2aff75 59 dtls_get_log_level() {
ashleymills 0:6ae42a2aff75 60 return maxlog;
ashleymills 0:6ae42a2aff75 61 }
ashleymills 0:6ae42a2aff75 62
ashleymills 0:6ae42a2aff75 63 void
ashleymills 0:6ae42a2aff75 64 dtls_set_log_level(log_t level) {
ashleymills 0:6ae42a2aff75 65 maxlog = level;
ashleymills 0:6ae42a2aff75 66 }
ashleymills 0:6ae42a2aff75 67
ashleymills 0:6ae42a2aff75 68 /* this array has the same order as the type log_t */
ashleymills 0:6ae42a2aff75 69 static char *loglevels[] = {
ashleymills 0:6ae42a2aff75 70 "EMRG", "ALRT", "CRIT", "WARN", "NOTE", "INFO", "DEBG"
ashleymills 0:6ae42a2aff75 71 };
ashleymills 0:6ae42a2aff75 72
ashleymills 0:6ae42a2aff75 73 #ifdef HAVE_TIME_H
ashleymills 0:6ae42a2aff75 74
ashleymills 0:6ae42a2aff75 75 static inline size_t
ashleymills 0:6ae42a2aff75 76 print_timestamp(char *s, size_t len, time_t t) {
ashleymills 0:6ae42a2aff75 77 struct tm *tmp;
ashleymills 0:6ae42a2aff75 78 tmp = localtime(&t);
ashleymills 0:6ae42a2aff75 79 return strftime(s, len, "%b %d %H:%M:%S", tmp);
ashleymills 0:6ae42a2aff75 80 }
ashleymills 0:6ae42a2aff75 81
ashleymills 0:6ae42a2aff75 82 #else /* alternative implementation: just print the timestamp */
ashleymills 0:6ae42a2aff75 83
ashleymills 0:6ae42a2aff75 84 static inline size_t
ashleymills 0:6ae42a2aff75 85 print_timestamp(char *s, size_t len, clock_time_t t) {
ashleymills 0:6ae42a2aff75 86 #ifdef HAVE_SNPRINTF
ashleymills 0:6ae42a2aff75 87 return snprintf(s, len, "%u.%03u",
ashleymills 0:6ae42a2aff75 88 (unsigned int)(t / CLOCK_SECOND),
ashleymills 0:6ae42a2aff75 89 (unsigned int)(t % CLOCK_SECOND));
ashleymills 0:6ae42a2aff75 90 #else /* HAVE_SNPRINTF */
ashleymills 0:6ae42a2aff75 91 /* @todo do manual conversion of timestamp */
ashleymills 0:6ae42a2aff75 92 return 0;
ashleymills 0:6ae42a2aff75 93 #endif /* HAVE_SNPRINTF */
ashleymills 0:6ae42a2aff75 94 }
ashleymills 0:6ae42a2aff75 95
ashleymills 0:6ae42a2aff75 96 #endif /* HAVE_TIME_H */
ashleymills 0:6ae42a2aff75 97
ashleymills 0:6ae42a2aff75 98 #ifndef HAVE_STRNLEN
ashleymills 0:6ae42a2aff75 99 /**
ashleymills 0:6ae42a2aff75 100 * A length-safe strlen() fake.
ashleymills 0:6ae42a2aff75 101 *
ashleymills 0:6ae42a2aff75 102 * @param s The string to count characters != 0.
ashleymills 0:6ae42a2aff75 103 * @param maxlen The maximum length of @p s.
ashleymills 0:6ae42a2aff75 104 *
ashleymills 0:6ae42a2aff75 105 * @return The length of @p s.
ashleymills 0:6ae42a2aff75 106 */
ashleymills 0:6ae42a2aff75 107 static inline size_t
ashleymills 0:6ae42a2aff75 108 strnlen(const char *s, size_t maxlen) {
ashleymills 0:6ae42a2aff75 109 size_t n = 0;
ashleymills 0:6ae42a2aff75 110 while(*s++ && n < maxlen)
ashleymills 0:6ae42a2aff75 111 ++n;
ashleymills 0:6ae42a2aff75 112 return n;
ashleymills 0:6ae42a2aff75 113 }
ashleymills 0:6ae42a2aff75 114 #endif /* HAVE_STRNLEN */
ashleymills 0:6ae42a2aff75 115
ashleymills 0:6ae42a2aff75 116 #ifndef min
ashleymills 0:6ae42a2aff75 117 #define min(a,b) ((a) < (b) ? (a) : (b))
ashleymills 0:6ae42a2aff75 118 #endif
ashleymills 0:6ae42a2aff75 119
ashleymills 0:6ae42a2aff75 120 size_t
ashleymills 0:6ae42a2aff75 121 dsrv_print_addr(const session_t *addr, unsigned char *buf, size_t len) {
ashleymills 0:6ae42a2aff75 122 #ifdef HAVE_ARPA_INET_H
ashleymills 0:6ae42a2aff75 123 const void *addrptr = NULL;
ashleymills 0:6ae42a2aff75 124 in_port_t port;
ashleymills 0:6ae42a2aff75 125 unsigned char *p = buf;
ashleymills 0:6ae42a2aff75 126
ashleymills 0:6ae42a2aff75 127 switch (addr->addr.sa.sa_family) {
ashleymills 0:6ae42a2aff75 128 case AF_INET:
ashleymills 0:6ae42a2aff75 129 addrptr = &addr->addr.sin.sin_addr;
ashleymills 0:6ae42a2aff75 130 port = ntohs(addr->addr.sin.sin_port);
ashleymills 0:6ae42a2aff75 131 break;
ashleymills 0:6ae42a2aff75 132 case AF_INET6:
ashleymills 0:6ae42a2aff75 133 if (len < 7) /* do not proceed if buffer is even too short for [::]:0 */
ashleymills 0:6ae42a2aff75 134 return 0;
ashleymills 0:6ae42a2aff75 135
ashleymills 0:6ae42a2aff75 136 *p++ = '[';
ashleymills 0:6ae42a2aff75 137
ashleymills 0:6ae42a2aff75 138 addrptr = &addr->addr.sin6.sin6_addr;
ashleymills 0:6ae42a2aff75 139 port = ntohs(addr->addr.sin6.sin6_port);
ashleymills 0:6ae42a2aff75 140
ashleymills 0:6ae42a2aff75 141 break;
ashleymills 0:6ae42a2aff75 142 default:
ashleymills 0:6ae42a2aff75 143 memcpy(buf, "(unknown address type)", min(22, len));
ashleymills 0:6ae42a2aff75 144 return min(22, len);
ashleymills 0:6ae42a2aff75 145 }
ashleymills 0:6ae42a2aff75 146
ashleymills 0:6ae42a2aff75 147 if (inet_ntop(addr->addr.sa.sa_family, addrptr, (char *)p, len) == 0) {
ashleymills 0:6ae42a2aff75 148 perror("dsrv_print_addr");
ashleymills 0:6ae42a2aff75 149 return 0;
ashleymills 0:6ae42a2aff75 150 }
ashleymills 0:6ae42a2aff75 151
ashleymills 0:6ae42a2aff75 152 p += strnlen((char *)p, len);
ashleymills 0:6ae42a2aff75 153
ashleymills 0:6ae42a2aff75 154 if (addr->addr.sa.sa_family == AF_INET6) {
ashleymills 0:6ae42a2aff75 155 if (p < buf + len) {
ashleymills 0:6ae42a2aff75 156 *p++ = ']';
ashleymills 0:6ae42a2aff75 157 } else
ashleymills 0:6ae42a2aff75 158 return 0;
ashleymills 0:6ae42a2aff75 159 }
ashleymills 0:6ae42a2aff75 160
ashleymills 0:6ae42a2aff75 161 p += snprintf((char *)p, buf + len - p + 1, ":%d", port);
ashleymills 0:6ae42a2aff75 162
ashleymills 0:6ae42a2aff75 163 return buf + len - p;
ashleymills 0:6ae42a2aff75 164 #else /* HAVE_ARPA_INET_H */
ashleymills 0:6ae42a2aff75 165 # if WITH_CONTIKI
ashleymills 0:6ae42a2aff75 166 unsigned char *p = buf;
ashleymills 0:6ae42a2aff75 167 uint8_t i;
ashleymills 0:6ae42a2aff75 168 # if WITH_UIP6
ashleymills 0:6ae42a2aff75 169 const unsigned char hex[] = "0123456789ABCDEF";
ashleymills 0:6ae42a2aff75 170
ashleymills 0:6ae42a2aff75 171 if (len < 41)
ashleymills 0:6ae42a2aff75 172 return 0;
ashleymills 0:6ae42a2aff75 173
ashleymills 0:6ae42a2aff75 174 *p++ = '[';
ashleymills 0:6ae42a2aff75 175
ashleymills 0:6ae42a2aff75 176 for (i=0; i < 8; i += 4) {
ashleymills 0:6ae42a2aff75 177 *p++ = hex[(addr->addr.u16[i] & 0xf000) >> 24];
ashleymills 0:6ae42a2aff75 178 *p++ = hex[(addr->addr.u16[i] & 0x0f00) >> 16];
ashleymills 0:6ae42a2aff75 179 *p++ = hex[(addr->addr.u16[i] & 0x00f0) >> 8];
ashleymills 0:6ae42a2aff75 180 *p++ = hex[(addr->addr.u16[i] & 0x000f)];
ashleymills 0:6ae42a2aff75 181 *p++ = ':';
ashleymills 0:6ae42a2aff75 182 }
ashleymills 0:6ae42a2aff75 183 *(p-1) = ']';
ashleymills 0:6ae42a2aff75 184 # else /* WITH_UIP6 */
ashleymills 0:6ae42a2aff75 185 # warning "IPv4 network addresses will not be included in debug output"
ashleymills 0:6ae42a2aff75 186
ashleymills 0:6ae42a2aff75 187 if (len < 21)
ashleymills 0:6ae42a2aff75 188 return 0;
ashleymills 0:6ae42a2aff75 189 # endif /* WITH_UIP6 */
ashleymills 0:6ae42a2aff75 190 if (buf + len - p < 6)
ashleymills 0:6ae42a2aff75 191 return 0;
ashleymills 0:6ae42a2aff75 192
ashleymills 0:6ae42a2aff75 193 #ifdef HAVE_SNPRINTF
ashleymills 0:6ae42a2aff75 194 p += snprintf((char *)p, buf + len - p + 1, ":%d", uip_htons(addr->port));
ashleymills 0:6ae42a2aff75 195 #else /* HAVE_SNPRINTF */
ashleymills 0:6ae42a2aff75 196 /* @todo manual conversion of port number */
ashleymills 0:6ae42a2aff75 197 #endif /* HAVE_SNPRINTF */
ashleymills 0:6ae42a2aff75 198
ashleymills 0:6ae42a2aff75 199 return buf + len - p;
ashleymills 0:6ae42a2aff75 200 # else /* WITH_CONTIKI */
ashleymills 0:6ae42a2aff75 201 /* TODO: output addresses manually */
ashleymills 0:6ae42a2aff75 202 # warning "inet_ntop() not available, network addresses will not be included in debug output"
ashleymills 0:6ae42a2aff75 203 # endif /* WITH_CONTIKI */
ashleymills 0:6ae42a2aff75 204 return 0;
ashleymills 0:6ae42a2aff75 205 #endif
ashleymills 0:6ae42a2aff75 206 }
ashleymills 0:6ae42a2aff75 207
ashleymills 0:6ae42a2aff75 208 #ifndef WITH_CONTIKI
ashleymills 0:6ae42a2aff75 209 void
ashleymills 0:6ae42a2aff75 210 dsrv_log(log_t level, char *format, ...) {
ashleymills 0:6ae42a2aff75 211 static char timebuf[32];
ashleymills 0:6ae42a2aff75 212 va_list ap;
ashleymills 0:6ae42a2aff75 213 FILE *log_fd;
ashleymills 0:6ae42a2aff75 214
ashleymills 0:6ae42a2aff75 215 if (maxlog < level)
ashleymills 0:6ae42a2aff75 216 return;
ashleymills 0:6ae42a2aff75 217
ashleymills 0:6ae42a2aff75 218 log_fd = level <= LOG_CRIT ? stderr : stdout;
ashleymills 0:6ae42a2aff75 219
ashleymills 0:6ae42a2aff75 220 if (print_timestamp(timebuf,sizeof(timebuf), time(NULL)))
ashleymills 0:6ae42a2aff75 221 fprintf(log_fd, "%s ", timebuf);
ashleymills 0:6ae42a2aff75 222
ashleymills 0:6ae42a2aff75 223 if (level >= 0 && level <= LOG_DEBUG)
ashleymills 0:6ae42a2aff75 224 printf("%s ", loglevels[level]);
ashleymills 0:6ae42a2aff75 225
ashleymills 0:6ae42a2aff75 226 va_start(ap, format);
ashleymills 0:6ae42a2aff75 227 vprintf(format, ap);
ashleymills 0:6ae42a2aff75 228 va_end(ap);
ashleymills 0:6ae42a2aff75 229 fflush(stdout);
ashleymills 0:6ae42a2aff75 230 }
ashleymills 0:6ae42a2aff75 231 #else /* WITH_CONTIKI */
ashleymills 0:6ae42a2aff75 232 void
ashleymills 0:6ae42a2aff75 233 dsrv_log(log_t level, char *format, ...) {
ashleymills 0:6ae42a2aff75 234 static char timebuf[32];
ashleymills 0:6ae42a2aff75 235 va_list ap;
ashleymills 0:6ae42a2aff75 236
ashleymills 0:6ae42a2aff75 237 if (maxlog < level)
ashleymills 0:6ae42a2aff75 238 return;
ashleymills 0:6ae42a2aff75 239
ashleymills 0:6ae42a2aff75 240 if (print_timestamp(timebuf,sizeof(timebuf), clock_time()))
ashleymills 0:6ae42a2aff75 241 PRINTF("%s ", timebuf);
ashleymills 0:6ae42a2aff75 242
ashleymills 0:6ae42a2aff75 243 if (level >= 0 && level <= LOG_DEBUG)
ashleymills 0:6ae42a2aff75 244 PRINTF("%s ", loglevels[level]);
ashleymills 0:6ae42a2aff75 245
ashleymills 0:6ae42a2aff75 246 va_start(ap, format);
ashleymills 0:6ae42a2aff75 247 #ifdef HAVE_VPRINTF
ashleymills 0:6ae42a2aff75 248 vprintf(format, ap);
ashleymills 0:6ae42a2aff75 249 #else
ashleymills 0:6ae42a2aff75 250 PRINTF(format, ap);
ashleymills 0:6ae42a2aff75 251 #endif
ashleymills 0:6ae42a2aff75 252 va_end(ap);
ashleymills 0:6ae42a2aff75 253 }
ashleymills 0:6ae42a2aff75 254 #endif /* WITH_CONTIKI */