* bgp_clist.[ch], bgp_route.c, bgp_routemap.c, bgp_vty.c:
	  community-list cleanup.

	[merge from GNU Zebra]
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog
index 0e2d528..c1ca177 100644
--- a/bgpd/ChangeLog
+++ b/bgpd/ChangeLog
@@ -1,5 +1,10 @@
 2005-02-02 Akihiro Mizutani <mizutani@net-chef.net>
 
+	* bgp_clist.[ch], bgp_route.c, bgp_routemap.c, bgp_vty.c:
+	  community-list cleanup.
+
+2005-02-02 Akihiro Mizutani <mizutani@net-chef.net>
+
 	* bgp_route.c, bgp_vty.c, bgp_zebra.c, bgpd.[ch]: "enforce-multihop"
 	  -> "disable-connected-check".
 
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index 572d11c..b36f234 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -34,20 +34,16 @@
 /* Lookup master structure for community-list or
    extcommunity-list.  */
 struct community_list_master *
-community_list_master_lookup (struct community_list_handler *ch, int style)
+community_list_master_lookup (struct community_list_handler *ch, int master)
 {
   if (ch)
-    switch (style)
+    switch (master)
       {
-      case COMMUNITY_LIST_STANDARD:
-      case COMMUNITY_LIST_EXPANDED:
-      case COMMUNITY_LIST_AUTO:
-        return &ch->community_list;
-        break;
-      case EXTCOMMUNITY_LIST_STANDARD:
-      case EXTCOMMUNITY_LIST_EXPANDED:
-      case EXTCOMMUNITY_LIST_AUTO:
-        return &ch->extcommunity_list;
+      case COMMUNITY_LIST_MASTER:
+	return &ch->community_list;
+	break;
+      case EXTCOMMUNITY_LIST_MASTER:
+	return &ch->extcommunity_list;
       }
   return NULL;
 }
@@ -115,7 +111,7 @@
 
 struct community_list *
 community_list_insert (struct community_list_handler *ch,
-                       const char *name, int style)
+		       const char *name, int master)
 {
   size_t i;
   long number;
@@ -125,7 +121,7 @@
   struct community_list_master *cm;
 
   /* Lookup community-list master.  */
-  cm = community_list_master_lookup (ch, style);
+  cm = community_list_master_lookup (ch, master);
   if (!cm)
     return NULL;
 
@@ -209,7 +205,7 @@
 
 struct community_list *
 community_list_lookup (struct community_list_handler *ch,
-                       const char *name, int style)
+		       const char *name, int master)
 {
   struct community_list *list;
   struct community_list_master *cm;
@@ -217,7 +213,7 @@
   if (!name)
     return NULL;
 
-  cm = community_list_master_lookup (ch, style);
+  cm = community_list_master_lookup (ch, master);
   if (!cm)
     return NULL;
 
@@ -232,14 +228,14 @@
 }
 
 struct community_list *
-community_list_get (struct community_list_handler *ch, 
-                    const char *name, int style)
+community_list_get (struct community_list_handler *ch,
+		    const char *name, int master)
 {
   struct community_list *list;
 
-  list = community_list_lookup (ch, name, style);
+  list = community_list_lookup (ch, name, master);
   if (!list)
-    list = community_list_insert (ch, name, style);
+    list = community_list_insert (ch, name, master);
   return list;
 }
 
@@ -609,15 +605,13 @@
 community_list_set (struct community_list_handler *ch,
                     const char *name, const char *str, int direct, int style)
 {
-  struct community_entry *entry;
+  struct community_entry *entry = NULL;
   struct community_list *list;
-  struct community *com;
-  regex_t *regex;
-
-  entry = NULL;
+  struct community *com = NULL;
+  regex_t *regex = NULL;
 
   /* Get community list. */
-  list = community_list_get (ch, name, style);
+  list = community_list_get (ch, name, COMMUNITY_LIST_MASTER);
 
   /* When community-list already has entry, new entry should have same
      style.  If you want to have mixed style community-list, you can
@@ -628,68 +622,33 @@
 
       first = list->head;
 
-      if (style == COMMUNITY_LIST_AUTO)
-        style = first->style;
-      else if (style != first->style)
-        {
-          return (first->style == COMMUNITY_LIST_STANDARD
-                  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
-                  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
-        }
+      if (style != first->style)
+	{
+	  return (first->style == COMMUNITY_LIST_STANDARD
+		  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
+		  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
+	}
     }
 
-  /* When str is NULL, it is matches any.  */
-  if (!str)
+  if (str)
     {
-      entry = community_entry_new ();
-      entry->direct = direct;
-      entry->any = 1;
-      if (style == COMMUNITY_LIST_AUTO)
-        entry->style = COMMUNITY_LIST_STANDARD;
+      if (style == COMMUNITY_LIST_STANDARD)
+	com = community_str2com (str);
       else
-        entry->style = style;
-    }
-  else
-    {
-      /* Standard community-list parse.  String must be converted into
-         community structure without problem.  */
-      if (style == COMMUNITY_LIST_STANDARD || style == COMMUNITY_LIST_AUTO)
-        {
-          com = community_str2com (str);
-          if (com)
-            {
-              entry = community_entry_new ();
-              entry->u.com = com;
-              entry->direct = direct;
-              entry->style = COMMUNITY_LIST_STANDARD;
-            }
-          else if (style == COMMUNITY_LIST_STANDARD)
-            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+	regex = bgp_regcomp (str);
 
-          /* We can't convert string into communities value.  When
-             community-list type is auto, fall dawn to regular expression
-             match.  */
-        }
-
-      /* Expanded community-list parse.  String may include regular
-         expression.  */
-      if (!entry && (style == COMMUNITY_LIST_EXPANDED
-                     || style == COMMUNITY_LIST_AUTO))
-        {
-          regex = bgp_regcomp (str);
-          if (regex)
-            {
-              entry = community_entry_new ();
-              entry->reg = regex;
-              entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str);
-              entry->direct = direct;
-              entry->style = COMMUNITY_LIST_EXPANDED;
-            }
-          else
-            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-        }
+      if (! com && ! regex)
+	return COMMUNITY_LIST_ERR_MALFORMED_VAL;
     }
 
