]> git.proxmox.com Git - mirror_frr.git/blame - vrrpd/vrrp_northbound.c
lib: Fix overlapping memory type
[mirror_frr.git] / vrrpd / vrrp_northbound.c
CommitLineData
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 23static 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
61static int
62lib_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
75static const void *
60ee8be1 76lib_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
101done:
102 list_delete(&l);
103 return curr;
104}
105
60ee8be1
RW
106static int
107lib_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
118static const void *
60ee8be1 119lib_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 */
130static int
60ee8be1 131lib_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
153static 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 */
173static 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
184static 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 */
199static struct yang_data *
200lib_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 */
212static struct yang_data *
60ee8be1
RW
213lib_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 */
230static struct yang_data *
60ee8be1
RW
231lib_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
246static 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 */
258static struct yang_data *
259lib_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
270static 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 */
282static struct yang_data *
283lib_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 */
295static struct yang_data *
296lib_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 */
308static struct yang_data *
309lib_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 */
321static struct yang_data *
322lib_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 */
334static 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
345static 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 */
360static struct yang_data *
361lib_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 */
373static struct yang_data *
60ee8be1
RW
374lib_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 */
390static struct yang_data *
60ee8be1
RW
391lib_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
406static 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 */
418static struct yang_data *
419lib_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
430static 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 */
442static struct yang_data *
443lib_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 */
455static struct yang_data *
456lib_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 */
468static struct yang_data *
469lib_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 */
480static struct yang_data *
481lib_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 */
491static int
60ee8be1 492lib_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 */
510static int
60ee8be1 511lib_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 */
529static int
60ee8be1 530lib_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 */
549static 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 */
568static int
60ee8be1 569lib_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 */
596static 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 */
613const 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};