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.
This commit is contained in:
Matthieu Boutier 2016-09-22 18:11:06 -03:00 committed by Donald Sharp
parent 7c989d74b5
commit 644ed6c5de

View File

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