]> git.proxmox.com Git - mirror_frr.git/blame - lib/agg_table.h
*: auto-convert to SPDX License IDs
[mirror_frr.git] / lib / agg_table.h
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
8e1f6512
DS
2/*
3 * agg_table - Aggregate Table Header
4 * Copyright (C) 2018 Cumulus Networks, Inc.
5 * Donald Sharp
8e1f6512
DS
6 */
7#ifndef __AGG_TABLE_H__
8#define __AGG_TABLE_H__
9
10#include "prefix.h"
11#include "table.h"
12
5e244469
RW
13#ifdef __cplusplus
14extern "C" {
15#endif
16
8e1f6512
DS
17struct agg_table {
18 struct route_table *route_table;
19
20 void *info;
21};
22
23struct agg_node {
24 /*
25 * Caution these must be the very first fields
26 * @see agg_node_to_rnode
27 * @see agg_node_from_rnode
28 */
29 ROUTE_NODE_FIELDS
30
c2b23567
DS
31 /* Aggregation. */
32 void *aggregate;
8e1f6512
DS
33};
34
35static inline struct route_node *agg_node_to_rnode(struct agg_node *node)
36{
37 return (struct route_node *)node;
38}
39
40static inline struct agg_node *agg_node_from_rnode(struct route_node *node)
41{
42 return (struct agg_node *)node;
43}
44
45static inline struct agg_node *agg_lock_node(struct agg_node *node)
46{
47 return (struct agg_node *)route_lock_node(agg_node_to_rnode(node));
48}
49
50static inline void agg_unlock_node(struct agg_node *node)
51{
d90b788e 52 route_unlock_node(agg_node_to_rnode(node));
8e1f6512
DS
53}
54
55static inline void agg_set_table_info(struct agg_table *atable, void *data)
56{
57 atable->info = data;
58}
59
60static inline void *agg_get_table_info(struct agg_table *atable)
61{
62 return atable->info;
63}
64
65static inline struct agg_node *agg_route_top(struct agg_table *table)
66{
67 return agg_node_from_rnode(route_top(table->route_table));
68}
69
70static inline struct agg_node *agg_route_next(struct agg_node *node)
71{
72 return agg_node_from_rnode(route_next(agg_node_to_rnode(node)));
73}
74
75static inline struct agg_node *agg_node_get(struct agg_table *table,
8150a500 76 const struct prefix *p)
8e1f6512
DS
77{
78 return agg_node_from_rnode(route_node_get(table->route_table, p));
79}
80
81static inline struct agg_node *
8150a500 82agg_node_lookup(const struct agg_table *const table, const struct prefix *p)
8e1f6512
DS
83{
84 return agg_node_from_rnode(route_node_lookup(table->route_table, p));
85}
86
87static inline struct agg_node *agg_route_next_until(struct agg_node *node,
88 struct agg_node *limit)
89{
90 struct route_node *rnode;
91
92 rnode = route_next_until(agg_node_to_rnode(node),
93 agg_node_to_rnode(limit));
94
95 return agg_node_from_rnode(rnode);
96}
97
98static inline struct agg_node *agg_node_match(struct agg_table *table,
8150a500 99 const struct prefix *p)
8e1f6512
DS
100{
101 return agg_node_from_rnode(route_node_match(table->route_table, p));
102}
103
104static inline struct agg_node *agg_node_parent(struct agg_node *node)
105{
106 struct route_node *rn = agg_node_to_rnode(node);
107
108 return agg_node_from_rnode(rn->parent);
109}
110
111static inline struct agg_node *agg_node_left(struct agg_node *node)
112{
113 struct route_node *rn = agg_node_to_rnode(node);
114
115 return agg_node_from_rnode(rn->l_left);
116}
117
118static inline struct agg_node *agg_node_right(struct agg_node *node)
119{
120 struct route_node *rn = agg_node_to_rnode(node);
121
122 return agg_node_from_rnode(rn->l_right);
123}
124
125extern struct agg_table *agg_table_init(void);
126
127static inline void agg_table_finish(struct agg_table *atable)
128{
129 route_table_finish(atable->route_table);
130 atable->route_table = NULL;
131
132 XFREE(MTYPE_TMP, atable);
133}
134
135static inline struct agg_node *agg_route_table_top(struct agg_node *node)
136{
137 return (struct agg_node *)route_top(node->table);
138}
139
140static inline struct agg_table *agg_get_table(struct agg_node *node)
141{
6ca30e9e 142 return (struct agg_table *)route_table_get_info(node->table);
8e1f6512 143}
5e244469 144
26a3ffd6
DS
145static inline const struct prefix *
146agg_node_get_prefix(const struct agg_node *node)
147{
148 return &node->p;
149}
150
c10e14e9
DS
151static inline unsigned int agg_node_get_lock_count(const struct agg_node *node)
152{
153 return node->lock;
154}
155
07ef3e34
DL
156#ifdef _FRR_ATTRIBUTE_PRINTFRR
157#pragma FRR printfrr_ext "%pRN" (struct agg_node *)
158#endif
159
5e244469
RW
160#ifdef __cplusplus
161}
162#endif
163
8e1f6512 164#endif