]> git.proxmox.com Git - mirror_frr.git/blame - ospfd/ospf_route.h
Merge pull request #9348 from dlqs/consecutive
[mirror_frr.git] / ospfd / ospf_route.h
CommitLineData
718e3744 1/*
2 * OSPF routing table.
3 * Copyright (C) 1999, 2000 Toshiaki Takada
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
896014f4
DL
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
718e3744 20 */
21
22#ifndef _ZEBRA_OSPF_ROUTE_H
23#define _ZEBRA_OSPF_ROUTE_H
24
25#define OSPF_DESTINATION_ROUTER 1
26#define OSPF_DESTINATION_NETWORK 2
27#define OSPF_DESTINATION_DISCARD 3
28
29#define OSPF_PATH_MIN 0
30#define OSPF_PATH_INTRA_AREA 1
31#define OSPF_PATH_INTER_AREA 2
32#define OSPF_PATH_TYPE1_EXTERNAL 3
33#define OSPF_PATH_TYPE2_EXTERNAL 4
34#define OSPF_PATH_MAX 5
35
b37eb79c
OD
36/* Segment Routing information to complement ospf_path structure */
37struct sr_nexthop_info {
38 /* Output label associated to this route */
39 mpls_label_t label_out;
40 /*
41 * Pointer to SR Node which is the next hop for this route
42 * or NULL if next hop is the destination of the prefix
43 */
44 struct sr_node *nexthop;
7fd0729f
G
45
46 /* TI-LFA */
47 struct mpls_label_stack *backup_label_stack;
48 struct in_addr backup_nexthop;
b37eb79c
OD
49};
50
718e3744 51/* OSPF Path. */
d62a17ae 52struct ospf_path {
53 struct in_addr nexthop;
54 struct in_addr adv_router;
55 ifindex_t ifindex;
56 unsigned char unnumbered;
b37eb79c 57 struct sr_nexthop_info srni;
718e3744 58};
59
60/* Below is the structure linked to every
61 route node. Note that for Network routing
62 entries a single ospf_route is kept, while
63 for ABRs and ASBRs (Router routing entries),
64 we link an instance of ospf_router_route
65 where a list of paths is maintained, so
66
67 nr->info is a (struct ospf_route *) for OSPF_DESTINATION_NETWORK
68 but
69 nr->info is a (struct ospf_router_route *) for OSPF_DESTINATION_ROUTER
70*/
71
d62a17ae 72struct route_standard {
73 /* Link Sate Origin. */
74 struct lsa_header *origin;
718e3744 75
d62a17ae 76 /* Associated Area. */
77 struct in_addr area_id; /* The area the route belongs to */
718e3744 78
d62a17ae 79 /* Area Type */
80 int external_routing;
718e3744 81
d62a17ae 82 /* Optional Capability. */
d7c0a89a 83 uint8_t options; /* Get from LSA header. */
718e3744 84
d62a17ae 85 /* */
d7c0a89a 86 uint8_t flags; /* From router-LSA */
718e3744 87};
88
d62a17ae 89struct route_external {
90 /* Link State Origin. */
91 struct ospf_lsa *origin;
718e3744 92
d62a17ae 93 /* Link State Cost Type2. */
d7c0a89a 94 uint32_t type2_cost;
718e3744 95
d62a17ae 96 /* Tag value. */
d7c0a89a 97 uint32_t tag;
718e3744 98
d62a17ae 99 /* ASBR route. */
100 struct ospf_route *asbr;
718e3744 101};
102
d62a17ae 103struct ospf_route {
104 /* Destination Type. */
d7c0a89a 105 uint8_t type;
718e3744 106
d62a17ae 107 /* Destination ID. */ /* i.e. Link State ID. */
108 struct in_addr id;
718e3744 109
d62a17ae 110 /* Address Mask. */
111 struct in_addr mask; /* Only valid for networks. */
718e3744 112
d62a17ae 113 /* Path Type. */
d7c0a89a 114 uint8_t path_type;
718e3744 115
d62a17ae 116 /* List of Paths. */
117 struct list *paths;
718e3744 118
d62a17ae 119 /* Link State Cost. */
d7c0a89a 120 uint32_t cost; /* i.e. metric. */
718e3744 121
d62a17ae 122 /* Route specific info. */
123 union {
124 struct route_standard std;
125 struct route_external ext;
126 } u;
effee187
DS
127
128 bool changed;
718e3744 129};
130
d62a17ae 131extern struct ospf_path *ospf_path_new(void);
132extern void ospf_path_free(struct ospf_path *);
133extern struct ospf_path *ospf_path_lookup(struct list *, struct ospf_path *);
134extern struct ospf_route *ospf_route_new(void);
135extern void ospf_route_free(struct ospf_route *);
b5a8894d 136extern void ospf_route_delete(struct ospf *, struct route_table *);
d62a17ae 137extern void ospf_route_table_free(struct route_table *);
4dadc291 138
d62a17ae 139extern void ospf_route_install(struct ospf *, struct route_table *);
140extern void ospf_route_table_dump(struct route_table *);
4dadc291 141
d62a17ae 142extern void ospf_intra_add_router(struct route_table *, struct vertex *,
143 struct ospf_area *);
144
145extern void ospf_intra_add_transit(struct route_table *, struct vertex *,
4dadc291 146 struct ospf_area *);
147
d62a17ae 148extern void ospf_intra_add_stub(struct route_table *, struct router_lsa_link *,
149 struct vertex *, struct ospf_area *,
150 int parent_is_root, int);
151
152extern int ospf_route_cmp(struct ospf *, struct ospf_route *,
153 struct ospf_route *);
154extern void ospf_route_copy_nexthops(struct ospf_route *, struct list *);
1d376ff5
G
155extern void ospf_route_copy_nexthops_from_vertex(struct ospf_area *area,
156 struct ospf_route *,
d62a17ae 157 struct vertex *);
158
159extern void ospf_route_subst(struct route_node *, struct ospf_route *,
160 struct ospf_route *);
161extern void ospf_route_add(struct route_table *, struct prefix_ipv4 *,
162 struct ospf_route *, struct ospf_route *);
163
164extern void ospf_route_subst_nexthops(struct ospf_route *, struct list *);
165extern void ospf_prune_unreachable_networks(struct route_table *);
166extern void ospf_prune_unreachable_routers(struct route_table *);
b5a8894d
CS
167extern int ospf_add_discard_route(struct ospf *, struct route_table *,
168 struct ospf_area *, struct prefix_ipv4 *);
169extern void ospf_delete_discard_route(struct ospf *, struct route_table *,
d62a17ae 170 struct prefix_ipv4 *);
171extern int ospf_route_match_same(struct route_table *, struct prefix_ipv4 *,
172 struct ospf_route *);
718e3744 173
174#endif /* _ZEBRA_OSPF_ROUTE_H */