summaryrefslogtreecommitdiff
path: root/lib/filter_nb.c
diff options
context:
space:
mode:
authorRafael Zalamena <rzalamena@opensourcerouting.org>2020-10-02 12:47:23 -0300
committerRafael Zalamena <rzalamena@opensourcerouting.org>2020-10-04 07:05:17 -0300
commitb1993be6870bfbca56092f7d85195a6f06d8828b (patch)
tree5acfbbab81682f178b15dd2de4905efe102e7b11 /lib/filter_nb.c
parent4c213457dde3a3d0b3b39f700da7645f425cd373 (diff)
lib: fix cisco access list wildcard usage
Don't attempt to compress the wildcard information to fit a `/M`, but use its own full 4 byte field. Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
Diffstat (limited to 'lib/filter_nb.c')
-rw-r--r--lib/filter_nb.c74
1 files changed, 37 insertions, 37 deletions
diff --git a/lib/filter_nb.c b/lib/filter_nb.c
index 8838a48abd..b253743db8 100644
--- a/lib/filter_nb.c
+++ b/lib/filter_nb.c
@@ -32,15 +32,6 @@
#include "lib/routemap.h"
/* 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;
-}
-
static void acl_notify_route_map(struct access_list *acl, int route_map_event)
{
switch (route_map_event) {
@@ -411,14 +402,13 @@ lib_access_list_entry_host_destroy(struct nb_cb_destroy_args *args)
}
/*
- * XPath: /frr-filter:lib/access-list/entry/network
+ * XPath: /frr-filter:lib/access-list/entry/network/address
*/
static int
-lib_access_list_entry_network_modify(struct nb_cb_modify_args *args)
+lib_access_list_entry_network_address_modify(struct nb_cb_modify_args *args)
{
struct filter_cisco *fc;
struct filter *f;
- struct prefix p;
if (args->event != NB_EV_APPLY)
return NB_OK;
@@ -426,18 +416,18 @@ lib_access_list_entry_network_modify(struct nb_cb_modify_args *args)
f = nb_running_get_entry(args->dnode, NULL, true);
f->cisco = 1;
fc = &f->u.cfilter;
- yang_dnode_get_prefix(&p, args->dnode, NULL);
- fc->addr.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
- masklen2ip(p.prefixlen, &fc->addr_mask);
- fc->addr_mask.s_addr = ~fc->addr_mask.s_addr;
+ yang_dnode_get_ipv4(&fc->addr, args->dnode, NULL);
acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED);
return NB_OK;
}
+/*
+ * XPath: /frr-filter:lib/access-list/entry/network/mask
+ */
static int
-lib_access_list_entry_network_destroy(struct nb_cb_destroy_args *args)
+lib_access_list_entry_network_mask_modify(struct nb_cb_modify_args *args)
{
struct filter_cisco *fc;
struct filter *f;
@@ -446,10 +436,11 @@ lib_access_list_entry_network_destroy(struct nb_cb_destroy_args *args)
return NB_OK;
f = nb_running_get_entry(args->dnode, NULL, true);
+ f->cisco = 1;
fc = &f->u.cfilter;
- cisco_unset_addr_mask(&fc->addr, &fc->addr_mask);
+ yang_dnode_get_ipv4(&fc->addr_mask, args->dnode, NULL);
- acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED);
+ acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED);
return NB_OK;
}
@@ -538,14 +529,13 @@ static int lib_access_list_entry_destination_host_destroy(
}
/*
- * XPath: /frr-filter:lib/access-list/entry/destination-network
+ * XPath: /frr-filter:lib/access-list/entry/destination-network/address
*/
-static int lib_access_list_entry_destination_network_modify(
+static int lib_access_list_entry_destination_network_address_modify(
struct nb_cb_modify_args *args)
{
struct filter_cisco *fc;
struct filter *f;
- struct prefix p;
if (args->event != NB_EV_APPLY)
return NB_OK;
@@ -553,18 +543,18 @@ static int lib_access_list_entry_destination_network_modify(
f = nb_running_get_entry(args->dnode, NULL, true);
fc = &f->u.cfilter;
fc->extended = 1;
- yang_dnode_get_prefix(&p, args->dnode, NULL);
- fc->mask.s_addr = ipv4_network_addr(p.u.prefix4.s_addr, p.prefixlen);
- masklen2ip(p.prefixlen, &fc->mask_mask);
- fc->mask_mask.s_addr = ~fc->mask_mask.s_addr;
+ yang_dnode_get_ipv4(&fc->mask, args->dnode, NULL);
acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED);
return NB_OK;
}
-static int lib_access_list_entry_destination_network_destroy(
- struct nb_cb_destroy_args *args)
+/*
+ * XPath: /frr-filter:lib/access-list/entry/destination-network/mask
+ */
+static int lib_access_list_entry_destination_network_mask_modify(
+ struct nb_cb_modify_args *args)
{
struct filter_cisco *fc;
struct filter *f;
@@ -574,10 +564,10 @@ static int lib_access_list_entry_destination_network_destroy(
f = nb_running_get_entry(args->dnode, NULL, true);
fc = &f->u.cfilter;
- fc->extended = 0;
- cisco_unset_addr_mask(&fc->mask, &fc->mask_mask);
+ fc->extended = 1;
+ yang_dnode_get_ipv4(&fc->mask_mask, args->dnode, NULL);
- acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_DELETED);
+ acl_notify_route_map(f->acl, RMAP_EVENT_FILTER_ADDED);
return NB_OK;
}
@@ -1100,10 +1090,15 @@ const struct frr_yang_module_info frr_filter_info = {
}
},
{
- .xpath = "/frr-filter:lib/access-list/entry/network",
+ .xpath = "/frr-filter:lib/access-list/entry/network/address",
.cbs = {
- .modify = lib_access_list_entry_network_modify,
- .destroy = lib_access_list_entry_network_destroy,
+ .modify = lib_access_list_entry_network_address_modify,
+ }
+ },
+ {
+ .xpath = "/frr-filter:lib/access-list/entry/network/mask",
+ .cbs = {
+ .modify = lib_access_list_entry_network_mask_modify,
}
},
{
@@ -1121,10 +1116,15 @@ const struct frr_yang_module_info frr_filter_info = {
}
},
{
- .xpath = "/frr-filter:lib/access-list/entry/destination-network",
+ .xpath = "/frr-filter:lib/access-list/entry/destination-network/address",
+ .cbs = {
+ .modify = lib_access_list_entry_destination_network_address_modify,
+ }
+ },
+ {
+ .xpath = "/frr-filter:lib/access-list/entry/destination-network/mask",
.cbs = {
- .modify = lib_access_list_entry_destination_network_modify,
- .destroy = lib_access_list_entry_destination_network_destroy,
+ .modify = lib_access_list_entry_destination_network_mask_modify,
}
},
{