1*09e8f780Sremi /* $OpenBSD: printconf.c,v 1.22 2020/01/21 20:38:52 remi Exp $ */
204fa3fdbSnorby
304fa3fdbSnorby /*
404fa3fdbSnorby * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
504fa3fdbSnorby *
604fa3fdbSnorby * Permission to use, copy, modify, and distribute this software for any
704fa3fdbSnorby * purpose with or without fee is hereby granted, provided that the above
804fa3fdbSnorby * copyright notice and this permission notice appear in all copies.
904fa3fdbSnorby *
1004fa3fdbSnorby * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1104fa3fdbSnorby * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1204fa3fdbSnorby * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1304fa3fdbSnorby * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1404fa3fdbSnorby * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1504fa3fdbSnorby * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1604fa3fdbSnorby * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1704fa3fdbSnorby */
1804fa3fdbSnorby
1904fa3fdbSnorby #include <sys/queue.h>
2004fa3fdbSnorby #include <sys/types.h>
2104fa3fdbSnorby #include <sys/socket.h>
2204fa3fdbSnorby #include <netinet/in.h>
2304fa3fdbSnorby #include <arpa/inet.h>
2404fa3fdbSnorby
2504fa3fdbSnorby #include <stdio.h>
2604fa3fdbSnorby
2704fa3fdbSnorby #include "ospf.h"
2804fa3fdbSnorby #include "ospfd.h"
2904fa3fdbSnorby #include "ospfe.h"
3004fa3fdbSnorby
3104fa3fdbSnorby void print_mainconf(struct ospfd_conf *);
32619421e7Sclaudio const char *print_no(u_int16_t);
336fa28760Sclaudio void print_redistribute(struct redist_list *);
34fcb4545bSreyk void print_rtlabel(struct ospfd_conf *);
3504fa3fdbSnorby void print_iface(struct iface *);
3604fa3fdbSnorby
3704fa3fdbSnorby void
print_mainconf(struct ospfd_conf * conf)3804fa3fdbSnorby print_mainconf(struct ospfd_conf *conf)
3904fa3fdbSnorby {
40bbb232d2Sclaudio printf("router-id %s\n", inet_ntoa(conf->rtr_id));
41bbb232d2Sclaudio
427b65b443Sjoel if (conf->flags & OSPFD_FLAG_NO_FIB_UPDATE)
4304fa3fdbSnorby printf("fib-update no\n");
447b65b443Sjoel else
457b65b443Sjoel printf("fib-update yes\n");
4604fa3fdbSnorby
474c260f66Sremi printf("fib-priority %hhu\n", conf->fib_priority);
484c260f66Sremi
4963712a2cSremi if (conf->rdomain)
5063712a2cSremi printf("rdomain %d\n", conf->rdomain);
5163712a2cSremi
5204fa3fdbSnorby if (conf->rfc1583compat)
5304fa3fdbSnorby printf("rfc1583compat yes\n");
5404fa3fdbSnorby else
5504fa3fdbSnorby printf("rfc1583compat no\n");
5604fa3fdbSnorby
571891964aSclaudio if (conf->flags & OSPFD_FLAG_STUB_ROUTER)
581891964aSclaudio printf("stub router yes\n");
591891964aSclaudio
606fa28760Sclaudio print_redistribute(&conf->redist_list);
61fcb4545bSreyk print_rtlabel(conf);
6204fa3fdbSnorby
6337877ca4Sdlg printf("spf-delay msec %u\n", conf->spf_delay);
6437877ca4Sdlg printf("spf-holdtime msec %u\n", conf->spf_hold_time);
6504fa3fdbSnorby }
6604fa3fdbSnorby
67619421e7Sclaudio const char *
print_no(u_int16_t type)68619421e7Sclaudio print_no(u_int16_t type)
69619421e7Sclaudio {
70619421e7Sclaudio if (type & REDIST_NO)
71619421e7Sclaudio return ("no ");
72619421e7Sclaudio else
73619421e7Sclaudio return ("");
74619421e7Sclaudio }
75619421e7Sclaudio
7604fa3fdbSnorby void
print_redistribute(struct redist_list * rlh)776fa28760Sclaudio print_redistribute(struct redist_list *rlh)
78bbb232d2Sclaudio {
79bbb232d2Sclaudio struct redistribute *r;
80bbb232d2Sclaudio
816fa28760Sclaudio SIMPLEQ_FOREACH(r, rlh, entry) {
82619421e7Sclaudio switch (r->type & ~REDIST_NO) {
83bbb232d2Sclaudio case REDIST_STATIC:
840828178eSsthen printf("%sredistribute static ", print_no(r->type));
85bbb232d2Sclaudio break;
86bbb232d2Sclaudio case REDIST_CONNECTED:
870828178eSsthen printf("%sredistribute connected ", print_no(r->type));
88bbb232d2Sclaudio break;
89bbb232d2Sclaudio case REDIST_LABEL:
900828178eSsthen printf("%sredistribute rtlabel %s ",
91619421e7Sclaudio print_no(r->type), rtlabel_id2name(r->label));
92bbb232d2Sclaudio break;
93bbb232d2Sclaudio case REDIST_ADDR:
940828178eSsthen printf("%sredistribute %s/%d ",
95471ee2ebSclaudio print_no(r->type), inet_ntoa(r->addr),
96471ee2ebSclaudio mask2prefixlen(r->mask.s_addr));
97bbb232d2Sclaudio break;
986fa28760Sclaudio case REDIST_DEFAULT:
990828178eSsthen printf("%sredistribute default ", print_no(r->type));
1006fa28760Sclaudio break;
101bbb232d2Sclaudio }
102ac149fe2Sremi printf("set { metric %d type %d }",
1030828178eSsthen (r->metric & LSA_METRIC_MASK),
1040828178eSsthen ((r->metric & LSA_ASEXT_E_FLAG) == 0 ? 1 : 2));
105ac149fe2Sremi if (r->dependon[0])
106ac149fe2Sremi printf(" depend on %s", r->dependon);
107ac149fe2Sremi printf("\n");
108bbb232d2Sclaudio }
109bbb232d2Sclaudio }
110bbb232d2Sclaudio
111bbb232d2Sclaudio void
print_rtlabel(struct ospfd_conf * conf)112fcb4545bSreyk print_rtlabel(struct ospfd_conf *conf)
113fcb4545bSreyk {
114fcb4545bSreyk struct n2id_label *label;
115fcb4545bSreyk
116fcb4545bSreyk TAILQ_FOREACH(label, &rt_labels, entry)
117fcb4545bSreyk if (label->ext_tag)
118fcb4545bSreyk printf("rtlabel \"%s\" external-tag %u\n",
119fcb4545bSreyk label->name, label->ext_tag);
120fcb4545bSreyk }
121fcb4545bSreyk
122fcb4545bSreyk void
print_iface(struct iface * iface)12304fa3fdbSnorby print_iface(struct iface *iface)
12404fa3fdbSnorby {
12504fa3fdbSnorby struct auth_md *md;
12604fa3fdbSnorby
1276c342f83Sclaudio printf("\tinterface %s:%s {\n", iface->name, inet_ntoa(iface->addr));
12804fa3fdbSnorby
12904fa3fdbSnorby printf("\t\tmetric %d\n", iface->metric);
13004fa3fdbSnorby
131ac149fe2Sremi if (iface->demote_group[0] != '\0')
132fba2d3d0Sclaudio printf("\t\tdemote %s\n", iface->demote_group);
133ac149fe2Sremi if (iface->dependon[0] != '\0')
134ac149fe2Sremi printf("\t\tdepend on %s\n", iface->dependon);
135a0971166Ssthen if (iface->passive)
136a0971166Ssthen printf("\t\tpassive\n");
137a0971166Ssthen else {
13804fa3fdbSnorby printf("\t\tretransmit-interval %d\n", iface->rxmt_interval);
1397afdfd2dSdlg if (iface->dead_interval == FAST_RTR_DEAD_TIME) {
1407afdfd2dSdlg printf("\t\trouter-dead-time minimal\n");
1417afdfd2dSdlg printf("\t\tfast-hello-interval msec %u\n",
1427afdfd2dSdlg iface->fast_hello_interval);
1437afdfd2dSdlg } else {
144a0971166Ssthen printf("\t\trouter-dead-time %d\n",
145a0971166Ssthen iface->dead_interval);
146a0971166Ssthen printf("\t\thello-interval %d\n",
147a0971166Ssthen iface->hello_interval);
1487afdfd2dSdlg }
14904fa3fdbSnorby printf("\t\trouter-priority %d\n", iface->priority);
15004fa3fdbSnorby printf("\t\ttransmit-delay %d\n", iface->transmit_delay);
15104fa3fdbSnorby
152*09e8f780Sremi if (iface->type == IF_TYPE_POINTOPOINT)
153ef209401Sremi printf("\t\ttype p2p\n");
154ef209401Sremi
15504fa3fdbSnorby printf("\t\tauth-type %s\n", if_auth_name(iface->auth_type));
15604fa3fdbSnorby switch (iface->auth_type) {
15704fa3fdbSnorby case AUTH_TYPE_NONE:
15804fa3fdbSnorby break;
15904fa3fdbSnorby case AUTH_TYPE_SIMPLE:
16004fa3fdbSnorby printf("\t\tauth-key XXXXXX\n");
16104fa3fdbSnorby break;
16204fa3fdbSnorby case AUTH_TYPE_CRYPT:
16304fa3fdbSnorby printf("\t\tauth-md-keyid %d\n", iface->auth_keyid);
16404fa3fdbSnorby TAILQ_FOREACH(md, &iface->auth_md_list, entry)
16504fa3fdbSnorby printf("\t\tauth-md %d XXXXXX\n", md->keyid);
16604fa3fdbSnorby break;
16704fa3fdbSnorby default:
16804fa3fdbSnorby printf("\t\tunknown auth type!\n");
16904fa3fdbSnorby break;
17004fa3fdbSnorby }
171a0971166Ssthen }
17204fa3fdbSnorby
17304fa3fdbSnorby printf("\t}\n");
17404fa3fdbSnorby }
17504fa3fdbSnorby
17604fa3fdbSnorby void
print_config(struct ospfd_conf * conf)17704fa3fdbSnorby print_config(struct ospfd_conf *conf)
17804fa3fdbSnorby {
17904fa3fdbSnorby struct area *area;
18004fa3fdbSnorby struct iface *iface;
18104fa3fdbSnorby
18204fa3fdbSnorby printf("\n");
18304fa3fdbSnorby print_mainconf(conf);
18404fa3fdbSnorby printf("\n");
18504fa3fdbSnorby
18604fa3fdbSnorby LIST_FOREACH(area, &conf->area_list, entry) {
18704fa3fdbSnorby printf("area %s {\n", inet_ntoa(area->id));
1886fa28760Sclaudio if (area->stub) {
1896fa28760Sclaudio printf("\tstub");
1906fa28760Sclaudio if (SIMPLEQ_EMPTY(&area->redist_list))
1916fa28760Sclaudio printf("\n");
1926fa28760Sclaudio else {
1936fa28760Sclaudio printf(" ");
1946fa28760Sclaudio print_redistribute(&area->redist_list);
1956fa28760Sclaudio }
1966fa28760Sclaudio }
197fba2d3d0Sclaudio if (*area->demote_group)
198fba2d3d0Sclaudio printf("\tdemote %s %d\n", area->demote_group,
199fba2d3d0Sclaudio area->demote_level);
20004fa3fdbSnorby LIST_FOREACH(iface, &area->iface_list, entry) {
20104fa3fdbSnorby print_iface(iface);
20204fa3fdbSnorby }
20304fa3fdbSnorby printf("}\n\n");
20404fa3fdbSnorby }
20504fa3fdbSnorby }
206