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 unsigned int sec
, min
, hrs
, day
, week
;
158 snprintf(buf
, TF_LEN
, "%02uw%01ud%02uh", week
, day
, hrs
);
160 snprintf(buf
, TF_LEN
, "%01ud%02uh%02um", day
, hrs
, min
);
162 snprintf(buf
, TF_LEN
, "%02u:%02u:%02u", hrs
, min
, sec
);
168 log_hello_src(const struct hello_source
*src
)
174 snprintf(buf
, sizeof(buf
), "iface %s",
175 src
->link
.ia
->iface
->name
);
178 snprintf(buf
, sizeof(buf
), "source %s",
179 log_addr(src
->target
->af
, &src
->target
->addr
));
187 log_map(const struct map
*map
)
189 static char buf
[128];
192 case MAP_TYPE_WILDCARD
:
193 if (snprintf(buf
, sizeof(buf
), "wildcard") < 0)
196 case MAP_TYPE_PREFIX
:
197 if (snprintf(buf
, sizeof(buf
), "%s/%u",
198 log_addr(map
->fec
.prefix
.af
, &map
->fec
.prefix
.prefix
),
199 map
->fec
.prefix
.prefixlen
) == -1)
203 if (snprintf(buf
, sizeof(buf
), "pw-id %u group-id %u (%s)",
204 map
->fec
.pwid
.pwid
, map
->fec
.pwid
.group_id
,
205 pw_type_name(map
->fec
.pwid
.type
)) == -1)
208 case MAP_TYPE_TYPED_WCARD
:
209 if (snprintf(buf
, sizeof(buf
), "typed wildcard") < 0)
211 switch (map
->fec
.twcard
.type
) {
212 case MAP_TYPE_PREFIX
:
213 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
214 strlen(buf
), " (prefix, address-family %s)",
215 af_name(map
->fec
.twcard
.u
.prefix_af
)) < 0)
219 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
220 strlen(buf
), " (pwid, type %s)",
221 pw_type_name(map
->fec
.twcard
.u
.pw_type
)) < 0)
225 if (snprintf(buf
+ strlen(buf
), sizeof(buf
) -
226 strlen(buf
), " (unknown type)") < 0)
239 log_fec(const struct fec
*fec
)
242 union ldpd_addr addr
;
246 addr
.v4
= fec
->u
.ipv4
.prefix
;
247 if (snprintf(buf
, sizeof(buf
), "ipv4 %s/%u",
248 log_addr(AF_INET
, &addr
), fec
->u
.ipv4
.prefixlen
) == -1)
252 addr
.v6
= fec
->u
.ipv6
.prefix
;
253 if (snprintf(buf
, sizeof(buf
), "ipv6 %s/%u",
254 log_addr(AF_INET6
, &addr
), fec
->u
.ipv6
.prefixlen
) == -1)
258 if (snprintfrr(buf
, sizeof(buf
),
259 "pwid %u (%s) - %pI4",
260 fec
->u
.pwid
.pwid
, pw_type_name(fec
->u
.pwid
.type
),
261 &fec
->u
.pwid
.lsr_id
) == -1)
290 socket_name(int type
)
293 case LDP_SOCKET_DISC
:
294 return ("discovery");
295 case LDP_SOCKET_EDISC
:
296 return ("extended discovery");
297 case LDP_SOCKET_SESSION
:
305 nbr_state_name(int state
)
308 case NBR_STA_PRESENT
:
310 case NBR_STA_INITIAL
:
311 return ("INITIALIZED");
312 case NBR_STA_OPENREC
:
314 case NBR_STA_OPENSENT
:
317 return ("OPERATIONAL");
324 if_state_name(int state
)
337 if_type_name(enum iface_type type
)
340 case IF_TYPE_POINTOPOINT
:
341 return ("POINTOPOINT");
342 case IF_TYPE_BROADCAST
:
343 return ("BROADCAST");
350 msg_name(uint16_t msg
)
355 case MSG_TYPE_NOTIFICATION
:
356 return ("notification");
360 return ("initialization");
361 case MSG_TYPE_KEEPALIVE
:
362 return ("keepalive");
363 case MSG_TYPE_CAPABILITY
:
364 return ("capability");
367 case MSG_TYPE_ADDRWITHDRAW
:
368 return ("address withdraw");
369 case MSG_TYPE_LABELMAPPING
:
370 return ("label mapping");
371 case MSG_TYPE_LABELREQUEST
:
372 return ("label request");
373 case MSG_TYPE_LABELWITHDRAW
:
374 return ("label withdraw");
375 case MSG_TYPE_LABELRELEASE
:
376 return ("label release");
377 case MSG_TYPE_LABELABORTREQ
:
379 snprintf(buf
, sizeof(buf
), "[%08x]", msg
);
385 status_code_name(uint32_t status
)
393 return ("Bad LDP Identifier");
394 case S_BAD_PROTO_VER
:
395 return ("Bad Protocol Version");
397 return ("Bad PDU Length");
399 return ("Unknown Message Type");
401 return ("Bad Message Length");
403 return ("Unknown TLV");
405 return ("Bad TLV Length");
407 return ("Malformed TLV Value");
409 return ("Hold Timer Expired");
412 case S_LOOP_DETECTED
:
413 return ("Loop Detected");
415 return ("Unknown FEC");
419 return ("No Label Resources");
421 return ("Label Resources Available");
423 return ("Session Rejected, No Hello");
424 case S_PARM_ADV_MODE
:
425 return ("Rejected Advertisement Mode Parameter");
427 return ("Rejected Max PDU Length Parameter");
429 return ("Rejected Label Range Parameter");
430 case S_KEEPALIVE_TMR
:
431 return ("KeepAlive Timer Expired");
433 return ("Label Request Aborted");
435 return ("Missing Message Parameters");
437 return ("Unsupported Address Family");
438 case S_KEEPALIVE_BAD
:
439 return ("Bad KeepAlive Time");
441 return ("Internal Error");
443 return ("Illegal C-Bit");
445 return ("Wrong C-Bit");
446 case S_INCPT_BITRATE
:
447 return ("Incompatible bit-rate");
449 return ("CEP-TDM mis-configuration");
451 return ("PW Status");
453 return ("Unassigned/Unrecognized TAI");
455 return ("Generic Misconfiguration Error");
456 case S_WITHDRAW_MTHD
:
457 return ("Label Withdraw PW Status Method");
458 case S_UNSSUPORTDCAP
:
459 return ("Unsupported Capability");
461 return ("End-of-LIB");
462 case S_TRANS_MISMTCH
:
463 return ("Transport Connection Mismatch");
464 case S_DS_NONCMPLNCE
:
465 return ("Dual-Stack Noncompliance");
467 snprintf(buf
, sizeof(buf
), "[%08x]", status
);
473 pw_type_name(uint16_t pw_type
)
478 case PW_TYPE_ETHERNET_TAGGED
:
479 return ("Eth Tagged");
480 case PW_TYPE_ETHERNET
:
482 case PW_TYPE_WILDCARD
:
485 snprintf(buf
, sizeof(buf
), "[%0x]", pw_type
);
491 pw_error_code(uint8_t status
)
498 case F_PW_LOCAL_NOT_FWD
:
499 return ("local not forwarding");
500 case F_PW_REMOTE_NOT_FWD
:
501 return ("remote not forwarding");
502 case F_PW_NO_REMOTE_LABEL
:
503 return ("no remote label");
504 case F_PW_MTU_MISMATCH
:
505 return ("mtu mismatch between peers");
507 snprintf(buf
, sizeof(buf
), "[%0x]", status
);