]> git.puffer.fish Git - mirror/frr.git/commitdiff
babeld: refactor filtering stubs.
authorJuliusz Chroboczek <jch@pps.jussieu.fr>
Thu, 9 Feb 2012 13:06:11 +0000 (14:06 +0100)
committerPaul Jakma <paul@quagga.net>
Sun, 25 Mar 2012 16:06:53 +0000 (17:06 +0100)
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.

babeld/babel_filter.c
babeld/babel_filter.h
babeld/babeld.c

index 5c93d13a1da7bfaf82ed876a9cd121cdc0fcfdf0..191a9f77eabde02a653e8dffb02f2e859948828e 100644 (file)
@@ -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 */
-}
index 52b72f605ee89fd75e06f1b5cf8c1de47a6e003e..73722e0a3c12110cb3533ebbc0df14f2a1345fc3 100644 (file)
@@ -43,12 +43,7 @@ THE SOFTWARE.
 #include "prefix.h"
 #include "babel_interface.h"
 
-/* filter route coming from other worlds */
-int babel_filter_in  (struct prefix *, babel_interface_nfo *);
-/* filter route sending to other worlds */
-int babel_filter_out (struct prefix *, babel_interface_nfo *);
-/* filter route coming from our friend zebra */
-int babel_filter_redistribute
-                     (struct prefix *, babel_interface_nfo *);
+int babel_filter(int output, const unsigned char *prefix, unsigned short plen,
+                 unsigned int index);
 
 #endif /* BABELD_BABEL_FILTER_H */
index da07434902209dc79a39e90ddf5c4982fabc986e..14990a68857f2ef8fcd9f68e7ef0ce6da02de9d3 100644 (file)
@@ -705,71 +705,30 @@ babeld_quagga_init(void)
     distribute_list_delete_hook (babel_distribute_update);
 }
 
-int /* DEPRECATED: for compatibility with old babeld (configuration.{c,h})*/
+/* Stubs to adapt Babel's filtering calls to Quagga's infrastructure. */
+
+int
 input_filter(const unsigned char *id,
              const unsigned char *prefix, unsigned short plen,
              const unsigned char *neigh, unsigned int ifindex)
 {
-    struct interface *ifp = NULL;
-    struct prefix p;
-    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);
-    }
-
-    ifp = if_lookup_by_index(ifindex);
-    if (ifp != NULL) {
-        return babel_filter_in(&p, babel_get_if_nfo(ifp));
-    }
-
-    return babel_filter_in(&p, NULL);
+    return babel_filter(0, prefix, plen, ifindex);
 }
 
-int /* DEPRECATED: for compatibility with old babeld */
+int
 output_filter(const unsigned char *id, const unsigned char *prefix,
               unsigned short plen, unsigned int ifindex)
 {
-    struct interface *ifp = NULL;
-    struct prefix p;
-    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);
-    }
-
-    ifp = if_lookup_by_index(ifindex);
-    if (ifp != NULL) {
-        return babel_filter_out(&p, babel_get_if_nfo(ifp));
-    }
-
-    return babel_filter_out(&p, NULL);
+    return babel_filter(1, prefix, plen, ifindex);
 }
 
-int /* DEPRECATED: for compatibility with old babeld */
+/* There's no redistribute filter in Quagga -- the zebra daemon does its
+   own filtering. */
+int
 redistribute_filter(const unsigned char *prefix, unsigned short plen,
                     unsigned int ifindex, int proto)
 {
-    struct interface *ifp = NULL;
-    struct prefix p;
-    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);
-    }
-
-    ifp = if_lookup_by_index(ifindex);
-    if (ifp != NULL) {
-        return babel_filter_redistribute(&p,babel_get_if_nfo(ifp));
-    }
-
-    return babel_filter_redistribute(&p, NULL);
+    return 0;
 }
 
 void