1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2020 Cumulus Networks, Inc.
8 #include "northbound.h"
11 #include "zebra/interface.h"
12 #include "zebra/zebra_router.h"
13 #include "zebra/debug.h"
17 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/up-count
20 lib_interface_zebra_state_up_count_get_elem(struct nb_cb_get_elem_args
*args
)
22 const struct interface
*ifp
= args
->list_entry
;
23 struct zebra_if
*zebra_if
;
27 return yang_data_new_uint16(args
->xpath
, zebra_if
->up_count
);
31 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/down-count
34 lib_interface_zebra_state_down_count_get_elem(struct nb_cb_get_elem_args
*args
)
36 const struct interface
*ifp
= args
->list_entry
;
37 struct zebra_if
*zebra_if
;
41 return yang_data_new_uint16(args
->xpath
, zebra_if
->down_count
);
45 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/zif-type
48 lib_interface_zebra_state_zif_type_get_elem(struct nb_cb_get_elem_args
*args
)
50 /* TODO: implement me. */
55 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/ptm-status
58 lib_interface_zebra_state_ptm_status_get_elem(struct nb_cb_get_elem_args
*args
)
60 /* TODO: implement me. */
65 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/vlan-id
68 lib_interface_zebra_state_vlan_id_get_elem(struct nb_cb_get_elem_args
*args
)
70 const struct interface
*ifp
= args
->list_entry
;
71 struct zebra_if
*zebra_if
;
72 struct zebra_l2info_vlan
*vlan_info
;
74 if (!IS_ZEBRA_IF_VLAN(ifp
))
78 vlan_info
= &zebra_if
->l2info
.vl
;
80 return yang_data_new_uint16(args
->xpath
, vlan_info
->vid
);
84 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/vni-id
87 lib_interface_zebra_state_vni_id_get_elem(struct nb_cb_get_elem_args
*args
)
89 const struct interface
*ifp
= args
->list_entry
;
90 struct zebra_if
*zebra_if
;
91 struct zebra_l2info_vxlan
*vxlan_info
;
93 if (!IS_ZEBRA_IF_VXLAN(ifp
))
97 vxlan_info
= &zebra_if
->l2info
.vxl
;
99 return yang_data_new_uint32(args
->xpath
, vxlan_info
->vni
);
103 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/remote-vtep
106 lib_interface_zebra_state_remote_vtep_get_elem(struct nb_cb_get_elem_args
*args
)
108 const struct interface
*ifp
= args
->list_entry
;
109 struct zebra_if
*zebra_if
;
110 struct zebra_l2info_vxlan
*vxlan_info
;
112 if (!IS_ZEBRA_IF_VXLAN(ifp
))
115 zebra_if
= ifp
->info
;
116 vxlan_info
= &zebra_if
->l2info
.vxl
;
118 return yang_data_new_ipv4(args
->xpath
, &vxlan_info
->vtep_ip
);
122 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/mcast-group
125 lib_interface_zebra_state_mcast_group_get_elem(struct nb_cb_get_elem_args
*args
)
127 const struct interface
*ifp
= args
->list_entry
;
128 struct zebra_if
*zebra_if
;
129 struct zebra_l2info_vxlan
*vxlan_info
;
131 if (!IS_ZEBRA_IF_VXLAN(ifp
))
134 zebra_if
= ifp
->info
;
135 vxlan_info
= &zebra_if
->l2info
.vxl
;
137 return yang_data_new_ipv4(args
->xpath
, &vxlan_info
->mcast_grp
);
140 const void *lib_vrf_zebra_ribs_rib_get_next(struct nb_cb_get_next_args
*args
)
142 struct vrf
*vrf
= (struct vrf
*)args
->parent_list_entry
;
143 struct zebra_router_table
*zrt
=
144 (struct zebra_router_table
*)args
->list_entry
;
146 struct zebra_vrf
*zvrf
;
150 zvrf
= zebra_vrf_lookup_by_id(vrf
->vrf_id
);
152 if (args
->list_entry
== NULL
) {
156 zrt
= zebra_router_find_zrt(zvrf
, zvrf
->table_id
, afi
, safi
);
160 zrt
= RB_NEXT(zebra_router_table_head
, zrt
);
161 /* vrf_id/ns_id do not match, only walk for the given VRF */
162 while (zrt
&& zrt
->ns_id
!= zvrf
->zns
->ns_id
)
163 zrt
= RB_NEXT(zebra_router_table_head
, zrt
);
169 int lib_vrf_zebra_ribs_rib_get_keys(struct nb_cb_get_keys_args
*args
)
171 const struct zebra_router_table
*zrt
= args
->list_entry
;
175 snprintfrr(args
->keys
->key
[0], sizeof(args
->keys
->key
[0]), "%s",
176 yang_afi_safi_value2identity(zrt
->afi
, zrt
->safi
));
177 snprintfrr(args
->keys
->key
[1], sizeof(args
->keys
->key
[1]), "%u",
184 lib_vrf_zebra_ribs_rib_lookup_entry(struct nb_cb_lookup_entry_args
*args
)
186 struct vrf
*vrf
= (struct vrf
*)args
->parent_list_entry
;
187 struct zebra_vrf
*zvrf
;
190 uint32_t table_id
= 0;
192 zvrf
= zebra_vrf_lookup_by_id(vrf
->vrf_id
);
194 yang_afi_safi_identity2value(args
->keys
->key
[0], &afi
, &safi
);
195 table_id
= yang_str2uint32(args
->keys
->key
[1]);
196 /* table_id 0 assume vrf's table_id. */
198 table_id
= zvrf
->table_id
;
200 return zebra_router_find_zrt(zvrf
, table_id
, afi
, safi
);
204 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/afi-safi-name
207 lib_vrf_zebra_ribs_rib_afi_safi_name_get_elem(struct nb_cb_get_elem_args
*args
)
209 const struct zebra_router_table
*zrt
= args
->list_entry
;
211 return yang_data_new_string(args
->xpath
,
212 yang_afi_safi_value2identity(zrt
->afi
, zrt
->safi
));
216 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/table-id
219 lib_vrf_zebra_ribs_rib_table_id_get_elem(struct nb_cb_get_elem_args
*args
)
221 const struct zebra_router_table
*zrt
= args
->list_entry
;
223 return yang_data_new_uint32(args
->xpath
, zrt
->tableid
);
227 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route
230 lib_vrf_zebra_ribs_rib_route_get_next(struct nb_cb_get_next_args
*args
)
232 const struct zebra_router_table
*zrt
= args
->parent_list_entry
;
233 struct route_node
*rn
= (struct route_node
*)args
->list_entry
;
235 if (args
->list_entry
== NULL
)
236 rn
= route_top(zrt
->table
);
238 rn
= srcdest_route_next(rn
);
239 /* Optimization: skip empty route nodes. */
240 while (rn
&& rn
->info
== NULL
)
243 /* Skip link-local routes. */
244 if (rn
&& rn
->p
.family
== AF_INET6
245 && IN6_IS_ADDR_LINKLOCAL(&rn
->p
.u
.prefix6
))
251 int lib_vrf_zebra_ribs_rib_route_get_keys(struct nb_cb_get_keys_args
*args
)
253 const struct route_node
*rn
= args
->list_entry
;
256 prefix2str(&rn
->p
, args
->keys
->key
[0], sizeof(args
->keys
->key
[0]));
262 lib_vrf_zebra_ribs_rib_route_lookup_entry(struct nb_cb_lookup_entry_args
*args
)
264 const struct zebra_router_table
*zrt
= args
->parent_list_entry
;
266 struct route_node
*rn
;
268 yang_str2prefix(args
->keys
->key
[0], &p
);
270 rn
= route_node_lookup(zrt
->table
, &p
);
275 route_unlock_node(rn
);
281 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/prefix
284 lib_vrf_zebra_ribs_rib_route_prefix_get_elem(struct nb_cb_get_elem_args
*args
)
286 const struct route_node
*rn
= args
->list_entry
;
288 return yang_data_new_prefix(args
->xpath
, &rn
->p
);
292 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry
294 const void *lib_vrf_zebra_ribs_rib_route_route_entry_get_next(
295 struct nb_cb_get_next_args
*args
)
297 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
298 struct route_node
*rn
= (struct route_node
*)args
->parent_list_entry
;
300 if (args
->list_entry
== NULL
)
301 RNODE_FIRST_RE(rn
, re
);
303 RNODE_NEXT_RE(rn
, re
);
308 int lib_vrf_zebra_ribs_rib_route_route_entry_get_keys(
309 struct nb_cb_get_keys_args
*args
)
311 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
315 strlcpy(args
->keys
->key
[0], zebra_route_string(re
->type
),
316 sizeof(args
->keys
->key
[0]));
321 const void *lib_vrf_zebra_ribs_rib_route_route_entry_lookup_entry(
322 struct nb_cb_lookup_entry_args
*args
)
324 struct route_node
*rn
= (struct route_node
*)args
->parent_list_entry
;
325 struct route_entry
*re
= NULL
;
329 afi
= family2afi(rn
->p
.family
);
330 proto_type
= proto_redistnum(afi
, args
->keys
->key
[0]);
332 RNODE_FOREACH_RE (rn
, re
) {
333 if (proto_type
== re
->type
)
341 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/protocol
343 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_protocol_get_elem(
344 struct nb_cb_get_elem_args
*args
)
346 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
348 return yang_data_new_enum(args
->xpath
, re
->type
);
352 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/instance
354 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_instance_get_elem(
355 struct nb_cb_get_elem_args
*args
)
357 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
360 return yang_data_new_uint16(args
->xpath
, re
->instance
);
366 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/distance
368 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_distance_get_elem(
369 struct nb_cb_get_elem_args
*args
)
371 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
373 return yang_data_new_uint8(args
->xpath
, re
->distance
);
377 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/metric
379 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_metric_get_elem(
380 struct nb_cb_get_elem_args
*args
)
382 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
384 return yang_data_new_uint32(args
->xpath
, re
->metric
);
388 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/tag
390 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_tag_get_elem(
391 struct nb_cb_get_elem_args
*args
)
393 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
396 return yang_data_new_uint32(args
->xpath
, re
->tag
);
402 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/selected
404 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_selected_get_elem(
405 struct nb_cb_get_elem_args
*args
)
407 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
409 if (CHECK_FLAG(re
->flags
, ZEBRA_FLAG_SELECTED
))
410 return yang_data_new_empty(args
->xpath
);
416 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/installed
418 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_installed_get_elem(
419 struct nb_cb_get_elem_args
*args
)
421 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
423 if (CHECK_FLAG(re
->status
, ROUTE_ENTRY_INSTALLED
))
424 return yang_data_new_empty(args
->xpath
);
430 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/failed
432 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_failed_get_elem(
433 struct nb_cb_get_elem_args
*args
)
435 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
437 if (CHECK_FLAG(re
->status
, ROUTE_ENTRY_FAILED
))
438 return yang_data_new_empty(args
->xpath
);
444 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/queued
446 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_queued_get_elem(
447 struct nb_cb_get_elem_args
*args
)
449 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
451 if (CHECK_FLAG(re
->status
, ROUTE_ENTRY_QUEUED
))
452 return yang_data_new_empty(args
->xpath
);
459 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/internal-flags
462 lib_vrf_zebra_ribs_rib_route_route_entry_internal_flags_get_elem(
463 struct nb_cb_get_elem_args
*args
)
465 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
468 return yang_data_new_int32(args
->xpath
, re
->flags
);
475 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/internal-status
478 lib_vrf_zebra_ribs_rib_route_route_entry_internal_status_get_elem(
479 struct nb_cb_get_elem_args
*args
)
481 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
484 return yang_data_new_int32(args
->xpath
, re
->status
);
490 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/uptime
492 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_uptime_get_elem(
493 struct nb_cb_get_elem_args
*args
)
495 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
497 return yang_data_new_date_and_time(args
->xpath
, re
->uptime
);
502 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/id
505 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_id_get_elem(
506 struct nb_cb_get_elem_args
*args
)
508 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
510 return yang_data_new_uint32(args
->xpath
, re
->nhe
->id
);
515 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop
518 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_get_next(
519 struct nb_cb_get_next_args
*args
)
521 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
522 struct route_entry
*re
= (struct route_entry
*)args
->parent_list_entry
;
523 struct nhg_hash_entry
*nhe
= re
->nhe
;
525 if (args
->list_entry
== NULL
) {
526 nexthop
= nhe
->nhg
.nexthop
;
528 nexthop
= nexthop_next(nexthop
);
533 int lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_get_keys(
534 struct nb_cb_get_keys_args
*args
)
536 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
540 strlcpy(args
->keys
->key
[0], yang_nexthop_type2str(nexthop
->type
),
541 sizeof(args
->keys
->key
[0]));
543 snprintfrr(args
->keys
->key
[1], sizeof(args
->keys
->key
[1]), "%" PRIu32
,
546 switch (nexthop
->type
) {
547 case NEXTHOP_TYPE_IPV4
:
548 case NEXTHOP_TYPE_IPV4_IFINDEX
:
549 snprintfrr(args
->keys
->key
[2], sizeof(args
->keys
->key
[2]),
550 "%pI4", &nexthop
->gate
.ipv4
);
551 if (nexthop
->ifindex
)
552 strlcpy(args
->keys
->key
[3],
553 ifindex2ifname(nexthop
->ifindex
,
555 sizeof(args
->keys
->key
[3]));
558 strlcpy(args
->keys
->key
[3], " ",
559 sizeof(args
->keys
->key
[3]));
562 case NEXTHOP_TYPE_IPV6
:
563 case NEXTHOP_TYPE_IPV6_IFINDEX
:
564 snprintfrr(args
->keys
->key
[2], sizeof(args
->keys
->key
[2]),
565 "%pI6", &nexthop
->gate
.ipv6
);
567 if (nexthop
->ifindex
)
568 strlcpy(args
->keys
->key
[3],
569 ifindex2ifname(nexthop
->ifindex
,
571 sizeof(args
->keys
->key
[3]));
574 strlcpy(args
->keys
->key
[3], " ",
575 sizeof(args
->keys
->key
[3]));
578 case NEXTHOP_TYPE_IFINDEX
:
579 strlcpy(args
->keys
->key
[2], "", sizeof(args
->keys
->key
[2]));
580 strlcpy(args
->keys
->key
[3],
581 ifindex2ifname(nexthop
->ifindex
, nexthop
->vrf_id
),
582 sizeof(args
->keys
->key
[3]));
585 case NEXTHOP_TYPE_BLACKHOLE
:
587 strlcpy(args
->keys
->key
[2], "", sizeof(args
->keys
->key
[2]));
588 strlcpy(args
->keys
->key
[3], " ", sizeof(args
->keys
->key
[3]));
598 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_lookup_entry(
599 struct nb_cb_lookup_entry_args
*args
)
601 struct nhg_hash_entry
*nhe
;
602 struct nexthop nexthop_lookup
= {};
603 struct nexthop
*nexthop
;
604 const char *nh_type_str
;
606 nhe
= (struct nhg_hash_entry
*)args
->parent_list_entry
;
607 nexthop_lookup
.vrf_id
= nhe
->vrf_id
;
611 * TODO: use yang_str2enum() instead.
613 nh_type_str
= args
->keys
->key
[0];
614 if (strmatch(nh_type_str
, "ifindex"))
615 nexthop_lookup
.type
= NEXTHOP_TYPE_IFINDEX
;
616 else if (strmatch(nh_type_str
, "ip4"))
617 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV4
;
618 else if (strmatch(nh_type_str
, "ip4-ifindex"))
619 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV4_IFINDEX
;
620 else if (strmatch(nh_type_str
, "ip6"))
621 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV6
;
622 else if (strmatch(nh_type_str
, "ip6-ifindex"))
623 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV6_IFINDEX
;
624 else if (strmatch(nh_type_str
, "blackhole"))
625 nexthop_lookup
.type
= NEXTHOP_TYPE_BLACKHOLE
;
630 /* Get nexthop address. */
631 switch (nexthop_lookup
.type
) {
632 case NEXTHOP_TYPE_IPV4
:
633 case NEXTHOP_TYPE_IPV4_IFINDEX
:
634 yang_str2ipv4(args
->keys
->key
[1], &nexthop_lookup
.gate
.ipv4
);
636 case NEXTHOP_TYPE_IPV6
:
637 case NEXTHOP_TYPE_IPV6_IFINDEX
:
638 yang_str2ipv6(args
->keys
->key
[1], &nexthop_lookup
.gate
.ipv6
);
640 case NEXTHOP_TYPE_IFINDEX
:
641 case NEXTHOP_TYPE_BLACKHOLE
:
645 /* Get nexthop interface. */
646 switch (nexthop_lookup
.type
) {
647 case NEXTHOP_TYPE_IPV4_IFINDEX
:
648 case NEXTHOP_TYPE_IPV6_IFINDEX
:
649 case NEXTHOP_TYPE_IFINDEX
:
650 nexthop_lookup
.ifindex
=
651 ifname2ifindex(args
->keys
->key
[2], nhe
->vrf_id
);
653 case NEXTHOP_TYPE_IPV4
:
654 case NEXTHOP_TYPE_IPV6
:
655 case NEXTHOP_TYPE_BLACKHOLE
:
659 /* Lookup requested nexthop (ignore weight and metric). */
660 for (ALL_NEXTHOPS(nhe
->nhg
, nexthop
)) {
661 nexthop_lookup
.weight
= nexthop
->weight
;
662 nexthop_lookup
.src
= nexthop
->src
;
663 if (nexthop_same_no_labels(&nexthop_lookup
, nexthop
))
672 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/nh-type
675 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_nh_type_get_elem(
676 struct nb_cb_get_elem_args
*args
)
678 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
680 switch (nexthop
->type
) {
681 case NEXTHOP_TYPE_IFINDEX
:
682 return yang_data_new_string(args
->xpath
, "ifindex");
684 case NEXTHOP_TYPE_IPV4
:
685 return yang_data_new_string(args
->xpath
, "ip4");
687 case NEXTHOP_TYPE_IPV4_IFINDEX
:
688 return yang_data_new_string(args
->xpath
, "ip4-ifindex");
690 case NEXTHOP_TYPE_IPV6
:
691 return yang_data_new_string(args
->xpath
, "ip6");
693 case NEXTHOP_TYPE_IPV6_IFINDEX
:
694 return yang_data_new_string(args
->xpath
, "ip6-ifindex");
696 case NEXTHOP_TYPE_BLACKHOLE
:
705 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/vrf
708 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_vrf_get_elem(
709 struct nb_cb_get_elem_args
*args
)
711 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
713 return yang_data_new_string(args
->xpath
,
714 vrf_id_to_name(nexthop
->vrf_id
));
719 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/gateway
722 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_gateway_get_elem(
723 struct nb_cb_get_elem_args
*args
)
725 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
728 switch (nexthop
->type
) {
729 case NEXTHOP_TYPE_IPV4
:
730 case NEXTHOP_TYPE_IPV4_IFINDEX
:
731 addr
.ipa_type
= IPADDR_V4
;
732 memcpy(&addr
.ipaddr_v4
, &(nexthop
->gate
.ipv4
),
733 sizeof(struct in_addr
));
735 case NEXTHOP_TYPE_IPV6
:
736 case NEXTHOP_TYPE_IPV6_IFINDEX
:
737 addr
.ipa_type
= IPADDR_V6
;
738 memcpy(&addr
.ipaddr_v6
, &(nexthop
->gate
.ipv6
),
739 sizeof(struct in6_addr
));
741 case NEXTHOP_TYPE_BLACKHOLE
:
742 case NEXTHOP_TYPE_IFINDEX
:
744 return yang_data_new_string(args
->xpath
, "");
750 return yang_data_new_ip(args
->xpath
, &addr
);
755 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/interface
758 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_interface_get_elem(
759 struct nb_cb_get_elem_args
*args
)
761 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
763 if (nexthop
->ifindex
)
764 return yang_data_new_string(
766 ifindex2ifname(nexthop
->ifindex
, nexthop
->vrf_id
));
773 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/bh-type
776 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_bh_type_get_elem(
777 struct nb_cb_get_elem_args
*args
)
779 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
780 const char *type_str
= "";
782 if (nexthop
->type
!= NEXTHOP_TYPE_BLACKHOLE
)
785 switch (nexthop
->bh_type
) {
789 case BLACKHOLE_REJECT
:
792 case BLACKHOLE_ADMINPROHIB
:
793 type_str
= "prohibited";
795 case BLACKHOLE_UNSPEC
:
800 return yang_data_new_string(args
->xpath
, type_str
);
805 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/onlink
808 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_onlink_get_elem(
809 struct nb_cb_get_elem_args
*args
)
811 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
813 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_ONLINK
))
814 return yang_data_new_bool(args
->xpath
, true);
821 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/srte-color
824 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_color_get_elem(
825 struct nb_cb_get_elem_args
*args
)
827 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
829 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_SRTE
))
830 return yang_data_new_uint32(args
->xpath
, nexthop
->srte_color
);
837 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry
840 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_get_next(
841 struct nb_cb_get_next_args
*args
)
843 /* TODO: implement me. */
847 int lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_get_keys(
848 struct nb_cb_get_keys_args
*args
)
850 /* TODO: implement me. */
855 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_lookup_entry(
856 struct nb_cb_lookup_entry_args
*args
)
858 /* TODO: implement me. */
864 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/id
867 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_id_get_elem(
868 struct nb_cb_get_elem_args
*args
)
870 /* TODO: implement me. */
876 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/label
879 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_label_get_elem(
880 struct nb_cb_get_elem_args
*args
)
882 /* TODO: implement me. */
888 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/ttl
891 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_ttl_get_elem(
892 struct nb_cb_get_elem_args
*args
)
894 /* TODO: implement me. */
900 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/traffic-class
903 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_traffic_class_get_elem(
904 struct nb_cb_get_elem_args
*args
)
906 /* TODO: implement me. */
912 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/duplicate
915 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_duplicate_get_elem(
916 struct nb_cb_get_elem_args
*args
)
918 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
920 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_DUPLICATE
))
921 return yang_data_new_empty(args
->xpath
);
928 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/recursive
931 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_recursive_get_elem(
932 struct nb_cb_get_elem_args
*args
)
934 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
936 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
937 return yang_data_new_empty(args
->xpath
);
944 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/active
947 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_active_get_elem(
948 struct nb_cb_get_elem_args
*args
)
950 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
952 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
953 return yang_data_new_empty(args
->xpath
);
960 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/fib
963 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_fib_get_elem(
964 struct nb_cb_get_elem_args
*args
)
966 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
968 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_FIB
))
969 return yang_data_new_empty(args
->xpath
);
976 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/weight
979 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_weight_get_elem(
980 struct nb_cb_get_elem_args
*args
)
982 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
985 return yang_data_new_uint8(args
->xpath
, nexthop
->weight
);