1/*	$OpenBSD: printconf.c,v 1.6 2016/09/02 16:44:33 renato Exp $ */
2
3/*
4 * Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
5 *
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.
9 *
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.
17 */
18
19#include <sys/types.h>
20
21#include <arpa/inet.h>
22#include <stdio.h>
23
24#include "eigrpd.h"
25#include "log.h"
26
27static void		 print_mainconf(struct eigrpd_conf *);
28static const char	*print_no(uint16_t);
29static void		 print_redist_metric(struct redist_metric *);
30static void		 print_redistribute(struct eigrp *);
31static void		 print_iface(struct eigrp_iface *);
32static void		 print_as(struct eigrp *);
33static void		 print_af(struct eigrpd_conf *, int);
34
35static void
36print_mainconf(struct eigrpd_conf *conf)
37{
38	printf("router-id %s\n", inet_ntoa(conf->rtr_id));
39
40	if (conf->flags & EIGRPD_FLAG_NO_FIB_UPDATE)
41		printf("fib-update no\n");
42	else
43		printf("fib-update yes\n");
44
45	printf("rdomain %u\n", conf->rdomain);
46	printf("fib-priority-internal %u\n", conf->fib_priority_internal);
47	printf("fib-priority-external %u\n", conf->fib_priority_external);
48	printf("fib-priority-summary %u\n", conf->fib_priority_summary);
49}
50
51static const char *
52print_no(uint16_t type)
53{
54	if (type & REDIST_NO)
55		return ("no ");
56	else
57		return ("");
58}
59
60static void
61print_redist_metric(struct redist_metric *metric)
62{
63	printf(" %u %u %u %u %u", metric->bandwidth, metric->delay,
64	    metric->reliability, metric->load, metric->mtu);
65}
66
67static void
68print_redistribute(struct eigrp *eigrp)
69{
70	struct redistribute	*r;
71
72	if (eigrp->dflt_metric) {
73		printf("\t\tdefault-metric");
74		print_redist_metric(eigrp->dflt_metric);
75		printf("\n");
76	}
77
78	SIMPLEQ_FOREACH(r, &eigrp->redist_list, entry) {
79		switch (r->type & ~REDIST_NO) {
80		case REDIST_STATIC:
81			printf("\t\t%sredistribute static", print_no(r->type));
82			break;
83		case REDIST_RIP:
84			printf("\t\t%sredistribute rip", print_no(r->type));
85			break;
86		case REDIST_OSPF:
87			printf("\t\t%sredistribute ospf", print_no(r->type));
88			break;
89		case REDIST_CONNECTED:
90			printf("\t\t%sredistribute connected",
91			    print_no(r->type));
92			break;
93		case REDIST_DEFAULT:
94			printf("\t\t%sredistribute default", print_no(r->type));
95			break;
96		case REDIST_ADDR:
97			printf("\t\t%sredistribute %s/%u",
98			    print_no(r->type), log_addr(r->af, &r->addr),
99			    r->prefixlen);
100			break;
101		}
102
103		if (r->metric) {
104			printf(" metric");
105			print_redist_metric(r->metric);
106		}
107		printf("\n");
108	}
109}
110
111static void
112print_iface(struct eigrp_iface *ei)
113{
114	struct summary_addr	*summary;
115
116	printf("\t\tinterface %s {\n", ei->iface->name);
117	printf("\t\t\thello-interval %u\n", ei->hello_interval);
118	printf("\t\t\tholdtime %u\n", ei->hello_holdtime);
119	printf("\t\t\tdelay %u\n", ei->delay);
120	printf("\t\t\tbandwidth %u\n", ei->bandwidth);
121	printf("\t\t\tsplit-horizon %s\n", (ei->splithorizon) ? "yes" : "no");
122	if (ei->passive)
123		printf("\t\t\tpassive\n");
124	TAILQ_FOREACH(summary, &ei->summary_list, entry)
125		printf("\t\t\tsummary-address %s/%u\n", log_addr(ei->eigrp->af,
126		    &summary->prefix), summary->prefixlen);
127	printf("\t\t}\n");
128}
129
130static void
131print_as(struct eigrp *eigrp)
132{
133	struct eigrp_iface	*ei;
134
135	printf("\tautonomous-system %u {\n", eigrp->as);
136	printf("\t\tk-values %u %u %u %u %u %u\n", eigrp->kvalues[0],
137	    eigrp->kvalues[1], eigrp->kvalues[2], eigrp->kvalues[3],
138	    eigrp->kvalues[4], eigrp->kvalues[5]);
139	printf("\t\tactive-timeout %u\n", eigrp->active_timeout);
140	printf("\t\tmaximum-hops %u\n", eigrp->maximum_hops);
141	printf("\t\tmaximum-paths %u\n", eigrp->maximum_paths);
142	printf("\t\tvariance %u\n", eigrp->variance);
143	print_redistribute(eigrp);
144	printf("\n");
145	TAILQ_FOREACH(ei, &eigrp->ei_list, e_entry)
146		print_iface(ei);
147	printf("\t}\n");
148}
149
150static void
151print_af(struct eigrpd_conf *conf, int af)
152{
153	struct eigrp	*eigrp;
154
155	printf("address-family %s {\n", af_name(af));
156	TAILQ_FOREACH(eigrp, &conf->instances, entry)
157		if (eigrp->af == af)
158			print_as(eigrp);
159	printf("}\n\n");
160}
161
162void
163print_config(struct eigrpd_conf *conf)
164{
165	printf("\n");
166	print_mainconf(conf);
167	printf("\n");
168
169	print_af(conf, AF_INET);
170	print_af(conf, AF_INET6);
171}
172