summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_clist.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index 3cf1d2ea..a2c12100 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -524,25 +524,36 @@ community_list_match_delete (struct community *com,
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;