summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVyacheslav Trushkin <me@dogonthesun.net>2011-11-16 14:22:03 +0400
committerDenis Ovsienko <infrastation@yandex.ru>2011-12-13 14:25:03 +0400
commit42a7debf3c76b8001ce820e104a29d2f693c7cb7 (patch)
tree0a8bd305f1a2b37ea704998604e49ab1874fe0c4
parent004b1238a21b9b6c28640f37213dc85f0da39abe (diff)
ospf6d: implement 'match interface' for route-maps
ospf6_routemap_rule_match_interface* was imported from ospfd daemon with minor changes. new CLI options defined. `ospf6_routemap_rule_match_interface' was changed to support IPv6 (ospfv3) route's external information.
-rw-r--r--ospf6d/ospf6_asbr.c89
-rw-r--r--ospf6d/ospf6_asbr.h2
2 files changed, 91 insertions, 0 deletions
diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c
index 3efaab44..922e1c0e 100644
--- a/ospf6d/ospf6_asbr.c
+++ b/ospf6d/ospf6_asbr.c
@@ -447,6 +447,7 @@ ospf6_asbr_redistribute_add (int type, int ifindex, struct prefix *prefix,
memset (&troute, 0, sizeof (troute));
memset (&tinfo, 0, sizeof (tinfo));
troute.route_option = &tinfo;
+ tinfo.ifindex = ifindex;
ret = route_map_apply (ospf6->rmap[type].map, prefix,
RMAP_OSPF6, &troute);
@@ -813,6 +814,54 @@ ospf6_routemap_rule_match_address_prefixlist_cmd =
ospf6_routemap_rule_match_address_prefixlist_free,
};
+/* `match interface IFNAME' */
+/* Match function should return 1 if match is success else return
+ zero. */
+static route_map_result_t
+ospf6_routemap_rule_match_interface (void *rule, struct prefix *prefix,
+ route_map_object_t type, void *object)
+{
+ struct interface *ifp;
+ struct ospf6_external_info *ei;
+
+ if (type == RMAP_OSPF6)
+ {
+ ei = ((struct ospf6_route *) object)->route_option;
+ ifp = if_lookup_by_name ((char *)rule);
+
+ if (ifp != NULL
+ && ei->ifindex == ifp->ifindex)
+ return RMAP_MATCH;
+ }
+
+ return RMAP_NOMATCH;
+}
+
+/* Route map `interface' match statement. `arg' should be
+ interface name. */
+static void *
+ospf6_routemap_rule_match_interface_compile (const char *arg)
+{
+ return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
+}
+
+/* Free route map's compiled `interface' value. */
+static void
+ospf6_routemap_rule_match_interface_free (void *rule)
+{
+ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
+}
+
+/* Route map commands for interface matching. */
+struct route_map_rule_cmd
+ospf6_routemap_rule_match_interface_cmd =
+{
+ "interface",
+ ospf6_routemap_rule_match_interface,
+ ospf6_routemap_rule_match_interface_compile,
+ ospf6_routemap_rule_match_interface_free
+};
+
static route_map_result_t
ospf6_routemap_rule_set_metric_type (void *rule, struct prefix *prefix,
route_map_object_t type, void *object)
@@ -990,6 +1039,39 @@ DEFUN (ospf6_routemap_no_match_address_prefixlist,
return route_map_command_status (vty, ret);
}
+/* "match interface" */
+DEFUN (ospf6_routemap_match_interface,
+ ospf6_routemap_match_interface_cmd,
+ "match interface WORD",
+ MATCH_STR
+ "Match first hop interface of route\n"
+ "Interface name\n")
+{
+ return route_map_add_match ((struct route_map_index *) vty->index,
+ "interface", argv[0]);
+}
+
+/* "no match interface WORD" */
+DEFUN (ospf6_routemap_no_match_interface,
+ ospf6_routemap_no_match_interface_cmd,
+ "no match interface",
+ MATCH_STR
+ NO_STR
+ "Match first hop interface of route\n")
+{
+ int ret = route_map_delete_match ((struct route_map_index *) vty->index,
+ "interface", (argc == 0) ? NULL : argv[0]);
+ return route_map_command_status (vty, ret);
+}
+
+ALIAS (ospf6_routemap_no_match_interface,
+ ospf6_routemap_no_match_interface_val_cmd,
+ "no match interface WORD",
+ MATCH_STR
+ NO_STR
+ "Match first hop interface of route\n"
+ "Interface name\n")
+
/* add "set metric-type" */
DEFUN (ospf6_routemap_set_metric_type,
ospf6_routemap_set_metric_type_cmd,
@@ -1082,6 +1164,8 @@ ospf6_routemap_init (void)
route_map_delete_hook (ospf6_asbr_routemap_update);
route_map_install_match (&ospf6_routemap_rule_match_address_prefixlist_cmd);
+ route_map_install_match (&ospf6_routemap_rule_match_interface_cmd);
+
route_map_install_set (&ospf6_routemap_rule_set_metric_type_cmd);
route_map_install_set (&ospf6_routemap_rule_set_metric_cmd);
route_map_install_set (&ospf6_routemap_rule_set_forwarding_cmd);
@@ -1090,6 +1174,11 @@ ospf6_routemap_init (void)
install_element (RMAP_NODE, &ospf6_routemap_match_address_prefixlist_cmd);
install_element (RMAP_NODE, &ospf6_routemap_no_match_address_prefixlist_cmd);
+ /* Match interface */
+ install_element (RMAP_NODE, &ospf6_routemap_match_interface_cmd);
+ install_element (RMAP_NODE, &ospf6_routemap_no_match_interface_cmd);
+ install_element (RMAP_NODE, &ospf6_routemap_no_match_interface_val_cmd);
+
/* ASE Metric Type (e.g. Type-1/Type-2) */
install_element (RMAP_NODE, &ospf6_routemap_set_metric_type_cmd);
install_element (RMAP_NODE, &ospf6_routemap_no_set_metric_type_cmd);
diff --git a/ospf6d/ospf6_asbr.h b/ospf6d/ospf6_asbr.h
index 6aab1df0..72e49143 100644
--- a/ospf6d/ospf6_asbr.h
+++ b/ospf6d/ospf6_asbr.h
@@ -48,6 +48,8 @@ struct ospf6_external_info
struct in6_addr forwarding;
/* u_int32_t tag; */
+
+ unsigned int ifindex;
};
/* AS-External-LSA */