From 644ed6c5deb1e37b45b978e1d302785be6a25c18 Mon Sep 17 00:00:00 2001 From: Matthieu Boutier Date: Thu, 22 Sep 2016 18:11:06 -0300 Subject: [PATCH] ripngd: code simplification for redistribution. Use loops and variables instead of doing each cases by hand. Use boolean instead of having 2 almost identical functions. --- ripngd/ripngd.c | 116 +++++++++++------------------------------------- 1 file changed, 25 insertions(+), 91 deletions(-) diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c index 2858bb6462..3d76dc5254 100644 --- a/ripngd/ripngd.c +++ b/ripngd/ripngd.c @@ -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; -- 2.39.5