xref: /openbsd-src/usr.sbin/ldpd/logmsg.c (revision 9246985afff8caab8965ddcdb8f68bb2e3d67f32)
1*9246985aSrenato /*	$OpenBSD: logmsg.c,v 1.6 2017/03/04 00:15:35 renato Exp $ */
23e2a4faaSbenno 
33e2a4faaSbenno /*
43e2a4faaSbenno  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
53e2a4faaSbenno  *
63e2a4faaSbenno  * Permission to use, copy, modify, and distribute this software for any
73e2a4faaSbenno  * purpose with or without fee is hereby granted, provided that the above
83e2a4faaSbenno  * copyright notice and this permission notice appear in all copies.
93e2a4faaSbenno  *
103e2a4faaSbenno  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
113e2a4faaSbenno  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
123e2a4faaSbenno  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
133e2a4faaSbenno  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
143e2a4faaSbenno  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
153e2a4faaSbenno  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
163e2a4faaSbenno  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
173e2a4faaSbenno  */
183e2a4faaSbenno 
193e2a4faaSbenno #include <sys/types.h>
203e2a4faaSbenno #include <sys/socket.h>
213e2a4faaSbenno #include <arpa/inet.h>
223e2a4faaSbenno #include <netinet/in.h>
233e2a4faaSbenno #include <netmpls/mpls.h>
243e2a4faaSbenno #include <stdio.h>
253e2a4faaSbenno #include <string.h>
263e2a4faaSbenno #include <netdb.h>
273e2a4faaSbenno 
283e2a4faaSbenno #include "ldp.h"
293e2a4faaSbenno #include "ldpd.h"
303e2a4faaSbenno #include "ldpe.h"
313e2a4faaSbenno #include "lde.h"
323e2a4faaSbenno 
333e2a4faaSbenno #define NUM_LOGS	4
343e2a4faaSbenno const char *
log_sockaddr(void * vp)353e2a4faaSbenno log_sockaddr(void *vp)
363e2a4faaSbenno {
373e2a4faaSbenno 	static char	 buf[NUM_LOGS][NI_MAXHOST];
383e2a4faaSbenno 	static int	 round = 0;
393e2a4faaSbenno 	struct sockaddr	*sa = vp;
403e2a4faaSbenno 
413e2a4faaSbenno 	round = (round + 1) % NUM_LOGS;
423e2a4faaSbenno 
433e2a4faaSbenno 	if (getnameinfo(sa, sa->sa_len, buf[round], NI_MAXHOST, NULL, 0,
443e2a4faaSbenno 	    NI_NUMERICHOST))
453e2a4faaSbenno 		return ("(unknown)");
463e2a4faaSbenno 	else
473e2a4faaSbenno 		return (buf[round]);
483e2a4faaSbenno }
493e2a4faaSbenno 
503e2a4faaSbenno const char *
log_in6addr(const struct in6_addr * addr)513e2a4faaSbenno log_in6addr(const struct in6_addr *addr)
523e2a4faaSbenno {
533e2a4faaSbenno 	struct sockaddr_in6	sa_in6;
543e2a4faaSbenno 
553e2a4faaSbenno 	memset(&sa_in6, 0, sizeof(sa_in6));
563e2a4faaSbenno 	sa_in6.sin6_len = sizeof(sa_in6);
573e2a4faaSbenno 	sa_in6.sin6_family = AF_INET6;
583e2a4faaSbenno 	sa_in6.sin6_addr = *addr;
593e2a4faaSbenno 
603e2a4faaSbenno 	recoverscope(&sa_in6);
613e2a4faaSbenno 
623e2a4faaSbenno 	return (log_sockaddr(&sa_in6));
633e2a4faaSbenno }
643e2a4faaSbenno 
653e2a4faaSbenno const char *
log_in6addr_scope(const struct in6_addr * addr,unsigned int ifindex)663e2a4faaSbenno log_in6addr_scope(const struct in6_addr *addr, unsigned int ifindex)
673e2a4faaSbenno {
683e2a4faaSbenno 	struct sockaddr_in6	sa_in6;
693e2a4faaSbenno 
703e2a4faaSbenno 	memset(&sa_in6, 0, sizeof(sa_in6));
713e2a4faaSbenno 	sa_in6.sin6_len = sizeof(sa_in6);
723e2a4faaSbenno 	sa_in6.sin6_family = AF_INET6;
733e2a4faaSbenno 	sa_in6.sin6_addr = *addr;
743e2a4faaSbenno 
753e2a4faaSbenno 	addscope(&sa_in6, ifindex);
763e2a4faaSbenno 
773e2a4faaSbenno 	return (log_sockaddr(&sa_in6));
783e2a4faaSbenno }
793e2a4faaSbenno 
803e2a4faaSbenno const char *
log_addr(int af,const union ldpd_addr * addr)813e2a4faaSbenno log_addr(int af, const union ldpd_addr *addr)
823e2a4faaSbenno {
833e2a4faaSbenno 	static char	 buf[NUM_LOGS][INET6_ADDRSTRLEN];
843e2a4faaSbenno 	static int	 round = 0;
853e2a4faaSbenno 
863e2a4faaSbenno 	switch (af) {
873e2a4faaSbenno 	case AF_INET:
883e2a4faaSbenno 		round = (round + 1) % NUM_LOGS;
893e2a4faaSbenno 		if (inet_ntop(AF_INET, &addr->v4, buf[round],
903e2a4faaSbenno 		    sizeof(buf[round])) == NULL)
913e2a4faaSbenno 			return ("???");
923e2a4faaSbenno 		return (buf[round]);
933e2a4faaSbenno 	case AF_INET6:
943e2a4faaSbenno 		return (log_in6addr(&addr->v6));
953e2a4faaSbenno 	default:
963e2a4faaSbenno 		break;
973e2a4faaSbenno 	}
983e2a4faaSbenno 
993e2a4faaSbenno 	return ("???");
1003e2a4faaSbenno }
1013e2a4faaSbenno 
1023e2a4faaSbenno #define	TF_BUFS	4
1033e2a4faaSbenno #define	TF_LEN	32
1043e2a4faaSbenno 
1053e2a4faaSbenno char *
log_label(uint32_t label)1063e2a4faaSbenno log_label(uint32_t label)
1073e2a4faaSbenno {
1083e2a4faaSbenno 	char		*buf;
1093e2a4faaSbenno 	static char	 tfbuf[TF_BUFS][TF_LEN];	/* ring buffer */
1103e2a4faaSbenno 	static int	 idx = 0;
1113e2a4faaSbenno 
1123e2a4faaSbenno 	buf = tfbuf[idx++];
1133e2a4faaSbenno 	if (idx == TF_BUFS)
1143e2a4faaSbenno 		idx = 0;
1153e2a4faaSbenno 
1163e2a4faaSbenno 	switch (label) {
1173e2a4faaSbenno 	case NO_LABEL:
1183e2a4faaSbenno 		snprintf(buf, TF_LEN, "-");
1193e2a4faaSbenno 		break;
1203e2a4faaSbenno 	case MPLS_LABEL_IMPLNULL:
1213e2a4faaSbenno 		snprintf(buf, TF_LEN, "imp-null");
1223e2a4faaSbenno 		break;
1233e2a4faaSbenno 	case MPLS_LABEL_IPV4NULL:
1243e2a4faaSbenno 	case MPLS_LABEL_IPV6NULL:
1253e2a4faaSbenno 		snprintf(buf, TF_LEN, "exp-null");
1263e2a4faaSbenno 		break;
1273e2a4faaSbenno 	default:
1283e2a4faaSbenno 		snprintf(buf, TF_LEN, "%u", label);
1293e2a4faaSbenno 		break;
1303e2a4faaSbenno 	}
1313e2a4faaSbenno 
1323e2a4faaSbenno 	return (buf);
1333e2a4faaSbenno }
1343e2a4faaSbenno 
1353e2a4faaSbenno char *
log_hello_src(const struct hello_source * src)1363e2a4faaSbenno log_hello_src(const struct hello_source *src)
1373e2a4faaSbenno {
1383e2a4faaSbenno 	static char buf[64];
1393e2a4faaSbenno 
1403e2a4faaSbenno 	switch (src->type) {
1413e2a4faaSbenno 	case HELLO_LINK:
1423e2a4faaSbenno 		snprintf(buf, sizeof(buf), "iface %s",
1433e2a4faaSbenno 		    src->link.ia->iface->name);
1443e2a4faaSbenno 		break;
1453e2a4faaSbenno 	case HELLO_TARGETED:
1463e2a4faaSbenno 		snprintf(buf, sizeof(buf), "source %s",
1473e2a4faaSbenno 		    log_addr(src->target->af, &src->target->addr));
1483e2a4faaSbenno 		break;
1493e2a4faaSbenno 	}
1503e2a4faaSbenno 
1513e2a4faaSbenno 	return (buf);
1523e2a4faaSbenno }
1533e2a4faaSbenno 
1543e2a4faaSbenno const char *
log_map(const struct map * map)1553e2a4faaSbenno log_map(const struct map *map)
1563e2a4faaSbenno {
1572c06fdf4Srenato 	static char	buf[128];
1583e2a4faaSbenno 
1593e2a4faaSbenno 	switch (map->type) {
1603e2a4faaSbenno 	case MAP_TYPE_WILDCARD:
1613e2a4faaSbenno 		if (snprintf(buf, sizeof(buf), "wildcard") < 0)
1623e2a4faaSbenno 			return ("???");
1633e2a4faaSbenno 		break;
1643e2a4faaSbenno 	case MAP_TYPE_PREFIX:
1653e2a4faaSbenno 		if (snprintf(buf, sizeof(buf), "%s/%u",
1663e2a4faaSbenno 		    log_addr(map->fec.prefix.af, &map->fec.prefix.prefix),
1673e2a4faaSbenno 		    map->fec.prefix.prefixlen) == -1)
1683e2a4faaSbenno 			return ("???");
1693e2a4faaSbenno 		break;
1703e2a4faaSbenno 	case MAP_TYPE_PWID:
1712c06fdf4Srenato 		if (snprintf(buf, sizeof(buf), "pw-id %u group-id %u (%s)",
1722c06fdf4Srenato 		    map->fec.pwid.pwid, map->fec.pwid.group_id,
1733e2a4faaSbenno 		    pw_type_name(map->fec.pwid.type)) == -1)
1743e2a4faaSbenno 			return ("???");
1753e2a4faaSbenno 		break;
176c7c5a728Srenato 	case MAP_TYPE_TYPED_WCARD:
177c7c5a728Srenato 		if (snprintf(buf, sizeof(buf), "typed wildcard") < 0)
178c7c5a728Srenato 			return ("???");
179c7c5a728Srenato 		switch (map->fec.twcard.type) {
180c7c5a728Srenato 		case MAP_TYPE_PREFIX:
181c7c5a728Srenato 			if (snprintf(buf + strlen(buf), sizeof(buf) -
182c7c5a728Srenato 			    strlen(buf), " (prefix, address-family %s)",
183c7c5a728Srenato 			    af_name(map->fec.twcard.u.prefix_af)) < 0)
184c7c5a728Srenato 				return ("???");
185c7c5a728Srenato 			break;
1866702dd25Srenato 		case MAP_TYPE_PWID:
1876702dd25Srenato 			if (snprintf(buf + strlen(buf), sizeof(buf) -
1886702dd25Srenato 			    strlen(buf), " (pwid, type %s)",
1896702dd25Srenato 			    pw_type_name(map->fec.twcard.u.pw_type)) < 0)
1906702dd25Srenato 				return ("???");
1916702dd25Srenato 			break;
192c7c5a728Srenato 		default:
193c7c5a728Srenato 			if (snprintf(buf + strlen(buf), sizeof(buf) -
194c7c5a728Srenato 			    strlen(buf), " (unknown type)") < 0)
195c7c5a728Srenato 				return ("???");
196c7c5a728Srenato 			break;
197c7c5a728Srenato 		}
198c7c5a728Srenato 		break;
1993e2a4faaSbenno 	default:
2003e2a4faaSbenno 		return ("???");
2013e2a4faaSbenno 	}
2023e2a4faaSbenno 
2033e2a4faaSbenno 	return (buf);
2043e2a4faaSbenno }
2053e2a4faaSbenno 
2063e2a4faaSbenno const char *
log_fec(const struct fec * fec)2073e2a4faaSbenno log_fec(const struct fec *fec)
2083e2a4faaSbenno {
2093e2a4faaSbenno 	static char	buf[64];
2103e2a4faaSbenno 	union ldpd_addr	addr;
2113e2a4faaSbenno 
2123e2a4faaSbenno 	switch (fec->type) {
2133e2a4faaSbenno 	case FEC_TYPE_IPV4:
2143e2a4faaSbenno 		addr.v4 = fec->u.ipv4.prefix;
2153e2a4faaSbenno 		if (snprintf(buf, sizeof(buf), "ipv4 %s/%u",
2163e2a4faaSbenno 		    log_addr(AF_INET, &addr), fec->u.ipv4.prefixlen) == -1)
2173e2a4faaSbenno 			return ("???");
2183e2a4faaSbenno 		break;
2193e2a4faaSbenno 	case FEC_TYPE_IPV6:
2203e2a4faaSbenno 		addr.v6 = fec->u.ipv6.prefix;
2213e2a4faaSbenno 		if (snprintf(buf, sizeof(buf), "ipv6 %s/%u",
2223e2a4faaSbenno 		    log_addr(AF_INET6, &addr), fec->u.ipv6.prefixlen) == -1)
2233e2a4faaSbenno 			return ("???");
2243e2a4faaSbenno 		break;
2253e2a4faaSbenno 	case FEC_TYPE_PWID:
2263e2a4faaSbenno 		if (snprintf(buf, sizeof(buf),
2273e2a4faaSbenno 		    "pwid %u (%s) - %s",
2283e2a4faaSbenno 		    fec->u.pwid.pwid, pw_type_name(fec->u.pwid.type),
2293e2a4faaSbenno 		    inet_ntoa(fec->u.pwid.lsr_id)) == -1)
2303e2a4faaSbenno 			return ("???");
2313e2a4faaSbenno 		break;
2323e2a4faaSbenno 	default:
2333e2a4faaSbenno 		return ("???");
2343e2a4faaSbenno 	}
2353e2a4faaSbenno 
2363e2a4faaSbenno 	return (buf);
2373e2a4faaSbenno }
2383e2a4faaSbenno 
2393e2a4faaSbenno /* names */
2403e2a4faaSbenno const char *
af_name(int af)2413e2a4faaSbenno af_name(int af)
2423e2a4faaSbenno {
2433e2a4faaSbenno 	switch (af) {
2443e2a4faaSbenno 	case AF_INET:
2453e2a4faaSbenno 		return ("ipv4");
2463e2a4faaSbenno 	case AF_INET6:
2473e2a4faaSbenno 		return ("ipv6");
2483e2a4faaSbenno 	case AF_MPLS:
2493e2a4faaSbenno 		return ("mpls");
2503e2a4faaSbenno 	default:
2513e2a4faaSbenno 		return ("UNKNOWN");
2523e2a4faaSbenno 	}
2533e2a4faaSbenno }
2543e2a4faaSbenno 
2553e2a4faaSbenno const char *
socket_name(int type)2563e2a4faaSbenno socket_name(int type)
2573e2a4faaSbenno {
2583e2a4faaSbenno 	switch (type) {
2593e2a4faaSbenno 	case LDP_SOCKET_DISC:
2603e2a4faaSbenno 		return ("discovery");
2613e2a4faaSbenno 	case LDP_SOCKET_EDISC:
2623e2a4faaSbenno 		return ("extended discovery");
2633e2a4faaSbenno 	case LDP_SOCKET_SESSION:
2643e2a4faaSbenno 		return ("session");
2653e2a4faaSbenno 	default:
2663e2a4faaSbenno 		return ("UNKNOWN");
2673e2a4faaSbenno 	}
2683e2a4faaSbenno }
2693e2a4faaSbenno 
2703e2a4faaSbenno const char *
nbr_state_name(int state)2713e2a4faaSbenno nbr_state_name(int state)
2723e2a4faaSbenno {
2733e2a4faaSbenno 	switch (state) {
2743e2a4faaSbenno 	case NBR_STA_PRESENT:
2753e2a4faaSbenno 		return ("PRESENT");
2763e2a4faaSbenno 	case NBR_STA_INITIAL:
2773e2a4faaSbenno 		return ("INITIALIZED");
2783e2a4faaSbenno 	case NBR_STA_OPENREC:
2793e2a4faaSbenno 		return ("OPENREC");
2803e2a4faaSbenno 	case NBR_STA_OPENSENT:
2813e2a4faaSbenno 		return ("OPENSENT");
2823e2a4faaSbenno 	case NBR_STA_OPER:
2833e2a4faaSbenno 		return ("OPERATIONAL");
2843e2a4faaSbenno 	default:
2853e2a4faaSbenno 		return ("UNKNOWN");
2863e2a4faaSbenno 	}
2873e2a4faaSbenno }
2883e2a4faaSbenno 
2893e2a4faaSbenno const char *
if_state_name(int state)2903e2a4faaSbenno if_state_name(int state)
2913e2a4faaSbenno {
2923e2a4faaSbenno 	switch (state) {
2933e2a4faaSbenno 	case IF_STA_DOWN:
2943e2a4faaSbenno 		return ("DOWN");
2953e2a4faaSbenno 	case IF_STA_ACTIVE:
2963e2a4faaSbenno 		return ("ACTIVE");
2973e2a4faaSbenno 	default:
2983e2a4faaSbenno 		return ("UNKNOWN");
2993e2a4faaSbenno 	}
3003e2a4faaSbenno }
3013e2a4faaSbenno 
3023e2a4faaSbenno const char *
if_type_name(enum iface_type type)3033e2a4faaSbenno if_type_name(enum iface_type type)
3043e2a4faaSbenno {
3053e2a4faaSbenno 	switch (type) {
3063e2a4faaSbenno 	case IF_TYPE_POINTOPOINT:
3073e2a4faaSbenno 		return ("POINTOPOINT");
3083e2a4faaSbenno 	case IF_TYPE_BROADCAST:
3093e2a4faaSbenno 		return ("BROADCAST");
3103e2a4faaSbenno 	}
3113e2a4faaSbenno 	/* NOTREACHED */
3123e2a4faaSbenno 	return ("UNKNOWN");
3133e2a4faaSbenno }
3143e2a4faaSbenno 
3153e2a4faaSbenno const char *
msg_name(uint16_t msg)3163e2a4faaSbenno msg_name(uint16_t msg)
3173e2a4faaSbenno {
3183e2a4faaSbenno 	static char buf[16];
3193e2a4faaSbenno 
3203e2a4faaSbenno 	switch (msg) {
3213e2a4faaSbenno 	case MSG_TYPE_NOTIFICATION:
3223e2a4faaSbenno 		return ("notification");
3233e2a4faaSbenno 	case MSG_TYPE_HELLO:
3243e2a4faaSbenno 		return ("hello");
3253e2a4faaSbenno 	case MSG_TYPE_INIT:
3263e2a4faaSbenno 		return ("initialization");
3273e2a4faaSbenno 	case MSG_TYPE_KEEPALIVE:
3283e2a4faaSbenno 		return ("keepalive");
3293b4c1866Srenato 	case MSG_TYPE_CAPABILITY:
3303b4c1866Srenato 		return ("capability");
3313e2a4faaSbenno 	case MSG_TYPE_ADDR:
3323e2a4faaSbenno 		return ("address");
3333e2a4faaSbenno 	case MSG_TYPE_ADDRWITHDRAW:
3343e2a4faaSbenno 		return ("address withdraw");
3353e2a4faaSbenno 	case MSG_TYPE_LABELMAPPING:
3363e2a4faaSbenno 		return ("label mapping");
3373e2a4faaSbenno 	case MSG_TYPE_LABELREQUEST:
3383e2a4faaSbenno 		return ("label request");
3393e2a4faaSbenno 	case MSG_TYPE_LABELWITHDRAW:
3403e2a4faaSbenno 		return ("label withdraw");
3413e2a4faaSbenno 	case MSG_TYPE_LABELRELEASE:
3423e2a4faaSbenno 		return ("label release");
3433e2a4faaSbenno 	case MSG_TYPE_LABELABORTREQ:
3443e2a4faaSbenno 	default:
3453e2a4faaSbenno 		snprintf(buf, sizeof(buf), "[%08x]", msg);
3463e2a4faaSbenno 		return (buf);
3473e2a4faaSbenno 	}
3483e2a4faaSbenno }
3493e2a4faaSbenno 
3503e2a4faaSbenno const char *
status_code_name(uint32_t status)3513e2a4faaSbenno status_code_name(uint32_t status)
3523e2a4faaSbenno {
3533e2a4faaSbenno 	static char buf[16];
3543e2a4faaSbenno 
3553e2a4faaSbenno 	switch (status) {
3563e2a4faaSbenno 	case S_SUCCESS:
3573e2a4faaSbenno 		return ("Success");
3583e2a4faaSbenno 	case S_BAD_LDP_ID:
3593e2a4faaSbenno 		return ("Bad LDP Identifier");
3603e2a4faaSbenno 	case S_BAD_PROTO_VER:
3613e2a4faaSbenno 		return ("Bad Protocol Version");
3623e2a4faaSbenno 	case S_BAD_PDU_LEN:
3633e2a4faaSbenno 		return ("Bad PDU Length");
3643e2a4faaSbenno 	case S_UNKNOWN_MSG:
3653e2a4faaSbenno 		return ("Unknown Message Type");
3663e2a4faaSbenno 	case S_BAD_MSG_LEN:
3673e2a4faaSbenno 		return ("Bad Message Length");
3683e2a4faaSbenno 	case S_UNKNOWN_TLV:
3693e2a4faaSbenno 		return ("Unknown TLV");
3703e2a4faaSbenno 	case S_BAD_TLV_LEN:
3713e2a4faaSbenno 		return ("Bad TLV Length");
3723e2a4faaSbenno 	case S_BAD_TLV_VAL:
3733e2a4faaSbenno 		return ("Malformed TLV Value");
3743e2a4faaSbenno 	case S_HOLDTIME_EXP:
3753e2a4faaSbenno 		return ("Hold Timer Expired");
3763e2a4faaSbenno 	case S_SHUTDOWN:
3773e2a4faaSbenno 		return ("Shutdown");
3783e2a4faaSbenno 	case S_LOOP_DETECTED:
3793e2a4faaSbenno 		return ("Loop Detected");
3803e2a4faaSbenno 	case S_UNKNOWN_FEC:
3813e2a4faaSbenno 		return ("Unknown FEC");
3823e2a4faaSbenno 	case S_NO_ROUTE:
3833e2a4faaSbenno 		return ("No Route");
3843e2a4faaSbenno 	case S_NO_LABEL_RES:
3853e2a4faaSbenno 		return ("No Label Resources");
3863e2a4faaSbenno 	case S_AVAILABLE:
3873e2a4faaSbenno 		return ("Label Resources Available");
3883e2a4faaSbenno 	case S_NO_HELLO:
3893e2a4faaSbenno 		return ("Session Rejected, No Hello");
3903e2a4faaSbenno 	case S_PARM_ADV_MODE:
3913e2a4faaSbenno 		return ("Rejected Advertisement Mode Parameter");
3923e2a4faaSbenno 	case S_MAX_PDU_LEN:
3933e2a4faaSbenno 		return ("Rejected Max PDU Length Parameter");
3943e2a4faaSbenno 	case S_PARM_L_RANGE:
3953e2a4faaSbenno 		return ("Rejected Label Range Parameter");
3963e2a4faaSbenno 	case S_KEEPALIVE_TMR:
3973e2a4faaSbenno 		return ("KeepAlive Timer Expired");
3983e2a4faaSbenno 	case S_LAB_REQ_ABRT:
3993e2a4faaSbenno 		return ("Label Request Aborted");
4003e2a4faaSbenno 	case S_MISS_MSG:
4013e2a4faaSbenno 		return ("Missing Message Parameters");
4023e2a4faaSbenno 	case S_UNSUP_ADDR:
4033e2a4faaSbenno 		return ("Unsupported Address Family");
4043e2a4faaSbenno 	case S_KEEPALIVE_BAD:
4053e2a4faaSbenno 		return ("Bad KeepAlive Time");
4063e2a4faaSbenno 	case S_INTERN_ERR:
4073e2a4faaSbenno 		return ("Internal Error");
4083e2a4faaSbenno 	case S_ILLEGAL_CBIT:
4093e2a4faaSbenno 		return ("Illegal C-Bit");
4103e2a4faaSbenno 	case S_WRONG_CBIT:
4113e2a4faaSbenno 		return ("Wrong C-Bit");
4123e2a4faaSbenno 	case S_INCPT_BITRATE:
4133e2a4faaSbenno 		return ("Incompatible bit-rate");
4143e2a4faaSbenno 	case S_CEP_MISCONF:
4153e2a4faaSbenno 		return ("CEP-TDM mis-configuration");
4163e2a4faaSbenno 	case S_PW_STATUS:
4173e2a4faaSbenno 		return ("PW Status");
4183e2a4faaSbenno 	case S_UNASSIGN_TAI:
4193e2a4faaSbenno 		return ("Unassigned/Unrecognized TAI");
4203e2a4faaSbenno 	case S_MISCONF_ERR:
4213e2a4faaSbenno 		return ("Generic Misconfiguration Error");
4223e2a4faaSbenno 	case S_WITHDRAW_MTHD:
4233e2a4faaSbenno 		return ("Label Withdraw PW Status Method");
4243b4c1866Srenato 	case S_UNSSUPORTDCAP:
4253b4c1866Srenato 		return ("Unsupported Capability");
426*9246985aSrenato 	case S_ENDOFLIB:
427*9246985aSrenato 		return ("End-of-LIB");
4283e2a4faaSbenno 	case S_TRANS_MISMTCH:
4293e2a4faaSbenno 		return ("Transport Connection Mismatch");
4303e2a4faaSbenno 	case S_DS_NONCMPLNCE:
4313e2a4faaSbenno 		return ("Dual-Stack Noncompliance");
4323e2a4faaSbenno 	default:
4333e2a4faaSbenno 		snprintf(buf, sizeof(buf), "[%08x]", status);
4343e2a4faaSbenno 		return (buf);
4353e2a4faaSbenno 	}
4363e2a4faaSbenno }
4373e2a4faaSbenno 
4383e2a4faaSbenno const char *
pw_type_name(uint16_t pw_type)4393e2a4faaSbenno pw_type_name(uint16_t pw_type)
4403e2a4faaSbenno {
4413e2a4faaSbenno 	static char buf[64];
4423e2a4faaSbenno 
4433e2a4faaSbenno 	switch (pw_type) {
4443e2a4faaSbenno 	case PW_TYPE_ETHERNET_TAGGED:
4453e2a4faaSbenno 		return ("Eth Tagged");
4463e2a4faaSbenno 	case PW_TYPE_ETHERNET:
4473e2a4faaSbenno 		return ("Ethernet");
4486702dd25Srenato 	case PW_TYPE_WILDCARD:
4496702dd25Srenato 		return ("Wildcard");
4503e2a4faaSbenno 	default:
4513e2a4faaSbenno 		snprintf(buf, sizeof(buf), "[%0x]", pw_type);
4523e2a4faaSbenno 		return (buf);
4533e2a4faaSbenno 	}
4543e2a4faaSbenno }
455