]> git.proxmox.com Git - mirror_frr.git/blame - lib/filter_nb.c
lib: fix northbound conflicts
[mirror_frr.git] / lib / filter_nb.c
CommitLineData
4470143b
RZ
1/*
2 * FRR filter northbound implementation.
3 *
4 * Copyright (C) 2019 Network Device Education Foundation, Inc. ("NetDEF")
5 * Rafael Zalamena
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301 USA.
21 */
22
23#include "zebra.h"
24
4470143b
RZ
25#include "lib/northbound.h"
26#include "lib/prefix.h"
27
28#include "lib/filter.h"
29#include "lib/plist.h"
30#include "lib/plist_int.h"
31
fb8884f3
RZ
32/* Helper function. */
33static in_addr_t
34ipv4_network_addr(in_addr_t hostaddr, int masklen)
35{
36 struct in_addr mask;
37
38 masklen2ip(masklen, &mask);
39 return hostaddr & mask.s_addr;
40}
41
4470143b
RZ
42/*
43 * XPath: /frr-filter:lib/access-list-legacy
44 */
fb8884f3 45static int lib_access_list_legacy_create(struct nb_cb_create_args *args)
4470143b
RZ
46{
47 struct access_list *acl;
48 const char *acl_name;
49
fb8884f3 50 if (args->event != NB_EV_APPLY)
4470143b
RZ
51 return NB_OK;
52
fb8884f3 53 acl_name = yang_dnode_get_string(args->dnode, "./number");
4470143b 54 acl = access_list_get(AFI_IP, acl_name);
fb8884f3 55 nb_running_set_entry(args->dnode, acl);
4470143b
RZ
56
57 return NB_OK;
58}
59
fb8884f3 60static int lib_access_list_legacy_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
61{
62 struct access_master *am;
63 struct access_list *acl;
64
fb8884f3 65 if (args->event != NB_EV_APPLY)
4470143b
RZ
66 return NB_OK;
67
fb8884f3 68 acl = nb_running_unset_entry(args->dnode);
4470143b
RZ
69 am = acl->master;
70 if (am->delete_hook)
71 am->delete_hook(acl);
72
73 access_list_delete(acl);
74
75 return NB_OK;
76}
77
78/*
79 * XPath: /frr-filter:lib/access-list-legacy/remark
80 */
fb8884f3 81static int lib_access_list_legacy_remark_modify(struct nb_cb_modify_args *args)
4470143b
RZ
82{
83 struct access_list *acl;
84 const char *remark;
85
fb8884f3 86 if (args->event != NB_EV_APPLY)
4470143b
RZ
87 return NB_OK;
88
fb8884f3 89 acl = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
90 if (acl->remark)
91 XFREE(MTYPE_TMP, acl->remark);
92
fb8884f3 93 remark = yang_dnode_get_string(args->dnode, NULL);
4470143b
RZ
94 acl->remark = XSTRDUP(MTYPE_TMP, remark);
95
96 return NB_OK;
97}
98
fb8884f3
RZ
99static int
100lib_access_list_legacy_remark_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
101{
102 struct access_list *acl;
103
fb8884f3 104 if (args->event != NB_EV_APPLY)
4470143b
RZ
105 return NB_OK;
106
fb8884f3 107 acl = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
108 if (acl->remark)
109 XFREE(MTYPE_TMP, acl->remark);
110
111 acl->remark = NULL;
112
113 return NB_OK;
114}
115
116/*
117 * XPath: /frr-filter:lib/access-list-legacy/entry
118 */
fb8884f3 119static int lib_access_list_legacy_entry_create(struct nb_cb_create_args *args)
4470143b
RZ
120{
121 struct filter_cisco *fc;
122 struct access_list *acl;
123 struct filter *f;
124 uint32_t aclno;
125
126 /* TODO: validate `filter_lookup_cisco` returns NULL. */
127
fb8884f3 128 if (args->event != NB_EV_APPLY)
4470143b
RZ
129 return NB_OK;
130
fb8884f3 131 aclno = yang_dnode_get_uint16(args->dnode, "../number");
4470143b
RZ
132
133 f = filter_new();
134 f->cisco = 1;
fb8884f3 135 f->seq = yang_dnode_get_uint32(args->dnode, "./sequence");
4470143b
RZ
136 fc = &f->u.cfilter;
137 if ((aclno >= 1 && aclno <= 99) || (aclno >= 1300 && aclno <= 1999))
138 fc->extended = 0;
139 else
140 fc->extended = 1;
141
fb8884f3 142 acl = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
143 f->acl = acl;
144 access_list_filter_add(acl, f);
fb8884f3 145 nb_running_set_entry(args->dnode, f);
4470143b
RZ
146
147 return NB_OK;
148}
149
fb8884f3 150static int lib_access_list_legacy_entry_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
151{
152 struct access_list *acl;
153 struct filter *f;
154
fb8884f3 155 if (args->event != NB_EV_APPLY)
4470143b
RZ
156 return NB_OK;
157
fb8884f3 158 f = nb_running_unset_entry(args->dnode);
4470143b
RZ
159 acl = f->acl;
160 access_list_filter_delete(acl, f);
161
162 return NB_OK;
163}
164
165/*
166 * XPath: /frr-filter:lib/access-list-legacy/entry/action
167 */
168static int
fb8884f3 169lib_access_list_legacy_entry_action_modify(struct nb_cb_modify_args *args)
4470143b
RZ
170{
171 const char *filter_type;
172 struct filter *f;
173
fb8884f3 174 if (args->event != NB_EV_APPLY)
4470143b
RZ
175 return NB_OK;
176
fb8884f3
RZ
177 f = nb_running_get_entry(args->dnode, NULL, true);
178 filter_type = yang_dnode_get_string(args->dnode, NULL);
4470143b
RZ
179 if (strcmp(filter_type, "permit") == 0)
180 f->type = FILTER_PERMIT;
181 else
182 f->type = FILTER_DENY;
183
184 return NB_OK;
185}
186
187/*
188 * XPath: /frr-filter:lib/access-list-legacy/entry/host
189 */
190static int
fb8884f3 191lib_access_list_legacy_entry_host_modify(struct nb_cb_modify_args *args)
4470143b
RZ
192{
193 struct filter_cisco *fc;
194 struct filter *f;
195
fb8884f3 196 if (args->event != NB_EV_APPLY)
4470143b
RZ
197 return NB_OK;
198
fb8884f3 199 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b 200 fc = &f->u.cfilter;
fb8884f3 201 yang_dnode_get_ipv4(&fc->addr, args->dnode, NULL);
4470143b
RZ
202 fc->addr_mask.s_addr = INADDR_ANY;
203
204 return NB_OK;
205}
206
207static int
fb8884f3 208lib_access_list_legacy_entry_host_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
209{
210 struct filter_cisco *fc;
211 struct filter *f;
212
fb8884f3 213 if (args->event != NB_EV_APPLY)
4470143b
RZ
214 return NB_OK;
215
fb8884f3 216 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
217 fc = &f->u.cfilter;
218 fc->addr.s_addr = INADDR_ANY;
219 fc->addr_mask.s_addr = INADDR_NONE;
220
221 return NB_OK;
222}
223
224/*
225 * XPath: /frr-filter:lib/access-list-legacy/entry/network
226 */
227static int
fb8884f3 228lib_access_list_legacy_entry_network_modify(struct nb_cb_modify_args *args)
4470143b
RZ
229{
230 struct filter_cisco *fc;
231 struct filter *f;
232 struct prefix p;
233
fb8884f3 234 if (args->event != NB_EV_APPLY)
4470143b
RZ
235 return NB_OK;
236
fb8884f3 237 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b 238 fc = &f->u.cfilter;
fb8884f3 239 yang_dnode_get_prefix(&p, args->dnode, NULL);
4470143b
RZ
240 fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
241 masklen2ip(p.prefixlen, &fc->addr_mask);
242
243 return NB_OK;
244}
245
246static int
fb8884f3 247lib_access_list_legacy_entry_network_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
248{
249 struct filter_cisco *fc;
250 struct filter *f;
251
fb8884f3 252 if (args->event != NB_EV_APPLY)
4470143b
RZ
253 return NB_OK;
254
fb8884f3 255 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
256 fc = &f->u.cfilter;
257 fc->addr.s_addr = INADDR_ANY;
258 fc->addr_mask.s_addr = INADDR_NONE;
259
260 return NB_OK;
261}
262
263/*
264 * XPath: /frr-filter:lib/access-list-legacy/entry/any
265 */
fb8884f3
RZ
266static int
267lib_access_list_legacy_entry_any_create(struct nb_cb_create_args *args)
4470143b
RZ
268{
269 struct filter_cisco *fc;
270 struct filter *f;
271
fb8884f3 272 if (args->event != NB_EV_APPLY)
4470143b
RZ
273 return NB_OK;
274
fb8884f3 275 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
276 fc = &f->u.cfilter;
277 fc->addr.s_addr = INADDR_ANY;
278 fc->addr_mask.s_addr = INADDR_NONE;
279
280 return NB_OK;
281}
282
283static int
fb8884f3 284lib_access_list_legacy_entry_any_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
285{
286 struct filter_cisco *fc;
287 struct filter *f;
288
fb8884f3 289 if (args->event != NB_EV_APPLY)
4470143b
RZ
290 return NB_OK;
291
fb8884f3 292 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
293 fc = &f->u.cfilter;
294 fc->addr.s_addr = INADDR_ANY;
295 fc->addr_mask.s_addr = INADDR_NONE;
296
297 return NB_OK;
298}
299
300/*
301 * XPath: /frr-filter:lib/access-list-legacy/entry/destination-host
302 */
303static int lib_access_list_legacy_entry_destination_host_modify(
fb8884f3 304 struct nb_cb_modify_args *args)
4470143b
RZ
305{
306 struct filter_cisco *fc;
307 struct filter *f;
308
fb8884f3 309 if (args->event != NB_EV_APPLY)
4470143b
RZ
310 return NB_OK;
311
fb8884f3 312 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b 313 fc = &f->u.cfilter;
fb8884f3 314 yang_dnode_get_ipv4(&fc->mask, args->dnode, NULL);
4470143b
RZ
315 fc->mask_mask.s_addr = INADDR_ANY;
316
317 return NB_OK;
318}
319
320static int lib_access_list_legacy_entry_destination_host_destroy(
fb8884f3 321 struct nb_cb_destroy_args *args)
4470143b
RZ
322{
323 struct filter_cisco *fc;
324 struct filter *f;
325
fb8884f3 326 if (args->event != NB_EV_APPLY)
4470143b
RZ
327 return NB_OK;
328
fb8884f3 329 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
330 fc = &f->u.cfilter;
331 fc->mask.s_addr = INADDR_ANY;
332 fc->mask_mask.s_addr = INADDR_NONE;
333
334 return NB_OK;
335}
336
337/*
338 * XPath: /frr-filter:lib/access-list-legacy/entry/destination-network
339 */
340static int lib_access_list_legacy_entry_destination_network_modify(
fb8884f3 341 struct nb_cb_modify_args *args)
4470143b
RZ
342{
343 struct filter_cisco *fc;
344 struct filter *f;
345 struct prefix p;
346
fb8884f3 347 if (args->event != NB_EV_APPLY)
4470143b
RZ
348 return NB_OK;
349
fb8884f3 350 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b 351 fc = &f->u.cfilter;
fb8884f3 352 yang_dnode_get_prefix(&p, args->dnode, NULL);
4470143b
RZ
353 fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
354 masklen2ip(p.prefixlen, &fc->addr_mask);
355
356 return NB_OK;
357}
358
359static int lib_access_list_legacy_entry_destination_network_destroy(
fb8884f3 360 struct nb_cb_destroy_args *args)
4470143b
RZ
361{
362 struct filter_cisco *fc;
363 struct filter *f;
364
fb8884f3 365 if (args->event != NB_EV_APPLY)
4470143b
RZ
366 return NB_OK;
367
fb8884f3 368 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
369 fc = &f->u.cfilter;
370 fc->mask.s_addr = INADDR_ANY;
371 fc->mask_mask.s_addr = INADDR_NONE;
372
373 return NB_OK;
374}
375
376/*
377 * XPath: /frr-filter:lib/access-list-legacy/entry/destination-any
378 */
379static int lib_access_list_legacy_entry_destination_any_create(
fb8884f3 380 struct nb_cb_create_args *args)
4470143b
RZ
381{
382 struct filter_cisco *fc;
383 struct filter *f;
384
fb8884f3 385 if (args->event != NB_EV_APPLY)
4470143b
RZ
386 return NB_OK;
387
fb8884f3 388 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
389 fc = &f->u.cfilter;
390 fc->mask.s_addr = INADDR_ANY;
391 fc->mask_mask.s_addr = INADDR_NONE;
392
393 return NB_OK;
394}
395
396static int lib_access_list_legacy_entry_destination_any_destroy(
fb8884f3 397 struct nb_cb_destroy_args *args)
4470143b
RZ
398{
399 struct filter_cisco *fc;
400 struct filter *f;
401
fb8884f3 402 if (args->event != NB_EV_APPLY)
4470143b
RZ
403 return NB_OK;
404
fb8884f3 405 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
406 fc = &f->u.cfilter;
407 fc->mask.s_addr = INADDR_ANY;
408 fc->mask_mask.s_addr = INADDR_NONE;
409
410 return NB_OK;
411}
412
413/*
414 * XPath: /frr-filter:lib/access-list
415 */
fb8884f3 416static int lib_access_list_create(struct nb_cb_create_args *args)
4470143b
RZ
417{
418 struct access_list *acl;
419 const char *acl_name;
420 int type;
421
fb8884f3 422 if (args->event != NB_EV_APPLY)
4470143b
RZ
423 return NB_OK;
424
fb8884f3
RZ
425 type = yang_dnode_get_enum(args->dnode, "./type");
426 acl_name = yang_dnode_get_string(args->dnode, "./name");
4470143b
RZ
427
428 switch (type) {
429 case 0: /* ipv4 */
430 acl = access_list_get(AFI_IP, acl_name);
431 break;
432 case 1: /* ipv6 */
433 acl = access_list_get(AFI_IP6, acl_name);
434 break;
435 case 2: /* mac */
436 acl = access_list_get(AFI_L2VPN, acl_name);
437 break;
438 }
439
fb8884f3 440 nb_running_set_entry(args->dnode, acl);
4470143b
RZ
441
442 return NB_OK;
443}
444
fb8884f3 445static int lib_access_list_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
446{
447 struct access_master *am;
448 struct access_list *acl;
449
fb8884f3 450 if (args->event != NB_EV_APPLY)
4470143b
RZ
451 return NB_OK;
452
fb8884f3 453 acl = nb_running_unset_entry(args->dnode);
4470143b
RZ
454 am = acl->master;
455 if (am->delete_hook)
456 am->delete_hook(acl);
457
458 access_list_delete(acl);
459
460 return NB_OK;
461}
462
463/*
464 * XPath: /frr-filter:lib/access-list/remark
465 */
fb8884f3 466static int lib_access_list_remark_modify(struct nb_cb_modify_args *args)
4470143b 467{
fb8884f3 468 return lib_access_list_legacy_remark_modify(args);
4470143b
RZ
469}
470
fb8884f3 471static int lib_access_list_remark_destroy(struct nb_cb_destroy_args *args)
4470143b 472{
fb8884f3 473 return lib_access_list_legacy_remark_destroy(args);
4470143b
RZ
474}
475
476/*
477 * XPath: /frr-filter:lib/access-list/entry
478 */
fb8884f3 479static int lib_access_list_entry_create(struct nb_cb_create_args *args)
4470143b
RZ
480{
481 struct access_list *acl;
482 struct filter *f;
483
484 /* TODO: validate `filter_lookup_zebra` returns NULL. */
485
fb8884f3 486 if (args->event != NB_EV_APPLY)
4470143b
RZ
487 return NB_OK;
488
489 f = filter_new();
fb8884f3 490 f->seq = yang_dnode_get_uint32(args->dnode, "./sequence");
4470143b 491
fb8884f3 492 acl = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
493 f->acl = acl;
494 access_list_filter_add(acl, f);
fb8884f3 495 nb_running_set_entry(args->dnode, f);
4470143b
RZ
496
497 return NB_OK;
498}
499
fb8884f3 500static int lib_access_list_entry_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
501{
502 struct access_list *acl;
503 struct filter *f;
504
fb8884f3 505 if (args->event != NB_EV_APPLY)
4470143b
RZ
506 return NB_OK;
507
fb8884f3 508 f = nb_running_unset_entry(args->dnode);
4470143b
RZ
509 acl = f->acl;
510 access_list_filter_delete(acl, f);
511
512 return NB_OK;
513}
514
515/*
516 * XPath: /frr-filter:lib/access-list/entry/action
517 */
fb8884f3 518static int lib_access_list_entry_action_modify(struct nb_cb_modify_args *args)
4470143b 519{
fb8884f3 520 return lib_access_list_legacy_entry_action_modify(args);
4470143b
RZ
521}
522
523/*
524 * XPath: /frr-filter:lib/access-list/entry/ipv4-prefix
525 */
526static int
fb8884f3 527lib_access_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
4470143b
RZ
528{
529 struct filter_zebra *fz;
530 struct filter *f;
531
fb8884f3 532 if (args->event != NB_EV_APPLY)
4470143b
RZ
533 return NB_OK;
534
fb8884f3 535 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b 536 fz = &f->u.zfilter;
fb8884f3 537 yang_dnode_get_prefix(&fz->prefix, args->dnode, NULL);
4470143b
RZ
538
539 return NB_OK;
540}
541
542static int
fb8884f3 543lib_access_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
544{
545 struct filter_zebra *fz;
546 struct filter *f;
547
fb8884f3 548 if (args->event != NB_EV_APPLY)
4470143b
RZ
549 return NB_OK;
550
fb8884f3 551 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
552 fz = &f->u.zfilter;
553 memset(&fz->prefix, 0, sizeof(fz->prefix));
554
555 return NB_OK;
556}
557
558/*
559 * XPath: /frr-filter:lib/access-list/entry/ipv4-exact-match
560 */
561static int
fb8884f3 562lib_access_list_entry_ipv4_exact_match_modify(struct nb_cb_modify_args *args)
4470143b
RZ
563{
564 struct filter_zebra *fz;
565 struct filter *f;
566
fb8884f3 567 if (args->event != NB_EV_APPLY)
4470143b
RZ
568 return NB_OK;
569
fb8884f3 570 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b 571 fz = &f->u.zfilter;
fb8884f3 572 fz->exact = yang_dnode_get_bool(args->dnode, NULL);
4470143b
RZ
573
574 return NB_OK;
575}
576
577static int
fb8884f3 578lib_access_list_entry_ipv4_exact_match_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
579{
580 struct filter_zebra *fz;
581 struct filter *f;
582
fb8884f3 583 if (args->event != NB_EV_APPLY)
4470143b
RZ
584 return NB_OK;
585
fb8884f3 586 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
587 fz = &f->u.zfilter;
588 fz->exact = 0;
589
590 return NB_OK;
591}
592
593/*
594 * XPath: /frr-filter:lib/access-list/entry/ipv6-prefix
595 */
596static int
fb8884f3 597lib_access_list_entry_ipv6_prefix_modify(struct nb_cb_modify_args *args)
4470143b 598{
fb8884f3 599 return lib_access_list_entry_ipv4_prefix_modify(args);
4470143b
RZ
600}
601
602static int
fb8884f3 603lib_access_list_entry_ipv6_prefix_destroy(struct nb_cb_destroy_args *args)
4470143b 604{
fb8884f3 605 return lib_access_list_entry_ipv4_prefix_destroy(args);
4470143b
RZ
606}
607
608/*
609 * XPath: /frr-filter:lib/access-list/entry/ipv6-exact-match
610 */
611static int
fb8884f3 612lib_access_list_entry_ipv6_exact_match_modify(struct nb_cb_modify_args *args)
4470143b 613{
fb8884f3 614 return lib_access_list_entry_ipv4_exact_match_modify(args);
4470143b
RZ
615}
616
617static int
fb8884f3 618lib_access_list_entry_ipv6_exact_match_destroy(struct nb_cb_destroy_args *args)
4470143b 619{
fb8884f3 620 return lib_access_list_entry_ipv4_exact_match_destroy(args);
4470143b
RZ
621}
622
623/*
624 * XPath: /frr-filter:lib/access-list/entry/mac
625 */
fb8884f3 626static int lib_access_list_entry_mac_modify(struct nb_cb_modify_args *args)
4470143b 627{
fb8884f3 628 return lib_access_list_entry_ipv4_prefix_modify(args);
4470143b
RZ
629}
630
fb8884f3 631static int lib_access_list_entry_mac_destroy(struct nb_cb_destroy_args *args)
4470143b 632{
fb8884f3 633 return lib_access_list_entry_ipv4_prefix_destroy(args);
4470143b
RZ
634}
635
636/*
637 * XPath: /frr-filter:lib/access-list/entry/any
638 */
fb8884f3 639static int lib_access_list_entry_any_create(struct nb_cb_create_args *args)
4470143b
RZ
640{
641 struct filter_zebra *fz;
642 struct filter *f;
643 int type;
644
fb8884f3 645 if (args->event != NB_EV_APPLY)
4470143b
RZ
646 return NB_OK;
647
fb8884f3 648 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
649 fz = &f->u.zfilter;
650 memset(&fz->prefix, 0, sizeof(fz->prefix));
651
fb8884f3 652 type = yang_dnode_get_enum(args->dnode, "../../type");
4470143b
RZ
653 switch (type) {
654 case 0: /* ipv4 */
655 fz->prefix.family = AF_INET;
656 break;
657 case 1: /* ipv6 */
658 fz->prefix.family = AF_INET6;
659 break;
660 case 2: /* mac */
661 fz->prefix.family = AF_ETHERNET;
662 break;
663 }
664
665 return NB_OK;
666}
667
fb8884f3 668static int lib_access_list_entry_any_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
669{
670 struct filter_zebra *fz;
671 struct filter *f;
672
fb8884f3 673 if (args->event != NB_EV_APPLY)
4470143b
RZ
674 return NB_OK;
675
fb8884f3 676 f = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
677 fz = &f->u.zfilter;
678 fz->prefix.family = 0;
679
680 return NB_OK;
681}
682
683/*
684 * XPath: /frr-filter:lib/prefix-list
685 */
fb8884f3 686static int lib_prefix_list_create(struct nb_cb_create_args *args)
4470143b
RZ
687{
688 struct prefix_list *pl;
689 const char *name;
690 int type;
691
692 /* TODO: validate prefix_entry_dup_check() passes. */
693
fb8884f3 694 if (args->event != NB_EV_APPLY)
4470143b
RZ
695 return NB_OK;
696
fb8884f3
RZ
697 type = yang_dnode_get_enum(args->dnode, "./type");
698 name = yang_dnode_get_string(args->dnode, "./name");
4470143b
RZ
699 switch (type) {
700 case 0: /* ipv4 */
701 pl = prefix_list_get(AFI_IP, 0, name);
702 break;
703 case 1: /* ipv6 */
704 pl = prefix_list_get(AFI_IP6, 0, name);
705 break;
706 }
707
fb8884f3 708 nb_running_set_entry(args->dnode, pl);
4470143b
RZ
709
710 return NB_OK;
711}
712
fb8884f3 713static int lib_prefix_list_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
714{
715 struct prefix_list *pl;
716
fb8884f3 717 if (args->event != NB_EV_APPLY)
4470143b
RZ
718 return NB_OK;
719
fb8884f3 720 pl = nb_running_unset_entry(args->dnode);
4470143b
RZ
721 prefix_list_delete(pl);
722
723 return NB_OK;
724}
725
726/*
727 * XPath: /frr-filter:lib/prefix-list/description
728 */
fb8884f3 729static int lib_prefix_list_description_modify(struct nb_cb_modify_args *args)
4470143b
RZ
730{
731 struct prefix_list *pl;
732 const char *remark;
733
fb8884f3 734 if (args->event != NB_EV_APPLY)
4470143b
RZ
735 return NB_OK;
736
fb8884f3 737 pl = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
738 if (pl->desc)
739 XFREE(MTYPE_TMP, pl->desc);
740
fb8884f3 741 remark = yang_dnode_get_string(args->dnode, NULL);
4470143b
RZ
742 pl->desc = XSTRDUP(MTYPE_TMP, remark);
743
744 return NB_OK;
745}
746
fb8884f3 747static int lib_prefix_list_description_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
748{
749 struct prefix_list *pl;
750
fb8884f3 751 if (args->event != NB_EV_APPLY)
4470143b
RZ
752 return NB_OK;
753
fb8884f3 754 pl = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
755 if (pl->desc)
756 XFREE(MTYPE_TMP, pl->desc);
757
758 pl->desc = NULL;
759
760 return NB_OK;
761}
762
763/*
764 * XPath: /frr-filter:lib/prefix-list/entry
765 */
fb8884f3 766static int lib_prefix_list_entry_create(struct nb_cb_create_args *args)
4470143b
RZ
767{
768 struct prefix_list_entry *ple;
769 struct prefix_list *pl;
770 struct prefix p;
771
fb8884f3 772 if (args->event != NB_EV_APPLY)
4470143b
RZ
773 return NB_OK;
774
775 memset(&p, 0, sizeof(p));
776
fb8884f3 777 pl = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
778 ple = prefix_list_entry_new();
779 ple->pl = pl;
780 ple->any = 1;
fb8884f3 781 ple->seq = yang_dnode_get_int64(args->dnode, "./sequence");
4470143b
RZ
782
783 return NB_OK;
784}
785
fb8884f3 786static int lib_prefix_list_entry_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
787{
788 struct prefix_list_entry *ple;
789
fb8884f3 790 if (args->event != NB_EV_APPLY)
4470143b
RZ
791 return NB_OK;
792
fb8884f3 793 ple = nb_running_unset_entry(args->dnode);
4470143b
RZ
794 prefix_list_entry_delete(ple->pl, ple, 1);
795
796 return NB_OK;
797}
798
799/*
800 * XPath: /frr-filter:lib/prefix-list/entry/action
801 */
fb8884f3 802static int lib_prefix_list_entry_action_modify(struct nb_cb_modify_args *args)
4470143b
RZ
803{
804 struct prefix_list_entry *ple;
805 const char *action_str;
806
fb8884f3 807 if (args->event != NB_EV_APPLY)
4470143b
RZ
808 return NB_OK;
809
fb8884f3
RZ
810 ple = nb_running_get_entry(args->dnode, NULL, true);
811 action_str = yang_dnode_get_string(args->dnode, "./action");
4470143b
RZ
812 if (strcmp(action_str, "permit") == 0)
813 ple->type = PREFIX_PERMIT;
814 else
815 ple->type = PREFIX_DENY;
816
817 return NB_OK;
818}
819
820/*
821 * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix
822 */
823static int
fb8884f3 824lib_prefix_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
4470143b
RZ
825{
826 struct prefix_list_entry *ple;
827
fb8884f3 828 if (args->event != NB_EV_APPLY)
4470143b
RZ
829 return NB_OK;
830
fb8884f3
RZ
831 ple = nb_running_get_entry(args->dnode, NULL, true);
832 yang_dnode_get_prefix(&ple->prefix, args->dnode, NULL);
4470143b
RZ
833
834 return NB_OK;
835}
836
837static int
fb8884f3 838lib_prefix_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
839{
840 struct prefix_list_entry *ple;
841
fb8884f3 842 if (args->event != NB_EV_APPLY)
4470143b
RZ
843 return NB_OK;
844
fb8884f3 845 ple = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
846 memset(&ple->prefix, 0, sizeof(ple->prefix));
847 ple->any = 1;
848
849 return NB_OK;
850}
851
852/*
853 * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix-length-greater-or-equal
854 */
855static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
fb8884f3 856 struct nb_cb_modify_args *args)
4470143b
RZ
857{
858 struct prefix_list_entry *ple;
859
fb8884f3 860 if (args->event != NB_EV_APPLY)
4470143b
RZ
861 return NB_OK;
862
fb8884f3
RZ
863 ple = nb_running_get_entry(args->dnode, NULL, true);
864 ple->ge = yang_dnode_get_uint8(args->dnode, NULL);
4470143b
RZ
865
866 return NB_OK;
867}
868
869static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
fb8884f3 870 struct nb_cb_destroy_args *args)
4470143b
RZ
871{
872 struct prefix_list_entry *ple;
873
fb8884f3 874 if (args->event != NB_EV_APPLY)
4470143b
RZ
875 return NB_OK;
876
fb8884f3 877 ple = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
878 ple->ge = 0;
879
880 return NB_OK;
881}
882
883/*
884 * XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix-length-lesser-or-equal
885 */
886static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify(
fb8884f3 887 struct nb_cb_modify_args *args)
4470143b
RZ
888{
889 struct prefix_list_entry *ple;
890
fb8884f3 891 if (args->event != NB_EV_APPLY)
4470143b
RZ
892 return NB_OK;
893
fb8884f3
RZ
894 ple = nb_running_get_entry(args->dnode, NULL, true);
895 ple->le = yang_dnode_get_uint8(args->dnode, NULL);
4470143b
RZ
896
897 return NB_OK;
898}
899
900static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
fb8884f3 901 struct nb_cb_destroy_args *args)
4470143b
RZ
902{
903 struct prefix_list_entry *ple;
904
fb8884f3 905 if (args->event != NB_EV_APPLY)
4470143b
RZ
906 return NB_OK;
907
fb8884f3 908 ple = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
909 ple->le = 0;
910
911 return NB_OK;
912}
913
914/*
915 * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix
916 */
917static int
fb8884f3 918lib_prefix_list_entry_ipv6_prefix_modify(struct nb_cb_modify_args *args)
4470143b 919{
fb8884f3 920 return lib_prefix_list_entry_ipv4_prefix_modify(args);
4470143b
RZ
921}
922
923static int
fb8884f3 924lib_prefix_list_entry_ipv6_prefix_destroy(struct nb_cb_destroy_args *args)
4470143b 925{
fb8884f3 926 return lib_prefix_list_entry_ipv4_prefix_destroy(args);
4470143b
RZ
927}
928
929/*
930 * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-greater-or-equal
931 */
932static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_modify(
fb8884f3 933 struct nb_cb_modify_args *args)
4470143b
RZ
934{
935 return lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
fb8884f3 936 args);
4470143b
RZ
937}
938
939static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_destroy(
fb8884f3 940 struct nb_cb_destroy_args *args)
4470143b
RZ
941{
942 return lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
fb8884f3 943 args);
4470143b
RZ
944}
945
946/*
947 * XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-lesser-or-equal
948 */
949static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_modify(
fb8884f3 950 struct nb_cb_modify_args *args)
4470143b
RZ
951{
952 return lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify(
fb8884f3 953 args);
4470143b
RZ
954}
955
956static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_destroy(
fb8884f3 957 struct nb_cb_destroy_args *args)
4470143b
RZ
958{
959 return lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
fb8884f3 960 args);
4470143b
RZ
961}
962
963/*
964 * XPath: /frr-filter:lib/prefix-list/entry/any
965 */
fb8884f3 966static int lib_prefix_list_entry_any_create(struct nb_cb_create_args *args)
4470143b
RZ
967{
968 struct prefix_list_entry *ple;
969
fb8884f3 970 if (args->event != NB_EV_APPLY)
4470143b
RZ
971 return NB_OK;
972
fb8884f3 973 ple = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
974 memset(&ple->prefix, 0, sizeof(ple->prefix));
975 ple->any = 1;
976
977 return NB_OK;
978}
979
fb8884f3 980static int lib_prefix_list_entry_any_destroy(struct nb_cb_destroy_args *args)
4470143b
RZ
981{
982 struct prefix_list_entry *ple;
983
fb8884f3 984 if (args->event != NB_EV_APPLY)
4470143b
RZ
985 return NB_OK;
986
fb8884f3 987 ple = nb_running_get_entry(args->dnode, NULL, true);
4470143b
RZ
988 memset(&ple->prefix, 0, sizeof(ple->prefix));
989 ple->any = 1;
990
991 return NB_OK;
992}
993
994/* clang-format off */
995const struct frr_yang_module_info frr_filter_info = {
996 .name = "frr-filter",
997 .nodes = {
998 {
999 .xpath = "/frr-filter:lib/access-list-legacy",
1000 .cbs = {
1001 .create = lib_access_list_legacy_create,
1002 .destroy = lib_access_list_legacy_destroy,
1003 }
1004 },
1005 {
1006 .xpath = "/frr-filter:lib/access-list-legacy/remark",
1007 .cbs = {
1008 .modify = lib_access_list_legacy_remark_modify,
1009 .destroy = lib_access_list_legacy_remark_destroy,
1010 }
1011 },
1012 {
1013 .xpath = "/frr-filter:lib/access-list-legacy/entry",
1014 .cbs = {
1015 .create = lib_access_list_legacy_entry_create,
1016 .destroy = lib_access_list_legacy_entry_destroy,
1017 }
1018 },
1019 {
1020 .xpath = "/frr-filter:lib/access-list-legacy/entry/action",
1021 .cbs = {
1022 .modify = lib_access_list_legacy_entry_action_modify,
1023 }
1024 },
1025 {
1026 .xpath = "/frr-filter:lib/access-list-legacy/entry/host",
1027 .cbs = {
1028 .modify = lib_access_list_legacy_entry_host_modify,
1029 .destroy = lib_access_list_legacy_entry_host_destroy,
1030 }
1031 },
1032 {
1033 .xpath = "/frr-filter:lib/access-list-legacy/entry/network",
1034 .cbs = {
1035 .modify = lib_access_list_legacy_entry_network_modify,
1036 .destroy = lib_access_list_legacy_entry_network_destroy,
1037 }
1038 },
1039 {
1040 .xpath = "/frr-filter:lib/access-list-legacy/entry/any",
1041 .cbs = {
1042 .create = lib_access_list_legacy_entry_any_create,
1043 .destroy = lib_access_list_legacy_entry_any_destroy,
1044 }
1045 },
1046 {
1047 .xpath = "/frr-filter:lib/access-list-legacy/entry/destination-host",
1048 .cbs = {
1049 .modify = lib_access_list_legacy_entry_destination_host_modify,
1050 .destroy = lib_access_list_legacy_entry_destination_host_destroy,
1051 }
1052 },
1053 {
1054 .xpath = "/frr-filter:lib/access-list-legacy/entry/destination-network",
1055 .cbs = {
1056 .modify = lib_access_list_legacy_entry_destination_network_modify,
1057 .destroy = lib_access_list_legacy_entry_destination_network_destroy,
1058 }
1059 },
1060 {
1061 .xpath = "/frr-filter:lib/access-list-legacy/entry/destination-any",
1062 .cbs = {
1063 .create = lib_access_list_legacy_entry_destination_any_create,
1064 .destroy = lib_access_list_legacy_entry_destination_any_destroy,
1065 }
1066 },
1067 {
1068 .xpath = "/frr-filter:lib/access-list",
1069 .cbs = {
1070 .create = lib_access_list_create,
1071 .destroy = lib_access_list_destroy,
1072 }
1073 },
1074 {
1075 .xpath = "/frr-filter:lib/access-list/remark",
1076 .cbs = {
1077 .modify = lib_access_list_remark_modify,
1078 .destroy = lib_access_list_remark_destroy,
1079 }
1080 },
1081 {
1082 .xpath = "/frr-filter:lib/access-list/entry",
1083 .cbs = {
1084 .create = lib_access_list_entry_create,
1085 .destroy = lib_access_list_entry_destroy,
1086 }
1087 },
1088 {
1089 .xpath = "/frr-filter:lib/access-list/entry/action",
1090 .cbs = {
1091 .modify = lib_access_list_entry_action_modify,
1092 }
1093 },
1094 {
1095 .xpath = "/frr-filter:lib/access-list/entry/ipv4-prefix",
1096 .cbs = {
1097 .modify = lib_access_list_entry_ipv4_prefix_modify,
1098 .destroy = lib_access_list_entry_ipv4_prefix_destroy,
1099 }
1100 },
1101 {
1102 .xpath = "/frr-filter:lib/access-list/entry/ipv4-exact-match",
1103 .cbs = {
1104 .modify = lib_access_list_entry_ipv4_exact_match_modify,
1105 .destroy = lib_access_list_entry_ipv4_exact_match_destroy,
1106 }
1107 },
1108 {
1109 .xpath = "/frr-filter:lib/access-list/entry/ipv6-prefix",
1110 .cbs = {
1111 .modify = lib_access_list_entry_ipv6_prefix_modify,
1112 .destroy = lib_access_list_entry_ipv6_prefix_destroy,
1113 }
1114 },
1115 {
1116 .xpath = "/frr-filter:lib/access-list/entry/ipv6-exact-match",
1117 .cbs = {
1118 .modify = lib_access_list_entry_ipv6_exact_match_modify,
1119 .destroy = lib_access_list_entry_ipv6_exact_match_destroy,
1120 }
1121 },
1122 {
1123 .xpath = "/frr-filter:lib/access-list/entry/mac",
1124 .cbs = {
1125 .modify = lib_access_list_entry_mac_modify,
1126 .destroy = lib_access_list_entry_mac_destroy,
1127 }
1128 },
1129 {
1130 .xpath = "/frr-filter:lib/access-list/entry/any",
1131 .cbs = {
1132 .create = lib_access_list_entry_any_create,
1133 .destroy = lib_access_list_entry_any_destroy,
1134 }
1135 },
1136 {
1137 .xpath = "/frr-filter:lib/prefix-list",
1138 .cbs = {
1139 .create = lib_prefix_list_create,
1140 .destroy = lib_prefix_list_destroy,
1141 }
1142 },
1143 {
1144 .xpath = "/frr-filter:lib/prefix-list/description",
1145 .cbs = {
1146 .modify = lib_prefix_list_description_modify,
1147 .destroy = lib_prefix_list_description_destroy,
1148 }
1149 },
1150 {
1151 .xpath = "/frr-filter:lib/prefix-list/entry",
1152 .cbs = {
1153 .create = lib_prefix_list_entry_create,
1154 .destroy = lib_prefix_list_entry_destroy,
1155 }
1156 },
1157 {
1158 .xpath = "/frr-filter:lib/prefix-list/entry/action",
1159 .cbs = {
1160 .modify = lib_prefix_list_entry_action_modify,
1161 }
1162 },
1163 {
1164 .xpath = "/frr-filter:lib/prefix-list/entry/ipv4-prefix",
1165 .cbs = {
1166 .modify = lib_prefix_list_entry_ipv4_prefix_modify,
1167 .destroy = lib_prefix_list_entry_ipv4_prefix_destroy,
1168 }
1169 },
1170 {
1171 .xpath = "/frr-filter:lib/prefix-list/entry/ipv4-prefix-length-greater-or-equal",
1172 .cbs = {
1173 .modify = lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify,
1174 .destroy = lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy,
1175 }
1176 },
1177 {
1178 .xpath = "/frr-filter:lib/prefix-list/entry/ipv4-prefix-length-lesser-or-equal",
1179 .cbs = {
1180 .modify = lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify,
1181 .destroy = lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy,
1182 }
1183 },
1184 {
1185 .xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix",
1186 .cbs = {
1187 .modify = lib_prefix_list_entry_ipv6_prefix_modify,
1188 .destroy = lib_prefix_list_entry_ipv6_prefix_destroy,
1189 }
1190 },
1191 {
1192 .xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix-length-greater-or-equal",
1193 .cbs = {
1194 .modify = lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_modify,
1195 .destroy = lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_destroy,
1196 }
1197 },
1198 {
1199 .xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix-length-lesser-or-equal",
1200 .cbs = {
1201 .modify = lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_modify,
1202 .destroy = lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_destroy,
1203 }
1204 },
1205 {
1206 .xpath = "/frr-filter:lib/prefix-list/entry/any",
1207 .cbs = {
1208 .create = lib_prefix_list_entry_any_create,
1209 .destroy = lib_prefix_list_entry_any_destroy,
1210 }
1211 },
1212 {
1213 .xpath = NULL,
1214 },
1215 }
1216};