blob: 10bce3e8ab4f0a8679efc23c85f343f3a6babc4e [file] [log] [blame]
jardineb5d44e2003-12-23 08:09:43 +00001/*
2 * IS-IS Rout(e)ing protocol - isis_adjacency.c
3 * handling of IS-IS adjacencies
4 *
5 * Copyright (C) 2001,2002 Sampo Saaristo
6 * Tampere University of Technology
7 * Institute of Communications Engineering
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public Licenseas published by the Free
11 * Software Foundation; either version 2 of the License, or (at your option)
12 * any later version.
13 *
14 * This program is distributed in the hope that it will be useful,but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * more details.
18
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 */
23
jardineb5d44e2003-12-23 08:09:43 +000024#include <zebra.h>
jardineb5d44e2003-12-23 08:09:43 +000025
26#include "log.h"
27#include "memory.h"
28#include "hash.h"
29#include "vty.h"
30#include "linklist.h"
31#include "thread.h"
32#include "if.h"
33#include "stream.h"
34
35#include "isisd/dict.h"
36#include "isisd/include-netbsd/iso.h"
37#include "isisd/isis_constants.h"
38#include "isisd/isis_common.h"
Josh Bailey3f045a02012-03-24 08:35:20 -070039#include "isisd/isis_flags.h"
jardineb5d44e2003-12-23 08:09:43 +000040#include "isisd/isisd.h"
41#include "isisd/isis_circuit.h"
42#include "isisd/isis_adjacency.h"
43#include "isisd/isis_misc.h"
44#include "isisd/isis_dr.h"
45#include "isisd/isis_dynhn.h"
46#include "isisd/isis_pdu.h"
Josh Bailey3f045a02012-03-24 08:35:20 -070047#include "isisd/isis_tlv.h"
48#include "isisd/isis_lsp.h"
49#include "isisd/isis_spf.h"
50#include "isisd/isis_events.h"
jardineb5d44e2003-12-23 08:09:43 +000051
jardineb5d44e2003-12-23 08:09:43 +000052extern struct isis *isis;
53
hasso92365882005-01-18 13:53:33 +000054static struct isis_adjacency *
hassof390d2c2004-09-10 20:48:21 +000055adj_alloc (u_char * id)
jardineb5d44e2003-12-23 08:09:43 +000056{
hassof390d2c2004-09-10 20:48:21 +000057 struct isis_adjacency *adj;
jardineb5d44e2003-12-23 08:09:43 +000058
hassoaac372f2005-09-01 17:52:33 +000059 adj = XCALLOC (MTYPE_ISIS_ADJACENCY, sizeof (struct isis_adjacency));
hassof390d2c2004-09-10 20:48:21 +000060 memcpy (adj->sysid, id, ISIS_SYS_ID_LEN);
61
62 return adj;
jardineb5d44e2003-12-23 08:09:43 +000063}
64
65struct isis_adjacency *
hassof390d2c2004-09-10 20:48:21 +000066isis_new_adj (u_char * id, u_char * snpa, int level,
jardineb5d44e2003-12-23 08:09:43 +000067 struct isis_circuit *circuit)
68{
jardineb5d44e2003-12-23 08:09:43 +000069 struct isis_adjacency *adj;
hassof390d2c2004-09-10 20:48:21 +000070 int i;
jardineb5d44e2003-12-23 08:09:43 +000071
hassof390d2c2004-09-10 20:48:21 +000072 adj = adj_alloc (id); /* P2P kludge */
73
74 if (adj == NULL)
75 {
76 zlog_err ("Out of memory!");
77 return NULL;
78 }
jardineb5d44e2003-12-23 08:09:43 +000079
Paul Jakma41b36e92006-12-08 01:09:50 +000080 if (snpa) {
Josh Bailey3f045a02012-03-24 08:35:20 -070081 memcpy (adj->snpa, snpa, ETH_ALEN);
Paul Jakma41b36e92006-12-08 01:09:50 +000082 } else {
Josh Bailey3f045a02012-03-24 08:35:20 -070083 memset (adj->snpa, ' ', ETH_ALEN);
Paul Jakma41b36e92006-12-08 01:09:50 +000084 }
85
jardineb5d44e2003-12-23 08:09:43 +000086 adj->circuit = circuit;
87 adj->level = level;
88 adj->flaps = 0;
89 adj->last_flap = time (NULL);
hassof390d2c2004-09-10 20:48:21 +000090 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
91 {
92 listnode_add (circuit->u.bc.adjdb[level - 1], adj);
93 adj->dischanges[level - 1] = 0;
94 for (i = 0; i < DIS_RECORDS; i++) /* clear N DIS state change records */
jardineb5d44e2003-12-23 08:09:43 +000095 {
hassof390d2c2004-09-10 20:48:21 +000096 adj->dis_record[(i * ISIS_LEVELS) + level - 1].dis
jardineb5d44e2003-12-23 08:09:43 +000097 = ISIS_UNKNOWN_DIS;
hassof390d2c2004-09-10 20:48:21 +000098 adj->dis_record[(i * ISIS_LEVELS) + level - 1].last_dis_change
99 = time (NULL);
jardineb5d44e2003-12-23 08:09:43 +0000100 }
hassof390d2c2004-09-10 20:48:21 +0000101 }
jardineb5d44e2003-12-23 08:09:43 +0000102
103 return adj;
104}
105
106struct isis_adjacency *
hassof390d2c2004-09-10 20:48:21 +0000107isis_adj_lookup (u_char * sysid, struct list *adjdb)
jardineb5d44e2003-12-23 08:09:43 +0000108{
109 struct isis_adjacency *adj;
110 struct listnode *node;
111
paul1eb8ef22005-04-07 07:30:20 +0000112 for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
113 if (memcmp (adj->sysid, sysid, ISIS_SYS_ID_LEN) == 0)
114 return adj;
hassof390d2c2004-09-10 20:48:21 +0000115
jardineb5d44e2003-12-23 08:09:43 +0000116 return NULL;
117}
118
jardineb5d44e2003-12-23 08:09:43 +0000119struct isis_adjacency *
hassof390d2c2004-09-10 20:48:21 +0000120isis_adj_lookup_snpa (u_char * ssnpa, struct list *adjdb)
jardineb5d44e2003-12-23 08:09:43 +0000121{
122 struct listnode *node;
123 struct isis_adjacency *adj;
124
paul1eb8ef22005-04-07 07:30:20 +0000125 for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
126 if (memcmp (adj->snpa, ssnpa, ETH_ALEN) == 0)
127 return adj;
hassof390d2c2004-09-10 20:48:21 +0000128
jardineb5d44e2003-12-23 08:09:43 +0000129 return NULL;
130}
131
hassof390d2c2004-09-10 20:48:21 +0000132void
Josh Bailey3f045a02012-03-24 08:35:20 -0700133isis_delete_adj (void *arg)
jardineb5d44e2003-12-23 08:09:43 +0000134{
Josh Bailey3f045a02012-03-24 08:35:20 -0700135 struct isis_adjacency *adj = arg;
136
hasso3fdb2dd2005-09-28 18:45:54 +0000137 if (!adj)
138 return;
hassof390d2c2004-09-10 20:48:21 +0000139
Josh Bailey3f045a02012-03-24 08:35:20 -0700140 THREAD_TIMER_OFF (adj->t_expire);
hasso13fb40a2005-10-01 06:03:04 +0000141
Josh Bailey3f045a02012-03-24 08:35:20 -0700142 /* remove from SPF trees */
143 spftree_area_adj_del (adj->circuit->area, adj);
144
145 if (adj->area_addrs)
146 list_delete (adj->area_addrs);
jardineb5d44e2003-12-23 08:09:43 +0000147 if (adj->ipv4_addrs)
148 list_delete (adj->ipv4_addrs);
149#ifdef HAVE_IPV6
150 if (adj->ipv6_addrs)
151 list_delete (adj->ipv6_addrs);
152#endif
Josh Bailey3f045a02012-03-24 08:35:20 -0700153
hasso3fdb2dd2005-09-28 18:45:54 +0000154 XFREE (MTYPE_ISIS_ADJACENCY, adj);
jardineb5d44e2003-12-23 08:09:43 +0000155 return;
156}
157
Josh Bailey3f045a02012-03-24 08:35:20 -0700158static const char *
159adj_state2string (int state)
160{
161
162 switch (state)
163 {
164 case ISIS_ADJ_INITIALIZING:
165 return "Initializing";
166 case ISIS_ADJ_UP:
167 return "Up";
168 case ISIS_ADJ_DOWN:
169 return "Down";
170 default:
171 return "Unknown";
172 }
173
174 return NULL; /* not reached */
175}
176
hassof390d2c2004-09-10 20:48:21 +0000177void
Josh Bailey3f045a02012-03-24 08:35:20 -0700178isis_adj_state_change (struct isis_adjacency *adj, enum isis_adj_state new_state,
hasso1cd80842004-10-07 20:07:40 +0000179 const char *reason)
jardineb5d44e2003-12-23 08:09:43 +0000180{
181 int old_state;
Josh Bailey3f045a02012-03-24 08:35:20 -0700182 int level;
jardineb5d44e2003-12-23 08:09:43 +0000183 struct isis_circuit *circuit;
hassof390d2c2004-09-10 20:48:21 +0000184
jardineb5d44e2003-12-23 08:09:43 +0000185 old_state = adj->adj_state;
Josh Bailey3f045a02012-03-24 08:35:20 -0700186 adj->adj_state = new_state;
jardineb5d44e2003-12-23 08:09:43 +0000187
188 circuit = adj->circuit;
jardineb5d44e2003-12-23 08:09:43 +0000189
hassof390d2c2004-09-10 20:48:21 +0000190 if (isis->debugs & DEBUG_ADJ_PACKETS)
191 {
hasso529d65b2004-12-24 00:14:50 +0000192 zlog_debug ("ISIS-Adj (%s): Adjacency state change %d->%d: %s",
hassof390d2c2004-09-10 20:48:21 +0000193 circuit->area->area_tag,
Josh Bailey3f045a02012-03-24 08:35:20 -0700194 old_state, new_state, reason ? reason : "unspecified");
195 }
196
197 if (circuit->area->log_adj_changes)
198 {
199 const char *adj_name;
200 struct isis_dynhn *dyn;
201
202 dyn = dynhn_find_by_id (adj->sysid);
203 if (dyn)
204 adj_name = (const char *)dyn->name.name;
205 else
206 adj_name = adj->sysid ? sysid_print (adj->sysid) : "unknown";
207
208 zlog_info ("%%ADJCHANGE: Adjacency to %s (%s) changed from %s to %s, %s",
209 adj_name,
210 adj->circuit ? adj->circuit->interface->name : "no circuit",
211 adj_state2string (old_state),
212 adj_state2string (new_state),
213 reason ? reason : "unspecified");
jardineb5d44e2003-12-23 08:09:43 +0000214 }
215
hassof390d2c2004-09-10 20:48:21 +0000216 if (circuit->circ_type == CIRCUIT_T_BROADCAST)
217 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700218 for (level = IS_LEVEL_1; level <= IS_LEVEL_2; level++)
219 {
220 if ((adj->level & level) == 0)
221 continue;
222 if (new_state == ISIS_ADJ_UP)
223 {
224 circuit->upadjcount[level - 1]++;
225 isis_event_adjacency_state_change (adj, new_state);
226 /* update counter & timers for debugging purposes */
227 adj->last_flap = time (NULL);
228 adj->flaps++;
229 }
230 else if (new_state == ISIS_ADJ_DOWN)
231 {
232 listnode_delete (circuit->u.bc.adjdb[level - 1], adj);
233 circuit->upadjcount[level - 1]--;
234 if (circuit->upadjcount[level - 1] == 0)
235 {
236 /* Clean lsp_queue when no adj is up. */
237 if (circuit->lsp_queue)
238 list_delete_all_node (circuit->lsp_queue);
239 }
240 isis_event_adjacency_state_change (adj, new_state);
241 isis_delete_adj (adj);
242 }
243 list_delete_all_node (circuit->u.bc.lan_neighs[level - 1]);
244 isis_adj_build_neigh_list (circuit->u.bc.adjdb[level - 1],
245 circuit->u.bc.lan_neighs[level - 1]);
jardineb5d44e2003-12-23 08:09:43 +0000246
Josh Bailey3f045a02012-03-24 08:35:20 -0700247 /* On adjacency state change send new pseudo LSP if we are the DR */
248 if (circuit->u.bc.is_dr[level - 1])
249 lsp_regenerate_schedule_pseudo (circuit, level);
250 }
hassof390d2c2004-09-10 20:48:21 +0000251 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700252 else if (circuit->circ_type == CIRCUIT_T_P2P)
253 {
254 for (level = IS_LEVEL_1; level <= IS_LEVEL_2; level++)
255 {
256 if ((adj->level & level) == 0)
257 continue;
258 if (new_state == ISIS_ADJ_UP)
259 {
260 circuit->upadjcount[level - 1]++;
261 isis_event_adjacency_state_change (adj, new_state);
hassof390d2c2004-09-10 20:48:21 +0000262
Josh Bailey3f045a02012-03-24 08:35:20 -0700263 if (adj->sys_type == ISIS_SYSTYPE_UNKNOWN)
264 send_hello (circuit, level);
hassof390d2c2004-09-10 20:48:21 +0000265
Josh Bailey3f045a02012-03-24 08:35:20 -0700266 /* update counter & timers for debugging purposes */
267 adj->last_flap = time (NULL);
268 adj->flaps++;
269
270 /* 7.3.17 - going up on P2P -> send CSNP */
271 /* FIXME: yup, I know its wrong... but i will do it! (for now) */
272 send_csnp (circuit, level);
273 }
274 else if (new_state == ISIS_ADJ_DOWN)
275 {
276 if (adj->circuit->u.p2p.neighbor == adj)
277 adj->circuit->u.p2p.neighbor = NULL;
278 circuit->upadjcount[level - 1]--;
279 if (circuit->upadjcount[level - 1] == 0)
280 {
281 /* Clean lsp_queue when no adj is up. */
282 if (circuit->lsp_queue)
283 list_delete_all_node (circuit->lsp_queue);
284 }
285 isis_event_adjacency_state_change (adj, new_state);
286 isis_delete_adj (adj);
287 }
288 }
hassof390d2c2004-09-10 20:48:21 +0000289 }
Josh Bailey3f045a02012-03-24 08:35:20 -0700290
jardineb5d44e2003-12-23 08:09:43 +0000291 return;
292}
293
294
295void
296isis_adj_print (struct isis_adjacency *adj)
297{
298 struct isis_dynhn *dyn;
299 struct listnode *node;
300 struct in_addr *ipv4_addr;
hassof390d2c2004-09-10 20:48:21 +0000301#ifdef HAVE_IPV6
jardineb5d44e2003-12-23 08:09:43 +0000302 struct in6_addr *ipv6_addr;
hassof390d2c2004-09-10 20:48:21 +0000303 u_char ip6[INET6_ADDRSTRLEN];
jardineb5d44e2003-12-23 08:09:43 +0000304#endif /* HAVE_IPV6 */
hassof390d2c2004-09-10 20:48:21 +0000305
306 if (!adj)
jardineb5d44e2003-12-23 08:09:43 +0000307 return;
308 dyn = dynhn_find_by_id (adj->sysid);
309 if (dyn)
hasso529d65b2004-12-24 00:14:50 +0000310 zlog_debug ("%s", dyn->name.name);
jardineb5d44e2003-12-23 08:09:43 +0000311
hasso529d65b2004-12-24 00:14:50 +0000312 zlog_debug ("SystemId %20s SNPA %s, level %d\nHolding Time %d",
313 adj->sysid ? sysid_print (adj->sysid) : "unknown",
314 snpa_print (adj->snpa), adj->level, adj->hold_time);
hassof390d2c2004-09-10 20:48:21 +0000315 if (adj->ipv4_addrs && listcount (adj->ipv4_addrs) > 0)
316 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700317 zlog_debug ("IPv4 Address(es):");
hassof390d2c2004-09-10 20:48:21 +0000318
paul1eb8ef22005-04-07 07:30:20 +0000319 for (ALL_LIST_ELEMENTS_RO (adj->ipv4_addrs, node, ipv4_addr))
320 zlog_debug ("%s", inet_ntoa (*ipv4_addr));
jardineb5d44e2003-12-23 08:09:43 +0000321 }
hassof390d2c2004-09-10 20:48:21 +0000322
323#ifdef HAVE_IPV6
324 if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0)
325 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700326 zlog_debug ("IPv6 Address(es):");
paul1eb8ef22005-04-07 07:30:20 +0000327 for (ALL_LIST_ELEMENTS_RO (adj->ipv6_addrs, node, ipv6_addr))
hassof390d2c2004-09-10 20:48:21 +0000328 {
hassof7c43dc2004-09-26 16:24:14 +0000329 inet_ntop (AF_INET6, ipv6_addr, (char *)ip6, INET6_ADDRSTRLEN);
hasso529d65b2004-12-24 00:14:50 +0000330 zlog_debug ("%s", ip6);
hassof390d2c2004-09-10 20:48:21 +0000331 }
332 }
jardineb5d44e2003-12-23 08:09:43 +0000333#endif /* HAVE_IPV6 */
hasso529d65b2004-12-24 00:14:50 +0000334 zlog_debug ("Speaks: %s", nlpid2string (&adj->nlpids));
jardineb5d44e2003-12-23 08:09:43 +0000335
336 return;
337}
338
hassof390d2c2004-09-10 20:48:21 +0000339int
jardineb5d44e2003-12-23 08:09:43 +0000340isis_adj_expire (struct thread *thread)
341{
342 struct isis_adjacency *adj;
jardineb5d44e2003-12-23 08:09:43 +0000343
344 /*
345 * Get the adjacency
346 */
347 adj = THREAD_ARG (thread);
348 assert (adj);
hasso83fe45e2004-02-09 11:09:39 +0000349 adj->t_expire = NULL;
jardineb5d44e2003-12-23 08:09:43 +0000350
351 /* trigger the adj expire event */
352 isis_adj_state_change (adj, ISIS_ADJ_DOWN, "holding time expired");
353
354 return 0;
355}
356
jardineb5d44e2003-12-23 08:09:43 +0000357/*
Josh Bailey3f045a02012-03-24 08:35:20 -0700358 * show isis neighbor [detail]
jardineb5d44e2003-12-23 08:09:43 +0000359 */
Josh Bailey3f045a02012-03-24 08:35:20 -0700360void
361isis_adj_print_vty (struct isis_adjacency *adj, struct vty *vty, char detail)
jardineb5d44e2003-12-23 08:09:43 +0000362{
jardineb5d44e2003-12-23 08:09:43 +0000363#ifdef HAVE_IPV6
364 struct in6_addr *ipv6_addr;
hassof390d2c2004-09-10 20:48:21 +0000365 u_char ip6[INET6_ADDRSTRLEN];
jardineb5d44e2003-12-23 08:09:43 +0000366#endif /* HAVE_IPV6 */
367 struct in_addr *ip_addr;
368 time_t now;
369 struct isis_dynhn *dyn;
370 int level;
371 struct listnode *node;
372
373 dyn = dynhn_find_by_id (adj->sysid);
374 if (dyn)
375 vty_out (vty, " %-20s", dyn->name.name);
hassof390d2c2004-09-10 20:48:21 +0000376 else if (adj->sysid)
377 {
378 vty_out (vty, " %-20s", sysid_print (adj->sysid));
jardineb5d44e2003-12-23 08:09:43 +0000379 }
hassof390d2c2004-09-10 20:48:21 +0000380 else
381 {
382 vty_out (vty, " unknown ");
jardineb5d44e2003-12-23 08:09:43 +0000383 }
hassof390d2c2004-09-10 20:48:21 +0000384
385 if (detail == ISIS_UI_LEVEL_BRIEF)
386 {
387 if (adj->circuit)
388 vty_out (vty, "%-12s", adj->circuit->interface->name);
389 else
390 vty_out (vty, "NULL circuit!");
391 vty_out (vty, "%-3u", adj->level); /* level */
392 vty_out (vty, "%-13s", adj_state2string (adj->adj_state));
393 now = time (NULL);
394 if (adj->last_upd)
395 vty_out (vty, "%-9lu", adj->last_upd + adj->hold_time - now);
396 else
397 vty_out (vty, "- ");
398 vty_out (vty, "%-10s", snpa_print (adj->snpa));
399 vty_out (vty, "%s", VTY_NEWLINE);
400 }
401
402 if (detail == ISIS_UI_LEVEL_DETAIL)
403 {
404 level = adj->level;
Josh Bailey3f045a02012-03-24 08:35:20 -0700405 vty_out (vty, "%s", VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +0000406 if (adj->circuit)
Josh Bailey3f045a02012-03-24 08:35:20 -0700407 vty_out (vty, " Interface: %s", adj->circuit->interface->name);
hassof390d2c2004-09-10 20:48:21 +0000408 else
Josh Bailey3f045a02012-03-24 08:35:20 -0700409 vty_out (vty, " Interface: NULL circuit");
hassof390d2c2004-09-10 20:48:21 +0000410 vty_out (vty, ", Level: %u", adj->level); /* level */
411 vty_out (vty, ", State: %s", adj_state2string (adj->adj_state));
412 now = time (NULL);
413 if (adj->last_upd)
414 vty_out (vty, ", Expires in %s",
415 time2string (adj->last_upd + adj->hold_time - now));
416 else
417 vty_out (vty, ", Expires in %s", time2string (adj->hold_time));
Josh Bailey3f045a02012-03-24 08:35:20 -0700418 vty_out (vty, "%s", VTY_NEWLINE);
419 vty_out (vty, " Adjacency flaps: %u", adj->flaps);
hassof390d2c2004-09-10 20:48:21 +0000420 vty_out (vty, ", Last: %s ago", time2string (now - adj->last_flap));
Josh Bailey3f045a02012-03-24 08:35:20 -0700421 vty_out (vty, "%s", VTY_NEWLINE);
422 vty_out (vty, " Circuit type: %s", circuit_t2string (adj->circuit_t));
hassof390d2c2004-09-10 20:48:21 +0000423 vty_out (vty, ", Speaks: %s", nlpid2string (&adj->nlpids));
Josh Bailey3f045a02012-03-24 08:35:20 -0700424 vty_out (vty, "%s", VTY_NEWLINE);
425 vty_out (vty, " SNPA: %s", snpa_print (adj->snpa));
426 if (adj->circuit->circ_type == CIRCUIT_T_BROADCAST)
427 {
428 dyn = dynhn_find_by_id (adj->lanid);
429 if (dyn)
430 vty_out (vty, ", LAN id: %s.%02x",
431 dyn->name.name, adj->lanid[ISIS_SYS_ID_LEN]);
432 else
433 vty_out (vty, ", LAN id: %s.%02x",
434 sysid_print (adj->lanid), adj->lanid[ISIS_SYS_ID_LEN]);
hassof390d2c2004-09-10 20:48:21 +0000435
Josh Bailey3f045a02012-03-24 08:35:20 -0700436 vty_out (vty, "%s", VTY_NEWLINE);
437 vty_out (vty, " LAN Priority: %u", adj->prio[adj->level - 1]);
hassof390d2c2004-09-10 20:48:21 +0000438
Josh Bailey3f045a02012-03-24 08:35:20 -0700439 vty_out (vty, ", %s, DIS flaps: %u, Last: %s ago",
440 isis_disflag2string (adj->dis_record[ISIS_LEVELS + level - 1].
441 dis), adj->dischanges[level - 1],
442 time2string (now -
443 (adj->dis_record[ISIS_LEVELS + level - 1].
444 last_dis_change)));
445 }
446 vty_out (vty, "%s", VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +0000447
Josh Bailey3f045a02012-03-24 08:35:20 -0700448 if (adj->area_addrs && listcount (adj->area_addrs) > 0)
449 {
450 struct area_addr *area_addr;
451 vty_out (vty, " Area Address(es):%s", VTY_NEWLINE);
452 for (ALL_LIST_ELEMENTS_RO (adj->area_addrs, node, area_addr))
453 vty_out (vty, " %s%s", isonet_print (area_addr->area_addr,
454 area_addr->addr_len), VTY_NEWLINE);
455 }
hassof390d2c2004-09-10 20:48:21 +0000456 if (adj->ipv4_addrs && listcount (adj->ipv4_addrs) > 0)
457 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700458 vty_out (vty, " IPv4 Address(es):%s", VTY_NEWLINE);
paul1eb8ef22005-04-07 07:30:20 +0000459 for (ALL_LIST_ELEMENTS_RO (adj->ipv4_addrs, node, ip_addr))
460 vty_out (vty, " %s%s", inet_ntoa (*ip_addr), VTY_NEWLINE);
hassof390d2c2004-09-10 20:48:21 +0000461 }
462#ifdef HAVE_IPV6
463 if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0)
464 {
Josh Bailey3f045a02012-03-24 08:35:20 -0700465 vty_out (vty, " IPv6 Address(es):%s", VTY_NEWLINE);
hasso5d6e2692005-04-12 14:48:19 +0000466 for (ALL_LIST_ELEMENTS_RO (adj->ipv6_addrs, node, ipv6_addr))
hassof390d2c2004-09-10 20:48:21 +0000467 {
hassof7c43dc2004-09-26 16:24:14 +0000468 inet_ntop (AF_INET6, ipv6_addr, (char *)ip6, INET6_ADDRSTRLEN);
hassof390d2c2004-09-10 20:48:21 +0000469 vty_out (vty, " %s%s", ip6, VTY_NEWLINE);
470 }
471 }
jardineb5d44e2003-12-23 08:09:43 +0000472#endif /* HAVE_IPV6 */
hassof390d2c2004-09-10 20:48:21 +0000473 vty_out (vty, "%s", VTY_NEWLINE);
474 }
jardineb5d44e2003-12-23 08:09:43 +0000475 return;
476}
477
478void
jardineb5d44e2003-12-23 08:09:43 +0000479isis_adj_build_neigh_list (struct list *adjdb, struct list *list)
jardineb5d44e2003-12-23 08:09:43 +0000480{
481 struct isis_adjacency *adj;
482 struct listnode *node;
hassof390d2c2004-09-10 20:48:21 +0000483
484 if (!list)
485 {
486 zlog_warn ("isis_adj_build_neigh_list(): NULL list");
jardineb5d44e2003-12-23 08:09:43 +0000487 return;
488 }
hassof390d2c2004-09-10 20:48:21 +0000489
paul1eb8ef22005-04-07 07:30:20 +0000490 for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
hassof390d2c2004-09-10 20:48:21 +0000491 {
hassof390d2c2004-09-10 20:48:21 +0000492 if (!adj)
493 {
494 zlog_warn ("isis_adj_build_neigh_list(): NULL adj");
495 return;
496 }
497
498 if ((adj->adj_state == ISIS_ADJ_UP ||
499 adj->adj_state == ISIS_ADJ_INITIALIZING))
500 listnode_add (list, adj->snpa);
501 }
jardineb5d44e2003-12-23 08:09:43 +0000502 return;
503}
504
505void
506isis_adj_build_up_list (struct list *adjdb, struct list *list)
507{
508 struct isis_adjacency *adj;
509 struct listnode *node;
510
hassof390d2c2004-09-10 20:48:21 +0000511 if (!list)
512 {
513 zlog_warn ("isis_adj_build_up_list(): NULL list");
jardineb5d44e2003-12-23 08:09:43 +0000514 return;
515 }
516
paul1eb8ef22005-04-07 07:30:20 +0000517 for (ALL_LIST_ELEMENTS_RO (adjdb, node, adj))
hassof390d2c2004-09-10 20:48:21 +0000518 {
hassof390d2c2004-09-10 20:48:21 +0000519 if (!adj)
520 {
521 zlog_warn ("isis_adj_build_up_list(): NULL adj");
522 return;
523 }
524
525 if (adj->adj_state == ISIS_ADJ_UP)
526 listnode_add (list, adj);
527 }
528
jardineb5d44e2003-12-23 08:09:43 +0000529 return;
530}