2003-06-09 Paul Jakma <paul@dishone.st>
* bgp_clist.c (community_list_delete): honour deny statements
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index 3cf1d2e..a2c1210 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -524,25 +524,36 @@
for (entry = list->head; entry; entry = entry->next)
{
- if (entry->any && entry->direct == COMMUNITY_PERMIT)
+ if (entry->any)
{
- /* This is a tricky part. Currently only
- route_set_community_delete() uses this function. In the
- function com->size is zero, it free the community
- structure. */
- com->size = 0;
+ if (entry->direct == COMMUNITY_PERMIT)
+ {
+ /* This is a tricky part. Currently only
+ * route_set_community_delete() uses this function. In the
+ * function com->size is zero, it free the community
+ * structure.
+ */
+ com->size = 0;
+ }
return com;
}
- if (entry->style == COMMUNITY_LIST_STANDARD)
+ if ((entry->style == COMMUNITY_LIST_STANDARD)
+ && (community_include (entry->u.com, COMMUNITY_INTERNET)
+ || community_match (com, entry->u.com) ))
{
- if (entry->direct == COMMUNITY_PERMIT)
- community_delete (com, entry->u.com);
+ if (entry->direct == COMMUNITY_PERMIT)
+ community_delete (com, entry->u.com);
+ else
+ break;
}
- else if (entry->style == COMMUNITY_LIST_EXPANDED)
+ else if ((entry->style == COMMUNITY_LIST_EXPANDED)
+ && community_regexp_match (com, entry->reg))
{
if (entry->direct == COMMUNITY_PERMIT)
community_regexp_delete (com, entry->reg);
+ else
+ break;
}
}
return com;