+  entry = community_entry_new ();
+  entry->direct = direct;
+  entry->style = style;
+  entry->any = (str ? 0 : 1);
+  entry->u.com = com;
+  entry->reg = regex;
+  entry->config = (regex ? XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str) : NULL);
+
   /* Do not put duplicated community entry.  */
   if (community_list_dup_check (list, entry))
     community_entry_free (entry);
@@ -706,15 +665,13 @@
                       const char *name, const char *str, 
                       int direct, int style)
 {
-  struct community_entry *entry;
+  struct community_entry *entry = NULL;
   struct community_list *list;
-  struct community *com;
-  regex_t *regex;
-
-  entry = NULL;
+  struct community *com = NULL;
+  regex_t *regex = NULL;
 
   /* Lookup community list.  */
-  list = community_list_lookup (ch, name, style);
+  list = community_list_lookup (ch, name, COMMUNITY_LIST_MASTER);
   if (list == NULL)
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
 
@@ -725,37 +682,23 @@
       return 0;
     }
 
-  /* Community list string is specified.  Lookup entry from community
-     list.  */
-  if (style == COMMUNITY_LIST_STANDARD || style == COMMUNITY_LIST_AUTO)
-    {
-      com = community_str2com (str);
-      if (com)
-        {
-          entry = community_list_entry_lookup (list, com, direct);
-          community_free (com);
-        }
-      else if (style == COMMUNITY_LIST_STANDARD)
-        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+  if (style == COMMUNITY_LIST_STANDARD)
+    com = community_str2com (str);
+  else
+    regex = bgp_regcomp (str);
 
-      /* If we can't convert string into community and community-list
-         type is auto, fall dawn to expanded community-list.  */
-    }
+  if (! com && ! regex)
+    return COMMUNITY_LIST_ERR_MALFORMED_VAL;
 
-  /* Expanded community-list parse.  String may include regular
-     expression.  */
-  if (!entry
-      && (style == COMMUNITY_LIST_EXPANDED || style == COMMUNITY_LIST_AUTO))
-    {
-      regex = bgp_regcomp (str);
-      if (regex)
-        {
-          entry = community_list_entry_lookup (list, str, direct);
-          bgp_regex_free (regex);
-        }
-      else
-        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-    }
+  if (com)
+    entry = community_list_entry_lookup (list, com, direct);
+  else
+    entry = community_list_entry_lookup (list, str, direct);
+
+  if (com)
+    community_free (com);
+  if (regex)
+    bgp_regex_free (regex);
 
   if (!entry)
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
@@ -771,15 +714,15 @@
                        const char *name, const char *str, 
                        int direct, int style)
 {
-  struct community_entry *entry;
+  struct community_entry *entry = NULL;
   struct community_list *list;
-  struct ecommunity *ecom;
-  regex_t *regex;
+  struct ecommunity *ecom = NULL;
+  regex_t *regex = NULL;
 
   entry = NULL;
 
   /* Get community list. */
-  list = community_list_get (ch, name, style);
+  list = community_list_get (ch, name, EXTCOMMUNITY_LIST_MASTER);
 
   /* When community-list already has entry, new entry should have same
      style.  If you want to have mixed style community-list, you can
@@ -790,74 +733,40 @@
 
       first = list->head;
 
-      if (style == EXTCOMMUNITY_LIST_AUTO)
-        style = first->style;
-      else if (style != first->style)
-        {
-          return (first->style == EXTCOMMUNITY_LIST_STANDARD
-                  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
-                  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
-        }
+      if (style != first->style)
+	{
+	  return (first->style == EXTCOMMUNITY_LIST_STANDARD
+		  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
+		  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
+	}
     }
 
-  /* When str is NULL, it is matches any.  */
-  if (!str)
+  if (str)
     {
-      entry = community_entry_new ();
-      entry->direct = direct;
-      entry->any = 1;
-      if (style == EXTCOMMUNITY_LIST_AUTO)
-        entry->style = EXTCOMMUNITY_LIST_STANDARD;
+      if (style == EXTCOMMUNITY_LIST_STANDARD)
+	ecom = ecommunity_str2com (str, 0, 1);
       else
-        entry->style = style;
+	regex = bgp_regcomp (str);
+
+      if (! ecom && ! regex)
+	return COMMUNITY_LIST_ERR_MALFORMED_VAL;
     }
+
+  if (ecom)
+    ecom->str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_DISPLAY);
+
+  entry = community_entry_new ();
+  entry->direct = direct;
+  entry->style = style;
+  entry->any = (str ? 0 : 1);
+  if (ecom)
+    entry->config = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_COMMUNITY_LIST);
+  else if (regex)
+    entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str);
   else
