]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ripngd: code simplification for redistribution.
authorMatthieu Boutier <boutier@pps.univ-paris-diderot.fr>
Thu, 22 Sep 2016 21:11:06 +0000 (18:11 -0300)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 26 Sep 2016 14:52:41 +0000 (10:52 -0400)
Use loops and variables instead of doing each cases by hand.
Use boolean instead of having 2 almost identical functions.

ripngd/ripngd.c

index 2858bb646217777391ef7ffd4c96fd8b4174dbb8..3d76dc52548f25b183d5e9470510eab4af2ca2d3 100644 (file)
@@ -610,32 +610,36 @@ ripng_timeout_update (struct ripng_info *rinfo)
 }
 
 static int
-ripng_incoming_filter (struct prefix_ipv6 *p, struct ripng_interface *ri)
+ripng_filter (int ripng_distribute, struct prefix_ipv6 *p,
+              struct ripng_interface *ri)
 {
   struct distribute *dist;
   struct access_list *alist;
   struct prefix_list *plist;
+  int distribute = ripng_distribute == RIPNG_FILTER_OUT ?
+      DISTRIBUTE_OUT : DISTRIBUTE_IN;
+  const char *inout = ripng_distribute == RIPNG_FILTER_OUT ? "out" : "in";
 
   /* Input distribute-list filtering. */
-  if (ri->list[RIPNG_FILTER_IN])
+  if (ri->list[ripng_distribute])
     {
-      if (access_list_apply (ri->list[RIPNG_FILTER_IN], 
+      if (access_list_apply (ri->list[ripng_distribute],
                             (struct prefix *) p) == FILTER_DENY)
        {
          if (IS_RIPNG_DEBUG_PACKET)
-           zlog_debug ("%s/%d filtered by distribute in",
-                      inet6_ntoa (p->prefix), p->prefixlen);
+           zlog_debug ("%s/%d filtered by distribute %s",
+                        inet6_ntoa (p->prefix), p->prefixlen, inout);
          return -1;
        }
     }
-  if (ri->prefix[RIPNG_FILTER_IN])
+  if (ri->prefix[ripng_distribute])
     {
-      if (prefix_list_apply (ri->prefix[RIPNG_FILTER_IN], 
+      if (prefix_list_apply (ri->prefix[ripng_distribute],
                             (struct prefix *) p) == PREFIX_DENY)
        {
          if (IS_RIPNG_DEBUG_PACKET)
-           zlog_debug ("%s/%d filtered by prefix-list in",
-                      inet6_ntoa (p->prefix), p->prefixlen);
+           zlog_debug ("%s/%d filtered by prefix-list %s",
+                        inet6_ntoa (p->prefix), p->prefixlen, inout);
          return -1;
        }
     }
@@ -644,104 +648,34 @@ ripng_incoming_filter (struct prefix_ipv6 *p, struct ripng_interface *ri)
   dist = distribute_lookup (NULL);
   if (dist)
     {
-      if (dist->list[DISTRIBUTE_IN])
+      if (dist->list[distribute])
        {
-         alist = access_list_lookup (AFI_IP6, dist->list[DISTRIBUTE_IN]);
-           
-         if (alist)
-           {
-             if (access_list_apply (alist,
-                                    (struct prefix *) p) == FILTER_DENY)
-               {
-                 if (IS_RIPNG_DEBUG_PACKET)
-                   zlog_debug ("%s/%d filtered by distribute in",
-                              inet6_ntoa (p->prefix), p->prefixlen);
-                 return -1;
-               }
-           }
-       }
-      if (dist->prefix[DISTRIBUTE_IN])
-       {
-         plist = prefix_list_lookup (AFI_IP6, dist->prefix[DISTRIBUTE_IN]);
-         
-         if (plist)
-           {
-             if (prefix_list_apply (plist,
-                                    (struct prefix *) p) == PREFIX_DENY)
-               {
-                 if (IS_RIPNG_DEBUG_PACKET)
-                   zlog_debug ("%s/%d filtered by prefix-list in",
-                              inet6_ntoa (p->prefix), p->prefixlen);
-                 return -1;
-               }
-           }
-       }
-    }
-  return 0;
-}
+         alist = access_list_lookup (AFI_IP6, dist->list[distribute]);
 
-static int
-ripng_outgoing_filter (struct prefix_ipv6 *p, struct ripng_interface *ri)
-{
-  struct distribute *dist;
-  struct access_list *alist;
-  struct prefix_list *plist;
-
-  if (ri->list[RIPNG_FILTER_OUT])
-    {
-      if (access_list_apply (ri->list[RIPNG_FILTER_OUT],
-                            (struct prefix *) p) == FILTER_DENY)
-       {
-         if (IS_RIPNG_DEBUG_PACKET)
-           zlog_debug ("%s/%d is filtered by distribute out",
-                      inet6_ntoa (p->prefix), p->prefixlen);
-         return -1;
-       }
-    }
-  if (ri->prefix[RIPNG_FILTER_OUT])
-    {
-      if (prefix_list_apply (ri->prefix[RIPNG_FILTER_OUT],
-                            (struct prefix *) p) == PREFIX_DENY)
-       {
-         if (IS_RIPNG_DEBUG_PACKET)
-           zlog_debug ("%s/%d is filtered by prefix-list out",
-                      inet6_ntoa (p->prefix), 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,
                                     (struct prefix *) p) == FILTER_DENY)
                {
                  if (IS_RIPNG_DEBUG_PACKET)
-                   zlog_debug ("%s/%d filtered by distribute out",
-                              inet6_ntoa (p->prefix), p->prefixlen);
+                   zlog_debug ("%s/%d filtered by distribute %s",
+                                inet6_ntoa (p->prefix), p->prefixlen, inout);
                  return -1;
                }
            }
        }
-      if (dist->prefix[DISTRIBUTE_OUT])
+      if (dist->prefix[distribute])
        {
-         plist = prefix_list_lookup (AFI_IP6, dist->prefix[DISTRIBUTE_OUT]);
-         
+         plist = prefix_list_lookup (AFI_IP6, dist->prefix[distribute]);
+
          if (plist)
            {
              if (prefix_list_apply (plist,
                                     (struct prefix *) p) == PREFIX_DENY)
                {
                  if (IS_RIPNG_DEBUG_PACKET)
-                   zlog_debug ("%s/%d filtered by prefix-list out",
-                              inet6_ntoa (p->prefix), p->prefixlen);
+                   zlog_debug ("%s/%d filtered by prefix-list %s",
+                                inet6_ntoa (p->prefix), p->prefixlen, inout);
                  return -1;
                }
            }
@@ -781,7 +715,7 @@ ripng_route_process (struct rte *rte, struct sockaddr_in6 *from,
   /* Apply input filters. */
   ri = ifp->info;
 
-  ret = ripng_incoming_filter (&p, ri);
+  ret = ripng_filter (RIPNG_FILTER_IN, &p, ri);
   if (ret < 0)
     return;
 
@@ -1676,7 +1610,7 @@ ripng_output_process (struct interface *ifp, struct sockaddr_in6 *to,
            rinfo->nexthop_out = rinfo->nexthop;
 
          /* Apply output filters. */
-         ret = ripng_outgoing_filter (p, ri);
+         ret = ripng_filter (RIPNG_FILTER_OUT, p, ri);
          if (ret < 0)
            continue;
 
@@ -1805,7 +1739,7 @@ ripng_output_process (struct interface *ifp, struct sockaddr_in6 *to,
          memset(&aggregate->nexthop_out, 0, sizeof(aggregate->nexthop_out));
 
          /* Apply output filters.*/
-         ret = ripng_outgoing_filter (p, ri);
+         ret = ripng_filter (RIPNG_FILTER_OUT, p, ri);
          if (ret < 0)
            continue;