xref: /openbsd-src/usr.sbin/eigrpd/logmsg.c (revision fcdf914b30f7cb1237cc6d58aec2a6d4e802ff95)
1*fcdf914bSbenno /*	$OpenBSD: logmsg.c,v 1.1 2016/09/02 17:59:58 benno Exp $ */
2*fcdf914bSbenno 
3*fcdf914bSbenno /*
4*fcdf914bSbenno  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5*fcdf914bSbenno  *
6*fcdf914bSbenno  * Permission to use, copy, modify, and distribute this software for any
7*fcdf914bSbenno  * purpose with or without fee is hereby granted, provided that the above
8*fcdf914bSbenno  * copyright notice and this permission notice appear in all copies.
9*fcdf914bSbenno  *
10*fcdf914bSbenno  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*fcdf914bSbenno  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*fcdf914bSbenno  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*fcdf914bSbenno  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*fcdf914bSbenno  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*fcdf914bSbenno  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*fcdf914bSbenno  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*fcdf914bSbenno  */
18*fcdf914bSbenno 
19*fcdf914bSbenno #include <errno.h>
20*fcdf914bSbenno #include <stdarg.h>
21*fcdf914bSbenno #include <stdio.h>
22*fcdf914bSbenno #include <stdlib.h>
23*fcdf914bSbenno #include <string.h>
24*fcdf914bSbenno #include <syslog.h>
25*fcdf914bSbenno #include <unistd.h>
26*fcdf914bSbenno #include <arpa/inet.h>
27*fcdf914bSbenno #include <netdb.h>
28*fcdf914bSbenno 
29*fcdf914bSbenno #include "eigrpd.h"
30*fcdf914bSbenno #include "rde.h"
31*fcdf914bSbenno #include "log.h"
32*fcdf914bSbenno 
33*fcdf914bSbenno #define NUM_LOGS	4
34*fcdf914bSbenno const char *
log_sockaddr(void * vp)35*fcdf914bSbenno log_sockaddr(void *vp)
36*fcdf914bSbenno {
37*fcdf914bSbenno 	static char	 buf[NUM_LOGS][NI_MAXHOST];
38*fcdf914bSbenno 	static int	 round = 0;
39*fcdf914bSbenno 	struct sockaddr	*sa = vp;
40*fcdf914bSbenno 
41*fcdf914bSbenno 	round = (round + 1) % NUM_LOGS;
42*fcdf914bSbenno 
43*fcdf914bSbenno 	if (getnameinfo(sa, sa->sa_len, buf[round], NI_MAXHOST, NULL, 0,
44*fcdf914bSbenno 	    NI_NUMERICHOST))
45*fcdf914bSbenno 		return ("(unknown)");
46*fcdf914bSbenno 	else
47*fcdf914bSbenno 		return (buf[round]);
48*fcdf914bSbenno }
49*fcdf914bSbenno 
50*fcdf914bSbenno const char *
log_in6addr(const struct in6_addr * addr)51*fcdf914bSbenno log_in6addr(const struct in6_addr *addr)
52*fcdf914bSbenno {
53*fcdf914bSbenno 	struct sockaddr_in6	sa_in6;
54*fcdf914bSbenno 
55*fcdf914bSbenno 	memset(&sa_in6, 0, sizeof(sa_in6));
56*fcdf914bSbenno 	sa_in6.sin6_len = sizeof(sa_in6);
57*fcdf914bSbenno 	sa_in6.sin6_family = AF_INET6;
58*fcdf914bSbenno 	sa_in6.sin6_addr = *addr;
59*fcdf914bSbenno 
60*fcdf914bSbenno 	recoverscope(&sa_in6);
61*fcdf914bSbenno 
62*fcdf914bSbenno 	return (log_sockaddr(&sa_in6));
63*fcdf914bSbenno }
64*fcdf914bSbenno 
65*fcdf914bSbenno const char *
log_in6addr_scope(const struct in6_addr * addr,unsigned int ifindex)66*fcdf914bSbenno log_in6addr_scope(const struct in6_addr *addr, unsigned int ifindex)
67*fcdf914bSbenno {
68*fcdf914bSbenno 	struct sockaddr_in6	sa_in6;
69*fcdf914bSbenno 
70*fcdf914bSbenno 	memset(&sa_in6, 0, sizeof(sa_in6));
71*fcdf914bSbenno 	sa_in6.sin6_len = sizeof(sa_in6);
72*fcdf914bSbenno 	sa_in6.sin6_family = AF_INET6;
73*fcdf914bSbenno 	sa_in6.sin6_addr = *addr;
74*fcdf914bSbenno 
75*fcdf914bSbenno 	addscope(&sa_in6, ifindex);
76*fcdf914bSbenno 
77*fcdf914bSbenno 	return (log_sockaddr(&sa_in6));
78*fcdf914bSbenno }
79*fcdf914bSbenno 
80*fcdf914bSbenno const char *
log_addr(int af,union eigrpd_addr * addr)81*fcdf914bSbenno log_addr(int af, union eigrpd_addr *addr)
82*fcdf914bSbenno {
83*fcdf914bSbenno 	static char	 buf[NUM_LOGS][INET6_ADDRSTRLEN];
84*fcdf914bSbenno 	static int	 round = 0;
85*fcdf914bSbenno 
86*fcdf914bSbenno 	switch (af) {
87*fcdf914bSbenno 	case AF_INET:
88*fcdf914bSbenno 		round = (round + 1) % NUM_LOGS;
89*fcdf914bSbenno 		if (inet_ntop(AF_INET, &addr->v4, buf[round],
90*fcdf914bSbenno 		    sizeof(buf[round])) == NULL)
91*fcdf914bSbenno 			return ("???");
92*fcdf914bSbenno 		return (buf[round]);
93*fcdf914bSbenno 	case AF_INET6:
94*fcdf914bSbenno 		return (log_in6addr(&addr->v6));
95*fcdf914bSbenno 	default:
96*fcdf914bSbenno 		break;
97*fcdf914bSbenno 	}
98*fcdf914bSbenno 
99*fcdf914bSbenno 	return ("???");
100*fcdf914bSbenno }
101*fcdf914bSbenno 
102*fcdf914bSbenno const char *
log_prefix(struct rt_node * rn)103*fcdf914bSbenno log_prefix(struct rt_node *rn)
104*fcdf914bSbenno {
105*fcdf914bSbenno 	static char	buf[64];
106*fcdf914bSbenno 
107*fcdf914bSbenno 	if (snprintf(buf, sizeof(buf), "%s/%u", log_addr(rn->eigrp->af,
108*fcdf914bSbenno 	    &rn->prefix), rn->prefixlen) == -1)
109*fcdf914bSbenno 		return ("???");
110*fcdf914bSbenno 
111*fcdf914bSbenno 	return (buf);
112*fcdf914bSbenno }
113*fcdf914bSbenno 
114*fcdf914bSbenno const char *
log_route_origin(int af,struct rde_nbr * nbr)115*fcdf914bSbenno log_route_origin(int af, struct rde_nbr *nbr)
116*fcdf914bSbenno {
117*fcdf914bSbenno 	if (nbr->flags & F_RDE_NBR_SELF) {
118*fcdf914bSbenno 		if (nbr->flags & F_RDE_NBR_REDIST)
119*fcdf914bSbenno 			return ("redistribute");
120*fcdf914bSbenno 		if (nbr->flags & F_RDE_NBR_SUMMARY)
121*fcdf914bSbenno 			return ("summary");
122*fcdf914bSbenno 		else
123*fcdf914bSbenno 			return ("connected");
124*fcdf914bSbenno 	}
125*fcdf914bSbenno 
126*fcdf914bSbenno 	return (log_addr(af, &nbr->addr));
127*fcdf914bSbenno }
128*fcdf914bSbenno 
129*fcdf914bSbenno const char *
opcode_name(uint8_t opcode)130*fcdf914bSbenno opcode_name(uint8_t opcode)
131*fcdf914bSbenno {
132*fcdf914bSbenno 	switch (opcode) {
133*fcdf914bSbenno 	case EIGRP_OPC_UPDATE:
134*fcdf914bSbenno 		return ("UPDATE");
135*fcdf914bSbenno 	case EIGRP_OPC_REQUEST:
136*fcdf914bSbenno 		return ("REQUEST");
137*fcdf914bSbenno 	case EIGRP_OPC_QUERY:
138*fcdf914bSbenno 		return ("QUERY");
139*fcdf914bSbenno 	case EIGRP_OPC_REPLY:
140*fcdf914bSbenno 		return ("REPLY");
141*fcdf914bSbenno 	case EIGRP_OPC_HELLO:
142*fcdf914bSbenno 		return ("HELLO");
143*fcdf914bSbenno 	case EIGRP_OPC_PROBE:
144*fcdf914bSbenno 		return ("PROBE");
145*fcdf914bSbenno 	case EIGRP_OPC_SIAQUERY:
146*fcdf914bSbenno 		return ("SIAQUERY");
147*fcdf914bSbenno 	case EIGRP_OPC_SIAREPLY:
148*fcdf914bSbenno 		return ("SIAREPLY");
149*fcdf914bSbenno 	default:
150*fcdf914bSbenno 		return ("UNKNOWN");
151*fcdf914bSbenno 	}
152*fcdf914bSbenno }
153*fcdf914bSbenno 
154*fcdf914bSbenno const char *
af_name(int af)155*fcdf914bSbenno af_name(int af)
156*fcdf914bSbenno {
157*fcdf914bSbenno 	switch (af) {
158*fcdf914bSbenno 	case AF_INET:
159*fcdf914bSbenno 		return ("ipv4");
160*fcdf914bSbenno 	case AF_INET6:
161*fcdf914bSbenno 		return ("ipv6");
162*fcdf914bSbenno 	default:
163*fcdf914bSbenno 		return ("UNKNOWN");
164*fcdf914bSbenno 	}
165*fcdf914bSbenno }
166*fcdf914bSbenno 
167*fcdf914bSbenno const char *
if_type_name(enum iface_type type)168*fcdf914bSbenno if_type_name(enum iface_type type)
169*fcdf914bSbenno {
170*fcdf914bSbenno 	switch (type) {
171*fcdf914bSbenno 	case IF_TYPE_POINTOPOINT:
172*fcdf914bSbenno 		return ("POINTOPOINT");
173*fcdf914bSbenno 	case IF_TYPE_BROADCAST:
174*fcdf914bSbenno 		return ("BROADCAST");
175*fcdf914bSbenno 	default:
176*fcdf914bSbenno 		return ("UNKNOWN");
177*fcdf914bSbenno 	}
178*fcdf914bSbenno }
179*fcdf914bSbenno 
180*fcdf914bSbenno const char *
dual_state_name(int state)181*fcdf914bSbenno dual_state_name(int state)
182*fcdf914bSbenno {
183*fcdf914bSbenno 	switch (state) {
184*fcdf914bSbenno 	case DUAL_STA_PASSIVE:
185*fcdf914bSbenno 		return ("PASSIVE");
186*fcdf914bSbenno 	case DUAL_STA_ACTIVE0:
187*fcdf914bSbenno 		return ("ACTIVE(Oij=0)");
188*fcdf914bSbenno 	case DUAL_STA_ACTIVE1:
189*fcdf914bSbenno 		return ("ACTIVE(Oij=1)");
190*fcdf914bSbenno 	case DUAL_STA_ACTIVE2:
191*fcdf914bSbenno 		return ("ACTIVE(Oij=2)");
192*fcdf914bSbenno 	case DUAL_STA_ACTIVE3:
193*fcdf914bSbenno 		return ("ACTIVE(Oij=3)");
194*fcdf914bSbenno 	default:
195*fcdf914bSbenno 		return ("UNKNOWN");
196*fcdf914bSbenno 	}
197*fcdf914bSbenno }
198*fcdf914bSbenno 
199*fcdf914bSbenno const char *
ext_proto_name(int proto)200*fcdf914bSbenno ext_proto_name(int proto)
201*fcdf914bSbenno {
202*fcdf914bSbenno 	switch (proto) {
203*fcdf914bSbenno 	case EIGRP_EXT_PROTO_IGRP:
204*fcdf914bSbenno 		return ("IGRP");
205*fcdf914bSbenno 	case EIGRP_EXT_PROTO_EIGRP:
206*fcdf914bSbenno 		return ("EIGRP");
207*fcdf914bSbenno 	case EIGRP_EXT_PROTO_STATIC:
208*fcdf914bSbenno 		return ("Static");
209*fcdf914bSbenno 	case EIGRP_EXT_PROTO_RIP:
210*fcdf914bSbenno 		return ("RIP");
211*fcdf914bSbenno 	case EIGRP_EXT_PROTO_HELLO:
212*fcdf914bSbenno 		return ("HELLO");
213*fcdf914bSbenno 	case EIGRP_EXT_PROTO_OSPF:
214*fcdf914bSbenno 		return ("OSPF");
215*fcdf914bSbenno 	case EIGRP_EXT_PROTO_ISIS:
216*fcdf914bSbenno 		return ("ISIS");
217*fcdf914bSbenno 	case EIGRP_EXT_PROTO_EGP:
218*fcdf914bSbenno 		return ("EGP");
219*fcdf914bSbenno 	case EIGRP_EXT_PROTO_BGP:
220*fcdf914bSbenno 		return ("BGP");
221*fcdf914bSbenno 	case EIGRP_EXT_PROTO_IDRP:
222*fcdf914bSbenno 		return ("IDRP");
223*fcdf914bSbenno 	case EIGRP_EXT_PROTO_CONN:
224*fcdf914bSbenno 		return ("Connected");
225*fcdf914bSbenno 	default:
226*fcdf914bSbenno 		return ("UNKNOWN");
227*fcdf914bSbenno 	}
228*fcdf914bSbenno }
229