diff options
Diffstat (limited to 'bgpd/bgp_routemap.c')
| -rw-r--r-- | bgpd/bgp_routemap.c | 5637 | 
1 files changed, 2693 insertions, 2944 deletions
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index d08d04db40..285bb9a80c 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -29,9 +29,9 @@  #include "memory.h"  #include "log.h"  #ifdef HAVE_LIBPCREPOSIX -# include <pcreposix.h> +#include <pcreposix.h>  #else -# include <regex.h> +#include <regex.h>  #endif /* HAVE_LIBPCREPOSIX */  #include "buffer.h"  #include "sockunion.h" @@ -56,7 +56,7 @@  #include "bgpd/bgp_debug.h"  #if ENABLE_BGP_VNC -# include "bgpd/rfapi/bgp_rfapi_cfg.h" +#include "bgpd/rfapi/bgp_rfapi_cfg.h"  #endif  /* Memo of route-map commands. @@ -111,2933 +111,2670 @@ o Local extensions  */ - /* generic value manipulation to be shared in multiple rules */ +/* generic value manipulation to be shared in multiple rules */  #define RMAP_VALUE_SET 0  #define RMAP_VALUE_ADD 1  #define RMAP_VALUE_SUB 2 -struct rmap_value -{ -  u_int8_t action; -  u_int8_t variable; -  u_int32_t value; +struct rmap_value { +	u_int8_t action; +	u_int8_t variable; +	u_int32_t value;  }; -static int -route_value_match (struct rmap_value *rv, u_int32_t value) -{ -  if (rv->variable == 0 && value == rv->value) -    return RMAP_MATCH; +static int route_value_match(struct rmap_value *rv, u_int32_t value) +{ +	if (rv->variable == 0 && value == rv->value) +		return RMAP_MATCH; -  return RMAP_NOMATCH; +	return RMAP_NOMATCH;  } -static u_int32_t -route_value_adjust (struct rmap_value *rv, u_int32_t current, struct peer *peer) +static u_int32_t route_value_adjust(struct rmap_value *rv, u_int32_t current, +				    struct peer *peer)  { -  u_int32_t value; +	u_int32_t value; -  switch (rv->variable) -    { -    case 1: -      value = peer->rtt; -      break; -    default: -      value = rv->value; -      break; -    } +	switch (rv->variable) { +	case 1: +		value = peer->rtt; +		break; +	default: +		value = rv->value; +		break; +	} -  switch (rv->action) -    { -    case RMAP_VALUE_ADD: -      if (current > UINT32_MAX-value) -        return UINT32_MAX; -      return current + value; -    case RMAP_VALUE_SUB: -      if (current <= value) -        return 0; -      return current - value; -    default: -      return value; -    } +	switch (rv->action) { +	case RMAP_VALUE_ADD: +		if (current > UINT32_MAX - value) +			return UINT32_MAX; +		return current + value; +	case RMAP_VALUE_SUB: +		if (current <= value) +			return 0; +		return current - value; +	default: +		return value; +	}  } -static void * -route_value_compile (const char *arg) +static void *route_value_compile(const char *arg)  { -  u_int8_t action = RMAP_VALUE_SET, var = 0; -  unsigned long larg = 0; -  char *endptr = NULL; -  struct rmap_value *rv; +	u_int8_t action = RMAP_VALUE_SET, var = 0; +	unsigned long larg = 0; +	char *endptr = NULL; +	struct rmap_value *rv; -  if (arg[0] == '+') -    { -      action = RMAP_VALUE_ADD; -      arg++; -    } -  else if (arg[0] == '-') -    { -      action = RMAP_VALUE_SUB; -      arg++; -    } +	if (arg[0] == '+') { +		action = RMAP_VALUE_ADD; +		arg++; +	} else if (arg[0] == '-') { +		action = RMAP_VALUE_SUB; +		arg++; +	} -  if (all_digit(arg)) -    { -      errno = 0; -      larg = strtoul (arg, &endptr, 10); -      if (*arg == 0 || *endptr != 0 || errno || larg > UINT32_MAX) -        return NULL; -    } -  else -    { -      if (strcmp(arg, "rtt") == 0) -        var = 1; -      else -        return NULL; -    } +	if (all_digit(arg)) { +		errno = 0; +		larg = strtoul(arg, &endptr, 10); +		if (*arg == 0 || *endptr != 0 || errno || larg > UINT32_MAX) +			return NULL; +	} else { +		if (strcmp(arg, "rtt") == 0) +			var = 1; +		else +			return NULL; +	} -  rv = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_value)); -  if (!rv) -    return NULL; +	rv = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_value)); +	if (!rv) +		return NULL; -  rv->action = action; -  rv->variable = var; -  rv->value = larg; -  return rv; +	rv->action = action; +	rv->variable = var; +	rv->value = larg; +	return rv;  } -static void -route_value_free (void *rule) +static void route_value_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } - /* generic as path object to be shared in multiple rules */ +/* generic as path object to be shared in multiple rules */ -static void * -route_aspath_compile (const char *arg) +static void *route_aspath_compile(const char *arg)  { -  struct aspath *aspath; +	struct aspath *aspath; -  aspath = aspath_str2aspath (arg); -  if (! aspath) -    return NULL; -  return aspath; +	aspath = aspath_str2aspath(arg); +	if (!aspath) +		return NULL; +	return aspath;  } -static void -route_aspath_free (void *rule) +static void route_aspath_free(void *rule)  { -  struct aspath *aspath = rule; -  aspath_free (aspath); +	struct aspath *aspath = rule; +	aspath_free(aspath);  } - /* 'match peer (A.B.C.D|X:X::X:X)' */ +/* 'match peer (A.B.C.D|X:X::X:X)' */  /* Compares the peer specified in the 'match peer' clause with the peer      received in bgp_info->peer. If it is the same, or if the peer structure      received is a peer_group containing it, returns RMAP_MATCH. */ -static route_map_result_t -route_match_peer (void *rule, struct prefix *prefix, route_map_object_t type, -      void *object) -{ -  union sockunion *su; -  union sockunion su_def = { .sin = { .sin_family = AF_INET, -                                      .sin_addr.s_addr = INADDR_ANY } }; -  struct peer_group *group; -  struct peer *peer; -  struct listnode *node, *nnode; - -  if (type == RMAP_BGP) -    { -      su = rule; -      peer = ((struct bgp_info *) object)->peer; - -      if ( ! CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT) && -           ! CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_EXPORT) ) -        return RMAP_NOMATCH; - -      /* If su='0.0.0.0' (command 'match peer local'), and it's a NETWORK, -          REDISTRIBUTE or DEFAULT_GENERATED route => return RMAP_MATCH */ -      if (sockunion_same (su, &su_def)) -        { -          int ret; -          if ( CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_NETWORK) || -               CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE) || -               CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_DEFAULT)) -            ret = RMAP_MATCH; -          else -            ret = RMAP_NOMATCH; -          return ret; -        } - -      if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)) -        { -          if (sockunion_same (su, &peer->su)) -            return RMAP_MATCH; - -          return RMAP_NOMATCH; -        } -      else -        { -          group = peer->group; -          for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer)) -            { -              if (sockunion_same (su, &peer->su)) -                return RMAP_MATCH; -            } -          return RMAP_NOMATCH; -        } -    } -  return RMAP_NOMATCH; -} - -static void * -route_match_peer_compile (const char *arg) -{ -  union sockunion *su; -  int ret; - -  su = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (union sockunion)); - -  ret = str2sockunion (strcmp(arg, "local") ? arg : "0.0.0.0", su); -  if (ret < 0) { -    XFREE (MTYPE_ROUTE_MAP_COMPILED, su); -    return NULL; -  } - -  return su; +static route_map_result_t route_match_peer(void *rule, struct prefix *prefix, +					   route_map_object_t type, +					   void *object) +{ +	union sockunion *su; +	union sockunion su_def = { +		.sin = {.sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY}}; +	struct peer_group *group; +	struct peer *peer; +	struct listnode *node, *nnode; + +	if (type == RMAP_BGP) { +		su = rule; +		peer = ((struct bgp_info *)object)->peer; + +		if (!CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IMPORT) +		    && !CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_EXPORT)) +			return RMAP_NOMATCH; + +		/* If su='0.0.0.0' (command 'match peer local'), and it's a +		   NETWORK, +		    REDISTRIBUTE or DEFAULT_GENERATED route => return RMAP_MATCH +		   */ +		if (sockunion_same(su, &su_def)) { +			int ret; +			if (CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_NETWORK) +			    || CHECK_FLAG(peer->rmap_type, +					  PEER_RMAP_TYPE_REDISTRIBUTE) +			    || CHECK_FLAG(peer->rmap_type, +					  PEER_RMAP_TYPE_DEFAULT)) +				ret = RMAP_MATCH; +			else +				ret = RMAP_NOMATCH; +			return ret; +		} + +		if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) { +			if (sockunion_same(su, &peer->su)) +				return RMAP_MATCH; + +			return RMAP_NOMATCH; +		} else { +			group = peer->group; +			for (ALL_LIST_ELEMENTS(group->peer, node, nnode, +					       peer)) { +				if (sockunion_same(su, &peer->su)) +					return RMAP_MATCH; +			} +			return RMAP_NOMATCH; +		} +	} +	return RMAP_NOMATCH; +} + +static void *route_match_peer_compile(const char *arg) +{ +	union sockunion *su; +	int ret; + +	su = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(union sockunion)); + +	ret = str2sockunion(strcmp(arg, "local") ? arg : "0.0.0.0", su); +	if (ret < 0) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, su); +		return NULL; +	} + +	return su;  }  /* Free route map's compiled `ip address' value. */ -static void -route_match_peer_free (void *rule) +static void route_match_peer_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip address matching. */ -struct route_map_rule_cmd route_match_peer_cmd = -{ -  "peer", -  route_match_peer, -  route_match_peer_compile, -  route_match_peer_free -}; +struct route_map_rule_cmd route_match_peer_cmd = {"peer", route_match_peer, +						  route_match_peer_compile, +						  route_match_peer_free};  /* `match ip address IP_ACCESS_LIST' */  /* Match function should return 1 if match is success else return     zero. */ -static route_map_result_t -route_match_ip_address (void *rule, struct prefix *prefix, -			route_map_object_t type, void *object) -{ -  struct access_list *alist; -  /* struct prefix_ipv4 match; */ - -  if (type == RMAP_BGP) -    { -      alist = access_list_lookup (AFI_IP, (char *) rule); -      if (alist == NULL) +static route_map_result_t route_match_ip_address(void *rule, +						 struct prefix *prefix, +						 route_map_object_t type, +						 void *object) +{ +	struct access_list *alist; +	/* struct prefix_ipv4 match; */ + +	if (type == RMAP_BGP) { +		alist = access_list_lookup(AFI_IP, (char *)rule); +		if (alist == NULL) +			return RMAP_NOMATCH; + +		return (access_list_apply(alist, prefix) == FILTER_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	}  	return RMAP_NOMATCH; - -      return (access_list_apply (alist, prefix) == FILTER_DENY ? -	      RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH;  }  /* Route map `ip address' match statement.  `arg' should be     access-list name. */ -static void * -route_match_ip_address_compile (const char *arg) +static void *route_match_ip_address_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  }  /* Free route map's compiled `ip address' value. */ -static void -route_match_ip_address_free (void *rule) +static void route_match_ip_address_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip address matching. */ -struct route_map_rule_cmd route_match_ip_address_cmd = -{ -  "ip address", -  route_match_ip_address, -  route_match_ip_address_compile, -  route_match_ip_address_free -}; +struct route_map_rule_cmd route_match_ip_address_cmd = { +	"ip address", route_match_ip_address, route_match_ip_address_compile, +	route_match_ip_address_free};  /* `match ip next-hop IP_ADDRESS' */  /* Match function return 1 if match is success else return zero. */ -static route_map_result_t -route_match_ip_next_hop (void *rule, struct prefix *prefix, -			 route_map_object_t type, void *object) -{ -  struct access_list *alist; -  struct bgp_info *bgp_info; -  struct prefix_ipv4 p; - -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      p.family = AF_INET; -      p.prefix = bgp_info->attr->nexthop; -      p.prefixlen = IPV4_MAX_BITLEN; - -      alist = access_list_lookup (AFI_IP, (char *) rule); -      if (alist == NULL) +static route_map_result_t route_match_ip_next_hop(void *rule, +						  struct prefix *prefix, +						  route_map_object_t type, +						  void *object) +{ +	struct access_list *alist; +	struct bgp_info *bgp_info; +	struct prefix_ipv4 p; + +	if (type == RMAP_BGP) { +		bgp_info = object; +		p.family = AF_INET; +		p.prefix = bgp_info->attr->nexthop; +		p.prefixlen = IPV4_MAX_BITLEN; + +		alist = access_list_lookup(AFI_IP, (char *)rule); +		if (alist == NULL) +			return RMAP_NOMATCH; + +		return (access_list_apply(alist, &p) == FILTER_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	}  	return RMAP_NOMATCH; - -      return (access_list_apply (alist, &p) == FILTER_DENY ? -              RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH;  }  /* Route map `ip next-hop' match statement. `arg' is     access-list name. */ -static void * -route_match_ip_next_hop_compile (const char *arg) +static void *route_match_ip_next_hop_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  }  /* Free route map's compiled `ip address' value. */ -static void -route_match_ip_next_hop_free (void *rule) +static void route_match_ip_next_hop_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip next-hop matching. */ -struct route_map_rule_cmd route_match_ip_next_hop_cmd = -{ -  "ip next-hop", -  route_match_ip_next_hop, -  route_match_ip_next_hop_compile, -  route_match_ip_next_hop_free -}; +struct route_map_rule_cmd route_match_ip_next_hop_cmd = { +	"ip next-hop", route_match_ip_next_hop, route_match_ip_next_hop_compile, +	route_match_ip_next_hop_free};  /* `match ip route-source ACCESS-LIST' */  /* Match function return 1 if match is success else return zero. */ -static route_map_result_t -route_match_ip_route_source (void *rule, struct prefix *prefix, -			     route_map_object_t type, void *object) -{ -  struct access_list *alist; -  struct bgp_info *bgp_info; -  struct peer *peer; -  struct prefix_ipv4 p; - -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      peer = bgp_info->peer; - -      if (! peer || sockunion_family (&peer->su) != AF_INET) -	return RMAP_NOMATCH; - -      p.family = AF_INET; -      p.prefix = peer->su.sin.sin_addr; -      p.prefixlen = IPV4_MAX_BITLEN; - -      alist = access_list_lookup (AFI_IP, (char *) rule); -      if (alist == NULL) +static route_map_result_t route_match_ip_route_source(void *rule, +						      struct prefix *prefix, +						      route_map_object_t type, +						      void *object) +{ +	struct access_list *alist; +	struct bgp_info *bgp_info; +	struct peer *peer; +	struct prefix_ipv4 p; + +	if (type == RMAP_BGP) { +		bgp_info = object; +		peer = bgp_info->peer; + +		if (!peer || sockunion_family(&peer->su) != AF_INET) +			return RMAP_NOMATCH; + +		p.family = AF_INET; +		p.prefix = peer->su.sin.sin_addr; +		p.prefixlen = IPV4_MAX_BITLEN; + +		alist = access_list_lookup(AFI_IP, (char *)rule); +		if (alist == NULL) +			return RMAP_NOMATCH; + +		return (access_list_apply(alist, &p) == FILTER_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	}  	return RMAP_NOMATCH; - -      return (access_list_apply (alist, &p) == FILTER_DENY ? -              RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH;  }  /* Route map `ip route-source' match statement. `arg' is     access-list name. */ -static void * -route_match_ip_route_source_compile (const char *arg) +static void *route_match_ip_route_source_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  }  /* Free route map's compiled `ip address' value. */ -static void -route_match_ip_route_source_free (void *rule) +static void route_match_ip_route_source_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip route-source matching. */ -struct route_map_rule_cmd route_match_ip_route_source_cmd = -{ -  "ip route-source", -  route_match_ip_route_source, -  route_match_ip_route_source_compile, -  route_match_ip_route_source_free -}; +struct route_map_rule_cmd route_match_ip_route_source_cmd = { +	"ip route-source", route_match_ip_route_source, +	route_match_ip_route_source_compile, route_match_ip_route_source_free};  /* `match ip address prefix-list PREFIX_LIST' */  static route_map_result_t -route_match_ip_address_prefix_list (void *rule, struct prefix *prefix, -				    route_map_object_t type, void *object) +route_match_ip_address_prefix_list(void *rule, struct prefix *prefix, +				   route_map_object_t type, void *object)  { -  struct prefix_list *plist; +	struct prefix_list *plist; -  if (type == RMAP_BGP) -    { -      plist = prefix_list_lookup (AFI_IP, (char *) rule); -      if (plist == NULL) -	return RMAP_NOMATCH; +	if (type == RMAP_BGP) { +		plist = prefix_list_lookup(AFI_IP, (char *)rule); +		if (plist == NULL) +			return RMAP_NOMATCH; -      return (prefix_list_apply (plist, prefix) == PREFIX_DENY ? -	      RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH; +		return (prefix_list_apply(plist, prefix) == PREFIX_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	} +	return RMAP_NOMATCH;  } -static void * -route_match_ip_address_prefix_list_compile (const char *arg) +static void *route_match_ip_address_prefix_list_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  } -static void -route_match_ip_address_prefix_list_free (void *rule) +static void route_match_ip_address_prefix_list_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } -struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd = -{ -  "ip address prefix-list", -  route_match_ip_address_prefix_list, -  route_match_ip_address_prefix_list_compile, -  route_match_ip_address_prefix_list_free -}; +struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd = { +	"ip address prefix-list", route_match_ip_address_prefix_list, +	route_match_ip_address_prefix_list_compile, +	route_match_ip_address_prefix_list_free};  /* `match ip next-hop prefix-list PREFIX_LIST' */  static route_map_result_t -route_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix, -                                    route_map_object_t type, void *object) +route_match_ip_next_hop_prefix_list(void *rule, struct prefix *prefix, +				    route_map_object_t type, void *object)  { -  struct prefix_list *plist; -  struct bgp_info *bgp_info; -  struct prefix_ipv4 p; +	struct prefix_list *plist; +	struct bgp_info *bgp_info; +	struct prefix_ipv4 p; -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      p.family = AF_INET; -      p.prefix = bgp_info->attr->nexthop; -      p.prefixlen = IPV4_MAX_BITLEN; +	if (type == RMAP_BGP) { +		bgp_info = object; +		p.family = AF_INET; +		p.prefix = bgp_info->attr->nexthop; +		p.prefixlen = IPV4_MAX_BITLEN; -      plist = prefix_list_lookup (AFI_IP, (char *) rule); -      if (plist == NULL) -        return RMAP_NOMATCH; +		plist = prefix_list_lookup(AFI_IP, (char *)rule); +		if (plist == NULL) +			return RMAP_NOMATCH; -      return (prefix_list_apply (plist, &p) == PREFIX_DENY ? -              RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH; +		return (prefix_list_apply(plist, &p) == PREFIX_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	} +	return RMAP_NOMATCH;  } -static void * -route_match_ip_next_hop_prefix_list_compile (const char *arg) +static void *route_match_ip_next_hop_prefix_list_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  } -static void -route_match_ip_next_hop_prefix_list_free (void *rule) +static void route_match_ip_next_hop_prefix_list_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } -struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd = -{ -  "ip next-hop prefix-list", -  route_match_ip_next_hop_prefix_list, -  route_match_ip_next_hop_prefix_list_compile, -  route_match_ip_next_hop_prefix_list_free -}; +struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd = { +	"ip next-hop prefix-list", route_match_ip_next_hop_prefix_list, +	route_match_ip_next_hop_prefix_list_compile, +	route_match_ip_next_hop_prefix_list_free};  /* `match ip route-source prefix-list PREFIX_LIST' */  static route_map_result_t -route_match_ip_route_source_prefix_list (void *rule, struct prefix *prefix, -					 route_map_object_t type, void *object) +route_match_ip_route_source_prefix_list(void *rule, struct prefix *prefix, +					route_map_object_t type, void *object)  { -  struct prefix_list *plist; -  struct bgp_info *bgp_info; -  struct peer *peer; -  struct prefix_ipv4 p; +	struct prefix_list *plist; +	struct bgp_info *bgp_info; +	struct peer *peer; +	struct prefix_ipv4 p; -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      peer = bgp_info->peer; +	if (type == RMAP_BGP) { +		bgp_info = object; +		peer = bgp_info->peer; -      if (! peer || sockunion_family (&peer->su) != AF_INET) -	return RMAP_NOMATCH; +		if (!peer || sockunion_family(&peer->su) != AF_INET) +			return RMAP_NOMATCH; -      p.family = AF_INET; -      p.prefix = peer->su.sin.sin_addr; -      p.prefixlen = IPV4_MAX_BITLEN; +		p.family = AF_INET; +		p.prefix = peer->su.sin.sin_addr; +		p.prefixlen = IPV4_MAX_BITLEN; -      plist = prefix_list_lookup (AFI_IP, (char *) rule); -      if (plist == NULL) -        return RMAP_NOMATCH; +		plist = prefix_list_lookup(AFI_IP, (char *)rule); +		if (plist == NULL) +			return RMAP_NOMATCH; -      return (prefix_list_apply (plist, &p) == PREFIX_DENY ? -              RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH; +		return (prefix_list_apply(plist, &p) == PREFIX_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	} +	return RMAP_NOMATCH;  } -static void * -route_match_ip_route_source_prefix_list_compile (const char *arg) +static void *route_match_ip_route_source_prefix_list_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  } -static void -route_match_ip_route_source_prefix_list_free (void *rule) +static void route_match_ip_route_source_prefix_list_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } -struct route_map_rule_cmd route_match_ip_route_source_prefix_list_cmd = -{ -  "ip route-source prefix-list", -  route_match_ip_route_source_prefix_list, -  route_match_ip_route_source_prefix_list_compile, -  route_match_ip_route_source_prefix_list_free -}; +struct route_map_rule_cmd route_match_ip_route_source_prefix_list_cmd = { +	"ip route-source prefix-list", route_match_ip_route_source_prefix_list, +	route_match_ip_route_source_prefix_list_compile, +	route_match_ip_route_source_prefix_list_free};  /* `match local-preference LOCAL-PREF' */  /* Match function return 1 if match is success else return zero. */ -static route_map_result_t -route_match_local_pref (void *rule, struct prefix *prefix, -			route_map_object_t type, void *object) -{ -  u_int32_t *local_pref; -  struct bgp_info *bgp_info; - -  if (type == RMAP_BGP) -    { -      local_pref = rule; -      bgp_info = object; - -      if (bgp_info->attr->local_pref == *local_pref) -	return RMAP_MATCH; -      else +static route_map_result_t route_match_local_pref(void *rule, +						 struct prefix *prefix, +						 route_map_object_t type, +						 void *object) +{ +	u_int32_t *local_pref; +	struct bgp_info *bgp_info; + +	if (type == RMAP_BGP) { +		local_pref = rule; +		bgp_info = object; + +		if (bgp_info->attr->local_pref == *local_pref) +			return RMAP_MATCH; +		else +			return RMAP_NOMATCH; +	}  	return RMAP_NOMATCH; -    } -  return RMAP_NOMATCH;  }  /* Route map `match local-preference' match statement.     `arg' is local-pref value */ -static void * -route_match_local_pref_compile (const char *arg) +static void *route_match_local_pref_compile(const char *arg)  { -  u_int32_t *local_pref; -  char *endptr = NULL; -  unsigned long tmpval; +	u_int32_t *local_pref; +	char *endptr = NULL; +	unsigned long tmpval; -  /* Locpref value shoud be integer. */ -  if (! all_digit (arg)) -    return NULL; +	/* Locpref value shoud be integer. */ +	if (!all_digit(arg)) +		return NULL; -  errno = 0; -  tmpval = strtoul (arg, &endptr, 10); -  if (*endptr != '\0' || errno || tmpval > UINT32_MAX) -    return NULL; +	errno = 0; +	tmpval = strtoul(arg, &endptr, 10); +	if (*endptr != '\0' || errno || tmpval > UINT32_MAX) +		return NULL; -  local_pref = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t)); +	local_pref = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(u_int32_t)); -  if (!local_pref) -    return local_pref; +	if (!local_pref) +		return local_pref; -  *local_pref = tmpval; -  return local_pref; +	*local_pref = tmpval; +	return local_pref;  }  /* Free route map's compiled `match local-preference' value. */ -static void -route_match_local_pref_free (void *rule) +static void route_match_local_pref_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for metric matching. */ -struct route_map_rule_cmd route_match_local_pref_cmd = -{ -  "local-preference", -  route_match_local_pref, -  route_match_local_pref_compile, -  route_match_local_pref_free -}; +struct route_map_rule_cmd route_match_local_pref_cmd = { +	"local-preference", route_match_local_pref, +	route_match_local_pref_compile, route_match_local_pref_free};  /* `match metric METRIC' */  /* Match function return 1 if match is success else return zero. */ -static route_map_result_t -route_match_metric (void *rule, struct prefix *prefix, -		    route_map_object_t type, void *object) +static route_map_result_t route_match_metric(void *rule, struct prefix *prefix, +					     route_map_object_t type, +					     void *object)  { -  struct rmap_value *rv; -  struct bgp_info *bgp_info; +	struct rmap_value *rv; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      rv = rule; -      bgp_info = object; -      return route_value_match(rv, bgp_info->attr->med); -    } -  return RMAP_NOMATCH; +	if (type == RMAP_BGP) { +		rv = rule; +		bgp_info = object; +		return route_value_match(rv, bgp_info->attr->med); +	} +	return RMAP_NOMATCH;  }  /* Route map commands for metric matching. */ -struct route_map_rule_cmd route_match_metric_cmd = -{ -  "metric", -  route_match_metric, -  route_value_compile, -  route_value_free, +struct route_map_rule_cmd route_match_metric_cmd = { +	"metric", route_match_metric, route_value_compile, route_value_free,  };  /* `match as-path ASPATH' */  /* Match function for as-path match.  I assume given object is */ -static route_map_result_t -route_match_aspath (void *rule, struct prefix *prefix, -		    route_map_object_t type, void *object) +static route_map_result_t route_match_aspath(void *rule, struct prefix *prefix, +					     route_map_object_t type, +					     void *object)  { -  struct as_list *as_list; -  struct bgp_info *bgp_info; +	struct as_list *as_list; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      as_list = as_list_lookup ((char *) rule); -      if (as_list == NULL) -	return RMAP_NOMATCH; +	if (type == RMAP_BGP) { +		as_list = as_list_lookup((char *)rule); +		if (as_list == NULL) +			return RMAP_NOMATCH; -      bgp_info = object; +		bgp_info = object; -      /* Perform match. */ -      return ((as_list_apply (as_list, bgp_info->attr->aspath) == AS_FILTER_DENY) ? RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH; +		/* Perform match. */ +		return ((as_list_apply(as_list, bgp_info->attr->aspath) +			 == AS_FILTER_DENY) +				? RMAP_NOMATCH +				: RMAP_MATCH); +	} +	return RMAP_NOMATCH;  }  /* Compile function for as-path match. */ -static void * -route_match_aspath_compile (const char *arg) +static void *route_match_aspath_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  }  /* Compile function for as-path match. */ -static void -route_match_aspath_free (void *rule) +static void route_match_aspath_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for aspath matching. */ -struct route_map_rule_cmd route_match_aspath_cmd = -{ -  "as-path", -  route_match_aspath, -  route_match_aspath_compile, -  route_match_aspath_free -}; +struct route_map_rule_cmd route_match_aspath_cmd = { +	"as-path", route_match_aspath, route_match_aspath_compile, +	route_match_aspath_free};  /* `match community COMMUNIY' */ -struct rmap_community -{ -  char *name; -  int exact; +struct rmap_community { +	char *name; +	int exact;  };  /* Match function for community match. */ -static route_map_result_t -route_match_community (void *rule, struct prefix *prefix, -		       route_map_object_t type, void *object) -{ -  struct community_list *list; -  struct bgp_info *bgp_info; -  struct rmap_community *rcom; - -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      rcom = rule; - -      list = community_list_lookup (bgp_clist, rcom->name, COMMUNITY_LIST_MASTER); -      if (! list) -	return RMAP_NOMATCH; - -      if (rcom->exact) -	{ -	  if (community_list_exact_match (bgp_info->attr->community, list)) -	    return RMAP_MATCH; -	} -      else -	{ -	  if (community_list_match (bgp_info->attr->community, list)) -	    return RMAP_MATCH; +static route_map_result_t route_match_community(void *rule, +						struct prefix *prefix, +						route_map_object_t type, +						void *object) +{ +	struct community_list *list; +	struct bgp_info *bgp_info; +	struct rmap_community *rcom; + +	if (type == RMAP_BGP) { +		bgp_info = object; +		rcom = rule; + +		list = community_list_lookup(bgp_clist, rcom->name, +					     COMMUNITY_LIST_MASTER); +		if (!list) +			return RMAP_NOMATCH; + +		if (rcom->exact) { +			if (community_list_exact_match( +				    bgp_info->attr->community, list)) +				return RMAP_MATCH; +		} else { +			if (community_list_match(bgp_info->attr->community, +						 list)) +				return RMAP_MATCH; +		}  	} -    } -  return RMAP_NOMATCH; +	return RMAP_NOMATCH;  }  /* Compile function for community match. */ -static void * -route_match_community_compile (const char *arg) -{ -  struct rmap_community *rcom; -  int len; -  char *p; - -  rcom = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct rmap_community)); - -  p = strchr (arg, ' '); -  if (p) -    { -      len = p - arg; -      rcom->name = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, len + 1); -      memcpy (rcom->name, arg, len); -      rcom->exact = 1; -    } -  else -    { -      rcom->name = XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); -      rcom->exact = 0; -    } -  return rcom; +static void *route_match_community_compile(const char *arg) +{ +	struct rmap_community *rcom; +	int len; +	char *p; + +	rcom = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_community)); + +	p = strchr(arg, ' '); +	if (p) { +		len = p - arg; +		rcom->name = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, len + 1); +		memcpy(rcom->name, arg, len); +		rcom->exact = 1; +	} else { +		rcom->name = XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg); +		rcom->exact = 0; +	} +	return rcom;  }  /* Compile function for community match. */ -static void -route_match_community_free (void *rule) +static void route_match_community_free(void *rule)  { -  struct rmap_community *rcom = rule; +	struct rmap_community *rcom = rule; -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rcom->name); -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rcom); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rcom->name); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rcom);  }  /* Route map commands for community matching. */ -struct route_map_rule_cmd route_match_community_cmd = -{ -  "community", -  route_match_community, -  route_match_community_compile, -  route_match_community_free -}; +struct route_map_rule_cmd route_match_community_cmd = { +	"community", route_match_community, route_match_community_compile, +	route_match_community_free};  /* Match function for lcommunity match. */ -static route_map_result_t -route_match_lcommunity (void *rule, struct prefix *prefix, -                       route_map_object_t type, void *object) -{ -  struct community_list *list; -  struct bgp_info *bgp_info; -  struct rmap_community *rcom; - -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      rcom = rule; - -      list = community_list_lookup (bgp_clist, rcom->name, -                                    LARGE_COMMUNITY_LIST_MASTER); -      if (! list) -        return RMAP_NOMATCH; - -      if (lcommunity_list_match (bgp_info->attr->lcommunity, list)) -        return RMAP_MATCH; - -    } -  return RMAP_NOMATCH; +static route_map_result_t route_match_lcommunity(void *rule, +						 struct prefix *prefix, +						 route_map_object_t type, +						 void *object) +{ +	struct community_list *list; +	struct bgp_info *bgp_info; +	struct rmap_community *rcom; + +	if (type == RMAP_BGP) { +		bgp_info = object; +		rcom = rule; + +		list = community_list_lookup(bgp_clist, rcom->name, +					     LARGE_COMMUNITY_LIST_MASTER); +		if (!list) +			return RMAP_NOMATCH; + +		if (lcommunity_list_match(bgp_info->attr->lcommunity, list)) +			return RMAP_MATCH; +	} +	return RMAP_NOMATCH;  }  /* Compile function for community match. */ -static void * -route_match_lcommunity_compile (const char *arg) -{ -  struct rmap_community *rcom; -  int len; -  char *p; - -  rcom = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct rmap_community)); - -  p = strchr (arg, ' '); -  if (p) -    { -      len = p - arg; -      rcom->name = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, len + 1); -      memcpy (rcom->name, arg, len); -    } -  else -    { -      rcom->name = XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); -      rcom->exact = 0; -    } -  return rcom; +static void *route_match_lcommunity_compile(const char *arg) +{ +	struct rmap_community *rcom; +	int len; +	char *p; + +	rcom = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_community)); + +	p = strchr(arg, ' '); +	if (p) { +		len = p - arg; +		rcom->name = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, len + 1); +		memcpy(rcom->name, arg, len); +	} else { +		rcom->name = XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg); +		rcom->exact = 0; +	} +	return rcom;  }  /* Compile function for community match. */ -static void -route_match_lcommunity_free (void *rule) +static void route_match_lcommunity_free(void *rule)  { -  struct rmap_community *rcom = rule; +	struct rmap_community *rcom = rule; -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rcom->name); -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rcom); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rcom->name); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rcom);  }  /* Route map commands for community matching. */ -struct route_map_rule_cmd route_match_lcommunity_cmd = -{ -  "large-community", -  route_match_lcommunity, -  route_match_lcommunity_compile, -  route_match_lcommunity_free -}; +struct route_map_rule_cmd route_match_lcommunity_cmd = { +	"large-community", route_match_lcommunity, +	route_match_lcommunity_compile, route_match_lcommunity_free};  /* Match function for extcommunity match. */ -static route_map_result_t -route_match_ecommunity (void *rule, struct prefix *prefix, -			route_map_object_t type, void *object) +static route_map_result_t route_match_ecommunity(void *rule, +						 struct prefix *prefix, +						 route_map_object_t type, +						 void *object)  { -  struct community_list *list; -  struct bgp_info *bgp_info; +	struct community_list *list; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      bgp_info = object; +	if (type == RMAP_BGP) { +		bgp_info = object; -      list = community_list_lookup (bgp_clist, (char *) rule, -				    EXTCOMMUNITY_LIST_MASTER); -      if (! list) -	return RMAP_NOMATCH; +		list = community_list_lookup(bgp_clist, (char *)rule, +					     EXTCOMMUNITY_LIST_MASTER); +		if (!list) +			return RMAP_NOMATCH; -      if (ecommunity_list_match (bgp_info->attr->ecommunity, list)) -	return RMAP_MATCH; -    } -  return RMAP_NOMATCH; +		if (ecommunity_list_match(bgp_info->attr->ecommunity, list)) +			return RMAP_MATCH; +	} +	return RMAP_NOMATCH;  }  /* Compile function for extcommunity match. */ -static void * -route_match_ecommunity_compile (const char *arg) +static void *route_match_ecommunity_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  }  /* Compile function for extcommunity match. */ -static void -route_match_ecommunity_free (void *rule) +static void route_match_ecommunity_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for community matching. */ -struct route_map_rule_cmd route_match_ecommunity_cmd = -{ -  "extcommunity", -  route_match_ecommunity, -  route_match_ecommunity_compile, -  route_match_ecommunity_free -}; +struct route_map_rule_cmd route_match_ecommunity_cmd = { +	"extcommunity", route_match_ecommunity, route_match_ecommunity_compile, +	route_match_ecommunity_free};  /* `match nlri` and `set nlri` are replaced by `address-family ipv4`     and `address-family vpnv4'.  */  /* `match origin' */ -static route_map_result_t -route_match_origin (void *rule, struct prefix *prefix, -		    route_map_object_t type, void *object) +static route_map_result_t route_match_origin(void *rule, struct prefix *prefix, +					     route_map_object_t type, +					     void *object)  { -  u_char *origin; -  struct bgp_info *bgp_info; +	u_char *origin; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      origin = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		origin = rule; +		bgp_info = object; -      if (bgp_info->attr->origin == *origin) -	return RMAP_MATCH; -    } +		if (bgp_info->attr->origin == *origin) +			return RMAP_MATCH; +	} -  return RMAP_NOMATCH; +	return RMAP_NOMATCH;  } -static void * -route_match_origin_compile (const char *arg) +static void *route_match_origin_compile(const char *arg)  { -  u_char *origin; +	u_char *origin; -  origin = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_char)); +	origin = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(u_char)); -  if (strcmp (arg, "igp") == 0) -    *origin = 0; -  else if (strcmp (arg, "egp") == 0) -    *origin = 1; -  else -    *origin = 2; +	if (strcmp(arg, "igp") == 0) +		*origin = 0; +	else if (strcmp(arg, "egp") == 0) +		*origin = 1; +	else +		*origin = 2; -  return origin; +	return origin;  }  /* Free route map's compiled `ip address' value. */ -static void -route_match_origin_free (void *rule) +static void route_match_origin_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for origin matching. */ -struct route_map_rule_cmd route_match_origin_cmd = -{ -  "origin", -  route_match_origin, -  route_match_origin_compile, -  route_match_origin_free -}; +struct route_map_rule_cmd route_match_origin_cmd = { +	"origin", route_match_origin, route_match_origin_compile, +	route_match_origin_free};  /* match probability  { */ -static route_map_result_t -route_match_probability (void *rule, struct prefix *prefix, -		    route_map_object_t type, void *object) -{ -  long r = random(); - -  switch (*(long *) rule) -  { -    case 0: break; -    case RAND_MAX: return RMAP_MATCH; -    default: -      if (r < *(long *) rule) -        { -          return RMAP_MATCH; -        } -  } +static route_map_result_t route_match_probability(void *rule, +						  struct prefix *prefix, +						  route_map_object_t type, +						  void *object) +{ +	long r = random(); + +	switch (*(long *)rule) { +	case 0: +		break; +	case RAND_MAX: +		return RMAP_MATCH; +	default: +		if (r < *(long *)rule) { +			return RMAP_MATCH; +		} +	} -  return RMAP_NOMATCH; +	return RMAP_NOMATCH;  } -static void * -route_match_probability_compile (const char *arg) +static void *route_match_probability_compile(const char *arg)  { -  long *lobule; -  unsigned  perc; +	long *lobule; +	unsigned perc; -  perc    = atoi (arg); -  lobule  = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (long)); +	perc = atoi(arg); +	lobule = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(long)); -  switch (perc) -    { -      case 0:   *lobule = 0; break; -      case 100: *lobule = RAND_MAX; break; -      default:  *lobule = RAND_MAX / 100 * perc; -    } +	switch (perc) { +	case 0: +		*lobule = 0; +		break; +	case 100: +		*lobule = RAND_MAX; +		break; +	default: +		*lobule = RAND_MAX / 100 * perc; +	} -  return lobule; +	return lobule;  } -static void -route_match_probability_free (void *rule) +static void route_match_probability_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } -struct route_map_rule_cmd route_match_probability_cmd = -{ -  "probability", -  route_match_probability, -  route_match_probability_compile, -  route_match_probability_free -}; +struct route_map_rule_cmd route_match_probability_cmd = { +	"probability", route_match_probability, route_match_probability_compile, +	route_match_probability_free};  /* `match interface IFNAME' */  /* Match function should return 1 if match is success else return     zero. */ -static route_map_result_t -route_match_interface (void *rule, struct prefix *prefix, -		       route_map_object_t type, void *object) +static route_map_result_t route_match_interface(void *rule, +						struct prefix *prefix, +						route_map_object_t type, +						void *object)  { -  struct interface *ifp; -  struct bgp_info *info; +	struct interface *ifp; +	struct bgp_info *info; -  if (type == RMAP_BGP) -    { -      info = object; +	if (type == RMAP_BGP) { +		info = object; -      if (!info || !info->attr) -	return RMAP_NOMATCH; +		if (!info || !info->attr) +			return RMAP_NOMATCH; -      ifp = if_lookup_by_name_all_vrf ((char *)rule); +		ifp = if_lookup_by_name_all_vrf((char *)rule); -      if (ifp == NULL || ifp->ifindex != info->attr->nh_ifindex) -	return RMAP_NOMATCH; +		if (ifp == NULL || ifp->ifindex != info->attr->nh_ifindex) +			return RMAP_NOMATCH; -      return RMAP_MATCH; -    } -  return RMAP_NOMATCH; +		return RMAP_MATCH; +	} +	return RMAP_NOMATCH;  }  /* Route map `interface' match statement.  `arg' should be     interface name. */ -static void * -route_match_interface_compile (const char *arg) +static void *route_match_interface_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  }  /* Free route map's compiled `interface' value. */ -static void -route_match_interface_free (void *rule) +static void route_match_interface_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip address matching. */ -struct route_map_rule_cmd route_match_interface_cmd = -{ -  "interface", -  route_match_interface, -  route_match_interface_compile, -  route_match_interface_free -}; +struct route_map_rule_cmd route_match_interface_cmd = { +	"interface", route_match_interface, route_match_interface_compile, +	route_match_interface_free};  /* } */  /* `set ip next-hop IP_ADDRESS' */  /* Match function return 1 if match is success else return zero. */ -static route_map_result_t -route_match_tag (void *rule, struct prefix *prefix, -                 route_map_object_t type, void *object) +static route_map_result_t route_match_tag(void *rule, struct prefix *prefix, +					  route_map_object_t type, void *object)  { -  route_tag_t *tag; -  struct bgp_info *bgp_info; +	route_tag_t *tag; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      tag = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		tag = rule; +		bgp_info = object; -      return ((bgp_info->attr->tag == *tag)? RMAP_MATCH : RMAP_NOMATCH); -    } +		return ((bgp_info->attr->tag == *tag) ? RMAP_MATCH +						      : RMAP_NOMATCH); +	} -  return RMAP_NOMATCH; +	return RMAP_NOMATCH;  }  /* Route map commands for tag matching. */ -static struct route_map_rule_cmd route_match_tag_cmd = -{ -  "tag", -  route_match_tag, -  route_map_rule_tag_compile, -  route_map_rule_tag_free, +static struct route_map_rule_cmd route_match_tag_cmd = { +	"tag", route_match_tag, route_map_rule_tag_compile, +	route_map_rule_tag_free,  };  /* Set nexthop to object.  ojbect must be pointer to struct attr. */ -struct rmap_ip_nexthop_set -{ -  struct in_addr *address; -  int peer_address; -  int unchanged; +struct rmap_ip_nexthop_set { +	struct in_addr *address; +	int peer_address; +	int unchanged;  }; -static route_map_result_t -route_set_ip_nexthop (void *rule, struct prefix *prefix, -		      route_map_object_t type, void *object) -{ -  struct rmap_ip_nexthop_set *rins = rule; -  struct bgp_info *bgp_info; -  struct peer *peer; - -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      peer = bgp_info->peer; - -      if (rins->unchanged) -      { -        SET_FLAG(bgp_info->attr->rmap_change_flags, -                 BATTR_RMAP_NEXTHOP_UNCHANGED); -      } -      else if (rins->peer_address) -	{ -         if ((CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN) || -           CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT)) -	      && peer->su_remote -	      && sockunion_family (peer->su_remote) == AF_INET) -	    { -	      bgp_info->attr->nexthop.s_addr = sockunion2ip (peer->su_remote); -	      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP); -	    } -	 else if (CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT)) -	    { -	      /* The next hop value will be set as part of packet rewrite. -	       * Set the flags here to indicate that rewrite needs to be done. -               * Also, clear the value. -	       */ -	      SET_FLAG(bgp_info->attr->rmap_change_flags, -		       BATTR_RMAP_NEXTHOP_PEER_ADDRESS); -              bgp_info->attr->nexthop.s_addr = 0; -	    } -	} -      else -	{ -	  /* Set next hop value. */ -	  bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP); -	  bgp_info->attr->nexthop = *rins->address; -	  SET_FLAG(bgp_info->attr->rmap_change_flags, -		   BATTR_RMAP_IPV4_NHOP_CHANGED); +static route_map_result_t route_set_ip_nexthop(void *rule, +					       struct prefix *prefix, +					       route_map_object_t type, +					       void *object) +{ +	struct rmap_ip_nexthop_set *rins = rule; +	struct bgp_info *bgp_info; +	struct peer *peer; + +	if (type == RMAP_BGP) { +		bgp_info = object; +		peer = bgp_info->peer; + +		if (rins->unchanged) { +			SET_FLAG(bgp_info->attr->rmap_change_flags, +				 BATTR_RMAP_NEXTHOP_UNCHANGED); +		} else if (rins->peer_address) { +			if ((CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IN) +			     || CHECK_FLAG(peer->rmap_type, +					   PEER_RMAP_TYPE_IMPORT)) +			    && peer->su_remote +			    && sockunion_family(peer->su_remote) == AF_INET) { +				bgp_info->attr->nexthop.s_addr = +					sockunion2ip(peer->su_remote); +				bgp_info->attr->flag |= +					ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP); +			} else if (CHECK_FLAG(peer->rmap_type, +					      PEER_RMAP_TYPE_OUT)) { +				/* The next hop value will be set as part of +				 * packet rewrite. +				 * Set the flags here to indicate that rewrite +				 * needs to be done. +				 * Also, clear the value. +				 */ +				SET_FLAG(bgp_info->attr->rmap_change_flags, +					 BATTR_RMAP_NEXTHOP_PEER_ADDRESS); +				bgp_info->attr->nexthop.s_addr = 0; +			} +		} else { +			/* Set next hop value. */ +			bgp_info->attr->flag |= +				ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP); +			bgp_info->attr->nexthop = *rins->address; +			SET_FLAG(bgp_info->attr->rmap_change_flags, +				 BATTR_RMAP_IPV4_NHOP_CHANGED); +		}  	} -    } -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Route map `ip nexthop' compile function.  Given string is converted     to struct in_addr structure. */ -static void * -route_set_ip_nexthop_compile (const char *arg) -{ -  struct rmap_ip_nexthop_set *rins; -  struct in_addr *address = NULL; -  int peer_address = 0; -  int unchanged = 0; -  int ret; - -  if (strcmp (arg, "peer-address") == 0) -    peer_address = 1; -  else if (strcmp (arg, "unchanged") == 0) -    unchanged = 1; -  else -    { -      address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in_addr)); -      ret = inet_aton (arg, address); - -      if (ret == 0) -	{ -	  XFREE (MTYPE_ROUTE_MAP_COMPILED, address); -	  return NULL; +static void *route_set_ip_nexthop_compile(const char *arg) +{ +	struct rmap_ip_nexthop_set *rins; +	struct in_addr *address = NULL; +	int peer_address = 0; +	int unchanged = 0; +	int ret; + +	if (strcmp(arg, "peer-address") == 0) +		peer_address = 1; +	else if (strcmp(arg, "unchanged") == 0) +		unchanged = 1; +	else { +		address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, +				  sizeof(struct in_addr)); +		ret = inet_aton(arg, address); + +		if (ret == 0) { +			XFREE(MTYPE_ROUTE_MAP_COMPILED, address); +			return NULL; +		}  	} -    } -  rins = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct rmap_ip_nexthop_set)); +	rins = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, +		       sizeof(struct rmap_ip_nexthop_set)); -  rins->address = address; -  rins->peer_address = peer_address; -  rins->unchanged = unchanged; +	rins->address = address; +	rins->peer_address = peer_address; +	rins->unchanged = unchanged; -  return rins; +	return rins;  }  /* Free route map's compiled `ip nexthop' value. */ -static void -route_set_ip_nexthop_free (void *rule) +static void route_set_ip_nexthop_free(void *rule)  { -  struct rmap_ip_nexthop_set *rins = rule; +	struct rmap_ip_nexthop_set *rins = rule; -  if (rins->address) -    XFREE (MTYPE_ROUTE_MAP_COMPILED, rins->address); +	if (rins->address) +		XFREE(MTYPE_ROUTE_MAP_COMPILED, rins->address); -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rins); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rins);  }  /* Route map commands for ip nexthop set. */ -struct route_map_rule_cmd route_set_ip_nexthop_cmd = -{ -  "ip next-hop", -  route_set_ip_nexthop, -  route_set_ip_nexthop_compile, -  route_set_ip_nexthop_free -}; +struct route_map_rule_cmd route_set_ip_nexthop_cmd = { +	"ip next-hop", route_set_ip_nexthop, route_set_ip_nexthop_compile, +	route_set_ip_nexthop_free};  /* `set local-preference LOCAL_PREF' */  /* Set local preference. */ -static route_map_result_t -route_set_local_pref (void *rule, struct prefix *prefix, -		      route_map_object_t type, void *object) -{ -  struct rmap_value *rv; -  struct bgp_info *bgp_info; -  u_int32_t locpref = 0; - -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      rv = rule; -      bgp_info = object; - -      /* Set local preference value. */ -      if (bgp_info->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF)) -	locpref = bgp_info->attr->local_pref; - -      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF); -      bgp_info->attr->local_pref = route_value_adjust(rv, locpref, bgp_info->peer); -    } +static route_map_result_t route_set_local_pref(void *rule, +					       struct prefix *prefix, +					       route_map_object_t type, +					       void *object) +{ +	struct rmap_value *rv; +	struct bgp_info *bgp_info; +	u_int32_t locpref = 0; + +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		rv = rule; +		bgp_info = object; + +		/* Set local preference value. */ +		if (bgp_info->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)) +			locpref = bgp_info->attr->local_pref; + +		bgp_info->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF); +		bgp_info->attr->local_pref = +			route_value_adjust(rv, locpref, bgp_info->peer); +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Set local preference rule structure. */ -struct route_map_rule_cmd route_set_local_pref_cmd = -{ -  "local-preference", -  route_set_local_pref, -  route_value_compile, -  route_value_free, +struct route_map_rule_cmd route_set_local_pref_cmd = { +	"local-preference", route_set_local_pref, route_value_compile, +	route_value_free,  };  /* `set weight WEIGHT' */  /* Set weight. */ -static route_map_result_t -route_set_weight (void *rule, struct prefix *prefix, route_map_object_t type, -		  void *object) +static route_map_result_t route_set_weight(void *rule, struct prefix *prefix, +					   route_map_object_t type, +					   void *object)  { -  struct rmap_value *rv; -  struct bgp_info *bgp_info; +	struct rmap_value *rv; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      rv = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		rv = rule; +		bgp_info = object; -      /* Set weight value. */ -      bgp_info->attr->weight = route_value_adjust(rv, 0, bgp_info->peer); -    } +		/* Set weight value. */ +		bgp_info->attr->weight = +			route_value_adjust(rv, 0, bgp_info->peer); +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Set local preference rule structure. */ -struct route_map_rule_cmd route_set_weight_cmd = -{ -  "weight", -  route_set_weight, -  route_value_compile, -  route_value_free, +struct route_map_rule_cmd route_set_weight_cmd = { +	"weight", route_set_weight, route_value_compile, route_value_free,  };  /* `set metric METRIC' */  /* Set metric to attribute. */ -static route_map_result_t -route_set_metric (void *rule, struct prefix *prefix, -		  route_map_object_t type, void *object) -{ -  struct rmap_value *rv; -  struct bgp_info *bgp_info; -  u_int32_t med = 0; - -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      rv = rule; -      bgp_info = object; - -      if (bgp_info->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC)) -	med = bgp_info->attr->med; - -      bgp_info->attr->med = route_value_adjust(rv, med, bgp_info->peer); -      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC); -    } -  return RMAP_OKAY; +static route_map_result_t route_set_metric(void *rule, struct prefix *prefix, +					   route_map_object_t type, +					   void *object) +{ +	struct rmap_value *rv; +	struct bgp_info *bgp_info; +	u_int32_t med = 0; + +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		rv = rule; +		bgp_info = object; + +		if (bgp_info->attr->flag +		    & ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC)) +			med = bgp_info->attr->med; + +		bgp_info->attr->med = +			route_value_adjust(rv, med, bgp_info->peer); +		bgp_info->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC); +	} +	return RMAP_OKAY;  }  /* Set metric rule structure. */ -struct route_map_rule_cmd route_set_metric_cmd = -{ -  "metric", -  route_set_metric, -  route_value_compile, -  route_value_free, +struct route_map_rule_cmd route_set_metric_cmd = { +	"metric", route_set_metric, route_value_compile, route_value_free,  };  /* `set as-path prepend ASPATH' */  /* For AS path prepend mechanism. */ -static route_map_result_t -route_set_aspath_prepend (void *rule, struct prefix *prefix, route_map_object_t type, void *object) -{ -  struct aspath *aspath; -  struct aspath *new; -  struct bgp_info *binfo; - -  if (type == RMAP_BGP) -    { -      binfo = object; - -      if (binfo->attr->aspath->refcnt) -	new = aspath_dup (binfo->attr->aspath); -      else -	new = binfo->attr->aspath; - -      if ((uintptr_t)rule > 10) -      { -	aspath = rule; -	aspath_prepend (aspath, new); -      } -      else -      { -	as_t as = aspath_leftmost(new); -	if (!as) as = binfo->peer->as; -	new = aspath_add_seq_n (new, as, (uintptr_t) rule); -      } +static route_map_result_t route_set_aspath_prepend(void *rule, +						   struct prefix *prefix, +						   route_map_object_t type, +						   void *object) +{ +	struct aspath *aspath; +	struct aspath *new; +	struct bgp_info *binfo; + +	if (type == RMAP_BGP) { +		binfo = object; + +		if (binfo->attr->aspath->refcnt) +			new = aspath_dup(binfo->attr->aspath); +		else +			new = binfo->attr->aspath; + +		if ((uintptr_t)rule > 10) { +			aspath = rule; +			aspath_prepend(aspath, new); +		} else { +			as_t as = aspath_leftmost(new); +			if (!as) +				as = binfo->peer->as; +			new = aspath_add_seq_n(new, as, (uintptr_t)rule); +		} -      binfo->attr->aspath = new; -    } +		binfo->attr->aspath = new; +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  } -static void * -route_set_aspath_prepend_compile (const char *arg) +static void *route_set_aspath_prepend_compile(const char *arg)  { -  unsigned int num; +	unsigned int num; -  if (sscanf(arg, "last-as %u", &num) == 1 && num > 0 && num <= 10) -    return (void*)(uintptr_t)num; +	if (sscanf(arg, "last-as %u", &num) == 1 && num > 0 && num <= 10) +		return (void *)(uintptr_t)num; -  return route_aspath_compile(arg); +	return route_aspath_compile(arg);  } -static void -route_set_aspath_prepend_free (void *rule) +static void route_set_aspath_prepend_free(void *rule)  { -  if ((uintptr_t)rule > 10) -    route_aspath_free(rule); +	if ((uintptr_t)rule > 10) +		route_aspath_free(rule);  }  /* Set as-path prepend rule structure. */ -struct route_map_rule_cmd route_set_aspath_prepend_cmd = -{ -  "as-path prepend", -  route_set_aspath_prepend, -  route_set_aspath_prepend_compile, -  route_set_aspath_prepend_free, +struct route_map_rule_cmd route_set_aspath_prepend_cmd = { +	"as-path prepend", route_set_aspath_prepend, +	route_set_aspath_prepend_compile, route_set_aspath_prepend_free,  };  /* `set as-path exclude ASn' */  /* For ASN exclude mechanism. - * Iterate over ASns requested and filter them from the given AS_PATH one by one. + * Iterate over ASns requested and filter them from the given AS_PATH one by + * one.   * Make a deep copy of existing AS_PATH, but for the first ASn only.   */ -static route_map_result_t -route_set_aspath_exclude (void *rule, struct prefix *dummy, route_map_object_t type, void *object) -{ -  struct aspath * new_path, * exclude_path; -  struct bgp_info *binfo; - -  if (type == RMAP_BGP) -  { -    exclude_path = rule; -    binfo = object; -    if (binfo->attr->aspath->refcnt) -      new_path = aspath_dup (binfo->attr->aspath); -    else -      new_path = binfo->attr->aspath; -    binfo->attr->aspath = aspath_filter_exclude (new_path, exclude_path); -  } -  return RMAP_OKAY; +static route_map_result_t route_set_aspath_exclude(void *rule, +						   struct prefix *dummy, +						   route_map_object_t type, +						   void *object) +{ +	struct aspath *new_path, *exclude_path; +	struct bgp_info *binfo; + +	if (type == RMAP_BGP) { +		exclude_path = rule; +		binfo = object; +		if (binfo->attr->aspath->refcnt) +			new_path = aspath_dup(binfo->attr->aspath); +		else +			new_path = binfo->attr->aspath; +		binfo->attr->aspath = +			aspath_filter_exclude(new_path, exclude_path); +	} +	return RMAP_OKAY;  }  /* Set ASn exlude rule structure. */ -struct route_map_rule_cmd route_set_aspath_exclude_cmd = -{ -  "as-path exclude", -  route_set_aspath_exclude, -  route_aspath_compile, -  route_aspath_free, +struct route_map_rule_cmd route_set_aspath_exclude_cmd = { +	"as-path exclude", route_set_aspath_exclude, route_aspath_compile, +	route_aspath_free,  };  /* `set community COMMUNITY' */ -struct rmap_com_set -{ -  struct community *com; -  int additive; -  int none; +struct rmap_com_set { +	struct community *com; +	int additive; +	int none;  };  /* For community set mechanism. */ -static route_map_result_t -route_set_community (void *rule, struct prefix *prefix, -		     route_map_object_t type, void *object) -{ -  struct rmap_com_set *rcs; -  struct bgp_info *binfo; -  struct attr *attr; -  struct community *new = NULL; -  struct community *old; -  struct community *merge; - -  if (type == RMAP_BGP) -    { -      rcs = rule; -      binfo = object; -      attr = binfo->attr; -      old = attr->community; - -      /* "none" case.  */ -      if (rcs->none) -	{ -	  attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES)); -	  attr->community = NULL; -	  /* See the longer comment down below. */ -	  if (old && old->refcnt == 0) -	    community_free(old); -	  return RMAP_OKAY; -	} +static route_map_result_t route_set_community(void *rule, struct prefix *prefix, +					      route_map_object_t type, +					      void *object) +{ +	struct rmap_com_set *rcs; +	struct bgp_info *binfo; +	struct attr *attr; +	struct community *new = NULL; +	struct community *old; +	struct community *merge; + +	if (type == RMAP_BGP) { +		rcs = rule; +		binfo = object; +		attr = binfo->attr; +		old = attr->community; + +		/* "none" case.  */ +		if (rcs->none) { +			attr->flag &= ~(ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES)); +			attr->community = NULL; +			/* See the longer comment down below. */ +			if (old && old->refcnt == 0) +				community_free(old); +			return RMAP_OKAY; +		} -      /* "additive" case.  */ -      if (rcs->additive && old) -	{ -	  merge = community_merge (community_dup (old), rcs->com); - -	  /* HACK: if the old community is not intern'd, -           * we should free it here, or all reference to it may be lost. -           * Really need to cleanup attribute caching sometime. -           */ -	  if (old->refcnt == 0) -	    community_free (old); -	  new = community_uniq_sort (merge); -	  community_free (merge); +		/* "additive" case.  */ +		if (rcs->additive && old) { +			merge = community_merge(community_dup(old), rcs->com); + +			/* HACK: if the old community is not intern'd, +			 * we should free it here, or all reference to it may be +			 * lost. +			 * Really need to cleanup attribute caching sometime. +			 */ +			if (old->refcnt == 0) +				community_free(old); +			new = community_uniq_sort(merge); +			community_free(merge); +		} else +			new = community_dup(rcs->com); + +		/* will be interned by caller if required */ +		attr->community = new; + +		attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES);  	} -      else -	new = community_dup (rcs->com); - -      /* will be interned by caller if required */ -      attr->community = new; - -      attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES); -    } -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Compile function for set community. */ -static void * -route_set_community_compile (const char *arg) -{ -  struct rmap_com_set *rcs; -  struct community *com = NULL; -  char *sp; -  int additive = 0; -  int none = 0; - -  if (strcmp (arg, "none") == 0) -    none = 1; -  else -    { -      sp = strstr (arg, "additive"); - -      if (sp && sp > arg) -  	{ -	  /* "additive" keyworkd is included.  */ -	  additive = 1; -	  *(sp - 1) = '\0'; -	} +static void *route_set_community_compile(const char *arg) +{ +	struct rmap_com_set *rcs; +	struct community *com = NULL; +	char *sp; +	int additive = 0; +	int none = 0; + +	if (strcmp(arg, "none") == 0) +		none = 1; +	else { +		sp = strstr(arg, "additive"); + +		if (sp && sp > arg) { +			/* "additive" keyworkd is included.  */ +			additive = 1; +			*(sp - 1) = '\0'; +		} -      com = community_str2com (arg); +		com = community_str2com(arg); -      if (additive) -	*(sp - 1) = ' '; +		if (additive) +			*(sp - 1) = ' '; -      if (! com) -	return NULL; -    } +		if (!com) +			return NULL; +	} -  rcs = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct rmap_com_set)); -  rcs->com = com; -  rcs->additive = additive; -  rcs->none = none; +	rcs = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_com_set)); +	rcs->com = com; +	rcs->additive = additive; +	rcs->none = none; -  return rcs; +	return rcs;  }  /* Free function for set community. */ -static void -route_set_community_free (void *rule) +static void route_set_community_free(void *rule)  { -  struct rmap_com_set *rcs = rule; +	struct rmap_com_set *rcs = rule; -  if (rcs->com) -    community_free (rcs->com); -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rcs); +	if (rcs->com) +		community_free(rcs->com); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rcs);  }  /* Set community rule structure. */ -struct route_map_rule_cmd route_set_community_cmd = -{ -  "community", -  route_set_community, -  route_set_community_compile, -  route_set_community_free, +struct route_map_rule_cmd route_set_community_cmd = { +	"community", route_set_community, route_set_community_compile, +	route_set_community_free,  };  /* `set community COMMUNITY' */ -struct rmap_lcom_set -{ -  struct lcommunity *lcom; -  int additive; -  int none; +struct rmap_lcom_set { +	struct lcommunity *lcom; +	int additive; +	int none;  };  /* For lcommunity set mechanism. */ -static route_map_result_t -route_set_lcommunity (void *rule, struct prefix *prefix, -                     route_map_object_t type, void *object) -{ -  struct rmap_lcom_set *rcs; -  struct bgp_info *binfo; -  struct attr *attr; -  struct lcommunity *new = NULL; -  struct lcommunity *old; -  struct lcommunity *merge; - -  if (type == RMAP_BGP) -    { -      rcs = rule; -      binfo = object; -      attr = binfo->attr; -      old = attr->lcommunity; - -      /* "none" case.  */ -      if (rcs->none) -        { -          attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_LARGE_COMMUNITIES)); -          attr->lcommunity = NULL; - -          /* See the longer comment down below. */ -          if (old && old->refcnt == 0) -            lcommunity_free(&old); -          return RMAP_OKAY; -        } - -      if (rcs->additive && old) -        { -          merge = lcommunity_merge (lcommunity_dup (old), rcs->lcom); - -          /* HACK: if the old large-community is not intern'd, -           * we should free it here, or all reference to it may be lost. -           * Really need to cleanup attribute caching sometime. -           */ -          if (old->refcnt == 0) -            lcommunity_free (&old); -          new = lcommunity_uniq_sort (merge); -          lcommunity_free (&merge); -        } -      else -        new = lcommunity_dup (rcs->lcom); - -      /* will be intern()'d or attr_flush()'d by bgp_update_main() */ -      attr->lcommunity = new; - -      attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LARGE_COMMUNITIES); -    } - -  return RMAP_OKAY; -} +static route_map_result_t route_set_lcommunity(void *rule, +					       struct prefix *prefix, +					       route_map_object_t type, +					       void *object) +{ +	struct rmap_lcom_set *rcs; +	struct bgp_info *binfo; +	struct attr *attr; +	struct lcommunity *new = NULL; +	struct lcommunity *old; +	struct lcommunity *merge; + +	if (type == RMAP_BGP) { +		rcs = rule; +		binfo = object; +		attr = binfo->attr; +		old = attr->lcommunity; + +		/* "none" case.  */ +		if (rcs->none) { +			attr->flag &= +				~(ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES)); +			attr->lcommunity = NULL; + +			/* See the longer comment down below. */ +			if (old && old->refcnt == 0) +				lcommunity_free(&old); +			return RMAP_OKAY; +		} -/* Compile function for set community. */ -static void * -route_set_lcommunity_compile (const char *arg) -{ -  struct rmap_lcom_set *rcs; -  struct lcommunity *lcom = NULL; -  char *sp; -  int additive = 0; -  int none = 0; +		if (rcs->additive && old) { +			merge = lcommunity_merge(lcommunity_dup(old), +						 rcs->lcom); + +			/* HACK: if the old large-community is not intern'd, +			 * we should free it here, or all reference to it may be +			 * lost. +			 * Really need to cleanup attribute caching sometime. +			 */ +			if (old->refcnt == 0) +				lcommunity_free(&old); +			new = lcommunity_uniq_sort(merge); +			lcommunity_free(&merge); +		} else +			new = lcommunity_dup(rcs->lcom); + +		/* will be intern()'d or attr_flush()'d by bgp_update_main() */ +		attr->lcommunity = new; + +		attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_LARGE_COMMUNITIES); +	} -  if (strcmp (arg, "none") == 0) -    none = 1; -  else -    { -      sp = strstr (arg, "additive"); +	return RMAP_OKAY; +} -      if (sp && sp > arg) -        { -          /* "additive" keyworkd is included.  */ -          additive = 1; -          *(sp - 1) = '\0'; -        } +/* Compile function for set community. */ +static void *route_set_lcommunity_compile(const char *arg) +{ +	struct rmap_lcom_set *rcs; +	struct lcommunity *lcom = NULL; +	char *sp; +	int additive = 0; +	int none = 0; + +	if (strcmp(arg, "none") == 0) +		none = 1; +	else { +		sp = strstr(arg, "additive"); + +		if (sp && sp > arg) { +			/* "additive" keyworkd is included.  */ +			additive = 1; +			*(sp - 1) = '\0'; +		} -      lcom = lcommunity_str2com (arg); +		lcom = lcommunity_str2com(arg); -      if (additive) -        *(sp - 1) = ' '; +		if (additive) +			*(sp - 1) = ' '; -      if (! lcom) -        return NULL; -    } +		if (!lcom) +			return NULL; +	} -  rcs = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct rmap_com_set)); -  rcs->lcom = lcom; -  rcs->additive = additive; -  rcs->none = none; +	rcs = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_com_set)); +	rcs->lcom = lcom; +	rcs->additive = additive; +	rcs->none = none; -  return rcs; +	return rcs;  }  /* Free function for set lcommunity. */ -static void -route_set_lcommunity_free (void *rule) +static void route_set_lcommunity_free(void *rule)  { -  struct rmap_lcom_set *rcs = rule; +	struct rmap_lcom_set *rcs = rule; -  if (rcs->lcom) { -    lcommunity_free (&rcs->lcom); -  } -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rcs); +	if (rcs->lcom) { +		lcommunity_free(&rcs->lcom); +	} +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rcs);  }  /* Set community rule structure. */ -struct route_map_rule_cmd route_set_lcommunity_cmd = -{ -  "large-community", -  route_set_lcommunity, -  route_set_lcommunity_compile, -  route_set_lcommunity_free, +struct route_map_rule_cmd route_set_lcommunity_cmd = { +	"large-community", route_set_lcommunity, route_set_lcommunity_compile, +	route_set_lcommunity_free,  };  /* `set large-comm-list (<1-99>|<100-500>|WORD) delete' */  /* For large community set mechanism. */ -static route_map_result_t -route_set_lcommunity_delete (void *rule, struct prefix *prefix, -                             route_map_object_t type, void *object) -{ -  struct community_list *list; -  struct lcommunity *merge; -  struct lcommunity *new; -  struct lcommunity *old; -  struct bgp_info *binfo; - -  if (type == RMAP_BGP) -    { -      if (! rule) -        return RMAP_OKAY; - -      binfo = object; -      list = community_list_lookup (bgp_clist, rule, -                                    LARGE_COMMUNITY_LIST_MASTER); -      old = binfo->attr->lcommunity; - -      if (list && old) -        { -          merge = lcommunity_list_match_delete (lcommunity_dup (old), list); -          new = lcommunity_uniq_sort (merge); -          lcommunity_free (&merge); - -          /* HACK: if the old community is not intern'd, -           * we should free it here, or all reference to it may be lost. -           * Really need to cleanup attribute caching sometime. -           */ -          if (old->refcnt == 0) -            lcommunity_free (&old); - -          if (new->size == 0) -            { -              binfo->attr->lcommunity = NULL; -              binfo->attr->flag &= ~ATTR_FLAG_BIT (BGP_ATTR_LARGE_COMMUNITIES); -              lcommunity_free (&new); -            } -          else -            { -              binfo->attr->lcommunity = new; -              binfo->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LARGE_COMMUNITIES); -            } -        } -    } - -  return RMAP_OKAY; +static route_map_result_t route_set_lcommunity_delete(void *rule, +						      struct prefix *prefix, +						      route_map_object_t type, +						      void *object) +{ +	struct community_list *list; +	struct lcommunity *merge; +	struct lcommunity *new; +	struct lcommunity *old; +	struct bgp_info *binfo; + +	if (type == RMAP_BGP) { +		if (!rule) +			return RMAP_OKAY; + +		binfo = object; +		list = community_list_lookup(bgp_clist, rule, +					     LARGE_COMMUNITY_LIST_MASTER); +		old = binfo->attr->lcommunity; + +		if (list && old) { +			merge = lcommunity_list_match_delete( +				lcommunity_dup(old), list); +			new = lcommunity_uniq_sort(merge); +			lcommunity_free(&merge); + +			/* HACK: if the old community is not intern'd, +			 * we should free it here, or all reference to it may be +			 * lost. +			 * Really need to cleanup attribute caching sometime. +			 */ +			if (old->refcnt == 0) +				lcommunity_free(&old); + +			if (new->size == 0) { +				binfo->attr->lcommunity = NULL; +				binfo->attr->flag &= ~ATTR_FLAG_BIT( +					BGP_ATTR_LARGE_COMMUNITIES); +				lcommunity_free(&new); +			} else { +				binfo->attr->lcommunity = new; +				binfo->attr->flag |= ATTR_FLAG_BIT( +					BGP_ATTR_LARGE_COMMUNITIES); +			} +		} +	} + +	return RMAP_OKAY;  }  /* Compile function for set lcommunity. */ -static void * -route_set_lcommunity_delete_compile (const char *arg) +static void *route_set_lcommunity_delete_compile(const char *arg)  { -  char *p; -  char *str; -  int len; +	char *p; +	char *str; +	int len; -  p = strchr (arg, ' '); -  if (p) -    { -      len = p - arg; -      str = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, len + 1); -      memcpy (str, arg, len); -    } -  else -    str = NULL; +	p = strchr(arg, ' '); +	if (p) { +		len = p - arg; +		str = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, len + 1); +		memcpy(str, arg, len); +	} else +		str = NULL; -  return str; +	return str;  }  /* Free function for set lcommunity. */ -static void -route_set_lcommunity_delete_free (void *rule) +static void route_set_lcommunity_delete_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Set lcommunity rule structure. */ -struct route_map_rule_cmd route_set_lcommunity_delete_cmd = -{ -  "large-comm-list", -  route_set_lcommunity_delete, -  route_set_lcommunity_delete_compile, -  route_set_lcommunity_delete_free, +struct route_map_rule_cmd route_set_lcommunity_delete_cmd = { +	"large-comm-list", route_set_lcommunity_delete, +	route_set_lcommunity_delete_compile, route_set_lcommunity_delete_free,  };  /* `set comm-list (<1-99>|<100-500>|WORD) delete' */  /* For community set mechanism. */ -static route_map_result_t -route_set_community_delete (void *rule, struct prefix *prefix, -			    route_map_object_t type, void *object) -{ -  struct community_list *list; -  struct community *merge; -  struct community *new; -  struct community *old; -  struct bgp_info *binfo; - -  if (type == RMAP_BGP) -    { -      if (! rule) -	return RMAP_OKAY; - -      binfo = object; -      list = community_list_lookup (bgp_clist, rule, COMMUNITY_LIST_MASTER); -      old = binfo->attr->community; - -      if (list && old) -	{ -	  merge = community_list_match_delete (community_dup (old), list); -	  new = community_uniq_sort (merge); -	  community_free (merge); - -	  /* HACK: if the old community is not intern'd, -	   * we should free it here, or all reference to it may be lost. -	   * Really need to cleanup attribute caching sometime. -	   */ -	  if (old->refcnt == 0) -	    community_free (old); - -	  if (new->size == 0) -	    { -	      binfo->attr->community = NULL; -	      binfo->attr->flag &= ~ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES); -	      community_free (new); -	    } -	  else -	    { -	      binfo->attr->community = new; -	      binfo->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES); -	    } +static route_map_result_t route_set_community_delete(void *rule, +						     struct prefix *prefix, +						     route_map_object_t type, +						     void *object) +{ +	struct community_list *list; +	struct community *merge; +	struct community *new; +	struct community *old; +	struct bgp_info *binfo; + +	if (type == RMAP_BGP) { +		if (!rule) +			return RMAP_OKAY; + +		binfo = object; +		list = community_list_lookup(bgp_clist, rule, +					     COMMUNITY_LIST_MASTER); +		old = binfo->attr->community; + +		if (list && old) { +			merge = community_list_match_delete(community_dup(old), +							    list); +			new = community_uniq_sort(merge); +			community_free(merge); + +			/* HACK: if the old community is not intern'd, +			 * we should free it here, or all reference to it may be +			 * lost. +			 * Really need to cleanup attribute caching sometime. +			 */ +			if (old->refcnt == 0) +				community_free(old); + +			if (new->size == 0) { +				binfo->attr->community = NULL; +				binfo->attr->flag &= +					~ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES); +				community_free(new); +			} else { +				binfo->attr->community = new; +				binfo->attr->flag |= +					ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES); +			} +		}  	} -    } -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Compile function for set community. */ -static void * -route_set_community_delete_compile (const char *arg) +static void *route_set_community_delete_compile(const char *arg)  { -  char *p; -  char *str; -  int len; +	char *p; +	char *str; +	int len; -  p = strchr (arg, ' '); -  if (p) -    { -      len = p - arg; -      str = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, len + 1); -      memcpy (str, arg, len); -    } -  else -    str = NULL; +	p = strchr(arg, ' '); +	if (p) { +		len = p - arg; +		str = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, len + 1); +		memcpy(str, arg, len); +	} else +		str = NULL; -  return str; +	return str;  }  /* Free function for set community. */ -static void -route_set_community_delete_free (void *rule) +static void route_set_community_delete_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Set community rule structure. */ -struct route_map_rule_cmd route_set_community_delete_cmd = -{ -  "comm-list", -  route_set_community_delete, -  route_set_community_delete_compile, -  route_set_community_delete_free, +struct route_map_rule_cmd route_set_community_delete_cmd = { +	"comm-list", route_set_community_delete, +	route_set_community_delete_compile, route_set_community_delete_free,  };  /* `set extcommunity rt COMMUNITY' */  /* For community set mechanism.  Used by _rt and _soo. */ -static route_map_result_t -route_set_ecommunity (void *rule, struct prefix *prefix, -		      route_map_object_t type, void *object) -{ -  struct ecommunity *ecom; -  struct ecommunity *new_ecom; -  struct ecommunity *old_ecom; -  struct bgp_info *bgp_info; - -  if (type == RMAP_BGP) -    { -      ecom = rule; -      bgp_info = object; - -      if (! ecom) -	return RMAP_OKAY; - -      /* We assume additive for Extended Community. */ -      old_ecom = bgp_info->attr->ecommunity; - -      if (old_ecom) -	{ -	  new_ecom = ecommunity_merge (ecommunity_dup (old_ecom), ecom); - -	  /* old_ecom->refcnt = 1 => owned elsewhere, e.g. bgp_update_receive() -	   *         ->refcnt = 0 => set by a previous route-map statement */ -	  if (!old_ecom->refcnt) -	    ecommunity_free (&old_ecom); +static route_map_result_t route_set_ecommunity(void *rule, +					       struct prefix *prefix, +					       route_map_object_t type, +					       void *object) +{ +	struct ecommunity *ecom; +	struct ecommunity *new_ecom; +	struct ecommunity *old_ecom; +	struct bgp_info *bgp_info; + +	if (type == RMAP_BGP) { +		ecom = rule; +		bgp_info = object; + +		if (!ecom) +			return RMAP_OKAY; + +		/* We assume additive for Extended Community. */ +		old_ecom = bgp_info->attr->ecommunity; + +		if (old_ecom) { +			new_ecom = ecommunity_merge(ecommunity_dup(old_ecom), +						    ecom); + +			/* old_ecom->refcnt = 1 => owned elsewhere, e.g. +			 * bgp_update_receive() +			 *         ->refcnt = 0 => set by a previous route-map +			 * statement */ +			if (!old_ecom->refcnt) +				ecommunity_free(&old_ecom); +		} else +			new_ecom = ecommunity_dup(ecom); + +		/* will be intern()'d or attr_flush()'d by bgp_update_main() */ +		bgp_info->attr->ecommunity = new_ecom; + +		bgp_info->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES);  	} -      else -	new_ecom = ecommunity_dup (ecom); - -      /* will be intern()'d or attr_flush()'d by bgp_update_main() */ -      bgp_info->attr->ecommunity = new_ecom; - -      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_EXT_COMMUNITIES); -    } -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Compile function for set community. */ -static void * -route_set_ecommunity_rt_compile (const char *arg) +static void *route_set_ecommunity_rt_compile(const char *arg)  { -  struct ecommunity *ecom; +	struct ecommunity *ecom; -  ecom = ecommunity_str2com (arg, ECOMMUNITY_ROUTE_TARGET, 0); -  if (! ecom) -    return NULL; -  return ecommunity_intern (ecom); +	ecom = ecommunity_str2com(arg, ECOMMUNITY_ROUTE_TARGET, 0); +	if (!ecom) +		return NULL; +	return ecommunity_intern(ecom);  }  /* Free function for set community.  Used by _rt and _soo */ -static void -route_set_ecommunity_free (void *rule) +static void route_set_ecommunity_free(void *rule)  { -  struct ecommunity *ecom = rule; -  ecommunity_unintern (&ecom); +	struct ecommunity *ecom = rule; +	ecommunity_unintern(&ecom);  }  /* Set community rule structure. */ -struct route_map_rule_cmd route_set_ecommunity_rt_cmd = -{ -  "extcommunity rt", -  route_set_ecommunity, -  route_set_ecommunity_rt_compile, -  route_set_ecommunity_free, +struct route_map_rule_cmd route_set_ecommunity_rt_cmd = { +	"extcommunity rt", route_set_ecommunity, +	route_set_ecommunity_rt_compile, route_set_ecommunity_free,  };  /* `set extcommunity soo COMMUNITY' */  /* Compile function for set community. */ -static void * -route_set_ecommunity_soo_compile (const char *arg) +static void *route_set_ecommunity_soo_compile(const char *arg)  { -  struct ecommunity *ecom; +	struct ecommunity *ecom; -  ecom = ecommunity_str2com (arg, ECOMMUNITY_SITE_ORIGIN, 0); -  if (! ecom) -    return NULL; +	ecom = ecommunity_str2com(arg, ECOMMUNITY_SITE_ORIGIN, 0); +	if (!ecom) +		return NULL; -  return ecommunity_intern (ecom); +	return ecommunity_intern(ecom);  }  /* Set community rule structure. */ -struct route_map_rule_cmd route_set_ecommunity_soo_cmd = -{ -  "extcommunity soo", -  route_set_ecommunity, -  route_set_ecommunity_soo_compile, -  route_set_ecommunity_free, +struct route_map_rule_cmd route_set_ecommunity_soo_cmd = { +	"extcommunity soo", route_set_ecommunity, +	route_set_ecommunity_soo_compile, route_set_ecommunity_free,  };  /* `set origin ORIGIN' */  /* For origin set. */ -static route_map_result_t -route_set_origin (void *rule, struct prefix *prefix, route_map_object_t type, void *object) +static route_map_result_t route_set_origin(void *rule, struct prefix *prefix, +					   route_map_object_t type, +					   void *object)  { -  u_char *origin; -  struct bgp_info *bgp_info; +	u_char *origin; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      origin = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		origin = rule; +		bgp_info = object; -      bgp_info->attr->origin = *origin; -    } +		bgp_info->attr->origin = *origin; +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Compile function for origin set. */ -static void * -route_set_origin_compile (const char *arg) +static void *route_set_origin_compile(const char *arg)  { -  u_char *origin; +	u_char *origin; -  origin = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_char)); +	origin = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(u_char)); -  if (strcmp (arg, "igp") == 0) -    *origin = 0; -  else if (strcmp (arg, "egp") == 0) -    *origin = 1; -  else -    *origin = 2; +	if (strcmp(arg, "igp") == 0) +		*origin = 0; +	else if (strcmp(arg, "egp") == 0) +		*origin = 1; +	else +		*origin = 2; -  return origin; +	return origin;  }  /* Compile function for origin set. */ -static void -route_set_origin_free (void *rule) +static void route_set_origin_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Set origin rule structure. */ -struct route_map_rule_cmd route_set_origin_cmd = -{ -  "origin", -  route_set_origin, -  route_set_origin_compile, -  route_set_origin_free, +struct route_map_rule_cmd route_set_origin_cmd = { +	"origin", route_set_origin, route_set_origin_compile, +	route_set_origin_free,  };  /* `set atomic-aggregate' */  /* For atomic aggregate set. */ -static route_map_result_t -route_set_atomic_aggregate (void *rule, struct prefix *prefix, -			    route_map_object_t type, void *object) +static route_map_result_t route_set_atomic_aggregate(void *rule, +						     struct prefix *prefix, +						     route_map_object_t type, +						     void *object)  { -  struct bgp_info *bgp_info; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE); -    } +	if (type == RMAP_BGP) { +		bgp_info = object; +		bgp_info->attr->flag |= +			ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE); +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Compile function for atomic aggregate. */ -static void * -route_set_atomic_aggregate_compile (const char *arg) +static void *route_set_atomic_aggregate_compile(const char *arg)  { -  return (void *)1; +	return (void *)1;  }  /* Compile function for atomic aggregate. */ -static void -route_set_atomic_aggregate_free (void *rule) +static void route_set_atomic_aggregate_free(void *rule)  { -  return; +	return;  }  /* Set atomic aggregate rule structure. */ -struct route_map_rule_cmd route_set_atomic_aggregate_cmd = -{ -  "atomic-aggregate", -  route_set_atomic_aggregate, -  route_set_atomic_aggregate_compile, -  route_set_atomic_aggregate_free, +struct route_map_rule_cmd route_set_atomic_aggregate_cmd = { +	"atomic-aggregate", route_set_atomic_aggregate, +	route_set_atomic_aggregate_compile, route_set_atomic_aggregate_free,  };  /* `set aggregator as AS A.B.C.D' */ -struct aggregator -{ -  as_t as; -  struct in_addr address; +struct aggregator { +	as_t as; +	struct in_addr address;  }; -static route_map_result_t -route_set_aggregator_as (void *rule, struct prefix *prefix, -			 route_map_object_t type, void *object) +static route_map_result_t route_set_aggregator_as(void *rule, +						  struct prefix *prefix, +						  route_map_object_t type, +						  void *object)  { -  struct bgp_info *bgp_info; -  struct aggregator *aggregator; +	struct bgp_info *bgp_info; +	struct aggregator *aggregator; -  if (type == RMAP_BGP) -    { -      bgp_info = object; -      aggregator = rule; +	if (type == RMAP_BGP) { +		bgp_info = object; +		aggregator = rule; -      bgp_info->attr->aggregator_as = aggregator->as; -      bgp_info->attr->aggregator_addr = aggregator->address; -      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR); -    } +		bgp_info->attr->aggregator_as = aggregator->as; +		bgp_info->attr->aggregator_addr = aggregator->address; +		bgp_info->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR); +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  } -static void * -route_set_aggregator_as_compile (const char *arg) +static void *route_set_aggregator_as_compile(const char *arg)  { -  struct aggregator *aggregator; -  char as[10]; -  char address[20]; -  int ret; +	struct aggregator *aggregator; +	char as[10]; +	char address[20]; +	int ret; -  aggregator = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct aggregator)); -  sscanf (arg, "%s %s", as, address); +	aggregator = +		XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct aggregator)); +	sscanf(arg, "%s %s", as, address); -  aggregator->as = strtoul (as, NULL, 10); -  ret = inet_aton (address, &aggregator->address); -  if (ret == 0) -    { -      XFREE (MTYPE_ROUTE_MAP_COMPILED, aggregator); -      return NULL; -    } -  return aggregator; +	aggregator->as = strtoul(as, NULL, 10); +	ret = inet_aton(address, &aggregator->address); +	if (ret == 0) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, aggregator); +		return NULL; +	} +	return aggregator;  } -static void -route_set_aggregator_as_free (void *rule) +static void route_set_aggregator_as_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } -struct route_map_rule_cmd route_set_aggregator_as_cmd = -{ -  "aggregator as", -  route_set_aggregator_as, -  route_set_aggregator_as_compile, -  route_set_aggregator_as_free, +struct route_map_rule_cmd route_set_aggregator_as_cmd = { +	"aggregator as", route_set_aggregator_as, +	route_set_aggregator_as_compile, route_set_aggregator_as_free,  };  /* Set tag to object. object must be pointer to struct bgp_info */ -static route_map_result_t -route_set_tag (void *rule, struct prefix *prefix, -               route_map_object_t type, void *object) +static route_map_result_t route_set_tag(void *rule, struct prefix *prefix, +					route_map_object_t type, void *object)  { -  route_tag_t *tag; -  struct bgp_info *bgp_info; - -  if (type == RMAP_BGP) -    { -      tag = rule; -      bgp_info = object; +	route_tag_t *tag; +	struct bgp_info *bgp_info; -      /* Set tag value */ -      bgp_info->attr->tag=*tag; +	if (type == RMAP_BGP) { +		tag = rule; +		bgp_info = object; -    } +		/* Set tag value */ +		bgp_info->attr->tag = *tag; +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Route map commands for tag set. */ -static struct route_map_rule_cmd route_set_tag_cmd = -{ -  "tag", -  route_set_tag, -  route_map_rule_tag_compile, -  route_map_rule_tag_free, +static struct route_map_rule_cmd route_set_tag_cmd = { +	"tag", route_set_tag, route_map_rule_tag_compile, +	route_map_rule_tag_free,  };  /* Set label-index to object. object must be pointer to struct bgp_info */ -static route_map_result_t -route_set_label_index (void *rule, struct prefix *prefix, -                       route_map_object_t type, void *object) -{ -  struct rmap_value *rv; -  struct bgp_info *bgp_info; -  u_int32_t label_index; - -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      rv = rule; -      bgp_info = object; - -      /* Set label-index value. */ -      label_index = rv->value; -      if (label_index) -        { -          bgp_info->attr->label_index = label_index; -          bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_PREFIX_SID); -        } -    } +static route_map_result_t route_set_label_index(void *rule, +						struct prefix *prefix, +						route_map_object_t type, +						void *object) +{ +	struct rmap_value *rv; +	struct bgp_info *bgp_info; +	u_int32_t label_index; + +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		rv = rule; +		bgp_info = object; + +		/* Set label-index value. */ +		label_index = rv->value; +		if (label_index) { +			bgp_info->attr->label_index = label_index; +			bgp_info->attr->flag |= +				ATTR_FLAG_BIT(BGP_ATTR_PREFIX_SID); +		} +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Route map commands for label-index set. */ -static struct route_map_rule_cmd route_set_label_index_cmd = -{ -  "label-index", -  route_set_label_index, -  route_value_compile, -  route_value_free, +static struct route_map_rule_cmd route_set_label_index_cmd = { +	"label-index", route_set_label_index, route_value_compile, +	route_value_free,  };  /* `match ipv6 address IP_ACCESS_LIST' */ -static route_map_result_t -route_match_ipv6_address (void *rule, struct prefix *prefix, -			  route_map_object_t type, void *object) +static route_map_result_t route_match_ipv6_address(void *rule, +						   struct prefix *prefix, +						   route_map_object_t type, +						   void *object)  { -  struct access_list *alist; +	struct access_list *alist; -  if (type == RMAP_BGP) -    { -      alist = access_list_lookup (AFI_IP6, (char *) rule); -      if (alist == NULL) -	return RMAP_NOMATCH; +	if (type == RMAP_BGP) { +		alist = access_list_lookup(AFI_IP6, (char *)rule); +		if (alist == NULL) +			return RMAP_NOMATCH; -      return (access_list_apply (alist, prefix) == FILTER_DENY ? -	      RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH; +		return (access_list_apply(alist, prefix) == FILTER_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	} +	return RMAP_NOMATCH;  } -static void * -route_match_ipv6_address_compile (const char *arg) +static void *route_match_ipv6_address_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  } -static void -route_match_ipv6_address_free (void *rule) +static void route_match_ipv6_address_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip address matching. */ -struct route_map_rule_cmd route_match_ipv6_address_cmd = -{ -  "ipv6 address", -  route_match_ipv6_address, -  route_match_ipv6_address_compile, -  route_match_ipv6_address_free -}; +struct route_map_rule_cmd route_match_ipv6_address_cmd = { +	"ipv6 address", route_match_ipv6_address, +	route_match_ipv6_address_compile, route_match_ipv6_address_free};  /* `match ipv6 next-hop IP_ADDRESS' */ -static route_map_result_t -route_match_ipv6_next_hop (void *rule, struct prefix *prefix, -			   route_map_object_t type, void *object) +static route_map_result_t route_match_ipv6_next_hop(void *rule, +						    struct prefix *prefix, +						    route_map_object_t type, +						    void *object)  { -  struct in6_addr *addr = rule; -  struct bgp_info *bgp_info; +	struct in6_addr *addr = rule; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      bgp_info = object; +	if (type == RMAP_BGP) { +		bgp_info = object; -      if (IPV6_ADDR_SAME (&bgp_info->attr->mp_nexthop_global, addr)) -	return RMAP_MATCH; +		if (IPV6_ADDR_SAME(&bgp_info->attr->mp_nexthop_global, addr)) +			return RMAP_MATCH; -      if (bgp_info->attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL && -	  IPV6_ADDR_SAME (&bgp_info->attr->mp_nexthop_local, rule)) -	return RMAP_MATCH; +		if (bgp_info->attr->mp_nexthop_len +			    == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL +		    && IPV6_ADDR_SAME(&bgp_info->attr->mp_nexthop_local, rule)) +			return RMAP_MATCH; -      return RMAP_NOMATCH; -    } +		return RMAP_NOMATCH; +	} -  return RMAP_NOMATCH; +	return RMAP_NOMATCH;  } -static void * -route_match_ipv6_next_hop_compile (const char *arg) +static void *route_match_ipv6_next_hop_compile(const char *arg)  { -  struct in6_addr *address; -  int ret; +	struct in6_addr *address; +	int ret; -  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in6_addr)); +	address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct in6_addr)); -  ret = inet_pton (AF_INET6, arg, address); -  if (!ret) -    { -      XFREE (MTYPE_ROUTE_MAP_COMPILED, address); -      return NULL; -    } +	ret = inet_pton(AF_INET6, arg, address); +	if (!ret) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, address); +		return NULL; +	} -  return address; +	return address;  } -static void -route_match_ipv6_next_hop_free (void *rule) +static void route_match_ipv6_next_hop_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } -struct route_map_rule_cmd route_match_ipv6_next_hop_cmd = -{ -  "ipv6 next-hop", -  route_match_ipv6_next_hop, -  route_match_ipv6_next_hop_compile, -  route_match_ipv6_next_hop_free -}; +struct route_map_rule_cmd route_match_ipv6_next_hop_cmd = { +	"ipv6 next-hop", route_match_ipv6_next_hop, +	route_match_ipv6_next_hop_compile, route_match_ipv6_next_hop_free};  /* `match ipv6 address prefix-list PREFIX_LIST' */  static route_map_result_t -route_match_ipv6_address_prefix_list (void *rule, struct prefix *prefix, -			      route_map_object_t type, void *object) +route_match_ipv6_address_prefix_list(void *rule, struct prefix *prefix, +				     route_map_object_t type, void *object)  { -  struct prefix_list *plist; +	struct prefix_list *plist; -  if (type == RMAP_BGP) -    { -      plist = prefix_list_lookup (AFI_IP6, (char *) rule); -      if (plist == NULL) -	return RMAP_NOMATCH; +	if (type == RMAP_BGP) { +		plist = prefix_list_lookup(AFI_IP6, (char *)rule); +		if (plist == NULL) +			return RMAP_NOMATCH; -      return (prefix_list_apply (plist, prefix) == PREFIX_DENY ? -	      RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH; +		return (prefix_list_apply(plist, prefix) == PREFIX_DENY +				? RMAP_NOMATCH +				: RMAP_MATCH); +	} +	return RMAP_NOMATCH;  } -static void * -route_match_ipv6_address_prefix_list_compile (const char *arg) +static void *route_match_ipv6_address_prefix_list_compile(const char *arg)  { -  return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg); +	return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);  } -static void -route_match_ipv6_address_prefix_list_free (void *rule) +static void route_match_ipv6_address_prefix_list_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  } -struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd = -{ -  "ipv6 address prefix-list", -  route_match_ipv6_address_prefix_list, -  route_match_ipv6_address_prefix_list_compile, -  route_match_ipv6_address_prefix_list_free -}; +struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd = { +	"ipv6 address prefix-list", route_match_ipv6_address_prefix_list, +	route_match_ipv6_address_prefix_list_compile, +	route_match_ipv6_address_prefix_list_free};  /* `set ipv6 nexthop global IP_ADDRESS' */  /* Set nexthop to object.  ojbect must be pointer to struct attr. */ -static route_map_result_t -route_set_ipv6_nexthop_global (void *rule, struct prefix *prefix, -			       route_map_object_t type, void *object) +static route_map_result_t route_set_ipv6_nexthop_global(void *rule, +							struct prefix *prefix, +							route_map_object_t type, +							void *object)  { -  struct in6_addr *address; -  struct bgp_info *bgp_info; +	struct in6_addr *address; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      address = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		address = rule; +		bgp_info = object; -      /* Set next hop value. */ -      bgp_info->attr->mp_nexthop_global = *address; +		/* Set next hop value. */ +		bgp_info->attr->mp_nexthop_global = *address; -      /* Set nexthop length. */ -      if (bgp_info->attr->mp_nexthop_len == 0) -	bgp_info->attr->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL; +		/* Set nexthop length. */ +		if (bgp_info->attr->mp_nexthop_len == 0) +			bgp_info->attr->mp_nexthop_len = +				BGP_ATTR_NHLEN_IPV6_GLOBAL; -      SET_FLAG(bgp_info->attr->rmap_change_flags, -	       BATTR_RMAP_IPV6_GLOBAL_NHOP_CHANGED); -    } +		SET_FLAG(bgp_info->attr->rmap_change_flags, +			 BATTR_RMAP_IPV6_GLOBAL_NHOP_CHANGED); +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Route map `ip next-hop' compile function.  Given string is converted     to struct in_addr structure. */ -static void * -route_set_ipv6_nexthop_global_compile (const char *arg) +static void *route_set_ipv6_nexthop_global_compile(const char *arg)  { -  int ret; -  struct in6_addr *address; +	int ret; +	struct in6_addr *address; -  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in6_addr)); +	address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct in6_addr)); -  ret = inet_pton (AF_INET6, arg, address); +	ret = inet_pton(AF_INET6, arg, address); -  if (ret == 0) -    { -      XFREE (MTYPE_ROUTE_MAP_COMPILED, address); -      return NULL; -    } +	if (ret == 0) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, address); +		return NULL; +	} -  return address; +	return address;  }  /* Free route map's compiled `ip next-hop' value. */ -static void -route_set_ipv6_nexthop_global_free (void *rule) +static void route_set_ipv6_nexthop_global_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip nexthop set. */ -struct route_map_rule_cmd route_set_ipv6_nexthop_global_cmd = -{ -  "ipv6 next-hop global", -  route_set_ipv6_nexthop_global, -  route_set_ipv6_nexthop_global_compile, -  route_set_ipv6_nexthop_global_free -}; +struct route_map_rule_cmd route_set_ipv6_nexthop_global_cmd = { +	"ipv6 next-hop global", route_set_ipv6_nexthop_global, +	route_set_ipv6_nexthop_global_compile, +	route_set_ipv6_nexthop_global_free};  /* Set next-hop preference value. */  static route_map_result_t -route_set_ipv6_nexthop_prefer_global (void *rule, struct prefix *prefix, -			              route_map_object_t type, void *object) -{ -  struct bgp_info *bgp_info; -  struct peer *peer; - -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      bgp_info = object; -      peer = bgp_info->peer; - -      if ((CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN) || -           CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT)) -	  && peer->su_remote -	  && sockunion_family (peer->su_remote) == AF_INET6) -	{ -          /* Set next hop preference to global */ -          bgp_info->attr->mp_nexthop_prefer_global = TRUE; -          SET_FLAG(bgp_info->attr->rmap_change_flags, -                   BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED); +route_set_ipv6_nexthop_prefer_global(void *rule, struct prefix *prefix, +				     route_map_object_t type, void *object) +{ +	struct bgp_info *bgp_info; +	struct peer *peer; + +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		bgp_info = object; +		peer = bgp_info->peer; + +		if ((CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IN) +		     || CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IMPORT)) +		    && peer->su_remote +		    && sockunion_family(peer->su_remote) == AF_INET6) { +			/* Set next hop preference to global */ +			bgp_info->attr->mp_nexthop_prefer_global = TRUE; +			SET_FLAG(bgp_info->attr->rmap_change_flags, +				 BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED); +		} else { +			bgp_info->attr->mp_nexthop_prefer_global = FALSE; +			SET_FLAG(bgp_info->attr->rmap_change_flags, +				 BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED); +		}  	} -      else -        { -          bgp_info->attr->mp_nexthop_prefer_global = FALSE; -          SET_FLAG(bgp_info->attr->rmap_change_flags, -                   BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED); -        } -    } - return RMAP_OKAY; +	return RMAP_OKAY;  } -static void * -route_set_ipv6_nexthop_prefer_global_compile (const char *arg) +static void *route_set_ipv6_nexthop_prefer_global_compile(const char *arg)  { -  int *rins = NULL; +	int *rins = NULL; -  rins = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (int)); -  *rins = 1; +	rins = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(int)); +	*rins = 1; -  return rins; +	return rins;  }  /* Free route map's compiled `ip next-hop' value. */ -static void -route_set_ipv6_nexthop_prefer_global_free (void *rule) +static void route_set_ipv6_nexthop_prefer_global_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip nexthop set preferred. */ -struct route_map_rule_cmd route_set_ipv6_nexthop_prefer_global_cmd = -{ -  "ipv6 next-hop prefer-global", -  route_set_ipv6_nexthop_prefer_global, -  route_set_ipv6_nexthop_prefer_global_compile, -  route_set_ipv6_nexthop_prefer_global_free -}; +struct route_map_rule_cmd route_set_ipv6_nexthop_prefer_global_cmd = { +	"ipv6 next-hop prefer-global", route_set_ipv6_nexthop_prefer_global, +	route_set_ipv6_nexthop_prefer_global_compile, +	route_set_ipv6_nexthop_prefer_global_free};  /* `set ipv6 nexthop local IP_ADDRESS' */  /* Set nexthop to object.  ojbect must be pointer to struct attr. */ -static route_map_result_t -route_set_ipv6_nexthop_local (void *rule, struct prefix *prefix, -			      route_map_object_t type, void *object) -{ -  struct in6_addr *address; -  struct bgp_info *bgp_info; - -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      address = rule; -      bgp_info = object; - -      /* Set next hop value. */ -      bgp_info->attr->mp_nexthop_local = *address; - -      /* Set nexthop length. */ -      if (bgp_info->attr->mp_nexthop_len != BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL) -	bgp_info->attr->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL; - -      SET_FLAG(bgp_info->attr->rmap_change_flags, -	       BATTR_RMAP_IPV6_LL_NHOP_CHANGED); -    } +static route_map_result_t route_set_ipv6_nexthop_local(void *rule, +						       struct prefix *prefix, +						       route_map_object_t type, +						       void *object) +{ +	struct in6_addr *address; +	struct bgp_info *bgp_info; + +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		address = rule; +		bgp_info = object; + +		/* Set next hop value. */ +		bgp_info->attr->mp_nexthop_local = *address; + +		/* Set nexthop length. */ +		if (bgp_info->attr->mp_nexthop_len +		    != BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL) +			bgp_info->attr->mp_nexthop_len = +				BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL; + +		SET_FLAG(bgp_info->attr->rmap_change_flags, +			 BATTR_RMAP_IPV6_LL_NHOP_CHANGED); +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Route map `ip nexthop' compile function.  Given string is converted     to struct in_addr structure. */ -static void * -route_set_ipv6_nexthop_local_compile (const char *arg) +static void *route_set_ipv6_nexthop_local_compile(const char *arg)  { -  int ret; -  struct in6_addr *address; +	int ret; +	struct in6_addr *address; -  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in6_addr)); +	address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct in6_addr)); -  ret = inet_pton (AF_INET6, arg, address); +	ret = inet_pton(AF_INET6, arg, address); -  if (ret == 0) -    { -      XFREE (MTYPE_ROUTE_MAP_COMPILED, address); -      return NULL; -    } +	if (ret == 0) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, address); +		return NULL; +	} -  return address; +	return address;  }  /* Free route map's compiled `ip nexthop' value. */ -static void -route_set_ipv6_nexthop_local_free (void *rule) +static void route_set_ipv6_nexthop_local_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip nexthop set. */ -struct route_map_rule_cmd route_set_ipv6_nexthop_local_cmd = -{ -  "ipv6 next-hop local", -  route_set_ipv6_nexthop_local, -  route_set_ipv6_nexthop_local_compile, -  route_set_ipv6_nexthop_local_free -}; +struct route_map_rule_cmd route_set_ipv6_nexthop_local_cmd = { +	"ipv6 next-hop local", route_set_ipv6_nexthop_local, +	route_set_ipv6_nexthop_local_compile, +	route_set_ipv6_nexthop_local_free};  /* `set ipv6 nexthop peer-address' */  /* Set nexthop to object.  ojbect must be pointer to struct attr. */ -static route_map_result_t -route_set_ipv6_nexthop_peer (void *rule, struct prefix *prefix, -			     route_map_object_t type, void *object) -{ -  struct in6_addr peer_address; -  struct bgp_info *bgp_info; -  struct peer *peer; - -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      bgp_info = object; -      peer = bgp_info->peer; - -      if ((CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN) || -           CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IMPORT)) -	  && peer->su_remote -	  && sockunion_family (peer->su_remote) == AF_INET6) -	{ -	  peer_address = peer->su_remote->sin6.sin6_addr; -          /* Set next hop value and length in attribute. */ -          if (IN6_IS_ADDR_LINKLOCAL(&peer_address)) -            { -              bgp_info->attr->mp_nexthop_local = peer_address; -              if (bgp_info->attr->mp_nexthop_len != 32) -                bgp_info->attr->mp_nexthop_len = 32; -            } -          else -            { -              bgp_info->attr->mp_nexthop_global = peer_address; -              if (bgp_info->attr->mp_nexthop_len == 0) -                bgp_info->attr->mp_nexthop_len = 16; -            } - -	} -      else if (CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT)) -	{ -          /* The next hop value will be set as part of packet rewrite. -           * Set the flags here to indicate that rewrite needs to be done. -           * Also, clear the value - we clear both global and link-local -           * nexthops, whether we send one or both is determined elsewhere. -           */ -	  SET_FLAG(bgp_info->attr->rmap_change_flags, -		   BATTR_RMAP_NEXTHOP_PEER_ADDRESS); -          /* clear next hop value. */ -          memset (&(bgp_info->attr->mp_nexthop_global), -                  0, sizeof (struct in6_addr)); -          memset (&(bgp_info->attr->mp_nexthop_local), -                  0, sizeof (struct in6_addr)); +static route_map_result_t route_set_ipv6_nexthop_peer(void *rule, +						      struct prefix *prefix, +						      route_map_object_t type, +						      void *object) +{ +	struct in6_addr peer_address; +	struct bgp_info *bgp_info; +	struct peer *peer; + +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		bgp_info = object; +		peer = bgp_info->peer; + +		if ((CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IN) +		     || CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_IMPORT)) +		    && peer->su_remote +		    && sockunion_family(peer->su_remote) == AF_INET6) { +			peer_address = peer->su_remote->sin6.sin6_addr; +			/* Set next hop value and length in attribute. */ +			if (IN6_IS_ADDR_LINKLOCAL(&peer_address)) { +				bgp_info->attr->mp_nexthop_local = peer_address; +				if (bgp_info->attr->mp_nexthop_len != 32) +					bgp_info->attr->mp_nexthop_len = 32; +			} else { +				bgp_info->attr->mp_nexthop_global = +					peer_address; +				if (bgp_info->attr->mp_nexthop_len == 0) +					bgp_info->attr->mp_nexthop_len = 16; +			} + +		} else if (CHECK_FLAG(peer->rmap_type, PEER_RMAP_TYPE_OUT)) { +			/* The next hop value will be set as part of packet +			 * rewrite. +			 * Set the flags here to indicate that rewrite needs to +			 * be done. +			 * Also, clear the value - we clear both global and +			 * link-local +			 * nexthops, whether we send one or both is determined +			 * elsewhere. +			 */ +			SET_FLAG(bgp_info->attr->rmap_change_flags, +				 BATTR_RMAP_NEXTHOP_PEER_ADDRESS); +			/* clear next hop value. */ +			memset(&(bgp_info->attr->mp_nexthop_global), 0, +			       sizeof(struct in6_addr)); +			memset(&(bgp_info->attr->mp_nexthop_local), 0, +			       sizeof(struct in6_addr)); +		}  	} -    } -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Route map `ip next-hop' compile function.  Given string is converted     to struct in_addr structure. */ -static void * -route_set_ipv6_nexthop_peer_compile (const char *arg) +static void *route_set_ipv6_nexthop_peer_compile(const char *arg)  { -  int *rins = NULL; +	int *rins = NULL; -  rins = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (int)); -  *rins = 1; +	rins = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(int)); +	*rins = 1; -  return rins; +	return rins;  }  /* Free route map's compiled `ip next-hop' value. */ -static void -route_set_ipv6_nexthop_peer_free (void *rule) +static void route_set_ipv6_nexthop_peer_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ip nexthop set. */ -struct route_map_rule_cmd route_set_ipv6_nexthop_peer_cmd = -{ -  "ipv6 next-hop peer-address", -  route_set_ipv6_nexthop_peer, -  route_set_ipv6_nexthop_peer_compile, -  route_set_ipv6_nexthop_peer_free -}; +struct route_map_rule_cmd route_set_ipv6_nexthop_peer_cmd = { +	"ipv6 next-hop peer-address", route_set_ipv6_nexthop_peer, +	route_set_ipv6_nexthop_peer_compile, route_set_ipv6_nexthop_peer_free};  /* `set ipv4 vpn next-hop A.B.C.D' */ -static route_map_result_t -route_set_vpnv4_nexthop (void *rule, struct prefix *prefix, -			 route_map_object_t type, void *object) +static route_map_result_t route_set_vpnv4_nexthop(void *rule, +						  struct prefix *prefix, +						  route_map_object_t type, +						  void *object)  { -  struct in_addr *address; -  struct bgp_info *bgp_info; +	struct in_addr *address; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      address = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		address = rule; +		bgp_info = object; -      /* Set next hop value. */ -      bgp_info->attr->mp_nexthop_global_in = *address; -      bgp_info->attr->mp_nexthop_len = 4; -    } +		/* Set next hop value. */ +		bgp_info->attr->mp_nexthop_global_in = *address; +		bgp_info->attr->mp_nexthop_len = 4; +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  } -static void * -route_set_vpnv4_nexthop_compile (const char *arg) +static void *route_set_vpnv4_nexthop_compile(const char *arg)  { -  int ret; -  struct in_addr *address; +	int ret; +	struct in_addr *address; -  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in_addr)); +	address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct in_addr)); -  ret = inet_aton (arg, address); +	ret = inet_aton(arg, address); -  if (ret == 0) -    { -      XFREE (MTYPE_ROUTE_MAP_COMPILED, address); -      return NULL; -    } +	if (ret == 0) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, address); +		return NULL; +	} -  return address; +	return address;  }  /* `set ipv6 vpn next-hop A.B.C.D' */ -static route_map_result_t -route_set_vpnv6_nexthop (void *rule, struct prefix *prefix, -			 route_map_object_t type, void *object) +static route_map_result_t route_set_vpnv6_nexthop(void *rule, +						  struct prefix *prefix, +						  route_map_object_t type, +						  void *object)  { -  struct in6_addr *address; -  struct bgp_info *bgp_info; +	struct in6_addr *address; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      /* Fetch routemap's rule information. */ -      address = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		/* Fetch routemap's rule information. */ +		address = rule; +		bgp_info = object; -      /* Set next hop value. */ -      memcpy (&bgp_info->attr->mp_nexthop_global, address, sizeof(struct in6_addr)); -      bgp_info->attr->mp_nexthop_len = BGP_ATTR_NHLEN_VPNV6_GLOBAL; -    } +		/* Set next hop value. */ +		memcpy(&bgp_info->attr->mp_nexthop_global, address, +		       sizeof(struct in6_addr)); +		bgp_info->attr->mp_nexthop_len = BGP_ATTR_NHLEN_VPNV6_GLOBAL; +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  } -static void * -route_set_vpnv6_nexthop_compile (const char *arg) +static void *route_set_vpnv6_nexthop_compile(const char *arg)  { -  int ret; -  struct in6_addr *address; +	int ret; +	struct in6_addr *address; -  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in6_addr)); -  ret = inet_pton (AF_INET6, arg, address); +	address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct in6_addr)); +	ret = inet_pton(AF_INET6, arg, address); -  if (ret == 0) -    { -      XFREE (MTYPE_ROUTE_MAP_COMPILED, address); -      return NULL; -    } +	if (ret == 0) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, address); +		return NULL; +	} -  return address; +	return address;  } -static void -route_set_vpn_nexthop_free (void *rule) +static void route_set_vpn_nexthop_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Route map commands for ipv4 next-hop set. */ -struct route_map_rule_cmd route_set_vpnv4_nexthop_cmd = -{ -  "ipv4 vpn next-hop", -  route_set_vpnv4_nexthop, -  route_set_vpnv4_nexthop_compile, -  route_set_vpn_nexthop_free -}; +struct route_map_rule_cmd route_set_vpnv4_nexthop_cmd = { +	"ipv4 vpn next-hop", route_set_vpnv4_nexthop, +	route_set_vpnv4_nexthop_compile, route_set_vpn_nexthop_free};  /* Route map commands for ipv6 next-hop set. */ -struct route_map_rule_cmd route_set_vpnv6_nexthop_cmd = -{ -  "ipv6 vpn next-hop", -  route_set_vpnv6_nexthop, -  route_set_vpnv6_nexthop_compile, -  route_set_vpn_nexthop_free -}; +struct route_map_rule_cmd route_set_vpnv6_nexthop_cmd = { +	"ipv6 vpn next-hop", route_set_vpnv6_nexthop, +	route_set_vpnv6_nexthop_compile, route_set_vpn_nexthop_free};  /* `set originator-id' */  /* For origin set. */ -static route_map_result_t -route_set_originator_id (void *rule, struct prefix *prefix, route_map_object_t type, void *object) +static route_map_result_t route_set_originator_id(void *rule, +						  struct prefix *prefix, +						  route_map_object_t type, +						  void *object)  { -  struct in_addr *address; -  struct bgp_info *bgp_info; +	struct in_addr *address; +	struct bgp_info *bgp_info; -  if (type == RMAP_BGP) -    { -      address = rule; -      bgp_info = object; +	if (type == RMAP_BGP) { +		address = rule; +		bgp_info = object; -      bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID); -      bgp_info->attr->originator_id = *address; -    } +		bgp_info->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID); +		bgp_info->attr->originator_id = *address; +	} -  return RMAP_OKAY; +	return RMAP_OKAY;  }  /* Compile function for originator-id set. */ -static void * -route_set_originator_id_compile (const char *arg) +static void *route_set_originator_id_compile(const char *arg)  { -  int ret; -  struct in_addr *address; +	int ret; +	struct in_addr *address; -  address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in_addr)); +	address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct in_addr)); -  ret = inet_aton (arg, address); +	ret = inet_aton(arg, address); -  if (ret == 0) -    { -      XFREE (MTYPE_ROUTE_MAP_COMPILED, address); -      return NULL; -    } +	if (ret == 0) { +		XFREE(MTYPE_ROUTE_MAP_COMPILED, address); +		return NULL; +	} -  return address; +	return address;  }  /* Compile function for originator_id set. */ -static void -route_set_originator_id_free (void *rule) +static void route_set_originator_id_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Set originator-id rule structure. */ -struct route_map_rule_cmd route_set_originator_id_cmd = -{ -  "originator-id", -  route_set_originator_id, -  route_set_originator_id_compile, -  route_set_originator_id_free, +struct route_map_rule_cmd route_set_originator_id_cmd = { +	"originator-id", route_set_originator_id, +	route_set_originator_id_compile, route_set_originator_id_free,  };  /* Add bgp route map rule. */ -static int -bgp_route_match_add (struct vty *vty, -		     const char *command, const char *arg, -		     route_map_event_t type) -{ -  VTY_DECLVAR_CONTEXT(route_map_index, index); -  int ret; - -  ret = route_map_add_match (index, command, arg); -  if (ret) -    { -      switch (ret) -	{ -	case RMAP_RULE_MISSING: -	  vty_out (vty, "%% BGP Can't find rule.\n"); -          return CMD_WARNING_CONFIG_FAILED; -	case RMAP_COMPILE_ERROR: -	  vty_out (vty, "%% BGP Argument is malformed.\n"); -          return CMD_WARNING_CONFIG_FAILED; +static int bgp_route_match_add(struct vty *vty, const char *command, +			       const char *arg, route_map_event_t type) +{ +	VTY_DECLVAR_CONTEXT(route_map_index, index); +	int ret; + +	ret = route_map_add_match(index, command, arg); +	if (ret) { +		switch (ret) { +		case RMAP_RULE_MISSING: +			vty_out(vty, "%% BGP Can't find rule.\n"); +			return CMD_WARNING_CONFIG_FAILED; +		case RMAP_COMPILE_ERROR: +			vty_out(vty, "%% BGP Argument is malformed.\n"); +			return CMD_WARNING_CONFIG_FAILED; +		}  	} -    } -  if (type != RMAP_EVENT_MATCH_ADDED) -    { -      route_map_upd8_dependency (type, arg, index->map->name); -    } +	if (type != RMAP_EVENT_MATCH_ADDED) { +		route_map_upd8_dependency(type, arg, index->map->name); +	} -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  /* Delete bgp route map rule. */ -static int -bgp_route_match_delete (struct vty *vty, -			const char *command, const char *arg, -			route_map_event_t type) -{ -  VTY_DECLVAR_CONTEXT(route_map_index, index); -  int ret; -  char *dep_name = NULL; -  const char *tmpstr; -  char *rmap_name = NULL; - -  if (type != RMAP_EVENT_MATCH_DELETED) -    { -      /* ignore the mundane, the types without any dependency */ -      if (arg == NULL) -	{ -	  if ((tmpstr = route_map_get_match_arg(index, command)) != NULL) -	    dep_name = XSTRDUP(MTYPE_ROUTE_MAP_RULE, tmpstr); -	} -      else -	{ -	  dep_name = XSTRDUP(MTYPE_ROUTE_MAP_RULE, arg); +static int bgp_route_match_delete(struct vty *vty, const char *command, +				  const char *arg, route_map_event_t type) +{ +	VTY_DECLVAR_CONTEXT(route_map_index, index); +	int ret; +	char *dep_name = NULL; +	const char *tmpstr; +	char *rmap_name = NULL; + +	if (type != RMAP_EVENT_MATCH_DELETED) { +		/* ignore the mundane, the types without any dependency */ +		if (arg == NULL) { +			if ((tmpstr = route_map_get_match_arg(index, command)) +			    != NULL) +				dep_name = +					XSTRDUP(MTYPE_ROUTE_MAP_RULE, tmpstr); +		} else { +			dep_name = XSTRDUP(MTYPE_ROUTE_MAP_RULE, arg); +		} +		rmap_name = XSTRDUP(MTYPE_ROUTE_MAP_NAME, index->map->name);  	} -      rmap_name = XSTRDUP(MTYPE_ROUTE_MAP_NAME, index->map->name); -    } - -  ret = route_map_delete_match (index, command, dep_name); -  if (ret) -    { -      switch (ret) -	{ -	case RMAP_RULE_MISSING: -	  vty_out (vty, "%% BGP Can't find rule.\n"); -	  break; -	case RMAP_COMPILE_ERROR: -	  vty_out (vty, "%% BGP Argument is malformed.\n"); -	  break; + +	ret = route_map_delete_match(index, command, dep_name); +	if (ret) { +		switch (ret) { +		case RMAP_RULE_MISSING: +			vty_out(vty, "%% BGP Can't find rule.\n"); +			break; +		case RMAP_COMPILE_ERROR: +			vty_out(vty, "%% BGP Argument is malformed.\n"); +			break; +		} +		if (dep_name) +			XFREE(MTYPE_ROUTE_MAP_RULE, dep_name); +		if (rmap_name) +			XFREE(MTYPE_ROUTE_MAP_NAME, rmap_name); +		return CMD_WARNING_CONFIG_FAILED;  	} -      if (dep_name) -	XFREE(MTYPE_ROUTE_MAP_RULE, dep_name); -      if (rmap_name) -	XFREE(MTYPE_ROUTE_MAP_NAME, rmap_name); -      return CMD_WARNING_CONFIG_FAILED; -    } -  if (type != RMAP_EVENT_MATCH_DELETED && dep_name) -    route_map_upd8_dependency(type, dep_name, rmap_name); +	if (type != RMAP_EVENT_MATCH_DELETED && dep_name) +		route_map_upd8_dependency(type, dep_name, rmap_name); -  if (dep_name) -    XFREE(MTYPE_ROUTE_MAP_RULE, dep_name); -  if (rmap_name) -    XFREE(MTYPE_ROUTE_MAP_NAME, rmap_name); +	if (dep_name) +		XFREE(MTYPE_ROUTE_MAP_RULE, dep_name); +	if (rmap_name) +		XFREE(MTYPE_ROUTE_MAP_NAME, rmap_name); -  return CMD_SUCCESS; +	return CMD_SUCCESS;  }  /*   * This is the workhorse routine for processing in/out routemap   * modifications.   */ -static void -bgp_route_map_process_peer (const char *rmap_name, struct route_map *map, -                            struct peer *peer, int afi, int safi, -                            int route_update) -{ - -  int update; -  struct bgp_filter *filter; - -  if (!peer || !rmap_name) -    return; - -  filter = &peer->filter[afi][safi]; -  /* -   * in is for non-route-server clients, -   * out is for all peers -   */ -  if (!CHECK_FLAG(peer->flags, PEER_FLAG_RSERVER_CLIENT)) -    { -      if (filter->map[RMAP_IN].name && -	  (strcmp(rmap_name, filter->map[RMAP_IN].name) == 0)) -	{ -	  filter->map[RMAP_IN].map = map; - -	  if (route_update && peer->status == Established) -	    { -	      if (CHECK_FLAG (peer->af_flags[afi][safi], -			      PEER_FLAG_SOFT_RECONFIG)) -		{ -                  if (bgp_debug_update(peer, NULL, NULL, 1)) -		    zlog_debug("Processing route_map %s update on " -			       "peer %s (inbound, soft-reconfig)", -			       rmap_name, peer->host); - -		  bgp_soft_reconfig_in (peer, afi, safi); -		} -	      else if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV) -		       || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV)) -		{ - -                  if (bgp_debug_update(peer, NULL, NULL, 1)) -		    zlog_debug("Processing route_map %s update on " -			       "peer %s (inbound, route-refresh)", -			       rmap_name, peer->host); -		  bgp_route_refresh_send (peer, afi, safi, 0, 0, 0); +static void bgp_route_map_process_peer(const char *rmap_name, +				       struct route_map *map, struct peer *peer, +				       int afi, int safi, int route_update) +{ + +	int update; +	struct bgp_filter *filter; + +	if (!peer || !rmap_name) +		return; + +	filter = &peer->filter[afi][safi]; +	/* +	 * in is for non-route-server clients, +	 * out is for all peers +	 */ +	if (!CHECK_FLAG(peer->flags, PEER_FLAG_RSERVER_CLIENT)) { +		if (filter->map[RMAP_IN].name +		    && (strcmp(rmap_name, filter->map[RMAP_IN].name) == 0)) { +			filter->map[RMAP_IN].map = map; + +			if (route_update && peer->status == Established) { +				if (CHECK_FLAG(peer->af_flags[afi][safi], +					       PEER_FLAG_SOFT_RECONFIG)) { +					if (bgp_debug_update(peer, NULL, NULL, +							     1)) +						zlog_debug( +							"Processing route_map %s update on " +							"peer %s (inbound, soft-reconfig)", +							rmap_name, peer->host); + +					bgp_soft_reconfig_in(peer, afi, safi); +				} else if ( +					CHECK_FLAG(peer->cap, +						   PEER_CAP_REFRESH_OLD_RCV) +					|| CHECK_FLAG( +						   peer->cap, +						   PEER_CAP_REFRESH_NEW_RCV)) { + +					if (bgp_debug_update(peer, NULL, NULL, +							     1)) +						zlog_debug( +							"Processing route_map %s update on " +							"peer %s (inbound, route-refresh)", +							rmap_name, peer->host); +					bgp_route_refresh_send(peer, afi, safi, +							       0, 0, 0); +				} +			}  		} -	    }  	} -    } - -  if (CHECK_FLAG(peer->flags, PEER_FLAG_RSERVER_CLIENT)) -    { -      update = 0; - -      if (update && route_update && peer->status == Established) -	{ -	  if (CHECK_FLAG (peer->af_flags[afi][safi], -			  PEER_FLAG_SOFT_RECONFIG)) -	    { -              if (bgp_debug_update(peer, NULL, NULL, 1)) -		zlog_debug("Processing route_map %s update on " -			   "peer %s (import, soft-reconfig)", -			   rmap_name, peer->host); - -	      bgp_soft_reconfig_in (peer, afi, safi); -	    } -	  else if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV) -		   || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV)) -	    { -              if (bgp_debug_update(peer, NULL, NULL, 1)) -		zlog_debug("Processing route_map %s update on " -			   "peer %s (import, route-refresh)", -			   rmap_name, peer->host); -	      bgp_route_refresh_send (peer, afi, safi, 0, 0, 0); -	    } -	  /* DD: Else, what else do we do ? Reset peer ? */ -	} -    } - -  /* -   * For outbound, unsuppress and default-originate map change (content or -   * map created), merely update the "config" here, the actual route -   * announcement happens at the group level. -   */ -  if (filter->map[RMAP_OUT].name && -      (strcmp(rmap_name, filter->map[RMAP_OUT].name) == 0)) -    filter->map[RMAP_OUT].map = map; - -  if (filter->usmap.name && -      (strcmp(rmap_name, filter->usmap.name) == 0)) -    filter->usmap.map = map; - -  if (peer->default_rmap[afi][safi].name && -      (strcmp (rmap_name, peer->default_rmap[afi][safi].name) == 0)) -    peer->default_rmap[afi][safi].map = map; -} - -static void -bgp_route_map_update_peer_group(const char *rmap_name, struct route_map *map, -                                struct bgp *bgp) -{ -  struct peer_group *group; -  struct listnode *node, *nnode; -  struct bgp_filter *filter; -  int afi, safi; -  int direct; - -  if (!bgp) -    return; - -  /* All the peers have been updated correctly already. This is -   * just updating the placeholder data. No real update required. -   */ -  for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group)) -    for (afi = AFI_IP; afi < AFI_MAX; afi++) -      for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) -	{ -	  filter = &group->conf->filter[afi][safi]; - -	  for (direct = RMAP_IN; direct < RMAP_MAX; direct++) -	    { -	      if ((filter->map[direct].name) && -		  (strcmp(rmap_name, filter->map[direct].name) == 0)) -		filter->map[direct].map = map; -	    } - -	  if (filter->usmap.name && -	      (strcmp(rmap_name, filter->usmap.name) == 0)) -	    filter->usmap.map = map; + +	if (CHECK_FLAG(peer->flags, PEER_FLAG_RSERVER_CLIENT)) { +		update = 0; + +		if (update && route_update && peer->status == Established) { +			if (CHECK_FLAG(peer->af_flags[afi][safi], +				       PEER_FLAG_SOFT_RECONFIG)) { +				if (bgp_debug_update(peer, NULL, NULL, 1)) +					zlog_debug( +						"Processing route_map %s update on " +						"peer %s (import, soft-reconfig)", +						rmap_name, peer->host); + +				bgp_soft_reconfig_in(peer, afi, safi); +			} else if (CHECK_FLAG(peer->cap, +					      PEER_CAP_REFRESH_OLD_RCV) +				   || CHECK_FLAG(peer->cap, +						 PEER_CAP_REFRESH_NEW_RCV)) { +				if (bgp_debug_update(peer, NULL, NULL, 1)) +					zlog_debug( +						"Processing route_map %s update on " +						"peer %s (import, route-refresh)", +						rmap_name, peer->host); +				bgp_route_refresh_send(peer, afi, safi, 0, 0, +						       0); +			} +			/* DD: Else, what else do we do ? Reset peer ? */ +		}  	} + +	/* +	 * For outbound, unsuppress and default-originate map change (content or +	 * map created), merely update the "config" here, the actual route +	 * announcement happens at the group level. +	 */ +	if (filter->map[RMAP_OUT].name +	    && (strcmp(rmap_name, filter->map[RMAP_OUT].name) == 0)) +		filter->map[RMAP_OUT].map = map; + +	if (filter->usmap.name && (strcmp(rmap_name, filter->usmap.name) == 0)) +		filter->usmap.map = map; + +	if (peer->default_rmap[afi][safi].name +	    && (strcmp(rmap_name, peer->default_rmap[afi][safi].name) == 0)) +		peer->default_rmap[afi][safi].map = map; +} + +static void bgp_route_map_update_peer_group(const char *rmap_name, +					    struct route_map *map, +					    struct bgp *bgp) +{ +	struct peer_group *group; +	struct listnode *node, *nnode; +	struct bgp_filter *filter; +	int afi, safi; +	int direct; + +	if (!bgp) +		return; + +	/* All the peers have been updated correctly already. This is +	 * just updating the placeholder data. No real update required. +	 */ +	for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) +		for (afi = AFI_IP; afi < AFI_MAX; afi++) +			for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { +				filter = &group->conf->filter[afi][safi]; + +				for (direct = RMAP_IN; direct < RMAP_MAX; +				     direct++) { +					if ((filter->map[direct].name) +					    && (strcmp(rmap_name, +						       filter->map[direct].name) +						== 0)) +						filter->map[direct].map = map; +				} + +				if (filter->usmap.name +				    && (strcmp(rmap_name, filter->usmap.name) +					== 0)) +					filter->usmap.map = map; +			}  }  /* @@ -3047,203 +2784,214 @@ bgp_route_map_update_peer_group(const char *rmap_name, struct route_map *map,   * called for each route-map and within this function we walk the list of peers,   * network statements, etc looking to see if they use this route-map.   */ -static void -bgp_route_map_process_update (struct bgp *bgp, const char *rmap_name, int route_update) -{ -  int i; -  afi_t afi; -  safi_t safi; -  struct peer *peer; -  struct bgp_node *bn; -  struct bgp_static *bgp_static; -  struct listnode *node, *nnode; -  struct route_map *map; -  char buf[INET6_ADDRSTRLEN]; - -  map = route_map_lookup_by_name (rmap_name); - -  for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer)) -    { - -      /* Ignore dummy peer-group structure */ -      if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) -	continue; - -      for (afi = AFI_IP; afi < AFI_MAX; afi++) -	for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) -	  { -	    /* Ignore inactive AFI/SAFI */ -	    if (! peer->afc[afi][safi]) -	      continue; - -	    /* process in/out/import/export/default-orig route-maps */ -	    bgp_route_map_process_peer(rmap_name, map, peer, afi, safi, route_update); -	  } -    } - -  /* for outbound/default-orig route-maps, process for groups */ -  update_group_policy_update(bgp, BGP_POLICY_ROUTE_MAP, rmap_name, -			     route_update, 0); - -  /* update peer-group config (template) */ -  bgp_route_map_update_peer_group(rmap_name, map, bgp); - -  for (afi = AFI_IP; afi < AFI_MAX; afi++) -    for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) -      { -        /* For table route-map updates. */ -        if (!bgp_fibupd_safi(safi)) -          continue; - -	if (bgp->table_map[afi][safi].name && -	    (strcmp(rmap_name, bgp->table_map[afi][safi].name) == 0)) -	  { -	    bgp->table_map[afi][safi].map = map; - -            if (BGP_DEBUG (zebra, ZEBRA)) -	      zlog_debug("Processing route_map %s update on " -			 "table map", rmap_name); -	    if (route_update) -	      bgp_zebra_announce_table(bgp, afi, safi); -	  } - -        /* For network route-map updates. */ -        for (bn = bgp_table_top (bgp->route[afi][safi]); bn; bn = bgp_route_next (bn)) -          if ((bgp_static = bn->info) != NULL) -            { -              if (bgp_static->rmap.name && -                  (strcmp(rmap_name, bgp_static->rmap.name) == 0)) -                { -                  bgp_static->rmap.map = map; - -                  if (route_update) -                    if (!bgp_static->backdoor) -                      { -                        if (bgp_debug_zebra(&bn->p)) -                          zlog_debug("Processing route_map %s update on " -                                     "static route %s", rmap_name, -                                     inet_ntop (bn->p.family, &bn->p.u.prefix, -                                                buf, INET6_ADDRSTRLEN)); -                        bgp_static_update (bgp, &bn->p, bgp_static, afi, safi); -                      } -                } -            } -      } - -  /* For redistribute route-map updates. */ -  for (afi = AFI_IP; afi < AFI_MAX; afi++) -    for (i = 0; i < ZEBRA_ROUTE_MAX; i++) -      { -        struct list *red_list; -        struct listnode *node; -        struct bgp_redist *red; - -        red_list = bgp->redist[afi][i]; -        if (!red_list) -            continue; - -        for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) -          { -            if (red->rmap.name && -                (strcmp(rmap_name, red->rmap.name) == 0)) -              { -                red->rmap.map = map; - -                if (route_update) -                  { -                    if (BGP_DEBUG (zebra, ZEBRA)) -                      zlog_debug("Processing route_map %s update on " -                                 "redistributed routes", rmap_name); - -                    bgp_redistribute_resend (bgp, afi, i, red->instance); -                  } -              } -	  } -      } -} - -static int -bgp_route_map_process_update_cb (char *rmap_name) -{ -  struct listnode *node, *nnode; -  struct bgp *bgp; - -  for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp)) -    bgp_route_map_process_update(bgp, rmap_name, 1); +static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name, +					 int route_update) +{ +	int i; +	afi_t afi; +	safi_t safi; +	struct peer *peer; +	struct bgp_node *bn; +	struct bgp_static *bgp_static; +	struct listnode *node, *nnode; +	struct route_map *map; +	char buf[INET6_ADDRSTRLEN]; + +	map = route_map_lookup_by_name(rmap_name); + +	for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { + +		/* Ignore dummy peer-group structure */ +		if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) +			continue; + +		for (afi = AFI_IP; afi < AFI_MAX; afi++) +			for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { +				/* Ignore inactive AFI/SAFI */ +				if (!peer->afc[afi][safi]) +					continue; + +				/* process in/out/import/export/default-orig +				 * route-maps */ +				bgp_route_map_process_peer(rmap_name, map, peer, +							   afi, safi, +							   route_update); +			} +	} + +	/* for outbound/default-orig route-maps, process for groups */ +	update_group_policy_update(bgp, BGP_POLICY_ROUTE_MAP, rmap_name, +				   route_update, 0); + +	/* update peer-group config (template) */ +	bgp_route_map_update_peer_group(rmap_name, map, bgp); + +	for (afi = AFI_IP; afi < AFI_MAX; afi++) +		for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { +			/* For table route-map updates. */ +			if (!bgp_fibupd_safi(safi)) +				continue; + +			if (bgp->table_map[afi][safi].name +			    && (strcmp(rmap_name, +				       bgp->table_map[afi][safi].name) +				== 0)) { +				bgp->table_map[afi][safi].map = map; + +				if (BGP_DEBUG(zebra, ZEBRA)) +					zlog_debug( +						"Processing route_map %s update on " +						"table map", +						rmap_name); +				if (route_update) +					bgp_zebra_announce_table(bgp, afi, +								 safi); +			} + +			/* For network route-map updates. */ +			for (bn = bgp_table_top(bgp->route[afi][safi]); bn; +			     bn = bgp_route_next(bn)) +				if ((bgp_static = bn->info) != NULL) { +					if (bgp_static->rmap.name +					    && (strcmp(rmap_name, +						       bgp_static->rmap.name) +						== 0)) { +						bgp_static->rmap.map = map; + +						if (route_update) +							if (!bgp_static +								     ->backdoor) { +								if (bgp_debug_zebra( +									    &bn->p)) +									zlog_debug( +										"Processing route_map %s update on " +										"static route %s", +										rmap_name, +										inet_ntop( +											bn->p.family, +											&bn->p.u.prefix, +											buf, +											INET6_ADDRSTRLEN)); +								bgp_static_update( +									bgp, +									&bn->p, +									bgp_static, +									afi, +									safi); +							} +					} +				} +		} + +	/* For redistribute route-map updates. */ +	for (afi = AFI_IP; afi < AFI_MAX; afi++) +		for (i = 0; i < ZEBRA_ROUTE_MAX; i++) { +			struct list *red_list; +			struct listnode *node; +			struct bgp_redist *red; + +			red_list = bgp->redist[afi][i]; +			if (!red_list) +				continue; + +			for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) { +				if (red->rmap.name +				    && (strcmp(rmap_name, red->rmap.name) +					== 0)) { +					red->rmap.map = map; + +					if (route_update) { +						if (BGP_DEBUG(zebra, ZEBRA)) +							zlog_debug( +								"Processing route_map %s update on " +								"redistributed routes", +								rmap_name); + +						bgp_redistribute_resend( +							bgp, afi, i, +							red->instance); +					} +				} +			} +		} +} + +static int bgp_route_map_process_update_cb(char *rmap_name) +{ +	struct listnode *node, *nnode; +	struct bgp *bgp; + +	for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) +		bgp_route_map_process_update(bgp, rmap_name, 1);  #if ENABLE_BGP_VNC -  zlog_debug("%s: calling vnc_routemap_update", __func__); -  vnc_routemap_update(bgp, __func__); +	zlog_debug("%s: calling vnc_routemap_update", __func__); +	vnc_routemap_update(bgp, __func__);  #endif -  return 0; +	return 0;  } -int -bgp_route_map_update_timer(struct thread *thread) +int bgp_route_map_update_timer(struct thread *thread)  { -  bm->t_rmap_update = NULL; +	bm->t_rmap_update = NULL; -  route_map_walk_update_list(bgp_route_map_process_update_cb); +	route_map_walk_update_list(bgp_route_map_process_update_cb); -  return (0); +	return (0);  } -static void -bgp_route_map_mark_update (const char *rmap_name) +static void bgp_route_map_mark_update(const char *rmap_name)  { -  if (bm->t_rmap_update == NULL) -    { -      struct listnode *node, *nnode; -      struct bgp *bgp; +	if (bm->t_rmap_update == NULL) { +		struct listnode *node, *nnode; +		struct bgp *bgp; -      /* rmap_update_timer of 0 means don't do route updates */ -      if (bm->rmap_update_timer) -        { -          bm->t_rmap_update = NULL; -          thread_add_timer(bm->master, bgp_route_map_update_timer, NULL, bm->rmap_update_timer, -                           &bm->t_rmap_update); +		/* rmap_update_timer of 0 means don't do route updates */ +		if (bm->rmap_update_timer) { +			bm->t_rmap_update = NULL; +			thread_add_timer(bm->master, bgp_route_map_update_timer, +					 NULL, bm->rmap_update_timer, +					 &bm->t_rmap_update); -          /* Signal the groups that a route-map update event has started */ -          for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp)) -            update_group_policy_update(bgp, BGP_POLICY_ROUTE_MAP, rmap_name, 1, 1); -        } -      else -        { -          for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp)) -            bgp_route_map_process_update(bgp, rmap_name, 0); - #if ENABLE_BGP_VNC -          zlog_debug("%s: calling vnc_routemap_update", __func__); -          vnc_routemap_update(bgp, __func__); +			/* Signal the groups that a route-map update event has +			 * started */ +			for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) +				update_group_policy_update(bgp, +							   BGP_POLICY_ROUTE_MAP, +							   rmap_name, 1, 1); +		} else { +			for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) +				bgp_route_map_process_update(bgp, rmap_name, 0); +#if ENABLE_BGP_VNC +			zlog_debug("%s: calling vnc_routemap_update", __func__); +			vnc_routemap_update(bgp, __func__);  #endif -        } -    } +		} +	}  } -static void -bgp_route_map_add (const char *rmap_name) +static void bgp_route_map_add(const char *rmap_name)  { -  if (route_map_mark_updated(rmap_name, 0) == 0) -    bgp_route_map_mark_update(rmap_name); +	if (route_map_mark_updated(rmap_name, 0) == 0) +		bgp_route_map_mark_update(rmap_name); -  route_map_notify_dependencies(rmap_name, RMAP_EVENT_MATCH_ADDED); +	route_map_notify_dependencies(rmap_name, RMAP_EVENT_MATCH_ADDED);  } -static void -bgp_route_map_delete (const char *rmap_name) +static void bgp_route_map_delete(const char *rmap_name)  { -  if (route_map_mark_updated(rmap_name, 1) == 0) -    bgp_route_map_mark_update(rmap_name); +	if (route_map_mark_updated(rmap_name, 1) == 0) +		bgp_route_map_mark_update(rmap_name); -  route_map_notify_dependencies(rmap_name, RMAP_EVENT_MATCH_DELETED); +	route_map_notify_dependencies(rmap_name, RMAP_EVENT_MATCH_DELETED);  } -static void -bgp_route_map_event (route_map_event_t event, const char *rmap_name) +static void bgp_route_map_event(route_map_event_t event, const char *rmap_name)  { -  if (route_map_mark_updated(rmap_name, 0) == 0) -    bgp_route_map_mark_update(rmap_name); +	if (route_map_mark_updated(rmap_name, 0) == 0) +		bgp_route_map_mark_update(rmap_name); -  route_map_notify_dependencies(rmap_name, RMAP_EVENT_MATCH_ADDED); +	route_map_notify_dependencies(rmap_name, RMAP_EVENT_MATCH_ADDED);  } @@ -3255,9 +3003,9 @@ DEFUN (match_peer,         "IP address of peer\n"         "IPv6 address of peer\n")  { -  int idx_ip = 2; -  return bgp_route_match_add (vty, "peer", argv[idx_ip]->arg, -			      RMAP_EVENT_MATCH_ADDED); +	int idx_ip = 2; +	return bgp_route_match_add(vty, "peer", argv[idx_ip]->arg, +				   RMAP_EVENT_MATCH_ADDED);  }  DEFUN (match_peer_local, @@ -3267,8 +3015,8 @@ DEFUN (match_peer_local,          "Match peer address\n"          "Static or Redistributed routes\n")  { -  return bgp_route_match_add (vty, "peer", "local", -			      RMAP_EVENT_MATCH_DELETED); +	return bgp_route_match_add(vty, "peer", "local", +				   RMAP_EVENT_MATCH_DELETED);  }  DEFUN (no_match_peer, @@ -3281,13 +3029,13 @@ DEFUN (no_match_peer,         "IP address of peer\n"         "IPv6 address of peer\n")  { - int idx_peer = 3; +	int idx_peer = 3; - if (argc <= idx_peer) -   return bgp_route_match_delete (vty, "peer", NULL, -                                  RMAP_EVENT_MATCH_DELETED); - return bgp_route_match_delete (vty, "peer", argv[idx_peer]->arg, -				RMAP_EVENT_MATCH_DELETED); +	if (argc <= idx_peer) +		return bgp_route_match_delete(vty, "peer", NULL, +					      RMAP_EVENT_MATCH_DELETED); +	return bgp_route_match_delete(vty, "peer", argv[idx_peer]->arg, +				      RMAP_EVENT_MATCH_DELETED);  } @@ -3299,9 +3047,9 @@ DEFUN (match_probability,         "Match portion of routes defined by percentage value\n"         "Percentage of routes\n")  { -  int idx_number = 2; -  return bgp_route_match_add (vty, "probability", argv[idx_number]->arg, -			      RMAP_EVENT_MATCH_ADDED); +	int idx_number = 2; +	return bgp_route_match_add(vty, "probability", argv[idx_number]->arg, +				   RMAP_EVENT_MATCH_ADDED);  } @@ -3313,12 +3061,12 @@ DEFUN (no_match_probability,         "Match portion of routes defined by percentage value\n"         "Percentage of routes\n")  { -  int idx_number = 3; -  if (argc <= idx_number) -    return bgp_route_match_delete (vty, "probability", NULL, -                                   RMAP_EVENT_MATCH_DELETED); -  return bgp_route_match_delete (vty, "probability", argv[idx_number]->arg, -				 RMAP_EVENT_MATCH_DELETED); +	int idx_number = 3; +	if (argc <= idx_number) +		return bgp_route_match_delete(vty, "probability", NULL, +					      RMAP_EVENT_MATCH_DELETED); +	return bgp_route_match_delete(vty, "probability", argv[idx_number]->arg, +				      RMAP_EVENT_MATCH_DELETED);  } @@ -3332,9 +3080,9 @@ DEFUN (match_ip_route_source,         "IP access-list number (expanded range)\n"         "IP standard access-list name\n")  { -  int idx_acl = 3; -  return bgp_route_match_add (vty, "ip route-source", argv[idx_acl]->arg, -			      RMAP_EVENT_FILTER_ADDED); +	int idx_acl = 3; +	return bgp_route_match_add(vty, "ip route-source", argv[idx_acl]->arg, +				   RMAP_EVENT_FILTER_ADDED);  } @@ -3349,12 +3097,13 @@ DEFUN (no_match_ip_route_source,         "IP access-list number (expanded range)\n"         "IP standard access-list name\n")  { -  int idx_number = 4; -  if (argc <= idx_number) -    return bgp_route_match_delete (vty, "ip route-source", -                                   NULL, RMAP_EVENT_FILTER_DELETED); -  return bgp_route_match_delete (vty, "ip route-source", -				 argv[idx_number]->arg, RMAP_EVENT_FILTER_DELETED); +	int idx_number = 4; +	if (argc <= idx_number) +		return bgp_route_match_delete(vty, "ip route-source", NULL, +					      RMAP_EVENT_FILTER_DELETED); +	return bgp_route_match_delete(vty, "ip route-source", +				      argv[idx_number]->arg, +				      RMAP_EVENT_FILTER_DELETED);  } @@ -3367,9 +3116,9 @@ DEFUN (match_ip_route_source_prefix_list,         "Match entries of prefix-lists\n"         "IP prefix-list name\n")  { -  int idx_word = 4; -  return bgp_route_match_add (vty, "ip route-source prefix-list", -			      argv[idx_word]->arg, RMAP_EVENT_PLIST_ADDED); +	int idx_word = 4; +	return bgp_route_match_add(vty, "ip route-source prefix-list", +				   argv[idx_word]->arg, RMAP_EVENT_PLIST_ADDED);  } @@ -3383,12 +3132,14 @@ DEFUN (no_match_ip_route_source_prefix_list,         "Match entries of prefix-lists\n"         "IP prefix-list name\n")  { -  int idx_word = 5; -  if (argc <= idx_word) -    return bgp_route_match_delete (vty, "ip route-source prefix-list", -                                   NULL, RMAP_EVENT_PLIST_DELETED); -  return bgp_route_match_delete (vty, "ip route-source prefix-list", -				 argv[idx_word]->arg, RMAP_EVENT_PLIST_DELETED); +	int idx_word = 5; +	if (argc <= idx_word) +		return bgp_route_match_delete(vty, +					      "ip route-source prefix-list", +					      NULL, RMAP_EVENT_PLIST_DELETED); +	return bgp_route_match_delete(vty, "ip route-source prefix-list", +				      argv[idx_word]->arg, +				      RMAP_EVENT_PLIST_DELETED);  } @@ -3399,9 +3150,10 @@ DEFUN (match_local_pref,         "Match local-preference of route\n"         "Metric value\n")  { -  int idx_number = 2; -  return bgp_route_match_add (vty, "local-preference", argv[idx_number]->arg, -			      RMAP_EVENT_MATCH_ADDED); +	int idx_number = 2; +	return bgp_route_match_add(vty, "local-preference", +				   argv[idx_number]->arg, +				   RMAP_EVENT_MATCH_ADDED);  } @@ -3413,13 +3165,13 @@ DEFUN (no_match_local_pref,         "Match local preference of route\n"         "Local preference value\n")  { -  int idx_localpref = 3; -  if (argc <= idx_localpref) -    return bgp_route_match_delete (vty, "local-preference", -                                   NULL, RMAP_EVENT_MATCH_DELETED); -  return bgp_route_match_delete (vty, "local-preference", -				 argv[idx_localpref]->arg, -				 RMAP_EVENT_MATCH_DELETED); +	int idx_localpref = 3; +	if (argc <= idx_localpref) +		return bgp_route_match_delete(vty, "local-preference", NULL, +					      RMAP_EVENT_MATCH_DELETED); +	return bgp_route_match_delete(vty, "local-preference", +				      argv[idx_localpref]->arg, +				      RMAP_EVENT_MATCH_DELETED);  } @@ -3433,28 +3185,26 @@ DEFUN (match_community,         "Community-list name\n"         "Do exact matching of communities\n")  { -  int idx_comm_list = 2; -  int ret; -  char *argstr; +	int idx_comm_list = 2; +	int ret; +	char *argstr; -  if (argc == 4) -    { -      argstr = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, -                        strlen (argv[idx_comm_list]->arg) + -                        strlen ("exact-match") + 2); +	if (argc == 4) { +		argstr = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, +				 strlen(argv[idx_comm_list]->arg) +					 + strlen("exact-match") + 2); -      sprintf (argstr, "%s exact-match", argv[idx_comm_list]->arg); -    } -  else -    argstr = argv[idx_comm_list]->arg; +		sprintf(argstr, "%s exact-match", argv[idx_comm_list]->arg); +	} else +		argstr = argv[idx_comm_list]->arg; -  ret = bgp_route_match_add (vty, "community", argstr, -			     RMAP_EVENT_CLIST_ADDED); +	ret = bgp_route_match_add(vty, "community", argstr, +				  RMAP_EVENT_CLIST_ADDED); -  if (argstr != argv[idx_comm_list]->arg) -    XFREE (MTYPE_ROUTE_MAP_COMPILED, argstr); +	if (argstr != argv[idx_comm_list]->arg) +		XFREE(MTYPE_ROUTE_MAP_COMPILED, argstr); -  return ret; +	return ret;  }  DEFUN (no_match_community, @@ -3468,8 +3218,8 @@ DEFUN (no_match_community,         "Community-list name\n"         "Do exact matching of communities\n")  { -  return bgp_route_match_delete (vty, "community", NULL, -				 RMAP_EVENT_CLIST_DELETED); +	return bgp_route_match_delete(vty, "community", NULL, +				      RMAP_EVENT_CLIST_DELETED);  }  DEFUN (match_lcommunity, @@ -3481,8 +3231,8 @@ DEFUN (match_lcommunity,         "Large Community-list number (expanded)\n"         "Large Community-list name\n")  { -  return bgp_route_match_add (vty, "large-community", argv[2]->arg, -                              RMAP_EVENT_LLIST_ADDED); +	return bgp_route_match_add(vty, "large-community", argv[2]->arg, +				   RMAP_EVENT_LLIST_ADDED);  }  DEFUN (no_match_lcommunity, @@ -3495,8 +3245,8 @@ DEFUN (no_match_lcommunity,         "Large Community-list number (expanded)\n"         "Large Community-list name\n")  { -  return bgp_route_match_delete (vty, "large-community", NULL, -                                 RMAP_EVENT_LLIST_DELETED); +	return bgp_route_match_delete(vty, "large-community", NULL, +				      RMAP_EVENT_LLIST_DELETED);  }  DEFUN (match_ecommunity, @@ -3508,9 +3258,10 @@ DEFUN (match_ecommunity,         "Extended community-list number (expanded)\n"         "Extended community-list name\n")  { -  int idx_comm_list = 2; -  return bgp_route_match_add (vty, "extcommunity", argv[idx_comm_list]->arg, -			      RMAP_EVENT_ECLIST_ADDED); +	int idx_comm_list = 2; +	return bgp_route_match_add(vty, "extcommunity", +				   argv[idx_comm_list]->arg, +				   RMAP_EVENT_ECLIST_ADDED);  } @@ -3524,8 +3275,8 @@ DEFUN (no_match_ecommunity,         "Extended community-list number (expanded)\n"         "Extended community-list name\n")  { -  return bgp_route_match_delete (vty, "extcommunity", NULL, -				 RMAP_EVENT_ECLIST_DELETED); +	return bgp_route_match_delete(vty, "extcommunity", NULL, +				      RMAP_EVENT_ECLIST_DELETED);  } @@ -3536,9 +3287,9 @@ DEFUN (match_aspath,         "Match BGP AS path list\n"         "AS path access-list name\n")  { -  int idx_word = 2; -  return bgp_route_match_add (vty, "as-path", argv[idx_word]->arg, -			      RMAP_EVENT_ASLIST_ADDED); +	int idx_word = 2; +	return bgp_route_match_add(vty, "as-path", argv[idx_word]->arg, +				   RMAP_EVENT_ASLIST_ADDED);  } @@ -3550,8 +3301,8 @@ DEFUN (no_match_aspath,         "Match BGP AS path list\n"         "AS path access-list name\n")  { -  return bgp_route_match_delete (vty, "as-path", NULL, -				 RMAP_EVENT_ASLIST_DELETED); +	return bgp_route_match_delete(vty, "as-path", NULL, +				      RMAP_EVENT_ASLIST_DELETED);  } @@ -3564,19 +3315,19 @@ DEFUN (match_origin,         "local IGP\n"         "unknown heritage\n")  { -  int idx_origin = 2; -  if (strncmp (argv[idx_origin]->arg, "igp", 2) == 0) -    return bgp_route_match_add (vty, "origin", "igp", -				RMAP_EVENT_MATCH_ADDED); -  if (strncmp (argv[idx_origin]->arg, "egp", 1) == 0) -    return bgp_route_match_add (vty, "origin", "egp", -				RMAP_EVENT_MATCH_ADDED); -  if (strncmp (argv[idx_origin]->arg, "incomplete", 2) == 0) -    return bgp_route_match_add (vty, "origin", "incomplete", -				RMAP_EVENT_MATCH_ADDED); +	int idx_origin = 2; +	if (strncmp(argv[idx_origin]->arg, "igp", 2) == 0) +		return bgp_route_match_add(vty, "origin", "igp", +					   RMAP_EVENT_MATCH_ADDED); +	if (strncmp(argv[idx_origin]->arg, "egp", 1) == 0) +		return bgp_route_match_add(vty, "origin", "egp", +					   RMAP_EVENT_MATCH_ADDED); +	if (strncmp(argv[idx_origin]->arg, "incomplete", 2) == 0) +		return bgp_route_match_add(vty, "origin", "incomplete", +					   RMAP_EVENT_MATCH_ADDED); -  vty_out (vty, "%% Invalid match origin type\n"); -  return CMD_WARNING_CONFIG_FAILED; +	vty_out(vty, "%% Invalid match origin type\n"); +	return CMD_WARNING_CONFIG_FAILED;  } @@ -3590,8 +3341,8 @@ DEFUN (no_match_origin,         "local IGP\n"         "unknown heritage\n")  { -  return bgp_route_match_delete (vty, "origin", NULL, -				 RMAP_EVENT_MATCH_DELETED); +	return bgp_route_match_delete(vty, "origin", NULL, +				      RMAP_EVENT_MATCH_DELETED);  }  DEFUN (set_ip_nexthop_peer, @@ -3602,8 +3353,8 @@ DEFUN (set_ip_nexthop_peer,         "Next hop address\n"         "Use peer address (for BGP only)\n")  { -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "ip next-hop", "peer-address"); +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "ip next-hop", "peer-address");  }  DEFUN (set_ip_nexthop_unchanged, @@ -3614,8 +3365,8 @@ DEFUN (set_ip_nexthop_unchanged,         "Next hop address\n"         "Don't modify existing Next hop address\n")  { -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "ip next-hop", "unchanged"); +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "ip next-hop", "unchanged");  } @@ -3626,9 +3377,9 @@ DEFUN (set_local_pref,         "BGP local preference path attribute\n"         "Preference value\n")  { -  int idx_number = 2; -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "local-preference", argv[idx_number]->arg); +	int idx_number = 2; +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "local-preference", argv[idx_number]->arg);  } @@ -3640,12 +3391,12 @@ DEFUN (no_set_local_pref,         "BGP local preference path attribute\n"         "Preference value\n")  { -  int idx_localpref = 3; -  if (argc <= idx_localpref) -    return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                               "local-preference", NULL); -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "local-preference", argv[idx_localpref]->arg); +	int idx_localpref = 3; +	if (argc <= idx_localpref) +		return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +					  "local-preference", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "local-preference", argv[idx_localpref]->arg);  } @@ -3656,9 +3407,9 @@ DEFUN (set_weight,         "BGP weight for routing table\n"         "Weight value\n")  { -  int idx_number = 2; -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "weight", -                          argv[idx_number]->arg); +	int idx_number = 2; +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), "weight", +			       argv[idx_number]->arg);  } @@ -3670,12 +3421,12 @@ DEFUN (no_set_weight,         "BGP weight for routing table\n"         "Weight value\n")  { -  int idx_weight = 3; -  if (argc <= idx_weight) -    return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                               "weight", NULL); -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), "weight", -                             argv[idx_weight]->arg); +	int idx_weight = 3; +	if (argc <= idx_weight) +		return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +					  "weight", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "weight", argv[idx_weight]->arg);  }  DEFUN (set_label_index, @@ -3685,9 +3436,9 @@ DEFUN (set_label_index,         "Label index to associate with the prefix\n"         "Label index value\n")  { -  int idx_number = 2; -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "label-index", -                          argv[idx_number]->arg); +	int idx_number = 2; +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "label-index", argv[idx_number]->arg);  }  DEFUN (no_set_label_index, @@ -3698,12 +3449,12 @@ DEFUN (no_set_label_index,         "Label index to associate with the prefix\n"         "Label index value\n")  { -  int idx_label_index = 3; -  if (argc <= idx_label_index) -    return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                               "label-index", NULL); -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), "label-index", -                             argv[idx_label_index]->arg); +	int idx_label_index = 3; +	if (argc <= idx_label_index) +		return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +					  "label-index", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "label-index", argv[idx_label_index]->arg);  }  DEFUN (set_aspath_prepend_asn, @@ -3714,16 +3465,16 @@ DEFUN (set_aspath_prepend_asn,         "Prepend to the as-path\n"         "AS number\n")  { -  int idx_asn = 3; -  int ret; -  char *str; +	int idx_asn = 3; +	int ret; +	char *str; -  str = argv_concat (argv, argc, idx_asn); -  ret = generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                         "as-path prepend", str); -  XFREE (MTYPE_TMP, str); +	str = argv_concat(argv, argc, idx_asn); +	ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			      "as-path prepend", str); +	XFREE(MTYPE_TMP, str); -  return ret; +	return ret;  }  DEFUN (set_aspath_prepend_lastas, @@ -3735,7 +3486,7 @@ DEFUN (set_aspath_prepend_lastas,         "Use the peer's AS-number\n"         "Number of times to insert\n")  { -  return set_aspath_prepend_asn (self, vty, argc, argv); +	return set_aspath_prepend_asn(self, vty, argc, argv);  }  DEFUN (no_set_aspath_prepend, @@ -3747,15 +3498,15 @@ DEFUN (no_set_aspath_prepend,         "Prepend to the as-path\n"         "AS number\n")  { -  int idx_asn = 4; -  int ret; -  char *str; +	int idx_asn = 4; +	int ret; +	char *str; -  str = argv_concat (argv, argc, idx_asn); -  ret = generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                            "as-path prepend", str); -  XFREE (MTYPE_TMP, str); -  return ret; +	str = argv_concat(argv, argc, idx_asn); +	ret = generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				 "as-path prepend", str); +	XFREE(MTYPE_TMP, str); +	return ret;  } @@ -3767,15 +3518,15 @@ DEFUN (set_aspath_exclude,         "Exclude from the as-path\n"         "AS number\n")  { -  int idx_asn = 3; -  int ret; -  char *str; +	int idx_asn = 3; +	int ret; +	char *str; -  str = argv_concat (argv, argc, idx_asn); -  ret = generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                         "as-path exclude", str); -  XFREE (MTYPE_TMP, str); -  return ret; +	str = argv_concat(argv, argc, idx_asn); +	ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			      "as-path exclude", str); +	XFREE(MTYPE_TMP, str); +	return ret;  }  DEFUN (no_set_aspath_exclude, @@ -3787,15 +3538,15 @@ DEFUN (no_set_aspath_exclude,         "Exclude from the as-path\n"         "AS number\n")  { -  int idx_asn = 4; -  int ret; -  char *str; +	int idx_asn = 4; +	int ret; +	char *str; -  str = argv_concat (argv, argc, idx_asn); -  ret = generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                            "as-path exclude", str); -  XFREE (MTYPE_TMP, str); -  return ret; +	str = argv_concat(argv, argc, idx_asn); +	ret = generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				 "as-path exclude", str); +	XFREE(MTYPE_TMP, str); +	return ret;  } @@ -3806,93 +3557,90 @@ DEFUN (set_community,         "BGP community attribute\n"         COMMUNITY_VAL_STR)  { -  int idx_aa_nn = 2; -  int i; -  int first = 0; -  int additive = 0; -  struct buffer *b; -  struct community *com = NULL; -  char *str; -  char *argstr; -  int ret; - -  b = buffer_new (1024); - -  for (i = idx_aa_nn; i < argc; i++) -    { -      if (strncmp (argv[i]->arg, "additive", strlen (argv[i]->arg)) == 0) - 	{ - 	  additive = 1; - 	  continue; - 	} - -      if (first) -	buffer_putc (b, ' '); -      else -	first = 1; - -      if (strncmp (argv[i]->arg, "internet", strlen (argv[i]->arg)) == 0) - 	{ -	  buffer_putstr (b, "internet"); - 	  continue; - 	} -      if (strncmp (argv[i]->arg, "local-AS", strlen (argv[i]->arg)) == 0) - 	{ -	  buffer_putstr (b, "local-AS"); - 	  continue; - 	} -      if (strncmp (argv[i]->arg, "no-a", strlen ("no-a")) == 0 -	  && strncmp (argv[i]->arg, "no-advertise", strlen (argv[i]->arg)) == 0) - 	{ -	  buffer_putstr (b, "no-advertise"); - 	  continue; - 	} -      if (strncmp (argv[i]->arg, "no-e", strlen ("no-e"))== 0 -	  && strncmp (argv[i]->arg, "no-export", strlen (argv[i]->arg)) == 0) - 	{ -	  buffer_putstr (b, "no-export"); - 	  continue; - 	} -      buffer_putstr (b, argv[i]->arg); -    } -  buffer_putc (b, '\0'); - -  /* Fetch result string then compile it to communities attribute.  */ -  str = buffer_getstr (b); -  buffer_free (b); - -  if (str) -    { -      com = community_str2com (str); -      XFREE (MTYPE_TMP, str); -    } - -  /* Can't compile user input into communities attribute.  */ -  if (! com) -    { -      vty_out (vty, "%% Malformed communities attribute\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } - -  /* Set communites attribute string.  */ -  str = community_str (com); - -  if (additive) -    { -      argstr = XCALLOC (MTYPE_TMP, strlen (str) + strlen (" additive") + 1); -      strcpy (argstr, str); -      strcpy (argstr + strlen (str), " additive"); -      ret =  generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                              "community", argstr); -      XFREE (MTYPE_TMP, argstr); -    } -  else -    ret =  generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                            "community", str); - -  community_free (com); - -  return ret; +	int idx_aa_nn = 2; +	int i; +	int first = 0; +	int additive = 0; +	struct buffer *b; +	struct community *com = NULL; +	char *str; +	char *argstr; +	int ret; + +	b = buffer_new(1024); + +	for (i = idx_aa_nn; i < argc; i++) { +		if (strncmp(argv[i]->arg, "additive", strlen(argv[i]->arg)) +		    == 0) { +			additive = 1; +			continue; +		} + +		if (first) +			buffer_putc(b, ' '); +		else +			first = 1; + +		if (strncmp(argv[i]->arg, "internet", strlen(argv[i]->arg)) +		    == 0) { +			buffer_putstr(b, "internet"); +			continue; +		} +		if (strncmp(argv[i]->arg, "local-AS", strlen(argv[i]->arg)) +		    == 0) { +			buffer_putstr(b, "local-AS"); +			continue; +		} +		if (strncmp(argv[i]->arg, "no-a", strlen("no-a")) == 0 +		    && strncmp(argv[i]->arg, "no-advertise", +			       strlen(argv[i]->arg)) +			       == 0) { +			buffer_putstr(b, "no-advertise"); +			continue; +		} +		if (strncmp(argv[i]->arg, "no-e", strlen("no-e")) == 0 +		    && strncmp(argv[i]->arg, "no-export", strlen(argv[i]->arg)) +			       == 0) { +			buffer_putstr(b, "no-export"); +			continue; +		} +		buffer_putstr(b, argv[i]->arg); +	} +	buffer_putc(b, '\0'); + +	/* Fetch result string then compile it to communities attribute.  */ +	str = buffer_getstr(b); +	buffer_free(b); + +	if (str) { +		com = community_str2com(str); +		XFREE(MTYPE_TMP, str); +	} + +	/* Can't compile user input into communities attribute.  */ +	if (!com) { +		vty_out(vty, "%% Malformed communities attribute\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} + +	/* Set communites attribute string.  */ +	str = community_str(com); + +	if (additive) { +		argstr = XCALLOC(MTYPE_TMP, +				 strlen(str) + strlen(" additive") + 1); +		strcpy(argstr, str); +		strcpy(argstr + strlen(str), " additive"); +		ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +				      "community", argstr); +		XFREE(MTYPE_TMP, argstr); +	} else +		ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +				      "community", str); + +	community_free(com); + +	return ret;  }  DEFUN (set_community_none, @@ -3902,8 +3650,8 @@ DEFUN (set_community_none,         "BGP community attribute\n"         "No community attribute\n")  { -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "community", -                          "none"); +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "community", "none");  }  DEFUN (no_set_community, @@ -3914,12 +3662,11 @@ DEFUN (no_set_community,         "BGP community attribute\n"         COMMUNITY_VAL_STR)  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "community", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "community", NULL);  } -  DEFUN (set_community_delete,         set_community_delete_cmd,         "set comm-list <(1-99)|(100-500)|WORD> delete", @@ -3930,17 +3677,19 @@ DEFUN (set_community_delete,         "Community-list name\n"         "Delete matching communities\n")  { -  int idx_comm_list = 2; -  char *str; +	int idx_comm_list = 2; +	char *str; -  str = XCALLOC (MTYPE_TMP, strlen (argv[idx_comm_list]->arg) + strlen (" delete") + 1); -  strcpy (str, argv[idx_comm_list]->arg); -  strcpy (str + strlen (argv[idx_comm_list]->arg), " delete"); +	str = XCALLOC(MTYPE_TMP, +		      strlen(argv[idx_comm_list]->arg) + strlen(" delete") + 1); +	strcpy(str, argv[idx_comm_list]->arg); +	strcpy(str + strlen(argv[idx_comm_list]->arg), " delete"); -  generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "comm-list", str); +	generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), "comm-list", +			str); -  XFREE (MTYPE_TMP, str); -  return CMD_SUCCESS; +	XFREE(MTYPE_TMP, str); +	return CMD_SUCCESS;  }  DEFUN (no_set_community_delete, @@ -3954,8 +3703,8 @@ DEFUN (no_set_community_delete,         "Community-list name\n"         "Delete matching communities\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "comm-list", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "comm-list", NULL);  }  DEFUN (set_lcommunity, @@ -3965,14 +3714,15 @@ DEFUN (set_lcommunity,         "BGP large community attribute\n"         "Large Community number in aa:bb:cc format or additive\n")  { -  int ret; -  char *str; +	int ret; +	char *str; -  str = argv_concat (argv, argc, 2); -  ret = generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "large-community", str); -  XFREE (MTYPE_TMP, str); +	str = argv_concat(argv, argc, 2); +	ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			      "large-community", str); +	XFREE(MTYPE_TMP, str); -  return ret; +	return ret;  }  DEFUN (set_lcommunity_none, @@ -3982,8 +3732,8 @@ DEFUN (set_lcommunity_none,         "BGP large community attribute\n"         "No large community attribute\n")  { -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "large-community", "none"); +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "large-community", "none");  }  DEFUN (no_set_lcommunity, @@ -3994,8 +3744,8 @@ DEFUN (no_set_lcommunity,         "BGP large community attribute\n"         "No community attribute\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "large-community", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "large-community", NULL);  }  DEFUN (no_set_lcommunity1, @@ -4006,8 +3756,8 @@ DEFUN (no_set_lcommunity1,         "BGP large community attribute\n"         "Large community in AA:BB:CC... format or additive\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "large-community", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "large-community", NULL);  }  DEFUN (set_lcommunity_delete, @@ -4020,17 +3770,17 @@ DEFUN (set_lcommunity_delete,         "Large Community-list name\n"         "Delete matching large communities\n")  { -  char *str; +	char *str; -  str = XCALLOC (MTYPE_TMP, strlen (argv[2]->arg) + strlen (" delete") + 1); -  strcpy (str, argv[2]->arg); -  strcpy (str + strlen (argv[2]->arg), " delete"); +	str = XCALLOC(MTYPE_TMP, strlen(argv[2]->arg) + strlen(" delete") + 1); +	strcpy(str, argv[2]->arg); +	strcpy(str + strlen(argv[2]->arg), " delete"); -  generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                   "large-comm-list", str); +	generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			"large-comm-list", str); -  XFREE (MTYPE_TMP, str); -  return CMD_SUCCESS; +	XFREE(MTYPE_TMP, str); +	return CMD_SUCCESS;  }  DEFUN (no_set_lcommunity_delete, @@ -4044,8 +3794,8 @@ DEFUN (no_set_lcommunity_delete,         "Large Community-list name\n"         "Delete matching large communities\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "large-comm-list", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "large-comm-list", NULL);  }  DEFUN (set_ecommunity_rt, @@ -4056,16 +3806,16 @@ DEFUN (set_ecommunity_rt,         "Route Target extended community\n"         "VPN extended community\n")  { -  int idx_asn_nn = 3; -  int ret; -  char *str; +	int idx_asn_nn = 3; +	int ret; +	char *str; -  str = argv_concat (argv, argc, idx_asn_nn); -  ret = generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                         "extcommunity rt", str); -  XFREE (MTYPE_TMP, str); +	str = argv_concat(argv, argc, idx_asn_nn); +	ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			      "extcommunity rt", str); +	XFREE(MTYPE_TMP, str); -  return ret; +	return ret;  }  DEFUN (no_set_ecommunity_rt, @@ -4077,8 +3827,8 @@ DEFUN (no_set_ecommunity_rt,         "Route Target extended community\n"         "VPN extended community\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "extcommunity rt", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "extcommunity rt", NULL);  } @@ -4090,15 +3840,15 @@ DEFUN (set_ecommunity_soo,         "Site-of-Origin extended community\n"         "VPN extended community\n")  { -  int idx_asn_nn = 3; -  int ret; -  char *str; +	int idx_asn_nn = 3; +	int ret; +	char *str; -  str = argv_concat (argv, argc, idx_asn_nn); -  ret = generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                         "extcommunity soo", str); -  XFREE (MTYPE_TMP, str); -  return ret; +	str = argv_concat(argv, argc, idx_asn_nn); +	ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			      "extcommunity soo", str); +	XFREE(MTYPE_TMP, str); +	return ret;  } @@ -4111,8 +3861,8 @@ DEFUN (no_set_ecommunity_soo,         "Site-of-Origin extended community\n"         "VPN extended community\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "extcommunity soo", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "extcommunity soo", NULL);  } @@ -4125,19 +3875,19 @@ DEFUN (set_origin,         "local IGP\n"         "unknown heritage\n")  { -  int idx_origin = 2; -  if (strncmp (argv[idx_origin]->arg, "igp", 2) == 0) -    return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "origin", -                            "igp"); -  if (strncmp (argv[idx_origin]->arg, "egp", 1) == 0) -    return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "origin", -                            "egp"); -  if (strncmp (argv[idx_origin]->arg, "incomplete", 2) == 0) -    return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), "origin", -                            "incomplete"); +	int idx_origin = 2; +	if (strncmp(argv[idx_origin]->arg, "igp", 2) == 0) +		return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +				       "origin", "igp"); +	if (strncmp(argv[idx_origin]->arg, "egp", 1) == 0) +		return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +				       "origin", "egp"); +	if (strncmp(argv[idx_origin]->arg, "incomplete", 2) == 0) +		return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +				       "origin", "incomplete"); -  vty_out (vty, "%% Invalid set origin type\n"); -  return CMD_WARNING_CONFIG_FAILED; +	vty_out(vty, "%% Invalid set origin type\n"); +	return CMD_WARNING_CONFIG_FAILED;  } @@ -4151,8 +3901,8 @@ DEFUN (no_set_origin,         "local IGP\n"         "unknown heritage\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), "origin", -                             NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "origin", NULL);  } @@ -4162,8 +3912,8 @@ DEFUN (set_atomic_aggregate,         SET_STR         "BGP atomic aggregate attribute\n" )  { -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "atomic-aggregate", NULL); +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "atomic-aggregate", NULL);  }  DEFUN (no_set_atomic_aggregate, @@ -4173,8 +3923,8 @@ DEFUN (no_set_atomic_aggregate,         SET_STR         "BGP atomic aggregate attribute\n" )  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "atomic-aggregate", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "atomic-aggregate", NULL);  }  DEFUN (set_aggregator_as, @@ -4186,30 +3936,30 @@ DEFUN (set_aggregator_as,         "AS number\n"         "IP address of aggregator\n")  { -  int idx_number = 3; -  int idx_ipv4 = 4; -  int ret; -  struct in_addr address; -  char *argstr; +	int idx_number = 3; +	int idx_ipv4 = 4; +	int ret; +	struct in_addr address; +	char *argstr; -  ret = inet_aton (argv[idx_ipv4]->arg, &address); -  if (ret == 0) -    { -      vty_out (vty, "Aggregator IP address is invalid\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } +	ret = inet_aton(argv[idx_ipv4]->arg, &address); +	if (ret == 0) { +		vty_out(vty, "Aggregator IP address is invalid\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} -  argstr = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, -		    strlen (argv[idx_number]->arg) + strlen (argv[idx_ipv4]->arg) + 2); +	argstr = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, +			 strlen(argv[idx_number]->arg) +				 + strlen(argv[idx_ipv4]->arg) + 2); -  sprintf (argstr, "%s %s", argv[idx_number]->arg, argv[idx_ipv4]->arg); +	sprintf(argstr, "%s %s", argv[idx_number]->arg, argv[idx_ipv4]->arg); -  ret = generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                         "aggregator as", argstr); +	ret = generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			      "aggregator as", argstr); -  XFREE (MTYPE_ROUTE_MAP_COMPILED, argstr); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, argstr); -  return ret; +	return ret;  } @@ -4223,34 +3973,34 @@ DEFUN (no_set_aggregator_as,         "AS number\n"         "IP address of aggregator\n")  { -  int idx_asn = 4; -  int idx_ip = 5; -  int ret; -  struct in_addr address; -  char *argstr; +	int idx_asn = 4; +	int idx_ip = 5; +	int ret; +	struct in_addr address; +	char *argstr; -  if (argc <= idx_asn) -    return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                               "aggregator as", NULL); +	if (argc <= idx_asn) +		return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +					  "aggregator as", NULL); -  ret = inet_aton (argv[idx_ip]->arg, &address); -  if (ret == 0) -    { -      vty_out (vty, "Aggregator IP address is invalid\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } +	ret = inet_aton(argv[idx_ip]->arg, &address); +	if (ret == 0) { +		vty_out(vty, "Aggregator IP address is invalid\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} -  argstr = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, -		    strlen (argv[idx_asn]->arg) + strlen (argv[idx_ip]->arg) + 2); +	argstr = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, +			 strlen(argv[idx_asn]->arg) + strlen(argv[idx_ip]->arg) +				 + 2); -  sprintf (argstr, "%s %s", argv[idx_asn]->arg, argv[idx_ip]->arg); +	sprintf(argstr, "%s %s", argv[idx_asn]->arg, argv[idx_ip]->arg); -  ret = generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                            "aggregator as", argstr); +	ret = generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				 "aggregator as", argstr); -  XFREE (MTYPE_ROUTE_MAP_COMPILED, argstr); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, argstr); -  return ret; +	return ret;  }  DEFUN (match_ipv6_next_hop, @@ -4261,9 +4011,9 @@ DEFUN (match_ipv6_next_hop,         "Match IPv6 next-hop address of route\n"         "IPv6 address of next hop\n")  { -  int idx_ipv6 = 3; -  return bgp_route_match_add (vty, "ipv6 next-hop", argv[idx_ipv6]->arg, -			      RMAP_EVENT_MATCH_ADDED); +	int idx_ipv6 = 3; +	return bgp_route_match_add(vty, "ipv6 next-hop", argv[idx_ipv6]->arg, +				   RMAP_EVENT_MATCH_ADDED);  }  DEFUN (no_match_ipv6_next_hop, @@ -4275,9 +4025,9 @@ DEFUN (no_match_ipv6_next_hop,         "Match IPv6 next-hop address of route\n"         "IPv6 address of next hop\n")  { -  int idx_ipv6 = 4; -  return bgp_route_match_delete (vty, "ipv6 next-hop", argv[idx_ipv6]->arg, -				 RMAP_EVENT_MATCH_DELETED); +	int idx_ipv6 = 4; +	return bgp_route_match_delete(vty, "ipv6 next-hop", argv[idx_ipv6]->arg, +				      RMAP_EVENT_MATCH_DELETED);  } @@ -4289,8 +4039,8 @@ DEFUN (set_ipv6_nexthop_peer,         "Next hop address\n"         "Use peer address (for BGP only)\n")  { -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "ipv6 next-hop peer-address", NULL); +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "ipv6 next-hop peer-address", NULL);  }  DEFUN (no_set_ipv6_nexthop_peer, @@ -4302,8 +4052,8 @@ DEFUN (no_set_ipv6_nexthop_peer,         "IPv6 next-hop address\n"         "Use peer address (for BGP only)\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "ipv6 next-hop peer-address", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "ipv6 next-hop peer-address", NULL);  }  DEFUN (set_ipv6_nexthop_prefer_global, @@ -4314,8 +4064,9 @@ DEFUN (set_ipv6_nexthop_prefer_global,         "IPv6 next-hop address\n"         "Prefer global over link-local if both exist\n")  { -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "ipv6 next-hop prefer-global", NULL);; +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "ipv6 next-hop prefer-global", NULL); +	;  }  DEFUN (no_set_ipv6_nexthop_prefer_global, @@ -4327,8 +4078,8 @@ DEFUN (no_set_ipv6_nexthop_prefer_global,         "IPv6 next-hop address\n"         "Prefer global over link-local if both exist\n")  { -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "ipv6 next-hop prefer-global", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "ipv6 next-hop prefer-global", NULL);  }  DEFUN (set_ipv6_nexthop_global, @@ -4340,27 +4091,23 @@ DEFUN (set_ipv6_nexthop_global,         "IPv6 global address\n"         "IPv6 address of next hop\n")  { -  int idx_ipv6 = 4; -  struct in6_addr addr; -  int ret; +	int idx_ipv6 = 4; +	struct in6_addr addr; +	int ret; -  ret = inet_pton (AF_INET6, argv[idx_ipv6]->arg, &addr); -  if (!ret) -    { -      vty_out (vty, "%% Malformed nexthop address\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } -  if (IN6_IS_ADDR_UNSPECIFIED(&addr) || -      IN6_IS_ADDR_LOOPBACK(&addr)    || -      IN6_IS_ADDR_MULTICAST(&addr)   || -      IN6_IS_ADDR_LINKLOCAL(&addr)) -    { -      vty_out (vty, "%% Invalid global nexthop address\n"); -      return CMD_WARNING_CONFIG_FAILED; -    } +	ret = inet_pton(AF_INET6, argv[idx_ipv6]->arg, &addr); +	if (!ret) { +		vty_out(vty, "%% Malformed nexthop address\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} +	if (IN6_IS_ADDR_UNSPECIFIED(&addr) || IN6_IS_ADDR_LOOPBACK(&addr) +	    || IN6_IS_ADDR_MULTICAST(&addr) || IN6_IS_ADDR_LINKLOCAL(&addr)) { +		vty_out(vty, "%% Invalid global nexthop address\n"); +		return CMD_WARNING_CONFIG_FAILED; +	} -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "ipv6 next-hop global", argv[idx_ipv6]->arg); +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "ipv6 next-hop global", argv[idx_ipv6]->arg);  } @@ -4374,12 +4121,12 @@ DEFUN (no_set_ipv6_nexthop_global,         "IPv6 global address\n"         "IPv6 address of next hop\n")  { -  int idx_ipv6 = 5; -  if (argc <= idx_ipv6) -    return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                               "ipv6 next-hop global", NULL); -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "ipv6 next-hop global", argv[idx_ipv6]->arg); +	int idx_ipv6 = 5; +	if (argc <= idx_ipv6) +		return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +					  "ipv6 next-hop global", NULL); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "ipv6 next-hop global", argv[idx_ipv6]->arg);  }  #ifdef KEEP_OLD_VPN_COMMANDS @@ -4394,20 +4141,21 @@ DEFUN (set_vpn_nexthop,         "VPN next-hop address\n"         "IPv6 address of next hop\n")  { -  int idx_ip = 3; -  afi_t afi; -  int idx = 0; - -  if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) -    { -      if (afi == AFI_IP) -        return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                              "ipv4 vpn next-hop", argv[idx_ip]->arg); -      else -        return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                              "ipv6 vpn next-hop", argv[idx_ip]->arg); -    } -  return CMD_SUCCESS; +	int idx_ip = 3; +	afi_t afi; +	int idx = 0; + +	if (argv_find_and_parse_vpnvx(argv, argc, &idx, &afi)) { +		if (afi == AFI_IP) +			return generic_set_add( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv4 vpn next-hop", argv[idx_ip]->arg); +		else +			return generic_set_add( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv6 vpn next-hop", argv[idx_ip]->arg); +	} +	return CMD_SUCCESS;  }  DEFUN (no_set_vpn_nexthop, @@ -4422,25 +4170,26 @@ DEFUN (no_set_vpn_nexthop,         "VPN next-hop address\n"         "IPv6 address of next hop\n")  { -  int idx_ip = 4; -  char *arg; -  afi_t afi; -  int idx = 0; - -  if (argc <= idx_ip) -    arg = NULL; -  else -    arg = argv[idx_ip]->arg; -  if (argv_find_and_parse_vpnvx (argv, argc, &idx, &afi)) -    { -      if (afi == AFI_IP) -        return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                                   "ipv4 vpn next-hop", arg); -      else -        return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                                   "ipv6 vpn next-hop", argv[idx_ip]->arg); -    } -  return CMD_SUCCESS; +	int idx_ip = 4; +	char *arg; +	afi_t afi; +	int idx = 0; + +	if (argc <= idx_ip) +		arg = NULL; +	else +		arg = argv[idx_ip]->arg; +	if (argv_find_and_parse_vpnvx(argv, argc, &idx, &afi)) { +		if (afi == AFI_IP) +			return generic_set_delete( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv4 vpn next-hop", arg); +		else +			return generic_set_delete( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv6 vpn next-hop", argv[idx_ip]->arg); +	} +	return CMD_SUCCESS;  }  #endif /* KEEP_OLD_VPN_COMMANDS */ @@ -4455,20 +4204,21 @@ DEFUN (set_ipx_vpn_nexthop,         "IP address of next hop\n"         "IPv6 address of next hop\n")  { -  int idx_ip = 4; -  afi_t afi; -  int idx = 0; - -  if (argv_find_and_parse_afi (argv, argc, &idx, &afi)) -    { -      if (afi == AFI_IP) -        return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                              "ipv4 vpn next-hop", argv[idx_ip]->arg); -      else -        return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                              "ipv6 vpn next-hop", argv[idx_ip]->arg); -    } -  return CMD_SUCCESS; +	int idx_ip = 4; +	afi_t afi; +	int idx = 0; + +	if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) { +		if (afi == AFI_IP) +			return generic_set_add( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv4 vpn next-hop", argv[idx_ip]->arg); +		else +			return generic_set_add( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv6 vpn next-hop", argv[idx_ip]->arg); +	} +	return CMD_SUCCESS;  }  DEFUN (no_set_ipx_vpn_nexthop, @@ -4483,25 +4233,26 @@ DEFUN (no_set_ipx_vpn_nexthop,         "IP address of next hop\n"         "IPv6 address of next hop\n")  { -  int idx_ip = 5; -  char *arg; -  afi_t afi; -  int idx = 0; - -  if (argc <= idx_ip) -    arg = NULL; -  else -    arg = argv[idx_ip]->arg; -  if (argv_find_and_parse_afi (argv, argc, &idx, &afi)) -    { -      if (afi == AFI_IP) -        return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                                   "ipv4 vpn next-hop", arg); -      else -        return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                                   "ipv6 vpn next-hop", arg); -    } -  return CMD_SUCCESS; +	int idx_ip = 5; +	char *arg; +	afi_t afi; +	int idx = 0; + +	if (argc <= idx_ip) +		arg = NULL; +	else +		arg = argv[idx_ip]->arg; +	if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) { +		if (afi == AFI_IP) +			return generic_set_delete( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv4 vpn next-hop", arg); +		else +			return generic_set_delete( +				vty, VTY_GET_CONTEXT(route_map_index), +				"ipv6 vpn next-hop", arg); +	} +	return CMD_SUCCESS;  }  DEFUN (set_originator_id, @@ -4511,9 +4262,9 @@ DEFUN (set_originator_id,         "BGP originator ID attribute\n"         "IP address of originator\n")  { -  int idx_ipv4 = 2; -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "originator-id", argv[idx_ipv4]->arg); +	int idx_ipv4 = 2; +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "originator-id", argv[idx_ipv4]->arg);  } @@ -4525,196 +4276,194 @@ DEFUN (no_set_originator_id,         "BGP originator ID attribute\n"         "IP address of originator\n")  { -  int idx = 0; -  char *arg = argv_find (argv, argc, "A.B.C.D", &idx) ? argv[idx]->arg : NULL; +	int idx = 0; +	char *arg = +		argv_find(argv, argc, "A.B.C.D", &idx) ? argv[idx]->arg : NULL; -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "originator-id", arg); +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "originator-id", arg);  }  /* Initialization of route map. */ -void -bgp_route_map_init (void) -{ -  route_map_init (); - -  route_map_add_hook (bgp_route_map_add); -  route_map_delete_hook (bgp_route_map_delete); -  route_map_event_hook (bgp_route_map_event); - -  route_map_match_interface_hook (generic_match_add); -  route_map_no_match_interface_hook (generic_match_delete); - -  route_map_match_ip_address_hook (generic_match_add); -  route_map_no_match_ip_address_hook (generic_match_delete); - -  route_map_match_ip_address_prefix_list_hook (generic_match_add); -  route_map_no_match_ip_address_prefix_list_hook (generic_match_delete); - -  route_map_match_ip_next_hop_hook (generic_match_add); -  route_map_no_match_ip_next_hop_hook (generic_match_delete); - -  route_map_match_ip_next_hop_prefix_list_hook (generic_match_add); -  route_map_no_match_ip_next_hop_prefix_list_hook (generic_match_delete); - -  route_map_match_ipv6_address_hook (generic_match_add); -  route_map_no_match_ipv6_address_hook (generic_match_delete); - -  route_map_match_ipv6_address_prefix_list_hook (generic_match_add); -  route_map_no_match_ipv6_address_prefix_list_hook (generic_match_delete); - -  route_map_match_metric_hook (generic_match_add); -  route_map_no_match_metric_hook (generic_match_delete); - -  route_map_match_tag_hook (generic_match_add); -  route_map_no_match_tag_hook (generic_match_delete); - -  route_map_set_ip_nexthop_hook (generic_set_add); -  route_map_no_set_ip_nexthop_hook (generic_set_delete); - -  route_map_set_ipv6_nexthop_local_hook (generic_set_add); -  route_map_no_set_ipv6_nexthop_local_hook (generic_set_delete); - -  route_map_set_metric_hook (generic_set_add); -  route_map_no_set_metric_hook (generic_set_delete); - -  route_map_set_tag_hook (generic_set_add); -  route_map_no_set_tag_hook (generic_set_delete); - -  route_map_install_match (&route_match_peer_cmd); -  route_map_install_match (&route_match_local_pref_cmd); -  route_map_install_match (&route_match_ip_address_cmd); -  route_map_install_match (&route_match_ip_next_hop_cmd); -  route_map_install_match (&route_match_ip_route_source_cmd); -  route_map_install_match (&route_match_ip_address_prefix_list_cmd); -  route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd); -  route_map_install_match (&route_match_ip_route_source_prefix_list_cmd); -  route_map_install_match (&route_match_aspath_cmd); -  route_map_install_match (&route_match_community_cmd); -  route_map_install_match (&route_match_lcommunity_cmd); -  route_map_install_match (&route_match_ecommunity_cmd); -  route_map_install_match (&route_match_local_pref_cmd); -  route_map_install_match (&route_match_metric_cmd); -  route_map_install_match (&route_match_origin_cmd); -  route_map_install_match (&route_match_probability_cmd); -  route_map_install_match (&route_match_interface_cmd); -  route_map_install_match (&route_match_tag_cmd); - -  route_map_install_set (&route_set_ip_nexthop_cmd); -  route_map_install_set (&route_set_local_pref_cmd); -  route_map_install_set (&route_set_weight_cmd); -  route_map_install_set (&route_set_label_index_cmd); -  route_map_install_set (&route_set_metric_cmd); -  route_map_install_set (&route_set_aspath_prepend_cmd); -  route_map_install_set (&route_set_aspath_exclude_cmd); -  route_map_install_set (&route_set_origin_cmd); -  route_map_install_set (&route_set_atomic_aggregate_cmd); -  route_map_install_set (&route_set_aggregator_as_cmd); -  route_map_install_set (&route_set_community_cmd); -  route_map_install_set (&route_set_community_delete_cmd); -  route_map_install_set (&route_set_lcommunity_cmd); -  route_map_install_set (&route_set_lcommunity_delete_cmd); -  route_map_install_set (&route_set_vpnv4_nexthop_cmd); -  route_map_install_set (&route_set_vpnv6_nexthop_cmd); -  route_map_install_set (&route_set_originator_id_cmd); -  route_map_install_set (&route_set_ecommunity_rt_cmd); -  route_map_install_set (&route_set_ecommunity_soo_cmd); -  route_map_install_set (&route_set_tag_cmd); -  route_map_install_set (&route_set_label_index_cmd); - -  install_element (RMAP_NODE, &match_peer_cmd); -  install_element (RMAP_NODE, &match_peer_local_cmd); -  install_element (RMAP_NODE, &no_match_peer_cmd); -  install_element (RMAP_NODE, &match_ip_route_source_cmd); -  install_element (RMAP_NODE, &no_match_ip_route_source_cmd); -  install_element (RMAP_NODE, &match_ip_route_source_prefix_list_cmd); -  install_element (RMAP_NODE, &no_match_ip_route_source_prefix_list_cmd); - -  install_element (RMAP_NODE, &match_aspath_cmd); -  install_element (RMAP_NODE, &no_match_aspath_cmd); -  install_element (RMAP_NODE, &match_local_pref_cmd); -  install_element (RMAP_NODE, &no_match_local_pref_cmd); -  install_element (RMAP_NODE, &match_community_cmd); -  install_element (RMAP_NODE, &no_match_community_cmd); -  install_element (RMAP_NODE, &match_lcommunity_cmd); -  install_element (RMAP_NODE, &no_match_lcommunity_cmd); -  install_element (RMAP_NODE, &match_ecommunity_cmd); -  install_element (RMAP_NODE, &no_match_ecommunity_cmd); -  install_element (RMAP_NODE, &match_origin_cmd); -  install_element (RMAP_NODE, &no_match_origin_cmd); -  install_element (RMAP_NODE, &match_probability_cmd); -  install_element (RMAP_NODE, &no_match_probability_cmd); - -  install_element (RMAP_NODE, &set_ip_nexthop_peer_cmd); -  install_element (RMAP_NODE, &set_ip_nexthop_unchanged_cmd); -  install_element (RMAP_NODE, &set_local_pref_cmd); -  install_element (RMAP_NODE, &no_set_local_pref_cmd); -  install_element (RMAP_NODE, &set_weight_cmd); -  install_element (RMAP_NODE, &set_label_index_cmd); -  install_element (RMAP_NODE, &no_set_weight_cmd); -  install_element (RMAP_NODE, &no_set_label_index_cmd); -  install_element (RMAP_NODE, &set_aspath_prepend_asn_cmd); -  install_element (RMAP_NODE, &set_aspath_prepend_lastas_cmd); -  install_element (RMAP_NODE, &set_aspath_exclude_cmd); -  install_element (RMAP_NODE, &no_set_aspath_prepend_cmd); -  install_element (RMAP_NODE, &no_set_aspath_exclude_cmd); -  install_element (RMAP_NODE, &set_origin_cmd); -  install_element (RMAP_NODE, &no_set_origin_cmd); -  install_element (RMAP_NODE, &set_atomic_aggregate_cmd); -  install_element (RMAP_NODE, &no_set_atomic_aggregate_cmd); -  install_element (RMAP_NODE, &set_aggregator_as_cmd); -  install_element (RMAP_NODE, &no_set_aggregator_as_cmd); -  install_element (RMAP_NODE, &set_community_cmd); -  install_element (RMAP_NODE, &set_community_none_cmd); -  install_element (RMAP_NODE, &no_set_community_cmd); -  install_element (RMAP_NODE, &set_community_delete_cmd); -  install_element (RMAP_NODE, &no_set_community_delete_cmd); -  install_element (RMAP_NODE, &set_lcommunity_cmd); -  install_element (RMAP_NODE, &set_lcommunity_none_cmd); -  install_element (RMAP_NODE, &no_set_lcommunity_cmd); -  install_element (RMAP_NODE, &no_set_lcommunity1_cmd); -  install_element (RMAP_NODE, &set_lcommunity_delete_cmd); -  install_element (RMAP_NODE, &no_set_lcommunity_delete_cmd); -  install_element (RMAP_NODE, &set_ecommunity_rt_cmd); -  install_element (RMAP_NODE, &no_set_ecommunity_rt_cmd); -  install_element (RMAP_NODE, &set_ecommunity_soo_cmd); -  install_element (RMAP_NODE, &no_set_ecommunity_soo_cmd); +void bgp_route_map_init(void) +{ +	route_map_init(); + +	route_map_add_hook(bgp_route_map_add); +	route_map_delete_hook(bgp_route_map_delete); +	route_map_event_hook(bgp_route_map_event); + +	route_map_match_interface_hook(generic_match_add); +	route_map_no_match_interface_hook(generic_match_delete); + +	route_map_match_ip_address_hook(generic_match_add); +	route_map_no_match_ip_address_hook(generic_match_delete); + +	route_map_match_ip_address_prefix_list_hook(generic_match_add); +	route_map_no_match_ip_address_prefix_list_hook(generic_match_delete); + +	route_map_match_ip_next_hop_hook(generic_match_add); +	route_map_no_match_ip_next_hop_hook(generic_match_delete); + +	route_map_match_ip_next_hop_prefix_list_hook(generic_match_add); +	route_map_no_match_ip_next_hop_prefix_list_hook(generic_match_delete); + +	route_map_match_ipv6_address_hook(generic_match_add); +	route_map_no_match_ipv6_address_hook(generic_match_delete); + +	route_map_match_ipv6_address_prefix_list_hook(generic_match_add); +	route_map_no_match_ipv6_address_prefix_list_hook(generic_match_delete); + +	route_map_match_metric_hook(generic_match_add); +	route_map_no_match_metric_hook(generic_match_delete); + +	route_map_match_tag_hook(generic_match_add); +	route_map_no_match_tag_hook(generic_match_delete); + +	route_map_set_ip_nexthop_hook(generic_set_add); +	route_map_no_set_ip_nexthop_hook(generic_set_delete); + +	route_map_set_ipv6_nexthop_local_hook(generic_set_add); +	route_map_no_set_ipv6_nexthop_local_hook(generic_set_delete); + +	route_map_set_metric_hook(generic_set_add); +	route_map_no_set_metric_hook(generic_set_delete); + +	route_map_set_tag_hook(generic_set_add); +	route_map_no_set_tag_hook(generic_set_delete); + +	route_map_install_match(&route_match_peer_cmd); +	route_map_install_match(&route_match_local_pref_cmd); +	route_map_install_match(&route_match_ip_address_cmd); +	route_map_install_match(&route_match_ip_next_hop_cmd); +	route_map_install_match(&route_match_ip_route_source_cmd); +	route_map_install_match(&route_match_ip_address_prefix_list_cmd); +	route_map_install_match(&route_match_ip_next_hop_prefix_list_cmd); +	route_map_install_match(&route_match_ip_route_source_prefix_list_cmd); +	route_map_install_match(&route_match_aspath_cmd); +	route_map_install_match(&route_match_community_cmd); +	route_map_install_match(&route_match_lcommunity_cmd); +	route_map_install_match(&route_match_ecommunity_cmd); +	route_map_install_match(&route_match_local_pref_cmd); +	route_map_install_match(&route_match_metric_cmd); +	route_map_install_match(&route_match_origin_cmd); +	route_map_install_match(&route_match_probability_cmd); +	route_map_install_match(&route_match_interface_cmd); +	route_map_install_match(&route_match_tag_cmd); + +	route_map_install_set(&route_set_ip_nexthop_cmd); +	route_map_install_set(&route_set_local_pref_cmd); +	route_map_install_set(&route_set_weight_cmd); +	route_map_install_set(&route_set_label_index_cmd); +	route_map_install_set(&route_set_metric_cmd); +	route_map_install_set(&route_set_aspath_prepend_cmd); +	route_map_install_set(&route_set_aspath_exclude_cmd); +	route_map_install_set(&route_set_origin_cmd); +	route_map_install_set(&route_set_atomic_aggregate_cmd); +	route_map_install_set(&route_set_aggregator_as_cmd); +	route_map_install_set(&route_set_community_cmd); +	route_map_install_set(&route_set_community_delete_cmd); +	route_map_install_set(&route_set_lcommunity_cmd); +	route_map_install_set(&route_set_lcommunity_delete_cmd); +	route_map_install_set(&route_set_vpnv4_nexthop_cmd); +	route_map_install_set(&route_set_vpnv6_nexthop_cmd); +	route_map_install_set(&route_set_originator_id_cmd); +	route_map_install_set(&route_set_ecommunity_rt_cmd); +	route_map_install_set(&route_set_ecommunity_soo_cmd); +	route_map_install_set(&route_set_tag_cmd); +	route_map_install_set(&route_set_label_index_cmd); + +	install_element(RMAP_NODE, &match_peer_cmd); +	install_element(RMAP_NODE, &match_peer_local_cmd); +	install_element(RMAP_NODE, &no_match_peer_cmd); +	install_element(RMAP_NODE, &match_ip_route_source_cmd); +	install_element(RMAP_NODE, &no_match_ip_route_source_cmd); +	install_element(RMAP_NODE, &match_ip_route_source_prefix_list_cmd); +	install_element(RMAP_NODE, &no_match_ip_route_source_prefix_list_cmd); + +	install_element(RMAP_NODE, &match_aspath_cmd); +	install_element(RMAP_NODE, &no_match_aspath_cmd); +	install_element(RMAP_NODE, &match_local_pref_cmd); +	install_element(RMAP_NODE, &no_match_local_pref_cmd); +	install_element(RMAP_NODE, &match_community_cmd); +	install_element(RMAP_NODE, &no_match_community_cmd); +	install_element(RMAP_NODE, &match_lcommunity_cmd); +	install_element(RMAP_NODE, &no_match_lcommunity_cmd); +	install_element(RMAP_NODE, &match_ecommunity_cmd); +	install_element(RMAP_NODE, &no_match_ecommunity_cmd); +	install_element(RMAP_NODE, &match_origin_cmd); +	install_element(RMAP_NODE, &no_match_origin_cmd); +	install_element(RMAP_NODE, &match_probability_cmd); +	install_element(RMAP_NODE, &no_match_probability_cmd); + +	install_element(RMAP_NODE, &set_ip_nexthop_peer_cmd); +	install_element(RMAP_NODE, &set_ip_nexthop_unchanged_cmd); +	install_element(RMAP_NODE, &set_local_pref_cmd); +	install_element(RMAP_NODE, &no_set_local_pref_cmd); +	install_element(RMAP_NODE, &set_weight_cmd); +	install_element(RMAP_NODE, &set_label_index_cmd); +	install_element(RMAP_NODE, &no_set_weight_cmd); +	install_element(RMAP_NODE, &no_set_label_index_cmd); +	install_element(RMAP_NODE, &set_aspath_prepend_asn_cmd); +	install_element(RMAP_NODE, &set_aspath_prepend_lastas_cmd); +	install_element(RMAP_NODE, &set_aspath_exclude_cmd); +	install_element(RMAP_NODE, &no_set_aspath_prepend_cmd); +	install_element(RMAP_NODE, &no_set_aspath_exclude_cmd); +	install_element(RMAP_NODE, &set_origin_cmd); +	install_element(RMAP_NODE, &no_set_origin_cmd); +	install_element(RMAP_NODE, &set_atomic_aggregate_cmd); +	install_element(RMAP_NODE, &no_set_atomic_aggregate_cmd); +	install_element(RMAP_NODE, &set_aggregator_as_cmd); +	install_element(RMAP_NODE, &no_set_aggregator_as_cmd); +	install_element(RMAP_NODE, &set_community_cmd); +	install_element(RMAP_NODE, &set_community_none_cmd); +	install_element(RMAP_NODE, &no_set_community_cmd); +	install_element(RMAP_NODE, &set_community_delete_cmd); +	install_element(RMAP_NODE, &no_set_community_delete_cmd); +	install_element(RMAP_NODE, &set_lcommunity_cmd); +	install_element(RMAP_NODE, &set_lcommunity_none_cmd); +	install_element(RMAP_NODE, &no_set_lcommunity_cmd); +	install_element(RMAP_NODE, &no_set_lcommunity1_cmd); +	install_element(RMAP_NODE, &set_lcommunity_delete_cmd); +	install_element(RMAP_NODE, &no_set_lcommunity_delete_cmd); +	install_element(RMAP_NODE, &set_ecommunity_rt_cmd); +	install_element(RMAP_NODE, &no_set_ecommunity_rt_cmd); +	install_element(RMAP_NODE, &set_ecommunity_soo_cmd); +	install_element(RMAP_NODE, &no_set_ecommunity_soo_cmd);  #ifdef KEEP_OLD_VPN_COMMANDS -  install_element (RMAP_NODE, &set_vpn_nexthop_cmd); -  install_element (RMAP_NODE, &no_set_vpn_nexthop_cmd); +	install_element(RMAP_NODE, &set_vpn_nexthop_cmd); +	install_element(RMAP_NODE, &no_set_vpn_nexthop_cmd);  #endif /* KEEP_OLD_VPN_COMMANDS */ -  install_element (RMAP_NODE, &set_ipx_vpn_nexthop_cmd); -  install_element (RMAP_NODE, &no_set_ipx_vpn_nexthop_cmd); -  install_element (RMAP_NODE, &set_originator_id_cmd); -  install_element (RMAP_NODE, &no_set_originator_id_cmd); - -  route_map_install_match (&route_match_ipv6_address_cmd); -  route_map_install_match (&route_match_ipv6_next_hop_cmd); -  route_map_install_match (&route_match_ipv6_address_prefix_list_cmd); -  route_map_install_set (&route_set_ipv6_nexthop_global_cmd); -  route_map_install_set (&route_set_ipv6_nexthop_prefer_global_cmd); -  route_map_install_set (&route_set_ipv6_nexthop_local_cmd); -  route_map_install_set (&route_set_ipv6_nexthop_peer_cmd); - -  install_element (RMAP_NODE, &match_ipv6_next_hop_cmd); -  install_element (RMAP_NODE, &no_match_ipv6_next_hop_cmd); -  install_element (RMAP_NODE, &set_ipv6_nexthop_global_cmd); -  install_element (RMAP_NODE, &no_set_ipv6_nexthop_global_cmd); -  install_element (RMAP_NODE, &set_ipv6_nexthop_prefer_global_cmd); -  install_element (RMAP_NODE, &no_set_ipv6_nexthop_prefer_global_cmd); -  install_element (RMAP_NODE, &set_ipv6_nexthop_peer_cmd); -  install_element (RMAP_NODE, &no_set_ipv6_nexthop_peer_cmd); -} - -void -bgp_route_map_terminate (void) -{ -  /* ToDo: Cleanup all the used memory */ - -  route_map_add_hook (NULL); -  route_map_delete_hook (NULL); -  route_map_event_hook (NULL); -  route_map_finish(); - +	install_element(RMAP_NODE, &set_ipx_vpn_nexthop_cmd); +	install_element(RMAP_NODE, &no_set_ipx_vpn_nexthop_cmd); +	install_element(RMAP_NODE, &set_originator_id_cmd); +	install_element(RMAP_NODE, &no_set_originator_id_cmd); + +	route_map_install_match(&route_match_ipv6_address_cmd); +	route_map_install_match(&route_match_ipv6_next_hop_cmd); +	route_map_install_match(&route_match_ipv6_address_prefix_list_cmd); +	route_map_install_set(&route_set_ipv6_nexthop_global_cmd); +	route_map_install_set(&route_set_ipv6_nexthop_prefer_global_cmd); +	route_map_install_set(&route_set_ipv6_nexthop_local_cmd); +	route_map_install_set(&route_set_ipv6_nexthop_peer_cmd); + +	install_element(RMAP_NODE, &match_ipv6_next_hop_cmd); +	install_element(RMAP_NODE, &no_match_ipv6_next_hop_cmd); +	install_element(RMAP_NODE, &set_ipv6_nexthop_global_cmd); +	install_element(RMAP_NODE, &no_set_ipv6_nexthop_global_cmd); +	install_element(RMAP_NODE, &set_ipv6_nexthop_prefer_global_cmd); +	install_element(RMAP_NODE, &no_set_ipv6_nexthop_prefer_global_cmd); +	install_element(RMAP_NODE, &set_ipv6_nexthop_peer_cmd); +	install_element(RMAP_NODE, &no_set_ipv6_nexthop_peer_cmd); +} + +void bgp_route_map_terminate(void) +{ +	/* ToDo: Cleanup all the used memory */ + +	route_map_add_hook(NULL); +	route_map_delete_hook(NULL); +	route_map_event_hook(NULL); +	route_map_finish();  }  | 
