Annotation of embedaddon/quagga/ospfd/ospf_routemap.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Route map function of ospfd.
! 3: * Copyright (C) 2000 IP Infusion Inc.
! 4: *
! 5: * Written by Toshiaki Takada.
! 6: *
! 7: * This file is part of GNU Zebra.
! 8: *
! 9: * GNU Zebra is free software; you can redistribute it and/or modify it
! 10: * under the terms of the GNU General Public License as published by the
! 11: * Free Software Foundation; either version 2, or (at your option) any
! 12: * later version.
! 13: *
! 14: * GNU Zebra is distributed in the hope that it will be useful, but
! 15: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 17: * General Public License for more details.
! 18: *
! 19: * You should have received a copy of the GNU General Public License
! 20: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 21: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 22: * 02111-1307, USA.
! 23: */
! 24:
! 25: #include <zebra.h>
! 26:
! 27: #include "memory.h"
! 28: #include "prefix.h"
! 29: #include "table.h"
! 30: #include "routemap.h"
! 31: #include "command.h"
! 32: #include "log.h"
! 33: #include "plist.h"
! 34:
! 35: #include "ospfd/ospfd.h"
! 36: #include "ospfd/ospf_asbr.h"
! 37: #include "ospfd/ospf_interface.h"
! 38: #include "ospfd/ospf_lsa.h"
! 39: #include "ospfd/ospf_route.h"
! 40: #include "ospfd/ospf_zebra.h"
! 41:
! 42: /* Hook function for updating route_map assignment. */
! 43: static void
! 44: ospf_route_map_update (const char *name)
! 45: {
! 46: struct ospf *ospf;
! 47: int type;
! 48:
! 49: /* If OSPF instatnce does not exist, return right now. */
! 50: ospf = ospf_lookup ();
! 51: if (ospf == NULL)
! 52: return;
! 53:
! 54: /* Update route-map */
! 55: for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
! 56: {
! 57: if (ROUTEMAP_NAME (ospf, type)
! 58: && strcmp (ROUTEMAP_NAME (ospf, type), name) == 0)
! 59: {
! 60: /* Keep old route-map. */
! 61: struct route_map *old = ROUTEMAP (ospf, type);
! 62:
! 63: /* Update route-map. */
! 64: ROUTEMAP (ospf, type) =
! 65: route_map_lookup_by_name (ROUTEMAP_NAME (ospf, type));
! 66:
! 67: /* No update for this distribute type. */
! 68: if (old == NULL && ROUTEMAP (ospf, type) == NULL)
! 69: continue;
! 70:
! 71: ospf_distribute_list_update (ospf, type);
! 72: }
! 73: }
! 74: }
! 75:
! 76: static void
! 77: ospf_route_map_event (route_map_event_t event, const char *name)
! 78: {
! 79: struct ospf *ospf;
! 80: int type;
! 81:
! 82: /* If OSPF instatnce does not exist, return right now. */
! 83: ospf = ospf_lookup ();
! 84: if (ospf == NULL)
! 85: return;
! 86:
! 87: /* Update route-map. */
! 88: for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
! 89: {
! 90: if (ROUTEMAP_NAME (ospf, type) && ROUTEMAP (ospf, type)
! 91: && !strcmp (ROUTEMAP_NAME (ospf, type), name))
! 92: {
! 93: ospf_distribute_list_update (ospf, type);
! 94: }
! 95: }
! 96: }
! 97:
! 98: /* Delete rip route map rule. */
! 99: static int
! 100: ospf_route_match_delete (struct vty *vty, struct route_map_index *index,
! 101: const char *command, const char *arg)
! 102: {
! 103: int ret;
! 104:
! 105: ret = route_map_delete_match (index, command, arg);
! 106: if (ret)
! 107: {
! 108: switch (ret)
! 109: {
! 110: case RMAP_RULE_MISSING:
! 111: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
! 112: return CMD_WARNING;
! 113: case RMAP_COMPILE_ERROR:
! 114: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
! 115: return CMD_WARNING;
! 116: }
! 117: }
! 118:
! 119: return CMD_SUCCESS;
! 120: }
! 121:
! 122: static int
! 123: ospf_route_match_add (struct vty *vty, struct route_map_index *index,
! 124: const char *command, const char *arg)
! 125: {
! 126: int ret;
! 127:
! 128: ret = route_map_add_match (index, command, arg);
! 129: if (ret)
! 130: {
! 131: switch (ret)
! 132: {
! 133: case RMAP_RULE_MISSING:
! 134: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
! 135: return CMD_WARNING;
! 136: case RMAP_COMPILE_ERROR:
! 137: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
! 138: return CMD_WARNING;
! 139: }
! 140: }
! 141:
! 142: return CMD_SUCCESS;
! 143: }
! 144:
! 145: static int
! 146: ospf_route_set_add (struct vty *vty, struct route_map_index *index,
! 147: const char *command, const char *arg)
! 148: {
! 149: int ret;
! 150:
! 151: ret = route_map_add_set (index, command, arg);
! 152: if (ret)
! 153: {
! 154: switch (ret)
! 155: {
! 156: case RMAP_RULE_MISSING:
! 157: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
! 158: return CMD_WARNING;
! 159: case RMAP_COMPILE_ERROR:
! 160: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
! 161: return CMD_WARNING;
! 162: }
! 163: }
! 164:
! 165: return CMD_SUCCESS;
! 166: }
! 167:
! 168: /* Delete rip route map rule. */
! 169: static int
! 170: ospf_route_set_delete (struct vty *vty, struct route_map_index *index,
! 171: const char *command, const char *arg)
! 172: {
! 173: int ret;
! 174:
! 175: ret = route_map_delete_set (index, command, arg);
! 176: if (ret)
! 177: {
! 178: switch (ret)
! 179: {
! 180: case RMAP_RULE_MISSING:
! 181: vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
! 182: return CMD_WARNING;
! 183: case RMAP_COMPILE_ERROR:
! 184: vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
! 185: return CMD_WARNING;
! 186: }
! 187: }
! 188:
! 189: return CMD_SUCCESS;
! 190: }
! 191:
! 192: /* `match ip netxthop ' */
! 193: /* Match function return 1 if match is success else return zero. */
! 194: static route_map_result_t
! 195: route_match_ip_nexthop (void *rule, struct prefix *prefix,
! 196: route_map_object_t type, void *object)
! 197: {
! 198: struct access_list *alist;
! 199: struct external_info *ei = object;
! 200: struct prefix_ipv4 p;
! 201:
! 202: if (type == RMAP_OSPF)
! 203: {
! 204: p.family = AF_INET;
! 205: p.prefix = ei->nexthop;
! 206: p.prefixlen = IPV4_MAX_BITLEN;
! 207:
! 208: alist = access_list_lookup (AFI_IP, (char *) rule);
! 209: if (alist == NULL)
! 210: return RMAP_NOMATCH;
! 211:
! 212: return (access_list_apply (alist, &p) == FILTER_DENY ?
! 213: RMAP_NOMATCH : RMAP_MATCH);
! 214: }
! 215: return RMAP_NOMATCH;
! 216: }
! 217:
! 218: /* Route map `ip next-hop' match statement. `arg' should be
! 219: access-list name. */
! 220: static void *
! 221: route_match_ip_nexthop_compile (const char *arg)
! 222: {
! 223: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
! 224: }
! 225:
! 226: /* Free route map's compiled `ip address' value. */
! 227: static void
! 228: route_match_ip_nexthop_free (void *rule)
! 229: {
! 230: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 231: }
! 232:
! 233: /* Route map commands for metric matching. */
! 234: struct route_map_rule_cmd route_match_ip_nexthop_cmd =
! 235: {
! 236: "ip next-hop",
! 237: route_match_ip_nexthop,
! 238: route_match_ip_nexthop_compile,
! 239: route_match_ip_nexthop_free
! 240: };
! 241:
! 242: /* `match ip next-hop prefix-list PREFIX_LIST' */
! 243:
! 244: static route_map_result_t
! 245: route_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix,
! 246: route_map_object_t type, void *object)
! 247: {
! 248: struct prefix_list *plist;
! 249: struct external_info *ei = object;
! 250: struct prefix_ipv4 p;
! 251:
! 252: if (type == RMAP_OSPF)
! 253: {
! 254: p.family = AF_INET;
! 255: p.prefix = ei->nexthop;
! 256: p.prefixlen = IPV4_MAX_BITLEN;
! 257:
! 258: plist = prefix_list_lookup (AFI_IP, (char *) rule);
! 259: if (plist == NULL)
! 260: return RMAP_NOMATCH;
! 261:
! 262: return (prefix_list_apply (plist, &p) == PREFIX_DENY ?
! 263: RMAP_NOMATCH : RMAP_MATCH);
! 264: }
! 265: return RMAP_NOMATCH;
! 266: }
! 267:
! 268: static void *
! 269: route_match_ip_next_hop_prefix_list_compile (const char *arg)
! 270: {
! 271: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
! 272: }
! 273:
! 274: static void
! 275: route_match_ip_next_hop_prefix_list_free (void *rule)
! 276: {
! 277: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 278: }
! 279:
! 280: struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd =
! 281: {
! 282: "ip next-hop prefix-list",
! 283: route_match_ip_next_hop_prefix_list,
! 284: route_match_ip_next_hop_prefix_list_compile,
! 285: route_match_ip_next_hop_prefix_list_free
! 286: };
! 287:
! 288: /* `match ip address IP_ACCESS_LIST' */
! 289: /* Match function should return 1 if match is success else return
! 290: zero. */
! 291: static route_map_result_t
! 292: route_match_ip_address (void *rule, struct prefix *prefix,
! 293: route_map_object_t type, void *object)
! 294: {
! 295: struct access_list *alist;
! 296: /* struct prefix_ipv4 match; */
! 297:
! 298: if (type == RMAP_OSPF)
! 299: {
! 300: alist = access_list_lookup (AFI_IP, (char *) rule);
! 301: if (alist == NULL)
! 302: return RMAP_NOMATCH;
! 303:
! 304: return (access_list_apply (alist, prefix) == FILTER_DENY ?
! 305: RMAP_NOMATCH : RMAP_MATCH);
! 306: }
! 307: return RMAP_NOMATCH;
! 308: }
! 309:
! 310: /* Route map `ip address' match statement. `arg' should be
! 311: access-list name. */
! 312: static void *
! 313: route_match_ip_address_compile (const char *arg)
! 314: {
! 315: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
! 316: }
! 317:
! 318: /* Free route map's compiled `ip address' value. */
! 319: static void
! 320: route_match_ip_address_free (void *rule)
! 321: {
! 322: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 323: }
! 324:
! 325: /* Route map commands for ip address matching. */
! 326: struct route_map_rule_cmd route_match_ip_address_cmd =
! 327: {
! 328: "ip address",
! 329: route_match_ip_address,
! 330: route_match_ip_address_compile,
! 331: route_match_ip_address_free
! 332: };
! 333:
! 334: /* `match ip address prefix-list PREFIX_LIST' */
! 335: static route_map_result_t
! 336: route_match_ip_address_prefix_list (void *rule, struct prefix *prefix,
! 337: route_map_object_t type, void *object)
! 338: {
! 339: struct prefix_list *plist;
! 340:
! 341: if (type == RMAP_OSPF)
! 342: {
! 343: plist = prefix_list_lookup (AFI_IP, (char *) rule);
! 344: if (plist == NULL)
! 345: return RMAP_NOMATCH;
! 346:
! 347: return (prefix_list_apply (plist, prefix) == PREFIX_DENY ?
! 348: RMAP_NOMATCH : RMAP_MATCH);
! 349: }
! 350: return RMAP_NOMATCH;
! 351: }
! 352:
! 353: static void *
! 354: route_match_ip_address_prefix_list_compile (const char *arg)
! 355: {
! 356: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
! 357: }
! 358:
! 359: static void
! 360: route_match_ip_address_prefix_list_free (void *rule)
! 361: {
! 362: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 363: }
! 364:
! 365: struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd =
! 366: {
! 367: "ip address prefix-list",
! 368: route_match_ip_address_prefix_list,
! 369: route_match_ip_address_prefix_list_compile,
! 370: route_match_ip_address_prefix_list_free
! 371: };
! 372:
! 373: /* `match interface IFNAME' */
! 374: /* Match function should return 1 if match is success else return
! 375: zero. */
! 376: static route_map_result_t
! 377: route_match_interface (void *rule, struct prefix *prefix,
! 378: route_map_object_t type, void *object)
! 379: {
! 380: struct interface *ifp;
! 381: struct external_info *ei;
! 382:
! 383: if (type == RMAP_OSPF)
! 384: {
! 385: ei = object;
! 386: ifp = if_lookup_by_name ((char *)rule);
! 387:
! 388: if (ifp == NULL || ifp->ifindex != ei->ifindex)
! 389: return RMAP_NOMATCH;
! 390:
! 391: return RMAP_MATCH;
! 392: }
! 393: return RMAP_NOMATCH;
! 394: }
! 395:
! 396: /* Route map `interface' match statement. `arg' should be
! 397: interface name. */
! 398: static void *
! 399: route_match_interface_compile (const char *arg)
! 400: {
! 401: return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
! 402: }
! 403:
! 404: /* Free route map's compiled `interface' value. */
! 405: static void
! 406: route_match_interface_free (void *rule)
! 407: {
! 408: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 409: }
! 410:
! 411: /* Route map commands for ip address matching. */
! 412: struct route_map_rule_cmd route_match_interface_cmd =
! 413: {
! 414: "interface",
! 415: route_match_interface,
! 416: route_match_interface_compile,
! 417: route_match_interface_free
! 418: };
! 419:
! 420: /* `set metric METRIC' */
! 421: /* Set metric to attribute. */
! 422: static route_map_result_t
! 423: route_set_metric (void *rule, struct prefix *prefix,
! 424: route_map_object_t type, void *object)
! 425: {
! 426: u_int32_t *metric;
! 427: struct external_info *ei;
! 428:
! 429: if (type == RMAP_OSPF)
! 430: {
! 431: /* Fetch routemap's rule information. */
! 432: metric = rule;
! 433: ei = object;
! 434:
! 435: /* Set metric out value. */
! 436: ei->route_map_set.metric = *metric;
! 437: }
! 438: return RMAP_OKAY;
! 439: }
! 440:
! 441: /* set metric compilation. */
! 442: static void *
! 443: route_set_metric_compile (const char *arg)
! 444: {
! 445: u_int32_t *metric;
! 446:
! 447: metric = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
! 448: *metric = atoi (arg);
! 449:
! 450: if (*metric >= 0)
! 451: return metric;
! 452:
! 453: XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);
! 454: return NULL;
! 455: }
! 456:
! 457: /* Free route map's compiled `set metric' value. */
! 458: static void
! 459: route_set_metric_free (void *rule)
! 460: {
! 461: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 462: }
! 463:
! 464: /* Set metric rule structure. */
! 465: struct route_map_rule_cmd route_set_metric_cmd =
! 466: {
! 467: "metric",
! 468: route_set_metric,
! 469: route_set_metric_compile,
! 470: route_set_metric_free,
! 471: };
! 472:
! 473: /* `set metric-type TYPE' */
! 474: /* Set metric-type to attribute. */
! 475: static route_map_result_t
! 476: route_set_metric_type (void *rule, struct prefix *prefix,
! 477: route_map_object_t type, void *object)
! 478: {
! 479: u_int32_t *metric_type;
! 480: struct external_info *ei;
! 481:
! 482: if (type == RMAP_OSPF)
! 483: {
! 484: /* Fetch routemap's rule information. */
! 485: metric_type = rule;
! 486: ei = object;
! 487:
! 488: /* Set metric out value. */
! 489: ei->route_map_set.metric_type = *metric_type;
! 490: }
! 491: return RMAP_OKAY;
! 492: }
! 493:
! 494: /* set metric-type compilation. */
! 495: static void *
! 496: route_set_metric_type_compile (const char *arg)
! 497: {
! 498: u_int32_t *metric_type;
! 499:
! 500: metric_type = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
! 501: if (strcmp (arg, "type-1") == 0)
! 502: *metric_type = EXTERNAL_METRIC_TYPE_1;
! 503: else if (strcmp (arg, "type-2") == 0)
! 504: *metric_type = EXTERNAL_METRIC_TYPE_2;
! 505:
! 506: if (*metric_type == EXTERNAL_METRIC_TYPE_1 ||
! 507: *metric_type == EXTERNAL_METRIC_TYPE_2)
! 508: return metric_type;
! 509:
! 510: XFREE (MTYPE_ROUTE_MAP_COMPILED, metric_type);
! 511: return NULL;
! 512: }
! 513:
! 514: /* Free route map's compiled `set metric-type' value. */
! 515: static void
! 516: route_set_metric_type_free (void *rule)
! 517: {
! 518: XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
! 519: }
! 520:
! 521: /* Set metric rule structure. */
! 522: struct route_map_rule_cmd route_set_metric_type_cmd =
! 523: {
! 524: "metric-type",
! 525: route_set_metric_type,
! 526: route_set_metric_type_compile,
! 527: route_set_metric_type_free,
! 528: };
! 529:
! 530: DEFUN (match_ip_nexthop,
! 531: match_ip_nexthop_cmd,
! 532: "match ip next-hop (<1-199>|<1300-2699>|WORD)",
! 533: MATCH_STR
! 534: IP_STR
! 535: "Match next-hop address of route\n"
! 536: "IP access-list number\n"
! 537: "IP access-list number (expanded range)\n"
! 538: "IP access-list name\n")
! 539: {
! 540: return ospf_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
! 541: }
! 542:
! 543: DEFUN (no_match_ip_nexthop,
! 544: no_match_ip_nexthop_cmd,
! 545: "no match ip next-hop",
! 546: NO_STR
! 547: MATCH_STR
! 548: IP_STR
! 549: "Match next-hop address of route\n")
! 550: {
! 551: if (argc == 0)
! 552: return ospf_route_match_delete (vty, vty->index, "ip next-hop", NULL);
! 553:
! 554: return ospf_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
! 555: }
! 556:
! 557: ALIAS (no_match_ip_nexthop,
! 558: no_match_ip_nexthop_val_cmd,
! 559: "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
! 560: NO_STR
! 561: MATCH_STR
! 562: IP_STR
! 563: "Match next-hop address of route\n"
! 564: "IP access-list number\n"
! 565: "IP access-list number (expanded range)\n"
! 566: "IP access-list name\n")
! 567:
! 568: DEFUN (match_ip_next_hop_prefix_list,
! 569: match_ip_next_hop_prefix_list_cmd,
! 570: "match ip next-hop prefix-list WORD",
! 571: MATCH_STR
! 572: IP_STR
! 573: "Match next-hop address of route\n"
! 574: "Match entries of prefix-lists\n"
! 575: "IP prefix-list name\n")
! 576: {
! 577: return ospf_route_match_add (vty, vty->index, "ip next-hop prefix-list",
! 578: argv[0]);
! 579: }
! 580:
! 581: DEFUN (no_match_ip_next_hop_prefix_list,
! 582: no_match_ip_next_hop_prefix_list_cmd,
! 583: "no match ip next-hop prefix-list",
! 584: NO_STR
! 585: MATCH_STR
! 586: IP_STR
! 587: "Match next-hop address of route\n"
! 588: "Match entries of prefix-lists\n")
! 589: {
! 590: if (argc == 0)
! 591: return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
! 592: NULL);
! 593: return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
! 594: argv[0]);
! 595: }
! 596:
! 597: ALIAS (no_match_ip_next_hop_prefix_list,
! 598: no_match_ip_next_hop_prefix_list_val_cmd,
! 599: "no match ip next-hop prefix-list WORD",
! 600: NO_STR
! 601: MATCH_STR
! 602: IP_STR
! 603: "Match next-hop address of route\n"
! 604: "Match entries of prefix-lists\n"
! 605: "IP prefix-list name\n")
! 606:
! 607: DEFUN (match_ip_address,
! 608: match_ip_address_cmd,
! 609: "match ip address (<1-199>|<1300-2699>|WORD)",
! 610: MATCH_STR
! 611: IP_STR
! 612: "Match address of route\n"
! 613: "IP access-list number\n"
! 614: "IP access-list number (expanded range)\n"
! 615: "IP access-list name\n")
! 616: {
! 617: return ospf_route_match_add (vty, vty->index, "ip address", argv[0]);
! 618: }
! 619:
! 620: DEFUN (no_match_ip_address,
! 621: no_match_ip_address_cmd,
! 622: "no match ip address",
! 623: NO_STR
! 624: MATCH_STR
! 625: IP_STR
! 626: "Match address of route\n")
! 627: {
! 628: if (argc == 0)
! 629: return ospf_route_match_delete (vty, vty->index, "ip address", NULL);
! 630:
! 631: return ospf_route_match_delete (vty, vty->index, "ip address", argv[0]);
! 632: }
! 633:
! 634: ALIAS (no_match_ip_address,
! 635: no_match_ip_address_val_cmd,
! 636: "no match ip address (<1-199>|<1300-2699>|WORD)",
! 637: NO_STR
! 638: MATCH_STR
! 639: IP_STR
! 640: "Match address of route\n"
! 641: "IP access-list number\n"
! 642: "IP access-list number (expanded range)\n"
! 643: "IP access-list name\n")
! 644:
! 645: DEFUN (match_ip_address_prefix_list,
! 646: match_ip_address_prefix_list_cmd,
! 647: "match ip address prefix-list WORD",
! 648: MATCH_STR
! 649: IP_STR
! 650: "Match address of route\n"
! 651: "Match entries of prefix-lists\n"
! 652: "IP prefix-list name\n")
! 653: {
! 654: return ospf_route_match_add (vty, vty->index, "ip address prefix-list",
! 655: argv[0]);
! 656: }
! 657:
! 658: DEFUN (no_match_ip_address_prefix_list,
! 659: no_match_ip_address_prefix_list_cmd,
! 660: "no match ip address prefix-list",
! 661: NO_STR
! 662: MATCH_STR
! 663: IP_STR
! 664: "Match address of route\n"
! 665: "Match entries of prefix-lists\n")
! 666: {
! 667: if (argc == 0)
! 668: return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
! 669: NULL);
! 670: return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
! 671: argv[0]);
! 672: }
! 673:
! 674: ALIAS (no_match_ip_address_prefix_list,
! 675: no_match_ip_address_prefix_list_val_cmd,
! 676: "no match ip address prefix-list WORD",
! 677: NO_STR
! 678: MATCH_STR
! 679: IP_STR
! 680: "Match address of route\n"
! 681: "Match entries of prefix-lists\n"
! 682: "IP prefix-list name\n")
! 683:
! 684: DEFUN (match_interface,
! 685: match_interface_cmd,
! 686: "match interface WORD",
! 687: MATCH_STR
! 688: "Match first hop interface of route\n"
! 689: "Interface name\n")
! 690: {
! 691: return ospf_route_match_add (vty, vty->index, "interface", argv[0]);
! 692: }
! 693:
! 694: DEFUN (no_match_interface,
! 695: no_match_interface_cmd,
! 696: "no match interface",
! 697: NO_STR
! 698: MATCH_STR
! 699: "Match first hop interface of route\n")
! 700: {
! 701: if (argc == 0)
! 702: return ospf_route_match_delete (vty, vty->index, "interface", NULL);
! 703:
! 704: return ospf_route_match_delete (vty, vty->index, "interface", argv[0]);
! 705: }
! 706:
! 707: ALIAS (no_match_interface,
! 708: no_match_interface_val_cmd,
! 709: "no match interface WORD",
! 710: NO_STR
! 711: MATCH_STR
! 712: "Match first hop interface of route\n"
! 713: "Interface name\n")
! 714:
! 715: DEFUN (set_metric,
! 716: set_metric_cmd,
! 717: "set metric <0-4294967295>",
! 718: SET_STR
! 719: "Metric value for destination routing protocol\n"
! 720: "Metric value\n")
! 721: {
! 722: return ospf_route_set_add (vty, vty->index, "metric", argv[0]);
! 723: }
! 724:
! 725: DEFUN (no_set_metric,
! 726: no_set_metric_cmd,
! 727: "no set metric",
! 728: NO_STR
! 729: SET_STR
! 730: "Metric value for destination routing protocol\n")
! 731: {
! 732: if (argc == 0)
! 733: return ospf_route_set_delete (vty, vty->index, "metric", NULL);
! 734:
! 735: return ospf_route_set_delete (vty, vty->index, "metric", argv[0]);
! 736: }
! 737:
! 738: ALIAS (no_set_metric,
! 739: no_set_metric_val_cmd,
! 740: "no set metric <0-4294967295>",
! 741: NO_STR
! 742: SET_STR
! 743: "Metric value for destination routing protocol\n"
! 744: "Metric value\n")
! 745:
! 746: DEFUN (set_metric_type,
! 747: set_metric_type_cmd,
! 748: "set metric-type (type-1|type-2)",
! 749: SET_STR
! 750: "Type of metric for destination routing protocol\n"
! 751: "OSPF[6] external type 1 metric\n"
! 752: "OSPF[6] external type 2 metric\n")
! 753: {
! 754: if (strcmp (argv[0], "1") == 0)
! 755: return ospf_route_set_add (vty, vty->index, "metric-type", "type-1");
! 756: if (strcmp (argv[0], "2") == 0)
! 757: return ospf_route_set_add (vty, vty->index, "metric-type", "type-2");
! 758:
! 759: return ospf_route_set_add (vty, vty->index, "metric-type", argv[0]);
! 760: }
! 761:
! 762: DEFUN (no_set_metric_type,
! 763: no_set_metric_type_cmd,
! 764: "no set metric-type",
! 765: NO_STR
! 766: SET_STR
! 767: "Type of metric for destination routing protocol\n")
! 768: {
! 769: if (argc == 0)
! 770: return ospf_route_set_delete (vty, vty->index, "metric-type", NULL);
! 771:
! 772: return ospf_route_set_delete (vty, vty->index, "metric-type", argv[0]);
! 773: }
! 774:
! 775: ALIAS (no_set_metric_type,
! 776: no_set_metric_type_val_cmd,
! 777: "no set metric-type (type-1|type-2)",
! 778: NO_STR
! 779: SET_STR
! 780: "Type of metric for destination routing protocol\n"
! 781: "OSPF[6] external type 1 metric\n"
! 782: "OSPF[6] external type 2 metric\n")
! 783:
! 784: /* Route-map init */
! 785: void
! 786: ospf_route_map_init (void)
! 787: {
! 788: route_map_init ();
! 789: route_map_init_vty ();
! 790:
! 791: route_map_add_hook (ospf_route_map_update);
! 792: route_map_delete_hook (ospf_route_map_update);
! 793: route_map_event_hook (ospf_route_map_event);
! 794:
! 795: route_map_install_match (&route_match_ip_nexthop_cmd);
! 796: route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
! 797: route_map_install_match (&route_match_ip_address_cmd);
! 798: route_map_install_match (&route_match_ip_address_prefix_list_cmd);
! 799: route_map_install_match (&route_match_interface_cmd);
! 800:
! 801: route_map_install_set (&route_set_metric_cmd);
! 802: route_map_install_set (&route_set_metric_type_cmd);
! 803:
! 804: install_element (RMAP_NODE, &match_ip_nexthop_cmd);
! 805: install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
! 806: install_element (RMAP_NODE, &no_match_ip_nexthop_val_cmd);
! 807: install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
! 808: install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
! 809: install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
! 810: install_element (RMAP_NODE, &match_ip_address_cmd);
! 811: install_element (RMAP_NODE, &no_match_ip_address_cmd);
! 812: install_element (RMAP_NODE, &no_match_ip_address_val_cmd);
! 813: install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
! 814: install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
! 815: install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
! 816: install_element (RMAP_NODE, &match_interface_cmd);
! 817: install_element (RMAP_NODE, &no_match_interface_cmd);
! 818: install_element (RMAP_NODE, &no_match_interface_val_cmd);
! 819:
! 820: install_element (RMAP_NODE, &set_metric_cmd);
! 821: install_element (RMAP_NODE, &no_set_metric_cmd);
! 822: install_element (RMAP_NODE, &no_set_metric_val_cmd);
! 823: install_element (RMAP_NODE, &set_metric_type_cmd);
! 824: install_element (RMAP_NODE, &no_set_metric_type_cmd);
! 825: install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
! 826: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>