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_snmp = LOG_CONF_LEVEL_SNMP;
66int curr_log_level_lwm2m = LOG_CONF_LEVEL_LWM2M;
67int curr_log_level_sys = LOG_CONF_LEVEL_SYS;
68int curr_log_level_main = LOG_CONF_LEVEL_MAIN;
69
70struct log_module all_modules[] = {
71 {"rpl", &curr_log_level_rpl, LOG_CONF_LEVEL_RPL},
72 {"tcpip", &curr_log_level_tcpip, LOG_CONF_LEVEL_TCPIP},
73 {"ipv6", &curr_log_level_ipv6, LOG_CONF_LEVEL_IPV6},
74 {"6lowpan", &curr_log_level_6lowpan, LOG_CONF_LEVEL_6LOWPAN},
75 {"nullnet", &curr_log_level_nullnet, LOG_CONF_LEVEL_NULLNET},
76 {"mac", &curr_log_level_mac, LOG_CONF_LEVEL_MAC},
77 {"framer", &curr_log_level_framer, LOG_CONF_LEVEL_FRAMER},
78 {"6top", &curr_log_level_6top, LOG_CONF_LEVEL_6TOP},
79 {"coap", &curr_log_level_coap, LOG_CONF_LEVEL_COAP},
80 {"snmp", &curr_log_level_snmp, LOG_CONF_LEVEL_SNMP},
81 {"lwm2m", &curr_log_level_lwm2m, LOG_CONF_LEVEL_LWM2M},
82 {"sys", &curr_log_level_sys, LOG_CONF_LEVEL_SYS},
83 {"main", &curr_log_level_main, LOG_CONF_LEVEL_MAIN},
84 {NULL, NULL, 0},
85};
86
87#if NETSTACK_CONF_WITH_IPV6
88
89/*---------------------------------------------------------------------------*/
90void
91log_6addr(const uip_ipaddr_t *ipaddr)
92{
93 char buf[UIPLIB_IPV6_MAX_STR_LEN];
94 uiplib_ipaddr_snprint(buf, sizeof(buf), ipaddr);
95 LOG_OUTPUT("%s", buf);
96}
97/*---------------------------------------------------------------------------*/
98int
99log_6addr_compact_snprint(char *buf, size_t size, const uip_ipaddr_t *ipaddr)
100{
101 if(ipaddr == NULL) {
102 return snprintf(buf, size, "6A-NULL");
103 } else {
104 char *prefix = NULL;
106 prefix = "6M";
107 } else if(uip_is_addr_linklocal(ipaddr)) {
108 prefix = "6L";
109 } else {
110 prefix = "6G";
111 }
112#if BUILD_WITH_DEPLOYMENT
113 return snprintf(buf, size, "%s-%03u", prefix, deployment_id_from_iid(ipaddr));
114#else /* BUILD_WITH_DEPLOYMENT */
115 return snprintf(buf, size, "%s-%04x", prefix, UIP_HTONS(ipaddr->u16[sizeof(uip_ipaddr_t)/2-1]));
116#endif /* BUILD_WITH_DEPLOYMENT */
117 }
118}
119/*---------------------------------------------------------------------------*/
120void
121log_6addr_compact(const uip_ipaddr_t *ipaddr)
122{
123 char buf[8];
124 log_6addr_compact_snprint(buf, sizeof(buf), ipaddr);
125 LOG_OUTPUT("%s", buf);
126}
127#endif /* NETSTACK_CONF_WITH_IPV6 */
128/*---------------------------------------------------------------------------*/
129void
130log_lladdr(const linkaddr_t *lladdr)
131{
132 if(lladdr == NULL) {
133 LOG_OUTPUT("(NULL LL addr)");
134 return;
135 } else {
136 unsigned int i;
137 for(i = 0; i < LINKADDR_SIZE; i++) {
138 if(i > 0 && i % 2 == 0) {
139 LOG_OUTPUT(".");
140 }
141 LOG_OUTPUT("%02x", lladdr->u8[i]);
142 }
143 }
144}
145/*---------------------------------------------------------------------------*/
146void
147log_lladdr_compact(const linkaddr_t *lladdr)
148{
149 if(lladdr == NULL || linkaddr_cmp(lladdr, &linkaddr_null)) {
150 LOG_OUTPUT("LL-NULL");
151 } else {
152#if BUILD_WITH_DEPLOYMENT
153 LOG_OUTPUT("LL-%04u", deployment_id_from_lladdr(lladdr));
154#else /* BUILD_WITH_DEPLOYMENT */
155#if LINKADDR_SIZE == 8
156 LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16[LINKADDR_SIZE/2-1]));
157#elif LINKADDR_SIZE == 2
158 LOG_OUTPUT("LL-%04x", UIP_HTONS(lladdr->u16));
159#endif
160#endif /* BUILD_WITH_DEPLOYMENT */
161 }
162}
163/*---------------------------------------------------------------------------*/
164void
165log_bytes(const void *data, size_t length)
166{
167 const uint8_t *u8data = (const uint8_t *)data;
168 size_t i;
169 for(i = 0; i != length; ++i) {
170 LOG_OUTPUT("%02x", u8data[i]);
171 }
172}
173/*---------------------------------------------------------------------------*/
174void
175log_set_level(const char *module, int level)
176{
177 if(level >= LOG_LEVEL_NONE && level <= LOG_LEVEL_DBG) {
178 int i = 0;
179 int module_all = !strcmp("all", module);
180 while(all_modules[i].name != NULL) {
181 if(module_all || !strcmp(module, all_modules[i].name)) {
182 *all_modules[i].curr_log_level = MIN(level, all_modules[i].max_log_level);
183 }
184 i++;
185 }
186 }
187}
188/*---------------------------------------------------------------------------*/
189int
190log_get_level(const char *module)
191{
192 int i = 0;
193 if(module == NULL) {
194 return -1;
195 }
196 while(all_modules[i].name != NULL) {
197 if(!strcmp(module, all_modules[i].name)) {
198 return *all_modules[i].curr_log_level;
199 }
200 i++;
201 }
202 return -1;
203}
204/*---------------------------------------------------------------------------*/
205const char *
207{
208 switch(level) {
209 case LOG_LEVEL_NONE:
210 return "None";
211 case LOG_LEVEL_ERR:
212 return "Errors";
213 case LOG_LEVEL_WARN:
214 return "Warnings";
215 case LOG_LEVEL_INFO:
216 return "Info";
217 case LOG_LEVEL_DBG:
218 return "Debug";
219 default:
220 return "N/A";
221 }
222}
223/** @} */
224/** @} */
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:175
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:99
void log_6addr_compact(const uip_ipaddr_t *ipaddr)
Logs an IPv6 address with a compact format.
Definition log.c:121
void log_lladdr(const linkaddr_t *lladdr)
Logs a link-layer address.
Definition log.c:130
const char * log_level_to_str(int level)
Returns a textual description of a log level.
Definition log.c:206
void log_lladdr_compact(const linkaddr_t *lladdr)
Logs a link-layer address with a compact format.
Definition log.c:147
void log_6addr(const uip_ipaddr_t *ipaddr)
Logs an IPv6 address.
Definition log.c:91
int log_get_level(const char *module)
Returns the current log level.
Definition log.c:190
void log_bytes(const void *data, size_t length)
Logs a byte array as hex characters.
Definition log.c:165
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:166
#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.