xref: /freebsd/usr.sbin/rtsold/dump.c (revision 259df286b980d422dff9c9e31a0a0810bdf04a42)
17d56d374SYoshinobu Inoue /*
27d56d374SYoshinobu Inoue  * Copyright (C) 1999 WIDE Project.
37d56d374SYoshinobu Inoue  * All rights reserved.
47d56d374SYoshinobu Inoue  *
57d56d374SYoshinobu Inoue  * Redistribution and use in source and binary forms, with or without
67d56d374SYoshinobu Inoue  * modification, are permitted provided that the following conditions
77d56d374SYoshinobu Inoue  * are met:
87d56d374SYoshinobu Inoue  * 1. Redistributions of source code must retain the above copyright
97d56d374SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer.
107d56d374SYoshinobu Inoue  * 2. Redistributions in binary form must reproduce the above copyright
117d56d374SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer in the
127d56d374SYoshinobu Inoue  *    documentation and/or other materials provided with the distribution.
137d56d374SYoshinobu Inoue  * 3. Neither the name of the project nor the names of its contributors
147d56d374SYoshinobu Inoue  *    may be used to endorse or promote products derived from this software
157d56d374SYoshinobu Inoue  *    without specific prior written permission.
167d56d374SYoshinobu Inoue  *
177d56d374SYoshinobu Inoue  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
187d56d374SYoshinobu Inoue  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
197d56d374SYoshinobu Inoue  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
207d56d374SYoshinobu Inoue  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
217d56d374SYoshinobu Inoue  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
227d56d374SYoshinobu Inoue  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
237d56d374SYoshinobu Inoue  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
247d56d374SYoshinobu Inoue  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
257d56d374SYoshinobu Inoue  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
267d56d374SYoshinobu Inoue  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
277d56d374SYoshinobu Inoue  * SUCH DAMAGE.
287d56d374SYoshinobu Inoue  *
297d56d374SYoshinobu Inoue  * $FreeBSD$
307d56d374SYoshinobu Inoue  */
317d56d374SYoshinobu Inoue 
327d56d374SYoshinobu Inoue #include <sys/types.h>
337d56d374SYoshinobu Inoue #include <sys/time.h>
34259df286SKris Kennaway #include <sys/socket.h>
357d56d374SYoshinobu Inoue 
36259df286SKris Kennaway #include <net/if.h>
377d56d374SYoshinobu Inoue #include <netinet/in.h>
387d56d374SYoshinobu Inoue #include <netinet/icmp6.h>
397d56d374SYoshinobu Inoue 
407d56d374SYoshinobu Inoue #include <syslog.h>
417d56d374SYoshinobu Inoue #include <time.h>
427d56d374SYoshinobu Inoue #include <stdio.h>
437d56d374SYoshinobu Inoue #include <string.h>
447d56d374SYoshinobu Inoue #include <errno.h>
457d56d374SYoshinobu Inoue 
467d56d374SYoshinobu Inoue #include "rtsold.h"
477d56d374SYoshinobu Inoue 
487d56d374SYoshinobu Inoue static FILE *fp;
497d56d374SYoshinobu Inoue 
507d56d374SYoshinobu Inoue extern struct ifinfo *iflist;
517d56d374SYoshinobu Inoue 
52259df286SKris Kennaway static void dump_interface_status __P((void));
537d56d374SYoshinobu Inoue static char *sec2str __P((time_t));
547d56d374SYoshinobu Inoue char *ifstatstr[] = {"IDLE", "DELAY", "PROBE", "DOWN", "TENTATIVE"};
557d56d374SYoshinobu Inoue 
567d56d374SYoshinobu Inoue static void
577d56d374SYoshinobu Inoue dump_interface_status()
587d56d374SYoshinobu Inoue {
597d56d374SYoshinobu Inoue 	struct ifinfo *ifinfo;
607d56d374SYoshinobu Inoue 	struct timeval now;
617d56d374SYoshinobu Inoue 
627d56d374SYoshinobu Inoue 	gettimeofday(&now, NULL);
637d56d374SYoshinobu Inoue 
647d56d374SYoshinobu Inoue 	for (ifinfo = iflist; ifinfo; ifinfo = ifinfo->next) {
657d56d374SYoshinobu Inoue 		fprintf(fp, "Interface %s\n", ifinfo->ifname);
667d56d374SYoshinobu Inoue 		fprintf(fp, "  probe interval: ");
677d56d374SYoshinobu Inoue 		if (ifinfo->probeinterval) {
687d56d374SYoshinobu Inoue 			fprintf(fp, "%d\n", ifinfo->probeinterval);
697d56d374SYoshinobu Inoue 			fprintf(fp, "  probe timer: %d\n", ifinfo->probetimer);
707d56d374SYoshinobu Inoue 		}
717d56d374SYoshinobu Inoue 		else {
727d56d374SYoshinobu Inoue 			fprintf(fp, "infinity\n");
737d56d374SYoshinobu Inoue 			fprintf(fp, "  no probe timer\n");
747d56d374SYoshinobu Inoue 		}
757d56d374SYoshinobu Inoue 		fprintf(fp, "  interface status: %s\n",
767d56d374SYoshinobu Inoue 			ifinfo->active > 0 ? "active" : "inactive");
777d56d374SYoshinobu Inoue 		fprintf(fp, "  rtsold status: %s\n", ifstatstr[ifinfo->state]);
787d56d374SYoshinobu Inoue 		fprintf(fp, "  carrier detection: %s\n",
797d56d374SYoshinobu Inoue 			ifinfo->mediareqok ? "available" : "unavailable");
807d56d374SYoshinobu Inoue 		fprintf(fp, "  probes: %d, dadcount = %d\n",
817d56d374SYoshinobu Inoue 			ifinfo->probes, ifinfo->dadcount);
827d56d374SYoshinobu Inoue 		if (ifinfo->timer.tv_sec == tm_max.tv_sec &&
837d56d374SYoshinobu Inoue 		    ifinfo->timer.tv_usec == tm_max.tv_usec)
847d56d374SYoshinobu Inoue 			fprintf(fp, "  no timer\n");
857d56d374SYoshinobu Inoue 		else {
867d56d374SYoshinobu Inoue 			fprintf(fp, "  timer: interval=%d:%d, expire=%s\n",
877d56d374SYoshinobu Inoue 				(int)ifinfo->timer.tv_sec,
887d56d374SYoshinobu Inoue 				(int)ifinfo->timer.tv_usec,
897d56d374SYoshinobu Inoue 				(ifinfo->expire.tv_sec < now.tv_sec) ? "expired"
907d56d374SYoshinobu Inoue 				: sec2str(ifinfo->expire.tv_sec - now.tv_sec));
917d56d374SYoshinobu Inoue 		}
927d56d374SYoshinobu Inoue 		fprintf(fp, "  number of valid RAs: %d\n", ifinfo->racnt);
937d56d374SYoshinobu Inoue 	}
947d56d374SYoshinobu Inoue }
957d56d374SYoshinobu Inoue 
967d56d374SYoshinobu Inoue void
977d56d374SYoshinobu Inoue rtsold_dump_file(dumpfile)
987d56d374SYoshinobu Inoue 	char *dumpfile;
997d56d374SYoshinobu Inoue {
1007d56d374SYoshinobu Inoue 	if ((fp = fopen(dumpfile, "w")) == NULL) {
1017d56d374SYoshinobu Inoue 		warnmsg(LOG_WARNING, __FUNCTION__, "open a dump file(%s)",
1027d56d374SYoshinobu Inoue 			dumpfile, strerror(errno));
1037d56d374SYoshinobu Inoue 		return;
1047d56d374SYoshinobu Inoue 	}
1057d56d374SYoshinobu Inoue 
1067d56d374SYoshinobu Inoue 	dump_interface_status();
1077d56d374SYoshinobu Inoue 
1087d56d374SYoshinobu Inoue 	fclose(fp);
1097d56d374SYoshinobu Inoue }
1107d56d374SYoshinobu Inoue 
1117d56d374SYoshinobu Inoue static char *
1127d56d374SYoshinobu Inoue sec2str(total)
1137d56d374SYoshinobu Inoue 	time_t total;
1147d56d374SYoshinobu Inoue {
1157d56d374SYoshinobu Inoue 	static char result[256];
1167d56d374SYoshinobu Inoue 	int days, hours, mins, secs;
1177d56d374SYoshinobu Inoue 	int first = 1;
1187d56d374SYoshinobu Inoue 	char *p = result;
1197d56d374SYoshinobu Inoue 
1207d56d374SYoshinobu Inoue 	days = total / 3600 / 24;
1217d56d374SYoshinobu Inoue 	hours = (total / 3600) % 24;
1227d56d374SYoshinobu Inoue 	mins = (total / 60) % 60;
1237d56d374SYoshinobu Inoue 	secs = total % 60;
1247d56d374SYoshinobu Inoue 
1257d56d374SYoshinobu Inoue 	if (days) {
1267d56d374SYoshinobu Inoue 		first = 0;
1277d56d374SYoshinobu Inoue 		p += sprintf(p, "%dd", days);
1287d56d374SYoshinobu Inoue 	}
1297d56d374SYoshinobu Inoue 	if (!first || hours) {
1307d56d374SYoshinobu Inoue 		first = 0;
1317d56d374SYoshinobu Inoue 		p += sprintf(p, "%dh", hours);
1327d56d374SYoshinobu Inoue 	}
1337d56d374SYoshinobu Inoue 	if (!first || mins) {
1347d56d374SYoshinobu Inoue 		first = 0;
1357d56d374SYoshinobu Inoue 		p += sprintf(p, "%dm", mins);
1367d56d374SYoshinobu Inoue 	}
1377d56d374SYoshinobu Inoue 	sprintf(p, "%ds", secs);
1387d56d374SYoshinobu Inoue 
1397d56d374SYoshinobu Inoue 	return(result);
1407d56d374SYoshinobu Inoue }
141