]>
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.
27 #include <lib/log_int.h>
30 static const char * const procnames
[] = {
36 void vlog(int, const char *, va_list);
39 logit(int pri
, const char *fmt
, ...)
49 vlog(int pri
, const char *fmt
, va_list ap
)
53 switch (ldpd_process
) {
55 vsnprintf(buf
, sizeof(buf
), fmt
, ap
);
56 lde_imsg_compose_parent(IMSG_LOG
, pri
, buf
, strlen(buf
) + 1);
59 vsnprintf(buf
, sizeof(buf
), fmt
, ap
);
60 ldpe_imsg_compose_parent(IMSG_LOG
, pri
, buf
, strlen(buf
) + 1);
69 log_warn(const char *emsg
, ...)
74 /* best effort to even work in out of memory situations */
76 logit(LOG_CRIT
, "%s", strerror(errno
));
80 if (asprintf(&nfmt
, "%s: %s", emsg
, strerror(errno
)) == -1) {
82 vlog(LOG_CRIT
, emsg
, ap
);
83 logit(LOG_CRIT
, "%s", strerror(errno
));
85 vlog(LOG_CRIT
, nfmt
, ap
);
93 log_warnx(const char *emsg
, ...)
98 vlog(LOG_CRIT
, emsg
, ap
);
103 log_info(const char *emsg
, ...)
108 vlog(LOG_INFO
, emsg
, ap
);
113 log_notice(const char *emsg
, ...)
118 vlog(LOG_NOTICE
, emsg
, ap
);
123 log_debug(const char *emsg
, ...)
128 vlog(LOG_DEBUG
, emsg
, ap
);
133 fatal(const char *emsg
)
136 logit(LOG_CRIT
, "fatal in %s: %s", procnames
[ldpd_process
],
140 logit(LOG_CRIT
, "fatal in %s: %s: %s",
141 procnames
[ldpd_process
], emsg
, strerror(errno
));
143 logit(LOG_CRIT
, "fatal in %s: %s",
144 procnames
[ldpd_process
], emsg
);
150 fatalx(const char *emsg
)
158 log_sockaddr(void *vp
)
160 static char buf
[NUM_LOGS
][NI_MAXHOST
];
161 static int round
= 0;
162 struct sockaddr
*sa
= vp
;
164 round
= (round
+ 1) % NUM_LOGS
;
166 if (getnameinfo(sa
, sockaddr_len(sa
), buf
[round
], NI_MAXHOST
, NULL
, 0,
168 return ("(unknown)");
174 log_in6addr(const struct in6_addr
*addr
)
176 struct sockaddr_in6 sa_in6
;
178 memset(&sa_in6
, 0, sizeof(sa_in6
));
179 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
180 sa_in6
.sin6_len
= sizeof(sa_in6
);
182 sa_in6
.sin6_family
= AF_INET6
;
183 sa_in6
.sin6_addr
= *addr
;
185 recoverscope(&sa_in6
);
187 return (log_sockaddr(&sa_in6
));
191 log_in6addr_scope(const struct in6_addr
*addr
, unsigned int ifindex
)
193 struct sockaddr_in6 sa_in6
;
195 memset(&sa_in6
, 0, sizeof(sa_in6
));
196 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
197 sa_in6
.sin6_len
= sizeof(sa_in6
);
199 sa_in6
.sin6_family
= AF_INET6
;
200 sa_in6
.sin6_addr
= *addr
;
202 addscope(&sa_in6
, ifindex
);
204 return (log_sockaddr(&sa_in6
));
208 log_addr(int af
, const union ldpd_addr
*addr
)
210 static char buf
[NUM_LOGS
][INET6_ADDRSTRLEN
];
211 static int round
= 0;
215 round
= (round
+ 1) % NUM_LOGS
;
216 if (inet_ntop(AF_INET
, &addr
->v4
, buf
[round
],
217 sizeof(buf
[round
])) == NULL
)
221 return (log_in6addr(&addr
->v6
));
233 log_label(uint32_t label
)
236 static char tfbuf
[TF_BUFS
][TF_LEN
]; /* ring buffer */
245 snprintf(buf
, TF_LEN
, "-");
247 case MPLS_LABEL_IMPLNULL
:
248 snprintf(buf
, TF_LEN
, "imp-null");
250 case MPLS_LABEL_IPV4NULL
:
251 case MPLS_LABEL_IPV6NULL
:
252 snprintf(buf
, TF_LEN
, "exp-null");
255 snprintf(buf
, TF_LEN
, "%u", label
);
266 static char tfbuf
[TF_BUFS
][TF_LEN
]; /* ring buffer */
268 unsigned int sec
, min
, hrs
, day
, week
;
286 snprintf(buf
, TF_LEN
, "%02uw%01ud%02uh", week
, day
, hrs
);
288 snprintf(buf
, TF_LEN
, "%01ud%02uh%02um", day
, hrs
, min
);
290 snprintf(buf
, TF_LEN
, "%02u:%02u:%02u", hrs
, min
, sec
);
296 log_hello_src(const struct hello_source
*src
)
302 snprintf(buf
, sizeof(buf
), "iface %s",
303 src
->link
.ia
->iface
->name
);
306 snprintf(buf
, sizeof(buf
), "source %s",
307 log_addr(src
->target
->af
, &src
->target
->addr
));
315 log_map(const struct map
*map
)
317 static char buf
[128];
320 case MAP_TYPE_WILDCARD
:
321 if (snprintf(buf
, sizeof(buf
), "wildcard") < 0)
324 case MAP_TYPE_PREFIX
:
325 if (snprintf(buf
, sizeof(buf
), "%s/%u",
326 log_addr(map
->fec
.prefix
.af
, &map
->fec
.prefix
.prefix
),
327 map
->fec
.prefix
.prefixlen
) == -1)
331 if (snprintf(buf
, sizeof(buf
), "pw-id %u group-id %u (%s)",
332 map
->fec
.pwid
.pwid
, map
->fec
.pwid
.group_id
,
333 pw_type_name(map
->fec
.pwid
.type
)) == -1)
336 case MAP_TYPE_TYPED_WCARD
:
337 if (snprintf(buf
, sizeof(buf
), "typed wildcard") < 0)
339 switch (map
->fec
.twcard
.type
) {
340 case MAP_TYPE_PREFIX
:
341 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
342 strlen(buf
), " (prefix, address-family %s)",
343 af_name(map
->fec
.twcard
.u
.prefix_af
)) < 0)
347 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
348 strlen(buf
), " (pwid, type %s)",
349 pw_type_name(map
->fec
.twcard
.u
.pw_type
)) < 0)
353 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
354 strlen(buf
), " (unknown type)") < 0)
367 log_fec(const struct fec
*fec
)
370 union ldpd_addr addr
;
374 addr
.v4
= fec
->u
.ipv4
.prefix
;
375 if (snprintf(buf
, sizeof(buf
), "ipv4 %s/%u",
376 log_addr(AF_INET
, &addr
), fec
->u
.ipv4
.prefixlen
) == -1)
380 addr
.v6
= fec
->u
.ipv6
.prefix
;
381 if (snprintf(buf
, sizeof(buf
), "ipv6 %s/%u",
382 log_addr(AF_INET6
, &addr
), fec
->u
.ipv6
.prefixlen
) == -1)
386 if (snprintf(buf
, sizeof(buf
),
388 fec
->u
.pwid
.pwid
, pw_type_name(fec
->u
.pwid
.type
),
389 inet_ntoa(fec
->u
.pwid
.lsr_id
)) == -1)
418 socket_name(int type
)
421 case LDP_SOCKET_DISC
:
422 return ("discovery");
423 case LDP_SOCKET_EDISC
:
424 return ("extended discovery");
425 case LDP_SOCKET_SESSION
:
433 nbr_state_name(int state
)
436 case NBR_STA_PRESENT
:
438 case NBR_STA_INITIAL
:
439 return ("INITIALIZED");
440 case NBR_STA_OPENREC
:
442 case NBR_STA_OPENSENT
:
445 return ("OPERATIONAL");
452 if_state_name(int state
)
465 if_type_name(enum iface_type type
)
468 case IF_TYPE_POINTOPOINT
:
469 return ("POINTOPOINT");
470 case IF_TYPE_BROADCAST
:
471 return ("BROADCAST");
478 msg_name(uint16_t msg
)
483 case MSG_TYPE_NOTIFICATION
:
484 return ("notification");
488 return ("initialization");
489 case MSG_TYPE_KEEPALIVE
:
490 return ("keepalive");
491 case MSG_TYPE_CAPABILITY
:
492 return ("capability");
495 case MSG_TYPE_ADDRWITHDRAW
:
496 return ("address withdraw");
497 case MSG_TYPE_LABELMAPPING
:
498 return ("label mapping");
499 case MSG_TYPE_LABELREQUEST
:
500 return ("label request");
501 case MSG_TYPE_LABELWITHDRAW
:
502 return ("label withdraw");
503 case MSG_TYPE_LABELRELEASE
:
504 return ("label release");
505 case MSG_TYPE_LABELABORTREQ
:
507 snprintf(buf
, sizeof(buf
), "[%08x]", msg
);
513 status_code_name(uint32_t status
)
521 return ("Bad LDP Identifier");
522 case S_BAD_PROTO_VER
:
523 return ("Bad Protocol Version");
525 return ("Bad PDU Length");
527 return ("Unknown Message Type");
529 return ("Bad Message Length");
531 return ("Unknown TLV");
533 return ("Bad TLV Length");
535 return ("Malformed TLV Value");
537 return ("Hold Timer Expired");
540 case S_LOOP_DETECTED
:
541 return ("Loop Detected");
543 return ("Unknown FEC");
547 return ("No Label Resources");
549 return ("Label Resources Available");
551 return ("Session Rejected, No Hello");
552 case S_PARM_ADV_MODE
:
553 return ("Rejected Advertisement Mode Parameter");
555 return ("Rejected Max PDU Length Parameter");
557 return ("Rejected Label Range Parameter");
558 case S_KEEPALIVE_TMR
:
559 return ("KeepAlive Timer Expired");
561 return ("Label Request Aborted");
563 return ("Missing Message Parameters");
565 return ("Unsupported Address Family");
566 case S_KEEPALIVE_BAD
:
567 return ("Bad KeepAlive Time");
569 return ("Internal Error");
571 return ("Illegal C-Bit");
573 return ("Wrong C-Bit");
574 case S_INCPT_BITRATE
:
575 return ("Incompatible bit-rate");
577 return ("CEP-TDM mis-configuration");
579 return ("PW Status");
581 return ("Unassigned/Unrecognized TAI");
583 return ("Generic Misconfiguration Error");
584 case S_WITHDRAW_MTHD
:
585 return ("Label Withdraw PW Status Method");
586 case S_UNSSUPORTDCAP
:
587 return ("Unsupported Capability");
589 return ("End-of-LIB");
590 case S_TRANS_MISMTCH
:
591 return ("Transport Connection Mismatch");
592 case S_DS_NONCMPLNCE
:
593 return ("Dual-Stack Noncompliance");
595 snprintf(buf
, sizeof(buf
), "[%08x]", status
);
601 pw_type_name(uint16_t pw_type
)
606 case PW_TYPE_ETHERNET_TAGGED
:
607 return ("Eth Tagged");
608 case PW_TYPE_ETHERNET
:
610 case PW_TYPE_WILDCARD
:
613 snprintf(buf
, sizeof(buf
), "[%0x]", pw_type
);