summaryrefslogtreecommitdiff
path: root/lib/filter_nb.c
diff options
context:
space:
mode:
authorRafael Zalamena <rzalamena@opensourcerouting.org>2020-08-26 12:50:07 -0300
committerRafael Zalamena <rzalamena@opensourcerouting.org>2020-08-26 12:50:07 -0300
commit0ed507dda081856952065b5d9cb5862742b017f3 (patch)
tree0be58d0f8eeda1a85d388de277398ba0ddbfe794 /lib/filter_nb.c
parent070783e69323b3c6401d9b6dff4ab8e74656d02d (diff)
lib: refactory cisco access list net wildcard
Wildcards bits have the opposite representation of a network mask, example: 192.168.0.0/24 has the following netmask 255.255.0.0 and the wildcard representation is 0.0.255.255. To avoid future confusion lets put those definitions into a macro so we know for sure which form to use. Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
Diffstat (limited to 'lib/filter_nb.c')
-rw-r--r--lib/filter_nb.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/lib/filter_nb.c b/lib/filter_nb.c
index 91691d2f1d..6eacc0f5c5 100644
--- a/lib/filter_nb.c
+++ b/lib/filter_nb.c
@@ -112,6 +112,19 @@ static void prefix_list_entry_set_empty(struct prefix_list_entry *ple)
ple->le = 0;
}
+/**
+ * Unsets the cisco style rule for addresses so it becomes disabled (the
+ * equivalent of setting: `0.0.0.0/32`).
+ *
+ * \param addr address part.
+ * \param mask mask part.
+ */
+static void cisco_unset_addr_mask(struct in_addr *addr, struct in_addr *mask)
+{
+ addr->s_addr = INADDR_ANY;
+ mask->s_addr = CISCO_BIN_HOST_WILDCARD_MASK;
+}
+
/*
* XPath: /frr-filter:lib/access-list
*/
@@ -345,7 +358,7 @@ lib_access_list_entry_host_modify(struct nb_cb_modify_args *args)
f->cisco = 1;
fc = &f->u.cfilter;
yang_dnode_get_ipv4(&fc->addr, args->dnode, NULL);
- fc->addr_mask.s_addr = INADDR_ANY;
+ fc->addr_mask.s_addr = CISCO_BIN_HOST_WILDCARD_MASK;
return NB_OK;
}
@@ -361,8 +374,7 @@ lib_access_list_entry_host_destroy(struct nb_cb_destroy_args *args)
f = nb_running_get_entry(args->dnode, NULL, true);
fc = &f->u.cfilter;
- fc->addr.s_addr = INADDR_ANY;
- fc->addr_mask.s_addr = INADDR_NONE;
+ cisco_unset_addr_mask(&fc->addr, &fc->addr_mask);
return NB_OK;
}
@@ -386,6 +398,7 @@ lib_access_list_entry_network_modify(struct nb_cb_modify_args *args)
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;
return NB_OK;
}
@@ -401,8 +414,7 @@ lib_access_list_entry_network_destroy(struct nb_cb_destroy_args *args)
f = nb_running_get_entry(args->dnode, NULL, true);
fc = &f->u.cfilter;
- fc->addr.s_addr = INADDR_ANY;
- fc->addr_mask.s_addr = INADDR_NONE;
+ cisco_unset_addr_mask(&fc->addr, &fc->addr_mask);
return NB_OK;
}
@@ -423,7 +435,7 @@ lib_access_list_entry_source_any_create(struct nb_cb_create_args *args)
f->cisco = 1;
fc = &f->u.cfilter;
fc->addr.s_addr = INADDR_ANY;
- fc->addr_mask.s_addr = INADDR_NONE;
+ fc->addr_mask.s_addr = CISCO_BIN_ANY_WILDCARD_MASK;
return NB_OK;
}
@@ -439,8 +451,7 @@ lib_access_list_entry_source_any_destroy(struct nb_cb_destroy_args *args)
f = nb_running_get_entry(args->dnode, NULL, true);
fc = &f->u.cfilter;
- fc->addr.s_addr = INADDR_ANY;
- fc->addr_mask.s_addr = INADDR_NONE;
+ cisco_unset_addr_mask(&fc->addr, &fc->addr_mask);
return NB_OK;
}
@@ -461,7 +472,7 @@ static int lib_access_list_entry_destination_host_modify(
fc = &f->u.cfilter;
fc->extended = 1;
yang_dnode_get_ipv4(&fc->mask, args->dnode, NULL);
- fc->mask_mask.s_addr = INADDR_ANY;
+ fc->mask_mask.s_addr = CISCO_BIN_HOST_WILDCARD_MASK;
return NB_OK;
}
@@ -478,8 +489,7 @@ static int lib_access_list_entry_destination_host_destroy(
f = nb_running_get_entry(args->dnode, NULL, true);
fc = &f->u.cfilter;
fc->extended = 0;
- fc->mask.s_addr = INADDR_ANY;
- fc->mask_mask.s_addr = INADDR_NONE;
+ cisco_unset_addr_mask(&fc->mask, &fc->mask_mask);
return NB_OK;
}
@@ -503,6 +513,7 @@ static int lib_access_list_entry_destination_network_modify(
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;
return NB_OK;
}
@@ -519,8 +530,7 @@ 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;
- fc->mask.s_addr = INADDR_ANY;
- fc->mask_mask.s_addr = INADDR_NONE;
+ cisco_unset_addr_mask(&fc->mask, &fc->mask_mask);
return NB_OK;
}
@@ -541,7 +551,7 @@ static int lib_access_list_entry_destination_any_create(
fc = &f->u.cfilter;
fc->extended = 1;
fc->mask.s_addr = INADDR_ANY;
- fc->mask_mask.s_addr = INADDR_NONE;
+ fc->mask_mask.s_addr = CISCO_BIN_ANY_WILDCARD_MASK;
return NB_OK;
}
@@ -558,8 +568,7 @@ static int lib_access_list_entry_destination_any_destroy(
f = nb_running_get_entry(args->dnode, NULL, true);
fc = &f->u.cfilter;
fc->extended = 0;
- fc->mask.s_addr = INADDR_ANY;
- fc->mask_mask.s_addr = INADDR_NONE;
+ cisco_unset_addr_mask(&fc->mask, &fc->mask_mask);
return NB_OK;
}