-    {
-      /* Standard extcommunity-list parse.  String is converted into
-         ecommunity structure.  */
-      if (style == EXTCOMMUNITY_LIST_STANDARD
-          || style == EXTCOMMUNITY_LIST_AUTO)
-        {
-          /* Type is unknown.  String includes keyword.  */
-          ecom = ecommunity_str2com (str, 0, 1);
-          if (ecom)
-            {
-              entry = community_entry_new ();
-              entry->config
-                =
-                ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_COMMUNITY_LIST);
-              ecom->str =
-                ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_DISPLAY);
-              entry->u.ecom = ecom;
-              entry->direct = direct;
-              entry->style = EXTCOMMUNITY_LIST_STANDARD;
-            }
-          else if (style == EXTCOMMUNITY_LIST_STANDARD)
-            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-
-          /* We can't convert string into communities value.  When
-             community-list type is auto, fall dawn to regular expression
-             match.  */
-        }
-
-      /* Expanded extcommunity-list parse.  String may include regular
-         expression.  */
-      if (!entry && (style == EXTCOMMUNITY_LIST_EXPANDED
-                     || style == EXTCOMMUNITY_LIST_AUTO))
-        {
-          regex = bgp_regcomp (str);
-          if (regex)
-            {
-              entry = community_entry_new ();
-              entry->reg = regex;
-              entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str);
-              entry->direct = direct;
-              entry->style = EXTCOMMUNITY_LIST_EXPANDED;
-            }
-          else
-            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-        }
-    }
+    entry->config = NULL;
+  entry->u.ecom = ecom;
+  entry->reg = regex;
 
   /* Do not put duplicated community entry.  */
   if (community_list_dup_check (list, entry))
@@ -875,15 +784,13 @@
                          const char *name, const char *str, 
                          int direct, int style)
 {
-  struct community_entry *entry;
+  struct community_entry *entry = NULL;
   struct community_list *list;
   struct ecommunity *ecom = NULL;
-  regex_t *regex;
-
-  entry = NULL;
+  regex_t *regex = NULL;
 
   /* Lookup extcommunity list.  */
-  list = community_list_lookup (ch, name, style);
+  list = community_list_lookup (ch, name, EXTCOMMUNITY_LIST_MASTER);
   if (list == NULL)
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
 
@@ -894,37 +801,23 @@
       return 0;
     }
 
-  /* Community list string is specified.  Lookup entry from community
-     list.  */
-  if (style == EXTCOMMUNITY_LIST_STANDARD || style == EXTCOMMUNITY_LIST_AUTO)
-    {
-      ecom = ecommunity_str2com (str, 0, 1);
-      if (ecom)
-        {
-          entry = community_list_entry_lookup (list, ecom, direct);
-          ecommunity_free (ecom);
-        }
-      else if (style == COMMUNITY_LIST_STANDARD)
-        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+  if (style == EXTCOMMUNITY_LIST_STANDARD)
+    ecom = ecommunity_str2com (str, 0, 1);
+  else
+    regex = bgp_regcomp (str);
 
-      /* If we can't convert string into community and community-list
-         type is auto, fall dawn to expanded community-list.  */
-    }
+  if (! ecom && ! regex)
+    return COMMUNITY_LIST_ERR_MALFORMED_VAL;
 
-  /* Expanded community-list parse.  String may include regular
-     expression.  */
-  if (!entry
-      && (style == COMMUNITY_LIST_EXPANDED || style == COMMUNITY_LIST_AUTO))
-    {
-      regex = bgp_regcomp (str);
-      if (regex)
-        {
-          entry = community_list_entry_lookup (list, str, direct);
-          bgp_regex_free (regex);
-        }
-      else
-        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-    }
+  if (ecom)
+    entry = community_list_entry_lookup (list, ecom, direct);
+  else
+    entry = community_list_entry_lookup (list, str, direct);
+
+  if (ecom)
+    ecommunity_free (ecom);
+  if (regex)
+    bgp_regex_free (regex);
 
   if (!entry)
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
diff --git a/bgpd/bgp_clist.h b/bgpd/bgp_clist.h
index 11db2d7..6f1faf0 100644
--- a/bgpd/bgp_clist.h
+++ b/bgpd/bgp_clist.h
@@ -18,6 +18,10 @@
 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.  */
 
+/* Master Community-list. */
+#define COMMUNITY_LIST_MASTER          0
+#define EXTCOMMUNITY_LIST_MASTER       1
+
 /* Community-list deny and permit.  */
 #define COMMUNITY_DENY                 0
 #define COMMUNITY_PERMIT               1
@@ -29,10 +33,8 @@
 /* Community-list entry types.  */
 #define COMMUNITY_LIST_STANDARD        0 /* Standard community-list.  */
 #define COMMUNITY_LIST_EXPANDED        1 /* Expanded community-list.  */
