]>
Commit | Line | Data |
---|---|---|
acddc0ed | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
f495425b QY |
2 | /* |
3 | * VRRP northbound bindings. | |
4 | * Copyright (C) 2019 Cumulus Networks, Inc. | |
5 | * Quentin Young | |
f495425b QY |
6 | */ |
7 | ||
8 | #include <zebra.h> | |
9 | ||
10 | #include "if.h" | |
11 | #include "log.h" | |
12 | #include "prefix.h" | |
13 | #include "table.h" | |
14 | #include "command.h" | |
15 | #include "northbound.h" | |
16 | #include "libfrr.h" | |
17 | #include "vrrp.h" | |
18 | #include "vrrp_vty.h" | |
19 | ||
20 | /* | |
21 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group | |
22 | */ | |
60ee8be1 | 23 | static int lib_interface_vrrp_vrrp_group_create(struct nb_cb_create_args *args) |
f495425b QY |
24 | { |
25 | struct interface *ifp; | |
26 | uint8_t vrid; | |
27 | uint8_t version = 3; | |
28 | struct vrrp_vrouter *vr; | |
29 | ||
60ee8be1 RW |
30 | vrid = yang_dnode_get_uint8(args->dnode, "./virtual-router-id"); |
31 | version = yang_dnode_get_enum(args->dnode, "./version"); | |
ee723e13 | 32 | |
f4893b09 | 33 | switch (args->event) { |
ee723e13 | 34 | case NB_EV_VALIDATE: |
8a601eb7 | 35 | ifp = nb_running_get_entry(args->dnode, NULL, false); |
f4893b09 QY |
36 | if (ifp) { |
37 | vr = vrrp_lookup(ifp, vrid); | |
8a601eb7 QY |
38 | if (vr && vr->autoconf) { |
39 | snprintf( | |
40 | args->errmsg, args->errmsg_len, | |
41 | "Virtual Router with ID %d already exists on interface '%s'; created by VRRP autoconfiguration", | |
42 | vrid, ifp->name); | |
f4893b09 | 43 | return NB_ERR_VALIDATION; |
8a601eb7 | 44 | } |
f4893b09 QY |
45 | } |
46 | return NB_OK; | |
ee723e13 QY |
47 | case NB_EV_PREPARE: |
48 | case NB_EV_ABORT: | |
49 | return NB_OK; | |
50 | case NB_EV_APPLY: | |
51 | break; | |
52 | } | |
53 | ||
8a601eb7 | 54 | ifp = nb_running_get_entry(args->dnode, NULL, true); |
f495425b | 55 | vr = vrrp_vrouter_create(ifp, vrid, version); |
60ee8be1 | 56 | nb_running_set_entry(args->dnode, vr); |
f495425b QY |
57 | |
58 | return NB_OK; | |
59 | } | |
60 | ||
60ee8be1 RW |
61 | static int |
62 | lib_interface_vrrp_vrrp_group_destroy(struct nb_cb_destroy_args *args) | |
f495425b QY |
63 | { |
64 | struct vrrp_vrouter *vr; | |
65 | ||
60ee8be1 | 66 | if (args->event != NB_EV_APPLY) |
f495425b QY |
67 | return NB_OK; |
68 | ||
60ee8be1 | 69 | vr = nb_running_unset_entry(args->dnode); |
f495425b QY |
70 | vrrp_vrouter_destroy(vr); |
71 | ||
72 | return NB_OK; | |
73 | } | |
74 | ||
75 | static const void * | |
60ee8be1 | 76 | lib_interface_vrrp_vrrp_group_get_next(struct nb_cb_get_next_args *args) |
f495425b QY |
77 | { |
78 | struct list *l = hash_to_list(vrrp_vrouters_hash); | |
79 | struct listnode *ln; | |
6356b286 | 80 | const struct vrrp_vrouter *curr; |
60ee8be1 | 81 | const struct interface *ifp = args->parent_list_entry; |
f495425b | 82 | |
f495425b QY |
83 | /* |
84 | * If list_entry is null, we return the first vrrp instance with a | |
85 | * matching interface | |
86 | */ | |
60ee8be1 | 87 | bool nextone = args->list_entry ? false : true; |
f495425b QY |
88 | |
89 | for (ALL_LIST_ELEMENTS_RO(l, ln, curr)) { | |
60ee8be1 | 90 | if (curr == args->list_entry) { |
f495425b QY |
91 | nextone = true; |
92 | continue; | |
93 | } | |
94 | ||
95 | if (nextone && curr->ifp == ifp) | |
96 | goto done; | |
f495425b QY |
97 | } |
98 | ||
99 | curr = NULL; | |
100 | ||
101 | done: | |
102 | list_delete(&l); | |
103 | return curr; | |
104 | } | |
105 | ||
60ee8be1 RW |
106 | static int |
107 | lib_interface_vrrp_vrrp_group_get_keys(struct nb_cb_get_keys_args *args) | |
f495425b | 108 | { |
60ee8be1 | 109 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 110 | |
60ee8be1 | 111 | args->keys->num = 1; |
6cde4b45 | 112 | snprintf(args->keys->key[0], sizeof(args->keys->key[0]), "%u", |
60ee8be1 | 113 | vr->vrid); |
f495425b QY |
114 | |
115 | return NB_OK; | |
116 | } | |
117 | ||
118 | static const void * | |
60ee8be1 | 119 | lib_interface_vrrp_vrrp_group_lookup_entry(struct nb_cb_lookup_entry_args *args) |
f495425b | 120 | { |
60ee8be1 RW |
121 | uint32_t vrid = strtoul(args->keys->key[0], NULL, 10); |
122 | const struct interface *ifp = args->parent_list_entry; | |
f495425b | 123 | |
534b98f9 | 124 | return vrrp_lookup(ifp, vrid); |
f495425b QY |
125 | } |
126 | ||
127 | /* | |
128 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version | |
129 | */ | |
130 | static int | |
60ee8be1 | 131 | lib_interface_vrrp_vrrp_group_version_modify(struct nb_cb_modify_args *args) |
f495425b | 132 | { |
60ee8be1 | 133 | if (args->event != NB_EV_APPLY) |
f495425b QY |
134 | return NB_OK; |
135 | ||
136 | struct vrrp_vrouter *vr; | |
137 | uint8_t version; | |
138 | ||
60ee8be1 | 139 | vr = nb_running_get_entry(args->dnode, NULL, true); |
f495425b QY |
140 | vrrp_event(vr->v4, VRRP_EVENT_SHUTDOWN); |
141 | vrrp_event(vr->v6, VRRP_EVENT_SHUTDOWN); | |
60ee8be1 | 142 | version = yang_dnode_get_enum(args->dnode, NULL); |
f495425b QY |
143 | vr->version = version; |
144 | ||
145 | vrrp_check_start(vr); | |
146 | ||
147 | return NB_OK; | |
148 | } | |
149 | ||
534b98f9 QY |
150 | /* |
151 | * Helper function for address list OP_MODIFY callbacks. | |
152 | */ | |
f495425b QY |
153 | static void vrrp_yang_add_del_virtual_address(const struct lyd_node *dnode, |
154 | bool add) | |
155 | { | |
156 | struct vrrp_vrouter *vr; | |
157 | struct ipaddr ip; | |
158 | ||
159 | vr = nb_running_get_entry(dnode, NULL, true); | |
160 | yang_dnode_get_ip(&ip, dnode, NULL); | |
161 | if (add) | |
162 | vrrp_add_ip(vr, &ip); | |
163 | else | |
164 | vrrp_del_ip(vr, &ip); | |
165 | ||
166 | vrrp_check_start(vr); | |
167 | } | |
168 | ||
f495425b QY |
169 | /* |
170 | * XPath: | |
171 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address | |
172 | */ | |
173 | static int lib_interface_vrrp_vrrp_group_v4_virtual_address_create( | |
60ee8be1 | 174 | struct nb_cb_create_args *args) |
f495425b | 175 | { |
60ee8be1 | 176 | if (args->event != NB_EV_APPLY) |
f495425b QY |
177 | return NB_OK; |
178 | ||
60ee8be1 | 179 | vrrp_yang_add_del_virtual_address(args->dnode, true); |
f495425b QY |
180 | |
181 | return NB_OK; | |
182 | } | |
183 | ||
184 | static int lib_interface_vrrp_vrrp_group_v4_virtual_address_destroy( | |
60ee8be1 | 185 | struct nb_cb_destroy_args *args) |
f495425b | 186 | { |
60ee8be1 | 187 | if (args->event != NB_EV_APPLY) |
f495425b QY |
188 | return NB_OK; |
189 | ||
60ee8be1 | 190 | vrrp_yang_add_del_virtual_address(args->dnode, false); |
f495425b QY |
191 | |
192 | return NB_OK; | |
193 | } | |
194 | ||
195 | /* | |
196 | * XPath: | |
197 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority | |
198 | */ | |
199 | static struct yang_data * | |
200 | lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem( | |
60ee8be1 | 201 | struct nb_cb_get_elem_args *args) |
f495425b | 202 | { |
60ee8be1 | 203 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 204 | |
60ee8be1 | 205 | return yang_data_new_uint8(args->xpath, vr->v4->priority); |
f495425b QY |
206 | } |
207 | ||
208 | /* | |
209 | * XPath: | |
210 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface | |
211 | */ | |
212 | static struct yang_data * | |
60ee8be1 RW |
213 | lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem( |
214 | struct nb_cb_get_elem_args *args) | |
f495425b | 215 | { |
60ee8be1 | 216 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b QY |
217 | |
218 | struct yang_data *val = NULL; | |
219 | ||
220 | if (vr->v4->mvl_ifp) | |
60ee8be1 | 221 | val = yang_data_new_string(args->xpath, vr->v4->mvl_ifp->name); |
f495425b QY |
222 | |
223 | return val; | |
224 | } | |
225 | ||
226 | /* | |
227 | * XPath: | |
228 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address | |
229 | */ | |
230 | static struct yang_data * | |
60ee8be1 RW |
231 | lib_interface_vrrp_vrrp_group_v4_source_address_get_elem( |
232 | struct nb_cb_get_elem_args *args) | |
f495425b | 233 | { |
60ee8be1 | 234 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 235 | struct yang_data *val = NULL; |
f495425b | 236 | |
3448a75c | 237 | if (!ipaddr_is_zero(&vr->v4->src)) |
60ee8be1 | 238 | val = yang_data_new_ip(args->xpath, &vr->v4->src); |
f495425b QY |
239 | |
240 | return val; | |
241 | } | |
242 | ||
243 | /* | |
244 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state | |
245 | */ | |
60ee8be1 RW |
246 | static struct yang_data *lib_interface_vrrp_vrrp_group_v4_state_get_elem( |
247 | struct nb_cb_get_elem_args *args) | |
f495425b | 248 | { |
60ee8be1 | 249 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 250 | |
60ee8be1 | 251 | return yang_data_new_enum(args->xpath, vr->v4->fsm.state); |
f495425b QY |
252 | } |
253 | ||
254 | /* | |
255 | * XPath: | |
256 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval | |
257 | */ | |
258 | static struct yang_data * | |
259 | lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem( | |
60ee8be1 | 260 | struct nb_cb_get_elem_args *args) |
f495425b | 261 | { |
60ee8be1 | 262 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 263 | |
60ee8be1 | 264 | return yang_data_new_uint16(args->xpath, vr->v4->master_adver_interval); |
f495425b QY |
265 | } |
266 | ||
267 | /* | |
268 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time | |
269 | */ | |
60ee8be1 RW |
270 | static struct yang_data *lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem( |
271 | struct nb_cb_get_elem_args *args) | |
f495425b | 272 | { |
60ee8be1 | 273 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 274 | |
60ee8be1 | 275 | return yang_data_new_uint16(args->xpath, vr->v4->skew_time); |
f495425b QY |
276 | } |
277 | ||
278 | /* | |
279 | * XPath: | |
280 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition | |
281 | */ | |
282 | static struct yang_data * | |
283 | lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem( | |
60ee8be1 | 284 | struct nb_cb_get_elem_args *args) |
f495425b | 285 | { |
60ee8be1 | 286 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 287 | |
60ee8be1 | 288 | return yang_data_new_uint32(args->xpath, vr->v4->stats.trans_cnt); |
f495425b QY |
289 | } |
290 | ||
291 | /* | |
292 | * XPath: | |
293 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement | |
294 | */ | |
295 | static struct yang_data * | |
296 | lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem( | |
60ee8be1 | 297 | struct nb_cb_get_elem_args *args) |
f495425b | 298 | { |
60ee8be1 | 299 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 300 | |
60ee8be1 | 301 | return yang_data_new_uint32(args->xpath, vr->v4->stats.adver_tx_cnt); |
f495425b QY |
302 | } |
303 | ||
304 | /* | |
305 | * XPath: | |
306 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp | |
307 | */ | |
308 | static struct yang_data * | |
309 | lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem( | |
60ee8be1 | 310 | struct nb_cb_get_elem_args *args) |
f495425b | 311 | { |
60ee8be1 | 312 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 313 | |
60ee8be1 | 314 | return yang_data_new_uint32(args->xpath, vr->v4->stats.garp_tx_cnt); |
f495425b QY |
315 | } |
316 | ||
317 | /* | |
318 | * XPath: | |
319 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement | |
320 | */ | |
321 | static struct yang_data * | |
322 | lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem( | |
60ee8be1 | 323 | struct nb_cb_get_elem_args *args) |
f495425b | 324 | { |
60ee8be1 | 325 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 326 | |
60ee8be1 | 327 | return yang_data_new_uint32(args->xpath, vr->v4->stats.adver_rx_cnt); |
f495425b QY |
328 | } |
329 | ||
330 | /* | |
331 | * XPath: | |
332 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address | |
333 | */ | |
334 | static int lib_interface_vrrp_vrrp_group_v6_virtual_address_create( | |
60ee8be1 | 335 | struct nb_cb_create_args *args) |
f495425b | 336 | { |
60ee8be1 | 337 | if (args->event != NB_EV_APPLY) |
f495425b QY |
338 | return NB_OK; |
339 | ||
60ee8be1 | 340 | vrrp_yang_add_del_virtual_address(args->dnode, true); |
f495425b QY |
341 | |
342 | return NB_OK; | |
343 | } | |
344 | ||
345 | static int lib_interface_vrrp_vrrp_group_v6_virtual_address_destroy( | |
60ee8be1 | 346 | struct nb_cb_destroy_args *args) |
f495425b | 347 | { |
60ee8be1 | 348 | if (args->event != NB_EV_APPLY) |
f495425b QY |
349 | return NB_OK; |
350 | ||
60ee8be1 | 351 | vrrp_yang_add_del_virtual_address(args->dnode, false); |
f495425b QY |
352 | |
353 | return NB_OK; | |
354 | } | |
355 | ||
356 | /* | |
357 | * XPath: | |
358 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority | |
359 | */ | |
360 | static struct yang_data * | |
361 | lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem( | |
60ee8be1 | 362 | struct nb_cb_get_elem_args *args) |
f495425b | 363 | { |
60ee8be1 | 364 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 365 | |
60ee8be1 | 366 | return yang_data_new_uint8(args->xpath, vr->v6->priority); |
f495425b QY |
367 | } |
368 | ||
369 | /* | |
370 | * XPath: | |
371 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface | |
372 | */ | |
373 | static struct yang_data * | |
60ee8be1 RW |
374 | lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem( |
375 | struct nb_cb_get_elem_args *args) | |
f495425b | 376 | { |
60ee8be1 | 377 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b QY |
378 | struct yang_data *val = NULL; |
379 | ||
380 | if (vr->v6->mvl_ifp) | |
60ee8be1 | 381 | val = yang_data_new_string(args->xpath, vr->v6->mvl_ifp->name); |
f495425b QY |
382 | |
383 | return val; | |
384 | } | |
385 | ||
386 | /* | |
387 | * XPath: | |
388 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address | |
389 | */ | |
390 | static struct yang_data * | |
60ee8be1 RW |
391 | lib_interface_vrrp_vrrp_group_v6_source_address_get_elem( |
392 | struct nb_cb_get_elem_args *args) | |
f495425b | 393 | { |
60ee8be1 | 394 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 395 | struct yang_data *val = NULL; |
f495425b | 396 | |
3448a75c | 397 | if (!ipaddr_is_zero(&vr->v6->src)) |
60ee8be1 | 398 | val = yang_data_new_ip(args->xpath, &vr->v6->src); |
f495425b QY |
399 | |
400 | return val; | |
401 | } | |
402 | ||
403 | /* | |
404 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state | |
405 | */ | |
60ee8be1 RW |
406 | static struct yang_data *lib_interface_vrrp_vrrp_group_v6_state_get_elem( |
407 | struct nb_cb_get_elem_args *args) | |
f495425b | 408 | { |
60ee8be1 | 409 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 410 | |
60ee8be1 | 411 | return yang_data_new_enum(args->xpath, vr->v6->fsm.state); |
f495425b QY |
412 | } |
413 | ||
414 | /* | |
415 | * XPath: | |
416 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval | |
417 | */ | |
418 | static struct yang_data * | |
419 | lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem( | |
60ee8be1 | 420 | struct nb_cb_get_elem_args *args) |
f495425b | 421 | { |
60ee8be1 | 422 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 423 | |
60ee8be1 | 424 | return yang_data_new_uint16(args->xpath, vr->v6->master_adver_interval); |
f495425b QY |
425 | } |
426 | ||
427 | /* | |
428 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time | |
429 | */ | |
60ee8be1 RW |
430 | static struct yang_data *lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem( |
431 | struct nb_cb_get_elem_args *args) | |
f495425b | 432 | { |
60ee8be1 | 433 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 434 | |
60ee8be1 | 435 | return yang_data_new_uint16(args->xpath, vr->v6->skew_time); |
f495425b QY |
436 | } |
437 | ||
438 | /* | |
439 | * XPath: | |
440 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition | |
441 | */ | |
442 | static struct yang_data * | |
443 | lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem( | |
60ee8be1 | 444 | struct nb_cb_get_elem_args *args) |
f495425b | 445 | { |
60ee8be1 | 446 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 447 | |
60ee8be1 | 448 | return yang_data_new_uint32(args->xpath, vr->v6->stats.trans_cnt); |
f495425b QY |
449 | } |
450 | ||
451 | /* | |
452 | * XPath: | |
453 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement | |
454 | */ | |
455 | static struct yang_data * | |
456 | lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem( | |
60ee8be1 | 457 | struct nb_cb_get_elem_args *args) |
f495425b | 458 | { |
60ee8be1 | 459 | const struct vrrp_vrouter *vr = args->list_entry; |
f495425b | 460 | |
60ee8be1 | 461 | return yang_data_new_uint32(args->xpath, vr->v6->stats.adver_tx_cnt); |
f495425b QY |
462 | } |
463 | ||
464 | /* | |
465 | * XPath: | |
466 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement | |
467 | */ | |
468 | static struct yang_data * | |
469 | lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem( | |
60ee8be1 | 470 | struct nb_cb_get_elem_args *args) |
f495425b QY |
471 | { |
472 | /* TODO: implement me. */ | |
473 | return NULL; | |
474 | } | |
475 | ||
476 | /* | |
477 | * XPath: | |
478 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement | |
479 | */ | |
480 | static struct yang_data * | |
481 | lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem( | |
60ee8be1 | 482 | struct nb_cb_get_elem_args *args) |
f495425b QY |
483 | { |
484 | /* TODO: implement me. */ | |
485 | return NULL; | |
486 | } | |
487 | ||
488 | /* | |
489 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority | |
490 | */ | |
491 | static int | |
60ee8be1 | 492 | lib_interface_vrrp_vrrp_group_priority_modify(struct nb_cb_modify_args *args) |
f495425b | 493 | { |
60ee8be1 | 494 | if (args->event != NB_EV_APPLY) |
f495425b QY |
495 | return NB_OK; |
496 | ||
497 | struct vrrp_vrouter *vr; | |
498 | uint8_t priority; | |
499 | ||
60ee8be1 RW |
500 | vr = nb_running_get_entry(args->dnode, NULL, true); |
501 | priority = yang_dnode_get_uint8(args->dnode, NULL); | |
f495425b QY |
502 | vrrp_set_priority(vr, priority); |
503 | ||
504 | return NB_OK; | |
505 | } | |
506 | ||
507 | /* | |
508 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt | |
509 | */ | |
510 | static int | |
60ee8be1 | 511 | lib_interface_vrrp_vrrp_group_preempt_modify(struct nb_cb_modify_args *args) |
f495425b | 512 | { |
60ee8be1 | 513 | if (args->event != NB_EV_APPLY) |
f495425b QY |
514 | return NB_OK; |
515 | ||
516 | struct vrrp_vrouter *vr; | |
517 | bool preempt; | |
518 | ||
60ee8be1 RW |
519 | vr = nb_running_get_entry(args->dnode, NULL, true); |
520 | preempt = yang_dnode_get_bool(args->dnode, NULL); | |
f495425b QY |
521 | vr->preempt_mode = preempt; |
522 | ||
523 | return NB_OK; | |
524 | } | |
525 | ||
526 | /* | |
527 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode | |
528 | */ | |
529 | static int | |
60ee8be1 | 530 | lib_interface_vrrp_vrrp_group_accept_mode_modify(struct nb_cb_modify_args *args) |
f495425b | 531 | { |
60ee8be1 | 532 | if (args->event != NB_EV_APPLY) |
f495425b QY |
533 | return NB_OK; |
534 | ||
535 | struct vrrp_vrouter *vr; | |
536 | bool accept; | |
537 | ||
60ee8be1 RW |
538 | vr = nb_running_get_entry(args->dnode, NULL, true); |
539 | accept = yang_dnode_get_bool(args->dnode, NULL); | |
f495425b QY |
540 | vr->accept_mode = accept; |
541 | ||
542 | return NB_OK; | |
543 | } | |
544 | ||
545 | /* | |
546 | * XPath: | |
547 | * /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval | |
548 | */ | |
549 | static int lib_interface_vrrp_vrrp_group_advertisement_interval_modify( | |
60ee8be1 | 550 | struct nb_cb_modify_args *args) |
f495425b | 551 | { |
60ee8be1 | 552 | if (args->event != NB_EV_APPLY) |
f495425b QY |
553 | return NB_OK; |
554 | ||
555 | struct vrrp_vrouter *vr; | |
556 | uint16_t advert_int; | |
557 | ||
60ee8be1 RW |
558 | vr = nb_running_get_entry(args->dnode, NULL, true); |
559 | advert_int = yang_dnode_get_uint16(args->dnode, NULL); | |
f495425b QY |
560 | vrrp_set_advertisement_interval(vr, advert_int); |
561 | ||
562 | return NB_OK; | |
563 | } | |
564 | ||
565 | /* | |
566 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown | |
567 | */ | |
568 | static int | |
60ee8be1 | 569 | lib_interface_vrrp_vrrp_group_shutdown_modify(struct nb_cb_modify_args *args) |
f495425b | 570 | { |
60ee8be1 | 571 | if (args->event != NB_EV_APPLY) |
f495425b QY |
572 | return NB_OK; |
573 | ||
574 | struct vrrp_vrouter *vr; | |
575 | bool shutdown; | |
576 | ||
60ee8be1 RW |
577 | vr = nb_running_get_entry(args->dnode, NULL, true); |
578 | shutdown = yang_dnode_get_bool(args->dnode, NULL); | |
f495425b QY |
579 | |
580 | vr->shutdown = shutdown; | |
581 | ||
582 | if (shutdown) { | |
583 | vrrp_event(vr->v4, VRRP_EVENT_SHUTDOWN); | |
584 | vrrp_event(vr->v6, VRRP_EVENT_SHUTDOWN); | |
585 | } else { | |
586 | vrrp_check_start(vr); | |
587 | } | |
588 | ||
589 | return NB_OK; | |
590 | } | |
591 | ||
9f2379bd SY |
592 | /* |
593 | * XPath: /frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/checksum-with- | |
594 | * ipv4-pseudoheader | |
595 | */ | |
596 | static int lib_interface_vrrp_vrrp_group_checksum_with_ipv4_pseudoheader_modify( | |
597 | struct nb_cb_modify_args *args) | |
598 | { | |
599 | if (args->event != NB_EV_APPLY) | |
600 | return NB_OK; | |
601 | ||
602 | struct vrrp_vrouter *vr; | |
603 | bool checksum_with_ipv4_ph; | |
604 | ||
605 | vr = nb_running_get_entry(args->dnode, NULL, true); | |
606 | checksum_with_ipv4_ph = yang_dnode_get_bool(args->dnode, NULL); | |
607 | vr->checksum_with_ipv4_pseudoheader = checksum_with_ipv4_ph; | |
608 | ||
609 | return NB_OK; | |
610 | } | |
611 | ||
f495425b QY |
612 | /* clang-format off */ |
613 | const struct frr_yang_module_info frr_vrrpd_info = { | |
614 | .name = "frr-vrrpd", | |
615 | .nodes = { | |
616 | { | |
617 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group", | |
618 | .cbs = { | |
619 | .create = lib_interface_vrrp_vrrp_group_create, | |
620 | .destroy = lib_interface_vrrp_vrrp_group_destroy, | |
621 | .get_next = lib_interface_vrrp_vrrp_group_get_next, | |
622 | .get_keys = lib_interface_vrrp_vrrp_group_get_keys, | |
623 | .lookup_entry = lib_interface_vrrp_vrrp_group_lookup_entry, | |
624 | .cli_show = cli_show_vrrp, | |
625 | } | |
626 | }, | |
627 | { | |
628 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/version", | |
629 | .cbs = { | |
630 | .modify = lib_interface_vrrp_vrrp_group_version_modify, | |
631 | } | |
632 | }, | |
633 | { | |
634 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/priority", | |
635 | .cbs = { | |
636 | .modify = lib_interface_vrrp_vrrp_group_priority_modify, | |
637 | .cli_show = cli_show_priority, | |
638 | } | |
639 | }, | |
640 | { | |
641 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/preempt", | |
642 | .cbs = { | |
643 | .modify = lib_interface_vrrp_vrrp_group_preempt_modify, | |
644 | .cli_show = cli_show_preempt, | |
645 | } | |
646 | }, | |
647 | { | |
648 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/accept-mode", | |
649 | .cbs = { | |
650 | .modify = lib_interface_vrrp_vrrp_group_accept_mode_modify, | |
651 | } | |
652 | }, | |
9f2379bd SY |
653 | { |
654 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/checksum-with-ipv4-pseudoheader", | |
655 | .cbs = { | |
656 | .modify = lib_interface_vrrp_vrrp_group_checksum_with_ipv4_pseudoheader_modify, | |
657 | .cli_show = cli_show_checksum_with_ipv4_pseudoheader, | |
658 | } | |
659 | }, | |
f495425b QY |
660 | { |
661 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/advertisement-interval", | |
662 | .cbs = { | |
663 | .modify = lib_interface_vrrp_vrrp_group_advertisement_interval_modify, | |
664 | .cli_show = cli_show_advertisement_interval, | |
665 | } | |
666 | }, | |
667 | { | |
668 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/shutdown", | |
669 | .cbs = { | |
670 | .modify = lib_interface_vrrp_vrrp_group_shutdown_modify, | |
671 | .cli_show = cli_show_shutdown, | |
672 | } | |
673 | }, | |
674 | { | |
675 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/virtual-address", | |
676 | .cbs = { | |
677 | .create = lib_interface_vrrp_vrrp_group_v4_virtual_address_create, | |
678 | .destroy = lib_interface_vrrp_vrrp_group_v4_virtual_address_destroy, | |
679 | .cli_show = cli_show_ip, | |
680 | } | |
681 | }, | |
682 | { | |
683 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/current-priority", | |
684 | .cbs = { | |
685 | .get_elem = lib_interface_vrrp_vrrp_group_v4_current_priority_get_elem, | |
686 | } | |
687 | }, | |
688 | { | |
689 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/vrrp-interface", | |
690 | .cbs = { | |
691 | .get_elem = lib_interface_vrrp_vrrp_group_v4_vrrp_interface_get_elem, | |
692 | } | |
693 | }, | |
694 | { | |
695 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/source-address", | |
696 | .cbs = { | |
697 | .get_elem = lib_interface_vrrp_vrrp_group_v4_source_address_get_elem, | |
698 | } | |
699 | }, | |
700 | { | |
701 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/state", | |
702 | .cbs = { | |
703 | .get_elem = lib_interface_vrrp_vrrp_group_v4_state_get_elem, | |
704 | } | |
705 | }, | |
706 | { | |
707 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/master-advertisement-interval", | |
708 | .cbs = { | |
709 | .get_elem = lib_interface_vrrp_vrrp_group_v4_master_advertisement_interval_get_elem, | |
710 | } | |
711 | }, | |
712 | { | |
713 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/skew-time", | |
714 | .cbs = { | |
715 | .get_elem = lib_interface_vrrp_vrrp_group_v4_skew_time_get_elem, | |
716 | } | |
717 | }, | |
718 | { | |
719 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/state-transition", | |
720 | .cbs = { | |
721 | .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_state_transition_get_elem, | |
722 | } | |
723 | }, | |
724 | { | |
725 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/advertisement", | |
726 | .cbs = { | |
727 | .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_tx_advertisement_get_elem, | |
728 | } | |
729 | }, | |
730 | { | |
731 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/tx/gratuitous-arp", | |
732 | .cbs = { | |
733 | .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_tx_gratuitous_arp_get_elem, | |
734 | } | |
735 | }, | |
736 | { | |
737 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v4/counter/rx/advertisement", | |
738 | .cbs = { | |
739 | .get_elem = lib_interface_vrrp_vrrp_group_v4_counter_rx_advertisement_get_elem, | |
740 | } | |
741 | }, | |
742 | { | |
743 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/virtual-address", | |
744 | .cbs = { | |
745 | .create = lib_interface_vrrp_vrrp_group_v6_virtual_address_create, | |
746 | .destroy = lib_interface_vrrp_vrrp_group_v6_virtual_address_destroy, | |
747 | .cli_show = cli_show_ipv6, | |
748 | } | |
749 | }, | |
750 | { | |
751 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/current-priority", | |
752 | .cbs = { | |
753 | .get_elem = lib_interface_vrrp_vrrp_group_v6_current_priority_get_elem, | |
754 | } | |
755 | }, | |
756 | { | |
757 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/vrrp-interface", | |
758 | .cbs = { | |
759 | .get_elem = lib_interface_vrrp_vrrp_group_v6_vrrp_interface_get_elem, | |
760 | } | |
761 | }, | |
762 | { | |
763 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/source-address", | |
764 | .cbs = { | |
765 | .get_elem = lib_interface_vrrp_vrrp_group_v6_source_address_get_elem, | |
766 | } | |
767 | }, | |
768 | { | |
769 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/state", | |
770 | .cbs = { | |
771 | .get_elem = lib_interface_vrrp_vrrp_group_v6_state_get_elem, | |
772 | } | |
773 | }, | |
774 | { | |
775 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/master-advertisement-interval", | |
776 | .cbs = { | |
777 | .get_elem = lib_interface_vrrp_vrrp_group_v6_master_advertisement_interval_get_elem, | |
778 | } | |
779 | }, | |
780 | { | |
781 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/skew-time", | |
782 | .cbs = { | |
783 | .get_elem = lib_interface_vrrp_vrrp_group_v6_skew_time_get_elem, | |
784 | } | |
785 | }, | |
786 | { | |
787 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/state-transition", | |
788 | .cbs = { | |
789 | .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_state_transition_get_elem, | |
790 | } | |
791 | }, | |
792 | { | |
793 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/advertisement", | |
794 | .cbs = { | |
795 | .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_tx_advertisement_get_elem, | |
796 | } | |
797 | }, | |
798 | { | |
799 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/tx/neighbor-advertisement", | |
800 | .cbs = { | |
801 | .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_tx_neighbor_advertisement_get_elem, | |
802 | } | |
803 | }, | |
804 | { | |
805 | .xpath = "/frr-interface:lib/interface/frr-vrrpd:vrrp/vrrp-group/v6/counter/rx/advertisement", | |
806 | .cbs = { | |
807 | .get_elem = lib_interface_vrrp_vrrp_group_v6_counter_rx_advertisement_get_elem, | |
808 | } | |
809 | }, | |
810 | { | |
811 | .xpath = NULL, | |
812 | }, | |
813 | } | |
814 | }; |