Line data Source code
1 : /*
2 : * Nexthop Group structure definition.
3 : * Copyright (C) 2018 Cumulus Networks, Inc.
4 : * Donald Sharp
5 : *
6 : * This program is free software; you can redistribute it and/or modify it
7 : * under the terms of the GNU General Public License as published by the Free
8 : * Software Foundation; either version 2 of the License, or (at your option)
9 : * any later version.
10 : *
11 : * This program is distributed in the hope that it will be useful, but WITHOUT
12 : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 : * more details.
15 : *
16 : * You should have received a copy of the GNU General Public License along
17 : * with this program; see the file COPYING; if not, write to the Free Software
18 : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : */
20 :
21 : #ifndef __NEXTHOP_GROUP__
22 : #define __NEXTHOP_GROUP__
23 :
24 : #include <vty.h>
25 : #include "json.h"
26 :
27 : #ifdef __cplusplus
28 : extern "C" {
29 : #endif
30 :
31 : struct nhg_resilience {
32 : uint16_t buckets;
33 : uint32_t idle_timer;
34 : uint32_t unbalanced_timer;
35 : uint64_t unbalanced_time;
36 : };
37 :
38 : /*
39 : * What is a nexthop group?
40 : *
41 : * A nexthop group is a collection of nexthops that make up
42 : * the ECMP path for the route.
43 : *
44 : * This module provides a proper abstraction to this idea.
45 : */
46 : struct nexthop_group {
47 : struct nexthop *nexthop;
48 :
49 : struct nhg_resilience nhgr;
50 : };
51 :
52 : struct nexthop_group *nexthop_group_new(void);
53 : void nexthop_group_delete(struct nexthop_group **nhg);
54 :
55 : void nexthop_group_copy(struct nexthop_group *to,
56 : const struct nexthop_group *from);
57 :
58 : /*
59 : * Copy a list of nexthops in 'nh' to an nhg, enforcing canonical sort order
60 : */
61 : void nexthop_group_copy_nh_sorted(struct nexthop_group *nhg,
62 : const struct nexthop *nh);
63 :
64 : void copy_nexthops(struct nexthop **tnh, const struct nexthop *nh,
65 : struct nexthop *rparent);
66 :
67 : uint32_t nexthop_group_hash_no_recurse(const struct nexthop_group *nhg);
68 : uint32_t nexthop_group_hash(const struct nexthop_group *nhg);
69 : void nexthop_group_mark_duplicates(struct nexthop_group *nhg);
70 :
71 : /* Add a nexthop to a list, enforcing the canonical sort order. */
72 : void nexthop_group_add_sorted(struct nexthop_group *nhg,
73 : struct nexthop *nexthop);
74 :
75 : /* The following for loop allows to iterate over the nexthop
76 : * structure of routes.
77 : *
78 : * head: The pointer to the first nexthop in the chain.
79 : *
80 : * nexthop: The pointer to the current nexthop, either in the
81 : * top-level chain or in a resolved chain.
82 : */
83 : #define ALL_NEXTHOPS(head, nhop) \
84 : (nhop) = (head.nexthop); \
85 : (nhop); \
86 : (nhop) = nexthop_next(nhop)
87 :
88 : #define ALL_NEXTHOPS_PTR(head, nhop) \
89 : (nhop) = ((head)->nexthop); \
90 : (nhop); \
91 : (nhop) = nexthop_next(nhop)
92 :
93 :
94 : #define NHGC_NAME_SIZE 80
95 :
96 : struct nexthop_group_cmd {
97 :
98 : RB_ENTRY(nexthop_group_cmd) nhgc_entry;
99 :
100 : char name[NHGC_NAME_SIZE];
101 :
102 : /* Name of group containing backup nexthops (if set) */
103 : char backup_list_name[NHGC_NAME_SIZE];
104 :
105 : struct nexthop_group nhg;
106 :
107 : struct list *nhg_list;
108 :
109 : QOBJ_FIELDS;
110 : };
111 : RB_HEAD(nhgc_entry_head, nexthp_group_cmd);
112 26 : RB_PROTOTYPE(nhgc_entry_head, nexthop_group_cmd, nhgc_entry,
113 : nexthop_group_cmd_compare)
114 : DECLARE_QOBJ_TYPE(nexthop_group_cmd);
115 :
116 : /*
117 : * Initialize nexthop_groups. If you are interested in when
118 : * a nexthop_group is added/deleted/modified, then set the
119 : * appropriate callback functions to handle it in your
120 : * code
121 : *
122 : * create - The creation of the nexthop group
123 : * modify - Modification of the nexthop group when not changing a nexthop
124 : * ( resilience as an example )
125 : * add_nexthop - A nexthop is added to the NHG
126 : * del_nexthop - A nexthop is deleted from the NHG
127 : * destroy - The NHG is deleted
128 : */
129 : void nexthop_group_init(
130 : void (*create)(const char *name),
131 : void (*modify)(const struct nexthop_group_cmd *nhgc),
132 : void (*add_nexthop)(const struct nexthop_group_cmd *nhgc,
133 : const struct nexthop *nhop),
134 : void (*del_nexthop)(const struct nexthop_group_cmd *nhgc,
135 : const struct nexthop *nhop),
136 : void (*destroy)(const char *name));
137 :
138 : void nexthop_group_enable_vrf(struct vrf *vrf);
139 : void nexthop_group_disable_vrf(struct vrf *vrf);
140 : void nexthop_group_interface_state_change(struct interface *ifp,
141 : ifindex_t oldifindex);
142 :
143 : extern struct nexthop *nexthop_exists(const struct nexthop_group *nhg,
144 : const struct nexthop *nh);
145 : /* This assumes ordered */
146 : extern bool nexthop_group_equal_no_recurse(const struct nexthop_group *nhg1,
147 : const struct nexthop_group *nhg2);
148 :
149 : /* This assumes ordered */
150 : extern bool nexthop_group_equal(const struct nexthop_group *nhg1,
151 : const struct nexthop_group *nhg2);
152 :
153 : extern struct nexthop_group_cmd *nhgc_find(const char *name);
154 :
155 : extern void nexthop_group_write_nexthop_simple(struct vty *vty,
156 : const struct nexthop *nh,
157 : char *altifname);
158 : extern void nexthop_group_write_nexthop(struct vty *vty,
159 : const struct nexthop *nh);
160 :
161 : extern void nexthop_group_json_nexthop(json_object *j,
162 : const struct nexthop *nh);
163 :
164 : /* Return the number of nexthops in this nhg */
165 : extern uint8_t nexthop_group_nexthop_num(const struct nexthop_group *nhg);
166 : extern uint8_t
167 : nexthop_group_nexthop_num_no_recurse(const struct nexthop_group *nhg);
168 : extern uint8_t
169 : nexthop_group_active_nexthop_num(const struct nexthop_group *nhg);
170 : extern uint8_t
171 : nexthop_group_active_nexthop_num_no_recurse(const struct nexthop_group *nhg);
172 :
173 : #ifdef __cplusplus
174 : }
175 : #endif
176 :
177 : #endif
|