1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2018 NetDEF, Inc.
16 #include "northbound.h"
19 #include "ripd/ripd.h"
20 #include "ripd/rip_nb.h"
21 #include "ripd/rip_debug.h"
22 #include "ripd/rip_interface.h"
25 * XPath: /frr-ripd:ripd/instance
27 const void *ripd_instance_get_next(struct nb_cb_get_next_args
*args
)
29 struct rip
*rip
= (struct rip
*)args
->list_entry
;
31 if (args
->list_entry
== NULL
)
32 rip
= RB_MIN(rip_instance_head
, &rip_instances
);
34 rip
= RB_NEXT(rip_instance_head
, rip
);
39 int ripd_instance_get_keys(struct nb_cb_get_keys_args
*args
)
41 const struct rip
*rip
= args
->list_entry
;
44 strlcpy(args
->keys
->key
[0], rip
->vrf_name
, sizeof(args
->keys
->key
[0]));
49 const void *ripd_instance_lookup_entry(struct nb_cb_lookup_entry_args
*args
)
51 const char *vrf_name
= args
->keys
->key
[0];
53 return rip_lookup_by_vrf_name(vrf_name
);
57 * XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor
59 const void *ripd_instance_state_neighbors_neighbor_get_next(
60 struct nb_cb_get_next_args
*args
)
62 const struct rip
*rip
= args
->parent_list_entry
;
63 struct listnode
*node
;
65 if (args
->list_entry
== NULL
)
66 node
= listhead(rip
->peer_list
);
68 node
= listnextnode((struct listnode
*)args
->list_entry
);
73 int ripd_instance_state_neighbors_neighbor_get_keys(
74 struct nb_cb_get_keys_args
*args
)
76 const struct listnode
*node
= args
->list_entry
;
77 const struct rip_peer
*peer
= listgetdata(node
);
80 (void)inet_ntop(AF_INET
, &peer
->addr
, args
->keys
->key
[0],
81 sizeof(args
->keys
->key
[0]));
86 const void *ripd_instance_state_neighbors_neighbor_lookup_entry(
87 struct nb_cb_lookup_entry_args
*args
)
89 const struct rip
*rip
= args
->parent_list_entry
;
90 struct in_addr address
;
91 struct rip_peer
*peer
;
92 struct listnode
*node
;
94 yang_str2ipv4(args
->keys
->key
[0], &address
);
96 for (ALL_LIST_ELEMENTS_RO(rip
->peer_list
, node
, peer
)) {
97 if (IPV4_ADDR_SAME(&peer
->addr
, &address
))
105 * XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/address
107 struct yang_data
*ripd_instance_state_neighbors_neighbor_address_get_elem(
108 struct nb_cb_get_elem_args
*args
)
110 const struct listnode
*node
= args
->list_entry
;
111 const struct rip_peer
*peer
= listgetdata(node
);
113 return yang_data_new_ipv4(args
->xpath
, &peer
->addr
);
117 * XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/last-update
119 struct yang_data
*ripd_instance_state_neighbors_neighbor_last_update_get_elem(
120 struct nb_cb_get_elem_args
*args
)
122 /* TODO: yang:date-and-time is tricky */
127 * XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/bad-packets-rcvd
130 ripd_instance_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
131 struct nb_cb_get_elem_args
*args
)
133 const struct listnode
*node
= args
->list_entry
;
134 const struct rip_peer
*peer
= listgetdata(node
);
136 return yang_data_new_uint32(args
->xpath
, peer
->recv_badpackets
);
140 * XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/bad-routes-rcvd
143 ripd_instance_state_neighbors_neighbor_bad_routes_rcvd_get_elem(
144 struct nb_cb_get_elem_args
*args
)
146 const struct listnode
*node
= args
->list_entry
;
147 const struct rip_peer
*peer
= listgetdata(node
);
149 return yang_data_new_uint32(args
->xpath
, peer
->recv_badroutes
);
153 * XPath: /frr-ripd:ripd/instance/state/routes/route
156 ripd_instance_state_routes_route_get_next(struct nb_cb_get_next_args
*args
)
158 const struct rip
*rip
= args
->parent_list_entry
;
159 struct route_node
*rn
;
161 if (args
->list_entry
== NULL
)
162 rn
= route_top(rip
->table
);
164 rn
= route_next((struct route_node
*)args
->list_entry
);
165 /* Optimization: skip empty route nodes. */
166 while (rn
&& rn
->info
== NULL
)
172 int ripd_instance_state_routes_route_get_keys(struct nb_cb_get_keys_args
*args
)
174 const struct route_node
*rn
= args
->list_entry
;
177 (void)prefix2str(&rn
->p
, args
->keys
->key
[0],
178 sizeof(args
->keys
->key
[0]));
183 const void *ripd_instance_state_routes_route_lookup_entry(
184 struct nb_cb_lookup_entry_args
*args
)
186 const struct rip
*rip
= args
->parent_list_entry
;
187 struct prefix prefix
;
188 struct route_node
*rn
;
190 yang_str2ipv4p(args
->keys
->key
[0], &prefix
);
192 rn
= route_node_lookup(rip
->table
, &prefix
);
193 if (!rn
|| !rn
->info
)
196 route_unlock_node(rn
);
202 * XPath: /frr-ripd:ripd/instance/state/routes/route/prefix
204 struct yang_data
*ripd_instance_state_routes_route_prefix_get_elem(
205 struct nb_cb_get_elem_args
*args
)
207 const struct route_node
*rn
= args
->list_entry
;
208 const struct rip_info
*rinfo
= listnode_head(rn
->info
);
210 return yang_data_new_ipv4p(args
->xpath
, &rinfo
->rp
->p
);
214 * XPath: /frr-ripd:ripd/instance/state/routes/route/next-hop
216 struct yang_data
*ripd_instance_state_routes_route_next_hop_get_elem(
217 struct nb_cb_get_elem_args
*args
)
219 const struct route_node
*rn
= args
->list_entry
;
220 const struct rip_info
*rinfo
= listnode_head(rn
->info
);
222 switch (rinfo
->nh
.type
) {
223 case NEXTHOP_TYPE_IPV4
:
224 case NEXTHOP_TYPE_IPV4_IFINDEX
:
225 return yang_data_new_ipv4(args
->xpath
, &rinfo
->nh
.gate
.ipv4
);
226 case NEXTHOP_TYPE_IFINDEX
:
227 case NEXTHOP_TYPE_IPV6
:
228 case NEXTHOP_TYPE_IPV6_IFINDEX
:
229 case NEXTHOP_TYPE_BLACKHOLE
:
233 assert(!"Reached end of function where we do not expect to reach");
237 * XPath: /frr-ripd:ripd/instance/state/routes/route/interface
239 struct yang_data
*ripd_instance_state_routes_route_interface_get_elem(
240 struct nb_cb_get_elem_args
*args
)
242 const struct route_node
*rn
= args
->list_entry
;
243 const struct rip_info
*rinfo
= listnode_head(rn
->info
);
244 const struct rip
*rip
= rip_info_get_instance(rinfo
);
246 switch (rinfo
->nh
.type
) {
247 case NEXTHOP_TYPE_IFINDEX
:
248 case NEXTHOP_TYPE_IPV4_IFINDEX
:
249 return yang_data_new_string(
251 ifindex2ifname(rinfo
->nh
.ifindex
, rip
->vrf
->vrf_id
));
252 case NEXTHOP_TYPE_IPV4
:
253 case NEXTHOP_TYPE_IPV6
:
254 case NEXTHOP_TYPE_IPV6_IFINDEX
:
255 case NEXTHOP_TYPE_BLACKHOLE
:
259 assert(!"Reached end of function where we do not expect to reach");
263 * XPath: /frr-ripd:ripd/instance/state/routes/route/metric
265 struct yang_data
*ripd_instance_state_routes_route_metric_get_elem(
266 struct nb_cb_get_elem_args
*args
)
268 const struct route_node
*rn
= args
->list_entry
;
269 const struct rip_info
*rinfo
= listnode_head(rn
->info
);
271 return yang_data_new_uint8(args
->xpath
, rinfo
->metric
);