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.
20 #include "lib/printfrr.h"
30 log_sockaddr(void *vp
)
32 static char buf
[NUM_LOGS
][NI_MAXHOST
];
34 struct sockaddr
*sa
= vp
;
36 round
= (round
+ 1) % NUM_LOGS
;
38 if (getnameinfo(sa
, sockaddr_len(sa
), buf
[round
], NI_MAXHOST
, NULL
, 0,
46 log_in6addr(const struct in6_addr
*addr
)
48 struct sockaddr_in6 sa_in6
;
50 memset(&sa_in6
, 0, sizeof(sa_in6
));
51 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
52 sa_in6
.sin6_len
= sizeof(sa_in6
);
54 sa_in6
.sin6_family
= AF_INET6
;
55 sa_in6
.sin6_addr
= *addr
;
57 recoverscope(&sa_in6
);
59 return (log_sockaddr(&sa_in6
));
63 log_in6addr_scope(const struct in6_addr
*addr
, ifindex_t ifindex
)
65 struct sockaddr_in6 sa_in6
;
67 memset(&sa_in6
, 0, sizeof(sa_in6
));
68 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
69 sa_in6
.sin6_len
= sizeof(sa_in6
);
71 sa_in6
.sin6_family
= AF_INET6
;
72 sa_in6
.sin6_addr
= *addr
;
74 addscope(&sa_in6
, ifindex
);
76 return (log_sockaddr(&sa_in6
));
80 log_addr(int af
, const union ldpd_addr
*addr
)
82 static char buf
[NUM_LOGS
][INET6_ADDRSTRLEN
];
87 round
= (round
+ 1) % NUM_LOGS
;
88 if (inet_ntop(AF_INET
, &addr
->v4
, buf
[round
],
89 sizeof(buf
[round
])) == NULL
)
93 return (log_in6addr(&addr
->v6
));
105 log_label(uint32_t label
)
108 static char tfbuf
[TF_BUFS
][TF_LEN
]; /* ring buffer */
117 snprintf(buf
, TF_LEN
, "-");
119 case MPLS_LABEL_IMPLICIT_NULL
:
120 snprintf(buf
, TF_LEN
, "imp-null");
122 case MPLS_LABEL_IPV4_EXPLICIT_NULL
:
123 case MPLS_LABEL_IPV6_EXPLICIT_NULL
:
124 snprintf(buf
, TF_LEN
, "exp-null");
127 snprintf(buf
, TF_LEN
, "%u", label
);
138 static char tfbuf
[TF_BUFS
][TF_LEN
]; /* ring buffer */
140 uint64_t sec
, min
, hrs
, day
, week
;
158 snprintfrr(buf
, TF_LEN
,
159 "%02" PRIu64
"w%01" PRIu64
"d%02" PRIu64
"h", week
,
162 snprintfrr(buf
, TF_LEN
,
163 "%01" PRIu64
"d%02" PRIu64
"h%02" PRIu64
"m", day
,
166 snprintfrr(buf
, TF_LEN
,
167 "%02" PRIu64
":%02" PRIu64
":%02" PRIu64
, hrs
, min
,
174 log_hello_src(const struct hello_source
*src
)
180 snprintf(buf
, sizeof(buf
), "iface %s",
181 src
->link
.ia
->iface
->name
);
184 snprintf(buf
, sizeof(buf
), "source %s",
185 log_addr(src
->target
->af
, &src
->target
->addr
));
193 log_map(const struct map
*map
)
195 static char buf
[128];
198 case MAP_TYPE_WILDCARD
:
199 if (snprintf(buf
, sizeof(buf
), "wildcard") < 0)
202 case MAP_TYPE_PREFIX
:
203 if (snprintf(buf
, sizeof(buf
), "%s/%u",
204 log_addr(map
->fec
.prefix
.af
, &map
->fec
.prefix
.prefix
),
205 map
->fec
.prefix
.prefixlen
) == -1)
209 if (snprintf(buf
, sizeof(buf
), "pw-id %u group-id %u (%s)",
210 map
->fec
.pwid
.pwid
, map
->fec
.pwid
.group_id
,
211 pw_type_name(map
->fec
.pwid
.type
)) == -1)
214 case MAP_TYPE_TYPED_WCARD
:
215 if (snprintf(buf
, sizeof(buf
), "typed wildcard") < 0)
217 switch (map
->fec
.twcard
.type
) {
218 case MAP_TYPE_PREFIX
:
219 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
220 strlen(buf
), " (prefix, address-family %s)",
221 af_name(map
->fec
.twcard
.u
.prefix_af
)) < 0)
225 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
226 strlen(buf
), " (pwid, type %s)",
227 pw_type_name(map
->fec
.twcard
.u
.pw_type
)) < 0)
231 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
232 strlen(buf
), " (unknown type)") < 0)
245 log_fec(const struct fec
*fec
)
248 union ldpd_addr addr
;
252 addr
.v4
= fec
->u
.ipv4
.prefix
;
253 if (snprintf(buf
, sizeof(buf
), "ipv4 %s/%u",
254 log_addr(AF_INET
, &addr
), fec
->u
.ipv4
.prefixlen
) == -1)
258 addr
.v6
= fec
->u
.ipv6
.prefix
;
259 if (snprintf(buf
, sizeof(buf
), "ipv6 %s/%u",
260 log_addr(AF_INET6
, &addr
), fec
->u
.ipv6
.prefixlen
) == -1)
264 if (snprintfrr(buf
, sizeof(buf
),
265 "pwid %u (%s) - %pI4",
266 fec
->u
.pwid
.pwid
, pw_type_name(fec
->u
.pwid
.type
),
267 &fec
->u
.pwid
.lsr_id
) == -1)
296 socket_name(int type
)
299 case LDP_SOCKET_DISC
:
300 return ("discovery");
301 case LDP_SOCKET_EDISC
:
302 return ("extended discovery");
303 case LDP_SOCKET_SESSION
:
311 nbr_state_name(int state
)
314 case NBR_STA_PRESENT
:
316 case NBR_STA_INITIAL
:
317 return ("INITIALIZED");
318 case NBR_STA_OPENREC
:
320 case NBR_STA_OPENSENT
:
323 return ("OPERATIONAL");
330 if_state_name(int state
)
343 if_type_name(enum iface_type type
)
346 case IF_TYPE_POINTOPOINT
:
347 return ("POINTOPOINT");
348 case IF_TYPE_BROADCAST
:
349 return ("BROADCAST");
356 msg_name(uint16_t msg
)
361 case MSG_TYPE_NOTIFICATION
:
362 return ("notification");
366 return ("initialization");
367 case MSG_TYPE_KEEPALIVE
:
368 return ("keepalive");
369 case MSG_TYPE_CAPABILITY
:
370 return ("capability");
373 case MSG_TYPE_ADDRWITHDRAW
:
374 return ("address withdraw");
375 case MSG_TYPE_LABELMAPPING
:
376 return ("label mapping");
377 case MSG_TYPE_LABELREQUEST
:
378 return ("label request");
379 case MSG_TYPE_LABELWITHDRAW
:
380 return ("label withdraw");
381 case MSG_TYPE_LABELRELEASE
:
382 return ("label release");
383 case MSG_TYPE_LABELABORTREQ
:
385 snprintf(buf
, sizeof(buf
), "[%08x]", msg
);
391 status_code_name(uint32_t status
)
399 return ("Bad LDP Identifier");
400 case S_BAD_PROTO_VER
:
401 return ("Bad Protocol Version");
403 return ("Bad PDU Length");
405 return ("Unknown Message Type");
407 return ("Bad Message Length");
409 return ("Unknown TLV");
411 return ("Bad TLV Length");
413 return ("Malformed TLV Value");
415 return ("Hold Timer Expired");
418 case S_LOOP_DETECTED
:
419 return ("Loop Detected");
421 return ("Unknown FEC");
425 return ("No Label Resources");
427 return ("Label Resources Available");
429 return ("Session Rejected, No Hello");
430 case S_PARM_ADV_MODE
:
431 return ("Rejected Advertisement Mode Parameter");
433 return ("Rejected Max PDU Length Parameter");
435 return ("Rejected Label Range Parameter");
436 case S_KEEPALIVE_TMR
:
437 return ("KeepAlive Timer Expired");
439 return ("Label Request Aborted");
441 return ("Missing Message Parameters");
443 return ("Unsupported Address Family");
444 case S_KEEPALIVE_BAD
:
445 return ("Bad KeepAlive Time");
447 return ("Internal Error");
449 return ("Illegal C-Bit");
451 return ("Wrong C-Bit");
452 case S_INCPT_BITRATE
:
453 return ("Incompatible bit-rate");
455 return ("CEP-TDM mis-configuration");
457 return ("PW Status");
459 return ("Unassigned/Unrecognized TAI");
461 return ("Generic Misconfiguration Error");
462 case S_WITHDRAW_MTHD
:
463 return ("Label Withdraw PW Status Method");
464 case S_UNSSUPORTDCAP
:
465 return ("Unsupported Capability");
467 return ("End-of-LIB");
468 case S_TRANS_MISMTCH
:
469 return ("Transport Connection Mismatch");
470 case S_DS_NONCMPLNCE
:
471 return ("Dual-Stack Noncompliance");
473 snprintf(buf
, sizeof(buf
), "[%08x]", status
);
479 pw_type_name(uint16_t pw_type
)
484 case PW_TYPE_ETHERNET_TAGGED
:
485 return ("Eth Tagged");
486 case PW_TYPE_ETHERNET
:
488 case PW_TYPE_WILDCARD
:
491 snprintf(buf
, sizeof(buf
), "[%0x]", pw_type
);
497 pw_error_code(uint8_t status
)
504 case F_PW_LOCAL_NOT_FWD
:
505 return ("local not forwarding");
506 case F_PW_REMOTE_NOT_FWD
:
507 return ("remote not forwarding");
508 case F_PW_NO_REMOTE_LABEL
:
509 return ("no remote label");
510 case F_PW_MTU_MISMATCH
:
511 return ("mtu mismatch between peers");
513 snprintf(buf
, sizeof(buf
), "[%0x]", status
);