]>
git.proxmox.com Git - mirror_frr.git/blob - ldpd/log.c
4 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <arpa/inet.h>
22 #include <netmpls/mpls.h>
37 static const char * const procnames
[] = {
43 static void vlog(int, const char *, va_list);
51 extern char *__progname
;
56 openlog(__progname
, LOG_PID
| LOG_NDELAY
, LOG_DAEMON
);
68 logit(int pri
, const char *fmt
, ...)
78 vlog(int pri
, const char *fmt
, va_list ap
)
83 /* best effort in out of mem situations */
84 if (asprintf(&nfmt
, "%s\n", fmt
) == -1) {
85 vfprintf(stderr
, fmt
, ap
);
86 fprintf(stderr
, "\n");
88 vfprintf(stderr
, nfmt
, ap
);
93 vsyslog(pri
, fmt
, ap
);
97 log_warn(const char *emsg
, ...)
102 /* best effort to even work in out of memory situations */
104 logit(LOG_CRIT
, "%s", strerror(errno
));
108 if (asprintf(&nfmt
, "%s: %s", emsg
, strerror(errno
)) == -1) {
110 vlog(LOG_CRIT
, emsg
, ap
);
111 logit(LOG_CRIT
, "%s", strerror(errno
));
113 vlog(LOG_CRIT
, nfmt
, ap
);
121 log_warnx(const char *emsg
, ...)
126 vlog(LOG_CRIT
, emsg
, ap
);
131 log_info(const char *emsg
, ...)
136 vlog(LOG_INFO
, emsg
, ap
);
141 log_debug(const char *emsg
, ...)
145 if (verbose
& LDPD_OPT_VERBOSE
) {
147 vlog(LOG_DEBUG
, emsg
, ap
);
153 fatal(const char *emsg
)
156 logit(LOG_CRIT
, "fatal in %s: %s", procnames
[ldpd_process
],
160 logit(LOG_CRIT
, "fatal in %s: %s: %s",
161 procnames
[ldpd_process
], emsg
, strerror(errno
));
163 logit(LOG_CRIT
, "fatal in %s: %s",
164 procnames
[ldpd_process
], emsg
);
170 fatalx(const char *emsg
)
178 log_sockaddr(void *vp
)
180 static char buf
[NUM_LOGS
][NI_MAXHOST
];
181 static int round
= 0;
182 struct sockaddr
*sa
= vp
;
184 round
= (round
+ 1) % NUM_LOGS
;
186 if (getnameinfo(sa
, sa
->sa_len
, buf
[round
], NI_MAXHOST
, NULL
, 0,
188 return ("(unknown)");
194 log_in6addr(const struct in6_addr
*addr
)
196 struct sockaddr_in6 sa_in6
;
198 memset(&sa_in6
, 0, sizeof(sa_in6
));
199 sa_in6
.sin6_len
= sizeof(sa_in6
);
200 sa_in6
.sin6_family
= AF_INET6
;
201 sa_in6
.sin6_addr
= *addr
;
203 recoverscope(&sa_in6
);
205 return (log_sockaddr(&sa_in6
));
209 log_in6addr_scope(const struct in6_addr
*addr
, unsigned int ifindex
)
211 struct sockaddr_in6 sa_in6
;
213 memset(&sa_in6
, 0, sizeof(sa_in6
));
214 sa_in6
.sin6_len
= sizeof(sa_in6
);
215 sa_in6
.sin6_family
= AF_INET6
;
216 sa_in6
.sin6_addr
= *addr
;
218 addscope(&sa_in6
, ifindex
);
220 return (log_sockaddr(&sa_in6
));
224 log_addr(int af
, const union ldpd_addr
*addr
)
226 static char buf
[NUM_LOGS
][INET6_ADDRSTRLEN
];
227 static int round
= 0;
231 round
= (round
+ 1) % NUM_LOGS
;
232 if (inet_ntop(AF_INET
, &addr
->v4
, buf
[round
],
233 sizeof(buf
[round
])) == NULL
)
237 return (log_in6addr(&addr
->v6
));
249 log_label(uint32_t label
)
252 static char tfbuf
[TF_BUFS
][TF_LEN
]; /* ring buffer */
261 snprintf(buf
, TF_LEN
, "-");
263 case MPLS_LABEL_IMPLNULL
:
264 snprintf(buf
, TF_LEN
, "imp-null");
266 case MPLS_LABEL_IPV4NULL
:
267 case MPLS_LABEL_IPV6NULL
:
268 snprintf(buf
, TF_LEN
, "exp-null");
271 snprintf(buf
, TF_LEN
, "%u", label
);
279 log_hello_src(const struct hello_source
*src
)
285 snprintf(buf
, sizeof(buf
), "iface %s",
286 src
->link
.ia
->iface
->name
);
289 snprintf(buf
, sizeof(buf
), "source %s",
290 log_addr(src
->target
->af
, &src
->target
->addr
));
298 log_map(const struct map
*map
)
303 case MAP_TYPE_WILDCARD
:
304 if (snprintf(buf
, sizeof(buf
), "wildcard") < 0)
307 case MAP_TYPE_PREFIX
:
308 if (snprintf(buf
, sizeof(buf
), "%s/%u",
309 log_addr(map
->fec
.prefix
.af
, &map
->fec
.prefix
.prefix
),
310 map
->fec
.prefix
.prefixlen
) == -1)
314 if (snprintf(buf
, sizeof(buf
), "pwid %u (%s)",
316 pw_type_name(map
->fec
.pwid
.type
)) == -1)
327 log_fec(const struct fec
*fec
)
330 union ldpd_addr addr
;
334 addr
.v4
= fec
->u
.ipv4
.prefix
;
335 if (snprintf(buf
, sizeof(buf
), "ipv4 %s/%u",
336 log_addr(AF_INET
, &addr
), fec
->u
.ipv4
.prefixlen
) == -1)
340 addr
.v6
= fec
->u
.ipv6
.prefix
;
341 if (snprintf(buf
, sizeof(buf
), "ipv6 %s/%u",
342 log_addr(AF_INET6
, &addr
), fec
->u
.ipv6
.prefixlen
) == -1)
346 if (snprintf(buf
, sizeof(buf
),
348 fec
->u
.pwid
.pwid
, pw_type_name(fec
->u
.pwid
.type
),
349 inet_ntoa(fec
->u
.pwid
.lsr_id
)) == -1)
376 socket_name(int type
)
379 case LDP_SOCKET_DISC
:
380 return ("discovery");
381 case LDP_SOCKET_EDISC
:
382 return ("extended discovery");
383 case LDP_SOCKET_SESSION
:
391 nbr_state_name(int state
)
394 case NBR_STA_PRESENT
:
396 case NBR_STA_INITIAL
:
397 return ("INITIALIZED");
398 case NBR_STA_OPENREC
:
400 case NBR_STA_OPENSENT
:
403 return ("OPERATIONAL");
410 if_state_name(int state
)
423 if_type_name(enum iface_type type
)
426 case IF_TYPE_POINTOPOINT
:
427 return ("POINTOPOINT");
428 case IF_TYPE_BROADCAST
:
429 return ("BROADCAST");
436 msg_name(uint16_t msg
)
441 case MSG_TYPE_NOTIFICATION
:
442 return ("notification");
446 return ("initialization");
447 case MSG_TYPE_KEEPALIVE
:
448 return ("keepalive");
451 case MSG_TYPE_ADDRWITHDRAW
:
452 return ("address withdraw");
453 case MSG_TYPE_LABELMAPPING
:
454 return ("label mapping");
455 case MSG_TYPE_LABELREQUEST
:
456 return ("label request");
457 case MSG_TYPE_LABELWITHDRAW
:
458 return ("label withdraw");
459 case MSG_TYPE_LABELRELEASE
:
460 return ("label release");
461 case MSG_TYPE_LABELABORTREQ
:
463 snprintf(buf
, sizeof(buf
), "[%08x]", msg
);
469 status_code_name(uint32_t status
)
477 return ("Bad LDP Identifier");
478 case S_BAD_PROTO_VER
:
479 return ("Bad Protocol Version");
481 return ("Bad PDU Length");
483 return ("Unknown Message Type");
485 return ("Bad Message Length");
487 return ("Unknown TLV");
489 return ("Bad TLV Length");
491 return ("Malformed TLV Value");
493 return ("Hold Timer Expired");
496 case S_LOOP_DETECTED
:
497 return ("Loop Detected");
499 return ("Unknown FEC");
503 return ("No Label Resources");
505 return ("Label Resources Available");
507 return ("Session Rejected, No Hello");
508 case S_PARM_ADV_MODE
:
509 return ("Rejected Advertisement Mode Parameter");
511 return ("Rejected Max PDU Length Parameter");
513 return ("Rejected Label Range Parameter");
514 case S_KEEPALIVE_TMR
:
515 return ("KeepAlive Timer Expired");
517 return ("Label Request Aborted");
519 return ("Missing Message Parameters");
521 return ("Unsupported Address Family");
522 case S_KEEPALIVE_BAD
:
523 return ("Bad KeepAlive Time");
525 return ("Internal Error");
527 return ("Illegal C-Bit");
529 return ("Wrong C-Bit");
530 case S_INCPT_BITRATE
:
531 return ("Incompatible bit-rate");
533 return ("CEP-TDM mis-configuration");
535 return ("PW Status");
537 return ("Unassigned/Unrecognized TAI");
539 return ("Generic Misconfiguration Error");
540 case S_WITHDRAW_MTHD
:
541 return ("Label Withdraw PW Status Method");
542 case S_TRANS_MISMTCH
:
543 return ("Transport Connection Mismatch");
544 case S_DS_NONCMPLNCE
:
545 return ("Dual-Stack Noncompliance");
547 snprintf(buf
, sizeof(buf
), "[%08x]", status
);
553 pw_type_name(uint16_t pw_type
)
558 case PW_TYPE_ETHERNET_TAGGED
:
559 return ("Eth Tagged");
560 case PW_TYPE_ETHERNET
:
563 snprintf(buf
, sizeof(buf
), "[%0x]", pw_type
);
568 static char *msgtypes
[] = {
570 "RTM_ADD: Add Route",
571 "RTM_DELETE: Delete Route",
572 "RTM_CHANGE: Change Metrics or flags",
573 "RTM_GET: Report Metrics",
574 "RTM_LOSING: Kernel Suspects Partitioning",
575 "RTM_REDIRECT: Told to use different route",
576 "RTM_MISS: Lookup failed on this address",
577 "RTM_LOCK: fix specified metrics",
578 "RTM_OLDADD: caused by SIOCADDRT",
579 "RTM_OLDDEL: caused by SIOCDELRT",
580 "RTM_RESOLVE: Route created by cloning",
581 "RTM_NEWADDR: address being added to iface",
582 "RTM_DELADDR: address being removed from iface",
583 "RTM_IFINFO: iface status change",
584 "RTM_IFANNOUNCE: iface arrival/departure",
585 "RTM_DESYNC: route socket overflow",
589 log_rtmsg(unsigned char rtm_type
)
591 if (!(verbose
& LDPD_OPT_VERBOSE2
))
595 rtm_type
< sizeof(msgtypes
)/sizeof(msgtypes
[0]))
596 log_debug("kernel message: %s", msgtypes
[rtm_type
]);
598 log_debug("kernel message: rtm_type %d out of range",