blob: 4d3eddb1d0764c061c7f8406b239c8536c0ada33 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
2 * Routing Table
3 * Copyright (C) 1998 Kunihiro Ishiguro
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 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 * 02111-1307, USA.
21 */
22
23#ifndef _ZEBRA_TABLE_H
24#define _ZEBRA_TABLE_H
25
Avneesh Sachdevf9c1b7b2012-08-17 08:19:48 -070026/*
27 * Forward declarations.
28 */
29struct route_node;
30struct route_table;
31
32/*
33 * route_table_delegate_t
34 *
35 * Function vector that can be used by a client to customize the
36 * behavior of one or more route tables.
37 */
38typedef struct route_table_delegate_t_ route_table_delegate_t;
39
40typedef struct route_node * (*route_table_create_node_func_t)
41 (route_table_delegate_t *, struct route_table *);
42
43typedef void (*route_table_destroy_node_func_t)
44 (route_table_delegate_t *, struct route_table *, struct route_node *);
45
46struct route_table_delegate_t_
47{
48 route_table_create_node_func_t create_node;
49 route_table_destroy_node_func_t destroy_node;
50};
51
paul718e3742002-12-13 20:15:29 +000052/* Routing table top structure. */
53struct route_table
54{
55 struct route_node *top;
Avneesh Sachdev3eb8ef32012-08-17 08:19:47 -070056
Avneesh Sachdevf9c1b7b2012-08-17 08:19:48 -070057 /*
58 * Delegate that performs certain functions for this table.
59 */
60 route_table_delegate_t *delegate;
61
Avneesh Sachdev3eb8ef32012-08-17 08:19:47 -070062 unsigned long count;
Avneesh Sachdevf9c1b7b2012-08-17 08:19:48 -070063
64 /*
65 * User data.
66 */
67 void *info;
paul718e3742002-12-13 20:15:29 +000068};
69
Avneesh Sachdevf9c1b7b2012-08-17 08:19:48 -070070/*
71 * Macro that defines all fields in a route node.
72 */
73#define ROUTE_NODE_FIELDS \
74 /* Actual prefix of this radix. */ \
75 struct prefix p; \
76 \
77 /* Tree link. */ \
78 struct route_table *table; \
79 struct route_node *parent; \
80 struct route_node *link[2]; \
81 \
82 /* Lock of this radix */ \
83 unsigned int lock; \
84 \
85 /* Each node of route. */ \
86 void *info; \
87 \
88 /* Aggregation. */ \
89 void *aggregate;
90
91
paul718e3742002-12-13 20:15:29 +000092/* Each routing entry. */
93struct route_node
94{
Avneesh Sachdevf9c1b7b2012-08-17 08:19:48 -070095 ROUTE_NODE_FIELDS;
paul718e3742002-12-13 20:15:29 +000096
paul718e3742002-12-13 20:15:29 +000097#define l_left link[0]
98#define l_right link[1]
paul718e3742002-12-13 20:15:29 +000099};
100
101/* Prototypes. */
paul8cc41982005-05-06 21:25:49 +0000102extern struct route_table *route_table_init (void);
Avneesh Sachdevf9c1b7b2012-08-17 08:19:48 -0700103
104extern struct route_table *
105route_table_init_with_delegate (route_table_delegate_t *);
106
paul8cc41982005-05-06 21:25:49 +0000107extern void route_table_finish (struct route_table *);
108extern void route_unlock_node (struct route_node *node);
paul8cc41982005-05-06 21:25:49 +0000109extern struct route_node *route_top (struct route_table *);
110extern struct route_node *route_next (struct route_node *);
111extern struct route_node *route_next_until (struct route_node *,
112 struct route_node *);
Avneesh Sachdev3eb8ef32012-08-17 08:19:47 -0700113extern struct route_node *route_node_get (struct route_table *const,
paul8cc41982005-05-06 21:25:49 +0000114 struct prefix *);
Avneesh Sachdev3eb8ef32012-08-17 08:19:47 -0700115extern struct route_node *route_node_lookup (const struct route_table *,
paul8cc41982005-05-06 21:25:49 +0000116 struct prefix *);
117extern struct route_node *route_lock_node (struct route_node *node);
Stephen Hemminger38cc00c2009-12-08 12:00:50 +0300118extern struct route_node *route_node_match (const struct route_table *,
119 const struct prefix *);
120extern struct route_node *route_node_match_ipv4 (const struct route_table *,
121 const struct in_addr *);
paul718e3742002-12-13 20:15:29 +0000122#ifdef HAVE_IPV6
Stephen Hemminger38cc00c2009-12-08 12:00:50 +0300123extern struct route_node *route_node_match_ipv6 (const struct route_table *,
124 const struct in6_addr *);
paul718e3742002-12-13 20:15:29 +0000125#endif /* HAVE_IPV6 */
126
Avneesh Sachdev3eb8ef32012-08-17 08:19:47 -0700127extern unsigned long route_table_count (const struct route_table *);
paul718e3742002-12-13 20:15:29 +0000128#endif /* _ZEBRA_TABLE_H */