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"
15 #include "zebra/zebra_vxlan.h"
16 #include "zebra/zebra_vxlan_if.h"
19 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/up-count
22 lib_interface_zebra_state_up_count_get_elem(struct nb_cb_get_elem_args
*args
)
24 const struct interface
*ifp
= args
->list_entry
;
25 struct zebra_if
*zebra_if
;
29 return yang_data_new_uint16(args
->xpath
, zebra_if
->up_count
);
33 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/down-count
36 lib_interface_zebra_state_down_count_get_elem(struct nb_cb_get_elem_args
*args
)
38 const struct interface
*ifp
= args
->list_entry
;
39 struct zebra_if
*zebra_if
;
43 return yang_data_new_uint16(args
->xpath
, zebra_if
->down_count
);
47 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/zif-type
50 lib_interface_zebra_state_zif_type_get_elem(struct nb_cb_get_elem_args
*args
)
52 /* TODO: implement me. */
57 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/ptm-status
60 lib_interface_zebra_state_ptm_status_get_elem(struct nb_cb_get_elem_args
*args
)
62 /* TODO: implement me. */
67 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/vlan-id
70 lib_interface_zebra_state_vlan_id_get_elem(struct nb_cb_get_elem_args
*args
)
72 const struct interface
*ifp
= args
->list_entry
;
73 struct zebra_if
*zebra_if
;
74 struct zebra_l2info_vlan
*vlan_info
;
76 if (!IS_ZEBRA_IF_VLAN(ifp
))
80 vlan_info
= &zebra_if
->l2info
.vl
;
82 return yang_data_new_uint16(args
->xpath
, vlan_info
->vid
);
86 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/vni-id
89 lib_interface_zebra_state_vni_id_get_elem(struct nb_cb_get_elem_args
*args
)
91 const struct interface
*ifp
= args
->list_entry
;
92 struct zebra_if
*zebra_if
;
93 struct zebra_vxlan_vni
*vni
;
95 if (!IS_ZEBRA_IF_VXLAN(ifp
))
100 if (!IS_ZEBRA_VXLAN_IF_VNI(zebra_if
))
103 vni
= zebra_vxlan_if_vni_find(zebra_if
, 0);
104 return yang_data_new_uint32(args
->xpath
, vni
->vni
);
108 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/remote-vtep
111 lib_interface_zebra_state_remote_vtep_get_elem(struct nb_cb_get_elem_args
*args
)
113 const struct interface
*ifp
= args
->list_entry
;
114 struct zebra_if
*zebra_if
;
115 struct zebra_l2info_vxlan
*vxlan_info
;
117 if (!IS_ZEBRA_IF_VXLAN(ifp
))
120 zebra_if
= ifp
->info
;
121 vxlan_info
= &zebra_if
->l2info
.vxl
;
123 return yang_data_new_ipv4(args
->xpath
, &vxlan_info
->vtep_ip
);
127 * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/mcast-group
130 lib_interface_zebra_state_mcast_group_get_elem(struct nb_cb_get_elem_args
*args
)
132 const struct interface
*ifp
= args
->list_entry
;
133 struct zebra_if
*zebra_if
;
134 struct zebra_vxlan_vni
*vni
;
136 if (!IS_ZEBRA_IF_VXLAN(ifp
))
139 zebra_if
= ifp
->info
;
141 if (!IS_ZEBRA_VXLAN_IF_VNI(zebra_if
))
144 vni
= zebra_vxlan_if_vni_find(zebra_if
, 0);
145 return yang_data_new_ipv4(args
->xpath
, &vni
->mcast_grp
);
148 const void *lib_vrf_zebra_ribs_rib_get_next(struct nb_cb_get_next_args
*args
)
150 struct vrf
*vrf
= (struct vrf
*)args
->parent_list_entry
;
151 struct zebra_router_table
*zrt
=
152 (struct zebra_router_table
*)args
->list_entry
;
154 struct zebra_vrf
*zvrf
;
158 zvrf
= zebra_vrf_lookup_by_id(vrf
->vrf_id
);
160 if (args
->list_entry
== NULL
) {
164 zrt
= zebra_router_find_zrt(zvrf
, zvrf
->table_id
, afi
, safi
);
168 zrt
= RB_NEXT(zebra_router_table_head
, zrt
);
169 /* vrf_id/ns_id do not match, only walk for the given VRF */
170 while (zrt
&& zrt
->ns_id
!= zvrf
->zns
->ns_id
)
171 zrt
= RB_NEXT(zebra_router_table_head
, zrt
);
177 int lib_vrf_zebra_ribs_rib_get_keys(struct nb_cb_get_keys_args
*args
)
179 const struct zebra_router_table
*zrt
= args
->list_entry
;
183 snprintfrr(args
->keys
->key
[0], sizeof(args
->keys
->key
[0]), "%s",
184 yang_afi_safi_value2identity(zrt
->afi
, zrt
->safi
));
185 snprintfrr(args
->keys
->key
[1], sizeof(args
->keys
->key
[1]), "%u",
192 lib_vrf_zebra_ribs_rib_lookup_entry(struct nb_cb_lookup_entry_args
*args
)
194 struct vrf
*vrf
= (struct vrf
*)args
->parent_list_entry
;
195 struct zebra_vrf
*zvrf
;
198 uint32_t table_id
= 0;
200 zvrf
= zebra_vrf_lookup_by_id(vrf
->vrf_id
);
202 yang_afi_safi_identity2value(args
->keys
->key
[0], &afi
, &safi
);
203 table_id
= yang_str2uint32(args
->keys
->key
[1]);
204 /* table_id 0 assume vrf's table_id. */
206 table_id
= zvrf
->table_id
;
208 return zebra_router_find_zrt(zvrf
, table_id
, afi
, safi
);
212 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/afi-safi-name
215 lib_vrf_zebra_ribs_rib_afi_safi_name_get_elem(struct nb_cb_get_elem_args
*args
)
217 const struct zebra_router_table
*zrt
= args
->list_entry
;
219 return yang_data_new_string(args
->xpath
,
220 yang_afi_safi_value2identity(zrt
->afi
, zrt
->safi
));
224 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/table-id
227 lib_vrf_zebra_ribs_rib_table_id_get_elem(struct nb_cb_get_elem_args
*args
)
229 const struct zebra_router_table
*zrt
= args
->list_entry
;
231 return yang_data_new_uint32(args
->xpath
, zrt
->tableid
);
235 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route
238 lib_vrf_zebra_ribs_rib_route_get_next(struct nb_cb_get_next_args
*args
)
240 const struct zebra_router_table
*zrt
= args
->parent_list_entry
;
241 struct route_node
*rn
= (struct route_node
*)args
->list_entry
;
243 if (args
->list_entry
== NULL
)
244 rn
= route_top(zrt
->table
);
246 rn
= srcdest_route_next(rn
);
247 /* Optimization: skip empty route nodes. */
248 while (rn
&& rn
->info
== NULL
)
251 /* Skip link-local routes. */
252 if (rn
&& rn
->p
.family
== AF_INET6
253 && IN6_IS_ADDR_LINKLOCAL(&rn
->p
.u
.prefix6
))
259 int lib_vrf_zebra_ribs_rib_route_get_keys(struct nb_cb_get_keys_args
*args
)
261 const struct route_node
*rn
= args
->list_entry
;
264 prefix2str(&rn
->p
, args
->keys
->key
[0], sizeof(args
->keys
->key
[0]));
270 lib_vrf_zebra_ribs_rib_route_lookup_entry(struct nb_cb_lookup_entry_args
*args
)
272 const struct zebra_router_table
*zrt
= args
->parent_list_entry
;
274 struct route_node
*rn
;
276 yang_str2prefix(args
->keys
->key
[0], &p
);
278 rn
= route_node_lookup(zrt
->table
, &p
);
283 route_unlock_node(rn
);
289 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/prefix
292 lib_vrf_zebra_ribs_rib_route_prefix_get_elem(struct nb_cb_get_elem_args
*args
)
294 const struct route_node
*rn
= args
->list_entry
;
296 return yang_data_new_prefix(args
->xpath
, &rn
->p
);
300 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry
302 const void *lib_vrf_zebra_ribs_rib_route_route_entry_get_next(
303 struct nb_cb_get_next_args
*args
)
305 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
306 struct route_node
*rn
= (struct route_node
*)args
->parent_list_entry
;
308 if (args
->list_entry
== NULL
)
309 RNODE_FIRST_RE(rn
, re
);
311 RNODE_NEXT_RE(rn
, re
);
316 int lib_vrf_zebra_ribs_rib_route_route_entry_get_keys(
317 struct nb_cb_get_keys_args
*args
)
319 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
323 strlcpy(args
->keys
->key
[0], zebra_route_string(re
->type
),
324 sizeof(args
->keys
->key
[0]));
329 const void *lib_vrf_zebra_ribs_rib_route_route_entry_lookup_entry(
330 struct nb_cb_lookup_entry_args
*args
)
332 struct route_node
*rn
= (struct route_node
*)args
->parent_list_entry
;
333 struct route_entry
*re
= NULL
;
337 afi
= family2afi(rn
->p
.family
);
338 proto_type
= proto_redistnum(afi
, args
->keys
->key
[0]);
340 RNODE_FOREACH_RE (rn
, re
) {
341 if (proto_type
== re
->type
)
349 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/protocol
351 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_protocol_get_elem(
352 struct nb_cb_get_elem_args
*args
)
354 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
356 return yang_data_new_enum(args
->xpath
, re
->type
);
360 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/instance
362 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_instance_get_elem(
363 struct nb_cb_get_elem_args
*args
)
365 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
368 return yang_data_new_uint16(args
->xpath
, re
->instance
);
374 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/distance
376 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_distance_get_elem(
377 struct nb_cb_get_elem_args
*args
)
379 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
381 return yang_data_new_uint8(args
->xpath
, re
->distance
);
385 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/metric
387 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_metric_get_elem(
388 struct nb_cb_get_elem_args
*args
)
390 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
392 return yang_data_new_uint32(args
->xpath
, re
->metric
);
396 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/tag
398 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_tag_get_elem(
399 struct nb_cb_get_elem_args
*args
)
401 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
404 return yang_data_new_uint32(args
->xpath
, re
->tag
);
410 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/selected
412 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_selected_get_elem(
413 struct nb_cb_get_elem_args
*args
)
415 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
417 if (CHECK_FLAG(re
->flags
, ZEBRA_FLAG_SELECTED
))
418 return yang_data_new_empty(args
->xpath
);
424 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/installed
426 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_installed_get_elem(
427 struct nb_cb_get_elem_args
*args
)
429 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
431 if (CHECK_FLAG(re
->status
, ROUTE_ENTRY_INSTALLED
))
432 return yang_data_new_empty(args
->xpath
);
438 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/failed
440 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_failed_get_elem(
441 struct nb_cb_get_elem_args
*args
)
443 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
445 if (CHECK_FLAG(re
->status
, ROUTE_ENTRY_FAILED
))
446 return yang_data_new_empty(args
->xpath
);
452 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/queued
454 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_queued_get_elem(
455 struct nb_cb_get_elem_args
*args
)
457 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
459 if (CHECK_FLAG(re
->status
, ROUTE_ENTRY_QUEUED
))
460 return yang_data_new_empty(args
->xpath
);
467 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/internal-flags
470 lib_vrf_zebra_ribs_rib_route_route_entry_internal_flags_get_elem(
471 struct nb_cb_get_elem_args
*args
)
473 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
476 return yang_data_new_int32(args
->xpath
, re
->flags
);
483 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/internal-status
486 lib_vrf_zebra_ribs_rib_route_route_entry_internal_status_get_elem(
487 struct nb_cb_get_elem_args
*args
)
489 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
492 return yang_data_new_int32(args
->xpath
, re
->status
);
498 * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/uptime
500 struct yang_data
*lib_vrf_zebra_ribs_rib_route_route_entry_uptime_get_elem(
501 struct nb_cb_get_elem_args
*args
)
503 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
505 return yang_data_new_date_and_time(args
->xpath
, re
->uptime
);
510 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/id
513 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_id_get_elem(
514 struct nb_cb_get_elem_args
*args
)
516 struct route_entry
*re
= (struct route_entry
*)args
->list_entry
;
518 return yang_data_new_uint32(args
->xpath
, re
->nhe
->id
);
523 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop
526 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_get_next(
527 struct nb_cb_get_next_args
*args
)
529 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
530 struct route_entry
*re
= (struct route_entry
*)args
->parent_list_entry
;
531 struct nhg_hash_entry
*nhe
= re
->nhe
;
533 if (args
->list_entry
== NULL
) {
534 nexthop
= nhe
->nhg
.nexthop
;
536 nexthop
= nexthop_next(nexthop
);
541 int lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_get_keys(
542 struct nb_cb_get_keys_args
*args
)
544 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
548 strlcpy(args
->keys
->key
[0], yang_nexthop_type2str(nexthop
->type
),
549 sizeof(args
->keys
->key
[0]));
551 snprintfrr(args
->keys
->key
[1], sizeof(args
->keys
->key
[1]), "%" PRIu32
,
554 switch (nexthop
->type
) {
555 case NEXTHOP_TYPE_IPV4
:
556 case NEXTHOP_TYPE_IPV4_IFINDEX
:
557 snprintfrr(args
->keys
->key
[2], sizeof(args
->keys
->key
[2]),
558 "%pI4", &nexthop
->gate
.ipv4
);
559 if (nexthop
->ifindex
)
560 strlcpy(args
->keys
->key
[3],
561 ifindex2ifname(nexthop
->ifindex
,
563 sizeof(args
->keys
->key
[3]));
566 strlcpy(args
->keys
->key
[3], " ",
567 sizeof(args
->keys
->key
[3]));
570 case NEXTHOP_TYPE_IPV6
:
571 case NEXTHOP_TYPE_IPV6_IFINDEX
:
572 snprintfrr(args
->keys
->key
[2], sizeof(args
->keys
->key
[2]),
573 "%pI6", &nexthop
->gate
.ipv6
);
575 if (nexthop
->ifindex
)
576 strlcpy(args
->keys
->key
[3],
577 ifindex2ifname(nexthop
->ifindex
,
579 sizeof(args
->keys
->key
[3]));
582 strlcpy(args
->keys
->key
[3], " ",
583 sizeof(args
->keys
->key
[3]));
586 case NEXTHOP_TYPE_IFINDEX
:
587 strlcpy(args
->keys
->key
[2], "", sizeof(args
->keys
->key
[2]));
588 strlcpy(args
->keys
->key
[3],
589 ifindex2ifname(nexthop
->ifindex
, nexthop
->vrf_id
),
590 sizeof(args
->keys
->key
[3]));
593 case NEXTHOP_TYPE_BLACKHOLE
:
595 strlcpy(args
->keys
->key
[2], "", sizeof(args
->keys
->key
[2]));
596 strlcpy(args
->keys
->key
[3], " ", sizeof(args
->keys
->key
[3]));
606 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_lookup_entry(
607 struct nb_cb_lookup_entry_args
*args
)
609 struct nhg_hash_entry
*nhe
;
610 struct nexthop nexthop_lookup
= {};
611 struct nexthop
*nexthop
;
612 const char *nh_type_str
;
614 nhe
= (struct nhg_hash_entry
*)args
->parent_list_entry
;
615 nexthop_lookup
.vrf_id
= nhe
->vrf_id
;
619 * TODO: use yang_str2enum() instead.
621 nh_type_str
= args
->keys
->key
[0];
622 if (strmatch(nh_type_str
, "ifindex"))
623 nexthop_lookup
.type
= NEXTHOP_TYPE_IFINDEX
;
624 else if (strmatch(nh_type_str
, "ip4"))
625 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV4
;
626 else if (strmatch(nh_type_str
, "ip4-ifindex"))
627 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV4_IFINDEX
;
628 else if (strmatch(nh_type_str
, "ip6"))
629 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV6
;
630 else if (strmatch(nh_type_str
, "ip6-ifindex"))
631 nexthop_lookup
.type
= NEXTHOP_TYPE_IPV6_IFINDEX
;
632 else if (strmatch(nh_type_str
, "blackhole"))
633 nexthop_lookup
.type
= NEXTHOP_TYPE_BLACKHOLE
;
638 /* Get nexthop address. */
639 switch (nexthop_lookup
.type
) {
640 case NEXTHOP_TYPE_IPV4
:
641 case NEXTHOP_TYPE_IPV4_IFINDEX
:
642 yang_str2ipv4(args
->keys
->key
[1], &nexthop_lookup
.gate
.ipv4
);
644 case NEXTHOP_TYPE_IPV6
:
645 case NEXTHOP_TYPE_IPV6_IFINDEX
:
646 yang_str2ipv6(args
->keys
->key
[1], &nexthop_lookup
.gate
.ipv6
);
648 case NEXTHOP_TYPE_IFINDEX
:
649 case NEXTHOP_TYPE_BLACKHOLE
:
653 /* Get nexthop interface. */
654 switch (nexthop_lookup
.type
) {
655 case NEXTHOP_TYPE_IPV4_IFINDEX
:
656 case NEXTHOP_TYPE_IPV6_IFINDEX
:
657 case NEXTHOP_TYPE_IFINDEX
:
658 nexthop_lookup
.ifindex
=
659 ifname2ifindex(args
->keys
->key
[2], nhe
->vrf_id
);
661 case NEXTHOP_TYPE_IPV4
:
662 case NEXTHOP_TYPE_IPV6
:
663 case NEXTHOP_TYPE_BLACKHOLE
:
667 /* Lookup requested nexthop (ignore weight and metric). */
668 for (ALL_NEXTHOPS(nhe
->nhg
, nexthop
)) {
669 nexthop_lookup
.weight
= nexthop
->weight
;
670 nexthop_lookup
.src
= nexthop
->src
;
671 if (nexthop_same_no_labels(&nexthop_lookup
, nexthop
))
680 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/nh-type
683 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_nh_type_get_elem(
684 struct nb_cb_get_elem_args
*args
)
686 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
688 switch (nexthop
->type
) {
689 case NEXTHOP_TYPE_IFINDEX
:
690 return yang_data_new_string(args
->xpath
, "ifindex");
692 case NEXTHOP_TYPE_IPV4
:
693 return yang_data_new_string(args
->xpath
, "ip4");
695 case NEXTHOP_TYPE_IPV4_IFINDEX
:
696 return yang_data_new_string(args
->xpath
, "ip4-ifindex");
698 case NEXTHOP_TYPE_IPV6
:
699 return yang_data_new_string(args
->xpath
, "ip6");
701 case NEXTHOP_TYPE_IPV6_IFINDEX
:
702 return yang_data_new_string(args
->xpath
, "ip6-ifindex");
704 case NEXTHOP_TYPE_BLACKHOLE
:
713 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/vrf
716 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_vrf_get_elem(
717 struct nb_cb_get_elem_args
*args
)
719 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
721 return yang_data_new_string(args
->xpath
,
722 vrf_id_to_name(nexthop
->vrf_id
));
727 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/gateway
730 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_gateway_get_elem(
731 struct nb_cb_get_elem_args
*args
)
733 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
736 switch (nexthop
->type
) {
737 case NEXTHOP_TYPE_IPV4
:
738 case NEXTHOP_TYPE_IPV4_IFINDEX
:
739 addr
.ipa_type
= IPADDR_V4
;
740 memcpy(&addr
.ipaddr_v4
, &(nexthop
->gate
.ipv4
),
741 sizeof(struct in_addr
));
743 case NEXTHOP_TYPE_IPV6
:
744 case NEXTHOP_TYPE_IPV6_IFINDEX
:
745 addr
.ipa_type
= IPADDR_V6
;
746 memcpy(&addr
.ipaddr_v6
, &(nexthop
->gate
.ipv6
),
747 sizeof(struct in6_addr
));
749 case NEXTHOP_TYPE_BLACKHOLE
:
750 case NEXTHOP_TYPE_IFINDEX
:
752 return yang_data_new_string(args
->xpath
, "");
758 return yang_data_new_ip(args
->xpath
, &addr
);
763 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/interface
766 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_interface_get_elem(
767 struct nb_cb_get_elem_args
*args
)
769 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
771 if (nexthop
->ifindex
)
772 return yang_data_new_string(
774 ifindex2ifname(nexthop
->ifindex
, nexthop
->vrf_id
));
781 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/bh-type
784 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_bh_type_get_elem(
785 struct nb_cb_get_elem_args
*args
)
787 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
788 const char *type_str
= "";
790 if (nexthop
->type
!= NEXTHOP_TYPE_BLACKHOLE
)
793 switch (nexthop
->bh_type
) {
797 case BLACKHOLE_REJECT
:
800 case BLACKHOLE_ADMINPROHIB
:
801 type_str
= "prohibited";
803 case BLACKHOLE_UNSPEC
:
808 return yang_data_new_string(args
->xpath
, type_str
);
813 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/onlink
816 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_onlink_get_elem(
817 struct nb_cb_get_elem_args
*args
)
819 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
821 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_ONLINK
))
822 return yang_data_new_bool(args
->xpath
, true);
829 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/srte-color
832 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_color_get_elem(
833 struct nb_cb_get_elem_args
*args
)
835 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
837 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_SRTE
))
838 return yang_data_new_uint32(args
->xpath
, nexthop
->srte_color
);
845 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry
848 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_get_next(
849 struct nb_cb_get_next_args
*args
)
851 /* TODO: implement me. */
855 int lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_get_keys(
856 struct nb_cb_get_keys_args
*args
)
858 /* TODO: implement me. */
863 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_lookup_entry(
864 struct nb_cb_lookup_entry_args
*args
)
866 /* TODO: implement me. */
872 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/id
875 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_id_get_elem(
876 struct nb_cb_get_elem_args
*args
)
878 /* TODO: implement me. */
884 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/label
887 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_label_get_elem(
888 struct nb_cb_get_elem_args
*args
)
890 /* TODO: implement me. */
896 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/ttl
899 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_ttl_get_elem(
900 struct nb_cb_get_elem_args
*args
)
902 /* TODO: implement me. */
908 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/mpls-label-stack/entry/traffic-class
911 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_mpls_label_stack_entry_traffic_class_get_elem(
912 struct nb_cb_get_elem_args
*args
)
914 /* TODO: implement me. */
920 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/duplicate
923 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_duplicate_get_elem(
924 struct nb_cb_get_elem_args
*args
)
926 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
928 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_DUPLICATE
))
929 return yang_data_new_empty(args
->xpath
);
936 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/recursive
939 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_recursive_get_elem(
940 struct nb_cb_get_elem_args
*args
)
942 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
944 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_RECURSIVE
))
945 return yang_data_new_empty(args
->xpath
);
952 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/active
955 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_active_get_elem(
956 struct nb_cb_get_elem_args
*args
)
958 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
960 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_ACTIVE
))
961 return yang_data_new_empty(args
->xpath
);
968 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/fib
971 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_fib_get_elem(
972 struct nb_cb_get_elem_args
*args
)
974 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
976 if (CHECK_FLAG(nexthop
->flags
, NEXTHOP_FLAG_FIB
))
977 return yang_data_new_empty(args
->xpath
);
984 * /frr-vrf:lib/vrf/frr-zebra:zebra/ribs/rib/route/route-entry/nexthop-group/nexthop/weight
987 lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_weight_get_elem(
988 struct nb_cb_get_elem_args
*args
)
990 struct nexthop
*nexthop
= (struct nexthop
*)args
->list_entry
;
993 return yang_data_new_uint8(args
->xpath
, nexthop
->weight
);