diff options
Diffstat (limited to 'ospfd/ospf_routemap.c')
| -rw-r--r-- | ospfd/ospf_routemap.c | 807 | 
1 files changed, 372 insertions, 435 deletions
diff --git a/ospfd/ospf_routemap.c b/ospfd/ospf_routemap.c index db51abca23..423e9dc302 100644 --- a/ospfd/ospf_routemap.c +++ b/ospfd/ospf_routemap.c @@ -42,544 +42,482 @@  #include "ospfd/ospf_zebra.h"  /* Hook function for updating route_map assignment. */ -static void -ospf_route_map_update (const char *name) -{ -  struct ospf *ospf; -  int type; - -  /* If OSPF instatnce does not exist, return right now. */ -  ospf = ospf_lookup (); -  if (ospf == NULL) -    return; - -  /* Update route-map */ -  for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) -    { -      struct list *red_list; -      struct listnode *node; -      struct ospf_redist *red; - -      red_list = ospf->redist[type]; -      if (!red_list) -        continue; - -      for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) -        { -          if (ROUTEMAP_NAME (red) -              && strcmp (ROUTEMAP_NAME (red), name) == 0) -            { -              /* Keep old route-map. */ -              struct route_map *old = ROUTEMAP (red); - -              /* Update route-map. */ -              ROUTEMAP (red) = -                route_map_lookup_by_name (ROUTEMAP_NAME (red)); - -              /* No update for this distribute type. */ -              if (old == NULL && ROUTEMAP (red) == NULL) -                continue; - -              ospf_distribute_list_update (ospf, type, red->instance); -            } -        } -    } -} - -static void -ospf_route_map_event (route_map_event_t event, const char *name) -{ -  struct ospf *ospf; -  int type; - -  /* If OSPF instatnce does not exist, return right now. */ -  ospf = ospf_lookup (); -  if (ospf == NULL) -    return; - -  for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) -    { -      struct list *red_list; -      struct listnode *node; -      struct ospf_redist *red; - -      red_list = ospf->redist[type]; -      if (!red_list) -        continue; - -      for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) -        { -          if (ROUTEMAP_NAME (red) &&  ROUTEMAP (red) -              && !strcmp (ROUTEMAP_NAME (red), name)) -            { -              ospf_distribute_list_update (ospf, type, red->instance); -            } -        } -    } +static void ospf_route_map_update(const char *name) +{ +	struct ospf *ospf; +	int type; + +	/* If OSPF instatnce does not exist, return right now. */ +	ospf = ospf_lookup(); +	if (ospf == NULL) +		return; + +	/* Update route-map */ +	for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { +		struct list *red_list; +		struct listnode *node; +		struct ospf_redist *red; + +		red_list = ospf->redist[type]; +		if (!red_list) +			continue; + +		for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) { +			if (ROUTEMAP_NAME(red) +			    && strcmp(ROUTEMAP_NAME(red), name) == 0) { +				/* Keep old route-map. */ +				struct route_map *old = ROUTEMAP(red); + +				/* Update route-map. */ +				ROUTEMAP(red) = route_map_lookup_by_name( +					ROUTEMAP_NAME(red)); + +				/* No update for this distribute type. */ +				if (old == NULL && ROUTEMAP(red) == NULL) +					continue; + +				ospf_distribute_list_update(ospf, type, +							    red->instance); +			} +		} +	} +} + +static void ospf_route_map_event(route_map_event_t event, const char *name) +{ +	struct ospf *ospf; +	int type; + +	/* If OSPF instatnce does not exist, return right now. */ +	ospf = ospf_lookup(); +	if (ospf == NULL) +		return; + +	for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { +		struct list *red_list; +		struct listnode *node; +		struct ospf_redist *red; + +		red_list = ospf->redist[type]; +		if (!red_list) +			continue; + +		for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) { +			if (ROUTEMAP_NAME(red) && ROUTEMAP(red) +			    && !strcmp(ROUTEMAP_NAME(red), name)) { +				ospf_distribute_list_update(ospf, type, +							    red->instance); +			} +		} +	}  }  /* Delete rip route map rule. */ -static int -ospf_route_match_delete (struct vty *vty, -			 const char *command, const char *arg) -{ -  VTY_DECLVAR_CONTEXT(route_map_index, index); -  int ret; - -  ret = route_map_delete_match (index, command, arg); -  if (ret) -    { -      switch (ret) -        { -        case RMAP_RULE_MISSING: -          vty_out (vty, "%% OSPF Can't find rule.%s", VTY_NEWLINE); -          return CMD_WARNING; -        case RMAP_COMPILE_ERROR: -          vty_out (vty, "%% OSPF Argument is malformed.%s", VTY_NEWLINE); -          return CMD_WARNING; -        } -    } - -  return CMD_SUCCESS; -} - -static int -ospf_route_match_add (struct vty *vty, -		      const char *command, const char *arg) -{ -  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, "%% OSPF Can't find rule.%s", VTY_NEWLINE); -          return CMD_WARNING; -        case RMAP_COMPILE_ERROR: -          vty_out (vty, "%% OSPF Argument is malformed.%s", VTY_NEWLINE); -          return CMD_WARNING; -        } -    } - -  return CMD_SUCCESS; +static int ospf_route_match_delete(struct vty *vty, const char *command, +				   const char *arg) +{ +	VTY_DECLVAR_CONTEXT(route_map_index, index); +	int ret; + +	ret = route_map_delete_match(index, command, arg); +	if (ret) { +		switch (ret) { +		case RMAP_RULE_MISSING: +			vty_out(vty, "%% OSPF Can't find rule.%s", VTY_NEWLINE); +			return CMD_WARNING; +		case RMAP_COMPILE_ERROR: +			vty_out(vty, "%% OSPF Argument is malformed.%s", +				VTY_NEWLINE); +			return CMD_WARNING; +		} +	} + +	return CMD_SUCCESS;  } -/* `match ip netxthop ' */ -/* Match function return 1 if match is success else return zero. */ -static route_map_result_t -route_match_ip_nexthop (void *rule, struct prefix *prefix, -			route_map_object_t type, void *object) +static int ospf_route_match_add(struct vty *vty, const char *command, +				const char *arg)  { -  struct access_list *alist; -  struct external_info *ei = object; -  struct prefix_ipv4 p; +	VTY_DECLVAR_CONTEXT(route_map_index, index); +	int ret; -  if (type == RMAP_OSPF) -    { -      p.family = AF_INET; -      p.prefix = ei->nexthop; -      p.prefixlen = IPV4_MAX_BITLEN; +	ret = route_map_add_match(index, command, arg); +	if (ret) { +		switch (ret) { +		case RMAP_RULE_MISSING: +			vty_out(vty, "%% OSPF Can't find rule.%s", VTY_NEWLINE); +			return CMD_WARNING; +		case RMAP_COMPILE_ERROR: +			vty_out(vty, "%% OSPF Argument is malformed.%s", +				VTY_NEWLINE); +			return CMD_WARNING; +		} +	} -      alist = access_list_lookup (AFI_IP, (char *) rule); -      if (alist == NULL) -        return RMAP_NOMATCH; +	return CMD_SUCCESS; +} -      return (access_list_apply (alist, &p) == FILTER_DENY ? -              RMAP_NOMATCH : RMAP_MATCH); -    } -  return RMAP_NOMATCH; +/* `match ip netxthop ' */ +/* Match function return 1 if match is success else return zero. */ +static route_map_result_t route_match_ip_nexthop(void *rule, +						 struct prefix *prefix, +						 route_map_object_t type, +						 void *object) +{ +	struct access_list *alist; +	struct external_info *ei = object; +	struct prefix_ipv4 p; + +	if (type == RMAP_OSPF) { +		p.family = AF_INET; +		p.prefix = ei->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;  }  /* Route map `ip next-hop' match statement. `arg' should be     access-list name. */ -static void * -route_match_ip_nexthop_compile (const char *arg) +static void *route_match_ip_nexthop_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_nexthop_free (void *rule) +static void route_match_ip_nexthop_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_ip_nexthop_cmd = -{ -  "ip next-hop", -  route_match_ip_nexthop, -  route_match_ip_nexthop_compile, -  route_match_ip_nexthop_free -}; +struct route_map_rule_cmd route_match_ip_nexthop_cmd = { +	"ip next-hop", route_match_ip_nexthop, route_match_ip_nexthop_compile, +	route_match_ip_nexthop_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 external_info *ei = object; -  struct prefix_ipv4 p; +	struct prefix_list *plist; +	struct external_info *ei = object; +	struct prefix_ipv4 p; -  if (type == RMAP_OSPF) -    { -      p.family = AF_INET; -      p.prefix = ei->nexthop; -      p.prefixlen = IPV4_MAX_BITLEN; +	if (type == RMAP_OSPF) { +		p.family = AF_INET; +		p.prefix = ei->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 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_OSPF) -    { -      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; +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_OSPF) { +		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;  }  /* 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 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_OSPF) -    { -      plist = prefix_list_lookup (AFI_IP, (char *) rule); -      if (plist == NULL) -        return RMAP_NOMATCH; +	if (type == RMAP_OSPF) { +		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 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 external_info *ei; +	struct interface *ifp; +	struct external_info *ei; -  if (type == RMAP_OSPF) -    { -      ei = object; -      ifp = if_lookup_by_name ((char *)rule, VRF_DEFAULT); +	if (type == RMAP_OSPF) { +		ei = object; +		ifp = if_lookup_by_name((char *)rule, VRF_DEFAULT); -      if (ifp == NULL || ifp->ifindex != ei->ifindex) -	return RMAP_NOMATCH; +		if (ifp == NULL || ifp->ifindex != ei->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};  /* 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 external_info *ei; +	route_tag_t *tag; +	struct external_info *ei; -  if (type == RMAP_OSPF) -    { -      tag = rule; -      ei = object; +	if (type == RMAP_OSPF) { +		tag = rule; +		ei = object; -      return ((ei->tag == *tag)? RMAP_MATCH : RMAP_NOMATCH); -    } +		return ((ei->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 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) +static route_map_result_t route_set_metric(void *rule, struct prefix *prefix, +					   route_map_object_t type, +					   void *object)  { -  u_int32_t *metric; -  struct external_info *ei; +	u_int32_t *metric; +	struct external_info *ei; -  if (type == RMAP_OSPF) -    { -      /* Fetch routemap's rule information. */ -      metric = rule; -      ei = object; +	if (type == RMAP_OSPF) { +		/* Fetch routemap's rule information. */ +		metric = rule; +		ei = object; -      /* Set metric out value. */ -      ei->route_map_set.metric = *metric; -    } -  return RMAP_OKAY; +		/* Set metric out value. */ +		ei->route_map_set.metric = *metric; +	} +	return RMAP_OKAY;  }  /* set metric compilation. */ -static void * -route_set_metric_compile (const char *arg) -{ -  u_int32_t *metric; -  int32_t ret; - -  /* OSPF doesn't support the +/- in -     set metric <+/-metric> check -     Ignore the +/- component */ -  if (! all_digit (arg)) -    { -      if ((strncmp (arg, "+", 1) == 0 || strncmp (arg, "-", 1) == 0) && -	  all_digit (arg+1)) -	{ -	  zlog_warn ("OSPF does not support 'set metric +/-'"); -	  arg++; -	} -      else -	{ -	  return NULL; +static void *route_set_metric_compile(const char *arg) +{ +	u_int32_t *metric; +	int32_t ret; + +	/* OSPF doesn't support the +/- in +	   set metric <+/-metric> check +	   Ignore the +/- component */ +	if (!all_digit(arg)) { +		if ((strncmp(arg, "+", 1) == 0 || strncmp(arg, "-", 1) == 0) +		    && all_digit(arg + 1)) { +			zlog_warn("OSPF does not support 'set metric +/-'"); +			arg++; +		} else { +			return NULL; +		}  	} -    } -  metric = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t)); -  ret = atoi (arg); +	metric = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(u_int32_t)); +	ret = atoi(arg); -  if (ret >= 0) -    { -      *metric = (u_int32_t)ret; -      return metric; -    } +	if (ret >= 0) { +		*metric = (u_int32_t)ret; +		return metric; +	} -  XFREE (MTYPE_ROUTE_MAP_COMPILED, metric); -  return NULL; +	XFREE(MTYPE_ROUTE_MAP_COMPILED, metric); +	return NULL;  }  /* Free route map's compiled `set metric' value. */ -static void -route_set_metric_free (void *rule) +static void route_set_metric_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Set metric rule structure. */ -struct route_map_rule_cmd route_set_metric_cmd = -{ -  "metric", -  route_set_metric, -  route_set_metric_compile, -  route_set_metric_free, +struct route_map_rule_cmd route_set_metric_cmd = { +	"metric", route_set_metric, route_set_metric_compile, +	route_set_metric_free,  };  /* `set metric-type TYPE' */  /* Set metric-type to attribute. */ -static route_map_result_t -route_set_metric_type (void *rule, struct prefix *prefix, -		       route_map_object_t type, void *object) +static route_map_result_t route_set_metric_type(void *rule, +						struct prefix *prefix, +						route_map_object_t type, +						void *object)  { -  u_int32_t *metric_type; -  struct external_info *ei; +	u_int32_t *metric_type; +	struct external_info *ei; -  if (type == RMAP_OSPF) -    { -      /* Fetch routemap's rule information. */ -      metric_type = rule; -      ei = object; +	if (type == RMAP_OSPF) { +		/* Fetch routemap's rule information. */ +		metric_type = rule; +		ei = object; -      /* Set metric out value. */ -      ei->route_map_set.metric_type = *metric_type; -    } -  return RMAP_OKAY; +		/* Set metric out value. */ +		ei->route_map_set.metric_type = *metric_type; +	} +	return RMAP_OKAY;  }  /* set metric-type compilation. */ -static void * -route_set_metric_type_compile (const char *arg) +static void *route_set_metric_type_compile(const char *arg)  { -  u_int32_t *metric_type; +	u_int32_t *metric_type; -  metric_type = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t)); -  if (strcmp (arg, "type-1") == 0) -    *metric_type = EXTERNAL_METRIC_TYPE_1; -  else if (strcmp (arg, "type-2") == 0) -    *metric_type = EXTERNAL_METRIC_TYPE_2; +	metric_type = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(u_int32_t)); +	if (strcmp(arg, "type-1") == 0) +		*metric_type = EXTERNAL_METRIC_TYPE_1; +	else if (strcmp(arg, "type-2") == 0) +		*metric_type = EXTERNAL_METRIC_TYPE_2; -  if (*metric_type == EXTERNAL_METRIC_TYPE_1 || -      *metric_type == EXTERNAL_METRIC_TYPE_2) -    return metric_type; +	if (*metric_type == EXTERNAL_METRIC_TYPE_1 +	    || *metric_type == EXTERNAL_METRIC_TYPE_2) +		return metric_type; -  XFREE (MTYPE_ROUTE_MAP_COMPILED, metric_type); -  return NULL; +	XFREE(MTYPE_ROUTE_MAP_COMPILED, metric_type); +	return NULL;  }  /* Free route map's compiled `set metric-type' value. */ -static void -route_set_metric_type_free (void *rule) +static void route_set_metric_type_free(void *rule)  { -  XFREE (MTYPE_ROUTE_MAP_COMPILED, rule); +	XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);  }  /* Set metric rule structure. */ -struct route_map_rule_cmd route_set_metric_type_cmd = -{ -  "metric-type", -  route_set_metric_type, -  route_set_metric_type_compile, -  route_set_metric_type_free, +struct route_map_rule_cmd route_set_metric_type_cmd = { +	"metric-type", route_set_metric_type, route_set_metric_type_compile, +	route_set_metric_type_free,  }; -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 external_info *ei; +	route_tag_t *tag; +	struct external_info *ei; -  if (type == RMAP_OSPF) -    { -      tag = rule; -      ei = object; +	if (type == RMAP_OSPF) { +		tag = rule; +		ei = object; -      /* Set tag value */ -      ei->tag=*tag; -    } +		/* Set tag value */ +		ei->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,  };  DEFUN (match_ip_nexthop, @@ -592,8 +530,8 @@ DEFUN (match_ip_nexthop,         "IP access-list number (expanded range)\n"         "IP access-list name\n")  { -  int idx_acl = 3; -  return ospf_route_match_add (vty, "ip next-hop", argv[idx_acl]->arg); +	int idx_acl = 3; +	return ospf_route_match_add(vty, "ip next-hop", argv[idx_acl]->arg);  }  DEFUN (no_match_ip_nexthop, @@ -607,8 +545,8 @@ DEFUN (no_match_ip_nexthop,         "IP access-list number (expanded range)\n"         "IP access-list name\n")  { -  char *al = (argc == 5) ? argv[4]->arg : NULL; -  return ospf_route_match_delete (vty, "ip next-hop", al); +	char *al = (argc == 5) ? argv[4]->arg : NULL; +	return ospf_route_match_delete(vty, "ip next-hop", al);  }  DEFUN (set_metric_type, @@ -619,9 +557,9 @@ DEFUN (set_metric_type,         "OSPF[6] external type 1 metric\n"         "OSPF[6] external type 2 metric\n")  { -  char *ext = argv[2]->text; -  return generic_set_add (vty, VTY_GET_CONTEXT(route_map_index), -                          "metric-type", ext); +	char *ext = argv[2]->text; +	return generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), +			       "metric-type", ext);  }  DEFUN (no_set_metric_type, @@ -633,56 +571,55 @@ DEFUN (no_set_metric_type,         "OSPF[6] external type 1 metric\n"         "OSPF[6] external type 2 metric\n")  { -  char *ext = (argc == 4) ? argv[3]->text : NULL; -  return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index), -                             "metric-type", ext); +	char *ext = (argc == 4) ? argv[3]->text : NULL; +	return generic_set_delete(vty, VTY_GET_CONTEXT(route_map_index), +				  "metric-type", ext);  }  /* Route-map init */ -void -ospf_route_map_init (void) +void ospf_route_map_init(void)  { -  route_map_init (); +	route_map_init(); + +	route_map_add_hook(ospf_route_map_update); +	route_map_delete_hook(ospf_route_map_update); +	route_map_event_hook(ospf_route_map_event); -  route_map_add_hook (ospf_route_map_update); -  route_map_delete_hook (ospf_route_map_update); -  route_map_event_hook (ospf_route_map_event); +	route_map_match_interface_hook(generic_match_add); +	route_map_no_match_interface_hook(generic_match_delete); -  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_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_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_prefix_list_hook(generic_match_add); +	route_map_no_match_ip_next_hop_prefix_list_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_tag_hook(generic_match_add); +	route_map_no_match_tag_hook(generic_match_delete); -  route_map_match_tag_hook (generic_match_add); -  route_map_no_match_tag_hook (generic_match_delete); +	route_map_set_metric_hook(generic_set_add); +	route_map_no_set_metric_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_set_tag_hook (generic_set_add); -  route_map_no_set_tag_hook (generic_set_delete); -   -  route_map_install_match (&route_match_ip_nexthop_cmd); -  route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd); -  route_map_install_match (&route_match_ip_address_cmd); -  route_map_install_match (&route_match_ip_address_prefix_list_cmd); -  route_map_install_match (&route_match_interface_cmd); -  route_map_install_match (&route_match_tag_cmd); +	route_map_install_match(&route_match_ip_nexthop_cmd); +	route_map_install_match(&route_match_ip_next_hop_prefix_list_cmd); +	route_map_install_match(&route_match_ip_address_cmd); +	route_map_install_match(&route_match_ip_address_prefix_list_cmd); +	route_map_install_match(&route_match_interface_cmd); +	route_map_install_match(&route_match_tag_cmd); -  route_map_install_set (&route_set_metric_cmd); -  route_map_install_set (&route_set_metric_type_cmd); -  route_map_install_set (&route_set_tag_cmd); +	route_map_install_set(&route_set_metric_cmd); +	route_map_install_set(&route_set_metric_type_cmd); +	route_map_install_set(&route_set_tag_cmd); -  install_element (RMAP_NODE, &match_ip_nexthop_cmd); -  install_element (RMAP_NODE, &no_match_ip_nexthop_cmd); +	install_element(RMAP_NODE, &match_ip_nexthop_cmd); +	install_element(RMAP_NODE, &no_match_ip_nexthop_cmd); -  install_element (RMAP_NODE, &set_metric_type_cmd); -  install_element (RMAP_NODE, &no_set_metric_type_cmd); +	install_element(RMAP_NODE, &set_metric_type_cmd); +	install_element(RMAP_NODE, &no_set_metric_type_cmd);  }  | 
