diff options
| author | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2020-10-02 12:47:23 -0300 |
|---|---|---|
| committer | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2020-10-04 07:05:17 -0300 |
| commit | b1993be6870bfbca56092f7d85195a6f06d8828b (patch) | |
| tree | 5acfbbab81682f178b15dd2de4905efe102e7b11 /lib/filter_nb.c | |
| parent | 4c213457dde3a3d0b3b39f700da7645f425cd373 (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.c | 74 |
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, } }, { |
