xref: /openbsd/usr.sbin/eigrpd/printconf.c (revision 76d0caae)
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 
27 static void		 print_mainconf(struct eigrpd_conf *);
28 static const char	*print_no(uint16_t);
29 static void		 print_redist_metric(struct redist_metric *);
30 static void		 print_redistribute(struct eigrp *);
31 static void		 print_iface(struct eigrp_iface *);
32 static void		 print_as(struct eigrp *);
33 static void		 print_af(struct eigrpd_conf *, int);
34 
35 static void
36 print_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 
51 static const char *
52 print_no(uint16_t type)
53 {
54 	if (type & REDIST_NO)
55 		return ("no ");
56 	else
57 		return ("");
58 }
59 
60 static void
61 print_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 
67 static void
68 print_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 
111 static void
112 print_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 
130 static void
131 print_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 
150 static void
151 print_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 
162 void
163 print_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