Annotation of embedaddon/quagga/ospfd/ospf_routemap.c, revision 1.1.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>