diff options
Diffstat (limited to 'ospfd/ospf_routemap.c')
| -rw-r--r-- | ospfd/ospf_routemap.c | 380 |
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); } |
