diff options
Diffstat (limited to 'bgpd/bgp_clist.c')
| -rw-r--r-- | bgpd/bgp_clist.c | 1869 | 
1 files changed, 896 insertions, 973 deletions
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c index 3def97c73d..795fe5d3f4 100644 --- a/bgpd/bgp_clist.c +++ b/bgpd/bgp_clist.c @@ -37,534 +37,512 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  /* Lookup master structure for community-list or     extcommunity-list.  */  struct community_list_master * -community_list_master_lookup (struct community_list_handler *ch, int master) +community_list_master_lookup(struct community_list_handler *ch, int master)  { -  if (ch) -    switch (master) -      { -      case COMMUNITY_LIST_MASTER: -        return &ch->community_list; -      case EXTCOMMUNITY_LIST_MASTER: -        return &ch->extcommunity_list; -      case LARGE_COMMUNITY_LIST_MASTER: -        return &ch->lcommunity_list; -      } -  return NULL; +	if (ch) +		switch (master) { +		case COMMUNITY_LIST_MASTER: +			return &ch->community_list; +		case EXTCOMMUNITY_LIST_MASTER: +			return &ch->extcommunity_list; +		case LARGE_COMMUNITY_LIST_MASTER: +			return &ch->lcommunity_list; +		} +	return NULL;  }  /* Allocate a new community list entry.  */ -static struct community_entry * -community_entry_new (void) +static struct community_entry *community_entry_new(void)  { -  return XCALLOC (MTYPE_COMMUNITY_LIST_ENTRY, sizeof (struct community_entry)); +	return XCALLOC(MTYPE_COMMUNITY_LIST_ENTRY, +		       sizeof(struct community_entry));  }  /* Free community list entry.  */ -static void -community_entry_free (struct community_entry *entry) +static void community_entry_free(struct community_entry *entry)  { -  switch (entry->style) -    { -    case COMMUNITY_LIST_STANDARD: -      if (entry->u.com) -        community_free (entry->u.com); -      break; -    case LARGE_COMMUNITY_LIST_STANDARD: -      if (entry->u.lcom) -        lcommunity_free (&entry->u.lcom); -      break; -    case EXTCOMMUNITY_LIST_STANDARD: -      /* In case of standard extcommunity-list, configuration string -         is made by ecommunity_ecom2str().  */ -      if (entry->config) -        XFREE (MTYPE_ECOMMUNITY_STR, entry->config); -      if (entry->u.ecom) -        ecommunity_free (&entry->u.ecom); -      break; -    case COMMUNITY_LIST_EXPANDED: -    case EXTCOMMUNITY_LIST_EXPANDED: -    case LARGE_COMMUNITY_LIST_EXPANDED: -      if (entry->config) -        XFREE (MTYPE_COMMUNITY_LIST_CONFIG, entry->config); -      if (entry->reg) -        bgp_regex_free (entry->reg); -    default: -      break; -    } -  XFREE (MTYPE_COMMUNITY_LIST_ENTRY, entry); +	switch (entry->style) { +	case COMMUNITY_LIST_STANDARD: +		if (entry->u.com) +			community_free(entry->u.com); +		break; +	case LARGE_COMMUNITY_LIST_STANDARD: +		if (entry->u.lcom) +			lcommunity_free(&entry->u.lcom); +		break; +	case EXTCOMMUNITY_LIST_STANDARD: +		/* In case of standard extcommunity-list, configuration string +		   is made by ecommunity_ecom2str().  */ +		if (entry->config) +			XFREE(MTYPE_ECOMMUNITY_STR, entry->config); +		if (entry->u.ecom) +			ecommunity_free(&entry->u.ecom); +		break; +	case COMMUNITY_LIST_EXPANDED: +	case EXTCOMMUNITY_LIST_EXPANDED: +	case LARGE_COMMUNITY_LIST_EXPANDED: +		if (entry->config) +			XFREE(MTYPE_COMMUNITY_LIST_CONFIG, entry->config); +		if (entry->reg) +			bgp_regex_free(entry->reg); +	default: +		break; +	} +	XFREE(MTYPE_COMMUNITY_LIST_ENTRY, entry);  }  /* Allocate a new community-list.  */ -static struct community_list * -community_list_new (void) +static struct community_list *community_list_new(void)  { -  return XCALLOC (MTYPE_COMMUNITY_LIST, sizeof (struct community_list)); +	return XCALLOC(MTYPE_COMMUNITY_LIST, sizeof(struct community_list));  }  /* Free community-list.  */ -static void -community_list_free (struct community_list *list) +static void community_list_free(struct community_list *list)  { -  if (list->name) -    XFREE (MTYPE_COMMUNITY_LIST_NAME, list->name); -  XFREE (MTYPE_COMMUNITY_LIST, list); +	if (list->name) +		XFREE(MTYPE_COMMUNITY_LIST_NAME, list->name); +	XFREE(MTYPE_COMMUNITY_LIST, list);  }  static struct community_list * -community_list_insert (struct community_list_handler *ch, -		       const char *name, int master) +community_list_insert(struct community_list_handler *ch, const char *name, +		      int master)  { -  size_t i; -  long number; -  struct community_list *new; -  struct community_list *point; -  struct community_list_list *list; -  struct community_list_master *cm; - -  /* Lookup community-list master.  */ -  cm = community_list_master_lookup (ch, master); -  if (!cm) -    return NULL; - -  /* Allocate new community_list and copy given name. */ -  new = community_list_new (); -  new->name = XSTRDUP (MTYPE_COMMUNITY_LIST_NAME, name); - -  /* If name is made by all digit character.  We treat it as -     number. */ -  for (number = 0, i = 0; i < strlen (name); i++) -    { -      if (isdigit ((int) name[i])) -        number = (number * 10) + (name[i] - '0'); -      else -        break; -    } +	size_t i; +	long number; +	struct community_list *new; +	struct community_list *point; +	struct community_list_list *list; +	struct community_list_master *cm; + +	/* Lookup community-list master.  */ +	cm = community_list_master_lookup(ch, master); +	if (!cm) +		return NULL; + +	/* Allocate new community_list and copy given name. */ +	new = community_list_new(); +	new->name = XSTRDUP(MTYPE_COMMUNITY_LIST_NAME, name); + +	/* If name is made by all digit character.  We treat it as +	   number. */ +	for (number = 0, i = 0; i < strlen(name); i++) { +		if (isdigit((int)name[i])) +			number = (number * 10) + (name[i] - '0'); +		else +			break; +	} -  /* In case of name is all digit character */ -  if (i == strlen (name)) -    { -      new->sort = COMMUNITY_LIST_NUMBER; +	/* In case of name is all digit character */ +	if (i == strlen(name)) { +		new->sort = COMMUNITY_LIST_NUMBER; -      /* Set access_list to number list. */ -      list = &cm->num; +		/* Set access_list to number list. */ +		list = &cm->num; -      for (point = list->head; point; point = point->next) -        if (atol (point->name) >= number) -          break; -    } -  else -    { -      new->sort = COMMUNITY_LIST_STRING; +		for (point = list->head; point; point = point->next) +			if (atol(point->name) >= number) +				break; +	} else { +		new->sort = COMMUNITY_LIST_STRING; -      /* Set access_list to string list. */ -      list = &cm->str; +		/* Set access_list to string list. */ +		list = &cm->str; -      /* Set point to insertion point. */ -      for (point = list->head; point; point = point->next) -        if (strcmp (point->name, name) >= 0) -          break; -    } +		/* Set point to insertion point. */ +		for (point = list->head; point; point = point->next) +			if (strcmp(point->name, name) >= 0) +				break; +	} -  /* Link to upper list.  */ -  new->parent = list; +	/* Link to upper list.  */ +	new->parent = list; -  /* In case of this is the first element of master. */ -  if (list->head == NULL) -    { -      list->head = list->tail = new; -      return new; -    } +	/* In case of this is the first element of master. */ +	if (list->head == NULL) { +		list->head = list->tail = new; +		return new; +	} -  /* In case of insertion is made at the tail of access_list. */ -  if (point == NULL) -    { -      new->prev = list->tail; -      list->tail->next = new; -      list->tail = new; -      return new; -    } +	/* In case of insertion is made at the tail of access_list. */ +	if (point == NULL) { +		new->prev = list->tail; +		list->tail->next = new; +		list->tail = new; +		return new; +	} -  /* In case of insertion is made at the head of access_list. */ -  if (point == list->head) -    { -      new->next = list->head; -      list->head->prev = new; -      list->head = new; -      return new; -    } +	/* In case of insertion is made at the head of access_list. */ +	if (point == list->head) { +		new->next = list->head; +		list->head->prev = new; +		list->head = new; +		return new; +	} -  /* Insertion is made at middle of the access_list. */ -  new->next = point; -  new->prev = point->prev; +	/* Insertion is made at middle of the access_list. */ +	new->next = point; +	new->prev = point->prev; -  if (point->prev) -    point->prev->next = new; -  point->prev = new; +	if (point->prev) +		point->prev->next = new; +	point->prev = new; -  return new; +	return new;  } -struct community_list * -community_list_lookup (struct community_list_handler *ch, -		       const char *name, int master) +struct community_list *community_list_lookup(struct community_list_handler *ch, +					     const char *name, int master)  { -  struct community_list *list; -  struct community_list_master *cm; +	struct community_list *list; +	struct community_list_master *cm; -  if (!name) -    return NULL; +	if (!name) +		return NULL; -  cm = community_list_master_lookup (ch, master); -  if (!cm) -    return NULL; +	cm = community_list_master_lookup(ch, master); +	if (!cm) +		return NULL; -  for (list = cm->num.head; list; list = list->next) -    if (strcmp (list->name, name) == 0) -      return list; -  for (list = cm->str.head; list; list = list->next) -    if (strcmp (list->name, name) == 0) -      return list; +	for (list = cm->num.head; list; list = list->next) +		if (strcmp(list->name, name) == 0) +			return list; +	for (list = cm->str.head; list; list = list->next) +		if (strcmp(list->name, name) == 0) +			return list; -  return NULL; +	return NULL;  }  static struct community_list * -community_list_get (struct community_list_handler *ch, -		    const char *name, int master) +community_list_get(struct community_list_handler *ch, const char *name, +		   int master)  { -  struct community_list *list; +	struct community_list *list; -  list = community_list_lookup (ch, name, master); -  if (!list) -    list = community_list_insert (ch, name, master); -  return list; +	list = community_list_lookup(ch, name, master); +	if (!list) +		list = community_list_insert(ch, name, master); +	return list;  } -static void -community_list_delete (struct community_list *list) +static void community_list_delete(struct community_list *list)  { -  struct community_list_list *clist; -  struct community_entry *entry, *next; +	struct community_list_list *clist; +	struct community_entry *entry, *next; -  for (entry = list->head; entry; entry = next) -    { -      next = entry->next; -      community_entry_free (entry); -    } +	for (entry = list->head; entry; entry = next) { +		next = entry->next; +		community_entry_free(entry); +	} -  clist = list->parent; +	clist = list->parent; -  if (list->next) -    list->next->prev = list->prev; -  else -    clist->tail = list->prev; +	if (list->next) +		list->next->prev = list->prev; +	else +		clist->tail = list->prev; -  if (list->prev) -    list->prev->next = list->next; -  else -    clist->head = list->next; +	if (list->prev) +		list->prev->next = list->next; +	else +		clist->head = list->next; -  community_list_free (list); +	community_list_free(list);  } -static int -community_list_empty_p (struct community_list *list) +static int community_list_empty_p(struct community_list *list)  { -  return (list->head == NULL && list->tail == NULL) ? 1 : 0; +	return (list->head == NULL && list->tail == NULL) ? 1 : 0;  }  /* Add community-list entry to the list.  */ -static void -community_list_entry_add (struct community_list *list, -                          struct community_entry *entry) +static void community_list_entry_add(struct community_list *list, +				     struct community_entry *entry)  { -  entry->next = NULL; -  entry->prev = list->tail; - -  if (list->tail) -    list->tail->next = entry; -  else -    list->head = entry; -  list->tail = entry; +	entry->next = NULL; +	entry->prev = list->tail; + +	if (list->tail) +		list->tail->next = entry; +	else +		list->head = entry; +	list->tail = entry;  }  /* Delete community-list entry from the list.  */ -static void -community_list_entry_delete (struct community_list *list, -                             struct community_entry *entry, int style) +static void community_list_entry_delete(struct community_list *list, +					struct community_entry *entry, +					int style)  { -  if (entry->next) -    entry->next->prev = entry->prev; -  else -    list->tail = entry->prev; +	if (entry->next) +		entry->next->prev = entry->prev; +	else +		list->tail = entry->prev; -  if (entry->prev) -    entry->prev->next = entry->next; -  else -    list->head = entry->next; +	if (entry->prev) +		entry->prev->next = entry->next; +	else +		list->head = entry->next; -  community_entry_free (entry); +	community_entry_free(entry); -  if (community_list_empty_p (list)) -    community_list_delete (list); +	if (community_list_empty_p(list)) +		community_list_delete(list);  }  /* Lookup community-list entry from the list.  */  static struct community_entry * -community_list_entry_lookup (struct community_list *list, const void *arg, -                             int direct) +community_list_entry_lookup(struct community_list *list, const void *arg, +			    int direct)  { -  struct community_entry *entry; - -  for (entry = list->head; entry; entry = entry->next) -    { -      switch (entry->style) -        { -        case COMMUNITY_LIST_STANDARD: -          if (entry->direct == direct && community_cmp (entry->u.com, arg)) -            return entry; -          break; -        case EXTCOMMUNITY_LIST_STANDARD: -          if (entry->direct == direct && ecommunity_cmp (entry->u.ecom, arg)) -            return entry; -          break; -        case LARGE_COMMUNITY_LIST_STANDARD: -          if (entry->direct == direct && lcommunity_cmp (entry->u.lcom, arg)) -            return entry; -          break; -        case COMMUNITY_LIST_EXPANDED: -        case EXTCOMMUNITY_LIST_EXPANDED: -        case LARGE_COMMUNITY_LIST_EXPANDED: -          if (entry->direct == direct && strcmp (entry->config, arg) == 0) -            return entry; -          break; -        default: -          break; -        } -    } -  return NULL; +	struct community_entry *entry; + +	for (entry = list->head; entry; entry = entry->next) { +		switch (entry->style) { +		case COMMUNITY_LIST_STANDARD: +			if (entry->direct == direct +			    && community_cmp(entry->u.com, arg)) +				return entry; +			break; +		case EXTCOMMUNITY_LIST_STANDARD: +			if (entry->direct == direct +			    && ecommunity_cmp(entry->u.ecom, arg)) +				return entry; +			break; +		case LARGE_COMMUNITY_LIST_STANDARD: +			if (entry->direct == direct +			    && lcommunity_cmp(entry->u.lcom, arg)) +				return entry; +			break; +		case COMMUNITY_LIST_EXPANDED: +		case EXTCOMMUNITY_LIST_EXPANDED: +		case LARGE_COMMUNITY_LIST_EXPANDED: +			if (entry->direct == direct +			    && strcmp(entry->config, arg) == 0) +				return entry; +			break; +		default: +			break; +		} +	} +	return NULL;  } -static char * -community_str_get (struct community *com, int i) +static char *community_str_get(struct community *com, int i)  { -  int len; -  u_int32_t comval; -  u_int16_t as; -  u_int16_t val; -  char *str; -  char *pnt; - -  memcpy (&comval, com_nthval (com, i), sizeof (u_int32_t)); -  comval = ntohl (comval); - -  switch (comval) -    { -      case COMMUNITY_INTERNET: -        len = strlen (" internet"); -        break; -      case COMMUNITY_NO_EXPORT: -        len = strlen (" no-export"); -        break; -      case COMMUNITY_NO_ADVERTISE: -        len = strlen (" no-advertise"); -        break; -      case COMMUNITY_LOCAL_AS: -        len = strlen (" local-AS"); -        break; -      default: -        len = strlen (" 65536:65535"); -        break; -    } - -  /* Allocate memory.  */ -  str = pnt = XMALLOC (MTYPE_COMMUNITY_STR, len); +	int len; +	u_int32_t comval; +	u_int16_t as; +	u_int16_t val; +	char *str; +	char *pnt; + +	memcpy(&comval, com_nthval(com, i), sizeof(u_int32_t)); +	comval = ntohl(comval); + +	switch (comval) { +	case COMMUNITY_INTERNET: +		len = strlen(" internet"); +		break; +	case COMMUNITY_NO_EXPORT: +		len = strlen(" no-export"); +		break; +	case COMMUNITY_NO_ADVERTISE: +		len = strlen(" no-advertise"); +		break; +	case COMMUNITY_LOCAL_AS: +		len = strlen(" local-AS"); +		break; +	default: +		len = strlen(" 65536:65535"); +		break; +	} -  switch (comval) -    { -      case COMMUNITY_INTERNET: -        strcpy (pnt, "internet"); -        pnt += strlen ("internet"); -        break; -      case COMMUNITY_NO_EXPORT: -        strcpy (pnt, "no-export"); -        pnt += strlen ("no-export"); -        break; -      case COMMUNITY_NO_ADVERTISE: -        strcpy (pnt, "no-advertise"); -        pnt += strlen ("no-advertise"); -        break; -      case COMMUNITY_LOCAL_AS: -        strcpy (pnt, "local-AS"); -        pnt += strlen ("local-AS"); -        break; -      default: -        as = (comval >> 16) & 0xFFFF; -        val = comval & 0xFFFF; -        sprintf (pnt, "%u:%d", as, val); -        pnt += strlen (pnt); -        break; -    } +	/* Allocate memory.  */ +	str = pnt = XMALLOC(MTYPE_COMMUNITY_STR, len); + +	switch (comval) { +	case COMMUNITY_INTERNET: +		strcpy(pnt, "internet"); +		pnt += strlen("internet"); +		break; +	case COMMUNITY_NO_EXPORT: +		strcpy(pnt, "no-export"); +		pnt += strlen("no-export"); +		break; +	case COMMUNITY_NO_ADVERTISE: +		strcpy(pnt, "no-advertise"); +		pnt += strlen("no-advertise"); +		break; +	case COMMUNITY_LOCAL_AS: +		strcpy(pnt, "local-AS"); +		pnt += strlen("local-AS"); +		break; +	default: +		as = (comval >> 16) & 0xFFFF; +		val = comval & 0xFFFF; +		sprintf(pnt, "%u:%d", as, val); +		pnt += strlen(pnt); +		break; +	} -  *pnt = '\0'; +	*pnt = '\0'; -  return str; +	return str;  }  /* Internal function to perform regular expression match for   * a single community. */ -static int -community_regexp_include (regex_t * reg, struct community *com, int i) +static int community_regexp_include(regex_t *reg, struct community *com, int i)  { -  char *str; -  int rv; +	char *str; +	int rv; -  /* When there is no communities attribute it is treated as empty string. */ -  if (com == NULL || com->size == 0) -    str = XSTRDUP(MTYPE_COMMUNITY_STR, ""); -  else -    str = community_str_get (com, i); +	/* When there is no communities attribute it is treated as empty string. +	 */ +	if (com == NULL || com->size == 0) +		str = XSTRDUP(MTYPE_COMMUNITY_STR, ""); +	else +		str = community_str_get(com, i); -  /* Regular expression match.  */ -  rv = regexec (reg, str, 0, NULL, 0); +	/* Regular expression match.  */ +	rv = regexec(reg, str, 0, NULL, 0); -  XFREE(MTYPE_COMMUNITY_STR, str); +	XFREE(MTYPE_COMMUNITY_STR, str); -  if (rv == 0) -    return 1; +	if (rv == 0) +		return 1; -  /* No match.  */ -  return 0; +	/* No match.  */ +	return 0;  }  /* Internal function to perform regular expression match for community     attribute.  */ -static int -community_regexp_match (struct community *com, regex_t * reg) +static int community_regexp_match(struct community *com, regex_t *reg)  { -  const char *str; +	const char *str; -  /* When there is no communities attribute it is treated as empty -     string.  */ -  if (com == NULL || com->size == 0) -    str = ""; -  else -    str = community_str (com); +	/* When there is no communities attribute it is treated as empty +	   string.  */ +	if (com == NULL || com->size == 0) +		str = ""; +	else +		str = community_str(com); -  /* Regular expression match.  */ -  if (regexec (reg, str, 0, NULL, 0) == 0) -    return 1; +	/* Regular expression match.  */ +	if (regexec(reg, str, 0, NULL, 0) == 0) +		return 1; -  /* No match.  */ -  return 0; +	/* No match.  */ +	return 0;  } -static char * -lcommunity_str_get (struct lcommunity *lcom, int i) +static char *lcommunity_str_get(struct lcommunity *lcom, int i)  { -  struct lcommunity_val lcomval; -  u_int32_t globaladmin; -  u_int32_t localdata1; -  u_int32_t localdata2; -  char *str; -  u_char *ptr; -  char *pnt; - -  ptr = lcom->val; -  ptr += (i * LCOMMUNITY_SIZE); - -  memcpy (&lcomval, ptr, LCOMMUNITY_SIZE); - -  /* Allocate memory.  48 bytes taken off bgp_lcommunity.c */ -  str = pnt = XMALLOC (MTYPE_LCOMMUNITY_STR, 48); - -  ptr = (u_char *)lcomval.val; -  globaladmin = (*ptr++ << 24); -  globaladmin |= (*ptr++ << 16); -  globaladmin |= (*ptr++ << 8); -  globaladmin |= (*ptr++); - -  localdata1 = (*ptr++ << 24); -  localdata1 |= (*ptr++ << 16); -  localdata1 |= (*ptr++ << 8); -  localdata1 |= (*ptr++); - -  localdata2 = (*ptr++ << 24); -  localdata2 |= (*ptr++ << 16); -  localdata2 |= (*ptr++ << 8); -  localdata2 |= (*ptr++); - -  sprintf (pnt, "%u:%u:%u", globaladmin, localdata1, localdata2); -  pnt += strlen (pnt); -  *pnt = '\0'; - -  return str; +	struct lcommunity_val lcomval; +	u_int32_t globaladmin; +	u_int32_t localdata1; +	u_int32_t localdata2; +	char *str; +	u_char *ptr; +	char *pnt; + +	ptr = lcom->val; +	ptr += (i * LCOMMUNITY_SIZE); + +	memcpy(&lcomval, ptr, LCOMMUNITY_SIZE); + +	/* Allocate memory.  48 bytes taken off bgp_lcommunity.c */ +	str = pnt = XMALLOC(MTYPE_LCOMMUNITY_STR, 48); + +	ptr = (u_char *)lcomval.val; +	globaladmin = (*ptr++ << 24); +	globaladmin |= (*ptr++ << 16); +	globaladmin |= (*ptr++ << 8); +	globaladmin |= (*ptr++); + +	localdata1 = (*ptr++ << 24); +	localdata1 |= (*ptr++ << 16); +	localdata1 |= (*ptr++ << 8); +	localdata1 |= (*ptr++); + +	localdata2 = (*ptr++ << 24); +	localdata2 |= (*ptr++ << 16); +	localdata2 |= (*ptr++ << 8); +	localdata2 |= (*ptr++); + +	sprintf(pnt, "%u:%u:%u", globaladmin, localdata1, localdata2); +	pnt += strlen(pnt); +	*pnt = '\0'; + +	return str;  }  /* Internal function to perform regular expression match for   * a single community. */ -static int -lcommunity_regexp_include (regex_t * reg, struct lcommunity *lcom, int i) +static int lcommunity_regexp_include(regex_t *reg, struct lcommunity *lcom, +				     int i)  { -  char *str; - -  /* When there is no communities attribute it is treated as empty string. */ -  if (lcom == NULL || lcom->size == 0) -    str = XSTRDUP (MTYPE_LCOMMUNITY_STR, ""); -  else -    str = lcommunity_str_get (lcom, i); - -  /* Regular expression match.  */ -  if (regexec (reg, str, 0, NULL, 0) == 0) -    { -      XFREE (MTYPE_LCOMMUNITY_STR, str); -      return 1; -    } +	char *str; + +	/* When there is no communities attribute it is treated as empty string. +	 */ +	if (lcom == NULL || lcom->size == 0) +		str = XSTRDUP(MTYPE_LCOMMUNITY_STR, ""); +	else +		str = lcommunity_str_get(lcom, i); + +	/* Regular expression match.  */ +	if (regexec(reg, str, 0, NULL, 0) == 0) { +		XFREE(MTYPE_LCOMMUNITY_STR, str); +		return 1; +	} -  XFREE (MTYPE_LCOMMUNITY_STR, str); -  /* No match.  */ -  return 0; +	XFREE(MTYPE_LCOMMUNITY_STR, str); +	/* No match.  */ +	return 0;  } -static int -lcommunity_regexp_match (struct lcommunity *com, regex_t * reg) +static int lcommunity_regexp_match(struct lcommunity *com, regex_t *reg)  { -  const char *str; +	const char *str; -  /* When there is no communities attribute it is treated as empty -     string.  */ -  if (com == NULL || com->size == 0) -    str = ""; -  else -    str = lcommunity_str (com); +	/* When there is no communities attribute it is treated as empty +	   string.  */ +	if (com == NULL || com->size == 0) +		str = ""; +	else +		str = lcommunity_str(com); -  /* Regular expression match.  */ -  if (regexec (reg, str, 0, NULL, 0) == 0) -    return 1; +	/* Regular expression match.  */ +	if (regexec(reg, str, 0, NULL, 0) == 0) +		return 1; -  /* No match.  */ -  return 0; +	/* No match.  */ +	return 0;  } -static int -ecommunity_regexp_match (struct ecommunity *ecom, regex_t * reg) +static int ecommunity_regexp_match(struct ecommunity *ecom, regex_t *reg)  { -  const char *str; +	const char *str; -  /* When there is no communities attribute it is treated as empty -     string.  */ -  if (ecom == NULL || ecom->size == 0) -    str = ""; -  else -    str = ecommunity_str (ecom); +	/* When there is no communities attribute it is treated as empty +	   string.  */ +	if (ecom == NULL || ecom->size == 0) +		str = ""; +	else +		str = ecommunity_str(ecom); -  /* Regular expression match.  */ -  if (regexec (reg, str, 0, NULL, 0) == 0) -    return 1; +	/* Regular expression match.  */ +	if (regexec(reg, str, 0, NULL, 0) == 0) +		return 1; -  /* No match.  */ -  return 0; +	/* No match.  */ +	return 0;  }  #if 0 @@ -619,665 +597,610 @@ community_regexp_delete (struct community *com, regex_t * reg)  /* When given community attribute matches to the community-list return     1 else return 0.  */ -int -community_list_match (struct community *com, struct community_list *list) +int community_list_match(struct community *com, struct community_list *list)  { -  struct community_entry *entry; - -  for (entry = list->head; entry; entry = entry->next) -    { -      if (entry->any) -        return entry->direct == COMMUNITY_PERMIT ? 1 : 0; - -      if (entry->style == COMMUNITY_LIST_STANDARD) -        { -          if (community_include (entry->u.com, COMMUNITY_INTERNET)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; - -          if (community_match (com, entry->u.com)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -      else if (entry->style == COMMUNITY_LIST_EXPANDED) -        { -          if (community_regexp_match (com, entry->reg)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -    } -  return 0; +	struct community_entry *entry; + +	for (entry = list->head; entry; entry = entry->next) { +		if (entry->any) +			return entry->direct == COMMUNITY_PERMIT ? 1 : 0; + +		if (entry->style == COMMUNITY_LIST_STANDARD) { +			if (community_include(entry->u.com, COMMUNITY_INTERNET)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; + +			if (community_match(com, entry->u.com)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} else if (entry->style == COMMUNITY_LIST_EXPANDED) { +			if (community_regexp_match(com, entry->reg)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} +	} +	return 0;  } -int -lcommunity_list_match (struct lcommunity *lcom, struct community_list *list) +int lcommunity_list_match(struct lcommunity *lcom, struct community_list *list)  { -  struct community_entry *entry; - -  for (entry = list->head; entry; entry = entry->next) -    { -      if (entry->any) -        return entry->direct == COMMUNITY_PERMIT ? 1 : 0; - -      if (entry->style == LARGE_COMMUNITY_LIST_STANDARD) -        { -          if (lcommunity_match (lcom, entry->u.lcom)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -      else if (entry->style == LARGE_COMMUNITY_LIST_EXPANDED) -        { -          if (lcommunity_regexp_match (lcom, entry->reg)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -    } -  return 0; +	struct community_entry *entry; + +	for (entry = list->head; entry; entry = entry->next) { +		if (entry->any) +			return entry->direct == COMMUNITY_PERMIT ? 1 : 0; + +		if (entry->style == LARGE_COMMUNITY_LIST_STANDARD) { +			if (lcommunity_match(lcom, entry->u.lcom)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} else if (entry->style == LARGE_COMMUNITY_LIST_EXPANDED) { +			if (lcommunity_regexp_match(lcom, entry->reg)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} +	} +	return 0;  } -int -ecommunity_list_match (struct ecommunity *ecom, struct community_list *list) +int ecommunity_list_match(struct ecommunity *ecom, struct community_list *list)  { -  struct community_entry *entry; - -  for (entry = list->head; entry; entry = entry->next) -    { -      if (entry->any) -        return entry->direct == COMMUNITY_PERMIT ? 1 : 0; - -      if (entry->style == EXTCOMMUNITY_LIST_STANDARD) -        { -          if (ecommunity_match (ecom, entry->u.ecom)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -      else if (entry->style == EXTCOMMUNITY_LIST_EXPANDED) -        { -          if (ecommunity_regexp_match (ecom, entry->reg)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -    } -  return 0; +	struct community_entry *entry; + +	for (entry = list->head; entry; entry = entry->next) { +		if (entry->any) +			return entry->direct == COMMUNITY_PERMIT ? 1 : 0; + +		if (entry->style == EXTCOMMUNITY_LIST_STANDARD) { +			if (ecommunity_match(ecom, entry->u.ecom)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} else if (entry->style == EXTCOMMUNITY_LIST_EXPANDED) { +			if (ecommunity_regexp_match(ecom, entry->reg)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} +	} +	return 0;  }  /* Perform exact matching.  In case of expanded community-list, do     same thing as community_list_match().  */ -int -community_list_exact_match (struct community *com, -                            struct community_list *list) +int community_list_exact_match(struct community *com, +			       struct community_list *list)  { -  struct community_entry *entry; - -  for (entry = list->head; entry; entry = entry->next) -    { -      if (entry->any) -        return entry->direct == COMMUNITY_PERMIT ? 1 : 0; - -      if (entry->style == COMMUNITY_LIST_STANDARD) -        { -          if (community_include (entry->u.com, COMMUNITY_INTERNET)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; - -          if (community_cmp (com, entry->u.com)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -      else if (entry->style == COMMUNITY_LIST_EXPANDED) -        { -          if (community_regexp_match (com, entry->reg)) -            return entry->direct == COMMUNITY_PERMIT ? 1 : 0; -        } -    } -  return 0; +	struct community_entry *entry; + +	for (entry = list->head; entry; entry = entry->next) { +		if (entry->any) +			return entry->direct == COMMUNITY_PERMIT ? 1 : 0; + +		if (entry->style == COMMUNITY_LIST_STANDARD) { +			if (community_include(entry->u.com, COMMUNITY_INTERNET)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; + +			if (community_cmp(com, entry->u.com)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} else if (entry->style == COMMUNITY_LIST_EXPANDED) { +			if (community_regexp_match(com, entry->reg)) +				return entry->direct == COMMUNITY_PERMIT ? 1 +									 : 0; +		} +	} +	return 0;  }  /* Delete all permitted communities in the list from com.  */ -struct community * -community_list_match_delete (struct community *com, -                             struct community_list *list) +struct community *community_list_match_delete(struct community *com, +					      struct community_list *list)  { -  struct community_entry *entry; -  u_int32_t val; -  u_int32_t com_index_to_delete[com->size]; -  int delete_index = 0; -  int i; - -  /* Loop over each community value and evaluate each against the -   * community-list.  If we need to delete a community value add its index to -   * com_index_to_delete. -   */ -  for (i = 0; i < com->size; i++) -    { -      val = community_val_get (com, i); +	struct community_entry *entry; +	u_int32_t val; +	u_int32_t com_index_to_delete[com->size]; +	int delete_index = 0; +	int i; + +	/* Loop over each community value and evaluate each against the +	 * community-list.  If we need to delete a community value add its index +	 * to +	 * com_index_to_delete. +	 */ +	for (i = 0; i < com->size; i++) { +		val = community_val_get(com, i); + +		for (entry = list->head; entry; entry = entry->next) { +			if (entry->any) { +				if (entry->direct == COMMUNITY_PERMIT) { +					com_index_to_delete[delete_index] = i; +					delete_index++; +				} +				break; +			} + +			else if ((entry->style == COMMUNITY_LIST_STANDARD) +				 && (community_include(entry->u.com, +						       COMMUNITY_INTERNET) +				     || community_include(entry->u.com, val))) { +				if (entry->direct == COMMUNITY_PERMIT) { +					com_index_to_delete[delete_index] = i; +					delete_index++; +				} +				break; +			} + +			else if ((entry->style == COMMUNITY_LIST_EXPANDED) +				 && community_regexp_include(entry->reg, com, +							     i)) { +				if (entry->direct == COMMUNITY_PERMIT) { +					com_index_to_delete[delete_index] = i; +					delete_index++; +				} +				break; +			} +		} +	} -      for (entry = list->head; entry; entry = entry->next) -        { -          if (entry->any) -            { -              if (entry->direct == COMMUNITY_PERMIT) -                { -                  com_index_to_delete[delete_index] = i; -                  delete_index++; -                } -              break; -            } - -          else if ((entry->style == COMMUNITY_LIST_STANDARD) -                   && (community_include (entry->u.com, COMMUNITY_INTERNET) -                       || community_include (entry->u.com, val) )) -            { -              if (entry->direct == COMMUNITY_PERMIT) -                { -                  com_index_to_delete[delete_index] = i; -                  delete_index++; -                } -              break; -            } - -          else if ((entry->style == COMMUNITY_LIST_EXPANDED) -                   && community_regexp_include (entry->reg, com, i)) -            { -              if (entry->direct == COMMUNITY_PERMIT) -                { -                  com_index_to_delete[delete_index] = i; -                  delete_index++; -                } -              break; -            } -         } -     } - -  /* Delete all of the communities we flagged for deletion */ -  for (i = delete_index-1; i >= 0; i--) -    { -      val = community_val_get (com, com_index_to_delete[i]); -      community_del_val (com, &val); -    } +	/* Delete all of the communities we flagged for deletion */ +	for (i = delete_index - 1; i >= 0; i--) { +		val = community_val_get(com, com_index_to_delete[i]); +		community_del_val(com, &val); +	} -  return com; +	return com;  }  /* To avoid duplicated entry in the community-list, this function     compares specified entry to existing entry.  */ -static int -community_list_dup_check (struct community_list *list, -                          struct community_entry *new) +static int community_list_dup_check(struct community_list *list, +				    struct community_entry *new)  { -  struct community_entry *entry; - -  for (entry = list->head; entry; entry = entry->next) -    { -      if (entry->style != new->style) -        continue; - -      if (entry->direct != new->direct) -        continue; - -      if (entry->any != new->any) -        continue; - -      if (entry->any) -        return 1; - -      switch (entry->style) -        { -        case COMMUNITY_LIST_STANDARD: -          if (community_cmp (entry->u.com, new->u.com)) -            return 1; -          break; -        case LARGE_COMMUNITY_LIST_STANDARD: -          if (lcommunity_cmp (entry->u.lcom, new->u.lcom)) -            return 1; -          break; -        case EXTCOMMUNITY_LIST_STANDARD: -          if (ecommunity_cmp (entry->u.ecom, new->u.ecom)) -            return 1; -          break; -        case COMMUNITY_LIST_EXPANDED: -        case EXTCOMMUNITY_LIST_EXPANDED: -        case LARGE_COMMUNITY_LIST_EXPANDED: -          if (strcmp (entry->config, new->config) == 0) -            return 1; -          break; -        default: -          break; -        } -    } -  return 0; +	struct community_entry *entry; + +	for (entry = list->head; entry; entry = entry->next) { +		if (entry->style != new->style) +			continue; + +		if (entry->direct != new->direct) +			continue; + +		if (entry->any != new->any) +			continue; + +		if (entry->any) +			return 1; + +		switch (entry->style) { +		case COMMUNITY_LIST_STANDARD: +			if (community_cmp(entry->u.com, new->u.com)) +				return 1; +			break; +		case LARGE_COMMUNITY_LIST_STANDARD: +			if (lcommunity_cmp(entry->u.lcom, new->u.lcom)) +				return 1; +			break; +		case EXTCOMMUNITY_LIST_STANDARD: +			if (ecommunity_cmp(entry->u.ecom, new->u.ecom)) +				return 1; +			break; +		case COMMUNITY_LIST_EXPANDED: +		case EXTCOMMUNITY_LIST_EXPANDED: +		case LARGE_COMMUNITY_LIST_EXPANDED: +			if (strcmp(entry->config, new->config) == 0) +				return 1; +			break; +		default: +			break; +		} +	} +	return 0;  }  /* Set community-list.  */ -int -community_list_set (struct community_list_handler *ch, -                    const char *name, const char *str, int direct, int style) +int community_list_set(struct community_list_handler *ch, const char *name, +		       const char *str, int direct, int style)  { -  struct community_entry *entry = NULL; -  struct community_list *list; -  struct community *com = NULL; -  regex_t *regex = NULL; - -  /* Get community list. */ -  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 -     comment out this check.  */ -  if (!community_list_empty_p (list)) -    { -      struct community_entry *first; - -      first = list->head; - -      if (style != first->style) -	{ -	  return (first->style == COMMUNITY_LIST_STANDARD -		  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT -		  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT); +	struct community_entry *entry = NULL; +	struct community_list *list; +	struct community *com = NULL; +	regex_t *regex = NULL; + +	/* Get community list. */ +	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 +	   comment out this check.  */ +	if (!community_list_empty_p(list)) { +		struct community_entry *first; + +		first = list->head; + +		if (style != first->style) { +			return (first->style == COMMUNITY_LIST_STANDARD +					? COMMUNITY_LIST_ERR_STANDARD_CONFLICT +					: COMMUNITY_LIST_ERR_EXPANDED_CONFLICT); +		}  	} -    } -  if (str) -    { -      if (style == COMMUNITY_LIST_STANDARD) -	com = community_str2com (str); -      else -	regex = bgp_regcomp (str); +	if (str) { +		if (style == COMMUNITY_LIST_STANDARD) +			com = community_str2com(str); +		else +			regex = bgp_regcomp(str); -      if (! com && ! regex) -	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); -  else -    { -      community_list_entry_add (list, entry); -      route_map_notify_dependencies(name, RMAP_EVENT_CLIST_ADDED); -    } +	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); +	else { +		community_list_entry_add(list, entry); +		route_map_notify_dependencies(name, RMAP_EVENT_CLIST_ADDED); +	} -  return 0; +	return 0;  }  /* Unset community-list */ -int -community_list_unset (struct community_list_handler *ch, -                      const char *name, const char *str,  -                      int direct, int style, int delete_all) +int community_list_unset(struct community_list_handler *ch, const char *name, +			 const char *str, int direct, int style, int delete_all)  { -  struct community_entry *entry = NULL; -  struct community_list *list; -  struct community *com = NULL; - -  /* Lookup community list.  */ -  list = community_list_lookup (ch, name, COMMUNITY_LIST_MASTER); -  if (list == NULL) -    return COMMUNITY_LIST_ERR_CANT_FIND_LIST; - -  /* Delete all of entry belongs to this community-list.  */ -  if (delete_all) -    { -      community_list_delete (list); -      route_map_notify_dependencies(name, RMAP_EVENT_CLIST_DELETED); -      return 0; -    } +	struct community_entry *entry = NULL; +	struct community_list *list; +	struct community *com = NULL; + +	/* Lookup community list.  */ +	list = community_list_lookup(ch, name, COMMUNITY_LIST_MASTER); +	if (list == NULL) +		return COMMUNITY_LIST_ERR_CANT_FIND_LIST; + +	/* Delete all of entry belongs to this community-list.  */ +	if (delete_all) { +		community_list_delete(list); +		route_map_notify_dependencies(name, RMAP_EVENT_CLIST_DELETED); +		return 0; +	} -  if (style == COMMUNITY_LIST_STANDARD) -    { -      if (str) -        com = community_str2com (str); -    } +	if (style == COMMUNITY_LIST_STANDARD) { +		if (str) +			com = community_str2com(str); +	} -  if (com) -    { -      entry = community_list_entry_lookup (list, com, direct); -      community_free (com); -    } -  else -    entry = community_list_entry_lookup (list, str, direct); +	if (com) { +		entry = community_list_entry_lookup(list, com, direct); +		community_free(com); +	} else +		entry = community_list_entry_lookup(list, str, direct); -  if (!entry) -    return COMMUNITY_LIST_ERR_CANT_FIND_LIST; +	if (!entry) +		return COMMUNITY_LIST_ERR_CANT_FIND_LIST; -  community_list_entry_delete (list, entry, style); -  route_map_notify_dependencies(name, RMAP_EVENT_CLIST_DELETED); +	community_list_entry_delete(list, entry, style); +	route_map_notify_dependencies(name, RMAP_EVENT_CLIST_DELETED); -  return 0; +	return 0;  }  /* Delete all permitted large communities in the list from com.  */ -struct lcommunity * -lcommunity_list_match_delete (struct lcommunity *lcom, -                              struct community_list *list) +struct lcommunity *lcommunity_list_match_delete(struct lcommunity *lcom, +						struct community_list *list)  { -  struct community_entry *entry; -  u_int32_t com_index_to_delete[lcom->size]; -  u_char *ptr; -  int delete_index = 0; -  int i; +	struct community_entry *entry; +	u_int32_t com_index_to_delete[lcom->size]; +	u_char *ptr; +	int delete_index = 0; +	int i; + +	/* Loop over each lcommunity value and evaluate each against the +	 * community-list.  If we need to delete a community value add its index +	 * to +	 * com_index_to_delete. +	 */ +	ptr = lcom->val; +	for (i = 0; i < lcom->size; i++) { +		ptr += (i * LCOMMUNITY_SIZE); +		for (entry = list->head; entry; entry = entry->next) { +			if (entry->any) { +				if (entry->direct == COMMUNITY_PERMIT) { +					com_index_to_delete[delete_index] = i; +					delete_index++; +				} +				break; +			} + +			else if ((entry->style == LARGE_COMMUNITY_LIST_STANDARD) +				 && lcommunity_include(entry->u.lcom, ptr)) { +				if (entry->direct == COMMUNITY_PERMIT) { +					com_index_to_delete[delete_index] = i; +					delete_index++; +				} +				break; +			} + +			else if ((entry->style == LARGE_COMMUNITY_LIST_STANDARD) +				 && lcommunity_regexp_include(entry->reg, lcom, +							      i)) { +				if (entry->direct == COMMUNITY_PERMIT) { +					com_index_to_delete[delete_index] = i; +					delete_index++; +				} +				break; +			} +		} +	} -  /* Loop over each lcommunity value and evaluate each against the -   * community-list.  If we need to delete a community value add its index to -   * com_index_to_delete. -   */ -  ptr = lcom->val; -  for (i = 0; i < lcom->size; i++) -    { -      ptr += (i * LCOMMUNITY_SIZE); -      for (entry = list->head; entry; entry = entry->next) -        { -          if (entry->any) -            { -              if (entry->direct == COMMUNITY_PERMIT) -                { -                  com_index_to_delete[delete_index] = i; -                  delete_index++; -                } -              break; -            } - -          else if ((entry->style == LARGE_COMMUNITY_LIST_STANDARD) -                   && lcommunity_include (entry->u.lcom, ptr) ) -            { -              if (entry->direct == COMMUNITY_PERMIT) -                { -                  com_index_to_delete[delete_index] = i; -                  delete_index++; -                } -              break; -            } - -          else if ((entry->style == LARGE_COMMUNITY_LIST_STANDARD) -                   && lcommunity_regexp_include (entry->reg, lcom, i)) -            { -              if (entry->direct == COMMUNITY_PERMIT) -                { -                  com_index_to_delete[delete_index] = i; -                  delete_index++; -                } -              break; -            } -         } -     } - -  /* Delete all of the communities we flagged for deletion */ -  ptr = lcom->val; -  for (i = delete_index-1; i >= 0; i--) -    { -      ptr += (com_index_to_delete[i] * LCOMMUNITY_SIZE); -      lcommunity_del_val (lcom, ptr); -    } +	/* Delete all of the communities we flagged for deletion */ +	ptr = lcom->val; +	for (i = delete_index - 1; i >= 0; i--) { +		ptr += (com_index_to_delete[i] * LCOMMUNITY_SIZE); +		lcommunity_del_val(lcom, ptr); +	} -  return lcom; +	return lcom;  }  /* Set lcommunity-list.  */ -int -lcommunity_list_set (struct community_list_handler *ch, -                     const char *name, const char *str, int direct, int style) +int lcommunity_list_set(struct community_list_handler *ch, const char *name, +			const char *str, int direct, int style)  { -  struct community_entry *entry = NULL; -  struct community_list *list; -  struct lcommunity *lcom = NULL; -  regex_t *regex = NULL; - -  /* Get community list. */ -  list = community_list_get (ch, name, LARGE_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 -     comment out this check.  */ -  if (!community_list_empty_p (list)) -    { -      struct community_entry *first; - -      first = list->head; - -      if (style != first->style) -        { -          return (first->style == COMMUNITY_LIST_STANDARD -                  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT -                  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT); -        } -    } +	struct community_entry *entry = NULL; +	struct community_list *list; +	struct lcommunity *lcom = NULL; +	regex_t *regex = NULL; + +	/* Get community list. */ +	list = community_list_get(ch, name, LARGE_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 +	   comment out this check.  */ +	if (!community_list_empty_p(list)) { +		struct community_entry *first; + +		first = list->head; + +		if (style != first->style) { +			return (first->style == COMMUNITY_LIST_STANDARD +					? COMMUNITY_LIST_ERR_STANDARD_CONFLICT +					: COMMUNITY_LIST_ERR_EXPANDED_CONFLICT); +		} +	} -  if (str) -    { -      if (style == LARGE_COMMUNITY_LIST_STANDARD) -        lcom = lcommunity_str2com (str); -      else -        regex = bgp_regcomp (str); +	if (str) { +		if (style == LARGE_COMMUNITY_LIST_STANDARD) +			lcom = lcommunity_str2com(str); +		else +			regex = bgp_regcomp(str); -      if (! lcom && ! regex) -        return COMMUNITY_LIST_ERR_MALFORMED_VAL; -    } +		if (!lcom && !regex) +			return COMMUNITY_LIST_ERR_MALFORMED_VAL; +	} -  entry = community_entry_new (); -  entry->direct = direct; -  entry->style = style; -  entry->any = (str ? 0 : 1); -  entry->u.lcom = lcom; -  entry->reg = regex; -  if (lcom) -    entry->config = lcommunity_lcom2str (lcom, LCOMMUNITY_FORMAT_COMMUNITY_LIST); -  else if (regex) -    entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str); -  else -    entry->config = NULL; - -  /* Do not put duplicated community entry.  */ -  if (community_list_dup_check (list, entry)) -    community_entry_free (entry); -  else -    community_list_entry_add (list, entry); - -  return 0; +	entry = community_entry_new(); +	entry->direct = direct; +	entry->style = style; +	entry->any = (str ? 0 : 1); +	entry->u.lcom = lcom; +	entry->reg = regex; +	if (lcom) +		entry->config = lcommunity_lcom2str( +			lcom, LCOMMUNITY_FORMAT_COMMUNITY_LIST); +	else if (regex) +		entry->config = XSTRDUP(MTYPE_COMMUNITY_LIST_CONFIG, str); +	else +		entry->config = NULL; + +	/* Do not put duplicated community entry.  */ +	if (community_list_dup_check(list, entry)) +		community_entry_free(entry); +	else +		community_list_entry_add(list, entry); + +	return 0;  }  /* Unset community-list.  When str is NULL, delete all of     community-list entry belongs to the specified name.  */ -int -lcommunity_list_unset (struct community_list_handler *ch, -                       const char *name, const char *str, -                       int direct, int style) +int lcommunity_list_unset(struct community_list_handler *ch, const char *name, +			  const char *str, int direct, int style)  { -  struct community_entry *entry = NULL; -  struct community_list *list; -  struct lcommunity *lcom = NULL; -  regex_t *regex = NULL; - -  /* Lookup community list.  */ -  list = community_list_lookup (ch, name, LARGE_COMMUNITY_LIST_MASTER); -  if (list == NULL) -    return COMMUNITY_LIST_ERR_CANT_FIND_LIST; - -  /* Delete all of entry belongs to this community-list.  */ -  if (!str) -    { -      community_list_delete (list); -      return 0; -    } +	struct community_entry *entry = NULL; +	struct community_list *list; +	struct lcommunity *lcom = NULL; +	regex_t *regex = NULL; + +	/* Lookup community list.  */ +	list = community_list_lookup(ch, name, LARGE_COMMUNITY_LIST_MASTER); +	if (list == NULL) +		return COMMUNITY_LIST_ERR_CANT_FIND_LIST; + +	/* Delete all of entry belongs to this community-list.  */ +	if (!str) { +		community_list_delete(list); +		return 0; +	} -  if (style == LARGE_COMMUNITY_LIST_STANDARD) -    lcom = lcommunity_str2com (str); -  else -    regex = bgp_regcomp (str); +	if (style == LARGE_COMMUNITY_LIST_STANDARD) +		lcom = lcommunity_str2com(str); +	else +		regex = bgp_regcomp(str); -  if (! lcom && ! regex) -    return COMMUNITY_LIST_ERR_MALFORMED_VAL; +	if (!lcom && !regex) +		return COMMUNITY_LIST_ERR_MALFORMED_VAL; -  if (lcom) -    entry = community_list_entry_lookup (list, lcom, direct); -  else -    entry = community_list_entry_lookup (list, str, direct); +	if (lcom) +		entry = community_list_entry_lookup(list, lcom, direct); +	else +		entry = community_list_entry_lookup(list, str, direct); -  if (lcom) -    lcommunity_free (&lcom); -  if (regex) -    bgp_regex_free (regex); +	if (lcom) +		lcommunity_free(&lcom); +	if (regex) +		bgp_regex_free(regex); -  if (!entry) -    return COMMUNITY_LIST_ERR_CANT_FIND_LIST; +	if (!entry) +		return COMMUNITY_LIST_ERR_CANT_FIND_LIST; -  community_list_entry_delete (list, entry, style); +	community_list_entry_delete(list, entry, style); -  return 0; +	return 0;  }  /* Set extcommunity-list.  */ -int -extcommunity_list_set (struct community_list_handler *ch, -                       const char *name, const char *str,  -                       int direct, int style) +int extcommunity_list_set(struct community_list_handler *ch, const char *name, +			  const char *str, int direct, int style)  { -  struct community_entry *entry = NULL; -  struct community_list *list; -  struct ecommunity *ecom = NULL; -  regex_t *regex = NULL; +	struct community_entry *entry = NULL; +	struct community_list *list; +	struct ecommunity *ecom = NULL; +	regex_t *regex = NULL; -  entry = NULL; +	entry = NULL; -  /* Get community list. */ -  list = community_list_get (ch, name, EXTCOMMUNITY_LIST_MASTER); +	/* Get community list. */ +	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 -     comment out this check.  */ -  if (!community_list_empty_p (list)) -    { -      struct community_entry *first; +	/* When community-list already has entry, new entry should have same +	   style.  If you want to have mixed style community-list, you can +	   comment out this check.  */ +	if (!community_list_empty_p(list)) { +		struct community_entry *first; -      first = list->head; +		first = list->head; -      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); +		}  	} -    } -  if (str) -    { -      if (style == EXTCOMMUNITY_LIST_STANDARD) -	ecom = ecommunity_str2com (str, 0, 1); -      else -	regex = bgp_regcomp (str); +	if (str) { +		if (style == EXTCOMMUNITY_LIST_STANDARD) +			ecom = ecommunity_str2com(str, 0, 1); +		else +			regex = bgp_regcomp(str); -      if (! ecom && ! regex) -	return COMMUNITY_LIST_ERR_MALFORMED_VAL; -    } +		if (!ecom && !regex) +			return COMMUNITY_LIST_ERR_MALFORMED_VAL; +	} -  if (ecom) -    ecom->str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_DISPLAY, 0); - -  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, 0); -  else if (regex) -    entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str); -  else -    entry->config = NULL; -  entry->u.ecom = ecom; -  entry->reg = regex; - -  /* Do not put duplicated community entry.  */ -  if (community_list_dup_check (list, entry)) -    community_entry_free (entry); -  else -    { -      community_list_entry_add (list, entry); -      route_map_notify_dependencies(name, RMAP_EVENT_ECLIST_ADDED); -    } +	if (ecom) +		ecom->str = +			ecommunity_ecom2str(ecom, ECOMMUNITY_FORMAT_DISPLAY, 0); + +	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, 0); +	else if (regex) +		entry->config = XSTRDUP(MTYPE_COMMUNITY_LIST_CONFIG, str); +	else +		entry->config = NULL; +	entry->u.ecom = ecom; +	entry->reg = regex; + +	/* Do not put duplicated community entry.  */ +	if (community_list_dup_check(list, entry)) +		community_entry_free(entry); +	else { +		community_list_entry_add(list, entry); +		route_map_notify_dependencies(name, RMAP_EVENT_ECLIST_ADDED); +	} -  return 0; +	return 0;  }  /* Unset extcommunity-list.  When str is NULL, delete all of     extcommunity-list entry belongs to the specified name.  */ -int -extcommunity_list_unset (struct community_list_handler *ch, -                         const char *name, const char *str,  -                         int direct, int style, int delete_all) +int extcommunity_list_unset(struct community_list_handler *ch, const char *name, +			    const char *str, int direct, int style, +			    int delete_all)  { -  struct community_entry *entry = NULL; -  struct community_list *list; -  struct ecommunity *ecom = NULL; - -  /* Lookup extcommunity list.  */ -  list = community_list_lookup (ch, name, EXTCOMMUNITY_LIST_MASTER); -  if (list == NULL) -    return COMMUNITY_LIST_ERR_CANT_FIND_LIST; - -  /* Delete all of entry belongs to this extcommunity-list.  */ -  if (delete_all) -    { -      community_list_delete (list); -      route_map_notify_dependencies(name, RMAP_EVENT_ECLIST_DELETED); -      return 0; -    } +	struct community_entry *entry = NULL; +	struct community_list *list; +	struct ecommunity *ecom = NULL; + +	/* Lookup extcommunity list.  */ +	list = community_list_lookup(ch, name, EXTCOMMUNITY_LIST_MASTER); +	if (list == NULL) +		return COMMUNITY_LIST_ERR_CANT_FIND_LIST; + +	/* Delete all of entry belongs to this extcommunity-list.  */ +	if (delete_all) { +		community_list_delete(list); +		route_map_notify_dependencies(name, RMAP_EVENT_ECLIST_DELETED); +		return 0; +	} -  if (style == EXTCOMMUNITY_LIST_STANDARD) -    { -      if (str) -        ecom = ecommunity_str2com (str, 0, 1); -    } +	if (style == EXTCOMMUNITY_LIST_STANDARD) { +		if (str) +			ecom = ecommunity_str2com(str, 0, 1); +	} -  if (ecom) -    { -      entry = community_list_entry_lookup (list, ecom, direct); -      ecommunity_free (&ecom); -    } -  else -    entry = community_list_entry_lookup (list, str, direct); +	if (ecom) { +		entry = community_list_entry_lookup(list, ecom, direct); +		ecommunity_free(&ecom); +	} else +		entry = community_list_entry_lookup(list, str, direct); -  if (!entry) -    return COMMUNITY_LIST_ERR_CANT_FIND_LIST; +	if (!entry) +		return COMMUNITY_LIST_ERR_CANT_FIND_LIST; -  community_list_entry_delete (list, entry, style); -  route_map_notify_dependencies(name, RMAP_EVENT_ECLIST_DELETED); +	community_list_entry_delete(list, entry, style); +	route_map_notify_dependencies(name, RMAP_EVENT_ECLIST_DELETED); -  return 0; +	return 0;  }  /* Initializa community-list.  Return community-list handler.  */ -struct community_list_handler * -community_list_init (void) +struct community_list_handler *community_list_init(void)  { -  struct community_list_handler *ch; -  ch = XCALLOC (MTYPE_COMMUNITY_LIST_HANDLER, -                sizeof (struct community_list_handler)); -  return ch; +	struct community_list_handler *ch; +	ch = XCALLOC(MTYPE_COMMUNITY_LIST_HANDLER, +		     sizeof(struct community_list_handler)); +	return ch;  }  /* Terminate community-list.  */ -void -community_list_terminate (struct community_list_handler *ch) +void community_list_terminate(struct community_list_handler *ch)  { -  struct community_list_master *cm; -  struct community_list *list; - -  cm = &ch->community_list; -  while ((list = cm->num.head) != NULL) -    community_list_delete (list); -  while ((list = cm->str.head) != NULL) -    community_list_delete (list); - -  cm = &ch->lcommunity_list; -  while ((list = cm->num.head) != NULL) -    community_list_delete (list); -  while ((list = cm->str.head) != NULL) -    community_list_delete (list); - -  cm = &ch->extcommunity_list; -  while ((list = cm->num.head) != NULL) -    community_list_delete (list); -  while ((list = cm->str.head) != NULL) -    community_list_delete (list); - -  XFREE (MTYPE_COMMUNITY_LIST_HANDLER, ch); +	struct community_list_master *cm; +	struct community_list *list; + +	cm = &ch->community_list; +	while ((list = cm->num.head) != NULL) +		community_list_delete(list); +	while ((list = cm->str.head) != NULL) +		community_list_delete(list); + +	cm = &ch->lcommunity_list; +	while ((list = cm->num.head) != NULL) +		community_list_delete(list); +	while ((list = cm->str.head) != NULL) +		community_list_delete(list); + +	cm = &ch->extcommunity_list; +	while ((list = cm->num.head) != NULL) +		community_list_delete(list); +	while ((list = cm->str.head) != NULL) +		community_list_delete(list); + +	XFREE(MTYPE_COMMUNITY_LIST_HANDLER, ch);  }  | 
