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
print_mainconf(struct eigrpd_conf * conf)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 *
print_no(uint16_t type)52 print_no(uint16_t type)
53 {
54 if (type & REDIST_NO)
55 return ("no ");
56 else
57 return ("");
58 }
59
60 static void
print_redist_metric(struct redist_metric * metric)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
print_redistribute(struct eigrp * eigrp)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
print_iface(struct eigrp_iface * ei)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
print_as(struct eigrp * eigrp)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
print_af(struct eigrpd_conf * conf,int af)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
print_config(struct eigrpd_conf * conf)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