summaryrefslogtreecommitdiff
path: root/babeld/babel_filter.c
diff options
context:
space:
mode:
authorJuliusz Chroboczek <jch@pps.jussieu.fr>2012-02-09 14:06:11 +0100
committerPaul Jakma <paul@quagga.net>2012-03-25 17:06:53 +0100
commit31e2a19fd2b4aca34b1d2f5e2eb8c9a44b9ea6c9 (patch)
treea45b53df9a0a9d9acda77462d0993ca836df3936 /babeld/babel_filter.c
parent578ce371d12422ce444f31ae4e51b21675c74b55 (diff)
babeld: refactor filtering stubs.
Factorise the common parts of the in/out filtering functions. This also fixes a bug with filtered out routes, which in babeld are signalled by a filter returing INFINITY, not -1.
Diffstat (limited to 'babeld/babel_filter.c')
-rw-r--r--babeld/babel_filter.c152
1 files changed, 44 insertions, 108 deletions
diff --git a/babeld/babel_filter.c b/babeld/babel_filter.c
index 5c93d13a1d..191a9f77ea 100644
--- a/babeld/babel_filter.c
+++ b/babeld/babel_filter.c
@@ -45,144 +45,80 @@ THE SOFTWARE.
#include "distribute.h"
#include "util.h"
-
int
-babel_filter_in (struct prefix *p, babel_interface_nfo *babel_ifp)
+babel_filter(int output, const unsigned char *prefix, unsigned short plen,
+ unsigned int ifindex)
{
+ struct interface *ifp = if_lookup_by_index(ifindex);
+ babel_interface_nfo *babel_ifp = ifp ? babel_get_if_nfo(ifp) : NULL;
+ struct prefix p;
struct distribute *dist;
struct access_list *alist;
struct prefix_list *plist;
+ int filter = output ? BABEL_FILTER_OUT : BABEL_FILTER_IN;
+ int distribute = output ? DISTRIBUTE_OUT : DISTRIBUTE_IN;
+
+ p.family = v4mapped(prefix) ? AF_INET : AF_INET6;
+ p.prefixlen = v4mapped(prefix) ? plen - 96 : plen;
+ if (p.family == AF_INET)
+ uchar_to_inaddr(&p.u.prefix4, prefix);
+ else
+ uchar_to_in6addr(&p.u.prefix6, prefix);
- /* Input distribute-list filtering. */
- if (babel_ifp != NULL && babel_ifp->list[BABEL_FILTER_IN]) {
- if (access_list_apply (babel_ifp->list[BABEL_FILTER_IN], p)
+ if (babel_ifp != NULL && babel_ifp->list[filter]) {
+ if (access_list_apply (babel_ifp->list[filter], &p)
== FILTER_DENY) {
debugf(BABEL_DEBUG_FILTER,
"%s/%d filtered by distribute in",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
+ p.family == AF_INET ?
+ inet_ntoa(p.u.prefix4) :
+ inet6_ntoa (p.u.prefix6),
+ p.prefixlen);
+ return INFINITY;
}
}
- if (babel_ifp != NULL && babel_ifp->prefix[BABEL_FILTER_IN]) {
- if (prefix_list_apply (babel_ifp->prefix[BABEL_FILTER_IN], p)
+ if (babel_ifp != NULL && babel_ifp->prefix[filter]) {
+ if (prefix_list_apply (babel_ifp->prefix[filter], &p)
== PREFIX_DENY) {
debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
+ p.family == AF_INET ?
+ inet_ntoa(p.u.prefix4) :
+ inet6_ntoa (p.u.prefix6),
+ p.prefixlen);
+ return INFINITY;
}
}
/* All interface filter check. */
dist = distribute_lookup (NULL);
if (dist) {
- if (dist->list[DISTRIBUTE_IN]) {
- alist = access_list_lookup (AFI_IP6, dist->list[DISTRIBUTE_IN]);
+ if (dist->list[distribute]) {
+ alist = access_list_lookup (AFI_IP6, dist->list[distribute]);
if (alist) {
- if (access_list_apply (alist, p) == FILTER_DENY) {
+ if (access_list_apply (alist, &p) == FILTER_DENY) {
debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
+ p.family == AF_INET ?
+ inet_ntoa(p.u.prefix4) :
+ inet6_ntoa (p.u.prefix6),
+ p.prefixlen);
+ return INFINITY;
}
}
}
- if (dist->prefix[DISTRIBUTE_IN]) {
- plist = prefix_list_lookup (AFI_IP6, dist->prefix[DISTRIBUTE_IN]);
+ if (dist->prefix[distribute]) {
+ plist = prefix_list_lookup (AFI_IP6, dist->prefix[distribute]);
if (plist) {
- if (prefix_list_apply (plist, p) == PREFIX_DENY) {
+ if (prefix_list_apply (plist, &p) == PREFIX_DENY) {
debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute in",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
- }
- }
- }
- }
- return 0;
-}
-
-int
-babel_filter_out (struct prefix *p, babel_interface_nfo *babel_ifp)
-{
- struct distribute *dist;
- struct access_list *alist;
- struct prefix_list *plist;
-
- if (babel_ifp != NULL && babel_ifp->list[BABEL_FILTER_OUT]) {
- if (access_list_apply (babel_ifp->list[BABEL_FILTER_OUT], p)
- == FILTER_DENY) {
- debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute out",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
- }
- }
- if (babel_ifp != NULL && babel_ifp->prefix[BABEL_FILTER_OUT]) {
- if (prefix_list_apply (babel_ifp->prefix[BABEL_FILTER_OUT], p)
- == PREFIX_DENY) {
- debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute out",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
- }
- }
-
- /* All interface filter check. */
- dist = distribute_lookup (NULL);
- if (dist) {
- if (dist->list[DISTRIBUTE_OUT]) {
- alist = access_list_lookup (AFI_IP6, dist->list[DISTRIBUTE_OUT]);
- if (alist) {
- if (access_list_apply (alist, p) == FILTER_DENY) {
- debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute out",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
- }
- }
- }
- if (dist->prefix[DISTRIBUTE_OUT]) {
- plist = prefix_list_lookup (AFI_IP6, dist->prefix[DISTRIBUTE_OUT]);
- if (plist) {
- if (prefix_list_apply (plist, p) == PREFIX_DENY) {
- debugf(BABEL_DEBUG_FILTER, "%s/%d filtered by distribute out",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return -1;
+ p.family == AF_INET ?
+ inet_ntoa(p.u.prefix4) :
+ inet6_ntoa (p.u.prefix6),
+ p.prefixlen);
+ return INFINITY;
}
}
}
}
return 0;
}
-
-int
-babel_filter_redistribute (struct prefix *p,
- babel_interface_nfo *babel_ifp)
-{
- debugf(BABEL_DEBUG_FILTER, "%s/%d WARNING: no redistribute filter implemented !!!!",
- p->family == AF_INET ?
- inet_ntoa(p->u.prefix4) :
- inet6_ntoa (p->u.prefix6),
- p->prefixlen);
- return 0; /* TODO: it redistributes always */
-}