File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_routemap.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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>