Contiki-NG
Loading...
Searching...
No Matches
log.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017, RISE SICS.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the Institute nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * This file is part of the Contiki operating system.
30 *
31 */
32
33/**
34 * \file
35 * Header file for the logging system
36 * \author
37 * Simon Duquennoy <simon.duquennoy@ri.se>
38 */
39
40/** \addtogroup sys
41 * @{ */
42
43/**
44 * \defgroup log Per-module, per-level logging
45 * @{
46 *
47 * The log module performs per-module, per-level logging
48 *
49 */
50
51#include "sys/log.h"
52#include "net/ipv6/ip64-addr.h"
53#include "net/ipv6/uiplib.h"
55
56int curr_log_level_rpl = LOG_CONF_LEVEL_RPL;
57int curr_log_level_tcpip = LOG_CONF_LEVEL_TCPIP;
58int curr_log_level_ipv6 = LOG_CONF_LEVEL_IPV6;
59int curr_log_level_6lowpan = LOG_CONF_LEVEL_6LOWPAN;
60int curr_log_level_nullnet = LOG_CONF_LEVEL_NULLNET;
61int curr_log_level_mac = LOG_CONF_LEVEL_MAC;
62int curr_log_level_framer = LOG_CONF_LEVEL_FRAMER;
63int curr_log_level_6top = LOG_CONF_LEVEL_6TOP;
64int curr_log_level_coap = LOG_CONF_LEVEL_COAP;
65int curr_log_level_dtls = LOG_CONF_LEVEL_DTLS;
66int curr_log_level_snmp = LOG_CONF_LEVEL_SNMP;
67int curr_log_level_lwm2m = LOG_CONF_LEVEL_LWM2M;
68int curr_log_level_sys = LOG_CONF_LEVEL_SYS;
69int curr_log_level_main = LOG_CONF_LEVEL_MAIN;
70int curr_log_level_edhoc = LOG_CONF_LEVEL_EDHOC;
71
72struct log_module all_modules[] = {
73 {"rpl", &curr_log_level_rpl, LOG_CONF_LEVEL_RPL},
74 {"tcpip", &curr_log_level_tcpip, LOG_CONF_LEVEL_TCPIP},
75 {"ipv6", &curr_log_level_ipv6, LOG_CONF_LEVEL_IPV6},
76 {"6lowpan", &curr_log_level_6lowpan, LOG_CONF_LEVEL_6LOWPAN},
77 {"nullnet", &curr_log_level_nullnet, LOG_CONF_LEVEL_NULLNET},
78 {"mac", &curr_log_level_mac, LOG_CONF_LEVEL_MAC},
79 {"framer", &curr_log_level_framer, LOG_CONF_LEVEL_FRAMER},
80 {"6top", &curr_log_level_6top, LOG_CONF_LEVEL_6TOP},
81 {"coap", &curr_log_level_coap, LOG_CONF_LEVEL_COAP},
82 {"dtls", &curr_log_level_coap, LOG_CONF_LEVEL_DTLS},
83 {"snmp", &curr_log_level_snmp, LOG_CONF_LEVEL_SNMP},
84 {"lwm2m", &curr_log_level_lwm2m, LOG_CONF_LEVEL_LWM2M},
85 {"sys", &curr_log_level_sys, LOG_CONF_LEVEL_SYS},
86 {"main", &curr_log_level_main, LOG_CONF_LEVEL_MAIN},
87 {"edhoc", &curr_log_level_edhoc, LOG_CONF_LEVEL_EDHOC},
88 {NULL, NULL, 0},
89};
90
91#if NETSTACK_CONF_WITH_IPV6
92
93/*---------------------------------------------------------------------------*/
94void
95log_6addr(const uip_ipaddr_t *ipaddr)
96{
97 char buf[UIPLIB_IPV6_MAX_STR_LEN];
98 uiplib_ipaddr_snprint(buf, sizeof(buf), ipaddr);
99 LOG_OUTPUT("%s", buf);
100}
101/*---------------------------------------------------------------------------*/
102int
103log_6addr_compact_snprint(char *buf, size_t size, const uip_ipaddr_t *ipaddr)
104{
105 if(ipaddr == NULL) {
106 return snprintf(buf, size, "6A-NULL");
107 } else {
108 char *prefix = NULL;
110 prefix = "6M";
111 } else if(uip_is_addr_linklocal(ipaddr)) {
112 prefix = "6L";
113 } else {
114 prefix = "6G";
115 }
116#if BUILD_WITH_DEPLOYMENT
117 return snprintf(buf, size, "%s-%03u", prefix, deployment_id_from_iid(ipaddr));
118#else /* BUILD_WITH_DEPLOYMENT */
119 return snprintf(buf, size, "%s-%04x", prefix, UIP_HTONS(ipaddr->u16[sizeof(uip_ipaddr_t)/2-1]));
120#endif /* BUILD_WITH_DEPLOYMENT */
121 }
122}
123/*---------------------------------------------------------------------------*/
124void
125log_6addr_compact(const uip_ipaddr_t *ipaddr)
126{
127 char buf[8];
128 log_6addr_compact_snprint(buf, sizeof(buf), ipaddr);
129 LOG_OUTPUT("%s", buf);
130}
131#endif /* NETSTACK_CONF_WITH_IPV6 */
132/*---------------------------------------------------------------------------*/
133void
134log_lladdr(const linkaddr_t *lladdr)
135{
136 if(lladdr == NULL) {
137 LOG_OUTPUT("(NULL LL addr)");
138 return;
139 } else {
140 unsigned int i;
141 for(i = 0; i < LINKADDR_SIZE; i++) {
142 if(i > 0 && i % 2 == 0) {
143 LOG_OUTPUT(".");
144 }
145 LOG_OUTPUT("%02x", lladdr->u8[i]);
146 }
147 }
148}
149/*---------------------------------------------------------------------------*/
150void
151log_lladdr_compact(const linkaddr_t *lladdr)
152{
153 if(lladdr == NULL || linkaddr_cmp(lladdr, &linkaddr_null)) {
154 LOG_OUTPUT("LL-NULL");
155 } else {
156#if BUILD_WITH_DEPLOYMENT
157 LOG_OUTPUT("LL-%04u", deployment_id_from_lladdr(lladdr));
158#else /* BUILD_WITH_DEPLOYMENT */
159#if LINKADDR_SIZE == 8
160 LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16[LINKADDR_SIZE/2-1]));
161#elif LINKADDR_SIZE == 2
162 LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16));
163#endif
164#endif /* BUILD_WITH_DEPLOYMENT */
165 }
166}
167/*---------------------------------------------------------------------------*/
168void
169log_bytes(const void *data, size_t length)
170{
171 const uint8_t *u8data = (const uint8_t *)data;
172 for(size_t i = 0; i < length; ++i) {
173 if(LOG_WITH_COMPACT_BYTES) {
174 LOG_OUTPUT("%02x", u8data[i]);
175 } else {
176 LOG_OUTPUT(i == 0 ? "%02x" : " %02x", u8data[i]);
177 }
178 }
179}
180/*---------------------------------------------------------------------------*/
181void
182log_string(const char *text, size_t len)
183{
184 if(text == NULL) {
185 LOG_OUTPUT("(NULL STR)");
186 return;
187 }
188
189 for(int i = 0; i < len && *text != '\0'; i++, text++) {
190 LOG_OUTPUT("%c", *text);
191 }
192}
193/*---------------------------------------------------------------------------*/
194void
195log_set_level(const char *module, int level)
196{
197 if(level >= LOG_LEVEL_NONE && level <= LOG_LEVEL_DBG) {
198 int i = 0;
199 int module_all = !strcmp("all", module);
200 while(all_modules[i].name != NULL) {
201 if(module_all || !strcmp(module, all_modules[i].name)) {
202 *all_modules[i].curr_log_level = MIN(level, all_modules[i].max_log_level);
203 }
204 i++;
205 }
206 }
207}
208/*---------------------------------------------------------------------------*/
209int
210log_get_level(const char *module)
211{
212 int i = 0;
213 if(module == NULL) {
214 return -1;
215 }
216 while(all_modules[i].name != NULL) {
217 if(!strcmp(module, all_modules[i].name)) {
218 return *all_modules[i].curr_log_level;
219 }
220 i++;
221 }
222 return -1;
223}
224/*---------------------------------------------------------------------------*/
225const char *
227{
228 switch(level) {
229 case LOG_LEVEL_NONE:
230 return "None";
231 case LOG_LEVEL_ERR:
232 return "Errors";
233 case LOG_LEVEL_WARN:
234 return "Warnings";
235 case LOG_LEVEL_INFO:
236 return "Info";
237 case LOG_LEVEL_DBG:
238 return "Debug";
239 default:
240 return "N/A";
241 }
242}
243/** @} */
244/** @} */
Per-deployment MAC <-> nodeid mapping.
uint16_t deployment_id_from_iid(const uip_ipaddr_t *ipaddr)
Get node ID from the IID of an IPv6 address.
Definition deployment.c:115
uint16_t deployment_id_from_lladdr(const linkaddr_t *lladdr)
Get node ID from a link-layer address, from the deployment mapping table.
Definition deployment.c:82
bool linkaddr_cmp(const linkaddr_t *addr1, const linkaddr_t *addr2)
Compare two link-layer addresses.
Definition linkaddr.c:69
const linkaddr_t linkaddr_null
The null link-layer address.
void log_set_level(const char *module, int level)
Sets a log level at run-time.
Definition log.c:195
int log_6addr_compact_snprint(char *buf, size_t size, const uip_ipaddr_t *ipaddr)
Write at most size - 1 characters of the IP address to the output string, in a compact representation...
Definition log.c:103
void log_6addr_compact(const uip_ipaddr_t *ipaddr)
Logs an IPv6 address with a compact format.
Definition log.c:125
void log_lladdr(const linkaddr_t *lladdr)
Logs a link-layer address.
Definition log.c:134
void log_string(const char *text, size_t len)
Logs a string that has a length specified, but might not be zero-terminated.
Definition log.c:182
const char * log_level_to_str(int level)
Returns a textual description of a log level.
Definition log.c:226
void log_lladdr_compact(const linkaddr_t *lladdr)
Logs a link-layer address with a compact format.
Definition log.c:151
void log_6addr(const uip_ipaddr_t *ipaddr)
Logs an IPv6 address.
Definition log.c:95
int log_get_level(const char *module)
Returns the current log level.
Definition log.c:210
void log_bytes(const void *data, size_t length)
Logs a byte array as hex characters.
Definition log.c:169
int uiplib_ipaddr_snprint(char *buf, size_t size, const uip_ipaddr_t *addr)
Write at most size - 1 characters of the IP address to the output string.
Definition uiplib.c:182
#define uip_is_addr_mcast(a)
is address a multicast address, see RFC 4291 a is of type uip_ipaddr_t*
Definition uip.h:1860
#define uip_is_addr_linklocal(a)
is addr (a) a link local unicast address, see RFC 4291 i.e.
Definition uip.h:1766
#define UIP_HTONS(n)
Convert 16-bit quantity from host byte order to network byte order.
Definition uip.h:1157
Header file for the logging system.
static uip_ipaddr_t ipaddr
Pointer to prefix information option in uip_buf.
Definition uip-nd6.c:116
Header file for the IP address manipulation library.