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
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* OSPF calculation.
* Copyright (C) 1999 Kunihiro Ishiguro
*/
#ifndef _QUAGGA_OSPF_SPF_H
#define _QUAGGA_OSPF_SPF_H
#include "typesafe.h"
/* values for vertex->type */
#define OSPF_VERTEX_ROUTER 1 /* for a Router-LSA */
#define OSPF_VERTEX_NETWORK 2 /* for a Network-LSA */
/* values for vertex->flags */
#define OSPF_VERTEX_PROCESSED 0x01
/* The "root" is the node running the SPF calculation */
PREDECL_SKIPLIST_NONUNIQ(vertex_pqueue);
/* A router or network in an area */
struct vertex {
struct vertex_pqueue_item pqi;
uint8_t flags;
uint8_t type; /* copied from LSA header */
struct in_addr id; /* copied from LSA header */
struct ospf_lsa *lsa_p;
struct lsa_header *lsa; /* Router or Network LSA */
uint32_t distance; /* from root to this vertex */
struct list *parents; /* list of parents in SPF tree */
struct list *children; /* list of children in SPF tree*/
};
struct vertex_nexthop {
struct in_addr router; /* router address to send to */
int lsa_pos; /* LSA position for resolving the interface */
};
struct vertex_parent {
struct vertex_nexthop *nexthop; /* nexthop taken on the root node */
struct vertex_nexthop *local_nexthop; /* local nexthop of the parent */
struct vertex *parent; /* parent vertex */
int backlink; /* index back to parent for router-lsa's */
};
/* What triggered the SPF ? */
typedef enum {
SPF_FLAG_ROUTER_LSA_INSTALL = 1,
SPF_FLAG_NETWORK_LSA_INSTALL,
SPF_FLAG_SUMMARY_LSA_INSTALL,
SPF_FLAG_ASBR_SUMMARY_LSA_INSTALL,
SPF_FLAG_MAXAGE,
SPF_FLAG_ABR_STATUS_CHANGE,
SPF_FLAG_ASBR_STATUS_CHANGE,
SPF_FLAG_CONFIG_CHANGE,
SPF_FLAG_GR_FINISH,
} ospf_spf_reason_t;
extern void ospf_spf_calculate_schedule(struct ospf *, ospf_spf_reason_t);
extern void ospf_spf_calculate(struct ospf_area *area,
struct ospf_lsa *root_lsa,
struct route_table *new_table,
struct route_table *all_rtrs,
struct route_table *new_rtrs, bool is_dry_run,
bool is_root_node);
extern void ospf_spf_calculate_area(struct ospf *ospf, struct ospf_area *area,
struct route_table *new_table,
struct route_table *all_rtrs,
struct route_table *new_rtrs);
extern void ospf_spf_calculate_areas(struct ospf *ospf,
struct route_table *new_table,
struct route_table *all_rtrs,
struct route_table *new_rtrs);
extern void ospf_rtrs_free(struct route_table *);
extern void ospf_spf_cleanup(struct vertex *spf, struct list *vertex_list);
extern void ospf_spf_copy(struct vertex *vertex, struct list *vertex_list);
extern void ospf_spf_remove_resource(struct vertex *vertex,
struct list *vertex_list,
struct protected_resource *resource);
extern struct vertex *ospf_spf_vertex_find(struct in_addr id,
struct list *vertex_list);
extern struct vertex *ospf_spf_vertex_by_nexthop(struct vertex *root,
struct in_addr *nexthop);
extern struct vertex_parent *ospf_spf_vertex_parent_find(struct in_addr id,
struct vertex *vertex);
extern int vertex_parent_cmp(void *aa, void *bb);
extern void ospf_spf_print(struct vty *vty, struct vertex *v, int i);
extern void ospf_restart_spf(struct ospf *ospf);
/* void ospf_spf_calculate_timer_add (); */
#endif /* _QUAGGA_OSPF_SPF_H */
|