summaryrefslogtreecommitdiffstats
path: root/ospfd/ospf_dump_api.c
blob: 4b68b006e2b1241b39770e9279cbd285afff598c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * OSPFd dump routine (parts used by ospfclient).
 * Copyright (C) 1999, 2000 Toshiaki Takada
 *
 * This file is part of FRRouting (FRR).
 *
 * FRR is free software; you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2, or (at your option) any later version.
 *
 * FRR is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; see the file COPYING; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <zebra.h>

#include "log.h"
#include "prefix.h"

#include "ospf_dump_api.h"
#include "ospfd.h"
#include "ospf_asbr.h"
#include "ospf_lsa.h"
#include "ospf_nsm.h"
#include "ospf_ism.h"

const struct message ospf_ism_state_msg[] = {
	{ISM_DependUpon, "DependUpon"},
	{ISM_Down, "Down"},
	{ISM_Loopback, "Loopback"},
	{ISM_Waiting, "Waiting"},
	{ISM_PointToPoint, "Point-To-Point"},
	{ISM_DROther, "DROther"},
	{ISM_Backup, "Backup"},
	{ISM_DR, "DR"},
	{0}};

const struct message ospf_nsm_state_msg[] = {{NSM_DependUpon, "DependUpon"},
					     {NSM_Deleted, "Deleted"},
					     {NSM_Down, "Down"},
					     {NSM_Attempt, "Attempt"},
					     {NSM_Init, "Init"},
					     {NSM_TwoWay, "2-Way"},
					     {NSM_ExStart, "ExStart"},
					     {NSM_Exchange, "Exchange"},
					     {NSM_Loading, "Loading"},
					     {NSM_Full, "Full"},
					     {0}};

const struct message ospf_lsa_type_msg[] = {
	{OSPF_UNKNOWN_LSA, "unknown"},
	{OSPF_ROUTER_LSA, "router-LSA"},
	{OSPF_NETWORK_LSA, "network-LSA"},
	{OSPF_SUMMARY_LSA, "summary-LSA"},
	{OSPF_ASBR_SUMMARY_LSA, "summary-LSA"},
	{OSPF_AS_EXTERNAL_LSA, "AS-external-LSA"},
	{OSPF_GROUP_MEMBER_LSA, "GROUP MEMBER LSA"},
	{OSPF_AS_NSSA_LSA, "NSSA-LSA"},
	{8, "Type-8 LSA"},
	{OSPF_OPAQUE_LINK_LSA, "Link-Local Opaque-LSA"},
	{OSPF_OPAQUE_AREA_LSA, "Area-Local Opaque-LSA"},
	{OSPF_OPAQUE_AS_LSA, "AS-external Opaque-LSA"},
	{0}};

const struct message ospf_link_state_id_type_msg[] = {
	{OSPF_UNKNOWN_LSA, "(unknown)"},
	{OSPF_ROUTER_LSA, ""},
	{OSPF_NETWORK_LSA, "(address of Designated Router)"},
	{OSPF_SUMMARY_LSA, "(summary Network Number)"},
	{OSPF_ASBR_SUMMARY_LSA, "(AS Boundary Router address)"},
	{OSPF_AS_EXTERNAL_LSA, "(External Network Number)"},
	{OSPF_GROUP_MEMBER_LSA, "(Group membership information)"},
	{OSPF_AS_NSSA_LSA, "(External Network Number for NSSA)"},
	{8, "(Type-8 LSID)"},
	{OSPF_OPAQUE_LINK_LSA, "(Link-Local Opaque-Type/ID)"},
	{OSPF_OPAQUE_AREA_LSA, "(Area-Local Opaque-Type/ID)"},
	{OSPF_OPAQUE_AS_LSA, "(AS-external Opaque-Type/ID)"},
	{0}};

const struct message ospf_network_type_msg[] = {
	{OSPF_IFTYPE_NONE, "NONE"},
	{OSPF_IFTYPE_POINTOPOINT, "Point-to-Point"},
	{OSPF_IFTYPE_BROADCAST, "Broadcast"},
	{OSPF_IFTYPE_NBMA, "NBMA"},
	{OSPF_IFTYPE_POINTOMULTIPOINT, "Point-to-MultiPoint"},
	{OSPF_IFTYPE_VIRTUALLINK, "Virtual-Link"},
	{0}};

/* AuType */
const struct message ospf_auth_type_str[] = {
	{OSPF_AUTH_NULL, "Null"},
	{OSPF_AUTH_SIMPLE, "Simple"},
	{OSPF_AUTH_CRYPTOGRAPHIC, "Cryptographic"},
	{0}};

#define OSPF_OPTION_STR_MAXLEN		24

char *ospf_options_dump(uint8_t options)
{
	static char buf[OSPF_OPTION_STR_MAXLEN];

	snprintf(buf, sizeof(buf), "*|%s|%s|%s|%s|%s|%s|%s",
		 (options & OSPF_OPTION_O) ? "O" : "-",
		 (options & OSPF_OPTION_DC) ? "DC" : "-",
		 (options & OSPF_OPTION_EA) ? "EA" : "-",
		 (options & OSPF_OPTION_NP) ? "N/P" : "-",
		 (options & OSPF_OPTION_MC) ? "MC" : "-",
		 (options & OSPF_OPTION_E) ? "E" : "-",
		 (options & OSPF_OPTION_MT) ? "M/T" : "-");

	return buf;
}

void ospf_lsa_header_dump(struct lsa_header *lsah)
{
	const char *lsah_type = lookup_msg(ospf_lsa_type_msg, lsah->type, NULL);

	zlog_debug("  LSA Header");
	zlog_debug("    LS age %d", ntohs(lsah->ls_age));
	zlog_debug("    Options %d (%s)", lsah->options,
		   ospf_options_dump(lsah->options));
	zlog_debug("    LS type %d (%s)", lsah->type,
		   (lsah->type ? lsah_type : "unknown type"));
	zlog_debug("    Link State ID %pI4", &lsah->id);
	zlog_debug("    Advertising Router %pI4", &lsah->adv_router);
	zlog_debug("    LS sequence number 0x%lx",
		   (unsigned long)ntohl(lsah->ls_seqnum));
	zlog_debug("    LS checksum 0x%x", ntohs(lsah->checksum));
	zlog_debug("    length %d", ntohs(lsah->length));
}