2019-11-08 18:48:50 +01:00
|
|
|
/*
|
|
|
|
* FRR filter northbound implementation.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2019 Network Device Education Foundation, Inc. ("NetDEF")
|
|
|
|
* Rafael Zalamena
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
|
|
* 02110-1301 USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "zebra.h"
|
|
|
|
|
|
|
|
#include "lib/northbound.h"
|
|
|
|
#include "lib/prefix.h"
|
|
|
|
|
|
|
|
#include "lib/filter.h"
|
|
|
|
#include "lib/plist.h"
|
|
|
|
#include "lib/plist_int.h"
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
/* Helper function. */
|
|
|
|
static in_addr_t
|
|
|
|
ipv4_network_addr(in_addr_t hostaddr, int masklen)
|
|
|
|
{
|
|
|
|
struct in_addr mask;
|
|
|
|
|
|
|
|
masklen2ip(masklen, &mask);
|
|
|
|
return hostaddr & mask.s_addr;
|
|
|
|
}
|
|
|
|
|
2019-11-08 18:48:50 +01:00
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_legacy_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_list *acl;
|
|
|
|
const char *acl_name;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
acl_name = yang_dnode_get_string(args->dnode, "./number");
|
2019-11-08 18:48:50 +01:00
|
|
|
acl = access_list_get(AFI_IP, acl_name);
|
2020-04-29 20:33:46 +02:00
|
|
|
nb_running_set_entry(args->dnode, acl);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_legacy_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_master *am;
|
|
|
|
struct access_list *acl;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
acl = nb_running_unset_entry(args->dnode);
|
2019-11-08 18:48:50 +01:00
|
|
|
am = acl->master;
|
|
|
|
if (am->delete_hook)
|
|
|
|
am->delete_hook(acl);
|
|
|
|
|
|
|
|
access_list_delete(acl);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/remark
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_legacy_remark_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_list *acl;
|
|
|
|
const char *remark;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
acl = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
if (acl->remark)
|
|
|
|
XFREE(MTYPE_TMP, acl->remark);
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
remark = yang_dnode_get_string(args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
acl->remark = XSTRDUP(MTYPE_TMP, remark);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int
|
|
|
|
lib_access_list_legacy_remark_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_list *acl;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
acl = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
if (acl->remark)
|
|
|
|
XFREE(MTYPE_TMP, acl->remark);
|
|
|
|
|
|
|
|
acl->remark = NULL;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_legacy_entry_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct access_list *acl;
|
|
|
|
struct filter *f;
|
|
|
|
uint32_t aclno;
|
|
|
|
|
|
|
|
/* TODO: validate `filter_lookup_cisco` returns NULL. */
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
aclno = yang_dnode_get_uint16(args->dnode, "../number");
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
f = filter_new();
|
|
|
|
f->cisco = 1;
|
2020-04-29 20:33:46 +02:00
|
|
|
f->seq = yang_dnode_get_uint32(args->dnode, "./sequence");
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
if ((aclno >= 1 && aclno <= 99) || (aclno >= 1300 && aclno <= 1999))
|
|
|
|
fc->extended = 0;
|
|
|
|
else
|
|
|
|
fc->extended = 1;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
acl = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
f->acl = acl;
|
|
|
|
access_list_filter_add(acl, f);
|
2020-04-29 20:33:46 +02:00
|
|
|
nb_running_set_entry(args->dnode, f);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_legacy_entry_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_list *acl;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_unset_entry(args->dnode);
|
2019-11-08 18:48:50 +01:00
|
|
|
acl = f->acl;
|
|
|
|
access_list_filter_delete(acl, f);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry/action
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_legacy_entry_action_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
const char *filter_type;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
|
|
|
filter_type = yang_dnode_get_string(args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
if (strcmp(filter_type, "permit") == 0)
|
|
|
|
f->type = FILTER_PERMIT;
|
|
|
|
else
|
|
|
|
f->type = FILTER_DENY;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry/host
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_legacy_entry_host_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
2020-04-29 20:33:46 +02:00
|
|
|
yang_dnode_get_ipv4(&fc->addr, args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc->addr_mask.s_addr = INADDR_ANY;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_legacy_entry_host_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->addr.s_addr = INADDR_ANY;
|
|
|
|
fc->addr_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry/network
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_legacy_entry_network_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
struct prefix p;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
2020-04-29 20:33:46 +02:00
|
|
|
yang_dnode_get_prefix(&p, args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
|
|
|
|
masklen2ip(p.prefixlen, &fc->addr_mask);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_legacy_entry_network_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->addr.s_addr = INADDR_ANY;
|
|
|
|
fc->addr_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry/any
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int
|
|
|
|
lib_access_list_legacy_entry_any_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->addr.s_addr = INADDR_ANY;
|
|
|
|
fc->addr_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_legacy_entry_any_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->addr.s_addr = INADDR_ANY;
|
|
|
|
fc->addr_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry/destination-host
|
|
|
|
*/
|
|
|
|
static int lib_access_list_legacy_entry_destination_host_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
2020-04-29 20:33:46 +02:00
|
|
|
yang_dnode_get_ipv4(&fc->mask, args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc->mask_mask.s_addr = INADDR_ANY;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int lib_access_list_legacy_entry_destination_host_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->mask.s_addr = INADDR_ANY;
|
|
|
|
fc->mask_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry/destination-network
|
|
|
|
*/
|
|
|
|
static int lib_access_list_legacy_entry_destination_network_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
struct prefix p;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
2020-04-29 20:33:46 +02:00
|
|
|
yang_dnode_get_prefix(&p, args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
|
|
|
|
masklen2ip(p.prefixlen, &fc->addr_mask);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int lib_access_list_legacy_entry_destination_network_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->mask.s_addr = INADDR_ANY;
|
|
|
|
fc->mask_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list-legacy/entry/destination-any
|
|
|
|
*/
|
|
|
|
static int lib_access_list_legacy_entry_destination_any_create(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->mask.s_addr = INADDR_ANY;
|
|
|
|
fc->mask_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int lib_access_list_legacy_entry_destination_any_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_cisco *fc;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fc = &f->u.cfilter;
|
|
|
|
fc->mask.s_addr = INADDR_ANY;
|
|
|
|
fc->mask_mask.s_addr = INADDR_NONE;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:28:38 +02:00
|
|
|
struct access_list *acl = NULL;
|
2019-11-08 18:48:50 +01:00
|
|
|
const char *acl_name;
|
|
|
|
int type;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
type = yang_dnode_get_enum(args->dnode, "./type");
|
|
|
|
acl_name = yang_dnode_get_string(args->dnode, "./name");
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case 0: /* ipv4 */
|
|
|
|
acl = access_list_get(AFI_IP, acl_name);
|
|
|
|
break;
|
|
|
|
case 1: /* ipv6 */
|
|
|
|
acl = access_list_get(AFI_IP6, acl_name);
|
|
|
|
break;
|
|
|
|
case 2: /* mac */
|
|
|
|
acl = access_list_get(AFI_L2VPN, acl_name);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
nb_running_set_entry(args->dnode, acl);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_master *am;
|
|
|
|
struct access_list *acl;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
acl = nb_running_unset_entry(args->dnode);
|
2019-11-08 18:48:50 +01:00
|
|
|
am = acl->master;
|
|
|
|
if (am->delete_hook)
|
|
|
|
am->delete_hook(acl);
|
|
|
|
|
|
|
|
access_list_delete(acl);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/remark
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_remark_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_legacy_remark_modify(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_remark_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_legacy_remark_destroy(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_entry_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_list *acl;
|
|
|
|
struct filter *f;
|
|
|
|
|
|
|
|
/* TODO: validate `filter_lookup_zebra` returns NULL. */
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
|
|
|
f = filter_new();
|
2020-04-29 20:33:46 +02:00
|
|
|
f->seq = yang_dnode_get_uint32(args->dnode, "./sequence");
|
2019-11-08 18:48:50 +01:00
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
acl = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
f->acl = acl;
|
|
|
|
access_list_filter_add(acl, f);
|
2020-04-29 20:33:46 +02:00
|
|
|
nb_running_set_entry(args->dnode, f);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_entry_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct access_list *acl;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_unset_entry(args->dnode);
|
2019-11-08 18:48:50 +01:00
|
|
|
acl = f->acl;
|
|
|
|
access_list_filter_delete(acl, f);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry/action
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_entry_action_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_legacy_entry_action_modify(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry/ipv4-prefix
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_zebra *fz;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fz = &f->u.zfilter;
|
2020-04-29 20:33:46 +02:00
|
|
|
yang_dnode_get_prefix(&fz->prefix, args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_zebra *fz;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fz = &f->u.zfilter;
|
|
|
|
memset(&fz->prefix, 0, sizeof(fz->prefix));
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry/ipv4-exact-match
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv4_exact_match_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_zebra *fz;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fz = &f->u.zfilter;
|
2020-04-29 20:33:46 +02:00
|
|
|
fz->exact = yang_dnode_get_bool(args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv4_exact_match_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_zebra *fz;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fz = &f->u.zfilter;
|
|
|
|
fz->exact = 0;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry/ipv6-prefix
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv6_prefix_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_entry_ipv4_prefix_modify(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv6_prefix_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_entry_ipv4_prefix_destroy(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry/ipv6-exact-match
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv6_exact_match_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_entry_ipv4_exact_match_modify(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_access_list_entry_ipv6_exact_match_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_entry_ipv4_exact_match_destroy(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry/mac
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_entry_mac_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_entry_ipv4_prefix_modify(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_entry_mac_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_access_list_entry_ipv4_prefix_destroy(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/access-list/entry/any
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_entry_any_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_zebra *fz;
|
|
|
|
struct filter *f;
|
|
|
|
int type;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fz = &f->u.zfilter;
|
|
|
|
memset(&fz->prefix, 0, sizeof(fz->prefix));
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
type = yang_dnode_get_enum(args->dnode, "../../type");
|
2019-11-08 18:48:50 +01:00
|
|
|
switch (type) {
|
|
|
|
case 0: /* ipv4 */
|
|
|
|
fz->prefix.family = AF_INET;
|
|
|
|
break;
|
|
|
|
case 1: /* ipv6 */
|
|
|
|
fz->prefix.family = AF_INET6;
|
|
|
|
break;
|
|
|
|
case 2: /* mac */
|
|
|
|
fz->prefix.family = AF_ETHERNET;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_access_list_entry_any_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct filter_zebra *fz;
|
|
|
|
struct filter *f;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
f = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
fz = &f->u.zfilter;
|
|
|
|
fz->prefix.family = 0;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:28:38 +02:00
|
|
|
struct prefix_list *pl = NULL;
|
2019-11-08 18:48:50 +01:00
|
|
|
const char *name;
|
|
|
|
int type;
|
|
|
|
|
|
|
|
/* TODO: validate prefix_entry_dup_check() passes. */
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
type = yang_dnode_get_enum(args->dnode, "./type");
|
|
|
|
name = yang_dnode_get_string(args->dnode, "./name");
|
2019-11-08 18:48:50 +01:00
|
|
|
switch (type) {
|
|
|
|
case 0: /* ipv4 */
|
|
|
|
pl = prefix_list_get(AFI_IP, 0, name);
|
|
|
|
break;
|
|
|
|
case 1: /* ipv6 */
|
|
|
|
pl = prefix_list_get(AFI_IP6, 0, name);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
nb_running_set_entry(args->dnode, pl);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list *pl;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
pl = nb_running_unset_entry(args->dnode);
|
2019-11-08 18:48:50 +01:00
|
|
|
prefix_list_delete(pl);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/description
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_description_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list *pl;
|
|
|
|
const char *remark;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
pl = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
if (pl->desc)
|
|
|
|
XFREE(MTYPE_TMP, pl->desc);
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
remark = yang_dnode_get_string(args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
pl->desc = XSTRDUP(MTYPE_TMP, remark);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_description_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list *pl;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
pl = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
if (pl->desc)
|
|
|
|
XFREE(MTYPE_TMP, pl->desc);
|
|
|
|
|
|
|
|
pl->desc = NULL;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_entry_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
struct prefix_list *pl;
|
|
|
|
struct prefix p;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
|
|
|
memset(&p, 0, sizeof(p));
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
pl = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
ple = prefix_list_entry_new();
|
|
|
|
ple->pl = pl;
|
|
|
|
ple->any = 1;
|
2020-04-29 20:33:46 +02:00
|
|
|
ple->seq = yang_dnode_get_int64(args->dnode, "./sequence");
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_entry_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_unset_entry(args->dnode);
|
2019-11-08 18:48:50 +01:00
|
|
|
prefix_list_entry_delete(ple->pl, ple, 1);
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/action
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_entry_action_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
const char *action_str;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
|
|
|
action_str = yang_dnode_get_string(args->dnode, "./action");
|
2019-11-08 18:48:50 +01:00
|
|
|
if (strcmp(action_str, "permit") == 0)
|
|
|
|
ple->type = PREFIX_PERMIT;
|
|
|
|
else
|
|
|
|
ple->type = PREFIX_DENY;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_prefix_list_entry_ipv4_prefix_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
|
|
|
yang_dnode_get_prefix(&ple->prefix, args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_prefix_list_entry_ipv4_prefix_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
memset(&ple->prefix, 0, sizeof(ple->prefix));
|
|
|
|
ple->any = 1;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix-length-greater-or-equal
|
|
|
|
*/
|
|
|
|
static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
|
|
|
ple->ge = yang_dnode_get_uint8(args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
ple->ge = 0;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/ipv4-prefix-length-lesser-or-equal
|
|
|
|
*/
|
|
|
|
static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
|
|
|
ple->le = yang_dnode_get_uint8(args->dnode, NULL);
|
2019-11-08 18:48:50 +01:00
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
ple->le = 0;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix
|
|
|
|
*/
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_prefix_list_entry_ipv6_prefix_modify(struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_prefix_list_entry_ipv4_prefix_modify(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2020-04-29 20:33:46 +02:00
|
|
|
lib_prefix_list_entry_ipv6_prefix_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
2020-04-29 20:33:46 +02:00
|
|
|
return lib_prefix_list_entry_ipv4_prefix_destroy(args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-greater-or-equal
|
|
|
|
*/
|
|
|
|
static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
return lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static int lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
return lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/ipv6-prefix-length-lesser-or-equal
|
|
|
|
*/
|
|
|
|
static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_modify_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
return lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify(
|
2020-04-29 20:33:46 +02:00
|
|
|
args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static int lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
return lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy(
|
2020-04-29 20:33:46 +02:00
|
|
|
args);
|
2019-11-08 18:48:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* XPath: /frr-filter:lib/prefix-list/entry/any
|
|
|
|
*/
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_entry_any_create(struct nb_cb_create_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
memset(&ple->prefix, 0, sizeof(ple->prefix));
|
|
|
|
ple->any = 1;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
static int lib_prefix_list_entry_any_destroy(struct nb_cb_destroy_args *args)
|
2019-11-08 18:48:50 +01:00
|
|
|
{
|
|
|
|
struct prefix_list_entry *ple;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
if (args->event != NB_EV_APPLY)
|
2019-11-08 18:48:50 +01:00
|
|
|
return NB_OK;
|
|
|
|
|
2020-04-29 20:33:46 +02:00
|
|
|
ple = nb_running_get_entry(args->dnode, NULL, true);
|
2019-11-08 18:48:50 +01:00
|
|
|
memset(&ple->prefix, 0, sizeof(ple->prefix));
|
|
|
|
ple->any = 1;
|
|
|
|
|
|
|
|
return NB_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* clang-format off */
|
|
|
|
const struct frr_yang_module_info frr_filter_info = {
|
|
|
|
.name = "frr-filter",
|
|
|
|
.nodes = {
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_access_list_legacy_create,
|
|
|
|
.destroy = lib_access_list_legacy_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/remark",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_legacy_remark_modify,
|
|
|
|
.destroy = lib_access_list_legacy_remark_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_access_list_legacy_entry_create,
|
|
|
|
.destroy = lib_access_list_legacy_entry_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry/action",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_legacy_entry_action_modify,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry/host",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_legacy_entry_host_modify,
|
|
|
|
.destroy = lib_access_list_legacy_entry_host_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry/network",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_legacy_entry_network_modify,
|
|
|
|
.destroy = lib_access_list_legacy_entry_network_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry/any",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_access_list_legacy_entry_any_create,
|
|
|
|
.destroy = lib_access_list_legacy_entry_any_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry/destination-host",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_legacy_entry_destination_host_modify,
|
|
|
|
.destroy = lib_access_list_legacy_entry_destination_host_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry/destination-network",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_legacy_entry_destination_network_modify,
|
|
|
|
.destroy = lib_access_list_legacy_entry_destination_network_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list-legacy/entry/destination-any",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_access_list_legacy_entry_destination_any_create,
|
|
|
|
.destroy = lib_access_list_legacy_entry_destination_any_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_access_list_create,
|
|
|
|
.destroy = lib_access_list_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/remark",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_remark_modify,
|
|
|
|
.destroy = lib_access_list_remark_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_access_list_entry_create,
|
|
|
|
.destroy = lib_access_list_entry_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry/action",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_entry_action_modify,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry/ipv4-prefix",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_entry_ipv4_prefix_modify,
|
|
|
|
.destroy = lib_access_list_entry_ipv4_prefix_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry/ipv4-exact-match",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_entry_ipv4_exact_match_modify,
|
|
|
|
.destroy = lib_access_list_entry_ipv4_exact_match_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry/ipv6-prefix",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_entry_ipv6_prefix_modify,
|
|
|
|
.destroy = lib_access_list_entry_ipv6_prefix_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry/ipv6-exact-match",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_entry_ipv6_exact_match_modify,
|
|
|
|
.destroy = lib_access_list_entry_ipv6_exact_match_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry/mac",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_access_list_entry_mac_modify,
|
|
|
|
.destroy = lib_access_list_entry_mac_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/access-list/entry/any",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_access_list_entry_any_create,
|
|
|
|
.destroy = lib_access_list_entry_any_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_prefix_list_create,
|
|
|
|
.destroy = lib_prefix_list_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/description",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_description_modify,
|
|
|
|
.destroy = lib_prefix_list_description_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_prefix_list_entry_create,
|
|
|
|
.destroy = lib_prefix_list_entry_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/action",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_entry_action_modify,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/ipv4-prefix",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_entry_ipv4_prefix_modify,
|
|
|
|
.destroy = lib_prefix_list_entry_ipv4_prefix_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/ipv4-prefix-length-greater-or-equal",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_modify,
|
|
|
|
.destroy = lib_prefix_list_entry_ipv4_prefix_length_greater_or_equal_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/ipv4-prefix-length-lesser-or-equal",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_modify,
|
|
|
|
.destroy = lib_prefix_list_entry_ipv4_prefix_length_lesser_or_equal_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_entry_ipv6_prefix_modify,
|
|
|
|
.destroy = lib_prefix_list_entry_ipv6_prefix_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix-length-greater-or-equal",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_modify,
|
|
|
|
.destroy = lib_prefix_list_entry_ipv6_prefix_length_greater_or_equal_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/ipv6-prefix-length-lesser-or-equal",
|
|
|
|
.cbs = {
|
|
|
|
.modify = lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_modify,
|
|
|
|
.destroy = lib_prefix_list_entry_ipv6_prefix_length_lesser_or_equal_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = "/frr-filter:lib/prefix-list/entry/any",
|
|
|
|
.cbs = {
|
|
|
|
.create = lib_prefix_list_entry_any_create,
|
|
|
|
.destroy = lib_prefix_list_entry_any_destroy,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.xpath = NULL,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
};
|