]> git.proxmox.com Git - mirror_frr.git/blob - ripngd/ripng_nb_state.c
Merge pull request #6241 from volta-networks/fix_ldp_acl
[mirror_frr.git] / ripngd / ripng_nb_state.c
1 /*
2 * Copyright (C) 2018 NetDEF, Inc.
3 * Renato Westphal
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; either version 2 of the License, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; see the file COPYING; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 #include <zebra.h>
21
22 #include "if.h"
23 #include "vrf.h"
24 #include "log.h"
25 #include "prefix.h"
26 #include "table.h"
27 #include "command.h"
28 #include "routemap.h"
29 #include "agg_table.h"
30 #include "northbound.h"
31 #include "libfrr.h"
32
33 #include "ripngd/ripngd.h"
34 #include "ripngd/ripng_nb.h"
35 #include "ripngd/ripng_debug.h"
36 #include "ripngd/ripng_route.h"
37
38 /*
39 * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor
40 */
41 const void *ripngd_instance_state_neighbors_neighbor_get_next(
42 struct nb_cb_get_next_args *args)
43 {
44 const struct ripng *ripng = args->parent_list_entry;
45 struct listnode *node;
46
47 if (args->list_entry == NULL)
48 node = listhead(ripng->peer_list);
49 else
50 node = listnextnode((struct listnode *)args->list_entry);
51
52 return node;
53 }
54
55 int ripngd_instance_state_neighbors_neighbor_get_keys(
56 struct nb_cb_get_keys_args *args)
57 {
58 const struct listnode *node = args->list_entry;
59 const struct ripng_peer *peer = listgetdata(node);
60
61 args->keys->num = 1;
62 (void)inet_ntop(AF_INET6, &peer->addr, args->keys->key[0],
63 sizeof(args->keys->key[0]));
64
65 return NB_OK;
66 }
67
68 const void *ripngd_instance_state_neighbors_neighbor_lookup_entry(
69 struct nb_cb_lookup_entry_args *args)
70 {
71 const struct ripng *ripng = args->parent_list_entry;
72 struct in6_addr address;
73 struct ripng_peer *peer;
74 struct listnode *node;
75
76 yang_str2ipv6(args->keys->key[0], &address);
77
78 for (ALL_LIST_ELEMENTS_RO(ripng->peer_list, node, peer)) {
79 if (IPV6_ADDR_SAME(&peer->addr, &address))
80 return node;
81 }
82
83 return NULL;
84 }
85
86 /*
87 * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor/address
88 */
89 struct yang_data *ripngd_instance_state_neighbors_neighbor_address_get_elem(
90 struct nb_cb_get_elem_args *args)
91 {
92 const struct listnode *node = args->list_entry;
93 const struct ripng_peer *peer = listgetdata(node);
94
95 return yang_data_new_ipv6(args->xpath, &peer->addr);
96 }
97
98 /*
99 * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor/last-update
100 */
101 struct yang_data *ripngd_instance_state_neighbors_neighbor_last_update_get_elem(
102 struct nb_cb_get_elem_args *args)
103 {
104 /* TODO: yang:date-and-time is tricky */
105 return NULL;
106 }
107
108 /*
109 * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor/bad-packets-rcvd
110 */
111 struct yang_data *
112 ripngd_instance_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
113 struct nb_cb_get_elem_args *args)
114 {
115 const struct listnode *node = args->list_entry;
116 const struct ripng_peer *peer = listgetdata(node);
117
118 return yang_data_new_uint32(args->xpath, peer->recv_badpackets);
119 }
120
121 /*
122 * XPath: /frr-ripngd:ripngd/instance/state/neighbors/neighbor/bad-routes-rcvd
123 */
124 struct yang_data *
125 ripngd_instance_state_neighbors_neighbor_bad_routes_rcvd_get_elem(
126 struct nb_cb_get_elem_args *args)
127 {
128 const struct listnode *node = args->list_entry;
129 const struct ripng_peer *peer = listgetdata(node);
130
131 return yang_data_new_uint32(args->xpath, peer->recv_badroutes);
132 }
133
134 /*
135 * XPath: /frr-ripngd:ripngd/instance/state/routes/route
136 */
137 const void *
138 ripngd_instance_state_routes_route_get_next(struct nb_cb_get_next_args *args)
139 {
140 const struct ripng *ripng = args->parent_list_entry;
141 struct agg_node *rn;
142
143 if (args->list_entry == NULL)
144 rn = agg_route_top(ripng->table);
145 else
146 rn = agg_route_next((struct agg_node *)args->list_entry);
147 while (rn && rn->info == NULL)
148 rn = agg_route_next(rn);
149
150 return rn;
151 }
152
153 int ripngd_instance_state_routes_route_get_keys(
154 struct nb_cb_get_keys_args *args)
155 {
156 const struct agg_node *rn = args->list_entry;
157
158 args->keys->num = 1;
159 (void)prefix2str(agg_node_get_prefix(rn), args->keys->key[0],
160 sizeof(args->keys->key[0]));
161
162 return NB_OK;
163 }
164
165 const void *ripngd_instance_state_routes_route_lookup_entry(
166 struct nb_cb_lookup_entry_args *args)
167 {
168 const struct ripng *ripng = args->parent_list_entry;
169 struct prefix prefix;
170 struct agg_node *rn;
171
172 yang_str2ipv6p(args->keys->key[0], &prefix);
173
174 rn = agg_node_lookup(ripng->table, &prefix);
175 if (!rn || !rn->info)
176 return NULL;
177
178 agg_unlock_node(rn);
179
180 return rn;
181 }
182
183 /*
184 * XPath: /frr-ripngd:ripngd/instance/state/routes/route/prefix
185 */
186 struct yang_data *ripngd_instance_state_routes_route_prefix_get_elem(
187 struct nb_cb_get_elem_args *args)
188 {
189 const struct agg_node *rn = args->list_entry;
190 const struct ripng_info *rinfo = listnode_head(rn->info);
191
192 return yang_data_new_ipv6p(args->xpath, agg_node_get_prefix(rinfo->rp));
193 }
194
195 /*
196 * XPath: /frr-ripngd:ripngd/instance/state/routes/route/next-hop
197 */
198 struct yang_data *ripngd_instance_state_routes_route_next_hop_get_elem(
199 struct nb_cb_get_elem_args *args)
200 {
201 const struct agg_node *rn = args->list_entry;
202 const struct ripng_info *rinfo = listnode_head(rn->info);
203
204 return yang_data_new_ipv6(args->xpath, &rinfo->nexthop);
205 }
206
207 /*
208 * XPath: /frr-ripngd:ripngd/instance/state/routes/route/interface
209 */
210 struct yang_data *ripngd_instance_state_routes_route_interface_get_elem(
211 struct nb_cb_get_elem_args *args)
212 {
213 const struct agg_node *rn = args->list_entry;
214 const struct ripng_info *rinfo = listnode_head(rn->info);
215 const struct ripng *ripng = ripng_info_get_instance(rinfo);
216
217 return yang_data_new_string(
218 args->xpath,
219 ifindex2ifname(rinfo->ifindex, ripng->vrf->vrf_id));
220 }
221
222 /*
223 * XPath: /frr-ripngd:ripngd/instance/state/routes/route/metric
224 */
225 struct yang_data *ripngd_instance_state_routes_route_metric_get_elem(
226 struct nb_cb_get_elem_args *args)
227 {
228 const struct agg_node *rn = args->list_entry;
229 const struct ripng_info *rinfo = listnode_head(rn->info);
230
231 return yang_data_new_uint8(args->xpath, rinfo->metric);
232 }