summaryrefslogtreecommitdiff
path: root/ospfd/ospf_routemap.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_routemap.c')
-rw-r--r--ospfd/ospf_routemap.c380
1 files changed, 35 insertions, 345 deletions
diff --git a/ospfd/ospf_routemap.c b/ospfd/ospf_routemap.c
index f1483885c0..4166aabe21 100644
--- a/ospfd/ospf_routemap.c
+++ b/ospfd/ospf_routemap.c
@@ -27,6 +27,7 @@
#include "memory.h"
#include "prefix.h"
#include "table.h"
+#include "vty.h"
#include "routemap.h"
#include "command.h"
#include "log.h"
@@ -163,53 +164,6 @@ ospf_route_match_add (struct vty *vty, struct route_map_index *index,
return CMD_SUCCESS;
}
-static int
-ospf_route_set_add (struct vty *vty, struct route_map_index *index,
- const char *command, const char *arg)
-{
- int ret;
-
- ret = route_map_add_set (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;
-}
-
-/* Delete rip route map rule. */
-static int
-ospf_route_set_delete (struct vty *vty, struct route_map_index *index,
- const char *command, const char *arg)
-{
- int ret;
-
- ret = route_map_delete_set (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
@@ -627,7 +581,7 @@ static struct route_map_rule_cmd route_set_tag_cmd =
DEFUN (match_ip_nexthop,
match_ip_nexthop_cmd,
- "match ip next-hop (<1-199>|<1300-2699>|WORD)",
+ "match ip next-hop <(1-199)|(1300-2699)|WORD>",
MATCH_STR
IP_STR
"Match next-hop address of route\n"
@@ -635,26 +589,13 @@ DEFUN (match_ip_nexthop,
"IP access-list number (expanded range)\n"
"IP access-list name\n")
{
- return ospf_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
+ int idx_acl = 3;
+ return ospf_route_match_add (vty, vty->index, "ip next-hop", argv[idx_acl]->arg);
}
DEFUN (no_match_ip_nexthop,
no_match_ip_nexthop_cmd,
- "no match ip next-hop",
- NO_STR
- MATCH_STR
- IP_STR
- "Match next-hop address of route\n")
-{
- if (argc == 0)
- return ospf_route_match_delete (vty, vty->index, "ip next-hop", NULL);
-
- return ospf_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
-}
-
-ALIAS (no_match_ip_nexthop,
- no_match_ip_nexthop_val_cmd,
- "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
+ "no match ip next-hop [<(1-199)|(1300-2699)|WORD>]",
NO_STR
MATCH_STR
IP_STR
@@ -662,285 +603,36 @@ ALIAS (no_match_ip_nexthop,
"IP access-list number\n"
"IP access-list number (expanded range)\n"
"IP access-list name\n")
-
-DEFUN (match_ip_next_hop_prefix_list,
- match_ip_next_hop_prefix_list_cmd,
- "match ip next-hop prefix-list WORD",
- MATCH_STR
- IP_STR
- "Match next-hop address of route\n"
- "Match entries of prefix-lists\n"
- "IP prefix-list name\n")
{
- return ospf_route_match_add (vty, vty->index, "ip next-hop prefix-list",
- argv[0]);
+ char *al = (argc == 5) ? argv[4]->arg : NULL;
+ return ospf_route_match_delete (vty, vty->index, "ip next-hop", al);
}
-DEFUN (no_match_ip_next_hop_prefix_list,
- no_match_ip_next_hop_prefix_list_cmd,
- "no match ip next-hop prefix-list",
- NO_STR
- MATCH_STR
- IP_STR
- "Match next-hop address of route\n"
- "Match entries of prefix-lists\n")
-{
- if (argc == 0)
- return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
- NULL);
- return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
- argv[0]);
-}
-
-ALIAS (no_match_ip_next_hop_prefix_list,
- no_match_ip_next_hop_prefix_list_val_cmd,
- "no match ip next-hop prefix-list WORD",
- NO_STR
- MATCH_STR
- IP_STR
- "Match next-hop address of route\n"
- "Match entries of prefix-lists\n"
- "IP prefix-list name\n")
-
-DEFUN (match_ip_address,
- match_ip_address_cmd,
- "match ip address (<1-199>|<1300-2699>|WORD)",
- MATCH_STR
- IP_STR
- "Match address of route\n"
- "IP access-list number\n"
- "IP access-list number (expanded range)\n"
- "IP access-list name\n")
-{
- return ospf_route_match_add (vty, vty->index, "ip address", argv[0]);
-}
-
-DEFUN (no_match_ip_address,
- no_match_ip_address_cmd,
- "no match ip address",
- NO_STR
- MATCH_STR
- IP_STR
- "Match address of route\n")
-{
- if (argc == 0)
- return ospf_route_match_delete (vty, vty->index, "ip address", NULL);
-
- return ospf_route_match_delete (vty, vty->index, "ip address", argv[0]);
-}
-
-ALIAS (no_match_ip_address,
- no_match_ip_address_val_cmd,
- "no match ip address (<1-199>|<1300-2699>|WORD)",
- NO_STR
- MATCH_STR
- IP_STR
- "Match address of route\n"
- "IP access-list number\n"
- "IP access-list number (expanded range)\n"
- "IP access-list name\n")
-
-DEFUN (match_ip_address_prefix_list,
- match_ip_address_prefix_list_cmd,
- "match ip address prefix-list WORD",
- MATCH_STR
- IP_STR
- "Match address of route\n"
- "Match entries of prefix-lists\n"
- "IP prefix-list name\n")
-{
- return ospf_route_match_add (vty, vty->index, "ip address prefix-list",
- argv[0]);
-}
-
-DEFUN (no_match_ip_address_prefix_list,
- no_match_ip_address_prefix_list_cmd,
- "no match ip address prefix-list",
- NO_STR
- MATCH_STR
- IP_STR
- "Match address of route\n"
- "Match entries of prefix-lists\n")
-{
- if (argc == 0)
- return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
- NULL);
- return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
- argv[0]);
-}
-
-ALIAS (no_match_ip_address_prefix_list,
- no_match_ip_address_prefix_list_val_cmd,
- "no match ip address prefix-list WORD",
- NO_STR
- MATCH_STR
- IP_STR
- "Match address of route\n"
- "Match entries of prefix-lists\n"
- "IP prefix-list name\n")
-
-DEFUN (match_interface,
- match_interface_cmd,
- "match interface WORD",
- MATCH_STR
- "Match first hop interface of route\n"
- "Interface name\n")
-{
- return ospf_route_match_add (vty, vty->index, "interface", argv[0]);
-}
-
-DEFUN (no_match_interface,
- no_match_interface_cmd,
- "no match interface",
- NO_STR
- MATCH_STR
- "Match first hop interface of route\n")
-{
- if (argc == 0)
- return ospf_route_match_delete (vty, vty->index, "interface", NULL);
-
- return ospf_route_match_delete (vty, vty->index, "interface", argv[0]);
-}
-
-ALIAS (no_match_interface,
- no_match_interface_val_cmd,
- "no match interface WORD",
- NO_STR
- MATCH_STR
- "Match first hop interface of route\n"
- "Interface name\n")
-
-DEFUN (match_tag,
- match_tag_cmd,
- "match tag <1-4294967295>",
- MATCH_STR
- "Match tag of route\n"
- "Tag value\n")
-{
- return ospf_route_match_add (vty, vty->index, "tag", argv[0]);
-}
-
-DEFUN (no_match_tag,
- no_match_tag_cmd,
- "no match tag",
- NO_STR
- MATCH_STR
- "Match tag of route\n")
-{
- if (argc == 0)
- return ospf_route_match_delete (vty, vty->index, "tag", NULL);
-
- return ospf_route_match_delete (vty, vty->index, "tag", argv[0]);
-}
-
-ALIAS (no_match_tag,
- no_match_tag_val_cmd,
- "no match tag <1-4294967295>",
- NO_STR
- MATCH_STR
- "Match tag of route\n"
- "Tag value\n")
-
-DEFUN (set_metric,
- set_metric_cmd,
- "set metric <0-4294967295>",
- SET_STR
- "Metric value for destination routing protocol\n"
- "Metric value\n")
-{
- return ospf_route_set_add (vty, vty->index, "metric", argv[0]);
-}
-
-DEFUN (no_set_metric,
- no_set_metric_cmd,
- "no set metric",
- NO_STR
- SET_STR
- "Metric value for destination routing protocol\n")
-{
- if (argc == 0)
- return ospf_route_set_delete (vty, vty->index, "metric", NULL);
-
- return ospf_route_set_delete (vty, vty->index, "metric", argv[0]);
-}
-
-ALIAS (no_set_metric,
- no_set_metric_val_cmd,
- "no set metric <0-4294967295>",
- NO_STR
- SET_STR
- "Metric value for destination routing protocol\n"
- "Metric value\n")
-
DEFUN (set_metric_type,
set_metric_type_cmd,
- "set metric-type (type-1|type-2)",
+ "set metric-type <type-1|type-2>",
SET_STR
"Type of metric for destination routing protocol\n"
"OSPF[6] external type 1 metric\n"
"OSPF[6] external type 2 metric\n")
{
- if (strcmp (argv[0], "1") == 0)
- return ospf_route_set_add (vty, vty->index, "metric-type", "type-1");
- if (strcmp (argv[0], "2") == 0)
- return ospf_route_set_add (vty, vty->index, "metric-type", "type-2");
-
- return ospf_route_set_add (vty, vty->index, "metric-type", argv[0]);
+ char *ext = argv[2]->text;
+ return generic_set_add (vty, vty->index, "metric-type", ext);
}
DEFUN (no_set_metric_type,
no_set_metric_type_cmd,
- "no set metric-type",
- NO_STR
- SET_STR
- "Type of metric for destination routing protocol\n")
-{
- if (argc == 0)
- return ospf_route_set_delete (vty, vty->index, "metric-type", NULL);
-
- return ospf_route_set_delete (vty, vty->index, "metric-type", argv[0]);
-}
-
-ALIAS (no_set_metric_type,
- no_set_metric_type_val_cmd,
- "no set metric-type (type-1|type-2)",
+ "no set metric-type [<type-1|type-2>]",
NO_STR
SET_STR
"Type of metric for destination routing protocol\n"
"OSPF[6] external type 1 metric\n"
"OSPF[6] external type 2 metric\n")
-
-DEFUN (set_tag,
- set_tag_cmd,
- "set tag <1-4294967295>",
- SET_STR
- "Tag value for routing protocol\n"
- "Tag value\n")
-{
- return ospf_route_set_add (vty, vty->index, "tag", argv[0]);
-}
-
-DEFUN (no_set_tag,
- no_set_tag_cmd,
- "no set tag",
- NO_STR
- SET_STR
- "Tag value for routing protocol\n")
{
- if (argc == 0)
- ospf_route_set_delete(vty, vty->index, "tag", NULL);
-
- return ospf_route_set_delete (vty, vty->index, "tag", argv[0]);
+ char *ext = (argc == 4) ? argv[3]->text : NULL;
+ return generic_set_delete (vty, vty->index, "metric-type", ext);
}
-ALIAS (no_set_tag,
- no_set_tag_val_cmd,
- "no set tag <1-4294967295>",
- NO_STR
- SET_STR
- "Tag value for routing protocol\n"
- "Tag value\n")
-
/* Route-map init */
void
ospf_route_map_init (void)
@@ -950,6 +642,27 @@ ospf_route_map_init (void)
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_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_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_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_ip_nexthop_cmd);
route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
@@ -964,30 +677,7 @@ ospf_route_map_init (void)
install_element (RMAP_NODE, &match_ip_nexthop_cmd);
install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
- install_element (RMAP_NODE, &no_match_ip_nexthop_val_cmd);
- install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
- install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
- install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
- install_element (RMAP_NODE, &match_ip_address_cmd);
- install_element (RMAP_NODE, &no_match_ip_address_cmd);
- install_element (RMAP_NODE, &no_match_ip_address_val_cmd);
- install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
- install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
- install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
- install_element (RMAP_NODE, &match_interface_cmd);
- install_element (RMAP_NODE, &no_match_interface_cmd);
- install_element (RMAP_NODE, &no_match_interface_val_cmd);
- install_element (RMAP_NODE, &match_tag_cmd);
- install_element (RMAP_NODE, &no_match_tag_cmd);
- install_element (RMAP_NODE, &no_match_tag_val_cmd);
-
- install_element (RMAP_NODE, &set_metric_cmd);
- install_element (RMAP_NODE, &no_set_metric_cmd);
- install_element (RMAP_NODE, &no_set_metric_val_cmd);
+
install_element (RMAP_NODE, &set_metric_type_cmd);
install_element (RMAP_NODE, &no_set_metric_type_cmd);
- install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
- install_element (RMAP_NODE, &set_tag_cmd);
- install_element (RMAP_NODE, &no_set_tag_cmd);
- install_element (RMAP_NODE, &no_set_tag_val_cmd);
}