summaryrefslogtreecommitdiffstats
path: root/ospfd/ospf_route.h
blob: 76df54fb3f9e3f2e39237405f3cc4b45eca55fac (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 * OSPF routing table.
 * Copyright (C) 1999, 2000 Toshiaki Takada
 *
 * This file is part of GNU Zebra.
 *
 * GNU Zebra 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.
 *
 * GNU Zebra 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
 */

#ifndef _ZEBRA_OSPF_ROUTE_H
#define _ZEBRA_OSPF_ROUTE_H

#define OSPF_DESTINATION_ROUTER		1
#define OSPF_DESTINATION_NETWORK	2
#define OSPF_DESTINATION_DISCARD	3

#define OSPF_PATH_MIN			0
#define OSPF_PATH_INTRA_AREA		1
#define OSPF_PATH_INTER_AREA		2
#define OSPF_PATH_TYPE1_EXTERNAL	3
#define OSPF_PATH_TYPE2_EXTERNAL	4
#define OSPF_PATH_MAX			5

/* OSPF Path. */
struct ospf_path {
	struct in_addr nexthop;
	struct in_addr adv_router;
	ifindex_t ifindex;
	unsigned char unnumbered;
};

/* Below is the structure linked to every
   route node. Note that for Network routing
   entries a single ospf_route is kept, while
   for ABRs and ASBRs (Router routing entries),
   we link an instance of ospf_router_route
   where a list of paths is maintained, so

   nr->info is a (struct ospf_route *) for OSPF_DESTINATION_NETWORK
   but
   nr->info is a (struct ospf_router_route *) for OSPF_DESTINATION_ROUTER
*/

struct route_standard {
	/* Link Sate Origin. */
	struct lsa_header *origin;

	/* Associated Area. */
	struct in_addr area_id; /* The area the route belongs to */

	/*  Area Type */
	int external_routing;

	/* Optional Capability. */
	u_char options; /* Get from LSA header. */

	/*  */
	u_char flags; /* From router-LSA */
};

struct route_external {
	/* Link State Origin. */
	struct ospf_lsa *origin;

	/* Link State Cost Type2. */
	u_int32_t type2_cost;

	/* Tag value. */
	u_int32_t tag;

	/* ASBR route. */
	struct ospf_route *asbr;
};

struct ospf_route {
	/* Destination Type. */
	u_char type;

	/* Destination ID. */ /* i.e. Link State ID. */
	struct in_addr id;

	/* Address Mask. */
	struct in_addr mask; /* Only valid for networks. */

	/* Path Type. */
	u_char path_type;

	/* List of Paths. */
	struct list *paths;

	/* Link State Cost. */
	u_int32_t cost; /* i.e. metric. */

	/* Route specific info. */
	union {
		struct route_standard std;
		struct route_external ext;
	} u;
};

extern struct ospf_path *ospf_path_new(void);
extern void ospf_path_free(struct ospf_path *);
extern struct ospf_path *ospf_path_lookup(struct list *, struct ospf_path *);
extern struct ospf_route *ospf_route_new(void);
extern void ospf_route_free(struct ospf_route *);
extern void ospf_route_delete(struct ospf *, struct route_table *);
extern void ospf_route_table_free(struct route_table *);

extern void ospf_route_install(struct ospf *, struct route_table *);
extern void ospf_route_table_dump(struct route_table *);

extern void ospf_intra_add_router(struct route_table *, struct vertex *,
				  struct ospf_area *);

extern void ospf_intra_add_transit(struct route_table *, struct vertex *,
				   struct ospf_area *);

extern void ospf_intra_add_stub(struct route_table *, struct router_lsa_link *,
				struct vertex *, struct ospf_area *,
				int parent_is_root, int);

extern int ospf_route_cmp(struct ospf *, struct ospf_route *,
			  struct ospf_route *);
extern void ospf_route_copy_nexthops(struct ospf_route *, struct list *);
extern void ospf_route_copy_nexthops_from_vertex(struct ospf_route *,
						 struct vertex *);

extern void ospf_route_subst(struct route_node *, struct ospf_route *,
			     struct ospf_route *);
extern void ospf_route_add(struct route_table *, struct prefix_ipv4 *,
			   struct ospf_route *, struct ospf_route *);

extern void ospf_route_subst_nexthops(struct ospf_route *, struct list *);
extern void ospf_prune_unreachable_networks(struct route_table *);
extern void ospf_prune_unreachable_routers(struct route_table *);
extern int ospf_add_discard_route(struct ospf *, struct route_table *,
				  struct ospf_area *, struct prefix_ipv4 *);
extern void ospf_delete_discard_route(struct ospf *, struct route_table *,
				      struct prefix_ipv4 *);
extern int ospf_route_match_same(struct route_table *, struct prefix_ipv4 *,
				 struct ospf_route *);

#endif /* _ZEBRA_OSPF_ROUTE_H */