-#define COMMUNITY_LIST_AUTO            2 /* Automatically detected.  */
-#define EXTCOMMUNITY_LIST_STANDARD     3 /* Standard extcommunity-list.  */
-#define EXTCOMMUNITY_LIST_EXPANDED     4 /* Expanded extcommunity-list.  */
-#define EXTCOMMUNITY_LIST_AUTO         5 /* Automatically detected.  */
+#define EXTCOMMUNITY_LIST_STANDARD     2 /* Standard extcommunity-list.  */
+#define EXTCOMMUNITY_LIST_EXPANDED     3 /* Expanded extcommunity-list.  */
 
 /* Community-list.  */
 struct community_list
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index a3be9f0..156120b 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -7767,7 +7767,7 @@
 {
   struct community_list *list;
 
-  list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_AUTO);
+  list = community_list_lookup (bgp_clist, com, COMMUNITY_LIST_MASTER);
   if (list == NULL)
     {
       vty_out (vty, "%% %s is not a valid community-list name%s", com,
@@ -7782,11 +7782,12 @@
 
 DEFUN (show_ip_bgp_community_list,
        show_ip_bgp_community_list_cmd,
-       "show ip bgp community-list WORD",
+       "show ip bgp community-list (<1-500>|WORD)",
        SHOW_STR
        IP_STR
        BGP_STR
        "Display routes matching the community-list\n"
+       "community-list number\n"
        "community-list name\n")
 {
   return bgp_show_community_list (vty, argv[0], 0, AFI_IP, SAFI_UNICAST);
@@ -7794,7 +7795,7 @@
 
 DEFUN (show_ip_bgp_ipv4_community_list,
        show_ip_bgp_ipv4_community_list_cmd,
-       "show ip bgp ipv4 (unicast|multicast) community-list WORD",
+       "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD)",
        SHOW_STR
        IP_STR
        BGP_STR
@@ -7802,6 +7803,7 @@
        "Address Family modifier\n"
        "Address Family modifier\n"
        "Display routes matching the community-list\n"
+       "community-list number\n"
        "community-list name\n")
 {
   if (strncmp (argv[0], "m", 1) == 0)
@@ -7812,11 +7814,12 @@
 
 DEFUN (show_ip_bgp_community_list_exact,
        show_ip_bgp_community_list_exact_cmd,
-       "show ip bgp community-list WORD exact-match",
+       "show ip bgp community-list (<1-500>|WORD) exact-match",
        SHOW_STR
        IP_STR
        BGP_STR
        "Display routes matching the community-list\n"
+       "community-list number\n"
        "community-list name\n"
        "Exact match of the communities\n")
 {
@@ -7825,7 +7828,7 @@
 
 DEFUN (show_ip_bgp_ipv4_community_list_exact,
        show_ip_bgp_ipv4_community_list_exact_cmd,
-       "show ip bgp ipv4 (unicast|multicast) community-list WORD exact-match",
+       "show ip bgp ipv4 (unicast|multicast) community-list (<1-500>|WORD) exact-match",
        SHOW_STR
        IP_STR
        BGP_STR
@@ -7833,6 +7836,7 @@
        "Address Family modifier\n"
        "Address Family modifier\n"
        "Display routes matching the community-list\n"
+       "community-list number\n"
        "community-list name\n"
        "Exact match of the communities\n")
 {
@@ -7845,10 +7849,11 @@
 #ifdef HAVE_IPV6
 DEFUN (show_bgp_community_list,
        show_bgp_community_list_cmd,
-       "show bgp community-list WORD",
+       "show bgp community-list (<1-500>|WORD)",
        SHOW_STR
        BGP_STR
        "Display routes matching the community-list\n"
+       "community-list number\n"
        "community-list name\n")
 {
   return bgp_show_community_list (vty, argv[0], 0, AFI_IP6, SAFI_UNICAST);
@@ -7856,12 +7861,13 @@
 
 ALIAS (show_bgp_community_list,
        show_bgp_ipv6_community_list_cmd,
-       "show bgp ipv6 community-list WORD",
+       "show bgp ipv6 community-list (<1-500>|WORD)",
        SHOW_STR
        BGP_STR
        "Address family\n"
        "Display routes matching the community-list\n"
-       "community-list name\n")
+       "community-list number\n"
+       "community-list name\n");
 
 /* old command */
 DEFUN (show_ipv6_bgp_community_list,
@@ -7891,10 +7897,11 @@
 
 DEFUN (show_bgp_community_list_exact,
        show_bgp_community_list_exact_cmd,
-       "show bgp community-list WORD exact-match",
+       "show bgp community-list (<1-500>|WORD) exact-match",
        SHOW_STR
        BGP_STR
        "Display routes matching the community-list\n"
+       "community-list number\n"
        "community-list name\n"
        "Exact match of the communities\n")
 {
@@ -7903,11 +7910,12 @@
 
 ALIAS (show_bgp_community_list_exact,
        show_bgp_ipv6_community_list_exact_cmd,
-       "show bgp ipv6 community-list WORD exact-match",
+       "show bgp ipv6 community-list (<1-500>|WORD) exact-match",
        SHOW_STR
        BGP_STR
        "Address family\n"
        "Display routes matching the community-list\n"
+       "community-list number\n"
        "community-list name\n"
        "Exact match of the communities\n")
 
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index 7674005..73165d3 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -556,7 +556,7 @@
       bgp_info = object;
       rcom = rule;
 
-      list = community_list_lookup (bgp_clist, rcom->name, COMMUNITY_LIST_AUTO);
+      list = community_list_lookup (bgp_clist, rcom->name, COMMUNITY_LIST_MASTER);
       if (! list)
 	return RMAP_NOMATCH;
 
@@ -632,7 +632,7 @@
       bgp_info = object;
 
       list = community_list_lookup (bgp_clist, (char *) rule,
-				    EXTCOMMUNITY_LIST_AUTO);
+				    EXTCOMMUNITY_LIST_MASTER);
       if (! list)
 	return RMAP_NOMATCH;
 
@@ -1225,7 +1225,7 @@
   route_set_community_free,
 };
 
-/* `set comm-list (<1-99>|<100-199>|WORD) delete' */
+/* `set comm-list (<1-99>|<100-500>|WORD) delete' */
 
 /* For community set mechanism. */
 route_map_result_t
@@ -1244,7 +1244,7 @@
 	return RMAP_OKAY;
 
       binfo = object;
-      list = community_list_lookup (bgp_clist, rule, COMMUNITY_LIST_AUTO);
+      list = community_list_lookup (bgp_clist, rule, COMMUNITY_LIST_MASTER);
       old = binfo->attr->community;
 
       if (list && old)
@@ -2412,7 +2412,7 @@
 
 DEFUN (match_community, 
        match_community_cmd,
-       "match community (<1-99>|<100-199>|WORD)",
+       "match community (<1-99>|<100-500>|WORD)",
        MATCH_STR
        "Match BGP community list\n"
        "Community-list number (standard)\n"
@@ -2424,7 +2424,7 @@
 
 DEFUN (match_community_exact, 
        match_community_exact_cmd,
-       "match community (<1-99>|<100-199>|WORD) exact-match",
+       "match community (<1-99>|<100-500>|WORD) exact-match",
        MATCH_STR
        "Match BGP community list\n"
        "Community-list number (standard)\n"
@@ -2459,7 +2459,7 @@
 
 ALIAS (no_match_community,
        no_match_community_val_cmd,
-       "no match community (<1-99>|<100-199>|WORD)",
+       "no match community (<1-99>|<100-500>|WORD)",
        NO_STR
        MATCH_STR
        "Match BGP community list\n"
@@ -2469,7 +2469,7 @@
 
 ALIAS (no_match_community,
        no_match_community_exact_cmd,
-       "no match community (<1-99>|<100-199>|WORD) exact-match",
+       "no match community (<1-99>|<100-500>|WORD) exact-match",
        NO_STR
        MATCH_STR
        "Match BGP community list\n"
@@ -2480,7 +2480,7 @@
 
 DEFUN (match_ecommunity, 
        match_ecommunity_cmd,
-       "match extcommunity (<1-99>|<100-199>|WORD)",
+       "match extcommunity (<1-99>|<100-500>|WORD)",
        MATCH_STR
        "Match BGP/VPN extended community list\n"
        "Extended community-list number (standard)\n"
@@ -2502,7 +2502,7 @@
 
 ALIAS (no_match_ecommunity,
        no_match_ecommunity_val_cmd,
-       "no match extcommunity (<1-99>|<100-199>|WORD)",
+       "no match extcommunity (<1-99>|<100-500>|WORD)",
        NO_STR
        MATCH_STR
        "Match BGP/VPN extended community list\n"
@@ -2913,7 +2913,7 @@
 
 DEFUN (set_community_delete,
        set_community_delete_cmd,
-       "set comm-list (<1-99>|<100-199>|WORD) delete",
+       "set comm-list (<1-99>|<100-500>|WORD) delete",
        SET_STR
        "set BGP community list (for deletion)\n"
        "Community-list number (standard)\n"
@@ -2945,7 +2945,7 @@
 
 ALIAS (no_set_community_delete,
        no_set_community_delete_val_cmd,
-       "no set comm-list (<1-99>|<100-199>|WORD) delete",
+       "no set comm-list (<1-99>|<100-500>|WORD) delete",
        NO_STR
        SET_STR
        "set BGP community list (for deletion)\n"
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 58aec8e..412b91d 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -9597,52 +9597,40 @@
   return CMD_SUCCESS;
 }
 
-/* Community-list delete with name.  */
-int
-community_list_unset_all_vty (struct vty *vty, const char *name)
-{
-  int ret;
-
-  ret = community_list_unset (bgp_clist, name, NULL, 0, COMMUNITY_LIST_AUTO);
-
-  if (ret < 0)
-    {
-      community_list_perror (vty, ret);
-      return CMD_WARNING;
-    }
-  return CMD_SUCCESS;
-}
-
 /* Communiyt-list entry delete.  */
 int
-community_list_unset_vty (struct vty *vty, int argc, const char **argv, 
-                          int style)
+community_list_unset_vty (struct vty *vty, int argc, const char **argv,
+			  int style)
 {
   int ret;
-  int direct;
-  char *str;
+  int direct = 0;
+  char *str = NULL;
 
-  /* Check the list direct. */
-  if (strncmp (argv[1], "p", 1) == 0)
-    direct = COMMUNITY_PERMIT;
-  else if (strncmp (argv[1], "d", 1) == 0)
-    direct = COMMUNITY_DENY;
-  else
+  if (argc > 1)
     {
-      vty_out (vty, "%% Matching condition must be permit or deny%s",
-	       VTY_NEWLINE);
-      return CMD_WARNING;
-    }
+      /* Check the list direct. */
+      if (strncmp (argv[1], "p", 1) == 0)
+	direct = COMMUNITY_PERMIT;
+      else if (strncmp (argv[1], "d", 1) == 0)
+	direct = COMMUNITY_DENY;
+      else
+	{
+	  vty_out (vty, "%% Matching condition must be permit or deny%s",
+		   VTY_NEWLINE);
+	  return CMD_WARNING;
+	}
 
-  /* Concat community string argument.  */
-  str = argv_concat (argv, argc, 2);
+      /* Concat community string argument.  */
+      str = argv_concat (argv, argc, 2);
+    }
 
   /* Unset community list.  */
   ret = community_list_unset (bgp_clist, argv[0], str, direct, style);
 
   /* Free temporary community list string allocated by
      argv_concat().  */
-  XFREE (MTYPE_TMP, str);
+  if (str)
+    XFREE (MTYPE_TMP, str);
 
   if (ret < 0)
     {
@@ -9657,19 +9645,6 @@
 #define COMMUNITY_LIST_STR "Add a community list entry\n"
 #define COMMUNITY_VAL_STR  "Community number in aa:nn format or internet|local-AS|no-advertise|no-export\n"
 
-DEFUN (ip_community_list,
-       ip_community_list_cmd,
-       "ip community-list WORD (deny|permit) .AA:NN",
-       IP_STR
-       COMMUNITY_LIST_STR
-       "Community list name\n"
-       "Specify community to reject\n"
-       "Specify community to accept\n"
-       COMMUNITY_VAL_STR)
-{
-  return community_list_set_vty (vty, argc, argv, COMMUNITY_LIST_AUTO, 1);
-}
-
 DEFUN (ip_community_list_standard,
        ip_community_list_standard_cmd,
        "ip community-list <1-99> (deny|permit) .AA:NN",
@@ -9694,7 +9669,7 @@
 
 DEFUN (ip_community_list_expanded,
        ip_community_list_expanded_cmd,
-       "ip community-list <100-199> (deny|permit) .LINE",
+       "ip community-list <100-500> (deny|permit) .LINE",
        IP_STR
        COMMUNITY_LIST_STR
        "Community list number (expanded)\n"
@@ -9743,44 +9718,50 @@
   return community_list_set_vty (vty, argc, argv, COMMUNITY_LIST_EXPANDED, 1);
 }
 
-DEFUN (no_ip_community_list_all,
-       no_ip_community_list_all_cmd,
-       "no ip community-list (WORD|<1-99>|<100-199>)",
+DEFUN (no_ip_community_list_standard_all,
+       no_ip_community_list_standard_all_cmd,
+       "no ip community-list <1-99>",
        NO_STR
        IP_STR
        COMMUNITY_LIST_STR
-       "Community list name\n"
-       "Community list number (standard)\n"
-       "Community list number (expanded)\n")
+       "Community list number (standard)\n")
 {
-  return community_list_unset_all_vty (vty, argv[0]);
+  return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_STANDARD);
 }
 
-DEFUN (no_ip_community_list_name_all,
-       no_ip_community_list_name_all_cmd,
-       "no ip community-list (standard|expanded) WORD",
+DEFUN (no_ip_community_list_expanded_all,
+       no_ip_community_list_expanded_all_cmd,
+       "no ip community-list <100-500>",
+       NO_STR
+       IP_STR
+       COMMUNITY_LIST_STR
+       "Community list number (expanded)\n")
+{
+  return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_EXPANDED);
+}
+
+DEFUN (no_ip_community_list_name_standard_all,
+       no_ip_community_list_name_standard_all_cmd,
+       "no ip community-list standard WORD",
        NO_STR
        IP_STR
        COMMUNITY_LIST_STR
        "Add a standard community-list entry\n"
-       "Add an expanded community-list entry\n"
        "Community list name\n")
 {
-  return community_list_unset_all_vty (vty, argv[1]);
+  return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_STANDARD);
 }
 
-DEFUN (no_ip_community_list,
-       no_ip_community_list_cmd,
-       "no ip community-list WORD (deny|permit) .AA:NN",
+DEFUN (no_ip_community_list_name_expanded_all,
+       no_ip_community_list_name_expanded_all_cmd,
+       "no ip community-list expanded WORD",
        NO_STR
        IP_STR
        COMMUNITY_LIST_STR
-       "Community list name\n"
-       "Specify community to reject\n"
-       "Specify community to accept\n"
-       COMMUNITY_VAL_STR)
+       "Add an expanded community-list entry\n"
+       "Community list name\n")
 {
-  return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_AUTO);
+  return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_EXPANDED);
 }
 
 DEFUN (no_ip_community_list_standard,
@@ -9799,7 +9780,7 @@
 
 DEFUN (no_ip_community_list_expanded,
        no_ip_community_list_expanded_cmd,
-       "no ip community-list <100-199> (deny|permit) .LINE",
+       "no ip community-list <100-500> (deny|permit) .LINE",
        NO_STR
        IP_STR
        COMMUNITY_LIST_STR
@@ -9883,7 +9864,7 @@
   struct community_list *list;
   struct community_list_master *cm;
 
-  cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_AUTO);
+  cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_MASTER);
   if (! cm)
     return CMD_SUCCESS;
 
@@ -9898,7 +9879,7 @@
 
 DEFUN (show_ip_community_list_arg,
        show_ip_community_list_arg_cmd,
-       "show ip community-list (<1-199>|WORD)",
+       "show ip community-list (<1-500>|WORD)",
        SHOW_STR
        IP_STR
        "List community-list\n"
@@ -9907,7 +9888,7 @@
 {
   struct community_list *list;
 
-  list = community_list_lookup (bgp_clist, argv[0], COMMUNITY_LIST_AUTO);
+  list = community_list_lookup (bgp_clist, argv[0], COMMUNITY_LIST_MASTER);
   if (! list)
     {
       vty_out (vty, "%% Can't find communit-list%s", VTY_NEWLINE);
@@ -9968,49 +9949,38 @@
 }
 
 int
-extcommunity_list_unset_all_vty (struct vty *vty, const char *name)
+extcommunity_list_unset_vty (struct vty *vty, int argc, const char **argv,
+			     int style)
 {
   int ret;
+  int direct = 0;
+  char *str = NULL;
 
-  ret = extcommunity_list_unset (bgp_clist, name, NULL, 0, EXTCOMMUNITY_LIST_AUTO);
-
-  if (ret < 0)
+  if (argc > 1)
     {
-      community_list_perror (vty, ret);
-      return CMD_WARNING;
+      /* Check the list direct. */
+      if (strncmp (argv[1], "p", 1) == 0)
+	direct = COMMUNITY_PERMIT;
+      else if (strncmp (argv[1], "d", 1) == 0)
+	direct = COMMUNITY_DENY;
+      else
+	{
+	  vty_out (vty, "%% Matching condition must be permit or deny%s",
+		   VTY_NEWLINE);
+	  return CMD_WARNING;
+	}
+
+      /* Concat community string argument.  */
+      str = argv_concat (argv, argc, 2);
     }
-  return CMD_SUCCESS;
-}
-
-int
-extcommunity_list_unset_vty (struct vty *vty, int argc, const char **argv, 
-                             int style)
-{
-  int ret;
-  int direct;
-  char *str;
-
-  /* Check the list direct. */
-  if (strncmp (argv[1], "p", 1) == 0)
-    direct = COMMUNITY_PERMIT;
-  else if (strncmp (argv[1], "d", 1) == 0)
-    direct = COMMUNITY_DENY;
-  else
-    {
-      vty_out (vty, "%% Matching condition must be permit or deny%s",
-	       VTY_NEWLINE);
-      return CMD_WARNING;
-    }
-
-  /* Concat community string argument.  */
-  str = argv_concat (argv, argc, 2);
 
   /* Unset community list.  */
   ret = extcommunity_list_unset (bgp_clist, argv[0], str, direct, style);
 
   /* Free temporary community list string allocated by
      argv_concat().  */
-  XFREE (MTYPE_TMP, str);
+  if (str)
+    XFREE (MTYPE_TMP, str);
 
   if (ret < 0)
     {
@@ -10049,7 +10019,7 @@
 
 DEFUN (ip_extcommunity_list_expanded,
        ip_extcommunity_list_expanded_cmd,
-       "ip extcommunity-list <100-199> (deny|permit) .LINE",
+       "ip extcommunity-list <100-500> (deny|permit) .LINE",
        IP_STR
        EXTCOMMUNITY_LIST_STR
        "Extended Community list number (expanded)\n"
@@ -10098,29 +10068,50 @@
   return extcommunity_list_set_vty (vty, argc, argv, EXTCOMMUNITY_LIST_EXPANDED, 1);
 }
 
-DEFUN (no_ip_extcommunity_list_all,
-       no_ip_extcommunity_list_all_cmd,
-       "no ip extcommunity-list (<1-99>|<100-199>)",
+DEFUN (no_ip_extcommunity_list_standard_all,
+       no_ip_extcommunity_list_standard_all_cmd,
+       "no ip extcommunity-list <1-99>",
        NO_STR
        IP_STR
        EXTCOMMUNITY_LIST_STR
-       "Extended Community list number (standard)\n"
-       "Extended Community list number (expanded)\n")
+       "Extended Community list number (standard)\n")
 {
-  return extcommunity_list_unset_all_vty (vty, argv[0]);
+  return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_STANDARD);
 }
 
-DEFUN (no_ip_extcommunity_list_name_all,
-       no_ip_extcommunity_list_name_all_cmd,
-       "no ip extcommunity-list (standard|expanded) WORD",
+DEFUN (no_ip_extcommunity_list_expanded_all,
+       no_ip_extcommunity_list_expanded_all_cmd,
+       "no ip extcommunity-list <100-500>",
+       NO_STR
+       IP_STR
+       EXTCOMMUNITY_LIST_STR
+       "Extended Community list number (expanded)\n")
+{
+  return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_EXPANDED);
+}
+
+DEFUN (no_ip_extcommunity_list_name_standard_all,
+       no_ip_extcommunity_list_name_standard_all_cmd,
+       "no ip extcommunity-list standard WORD",
        NO_STR
        IP_STR
        EXTCOMMUNITY_LIST_STR
        "Specify standard extcommunity-list\n"
+       "Extended Community list name\n")
+{
+  return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_STANDARD);
+}
+
+DEFUN (no_ip_extcommunity_list_name_expanded_all,
+       no_ip_extcommunity_list_name_expanded_all_cmd,
+       "no ip extcommunity-list expanded WORD",
+       NO_STR
+       IP_STR
+       EXTCOMMUNITY_LIST_STR
        "Specify expanded extcommunity-list\n"
        "Extended Community list name\n")
 {
-  return extcommunity_list_unset_all_vty (vty, argv[1]);
+  return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_EXPANDED);
 }
 
 DEFUN (no_ip_extcommunity_list_standard,
@@ -10139,7 +10130,7 @@
 
 DEFUN (no_ip_extcommunity_list_expanded,
        no_ip_extcommunity_list_expanded_cmd,
-       "no ip extcommunity-list <100-199> (deny|permit) .LINE",
+       "no ip extcommunity-list <100-500> (deny|permit) .LINE",
        NO_STR
        IP_STR
        EXTCOMMUNITY_LIST_STR
@@ -10223,7 +10214,7 @@
   struct community_list *list;
   struct community_list_master *cm;
 
-  cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_AUTO);
+  cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_MASTER);
   if (! cm)
     return CMD_SUCCESS;
 
@@ -10238,7 +10229,7 @@
 
 DEFUN (show_ip_extcommunity_list_arg,
        show_ip_extcommunity_list_arg_cmd,
-       "show ip extcommunity-list (<1-199>|WORD)",
+       "show ip extcommunity-list (<1-500>|WORD)",
        SHOW_STR
        IP_STR
        "List extended-community list\n"
@@ -10247,7 +10238,7 @@
 {
   struct community_list *list;
 
-  list = community_list_lookup (bgp_clist, argv[0], EXTCOMMUNITY_LIST_AUTO);
+  list = community_list_lookup (bgp_clist, argv[0], EXTCOMMUNITY_LIST_MASTER);
   if (! list)
     {
       vty_out (vty, "%% Can't find extcommunit-list%s", VTY_NEWLINE);
@@ -10287,23 +10278,15 @@
   int write = 0;
 
   /* Community-list.  */
-  cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_AUTO);
+  cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_MASTER);
 
   for (list = cm->num.head; list; list = list->next)
     for (entry = list->head; entry; entry = entry->next)
       {
-	if (atol (list->name) < 200)
-	  vty_out (vty, "ip community-list %s %s %s%s",
-		   list->name, community_direct_str (entry->direct),
-		   community_list_config_str (entry),
-		   VTY_NEWLINE);
-	else
-	  vty_out (vty, "ip community-list %s %s %s %s%s",
-		   entry->style == COMMUNITY_LIST_STANDARD
-		   ? "standard" : "expanded",
-		   list->name, community_direct_str (entry->direct),
-		   community_list_config_str (entry),
-		   VTY_NEWLINE);
+	vty_out (vty, "ip community-list %s %s %s%s",
+		 list->name, community_direct_str (entry->direct),
+		 community_list_config_str (entry),
+		 VTY_NEWLINE);
 	write++;
       }
   for (list = cm->str.head; list; list = list->next)
@@ -10319,21 +10302,14 @@
       }
 
   /* Extcommunity-list.  */
-  cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_AUTO);
+  cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_MASTER);
 
   for (list = cm->num.head; list; list = list->next)
     for (entry = list->head; entry; entry = entry->next)
       {
-	if (atol (list->name) < 200)
-	  vty_out (vty, "ip extcommunity-list %s %s %s%s",
-		   list->name, community_direct_str (entry->direct),
-		   community_list_config_str (entry), VTY_NEWLINE);
-	else
-	  vty_out (vty, "ip extcommunity-list %s %s %s %s%s",
-		   entry->style == EXTCOMMUNITY_LIST_STANDARD
-		   ? "standard" : "expanded",
-		   list->name, community_direct_str (entry->direct),
-		   community_list_config_str (entry), VTY_NEWLINE);
+	vty_out (vty, "ip extcommunity-list %s %s %s%s",
+		 list->name, community_direct_str (entry->direct),
+		 community_list_config_str (entry), VTY_NEWLINE);
 	write++;
       }
   for (list = cm->str.head; list; list = list->next)
@@ -10362,16 +10338,16 @@
   install_node (&community_list_node, community_list_config_write);
 
   /* Community-list.  */
-  install_element (CONFIG_NODE, &ip_community_list_cmd);
   install_element (CONFIG_NODE, &ip_community_list_standard_cmd);
   install_element (CONFIG_NODE, &ip_community_list_standard2_cmd);
   install_element (CONFIG_NODE, &ip_community_list_expanded_cmd);
   install_element (CONFIG_NODE, &ip_community_list_name_standard_cmd);
   install_element (CONFIG_NODE, &ip_community_list_name_standard2_cmd);
   install_element (CONFIG_NODE, &ip_community_list_name_expanded_cmd);
-  install_element (CONFIG_NODE, &no_ip_community_list_all_cmd);
-  install_element (CONFIG_NODE, &no_ip_community_list_name_all_cmd);
-  install_element (CONFIG_NODE, &no_ip_community_list_cmd);
+  install_element (CONFIG_NODE, &no_ip_community_list_standard_all_cmd);
+  install_element (CONFIG_NODE, &no_ip_community_list_expanded_all_cmd);
+  install_element (CONFIG_NODE, &no_ip_community_list_name_standard_all_cmd);
+  install_element (CONFIG_NODE, &no_ip_community_list_name_expanded_all_cmd);
   install_element (CONFIG_NODE, &no_ip_community_list_standard_cmd);
   install_element (CONFIG_NODE, &no_ip_community_list_expanded_cmd);
   install_element (CONFIG_NODE, &no_ip_community_list_name_standard_cmd);
@@ -10388,8 +10364,10 @@
   install_element (CONFIG_NODE, &ip_extcommunity_list_name_standard_cmd);
   install_element (CONFIG_NODE, &ip_extcommunity_list_name_standard2_cmd);
   install_element (CONFIG_NODE, &ip_extcommunity_list_name_expanded_cmd);
-  install_element (CONFIG_NODE, &no_ip_extcommunity_list_all_cmd);
-  install_element (CONFIG_NODE, &no_ip_extcommunity_list_name_all_cmd);
+  install_element (CONFIG_NODE, &no_ip_extcommunity_list_standard_all_cmd);
+  install_element (CONFIG_NODE, &no_ip_extcommunity_list_expanded_all_cmd);
+  install_element (CONFIG_NODE, &no_ip_extcommunity_list_name_standard_all_cmd);
+  install_element (CONFIG_NODE, &no_ip_extcommunity_list_name_expanded_all_cmd);
   install_element (CONFIG_NODE, &no_ip_extcommunity_list_standard_cmd);
   install_element (CONFIG_NODE, &no_ip_extcommunity_list_expanded_cmd);
   install_element (CONFIG_NODE, &no_ip_extcommunity_list_name_standard_cmd);